Application mobile cross-platform (Android + iOS) de suivi d’habitudes, avec authentification, CRUD, stockage distant via Supabase, gestion d’état (loading / erreur), fallback offline minimal, et fonctionnalité native de rappels locaux.
J’ai choisi React Native avec Expo pour les raisons suivantes :
- Un seul codebase TypeScript pour Android et iOS.
- Développement rapide (Expo Go, itérations rapides, API natives accessibles).
- Écosystème mature pour la navigation, Supabase, stockage local et notifications.
- Lisibilité / maintenabilité facilitée par une séparation claire
screens / services / navigation / types.
- Framework mobile : React Native (Expo)
- Langage : TypeScript
- Navigation : React Navigation (stack auth + stack app)
- Backend / BDD / Auth : Supabase
- Stockage local : AsyncStorage
- Feature native : notifications locales planifiées (
expo-notifications)
- Inscription
- Connexion
- Déconnexion
- Données liées à l’utilisateur authentifié
- Écran d’authentification :
Login,Register - Écran liste :
Home - Écran détail :
HabitDetail - Écran ajout / édition :
HabitForm - Écran paramètres :
Settings
- Créer une habitude
- Lire la liste des habitudes
- Voir le détail d’une habitude
- Modifier une habitude
- Supprimer une habitude
loadingsur les écrans principaux- gestion d’erreurs (alertes, retry sur détail)
- succès fonctionnel (création / modification / suppression / rappel)
- Auth Supabase
- CRUD asynchrone sur la table
habits - Suivi journalier via
habit_logs
- Cache local des habitudes (par utilisateur) via
AsyncStorage - En cas d’échec réseau, affichage des dernières données locales chargées
- Rappels d’habitudes via notifications locales planifiées
- Demande de permission notifications au moment opportun
- Gestion explicite du refus de permission
.
├── App.tsx
├── app.json
├── package.json
└── src
├── navigation
│ ├── RootNavigator.tsx
│ ├── AuthStack.tsx
│ └── AppStack.tsx
├── screens
│ ├── LoginScreen.tsx
│ ├── RegisterScreen.tsx
│ ├── HomeScreen.tsx
│ ├── HabitDetailScreen.tsx
│ ├── HabitFormScreen.tsx
│ └── SettingsScreen.tsx
├── services
│ ├── supabaseClient.ts
│ ├── authService.ts
│ ├── habitService.ts
│ └── reminderService.ts
├── types
│ ├── navigation.ts
│ ├── habit.ts
│ └── expo-notifications.d.ts
└── theme.ts
Principe d’architecture :
- Les screens gèrent l’UI et les interactions utilisateur.
- Les services gèrent l’accès aux APIs (Supabase) et au natif (notifications).
- La navigation est centralisée et découplée.
- Les types regroupent les modèles et contrats TypeScript.
- Node.js 18+ (recommandé : LTS)
- npm
- Expo CLI via
npx expo ...(pas besoin d’installation globale) - Un projet Supabase actif (Auth email/password + tables)
npm install
npx expo startPuis lancer :
apour Android (émulateur)ipour iOS (simulateur macOS)- ou scanner le QR code avec Expo Go
Scripts utiles :
npm run start
npm run android
npm run ios
npm run webLe projet utilise un client Supabase dans src/services/supabaseClient.ts.
Recommandation pour un rendu propre : passer les clés Supabase via variables d’environnement (
EXPO_PUBLIC_SUPABASE_URL,EXPO_PUBLIC_SUPABASE_ANON_KEY) et documenter la procédure dans ce README.
id(uuid, pk)user_id(uuid, lien user auth)title(text)description(text nullable)created_at(timestamp)
habit_iduser_iddatedone- contrainte unique recommandée :
(habit_id, user_id, date)