Votre première application avec React Native
Une liste de tâches pour iPhone et Android où les gens s'inscrivent et ne voient que leurs propres tâches. Elle utilise Expo et @espobase/client ; la base de données et les clés viennent du tableau de bord.
1. Créez un projet et une table
Dans le tableau de bord, créez un projet. Ouvrez Éditeur SQL et exécutez :
create table todos ( id bigint generated by default as identity primary key, owner_id uuid not null default espobase.user_id(), title text not null, done boolean not null default false, created_at timestamptz not null default now() ); -- Row level security is already on. Each signed-in user sees and changes only their own todos: create policy "Users manage their own todos" on todos for all using (owner_id = espobase.user_id()) with check (owner_id = espobase.user_id());
2. Réglages et clés
- API : créez une clé publiable et copiez-la maintenant ; les clés ne sont affichées qu'à la création. Ne mettez jamais de clé secrète (
eb_sk_…) dans une application : n'importe qui peut ouvrir une application et la lire. - Authentification › Réglages : ajoutez le lien de votre application dans URL de redirection autorisées, par exemple
myapp://auth/callback, oùmyappest leschemede votre app.json. Les e-mails de confirmation et la connexion sociale y reviennent.
3. Installez
npm install @espobase/client npx expo install @react-native-async-storage/async-storage react-native-get-random-values react-native-url-polyfill expo-web-browser expo-linking
React Native n'a pas quelques éléments que les navigateurs ont. Deux petits paquets les apportent ; importez-les avant tout le reste :
# .env (Expo reads EXPO_PUBLIC_ variables; the PUBLISHABLE key is safe in an app) EXPO_PUBLIC_ESPOBASE_URL=https://api.espobase.com/project/<your project ref> EXPO_PUBLIC_ESPOBASE_KEY=eb_pk_…
4. Le client
Un téléphone n'a pas de localStorage : donnez donc au client un endroit où garder la session. Elle est renouvelée pour vous, et la personne reste connectée quand l'application redémarre.
// lib/espobase.ts
import "react-native-get-random-values"; // crypto.getRandomValues
import "react-native-url-polyfill/auto"; // a complete URL class
import AsyncStorage from "@react-native-async-storage/async-storage";
import { createClient } from "@espobase/client";
export const espobase = createClient(
process.env.EXPO_PUBLIC_ESPOBASE_URL!,
process.env.EXPO_PUBLIC_ESPOBASE_KEY!,
{ auth: { storage: AsyncStorage } },
);5. Inscription et connexion
import * as Linking from "expo-linking";
import { espobase } from "@/lib/espobase";
// myapp://auth/callback (the scheme comes from app.json). Add it under Authentication › Settings.
const redirectTo = Linking.createURL("auth/callback");
await espobase.auth.signUp({ email, password, options: { redirectTo } });
await espobase.auth.signInWithPassword({ email, password });
// The confirmation email opens the app at redirectTo#type=signup&token=…
Linking.addEventListener("url", async ({ url }) => {
const token = new URLSearchParams(url.split("#")[1] ?? "").get("token");
if (token) await espobase.auth.verifyEmail({ token });
});
// Re-render when the user signs in or out.
espobase.auth.onAuthStateChange((_event, session) => setSession(session));Avec la confirmation par e-mail activée, la personne reçoit un lien qui ouvre votre application à l'adresse que vous avez passée comme redirectTo, avec le jeton après un #. Confirmez-le avec espobase.auth.verifyEmail({ token }).
7. Lisez et écrivez vos données
import { useEffect, useState } from "react";
import { espobase } from "@/lib/espobase";
export function useTodos() {
const [todos, setTodos] = useState<{ id: number; title: string; done: boolean }[]>([]);
useEffect(() => {
espobase.from("todos").select("*").order("created_at").then(({ data }) => setTodos(data ?? []));
}, []);
return todos;
}
// owner_id fills itself in (its default is espobase.user_id()).
await espobase.from("todos").insert({ title: "Buy milk" });Chaque requête porte la personne connectée, et la base de données applique votre règle. Une personne non connectée reçoit une liste vide, et personne ne peut lire ni modifier les tâches d'un autre, même en appelant directement l'API.
8. Envoyez une photo
Créez un bucket dans Storage et ajoutez une politique pour que chaque personne puisse écrire dans son propre dossier (voir le guide d'envoi de fichiers). Passez les octets du fichier (un ArrayBuffer) à upload : Envoi de fichiers
import * as ImagePicker from "expo-image-picker";
import { espobase } from "@/lib/espobase";
const picked = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ["images"] });
if (!picked.canceled) {
const asset = picked.assets[0]!;
const bytes = await (await fetch(asset.uri)).arrayBuffer();
const { data: session } = await espobase.auth.getSession();
const userId = session.session!.user.id;
await espobase.storage.from("photos").upload(`${userId}/photo.jpg`, bytes, { contentType: "image/jpeg" });
}Bon à savoir
- Pour les liens de connexion, utilisez une build de développement (
npx expo run:iosourun:android) plutôt qu'Expo Go : l'adresse d'Expo Go change avec votre réseau, on ne peut donc pas l'enregistrer une fois pour toutes. - Les autres configurations React Native fonctionnent de la même façon : installez les mêmes paquets, importez d'abord les deux polyfills et passez un objet de stockage à
createClient. - Le temps réel fonctionne aussi : React Native intègre les WebSockets, donc
espobase.realtimen'a besoin de rien d'autre.
6. Connexion avec Google ou GitHub
import * as WebBrowser from "expo-web-browser"; import * as Linking from "expo-linking"; import { espobase } from "@/lib/espobase"; export async function signInWithGoogle() { const redirectTo = Linking.createURL("auth/callback"); const { data } = await espobase.auth.signInWithOAuth({ provider: "google", options: { redirectTo, skipBrowserRedirect: true }, }); const result = await WebBrowser.openAuthSessionAsync(data!.url, redirectTo); if (result.type !== "success") return; // cancelled const code = new URL(result.url).searchParams.get("code"); if (code) await espobase.auth.exchangeCodeForSession(code); }Activez d'abord le fournisseur dans Authentification › Fournisseurs. L'application ouvre le fournisseur dans le navigateur du système et récupère la personne via le lien de votre application ;
exchangeCodeForSessiontermine la connexion. Seule cette application peut la terminer : le secret à usage unique reste sur le téléphone.