Explorar o código

2.0-C: foto-editor onderzocht — pro_image_editor, gepind op 12.0.0

Onderzoek naar een foto-editor waarmee gebruikers tekst op hun foto
kunnen zetten. Keuze: pro_image_editor (BSD-3-Clause, gratis), geen
betaalde SDK — die willen alle drie zelf het bestand hosten en dat
breekt de bestaande bestandUpload -> file_managed -> fotoboek-keten.

Gemeten tegen de pub.dev-API: de laatste versie (14.3.0) eist Dart 3.12
/ Flutter 3.44 en draait dus niet op dit project (3.9.2 / 3.35.7).
Hoogst bruikbare is 12.0.0 — zelfde val als add_2_calendar. De drie
dependency-bumps die 12.0.0 vraagt (http, shared_preferences, web)
bestaan alle drie in een versie die op Dart 3.9.2 draait.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob hai 1 día
pai
achega
397757562e
Modificáronse 1 ficheiros con 128 adicións e 1 borrados
  1. 128 1
      TASKS.md

+ 128 - 1
TASKS.md

@@ -586,7 +586,36 @@ De labels eten de ruimte op die de responsive `Max Lines` veronderstelt. Bij é
 label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
 label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
 omschrijving één regel korter.
 omschrijving één regel korter.
 
 
-### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude — bezig** (2026-09-23: besluit genomen, fase 1 klaar om te bouwen)
+### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude — bezig** (2026-09-23: FASE 1 GEBOUWD, EN-test loopt)
+
+#### ✅ Fase 1 af en geverifieerd in de export (2026-09-23)
+
+- **Custom function `tweetalig(nlText, enText)`** staat er — beide argumenten
+  non-nullable String, return String met *Nullable* uit. Export regel 562 van
+  `custom_functions.dart`.
+- **Component `LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) —
+  gedupliceerd van `LegeLijstComponent`, parameters `nlTekst` + `enTekst` (beide
+  required String). De Text-binding werd `functions.tweetalig(widget!.nlTekst!,
+  widget!.enTekst!)` — **zonder `valueOrDefault`-wrapper**, precies zoals
+  bedoeld bij een non-nullable return.
+  - 💡 *Een component-parameter HERNOEMEN behoudt de binding:* `tekst` →
+    `nlTekst` liet de bestaande Text-binding intact, dus die hoefde niet opnieuw.
+- **Proefplek `MijnAanmeldingen`** — `StaggeredView` → Empty List Widget →
+  Widget Type *Component* → `LegeLijstMelding`, Center Component aan.
+  Export regel 211-217; de apostrof in "haven't" is netjes geëscaped.
+- `dart analyze` op de verse export: **0 errors**.
+
+**Nog te doen in fase 1:** de Engelse tak bewijzen op een toestel
+(`cmd locale set-app-locales com.uitgaanskrant.app --locales en-US`, daarna terug
+naar `nl-NL`). Truc: **uitgelogd** naar `MijnAanmeldingen` navigeren geeft een
+401 en dus precies de lege staat.
+
+⚠️ **Niet van ons:** de Issues-teller stond op 5 errors bij aanvang en ging naar 7
+tijdens deze sessie — dubbele *Upload Data action*-namen op `ButtonLogo`/
+`ButtonFotos` (het bekende `Duplicate Page`-patroon, van de fotoboek-sessie).
+`export-code` slaagt er gewoon mee, maar ze horen opgeruimd.
+
+#### Het oorspronkelijke besluit
 
 
 #### ✅ BESLUIT 2026-09-23 (Bob): route A, maar met een custom FUNCTION — geen custom widget
 #### ✅ BESLUIT 2026-09-23 (Bob): route A, maar met een custom FUNCTION — geen custom widget
 
 
@@ -996,6 +1025,104 @@ Een guard ("sla de fetch over als `alleXxx` al gevuld is") lost dat op, maar kos
 een conditie in vijf actieketens — en juist die dialoog is op deze pagina fragiel.
 een conditie in vijf actieketens — en juist die dialoog is op deze pagina fragiel.
 Alleen doen als het in de praktijk hindert.
 Alleen doen als het in de praktijk hindert.
 
 
+### 2.0-C · Foto-editor: gebruikers tekst op hun foto laten zetten
+
+**Bob 2026-09-23:** mensen moeten hun geüploade foto kunnen bewerken — tekst erop,
+croppen, filters. Onderzocht op 2026-09-23; **besluit: `pro_image_editor`**, geen
+betaalde dienst.
+
+#### Waarom dit pakket en geen SDK-abonnement
+
+`pro_image_editor` (pub.dev, **BSD-3-Clause**, gratis ook commercieel) doet in
+pure Dart precies wat gevraagd is: tekstlagen (font, kleur, achtergrond,
+uitlijning), croppen/roteren/spiegelen, tekenen, stickers/emoji, filters, blur,
+lagen slepen/schalen/draaien, undo/redo. Android + iOS + web. In: `Uint8List`,
+uit: `Uint8List`. Gezond onderhouden: 592 likes, 160/160 pub points, ±56k
+downloads/maand, laatste release 6 dagen vóór de meting.
+
+De betaalde alternatieven zijn afgevallen op **architectuur, niet op prijs**:
+
+| Dienst | Prijs | Waarom niet |
+|---|---|---|
+| img.ly PhotoEditor SDK | ±$1.000-3.000/jaar | Mooiste UI, maar overkill voor tekst-op-foto |
+| Uploadcare | gratis tier, daarna ~$100+/mnd | Wil zélf het bestand hosten |
+| Filestack | vanaf ~$70/mnd | Idem |
+| Cloudinary | gratis tier | Transformaties via URL, géén gebruikerseditor |
+
+Die laatste drie zetten hun eigen storage naast Drupal. Wij hebben een werkende
+keten `bestandUpload` → `file_managed` → fotoboek, inclusief het
+eigenaarschapsmodel (403 op andermans fids, zie de fotoboek-notitie in
+`CLAUDE.md`). Een externe uploaddienst ertussen breekt dat of dupliceert het.
+**Webview-route (Pintura, `tui.image-editor`) ook afgevallen:** bytes heen en weer
+via een JS-bridge, en dat patroon heeft in dit project al eerder pijn opgeleverd.
+
+#### ⚠️ Pin op versie 12.0.0 — de laatste versie draait NIET op dit project
+
+Gemeten 2026-09-23 tegen de pub.dev-API:
+
+- **laatste is 14.3.0** en eist `sdk >=3.12.0` + `flutter >=3.44.0`;
+- dit project zit op **Flutter 3.35.7 / Dart 3.9.2**;
+- **hoogst bruikbare versie: `12.0.0`** (2026-02-13, `sdk >=3.2.2`,
+  `flutter >=3.35.0`) — de eerstvolgende, 13.1.0, springt al naar Dart 3.12.
+
+Exact hetzelfde patroon als bij `add_2_calendar` (zie `CLAUDE.md`): `pub get`
+weigert dan met een misleidende "Try using the Flutter SDK version 3.4x". Zet dus
+`pro_image_editor: 12.0.0` — **zonder caret**, anders trekt pub bij de eerste
+`pub get` alsnog 13+ binnen.
+
+Wat je mist door te pinnen: de changelog van 13.x/14.x gaat vrijwel volledig over
+de *tune*-editor (sliders, stacking-bug) en stijl-opties. **Niets aan de
+tekstfunctie**, dus voor dit doel kost het pinnen niets.
+
+#### Dependency-bumps — gemeten, alle drie veilig
+
+12.0.0 vraagt drie packages iets hoger dan `pubspec.lock` nu vastheeft. Alle drie
+bestaan in een versie die op Dart 3.9.2 draait, dus dit blokkeert niet:
+
+| package | project nu | 12.0.0 wil | laagste die voldoet | Dart-eis daarvan |
+|---|---|---|---|---|
+| `http` | 1.4.0 | `^1.6.0` | 1.6.0 | `^3.4.0` ✅ |
+| `shared_preferences` | 2.5.3 | `^2.5.4` | 2.5.4 | ✅ (t/m 2.5.5) |
+| `web` | 1.1.0 | `^1.1.1` | 1.1.1 | `^3.4.0` ✅ |
+
+`vector_math` (2.2.0) en `plugin_platform_interface` (2.1.8) staan al goed.
+**Nog niet gemeten:** of een ánder package in dit project `http` onder 1.6.0
+vastzet. Dat blijkt bij de eerste `pub get` in een losse exportmap.
+
+#### Hoe het in de app past
+
+Dart-pakket, dus **Custom Widget of Custom Action** in `lib/custom_code/`, met
+`pro_image_editor: 12.0.0` toegevoegd via de Pubspec-dependencies in de builder.
+De keten wordt: foto kiezen (bestaande knop) → editor openen → bewerkte bytes
+terug → `bestandUpload`. Dat laatste stuk draait al.
+
+Aandachtspunten die nu al bekend zijn:
+- **FlutterFlow's eigen mediakiezer is niet uit te breiden**
+  (`selectMediaWithSourceBottomSheet` is gegenereerde helper-code, zie
+  `CLAUDE.md`). De editor komt dus als losse stap ná het kiezen — sluit aan bij
+  hoe de Fotoboek/Mobiel-keuze nu al werkt (commit `e5f46e7`).
+- De editor levert **bytes**, geen bestand op schijf. `bestandUpload` stuurt
+  base64 in een JSON-body, dus dat past — maar let op `post_max_size`: een
+  bewerkte foto kan groter uitvallen dan het origineel. Overweeg *Max
+  Width/Height* op de mediakiezer.
+- **Alleen voor NIEUWE uploads, niet voor het fotoboek.** Een bestaande foto
+  bewerken betekent een tweede `file_managed`-rij (of het origineel
+  overschrijven, wat `file_usage` van andere nodes raakt). Buiten scope tenzij
+  Bob het expliciet wil.
+
+#### Nog te meten vóór dit gebouwd wordt
+
+1. **`pub get` in een losse exportmap** — resolvet 12.0.0 met de drie bumps, en
+   geeft `dart analyze` 0 errors? Browserloos, ±10 minuten, wijzigt niets aan het
+   project. (Recept: exportmap + `pubspec.lock` + `fvm use 3.35.7 -f`, zie
+   `CLAUDE.md`.)
+2. **APK-groei.** Release-APK is nu ~39 MB (arm64). Onbekend hoeveel een editor
+   met fonts en filters daar bovenop doet — meten met `ff-apk.sh` vóór en ná.
+3. **Vertaling.** De editor heeft eigen UI-teksten; 12.0.0 vraagt een
+   `localizationsDelegates`-regel als de app nog de SDK-`MaterialApp` gebruikt.
+   Nakijken of de Nederlandse labels via zijn eigen i18n-configuratie gaan (dus
+   níét via de globe uit `internationalization.dart`).
+
 ## 🔁 133 · Kopie-knop verkleinen (3 plekken) · Eigenaar: **Claude — bezig** (plan af 2026-09-22, wacht op groen licht voor de browser)
 ## 🔁 133 · Kopie-knop verkleinen (3 plekken) · Eigenaar: **Claude — bezig** (plan af 2026-09-22, wacht op groen licht voor de browser)
 
 
 Besluit Bob 2026-09-22: de `Kopie`-knop onder de kaarten is te groot. **Variant A**
 Besluit Bob 2026-09-22: de `Kopie`-knop onder de kaarten is te groot. **Variant A**