Hunde-Cache leeren bei Logout/401 — kein Durchschimmern auf neuen User
Bug: ActiveDogStore cached dogs + activeDogId (UserDefaults). Beim Login mit einem neuen Account waren die Hunde des vorigen Users weiter zu sehen, weil HeimView nur loadDogs() ruft wenn dogs.isEmpty. Fix: - ActiveDogStore hat jetzt reset() (dogs=[], activeDogId=0, UserDefaults gelöscht). - ActiveDogStore hört auf .userDidLogout und auf .apiUnauthorized, beides löst reset() aus. - AuthSession.logout() postet jetzt .userDidLogout. - Nach Login holt HeimView's .task automatisch die neuen Hunde (dogs.isEmpty → loadDogs).
This commit is contained in:
parent
89d1d47ca4
commit
546386dcbd
2 changed files with 33 additions and 0 deletions
|
|
@ -55,6 +55,8 @@ final class AuthSession {
|
|||
userName = nil
|
||||
isPremium = false
|
||||
profile = nil
|
||||
// Andere Stores benachrichtigen, damit sie ihren User-Cache leeren.
|
||||
NotificationCenter.default.post(name: .userDidLogout, object: nil)
|
||||
}
|
||||
|
||||
/// Fetches the full user profile from /api/auth/me. Called after login and
|
||||
|
|
|
|||
|
|
@ -15,6 +15,22 @@ final class ActiveDogStore {
|
|||
|
||||
init() {
|
||||
self.activeDogId = UserDefaults.standard.integer(forKey: "activeDogId")
|
||||
// Auf User-Wechsel hören (Logout oder 401 = Token abgelaufen),
|
||||
// damit nie die Hunde des vorigen Users durchschimmern.
|
||||
NotificationCenter.default.addObserver(
|
||||
forName: .userDidLogout,
|
||||
object: nil,
|
||||
queue: .main
|
||||
) { [weak self] _ in
|
||||
Task { @MainActor in self?.reset() }
|
||||
}
|
||||
NotificationCenter.default.addObserver(
|
||||
forName: .apiUnauthorized,
|
||||
object: nil,
|
||||
queue: .main
|
||||
) { [weak self] _ in
|
||||
Task { @MainActor in self?.reset() }
|
||||
}
|
||||
}
|
||||
|
||||
func loadDogs() async {
|
||||
|
|
@ -34,4 +50,19 @@ final class ActiveDogStore {
|
|||
activeDogId = dogId
|
||||
UserDefaults.standard.set(dogId, forKey: "activeDogId")
|
||||
}
|
||||
|
||||
/// Komplett zurücksetzen — wird bei Logout / 401 aufgerufen, damit kein
|
||||
/// Cache vom vorigen User durchschlägt. `loadDogs()` wird beim nächsten
|
||||
/// Erscheinen einer Seite (`dogs.isEmpty`) automatisch wieder gefeuert.
|
||||
func reset() {
|
||||
dogs = []
|
||||
activeDogId = 0
|
||||
UserDefaults.standard.removeObject(forKey: "activeDogId")
|
||||
}
|
||||
}
|
||||
|
||||
extension Notification.Name {
|
||||
/// Wird von `AuthSession.logout()` gepostet, damit abhängige Stores
|
||||
/// (z.B. ActiveDogStore) ihren User-bezogenen Cache leeren.
|
||||
static let userDidLogout = Notification.Name("BanYaroGo.userDidLogout")
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue