Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lachlanhawthorne/todos
Tamagui with Supabase, Expo, Next.js, Solito and Jotai.
https://github.com/lachlanhawthorne/todos
expo jotai nextjs solito supabase tamagui
Last synced: 13 days ago
JSON representation
Tamagui with Supabase, Expo, Next.js, Solito and Jotai.
- Host: GitHub
- URL: https://github.com/lachlanhawthorne/todos
- Owner: lachlanhawthorne
- Created: 2022-06-16T08:19:13.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2022-06-21T10:46:17.000Z (over 2 years ago)
- Last Synced: 2024-11-03T09:32:07.574Z (2 months ago)
- Topics: expo, jotai, nextjs, solito, supabase, tamagui
- Language: TypeScript
- Homepage:
- Size: 11.9 MB
- Stars: 60
- Watchers: 3
- Forks: 6
- Open Issues: 1
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
- awesome - lachlanhawthorne/todos - Tamagui with Supabase, Expo, Next.js, Solito and Jotai. (TypeScript)
README
# Tamagui + Supabase + Solito + Next + Expo Monorepo
## ⚡️ Instant clone & deploy
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Flachlanhawthorne%2Ftamagui-supabase-todos-quickstart&root-directory=next&env=NEXT_PUBLIC_SUPABASE_URL,NEXT_PUBLIC_SUPABASE_ANON_KEY&envDescription=Supabase%20project%20URL%20and%20anon%20key&envLink=https%3A%2F%2Fapp.supabase.com%2F)
## 🔦 About
This monorepo is a starter todo app, built using Supabase + Expo + Next.js + Tamagui + Solito, adapted from the Tamagui starter (`npx create-tamagui-app@latest`).
[Tamagui](https://tamagui.dev) is a universal design system for React Native & Web built by [@natebirdman](https://twitter.com/natebirdman).
Many thanks to [@FernandoTheRojo](https://twitter.com/fernandotherojo) for the Solito starter monorepo which this was initally forked from. Check out his [talk about using expo + next together at Next.js Conf 2021](https://www.youtube.com/watch?v=0lnbdRweJtA).
## 📦 Included packages
- `tamagui` for cross-platform views, themes and animations
- `solito` for cross-platform navigation
- `jotai` for state management
- `@supabase/supabase-js`
- `@supabase/supabase-auth-helpers`
- Expo SDK 44
- Next.js 12
- React Navigation 6## 🗂 Folder layout
The main apps are:
- `expo` (native)
- `next` (web)- `packages` shared packages across apps
- `data-access` Supabase client, Jotai state management & user / auth context
- `ui` includes your custom UI kit that will be optimized by Tamagui
- `app` you'll be importing most files from `app/`
- `features` (don't use a `screens` folder. organize by feature.)
- `provider` (all the providers that wrap the app, and some no-ops for Web.)
- `navigation` Next.js has a `pages/` folder. React Native doesn't. This folder contains navigation-related code for RN. You may use it for any navigation code, such as custom links.You can add other folders inside of `packages/` if you know what you're doing and have a good reason to.
## 🏁 Start the app
- Set the environment variables for `next` and `expo`
- Install dependencies: `yarn`
- Next.js local dev: `yarn web`
- Runs `yarn next`
- Expo local dev: `yarn native`
- Runs `expo start`## 💾 Setting up Supabase
- Create a new Supabase project
### Using GUI
- Navigate to the project, then SQL Editor
- Run the following 'todos' migration``` sql
create table todos (
id bigint generated by default as identity primary key,
user_id uuid references auth.users not null,
task text check (char_length(task) > 3),
is_complete boolean default false,
inserted_at timestamp with time zone default timezone('utc'::text, now()) not null
);alter table todos enable row level security;
alter publication supabase_realtime add table todos;create policy "Individuals can create todos." on todos for
insert with check (auth.uid() = user_id);
create policy "Individuals can view their own todos. " on todos for
select using (auth.uid() = user_id);
create policy "Individuals can update their own todos." on todos for
update using (auth.uid() = user_id);
create policy "Individuals can delete their own todos." on todos for
delete using (auth.uid() = user_id);
```### Using the CLI
- Install the CLI `npm install -g supabase`
- Init supabase in the project `supabase init`
- Login with an access token `supabase login`
- Link to your project `supabase link --project-ref [project-ref]`
- Link your Supabase database `supabase db remote set [database connection string with port 5432]`
- Create a new migration `supabase migration new todos`
- Copy the schema from `todos.sql` into the new migration at `supabase/migrations/[migration]_todos.sql`
- Run the todos migration `supabase db push`## Developing
### Supabase
- Navigate to the `data-access` package.
- Set the `SUPABASE_REST_API_URL`, see .env.example for example
- Generate new types from your Supabase project by running `yarn supabase:types`### Tamagui
We've added `packages/ui` to show an example of [building your own design system](https://tamagui.dev/docs/guides/design-systems).
You need to watch it to have changes propagate, we've added a root `watch` command you should run in a separate terminal alongside the apps:
```bash
yarn watch
```If you want to see Tamagui extract, try running `yarn web:optimize` and put a debug pragma at the top of `packages/app/features/home.tsx`, like so:
```tsx
// debug
```You'll see lots of output including the compiled HTML, CSS and all the steps it takes to get there.
## UI Kit
Note we're following the [design systems guide](https://tamagui.dev/docs/guides/design-systems) and creating our own package for components.
See `packages/ui` named `@my/ui` for how this works.
## 🆕 Add new dependencies
### Pure JS dependencies
If you're installing a JavaScript-only dependency that will be used across platforms, install it in `packages/app`:
```sh
cd packages/app
yarn add date-fns
cd ../..
yarn
```### Native dependencies
If you're installing a library with any native code, you must install it in `expo`:
```sh
cd expo
yarn add react-native-reanimated
cd ..
yarn
```You can also install the native library inside of `packages/app` if you want to get autoimport for that package inside of the `app` folder. However, you need to be careful and install the _exact_ same version in both packages. If the versions mismatch at all, you'll potentially get terrible bugs. This is a classic monorepo issue. I use `lerna-update-wizard` to help with this (you don't need to use Lerna to use that lib).