← Toutes les études de cas
Travail professionnel · mobile

Fieldbook

Une application de chantier qui continue de fonctionner là où il n’y a pas de réseau.

Note
Nom et image de marque modifiés
Technologies
React Native · TypeScript · WatermelonDB · Redux Toolkit
Statut
En production sur iOS et Android
01

Le problème

Sur un chantier, la connexion va et vient. Les équipes ont quand même besoin des derniers plans, des tâches et des formulaires, et prennent des photos et remplissent des rapports dans des sous-sols et sur des toits.

Chaque changement doit finir par arriver au bureau, dans le bon ordre, sans se perdre ni s’appliquer deux fois.

02

Ce que fait l’application

Tout fonctionne hors lignePlans annotés, tâches, formulaires avec lecture de codes QR, rapports journaliers, feuilles de temps, bons de travail et photos, tous utilisables sans connexion.
Synchronisation par moduleChaque domaine de l’API se synchronise séparément et garde sa propre date de dernière récupération par projet, grâce à un assistant commun pour les lots, la journalisation et les permissions.
Les changements en fileChaque écriture hors ligne est enregistrée comme un événement et envoyée dans l’ordre. Un inspecteur intégré permet aux utilisateurs et au soutien de voir, relancer ou effacer ce qui bloque.
Un code qui grandit bienDes modules aux couches strictes, des générateurs qui créent un module, un cas d’utilisation, un composant ou un écran, et deux configurations Jest pour les tests sur appareil et sous Node.
03

Comment ça fonctionne

Chaque module sépare les règles d’affaires du stockage et des écrans. Les lectures viennent toujours de la base locale; le réseau ne sert qu’à alimenter cette base ou à vider la file des changements locaux.

Dans un module

Écrans et hooksprésentation
  • Requêtes réactives avec RxJS
  • Résolution des dépendances
Cas d’utilisationdomaine
  • Règles d’affaires seulement
  • Aucune dépendance au framework
Dépôtsdonnées · tsyringe
  • Implémentent les interfaces du domaine
WatermelonDBSQLite
  • La source de vérité sur l’appareil

Synchronisation

File d’événements hors ligneécritures locales
  • Intentions ordonnées
  • Relance ou correction depuis l’inspecteur
APIREST
  • Applique les changements
  • Renvoie les identifiants actifs par module
Récupération par moduleécriture par lots
  • Créations et mises à jour en un lot
  • Supprime ce que le serveur ne liste plus
04

Décisions clés

  1. Des couches strictes, imposées par le linterChaque module a ses couches domaine, données et présentation, et ESLint bloque toute importation qui contourne son point d’entrée public. La règle tient même sous la pression des échéances.
  2. Le serveur liste ce qui existe; l’appareil supprime le resteChaque récupération renvoie tous les identifiants actifs, et le client retire les lignes locales absentes. Aucun journal de suppressions requis côté serveur.
  3. Les écritures sont des événementsLes changements hors ligne sont conservés comme des intentions ordonnées, pas comme des lignes modifiées à comparer plus tard. Ils sont donc visibles, relançables et faciles à comprendre.
  4. L’injection de dépendances pour des tests rapidesLes cas d’utilisation et les dépôts sont enregistrés avec tsyringe : les règles d’affaires s’exécutent dans de simples tests Node, sans appareil ni simulateur.
  5. Respecter le forfait de donnéesUn réglage « Wi-Fi seulement » est vérifié avant toute synchronisation de module, avec la connectivité et la validité de la session.
05

Où en est le projet

Aujourd’hui

En production sur l’App Store et Google Play, publiée après revue de code, préproduction et assurance qualité sur les versions déployées.

À propos de cette étude de cas

Le nom du produit, l’entreprise, les identifiants et les adresses ont été changés. Un échantillon de code anonymisé est disponible sur demande.

React NativeTypeScriptWatermelonDBSQLiteRedux ToolkitRxJStsyringeJestDetoxMaestroSentryDatadogi18n FR/EN

Un projet que des gens utiliseront tous les jours?

Je présenterai volontiers n’importe lequel de ces projets plus en détail, y compris les projets privés.