103 lines
5.2 KiB
Swift
103 lines
5.2 KiB
Swift
//
|
|
// PreferenceStore+Migrate.swift
|
|
// TuskerPreferences
|
|
//
|
|
// Created by Shadowfacts on 4/13/24.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
extension PreferenceStore {
|
|
func migrate(from legacy: LegacyPreferences) {
|
|
let migrations: [any MigrationProtocol] = [
|
|
Migration(from: \.theme.theme, to: \.$theme),
|
|
Migration(from: \.pureBlackDarkMode, to: \.$pureBlackDarkMode),
|
|
Migration(from: \.accentColor, to: \.$accentColor),
|
|
Migration(from: \.avatarStyle, to: \.$avatarStyle),
|
|
Migration(from: \.hideCustomEmojiInUsernames, to: \.$hideCustomEmojiInUsernames),
|
|
Migration(from: \.showIsStatusReplyIcon, to: \.$showIsStatusReplyIcon),
|
|
Migration(from: \.alwaysShowStatusVisibilityIcon, to: \.$alwaysShowStatusVisibilityIcon),
|
|
Migration(from: \.hideActionsInTimeline, to: \.$hideActionsInTimeline),
|
|
Migration(from: \.showLinkPreviews, to: \.$showLinkPreviews),
|
|
Migration(from: \.leadingStatusSwipeActions, to: \.$leadingStatusSwipeActions),
|
|
Migration(from: \.trailingStatusSwipeActions, to: \.$trailingStatusSwipeActions),
|
|
Migration(from: \.widescreenNavigationMode, to: \.$widescreenNavigationMode),
|
|
Migration(from: \.underlineTextLinks, to: \.$underlineTextLinks),
|
|
Migration(from: \.showAttachmentsInTimeline, to: \.$showAttachmentsInTimeline),
|
|
|
|
Migration(from: \.defaultPostVisibility, to: \.$defaultPostVisibility),
|
|
Migration(from: \.defaultReplyVisibility, to: \.$defaultReplyVisibility),
|
|
Migration(from: \.requireAttachmentDescriptions, to: \.$requireAttachmentDescriptions),
|
|
Migration(from: \.contentWarningCopyMode, to: \.$contentWarningCopyMode),
|
|
Migration(from: \.mentionReblogger, to: \.$mentionReblogger),
|
|
Migration(from: \.useTwitterKeyboard, to: \.$useTwitterKeyboard),
|
|
|
|
Migration(from: \.attachmentBlurMode, to: \.$attachmentBlurMode),
|
|
Migration(from: \.blurMediaBehindContentWarning, to: \.$blurMediaBehindContentWarning),
|
|
Migration(from: \.automaticallyPlayGifs, to: \.$automaticallyPlayGifs),
|
|
Migration(from: \.showUncroppedMediaInline, to: \.$showUncroppedMediaInline),
|
|
Migration(from: \.showAttachmentBadges, to: \.$showAttachmentBadges),
|
|
Migration(from: \.attachmentAltBadgeInverted, to: \.$attachmentAltBadgeInverted),
|
|
|
|
Migration(from: \.openLinksInApps, to: \.$openLinksInApps),
|
|
Migration(from: \.useInAppSafari, to: \.$useInAppSafari),
|
|
Migration(from: \.inAppSafariAutomaticReaderMode, to: \.$inAppSafariAutomaticReaderMode),
|
|
Migration(from: \.expandAllContentWarnings, to: \.$expandAllContentWarnings),
|
|
Migration(from: \.collapseLongPosts, to: \.$collapseLongPosts),
|
|
Migration(from: \.oppositeCollapseKeywords, to: \.$oppositeCollapseKeywords),
|
|
Migration(from: \.confirmBeforeReblog, to: \.$confirmBeforeReblog),
|
|
Migration(from: \.timelineStateRestoration, to: \.$timelineStateRestoration),
|
|
Migration(from: \.timelineSyncMode, to: \.$timelineSyncMode),
|
|
Migration(from: \.hideReblogsInTimelines, to: \.$hideReblogsInTimelines),
|
|
Migration(from: \.hideRepliesInTimelines, to: \.$hideRepliesInTimelines),
|
|
|
|
Migration(from: \.showFavoriteAndReblogCounts, to: \.$showFavoriteAndReblogCounts),
|
|
Migration(from: \.defaultNotificationsMode, to: \.$defaultNotificationsMode),
|
|
Migration(from: \.grayscaleImages, to: \.$grayscaleImages),
|
|
Migration(from: \.disableInfiniteScrolling, to: \.$disableInfiniteScrolling),
|
|
Migration(from: \.hideTrends, to: \.$hideTrends),
|
|
|
|
Migration(from: \.statusContentType, to: \.$statusContentType),
|
|
Migration(from: \.reportErrorsAutomatically, to: \.$reportErrorsAutomatically),
|
|
Migration(from: \.enabledFeatureFlags, to: \.$enabledFeatureFlags),
|
|
|
|
Migration(from: \.hasShownLocalTimelineDescription, to: \.$hasShownLocalTimelineDescription),
|
|
Migration(from: \.hasShownFederatedTimelineDescription, to: \.$hasShownFederatedTimelineDescription),
|
|
]
|
|
|
|
for migration in migrations {
|
|
migration.migrate(from: legacy, to: self)
|
|
}
|
|
}
|
|
}
|
|
|
|
private protocol MigrationProtocol {
|
|
func migrate(from legacy: LegacyPreferences, to store: PreferenceStore)
|
|
}
|
|
|
|
private struct Migration<Key: PreferenceKey>: MigrationProtocol where Key.Value: Equatable {
|
|
let from: KeyPath<LegacyPreferences, Key.Value>
|
|
let to: KeyPath<PreferenceStore, PreferencePublisher<Key>>
|
|
|
|
func migrate(from legacy: LegacyPreferences, to store: PreferenceStore) {
|
|
let value = legacy[keyPath: from]
|
|
if value != Key.defaultValue {
|
|
Preference.set(enclosingInstance: store, storage: to.appending(path: \.preference), newValue: value)
|
|
}
|
|
}
|
|
}
|
|
|
|
private extension UIUserInterfaceStyle {
|
|
var theme: Theme {
|
|
switch self {
|
|
case .light:
|
|
.light
|
|
case .dark:
|
|
.dark
|
|
default:
|
|
.unspecified
|
|
}
|
|
}
|
|
}
|