mirror of
https://github.com/yattee/yattee.git
synced 2025-08-06 10:44:06 +00:00
Subscribed channels cache
This commit is contained in:
17
Model/Cache/BookmarksCacheModel.swift
Normal file
17
Model/Cache/BookmarksCacheModel.swift
Normal file
@@ -0,0 +1,17 @@
|
||||
import Cache
|
||||
import Foundation
|
||||
import Logging
|
||||
import SwiftyJSON
|
||||
|
||||
struct BookmarksCacheModel {
|
||||
static var shared = BookmarksCacheModel()
|
||||
let logger = Logger(label: "stream.yattee.cache")
|
||||
|
||||
static let bookmarksGroup = "group.stream.yattee.app.bookmarks"
|
||||
let defaults = UserDefaults(suiteName: Self.bookmarksGroup)
|
||||
|
||||
func clear() {
|
||||
guard let defaults else { return }
|
||||
defaults.dictionaryRepresentation().keys.forEach(defaults.removeObject(forKey:))
|
||||
}
|
||||
}
|
@@ -10,16 +10,6 @@ struct CacheModel {
|
||||
static let jsonFromDataTransformer: (Data) -> JSON = { try! JSON(data: $0) }
|
||||
static let jsonTransformer = Transformer(toData: jsonToDataTransformer, fromData: jsonFromDataTransformer)
|
||||
|
||||
let logger = Logger(label: "stream.yattee.cache")
|
||||
|
||||
static let bookmarksGroup = "group.stream.yattee.app.bookmarks"
|
||||
let bookmarksDefaults = UserDefaults(suiteName: Self.bookmarksGroup)
|
||||
|
||||
func clearBookmarks() {
|
||||
guard let bookmarksDefaults else { return }
|
||||
bookmarksDefaults.dictionaryRepresentation().keys.forEach(bookmarksDefaults.removeObject(forKey:))
|
||||
}
|
||||
|
||||
func clear() {
|
||||
FeedCacheModel.shared.clear()
|
||||
VideosCacheModel.shared.clear()
|
||||
|
@@ -103,7 +103,7 @@ extension PlayerModel {
|
||||
|
||||
func removeHistory() {
|
||||
removeAllWatches()
|
||||
CacheModel.shared.clearBookmarks()
|
||||
BookmarksCacheModel.shared.clear()
|
||||
}
|
||||
|
||||
func removeWatch(_ watch: Watch) {
|
||||
|
@@ -1,9 +1,22 @@
|
||||
import Cache
|
||||
import Foundation
|
||||
import Logging
|
||||
import Siesta
|
||||
import SwiftUI
|
||||
import SwiftyJSON
|
||||
|
||||
final class SubscriptionsModel: ObservableObject {
|
||||
static var shared = SubscriptionsModel()
|
||||
let logger = Logger(label: "stream.yattee.cache.channels")
|
||||
|
||||
static let diskConfig = DiskConfig(name: "channels")
|
||||
static let memoryConfig = MemoryConfig()
|
||||
|
||||
let storage = try! Storage<String, JSON>(
|
||||
diskConfig: SubscriptionsModel.diskConfig,
|
||||
memoryConfig: SubscriptionsModel.memoryConfig,
|
||||
transformer: CacheModel.jsonTransformer
|
||||
)
|
||||
|
||||
@Published var channels = [Channel]()
|
||||
var accounts: AccountsModel { .shared }
|
||||
@@ -33,17 +46,20 @@ final class SubscriptionsModel: ObservableObject {
|
||||
}
|
||||
|
||||
func load(force: Bool = false, onSuccess: @escaping () -> Void = {}) {
|
||||
guard accounts.app.supportsSubscriptions, accounts.signedIn else {
|
||||
guard accounts.app.supportsSubscriptions, accounts.signedIn, let account = accounts.current else {
|
||||
channels = []
|
||||
return
|
||||
}
|
||||
|
||||
loadCachedChannels(account)
|
||||
|
||||
let request = force ? resource?.load() : resource?.loadIfNeeded()
|
||||
|
||||
request?
|
||||
.onSuccess { resource in
|
||||
if let channels: [Channel] = resource.typedContent() {
|
||||
self.channels = channels
|
||||
self.storeChannels(account: account, channels: channels)
|
||||
onSuccess()
|
||||
}
|
||||
}
|
||||
@@ -52,9 +68,51 @@ final class SubscriptionsModel: ObservableObject {
|
||||
}
|
||||
}
|
||||
|
||||
func loadCachedChannels(_ account: Account) {
|
||||
let cache = getChannels(account: account)
|
||||
if !cache.isEmpty {
|
||||
channels = cache
|
||||
}
|
||||
}
|
||||
|
||||
func storeChannels(account: Account, channels: [Channel]) {
|
||||
let date = dateFormatter.string(from: Date())
|
||||
logger.info("caching channels \(channelsDateCacheKey(account)) -- \(date)")
|
||||
|
||||
let dateObject: JSON = ["date": date]
|
||||
let channelsObject: JSON = ["channels": channels.map(\.json).map(\.object)]
|
||||
|
||||
try? storage.setObject(dateObject, forKey: channelsDateCacheKey(account))
|
||||
try? storage.setObject(channelsObject, forKey: channelsCacheKey(account))
|
||||
}
|
||||
|
||||
func getChannels(account: Account) -> [Channel] {
|
||||
logger.info("getting channels \(channelsDateCacheKey(account))")
|
||||
|
||||
if let json = try? storage.object(forKey: channelsCacheKey(account)),
|
||||
let channels = json.dictionaryValue["channels"]
|
||||
{
|
||||
return channels.arrayValue.map { Channel.from($0) }
|
||||
}
|
||||
|
||||
return []
|
||||
}
|
||||
|
||||
private func scheduleLoad(onSuccess: @escaping () -> Void) {
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
|
||||
self.load(force: true, onSuccess: onSuccess)
|
||||
}
|
||||
}
|
||||
|
||||
private var dateFormatter: ISO8601DateFormatter {
|
||||
.init()
|
||||
}
|
||||
|
||||
private func channelsCacheKey(_ account: Account) -> String {
|
||||
"channels-\(account.id)"
|
||||
}
|
||||
|
||||
private func channelsDateCacheKey(_ account: Account) -> String {
|
||||
"channels-\(account.id)-date"
|
||||
}
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ struct URLBookmarkModel {
|
||||
var logger = Logger(label: "stream.yattee.url-bookmark")
|
||||
|
||||
var allBookmarksKeys: [String] {
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else { return [] }
|
||||
guard let defaults = BookmarksCacheModel.shared.defaults else { return [] }
|
||||
|
||||
return defaults.dictionaryRepresentation().keys.filter { $0.starts(with: Self.bookmarkPrefix) }
|
||||
}
|
||||
@@ -29,7 +29,7 @@ struct URLBookmarkModel {
|
||||
return
|
||||
}
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
guard let defaults = BookmarksCacheModel.shared.defaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return
|
||||
}
|
||||
@@ -49,7 +49,7 @@ struct URLBookmarkModel {
|
||||
return
|
||||
}
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
guard let defaults = BookmarksCacheModel.shared.defaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return
|
||||
}
|
||||
@@ -70,7 +70,7 @@ struct URLBookmarkModel {
|
||||
|
||||
logger.info("loading bookmark for \(bookmarkKey(urlForBookmark))")
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
guard let defaults = BookmarksCacheModel.shared.defaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return nil
|
||||
}
|
||||
@@ -103,7 +103,7 @@ struct URLBookmarkModel {
|
||||
func removeBookmark(_ url: URL) {
|
||||
logger.info("removing bookmark for \(bookmarkKey(url))")
|
||||
|
||||
guard let defaults = CacheModel.shared.bookmarksDefaults else {
|
||||
guard let defaults = BookmarksCacheModel.shared.defaults else {
|
||||
logger.error("could not open bookmarks defaults")
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user