refactor: Gott-Datei document_viewer.dart in 5 Dateien aufgeteilt

Sechster Durchgang derselben part/part-of-Technik wie bei den 5 vorigen
Umbauten - reine Verschiebung, keine Logikänderung. document_viewer.dart
schrumpft von 1773 auf 20 Zeilen (nur noch Bibliothekskopf), 34
Top-Level-Bloecke (31 Klassen/Enums + 3 lose Funktionen) auf 5 thematische
Dateien unter lib/features/chat/document/ verteilt. Verifiziert per
automatisiertem Blockvergleich gegen das Original und flutter analyze
(weiterhin nur 1 bekannter Hinweis).

voice_channel.dart und app_shell.dart bewusst nicht angefasst - haengen an
der noch unentschiedenen Call-Fassade bzw. dem Bootstrap/Login-Pfad.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Bernd Steckmeister
2026-07-03 12:59:03 +02:00
parent a963262de2
commit daf4cf3dad
9 changed files with 1787 additions and 1765 deletions
+72
View File
@@ -13,6 +13,78 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
---
## 2026-07-03 M2: Gott-Datei `document_viewer.dart` aufgeteilt (5 Dateien)
**Erledigt:** Vor dem Weiterarbeiten wie immer Arbeitszyklus durchlaufen
(`PROGRESS.md`/`ROADMAP.md` gelesen, `flutter doctor` geprüft GUI-Lücken
auf dem Pi unverändert). Die Ist-Analyse aus M2 hatte ursprünglich 8 große
Dateien gefunden, aber nur 5 wurden als „Gott-Dateien" tatsächlich
aufgeteilt (`settings_modal.dart`, `message_group.dart`, `rooms_panel.dart`,
`space_admin_dialog.dart`, `chat_view.dart`); `document_viewer.dart` (1773
Zeilen, 31 Klassen/Enums + 3 lose Top-Level-Helfer) war übrig, ist aber
inhaltlich genau derselbe Fall (viele unabhängige Widget-Klassen in einer
Datei) und anders als `voice_channel.dart`/`app_shell.dart` reines
Medien-/PDF-Anzeige-Feature ohne Berührung mit Login/Session/Verschlüsselung
oder der noch unentschiedenen Call-Fassade. Deshalb mit derselben
bewährten Technik aufgeteilt:
- `part`/`part of` wie bei den 5 vorigen Umbauten, per Skript extrahiert
(Klammer-Zählung für Blockgrenzen inkl. der 3 losen Top-Level-Funktionen
`_saveBytes`, `_extractPsdThumbnail`, `_detectType` nicht nur
`class`/`enum`, das wurde diesmal zusätzlich automatisiert gesucht, um
keine lose Funktion zu übersehen).
- 5 neue Dateien unter `lib/features/chat/document/`:
`document_viewer_core.dart` (`DocumentViewer`-Dispatcher, `_DocHeader`,
`_ExtBadge`, `_DocContent`, `_DocType`-Enum + `_detectType`, `_ErrorView`,
`_UnsupportedViewer`, `_FileFallback`), `document_viewer_pdf.dart`
(größter Teil: `_RenderCache`, `PdfInlinePreview`+State für die
Chat-Inline-Vorschau, `_NavArrow`, `_saveBytes`, `_PdfFullViewer`+State,
`_PdfFullscreenViewer`+State, `_FsBtn`, `_ThumbnailStrip`+State),
`document_viewer_text.dart` (SVG/Markdown/Text/Office-Text-Extraktion),
`document_viewer_archive.dart` (ZIP/TAR-Archiv-Browser, PSD-Thumbnail-
Extraktion inkl. `_extractPsdThumbnail`, Sketch/XD-ZIP-Preview),
`document_viewer_misc.dart` (`_ProprietaryViewer`-Infokarte für nicht
darstellbare Formate). `document_viewer.dart` selbst: nur noch
Bibliothekskopf (Imports + 5 `part`-Direktiven, 20 Zeilen).
- Verifikation wie bei den 5 vorigen Umbauten: automatisierte
Klammer-Zählung fand alle 34 Top-Level-Blöcke (31 Klassen/Enums + 3 lose
Funktionen), alle wortwörtlich in den neuen Dateien wiedergefunden,
`class`/`enum`-Anzahl (31) vorher/nachher identisch, `flutter analyze`
unverändert bei 1 bekanntem Hinweis (`chat_provider.dart:42`). Einzige
externe Importstelle (`message_group.dart`) bleibt unverändert gültig, da
`document_viewer.dart` weiterhin der Bibliothekseinstieg ist.
- **Bewusst NICHT angefasst:** `voice_channel.dart` (1123 Zeilen) und
`app_shell.dart` (1073 Zeilen) auch große Dateien mit vielen Klassen,
aber `voice_channel.dart` gehört zur noch unentschiedenen Call-Fassade
(siehe Fragen an Bernd unten) und `app_shell.dart` enthält den
Bootstrap-Trigger (`_triggerBootstrap`) für Cross-Signing/Key-Backup
laut CLAUDE.md heiliger Bereich. Eine reine Datei-Aufteilung wäre zwar
vermutlich genauso risikoarm wie bei den anderen 6, aber ohne GUI-Test auf
dem Pi wollte ich das Risiko nicht zusätzlich zum ohnehin schon
aufgelaufenen UNGETESTET-Stapel erhöhen, bevor nicht wenigstens einmal ein
PC-Durchlauf stattgefunden hat.
**Offen/Nächster Schritt:** UNGETESTET (Pi) siehe ROADMAP-Eintrag oben,
gehört zum selben ausstehenden Windows-Praxistest wie die 5 vorigen
Datei-Aufteilungen (PDF/Text/Archiv/Bild im Chat öffnen, Vollbild-PDF-Viewer
inkl. Thumbnail-Leiste und Speichern-Button prüfen). Danach bleibt exakt
dieselbe Blockade wie im Eintrag direkt darunter: kein M1/M2-Punkt mehr
ohne Bernds Antwort (Call-Pilot, SQLCipher-Priorität) oder PC/GUI-Zugriff
sicher bearbeitbar.
**Stolperfallen:** Anders als bei den 5 vorigen Umbauten gab es diesmal 3
lose Top-Level-Funktionen zusätzlich zu den Klassen/Enums
(`_saveBytes`/`_extractPsdThumbnail`/`_detectType`) eine reine
`grep -E '^(class|enum) '`-Suche hätte sie übersehen und stillschweigend aus
der neuen Datei-Struktur fallen lassen. Deshalb diesmal zusätzlich per
Diff aller durch Klammer-Zählung abgedeckten vs. nicht abgedeckten
Zeilenbereiche geprüft, dass keine „Lücke" zwischen zwei Klassenblöcken
mehr als Kommentar/Leerzeile ist. Für künftige Datei-Aufteilungen (z. B.
`voice_channel.dart`/`app_shell.dart`, falls Bernd grünes Licht gibt): immer
zuerst auf lose Top-Level-Funktionen prüfen, nicht nur auf Klassen/Enums.
---
## 2026-07-03 Session-Check: weiterhin kein sicher bearbeitbarer Punkt auf dem Pi
**Erledigt:** Vor dem Weiterarbeiten Arbeitszyklus komplett durchlaufen: `PROGRESS.md`