pageta-native/Sources/Core/PendingShareSignal.swift
Till JS bd8987b23f fix(share): Toast-Feedback + Reload-Signal für ShareExtension
Zwei Bugs beim Teilen aus Safari/anderen Apps:

1. Leeres Sheet flackerte auf — bare UIViewController/NSViewController
   hatten kein UI und dismissed sofort. Jetzt: kurzer Cream-Card-Toast
   mit ✓-Icon + "Zur Lese-Liste hinzugefügt" (~0.8s), fade-out, dismiss.
   Bei "keine URL gefunden" → orange ⚠-Variante.

2. Geteilter Artikel erschien erst nach App-Termination + Restart —
   flushPendingShares() lief parallel zum initialen loadArticles() der
   LeseListe (GET schneller als POST + Crawl → Liste sah Artikel nicht).
   Plus: kein scenePhase-Hook, also kein Reload bei Foreground.

   Fix: neuer PendingShareSignal (@Observable @MainActor) im
   Environment. flushPendingShares() bumpt den Tick nach jedem Save,
   LeseListeTabView reloaded via .onChange. PagetaNativeApp jetzt mit
   .onChange(of: scenePhase, initial: true) statt .onAppear — fängt
   sowohl Cold-Launch als auch Background→Foreground (= typischer Flow
   nach Share aus Safari).

iOS Sim BUILD SUCCEEDED, macOS BUILD SUCCEEDED (ohne Signing wegen
Provisioning-Block), 38/38 Tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 15:05:56 +02:00

24 lines
909 B
Swift

import Foundation
import Observation
/// Coordinator-Signal zwischen App-Level-Drain und der Lese-Liste.
///
/// Wenn `PagetaNativeApp.flushPendingShares()` eine URL aus dem
/// `PendingShareStore` erfolgreich an den Server gepostet hat, ruft es
/// `bump()`. Views, die auf neue Artikel reagieren sollen
/// (z.B. `LeseListeTabView`), beobachten `flushedTick` via
/// `.onChange` und reloaden ihre Daten.
///
/// **Warum nicht NotificationCenter:** unter Swift-6-Strict-Concurrency
/// sperrig (Sendable über @objc + Notification.userInfo). Observable +
/// Environment ist Swift-nativ, testbar und sichtbar im Dependency-Graphen.
@MainActor @Observable
final class PendingShareSignal {
/// Inkrementiert mit jedem erfolgreichen Flush eines Pending-Shares.
/// Verbraucher beobachten via `.onChange(of: signal.flushedTick)`.
private(set) var flushedTick: Int = 0
func bump() {
flushedTick += 1
}
}