mirror of
https://github.com/kiwix/kiwix-apple.git
synced 2025-09-23 03:32:13 -04:00
Merge pull request #1111 from kiwix/1104-update-defaults-dependency
Update defaults dependency to 8.2
This commit is contained in:
commit
0ef04dc554
@ -37,7 +37,7 @@ final class CompactViewController: UIHostingController<AnyView>, UISearchControl
|
|||||||
|
|
||||||
init(navigation: NavigationViewModel) {
|
init(navigation: NavigationViewModel) {
|
||||||
self.navigation = navigation
|
self.navigation = navigation
|
||||||
searchViewModel = SearchViewModel()
|
searchViewModel = SearchViewModel.shared
|
||||||
let searchResult = SearchResults().environmentObject(searchViewModel)
|
let searchResult = SearchResults().environmentObject(searchViewModel)
|
||||||
searchController = UISearchController(searchResultsController: UIHostingController(rootView: searchResult))
|
searchController = UISearchController(searchResultsController: UIHostingController(rootView: searchResult))
|
||||||
super.init(rootView: AnyView(CompactView()))
|
super.init(rootView: AnyView(CompactView()))
|
||||||
|
@ -21,7 +21,7 @@ public protocol Defaulting: NSObjectProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final class UDefaults: NSObject, Defaulting {
|
final class UDefaults: NSObject, Defaulting {
|
||||||
subscript<Value>(key: Defaults.Key<Value>) -> Value where Value: DefaultsSerializable {
|
subscript<Value>(key: Defaults.Key<Value>) -> Value {
|
||||||
get {
|
get {
|
||||||
Defaults[key]
|
Defaults[key]
|
||||||
}
|
}
|
||||||
|
@ -52,38 +52,3 @@ extension Defaults.Keys {
|
|||||||
static let windowURLs = Key<[URL]>("windowURLs", default: [])
|
static let windowURLs = Key<[URL]>("windowURLs", default: [])
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: Codable {
|
|
||||||
public static var bridge: Defaults.TopLevelCodableBridge<Self> { Defaults.TopLevelCodableBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: Codable & NSSecureCoding {
|
|
||||||
public static var bridge: Defaults.CodableNSSecureCodingBridge<Self> { Defaults.CodableNSSecureCodingBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: Codable & NSSecureCoding & Defaults.PreferNSSecureCoding {
|
|
||||||
public static var bridge: Defaults.NSSecureCodingBridge<Self> { Defaults.NSSecureCodingBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: Codable & RawRepresentable {
|
|
||||||
public static var bridge: Defaults.RawRepresentableCodableBridge<Self> { Defaults.RawRepresentableCodableBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: Codable & RawRepresentable & Defaults.PreferRawRepresentable {
|
|
||||||
public static var bridge: Defaults.RawRepresentableBridge<Self> { Defaults.RawRepresentableBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.Serializable where Self: RawRepresentable {
|
|
||||||
public static var bridge: Defaults.RawRepresentableBridge<Self> { Defaults.RawRepresentableBridge() }
|
|
||||||
}
|
|
||||||
extension Defaults.Serializable where Self: NSSecureCoding {
|
|
||||||
public static var bridge: Defaults.NSSecureCodingBridge<Self> { Defaults.NSSecureCodingBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.CollectionSerializable where Element: Defaults.Serializable {
|
|
||||||
public static var bridge: Defaults.CollectionBridge<Self> { Defaults.CollectionBridge() }
|
|
||||||
}
|
|
||||||
|
|
||||||
extension Defaults.SetAlgebraSerializable where Element: Defaults.Serializable & Hashable {
|
|
||||||
public static var bridge: Defaults.SetAlgebraBridge<Self> { Defaults.SetAlgebraBridge() }
|
|
||||||
}
|
|
||||||
|
@ -19,7 +19,7 @@ import Defaults
|
|||||||
|
|
||||||
final class TestDefaults: NSObject, Defaulting {
|
final class TestDefaults: NSObject, Defaulting {
|
||||||
|
|
||||||
var dict: [Defaults.AnyKey: any DefaultsSerializable] = [:]
|
var dict: [Defaults._AnyKey: AnyObject] = [:]
|
||||||
|
|
||||||
func setup() {
|
func setup() {
|
||||||
self[.categoriesToLanguages] = [:]
|
self[.categoriesToLanguages] = [:]
|
||||||
@ -29,13 +29,13 @@ final class TestDefaults: NSObject, Defaulting {
|
|||||||
self[.libraryLanguageCodes] = Set<String>()
|
self[.libraryLanguageCodes] = Set<String>()
|
||||||
}
|
}
|
||||||
|
|
||||||
subscript<Value>(key: Defaults.Key<Value>) -> Value where Value: DefaultsSerializable {
|
subscript<Value>(key: Defaults.Key<Value>) -> Value {
|
||||||
get {
|
get {
|
||||||
// swiftlint:disable:next force_cast
|
// swiftlint:disable:next force_cast
|
||||||
dict[key] as! Value
|
dict[key] as! Value
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
dict[key] = newValue
|
dict[key] = newValue as AnyObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -259,17 +259,33 @@ final class BrowserViewModel: NSObject, ObservableObject,
|
|||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
func updateLastOpened() {
|
func updateLastOpened() {
|
||||||
guard let tab = try? Database.shared.viewContext.existingObject(with: tabID) as? Tab else { return }
|
let currentTabID = tabID
|
||||||
tab.lastOpened = Date()
|
Task {
|
||||||
|
Database.shared.performBackgroundTask { context in
|
||||||
|
guard let tab = try? context.existingObject(with: currentTabID) as? Tab else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tab.lastOpened = Date()
|
||||||
|
try? context.save()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
func persistState() {
|
func persistState() {
|
||||||
guard let tab = try? Database.shared.viewContext.existingObject(with: tabID) as? Tab else {
|
let webData = webView.interactionState as? Data
|
||||||
return
|
let currentTabID = tabID
|
||||||
|
Task {
|
||||||
|
Database.shared.performBackgroundTask { context in
|
||||||
|
guard let tab = try? context.existingObject(with: currentTabID) as? Tab else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tab.interactionState = webData
|
||||||
|
if context.hasChanges {
|
||||||
|
try? context.save()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tab.interactionState = webView.interactionState as? Data
|
|
||||||
try? Database.shared.viewContext.save()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Content Loading
|
// MARK: - Content Loading
|
||||||
|
@ -97,6 +97,7 @@ final class NavigationViewModel: ObservableObject {
|
|||||||
/// Delete a single tab, and select another tab
|
/// Delete a single tab, and select another tab
|
||||||
/// - Parameter tabID: ID of the tab to delete
|
/// - Parameter tabID: ID of the tab to delete
|
||||||
func deleteTab(tabID: NSManagedObjectID) {
|
func deleteTab(tabID: NSManagedObjectID) {
|
||||||
|
let currentItemValue = currentItem
|
||||||
Database.shared.performBackgroundTask { context in
|
Database.shared.performBackgroundTask { context in
|
||||||
let sortByCreation = [NSSortDescriptor(key: "created", ascending: false)]
|
let sortByCreation = [NSSortDescriptor(key: "created", ascending: false)]
|
||||||
guard let tabs: [Tab] = try? context.fetch(Tab.fetchRequest(predicate: nil,
|
guard let tabs: [Tab] = try? context.fetch(Tab.fetchRequest(predicate: nil,
|
||||||
@ -105,7 +106,7 @@ final class NavigationViewModel: ObservableObject {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let newlySelectedTab: Tab?
|
let newlySelectedTab: Tab?
|
||||||
if case let .tab(selectedTabID) = self.currentItem, selectedTabID == tabID {
|
if case let .tab(selectedTabID) = currentItemValue, selectedTabID == tabID {
|
||||||
// select a closeBy tab if the currently selected tab is to be deleted
|
// select a closeBy tab if the currently selected tab is to be deleted
|
||||||
newlySelectedTab = tabs.closeBy(toWhere: { $0.objectID == tabID }) ?? Self.makeTab(context: context)
|
newlySelectedTab = tabs.closeBy(toWhere: { $0.objectID == tabID }) ?? Self.makeTab(context: context)
|
||||||
} else if tabs.count == 1 {
|
} else if tabs.count == 1 {
|
||||||
|
@ -23,13 +23,15 @@ final class SearchViewModel: NSObject, ObservableObject, NSFetchedResultsControl
|
|||||||
@Published private(set) var zimFiles: [UUID: ZimFile] // ID of zim files that are included in search
|
@Published private(set) var zimFiles: [UUID: ZimFile] // ID of zim files that are included in search
|
||||||
@Published private(set) var inProgress = false
|
@Published private(set) var inProgress = false
|
||||||
@Published private(set) var results = [SearchResult]()
|
@Published private(set) var results = [SearchResult]()
|
||||||
|
|
||||||
|
static let shared = SearchViewModel()
|
||||||
|
|
||||||
private let fetchedResultsController: NSFetchedResultsController<ZimFile>
|
private let fetchedResultsController: NSFetchedResultsController<ZimFile>
|
||||||
private var searchSubscriber: AnyCancellable?
|
private var searchSubscriber: AnyCancellable?
|
||||||
@ZimActor
|
@ZimActor
|
||||||
private let queue = OperationQueue()
|
private let queue = OperationQueue()
|
||||||
|
|
||||||
override init() {
|
override private init() {
|
||||||
// initialize fetched results controller
|
// initialize fetched results controller
|
||||||
let predicate = NSPredicate(format: "includedInSearch == true AND fileURLBookmark != nil")
|
let predicate = NSPredicate(format: "includedInSearch == true AND fileURLBookmark != nil")
|
||||||
fetchedResultsController = NSFetchedResultsController(
|
fetchedResultsController = NSFetchedResultsController(
|
||||||
@ -39,7 +41,7 @@ final class SearchViewModel: NSObject, ObservableObject, NSFetchedResultsControl
|
|||||||
cacheName: nil
|
cacheName: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
// initilze zim file IDs
|
// initialize zim file IDs
|
||||||
try? fetchedResultsController.performFetch()
|
try? fetchedResultsController.performFetch()
|
||||||
zimFiles = fetchedResultsController.fetchedObjects?.reduce(into: [:]) { result, zimFile in
|
zimFiles = fetchedResultsController.fetchedObjects?.reduce(into: [:]) { result, zimFile in
|
||||||
result?[zimFile.fileID] = zimFile
|
result?[zimFile.fileID] = zimFile
|
||||||
|
@ -29,7 +29,7 @@ struct Bookmarks: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
LazyVGrid(columns: ([gridItem]), spacing: 12) {
|
LazyVGrid(columns: ([gridItem]), spacing: 12) {
|
||||||
ForEach(bookmarks) { bookmark in
|
ForEach(bookmarks, id: \.self) { bookmark in
|
||||||
Button {
|
Button {
|
||||||
NotificationCenter.openURL(bookmark.articleURL)
|
NotificationCenter.openURL(bookmark.articleURL)
|
||||||
if horizontalSizeClass == .compact {
|
if horizontalSizeClass == .compact {
|
||||||
@ -54,8 +54,8 @@ struct Bookmarks: View {
|
|||||||
Message(text: LocalString.bookmark_overlay_empty_title)
|
Message(text: LocalString.bookmark_overlay_empty_title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if os(iOS)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
#if os(iOS)
|
|
||||||
ToolbarItem(placement: .navigationBarLeading) {
|
ToolbarItem(placement: .navigationBarLeading) {
|
||||||
if #unavailable(iOS 16), horizontalSizeClass == .regular {
|
if #unavailable(iOS 16), horizontalSizeClass == .regular {
|
||||||
Button {
|
Button {
|
||||||
@ -65,8 +65,8 @@ struct Bookmarks: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
private var gridItem: GridItem {
|
private var gridItem: GridItem {
|
||||||
|
@ -21,7 +21,7 @@ struct BrowserTab: View {
|
|||||||
@Environment(\.scenePhase) private var scenePhase
|
@Environment(\.scenePhase) private var scenePhase
|
||||||
@EnvironmentObject private var browser: BrowserViewModel
|
@EnvironmentObject private var browser: BrowserViewModel
|
||||||
@EnvironmentObject private var library: LibraryViewModel
|
@EnvironmentObject private var library: LibraryViewModel
|
||||||
@StateObject private var search = SearchViewModel()
|
@StateObject private var search = SearchViewModel.shared
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let model = if FeatureFlags.hasLibrary {
|
let model = if FeatureFlags.hasLibrary {
|
||||||
|
@ -46,7 +46,7 @@ settings:
|
|||||||
packages:
|
packages:
|
||||||
Defaults:
|
Defaults:
|
||||||
url: https://github.com/sindresorhus/Defaults
|
url: https://github.com/sindresorhus/Defaults
|
||||||
majorVersion: 6.0.0
|
majorVersion: 8.2.0
|
||||||
StripeApplePay:
|
StripeApplePay:
|
||||||
url: https://github.com/CodeLikeW/stripe-apple-pay
|
url: https://github.com/CodeLikeW/stripe-apple-pay
|
||||||
majorVersion: 24.0.0
|
majorVersion: 24.0.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user