mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-28 20:29:53 +00:00
* ios: replace revealed bindings with constant value * ios: optimise ComposeView rendering * rename --------- Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
62 lines
1.6 KiB
Swift
62 lines
1.6 KiB
Swift
//
|
|
// UserDefault.swift
|
|
// SimpleX (iOS)
|
|
//
|
|
// Created by user on 14/10/2024.
|
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
|
//
|
|
|
|
import SwiftUI
|
|
import Combine
|
|
|
|
@propertyWrapper
|
|
public struct UserDefault<Value: Equatable>: DynamicProperty {
|
|
@StateObject private var observer = UserDefaultObserver()
|
|
let initialValue: Value
|
|
let key: String
|
|
let store: UserDefaults
|
|
|
|
public init(
|
|
wrappedValue: Value,
|
|
_ key: String,
|
|
store: UserDefaults = .standard
|
|
) {
|
|
self.initialValue = wrappedValue
|
|
self.key = key
|
|
self.store = store
|
|
}
|
|
|
|
public var wrappedValue: Value {
|
|
get {
|
|
// Observer can only be accessed after the property wrapper is installed in view (runtime exception)
|
|
observer.subscribe(to: key)
|
|
return store.object(forKey: key) as? Value ?? initialValue
|
|
}
|
|
nonmutating set {
|
|
store.set(newValue, forKey: key)
|
|
}
|
|
}
|
|
}
|
|
|
|
private class UserDefaultObserver: ObservableObject {
|
|
private var subscribed = false
|
|
|
|
func subscribe(to key: String) {
|
|
if !subscribed {
|
|
NotificationCenter.default.addObserver(
|
|
self,
|
|
selector: #selector(userDefaultsDidChange),
|
|
name: UserDefaults.didChangeNotification,
|
|
object: nil
|
|
)
|
|
subscribed = true
|
|
}
|
|
}
|
|
|
|
@objc
|
|
private func userDefaultsDidChange(_ notification: Notification) {
|
|
Task { @MainActor in objectWillChange.send() }
|
|
}
|
|
|
|
deinit { NotificationCenter.default.removeObserver(self) }
|
|
}
|