feat(web): plomberie Capacitor Android — dépendances, config, routeur, token store (portage mobile #39, phase 2) #56

Merged
kyuno merged 2 commits from feat/capacitor-android-shell into main 2026-09-06 04:33:26 +02:00
Owner

Deuxième phase du portage mobile #39 : tout ce qui est vérifiable en CI de la coquille Capacitor. Le rendu et le comportement web sont inchangés — chaque chemin natif est derrière Capacitor.isNativePlatform(), qui vaut false dans tout navigateur (et sous Cypress).

Contenu

  • Dépendances : @capacitor/core, @capacitor/android, @capacitor/preferences (+ @capacitor/cli en dev), toutes en 8.5.x.
  • apps/web/capacitor.config.ts : appId fr.kyuno.batchcooking, appName « Batch Cooking », webDir: "dist". Lu uniquement par l'outillage @capacitor/cli, jamais bundlé.
  • apps/web/src/api/capacitor-token-store.ts : l'implémentation TokenStore adossée à @capacitor/preferences (le TokenStore + setTokenStore() ont été posés en phase 1). Importée dynamiquement dans main.tsx, seulement quand Capacitor.isNativePlatform() — vérifié : Vite la met dans un chunk séparé de 0,5 ko qui n'est jamais requis côté navigateur, donc @capacitor/preferences n'entre pas dans le bundle web.
  • main.tsx : HashRouter en natif (le bundle packagé sert dist/ depuis l'origine locale de la WebView, sans serveur pour réécrire les liens profonds vers index.html — un accès direct à une route profonde ou un reload 404erait), BrowserRouter inchangé sur le web. Bootstrap async pour installer le token store natif avant le premier rendu (AuthProvider fait GET /auth/me au montage) ; le chemin web ne fait aucun await, le rendu n'est pas différé.
  • build:capacitor (vite build --mode capacitor) + .env.capacitor.example : un build packagé a besoin de l'URL absolue et publique de l'API en dur — pas de « même origine que la page » possible.

Étape manuelle restante (hors CI, cf. corps de l'issue #39)

npx cap add android (génère apps/web/android/, un projet Gradle — nécessite Android Studio + le SDK), build de l'APK, lancement sur émulateur/appareil, et le test manuel « connexion → planning affiché → un appel API authentifié réussit via le jeton ». Rien de tout ça n'est mockable/exécutable en CI ; cette PR pose tout ce qui l'entoure côté code.

Restent aussi à faire lors de cette étape : icônes/splash, couleur de status bar (alignée sur _theme.scss), permission INTERNET du manifeste — tous dans le projet natif généré.

Tests

  • pnpm build + pnpm lint verts. pnpm install --frozen-lockfile OK (lockfile cohérent).
  • Cypress smoke + layout + sidebar : 14/14 en local — le refactor du bootstrap et le choix de routeur (BrowserRouter côté web) ne cassent rien : redirection auth, navigation sidebar, layout/thème.

Avancement de #39 — l'issue reste ouverte jusqu'à la génération + validation du projet natif.

🤖 Generated with Claude Code

Deuxième phase du [portage mobile #39](https://git.dev.kyuno.fr/kyuno/batchCooking/issues/39) : **tout ce qui est vérifiable en CI de la coquille Capacitor**. Le rendu et le comportement web sont inchangés — chaque chemin natif est derrière `Capacitor.isNativePlatform()`, qui vaut `false` dans tout navigateur (et sous Cypress). ## Contenu - **Dépendances** : `@capacitor/core`, `@capacitor/android`, `@capacitor/preferences` (+ `@capacitor/cli` en dev), toutes en 8.5.x. - **`apps/web/capacitor.config.ts`** : `appId` `fr.kyuno.batchcooking`, `appName` « Batch Cooking », `webDir: "dist"`. Lu uniquement par l'outillage `@capacitor/cli`, jamais bundlé. - **`apps/web/src/api/capacitor-token-store.ts`** : l'implémentation `TokenStore` adossée à `@capacitor/preferences` (le `TokenStore` + `setTokenStore()` ont été posés en phase 1). Importée **dynamiquement** dans `main.tsx`, seulement quand `Capacitor.isNativePlatform()` — vérifié : Vite la met dans un chunk séparé de 0,5 ko qui n'est jamais requis côté navigateur, donc `@capacitor/preferences` n'entre pas dans le bundle web. - **`main.tsx`** : `HashRouter` en natif (le bundle packagé sert `dist/` depuis l'origine locale de la WebView, sans serveur pour réécrire les liens profonds vers `index.html` — un accès direct à une route profonde ou un reload 404erait), `BrowserRouter` **inchangé** sur le web. Bootstrap `async` pour installer le token store natif avant le premier rendu (`AuthProvider` fait `GET /auth/me` au montage) ; le chemin web ne fait aucun `await`, le rendu n'est pas différé. - **`build:capacitor`** (`vite build --mode capacitor`) + **`.env.capacitor.example`** : un build packagé a besoin de l'URL absolue et publique de l'API en dur — pas de « même origine que la page » possible. ## Étape manuelle restante (hors CI, cf. corps de l'issue #39) `npx cap add android` (génère `apps/web/android/`, un projet Gradle — nécessite Android Studio + le SDK), build de l'APK, lancement sur émulateur/appareil, et le test manuel « connexion → planning affiché → un appel API authentifié réussit via le jeton ». Rien de tout ça n'est mockable/exécutable en CI ; cette PR pose tout ce qui l'entoure côté code. Restent aussi à faire lors de cette étape : icônes/splash, couleur de status bar (alignée sur `_theme.scss`), permission `INTERNET` du manifeste — tous dans le projet natif généré. ## Tests - `pnpm build` + `pnpm lint` verts. `pnpm install --frozen-lockfile` OK (lockfile cohérent). - Cypress `smoke` + `layout` + `sidebar` : **14/14 en local** — le refactor du bootstrap et le choix de routeur (`BrowserRouter` côté web) ne cassent rien : redirection auth, navigation sidebar, layout/thème. Avancement de #39 — l'issue reste ouverte jusqu'à la génération + validation du projet natif. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 04:11:47 +02:00
feat(web): plomberie web pour la coquille Capacitor Android (#39 phase 2)
Some checks failed
CI / lint (push) Failing after 1m59s
CI / build (push) Successful in 3m55s
CI / test (push) Has been cancelled
CI / intent-service-test (push) Has been cancelled
CI / e2e (push) Has been cancelled
ff36cefcde
Tout ce qui est vérifiable en CI de la phase 2 du portage mobile. La
génération du projet natif (`npx cap add android`), le build de l'APK et
le test sur appareil restent une étape manuelle (pas d'Android Studio ici)
— cf. le corps de l'issue #39.

- Dépendances : `@capacitor/core`, `@capacitor/android`,
  `@capacitor/preferences` (+ `@capacitor/cli` en dev), toutes en 8.5.x.
- `capacitor.config.ts` : `appId` `fr.kyuno.batchcooking`, `webDir: "dist"`.
- `apps/web/src/api/capacitor-token-store.ts` : implémentation `TokenStore`
  adossée à `@capacitor/preferences`, branchée via `setTokenStore()` (le
  point d'injection posé en phase 1). Importée dynamiquement dans
  `main.tsx` uniquement quand `Capacitor.isNativePlatform()` — le bundle
  web ne charge jamais `@capacitor/preferences` (vérifié : chunk séparé de
  0,5 ko jamais requis côté navigateur).
- `main.tsx` : `HashRouter` en natif (le bundle packagé sert `dist/`
  depuis l'origine locale de la WebView, sans réécriture des liens
  profonds vers `index.html`), `BrowserRouter` inchangé sur le web ;
  bootstrap async pour poser le token store avant le premier rendu.
- `build:capacitor` (`vite build --mode capacitor`) + `.env.capacitor.example` :
  le build packagé a besoin de l'URL absolue de l'API en dur (pas de
  "même origine que la page" possible).

Vérifié : `pnpm build` + `pnpm lint` verts ; Cypress smoke/layout/sidebar
14/14 en local (le refactor du bootstrap et le choix de routeur ne
cassent rien côté web).

Refs #39
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 04:16:06 +02:00
chore: relance la CI (run 109 : échec du checkout git côté runner, pas du code)
All checks were successful
CI / lint (push) Successful in 2m31s
CI / build (push) Successful in 2m40s
CI / intent-service-test (push) Successful in 4m18s
CI / e2e (push) Successful in 9m12s
CI / test (push) Successful in 16m48s
0ba6b2f687
Les 5 jobs de la run 109 ont échoué tôt sur « git clone: some refs were not
updated » pendant l'étape de checkout, avant même `pnpm install`/`pnpm lint`.
Rien à voir avec cette branche : `pnpm install --frozen-lockfile`, `pnpm lint`
et `pnpm build` sont verts en local.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit 961aa151d4 into main 2026-09-06 04:33:26 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#56
No description provided.