|
@@ -28,6 +28,173 @@ FlutterFlow-commit op `main`**, de commit-knop in het Version Control-paneel
|
|
|
reageerde niet op Claude's klik. `dart analyze` op de verse export: 0 errors.
|
|
reageerde niet op Claude's klik. `dart analyze` op de verse export: 0 errors.
|
|
|
Emulator-5556 heeft nu de profile-APK van die export + per-app-locale `nl-NL`.*
|
|
Emulator-5556 heeft nu de profile-APK van die export + per-app-locale `nl-NL`.*
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+### 🚦 Livegang-checklist — aanvulling 2026-09-16 laat (Claude: code-audit op de export van 23:22 + website + toestel, géén builder-werk)
|
|
|
|
|
+
|
|
|
|
|
+*Bob's vraag: "kijk naar de open taken, de app en de website, en vul de lijst aan
|
|
|
|
|
+met wat er nog moet vóór we live gaan." Hieronder alleen wat **nog nergens** in
|
|
|
|
|
+dit bestand stond. Wat al stond (Bob's 7, "Bij livegang", P1-17, P2-7, P2-25,
|
|
|
|
|
+P1-30, taak 56, AdMob test-ads) blijft daar leidend. Chat-nummering loopt door
|
|
|
|
|
+vanaf 60. `dart analyze` op de working tree van 23:22: **0 errors**.*
|
|
|
|
|
+
|
|
|
|
|
+**Nagemeten en in orde — niet opnieuw checken:** share-knop op `EventCurrent`
|
|
|
|
|
+deelt `https://uitgk.com/<nid>` en dat redirect naar de juiste eventpagina op de
|
|
|
|
|
+site (2 nids getest); AdMob app-id in het manifest en beide ad-unit-id's op
|
|
|
|
|
+`pUitgaanPage` zijn echte id's (geen `3940256099942544`); `applicationId`
|
|
|
|
|
+`com.uitgaanskrant.app`, `version 1.0.0+1`, `targetSdk 36`, Crashlytics
|
|
|
|
|
+gekoppeld in `main.dart`; geen credentials of `http://` in `lib/`; Home-tabs
|
|
|
|
|
+(Uitgaan/Activiteiten/Cultuur & Info/Films/Jeugd) dekken exact de vijf tabs van
|
|
|
|
|
+de website-homepage; `/nl/user/register` is anoniem bereikbaar (200).
|
|
|
|
|
+
|
|
|
|
|
+**🔴 Blokkeert de store-review of de eerste indruk**
|
|
|
|
|
+
|
|
|
|
|
+- **60 · P1-55 · App-icoon is nog het Flutter-standaardlogo — op Android én iOS.
|
|
|
|
|
+ Eigenaar: Bob.** `android/app/src/main/res/mipmap-*/ic_launcher.png` (1443
|
|
|
|
|
+ bytes = Flutter-default) en
|
|
|
|
|
+ `ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png` tonen
|
|
|
|
|
+ allebei het blauwe Flutter-vogeltje; de profile-APK op emulator-5556 heeft dus
|
|
|
|
|
+ ook dat icoon in de launcher. App Settings → App Details → **App Icon**: een
|
|
|
|
|
+ vierkant 1024×1024-logo uploaden (het `logo800px.png` uit `assets/images/` is
|
|
|
|
|
+ te breed voor een icoon — liever alleen het rode beeldmerk op wit). Verifiëren:
|
|
|
|
|
+ na een verse export moet `md5sum android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png`
|
|
|
|
|
+ ≠ `57838d52c318faff743130c3fcfae0c6`. Dezelfde 512×512 heb je ook voor de
|
|
|
|
|
+ Play-listing nodig (taak 63).
|
|
|
|
|
+- **61 · P1-56 · Splashscreen is een kaal wit vlak. Eigenaar: Bob.**
|
|
|
|
|
+ `launch_background.xml` bevat alleen `?android:colorBackground`, geen logo.
|
|
|
|
|
+ App Settings → **Splash Screen**: logo + achtergrondkleur `#F2F2F2` of wit.
|
|
|
|
|
+ Twee minuten werk, maar het is het allereerste wat een gebruiker ziet.
|
|
|
|
|
+- **62 · P1-57 · Geen "account aanmaken"-route in de app. Eigenaar: Claude
|
|
|
|
|
+ (builder, klein).** `Login` heeft alleen *Inloggen* en *Wachtwoord vergeten?*;
|
|
|
|
|
+ de helppagina belooft een "gratis account", maar in de app kun je er geen
|
|
|
|
|
+ maken. Toevoegen onder *Wachtwoord vergeten?*: een `Text` "Nog geen account?
|
|
|
|
|
+ Registreren" (dupliceer de bestaande link-`Text`, zelfde stijl `secondary` +
|
|
|
|
|
+ onderstreept) met `Launch URL` → `https://uitgaanskrant.com/nl/user/register`
|
|
|
|
|
+ (anoniem 200). Engelse vertaling meteen meegeven ("No account yet? Register").
|
|
|
|
|
+- **63 · Play Console — aanvulling op Bob's taak 2. Eigenaar: Bob.** Naast
|
|
|
|
|
+ (a) t/m (e) daar:
|
|
|
|
|
+ - **(f) App access / testaccount:** de app heeft een login, dus Google wil
|
|
|
|
|
+ inloggegevens van een testaccount (Play Console → App content → *App
|
|
|
|
|
+ access*). Maak een apart Drupal-account met wat favorieten en één gevolgde
|
|
|
|
|
+ gemeente, zodat de reviewer Favorieten kan zien.
|
|
|
|
|
+ - **(g) Listing-assets:** 512×512 icoon, feature graphic 1024×500, minimaal
|
|
|
|
|
+ 2 telefoon-screenshots én 7"/10"-tablet-screenshots (de app ondersteunt
|
|
|
|
|
+ tablets, dan vraagt Google erom), korte (80) + lange (4000) omschrijving.
|
|
|
|
|
+ De helptekst van taak 59 is een prima basis voor de lange omschrijving.
|
|
|
|
|
+ Screenshots: profile-build op beide AVD's, `adb exec-out screencap -p`.
|
|
|
|
|
+ - **(h) Verklaringen:** Content rating (IARC-vragenlijst), *Contains ads*
|
|
|
|
|
+ → ja, **Advertising ID** → ja (AdMob), Target audience → 18+ of "alle
|
|
|
|
|
+ leeftijden" (er staat uitgaanscontent met 18+ in, kies bewust), en in
|
|
|
|
|
+ Data safety naast Crashlytics/AdMob/login ook **foto's** (camera + galerij
|
|
|
|
|
+ voor de aanmaakpagina's, `CAMERA`-permissie staat in het manifest).
|
|
|
|
|
+ - **(i) versionCode:** elke upload moet hoger zijn; `1.0.0+1` staat nu in
|
|
|
|
|
+ `pubspec.yaml`/`local.properties`. Bij een lokale upload-route: ophogen in
|
|
|
|
|
+ App Settings → App Details vóór elke build.
|
|
|
|
|
+- **64 · P1-58 · "Account verwijderen" in de app opent een 403. Eigenaar: Bob
|
|
|
|
|
+ (Drupal) of Claude (builder).** Favorieten tab 4 → knop *Account verwijderen*
|
|
|
|
|
+ → `launchURL('https://uitgaanskrant.com/nl/account-verwijderen')`
|
|
|
|
|
+ (`favorieten_widget.dart:957`). De browser opent zonder Drupal-sessie, dus de
|
|
|
|
|
+ gebruiker krijgt anoniem een **403** (gemeten) — precies het probleem dat ook
|
|
|
|
|
+ de store-review raakt (Bob's taak 2b). Kies één: (a) Drupal: die pagina
|
|
|
|
|
+ anoniem laten redirecten naar het loginformulier met `?destination=` i.p.v.
|
|
|
|
|
+ een 403; of (b) builder: de knop naar
|
|
|
|
|
+ `https://uitgaanskrant.com/nl/support/mobieleapp` laten wijzen (sectie "Je
|
|
|
|
|
+ account verwijderen"). (a) is netter, (b) is 1 minuut.
|
|
|
|
|
+
|
|
|
|
|
+**🟠 Vóór livegang, één ronde**
|
|
|
|
|
+
|
|
|
|
|
+- **65 · P1-59 · Release-build smoke-test op beide AVD's + Bob's Xiaomi.
|
|
|
|
|
+ Eigenaar: Claude (browserloos).** Tot nu toe is alles op *profile*-builds
|
|
|
|
|
+ getest; een echte `--release`/AAB nog nooit. Eén keer bouwen
|
|
|
|
|
+ (`fvm flutter build apk --release` uit een verse export mét
|
|
|
|
|
+ `--include-assets`, of de AAB uit FlutterFlow's deploy), installeren en
|
|
|
|
|
+ deze lijst doorlopen: verse start (`pm clear`) → header toont
|
|
|
|
|
+ "Amsterdam (gemeente)" → 5 Home-tabs + zoekveld + datumchips → kaart →
|
|
|
|
|
+ `EventCurrent` incl. share en *Website* → menu → Gemeente/Horeca (6 tabs +
|
|
|
|
|
+ zoeken) → zaakpagina + hartje (login-guard) → Thuis bezorgen → Provincie-blok
|
|
|
|
|
+ → Zoek stad → Toepassen → Login/uitloggen/wachtwoord vergeten →
|
|
|
|
|
+ Favorieten 4 tabs → evenement aanmaken (foto kiezen) → vliegtuigmodus
|
|
|
|
|
+ (verbindingsbanner) → toestel op Engels. Elke afwijking als eigen regel
|
|
|
|
|
+ hier noteren. In release verdwijnen debug-asserts én verandert
|
|
|
|
|
+ tree-shaking (icons!) — `FontAwesomeIcons`-glyphs die het in profile doen
|
|
|
|
|
+ kunnen in release wegvallen als `--no-tree-shake-icons` niet is meegegeven.
|
|
|
|
|
+- **66 · P1-60 · Crashlytics écht bewezen. Eigenaar: Bob (Firebase console) +
|
|
|
|
|
+ Claude (test-crash).** `main.dart` hangt `FlutterError.onError` aan
|
|
|
|
|
+ Crashlytics, maar er is nog nooit een crash in het dashboard gezien. Eén
|
|
|
|
|
+ bewuste testcrash (custom action `FirebaseCrashlytics.instance.crash()`
|
|
|
|
|
+ achter een tijdelijke knop, of `adb shell am crash` volstaat niet — moet
|
|
|
|
|
+ door Flutter heen) in een profile-build, app herstarten, en binnen ~5 min
|
|
|
|
|
+ moet 'ie in Firebase → Crashlytics staan. Zonder deze check weet je na
|
|
|
|
|
+ livegang niet of je blind bent.
|
|
|
|
|
+- **67 · P1-61 · Versielabel "v0001" onderin het menu. Eigenaar: Bob (keuze),
|
|
|
|
|
+ Claude bouwt.** `drawerComponent` toont een hardcoded `Text` "v0001"
|
|
|
|
|
+ (sleutel `7qpu1l01`). Of weghalen, of binden aan de echte versie: FlutterFlow
|
|
|
|
|
+ heeft onder *Global Properties* geen versie, dus dan een 3-regelige custom
|
|
|
|
|
+ function met `package_info_plus` (`PackageInfo.fromPlatform()`), of gewoon
|
|
|
|
|
+ handmatig "1.0.0" typen en bij elke release bijwerken. Advies: "1.0.0",
|
|
|
|
|
+ handmatig — het is één veld.
|
|
|
|
|
+- **68 · P1-17 · nameting Deel B op de export van 23:22 (levende code, zonder
|
|
|
|
|
+ `kanweg`/`copy`): 184 sleutels in gebruik, 18 met lege EN, 49 met EN == NL.**
|
|
|
|
|
+ De 18 lege: `Waar`, `WebsiteURL` (2×), `TicketsURL`, `Organisatie` (2×),
|
|
|
|
|
+ `Contact`, `Postcode`, `Categorie evenement`, `Of kies zelf een plaats`,
|
|
|
|
|
+ `Mijn gemeenten`, en **6× `Select...` + 1× `Search...`** — die laatste zeven
|
|
|
|
|
+ zijn FlutterFlow-defaults op de dropdowns van de aanmaakpagina's en staan
|
|
|
|
|
+ dus in het **Nederlands** ook nog op Engels; hoort bij P2-29 (NL: "Kies..." /
|
|
|
|
|
+ "Zoeken..."). Werkblad `TAAK-P1-17-vertalingen.md` bijwerken met deze telling.
|
|
|
|
|
+- **69 · API Calls `Entreeopties` en `Categorieen` lopen over `/en/`, de
|
|
|
|
|
+ overige 15 over `/nl/`. Eigenaar: Bob (API Calls-paneel, 2× URL).**
|
|
|
|
|
+ `api_calls.dart:77` en `:102`. Anoniem geven beide "Access denied", dus
|
|
|
|
|
+ Drupal serveert ze in de taal van het pad — met `/en/` krijg je Engelse
|
|
|
|
|
+ termlabels en foutmeldingen in de Nederlandse aanmaakpagina's. Omzetten
|
|
|
|
|
+ naar `/nl/` en export-verifiëren (`grep -n "/en/flutterdrup" api_calls.dart`
|
|
|
|
|
+ hoort 0 te geven).
|
|
|
|
|
+- **70 · P2-7 · de opruimlijst is verouderd — dit genereert de export van
|
|
|
|
|
+ 23:22 nog aan dode eenheden in `lib/`:** `uitgaanspaginas/home_copy`,
|
|
|
|
|
+ `uitgaanspaginas/home_copy2` (nieuw vandaag), `kanweg/kanweg_home_copy`
|
|
|
|
|
+ (nieuw vandaag), `favorieten_copy`, `shared/drawer_component_copy`,
|
|
|
|
|
+ `components/header_buttons_component_copymethartje`,
|
|
|
|
|
+ `kanweg/kanweg_header_buttons_component_copy`,
|
|
|
|
|
+ `kanweg/kanweg_horecagelegenheden_overzicht`,
|
|
|
|
|
+ `kanweg/kanweghorecagelegenheid_current_copy`,
|
|
|
|
|
+ `uitgaanspaginas/home_uitgaan_slider_component_copy`,
|
|
|
|
|
+ `uitgaanspaginas/home_uitgaantabel_kaart_component_copy`,
|
|
|
|
|
+ `horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy`.
|
|
|
|
|
+ Twaalf stuks; `homeCopy2` staat zelfs in `nav.dart` als route. Bob's taak 4
|
|
|
|
|
+ blijft de plek, dit is alleen de actuele lijst. Claude gooit niets weg.
|
|
|
|
|
+
|
|
|
|
|
+**🟡 Na de store-goedkeuring (P2, niet blokkerend)**
|
|
|
|
|
+
|
|
|
|
|
+- **71 · P2-37 · Android App Links + website-koppeling.** Het manifest heeft
|
|
|
|
|
+ alleen het custom scheme `uitgaanskrant://uitgaanskrant.com`; een `https`-
|
|
|
|
|
+ intent-filter ontbreekt en `https://uitgaanskrant.com/.well-known/assetlinks.json`
|
|
|
|
|
+ geeft **404**. Gevolg: een gedeelde `uitgk.com/<nid>`-link of een sitelink
|
|
|
|
|
+ opent nooit de app. Pas zinvol als de app in de store staat: App Settings →
|
|
|
|
|
+ *Deep Linking* → `https`-domein toevoegen, `assetlinks.json` met de
|
|
|
|
|
+ SHA-256 van de **upload-/signing-key** op de site zetten, en in `nav.dart`
|
|
|
|
|
+ een route die `/nl/.../<slug>` of `/node/<nid>` naar `EventCurrent` mapt
|
|
|
|
|
+ (de site kent alleen slugs; `flutterflow_events.json?nid=` wil een nid —
|
|
|
|
|
+ dus óf de share-link naar `uitgaanskrant.com/app/<nid>` laten wijzen, óf
|
|
|
|
|
+ een Drupal-redirect `/app/<nid>` → node).
|
|
|
|
|
+- **72 · P2-38 · Website ↔ app: wat de site heeft en de app niet.** Gezien op
|
|
|
|
|
+ uitgaanskrant.com: Contact, Vragen/Over ons, Algemene voorwaarden,
|
|
|
|
|
+ Nieuwsbrief (wekelijkse agenda), Adverteren, Merchandise, Ondernemers, en een
|
|
|
|
|
+ taalwissel. In de app alleen "Support pagina" (die Contact en Privacy al
|
|
|
|
|
+ dekt). Voorstel, Bob beslist: (a) na goedkeuring een **Play-Store-badge +
|
|
|
|
|
+ `<meta name="google-play-app" content="app-id=com.uitgaanskrant.app">`** op
|
|
|
|
|
+ de site (Chrome toont dan een app-banner); (b) optioneel één menu-item
|
|
|
|
|
+ "Nieuwsbrief" → `/nl/nieuwsbrief` (de site's wekelijkse agenda is precies
|
|
|
|
|
+ wat een app-gebruiker ook wil). De rest bewust niet — het menu is al lang
|
|
|
|
|
+ (taak 57.2).
|
|
|
|
|
+- **73 · P2-39 · Firebase Analytics staat uit.** `pubspec.yaml` heeft
|
|
|
|
|
+ `firebase_core` en `firebase_crashlytics`, geen `firebase_analytics`. Na
|
|
|
|
|
+ livegang weet je dus niet of iemand de app gebruikt, welke tab, welke
|
|
|
|
|
+ gemeente. Eén toggle in FlutterFlow (App Settings → Firebase → Analytics),
|
|
|
|
|
+ gratis, geen builder-werk verder. Wel meenemen in Data safety (taak 63h).
|
|
|
|
|
+
|
|
|
|
|
+*Terzijde, geen taak: emulator-5554 stond om 23:50 op een zwart scherm in
|
|
|
|
|
+`com.android.settings/.FallbackHome` (boot/lock-staat) terwijl er nog een
|
|
|
|
|
+`ff-run-fvm.sh`-sessie aan hangt; emulator-5556 draait de profile-build op
|
|
|
|
|
+`EventCurrent` (nid 5) en zag er goed uit — header, share-knop en adresblok.*
|
|
|
|
|
+
|
|
|
### ✅ Sessie 2026-09-16 (Bob klikt, Claude verifieert) — vertalingen, caching, helppagina
|
|
### ✅ Sessie 2026-09-16 (Bob klikt, Claude verifieert) — vertalingen, caching, helppagina
|
|
|
|
|
|
|
|
*Werkwijze: Claude gaf taken per nummer, Bob voerde ze uit in zijn eigen browser,
|
|
*Werkwijze: Claude gaf taken per nummer, Bob voerde ze uit in zijn eigen browser,
|