feat(mobile): vérification automatique de mise à jour de version #69

Merged
kyuno merged 7 commits from feat/mobile-update-check into main 2026-09-06 14:11:55 +02:00
Owner

Closes #66

Réutilise l'API Releases de Forgejo (publique, sans authentification — même fait déjà exploité pour vérifier le statut de CI sans jeton) comme source de vérité pour "quelle est la dernière version" : zéro nouvel endpoint backend. useAppUpdateCheck compare App.getInfo().version (@capacitor/app, nouvelle dépendance officielle) au tag_name de GET .../releases/latest, et pointe "Mettre à jour" vers l'URL stable de téléchargement déjà définie par #65.

Comparaison de version en logique pure (version-compare.ts), séparée du hook effectful — testée isolément via un test de composant Cypress (version-compare.cy.tsx, même patron que highlight-tech-steps.cy.tsx : aucun montage, juste describe/it/expect sur des fonctions pures, puisque apps/web n'a pas d'autre outillage de test unitaire).

Natif uniquement (Capacitor.isNativePlatform()) : @capacitor/app/@capacitor/preferences restent en import dynamique à l'intérieur du hook, jamais dans le bundle web — même patron que capacitor-token-store.ts — vérifié dans la sortie du build (deux petits chunks séparés, absents du bundle principal).

Vérification au démarrage à froid + à la reprise depuis l'arrière-plan (appStateChange), avec un throttle de 6h et mémorisation de la version déjà rejetée (@capacitor/preferences) pour ne jamais re-harceler sur la même version. Bannière discrète (pas une Dialog modale) ; "Mettre à jour" ouvre le lien dans le navigateur système plutôt qu'un flux PackageInstaller in-app (pas de permission REQUEST_INSTALL_PACKAGES/code natif supplémentaire pour un gain marginal — voir le hors-scope du ticket).

Vérifié localement : pnpm lint ✅, pnpm --filter web build ✅ (TypeScript + Vite, deux chunks Capacitor bien séparés du bundle principal), le test de composant version-compare.cy.tsx (9/9), et layout/smoke/planning-page en e2e (18/18 — confirme que la bannière, no-op sur le web, ne casse rien pour l'espace connecté existant).

🤖 Generated with Claude Code

Closes #66 Réutilise l'API Releases de Forgejo (publique, sans authentification — même fait déjà exploité pour vérifier le statut de CI sans jeton) comme source de vérité pour "quelle est la dernière version" : zéro nouvel endpoint backend. `useAppUpdateCheck` compare `App.getInfo().version` (`@capacitor/app`, nouvelle dépendance officielle) au `tag_name` de `GET .../releases/latest`, et pointe "Mettre à jour" vers l'URL stable de téléchargement déjà définie par #65. Comparaison de version en logique pure (`version-compare.ts`), séparée du hook effectful — testée isolément via un test de composant Cypress (`version-compare.cy.tsx`, même patron que `highlight-tech-steps.cy.tsx` : aucun montage, juste `describe`/`it`/`expect` sur des fonctions pures, puisque `apps/web` n'a pas d'autre outillage de test unitaire). **Natif uniquement** (`Capacitor.isNativePlatform()`) : `@capacitor/app`/`@capacitor/preferences` restent en import dynamique à l'intérieur du hook, jamais dans le bundle web — même patron que `capacitor-token-store.ts` — vérifié dans la sortie du build (deux petits chunks séparés, absents du bundle principal). Vérification au démarrage à froid + à la reprise depuis l'arrière-plan (`appStateChange`), avec un throttle de 6h et mémorisation de la version déjà rejetée (`@capacitor/preferences`) pour ne jamais re-harceler sur la même version. Bannière discrète (pas une `Dialog` modale) ; "Mettre à jour" ouvre le lien dans le navigateur système plutôt qu'un flux `PackageInstaller` in-app (pas de permission `REQUEST_INSTALL_PACKAGES`/code natif supplémentaire pour un gain marginal — voir le hors-scope du ticket). **Vérifié localement** : `pnpm lint` ✅, `pnpm --filter web build` ✅ (TypeScript + Vite, deux chunks Capacitor bien séparés du bundle principal), le test de composant `version-compare.cy.tsx` (9/9), et `layout`/`smoke`/`planning-page` en e2e (18/18 — confirme que la bannière, no-op sur le web, ne casse rien pour l'espace connecté existant). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 10:52:57 +02:00
feat(mobile): vérification automatique de mise à jour de version
Some checks failed
CI / lint (push) Successful in 6m25s
CI / intent-service-test (push) Successful in 5m1s
CI / build (push) Successful in 2m38s
CI / test (push) Failing after 11m54s
CI / e2e (push) Has been cancelled
5d4d6be2dc
Réutilise l'API Releases de Forgejo (publique, sans authentification) comme
source de vérité pour "quelle est la dernière version" — zéro nouvel
endpoint backend : useAppUpdateCheck compare App.getInfo().version
(@capacitor/app, nouvelle dépendance) au tag_name de
GET .../releases/latest, et pointe "Mettre à jour" vers l'URL stable de
téléchargement (issue #65).

Comparaison de version en logique pure (version-compare.ts), séparée du
hook effectful — testée isolément via un test de composant Cypress
(version-compare.cy.tsx, même patron que highlight-tech-steps.cy.tsx :
aucun montage, juste describe/it/expect sur des fonctions pures).

Natif uniquement (Capacitor.isNativePlatform()) : @capacitor/app et
@capacitor/preferences restent en import dynamique dans le hook, jamais
dans le bundle web (même patron que capacitor-token-store.ts) — vérifié
dans le build (deux petits chunks séparés, pas dans le bundle principal).

Vérification au démarrage à froid + à la reprise depuis l'arrière-plan
(appStateChange), avec un throttle de 6h et une mémorisation de la version
déjà rejetée dans @capacitor/preferences pour ne jamais re-harceler sur la
même version. Bannière discrète (pas une Dialog modale), bouton "Mettre à
jour" ouvrant le lien de téléchargement dans le navigateur système plutôt
qu'un flux PackageInstaller in-app.

Vérifié : pnpm lint, pnpm --filter web build, le test de composant (9/9),
et layout/smoke/planning-page e2e (18/18, la bannière étant un no-op sur
le web ne devait rien casser — confirmé).

Closes #66

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 11:08:25 +02:00
chore: relance la CI (job test cassé par la course d'infra connue sur le Postgres partagé)
Some checks failed
CI / lint (push) Successful in 5m32s
CI / intent-service-test (push) Successful in 5m49s
CI / build (push) Successful in 4m29s
CI / test (push) Failing after 15m13s
CI / e2e (push) Has been cancelled
a3a949ce08
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 11:29:55 +02:00
chore: relance la CI (2e collision infra sur le Postgres partagé)
Some checks failed
CI / lint (push) Successful in 2m46s
CI / intent-service-test (push) Successful in 4m47s
CI / build (push) Successful in 4m31s
CI / e2e (push) Successful in 13m54s
CI / test (push) Failing after 17m45s
09f6d426d3
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 11:49:20 +02:00
chore: relance la CI (3e collision infra — course d'upsert concurrente sur le seed Postgres partagé)
Some checks failed
CI / lint (push) Successful in 4m38s
CI / build (push) Successful in 3m28s
CI / intent-service-test (push) Successful in 6m34s
CI / test (push) Failing after 10m22s
CI / e2e (push) Has been cancelled
59352563c4
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 12:01:03 +02:00
chore: relance la CI (4e collision infra sur le Postgres partagé)
Some checks failed
CI / intent-service-test (push) Has been cancelled
CI / build (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
cf7e519883
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 12:09:24 +02:00
chore: relance la CI (run précédent annulé — cause inconnue, pas un échec de test)
Some checks failed
CI / lint (push) Successful in 4m25s
CI / intent-service-test (push) Successful in 4m43s
CI / build (push) Successful in 4m5s
CI / test (push) Failing after 11m5s
CI / e2e (push) Has been cancelled
907a68eb8a
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 12:25:12 +02:00
chore: relance la CI (collision infra — violation de clé étrangère pendant le seed Postgres partagé)
All checks were successful
CI / lint (push) Successful in 3m37s
CI / build (push) Successful in 3m22s
CI / intent-service-test (push) Successful in 5m42s
CI / e2e (push) Successful in 10m15s
CI / test (push) Successful in 18m22s
7bafe39d72
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit e9c0a61aaf into main 2026-09-06 14:11:55 +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#69
No description provided.