// // 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: MigrationProtocol where Key.Value: Equatable { let from: KeyPath let to: KeyPath> 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 } } }