--- title: Get up and running with Nhost and React Native sidebarTitle: React Native description: In this quickstart guide, we'll demonstrate how to build a simple To-Do feature using Nhost and React Native. icon: mobile-notch --- Throughout this guide, we'll utilize the **@nhost/react-native-template**, which comes pre-configured with authentication and storage capabilities provided by Nhost.
Before starting this quickstart, ensure that your environment is set up to work with React Native. Follow the [setup guide](https://reactnative.dev/docs/next/set-up-your-environment) available on the official React Native website. Create your project through the [Nhost Dashboard](https://app.nhost.io). Navigate to the **SQL Editor** of the database and run the following SQL to create a new table `todos`. Make sure the option `Track this` is enabled ```sql SQL Editor CREATE TABLE todos ( id uuid NOT NULL DEFAULT gen_random_uuid(), created_at timestamptz NOT NULL DEFAULT now(), updated_at timestamptz NOT NULL DEFAULT now(), user_id uuid NOT NULL, contents text NOT NULL, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES auth.users(id) ON UPDATE cascade ON DELETE cascade ); ``` ![Create Todos Table](/images/quickstarts/react-native/create-table-todos.png) To set permissions for the new `todos` table, select the table, click on the `...` to open the actions dialog, then click on **Edit Permissions**. Set the following permissions for the `user` role: 1. `Insert` - Set `Row insert permissions` to `Without any checks` - Select all columns except `user_id` on `Column insert permissions` - Add a new `Column preset` and set `Column Name` to `user_id` and `Column Value` to `X-Hasura-User-Id` - Save ![Insert Permissions](/images/quickstarts/react-native/todos-insert-permissions.png) 2. `Select` - Set `Row select permissions` to `With custom check` and fill in the following rule: - Set `Where` to `todos.user_id` - Set the operator to `_eq` - Set the value to `X-Hasura-User-Id` - Select all columns except `user_id` on `Column select permissions` - Save ![Select Permissions](/images/quickstarts/react-native/todos-select-permissions.png) 3. `Update` - Set `Row update permissions` to `With custom check` and fill in the following rule: - Set `Where` to `todos.user_id` - Set the operator to `_eq` - Set the value to `X-Hasura-User-Id` - Select all columns except `user_id` on `Column select permissions` - Save ![Update permissions](/images/quickstarts/react-native/todos-update-permissions.png) 4. `Delete` - Set `Row delete permissions` to `With custom check` and fill in the following rule: - Set `Where` to `todos.user_id` - Set the operator to `_eq` - Set the value to `X-Hasura-User-Id` - Save ![Delete permissions](/images/quickstarts/react-native/todos-delete-permissions.png) To enable file uploads by users, set the permissions as follows: 1. Edit the **files** table permissions 1. Navigate to the files table within the [Database tab](https://app.nhost.io/_/_/database/browser/default/storage/files) 2. Click on the three dots (...) next to the files table 3. Click on **Edit Permissions** 2. Modify the `Insert` permission for the `user` role: 1. Set `Row insert permissions` to `Without any checks` 2. Select all columns on `Column insert permissions` 4. Save ![Insert Permissions](/images/quickstarts/react-native/files-insert-permissions.png) 3. `Select` - Set `Row select permissions` to `With custom check` and fill in the following rule: - Set `Where` to `files.uploaded_by_user_id` - Set the operator to `_eq` - Set the value to `X-Hasura-User-Id` - Select all columns on `Column select permissions` - Save ![Select permissions](/images/quickstarts/react-native/files-select-permissions.png) Intialize a new React Native project using the template `@nhost/react-native-template` ```bash Terminal npx react-native init myapp --template @nhost/react-native-template ``` Copy your project's `` and `` values available on the dashboard overview ```tsx src/root.tsx const nhost = new NhostClient({ subdomain: "", // replace the subdomain value e.g. "hjcuuqweqwezolpolrep" region: "", // replace the region value e.g. "eu-central-1" clientStorageType: 'react-native', clientStorage: AsyncStorage, }); ``` Create a new file `src/graphql/todos.ts` that will expose the graphql queries needed to `list`, `add` and `delete` To-Do's. ```ts src/graphql/todos.ts import {gql} from '@apollo/client'; export const GET_TODOS = gql` query listTodos { todos(order_by: { created_at: desc }) { id contents } } `; export const ADD_TODO = gql` mutation addTodo($contents: String!) { insert_todos_one(object: { contents: $contents }) { id contents } } `; export const DELETE_TODO = gql` mutation deleteTodo($id: uuid!) { delete_todos_by_pk(id: $id) { __typename } } `; ``` ```tsx src/components/AddTodoForm.tsx import React from 'react'; import {useMutation} from '@apollo/client'; import Button from '@components/Button'; import ControlledInput from '@components/ControlledInput'; import {ADD_TODO, GET_TODOS} from '@graphql/todos'; import {useForm} from 'react-hook-form'; import {StyleSheet, View} from 'react-native'; interface AddTodoFormValues { contents: string; } export default function AddTodoForm() { const {control, handleSubmit, reset} = useForm(); const [addTodo, {loading}] = useMutation(ADD_TODO, { refetchQueries: [{query: GET_TODOS}], }); const onSubmit = async (values: AddTodoFormValues) => { const {contents} = values; await addTodo({variables: {contents}}); reset(); }; return (