feat(mobile): redirection vers l'appli + page de téléchargement #93

Merged
kyuno merged 8 commits from feat/mobile-app-redirect into main 2026-09-07 15:05:16 +02:00
Owner

Closes #84 — chantier "UI mobile & tablette".

Ce que ça change

Aucune infra de deep-link n'existait (vérifié en amont : pas de scheme
personnalisé, pas d'App Links, pas d'assetlinks.json, pas de listener
appUrlOpen).

  • lib/mobile-app-redirect.ts — attemptOpenNativeApp() (pattern
    "smart app banner" classique : tente le scheme batchcooking://,
    bascule sur onFallback si la page est toujours visible passé un court
    délai) et isAndroidPhoneBrowser() (UA Android+Mobile, délibérément
    distinct de useIsMobileViewport() — une question de plateforme, pas de
    largeur). Respecte une préférence "rester sur le web" (localStorage,
    clé exportée pour que l'onglet Paramètres d'application — ticket #86 —
    la réutilise) sans jamais forcer la redirection.
  • AndroidManifest.xml — nouvel <intent-filter> additif (scheme
    batchcooking), sans toucher au filtre MAIN/LAUNCHER existant.
  • Nouvelle page /telecharger (publique, hors RequireAuth — un
    visiteur déjà connecté sur le web mais sans l'appli sur cet appareil a
    une raison légitime d'y atterrir) : lien direct vers le proxy existant
    ${API_BASE_URL}/mobile/download (rien à changer côté API), bouton
    "Réessayer d'ouvrir l'application".

Délibérément pas de changement sur la landing page ici (son lien
discret actuel est laissé tel quel) — c'est le ticket #85, gardé séparé
pour rester petit et revuable.

Vérification

  • tsc -b --force + biome check — propres.
  • pnpm --filter web build — propre.
  • Cypress e2e : 141/141 sur cette branche (#91 n'est pas encore mergée
    ici, layout.cy.ts y est donc encore dans son état pré-#91 — normal, pas
    une régression) et composants : 69/69, incluant le nouveau
    mobile-app-redirect.cy.tsx.
  • Note technique : le premier essai de test du composant tentait un
    vrai window.location.href vers le scheme personnalisé depuis
    Cypress/Electron, ce qui bloquait le runner indéfiniment (protocole
    inconnu mal géré par Electron) — corrigé en rendant ce seul appel
    injectable (openAppUrl, réservé aux tests) sans toucher au
    comportement réel.

🤖 Generated with Claude Code

Closes #84 — chantier "UI mobile & tablette". ## Ce que ça change Aucune infra de deep-link n'existait (vérifié en amont : pas de scheme personnalisé, pas d'App Links, pas d'`assetlinks.json`, pas de listener `appUrlOpen`). - **`lib/mobile-app-redirect.ts`** — `attemptOpenNativeApp()` (pattern "smart app banner" classique : tente le scheme `batchcooking://`, bascule sur `onFallback` si la page est toujours visible passé un court délai) et `isAndroidPhoneBrowser()` (UA `Android`+`Mobile`, délibérément distinct de `useIsMobileViewport()` — une question de plateforme, pas de largeur). Respecte une préférence "rester sur le web" (`localStorage`, clé exportée pour que l'onglet Paramètres d'application — ticket #86 — la réutilise) sans jamais forcer la redirection. - **`AndroidManifest.xml`** — nouvel `<intent-filter>` additif (scheme `batchcooking`), sans toucher au filtre `MAIN`/`LAUNCHER` existant. - **Nouvelle page `/telecharger`** (publique, hors `RequireAuth` — un visiteur déjà connecté sur le web mais sans l'appli sur cet appareil a une raison légitime d'y atterrir) : lien direct vers le proxy existant `${API_BASE_URL}/mobile/download` (rien à changer côté API), bouton "Réessayer d'ouvrir l'application". **Délibérément pas de changement sur la landing page ici** (son lien discret actuel est laissé tel quel) — c'est le ticket #85, gardé séparé pour rester petit et revuable. ## Vérification - `tsc -b --force` + `biome check` — propres. - `pnpm --filter web build` — propre. - Cypress **e2e : 141/141** sur cette branche (#91 n'est pas encore mergée ici, `layout.cy.ts` y est donc encore dans son état pré-#91 — normal, pas une régression) et **composants : 69/69**, incluant le nouveau `mobile-app-redirect.cy.tsx`. - **Note technique** : le premier essai de test du composant tentait un vrai `window.location.href` vers le scheme personnalisé depuis Cypress/Electron, ce qui bloquait le runner indéfiniment (protocole inconnu mal géré par Electron) — corrigé en rendant ce seul appel injectable (`openAppUrl`, réservé aux tests) sans toucher au comportement réel. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-07 12:21:15 +02:00
feat(mobile): redirection vers l'appli + page de telechargement
Some checks failed
CI / lint (push) Successful in 3m35s
CI / build (push) Successful in 4m33s
CI / intent-service-test (push) Successful in 4m43s
CI / e2e (push) Successful in 15m5s
CI / test (push) Failing after 15m28s
CI / build-android (push) Has been skipped
d6cf4aa63d
Ticket #84 du chantier UI mobile & tablette. Aucune infra de deep-link
n'existait (verifie en amont : pas de scheme personnalise, pas d'App
Links, pas d'assetlinks.json, pas de listener appUrlOpen).

- lib/mobile-app-redirect.ts : attemptOpenNativeApp() (pattern "smart
  app banner" classique - tente le scheme batchcooking://, bascule sur
  onFallback si la page est toujours visible passe un court delai) et
  isAndroidPhoneBrowser() (UA Android+Mobile, deliberement distinct de
  useIsMobileViewport() - une question de plateforme, pas de largeur).
  Respecte une preference "rester sur le web" (localStorage, cle
  exportee pour que l'onglet Parametres d'application - ticket #86 -
  la reutilise) sans jamais forcer la redirection.
- AndroidManifest.xml : nouvel intent-filter additif (scheme
  batchcooking, sans toucher au filtre MAIN/LAUNCHER existant).
- Nouvelle page /telecharger (publique, hors RequireAuth - un visiteur
  deja connecte sur le web mais sans l'appli sur cet appareil a une
  raison legitime d'y atterrir) : lien direct vers le proxy existant
  ${API_BASE_URL}/mobile/download (rien a changer cote API), bouton
  "reessayer d'ouvrir l'appli".

Deliberement pas de changement sur la landing page ici (lien discret
actuel laisse tel quel) - c'est le ticket #85, separe pour rester
petit/revuable.

Verifie en local : tsc -b --force, biome check, build de prod, suite
Cypress e2e complete (141/141 sur cette branche - #91 n'est pas encore
merge, layout.cy.ts y est donc encore dans son etat pre-#91) et
composants (69/69, incluant le nouveau mobile-app-redirect.cy.tsx).
Note technique : le premier essai de test du composant tentait un vrai
window.location.href vers le scheme personnalise depuis Cypress/
Electron, ce qui bloquait le runner indefiniment (protocole inconnu
mal gere par Electron) - corrige en rendant ce seul appel injectable
(openAppUrl, reserve aux tests) sans toucher au comportement reel.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-07 12:38:50 +02:00
chore: relance la CI (collision infra sur le Postgres partage)
Some checks failed
CI / build-android (push) Blocked by required conditions
CI / build (push) Failing after 48s
CI / e2e (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / intent-service-test (push) Has been cancelled
CI / test (push) Has been cancelled
14690134f7
PrismaClientInitializationError "Can't reach database server at
postgres:5432" pendant test, alors que ce ticket ne touche aucun
fichier apps/api - signature connue de contention sur le runner
partage (voir ci-forgejo-runner-constraints), pas une regression.
kyuno added 1 commit 2026-09-07 12:41:42 +02:00
chore: relance la CI (collision de cache actions sur le runner)
Some checks failed
CI / lint (push) Successful in 3m22s
CI / build (push) Successful in 3m12s
CI / intent-service-test (push) Successful in 4m48s
CI / test (push) Failing after 9m15s
CI / e2e (push) Successful in 12m52s
CI / build-android (push) Has been skipped
bb5fc825ae
Non-terminating error while running 'git clone' puis Cannot find
module '.../pnpm-action-setup@v4/dist/index.js' - signature connue de
collision entre deux jobs act demarrant en meme temps sur le cache
d'actions partage du runner (voir ci-forgejo-runner-constraints), pas
une regression.
kyuno added 1 commit 2026-09-07 13:02:37 +02:00
chore: relance la CI (Postgres partage coupe en cours de run)
Some checks failed
CI / build-android (push) Blocked by required conditions
CI / intent-service-test (push) Failing after 36s
CI / build (push) Has been cancelled
CI / test (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / e2e (push) Has been cancelled
200e343cc7
Can't reach database server at postgres:5432 / Server has closed the
connection - meme signature connue de contention runner que les
relances precedentes (voir ci-forgejo-runner-constraints), pas une
regression.
kyuno added 1 commit 2026-09-07 13:04:12 +02:00
chore: relance la CI (4e collision infra sur le runner partage)
Some checks failed
CI / build-android (push) Blocked by required conditions
CI / lint (push) Successful in 3m33s
CI / build (push) Successful in 4m10s
CI / intent-service-test (push) Successful in 9m43s
CI / test (push) Failing after 15m14s
CI / e2e (push) Successful in 14m51s
952abe8dda
intent-service-test a echoue cette fois sur actions/checkout lui-meme
("Non-terminating error while running 'git clone': some refs were not
updated" puis "Cannot find module '.../actions-checkout@v4/dist/index.js'")
- meme classe de collision de cache d'actions que les echecs precedents,
juste une action differente touchee cette fois (voir
ci-forgejo-runner-constraints). Ce ticket ne touche aucun fichier lie a
ces actions.
kyuno added 1 commit 2026-09-07 13:25:03 +02:00
chore: relance la CI (Postgres partage coupe en cours de run)
Some checks failed
CI / build-android (push) Blocked by required conditions
CI / lint (push) Successful in 3m20s
CI / intent-service-test (push) Successful in 4m46s
CI / build (push) Successful in 4m43s
CI / test (push) Failing after 10m16s
CI / e2e (push) Has been cancelled
3cdc863774
Can't reach database server at postgres:5432 / Server has closed the
connection - meme signature connue de contention runner que les
relances precedentes (voir ci-forgejo-runner-constraints), pas une
regression.
kyuno added 1 commit 2026-09-07 13:39:25 +02:00
chore: relance la CI (6e collision - FK violee au seed sous contention)
Some checks failed
CI / lint (push) Successful in 3m43s
CI / intent-service-test (push) Successful in 5m52s
CI / build (push) Successful in 3m18s
CI / test (push) Failing after 13m37s
CI / e2e (push) Successful in 13m53s
CI / build-android (push) Has been skipped
022b8ed4f9
Cette fois : PrismaClientKnownRequestError "Foreign key constraint
violated: tour_scenario_step_target_key_fkey" dans le beforeAll
global (seedTourScenarios). Nouvelle variante de la meme famille
connue (plusieurs process de test partageant une seule base Postgres
CI, seed concurrent) plutot qu'un nouveau bug reel - ce ticket ne
touche ni reference-seed-data.ts ni quoi que ce soit lie aux tours.
Log complet aussi montre un timeout Docker au nettoyage du conteneur
("context deadline exceeded"), signe supplementaire de charge severe
sur le runner en ce moment.
kyuno added 1 commit 2026-09-07 14:32:22 +02:00
merge: rapatrie le correctif de serialisation CI (#96)
All checks were successful
CI / lint (push) Successful in 1m49s
CI / build (push) Successful in 4m3s
CI / intent-service-test (push) Successful in 6m48s
CI / e2e (push) Successful in 13m34s
CI / test (push) Successful in 30m44s
CI / build-android (push) Has been skipped
0447c68b69
kyuno merged commit e45d92b333 into main 2026-09-07 15:05:16 +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#93
No description provided.