From 64f3d2fe3a291c20e82be8dc67f24228959a91dd Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 30 Sep 2022 19:28:09 +0800 Subject: [PATCH] chore: [WIP] move core logic into package --- .arkana.yml | 16 + AppShared/AppShared.h | 18 - AppShared/Info.plist | 22 - Gemfile | 3 +- Gemfile.lock | 20 +- Mastodon.xcodeproj/project.pbxproj | 1207 +---------------- .../xcschemes/xcschememanagement.plist | 36 +- .../xcshareddata/swiftpm/Package.resolved | 48 +- Mastodon/Coordinator/SceneCoordinator.swift | 3 +- .../Compose/AutoCompleteSection.swift | 1 + .../CoreDataStack/MastodonUser.swift | 28 - .../Helper/MastodonAuthenticationBox.swift | 19 - .../Persistence/Extension/MastodonEmoji.swift | 24 - .../Preference/HomeTimelinePreference.swift | 20 - .../Preference/NotificationPreference.swift | 21 - Mastodon/Preference/ThemePreference.swift | 7 - .../Scene/Account/AccountListViewModel.swift | 2 + .../Scene/Account/AccountViewController.swift | 1 + .../Cell/AddAccountTableViewCell.swift | 2 + .../AutoCompleteViewModel+State.swift | 1 + .../AutoComplete/AutoCompleteViewModel.swift | 11 +- ...seStatusAttachmentCollectionViewCell.swift | 53 +- .../Scene/Compose/ComposeViewController.swift | 742 +++++----- ...ComposeStatusAttachmentTableViewCell.swift | 154 ++- .../View/AttachmentContainerView.swift | 256 ++-- .../DiscoveryCommunityViewModel.swift | 1 + .../NotificationTimelineViewModel.swift | 27 +- .../MastodonAuthenticationController.swift | 5 +- .../Scene/Root/RootSplitViewController.swift | 1 + Mastodon/Service/StatusPublishService.swift | 79 -- Mastodon/State/DocumentStore.swift | 15 - Mastodon/State/ViewStateStore.swift | 14 - Mastodon/Supporting Files/AppDelegate.swift | 4 +- .../Handler/SendPostIntentHandler.swift | 9 +- MastodonIntent/Model/Account+Fetch.swift | 1 + MastodonIntent/Service/APIService.swift | 33 - MastodonSDK/Package.resolved | 241 ++++ MastodonSDK/Package.swift | 66 +- .../Sources/CoreDataStack/CoreDataStack.swift | 9 + .../Preference/Preference+App.swift | 2 +- .../Preference/Preference+Notification.swift | 13 + .../Preference/Preference+StoreReview.swift | 4 +- .../Preference/Preference+Wizard.swift | 2 +- .../Sources/MastodonCore}/AppContext.swift | 46 +- .../Sources/MastodonCore}/AppSecret.swift | 8 +- .../MastodonAuthenticationBox.swift | 32 + .../Sources/MastodonCore/DocumentStore.swift | 15 + .../Extension/CoreDataStack/Instance.swift | 0 .../CoreDataStack/MastodonEmoji.swift | 12 + .../CoreDataStack}/MastodonField.swift | 0 .../CoreDataStack}/MastodonMention.swift | 0 .../CoreDataStack/MastodonStatus.swift | 0 .../MastodonUser+Property.swift | 0 .../CoreDataStack/MastodonUser.swift | 24 +- .../Notification+Property.swift | 0 .../CoreDataStack}/Poll+Property.swift | 0 .../CoreDataStack}/PollOption+Property.swift | 0 .../Extension/CoreDataStack/Setting.swift | 0 .../CoreDataStack}/Status+Property.swift | 0 .../Extension/CoreDataStack/Status.swift | 0 .../CoreDataStack/Subscription.swift | 0 .../CoreDataStack/SubscriptionAlerts.swift | 0 .../CoreDataStack}/Tag+Property.swift | 0 .../MastodonSDK/Mastodon+Entity+Account.swift | 0 .../MastodonSDK/Mastodon+Entity+Link.swift | 0 .../MastodonSDK/Mastodon+Entity+Tag.swift | 0 .../FeedFetchedResultsController.swift | 0 ...SearchHistoryFetchedResultController.swift | 0 .../SettingFetchedResultController.swift | 8 +- .../StatusFetchedResultsController.swift | 1 - .../UserFetchedResultsController.swift | 1 - .../Model/UserIdentifier.swift | 0 .../Persistence+MastodonUser.swift | 8 +- .../Persistence+Notification.swift | 4 +- .../Persistence/Persistence+Poll.swift | 3 +- .../Persistence/Persistence+PollOption.swift | 2 +- .../Persistence+SearchHistory.swift | 3 +- .../Persistence/Persistence+Status.swift | 4 +- .../Persistence/Persistence+Tag.swift | 2 +- .../Persistence/Persistence.swift | 0 .../Protocol/MastodonEmojiContainer.swift | 0 .../Protocol/MastodonFieldContainer.swift | 0 .../Protocol/MastodonMentionContainer.swift | 0 .../Service/API}/APIService+APIError.swift | 8 +- .../Service/API}/APIService+Account.swift | 7 +- .../Service/API}/APIService+App.swift | 2 +- .../API}/APIService+Authentication.swift | 0 .../Service/API}/APIService+Block.swift | 0 .../Service/API}/APIService+Bookmark.swift | 0 .../Service/API}/APIService+CustomEmoji.swift | 1 - .../Service/API}/APIService+DomainBlock.swift | 1 - .../Service/API}/APIService+Favorite.swift | 0 .../Service/API}/APIService+Filter.swift | 0 .../Service/API}/APIService+Follow.swift | 0 .../API}/APIService+FollowRequest.swift | 0 .../Service/API}/APIService+Follower.swift | 0 .../Service/API}/APIService+Following.swift | 0 .../API}/APIService+HashtagTimeline.swift | 1 - .../API}/APIService+HomeTimeline.swift | 1 - .../Service/API}/APIService+Instance.swift | 1 - .../Service/API}/APIService+Media.swift | 6 +- .../Service/API}/APIService+Mute.swift | 0 .../API}/APIService+Notification.swift | 28 +- .../Service/API}/APIService+Onboarding.swift | 0 .../Service/API}/APIService+Poll.swift | 1 - .../API}/APIService+PublicTimeline.swift | 0 .../Service/API}/APIService+Reblog.swift | 0 .../Service/API}/APIService+Recommend.swift | 0 .../API}/APIService+Relationship.swift | 0 .../Service/API}/APIService+Report.swift | 0 .../Service/API}/APIService+Search.swift | 3 +- .../API}/APIService+Status+Publish.swift | 2 +- .../Service/API}/APIService+Status.swift | 1 - .../API}/APIService+Subscriptions.swift | 0 .../Service/API}/APIService+Thread.swift | 0 .../Service/API}/APIService+Trend.swift | 0 .../API}/APIService+UserTimeline.swift | 0 .../Service/API}/APIService+WebFinger.swift | 1 - .../Service/API}/APIService.swift | 15 +- .../APIService+CoreData+Instance.swift | 2 +- ...vice+CoreData+MastodonAuthentication.swift | 0 .../APIService+CoreData+Setting.swift | 0 .../APIService+CoreData+Subscriptions.swift | 0 .../Service/AuthenticationService.swift | 16 +- .../Service/BlockDomainService.swift | 2 +- .../Service/BlurhashImageCacheService.swift | 0 ...rvice+CustomEmojiViewModel+LoadState.swift | 0 .../EmojiService+CustomEmojiViewModel.swift | 11 +- .../Service/Emoji}/EmojiService.swift | 2 +- .../MastodonCore/Service/Emoji}/Trie.swift | 20 +- .../Service/InstanceService.swift | 4 +- ...astodonAttachmentService+UploadState.swift | 0 .../MastodonAttachmentService.swift | 1 - .../MastodonPushNotification.swift | 19 +- .../Notification}/NotificationService.swift | 23 +- .../Service/PhotoLibraryService.swift | 11 +- .../PlaceholderImageCacheService.swift | 2 +- .../MastodonCore}/Service/PlaybackState.swift | 0 .../Service/SettingService.swift | 12 +- .../Service/StatusFilterService.swift | 2 +- .../Service/StatusPublishService.swift | 79 ++ .../Service/Theme}/MastodonTheme.swift | 0 .../Service/Theme}/SystemTheme.swift | 0 .../Service/Theme}/Theme.swift | 0 .../Service/Theme}/ThemeService.swift | 39 +- .../Vendor/BlurHashDecode.swift | 0 .../Vendor/BlurHashEncode.swift | 0 .../Vendor/ItemProviderLoader.swift | 2 +- .../Sources/MastodonExtension}/Array.swift | 8 +- .../NSManagedObjectContext.swift | 2 +- .../Sources/MastodonUI/Extension/UIView.swift | 1 + .../ComposeContent/ComposeContentView.swift | 18 + .../ComposeContentViewController.swift | 24 + .../ComposeContentViewModel.swift | 20 + .../Service/ThemeService/ThemeService.swift | 36 - .../View/Container/AttachmentView.swift | 29 + ...FollowersDashboardView+Configuration.swift | 1 + .../Content/MediaView+Configuration.swift | 1 + .../Content/NotificationView+ViewModel.swift | 1 + .../Content/PollOptionView+ViewModel.swift | 1 + .../Content/ProfileCardView+ViewModel.swift | 1 + .../View/Content/StatusView+ViewModel.swift | 1 + .../API/MastodonSDK+API+TimelineTests.swift | 31 +- NotificationService/NotificationService.swift | 2 +- Podfile | 8 - Podfile.lock | 9 +- .../Scene/ShareViewController.swift | 1 + .../Scene/ShareViewModel.swift | 20 +- .../Scene/View/ComposeToolbarView.swift | 1 + ...tatusAttachmentViewModel+UploadState.swift | 3 +- .../View/StatusAttachmentViewModel.swift | 8 +- .../Scene/View/StatusAuthorView.swift | 1 - ShareActionExtension/Service/APIService.swift | 32 - 173 files changed, 1529 insertions(+), 2471 deletions(-) create mode 100644 .arkana.yml delete mode 100644 AppShared/AppShared.h delete mode 100644 AppShared/Info.plist delete mode 100644 Mastodon/Extension/CoreDataStack/MastodonUser.swift delete mode 100644 Mastodon/Helper/MastodonAuthenticationBox.swift delete mode 100644 Mastodon/Persistence/Extension/MastodonEmoji.swift delete mode 100644 Mastodon/Preference/HomeTimelinePreference.swift delete mode 100644 Mastodon/Preference/NotificationPreference.swift delete mode 100644 Mastodon/Preference/ThemePreference.swift delete mode 100644 Mastodon/Service/StatusPublishService.swift delete mode 100644 Mastodon/State/DocumentStore.swift delete mode 100644 Mastodon/State/ViewStateStore.swift delete mode 100644 MastodonIntent/Service/APIService.swift create mode 100644 MastodonSDK/Package.resolved rename Mastodon/Preference/AppPreference.swift => MastodonSDK/Sources/MastodonCommon/Preference/Preference+App.swift (81%) rename AppShared/UserDefaults+Notification.swift => MastodonSDK/Sources/MastodonCommon/Preference/Preference+Notification.swift (82%) rename Mastodon/Preference/StoreReviewPreference.swift => MastodonSDK/Sources/MastodonCommon/Preference/Preference+StoreReview.swift (75%) rename Mastodon/Preference/WizardPreference.swift => MastodonSDK/Sources/MastodonCommon/Preference/Preference+Wizard.swift (76%) rename {Mastodon/State => MastodonSDK/Sources/MastodonCore}/AppContext.swift (86%) rename {AppShared => MastodonSDK/Sources/MastodonCore}/AppSecret.swift (93%) create mode 100644 MastodonSDK/Sources/MastodonCore/Authentication/MastodonAuthenticationBox.swift create mode 100644 MastodonSDK/Sources/MastodonCore/DocumentStore.swift rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Extension/CoreDataStack/Instance.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/CoreDataStack/MastodonEmoji.swift (69%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/MastodonField.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/MastodonMention.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/CoreDataStack/MastodonStatus.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/MastodonUser+Property.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/CoreDataStack/MastodonUser.swift (73%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/Notification+Property.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/Poll+Property.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/PollOption+Property.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Extension/CoreDataStack/Setting.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/Status+Property.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Extension/CoreDataStack/Status.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Extension/CoreDataStack/Subscription.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Extension/CoreDataStack/SubscriptionAlerts.swift (100%) rename {Mastodon/Persistence/Extension => MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack}/Tag+Property.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/MastodonSDK/Mastodon+Entity+Account.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/MastodonSDK/Mastodon+Entity+Link.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Extension/MastodonSDK/Mastodon+Entity+Tag.swift (100%) rename {Mastodon/Diffiable => MastodonSDK/Sources/MastodonCore}/FetchedResultsController/FeedFetchedResultsController.swift (100%) rename {Mastodon/Diffiable => MastodonSDK/Sources/MastodonCore}/FetchedResultsController/SearchHistoryFetchedResultController.swift (100%) rename {Mastodon/Diffiable => MastodonSDK/Sources/MastodonCore}/FetchedResultsController/SettingFetchedResultController.swift (80%) rename {Mastodon/Diffiable => MastodonSDK/Sources/MastodonCore}/FetchedResultsController/StatusFetchedResultsController.swift (99%) rename {Mastodon/Diffiable => MastodonSDK/Sources/MastodonCore}/FetchedResultsController/UserFetchedResultsController.swift (99%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Model/UserIdentifier.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+MastodonUser.swift (96%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+Notification.swift (98%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+Poll.swift (98%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+PollOption.swift (96%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+SearchHistory.swift (97%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+Status.swift (98%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence+Tag.swift (97%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Persistence.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Protocol/MastodonEmojiContainer.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Protocol/MastodonFieldContainer.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Persistence/Protocol/MastodonMentionContainer.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+APIError.swift (95%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Account.swift (93%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+App.swift (92%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Authentication.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Block.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Bookmark.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+CustomEmoji.swift (95%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+DomainBlock.swift (99%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Favorite.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Filter.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Follow.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+FollowRequest.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Follower.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Following.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+HashtagTimeline.swift (98%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+HomeTimeline.swift (99%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Instance.swift (95%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Media.swift (97%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Mute.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Notification.swift (86%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Onboarding.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Poll.swift (99%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+PublicTimeline.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Reblog.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Recommend.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Relationship.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Report.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Search.swift (98%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Status+Publish.swift (98%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Status.swift (99%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Subscriptions.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Thread.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+Trend.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+UserTimeline.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService+WebFinger.swift (97%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/APIService.swift (71%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/CoreData/APIService+CoreData+Instance.swift (99%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/CoreData/APIService+CoreData+MastodonAuthentication.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/CoreData/APIService+CoreData+Setting.swift (100%) rename {Mastodon/Service/APIService => MastodonSDK/Sources/MastodonCore/Service/API}/CoreData/APIService+CoreData+Subscriptions.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/AuthenticationService.swift (89%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/BlockDomainService.swift (99%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Service/BlurhashImageCacheService.swift (100%) rename {Mastodon/Service/EmojiService => MastodonSDK/Sources/MastodonCore/Service/Emoji}/EmojiService+CustomEmojiViewModel+LoadState.swift (100%) rename {Mastodon/Service/EmojiService => MastodonSDK/Sources/MastodonCore/Service/Emoji}/EmojiService+CustomEmojiViewModel.swift (86%) rename {Mastodon/Service/EmojiService => MastodonSDK/Sources/MastodonCore/Service/Emoji}/EmojiService.swift (97%) rename {Mastodon/Service/EmojiService => MastodonSDK/Sources/MastodonCore/Service/Emoji}/Trie.swift (88%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/InstanceService.swift (97%) rename {Mastodon/Service/MastodonAttachmentService => MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment}/MastodonAttachmentService+UploadState.swift (100%) rename {Mastodon/Service/MastodonAttachmentService => MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment}/MastodonAttachmentService.swift (99%) rename {NotificationService => MastodonSDK/Sources/MastodonCore/Service/Notification}/MastodonPushNotification.swift (73%) rename {Mastodon/Service => MastodonSDK/Sources/MastodonCore/Service/Notification}/NotificationService.swift (91%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/PhotoLibraryService.swift (94%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/PlaceholderImageCacheService.swift (97%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/PlaybackState.swift (100%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/SettingService.swift (91%) rename {Mastodon => MastodonSDK/Sources/MastodonCore}/Service/StatusFilterService.swift (98%) create mode 100644 MastodonSDK/Sources/MastodonCore/Service/StatusPublishService.swift rename MastodonSDK/Sources/{MastodonUI/Service/ThemeService => MastodonCore/Service/Theme}/MastodonTheme.swift (100%) rename MastodonSDK/Sources/{MastodonUI/Service/ThemeService => MastodonCore/Service/Theme}/SystemTheme.swift (100%) rename MastodonSDK/Sources/{MastodonUI/Service/ThemeService => MastodonCore/Service/Theme}/Theme.swift (100%) rename {Mastodon/Extension/MastodonUI => MastodonSDK/Sources/MastodonCore/Service/Theme}/ThemeService.swift (73%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Vendor/BlurHashDecode.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Vendor/BlurHashEncode.swift (100%) rename MastodonSDK/Sources/{MastodonUI => MastodonCore}/Vendor/ItemProviderLoader.swift (99%) rename {Mastodon/Extension => MastodonSDK/Sources/MastodonExtension}/Array.swift (93%) rename {Mastodon/Extension => MastodonSDK/Sources/MastodonExtension}/NSManagedObjectContext.swift (77%) create mode 100644 MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentView.swift create mode 100644 MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift create mode 100644 MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift delete mode 100644 MastodonSDK/Sources/MastodonUI/Service/ThemeService/ThemeService.swift create mode 100644 MastodonSDK/Sources/MastodonUI/View/Container/AttachmentView.swift delete mode 100644 ShareActionExtension/Service/APIService.swift diff --git a/.arkana.yml b/.arkana.yml new file mode 100644 index 000000000..2fd8f1ab4 --- /dev/null +++ b/.arkana.yml @@ -0,0 +1,16 @@ +import_name: 'ArkanaKeys' +namespace: 'Keys' +result_path: 'Dependencies' +flavors: + - AppStore +swift_declaration_strategy: let +should_generate_unit_tests: true +package_manager: spm +environments: + - Debug + - Release +global_secrets: + # nothing +environment_secrets: + # Will lookup for Debug and Release env vars (assuming no flavor was declared) + - NotificationEndpoint diff --git a/AppShared/AppShared.h b/AppShared/AppShared.h deleted file mode 100644 index 3258d4fcb..000000000 --- a/AppShared/AppShared.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// AppShared.h -// AppShared -// -// Created by MainasuK Cirno on 2021-4-27. -// - -#import - -//! Project version number for AppShared. -FOUNDATION_EXPORT double AppSharedVersionNumber; - -//! Project version string for AppShared. -FOUNDATION_EXPORT const unsigned char AppSharedVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/AppShared/Info.plist b/AppShared/Info.plist deleted file mode 100644 index 21baf4a3e..000000000 --- a/AppShared/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.4.5 - CFBundleVersion - 144 - - diff --git a/Gemfile b/Gemfile index 48aae3d82..510d3ccff 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,5 @@ source "https://rubygems.org" +gem 'arkana' gem "cocoapods" gem "cocoapods-clean" -gem "cocoapods-keys" - diff --git a/Gemfile.lock b/Gemfile.lock index b27a44a97..4f4903ed5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,9 +3,6 @@ GEM specs: CFPropertyList (3.0.5) rexml - RubyInline (3.12.5) - ZenTest (~> 4.3) - ZenTest (4.12.1) activesupport (6.1.5.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) @@ -17,6 +14,10 @@ GEM algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) + arkana (1.2.0) + colorize (~> 0.8) + dotenv (~> 2.7) + yaml (~> 0.2) atomos (0.1.3) claide (1.1.0) cocoapods (1.11.3) @@ -50,9 +51,6 @@ GEM typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) cocoapods-downloader (1.6.3) - cocoapods-keys (2.2.1) - dotenv - osx_keychain cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -61,8 +59,9 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) + colorize (0.8.1) concurrent-ruby (1.1.10) - dotenv (2.7.6) + dotenv (2.8.1) escape (0.0.4) ethon (0.15.0) ffi (>= 1.15.0) @@ -79,8 +78,6 @@ GEM nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) - osx_keychain (1.0.2) - RubyInline (~> 3) public_suffix (4.0.7) rexml (3.2.5) ruby-macho (2.5.1) @@ -95,15 +92,16 @@ GEM colored2 (~> 3.1) nanaimo (~> 0.3.0) rexml (~> 3.2.4) + yaml (0.2.0) zeitwerk (2.5.4) PLATFORMS ruby DEPENDENCIES + arkana cocoapods cocoapods-clean - cocoapods-keys BUNDLED WITH - 2.3.11 + 2.3.17 diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 4106af7de..d8a01b818 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -11,9 +11,7 @@ 0F2021FB2613262F000C64BF /* HashtagTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F2021FA2613262F000C64BF /* HashtagTimelineViewController.swift */; }; 0F202201261326E6000C64BF /* HashtagTimelineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F202200261326E6000C64BF /* HashtagTimelineViewModel.swift */; }; 0F20220726134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F20220626134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift */; }; - 0F202213261351F5000C64BF /* APIService+HashtagTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F202212261351F5000C64BF /* APIService+HashtagTimeline.swift */; }; 0F20222D261457EE000C64BF /* HashtagTimelineViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F20222C261457EE000C64BF /* HashtagTimelineViewModel+State.swift */; }; - 0F20223926146553000C64BF /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F20223826146553000C64BF /* Array.swift */; }; 0FAA0FDF25E0B57E0017CCDE /* WelcomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA0FDE25E0B57E0017CCDE /* WelcomeViewController.swift */; }; 0FAA101225E105390017CCDE /* PrimaryActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA101125E105390017CCDE /* PrimaryActionButton.swift */; }; 0FAA101C25E10E760017CCDE /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FAA101B25E10E760017CCDE /* UIFont.swift */; }; @@ -31,8 +29,6 @@ 2D206B9225F60EA700143C56 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D206B9125F60EA700143C56 /* UIControl.swift */; }; 2D24E1232626ED9D00A59D4F /* UIView+Gesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D24E1222626ED9D00A59D4F /* UIView+Gesture.swift */; }; 2D32EAAC25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */; }; - 2D34D9D126148D9E0081BFC0 /* APIService+Recommend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D34D9D026148D9E0081BFC0 /* APIService+Recommend.swift */; }; - 2D34D9DB261494120081BFC0 /* APIService+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D34D9DA261494120081BFC0 /* APIService+Search.swift */; }; 2D35237A26256D920031AF25 /* NotificationSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D35237926256D920031AF25 /* NotificationSection.swift */; }; 2D364F7225E66D7500204FDC /* MastodonResendEmailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D364F7125E66D7500204FDC /* MastodonResendEmailViewController.swift */; }; 2D364F7825E66D8300204FDC /* MastodonResendEmailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D364F7725E66D8300204FDC /* MastodonResendEmailViewModel.swift */; }; @@ -48,15 +44,11 @@ 2D571B2F26004EC000540450 /* NavigationBarProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D571B2E26004EC000540450 /* NavigationBarProgressView.swift */; }; 2D59819B25E4A581000FB903 /* MastodonConfirmEmailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D59819A25E4A581000FB903 /* MastodonConfirmEmailViewController.swift */; }; 2D5981A125E4A593000FB903 /* MastodonConfirmEmailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5981A025E4A593000FB903 /* MastodonConfirmEmailViewModel.swift */; }; - 2D5981BA25E4D7F8000FB903 /* ThirdPartyMailer in Frameworks */ = {isa = PBXBuildFile; productRef = 2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */; }; 2D5A3D0325CF8742002347D6 /* ControlContainableScrollViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D0225CF8742002347D6 /* ControlContainableScrollViews.swift */; }; 2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D2725CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift */; }; 2D5A3D3825CF8D9F002347D6 /* ScrollViewContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D3725CF8D9F002347D6 /* ScrollViewContainer.swift */; }; 2D5A3D6225CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5A3D6125CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift */; }; 2D607AD826242FC500B70763 /* NotificationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D607AD726242FC500B70763 /* NotificationViewModel.swift */; }; - 2D61254D262547C200299647 /* APIService+Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D61254C262547C200299647 /* APIService+Notification.swift */; }; - 2D61335E25C1894B00CAE157 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D61335D25C1894B00CAE157 /* APIService.swift */; }; - 2D61336925C18A4F00CAE157 /* AlamofireNetworkActivityIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = 2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */; }; 2D650FAB25ECDC9300851B58 /* Mastodon+Entity+Error+Detail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D650FAA25ECDC9300851B58 /* Mastodon+Entity+Error+Detail.swift */; }; 2D694A7425F9EB4E0038ADDC /* ContentWarningOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D694A7325F9EB4E0038ADDC /* ContentWarningOverlayView.swift */; }; 2D6DE40026141DF600A63F6A /* SearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D6DE3FF26141DF600A63F6A /* SearchViewModel.swift */; }; @@ -68,14 +60,9 @@ 2D8434F525FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8434F425FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift */; }; 2D8434FB25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8434FA25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift */; }; 2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D84350425FF858100EECE90 /* UIScrollView.swift */; }; - 2D8FCA082637EABB00137F46 /* APIService+FollowRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8FCA072637EABB00137F46 /* APIService+FollowRequest.swift */; }; 2D939AB525EDD8A90076FA61 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AB425EDD8A90076FA61 /* String.swift */; }; - 2D939AC825EE14620076FA61 /* CropViewController in Frameworks */ = {isa = PBXBuildFile; productRef = 2D939AC725EE14620076FA61 /* CropViewController */; }; 2D939AE825EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AE725EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift */; }; - 2D9DB967263A76FB007C1D71 /* BlockDomainService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D9DB966263A76FB007C1D71 /* BlockDomainService.swift */; }; - 2D9DB96B263A91D1007C1D71 /* APIService+DomainBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D9DB96A263A91D1007C1D71 /* APIService+DomainBlock.swift */; }; 2DA504692601ADE7008F4E6C /* SawToothView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DA504682601ADE7008F4E6C /* SawToothView.swift */; }; - 2DA6054725F716A2006356F9 /* PlaybackState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DA6054625F716A2006356F9 /* PlaybackState.swift */; }; 2DA7D04425CA52B200804E11 /* TimelineLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DA7D04325CA52B200804E11 /* TimelineLoaderTableViewCell.swift */; }; 2DA7D04A25CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DA7D04925CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift */; }; 2DAC9E38262FC2320062E1A6 /* SuggestionAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DAC9E37262FC2320062E1A6 /* SuggestionAccountViewController.swift */; }; @@ -85,17 +72,13 @@ 2DCB73FD2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DCB73FC2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift */; }; 2DE0FACE2615F7AD00CDF649 /* RecommendAccountSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DE0FACD2615F7AD00CDF649 /* RecommendAccountSection.swift */; }; 2DF123A725C3B0210020F248 /* ActiveLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DF123A625C3B0210020F248 /* ActiveLabel.swift */; }; - 2DF75BA725D10E1000694EC8 /* APIService+Favorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DF75BA625D10E1000694EC8 /* APIService+Favorite.swift */; }; 5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B24BBD7262DB14800A9381B /* ReportViewModel.swift */; }; 5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B24BBD8262DB14800A9381B /* ReportStatusViewModel+Diffable.swift */; }; - 5B24BBE2262DB19100A9381B /* APIService+Report.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B24BBE1262DB19100A9381B /* APIService+Report.swift */; }; 5B90C45E262599800002E742 /* SettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C456262599800002E742 /* SettingsViewModel.swift */; }; 5B90C45F262599800002E742 /* SettingsToggleTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C459262599800002E742 /* SettingsToggleTableViewCell.swift */; }; 5B90C460262599800002E742 /* SettingsAppearanceTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C45A262599800002E742 /* SettingsAppearanceTableViewCell.swift */; }; 5B90C461262599800002E742 /* SettingsLinkTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C45B262599800002E742 /* SettingsLinkTableViewCell.swift */; }; 5B90C462262599800002E742 /* SettingsSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C45C262599800002E742 /* SettingsSectionHeader.swift */; }; - 5B90C48526259BF10002E742 /* APIService+Subscriptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C48426259BF10002E742 /* APIService+Subscriptions.swift */; }; - 5B90C48B26259C120002E742 /* APIService+CoreData+Subscriptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B90C48A26259C120002E742 /* APIService+CoreData+Subscriptions.swift */; }; 5BB04FD5262E7AFF0043BFF6 /* ReportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB04FD4262E7AFF0043BFF6 /* ReportViewController.swift */; }; 5BB04FF5262F0E6D0043BFF6 /* ReportSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB04FF4262F0E6D0043BFF6 /* ReportSection.swift */; }; 5D0393902612D259007FE196 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D03938F2612D259007FE196 /* WebViewController.swift */; }; @@ -107,7 +90,6 @@ 5DF1056425F887CB00D6C0D4 /* AVPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF1056325F887CB00D6C0D4 /* AVPlayer.swift */; }; 5E0DEC05797A7E6933788DDB /* Pods_MastodonTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452147B2903DF38070FE56A2 /* Pods_MastodonTests.framework */; }; 5E44BF88AD33646E64727BCF /* Pods_MastodonTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD92E0F10BDE4FE7C4B999F2 /* Pods_MastodonTests.framework */; }; - 6213AF5828939C4800BCADB6 /* APIService+Bookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213AF5728939C4700BCADB6 /* APIService+Bookmark.swift */; }; 6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213AF5928939C8400BCADB6 /* BookmarkViewModel.swift */; }; 6213AF5C28939C8A00BCADB6 /* BookmarkViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213AF5B28939C8A00BCADB6 /* BookmarkViewModel+State.swift */; }; 6213AF5E2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6213AF5D2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift */; }; @@ -123,18 +105,13 @@ DB023D2A27A0FE5C005AC798 /* DataSourceProvider+NotificationTableViewCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D2927A0FE5C005AC798 /* DataSourceProvider+NotificationTableViewCellDelegate.swift */; }; DB023D2C27A10464005AC798 /* NotificationTimelineViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB023D2B27A10464005AC798 /* NotificationTimelineViewController+DataSourceProvider.swift */; }; DB025B78278D606A002F581E /* StatusItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB025B77278D606A002F581E /* StatusItem.swift */; }; - DB025B93278D6501002F581E /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB025B92278D6501002F581E /* Persistence.swift */; }; - DB025B95278D6530002F581E /* Persistence+MastodonUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB025B94278D6530002F581E /* Persistence+MastodonUser.swift */; }; - DB025B97278D66D5002F581E /* MastodonUser+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB025B96278D66D5002F581E /* MastodonUser+Property.swift */; }; DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB029E94266A20430062874E /* MastodonAuthenticationController.swift */; }; DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */; }; DB02CDBF2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */; }; - DB02EA0B280D180D00E751C5 /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = DB02EA0A280D180D00E751C5 /* KeychainAccess */; }; DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A792272A7E5700EE37C5 /* SidebarListHeaderView.swift */; }; DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */; }; DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */; }; DB03F7F52689B782007B274C /* ComposeTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB03F7F42689B782007B274C /* ComposeTableView.swift */; }; - DB040ED126538E3D00BEE9D8 /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB040ED026538E3C00BEE9D8 /* Trie.swift */; }; DB0617EB277EF3820030EE79 /* GradientBorderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0617EA277EF3820030EE79 /* GradientBorderView.swift */; }; DB0617ED277F02C50030EE79 /* OnboardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0617EC277F02C50030EE79 /* OnboardingNavigationController.swift */; }; DB0617EF277F12720030EE79 /* NavigationActionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0617EE277F12720030EE79 /* NavigationActionView.swift */; }; @@ -145,9 +122,7 @@ DB0618012785732C0030EE79 /* ServerRulesTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618002785732C0030EE79 /* ServerRulesTableViewCell.swift */; }; DB0618032785A7100030EE79 /* RegisterSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618022785A7100030EE79 /* RegisterSection.swift */; }; DB0618052785A73D0030EE79 /* RegisterItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0618042785A73D0030EE79 /* RegisterItem.swift */; }; - DB084B5725CBC56C00F898ED /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB084B5625CBC56C00F898ED /* Status.swift */; }; DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */; }; - DB0AC6FC25CD02E600D75117 /* APIService+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */; }; DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */; }; DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */; }; DB0EF72E26FDB24F00347686 /* SidebarListContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */; }; @@ -155,8 +130,6 @@ DB0F9D54283EB3C000379AF8 /* ProfileHeaderView+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0F9D53283EB3C000379AF8 /* ProfileHeaderView+ViewModel.swift */; }; DB0F9D56283EB46200379AF8 /* ProfileHeaderView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0F9D55283EB46200379AF8 /* ProfileHeaderView+Configuration.swift */; }; DB0FCB68279507EF006C02E2 /* DataSourceFacade+Meta.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB67279507EF006C02E2 /* DataSourceFacade+Meta.swift */; }; - DB0FCB6C27950E29006C02E2 /* MastodonMentionContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB6B27950E29006C02E2 /* MastodonMentionContainer.swift */; }; - DB0FCB6E27950E6B006C02E2 /* MastodonMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB6D27950E6B006C02E2 /* MastodonMention.swift */; }; DB0FCB7027951368006C02E2 /* TimelineMiddleLoaderTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB6F27951368006C02E2 /* TimelineMiddleLoaderTableViewCell+ViewModel.swift */; }; DB0FCB7227952986006C02E2 /* NamingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB7127952986006C02E2 /* NamingState.swift */; }; DB0FCB7427956939006C02E2 /* DataSourceFacade+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB7327956939006C02E2 /* DataSourceFacade+Status.swift */; }; @@ -172,7 +145,6 @@ DB0FCB882796BDA9006C02E2 /* SearchItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB872796BDA9006C02E2 /* SearchItem.swift */; }; DB0FCB8C2796BF8D006C02E2 /* SearchViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */; }; DB0FCB8E2796C0B7006C02E2 /* TrendCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */; }; - DB0FCB902796C5EB006C02E2 /* APIService+Trend.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB8F2796C5EB006C02E2 /* APIService+Trend.swift */; }; DB0FCB922796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */; }; DB0FCB942797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */; }; DB0FCB962797E6C2006C02E2 /* SearchResultViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB0FCB952797E6C2006C02E2 /* SearchResultViewController+DataSourceProvider.swift */; }; @@ -194,22 +166,13 @@ DB1FD45025F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1FD44F25F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift */; }; DB1FD45A25F27898004CFCFC /* CategoryPickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */; }; DB221B16260C395900AEFE46 /* CustomEmojiPickerInputViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB221B15260C395900AEFE46 /* CustomEmojiPickerInputViewModel.swift */; }; - DB297B1B2679FAE200704C90 /* PlaceholderImageCacheService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB297B1A2679FAE200704C90 /* PlaceholderImageCacheService.swift */; }; + DB22C92228E700A10082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92128E700A10082A9E9 /* MastodonSDK */; }; + DB22C92428E700A80082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92328E700A80082A9E9 /* MastodonSDK */; }; + DB22C92628E700AF0082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92528E700AF0082A9E9 /* MastodonSDK */; }; + DB22C92828E700B70082A9E9 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB22C92728E700B70082A9E9 /* MastodonSDK */; }; DB2B3ABC25E37E15007045F9 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = DB2B3ABE25E37E15007045F9 /* InfoPlist.strings */; }; DB2F073525E8ECF000957B2D /* AuthenticationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2F073325E8ECF000957B2D /* AuthenticationViewModel.swift */; }; DB2FF510260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB2FF50F260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift */; }; - DB336F1C278D697E0031E64B /* MastodonUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FAE225CA7181005A8AC7 /* MastodonUser.swift */; }; - DB336F21278D6D960031E64B /* MastodonEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F20278D6D960031E64B /* MastodonEmoji.swift */; }; - DB336F23278D6DED0031E64B /* MastodonEmojiContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F22278D6DED0031E64B /* MastodonEmojiContainer.swift */; }; - DB336F28278D6EC70031E64B /* MastodonFieldContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F27278D6EC70031E64B /* MastodonFieldContainer.swift */; }; - DB336F2A278D6F2B0031E64B /* MastodonField.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F29278D6F2B0031E64B /* MastodonField.swift */; }; - DB336F2C278D6FC30031E64B /* Persistence+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F2B278D6FC30031E64B /* Persistence+Status.swift */; }; - DB336F2E278D71AF0031E64B /* Status+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F2D278D71AF0031E64B /* Status+Property.swift */; }; - DB336F32278D77330031E64B /* Persistence+Poll.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F31278D77330031E64B /* Persistence+Poll.swift */; }; - DB336F34278D77730031E64B /* Persistence+PollOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F33278D77730031E64B /* Persistence+PollOption.swift */; }; - DB336F36278D77A40031E64B /* PollOption+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F35278D77A40031E64B /* PollOption+Property.swift */; }; - DB336F38278D7AAF0031E64B /* Poll+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F37278D7AAF0031E64B /* Poll+Property.swift */; }; - DB336F3D278D80040031E64B /* FeedFetchedResultsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F3C278D80040031E64B /* FeedFetchedResultsController.swift */; }; DB336F3F278E668C0031E64B /* StatusTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F3E278E668C0031E64B /* StatusTableViewCell+ViewModel.swift */; }; DB336F41278E68480031E64B /* StatusView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F40278E68480031E64B /* StatusView+Configuration.swift */; }; DB336F43278EB1690031E64B /* MediaView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB336F42278EB1680031E64B /* MediaView+Configuration.swift */; }; @@ -224,7 +187,6 @@ DB3E6FE22806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FE12806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift */; }; DB3E6FE42806A5B800B035AE /* DiscoverySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FE32806A5B800B035AE /* DiscoverySection.swift */; }; DB3E6FE72806A7A200B035AE /* DiscoveryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FE62806A7A200B035AE /* DiscoveryItem.swift */; }; - DB3E6FE92806BD2200B035AE /* ThemeService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FE82806BD2200B035AE /* ThemeService.swift */; }; DB3E6FEC2806D7F100B035AE /* DiscoveryNewsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FEB2806D7F100B035AE /* DiscoveryNewsViewController.swift */; }; DB3E6FEF2806D82600B035AE /* DiscoveryNewsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FEE2806D82600B035AE /* DiscoveryNewsViewModel.swift */; }; DB3E6FF12806D96900B035AE /* DiscoveryNewsViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3E6FF02806D96900B035AE /* DiscoveryNewsViewModel+Diffable.swift */; }; @@ -235,22 +197,8 @@ DB3EA8E6281B79E200598866 /* DiscoveryCommunityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8E5281B79E200598866 /* DiscoveryCommunityViewController.swift */; }; DB3EA8E9281B7A3700598866 /* DiscoveryCommunityViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8E8281B7A3700598866 /* DiscoveryCommunityViewModel.swift */; }; DB3EA8EB281B7E0700598866 /* DiscoveryCommunityViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8EA281B7E0700598866 /* DiscoveryCommunityViewModel+State.swift */; }; - DB3EA8ED281B810100598866 /* APIService+PublicTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8EC281B810100598866 /* APIService+PublicTimeline.swift */; }; DB3EA8EF281B837000598866 /* DiscoveryCommunityViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8EE281B837000598866 /* DiscoveryCommunityViewController+DataSourceProvider.swift */; }; DB3EA8F1281B9EF600598866 /* DiscoveryCommunityViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB3EA8F0281B9EF600598866 /* DiscoveryCommunityViewModel+Diffable.swift */; }; - DB3EA8F5281BB65200598866 /* MastodonSDK in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA8F4281BB65200598866 /* MastodonSDK */; }; - DB3EA8FC281BBAE100598866 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA8FB281BBAE100598866 /* AlamofireImage */; }; - DB3EA8FE281BBAF200598866 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA8FD281BBAF200598866 /* Alamofire */; }; - DB3EA902281BBD5D00598866 /* CommonOSLog in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA901281BBD5D00598866 /* CommonOSLog */; }; - DB3EA904281BBD9400598866 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA903281BBD9400598866 /* Introspect */; }; - DB3EA906281BBE8200598866 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA905281BBE8200598866 /* AlamofireImage */; }; - DB3EA908281BBE8200598866 /* AlamofireNetworkActivityIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA907281BBE8200598866 /* AlamofireNetworkActivityIndicator */; }; - DB3EA90A281BBE8200598866 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA909281BBE8200598866 /* Alamofire */; }; - DB3EA90C281BBE9600598866 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA90B281BBE9600598866 /* AlamofireImage */; }; - DB3EA90E281BBE9600598866 /* AlamofireNetworkActivityIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA90D281BBE9600598866 /* AlamofireNetworkActivityIndicator */; }; - DB3EA910281BBE9600598866 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA90F281BBE9600598866 /* Alamofire */; }; - DB3EA912281BBEA800598866 /* AlamofireImage in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA911281BBEA800598866 /* AlamofireImage */; }; - DB3EA914281BBEA800598866 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = DB3EA913281BBEA800598866 /* Alamofire */; }; DB427DD625BAA00100D1B89D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB427DD525BAA00100D1B89D /* AppDelegate.swift */; }; DB427DD825BAA00100D1B89D /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB427DD725BAA00100D1B89D /* SceneDelegate.swift */; }; DB427DDD25BAA00100D1B89D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DB427DDB25BAA00100D1B89D /* Main.storyboard */; }; @@ -267,23 +215,10 @@ DB4481B925EE289600BEFB67 /* UITableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4481B825EE289600BEFB67 /* UITableView.swift */; }; DB45FAB625CA5485005A8AC7 /* UIAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FAB525CA5485005A8AC7 /* UIAlertController.swift */; }; DB45FAD725CA6C76005A8AC7 /* UIBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FAD625CA6C76005A8AC7 /* UIBarButtonItem.swift */; }; - DB45FAE325CA7181005A8AC7 /* MastodonUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FAE225CA7181005A8AC7 /* MastodonUser.swift */; }; - DB45FAF925CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FAF825CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift */; }; - DB45FB0F25CA87D0005A8AC7 /* AuthenticationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FB0E25CA87D0005A8AC7 /* AuthenticationService.swift */; }; - DB45FB1D25CA9D23005A8AC7 /* APIService+HomeTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB45FB1C25CA9D23005A8AC7 /* APIService+HomeTimeline.swift */; }; - DB47229725F9EFAD00DA7F53 /* NSManagedObjectContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB47229625F9EFAD00DA7F53 /* NSManagedObjectContext.swift */; }; DB47AB6227CF752B00CD73C7 /* MastodonUISnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB47AB6127CF752B00CD73C7 /* MastodonUISnapshotTests.swift */; }; DB482A3F261331E8008AE74C /* UserTimelineViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB482A3E261331E8008AE74C /* UserTimelineViewModel+State.swift */; }; - DB482A4B261340A7008AE74C /* APIService+UserTimeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB482A4A261340A7008AE74C /* APIService+UserTimeline.swift */; }; - DB486C0F282E41F200F69423 /* TabBarPager in Frameworks */ = {isa = PBXBuildFile; productRef = DB486C0E282E41F200F69423 /* TabBarPager */; }; - DB4924E226312AB200E9DB22 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4924E126312AB200E9DB22 /* NotificationService.swift */; }; DB4932B126F1FB5300EF46D4 /* WizardCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */; }; - DB4932B726F30F0700EF46D4 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F20223826146553000C64BF /* Array.swift */; }; DB4932B926F31AD300EF46D4 /* BadgeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4932B826F31AD300EF46D4 /* BadgeButton.swift */; }; - DB49A61425FF2C5600B98345 /* EmojiService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A61325FF2C5600B98345 /* EmojiService.swift */; }; - DB49A61F25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A61E25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift */; }; - DB49A62525FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A62425FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift */; }; - DB49A62B25FF36C700B98345 /* APIService+CustomEmoji.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB49A62A25FF36C700B98345 /* APIService+CustomEmoji.swift */; }; DB4AA6B327BA34B6009EC082 /* CellFrameCacheContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4AA6B227BA34B6009EC082 /* CellFrameCacheContainer.swift */; }; DB4F0963269ED06300D62E92 /* SearchResultViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0962269ED06300D62E92 /* SearchResultViewController.swift */; }; DB4F0966269ED52200D62E92 /* SearchResultViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F0965269ED52200D62E92 /* SearchResultViewModel.swift */; }; @@ -292,12 +227,8 @@ DB4F097526A037F500D62E92 /* SearchHistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */; }; DB4F097B26A039FF00D62E92 /* SearchHistorySection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */; }; DB4F097D26A03A5B00D62E92 /* SearchHistoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */; }; - DB4F097F26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4F097E26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift */; }; DB4FFC2B269EC39600D62E92 /* SearchToSearchDetailViewControllerAnimatedTransitioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4FFC29269EC39600D62E92 /* SearchToSearchDetailViewControllerAnimatedTransitioning.swift */; }; DB4FFC2C269EC39600D62E92 /* SearchTransitionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB4FFC2A269EC39600D62E92 /* SearchTransitionController.swift */; }; - DB552D4F26BBD10C00E481F6 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = DB552D4E26BBD10C00E481F6 /* OrderedCollections */; }; - DB564BD3269F3B35001E39A7 /* StatusFilterService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB564BD2269F3B35001E39A7 /* StatusFilterService.swift */; }; - DB59F10E25EF724F001F1DAB /* APIService+Poll.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB59F10D25EF724F001F1DAB /* APIService+Poll.swift */; }; DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */; }; DB5B549D2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */; }; DB5B549F2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB5B549E2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift */; }; @@ -336,45 +267,28 @@ DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */; }; DB63F752279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */; }; DB63F7542799491600455B82 /* DataSourceFacade+SearchHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */; }; - DB63F756279949BD00455B82 /* Persistence+SearchHistory.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F755279949BD00455B82 /* Persistence+SearchHistory.swift */; }; DB63F75A279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */; }; - DB63F75C279956D000455B82 /* Persistence+Tag.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F75B279956D000455B82 /* Persistence+Tag.swift */; }; - DB63F75E27995B3B00455B82 /* Tag+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F75D27995B3B00455B82 /* Tag+Property.swift */; }; DB63F76227996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */; }; DB63F764279A5E3C00455B82 /* NotificationTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */; }; DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */; }; DB63F769279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F768279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift */; }; DB63F76B279A5ED300455B82 /* NotificationTimelineViewModel+LoadOldestState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F76A279A5ED300455B82 /* NotificationTimelineViewModel+LoadOldestState.swift */; }; DB63F76F279A7D1100455B82 /* NotificationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F76E279A7D1100455B82 /* NotificationTableViewCell.swift */; }; - DB63F771279A858500455B82 /* Persistence+Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F770279A858500455B82 /* Persistence+Notification.swift */; }; - DB63F773279A87DC00455B82 /* Notification+Property.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F772279A87DC00455B82 /* Notification+Property.swift */; }; DB63F775279A997D00455B82 /* NotificationTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F774279A997D00455B82 /* NotificationTableViewCell+ViewModel.swift */; }; DB63F777279A9A2A00455B82 /* NotificationView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F776279A9A2A00455B82 /* NotificationView+Configuration.swift */; }; DB63F779279ABF9C00455B82 /* DataSourceFacade+Reblog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F778279ABF9C00455B82 /* DataSourceFacade+Reblog.swift */; }; DB63F77B279ACAE500455B82 /* DataSourceFacade+Favorite.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB63F77A279ACAE500455B82 /* DataSourceFacade+Favorite.swift */; }; - DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB647C5826F1EA2700F7F82C /* WizardPreference.swift */; }; DB64BA452851F23000ADF1B7 /* MastodonAuthentication+Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB64BA442851F23000ADF1B7 /* MastodonAuthentication+Fetch.swift */; }; DB64BA482851F29300ADF1B7 /* Account+Fetch.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB64BA472851F29300ADF1B7 /* Account+Fetch.swift */; }; DB65C63727A2AF6C008BAC2E /* ReportItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB65C63627A2AF6C008BAC2E /* ReportItem.swift */; }; DB66728C25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66728B25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift */; }; DB66729625F9F91600D60309 /* ComposeStatusSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66729525F9F91600D60309 /* ComposeStatusSection.swift */; }; DB66729C25F9F91F00D60309 /* ComposeStatusItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB66729B25F9F91F00D60309 /* ComposeStatusItem.swift */; }; - DB6746E7278ED633008A6B94 /* MastodonAuthenticationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC50C0278ED49200AF0CC6 /* MastodonAuthenticationBox.swift */; }; - DB6746E8278ED639008A6B94 /* MastodonAuthenticationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC50C0278ED49200AF0CC6 /* MastodonAuthenticationBox.swift */; }; - DB6746E9278ED63F008A6B94 /* MastodonAuthenticationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC50C0278ED49200AF0CC6 /* MastodonAuthenticationBox.swift */; }; DB6746EB278ED8B0008A6B94 /* PollOptionView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6746EA278ED8B0008A6B94 /* PollOptionView+Configuration.swift */; }; DB6746ED278F45F0008A6B94 /* AutoGenerateProtocolRelayDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6746EC278F45F0008A6B94 /* AutoGenerateProtocolRelayDelegate.swift */; }; DB6746F0278F463B008A6B94 /* AutoGenerateProtocolDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6746EF278F463B008A6B94 /* AutoGenerateProtocolDelegate.swift */; }; - DB67D08427312970006A36CF /* APIService+Following.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D08327312970006A36CF /* APIService+Following.swift */; }; DB67D08627312E67006A36CF /* WizardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D08527312E67006A36CF /* WizardViewController.swift */; }; - DB67D089273256D7006A36CF /* StoreReviewPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB67D088273256D7006A36CF /* StoreReviewPreference.swift */; }; - DB68045B2636DC6A00430867 /* MastodonPushNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68045A2636DC6A00430867 /* MastodonPushNotification.swift */; }; DB6804662636DC9000430867 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D939AB425EDD8A90076FA61 /* String.swift */; }; - DB68046C2636DC9E00430867 /* MastodonPushNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68045A2636DC6A00430867 /* MastodonPushNotification.swift */; }; - DB6804832637CD4C00430867 /* AppShared.h in Headers */ = {isa = PBXBuildFile; fileRef = DB6804812637CD4C00430867 /* AppShared.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB6804862637CD4C00430867 /* AppShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; }; - DB6804872637CD4C00430867 /* AppShared.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DB6804FD2637CFEC00430867 /* AppSecret.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6804FC2637CFEC00430867 /* AppSecret.swift */; }; DB68586425E619B700F0A850 /* NSKeyValueObservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */; }; DB68A04A25E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB68A04925E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift */; }; DB68A05D25E9055900CFDF14 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DB68A05C25E9055900CFDF14 /* Settings.bundle */; }; @@ -388,13 +302,11 @@ DB697DDF278F524F004EF2F7 /* DataSourceFacade+Profile.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB697DDE278F524F004EF2F7 /* DataSourceFacade+Profile.swift */; }; DB697DE1278F5296004EF2F7 /* DataSourceFacade+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB697DE0278F5296004EF2F7 /* DataSourceFacade+Model.swift */; }; DB6988DE2848D11C002398EF /* PagerTabStripNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6988DD2848D11C002398EF /* PagerTabStripNavigateable.swift */; }; - DB6B35182601FA3400DC1E11 /* MastodonAttachmentService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B35172601FA3400DC1E11 /* MastodonAttachmentService.swift */; }; DB6B351E2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B351D2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift */; }; DB6B74EF272FB55000C70B6E /* FollowerListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74EE272FB55000C70B6E /* FollowerListViewController.swift */; }; DB6B74F2272FB67600C70B6E /* FollowerListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F1272FB67600C70B6E /* FollowerListViewModel.swift */; }; DB6B74F4272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F3272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift */; }; DB6B74F6272FBCDB00C70B6E /* FollowerListViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F5272FBCDB00C70B6E /* FollowerListViewModel+State.swift */; }; - DB6B74FA272FC2B500C70B6E /* APIService+Follower.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */; }; DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FB272FF55800C70B6E /* UserSection.swift */; }; DB6B74FE272FF59000C70B6E /* UserItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FD272FF59000C70B6E /* UserItem.swift */; }; DB6B7500272FF73800C70B6E /* UserTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6B74FF272FF73800C70B6E /* UserTableViewCell.swift */; }; @@ -402,26 +314,15 @@ DB6C8C0F25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6C8C0E25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift */; }; DB6D1B44263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D1B43263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift */; }; DB6D9F3526351B7A008423CD /* NotificationService+Decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F3426351B7A008423CD /* NotificationService+Decrypt.swift */; }; - DB6D9F4926353FD7008423CD /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F4826353FD6008423CD /* Subscription.swift */; }; - DB6D9F502635761F008423CD /* SubscriptionAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F4F2635761F008423CD /* SubscriptionAlerts.swift */; }; - DB6D9F57263577D2008423CD /* APIService+CoreData+Setting.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F56263577D2008423CD /* APIService+CoreData+Setting.swift */; }; - DB6D9F6326357848008423CD /* SettingService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F6226357848008423CD /* SettingService.swift */; }; - DB6D9F6F2635807F008423CD /* Setting.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F6E2635807F008423CD /* Setting.swift */; }; - DB6D9F76263587C7008423CD /* SettingFetchedResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F75263587C7008423CD /* SettingFetchedResultController.swift */; }; DB6D9F7D26358ED4008423CD /* SettingsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F7C26358ED4008423CD /* SettingsSection.swift */; }; DB6D9F8426358EEC008423CD /* SettingsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F8326358EEC008423CD /* SettingsItem.swift */; }; DB6D9F9726367249008423CD /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6D9F9626367249008423CD /* SettingsViewController.swift */; }; DB6F5E35264E78E7009108F4 /* AutoCompleteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6F5E34264E78E7009108F4 /* AutoCompleteViewController.swift */; }; DB6F5E38264E994A009108F4 /* AutoCompleteTopChevronView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB6F5E37264E994A009108F4 /* AutoCompleteTopChevronView.swift */; }; - DB71FD5225F8CCAA00512AE1 /* APIService+Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB71FD5125F8CCAA00512AE1 /* APIService+Status.swift */; }; DB72601C25E36A2100235243 /* MastodonServerRulesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB72601B25E36A2100235243 /* MastodonServerRulesViewController.swift */; }; DB72602725E36A6F00235243 /* MastodonServerRulesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */; }; DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */; }; DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73B48F261F030A002E9E9F /* SafariActivity.swift */; }; - DB73BF3B2711885500781945 /* UserDefaults+Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */; }; - DB73BF43271192BB00781945 /* InstanceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF42271192BB00781945 /* InstanceService.swift */; }; - DB73BF45271195AC00781945 /* APIService+CoreData+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */; }; - DB73BF47271199CA00781945 /* Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF46271199CA00781945 /* Instance.swift */; }; DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */; }; DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */; }; DB75BF1E263C1C1B00EDBF1F /* CustomScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */; }; @@ -437,9 +338,6 @@ DB852D1F26FB037800FC9D81 /* SidebarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB852D1E26FB037800FC9D81 /* SidebarViewModel.swift */; }; DB87D4452609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB87D4442609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift */; }; DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB87D4502609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift */; }; - DB8AF52E25C13561002E6C99 /* ViewStateStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF52B25C13561002E6C99 /* ViewStateStore.swift */; }; - DB8AF52F25C13561002E6C99 /* DocumentStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF52C25C13561002E6C99 /* DocumentStore.swift */; }; - DB8AF53025C13561002E6C99 /* AppContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF52D25C13561002E6C99 /* AppContext.swift */; }; DB8AF54425C13647002E6C99 /* SceneCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF54225C13647002E6C99 /* SceneCoordinator.swift */; }; DB8AF54525C13647002E6C99 /* NeedsDependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF54325C13647002E6C99 /* NeedsDependency.swift */; }; DB8AF55025C13703002E6C99 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8AF54F25C13703002E6C99 /* MainTabBarController.swift */; }; @@ -454,13 +352,8 @@ DB938F0326240EA300E5B6C1 /* CachedThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F0226240EA300E5B6C1 /* CachedThreadViewModel.swift */; }; DB938F0926240F3C00E5B6C1 /* RemoteThreadViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F0826240F3C00E5B6C1 /* RemoteThreadViewModel.swift */; }; DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F0E2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift */; }; - DB938F1526241FDF00E5B6C1 /* APIService+Thread.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F1426241FDF00E5B6C1 /* APIService+Thread.swift */; }; DB938F1F2624382F00E5B6C1 /* ThreadViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F1E2624382F00E5B6C1 /* ThreadViewModel+Diffable.swift */; }; DB938F3326243D6200E5B6C1 /* TimelineTopLoaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB938F3226243D6200E5B6C1 /* TimelineTopLoaderTableViewCell.swift */; }; - DB98336B25C9420100AD9700 /* APIService+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98336A25C9420100AD9700 /* APIService+App.swift */; }; - DB98337125C9443200AD9700 /* APIService+Authentication.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98337025C9443200AD9700 /* APIService+Authentication.swift */; }; - DB98337F25C9452D00AD9700 /* APIService+APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98337E25C9452D00AD9700 /* APIService+APIError.swift */; }; - DB98339C25C96DE600AD9700 /* APIService+Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98339B25C96DE600AD9700 /* APIService+Account.swift */; }; DB98EB4727B0DFAA0082E365 /* ReportStatusViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98EB4627B0DFAA0082E365 /* ReportStatusViewModel+State.swift */; }; DB98EB4927B0F0CD0082E365 /* ReportStatusTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98EB4827B0F0CD0082E365 /* ReportStatusTableViewCell.swift */; }; DB98EB4C27B0F2BC0082E365 /* ReportStatusTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98EB4B27B0F2BC0082E365 /* ReportStatusTableViewCell+ViewModel.swift */; }; @@ -476,26 +369,18 @@ DB98EB6B27B243470082E365 /* SettingsAppearanceTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98EB6A27B243470082E365 /* SettingsAppearanceTableViewCell+ViewModel.swift */; }; DB9A486C26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9A486B26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift */; }; DB9A488A26034D40008B817C /* ComposeViewModel+PublishState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9A488926034D40008B817C /* ComposeViewModel+PublishState.swift */; }; - DB9A489026035963008B817C /* APIService+Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9A488F26035963008B817C /* APIService+Media.swift */; }; - DB9A48962603685D008B817C /* MastodonAttachmentService+UploadState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9A48952603685D008B817C /* MastodonAttachmentService+UploadState.swift */; }; DB9D6BE925E4F5340051B173 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D6BE825E4F5340051B173 /* SearchViewController.swift */; }; DB9D6BF825E4F5690051B173 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D6BF725E4F5690051B173 /* NotificationViewController.swift */; }; DB9D6BFF25E4F5940051B173 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D6BFE25E4F5940051B173 /* ProfileViewController.swift */; }; - DB9D7C21269824B80054B3DF /* APIService+Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9D7C20269824B80054B3DF /* APIService+Filter.swift */; }; DB9E0D6F25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */; }; DB9F58EC26EF435000E7BBE9 /* AccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */; }; DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */; }; DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */; }; - DBA088DF26958164003EB4B2 /* UserFetchedResultsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA088DE26958164003EB4B2 /* UserFetchedResultsController.swift */; }; DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */; }; - DBA465932696B495002B41DB /* APIService+WebFinger.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465922696B495002B41DB /* APIService+WebFinger.swift */; }; - DBA465952696E387002B41DB /* AppPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA465942696E387002B41DB /* AppPreference.swift */; }; DBA4B0F626C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; }; DBA4B0F726C269880077136E /* Intents.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = DBA4B0F926C269880077136E /* Intents.stringsdict */; }; - DBA5A52F26F07ED800CACBAA /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = DBA5A52E26F07ED800CACBAA /* PanModal */; }; DBA5A53126F08EF000CACBAA /* DragIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */; }; DBA5A53526F0A36A00CACBAA /* AddAccountTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5A53426F0A36A00CACBAA /* AddAccountTableViewCell.swift */; }; - DBA5E7A3263AD0A3004598BB /* PhotoLibraryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */; }; DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */; }; DBA5E7A9263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */; }; DBA5E7AB263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA5E7AA263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift */; }; @@ -504,12 +389,6 @@ DBA9443E265CFA6400C537E1 /* ProfileFieldCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA9443D265CFA6400C537E1 /* ProfileFieldCollectionViewCell.swift */; }; DBA94440265D137600C537E1 /* Mastodon+Entity+Field.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBA9443F265D137600C537E1 /* Mastodon+Entity+Field.swift */; }; DBABE3EC25ECAC4B00879EE5 /* WelcomeIllustrationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBABE3EB25ECAC4B00879EE5 /* WelcomeIllustrationView.swift */; }; - DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */ = {isa = PBXBuildFile; productRef = DBAC6482267D0B21007FE9FD /* DifferenceKit */; }; - DBAC649E267DFE43007FE9FD /* DiffableDataSources in Frameworks */ = {isa = PBXBuildFile; productRef = DBAC649D267DFE43007FE9FD /* DiffableDataSources */; }; - DBAC64A1267E6D02007FE9FD /* Fuzi in Frameworks */ = {isa = PBXBuildFile; productRef = DBAC64A0267E6D02007FE9FD /* Fuzi */; }; - DBAE3F8E2616E0B1004B8251 /* APIService+Block.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAE3F8D2616E0B1004B8251 /* APIService+Block.swift */; }; - DBAE3F942616E28B004B8251 /* APIService+Follow.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAE3F932616E28B004B8251 /* APIService+Follow.swift */; }; - DBAE3F9E2616E308004B8251 /* APIService+Mute.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAE3F9D2616E308004B8251 /* APIService+Mute.swift */; }; DBAE3FAF26172FC0004B8251 /* RemoteProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAE3FAE26172FC0004B8251 /* RemoteProfileViewModel.swift */; }; DBB3BA2A26A81C020004F2D4 /* FLAnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB3BA2926A81C020004F2D4 /* FLAnimatedImageView.swift */; }; DBB3BA2B26A81D060004F2D4 /* FLAnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB3BA2926A81C020004F2D4 /* FLAnimatedImageView.swift */; }; @@ -518,7 +397,6 @@ DBB45B5B27B3A109002DC5A7 /* MediaPreviewTransitionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB45B5A27B3A109002DC5A7 /* MediaPreviewTransitionViewController.swift */; }; DBB45B6027B50A4F002DC5A7 /* RecommendAccountItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB45B5F27B50A4F002DC5A7 /* RecommendAccountItem.swift */; }; DBB45B6227B51112002DC5A7 /* SuggestionAccountViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB45B6127B51112002DC5A7 /* SuggestionAccountViewModel+Diffable.swift */; }; - DBB525082611EAC0002F1F29 /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = DBB525072611EAC0002F1F29 /* Tabman */; }; DBB525212611EBD6002F1F29 /* ProfilePagingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB525202611EBD6002F1F29 /* ProfilePagingViewController.swift */; }; DBB525302611EBF3002F1F29 /* ProfilePagingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB5252F2611EBF3002F1F29 /* ProfilePagingViewModel.swift */; }; DBB525362611ECEB002F1F29 /* UserTimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB525352611ECEB002F1F29 /* UserTimelineViewController.swift */; }; @@ -528,14 +406,10 @@ DBB5255E2611F07A002F1F29 /* ProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB5255D2611F07A002F1F29 /* ProfileViewModel.swift */; }; DBB525642612C988002F1F29 /* MeProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB525632612C988002F1F29 /* MeProfileViewModel.swift */; }; DBB8AB4626AECDE200F6D281 /* SendPostIntentHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB8AB4526AECDE200F6D281 /* SendPostIntentHandler.swift */; }; - DBB8AB4A26AED0B500F6D281 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB8AB4926AED0B500F6D281 /* APIService.swift */; }; - DBB8AB4C26AED11300F6D281 /* APIService+APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98337E25C9452D00AD9700 /* APIService+APIError.swift */; }; DBB8AB4F26AED13F00F6D281 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB427DDE25BAA00100D1B89D /* Assets.xcassets */; }; - DBB8AB5226AED1B300F6D281 /* APIService+Status+Publish.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF07A26A6BCE8006D7ED1 /* APIService+Status+Publish.swift */; }; DBB9759C262462E1004620BD /* ThreadMetaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBB9759B262462E1004620BD /* ThreadMetaView.swift */; }; DBBC24A826A52F9000398BB9 /* ComposeToolbarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC24A726A52F9000398BB9 /* ComposeToolbarView.swift */; }; DBBC24AC26A53D9300398BB9 /* ComposeStatusContentTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC24AB26A53D9300398BB9 /* ComposeStatusContentTableViewCell.swift */; }; - DBBC24CB26A546C000398BB9 /* ThemePreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */; }; DBBC24DC26A54BCB00398BB9 /* MastodonRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBC24D626A54BCB00398BB9 /* MastodonRegex.swift */; }; DBBE1B4525F3474B0081417A /* MastodonPickServerAppearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBE1B4425F3474B0081417A /* MastodonPickServerAppearance.swift */; }; DBBF1DBF2652401B00E5B703 /* AutoCompleteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBBF1DBE2652401B00E5B703 /* AutoCompleteViewModel.swift */; }; @@ -550,22 +424,15 @@ DBC6462326A1712000B0E31B /* ShareViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC6462226A1712000B0E31B /* ShareViewModel.swift */; }; DBC6462826A1736300B0E31B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DB427DDE25BAA00100D1B89D /* Assets.xcassets */; }; DBC7A672260C897100E57475 /* StatusContentWarningEditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC7A671260C897100E57475 /* StatusContentWarningEditorView.swift */; }; - DBC7A67C260DFADE00E57475 /* StatusPublishService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBC7A67B260DFADE00E57475 /* StatusPublishService.swift */; }; DBCA0EBC282BB38A0029E2B0 /* PageboyNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCA0EBB282BB38A0029E2B0 /* PageboyNavigateable.swift */; }; DBCBCBF4267CB070000F5B51 /* Decode85.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCBCBF3267CB070000F5B51 /* Decode85.swift */; }; - DBCBCC0D2680B908000F5B51 /* HomeTimelinePreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCBCC0C2680B908000F5B51 /* HomeTimelinePreference.swift */; }; DBCBED1726132DB500B49291 /* UserTimelineViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCBED1626132DB500B49291 /* UserTimelineViewModel+Diffable.swift */; }; - DBCBED1D26132E1A00B49291 /* StatusFetchedResultsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCBED1C26132E1A00B49291 /* StatusFetchedResultsController.swift */; }; DBCC3B30261440A50045B23D /* UITabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B2F261440A50045B23D /* UITabBarController.swift */; }; DBCC3B8F26148F7B0045B23D /* CachedProfileViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */; }; - DBCC3B9526157E6E0045B23D /* APIService+Relationship.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCC3B9426157E6E0045B23D /* APIService+Relationship.swift */; }; - DBCCC71E25F73297007E1AB6 /* APIService+Reblog.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBCCC71D25F73297007E1AB6 /* APIService+Reblog.swift */; }; - DBD376AC2692ECDB007FEC24 /* ThemePreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */; }; DBD376B2269302A4007FEC24 /* UITableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD376B1269302A4007FEC24 /* UITableViewCell.swift */; }; DBD5B1F627BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F527BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift */; }; DBD5B1F827BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */; }; DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */; }; - DBD9149025DF6D8D00903DFD /* APIService+Onboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD9148F25DF6D8D00903DFD /* APIService+Onboarding.swift */; }; DBDFF1902805543100557A48 /* DiscoveryPostsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */; }; DBDFF1932805554900557A48 /* DiscoveryPostsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF1922805554900557A48 /* DiscoveryPostsViewModel.swift */; }; DBDFF1952805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF1942805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift */; }; @@ -575,17 +442,12 @@ DBDFF19E2805703700557A48 /* DiscoveryPostsViewController+DataSourceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBDFF19D2805703700557A48 /* DiscoveryPostsViewController+DataSourceProvider.swift */; }; DBE0821525CD382600FD6BBD /* MastodonRegisterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE0821425CD382600FD6BBD /* MastodonRegisterViewController.swift */; }; DBE0822425CD3F1E00FD6BBD /* MastodonRegisterViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE0822325CD3F1E00FD6BBD /* MastodonRegisterViewModel.swift */; }; - DBE3CA6827A39CAB00AFE27B /* AppShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; }; - DBE3CA6B27A39CAF00AFE27B /* AppShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; }; - DBE3CA6E27A39CB300AFE27B /* AppShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB68047F2637CD4C00430867 /* AppShared.framework */; }; DBE3CDBB261C427900430CC6 /* TimelineHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CDBA261C427900430CC6 /* TimelineHeaderTableViewCell.swift */; }; DBE3CDCF261C42ED00430CC6 /* TimelineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CDCE261C42ED00430CC6 /* TimelineHeaderView.swift */; }; DBE3CDEC261C6B2900430CC6 /* FavoriteViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CDEB261C6B2900430CC6 /* FavoriteViewController.swift */; }; DBE3CDFB261C6CA500430CC6 /* FavoriteViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CDFA261C6CA500430CC6 /* FavoriteViewModel.swift */; }; DBE3CE01261D623D00430CC6 /* FavoriteViewModel+State.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CE00261D623D00430CC6 /* FavoriteViewModel+State.swift */; }; DBE3CE07261D6A0E00430CC6 /* FavoriteViewModel+Diffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3CE06261D6A0E00430CC6 /* FavoriteViewModel+Diffable.swift */; }; - DBE54AC62636C89F004E7C0B /* NotificationPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */; }; - DBE54ACC2636C8FD004E7C0B /* NotificationPreference.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */; }; DBEFCD71282A12B200C0ABEA /* ReportReasonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBEFCD70282A12B200C0ABEA /* ReportReasonViewController.swift */; }; DBEFCD74282A130400C0ABEA /* ReportReasonViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBEFCD73282A130400C0ABEA /* ReportReasonViewModel.swift */; }; DBEFCD76282A143F00C0ABEA /* ReportStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBEFCD75282A143F00C0ABEA /* ReportStatusViewController.swift */; }; @@ -603,7 +465,6 @@ DBF1D257269DBAC600C1C08A /* SearchDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF1D256269DBAC600C1C08A /* SearchDetailViewModel.swift */; }; DBF3B73F2733EAED00E21627 /* local-codes.json in Resources */ = {isa = PBXBuildFile; fileRef = DBF3B73E2733EAED00E21627 /* local-codes.json */; }; DBF3B7412733EB9400E21627 /* MastodonLocalCode.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */; }; - DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */ = {isa = PBXBuildFile; productRef = DBF7A0FB26830C33004176A2 /* FPSIndicator */; }; DBF8AE16263293E400C9C23C /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF8AE15263293E400C9C23C /* NotificationService.swift */; }; DBF8AE1A263293E400C9C23C /* NotificationService.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = DBF8AE13263293E400C9C23C /* NotificationService.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; DBF96326262EC0A6001D8D25 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBF96325262EC0A6001D8D25 /* AuthenticationServices.framework */; }; @@ -621,12 +482,6 @@ DBFEF06026A57715006D7ED1 /* StatusAttachmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF05A26A576EE006D7ED1 /* StatusAttachmentView.swift */; }; DBFEF06326A577F2006D7ED1 /* StatusAttachmentViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF06226A577F2006D7ED1 /* StatusAttachmentViewModel.swift */; }; DBFEF06D26A67FB7006D7ED1 /* StatusAttachmentViewModel+UploadState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF06C26A67FB7006D7ED1 /* StatusAttachmentViewModel+UploadState.swift */; }; - DBFEF06F26A690C4006D7ED1 /* APIService+APIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98337E25C9452D00AD9700 /* APIService+APIError.swift */; }; - DBFEF07326A6913D006D7ED1 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF07226A6913D006D7ED1 /* APIService.swift */; }; - DBFEF07526A69192006D7ED1 /* APIService+Media.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB9A488F26035963008B817C /* APIService+Media.swift */; }; - DBFEF07B26A6BCE8006D7ED1 /* APIService+Status+Publish.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF07A26A6BCE8006D7ED1 /* APIService+Status+Publish.swift */; }; - DBFEF07C26A6BD0A006D7ED1 /* APIService+Status+Publish.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBFEF07A26A6BCE8006D7ED1 /* APIService+Status+Publish.swift */; }; - EE93E8E8F9E0C39EAAEBD92F /* Pods_AppShared.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4A2A2D7000E477CA459ADA9 /* Pods_AppShared.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -644,20 +499,6 @@ remoteGlobalIDString = DB427DD125BAA00100D1B89D; remoteInfo = Mastodon; }; - DB6804842637CD4C00430867 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; - proxyType = 1; - remoteGlobalIDString = DB68047E2637CD4C00430867; - remoteInfo = AppShared; - }; - DB6804A72637CDCC00430867 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; - proxyType = 1; - remoteGlobalIDString = DB68047E2637CD4C00430867; - remoteInfo = AppShared; - }; DB8FABCC26AEC7B2008E5AF4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; @@ -665,13 +506,6 @@ remoteGlobalIDString = DB8FABC526AEC7B2008E5AF4; remoteInfo = MastodonIntent; }; - DB8FABD926AEC873008E5AF4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; - proxyType = 1; - remoteGlobalIDString = DB68047E2637CD4C00430867; - remoteInfo = AppShared; - }; DBC6461A26A170AB00B0E31B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; @@ -679,13 +513,6 @@ remoteGlobalIDString = DBC6461126A170AB00B0E31B; remoteInfo = ShareActionExtension; }; - DBC6463526A195DB00B0E31B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; - proxyType = 1; - remoteGlobalIDString = DB68047E2637CD4C00430867; - remoteInfo = AppShared; - }; DBF8AE18263293E400C9C23C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = DB427DCA25BAA00100D1B89D /* Project object */; @@ -702,7 +529,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - DB6804872637CD4C00430867 /* AppShared.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -729,9 +555,7 @@ 0F2021FA2613262F000C64BF /* HashtagTimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineViewController.swift; sourceTree = ""; }; 0F202200261326E6000C64BF /* HashtagTimelineViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HashtagTimelineViewModel.swift; sourceTree = ""; }; 0F20220626134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HashtagTimelineViewModel+Diffable.swift"; sourceTree = ""; }; - 0F202212261351F5000C64BF /* APIService+HashtagTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+HashtagTimeline.swift"; sourceTree = ""; }; 0F20222C261457EE000C64BF /* HashtagTimelineViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HashtagTimelineViewModel+State.swift"; sourceTree = ""; }; - 0F20223826146553000C64BF /* Array.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Array.swift; sourceTree = ""; }; 0FAA0FDE25E0B57E0017CCDE /* WelcomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeViewController.swift; sourceTree = ""; }; 0FAA101125E105390017CCDE /* PrimaryActionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrimaryActionButton.swift; sourceTree = ""; }; 0FAA101B25E10E760017CCDE /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = ""; }; @@ -749,8 +573,6 @@ 2D206B9125F60EA700143C56 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = ""; }; 2D24E1222626ED9D00A59D4F /* UIView+Gesture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Gesture.swift"; sourceTree = ""; }; 2D32EAAB25CB96DC00C9ED86 /* TimelineMiddleLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineMiddleLoaderTableViewCell.swift; sourceTree = ""; }; - 2D34D9D026148D9E0081BFC0 /* APIService+Recommend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Recommend.swift"; sourceTree = ""; }; - 2D34D9DA261494120081BFC0 /* APIService+Search.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Search.swift"; sourceTree = ""; }; 2D35237926256D920031AF25 /* NotificationSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationSection.swift; sourceTree = ""; }; 2D364F7125E66D7500204FDC /* MastodonResendEmailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonResendEmailViewController.swift; sourceTree = ""; }; 2D364F7725E66D8300204FDC /* MastodonResendEmailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonResendEmailViewModel.swift; sourceTree = ""; }; @@ -771,8 +593,6 @@ 2D5A3D3725CF8D9F002347D6 /* ScrollViewContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewContainer.swift; sourceTree = ""; }; 2D5A3D6125CFD9CB002347D6 /* HomeTimelineViewController+DebugAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HomeTimelineViewController+DebugAction.swift"; sourceTree = ""; }; 2D607AD726242FC500B70763 /* NotificationViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewModel.swift; sourceTree = ""; }; - 2D61254C262547C200299647 /* APIService+Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Notification.swift"; sourceTree = ""; }; - 2D61335D25C1894B00CAE157 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; 2D650FAA25ECDC9300851B58 /* Mastodon+Entity+Error+Detail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Entity+Error+Detail.swift"; sourceTree = ""; }; 2D694A7325F9EB4E0038ADDC /* ContentWarningOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentWarningOverlayView.swift; sourceTree = ""; }; 2D6DE3FF26141DF600A63F6A /* SearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewModel.swift; sourceTree = ""; }; @@ -784,13 +604,9 @@ 2D8434F425FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTimelineNavigationBarTitleViewModel.swift; sourceTree = ""; }; 2D8434FA25FF46B300EECE90 /* HomeTimelineNavigationBarTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTimelineNavigationBarTitleView.swift; sourceTree = ""; }; 2D84350425FF858100EECE90 /* UIScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIScrollView.swift; sourceTree = ""; }; - 2D8FCA072637EABB00137F46 /* APIService+FollowRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+FollowRequest.swift"; sourceTree = ""; }; 2D939AB425EDD8A90076FA61 /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; 2D939AE725EE1CF80076FA61 /* MastodonRegisterViewController+Avatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewController+Avatar.swift"; sourceTree = ""; }; - 2D9DB966263A76FB007C1D71 /* BlockDomainService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockDomainService.swift; sourceTree = ""; }; - 2D9DB96A263A91D1007C1D71 /* APIService+DomainBlock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+DomainBlock.swift"; sourceTree = ""; }; 2DA504682601ADE7008F4E6C /* SawToothView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SawToothView.swift; sourceTree = ""; }; - 2DA6054625F716A2006356F9 /* PlaybackState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackState.swift; sourceTree = ""; }; 2DA7D04325CA52B200804E11 /* TimelineLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineLoaderTableViewCell.swift; sourceTree = ""; }; 2DA7D04925CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineBottomLoaderTableViewCell.swift; sourceTree = ""; }; 2DA7D05025CA545E00804E11 /* LoadMoreConfigurableTableViewContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadMoreConfigurableTableViewContainer.swift; sourceTree = ""; }; @@ -801,7 +617,6 @@ 2DCB73FC2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecommendCollectionHeader.swift; sourceTree = ""; }; 2DE0FACD2615F7AD00CDF649 /* RecommendAccountSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendAccountSection.swift; sourceTree = ""; }; 2DF123A625C3B0210020F248 /* ActiveLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveLabel.swift; sourceTree = ""; }; - 2DF75BA625D10E1000694EC8 /* APIService+Favorite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Favorite.swift"; sourceTree = ""; }; 2E1F6A67FDF9771D3E064FDC /* Pods-Mastodon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon.debug.xcconfig"; path = "Target Support Files/Pods-Mastodon/Pods-Mastodon.debug.xcconfig"; sourceTree = ""; }; 3B7FD8F28DDA8FBCE5562B78 /* Pods-NotificationService.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationService.asdk - debug.xcconfig"; path = "Target Support Files/Pods-NotificationService/Pods-NotificationService.asdk - debug.xcconfig"; sourceTree = ""; }; 3C030226D3C73DCC23D67452 /* Pods_Mastodon_MastodonUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Mastodon_MastodonUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -811,14 +626,11 @@ 46DAB0EBDDFB678347CD96FF /* Pods-MastodonTests.asdk - release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonTests.asdk - release.xcconfig"; path = "Target Support Files/Pods-MastodonTests/Pods-MastodonTests.asdk - release.xcconfig"; sourceTree = ""; }; 5B24BBD7262DB14800A9381B /* ReportViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReportViewModel.swift; sourceTree = ""; }; 5B24BBD8262DB14800A9381B /* ReportStatusViewModel+Diffable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "ReportStatusViewModel+Diffable.swift"; sourceTree = ""; }; - 5B24BBE1262DB19100A9381B /* APIService+Report.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "APIService+Report.swift"; sourceTree = ""; }; 5B90C456262599800002E742 /* SettingsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewModel.swift; sourceTree = ""; }; 5B90C459262599800002E742 /* SettingsToggleTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsToggleTableViewCell.swift; sourceTree = ""; }; 5B90C45A262599800002E742 /* SettingsAppearanceTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsAppearanceTableViewCell.swift; sourceTree = ""; }; 5B90C45B262599800002E742 /* SettingsLinkTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsLinkTableViewCell.swift; sourceTree = ""; }; 5B90C45C262599800002E742 /* SettingsSectionHeader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsSectionHeader.swift; sourceTree = ""; }; - 5B90C48426259BF10002E742 /* APIService+Subscriptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "APIService+Subscriptions.swift"; sourceTree = ""; }; - 5B90C48A26259C120002E742 /* APIService+CoreData+Subscriptions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "APIService+CoreData+Subscriptions.swift"; sourceTree = ""; }; 5BB04FD4262E7AFF0043BFF6 /* ReportViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportViewController.swift; sourceTree = ""; }; 5BB04FF4262F0E6D0043BFF6 /* ReportSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportSection.swift; sourceTree = ""; }; 5CE45680252519F42FEA2D13 /* Pods-ShareActionExtension.asdk - release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareActionExtension.asdk - release.xcconfig"; path = "Target Support Files/Pods-ShareActionExtension/Pods-ShareActionExtension.asdk - release.xcconfig"; sourceTree = ""; }; @@ -831,7 +643,6 @@ 5DDDF1A82617489F00311060 /* Mastodon+Entity+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Entity+History.swift"; sourceTree = ""; }; 5DF1056325F887CB00D6C0D4 /* AVPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVPlayer.swift; sourceTree = ""; }; 6130CBE4B26E3C976ACC1688 /* Pods-ShareActionExtension.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ShareActionExtension.asdk - debug.xcconfig"; path = "Target Support Files/Pods-ShareActionExtension/Pods-ShareActionExtension.asdk - debug.xcconfig"; sourceTree = ""; }; - 6213AF5728939C4700BCADB6 /* APIService+Bookmark.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "APIService+Bookmark.swift"; sourceTree = ""; }; 6213AF5928939C8400BCADB6 /* BookmarkViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkViewModel.swift; sourceTree = ""; }; 6213AF5B28939C8A00BCADB6 /* BookmarkViewModel+State.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BookmarkViewModel+State.swift"; sourceTree = ""; }; 6213AF5D2893A8B200BCADB6 /* DataSourceFacade+Bookmark.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Bookmark.swift"; sourceTree = ""; }; @@ -868,9 +679,6 @@ DB023D2927A0FE5C005AC798 /* DataSourceProvider+NotificationTableViewCellDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+NotificationTableViewCellDelegate.swift"; sourceTree = ""; }; DB023D2B27A10464005AC798 /* NotificationTimelineViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationTimelineViewController+DataSourceProvider.swift"; sourceTree = ""; }; DB025B77278D606A002F581E /* StatusItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusItem.swift; sourceTree = ""; }; - DB025B92278D6501002F581E /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; - DB025B94278D6530002F581E /* Persistence+MastodonUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+MastodonUser.swift"; sourceTree = ""; }; - DB025B96278D66D5002F581E /* MastodonUser+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonUser+Property.swift"; sourceTree = ""; }; DB029E94266A20430062874E /* MastodonAuthenticationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonAuthenticationController.swift; sourceTree = ""; }; DB02CDAA26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadReplyLoaderTableViewCell.swift; sourceTree = ""; }; DB02CDBE2625AE5000D0A2AF /* AdaptiveUserInterfaceStyleBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdaptiveUserInterfaceStyleBarButtonItem.swift; sourceTree = ""; }; @@ -878,7 +686,6 @@ DB03A794272A981400EE37C5 /* ContentSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentSplitViewController.swift; sourceTree = ""; }; DB03F7F22689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeRepliedToStatusContentTableViewCell.swift; sourceTree = ""; }; DB03F7F42689B782007B274C /* ComposeTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeTableView.swift; sourceTree = ""; }; - DB040ED026538E3C00BEE9D8 /* Trie.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Trie.swift; sourceTree = ""; }; DB0617EA277EF3820030EE79 /* GradientBorderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientBorderView.swift; sourceTree = ""; }; DB0617EC277F02C50030EE79 /* OnboardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNavigationController.swift; sourceTree = ""; }; DB0617EE277F12720030EE79 /* NavigationActionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationActionView.swift; sourceTree = ""; }; @@ -891,9 +698,7 @@ DB0618042785A73D0030EE79 /* RegisterItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterItem.swift; sourceTree = ""; }; DB0618062785A8880030EE79 /* MastodonRegisterViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonRegisterViewModel+Diffable.swift"; sourceTree = ""; }; DB0618092785B2AB0030EE79 /* MastodonRegisterAvatarTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonRegisterAvatarTableViewCell.swift; sourceTree = ""; }; - DB084B5625CBC56C00F898ED /* Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = ""; }; DB0A322D280EE9FD001729D2 /* DiscoveryIntroBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryIntroBannerView.swift; sourceTree = ""; }; - DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Instance.swift"; sourceTree = ""; }; DB0C947626A7FE840088FB11 /* NotificationAvatarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationAvatarButton.swift; sourceTree = ""; }; DB0EF72A26FDB1D200347686 /* SidebarListCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListCollectionViewCell.swift; sourceTree = ""; }; DB0EF72D26FDB24F00347686 /* SidebarListContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarListContentView.swift; sourceTree = ""; }; @@ -902,8 +707,6 @@ DB0F9D53283EB3C000379AF8 /* ProfileHeaderView+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProfileHeaderView+ViewModel.swift"; sourceTree = ""; }; DB0F9D55283EB46200379AF8 /* ProfileHeaderView+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProfileHeaderView+Configuration.swift"; sourceTree = ""; }; DB0FCB67279507EF006C02E2 /* DataSourceFacade+Meta.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Meta.swift"; sourceTree = ""; }; - DB0FCB6B27950E29006C02E2 /* MastodonMentionContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonMentionContainer.swift; sourceTree = ""; }; - DB0FCB6D27950E6B006C02E2 /* MastodonMention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonMention.swift; sourceTree = ""; }; DB0FCB6F27951368006C02E2 /* TimelineMiddleLoaderTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TimelineMiddleLoaderTableViewCell+ViewModel.swift"; sourceTree = ""; }; DB0FCB7127952986006C02E2 /* NamingState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamingState.swift; sourceTree = ""; }; DB0FCB7327956939006C02E2 /* DataSourceFacade+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Status.swift"; sourceTree = ""; }; @@ -919,7 +722,6 @@ DB0FCB872796BDA9006C02E2 /* SearchItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchItem.swift; sourceTree = ""; }; DB0FCB8B2796BF8D006C02E2 /* SearchViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchViewModel+Diffable.swift"; sourceTree = ""; }; DB0FCB8D2796C0B7006C02E2 /* TrendCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendCollectionViewCell.swift; sourceTree = ""; }; - DB0FCB8F2796C5EB006C02E2 /* APIService+Trend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Trend.swift"; sourceTree = ""; }; DB0FCB912796DE19006C02E2 /* TrendSectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrendSectionHeaderCollectionReusableView.swift; sourceTree = ""; }; DB0FCB932797E2B0006C02E2 /* SearchResultViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewModel+Diffable.swift"; sourceTree = ""; }; DB0FCB952797E6C2006C02E2 /* SearchResultViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchResultViewController+DataSourceProvider.swift"; sourceTree = ""; }; @@ -942,21 +744,9 @@ DB1FD45925F27898004CFCFC /* CategoryPickerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryPickerItem.swift; sourceTree = ""; }; DB1FD45F25F278AF004CFCFC /* CategoryPickerSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryPickerSection.swift; sourceTree = ""; }; DB221B15260C395900AEFE46 /* CustomEmojiPickerInputViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEmojiPickerInputViewModel.swift; sourceTree = ""; }; - DB297B1A2679FAE200704C90 /* PlaceholderImageCacheService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaceholderImageCacheService.swift; sourceTree = ""; }; DB2B3ABD25E37E15007045F9 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; DB2F073325E8ECF000957B2D /* AuthenticationViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationViewModel.swift; sourceTree = ""; }; DB2FF50F260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusPollExpiresOptionCollectionViewCell.swift; sourceTree = ""; }; - DB336F20278D6D960031E64B /* MastodonEmoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonEmoji.swift; sourceTree = ""; }; - DB336F22278D6DED0031E64B /* MastodonEmojiContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonEmojiContainer.swift; sourceTree = ""; }; - DB336F27278D6EC70031E64B /* MastodonFieldContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonFieldContainer.swift; sourceTree = ""; }; - DB336F29278D6F2B0031E64B /* MastodonField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonField.swift; sourceTree = ""; }; - DB336F2B278D6FC30031E64B /* Persistence+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+Status.swift"; sourceTree = ""; }; - DB336F2D278D71AF0031E64B /* Status+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Status+Property.swift"; sourceTree = ""; }; - DB336F31278D77330031E64B /* Persistence+Poll.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+Poll.swift"; sourceTree = ""; }; - DB336F33278D77730031E64B /* Persistence+PollOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+PollOption.swift"; sourceTree = ""; }; - DB336F35278D77A40031E64B /* PollOption+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PollOption+Property.swift"; sourceTree = ""; }; - DB336F37278D7AAF0031E64B /* Poll+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Poll+Property.swift"; sourceTree = ""; }; - DB336F3C278D80040031E64B /* FeedFetchedResultsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedFetchedResultsController.swift; sourceTree = ""; }; DB336F3E278E668C0031E64B /* StatusTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StatusTableViewCell+ViewModel.swift"; sourceTree = ""; }; DB336F40278E68480031E64B /* StatusView+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StatusView+Configuration.swift"; sourceTree = ""; }; DB336F42278EB1680031E64B /* MediaView+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MediaView+Configuration.swift"; sourceTree = ""; }; @@ -972,7 +762,6 @@ DB3E6FE12806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryHashtagsViewModel+Diffable.swift"; sourceTree = ""; }; DB3E6FE32806A5B800B035AE /* DiscoverySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoverySection.swift; sourceTree = ""; }; DB3E6FE62806A7A200B035AE /* DiscoveryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryItem.swift; sourceTree = ""; }; - DB3E6FE82806BD2200B035AE /* ThemeService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeService.swift; sourceTree = ""; }; DB3E6FEB2806D7F100B035AE /* DiscoveryNewsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryNewsViewController.swift; sourceTree = ""; }; DB3E6FEE2806D82600B035AE /* DiscoveryNewsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryNewsViewModel.swift; sourceTree = ""; }; DB3E6FF02806D96900B035AE /* DiscoveryNewsViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryNewsViewModel+Diffable.swift"; sourceTree = ""; }; @@ -983,7 +772,6 @@ DB3EA8E5281B79E200598866 /* DiscoveryCommunityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryCommunityViewController.swift; sourceTree = ""; }; DB3EA8E8281B7A3700598866 /* DiscoveryCommunityViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryCommunityViewModel.swift; sourceTree = ""; }; DB3EA8EA281B7E0700598866 /* DiscoveryCommunityViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryCommunityViewModel+State.swift"; sourceTree = ""; }; - DB3EA8EC281B810100598866 /* APIService+PublicTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+PublicTimeline.swift"; sourceTree = ""; }; DB3EA8EE281B837000598866 /* DiscoveryCommunityViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryCommunityViewController+DataSourceProvider.swift"; sourceTree = ""; }; DB3EA8F0281B9EF600598866 /* DiscoveryCommunityViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryCommunityViewModel+Diffable.swift"; sourceTree = ""; }; DB427DD225BAA00100D1B89D /* Mastodon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Mastodon.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1008,22 +796,11 @@ DB4481B825EE289600BEFB67 /* UITableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITableView.swift; sourceTree = ""; }; DB45FAB525CA5485005A8AC7 /* UIAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIAlertController.swift; sourceTree = ""; }; DB45FAD625CA6C76005A8AC7 /* UIBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIBarButtonItem.swift; sourceTree = ""; }; - DB45FAE225CA7181005A8AC7 /* MastodonUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonUser.swift; sourceTree = ""; }; - DB45FAF825CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+CoreData+MastodonAuthentication.swift"; sourceTree = ""; }; - DB45FB0E25CA87D0005A8AC7 /* AuthenticationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationService.swift; sourceTree = ""; }; - DB45FB1C25CA9D23005A8AC7 /* APIService+HomeTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+HomeTimeline.swift"; sourceTree = ""; }; - DB47229625F9EFAD00DA7F53 /* NSManagedObjectContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSManagedObjectContext.swift; sourceTree = ""; }; DB47AB6127CF752B00CD73C7 /* MastodonUISnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonUISnapshotTests.swift; sourceTree = ""; }; DB47AB6327CF858400CD73C7 /* AppStoreSnapshotTestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = AppStoreSnapshotTestPlan.xctestplan; sourceTree = ""; }; DB482A3E261331E8008AE74C /* UserTimelineViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserTimelineViewModel+State.swift"; sourceTree = ""; }; - DB482A4A261340A7008AE74C /* APIService+UserTimeline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+UserTimeline.swift"; sourceTree = ""; }; - DB4924E126312AB200E9DB22 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; DB4932B026F1FB5300EF46D4 /* WizardCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardCardView.swift; sourceTree = ""; }; DB4932B826F31AD300EF46D4 /* BadgeButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeButton.swift; sourceTree = ""; }; - DB49A61325FF2C5600B98345 /* EmojiService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiService.swift; sourceTree = ""; }; - DB49A61E25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EmojiService+CustomEmojiViewModel.swift"; sourceTree = ""; }; - DB49A62425FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EmojiService+CustomEmojiViewModel+LoadState.swift"; sourceTree = ""; }; - DB49A62A25FF36C700B98345 /* APIService+CustomEmoji.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+CustomEmoji.swift"; sourceTree = ""; }; DB4AA6B227BA34B6009EC082 /* CellFrameCacheContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellFrameCacheContainer.swift; sourceTree = ""; }; DB4B777F26CA4EFA00B087B3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Intents.strings; sourceTree = ""; }; DB4B778226CA4EFA00B087B3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -1046,7 +823,6 @@ DB4F097426A037F500D62E92 /* SearchHistoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryViewModel.swift; sourceTree = ""; }; DB4F097A26A039FF00D62E92 /* SearchHistorySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySection.swift; sourceTree = ""; }; DB4F097C26A03A5B00D62E92 /* SearchHistoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryItem.swift; sourceTree = ""; }; - DB4F097E26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistoryFetchedResultController.swift; sourceTree = ""; }; DB4FFC29269EC39600D62E92 /* SearchToSearchDetailViewControllerAnimatedTransitioning.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchToSearchDetailViewControllerAnimatedTransitioning.swift; sourceTree = ""; }; DB4FFC2A269EC39600D62E92 /* SearchTransitionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchTransitionController.swift; sourceTree = ""; }; DB519B09281BCA2E00F0C99D /* ckb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ckb; path = ckb.lproj/Intents.strings; sourceTree = ""; }; @@ -1064,8 +840,6 @@ DB519B15281BCC2F00F0C99D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Intents.strings; sourceTree = ""; }; DB519B16281BCC2F00F0C99D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; DB519B17281BCC2F00F0C99D /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Intents.stringsdict; sourceTree = ""; }; - DB564BD2269F3B35001E39A7 /* StatusFilterService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusFilterService.swift; sourceTree = ""; }; - DB59F10D25EF724F001F1DAB /* APIService+Poll.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Poll.swift"; sourceTree = ""; }; DB5B54992833A60400DEF8B2 /* FamiliarFollowersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewController.swift; sourceTree = ""; }; DB5B549C2833A67400DEF8B2 /* FamiliarFollowersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FamiliarFollowersViewModel.swift; sourceTree = ""; }; DB5B549E2833A72500DEF8B2 /* FamiliarFollowersViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FamiliarFollowersViewModel+Diffable.swift"; sourceTree = ""; }; @@ -1104,23 +878,17 @@ DB63F74E2799405600455B82 /* SearchHistoryViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewModel+Diffable.swift"; sourceTree = ""; }; DB63F751279944AA00455B82 /* SearchHistorySectionHeaderCollectionReusableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHistorySectionHeaderCollectionReusableView.swift; sourceTree = ""; }; DB63F7532799491600455B82 /* DataSourceFacade+SearchHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+SearchHistory.swift"; sourceTree = ""; }; - DB63F755279949BD00455B82 /* Persistence+SearchHistory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+SearchHistory.swift"; sourceTree = ""; }; DB63F759279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryUserCollectionViewCell+ViewModel.swift"; sourceTree = ""; }; - DB63F75B279956D000455B82 /* Persistence+Tag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+Tag.swift"; sourceTree = ""; }; - DB63F75D27995B3B00455B82 /* Tag+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Tag+Property.swift"; sourceTree = ""; }; DB63F76127996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SearchHistoryViewController+DataSourceProvider.swift"; sourceTree = ""; }; DB63F763279A5E3C00455B82 /* NotificationTimelineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewController.swift; sourceTree = ""; }; DB63F766279A5EB300455B82 /* NotificationTimelineViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTimelineViewModel.swift; sourceTree = ""; }; DB63F768279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationTimelineViewModel+Diffable.swift"; sourceTree = ""; }; DB63F76A279A5ED300455B82 /* NotificationTimelineViewModel+LoadOldestState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationTimelineViewModel+LoadOldestState.swift"; sourceTree = ""; }; DB63F76E279A7D1100455B82 /* NotificationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTableViewCell.swift; sourceTree = ""; }; - DB63F770279A858500455B82 /* Persistence+Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Persistence+Notification.swift"; sourceTree = ""; }; - DB63F772279A87DC00455B82 /* Notification+Property.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notification+Property.swift"; sourceTree = ""; }; DB63F774279A997D00455B82 /* NotificationTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationTableViewCell+ViewModel.swift"; sourceTree = ""; }; DB63F776279A9A2A00455B82 /* NotificationView+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationView+Configuration.swift"; sourceTree = ""; }; DB63F778279ABF9C00455B82 /* DataSourceFacade+Reblog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Reblog.swift"; sourceTree = ""; }; DB63F77A279ACAE500455B82 /* DataSourceFacade+Favorite.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Favorite.swift"; sourceTree = ""; }; - DB647C5826F1EA2700F7F82C /* WizardPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardPreference.swift; sourceTree = ""; }; DB64BA442851F23000ADF1B7 /* MastodonAuthentication+Fetch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonAuthentication+Fetch.swift"; sourceTree = ""; }; DB64BA472851F29300ADF1B7 /* Account+Fetch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Account+Fetch.swift"; sourceTree = ""; }; DB65C63627A2AF6C008BAC2E /* ReportItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportItem.swift; sourceTree = ""; }; @@ -1130,14 +898,7 @@ DB6746EA278ED8B0008A6B94 /* PollOptionView+Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PollOptionView+Configuration.swift"; sourceTree = ""; }; DB6746EC278F45F0008A6B94 /* AutoGenerateProtocolRelayDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoGenerateProtocolRelayDelegate.swift; sourceTree = ""; }; DB6746EF278F463B008A6B94 /* AutoGenerateProtocolDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoGenerateProtocolDelegate.swift; sourceTree = ""; }; - DB67D08327312970006A36CF /* APIService+Following.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Following.swift"; sourceTree = ""; }; DB67D08527312E67006A36CF /* WizardViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WizardViewController.swift; sourceTree = ""; }; - DB67D088273256D7006A36CF /* StoreReviewPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreReviewPreference.swift; sourceTree = ""; }; - DB68045A2636DC6A00430867 /* MastodonPushNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPushNotification.swift; sourceTree = ""; }; - DB68047F2637CD4C00430867 /* AppShared.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppShared.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DB6804812637CD4C00430867 /* AppShared.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppShared.h; sourceTree = ""; }; - DB6804822637CD4C00430867 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DB6804FC2637CFEC00430867 /* AppSecret.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSecret.swift; sourceTree = ""; }; DB68053E2638011000430867 /* NotificationService.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NotificationService.entitlements; sourceTree = ""; }; DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSKeyValueObservation.swift; sourceTree = ""; }; DB68A04925E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveStatusBarStyleNavigationController.swift; sourceTree = ""; }; @@ -1152,13 +913,11 @@ DB697DDE278F524F004EF2F7 /* DataSourceFacade+Profile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Profile.swift"; sourceTree = ""; }; DB697DE0278F5296004EF2F7 /* DataSourceFacade+Model.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceFacade+Model.swift"; sourceTree = ""; }; DB6988DD2848D11C002398EF /* PagerTabStripNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PagerTabStripNavigateable.swift; sourceTree = ""; }; - DB6B35172601FA3400DC1E11 /* MastodonAttachmentService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonAttachmentService.swift; sourceTree = ""; }; DB6B351D2601FAEE00DC1E11 /* ComposeStatusAttachmentCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusAttachmentCollectionViewCell.swift; sourceTree = ""; }; DB6B74EE272FB55000C70B6E /* FollowerListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerListViewController.swift; sourceTree = ""; }; DB6B74F1272FB67600C70B6E /* FollowerListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowerListViewModel.swift; sourceTree = ""; }; DB6B74F3272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowerListViewModel+Diffable.swift"; sourceTree = ""; }; DB6B74F5272FBCDB00C70B6E /* FollowerListViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FollowerListViewModel+State.swift"; sourceTree = ""; }; - DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Follower.swift"; sourceTree = ""; }; DB6B74FB272FF55800C70B6E /* UserSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSection.swift; sourceTree = ""; }; DB6B74FD272FF59000C70B6E /* UserItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserItem.swift; sourceTree = ""; }; DB6B74FF272FF73800C70B6E /* UserTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTableViewCell.swift; sourceTree = ""; }; @@ -1166,26 +925,15 @@ DB6C8C0E25F0A6AE00AAA452 /* Mastodon+Entity+Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Entity+Error.swift"; sourceTree = ""; }; DB6D1B43263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+API+Subscriptions+Policy.swift"; sourceTree = ""; }; DB6D9F3426351B7A008423CD /* NotificationService+Decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationService+Decrypt.swift"; sourceTree = ""; }; - DB6D9F4826353FD6008423CD /* Subscription.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Subscription.swift; sourceTree = ""; }; - DB6D9F4F2635761F008423CD /* SubscriptionAlerts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionAlerts.swift; sourceTree = ""; }; - DB6D9F56263577D2008423CD /* APIService+CoreData+Setting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+CoreData+Setting.swift"; sourceTree = ""; }; - DB6D9F6226357848008423CD /* SettingService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingService.swift; sourceTree = ""; }; - DB6D9F6E2635807F008423CD /* Setting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Setting.swift; sourceTree = ""; }; - DB6D9F75263587C7008423CD /* SettingFetchedResultController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingFetchedResultController.swift; sourceTree = ""; }; DB6D9F7C26358ED4008423CD /* SettingsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSection.swift; sourceTree = ""; }; DB6D9F8326358EEC008423CD /* SettingsItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsItem.swift; sourceTree = ""; }; DB6D9F9626367249008423CD /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; DB6F5E34264E78E7009108F4 /* AutoCompleteViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteViewController.swift; sourceTree = ""; }; DB6F5E37264E994A009108F4 /* AutoCompleteTopChevronView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteTopChevronView.swift; sourceTree = ""; }; - DB71FD5125F8CCAA00512AE1 /* APIService+Status.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Status.swift"; sourceTree = ""; }; DB72601B25E36A2100235243 /* MastodonServerRulesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonServerRulesViewController.swift; sourceTree = ""; }; DB72602625E36A6F00235243 /* MastodonServerRulesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonServerRulesViewModel.swift; sourceTree = ""; }; DB7274F3273BB9B200577D95 /* ListBatchFetchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListBatchFetchViewModel.swift; sourceTree = ""; }; DB73B48F261F030A002E9E9F /* SafariActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariActivity.swift; sourceTree = ""; }; - DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Notification.swift"; sourceTree = ""; }; - DB73BF42271192BB00781945 /* InstanceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceService.swift; sourceTree = ""; }; - DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+CoreData+Instance.swift"; sourceTree = ""; }; - DB73BF46271199CA00781945 /* Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Instance.swift; sourceTree = ""; }; DB73BF4827140BA300781945 /* UICollectionViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UICollectionViewDiffableDataSource.swift; sourceTree = ""; }; DB73BF4A27140C0800781945 /* UITableViewDiffableDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewDiffableDataSource.swift; sourceTree = ""; }; DB75BF1D263C1C1B00EDBF1F /* CustomScheduler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomScheduler.swift; sourceTree = ""; }; @@ -1204,9 +952,6 @@ DB87D4442609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusPollOptionCollectionViewCell.swift; sourceTree = ""; }; DB87D4502609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusPollOptionAppendEntryCollectionViewCell.swift; sourceTree = ""; }; DB89BA1025C10FF5008580ED /* Mastodon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Mastodon.entitlements; sourceTree = ""; }; - DB8AF52B25C13561002E6C99 /* ViewStateStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewStateStore.swift; sourceTree = ""; }; - DB8AF52C25C13561002E6C99 /* DocumentStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocumentStore.swift; sourceTree = ""; }; - DB8AF52D25C13561002E6C99 /* AppContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppContext.swift; sourceTree = ""; }; DB8AF54225C13647002E6C99 /* SceneCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SceneCoordinator.swift; sourceTree = ""; }; DB8AF54325C13647002E6C99 /* NeedsDependency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NeedsDependency.swift; sourceTree = ""; }; DB8AF54F25C13703002E6C99 /* MainTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; @@ -1230,13 +975,8 @@ DB938F0226240EA300E5B6C1 /* CachedThreadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedThreadViewModel.swift; sourceTree = ""; }; DB938F0826240F3C00E5B6C1 /* RemoteThreadViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteThreadViewModel.swift; sourceTree = ""; }; DB938F0E2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ThreadViewModel+LoadThreadState.swift"; sourceTree = ""; }; - DB938F1426241FDF00E5B6C1 /* APIService+Thread.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Thread.swift"; sourceTree = ""; }; DB938F1E2624382F00E5B6C1 /* ThreadViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ThreadViewModel+Diffable.swift"; sourceTree = ""; }; DB938F3226243D6200E5B6C1 /* TimelineTopLoaderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineTopLoaderTableViewCell.swift; sourceTree = ""; }; - DB98336A25C9420100AD9700 /* APIService+App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+App.swift"; sourceTree = ""; }; - DB98337025C9443200AD9700 /* APIService+Authentication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Authentication.swift"; sourceTree = ""; }; - DB98337E25C9452D00AD9700 /* APIService+APIError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "APIService+APIError.swift"; sourceTree = ""; }; - DB98339B25C96DE600AD9700 /* APIService+Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Account.swift"; sourceTree = ""; }; DB98EB4627B0DFAA0082E365 /* ReportStatusViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReportStatusViewModel+State.swift"; sourceTree = ""; }; DB98EB4827B0F0CD0082E365 /* ReportStatusTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportStatusTableViewCell.swift; sourceTree = ""; }; DB98EB4B27B0F2BC0082E365 /* ReportStatusTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReportStatusTableViewCell+ViewModel.swift"; sourceTree = ""; }; @@ -1252,20 +992,14 @@ DB98EB6A27B243470082E365 /* SettingsAppearanceTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SettingsAppearanceTableViewCell+ViewModel.swift"; sourceTree = ""; }; DB9A486B26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AttachmentContainerView+EmptyStateView.swift"; sourceTree = ""; }; DB9A488926034D40008B817C /* ComposeViewModel+PublishState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ComposeViewModel+PublishState.swift"; sourceTree = ""; }; - DB9A488F26035963008B817C /* APIService+Media.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Media.swift"; sourceTree = ""; }; - DB9A48952603685D008B817C /* MastodonAttachmentService+UploadState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MastodonAttachmentService+UploadState.swift"; sourceTree = ""; }; DB9D6BE825E4F5340051B173 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; }; DB9D6BF725E4F5690051B173 /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; DB9D6BFE25E4F5940051B173 /* ProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; - DB9D7C20269824B80054B3DF /* APIService+Filter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Filter.swift"; sourceTree = ""; }; DB9E0D6E25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIInterpolatingMotionEffect.swift; sourceTree = ""; }; DB9F58EB26EF435000E7BBE9 /* AccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountViewController.swift; sourceTree = ""; }; DB9F58EE26EF491E00E7BBE9 /* AccountListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListViewModel.swift; sourceTree = ""; }; DB9F58F026EF512300E7BBE9 /* AccountListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListTableViewCell.swift; sourceTree = ""; }; - DBA088DE26958164003EB4B2 /* UserFetchedResultsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFetchedResultsController.swift; sourceTree = ""; }; DBA0A11225FB3FC10079C110 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = ""; }; - DBA465922696B495002B41DB /* APIService+WebFinger.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+WebFinger.swift"; sourceTree = ""; }; - DBA465942696E387002B41DB /* AppPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPreference.swift; sourceTree = ""; }; DBA4B0D326BD10AC0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Intents.strings"; sourceTree = ""; }; DBA4B0D626BD10AD0077136E /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; DBA4B0D726BD10F40077136E /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Intents.strings; sourceTree = ""; }; @@ -1282,7 +1016,6 @@ DBA4B0F826C269880077136E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Intents.stringsdict; sourceTree = ""; }; DBA5A53026F08EF000CACBAA /* DragIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DragIndicatorView.swift; sourceTree = ""; }; DBA5A53426F0A36A00CACBAA /* AddAccountTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountTableViewCell.swift; sourceTree = ""; }; - DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoLibraryService.swift; sourceTree = ""; }; DBA5E7A4263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewModel.swift; sourceTree = ""; }; DBA5E7A8263BD3A4004598BB /* ContextMenuImagePreviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuImagePreviewViewController.swift; sourceTree = ""; }; DBA5E7AA263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineTableViewCellContextMenuConfiguration.swift; sourceTree = ""; }; @@ -1291,9 +1024,6 @@ DBA9443D265CFA6400C537E1 /* ProfileFieldCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileFieldCollectionViewCell.swift; sourceTree = ""; }; DBA9443F265D137600C537E1 /* Mastodon+Entity+Field.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mastodon+Entity+Field.swift"; sourceTree = ""; }; DBABE3EB25ECAC4B00879EE5 /* WelcomeIllustrationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeIllustrationView.swift; sourceTree = ""; }; - DBAE3F8D2616E0B1004B8251 /* APIService+Block.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Block.swift"; sourceTree = ""; }; - DBAE3F932616E28B004B8251 /* APIService+Follow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Follow.swift"; sourceTree = ""; }; - DBAE3F9D2616E308004B8251 /* APIService+Mute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Mute.swift"; sourceTree = ""; }; DBAE3FAE26172FC0004B8251 /* RemoteProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteProfileViewModel.swift; sourceTree = ""; }; DBB3BA2926A81C020004F2D4 /* FLAnimatedImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FLAnimatedImageView.swift; sourceTree = ""; }; DBB45B5527B39FC9002DC5A7 /* MediaPreviewVideoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPreviewVideoViewController.swift; sourceTree = ""; }; @@ -1310,12 +1040,10 @@ DBB5255D2611F07A002F1F29 /* ProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileViewModel.swift; sourceTree = ""; }; DBB525632612C988002F1F29 /* MeProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeProfileViewModel.swift; sourceTree = ""; }; DBB8AB4526AECDE200F6D281 /* SendPostIntentHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendPostIntentHandler.swift; sourceTree = ""; }; - DBB8AB4926AED0B500F6D281 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; DBB9759B262462E1004620BD /* ThreadMetaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadMetaView.swift; sourceTree = ""; }; DBBC24A726A52F9000398BB9 /* ComposeToolbarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeToolbarView.swift; sourceTree = ""; }; DBBC24AB26A53D9300398BB9 /* ComposeStatusContentTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeStatusContentTableViewCell.swift; sourceTree = ""; }; DBBC24D626A54BCB00398BB9 /* MastodonRegex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MastodonRegex.swift; sourceTree = ""; }; - DBBC50C0278ED49200AF0CC6 /* MastodonAuthenticationBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonAuthenticationBox.swift; sourceTree = ""; }; DBBE1B4425F3474B0081417A /* MastodonPickServerAppearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MastodonPickServerAppearance.swift; sourceTree = ""; }; DBBF1DBE2652401B00E5B703 /* AutoCompleteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteViewModel.swift; sourceTree = ""; }; DBBF1DC126524D2900E5B703 /* AutoCompleteTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCompleteTableViewCell.swift; sourceTree = ""; }; @@ -1329,7 +1057,6 @@ DBC6461926A170AB00B0E31B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DBC6462226A1712000B0E31B /* ShareViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShareViewModel.swift; sourceTree = ""; }; DBC7A671260C897100E57475 /* StatusContentWarningEditorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusContentWarningEditorView.swift; sourceTree = ""; }; - DBC7A67B260DFADE00E57475 /* StatusPublishService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusPublishService.swift; sourceTree = ""; }; DBC9E3A3282E13BB0063A4D9 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Intents.strings; sourceTree = ""; }; DBC9E3A4282E13BB0063A4D9 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/InfoPlist.strings; sourceTree = ""; }; DBC9E3A5282E13BB0063A4D9 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = eu; path = eu.lproj/Intents.stringsdict; sourceTree = ""; }; @@ -1341,19 +1068,13 @@ DBC9E3AB282E17DF0063A4D9 /* es-AR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "es-AR"; path = "es-AR.lproj/Intents.stringsdict"; sourceTree = ""; }; DBCA0EBB282BB38A0029E2B0 /* PageboyNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageboyNavigateable.swift; sourceTree = ""; }; DBCBCBF3267CB070000F5B51 /* Decode85.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Decode85.swift; sourceTree = ""; }; - DBCBCC0C2680B908000F5B51 /* HomeTimelinePreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeTimelinePreference.swift; sourceTree = ""; }; DBCBED1626132DB500B49291 /* UserTimelineViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserTimelineViewModel+Diffable.swift"; sourceTree = ""; }; - DBCBED1C26132E1A00B49291 /* StatusFetchedResultsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusFetchedResultsController.swift; sourceTree = ""; }; DBCC3B2F261440A50045B23D /* UITabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITabBarController.swift; sourceTree = ""; }; DBCC3B8E26148F7B0045B23D /* CachedProfileViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedProfileViewModel.swift; sourceTree = ""; }; - DBCC3B9426157E6E0045B23D /* APIService+Relationship.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Relationship.swift"; sourceTree = ""; }; - DBCCC71D25F73297007E1AB6 /* APIService+Reblog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Reblog.swift"; sourceTree = ""; }; - DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemePreference.swift; sourceTree = ""; }; DBD376B1269302A4007FEC24 /* UITableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewCell.swift; sourceTree = ""; }; DBD5B1F527BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SuggestionAccountTableViewCell+ViewModel.swift"; sourceTree = ""; }; DBD5B1F727BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+TableViewControllerNavigateable.swift"; sourceTree = ""; }; DBD5B1F927BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DataSourceProvider+StatusTableViewControllerNavigateable.swift"; sourceTree = ""; }; - DBD9148F25DF6D8D00903DFD /* APIService+Onboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Onboarding.swift"; sourceTree = ""; }; DBDFF18F2805543100557A48 /* DiscoveryPostsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryPostsViewController.swift; sourceTree = ""; }; DBDFF1922805554900557A48 /* DiscoveryPostsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiscoveryPostsViewModel.swift; sourceTree = ""; }; DBDFF1942805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DiscoveryPostsViewModel+Diffable.swift"; sourceTree = ""; }; @@ -1369,7 +1090,6 @@ DBE3CDFA261C6CA500430CC6 /* FavoriteViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteViewModel.swift; sourceTree = ""; }; DBE3CE00261D623D00430CC6 /* FavoriteViewModel+State.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteViewModel+State.swift"; sourceTree = ""; }; DBE3CE06261D6A0E00430CC6 /* FavoriteViewModel+Diffable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteViewModel+Diffable.swift"; sourceTree = ""; }; - DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPreference.swift; sourceTree = ""; }; DBEB19E927E4F37B00B0E80E /* ku */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ku; path = ku.lproj/Intents.strings; sourceTree = ""; }; DBEB19EA27E4F37B00B0E80E /* ku */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ku; path = ku.lproj/InfoPlist.strings; sourceTree = ""; }; DBEB19EB27E4F37B00B0E80E /* ku */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ku; path = ku.lproj/Intents.stringsdict; sourceTree = ""; }; @@ -1418,8 +1138,6 @@ DBFEF06226A577F2006D7ED1 /* StatusAttachmentViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusAttachmentViewModel.swift; sourceTree = ""; }; DBFEF06726A58D07006D7ED1 /* ShareActionExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareActionExtension.entitlements; sourceTree = ""; }; DBFEF06C26A67FB7006D7ED1 /* StatusAttachmentViewModel+UploadState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StatusAttachmentViewModel+UploadState.swift"; sourceTree = ""; }; - DBFEF07226A6913D006D7ED1 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = ""; }; - DBFEF07A26A6BCE8006D7ED1 /* APIService+Status+Publish.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Status+Publish.swift"; sourceTree = ""; }; DDB1B139FA8EA26F510D58B6 /* Pods-AppShared.asdk - release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppShared.asdk - release.xcconfig"; path = "Target Support Files/Pods-AppShared/Pods-AppShared.asdk - release.xcconfig"; sourceTree = ""; }; DF65937EC1FF64462BC002EE /* Pods-MastodonTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MastodonTests.profile.xcconfig"; path = "Target Support Files/Pods-MastodonTests/Pods-MastodonTests.profile.xcconfig"; sourceTree = ""; }; E5C7236E58D14A0322FE00F2 /* Pods-Mastodon-MastodonUITests.asdk - debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mastodon-MastodonUITests.asdk - debug.xcconfig"; path = "Target Support Files/Pods-Mastodon-MastodonUITests/Pods-Mastodon-MastodonUITests.asdk - debug.xcconfig"; sourceTree = ""; }; @@ -1438,22 +1156,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DB3EA914281BBEA800598866 /* Alamofire in Frameworks */, - 2D939AC825EE14620076FA61 /* CropViewController in Frameworks */, - DBB525082611EAC0002F1F29 /* Tabman in Frameworks */, - DB6804862637CD4C00430867 /* AppShared.framework in Frameworks */, + DB22C92428E700A80082A9E9 /* MastodonSDK in Frameworks */, DBF96326262EC0A6001D8D25 /* AuthenticationServices.framework in Frameworks */, - DBAC6483267D0B21007FE9FD /* DifferenceKit in Frameworks */, - DB486C0F282E41F200F69423 /* TabBarPager in Frameworks */, - DB552D4F26BBD10C00E481F6 /* OrderedCollections in Frameworks */, - 2D61336925C18A4F00CAE157 /* AlamofireNetworkActivityIndicator in Frameworks */, - DBAC64A1267E6D02007FE9FD /* Fuzi in Frameworks */, - DBAC649E267DFE43007FE9FD /* DiffableDataSources in Frameworks */, - 2D5981BA25E4D7F8000FB903 /* ThirdPartyMailer in Frameworks */, 87FFDA5D898A5C42ADCB35E7 /* Pods_Mastodon.framework in Frameworks */, - DBF7A0FC26830C33004176A2 /* FPSIndicator in Frameworks */, - DBA5A52F26F07ED800CACBAA /* PanModal in Frameworks */, - DB3EA912281BBEA800598866 /* AlamofireImage in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1474,26 +1179,12 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DB68047C2637CD4C00430867 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - DB3EA8FE281BBAF200598866 /* Alamofire in Frameworks */, - DB3EA8F5281BB65200598866 /* MastodonSDK in Frameworks */, - DB3EA8FC281BBAE100598866 /* AlamofireImage in Frameworks */, - DB02EA0B280D180D00E751C5 /* KeychainAccess in Frameworks */, - EE93E8E8F9E0C39EAAEBD92F /* Pods_AppShared.framework in Frameworks */, - DB3EA904281BBD9400598866 /* Introspect in Frameworks */, - DB3EA902281BBD5D00598866 /* CommonOSLog in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DB8FABC326AEC7B2008E5AF4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DB22C92828E700B70082A9E9 /* MastodonSDK in Frameworks */, DB8FABC726AEC7B2008E5AF4 /* Intents.framework in Frameworks */, - DBE3CA6E27A39CB300AFE27B /* AppShared.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1501,10 +1192,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DB3EA90E281BBE9600598866 /* AlamofireNetworkActivityIndicator in Frameworks */, - DB3EA910281BBE9600598866 /* Alamofire in Frameworks */, - DBE3CA6B27A39CAF00AFE27B /* AppShared.framework in Frameworks */, - DB3EA90C281BBE9600598866 /* AlamofireImage in Frameworks */, + DB22C92628E700AF0082A9E9 /* MastodonSDK in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1512,10 +1200,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DB3EA908281BBE8200598866 /* AlamofireNetworkActivityIndicator in Frameworks */, - DB3EA90A281BBE8200598866 /* Alamofire in Frameworks */, - DBE3CA6827A39CAB00AFE27B /* AppShared.framework in Frameworks */, - DB3EA906281BBE8200598866 /* AlamofireImage in Frameworks */, + DB22C92228E700A10082A9E9 /* MastodonSDK in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1731,26 +1416,6 @@ path = Vender; sourceTree = ""; }; - 2D61335525C1886800CAE157 /* Service */ = { - isa = PBXGroup; - children = ( - DB45FB0425CA87B4005A8AC7 /* APIService */, - DB49A61925FF327D00B98345 /* EmojiService */, - DB9A489B26036E19008B817C /* MastodonAttachmentService */, - DB45FB0E25CA87D0005A8AC7 /* AuthenticationService.swift */, - 2DA6054625F716A2006356F9 /* PlaybackState.swift */, - DBC7A67B260DFADE00E57475 /* StatusPublishService.swift */, - 2D9DB966263A76FB007C1D71 /* BlockDomainService.swift */, - DB4924E126312AB200E9DB22 /* NotificationService.swift */, - DB6D9F6226357848008423CD /* SettingService.swift */, - DBA5E7A2263AD0A3004598BB /* PhotoLibraryService.swift */, - DB297B1A2679FAE200704C90 /* PlaceholderImageCacheService.swift */, - DB564BD2269F3B35001E39A7 /* StatusFilterService.swift */, - DB73BF42271192BB00781945 /* InstanceService.swift */, - ); - path = Service; - sourceTree = ""; - }; 2D69CFF225CA9E2200C3A1B2 /* Protocol */ = { isa = PBXGroup; children = ( @@ -1783,7 +1448,6 @@ DB4F097726A039A200D62E92 /* Search */, DB3E6FE52806A5BA00B035AE /* Discovery */, DB0617FA27855B660030EE79 /* Settings */, - DBCBED2226132E1D00B49291 /* FetchedResultsController */, ); path = Diffiable; sourceTree = ""; @@ -1974,39 +1638,6 @@ path = Onboarding; sourceTree = ""; }; - DB025B91278D64F0002F581E /* Persistence */ = { - isa = PBXGroup; - children = ( - DB025B98278D66D8002F581E /* Extension */, - DB336F24278D6DF40031E64B /* Protocol */, - DB025B92278D6501002F581E /* Persistence.swift */, - DB025B94278D6530002F581E /* Persistence+MastodonUser.swift */, - DB336F2B278D6FC30031E64B /* Persistence+Status.swift */, - DB336F31278D77330031E64B /* Persistence+Poll.swift */, - DB336F33278D77730031E64B /* Persistence+PollOption.swift */, - DB63F75B279956D000455B82 /* Persistence+Tag.swift */, - DB63F755279949BD00455B82 /* Persistence+SearchHistory.swift */, - DB63F770279A858500455B82 /* Persistence+Notification.swift */, - ); - path = Persistence; - sourceTree = ""; - }; - DB025B98278D66D8002F581E /* Extension */ = { - isa = PBXGroup; - children = ( - DB025B96278D66D5002F581E /* MastodonUser+Property.swift */, - DB336F2D278D71AF0031E64B /* Status+Property.swift */, - DB336F37278D7AAF0031E64B /* Poll+Property.swift */, - DB336F35278D77A40031E64B /* PollOption+Property.swift */, - DB63F75D27995B3B00455B82 /* Tag+Property.swift */, - DB63F772279A87DC00455B82 /* Notification+Property.swift */, - DB336F20278D6D960031E64B /* MastodonEmoji.swift */, - DB336F29278D6F2B0031E64B /* MastodonField.swift */, - DB0FCB6D27950E6B006C02E2 /* MastodonMention.swift */, - ); - path = Extension; - sourceTree = ""; - }; DB03F7F1268990A2007B274C /* TableViewCell */ = { isa = PBXGroup; children = ( @@ -2081,19 +1712,6 @@ path = Cell; sourceTree = ""; }; - DB084B5125CBC56300F898ED /* CoreDataStack */ = { - isa = PBXGroup; - children = ( - DB084B5625CBC56C00F898ED /* Status.swift */, - DB45FAE225CA7181005A8AC7 /* MastodonUser.swift */, - DB6D9F6E2635807F008423CD /* Setting.swift */, - DB6D9F4826353FD6008423CD /* Subscription.swift */, - DB6D9F4F2635761F008423CD /* SubscriptionAlerts.swift */, - DB73BF46271199CA00781945 /* Instance.swift */, - ); - path = CoreDataStack; - sourceTree = ""; - }; DB0A322F280EEA00001729D2 /* View */ = { isa = PBXGroup; children = ( @@ -2147,16 +1765,6 @@ path = View; sourceTree = ""; }; - DB336F24278D6DF40031E64B /* Protocol */ = { - isa = PBXGroup; - children = ( - DB336F22278D6DED0031E64B /* MastodonEmojiContainer.swift */, - DB336F27278D6EC70031E64B /* MastodonFieldContainer.swift */, - DB0FCB6B27950E29006C02E2 /* MastodonMentionContainer.swift */, - ); - path = Protocol; - sourceTree = ""; - }; DB3D0FF725BAA68500EAA174 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -2203,7 +1811,6 @@ DB3E6FEA2806BD2500B035AE /* MastodonUI */ = { isa = PBXGroup; children = ( - DB3E6FE82806BD2200B035AE /* ThemeService.swift */, ); path = MastodonUI; sourceTree = ""; @@ -2251,7 +1858,6 @@ DB427DD425BAA00100D1B89D /* Mastodon */, DB427DEB25BAA00100D1B89D /* MastodonTests */, DB427DF625BAA00100D1B89D /* MastodonUITests */, - DB6804802637CD4C00430867 /* AppShared */, DBF8AE14263293E400C9C23C /* NotificationService */, DBC6461326A170AB00B0E31B /* ShareActionExtension */, DB8FABC826AEC7B2008E5AF4 /* MastodonIntent */, @@ -2269,7 +1875,6 @@ DB427DE825BAA00100D1B89D /* MastodonTests.xctest */, DB427DF325BAA00100D1B89D /* MastodonUITests.xctest */, DBF8AE13263293E400C9C23C /* NotificationService.appex */, - DB68047F2637CD4C00430867 /* AppShared.framework */, DBC6461226A170AB00B0E31B /* ShareActionExtension.appex */, DB8FABC626AEC7B2008E5AF4 /* MastodonIntent.appex */, ); @@ -2282,15 +1887,12 @@ DB89BA1025C10FF5008580ED /* Mastodon.entitlements */, DB427DE325BAA00100D1B89D /* Info.plist */, 2D76319C25C151DE00929FB9 /* Diffiable */, - DB8AF52A25C13561002E6C99 /* State */, - 2D61335525C1886800CAE157 /* Service */, DB8AF55525C1379F002E6C99 /* Scene */, DB8AF54125C13647002E6C99 /* Coordinator */, DB8AF56225C138BC002E6C99 /* Extension */, 2D5A3D0125CF8640002347D6 /* Vender */, DB73B495261F030D002E9E9F /* Activity */, DBBC24D526A54BCB00398BB9 /* Helper */, - DB025B91278D64F0002F581E /* Persistence */, DB5086CB25CC0DB400C2C187 /* Preference */, 2D69CFF225CA9E2200C3A1B2 /* Protocol */, DB6746EE278F45F3008A6B94 /* Template */, @@ -2319,72 +1921,6 @@ path = MastodonUITests; sourceTree = ""; }; - DB45FB0425CA87B4005A8AC7 /* APIService */ = { - isa = PBXGroup; - children = ( - DB45FB0925CA87BC005A8AC7 /* CoreData */, - 2D61335D25C1894B00CAE157 /* APIService.swift */, - DB98337E25C9452D00AD9700 /* APIService+APIError.swift */, - DBD9148F25DF6D8D00903DFD /* APIService+Onboarding.swift */, - 2DF75BA625D10E1000694EC8 /* APIService+Favorite.swift */, - DBCCC71D25F73297007E1AB6 /* APIService+Reblog.swift */, - DB98336A25C9420100AD9700 /* APIService+App.swift */, - DB98337025C9443200AD9700 /* APIService+Authentication.swift */, - DB98339B25C96DE600AD9700 /* APIService+Account.swift */, - 2D9DB96A263A91D1007C1D71 /* APIService+DomainBlock.swift */, - DB45FB1C25CA9D23005A8AC7 /* APIService+HomeTimeline.swift */, - DB482A4A261340A7008AE74C /* APIService+UserTimeline.swift */, - DB3EA8EC281B810100598866 /* APIService+PublicTimeline.swift */, - DBA465922696B495002B41DB /* APIService+WebFinger.swift */, - DB0AC6FB25CD02E600D75117 /* APIService+Instance.swift */, - DB59F10D25EF724F001F1DAB /* APIService+Poll.swift */, - DB71FD5125F8CCAA00512AE1 /* APIService+Status.swift */, - DBFEF07A26A6BCE8006D7ED1 /* APIService+Status+Publish.swift */, - DB938F1426241FDF00E5B6C1 /* APIService+Thread.swift */, - DB49A62A25FF36C700B98345 /* APIService+CustomEmoji.swift */, - 2D61254C262547C200299647 /* APIService+Notification.swift */, - DB9A488F26035963008B817C /* APIService+Media.swift */, - 2D34D9D026148D9E0081BFC0 /* APIService+Recommend.swift */, - DB0FCB8F2796C5EB006C02E2 /* APIService+Trend.swift */, - 2D34D9DA261494120081BFC0 /* APIService+Search.swift */, - 0F202212261351F5000C64BF /* APIService+HashtagTimeline.swift */, - DB6B74F9272FC2B500C70B6E /* APIService+Follower.swift */, - DB67D08327312970006A36CF /* APIService+Following.swift */, - DBCC3B9426157E6E0045B23D /* APIService+Relationship.swift */, - 5B24BBE1262DB19100A9381B /* APIService+Report.swift */, - DBAE3F932616E28B004B8251 /* APIService+Follow.swift */, - 2D8FCA072637EABB00137F46 /* APIService+FollowRequest.swift */, - DBAE3F8D2616E0B1004B8251 /* APIService+Block.swift */, - DBAE3F9D2616E308004B8251 /* APIService+Mute.swift */, - 5B90C48426259BF10002E742 /* APIService+Subscriptions.swift */, - DB9D7C20269824B80054B3DF /* APIService+Filter.swift */, - 6213AF5728939C4700BCADB6 /* APIService+Bookmark.swift */, - ); - path = APIService; - sourceTree = ""; - }; - DB45FB0925CA87BC005A8AC7 /* CoreData */ = { - isa = PBXGroup; - children = ( - DB45FAF825CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift */, - DB6D9F56263577D2008423CD /* APIService+CoreData+Setting.swift */, - 5B90C48A26259C120002E742 /* APIService+CoreData+Subscriptions.swift */, - DB73BF44271195AC00781945 /* APIService+CoreData+Instance.swift */, - ); - path = CoreData; - sourceTree = ""; - }; - DB49A61925FF327D00B98345 /* EmojiService */ = { - isa = PBXGroup; - children = ( - DB49A61325FF2C5600B98345 /* EmojiService.swift */, - DB49A61E25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift */, - DB49A62425FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift */, - DB040ED026538E3C00BEE9D8 /* Trie.swift */, - ); - path = EmojiService; - sourceTree = ""; - }; DB4F0964269ED06700D62E92 /* SearchResult */ = { isa = PBXGroup; children = ( @@ -2472,13 +2008,7 @@ DB5086CB25CC0DB400C2C187 /* Preference */ = { isa = PBXGroup; children = ( - DBA465942696E387002B41DB /* AppPreference.swift */, - DB647C5826F1EA2700F7F82C /* WizardPreference.swift */, - DBE54AC52636C89F004E7C0B /* NotificationPreference.swift */, DB1D842F26566512000346B3 /* KeyboardPreference.swift */, - DBCBCC0C2680B908000F5B51 /* HomeTimelinePreference.swift */, - DBD376AB2692ECDB007FEC24 /* ThemePreference.swift */, - DB67D088273256D7006A36CF /* StoreReviewPreference.swift */, ); path = Preference; sourceTree = ""; @@ -2669,17 +2199,6 @@ path = Wizard; sourceTree = ""; }; - DB6804802637CD4C00430867 /* AppShared */ = { - isa = PBXGroup; - children = ( - DB6804812637CD4C00430867 /* AppShared.h */, - DB6804822637CD4C00430867 /* Info.plist */, - DB6804FC2637CFEC00430867 /* AppSecret.swift */, - DB73BF3A2711885500781945 /* UserDefaults+Notification.swift */, - ); - path = AppShared; - sourceTree = ""; - }; DB68A03825E900CC00CFDF14 /* Share */ = { isa = PBXGroup; children = ( @@ -2840,16 +2359,6 @@ path = Root; sourceTree = ""; }; - DB8AF52A25C13561002E6C99 /* State */ = { - isa = PBXGroup; - children = ( - DB8AF52D25C13561002E6C99 /* AppContext.swift */, - DB8AF52B25C13561002E6C99 /* ViewStateStore.swift */, - DB8AF52C25C13561002E6C99 /* DocumentStore.swift */, - ); - path = State; - sourceTree = ""; - }; DB8AF54125C13647002E6C99 /* Coordinator */ = { isa = PBXGroup; children = ( @@ -2895,16 +2404,13 @@ DB8AF56225C138BC002E6C99 /* Extension */ = { isa = PBXGroup; children = ( - DB084B5125CBC56300F898ED /* CoreDataStack */, DB3E6FEA2806BD2500B035AE /* MastodonUI */, DB6C8C0525F0921200AAA452 /* MastodonSDK */, 2DF123A625C3B0210020F248 /* ActiveLabel.swift */, 5DF1056325F887CB00D6C0D4 /* AVPlayer.swift */, - 0F20223826146553000C64BF /* Array.swift */, 2D206B8525F5FB0900143C56 /* Double.swift */, DBB3BA2926A81C020004F2D4 /* FLAnimatedImageView.swift */, DB68586325E619B700F0A850 /* NSKeyValueObservation.swift */, - DB47229625F9EFAD00DA7F53 /* NSManagedObjectContext.swift */, DB0140CE25C42AEE00F9F3CF /* OSLog.swift */, 2D939AB425EDD8A90076FA61 /* String.swift */, DB68A06225E905E000CFDF14 /* UIApplication.swift */, @@ -2936,7 +2442,6 @@ DB8FABC926AEC7B2008E5AF4 /* IntentHandler.swift */, DB64BA462851F23300ADF1B7 /* Model */, DB64BA492851F65F00ADF1B7 /* Handler */, - DBB8AB4B26AED0B800F6D281 /* Service */, DB8FABCB26AEC7B2008E5AF4 /* Info.plist */, ); path = MastodonIntent; @@ -3019,15 +2524,6 @@ path = ReportResult; sourceTree = ""; }; - DB9A489B26036E19008B817C /* MastodonAttachmentService */ = { - isa = PBXGroup; - children = ( - DB6B35172601FA3400DC1E11 /* MastodonAttachmentService.swift */, - DB9A48952603685D008B817C /* MastodonAttachmentService+UploadState.swift */, - ); - path = MastodonAttachmentService; - sourceTree = ""; - }; DB9D6BEE25E4F5370051B173 /* Search */ = { isa = PBXGroup; children = ( @@ -3195,19 +2691,10 @@ path = View; sourceTree = ""; }; - DBB8AB4B26AED0B800F6D281 /* Service */ = { - isa = PBXGroup; - children = ( - DBB8AB4926AED0B500F6D281 /* APIService.swift */, - ); - path = Service; - sourceTree = ""; - }; DBBC24D526A54BCB00398BB9 /* Helper */ = { isa = PBXGroup; children = ( DBBC24D626A54BCB00398BB9 /* MastodonRegex.swift */, - DBBC50C0278ED49200AF0CC6 /* MastodonAuthenticationBox.swift */, DBF3B7402733EB9400E21627 /* MastodonLocalCode.swift */, ); path = Helper; @@ -3236,23 +2723,10 @@ DBC6461926A170AB00B0E31B /* Info.plist */, DBC6461626A170AB00B0E31B /* MainInterface.storyboard */, DBFEF06126A57721006D7ED1 /* Scene */, - DBFEF07426A69140006D7ED1 /* Service */, ); path = ShareActionExtension; sourceTree = ""; }; - DBCBED2226132E1D00B49291 /* FetchedResultsController */ = { - isa = PBXGroup; - children = ( - DB336F3C278D80040031E64B /* FeedFetchedResultsController.swift */, - DBCBED1C26132E1A00B49291 /* StatusFetchedResultsController.swift */, - DBA088DE26958164003EB4B2 /* UserFetchedResultsController.swift */, - DB6D9F75263587C7008423CD /* SettingFetchedResultController.swift */, - DB4F097E26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift */, - ); - path = FetchedResultsController; - sourceTree = ""; - }; DBDFF1912805544800557A48 /* Discovery */ = { isa = PBXGroup; children = ( @@ -3376,7 +2850,6 @@ DB68053E2638011000430867 /* NotificationService.entitlements */, DBF8AE15263293E400C9C23C /* NotificationService.swift */, DB6D9F3426351B7A008423CD /* NotificationService+Decrypt.swift */, - DB68045A2636DC6A00430867 /* MastodonPushNotification.swift */, DBCBCBF3267CB070000F5B51 /* Decode85.swift */, DBF8AE17263293E400C9C23C /* Info.plist */, ); @@ -3430,27 +2903,8 @@ path = Scene; sourceTree = ""; }; - DBFEF07426A69140006D7ED1 /* Service */ = { - isa = PBXGroup; - children = ( - DBFEF07226A6913D006D7ED1 /* APIService.swift */, - ); - path = Service; - sourceTree = ""; - }; /* End PBXGroup section */ -/* Begin PBXHeadersBuildPhase section */ - DB68047A2637CD4C00430867 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DB6804832637CD4C00430867 /* AppShared.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - /* Begin PBXNativeTarget section */ DB427DD125BAA00100D1B89D /* Mastodon */ = { isa = PBXNativeTarget; @@ -3471,25 +2925,12 @@ ); dependencies = ( DBF8AE19263293E400C9C23C /* PBXTargetDependency */, - DB6804852637CD4C00430867 /* PBXTargetDependency */, DBC6461B26A170AB00B0E31B /* PBXTargetDependency */, DB8FABCD26AEC7B2008E5AF4 /* PBXTargetDependency */, ); name = Mastodon; packageProductDependencies = ( - 2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */, - 2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */, - 2D939AC725EE14620076FA61 /* CropViewController */, - DBB525072611EAC0002F1F29 /* Tabman */, - DBAC6482267D0B21007FE9FD /* DifferenceKit */, - DBAC649D267DFE43007FE9FD /* DiffableDataSources */, - DBAC64A0267E6D02007FE9FD /* Fuzi */, - DBF7A0FB26830C33004176A2 /* FPSIndicator */, - DB552D4E26BBD10C00E481F6 /* OrderedCollections */, - DBA5A52E26F07ED800CACBAA /* PanModal */, - DB3EA911281BBEA800598866 /* AlamofireImage */, - DB3EA913281BBEA800598866 /* Alamofire */, - DB486C0E282E41F200F69423 /* TabBarPager */, + DB22C92328E700A80082A9E9 /* MastodonSDK */, ); productName = Mastodon; productReference = DB427DD225BAA00100D1B89D /* Mastodon.app */; @@ -3534,33 +2975,6 @@ productReference = DB427DF325BAA00100D1B89D /* MastodonUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; - DB68047E2637CD4C00430867 /* AppShared */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB6804882637CD4C00430867 /* Build configuration list for PBXNativeTarget "AppShared" */; - buildPhases = ( - C6B7D3A8ACD77F6620D0E0AD /* [CP] Check Pods Manifest.lock */, - DB68047A2637CD4C00430867 /* Headers */, - DB68047B2637CD4C00430867 /* Sources */, - DB68047C2637CD4C00430867 /* Frameworks */, - DB68047D2637CD4C00430867 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = AppShared; - packageProductDependencies = ( - DB02EA0A280D180D00E751C5 /* KeychainAccess */, - DB3EA8F4281BB65200598866 /* MastodonSDK */, - DB3EA8FB281BBAE100598866 /* AlamofireImage */, - DB3EA8FD281BBAF200598866 /* Alamofire */, - DB3EA901281BBD5D00598866 /* CommonOSLog */, - DB3EA903281BBD9400598866 /* Introspect */, - ); - productName = AppShared; - productReference = DB68047F2637CD4C00430867 /* AppShared.framework */; - productType = "com.apple.product-type.framework"; - }; DB8FABC526AEC7B2008E5AF4 /* MastodonIntent */ = { isa = PBXNativeTarget; buildConfigurationList = DB8FABCF26AEC7B2008E5AF4 /* Build configuration list for PBXNativeTarget "MastodonIntent" */; @@ -3572,9 +2986,11 @@ buildRules = ( ); dependencies = ( - DB8FABDA26AEC873008E5AF4 /* PBXTargetDependency */, ); name = MastodonIntent; + packageProductDependencies = ( + DB22C92728E700B70082A9E9 /* MastodonSDK */, + ); productName = MastodonIntent; productReference = DB8FABC626AEC7B2008E5AF4 /* MastodonIntent.appex */; productType = "com.apple.product-type.app-extension"; @@ -3590,13 +3006,10 @@ buildRules = ( ); dependencies = ( - DBC6463626A195DB00B0E31B /* PBXTargetDependency */, ); name = ShareActionExtension; packageProductDependencies = ( - DB3EA90B281BBE9600598866 /* AlamofireImage */, - DB3EA90D281BBE9600598866 /* AlamofireNetworkActivityIndicator */, - DB3EA90F281BBE9600598866 /* Alamofire */, + DB22C92528E700AF0082A9E9 /* MastodonSDK */, ); productName = ShareActionExtension; productReference = DBC6461226A170AB00B0E31B /* ShareActionExtension.appex */; @@ -3613,13 +3026,10 @@ buildRules = ( ); dependencies = ( - DB6804A82637CDCC00430867 /* PBXTargetDependency */, ); name = NotificationService; packageProductDependencies = ( - DB3EA905281BBE8200598866 /* AlamofireImage */, - DB3EA907281BBE8200598866 /* AlamofireNetworkActivityIndicator */, - DB3EA909281BBE8200598866 /* Alamofire */, + DB22C92128E700A10082A9E9 /* MastodonSDK */, ); productName = NotificationService; productReference = DBF8AE13263293E400C9C23C /* NotificationService.appex */; @@ -3646,10 +3056,6 @@ CreatedOnToolsVersion = 12.4; TestTargetID = DB427DD125BAA00100D1B89D; }; - DB68047E2637CD4C00430867 = { - CreatedOnToolsVersion = 12.4; - LastSwiftMigration = 1240; - }; DB8FABC526AEC7B2008E5AF4 = { CreatedOnToolsVersion = 12.5.1; }; @@ -3694,23 +3100,6 @@ ); mainGroup = DB427DC925BAA00100D1B89D; packageReferences = ( - DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */, - 2D61336725C18A4F00CAE157 /* XCRemoteSwiftPackageReference "AlamofireNetworkActivityIndicator" */, - DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */, - 2D5981B825E4D7F8000FB903 /* XCRemoteSwiftPackageReference "ThirdPartyMailer" */, - 2D939AC625EE14620076FA61 /* XCRemoteSwiftPackageReference "TOCropViewController" */, - DBB525062611EAC0002F1F29 /* XCRemoteSwiftPackageReference "Tabman" */, - DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */, - DBAC6481267D0B21007FE9FD /* XCRemoteSwiftPackageReference "DifferenceKit" */, - DBAC649C267DFE43007FE9FD /* XCRemoteSwiftPackageReference "DiffableDataSources" */, - DBAC649F267E6D01007FE9FD /* XCRemoteSwiftPackageReference "Fuzi" */, - DBF7A0FA26830C33004176A2 /* XCRemoteSwiftPackageReference "FPSIndicator" */, - DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */, - DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */, - DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */, - DB8D8E2D28192EED009FD90F /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */, - DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */, - DB486C0D282E41F200F69423 /* XCRemoteSwiftPackageReference "TabBarPager" */, ); productRefGroup = DB427DD325BAA00100D1B89D /* Products */; projectDirPath = ""; @@ -3719,7 +3108,6 @@ DB427DD125BAA00100D1B89D /* Mastodon */, DB427DE725BAA00100D1B89D /* MastodonTests */, DB427DF225BAA00100D1B89D /* MastodonUITests */, - DB68047E2637CD4C00430867 /* AppShared */, DBF8AE12263293E400C9C23C /* NotificationService */, DBC6461126A170AB00B0E31B /* ShareActionExtension */, DB8FABC526AEC7B2008E5AF4 /* MastodonIntent */, @@ -3758,13 +3146,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DB68047D2637CD4C00430867 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; DB8FABC426AEC7B2008E5AF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -3854,28 +3235,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C6B7D3A8ACD77F6620D0E0AD /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-AppShared-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; DB025B8E278D6448002F581E /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -3978,29 +3337,19 @@ DBDFF19E2805703700557A48 /* DiscoveryPostsViewController+DataSourceProvider.swift in Sources */, DB6180EB26391C140018D199 /* MediaPreviewTransitionItem.swift in Sources */, DB63F74727990B0600455B82 /* DataSourceFacade+Hashtag.swift in Sources */, - DB98337125C9443200AD9700 /* APIService+Authentication.swift in Sources */, DBE3CDCF261C42ED00430CC6 /* TimelineHeaderView.swift in Sources */, - DB6746E7278ED633008A6B94 /* MastodonAuthenticationBox.swift in Sources */, - DBAE3F8E2616E0B1004B8251 /* APIService+Block.swift in Sources */, 62FD27D32893707B00B205C5 /* BookmarkViewController+DataSourceProvider.swift in Sources */, DB1D843426579931000346B3 /* TableViewControllerNavigateable.swift in Sources */, 0FAA0FDF25E0B57E0017CCDE /* WelcomeViewController.swift in Sources */, DB65C63727A2AF6C008BAC2E /* ReportItem.swift in Sources */, DB5B54B22833C24B00DEF8B2 /* RebloggedByViewController+DataSourceProvider.swift in Sources */, 2D59819B25E4A581000FB903 /* MastodonConfirmEmailViewController.swift in Sources */, - DB45FB1D25CA9D23005A8AC7 /* APIService+HomeTimeline.swift in Sources */, DBA94440265D137600C537E1 /* Mastodon+Entity+Field.swift in Sources */, - DB49A61425FF2C5600B98345 /* EmojiService.swift in Sources */, DBBF1DC7265251D400E5B703 /* AutoCompleteViewModel+State.swift in Sources */, DB03A793272A7E5700EE37C5 /* SidebarListHeaderView.swift in Sources */, - DB336F2E278D71AF0031E64B /* Status+Property.swift in Sources */, DB4FFC2B269EC39600D62E92 /* SearchToSearchDetailViewControllerAnimatedTransitioning.swift in Sources */, - DBCC3B9526157E6E0045B23D /* APIService+Relationship.swift in Sources */, DB5B7298273112C800081888 /* FollowingListViewModel.swift in Sources */, - DB6B35182601FA3400DC1E11 /* MastodonAttachmentService.swift in Sources */, 0FB3D2F725E4C24D00AAD544 /* MastodonPickServerViewModel.swift in Sources */, - 2D61335E25C1894B00CAE157 /* APIService.swift in Sources */, - 2D9DB967263A76FB007C1D71 /* BlockDomainService.swift in Sources */, DB5B54AE2833C15F00DEF8B2 /* UserListViewModel+Diffable.swift in Sources */, DB336F43278EB1690031E64B /* MediaView+Configuration.swift in Sources */, DB66729625F9F91600D60309 /* ComposeStatusSection.swift in Sources */, @@ -4012,7 +3361,6 @@ DBB525502611ED6D002F1F29 /* ProfileHeaderView.swift in Sources */, DB63F75A279953F200455B82 /* SearchHistoryUserCollectionViewCell+ViewModel.swift in Sources */, DB023D26279FFB0A005AC798 /* ShareActivityProvider.swift in Sources */, - DB71FD5225F8CCAA00512AE1 /* APIService+Status.swift in Sources */, 5D0393962612D266007FE196 /* WebViewModel.swift in Sources */, 5B24BBDA262DB14800A9381B /* ReportViewModel.swift in Sources */, 2D5A3D3825CF8D9F002347D6 /* ScrollViewContainer.swift in Sources */, @@ -4028,9 +3376,7 @@ DB443CD42694627B00159B29 /* AppearanceView.swift in Sources */, DBF1D24E269DAF5D00C1C08A /* SearchDetailViewController.swift in Sources */, 62FD27D52893708A00B205C5 /* BookmarkViewModel+Diffable.swift in Sources */, - DB8AF53025C13561002E6C99 /* AppContext.swift in Sources */, DB72602725E36A6F00235243 /* MastodonServerRulesViewModel.swift in Sources */, - DB336F36278D77A40031E64B /* PollOption+Property.swift in Sources */, 2D364F7225E66D7500204FDC /* MastodonResendEmailViewController.swift in Sources */, DB68A06325E905E000CFDF14 /* UIApplication.swift in Sources */, DB02CDAB26256A9500D0A2AF /* ThreadReplyLoaderTableViewCell.swift in Sources */, @@ -4047,12 +3393,10 @@ DB9A488A26034D40008B817C /* ComposeViewModel+PublishState.swift in Sources */, DB45FAD725CA6C76005A8AC7 /* UIBarButtonItem.swift in Sources */, 2DA504692601ADE7008F4E6C /* SawToothView.swift in Sources */, - DBA465952696E387002B41DB /* AppPreference.swift in Sources */, 2D8434F525FF465D00EECE90 /* HomeTimelineNavigationBarTitleViewModel.swift in Sources */, DB938F0F2624119800E5B6C1 /* ThreadViewModel+LoadThreadState.swift in Sources */, DB6180F226391CF40018D199 /* MediaPreviewImageViewModel.swift in Sources */, 62FD27D12893707600B205C5 /* BookmarkViewController.swift in Sources */, - DBA5E7A3263AD0A3004598BB /* PhotoLibraryService.swift in Sources */, DBD5B1F627BCD3D200BD6B38 /* SuggestionAccountTableViewCell+ViewModel.swift in Sources */, 5DDDF1932617442700311060 /* Mastodon+Entity+Account.swift in Sources */, DB63F767279A5EB300455B82 /* NotificationTimelineViewModel.swift in Sources */, @@ -4060,13 +3404,10 @@ DB5B54AB2833C12A00DEF8B2 /* RebloggedByViewController.swift in Sources */, DB848E33282B62A800A302CC /* ReportResultView.swift in Sources */, DBABE3EC25ECAC4B00879EE5 /* WelcomeIllustrationView.swift in Sources */, - DB564BD3269F3B35001E39A7 /* StatusFilterService.swift in Sources */, DB0FCB9C27980AB6006C02E2 /* HashtagTimelineViewController+DataSourceProvider.swift in Sources */, DB63F76F279A7D1100455B82 /* NotificationTableViewCell.swift in Sources */, - DB297B1B2679FAE200704C90 /* PlaceholderImageCacheService.swift in Sources */, DB0FCB8C2796BF8D006C02E2 /* SearchViewModel+Diffable.swift in Sources */, DBEFCD76282A143F00C0ABEA /* ReportStatusViewController.swift in Sources */, - 2D8FCA082637EABB00137F46 /* APIService+FollowRequest.swift in Sources */, DBDFF1952805561700557A48 /* DiscoveryPostsViewModel+Diffable.swift in Sources */, DB03A795272A981400EE37C5 /* ContentSplitViewController.swift in Sources */, DBDFF19C28055BD600557A48 /* DiscoveryViewModel.swift in Sources */, @@ -4094,31 +3435,20 @@ DB6B74FE272FF59000C70B6E /* UserItem.swift in Sources */, DB68586425E619B700F0A850 /* NSKeyValueObservation.swift in Sources */, DBE3CE07261D6A0E00430CC6 /* FavoriteViewModel+Diffable.swift in Sources */, - 2D34D9DB261494120081BFC0 /* APIService+Search.swift in Sources */, - 5B90C48B26259C120002E742 /* APIService+CoreData+Subscriptions.swift in Sources */, DBA9443E265CFA6400C537E1 /* ProfileFieldCollectionViewCell.swift in Sources */, - DB025B93278D6501002F581E /* Persistence.swift in Sources */, 2D24E1232626ED9D00A59D4F /* UIView+Gesture.swift in Sources */, DBFEEC9D279C12C1004F81DD /* ProfileFieldEditCollectionViewCell.swift in Sources */, - DB45FAE325CA7181005A8AC7 /* MastodonUser.swift in Sources */, DB3E6FEC2806D7F100B035AE /* DiscoveryNewsViewController.swift in Sources */, - DBA088DF26958164003EB4B2 /* UserFetchedResultsController.swift in Sources */, DB2FF510260B113300ADA9FE /* ComposeStatusPollExpiresOptionCollectionViewCell.swift in Sources */, - 0F202213261351F5000C64BF /* APIService+HashtagTimeline.swift in Sources */, - DB0AC6FC25CD02E600D75117 /* APIService+Instance.swift in Sources */, DBBC24DC26A54BCB00398BB9 /* MastodonRegex.swift in Sources */, DBCBED1726132DB500B49291 /* UserTimelineViewModel+Diffable.swift in Sources */, 2DE0FACE2615F7AD00CDF649 /* RecommendAccountSection.swift in Sources */, 2DAC9E3E262FC2400062E1A6 /* SuggestionAccountViewModel.swift in Sources */, DB3667A8268AE2900027D07F /* ComposeStatusPollItem.swift in Sources */, - DB49A62B25FF36C700B98345 /* APIService+CustomEmoji.swift in Sources */, DB603113279EBEBA00A935FE /* DataSourceFacade+Block.swift in Sources */, - DB336F32278D77330031E64B /* Persistence+Poll.swift in Sources */, DB63F777279A9A2A00455B82 /* NotificationView+Configuration.swift in Sources */, - DBCBED1D26132E1A00B49291 /* StatusFetchedResultsController.swift in Sources */, DB029E95266A20430062874E /* MastodonAuthenticationController.swift in Sources */, DB0C947726A7FE840088FB11 /* NotificationAvatarButton.swift in Sources */, - DB336F34278D77730031E64B /* Persistence+PollOption.swift in Sources */, 5B90C461262599800002E742 /* SettingsLinkTableViewCell.swift in Sources */, DB6180DD263918E30018D199 /* MediaPreviewViewController.swift in Sources */, DBE3CDEC261C6B2900430CC6 /* FavoriteViewController.swift in Sources */, @@ -4145,23 +3475,17 @@ DB03F7F32689AEA3007B274C /* ComposeRepliedToStatusContentTableViewCell.swift in Sources */, 2D4AD8A826316D3500613EFC /* SelectedAccountItem.swift in Sources */, DBE3CDFB261C6CA500430CC6 /* FavoriteViewModel.swift in Sources */, - DB8AF52F25C13561002E6C99 /* DocumentStore.swift in Sources */, DBE3CE01261D623D00430CC6 /* FavoriteViewModel+State.swift in Sources */, 2D82BA0525E7897700E36F0F /* MastodonResendEmailViewModelNavigationDelegateShim.swift in Sources */, 2D38F1EB25CD477000561493 /* HomeTimelineViewModel+LoadLatestState.swift in Sources */, - DB67D089273256D7006A36CF /* StoreReviewPreference.swift in Sources */, DB5B7295273112B100081888 /* FollowingListViewController.swift in Sources */, 0F202201261326E6000C64BF /* HashtagTimelineViewModel.swift in Sources */, DB6D9F9726367249008423CD /* SettingsViewController.swift in Sources */, - DB4F097F26A03DA600D62E92 /* SearchHistoryFetchedResultController.swift in Sources */, DB63F7452799056400455B82 /* HashtagTableViewCell.swift in Sources */, - DBD9149025DF6D8D00903DFD /* APIService+Onboarding.swift in Sources */, DBAE3FAF26172FC0004B8251 /* RemoteProfileViewModel.swift in Sources */, DB3EA8EB281B7E0700598866 /* DiscoveryCommunityViewModel+State.swift in Sources */, DB0FCB7227952986006C02E2 /* NamingState.swift in Sources */, - DB73BF47271199CA00781945 /* Instance.swift in Sources */, DB0F8150264D1E2500F2A12B /* PickServerLoaderTableViewCell.swift in Sources */, - DB98337F25C9452D00AD9700 /* APIService+APIError.swift in Sources */, DB98EB5327B0F9890082E365 /* ReportHeadlineTableViewCell.swift in Sources */, DB5B729C273113C200081888 /* FollowingListViewModel+Diffable.swift in Sources */, DB9E0D6F25EE008500CFDD76 /* UIInterpolatingMotionEffect.swift in Sources */, @@ -4174,11 +3498,9 @@ DB63F76227996B6600455B82 /* SearchHistoryViewController+DataSourceProvider.swift in Sources */, DB73BF4927140BA300781945 /* UICollectionViewDiffableDataSource.swift in Sources */, DBA5E7AB263BD3F5004598BB /* TimelineTableViewCellContextMenuConfiguration.swift in Sources */, - DB3E6FE92806BD2200B035AE /* ThemeService.swift in Sources */, DB73B490261F030A002E9E9F /* SafariActivity.swift in Sources */, DB63F7492799126300455B82 /* FollowerListViewController+DataSourceProvider.swift in Sources */, DB6D1B44263691CF00ACB481 /* Mastodon+API+Subscriptions+Policy.swift in Sources */, - DB9A48962603685D008B817C /* MastodonAttachmentService+UploadState.swift in Sources */, 2D198643261BF09500F0B013 /* SearchResultItem.swift in Sources */, 2DAC9E38262FC2320062E1A6 /* SuggestionAccountViewController.swift in Sources */, DB66728C25F9F8DC00D60309 /* ComposeViewModel+DataSource.swift in Sources */, @@ -4187,20 +3509,14 @@ 5B90C45E262599800002E742 /* SettingsViewModel.swift in Sources */, DB5B54A12833A89600DEF8B2 /* FamiliarFollowersViewController+DataSourceProvider.swift in Sources */, 2D82B9FF25E7863200E36F0F /* OnboardingViewControllerAppearance.swift in Sources */, - DB73BF43271192BB00781945 /* InstanceService.swift in Sources */, - DB67D08427312970006A36CF /* APIService+Following.swift in Sources */, DB025B78278D606A002F581E /* StatusItem.swift in Sources */, DB697DD4278F4927004EF2F7 /* StatusTableViewCellDelegate.swift in Sources */, - DB0FCB902796C5EB006C02E2 /* APIService+Trend.swift in Sources */, DBA5E7A5263BD28C004598BB /* ContextMenuImagePreviewViewModel.swift in Sources */, DB3E6FF52807C40300B035AE /* DiscoveryForYouViewController.swift in Sources */, - DB9D7C21269824B80054B3DF /* APIService+Filter.swift in Sources */, 2D38F1E525CD46C100561493 /* HomeTimelineViewModel.swift in Sources */, DB0FCB842796B2A2006C02E2 /* FavoriteViewController+DataSourceProvider.swift in Sources */, DB0FCB68279507EF006C02E2 /* DataSourceFacade+Meta.swift in Sources */, - DB63F75C279956D000455B82 /* Persistence+Tag.swift in Sources */, 2D84350525FF858100EECE90 /* UIScrollView.swift in Sources */, - DB49A61F25FF32AA00B98345 /* EmojiService+CustomEmojiViewModel.swift in Sources */, 6213AF5A28939C8400BCADB6 /* BookmarkViewModel.swift in Sources */, 5B24BBDB262DB14800A9381B /* ReportStatusViewModel+Diffable.swift in Sources */, DB4F0968269ED8AD00D62E92 /* SearchHistoryTableHeaderView.swift in Sources */, @@ -4210,13 +3526,11 @@ DB852D1926FAEB6B00FC9D81 /* SidebarViewController.swift in Sources */, 2D206B9225F60EA700143C56 /* UIControl.swift in Sources */, DBDFF1932805554900557A48 /* DiscoveryPostsViewModel.swift in Sources */, - 2D9DB96B263A91D1007C1D71 /* APIService+DomainBlock.swift in Sources */, DBBF1DC92652538500E5B703 /* AutoCompleteSection.swift in Sources */, DB3E6FE72806A7A200B035AE /* DiscoveryItem.swift in Sources */, DB8AF55D25C138B7002E6C99 /* UIViewController.swift in Sources */, DBEFCD79282A147000C0ABEA /* ReportStatusViewModel.swift in Sources */, DB7F48452620241000796008 /* ProfileHeaderViewModel.swift in Sources */, - DB647C5926F1EA2700F7F82C /* WizardPreference.swift in Sources */, DB0A322E280EE9FD001729D2 /* DiscoveryIntroBannerView.swift in Sources */, 2D3F9E0425DFA133004262D9 /* UITapGestureRecognizer.swift in Sources */, 5DDDF1992617447F00311060 /* Mastodon+Entity+Tag.swift in Sources */, @@ -4224,11 +3538,9 @@ 2D694A7425F9EB4E0038ADDC /* ContentWarningOverlayView.swift in Sources */, DB0FCB7827957678006C02E2 /* DataSourceProvider+UITableViewDelegate.swift in Sources */, DB4932B126F1FB5300EF46D4 /* WizardCardView.swift in Sources */, - DB6D9F76263587C7008423CD /* SettingFetchedResultController.swift in Sources */, DB9A486C26032AC1008B817C /* AttachmentContainerView+EmptyStateView.swift in Sources */, 5D0393902612D259007FE196 /* WebViewController.swift in Sources */, DB98EB6227B215EB0082E365 /* ReportResultViewController.swift in Sources */, - DB6B74FA272FC2B500C70B6E /* APIService+Follower.swift in Sources */, DB6B74F4272FBAE700C70B6E /* FollowerListViewModel+Diffable.swift in Sources */, DB6B74F2272FB67600C70B6E /* FollowerListViewModel.swift in Sources */, DB44767B260B3B8C00B66B82 /* CustomEmojiPickerInputView.swift in Sources */, @@ -4239,19 +3551,13 @@ 5DF1056425F887CB00D6C0D4 /* AVPlayer.swift in Sources */, DB3E6FEF2806D82600B035AE /* DiscoveryNewsViewModel.swift in Sources */, DBBF1DCB2652539E00E5B703 /* AutoCompleteItem.swift in Sources */, - 2DA6054725F716A2006356F9 /* PlaybackState.swift in Sources */, DBC7A672260C897100E57475 /* StatusContentWarningEditorView.swift in Sources */, - DB025B95278D6530002F581E /* Persistence+MastodonUser.swift in Sources */, DB3667A6268AE2620027D07F /* ComposeStatusPollSection.swift in Sources */, DB6B750427300B4000C70B6E /* TimelineFooterTableViewCell.swift in Sources */, DB98EB4C27B0F2BC0082E365 /* ReportStatusTableViewCell+ViewModel.swift in Sources */, - DB59F10E25EF724F001F1DAB /* APIService+Poll.swift in Sources */, DB852D1F26FB037800FC9D81 /* SidebarViewModel.swift in Sources */, DB63F769279A5EBB00455B82 /* NotificationTimelineViewModel+Diffable.swift in Sources */, - DB47229725F9EFAD00DA7F53 /* NSManagedObjectContext.swift in Sources */, - DB63F75E27995B3B00455B82 /* Tag+Property.swift in Sources */, DBFEEC9B279BDDD9004F81DD /* ProfileAboutViewModel+Diffable.swift in Sources */, - 2D34D9D126148D9E0081BFC0 /* APIService+Recommend.swift in Sources */, DBB525562611EDCA002F1F29 /* UserTimelineViewModel.swift in Sources */, DB0618012785732C0030EE79 /* ServerRulesTableViewCell.swift in Sources */, DB221B16260C395900AEFE46 /* CustomEmojiPickerInputViewModel.swift in Sources */, @@ -4262,7 +3568,6 @@ DB3667A1268ABB2E0027D07F /* ComposeStatusAttachmentItem.swift in Sources */, DB1D186C25EF5BA7003F1F23 /* PollTableView.swift in Sources */, DBA94434265CBB5300C537E1 /* ProfileFieldSection.swift in Sources */, - DB336F28278D6EC70031E64B /* MastodonFieldContainer.swift in Sources */, DBCA0EBC282BB38A0029E2B0 /* PageboyNavigateable.swift in Sources */, DBF156E42702DB3F00EC00B7 /* HandleTapAction.swift in Sources */, DB98EB4727B0DFAA0082E365 /* ReportStatusViewModel+State.swift in Sources */, @@ -4270,8 +3575,6 @@ DB6B74F6272FBCDB00C70B6E /* FollowerListViewModel+State.swift in Sources */, DB87D4452609BE0500D12C0D /* ComposeStatusPollOptionCollectionViewCell.swift in Sources */, DBDFF197280556D900557A48 /* DiscoveryPostsViewModel+State.swift in Sources */, - DB336F2C278D6FC30031E64B /* Persistence+Status.swift in Sources */, - DB336F2A278D6F2B0031E64B /* MastodonField.swift in Sources */, DB0FCB7A279576A2006C02E2 /* DataSourceFacade+Thread.swift in Sources */, DB9F58EF26EF491E00E7BBE9 /* AccountListViewModel.swift in Sources */, DB6D9F7D26358ED4008423CD /* SettingsSection.swift in Sources */, @@ -4289,8 +3592,6 @@ DB1E346825F518E20079D7DF /* CategoryPickerSection.swift in Sources */, DB7274F4273BB9B200577D95 /* ListBatchFetchViewModel.swift in Sources */, DB0618052785A73D0030EE79 /* RegisterItem.swift in Sources */, - 2D61254D262547C200299647 /* APIService+Notification.swift in Sources */, - DB040ED126538E3D00BEE9D8 /* Trie.swift in Sources */, DB73BF4B27140C0800781945 /* UITableViewDiffableDataSource.swift in Sources */, DBB525642612C988002F1F29 /* MeProfileViewModel.swift in Sources */, DB3EA8EF281B837000598866 /* DiscoveryCommunityViewController+DataSourceProvider.swift in Sources */, @@ -4302,7 +3603,6 @@ DB938EED2623F79B00E5B6C1 /* ThreadViewModel.swift in Sources */, DB6988DE2848D11C002398EF /* PagerTabStripNavigateable.swift in Sources */, DBBC24AC26A53D9300398BB9 /* ComposeStatusContentTableViewCell.swift in Sources */, - DBC7A67C260DFADE00E57475 /* StatusPublishService.swift in Sources */, 2DCB73FD2615C13900EC03D4 /* SearchRecommendCollectionHeader.swift in Sources */, DB852D1C26FB021500FC9D81 /* RootSplitViewController.swift in Sources */, DB697DD1278F4871004EF2F7 /* AutoGenerateTableViewDelegate.swift in Sources */, @@ -4319,12 +3619,10 @@ DBBF1DC5265251C300E5B703 /* AutoCompleteViewModel+Diffable.swift in Sources */, DB603111279EB38500A935FE /* DataSourceFacade+Mute.swift in Sources */, DB68A04A25E9027700CFDF14 /* AdaptiveStatusBarStyleNavigationController.swift in Sources */, - DB336F38278D7AAF0031E64B /* Poll+Property.swift in Sources */, 0FB3D33825E6401400AAD544 /* PickServerCell.swift in Sources */, 6213AF5C28939C8A00BCADB6 /* BookmarkViewModel+State.swift in Sources */, DB6D9F8426358EEC008423CD /* SettingsItem.swift in Sources */, 2D364F7825E66D8300204FDC /* MastodonResendEmailViewModel.swift in Sources */, - DBA465932696B495002B41DB /* APIService+WebFinger.swift in Sources */, DBEFCD7B282A162400C0ABEA /* ReportReasonView.swift in Sources */, DB8AF54525C13647002E6C99 /* NeedsDependency.swift in Sources */, DB63F77B279ACAE500455B82 /* DataSourceFacade+Favorite.swift in Sources */, @@ -4344,36 +3642,27 @@ DBEFCD71282A12B200C0ABEA /* ReportReasonViewController.swift in Sources */, DB0140CF25C42AEE00F9F3CF /* OSLog.swift in Sources */, DB98EB5627B0FF1B0082E365 /* ReportViewControllerAppearance.swift in Sources */, - DB938F1526241FDF00E5B6C1 /* APIService+Thread.swift in Sources */, DB3EA8E6281B79E200598866 /* DiscoveryCommunityViewController.swift in Sources */, 2D206B8625F5FB0900143C56 /* Double.swift in Sources */, DB9F58F126EF512300E7BBE9 /* AccountListTableViewCell.swift in Sources */, 2D76319F25C1521200929FB9 /* StatusSection.swift in Sources */, DB938F0326240EA300E5B6C1 /* CachedThreadViewModel.swift in Sources */, - DB6D9F6326357848008423CD /* SettingService.swift in Sources */, 2D650FAB25ECDC9300851B58 /* Mastodon+Entity+Error+Detail.swift in Sources */, DBA5A53526F0A36A00CACBAA /* AddAccountTableViewCell.swift in Sources */, 2DB72C8C262D764300CE6173 /* Mastodon+Entity+Notification+Type.swift in Sources */, 2D35237A26256D920031AF25 /* NotificationSection.swift in Sources */, - DB084B5725CBC56C00F898ED /* Status.swift in Sources */, 2D4AD89C263165B500613EFC /* SuggestionAccountCollectionViewCell.swift in Sources */, DB98EB6927B21A7C0082E365 /* ReportResultActionTableViewCell.swift in Sources */, DB447691260B406600B66B82 /* CustomEmojiPickerItemCollectionViewCell.swift in Sources */, DB9282B225F3222800823B15 /* PickServerEmptyStateView.swift in Sources */, DB697DDF278F524F004EF2F7 /* DataSourceFacade+Profile.swift in Sources */, DB1FD45025F26FA1004CFCFC /* MastodonPickServerViewModel+Diffable.swift in Sources */, - DBD376AC2692ECDB007FEC24 /* ThemePreference.swift in Sources */, DB4F097D26A03A5B00D62E92 /* SearchHistoryItem.swift in Sources */, DBD5B1FA27BD013700BD6B38 /* DataSourceProvider+StatusTableViewControllerNavigateable.swift in Sources */, DB5B549A2833A60400DEF8B2 /* FamiliarFollowersViewController.swift in Sources */, DB3E6FE22806A50100B035AE /* DiscoveryHashtagsViewModel+Diffable.swift in Sources */, - DB68046C2636DC9E00430867 /* MastodonPushNotification.swift in Sources */, - DBAE3F9E2616E308004B8251 /* APIService+Mute.swift in Sources */, DB427DD625BAA00100D1B89D /* AppDelegate.swift in Sources */, - DB6D9F57263577D2008423CD /* APIService+CoreData+Setting.swift in Sources */, DB0FCB822796AC78006C02E2 /* UserTimelineViewController+DataSourceProvider.swift in Sources */, - DB63F773279A87DC00455B82 /* Notification+Property.swift in Sources */, - DBCBCC0D2680B908000F5B51 /* HomeTimelinePreference.swift in Sources */, DB0EF72E26FDB24F00347686 /* SidebarListContentView.swift in Sources */, DBBE1B4525F3474B0081417A /* MastodonPickServerAppearance.swift in Sources */, 2D7867192625B77500211898 /* NotificationItem.swift in Sources */, @@ -4382,36 +3671,20 @@ DBEFCD74282A130400C0ABEA /* ReportReasonViewModel.swift in Sources */, 2D5A3D0325CF8742002347D6 /* ControlContainableScrollViews.swift in Sources */, DB36679D268AB91B0027D07F /* ComposeStatusAttachmentTableViewCell.swift in Sources */, - DB98336B25C9420100AD9700 /* APIService+App.swift in Sources */, - DBFEF07B26A6BCE8006D7ED1 /* APIService+Status+Publish.swift in Sources */, DBA0A11325FB3FC10079C110 /* ComposeToolbarView.swift in Sources */, - 5B90C48526259BF10002E742 /* APIService+Subscriptions.swift in Sources */, DBFEEC96279BDC67004F81DD /* ProfileAboutViewController.swift in Sources */, DB63F74F2799405600455B82 /* SearchHistoryViewModel+Diffable.swift in Sources */, - DB336F23278D6DED0031E64B /* MastodonEmojiContainer.swift in Sources */, - 0F20223926146553000C64BF /* Array.swift in Sources */, DB0EF72B26FDB1D200347686 /* SidebarListCollectionViewCell.swift in Sources */, 5B90C460262599800002E742 /* SettingsAppearanceTableViewCell.swift in Sources */, DB63F74D27993F5B00455B82 /* SearchHistoryUserCollectionViewCell.swift in Sources */, DB8AF54425C13647002E6C99 /* SceneCoordinator.swift in Sources */, - DB73BF45271195AC00781945 /* APIService+CoreData+Instance.swift in Sources */, - DB336F21278D6D960031E64B /* MastodonEmoji.swift in Sources */, DB1D84382657B275000346B3 /* SegmentedControlNavigateable.swift in Sources */, - DB3EA8ED281B810100598866 /* APIService+PublicTimeline.swift in Sources */, DB447697260B439000B66B82 /* CustomEmojiPickerHeaderCollectionReusableView.swift in Sources */, - DB025B97278D66D5002F581E /* MastodonUser+Property.swift in Sources */, - DB45FAF925CA80A2005A8AC7 /* APIService+CoreData+MastodonAuthentication.swift in Sources */, - DB0FCB6C27950E29006C02E2 /* MastodonMentionContainer.swift in Sources */, - DB6D9F502635761F008423CD /* SubscriptionAlerts.swift in Sources */, 0F20220726134DA4000C64BF /* HashtagTimelineViewModel+Diffable.swift in Sources */, DB7A9F932818F33C0016AF98 /* MastodonServerRulesViewController+Debug.swift in Sources */, - DBE54AC62636C89F004E7C0B /* NotificationPreference.swift in Sources */, 2D5A3D2825CF8BC9002347D6 /* HomeTimelineViewModel+Diffable.swift in Sources */, - DB98339C25C96DE600AD9700 /* APIService+Account.swift in Sources */, DB6B74FC272FF55800C70B6E /* UserSection.swift in Sources */, - 2DF75BA725D10E1000694EC8 /* APIService+Favorite.swift in Sources */, DB0FCB862796BDA1006C02E2 /* SearchSection.swift in Sources */, - DB8AF52E25C13561002E6C99 /* ViewStateStore.swift in Sources */, DB1D61CF26F1B33600DA8662 /* WelcomeViewModel.swift in Sources */, 2DA7D04A25CA52CB00804E11 /* TimelineBottomLoaderTableViewCell.swift in Sources */, DBD376B2269302A4007FEC24 /* UITableViewCell.swift in Sources */, @@ -4424,7 +3697,6 @@ DB938F1F2624382F00E5B6C1 /* ThreadViewModel+Diffable.swift in Sources */, DB98EB6B27B243470082E365 /* SettingsAppearanceTableViewCell+ViewModel.swift in Sources */, DBB45B5B27B3A109002DC5A7 /* MediaPreviewTransitionViewController.swift in Sources */, - DB482A4B261340A7008AE74C /* APIService+UserTimeline.swift in Sources */, DB427DD825BAA00100D1B89D /* SceneDelegate.swift in Sources */, DB4932B926F31AD300EF46D4 /* BadgeButton.swift in Sources */, 0F2021FB2613262F000C64BF /* HashtagTimelineViewController.swift in Sources */, @@ -4437,10 +3709,8 @@ DB87D4512609CF1E00D12C0D /* ComposeStatusPollOptionAppendEntryCollectionViewCell.swift in Sources */, DBB45B5627B39FC9002DC5A7 /* MediaPreviewVideoViewController.swift in Sources */, DB0FCB8027968F70006C02E2 /* MastodonStatusThreadViewModel.swift in Sources */, - DB0FCB6E27950E6B006C02E2 /* MastodonMention.swift in Sources */, DB67D08627312E67006A36CF /* WizardViewController.swift in Sources */, DB6746EB278ED8B0008A6B94 /* PollOptionView+Configuration.swift in Sources */, - DB9A489026035963008B817C /* APIService+Media.swift in Sources */, DB0F9D54283EB3C000379AF8 /* ProfileHeaderView+ViewModel.swift in Sources */, DBFEEC99279BDCDE004F81DD /* ProfileAboutViewModel.swift in Sources */, 2D198649261C0B8500F0B013 /* SearchResultSection.swift in Sources */, @@ -4451,15 +3721,11 @@ DB3E6FF12806D96900B035AE /* DiscoveryNewsViewModel+Diffable.swift in Sources */, DB3E6FF82807C45300B035AE /* DiscoveryForYouViewModel.swift in Sources */, DB0F9D56283EB46200379AF8 /* ProfileHeaderView+Configuration.swift in Sources */, - DB49A62525FF334C00B98345 /* EmojiService+CustomEmojiViewModel+LoadState.swift in Sources */, - DB4924E226312AB200E9DB22 /* NotificationService.swift in Sources */, - DB6D9F6F2635807F008423CD /* Setting.swift in Sources */, DB6F5E38264E994A009108F4 /* AutoCompleteTopChevronView.swift in Sources */, DB6746F0278F463B008A6B94 /* AutoGenerateProtocolDelegate.swift in Sources */, DBB525412611ED54002F1F29 /* ProfileHeaderViewController.swift in Sources */, DBDFF19A28055A1400557A48 /* DiscoveryViewController.swift in Sources */, DB9D6BFF25E4F5940051B173 /* ProfileViewController.swift in Sources */, - DB63F756279949BD00455B82 /* Persistence+SearchHistory.swift in Sources */, 2D4AD8A226316CD200613EFC /* SelectedAccountSection.swift in Sources */, DB3EA8F1281B9EF600598866 /* DiscoveryCommunityViewModel+Diffable.swift in Sources */, DB63F775279A997D00455B82 /* NotificationTableViewCell+ViewModel.swift in Sources */, @@ -4473,14 +3739,12 @@ DB98EB4927B0F0CD0082E365 /* ReportStatusTableViewCell.swift in Sources */, DB3667A4268AE2370027D07F /* ComposeStatusPollTableViewCell.swift in Sources */, DBBF1DC226524D2900E5B703 /* AutoCompleteTableViewCell.swift in Sources */, - 5B24BBE2262DB19100A9381B /* APIService+Report.swift in Sources */, DBF3B7412733EB9400E21627 /* MastodonLocalCode.swift in Sources */, DB98EB6527B216500082E365 /* ReportResultViewModel.swift in Sources */, DB4F096A269EDAD200D62E92 /* SearchResultViewModel+State.swift in Sources */, 5BB04FF5262F0E6D0043BFF6 /* ReportSection.swift in Sources */, DBEFCD82282A2AB100C0ABEA /* ReportServerRulesView.swift in Sources */, DBA94436265CBB7400C537E1 /* ProfileFieldItem.swift in Sources */, - 6213AF5828939C4800BCADB6 /* APIService+Bookmark.swift in Sources */, DB023D2A27A0FE5C005AC798 /* DataSourceProvider+NotificationTableViewCellDelegate.swift in Sources */, DB98EB6027B10E150082E365 /* ReportCommentTableViewCell.swift in Sources */, DB0FCB962797E6C2006C02E2 /* SearchResultViewController+DataSourceProvider.swift in Sources */, @@ -4489,16 +3753,10 @@ DBD5B1F827BCFD9D00BD6B38 /* DataSourceProvider+TableViewControllerNavigateable.swift in Sources */, 0FB3D31E25E534C700AAD544 /* PickServerCategoryCollectionViewCell.swift in Sources */, DB0FCB882796BDA9006C02E2 /* SearchItem.swift in Sources */, - DB336F3D278D80040031E64B /* FeedFetchedResultsController.swift in Sources */, - DB6D9F4926353FD7008423CD /* Subscription.swift in Sources */, - DB45FB0F25CA87D0005A8AC7 /* AuthenticationService.swift in Sources */, DB6180ED26391C6C0018D199 /* TransitioningMath.swift in Sources */, - DB63F771279A858500455B82 /* Persistence+Notification.swift in Sources */, 2D6DE40026141DF600A63F6A /* SearchViewModel.swift in Sources */, - DBCCC71E25F73297007E1AB6 /* APIService+Reblog.swift in Sources */, DB0617FD27855BFE0030EE79 /* ServerRuleItem.swift in Sources */, 5BB04FD5262E7AFF0043BFF6 /* ReportViewController.swift in Sources */, - DBAE3F942616E28B004B8251 /* APIService+Follow.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4519,28 +3777,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DB68047B2637CD4C00430867 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DB73BF3B2711885500781945 /* UserDefaults+Notification.swift in Sources */, - DB4932B726F30F0700EF46D4 /* Array.swift in Sources */, - DB6804FD2637CFEC00430867 /* AppSecret.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DB8FABC226AEC7B2008E5AF4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( DB0009A726AEE5DC009B9D2D /* Intents.intentdefinition in Sources */, DBB8AB4626AECDE200F6D281 /* SendPostIntentHandler.swift in Sources */, - DBB8AB4A26AED0B500F6D281 /* APIService.swift in Sources */, - DBB8AB4C26AED11300F6D281 /* APIService+APIError.swift in Sources */, DB64BA452851F23000ADF1B7 /* MastodonAuthentication+Fetch.swift in Sources */, DB64BA482851F29300ADF1B7 /* Account+Fetch.swift in Sources */, - DB6746E9278ED63F008A6B94 /* MastodonAuthenticationBox.swift in Sources */, - DBB8AB5226AED1B300F6D281 /* APIService+Status+Publish.swift in Sources */, DB8FABCA26AEC7B2008E5AF4 /* IntentHandler.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -4550,20 +3794,13 @@ buildActionMask = 2147483647; files = ( DBFEF05E26A57715006D7ED1 /* ComposeView.swift in Sources */, - DBFEF07326A6913D006D7ED1 /* APIService.swift in Sources */, DBFEF06026A57715006D7ED1 /* StatusAttachmentView.swift in Sources */, DBC6462326A1712000B0E31B /* ShareViewModel.swift in Sources */, DBFEF06D26A67FB7006D7ED1 /* StatusAttachmentViewModel+UploadState.swift in Sources */, - DBBC24CB26A546C000398BB9 /* ThemePreference.swift in Sources */, DBFEF05F26A57715006D7ED1 /* StatusAuthorView.swift in Sources */, - DB336F1C278D697E0031E64B /* MastodonUser.swift in Sources */, DBFEF05D26A57715006D7ED1 /* ContentWarningEditorView.swift in Sources */, - DBFEF07526A69192006D7ED1 /* APIService+Media.swift in Sources */, - DBFEF06F26A690C4006D7ED1 /* APIService+APIError.swift in Sources */, DBFEF05C26A57715006D7ED1 /* StatusEditorView.swift in Sources */, - DBFEF07C26A6BD0A006D7ED1 /* APIService+Status+Publish.swift in Sources */, DBB3BA2B26A81D060004F2D4 /* FLAnimatedImageView.swift in Sources */, - DB6746E8278ED639008A6B94 /* MastodonAuthenticationBox.swift in Sources */, DBBC24A826A52F9000398BB9 /* ComposeToolbarView.swift in Sources */, DBFEF05B26A57715006D7ED1 /* ComposeViewModel.swift in Sources */, DBFEF06326A577F2006D7ED1 /* StatusAttachmentViewModel.swift in Sources */, @@ -4575,8 +3812,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DBE54ACC2636C8FD004E7C0B /* NotificationPreference.swift in Sources */, - DB68045B2636DC6A00430867 /* MastodonPushNotification.swift in Sources */, DB6D9F3526351B7A008423CD /* NotificationService+Decrypt.swift in Sources */, DB6804662636DC9000430867 /* String.swift in Sources */, DBCBCBF4267CB070000F5B51 /* Decode85.swift in Sources */, @@ -4597,36 +3832,16 @@ target = DB427DD125BAA00100D1B89D /* Mastodon */; targetProxy = DB427DF425BAA00100D1B89D /* PBXContainerItemProxy */; }; - DB6804852637CD4C00430867 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DB68047E2637CD4C00430867 /* AppShared */; - targetProxy = DB6804842637CD4C00430867 /* PBXContainerItemProxy */; - }; - DB6804A82637CDCC00430867 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DB68047E2637CD4C00430867 /* AppShared */; - targetProxy = DB6804A72637CDCC00430867 /* PBXContainerItemProxy */; - }; DB8FABCD26AEC7B2008E5AF4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DB8FABC526AEC7B2008E5AF4 /* MastodonIntent */; targetProxy = DB8FABCC26AEC7B2008E5AF4 /* PBXContainerItemProxy */; }; - DB8FABDA26AEC873008E5AF4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DB68047E2637CD4C00430867 /* AppShared */; - targetProxy = DB8FABD926AEC873008E5AF4 /* PBXContainerItemProxy */; - }; DBC6461B26A170AB00B0E31B /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DBC6461126A170AB00B0E31B /* ShareActionExtension */; targetProxy = DBC6461A26A170AB00B0E31B /* PBXContainerItemProxy */; }; - DBC6463626A195DB00B0E31B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DB68047E2637CD4C00430867 /* AppShared */; - targetProxy = DBC6463526A195DB00B0E31B /* PBXContainerItemProxy */; - }; DBF8AE19263293E400C9C23C /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = DBF8AE12263293E400C9C23C /* NotificationService */; @@ -5017,67 +4232,6 @@ }; name = Release; }; - DB6804892637CD4C00430867 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9A0982D8F349244EB558CDFD /* Pods-AppShared.debug.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 144; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 5Z4GVSS33P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 144; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = AppShared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.AppShared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - DB68048A2637CD4C00430867 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = ECA373ABA86BE3C2D7ED878E /* Pods-AppShared.release.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 144; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 5Z4GVSS33P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 144; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = AppShared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.AppShared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; DB848E2A282B5E6300A302CC /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5211,37 +4365,6 @@ }; name = Profile; }; - DB848E2E282B5E6300A302CC /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 63EF9E6E5B575CD2A8B0475D /* Pods-AppShared.profile.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 144; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 5Z4GVSS33P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 144; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = AppShared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.AppShared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Profile; - }; DB848E2F282B5E6300A302CC /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5538,36 +4661,6 @@ }; name = "Release Snapshot"; }; - DBEB19E527E4658E00B0E80E /* Release Snapshot */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3E08A432F40BA7B9CAA9DB68 /* Pods-AppShared.release snapshot.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 144; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 5Z4GVSS33P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 144; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = AppShared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.AppShared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = "Release Snapshot"; - }; DBEB19E627E4658E00B0E80E /* Release Snapshot */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5735,17 +4828,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DB6804882637CD4C00430867 /* Build configuration list for PBXNativeTarget "AppShared" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB6804892637CD4C00430867 /* Debug */, - DB848E2E282B5E6300A302CC /* Profile */, - DB68048A2637CD4C00430867 /* Release */, - DBEB19E527E4658E00B0E80E /* Release Snapshot */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; DB8FABCF26AEC7B2008E5AF4 /* Build configuration list for PBXNativeTarget "MastodonIntent" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -5781,269 +4863,22 @@ }; /* End XCConfigurationList section */ -/* Begin XCRemoteSwiftPackageReference section */ - 2D5981B825E4D7F8000FB903 /* XCRemoteSwiftPackageReference "ThirdPartyMailer" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/vtourraine/ThirdPartyMailer.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.7.1; - }; - }; - 2D61336725C18A4F00CAE157 /* XCRemoteSwiftPackageReference "AlamofireNetworkActivityIndicator" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Alamofire/AlamofireNetworkActivityIndicator"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 3.1.0; - }; - }; - 2D939AC625EE14620076FA61 /* XCRemoteSwiftPackageReference "TOCropViewController" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/TimOliver/TOCropViewController.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 2.6.0; - }; - }; - DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/MainasuK/CommonOSLog"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.1.1; - }; - }; - DB0E2D2C26833FF600865C3C /* XCRemoteSwiftPackageReference "Nuke-FLAnimatedImage-Plugin" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 8.0.0; - }; - }; - DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Alamofire/AlamofireImage.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.1.0; - }; - }; - DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Alamofire/Alamofire.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.4.0; - }; - }; - DB486C0D282E41F200F69423 /* XCRemoteSwiftPackageReference "TabBarPager" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/TwidereProject/TabBarPager.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.1.0; - }; - }; - DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/apple/swift-collections.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.0.5; - }; - }; - DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 4.2.2; - }; - }; - DB8D8E2D28192EED009FD90F /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/siteline/SwiftUI-Introspect.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 0.1.4; - }; - }; - DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/slackhq/PanModal.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.2.7; - }; - }; - DBAC6481267D0B21007FE9FD /* XCRemoteSwiftPackageReference "DifferenceKit" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/ra1028/DifferenceKit.git"; - requirement = { - kind = exactVersion; - version = 1.2.0; - }; - }; - DBAC649C267DFE43007FE9FD /* XCRemoteSwiftPackageReference "DiffableDataSources" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/MainasuK/DiffableDataSources.git"; - requirement = { - branch = "feature/async-display-table"; - kind = branch; - }; - }; - DBAC649F267E6D01007FE9FD /* XCRemoteSwiftPackageReference "Fuzi" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/cezheng/Fuzi.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 3.1.3; - }; - }; - DBB525062611EAC0002F1F29 /* XCRemoteSwiftPackageReference "Tabman" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/uias/Tabman"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 2.11.0; - }; - }; - DBF7A0FA26830C33004176A2 /* XCRemoteSwiftPackageReference "FPSIndicator" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/MainasuK/FPSIndicator.git"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.0.0; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - /* Begin XCSwiftPackageProductDependency section */ - 2D5981B925E4D7F8000FB903 /* ThirdPartyMailer */ = { - isa = XCSwiftPackageProductDependency; - package = 2D5981B825E4D7F8000FB903 /* XCRemoteSwiftPackageReference "ThirdPartyMailer" */; - productName = ThirdPartyMailer; - }; - 2D61336825C18A4F00CAE157 /* AlamofireNetworkActivityIndicator */ = { - isa = XCSwiftPackageProductDependency; - package = 2D61336725C18A4F00CAE157 /* XCRemoteSwiftPackageReference "AlamofireNetworkActivityIndicator" */; - productName = AlamofireNetworkActivityIndicator; - }; - 2D939AC725EE14620076FA61 /* CropViewController */ = { - isa = XCSwiftPackageProductDependency; - package = 2D939AC625EE14620076FA61 /* XCRemoteSwiftPackageReference "TOCropViewController" */; - productName = CropViewController; - }; - DB02EA0A280D180D00E751C5 /* KeychainAccess */ = { - isa = XCSwiftPackageProductDependency; - package = DB6804722637CC1200430867 /* XCRemoteSwiftPackageReference "KeychainAccess" */; - productName = KeychainAccess; - }; - DB3EA8F4281BB65200598866 /* MastodonSDK */ = { + DB22C92128E700A10082A9E9 /* MastodonSDK */ = { isa = XCSwiftPackageProductDependency; productName = MastodonSDK; }; - DB3EA8FB281BBAE100598866 /* AlamofireImage */ = { + DB22C92328E700A80082A9E9 /* MastodonSDK */ = { isa = XCSwiftPackageProductDependency; - package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; - productName = AlamofireImage; + productName = MastodonSDK; }; - DB3EA8FD281BBAF200598866 /* Alamofire */ = { + DB22C92528E700AF0082A9E9 /* MastodonSDK */ = { isa = XCSwiftPackageProductDependency; - package = DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; + productName = MastodonSDK; }; - DB3EA901281BBD5D00598866 /* CommonOSLog */ = { + DB22C92728E700B70082A9E9 /* MastodonSDK */ = { isa = XCSwiftPackageProductDependency; - package = DB0140BB25C40D7500F9F3CF /* XCRemoteSwiftPackageReference "CommonOSLog" */; - productName = CommonOSLog; - }; - DB3EA903281BBD9400598866 /* Introspect */ = { - isa = XCSwiftPackageProductDependency; - package = DB8D8E2D28192EED009FD90F /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; - productName = Introspect; - }; - DB3EA905281BBE8200598866 /* AlamofireImage */ = { - isa = XCSwiftPackageProductDependency; - package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; - productName = AlamofireImage; - }; - DB3EA907281BBE8200598866 /* AlamofireNetworkActivityIndicator */ = { - isa = XCSwiftPackageProductDependency; - package = 2D61336725C18A4F00CAE157 /* XCRemoteSwiftPackageReference "AlamofireNetworkActivityIndicator" */; - productName = AlamofireNetworkActivityIndicator; - }; - DB3EA909281BBE8200598866 /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - DB3EA90B281BBE9600598866 /* AlamofireImage */ = { - isa = XCSwiftPackageProductDependency; - package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; - productName = AlamofireImage; - }; - DB3EA90D281BBE9600598866 /* AlamofireNetworkActivityIndicator */ = { - isa = XCSwiftPackageProductDependency; - package = 2D61336725C18A4F00CAE157 /* XCRemoteSwiftPackageReference "AlamofireNetworkActivityIndicator" */; - productName = AlamofireNetworkActivityIndicator; - }; - DB3EA90F281BBE9600598866 /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - DB3EA911281BBEA800598866 /* AlamofireImage */ = { - isa = XCSwiftPackageProductDependency; - package = DB3D0FF125BAA61700EAA174 /* XCRemoteSwiftPackageReference "AlamofireImage" */; - productName = AlamofireImage; - }; - DB3EA913281BBEA800598866 /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = DB3EA8F6281BBA4C00598866 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - DB486C0E282E41F200F69423 /* TabBarPager */ = { - isa = XCSwiftPackageProductDependency; - package = DB486C0D282E41F200F69423 /* XCRemoteSwiftPackageReference "TabBarPager" */; - productName = TabBarPager; - }; - DB552D4E26BBD10C00E481F6 /* OrderedCollections */ = { - isa = XCSwiftPackageProductDependency; - package = DB552D4D26BBD10C00E481F6 /* XCRemoteSwiftPackageReference "swift-collections" */; - productName = OrderedCollections; - }; - DBA5A52E26F07ED800CACBAA /* PanModal */ = { - isa = XCSwiftPackageProductDependency; - package = DBA5A52D26F07ED800CACBAA /* XCRemoteSwiftPackageReference "PanModal" */; - productName = PanModal; - }; - DBAC6482267D0B21007FE9FD /* DifferenceKit */ = { - isa = XCSwiftPackageProductDependency; - package = DBAC6481267D0B21007FE9FD /* XCRemoteSwiftPackageReference "DifferenceKit" */; - productName = DifferenceKit; - }; - DBAC649D267DFE43007FE9FD /* DiffableDataSources */ = { - isa = XCSwiftPackageProductDependency; - package = DBAC649C267DFE43007FE9FD /* XCRemoteSwiftPackageReference "DiffableDataSources" */; - productName = DiffableDataSources; - }; - DBAC64A0267E6D02007FE9FD /* Fuzi */ = { - isa = XCSwiftPackageProductDependency; - package = DBAC649F267E6D01007FE9FD /* XCRemoteSwiftPackageReference "Fuzi" */; - productName = Fuzi; - }; - DBB525072611EAC0002F1F29 /* Tabman */ = { - isa = XCSwiftPackageProductDependency; - package = DBB525062611EAC0002F1F29 /* XCRemoteSwiftPackageReference "Tabman" */; - productName = Tabman; - }; - DBF7A0FB26830C33004176A2 /* FPSIndicator */ = { - isa = XCSwiftPackageProductDependency; - package = DBF7A0FA26830C33004176A2 /* XCRemoteSwiftPackageReference "FPSIndicator" */; - productName = FPSIndicator; + productName = MastodonSDK; }; /* End XCSwiftPackageProductDependency section */ }; diff --git a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist index 0a6b68822..498c362d6 100644 --- a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,13 +4,6 @@ SchemeUserState - AppShared.xcscheme_^#shared#^_ - - isShown - - orderHint - 6 - CoreDataStack.xcscheme_^#shared#^_ orderHint @@ -19,32 +12,27 @@ Mastodon - Profile.xcscheme_^#shared#^_ orderHint - 2 + 1 Mastodon - RTL.xcscheme_^#shared#^_ orderHint - 7 + 5 Mastodon - Release.xcscheme_^#shared#^_ orderHint - 3 + 2 Mastodon - Snapshot.xcscheme_^#shared#^_ orderHint - 4 - - Mastodon - ar.xcscheme - - orderHint - 5 + 3 Mastodon - ar.xcscheme_^#shared#^_ orderHint - 11 + 4 Mastodon - ca.xcscheme_^#shared#^_ @@ -111,11 +99,6 @@ orderHint 0 - MastodonIntent.xcscheme_^#shared#^_ - - orderHint - 22 - MastodonIntents.xcscheme_^#shared#^_ orderHint @@ -129,12 +112,12 @@ NotificationService.xcscheme_^#shared#^_ orderHint - 23 + 7 ShareActionExtension.xcscheme_^#shared#^_ orderHint - 24 + 6 SuppressBuildableAutocreation @@ -164,6 +147,11 @@ primary + DB8FABC526AEC7B2008E5AF4 + + primary + + diff --git a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved index 29c81554a..ebcacb501 100644 --- a/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Mastodon.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -19,15 +19,6 @@ "version": "4.2.0" } }, - { - "package": "AlamofireNetworkActivityIndicator", - "repositoryURL": "https://github.com/Alamofire/AlamofireNetworkActivityIndicator", - "state": { - "branch": null, - "revision": "392bed083e8d193aca16bfa684ee24e4bcff0510", - "version": "3.1.0" - } - }, { "package": "CommonOSLog", "repositoryURL": "https://github.com/MainasuK/CommonOSLog", @@ -37,24 +28,6 @@ "version": "0.1.1" } }, - { - "package": "DiffableDataSources", - "repositoryURL": "https://github.com/MainasuK/DiffableDataSources.git", - "state": { - "branch": "feature/async-display-table", - "revision": "73393a97690959d24387c95594c045c62d9c47cf", - "version": null - } - }, - { - "package": "DifferenceKit", - "repositoryURL": "https://github.com/ra1028/DifferenceKit.git", - "state": { - "branch": null, - "revision": "62745d7780deef4a023a792a1f8f763ec7bf9705", - "version": "1.2.0" - } - }, { "package": "FaviconFinder", "repositoryURL": "https://github.com/will-lumley/FaviconFinder.git", @@ -159,8 +132,8 @@ "repositoryURL": "https://github.com/apple/swift-collections.git", "state": { "branch": null, - "revision": "9d8719c8bebdc79740b6969c912ac706eb721d7a", - "version": "0.0.7" + "revision": "f504716c27d2e5d4144fa4794b12129301d17729", + "version": "1.0.3" } }, { @@ -222,8 +195,8 @@ "repositoryURL": "https://github.com/uias/Tabman", "state": { "branch": null, - "revision": "a9f10cb862a32e6a22549836af013abd6b0692d3", - "version": "2.12.0" + "revision": "4a4f7c755b875ffd4f9ef10d67a67883669d2465", + "version": "2.13.0" } }, { @@ -231,8 +204,8 @@ "repositoryURL": "https://github.com/vtourraine/ThirdPartyMailer.git", "state": { "branch": null, - "revision": "779da6ce0793b461ccbbac2804755c1e29b6fa63", - "version": "1.8.0" + "revision": "44c1cfaa6969963f22691aa67f88a69e3b6d651f", + "version": "2.1.0" } }, { @@ -244,6 +217,15 @@ "version": "2.6.1" } }, + { + "package": "UIHostingConfigurationBackport", + "repositoryURL": "https://github.com/woxtu/UIHostingConfigurationBackport.git", + "state": { + "branch": null, + "revision": "6091f2d38faa4b24fc2ca0389c651e2f666624a3", + "version": "0.1.0" + } + }, { "package": "UITextView+Placeholder", "repositoryURL": "https://github.com/MainasuK/UITextView-Placeholder.git", diff --git a/Mastodon/Coordinator/SceneCoordinator.swift b/Mastodon/Coordinator/SceneCoordinator.swift index 82c58e1f6..bdfa727a0 100644 --- a/Mastodon/Coordinator/SceneCoordinator.swift +++ b/Mastodon/Coordinator/SceneCoordinator.swift @@ -8,8 +8,9 @@ import UIKit import Combine import SafariServices import CoreDataStack -import MastodonSDK import PanModal +import MastodonSDK +import MastodonCore import MastodonAsset import MastodonLocalization diff --git a/Mastodon/Diffiable/Compose/AutoCompleteSection.swift b/Mastodon/Diffiable/Compose/AutoCompleteSection.swift index 1a2bf45f0..1260f398b 100644 --- a/Mastodon/Diffiable/Compose/AutoCompleteSection.swift +++ b/Mastodon/Diffiable/Compose/AutoCompleteSection.swift @@ -10,6 +10,7 @@ import MastodonSDK import MastodonMeta import MastodonAsset import MastodonLocalization +import MastodonCore enum AutoCompleteSection: Equatable, Hashable { case main diff --git a/Mastodon/Extension/CoreDataStack/MastodonUser.swift b/Mastodon/Extension/CoreDataStack/MastodonUser.swift deleted file mode 100644 index bc5f159d9..000000000 --- a/Mastodon/Extension/CoreDataStack/MastodonUser.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// MastodonUser.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021/2/3. -// - -import Foundation -import CoreDataStack -import MastodonSDK - -extension MastodonUser { - - public var profileURL: URL { - if let urlString = self.url, - let url = URL(string: urlString) { - return url - } else { - return URL(string: "https://\(self.domain)/@\(username)")! - } - } - - public var activityItems: [Any] { - var items: [Any] = [] - items.append(profileURL) - return items - } -} diff --git a/Mastodon/Helper/MastodonAuthenticationBox.swift b/Mastodon/Helper/MastodonAuthenticationBox.swift deleted file mode 100644 index 31c9649c6..000000000 --- a/Mastodon/Helper/MastodonAuthenticationBox.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// MastodonAuthenticationBox.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-7-20. -// - -import Foundation -import CoreDataStack -import MastodonSDK -import MastodonUI - -struct MastodonAuthenticationBox: UserIdentifier { - let authenticationRecord: ManagedObjectRecord - let domain: String - let userID: MastodonUser.ID - let appAuthorization: Mastodon.API.OAuth.Authorization - let userAuthorization: Mastodon.API.OAuth.Authorization -} diff --git a/Mastodon/Persistence/Extension/MastodonEmoji.swift b/Mastodon/Persistence/Extension/MastodonEmoji.swift deleted file mode 100644 index 2ea23c67c..000000000 --- a/Mastodon/Persistence/Extension/MastodonEmoji.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MastodonEmojis.swift -// MastodonEmojis -// -// Created by Cirno MainasuK on 2021-9-2. -// Copyright © 2021 Twidere. All rights reserved. -// - -import Foundation -import CoreDataStack -import MastodonSDK -import MastodonMeta - -extension MastodonEmoji { - public convenience init(emoji: Mastodon.Entity.Emoji) { - self.init( - code: emoji.shortcode, - url: emoji.url, - staticURL: emoji.staticURL, - visibleInPicker: emoji.visibleInPicker, - category: emoji.category - ) - } -} diff --git a/Mastodon/Preference/HomeTimelinePreference.swift b/Mastodon/Preference/HomeTimelinePreference.swift deleted file mode 100644 index 123692db5..000000000 --- a/Mastodon/Preference/HomeTimelinePreference.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// HomeTimelinePreference.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-6-21. -// - -import UIKit - -extension UserDefaults { - - @objc dynamic var preferAsyncHomeTimeline: Bool { - get { - register(defaults: [#function: false]) - return bool(forKey: #function) - } - set { self[#function] = newValue } - } - -} diff --git a/Mastodon/Preference/NotificationPreference.swift b/Mastodon/Preference/NotificationPreference.swift deleted file mode 100644 index 63092d56d..000000000 --- a/Mastodon/Preference/NotificationPreference.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// NotificationPreference.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-4-26. -// - -import UIKit -import MastodonExtension - -extension UserDefaults { - - @objc dynamic var notificationBadgeCount: Int { - get { - register(defaults: [#function: 0]) - return integer(forKey: #function) - } - set { self[#function] = newValue } - } - -} diff --git a/Mastodon/Preference/ThemePreference.swift b/Mastodon/Preference/ThemePreference.swift deleted file mode 100644 index 5465cb22f..000000000 --- a/Mastodon/Preference/ThemePreference.swift +++ /dev/null @@ -1,7 +0,0 @@ -// -// ThemePreference.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-7-5. -// - diff --git a/Mastodon/Scene/Account/AccountListViewModel.swift b/Mastodon/Scene/Account/AccountListViewModel.swift index 83d0240f8..3149b201d 100644 --- a/Mastodon/Scene/Account/AccountListViewModel.swift +++ b/Mastodon/Scene/Account/AccountListViewModel.swift @@ -11,6 +11,8 @@ import CoreData import CoreDataStack import MastodonSDK import MastodonMeta +import MastodonCore +import MastodonUI final class AccountListViewModel { diff --git a/Mastodon/Scene/Account/AccountViewController.swift b/Mastodon/Scene/Account/AccountViewController.swift index 20d7b26a1..6a97c6427 100644 --- a/Mastodon/Scene/Account/AccountViewController.swift +++ b/Mastodon/Scene/Account/AccountViewController.swift @@ -12,6 +12,7 @@ import CoreDataStack import PanModal import MastodonAsset import MastodonLocalization +import MastodonCore final class AccountListViewController: UIViewController, NeedsDependency { diff --git a/Mastodon/Scene/Account/Cell/AddAccountTableViewCell.swift b/Mastodon/Scene/Account/Cell/AddAccountTableViewCell.swift index c641434e6..3ff3066a2 100644 --- a/Mastodon/Scene/Account/Cell/AddAccountTableViewCell.swift +++ b/Mastodon/Scene/Account/Cell/AddAccountTableViewCell.swift @@ -10,6 +10,8 @@ import Combine import MetaTextKit import MastodonAsset import MastodonLocalization +import MastodonCore +import MastodonUI final class AddAccountTableViewCell: UITableViewCell { diff --git a/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel+State.swift b/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel+State.swift index 632b57b66..29016fafb 100644 --- a/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel+State.swift +++ b/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel+State.swift @@ -9,6 +9,7 @@ import os.log import Foundation import GameplayKit import MastodonSDK +import MastodonCore extension AutoCompleteViewModel { class State: GKState, NamingState { diff --git a/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel.swift b/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel.swift index 3110f93e3..ecc234612 100644 --- a/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel.swift +++ b/Mastodon/Scene/Compose/AutoComplete/AutoCompleteViewModel.swift @@ -9,6 +9,7 @@ import UIKit import Combine import GameplayKit import MastodonSDK +import MastodonCore final class AutoCompleteViewModel { @@ -16,13 +17,13 @@ final class AutoCompleteViewModel { // input let context: AppContext - let inputText = CurrentValueSubject("") // contains "@" or "#" prefix - let symbolBoundingRect = CurrentValueSubject(.zero) - let customEmojiViewModel = CurrentValueSubject(nil) + public let inputText = CurrentValueSubject("") // contains "@" or "#" prefix + public let symbolBoundingRect = CurrentValueSubject(.zero) + public let customEmojiViewModel = CurrentValueSubject(nil) // output - var autoCompleteItems = CurrentValueSubject<[AutoCompleteItem], Never>([]) - var diffableDataSource: UITableViewDiffableDataSource! + public var autoCompleteItems = CurrentValueSubject<[AutoCompleteItem], Never>([]) + public var diffableDataSource: UITableViewDiffableDataSource! private(set) lazy var stateMachine: GKStateMachine = { // exclude timeline middle fetcher state let stateMachine = GKStateMachine(states: [ diff --git a/Mastodon/Scene/Compose/CollectionViewCell/ComposeStatusAttachmentCollectionViewCell.swift b/Mastodon/Scene/Compose/CollectionViewCell/ComposeStatusAttachmentCollectionViewCell.swift index 76f011121..046247507 100644 --- a/Mastodon/Scene/Compose/CollectionViewCell/ComposeStatusAttachmentCollectionViewCell.swift +++ b/Mastodon/Scene/Compose/CollectionViewCell/ComposeStatusAttachmentCollectionViewCell.swift @@ -27,7 +27,7 @@ final class ComposeStatusAttachmentCollectionViewCell: UICollectionViewCell { weak var delegate: ComposeStatusAttachmentCollectionViewCellDelegate? - let attachmentContainerView = AttachmentContainerView() +// let attachmentContainerView = AttachmentContainerView() let removeButton: UIButton = { let button = HighlightDimmableButton() button.expandEdgeInsets = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10) @@ -45,11 +45,11 @@ final class ComposeStatusAttachmentCollectionViewCell: UICollectionViewCell { override func prepareForReuse() { super.prepareForReuse() - attachmentContainerView.activityIndicatorView.startAnimating() - attachmentContainerView.previewImageView.af.cancelImageRequest() - attachmentContainerView.previewImageView.image = .placeholder(color: .systemFill) - delegate = nil - disposeBag.removeAll() +// attachmentContainerView.activityIndicatorView.startAnimating() +// attachmentContainerView.previewImageView.af.cancelImageRequest() +// attachmentContainerView.previewImageView.image = .placeholder(color: .systemFill) +// delegate = nil +// disposeBag.removeAll() } override init(frame: CGRect) { @@ -73,31 +73,30 @@ extension ComposeStatusAttachmentCollectionViewCell { private func _init() { // selectionStyle = .none - attachmentContainerView.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(attachmentContainerView) - NSLayoutConstraint.activate([ - attachmentContainerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: ComposeStatusAttachmentCollectionViewCell.verticalMarginHeight), - attachmentContainerView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), - attachmentContainerView.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), - contentView.bottomAnchor.constraint(equalTo: attachmentContainerView.bottomAnchor, constant: ComposeStatusAttachmentCollectionViewCell.verticalMarginHeight), - attachmentContainerView.heightAnchor.constraint(equalToConstant: 205).priority(.defaultHigh), - ]) - - removeButton.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview(removeButton) - NSLayoutConstraint.activate([ - removeButton.centerXAnchor.constraint(equalTo: attachmentContainerView.trailingAnchor), - removeButton.centerYAnchor.constraint(equalTo: attachmentContainerView.topAnchor), - removeButton.widthAnchor.constraint(equalToConstant: ComposeStatusAttachmentCollectionViewCell.removeButtonSize.width).priority(.defaultHigh), - removeButton.heightAnchor.constraint(equalToConstant: ComposeStatusAttachmentCollectionViewCell.removeButtonSize.height).priority(.defaultHigh), - ]) - - removeButton.addTarget(self, action: #selector(ComposeStatusAttachmentCollectionViewCell.removeButtonDidPressed(_:)), for: .touchUpInside) +// attachmentContainerView.translatesAutoresizingMaskIntoConstraints = false +// contentView.addSubview(attachmentContainerView) +// NSLayoutConstraint.activate([ +// attachmentContainerView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: ComposeStatusAttachmentCollectionViewCell.verticalMarginHeight), +// attachmentContainerView.leadingAnchor.constraint(equalTo: contentView.readableContentGuide.leadingAnchor), +// attachmentContainerView.trailingAnchor.constraint(equalTo: contentView.readableContentGuide.trailingAnchor), +// contentView.bottomAnchor.constraint(equalTo: attachmentContainerView.bottomAnchor, constant: ComposeStatusAttachmentCollectionViewCell.verticalMarginHeight), +// attachmentContainerView.heightAnchor.constraint(equalToConstant: 205).priority(.defaultHigh), +// ]) +// +// removeButton.translatesAutoresizingMaskIntoConstraints = false +// contentView.addSubview(removeButton) +// NSLayoutConstraint.activate([ +// removeButton.centerXAnchor.constraint(equalTo: attachmentContainerView.trailingAnchor), +// removeButton.centerYAnchor.constraint(equalTo: attachmentContainerView.topAnchor), +// removeButton.widthAnchor.constraint(equalToConstant: ComposeStatusAttachmentCollectionViewCell.removeButtonSize.width).priority(.defaultHigh), +// removeButton.heightAnchor.constraint(equalToConstant: ComposeStatusAttachmentCollectionViewCell.removeButtonSize.height).priority(.defaultHigh), +// ]) +// +// removeButton.addTarget(self, action: #selector(ComposeStatusAttachmentCollectionViewCell.removeButtonDidPressed(_:)), for: .touchUpInside) } } - extension ComposeStatusAttachmentCollectionViewCell { @objc private func removeButtonDidPressed(_ sender: UIButton) { diff --git a/Mastodon/Scene/Compose/ComposeViewController.swift b/Mastodon/Scene/Compose/ComposeViewController.swift index f5dfc8ba3..8783c8c0e 100644 --- a/Mastodon/Scene/Compose/ComposeViewController.swift +++ b/Mastodon/Scene/Compose/ComposeViewController.swift @@ -74,17 +74,23 @@ final class ComposeViewController: UIViewController, NeedsDependency { publishButton.setTitleColor(Asset.Colors.Label.primaryReverse.color, for: .normal) } - let tableView: ComposeTableView = { - let tableView = ComposeTableView() - tableView.register(ComposeRepliedToStatusContentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeRepliedToStatusContentTableViewCell.self)) - tableView.register(ComposeStatusContentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeStatusContentTableViewCell.self)) - tableView.register(ComposeStatusAttachmentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeStatusAttachmentTableViewCell.self)) - tableView.alwaysBounceVertical = true - tableView.separatorStyle = .none - tableView.tableFooterView = UIView() - return tableView + let scrollView: UIScrollView = { + let scrollView = UIScrollView() + scrollView.alwaysBounceVertical = true + return scrollView }() +// let tableView: ComposeTableView = { +// let tableView = ComposeTableView() +// tableView.register(ComposeRepliedToStatusContentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeRepliedToStatusContentTableViewCell.self)) +// tableView.register(ComposeStatusContentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeStatusContentTableViewCell.self)) +// tableView.register(ComposeStatusAttachmentTableViewCell.self, forCellReuseIdentifier: String(describing: ComposeStatusAttachmentTableViewCell.self)) +// tableView.alwaysBounceVertical = true +// tableView.separatorStyle = .none +// tableView.tableFooterView = UIView() +// return tableView +// }() + var systemKeyboardHeight: CGFloat = .zero { didSet { // note: some system AutoLayout warning here @@ -202,13 +208,13 @@ extension ComposeViewController { publishButton.addTarget(self, action: #selector(ComposeViewController.publishBarButtonItemPressed(_:)), for: .touchUpInside) - tableView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(tableView) + scrollView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(scrollView) NSLayoutConstraint.activate([ - tableView.topAnchor.constraint(equalTo: view.topAnchor), - tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + scrollView.topAnchor.constraint(equalTo: view.topAnchor), + scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), ]) composeToolbarView.translatesAutoresizingMaskIntoConstraints = false @@ -232,318 +238,320 @@ extension ComposeViewController { view.bottomAnchor.constraint(equalTo: composeToolbarBackgroundView.bottomAnchor), ]) - tableView.delegate = self - viewModel.setupDataSource( - tableView: tableView, - metaTextDelegate: self, - metaTextViewDelegate: self, - customEmojiPickerInputViewModel: viewModel.customEmojiPickerInputViewModel, - composeStatusAttachmentCollectionViewCellDelegate: self, - composeStatusPollOptionCollectionViewCellDelegate: self, - composeStatusPollOptionAppendEntryCollectionViewCellDelegate: self, - composeStatusPollExpiresOptionCollectionViewCellDelegate: self - ) +// tableView.delegate = self +// viewModel.setupDataSource( +// tableView: tableView, +// metaTextDelegate: self, +// metaTextViewDelegate: self, +// customEmojiPickerInputViewModel: viewModel.customEmojiPickerInputViewModel, +// composeStatusAttachmentCollectionViewCellDelegate: self, +// composeStatusPollOptionCollectionViewCellDelegate: self, +// composeStatusPollOptionAppendEntryCollectionViewCellDelegate: self, +// composeStatusPollExpiresOptionCollectionViewCellDelegate: self +// ) - viewModel.composeStatusAttribute.$composeContent - .removeDuplicates() - .receive(on: DispatchQueue.main) - .sink { [weak self] _ in - guard let self = self else { return } - guard self.view.window != nil else { return } - UIView.performWithoutAnimation { - self.tableView.beginUpdates() - self.tableView.endUpdates() - } - } - .store(in: &disposeBag) +// viewModel.composeStatusAttribute.$composeContent +// .removeDuplicates() +// .receive(on: DispatchQueue.main) +// .sink { [weak self] _ in +// guard let self = self else { return } +// guard self.view.window != nil else { return } +// UIView.performWithoutAnimation { +// self.tableView.beginUpdates() +// self.tableView.setNeedsLayout() +// self.tableView.layoutIfNeeded() +// self.tableView.endUpdates() +// } +// } +// .store(in: &disposeBag) - customEmojiPickerInputView.collectionView.delegate = self - viewModel.customEmojiPickerInputViewModel.customEmojiPickerInputView = customEmojiPickerInputView - viewModel.setupCustomEmojiPickerDiffableDataSource( - for: customEmojiPickerInputView.collectionView, - dependency: self - ) +// customEmojiPickerInputView.collectionView.delegate = self +// viewModel.customEmojiPickerInputViewModel.customEmojiPickerInputView = customEmojiPickerInputView +// viewModel.setupCustomEmojiPickerDiffableDataSource( +// for: customEmojiPickerInputView.collectionView, +// dependency: self +// ) - viewModel.composeStatusContentTableViewCell.delegate = self - - // update layout when keyboard show/dismiss - view.layoutIfNeeded() - - let keyboardHasShortcutBar = CurrentValueSubject(traitCollection.userInterfaceIdiom == .pad) // update default value later - let keyboardEventPublishers = Publishers.CombineLatest3( - KeyboardResponderService.shared.isShow, - KeyboardResponderService.shared.state, - KeyboardResponderService.shared.endFrame - ) - Publishers.CombineLatest3( - keyboardEventPublishers, - viewModel.$isCustomEmojiComposing, - viewModel.$autoCompleteInfo - ) - .sink(receiveValue: { [weak self] keyboardEvents, isCustomEmojiComposing, autoCompleteInfo in - guard let self = self else { return } - - let (isShow, state, endFrame) = keyboardEvents - - switch self.traitCollection.userInterfaceIdiom { - case .pad: - keyboardHasShortcutBar.value = state != .floating - default: - keyboardHasShortcutBar.value = false - } - - let extraMargin: CGFloat = { - var margin = self.composeToolbarView.frame.height - if autoCompleteInfo != nil { - margin += ComposeViewController.minAutoCompleteVisibleHeight - } - return margin - }() - - guard isShow, state == .dock else { - self.tableView.contentInset.bottom = extraMargin - self.tableView.verticalScrollIndicatorInsets.bottom = extraMargin - - if let superView = self.autoCompleteViewController.tableView.superview { - let autoCompleteTableViewBottomInset: CGFloat = { - let tableViewFrameInWindow = superView.convert(self.autoCompleteViewController.tableView.frame, to: nil) - let padding = tableViewFrameInWindow.maxY + self.composeToolbarView.frame.height + AutoCompleteViewController.chevronViewHeight - self.view.frame.maxY - return max(0, padding) - }() - self.autoCompleteViewController.tableView.contentInset.bottom = autoCompleteTableViewBottomInset - self.autoCompleteViewController.tableView.verticalScrollIndicatorInsets.bottom = autoCompleteTableViewBottomInset - } - - UIView.animate(withDuration: 0.3) { - self.composeToolbarViewBottomLayoutConstraint.constant = self.view.safeAreaInsets.bottom - if self.view.window != nil { - self.view.layoutIfNeeded() - } - } - return - } - // isShow AND dock state - self.systemKeyboardHeight = endFrame.height - - // adjust inset for auto-complete - let autoCompleteTableViewBottomInset: CGFloat = { - guard let superview = self.autoCompleteViewController.tableView.superview else { return .zero } - let tableViewFrameInWindow = superview.convert(self.autoCompleteViewController.tableView.frame, to: nil) - let padding = tableViewFrameInWindow.maxY + self.composeToolbarView.frame.height + AutoCompleteViewController.chevronViewHeight - endFrame.minY - return max(0, padding) - }() - self.autoCompleteViewController.tableView.contentInset.bottom = autoCompleteTableViewBottomInset - self.autoCompleteViewController.tableView.verticalScrollIndicatorInsets.bottom = autoCompleteTableViewBottomInset - - // adjust inset for tableView - let contentFrame = self.view.convert(self.tableView.frame, to: nil) - let padding = contentFrame.maxY + extraMargin - endFrame.minY - guard padding > 0 else { - self.tableView.contentInset.bottom = self.view.safeAreaInsets.bottom + extraMargin - self.tableView.verticalScrollIndicatorInsets.bottom = self.view.safeAreaInsets.bottom + extraMargin - return - } - - self.tableView.contentInset.bottom = padding - self.view.safeAreaInsets.bottom - self.tableView.verticalScrollIndicatorInsets.bottom = padding - self.view.safeAreaInsets.bottom - UIView.animate(withDuration: 0.3) { - self.composeToolbarViewBottomLayoutConstraint.constant = endFrame.height - self.view.layoutIfNeeded() - } - }) - .store(in: &disposeBag) - - // bind auto-complete - viewModel.$autoCompleteInfo - .receive(on: DispatchQueue.main) - .sink { [weak self] info in - guard let self = self else { return } - let textEditorView = self.textEditorView - if self.autoCompleteViewController.view.superview == nil { - self.autoCompleteViewController.view.frame = self.view.bounds - // add to container view. seealso: `viewDidLayoutSubviews()` - self.viewModel.composeStatusContentTableViewCell.textEditorViewContainerView.addSubview(self.autoCompleteViewController.view) - self.addChild(self.autoCompleteViewController) - self.autoCompleteViewController.didMove(toParent: self) - self.autoCompleteViewController.view.isHidden = true - self.tableView.autoCompleteViewController = self.autoCompleteViewController - } - self.updateAutoCompleteViewControllerLayout() - self.autoCompleteViewController.view.isHidden = info == nil - guard let info = info else { return } - let symbolBoundingRectInContainer = textEditorView.textView.convert(info.symbolBoundingRect, to: self.autoCompleteViewController.chevronView) - self.autoCompleteViewController.view.frame.origin.y = info.textBoundingRect.maxY - self.autoCompleteViewController.viewModel.symbolBoundingRect.value = symbolBoundingRectInContainer - self.autoCompleteViewController.viewModel.inputText.value = String(info.inputText) - } - .store(in: &disposeBag) - - // bind publish bar button state - viewModel.$isPublishBarButtonItemEnabled - .receive(on: DispatchQueue.main) - .assign(to: \.isEnabled, on: publishButton) - .store(in: &disposeBag) - - // bind media button toolbar state - viewModel.$isMediaToolbarButtonEnabled - .receive(on: DispatchQueue.main) - .sink { [weak self] isMediaToolbarButtonEnabled in - guard let self = self else { return } - self.composeToolbarView.mediaBarButtonItem.isEnabled = isMediaToolbarButtonEnabled - self.composeToolbarView.mediaButton.isEnabled = isMediaToolbarButtonEnabled - } - .store(in: &disposeBag) - - // bind poll button toolbar state - viewModel.$isPollToolbarButtonEnabled - .receive(on: DispatchQueue.main) - .sink { [weak self] isPollToolbarButtonEnabled in - guard let self = self else { return } - self.composeToolbarView.pollBarButtonItem.isEnabled = isPollToolbarButtonEnabled - self.composeToolbarView.pollButton.isEnabled = isPollToolbarButtonEnabled - } - .store(in: &disposeBag) - - Publishers.CombineLatest( - viewModel.$isPollComposing, - viewModel.$isPollToolbarButtonEnabled - ) - .receive(on: DispatchQueue.main) - .sink { [weak self] isPollComposing, isPollToolbarButtonEnabled in - guard let self = self else { return } - guard isPollToolbarButtonEnabled else { - let accessibilityLabel = L10n.Scene.Compose.Accessibility.appendPoll - self.composeToolbarView.pollBarButtonItem.accessibilityLabel = accessibilityLabel - self.composeToolbarView.pollButton.accessibilityLabel = accessibilityLabel - return - } - let accessibilityLabel = isPollComposing ? L10n.Scene.Compose.Accessibility.removePoll : L10n.Scene.Compose.Accessibility.appendPoll - self.composeToolbarView.pollBarButtonItem.accessibilityLabel = accessibilityLabel - self.composeToolbarView.pollButton.accessibilityLabel = accessibilityLabel - } - .store(in: &disposeBag) - - // bind image picker toolbar state - viewModel.$attachmentServices - .receive(on: DispatchQueue.main) - .sink { [weak self] attachmentServices in - guard let self = self else { return } - let isEnabled = attachmentServices.count < self.viewModel.maxMediaAttachments - self.composeToolbarView.mediaBarButtonItem.isEnabled = isEnabled - self.composeToolbarView.mediaButton.isEnabled = isEnabled - self.resetImagePicker() - } - .store(in: &disposeBag) - - // bind content warning button state - viewModel.$isContentWarningComposing - .receive(on: DispatchQueue.main) - .sink { [weak self] isContentWarningComposing in - guard let self = self else { return } - let accessibilityLabel = isContentWarningComposing ? L10n.Scene.Compose.Accessibility.disableContentWarning : L10n.Scene.Compose.Accessibility.enableContentWarning - self.composeToolbarView.contentWarningBarButtonItem.accessibilityLabel = accessibilityLabel - self.composeToolbarView.contentWarningButton.accessibilityLabel = accessibilityLabel - } - .store(in: &disposeBag) - - // bind visibility toolbar UI - Publishers.CombineLatest( - viewModel.$selectedStatusVisibility, - viewModel.traitCollectionDidChangePublisher - ) - .receive(on: DispatchQueue.main) - .sink { [weak self] type, _ in - guard let self = self else { return } - let image = type.image(interfaceStyle: self.traitCollection.userInterfaceStyle) - self.composeToolbarView.visibilityBarButtonItem.image = image - self.composeToolbarView.visibilityButton.setImage(image, for: .normal) - self.composeToolbarView.activeVisibilityType.value = type - } - .store(in: &disposeBag) - - viewModel.$characterCount - .receive(on: DispatchQueue.main) - .sink { [weak self] characterCount in - guard let self = self else { return } - let count = self.viewModel.composeContentLimit - characterCount - self.composeToolbarView.characterCountLabel.text = "\(count)" - self.characterCountLabel.text = "\(count)" - let font: UIFont - let textColor: UIColor - let accessibilityLabel: String - switch count { - case _ where count < 0: - font = .monospacedDigitSystemFont(ofSize: 24, weight: .bold) - textColor = Asset.Colors.danger.color - accessibilityLabel = L10n.A11y.Plural.Count.inputLimitExceeds(abs(count)) - default: - font = .monospacedDigitSystemFont(ofSize: 15, weight: .regular) - textColor = Asset.Colors.Label.secondary.color - accessibilityLabel = L10n.A11y.Plural.Count.inputLimitRemains(count) - } - self.composeToolbarView.characterCountLabel.font = font - self.composeToolbarView.characterCountLabel.textColor = textColor - self.composeToolbarView.characterCountLabel.accessibilityLabel = accessibilityLabel - self.characterCountLabel.font = font - self.characterCountLabel.textColor = textColor - self.characterCountLabel.accessibilityLabel = accessibilityLabel - self.characterCountLabel.sizeToFit() - } - .store(in: &disposeBag) - - // bind custom emoji picker UI - viewModel.customEmojiViewModel?.emojis - .receive(on: DispatchQueue.main) - .sink(receiveValue: { [weak self] emojis in - guard let self = self else { return } - if emojis.isEmpty { - self.customEmojiPickerInputView.activityIndicatorView.startAnimating() - } else { - self.customEmojiPickerInputView.activityIndicatorView.stopAnimating() - } - }) - .store(in: &disposeBag) - - // setup snap behavior - Publishers.CombineLatest( - viewModel.$repliedToCellFrame, - viewModel.$collectionViewState - ) - .receive(on: DispatchQueue.main) - .sink { [weak self] repliedToCellFrame, collectionViewState in - guard let self = self else { return } - guard repliedToCellFrame != .zero else { return } - switch collectionViewState { - case .fold: - self.tableView.contentInset.top = -repliedToCellFrame.height - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: set contentInset.top: -%s", ((#file as NSString).lastPathComponent), #line, #function, repliedToCellFrame.height.description) - - case .expand: - self.tableView.contentInset.top = 0 - } - } - .store(in: &disposeBag) - - configureToolbarDisplay(keyboardHasShortcutBar: keyboardHasShortcutBar.value) - Publishers.CombineLatest( - keyboardHasShortcutBar, - viewModel.traitCollectionDidChangePublisher - ) - .receive(on: DispatchQueue.main) - .sink { [weak self] keyboardHasShortcutBar, _ in - guard let self = self else { return } - self.configureToolbarDisplay(keyboardHasShortcutBar: keyboardHasShortcutBar) - } - .store(in: &disposeBag) +// viewModel.composeStatusContentTableViewCell.delegate = self +// +// // update layout when keyboard show/dismiss +// view.layoutIfNeeded() +// +// let keyboardHasShortcutBar = CurrentValueSubject(traitCollection.userInterfaceIdiom == .pad) // update default value later +// let keyboardEventPublishers = Publishers.CombineLatest3( +// KeyboardResponderService.shared.isShow, +// KeyboardResponderService.shared.state, +// KeyboardResponderService.shared.endFrame +// ) +// Publishers.CombineLatest3( +// keyboardEventPublishers, +// viewModel.$isCustomEmojiComposing, +// viewModel.$autoCompleteInfo +// ) +// .sink(receiveValue: { [weak self] keyboardEvents, isCustomEmojiComposing, autoCompleteInfo in +// guard let self = self else { return } +// +// let (isShow, state, endFrame) = keyboardEvents +// +// switch self.traitCollection.userInterfaceIdiom { +// case .pad: +// keyboardHasShortcutBar.value = state != .floating +// default: +// keyboardHasShortcutBar.value = false +// } +// +// let extraMargin: CGFloat = { +// var margin = self.composeToolbarView.frame.height +// if autoCompleteInfo != nil { +// margin += ComposeViewController.minAutoCompleteVisibleHeight +// } +// return margin +// }() +// +// guard isShow, state == .dock else { +// self.tableView.contentInset.bottom = extraMargin +// self.tableView.verticalScrollIndicatorInsets.bottom = extraMargin +// +// if let superView = self.autoCompleteViewController.tableView.superview { +// let autoCompleteTableViewBottomInset: CGFloat = { +// let tableViewFrameInWindow = superView.convert(self.autoCompleteViewController.tableView.frame, to: nil) +// let padding = tableViewFrameInWindow.maxY + self.composeToolbarView.frame.height + AutoCompleteViewController.chevronViewHeight - self.view.frame.maxY +// return max(0, padding) +// }() +// self.autoCompleteViewController.tableView.contentInset.bottom = autoCompleteTableViewBottomInset +// self.autoCompleteViewController.tableView.verticalScrollIndicatorInsets.bottom = autoCompleteTableViewBottomInset +// } +// +// UIView.animate(withDuration: 0.3) { +// self.composeToolbarViewBottomLayoutConstraint.constant = self.view.safeAreaInsets.bottom +// if self.view.window != nil { +// self.view.layoutIfNeeded() +// } +// } +// return +// } +// // isShow AND dock state +// self.systemKeyboardHeight = endFrame.height +// +// // adjust inset for auto-complete +// let autoCompleteTableViewBottomInset: CGFloat = { +// guard let superview = self.autoCompleteViewController.tableView.superview else { return .zero } +// let tableViewFrameInWindow = superview.convert(self.autoCompleteViewController.tableView.frame, to: nil) +// let padding = tableViewFrameInWindow.maxY + self.composeToolbarView.frame.height + AutoCompleteViewController.chevronViewHeight - endFrame.minY +// return max(0, padding) +// }() +// self.autoCompleteViewController.tableView.contentInset.bottom = autoCompleteTableViewBottomInset +// self.autoCompleteViewController.tableView.verticalScrollIndicatorInsets.bottom = autoCompleteTableViewBottomInset +// +// // adjust inset for tableView +// let contentFrame = self.view.convert(self.tableView.frame, to: nil) +// let padding = contentFrame.maxY + extraMargin - endFrame.minY +// guard padding > 0 else { +// self.tableView.contentInset.bottom = self.view.safeAreaInsets.bottom + extraMargin +// self.tableView.verticalScrollIndicatorInsets.bottom = self.view.safeAreaInsets.bottom + extraMargin +// return +// } +// +// self.tableView.contentInset.bottom = padding - self.view.safeAreaInsets.bottom +// self.tableView.verticalScrollIndicatorInsets.bottom = padding - self.view.safeAreaInsets.bottom +// UIView.animate(withDuration: 0.3) { +// self.composeToolbarViewBottomLayoutConstraint.constant = endFrame.height +// self.view.layoutIfNeeded() +// } +// }) +// .store(in: &disposeBag) +// +// // bind auto-complete +// viewModel.$autoCompleteInfo +// .receive(on: DispatchQueue.main) +// .sink { [weak self] info in +// guard let self = self else { return } +// let textEditorView = self.textEditorView +// if self.autoCompleteViewController.view.superview == nil { +// self.autoCompleteViewController.view.frame = self.view.bounds +// // add to container view. seealso: `viewDidLayoutSubviews()` +// self.viewModel.composeStatusContentTableViewCell.textEditorViewContainerView.addSubview(self.autoCompleteViewController.view) +// self.addChild(self.autoCompleteViewController) +// self.autoCompleteViewController.didMove(toParent: self) +// self.autoCompleteViewController.view.isHidden = true +// self.tableView.autoCompleteViewController = self.autoCompleteViewController +// } +// self.updateAutoCompleteViewControllerLayout() +// self.autoCompleteViewController.view.isHidden = info == nil +// guard let info = info else { return } +// let symbolBoundingRectInContainer = textEditorView.textView.convert(info.symbolBoundingRect, to: self.autoCompleteViewController.chevronView) +// self.autoCompleteViewController.view.frame.origin.y = info.textBoundingRect.maxY +// self.autoCompleteViewController.viewModel.symbolBoundingRect.value = symbolBoundingRectInContainer +// self.autoCompleteViewController.viewModel.inputText.value = String(info.inputText) +// } +// .store(in: &disposeBag) +// +// // bind publish bar button state +// viewModel.$isPublishBarButtonItemEnabled +// .receive(on: DispatchQueue.main) +// .assign(to: \.isEnabled, on: publishButton) +// .store(in: &disposeBag) +// +// // bind media button toolbar state +// viewModel.$isMediaToolbarButtonEnabled +// .receive(on: DispatchQueue.main) +// .sink { [weak self] isMediaToolbarButtonEnabled in +// guard let self = self else { return } +// self.composeToolbarView.mediaBarButtonItem.isEnabled = isMediaToolbarButtonEnabled +// self.composeToolbarView.mediaButton.isEnabled = isMediaToolbarButtonEnabled +// } +// .store(in: &disposeBag) +// +// // bind poll button toolbar state +// viewModel.$isPollToolbarButtonEnabled +// .receive(on: DispatchQueue.main) +// .sink { [weak self] isPollToolbarButtonEnabled in +// guard let self = self else { return } +// self.composeToolbarView.pollBarButtonItem.isEnabled = isPollToolbarButtonEnabled +// self.composeToolbarView.pollButton.isEnabled = isPollToolbarButtonEnabled +// } +// .store(in: &disposeBag) +// +// Publishers.CombineLatest( +// viewModel.$isPollComposing, +// viewModel.$isPollToolbarButtonEnabled +// ) +// .receive(on: DispatchQueue.main) +// .sink { [weak self] isPollComposing, isPollToolbarButtonEnabled in +// guard let self = self else { return } +// guard isPollToolbarButtonEnabled else { +// let accessibilityLabel = L10n.Scene.Compose.Accessibility.appendPoll +// self.composeToolbarView.pollBarButtonItem.accessibilityLabel = accessibilityLabel +// self.composeToolbarView.pollButton.accessibilityLabel = accessibilityLabel +// return +// } +// let accessibilityLabel = isPollComposing ? L10n.Scene.Compose.Accessibility.removePoll : L10n.Scene.Compose.Accessibility.appendPoll +// self.composeToolbarView.pollBarButtonItem.accessibilityLabel = accessibilityLabel +// self.composeToolbarView.pollButton.accessibilityLabel = accessibilityLabel +// } +// .store(in: &disposeBag) +// +// // bind image picker toolbar state +// viewModel.$attachmentServices +// .receive(on: DispatchQueue.main) +// .sink { [weak self] attachmentServices in +// guard let self = self else { return } +// let isEnabled = attachmentServices.count < self.viewModel.maxMediaAttachments +// self.composeToolbarView.mediaBarButtonItem.isEnabled = isEnabled +// self.composeToolbarView.mediaButton.isEnabled = isEnabled +// self.resetImagePicker() +// } +// .store(in: &disposeBag) +// +// // bind content warning button state +// viewModel.$isContentWarningComposing +// .receive(on: DispatchQueue.main) +// .sink { [weak self] isContentWarningComposing in +// guard let self = self else { return } +// let accessibilityLabel = isContentWarningComposing ? L10n.Scene.Compose.Accessibility.disableContentWarning : L10n.Scene.Compose.Accessibility.enableContentWarning +// self.composeToolbarView.contentWarningBarButtonItem.accessibilityLabel = accessibilityLabel +// self.composeToolbarView.contentWarningButton.accessibilityLabel = accessibilityLabel +// } +// .store(in: &disposeBag) +// +// // bind visibility toolbar UI +// Publishers.CombineLatest( +// viewModel.$selectedStatusVisibility, +// viewModel.traitCollectionDidChangePublisher +// ) +// .receive(on: DispatchQueue.main) +// .sink { [weak self] type, _ in +// guard let self = self else { return } +// let image = type.image(interfaceStyle: self.traitCollection.userInterfaceStyle) +// self.composeToolbarView.visibilityBarButtonItem.image = image +// self.composeToolbarView.visibilityButton.setImage(image, for: .normal) +// self.composeToolbarView.activeVisibilityType.value = type +// } +// .store(in: &disposeBag) +// +// viewModel.$characterCount +// .receive(on: DispatchQueue.main) +// .sink { [weak self] characterCount in +// guard let self = self else { return } +// let count = self.viewModel.composeContentLimit - characterCount +// self.composeToolbarView.characterCountLabel.text = "\(count)" +// self.characterCountLabel.text = "\(count)" +// let font: UIFont +// let textColor: UIColor +// let accessibilityLabel: String +// switch count { +// case _ where count < 0: +// font = .monospacedDigitSystemFont(ofSize: 24, weight: .bold) +// textColor = Asset.Colors.danger.color +// accessibilityLabel = L10n.A11y.Plural.Count.inputLimitExceeds(abs(count)) +// default: +// font = .monospacedDigitSystemFont(ofSize: 15, weight: .regular) +// textColor = Asset.Colors.Label.secondary.color +// accessibilityLabel = L10n.A11y.Plural.Count.inputLimitRemains(count) +// } +// self.composeToolbarView.characterCountLabel.font = font +// self.composeToolbarView.characterCountLabel.textColor = textColor +// self.composeToolbarView.characterCountLabel.accessibilityLabel = accessibilityLabel +// self.characterCountLabel.font = font +// self.characterCountLabel.textColor = textColor +// self.characterCountLabel.accessibilityLabel = accessibilityLabel +// self.characterCountLabel.sizeToFit() +// } +// .store(in: &disposeBag) +// +// // bind custom emoji picker UI +// viewModel.customEmojiViewModel?.emojis +// .receive(on: DispatchQueue.main) +// .sink(receiveValue: { [weak self] emojis in +// guard let self = self else { return } +// if emojis.isEmpty { +// self.customEmojiPickerInputView.activityIndicatorView.startAnimating() +// } else { +// self.customEmojiPickerInputView.activityIndicatorView.stopAnimating() +// } +// }) +// .store(in: &disposeBag) +// +// // setup snap behavior +// Publishers.CombineLatest( +// viewModel.$repliedToCellFrame, +// viewModel.$collectionViewState +// ) +// .receive(on: DispatchQueue.main) +// .sink { [weak self] repliedToCellFrame, collectionViewState in +// guard let self = self else { return } +// guard repliedToCellFrame != .zero else { return } +// switch collectionViewState { +// case .fold: +// self.tableView.contentInset.top = -repliedToCellFrame.height +// os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: set contentInset.top: -%s", ((#file as NSString).lastPathComponent), #line, #function, repliedToCellFrame.height.description) +// +// case .expand: +// self.tableView.contentInset.top = 0 +// } +// } +// .store(in: &disposeBag) +// +// configureToolbarDisplay(keyboardHasShortcutBar: keyboardHasShortcutBar.value) +// Publishers.CombineLatest( +// keyboardHasShortcutBar, +// viewModel.traitCollectionDidChangePublisher +// ) +// .receive(on: DispatchQueue.main) +// .sink { [weak self] keyboardHasShortcutBar, _ in +// guard let self = self else { return } +// self.configureToolbarDisplay(keyboardHasShortcutBar: keyboardHasShortcutBar) +// } +// .store(in: &disposeBag) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - // update MetaText without trigger call underlaying `UITextStorage.processEditing` - _ = textEditorView.processEditing(textEditorView.textStorage) +// // update MetaText without trigger call underlaying `UITextStorage.processEditing` +// _ = textEditorView.processEditing(textEditorView.textStorage) - markTextEditorViewBecomeFirstResponser() +// markTextEditorViewBecomeFirstResponser() } override func viewDidAppear(_ animated: Bool) { @@ -678,8 +686,8 @@ extension ComposeViewController { } }) view.backgroundColor = backgroundColor - tableView.backgroundColor = backgroundColor - composeToolbarBackgroundView.backgroundColor = theme.composeToolbarBackgroundColor +// tableView.backgroundColor = backgroundColor +// composeToolbarBackgroundView.backgroundColor = theme.composeToolbarBackgroundColor } // keyboard shortcutBar @@ -991,53 +999,53 @@ extension ComposeViewController: ComposeToolbarViewDelegate { // MARK: - UIScrollViewDelegate extension ComposeViewController { - func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { - guard scrollView === tableView else { return } - - let repliedToCellFrame = viewModel.repliedToCellFrame - guard repliedToCellFrame != .zero else { return } - - // try to find some patterns: - // print(""" - // repliedToCellFrame: \(viewModel.repliedToCellFrame.value.height) - // scrollView.contentOffset.y: \(scrollView.contentOffset.y) - // scrollView.contentSize.height: \(scrollView.contentSize.height) - // scrollView.frame: \(scrollView.frame) - // scrollView.adjustedContentInset.top: \(scrollView.adjustedContentInset.top) - // scrollView.adjustedContentInset.bottom: \(scrollView.adjustedContentInset.bottom) - // """) - - switch viewModel.collectionViewState { - case .fold: - os_log("%{public}s[%{public}ld], %{public}s: fold", ((#file as NSString).lastPathComponent), #line, #function) - guard velocity.y < 0 else { return } - let offsetY = scrollView.contentOffset.y + scrollView.adjustedContentInset.top - if offsetY < -44 { - tableView.contentInset.top = 0 - targetContentOffset.pointee = CGPoint(x: 0, y: -scrollView.adjustedContentInset.top) - viewModel.collectionViewState = .expand - } - - case .expand: - os_log("%{public}s[%{public}ld], %{public}s: expand", ((#file as NSString).lastPathComponent), #line, #function) - guard velocity.y > 0 else { return } - // check if top across - let topOffset = (scrollView.contentOffset.y + scrollView.adjustedContentInset.top) - repliedToCellFrame.height - - // check if bottom bounce - let bottomOffsetY = scrollView.contentOffset.y + (scrollView.frame.height - scrollView.adjustedContentInset.bottom) - let bottomOffset = bottomOffsetY - scrollView.contentSize.height - - if topOffset > 44 { - // do not interrupt user scrolling - viewModel.collectionViewState = .fold - } else if bottomOffset > 44 { - tableView.contentInset.top = -repliedToCellFrame.height - targetContentOffset.pointee = CGPoint(x: 0, y: -repliedToCellFrame.height) - viewModel.collectionViewState = .fold - } - } - } +// func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { +// guard scrollView === tableView else { return } +// +// let repliedToCellFrame = viewModel.repliedToCellFrame +// guard repliedToCellFrame != .zero else { return } +// +// // try to find some patterns: +// // print(""" +// // repliedToCellFrame: \(viewModel.repliedToCellFrame.value.height) +// // scrollView.contentOffset.y: \(scrollView.contentOffset.y) +// // scrollView.contentSize.height: \(scrollView.contentSize.height) +// // scrollView.frame: \(scrollView.frame) +// // scrollView.adjustedContentInset.top: \(scrollView.adjustedContentInset.top) +// // scrollView.adjustedContentInset.bottom: \(scrollView.adjustedContentInset.bottom) +// // """) +// +// switch viewModel.collectionViewState { +// case .fold: +// os_log("%{public}s[%{public}ld], %{public}s: fold", ((#file as NSString).lastPathComponent), #line, #function) +// guard velocity.y < 0 else { return } +// let offsetY = scrollView.contentOffset.y + scrollView.adjustedContentInset.top +// if offsetY < -44 { +// tableView.contentInset.top = 0 +// targetContentOffset.pointee = CGPoint(x: 0, y: -scrollView.adjustedContentInset.top) +// viewModel.collectionViewState = .expand +// } +// +// case .expand: +// os_log("%{public}s[%{public}ld], %{public}s: expand", ((#file as NSString).lastPathComponent), #line, #function) +// guard velocity.y > 0 else { return } +// // check if top across +// let topOffset = (scrollView.contentOffset.y + scrollView.adjustedContentInset.top) - repliedToCellFrame.height +// +// // check if bottom bounce +// let bottomOffsetY = scrollView.contentOffset.y + (scrollView.frame.height - scrollView.adjustedContentInset.bottom) +// let bottomOffset = bottomOffsetY - scrollView.contentSize.height +// +// if topOffset > 44 { +// // do not interrupt user scrolling +// viewModel.collectionViewState = .fold +// } else if bottomOffset > 44 { +// tableView.contentInset.top = -repliedToCellFrame.height +// targetContentOffset.pointee = CGPoint(x: 0, y: -repliedToCellFrame.height) +// viewModel.collectionViewState = .fold +// } +// } +// } } // MARK: - UITableViewDelegate diff --git a/Mastodon/Scene/Compose/TableViewCell/ComposeStatusAttachmentTableViewCell.swift b/Mastodon/Scene/Compose/TableViewCell/ComposeStatusAttachmentTableViewCell.swift index 85c36fae0..5591e7dcc 100644 --- a/Mastodon/Scene/Compose/TableViewCell/ComposeStatusAttachmentTableViewCell.swift +++ b/Mastodon/Scene/Compose/TableViewCell/ComposeStatusAttachmentTableViewCell.swift @@ -6,10 +6,12 @@ // import UIKit +import SwiftUI import Combine import AlamofireImage import MastodonAsset import MastodonLocalization +import UIHostingConfigurationBackport final class ComposeStatusAttachmentTableViewCell: UITableViewCell { @@ -75,85 +77,91 @@ extension ComposeStatusAttachmentTableViewCell { } .store(in: &observations) - self.dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { [ - weak self - ] collectionView, indexPath, item -> UICollectionViewCell? in + self.dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { + [weak self] collectionView, indexPath, item -> UICollectionViewCell? in guard let self = self else { return UICollectionViewCell() } switch item { case .attachment(let attachmentService): let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: ComposeStatusAttachmentCollectionViewCell.self), for: indexPath) as! ComposeStatusAttachmentCollectionViewCell - cell.attachmentContainerView.descriptionTextView.text = attachmentService.description.value - cell.delegate = self.composeStatusAttachmentCollectionViewCellDelegate - attachmentService.thumbnailImage - .receive(on: DispatchQueue.main) - .sink { [weak cell] thumbnailImage in - guard let cell = cell else { return } - let size = cell.attachmentContainerView.previewImageView.frame.size != .zero ? cell.attachmentContainerView.previewImageView.frame.size : CGSize(width: 1, height: 1) - guard let image = thumbnailImage else { - let placeholder = UIImage.placeholder( - size: size, - color: ThemeService.shared.currentTheme.value.systemGroupedBackgroundColor - ) - .af.imageRounded( - withCornerRadius: AttachmentContainerView.containerViewCornerRadius - ) - cell.attachmentContainerView.previewImageView.image = placeholder - return - } - // cannot get correct size. set corner radius on layer - cell.attachmentContainerView.previewImageView.image = image - } - .store(in: &cell.disposeBag) - Publishers.CombineLatest( - attachmentService.uploadStateMachineSubject.eraseToAnyPublisher(), - attachmentService.error.eraseToAnyPublisher() - ) - .receive(on: DispatchQueue.main) - .sink { [weak cell, weak attachmentService] uploadState, error in - guard let cell = cell else { return } - guard let attachmentService = attachmentService else { return } - cell.attachmentContainerView.emptyStateView.isHidden = error == nil - cell.attachmentContainerView.descriptionBackgroundView.isHidden = error != nil - if let error = error { - cell.attachmentContainerView.activityIndicatorView.stopAnimating() - cell.attachmentContainerView.emptyStateView.label.text = error.localizedDescription - } else { - guard let uploadState = uploadState else { return } - switch uploadState { - case is MastodonAttachmentService.UploadState.Finish: - cell.attachmentContainerView.activityIndicatorView.stopAnimating() - case is MastodonAttachmentService.UploadState.Fail: - cell.attachmentContainerView.activityIndicatorView.stopAnimating() - // FIXME: not display - cell.attachmentContainerView.emptyStateView.label.text = { - if let file = attachmentService.file.value { - switch file { - case .jpeg, .png, .gif: - return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo) - case .other: - return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.video) - } - } else { - return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo) - } - }() - default: - break - } + cell.contentConfiguration = UIHostingConfigurationBackport { + HStack { + Image(systemName: "star") + Text("Favorites") + Spacer() } } - .store(in: &cell.disposeBag) - NotificationCenter.default.publisher( - for: UITextView.textDidChangeNotification, - object: cell.attachmentContainerView.descriptionTextView - ) - .receive(on: DispatchQueue.main) - .sink { notification in - guard let textField = notification.object as? UITextView else { return } - let text = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) - attachmentService.description.value = text - } - .store(in: &cell.disposeBag) +// cell.attachmentContainerView.descriptionTextView.text = attachmentService.description.value +// cell.delegate = self.composeStatusAttachmentCollectionViewCellDelegate +// attachmentService.thumbnailImage +// .receive(on: DispatchQueue.main) +// .sink { [weak cell] thumbnailImage in +// guard let cell = cell else { return } +// let size = cell.attachmentContainerView.previewImageView.frame.size != .zero ? cell.attachmentContainerView.previewImageView.frame.size : CGSize(width: 1, height: 1) +// guard let image = thumbnailImage else { +// let placeholder = UIImage.placeholder( +// size: size, +// color: ThemeService.shared.currentTheme.value.systemGroupedBackgroundColor +// ) +// .af.imageRounded( +// withCornerRadius: AttachmentContainerView.containerViewCornerRadius +// ) +// cell.attachmentContainerView.previewImageView.image = placeholder +// return +// } +// // cannot get correct size. set corner radius on layer +// cell.attachmentContainerView.previewImageView.image = image +// } +// .store(in: &cell.disposeBag) +// Publishers.CombineLatest( +// attachmentService.uploadStateMachineSubject.eraseToAnyPublisher(), +// attachmentService.error.eraseToAnyPublisher() +// ) +// .receive(on: DispatchQueue.main) +// .sink { [weak cell, weak attachmentService] uploadState, error in +// guard let cell = cell else { return } +// guard let attachmentService = attachmentService else { return } +// cell.attachmentContainerView.emptyStateView.isHidden = error == nil +// cell.attachmentContainerView.descriptionBackgroundView.isHidden = error != nil +// if let error = error { +// cell.attachmentContainerView.activityIndicatorView.stopAnimating() +// cell.attachmentContainerView.emptyStateView.label.text = error.localizedDescription +// } else { +// guard let uploadState = uploadState else { return } +// switch uploadState { +// case is MastodonAttachmentService.UploadState.Finish: +// cell.attachmentContainerView.activityIndicatorView.stopAnimating() +// case is MastodonAttachmentService.UploadState.Fail: +// cell.attachmentContainerView.activityIndicatorView.stopAnimating() +// // FIXME: not display +// cell.attachmentContainerView.emptyStateView.label.text = { +// if let file = attachmentService.file.value { +// switch file { +// case .jpeg, .png, .gif: +// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo) +// case .other: +// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.video) +// } +// } else { +// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo) +// } +// }() +// default: +// break +// } +// } +// } +// .store(in: &cell.disposeBag) +// NotificationCenter.default.publisher( +// for: UITextView.textDidChangeNotification, +// object: cell.attachmentContainerView.descriptionTextView +// ) +// .receive(on: DispatchQueue.main) +// .sink { notification in +// guard let textField = notification.object as? UITextView else { return } +// let text = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) +// attachmentService.description.value = text +// } +// .store(in: &cell.disposeBag) return cell } } diff --git a/Mastodon/Scene/Compose/View/AttachmentContainerView.swift b/Mastodon/Scene/Compose/View/AttachmentContainerView.swift index 4743c9527..dd6a2b0a9 100644 --- a/Mastodon/Scene/Compose/View/AttachmentContainerView.swift +++ b/Mastodon/Scene/Compose/View/AttachmentContainerView.swift @@ -6,61 +6,63 @@ // import UIKit -import UITextView_Placeholder -import MastodonAsset -import MastodonLocalization +import SwiftUI +import MastodonUI final class AttachmentContainerView: UIView { static let containerViewCornerRadius: CGFloat = 4 - var descriptionBackgroundViewFrameObservation: NSKeyValueObservation? +// var descriptionBackgroundViewFrameObservation: NSKeyValueObservation? +// +// let activityIndicatorView: UIActivityIndicatorView = { +// let activityIndicatorView = UIActivityIndicatorView(style: .large) +// activityIndicatorView.color = UIColor.white.withAlphaComponent(0.8) +// return activityIndicatorView +// }() +// +// let previewImageView: UIImageView = { +// let imageView = UIImageView() +// imageView.contentMode = .scaleAspectFill +// imageView.layer.cornerRadius = AttachmentContainerView.containerViewCornerRadius +// imageView.layer.cornerCurve = .continuous +// imageView.layer.masksToBounds = true +// return imageView +// }() +// +// let emptyStateView = AttachmentContainerView.EmptyStateView() +// let descriptionBackgroundView: UIView = { +// let view = UIView() +// view.layer.masksToBounds = true +// view.layer.cornerRadius = AttachmentContainerView.containerViewCornerRadius +// view.layer.cornerCurve = .continuous +// view.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] +// view.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 5, right: 8) +// return view +// }() +// let descriptionBackgroundGradientLayer: CAGradientLayer = { +// let gradientLayer = CAGradientLayer() +// gradientLayer.colors = [UIColor.black.withAlphaComponent(0.0).cgColor, UIColor.black.withAlphaComponent(0.69).cgColor] +// gradientLayer.locations = [0.0, 1.0] +// gradientLayer.startPoint = CGPoint(x: 0.5, y: 0) +// gradientLayer.endPoint = CGPoint(x: 0.5, y: 1) +// gradientLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100) +// return gradientLayer +// }() +// let descriptionTextView: UITextView = { +// let textView = UITextView() +// textView.showsVerticalScrollIndicator = false +// textView.backgroundColor = .clear +// textView.textColor = .white +// textView.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 15), maximumPointSize: 20) +// textView.placeholder = L10n.Scene.Compose.Attachment.descriptionPhoto +// textView.placeholderColor = UIColor.white.withAlphaComponent(0.6) // force white with alpha for Light/Dark mode +// textView.returnKeyType = .done +// return textView +// }() - let activityIndicatorView: UIActivityIndicatorView = { - let activityIndicatorView = UIActivityIndicatorView(style: .large) - activityIndicatorView.color = UIColor.white.withAlphaComponent(0.8) - return activityIndicatorView - }() - - let previewImageView: UIImageView = { - let imageView = UIImageView() - imageView.contentMode = .scaleAspectFill - imageView.layer.cornerRadius = AttachmentContainerView.containerViewCornerRadius - imageView.layer.cornerCurve = .continuous - imageView.layer.masksToBounds = true - return imageView - }() - - let emptyStateView = AttachmentContainerView.EmptyStateView() - let descriptionBackgroundView: UIView = { - let view = UIView() - view.layer.masksToBounds = true - view.layer.cornerRadius = AttachmentContainerView.containerViewCornerRadius - view.layer.cornerCurve = .continuous - view.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] - view.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 5, right: 8) - return view - }() - let descriptionBackgroundGradientLayer: CAGradientLayer = { - let gradientLayer = CAGradientLayer() - gradientLayer.colors = [UIColor.black.withAlphaComponent(0.0).cgColor, UIColor.black.withAlphaComponent(0.69).cgColor] - gradientLayer.locations = [0.0, 1.0] - gradientLayer.startPoint = CGPoint(x: 0.5, y: 0) - gradientLayer.endPoint = CGPoint(x: 0.5, y: 1) - gradientLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100) - return gradientLayer - }() - let descriptionTextView: UITextView = { - let textView = UITextView() - textView.showsVerticalScrollIndicator = false - textView.backgroundColor = .clear - textView.textColor = .white - textView.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 15), maximumPointSize: 20) - textView.placeholder = L10n.Scene.Compose.Attachment.descriptionPhoto - textView.placeholderColor = UIColor.white.withAlphaComponent(0.6) // force white with alpha for Light/Dark mode - textView.returnKeyType = .done - return textView - }() + private(set) lazy var contentView = AttachmentView(viewModel: viewModel) + public var viewModel: AttachmentView.ViewModel! override init(frame: CGRect) { super.init(frame: frame) @@ -77,89 +79,99 @@ final class AttachmentContainerView: UIView { extension AttachmentContainerView { private func _init() { - previewImageView.translatesAutoresizingMaskIntoConstraints = false - addSubview(previewImageView) + let hostingViewController = UIHostingController(rootView: contentView) + hostingViewController.view.translatesAutoresizingMaskIntoConstraints = false + addSubview(hostingViewController.view) NSLayoutConstraint.activate([ - previewImageView.topAnchor.constraint(equalTo: topAnchor), - previewImageView.leadingAnchor.constraint(equalTo: leadingAnchor), - previewImageView.trailingAnchor.constraint(equalTo: trailingAnchor), - previewImageView.bottomAnchor.constraint(equalTo: bottomAnchor), + hostingViewController.view.topAnchor.constraint(equalTo: topAnchor), + hostingViewController.view.leadingAnchor.constraint(equalTo: leadingAnchor), + hostingViewController.view.trailingAnchor.constraint(equalTo: trailingAnchor), + hostingViewController.view.bottomAnchor.constraint(equalTo: bottomAnchor), ]) - descriptionBackgroundView.translatesAutoresizingMaskIntoConstraints = false - addSubview(descriptionBackgroundView) - NSLayoutConstraint.activate([ - descriptionBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor), - descriptionBackgroundView.trailingAnchor.constraint(equalTo: trailingAnchor), - descriptionBackgroundView.bottomAnchor.constraint(equalTo: bottomAnchor), - descriptionBackgroundView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.3), - ]) - descriptionBackgroundView.layer.addSublayer(descriptionBackgroundGradientLayer) - descriptionBackgroundViewFrameObservation = descriptionBackgroundView.observe(\.bounds, options: [.initial, .new]) { [weak self] _, _ in - guard let self = self else { return } - self.descriptionBackgroundGradientLayer.frame = self.descriptionBackgroundView.bounds - } - - descriptionTextView.translatesAutoresizingMaskIntoConstraints = false - descriptionBackgroundView.addSubview(descriptionTextView) - NSLayoutConstraint.activate([ - descriptionTextView.leadingAnchor.constraint(equalTo: descriptionBackgroundView.layoutMarginsGuide.leadingAnchor), - descriptionTextView.trailingAnchor.constraint(equalTo: descriptionBackgroundView.layoutMarginsGuide.trailingAnchor), - descriptionBackgroundView.layoutMarginsGuide.bottomAnchor.constraint(equalTo: descriptionTextView.bottomAnchor), - descriptionTextView.heightAnchor.constraint(lessThanOrEqualToConstant: 36), - ]) - - emptyStateView.translatesAutoresizingMaskIntoConstraints = false - addSubview(emptyStateView) - NSLayoutConstraint.activate([ - emptyStateView.topAnchor.constraint(equalTo: topAnchor), - emptyStateView.leadingAnchor.constraint(equalTo: leadingAnchor), - emptyStateView.trailingAnchor.constraint(equalTo: trailingAnchor), - emptyStateView.bottomAnchor.constraint(equalTo: bottomAnchor), - ]) - - activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false - addSubview(activityIndicatorView) - NSLayoutConstraint.activate([ - activityIndicatorView.centerXAnchor.constraint(equalTo: previewImageView.centerXAnchor), - activityIndicatorView.centerYAnchor.constraint(equalTo: previewImageView.centerYAnchor), - ]) - - setupBroader() - - emptyStateView.isHidden = true - activityIndicatorView.hidesWhenStopped = true - activityIndicatorView.startAnimating() - - descriptionTextView.delegate = self +// previewImageView.translatesAutoresizingMaskIntoConstraints = false +// addSubview(previewImageView) +// NSLayoutConstraint.activate([ +// previewImageView.topAnchor.constraint(equalTo: topAnchor), +// previewImageView.leadingAnchor.constraint(equalTo: leadingAnchor), +// previewImageView.trailingAnchor.constraint(equalTo: trailingAnchor), +// previewImageView.bottomAnchor.constraint(equalTo: bottomAnchor), +// ]) +// +// descriptionBackgroundView.translatesAutoresizingMaskIntoConstraints = false +// addSubview(descriptionBackgroundView) +// NSLayoutConstraint.activate([ +// descriptionBackgroundView.leadingAnchor.constraint(equalTo: leadingAnchor), +// descriptionBackgroundView.trailingAnchor.constraint(equalTo: trailingAnchor), +// descriptionBackgroundView.bottomAnchor.constraint(equalTo: bottomAnchor), +// descriptionBackgroundView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.3), +// ]) +// descriptionBackgroundView.layer.addSublayer(descriptionBackgroundGradientLayer) +// descriptionBackgroundViewFrameObservation = descriptionBackgroundView.observe(\.bounds, options: [.initial, .new]) { [weak self] _, _ in +// guard let self = self else { return } +// self.descriptionBackgroundGradientLayer.frame = self.descriptionBackgroundView.bounds +// } +// +// descriptionTextView.translatesAutoresizingMaskIntoConstraints = false +// descriptionBackgroundView.addSubview(descriptionTextView) +// NSLayoutConstraint.activate([ +// descriptionTextView.leadingAnchor.constraint(equalTo: descriptionBackgroundView.layoutMarginsGuide.leadingAnchor), +// descriptionTextView.trailingAnchor.constraint(equalTo: descriptionBackgroundView.layoutMarginsGuide.trailingAnchor), +// descriptionBackgroundView.layoutMarginsGuide.bottomAnchor.constraint(equalTo: descriptionTextView.bottomAnchor), +// descriptionTextView.heightAnchor.constraint(lessThanOrEqualToConstant: 36), +// ]) +// +// emptyStateView.translatesAutoresizingMaskIntoConstraints = false +// addSubview(emptyStateView) +// NSLayoutConstraint.activate([ +// emptyStateView.topAnchor.constraint(equalTo: topAnchor), +// emptyStateView.leadingAnchor.constraint(equalTo: leadingAnchor), +// emptyStateView.trailingAnchor.constraint(equalTo: trailingAnchor), +// emptyStateView.bottomAnchor.constraint(equalTo: bottomAnchor), +// ]) +// +// activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false +// addSubview(activityIndicatorView) +// NSLayoutConstraint.activate([ +// activityIndicatorView.centerXAnchor.constraint(equalTo: previewImageView.centerXAnchor), +// activityIndicatorView.centerYAnchor.constraint(equalTo: previewImageView.centerYAnchor), +// ]) +// +// setupBroader() +// +// emptyStateView.isHidden = true +// activityIndicatorView.hidesWhenStopped = true +// activityIndicatorView.startAnimating() +// +// descriptionTextView.delegate = self } - override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { - super.traitCollectionDidChange(previousTraitCollection) - - setupBroader() - } +// override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { +// super.traitCollectionDidChange(previousTraitCollection) +// +// setupBroader() +// } } extension AttachmentContainerView { - private func setupBroader() { - emptyStateView.layer.borderWidth = 1 - emptyStateView.layer.borderColor = traitCollection.userInterfaceStyle == .dark ? ThemeService.shared.currentTheme.value.tableViewCellSelectionBackgroundColor.cgColor : nil - } +// private func setupBroader() { +// emptyStateView.layer.borderWidth = 1 +// emptyStateView.layer.borderColor = traitCollection.userInterfaceStyle == .dark ? ThemeService.shared.currentTheme.value.tableViewCellSelectionBackgroundColor.cgColor : nil +// } } -// MARK: - UITextViewDelegate -extension AttachmentContainerView: UITextViewDelegate { - func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { - // let keyboard dismiss when input description with "done" type return key - if textView === descriptionTextView, text == "\n" { - textView.resignFirstResponder() - return false - } - - return true - } -} +//// MARK: - UITextViewDelegate +//extension AttachmentContainerView: UITextViewDelegate { +// func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { +// // let keyboard dismiss when input description with "done" type return key +// if textView === descriptionTextView, text == "\n" { +// textView.resignFirstResponder() +// return false +// } +// +// return true +// } +//} diff --git a/Mastodon/Scene/Discovery/Community/DiscoveryCommunityViewModel.swift b/Mastodon/Scene/Discovery/Community/DiscoveryCommunityViewModel.swift index 8911a506e..86d94a3aa 100644 --- a/Mastodon/Scene/Discovery/Community/DiscoveryCommunityViewModel.swift +++ b/Mastodon/Scene/Discovery/Community/DiscoveryCommunityViewModel.swift @@ -12,6 +12,7 @@ import GameplayKit import CoreData import CoreDataStack import MastodonSDK +import MastodonCore final class DiscoveryCommunityViewModel { diff --git a/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewModel.swift b/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewModel.swift index c48ed1199..5c86b9f38 100644 --- a/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewModel.swift +++ b/Mastodon/Scene/Notification/NotificationTimeline/NotificationTimelineViewModel.swift @@ -77,31 +77,8 @@ final class NotificationTimelineViewModel { } extension NotificationTimelineViewModel { - enum Scope: Hashable, CaseIterable { - case everything - case mentions - - var includeTypes: [MastodonNotificationType]? { - switch self { - case .everything: return nil - case .mentions: return [.mention, .status] - } - } - - var excludeTypes: [MastodonNotificationType]? { - switch self { - case .everything: return nil - case .mentions: return [.follow, .followRequest, .reblog, .favourite, .poll] - } - } - - var _excludeTypes: [Mastodon.Entity.Notification.NotificationType]? { - switch self { - case .everything: return nil - case .mentions: return [.follow, .followRequest, .reblog, .favourite, .poll] - } - } - } + + typealias Scope = APIService.NotificationScope static func feedPredicate( authenticationBox: MastodonAuthenticationBox, diff --git a/Mastodon/Scene/Onboarding/Share/MastodonAuthenticationController.swift b/Mastodon/Scene/Onboarding/Share/MastodonAuthenticationController.swift index c97fc1489..470cc79a5 100644 --- a/Mastodon/Scene/Onboarding/Share/MastodonAuthenticationController.swift +++ b/Mastodon/Scene/Onboarding/Share/MastodonAuthenticationController.swift @@ -12,9 +12,6 @@ import AuthenticationServices final class MastodonAuthenticationController { - static let callbackURLScheme = "mastodon" - static let callbackURL = "mastodon://joinmastodon.org/oauth" - var disposeBag = Set() // input @@ -43,7 +40,7 @@ extension MastodonAuthenticationController { private func authentication() { authenticationSession = ASWebAuthenticationSession( url: authenticateURL, - callbackURLScheme: MastodonAuthenticationController.callbackURLScheme + callbackURLScheme: APIService.callbackURLScheme ) { [weak self] callback, error in guard let self = self else { return } os_log("%{public}s[%{public}ld], %{public}s: callback: %s, error: %s", ((#file as NSString).lastPathComponent), #line, #function, callback?.debugDescription ?? "", error.debugDescription) diff --git a/Mastodon/Scene/Root/RootSplitViewController.swift b/Mastodon/Scene/Root/RootSplitViewController.swift index f19282936..1ab2ee0f6 100644 --- a/Mastodon/Scene/Root/RootSplitViewController.swift +++ b/Mastodon/Scene/Root/RootSplitViewController.swift @@ -9,6 +9,7 @@ import os.log import UIKit import Combine import CoreDataStack +import MastodonCore final class RootSplitViewController: UISplitViewController, NeedsDependency { diff --git a/Mastodon/Service/StatusPublishService.swift b/Mastodon/Service/StatusPublishService.swift deleted file mode 100644 index f5c4cb2dd..000000000 --- a/Mastodon/Service/StatusPublishService.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// StatusPublishService.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-3-26. -// - -import os.log -import Foundation -import Intents -import Combine -import CoreData -import CoreDataStack -import MastodonSDK -import UIKit - -final class StatusPublishService { - - var disposeBag = Set() - - let workingQueue = DispatchQueue(label: "org.joinmastodon.app.StatusPublishService.working-queue") - - // input - var viewModels = CurrentValueSubject<[ComposeViewModel], Never>([]) // use strong reference to retain the view models - - // output - let composeViewModelDidUpdatePublisher = PassthroughSubject() - let latestPublishingComposeViewModel = CurrentValueSubject(nil) - - init() { - Publishers.CombineLatest( - viewModels.eraseToAnyPublisher(), - composeViewModelDidUpdatePublisher.eraseToAnyPublisher() - ) - .map { viewModels, _ in viewModels.last } - .assign(to: \.value, on: latestPublishingComposeViewModel) - .store(in: &disposeBag) - } - -} - -extension StatusPublishService { - - func publish(composeViewModel: ComposeViewModel) { - workingQueue.sync { - guard !self.viewModels.value.contains(where: { $0 === composeViewModel }) else { return } - self.viewModels.value = self.viewModels.value + [composeViewModel] - - composeViewModel.publishStateMachinePublisher - .receive(on: DispatchQueue.main) - .sink { [weak self, weak composeViewModel] state in - guard let self = self else { return } - guard let composeViewModel = composeViewModel else { return } - - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: composeViewModelDidUpdate", ((#file as NSString).lastPathComponent), #line, #function) - self.composeViewModelDidUpdatePublisher.send() - - switch state { - case is ComposeViewModel.PublishState.Finish: - self.remove(composeViewModel: composeViewModel) - default: - break - } - } - .store(in: &composeViewModel.disposeBag) // cancel subscription when viewModel dealloc - } - } - - func remove(composeViewModel: ComposeViewModel) { - workingQueue.async { - var viewModels = self.viewModels.value - viewModels.removeAll(where: { $0 === composeViewModel }) - self.viewModels.value = viewModels - - os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: composeViewModel removed", ((#file as NSString).lastPathComponent), #line, #function) - } - } - -} diff --git a/Mastodon/State/DocumentStore.swift b/Mastodon/State/DocumentStore.swift deleted file mode 100644 index cda038176..000000000 --- a/Mastodon/State/DocumentStore.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// DocumentStore.swift -// Mastodon -// -// Created by Cirno MainasuK on 2021-1-27. -// - -import UIKit -import Combine -import MastodonSDK - -class DocumentStore: ObservableObject { - let appStartUpTimestamp = Date() - var defaultRevealStatusDict: [Mastodon.Entity.Status.ID: Bool] = [:] -} diff --git a/Mastodon/State/ViewStateStore.swift b/Mastodon/State/ViewStateStore.swift deleted file mode 100644 index 07d8b844f..000000000 --- a/Mastodon/State/ViewStateStore.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// ViewStateStore.swift -// Mastodon -// -// Created by Cirno MainasuK on 2021-1-27. -// - -import Combine - -struct ViewStateStore { - -} - -enum ViewState { } diff --git a/Mastodon/Supporting Files/AppDelegate.swift b/Mastodon/Supporting Files/AppDelegate.swift index 7b1185f84..7336125b8 100644 --- a/Mastodon/Supporting Files/AppDelegate.swift +++ b/Mastodon/Supporting Files/AppDelegate.swift @@ -8,9 +8,9 @@ import os.log import UIKit import UserNotifications -import AppShared import AVFoundation -@_exported import MastodonUI +import MastodonCore +import MastodonUI @main class AppDelegate: UIResponder, UIApplicationDelegate { diff --git a/MastodonIntent/Handler/SendPostIntentHandler.swift b/MastodonIntent/Handler/SendPostIntentHandler.swift index 0da4e113b..afee7d581 100644 --- a/MastodonIntent/Handler/SendPostIntentHandler.swift +++ b/MastodonIntent/Handler/SendPostIntentHandler.swift @@ -11,6 +11,7 @@ import Combine import CoreData import CoreDataStack import MastodonSDK +import MastodonCore final class SendPostIntentHandler: NSObject { @@ -18,8 +19,12 @@ final class SendPostIntentHandler: NSObject { let coreDataStack = CoreDataStack() lazy var managedObjectContext = coreDataStack.persistentContainer.viewContext - lazy var api = APIService.shared - + lazy var api: APIService = { + let backgroundManagedObjectContext = coreDataStack.newTaskContext() + return APIService( + backgroundManagedObjectContext: backgroundManagedObjectContext + ) + }() } // MARK: - SendPostIntentHandling diff --git a/MastodonIntent/Model/Account+Fetch.swift b/MastodonIntent/Model/Account+Fetch.swift index 065ccac12..fd8c81769 100644 --- a/MastodonIntent/Model/Account+Fetch.swift +++ b/MastodonIntent/Model/Account+Fetch.swift @@ -9,6 +9,7 @@ import Foundation import CoreData import CoreDataStack import Intents +import MastodonCore extension Account { diff --git a/MastodonIntent/Service/APIService.swift b/MastodonIntent/Service/APIService.swift deleted file mode 100644 index 0733c08d4..000000000 --- a/MastodonIntent/Service/APIService.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// APIService.swift -// MastodonIntent -// -// Created by Cirno MainasuK on 2021-7-26. -// - -import os.log -import Foundation -import Combine -import CoreData -import CoreDataStack -import MastodonSDK - -// Replica APIService for share extension -final class APIService { - - var disposeBag = Set() - - static let shared = APIService() - - // internal - let session: URLSession - - // output - let error = PassthroughSubject() - - private init() { - self.session = URLSession(configuration: .default) - } - -} - diff --git a/MastodonSDK/Package.resolved b/MastodonSDK/Package.resolved new file mode 100644 index 000000000..06843faa3 --- /dev/null +++ b/MastodonSDK/Package.resolved @@ -0,0 +1,241 @@ +{ + "object": { + "pins": [ + { + "package": "Alamofire", + "repositoryURL": "https://github.com/Alamofire/Alamofire.git", + "state": { + "branch": null, + "revision": "8dd85aee02e39dd280c75eef88ffdb86eed4b07b", + "version": "5.6.2" + } + }, + { + "package": "AlamofireImage", + "repositoryURL": "https://github.com/Alamofire/AlamofireImage.git", + "state": { + "branch": null, + "revision": "98cbb00ce0ec5fc8e52a5b50a6bfc08d3e5aee10", + "version": "4.2.0" + } + }, + { + "package": "CommonOSLog", + "repositoryURL": "https://github.com/MainasuK/CommonOSLog", + "state": { + "branch": null, + "revision": "c121624a30698e9886efe38aebb36ff51c01b6c2", + "version": "0.1.1" + } + }, + { + "package": "FaviconFinder", + "repositoryURL": "https://github.com/will-lumley/FaviconFinder.git", + "state": { + "branch": null, + "revision": "1f74844f77f79b95c0bb0130b3a87d4f340e6d3a", + "version": "3.3.0" + } + }, + { + "package": "FLAnimatedImage", + "repositoryURL": "https://github.com/Flipboard/FLAnimatedImage.git", + "state": { + "branch": null, + "revision": "d4f07b6f164d53c1212c3e54d6460738b1981e9f", + "version": "1.0.17" + } + }, + { + "package": "FPSIndicator", + "repositoryURL": "https://github.com/MainasuK/FPSIndicator.git", + "state": { + "branch": null, + "revision": "e4a5067ccd5293b024c767f09e51056afd4a4796", + "version": "1.1.0" + } + }, + { + "package": "Fuzi", + "repositoryURL": "https://github.com/cezheng/Fuzi.git", + "state": { + "branch": null, + "revision": "f08c8323da21e985f3772610753bcfc652c2103f", + "version": "3.1.3" + } + }, + { + "package": "KeychainAccess", + "repositoryURL": "https://github.com/kishikawakatsumi/KeychainAccess.git", + "state": { + "branch": null, + "revision": "84e546727d66f1adc5439debad16270d0fdd04e7", + "version": "4.2.2" + } + }, + { + "package": "MetaTextKit", + "repositoryURL": "https://github.com/TwidereProject/MetaTextKit.git", + "state": { + "branch": null, + "revision": "dcd5255d6930c2fab408dc8562c577547e477624", + "version": "2.2.5" + } + }, + { + "package": "Nuke", + "repositoryURL": "https://github.com/kean/Nuke.git", + "state": { + "branch": null, + "revision": "a002b7fd786f2df2ed4333fe73a9727499fd9d97", + "version": "10.11.2" + } + }, + { + "package": "NukeFLAnimatedImagePlugin", + "repositoryURL": "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", + "state": { + "branch": null, + "revision": "b59c346a7d536336db3b0f12c72c6e53ee709e16", + "version": "8.0.0" + } + }, + { + "package": "Pageboy", + "repositoryURL": "https://github.com/uias/Pageboy", + "state": { + "branch": null, + "revision": "af8fa81788b893205e1ff42ddd88c5b0b315d7c5", + "version": "3.7.0" + } + }, + { + "package": "PanModal", + "repositoryURL": "https://github.com/slackhq/PanModal.git", + "state": { + "branch": null, + "revision": "b012aecb6b67a8e46369227f893c12544846613f", + "version": "1.2.7" + } + }, + { + "package": "SDWebImage", + "repositoryURL": "https://github.com/SDWebImage/SDWebImage.git", + "state": { + "branch": null, + "revision": "9248fe561a2a153916fb9597e3af4434784c6d32", + "version": "5.13.4" + } + }, + { + "package": "swift-collections", + "repositoryURL": "https://github.com/apple/swift-collections.git", + "state": { + "branch": null, + "revision": "f504716c27d2e5d4144fa4794b12129301d17729", + "version": "1.0.3" + } + }, + { + "package": "swift-nio", + "repositoryURL": "https://github.com/apple/swift-nio.git", + "state": { + "branch": null, + "revision": "546610d52b19be3e19935e0880bb06b9c03f5cef", + "version": "1.14.4" + } + }, + { + "package": "swift-nio-zlib-support", + "repositoryURL": "https://github.com/apple/swift-nio-zlib-support.git", + "state": { + "branch": null, + "revision": "37760e9a52030bb9011972c5213c3350fa9d41fd", + "version": "1.0.0" + } + }, + { + "package": "SwiftSoup", + "repositoryURL": "https://github.com/scinfu/SwiftSoup.git", + "state": { + "branch": null, + "revision": "6778575285177365cbad3e5b8a72f2a20583cfec", + "version": "2.4.3" + } + }, + { + "package": "Introspect", + "repositoryURL": "https://github.com/siteline/SwiftUI-Introspect.git", + "state": { + "branch": null, + "revision": "f2616860a41f9d9932da412a8978fec79c06fe24", + "version": "0.1.4" + } + }, + { + "package": "SwiftyJSON", + "repositoryURL": "https://github.com/SwiftyJSON/SwiftyJSON.git", + "state": { + "branch": null, + "revision": "b3dcd7dbd0d488e1a7077cb33b00f2083e382f07", + "version": "5.0.1" + } + }, + { + "package": "TabBarPager", + "repositoryURL": "https://github.com/TwidereProject/TabBarPager.git", + "state": { + "branch": null, + "revision": "488aa66d157a648901b61721212c0dec23d27ee5", + "version": "0.1.0" + } + }, + { + "package": "Tabman", + "repositoryURL": "https://github.com/uias/Tabman", + "state": { + "branch": null, + "revision": "4a4f7c755b875ffd4f9ef10d67a67883669d2465", + "version": "2.13.0" + } + }, + { + "package": "ThirdPartyMailer", + "repositoryURL": "https://github.com/vtourraine/ThirdPartyMailer.git", + "state": { + "branch": null, + "revision": "44c1cfaa6969963f22691aa67f88a69e3b6d651f", + "version": "2.1.0" + } + }, + { + "package": "TOCropViewController", + "repositoryURL": "https://github.com/TimOliver/TOCropViewController.git", + "state": { + "branch": null, + "revision": "d0470491f56e734731bbf77991944c0dfdee3e0e", + "version": "2.6.1" + } + }, + { + "package": "UIHostingConfigurationBackport", + "repositoryURL": "https://github.com/woxtu/UIHostingConfigurationBackport.git", + "state": { + "branch": null, + "revision": "6091f2d38faa4b24fc2ca0389c651e2f666624a3", + "version": "0.1.0" + } + }, + { + "package": "UITextView+Placeholder", + "repositoryURL": "https://github.com/MainasuK/UITextView-Placeholder.git", + "state": { + "branch": null, + "revision": "20f513ded04a040cdf5467f0891849b1763ede3b", + "version": "1.4.1" + } + } + ] + }, + "version": 1 +} diff --git a/MastodonSDK/Package.swift b/MastodonSDK/Package.swift index aa349f8e0..1cc1d9ff0 100644 --- a/MastodonSDK/Package.swift +++ b/MastodonSDK/Package.swift @@ -16,6 +16,7 @@ let package = Package( "CoreDataStack", "MastodonAsset", "MastodonCommon", + "MastodonCore", "MastodonExtension", "MastodonLocalization", "MastodonSDK", @@ -23,17 +24,30 @@ let package = Package( ]) ], dependencies: [ - .package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", from: "5.0.0"), - .package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"), - .package(url: "https://github.com/kean/Nuke.git", from: "10.3.1"), - .package(url: "https://github.com/Flipboard/FLAnimatedImage.git", from: "1.0.0"), - .package(url: "https://github.com/TwidereProject/MetaTextKit.git", .exact("2.2.5")), + .package(name: "ArkanaKeys", path: "../dependencies/ArkanaKeys"), + .package(name: "FaviconFinder", url: "https://github.com/will-lumley/FaviconFinder.git", from: "3.2.2"), + .package(name: "Introspect", url: "https://github.com/siteline/SwiftUI-Introspect.git", from: "0.1.3"), + .package(name: "UITextView+Placeholder", url: "https://github.com/MainasuK/UITextView-Placeholder.git", from: "1.4.1"), .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.4.0"), .package(url: "https://github.com/Alamofire/AlamofireImage.git", from: "4.1.0"), - .package(name: "NukeFLAnimatedImagePlugin", url: "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", from: "8.0.0"), - .package(name: "UITextView+Placeholder", url: "https://github.com/MainasuK/UITextView-Placeholder.git", from: "1.4.1"), - .package(name: "Introspect", url: "https://github.com/siteline/SwiftUI-Introspect.git", from: "0.1.3"), - .package(name: "FaviconFinder", url: "https://github.com/will-lumley/FaviconFinder.git", from: "3.2.2"), + .package(url: "https://github.com/apple/swift-collections.git", from: "1.0.3"), + .package(url: "https://github.com/apple/swift-nio.git", from: "1.0.0"), + .package(url: "https://github.com/cezheng/Fuzi.git", from: "3.1.3"), + .package(url: "https://github.com/Flipboard/FLAnimatedImage.git", from: "1.0.0"), + .package(url: "https://github.com/kean/Nuke-FLAnimatedImage-Plugin.git", from: "8.0.0"), + .package(url: "https://github.com/kean/Nuke.git", from: "10.3.1"), + .package(url: "https://github.com/kishikawakatsumi/KeychainAccess.git", from: "4.2.2"), + .package(url: "https://github.com/MainasuK/CommonOSLog", from: "0.1.1"), + .package(url: "https://github.com/MainasuK/FPSIndicator.git", from: "1.0.0"), + .package(url: "https://github.com/slackhq/PanModal.git", from: "1.2.7"), + .package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", from: "5.0.0"), + .package(url: "https://github.com/TimOliver/TOCropViewController.git", from: "2.6.1"), + .package(url: "https://github.com/TwidereProject/MetaTextKit.git", .exact("2.2.5")), + .package(url: "https://github.com/TwidereProject/TabBarPager.git", from: "0.1.0"), + .package(url: "https://github.com/uias/Tabman", from: "2.13.0"), + .package(url: "https://github.com/vtourraine/ThirdPartyMailer.git", from: "2.1.0"), + .package(url: "https://github.com/woxtu/UIHostingConfigurationBackport.git", from: "0.1.0"), + .package(url: "https://github.com/SDWebImage/SDWebImage.git", from: "5.12.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. @@ -60,6 +74,22 @@ let package = Package( "MastodonExtension" ] ), + .target( + name: "MastodonCore", + dependencies: [ + "CoreDataStack", + "MastodonAsset", + "MastodonCommon", + "MastodonLocalization", + "MastodonSDK", + .product(name: "Alamofire", package: "Alamofire"), + .product(name: "AlamofireImage", package: "AlamofireImage"), + .product(name: "CommonOSLog", package: "CommonOSLog"), + .product(name: "ArkanaKeys", package: "ArkanaKeys"), + .product(name: "KeychainAccess", package: "KeychainAccess"), + .product(name: "MetaTextKit", package: "MetaTextKit") + ] + ), .target( name: "MastodonExtension", dependencies: [] @@ -78,20 +108,20 @@ let package = Package( .target( name: "MastodonUI", dependencies: [ - "CoreDataStack", - "MastodonSDK", - "MastodonExtension", - "MastodonAsset", - "MastodonLocalization", - .product(name: "Alamofire", package: "Alamofire"), - .product(name: "AlamofireImage", package: "AlamofireImage"), + "MastodonCore", .product(name: "FLAnimatedImage", package: "FLAnimatedImage"), .product(name: "FaviconFinder", package: "FaviconFinder"), - .product(name: "MetaTextKit", package: "MetaTextKit"), .product(name: "Nuke", package: "Nuke"), - .product(name: "NukeFLAnimatedImagePlugin", package: "NukeFLAnimatedImagePlugin"), .product(name: "Introspect", package: "Introspect"), .product(name: "UITextView+Placeholder", package: "UITextView+Placeholder"), + .product(name: "UIHostingConfigurationBackport", package: "UIHostingConfigurationBackport"), + .product(name: "TabBarPager", package: "TabBarPager"), + .product(name: "ThirdPartyMailer", package: "ThirdPartyMailer"), + .product(name: "OrderedCollections", package: "swift-collections"), + .product(name: "Tabman", package: "Tabman"), + .product(name: "MetaTextKit", package: "MetaTextKit"), + .product(name: "CropViewController", package: "TOCropViewController"), + .product(name: "PanModal", package: "PanModal"), ] ), .testTarget( diff --git a/MastodonSDK/Sources/CoreDataStack/CoreDataStack.swift b/MastodonSDK/Sources/CoreDataStack/CoreDataStack.swift index c5f415758..a1207f116 100644 --- a/MastodonSDK/Sources/CoreDataStack/CoreDataStack.swift +++ b/MastodonSDK/Sources/CoreDataStack/CoreDataStack.swift @@ -113,6 +113,15 @@ public final class CoreDataStack { } +extension CoreDataStack { + public func newTaskContext() -> NSManagedObjectContext { + let taskContext = persistentContainer.newBackgroundContext() + taskContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy + taskContext.undoManager = nil + return taskContext + } +} + extension CoreDataStack { public func rebuild() { diff --git a/Mastodon/Preference/AppPreference.swift b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+App.swift similarity index 81% rename from Mastodon/Preference/AppPreference.swift rename to MastodonSDK/Sources/MastodonCommon/Preference/Preference+App.swift index 4ede61cf8..4453d94b1 100644 --- a/Mastodon/Preference/AppPreference.swift +++ b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+App.swift @@ -9,7 +9,7 @@ import UIKit extension UserDefaults { - @objc dynamic var preferredUsingDefaultBrowser: Bool { + @objc public dynamic var preferredUsingDefaultBrowser: Bool { get { register(defaults: [#function: false]) return bool(forKey: #function) diff --git a/AppShared/UserDefaults+Notification.swift b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Notification.swift similarity index 82% rename from AppShared/UserDefaults+Notification.swift rename to MastodonSDK/Sources/MastodonCommon/Preference/Preference+Notification.swift index e743e70a0..7b2ac57a1 100644 --- a/AppShared/UserDefaults+Notification.swift +++ b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Notification.swift @@ -7,6 +7,7 @@ import UIKit import CryptoKit +import MastodonExtension extension UserDefaults { // always use hash value (SHA256) from accessToken as key @@ -38,3 +39,15 @@ extension UserDefaults { } } + +extension UserDefaults { + + @objc public dynamic var notificationBadgeCount: Int { + get { + register(defaults: [#function: 0]) + return integer(forKey: #function) + } + set { self[#function] = newValue } + } + +} diff --git a/Mastodon/Preference/StoreReviewPreference.swift b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+StoreReview.swift similarity index 75% rename from Mastodon/Preference/StoreReviewPreference.swift rename to MastodonSDK/Sources/MastodonCommon/Preference/Preference+StoreReview.swift index e3a403f6d..cb4701a3c 100644 --- a/Mastodon/Preference/StoreReviewPreference.swift +++ b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+StoreReview.swift @@ -9,14 +9,14 @@ import Foundation extension UserDefaults { - @objc dynamic var processCompletedCount: Int { + @objc public dynamic var processCompletedCount: Int { get { return integer(forKey: #function) } set { self[#function] = newValue } } - @objc dynamic var lastVersionPromptedForReview: String? { + @objc public dynamic var lastVersionPromptedForReview: String? { get { return string(forKey: #function) } diff --git a/Mastodon/Preference/WizardPreference.swift b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Wizard.swift similarity index 76% rename from Mastodon/Preference/WizardPreference.swift rename to MastodonSDK/Sources/MastodonCommon/Preference/Preference+Wizard.swift index c34e34a8a..f8fc245f8 100644 --- a/Mastodon/Preference/WizardPreference.swift +++ b/MastodonSDK/Sources/MastodonCommon/Preference/Preference+Wizard.swift @@ -8,7 +8,7 @@ import UIKit extension UserDefaults { - @objc dynamic var didShowMultipleAccountSwitchWizard: Bool { + @objc public dynamic var didShowMultipleAccountSwitchWizard: Bool { get { return bool(forKey: #function) } set { self[#function] = newValue } } diff --git a/Mastodon/State/AppContext.swift b/MastodonSDK/Sources/MastodonCore/AppContext.swift similarity index 86% rename from Mastodon/State/AppContext.swift rename to MastodonSDK/Sources/MastodonCore/AppContext.swift index 683c81f33..7c61cd75b 100644 --- a/Mastodon/State/AppContext.swift +++ b/MastodonSDK/Sources/MastodonCore/AppContext.swift @@ -1,44 +1,42 @@ // // AppContext.swift -// Mastodon +// // -// Created by Cirno MainasuK on 2021-1-27. +// Created by MainasuK on 22/9/30. // import os.log import UIKit +import SwiftUI import Combine import CoreData import CoreDataStack import AlamofireImage -import MastodonUI -class AppContext: ObservableObject { +public class AppContext: ObservableObject { var disposeBag = Set() - @Published var viewStateStore = ViewStateStore() - - let coreDataStack: CoreDataStack - let managedObjectContext: NSManagedObjectContext - let backgroundManagedObjectContext: NSManagedObjectContext + public let coreDataStack: CoreDataStack + public let managedObjectContext: NSManagedObjectContext + public let backgroundManagedObjectContext: NSManagedObjectContext - let apiService: APIService - let authenticationService: AuthenticationService - let emojiService: EmojiService - let statusPublishService = StatusPublishService() - let notificationService: NotificationService - let settingService: SettingService - let instanceService: InstanceService + public let apiService: APIService + public let authenticationService: AuthenticationService + public let emojiService: EmojiService + public let statusPublishService = StatusPublishService() + public let notificationService: NotificationService + public let settingService: SettingService + public let instanceService: InstanceService - let blockDomainService: BlockDomainService - let statusFilterService: StatusFilterService - let photoLibraryService = PhotoLibraryService() + public let blockDomainService: BlockDomainService + public let statusFilterService: StatusFilterService + public let photoLibraryService = PhotoLibraryService() - let placeholderImageCacheService = PlaceholderImageCacheService() - let blurhashImageCacheService = BlurhashImageCacheService.shared + public let placeholderImageCacheService = PlaceholderImageCacheService() + public let blurhashImageCacheService = BlurhashImageCacheService.shared - let documentStore: DocumentStore + public let documentStore: DocumentStore private var documentStoreSubscription: AnyCancellable! let overrideTraitCollection = CurrentValueSubject(nil) @@ -46,8 +44,8 @@ class AppContext: ObservableObject { .autoconnect() .share() .eraseToAnyPublisher() - - init() { + + public init() { let _coreDataStack = CoreDataStack() let _managedObjectContext = _coreDataStack.persistentContainer.viewContext let _backgroundManagedObjectContext = _coreDataStack.persistentContainer.newBackgroundContext() diff --git a/AppShared/AppSecret.swift b/MastodonSDK/Sources/MastodonCore/AppSecret.swift similarity index 93% rename from AppShared/AppSecret.swift rename to MastodonSDK/Sources/MastodonCore/AppSecret.swift index 9110f2490..3d595c143 100644 --- a/AppShared/AppSecret.swift +++ b/MastodonSDK/Sources/MastodonCore/AppSecret.swift @@ -9,8 +9,8 @@ import Foundation import CryptoKit import KeychainAccess -import Keys import MastodonCommon +import ArkanaKeys public final class AppSecret { @@ -36,12 +36,10 @@ public final class AppSecret { }() init() { - let keys = MastodonKeys() - #if DEBUG - self.notificationEndpoint = keys.notification_endpoint_debug + self.notificationEndpoint = Keys.Debug().notificationEndpoint #else - self.notificationEndpoint = keys.notification_endpoint + self.notificationEndpoint = Keys.Release().notificationEndpoint #endif } diff --git a/MastodonSDK/Sources/MastodonCore/Authentication/MastodonAuthenticationBox.swift b/MastodonSDK/Sources/MastodonCore/Authentication/MastodonAuthenticationBox.swift new file mode 100644 index 000000000..14cb03ad7 --- /dev/null +++ b/MastodonSDK/Sources/MastodonCore/Authentication/MastodonAuthenticationBox.swift @@ -0,0 +1,32 @@ +// +// MastodonAuthenticationBox.swift +// Mastodon +// +// Created by MainasuK Cirno on 2021-7-20. +// + +import Foundation +import CoreDataStack +import MastodonSDK + +public struct MastodonAuthenticationBox: UserIdentifier { + public let authenticationRecord: ManagedObjectRecord + public let domain: String + public let userID: MastodonUser.ID + public let appAuthorization: Mastodon.API.OAuth.Authorization + public let userAuthorization: Mastodon.API.OAuth.Authorization + + public init( + authenticationRecord: ManagedObjectRecord, + domain: String, + userID: MastodonUser.ID, + appAuthorization: Mastodon.API.OAuth.Authorization, + userAuthorization: Mastodon.API.OAuth.Authorization + ) { + self.authenticationRecord = authenticationRecord + self.domain = domain + self.userID = userID + self.appAuthorization = appAuthorization + self.userAuthorization = userAuthorization + } +} diff --git a/MastodonSDK/Sources/MastodonCore/DocumentStore.swift b/MastodonSDK/Sources/MastodonCore/DocumentStore.swift new file mode 100644 index 000000000..29a3d4f94 --- /dev/null +++ b/MastodonSDK/Sources/MastodonCore/DocumentStore.swift @@ -0,0 +1,15 @@ +// +// DocumentStore.swift +// Mastodon +// +// Created by Cirno MainasuK on 2021-1-27. +// + +import UIKit +import Combine +import MastodonSDK + +public class DocumentStore: ObservableObject { + public let appStartUpTimestamp = Date() + public var defaultRevealStatusDict: [Mastodon.Entity.Status.ID: Bool] = [:] +} diff --git a/Mastodon/Extension/CoreDataStack/Instance.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift similarity index 100% rename from Mastodon/Extension/CoreDataStack/Instance.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Instance.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonEmoji.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonEmoji.swift similarity index 69% rename from MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonEmoji.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonEmoji.swift index 8e2558bb7..e30085840 100644 --- a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonEmoji.swift +++ b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonEmoji.swift @@ -29,3 +29,15 @@ extension Collection where Element == Mastodon.Entity.Emoji { return dictionary } } + +extension MastodonEmoji { + public convenience init(emoji: Mastodon.Entity.Emoji) { + self.init( + code: emoji.shortcode, + url: emoji.url, + staticURL: emoji.staticURL, + visibleInPicker: emoji.visibleInPicker, + category: emoji.category + ) + } +} diff --git a/Mastodon/Persistence/Extension/MastodonField.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonField.swift similarity index 100% rename from Mastodon/Persistence/Extension/MastodonField.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonField.swift diff --git a/Mastodon/Persistence/Extension/MastodonMention.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonMention.swift similarity index 100% rename from Mastodon/Persistence/Extension/MastodonMention.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonMention.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonStatus.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonStatus.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonStatus.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonStatus.swift diff --git a/Mastodon/Persistence/Extension/MastodonUser+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonUser+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/MastodonUser+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonUser+Property.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonUser.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonUser.swift similarity index 73% rename from MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonUser.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonUser.swift index 9b61ab5f6..02a983680 100644 --- a/MastodonSDK/Sources/MastodonUI/Extension/CoreDataStack/MastodonUser.swift +++ b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/MastodonUser.swift @@ -1,13 +1,13 @@ // // MastodonUser.swift -// +// Mastodon // -// Created by MainasuK on 2022-4-14. +// Created by MainasuK Cirno on 2021/2/3. // import Foundation import CoreDataStack -import MastodonCommon +import MastodonSDK extension MastodonUser { @@ -55,3 +55,21 @@ extension MastodonUser { } } + +extension MastodonUser { + + public var profileURL: URL { + if let urlString = self.url, + let url = URL(string: urlString) { + return url + } else { + return URL(string: "https://\(self.domain)/@\(username)")! + } + } + + public var activityItems: [Any] { + var items: [Any] = [] + items.append(profileURL) + return items + } +} diff --git a/Mastodon/Persistence/Extension/Notification+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Notification+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/Notification+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Notification+Property.swift diff --git a/Mastodon/Persistence/Extension/Poll+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Poll+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/Poll+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Poll+Property.swift diff --git a/Mastodon/Persistence/Extension/PollOption+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/PollOption+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/PollOption+Property.swift diff --git a/Mastodon/Extension/CoreDataStack/Setting.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Setting.swift similarity index 100% rename from Mastodon/Extension/CoreDataStack/Setting.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Setting.swift diff --git a/Mastodon/Persistence/Extension/Status+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Status+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/Status+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Status+Property.swift diff --git a/Mastodon/Extension/CoreDataStack/Status.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Status.swift similarity index 100% rename from Mastodon/Extension/CoreDataStack/Status.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Status.swift diff --git a/Mastodon/Extension/CoreDataStack/Subscription.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Subscription.swift similarity index 100% rename from Mastodon/Extension/CoreDataStack/Subscription.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Subscription.swift diff --git a/Mastodon/Extension/CoreDataStack/SubscriptionAlerts.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/SubscriptionAlerts.swift similarity index 100% rename from Mastodon/Extension/CoreDataStack/SubscriptionAlerts.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/SubscriptionAlerts.swift diff --git a/Mastodon/Persistence/Extension/Tag+Property.swift b/MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Tag+Property.swift similarity index 100% rename from Mastodon/Persistence/Extension/Tag+Property.swift rename to MastodonSDK/Sources/MastodonCore/Extension/CoreDataStack/Tag+Property.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Account.swift b/MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Account.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Account.swift rename to MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Account.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Link.swift b/MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Link.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Link.swift rename to MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Link.swift diff --git a/MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Tag.swift b/MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Tag.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Extension/MastodonSDK/Mastodon+Entity+Tag.swift rename to MastodonSDK/Sources/MastodonCore/Extension/MastodonSDK/Mastodon+Entity+Tag.swift diff --git a/Mastodon/Diffiable/FetchedResultsController/FeedFetchedResultsController.swift b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/FeedFetchedResultsController.swift similarity index 100% rename from Mastodon/Diffiable/FetchedResultsController/FeedFetchedResultsController.swift rename to MastodonSDK/Sources/MastodonCore/FetchedResultsController/FeedFetchedResultsController.swift diff --git a/Mastodon/Diffiable/FetchedResultsController/SearchHistoryFetchedResultController.swift b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/SearchHistoryFetchedResultController.swift similarity index 100% rename from Mastodon/Diffiable/FetchedResultsController/SearchHistoryFetchedResultController.swift rename to MastodonSDK/Sources/MastodonCore/FetchedResultsController/SearchHistoryFetchedResultController.swift diff --git a/Mastodon/Diffiable/FetchedResultsController/SettingFetchedResultController.swift b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/SettingFetchedResultController.swift similarity index 80% rename from Mastodon/Diffiable/FetchedResultsController/SettingFetchedResultController.swift rename to MastodonSDK/Sources/MastodonCore/FetchedResultsController/SettingFetchedResultController.swift index 52eafc6b6..cd8845386 100644 --- a/Mastodon/Diffiable/FetchedResultsController/SettingFetchedResultController.swift +++ b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/SettingFetchedResultController.swift @@ -12,7 +12,7 @@ import CoreData import CoreDataStack import MastodonSDK -final class SettingFetchedResultController: NSObject { +public final class SettingFetchedResultController: NSObject { var disposeBag = Set() @@ -21,9 +21,9 @@ final class SettingFetchedResultController: NSObject { // input // output - let settings = CurrentValueSubject<[Setting], Never>([]) + public let settings = CurrentValueSubject<[Setting], Never>([]) - init(managedObjectContext: NSManagedObjectContext, additionalPredicate: NSPredicate?) { + public init(managedObjectContext: NSManagedObjectContext, additionalPredicate: NSPredicate?) { self.fetchedResultsController = { let fetchRequest = Setting.sortedFetchRequest fetchRequest.returnsObjectsAsFaults = false @@ -55,7 +55,7 @@ final class SettingFetchedResultController: NSObject { // MARK: - NSFetchedResultsControllerDelegate extension SettingFetchedResultController: NSFetchedResultsControllerDelegate { - func controller(_ controller: NSFetchedResultsController, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) { + public func controller(_ controller: NSFetchedResultsController, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) { os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) let objects = fetchedResultsController.fetchedObjects ?? [] diff --git a/Mastodon/Diffiable/FetchedResultsController/StatusFetchedResultsController.swift b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/StatusFetchedResultsController.swift similarity index 99% rename from Mastodon/Diffiable/FetchedResultsController/StatusFetchedResultsController.swift rename to MastodonSDK/Sources/MastodonCore/FetchedResultsController/StatusFetchedResultsController.swift index 24d8a6790..10da3f3fa 100644 --- a/Mastodon/Diffiable/FetchedResultsController/StatusFetchedResultsController.swift +++ b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/StatusFetchedResultsController.swift @@ -11,7 +11,6 @@ import Combine import CoreData import CoreDataStack import MastodonSDK -import MastodonUI final class StatusFetchedResultsController: NSObject { diff --git a/Mastodon/Diffiable/FetchedResultsController/UserFetchedResultsController.swift b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/UserFetchedResultsController.swift similarity index 99% rename from Mastodon/Diffiable/FetchedResultsController/UserFetchedResultsController.swift rename to MastodonSDK/Sources/MastodonCore/FetchedResultsController/UserFetchedResultsController.swift index c0922afcb..bd57314bf 100644 --- a/Mastodon/Diffiable/FetchedResultsController/UserFetchedResultsController.swift +++ b/MastodonSDK/Sources/MastodonCore/FetchedResultsController/UserFetchedResultsController.swift @@ -11,7 +11,6 @@ import Combine import CoreData import CoreDataStack import MastodonSDK -import MastodonUI final class UserFetchedResultsController: NSObject { diff --git a/MastodonSDK/Sources/MastodonUI/Model/UserIdentifier.swift b/MastodonSDK/Sources/MastodonCore/Model/UserIdentifier.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Model/UserIdentifier.swift rename to MastodonSDK/Sources/MastodonCore/Model/UserIdentifier.swift diff --git a/Mastodon/Persistence/Persistence+MastodonUser.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+MastodonUser.swift similarity index 96% rename from Mastodon/Persistence/Persistence+MastodonUser.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+MastodonUser.swift index 1406f75aa..eb69c36d1 100644 --- a/Mastodon/Persistence/Persistence+MastodonUser.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+MastodonUser.swift @@ -19,8 +19,8 @@ extension Persistence.MastodonUser { public let entity: Mastodon.Entity.Account public let cache: Persistence.PersistCache? public let networkDate: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "MastodonUser", category: "Persistence") + public init( domain: String, entity: Mastodon.Entity.Account, @@ -127,8 +127,8 @@ extension Persistence.MastodonUser { public let entity: Mastodon.Entity.Relationship public let me: MastodonUser public let networkDate: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "MastodonUser", category: "Persistence") + public init( entity: Mastodon.Entity.Relationship, me: MastodonUser, diff --git a/Mastodon/Persistence/Persistence+Notification.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Notification.swift similarity index 98% rename from Mastodon/Persistence/Persistence+Notification.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Notification.swift index b8c2f27fd..5273d2bbf 100644 --- a/Mastodon/Persistence/Persistence+Notification.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Notification.swift @@ -19,8 +19,8 @@ extension Persistence.Notification { public let entity: Mastodon.Entity.Notification public let me: MastodonUser public let networkDate: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "Notification", category: "Persistence") + public init( domain: String, entity: Mastodon.Entity.Notification, diff --git a/Mastodon/Persistence/Persistence+Poll.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift similarity index 98% rename from Mastodon/Persistence/Persistence+Poll.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift index 1d6802aab..6f7eb60c2 100644 --- a/Mastodon/Persistence/Persistence+Poll.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Poll.swift @@ -18,8 +18,7 @@ extension Persistence.Poll { public let entity: Mastodon.Entity.Poll public let me: MastodonUser? public let networkDate: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "Poll", category: "Persistence") public init( domain: String, entity: Mastodon.Entity.Poll, diff --git a/Mastodon/Persistence/Persistence+PollOption.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift similarity index 96% rename from Mastodon/Persistence/Persistence+PollOption.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift index 1e284ac72..a872d7edb 100644 --- a/Mastodon/Persistence/Persistence+PollOption.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+PollOption.swift @@ -18,7 +18,7 @@ extension Persistence.PollOption { public let entity: Mastodon.Entity.Poll.Option public let me: MastodonUser? public let networkDate: Date - public let log = OSLog.api + public let log = Logger(subsystem: "PollOption", category: "Persistence") public init( index: Int, diff --git a/Mastodon/Persistence/Persistence+SearchHistory.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+SearchHistory.swift similarity index 97% rename from Mastodon/Persistence/Persistence+SearchHistory.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+SearchHistory.swift index 58d4c8fb1..84a7bd15f 100644 --- a/Mastodon/Persistence/Persistence+SearchHistory.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+SearchHistory.swift @@ -17,8 +17,7 @@ extension Persistence.SearchHistory { public let entity: Entity public let me: MastodonUser public let now: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "SearchHistory", category: "Persistence") public init( entity: Entity, me: MastodonUser, diff --git a/Mastodon/Persistence/Persistence+Status.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Status.swift similarity index 98% rename from Mastodon/Persistence/Persistence+Status.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Status.swift index b20df1496..a15e974e4 100644 --- a/Mastodon/Persistence/Persistence+Status.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Status.swift @@ -21,8 +21,8 @@ extension Persistence.Status { public let statusCache: Persistence.PersistCache? public let userCache: Persistence.PersistCache? public let networkDate: Date - public let log = OSLog.api - + public let log = Logger(subsystem: "Status", category: "Persistence") + public init( domain: String, entity: Mastodon.Entity.Status, diff --git a/Mastodon/Persistence/Persistence+Tag.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Tag.swift similarity index 97% rename from Mastodon/Persistence/Persistence+Tag.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Tag.swift index 7092a52cd..5c7130618 100644 --- a/Mastodon/Persistence/Persistence+Tag.swift +++ b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence+Tag.swift @@ -18,7 +18,7 @@ extension Persistence.Tag { public let entity: Mastodon.Entity.Tag public let me: MastodonUser? public let networkDate: Date - public let log = OSLog.api + public let log = Logger(subsystem: "Tag", category: "Persistence") public init( domain: String, diff --git a/Mastodon/Persistence/Persistence.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Persistence.swift similarity index 100% rename from Mastodon/Persistence/Persistence.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Persistence.swift diff --git a/Mastodon/Persistence/Protocol/MastodonEmojiContainer.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonEmojiContainer.swift similarity index 100% rename from Mastodon/Persistence/Protocol/MastodonEmojiContainer.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonEmojiContainer.swift diff --git a/Mastodon/Persistence/Protocol/MastodonFieldContainer.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonFieldContainer.swift similarity index 100% rename from Mastodon/Persistence/Protocol/MastodonFieldContainer.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonFieldContainer.swift diff --git a/Mastodon/Persistence/Protocol/MastodonMentionContainer.swift b/MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonMentionContainer.swift similarity index 100% rename from Mastodon/Persistence/Protocol/MastodonMentionContainer.swift rename to MastodonSDK/Sources/MastodonCore/Persistence/Protocol/MastodonMentionContainer.swift diff --git a/Mastodon/Service/APIService/APIService+APIError.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+APIError.swift similarity index 95% rename from Mastodon/Service/APIService/APIService+APIError.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+APIError.swift index 5670f8053..6fdb973da 100644 --- a/Mastodon/Service/APIService/APIService+APIError.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+APIError.swift @@ -10,12 +10,12 @@ import MastodonSDK import MastodonLocalization extension APIService { - enum APIError: Error { + public enum APIError: Error { case implicit(ErrorReason) case explicit(ErrorReason) - enum ErrorReason { + public enum ErrorReason { // application internal error case authenticationMissing case badRequest @@ -60,7 +60,7 @@ extension APIService.APIError: LocalizedError { } } - var failureReason: String? { + public var failureReason: String? { switch errorReason { case .authenticationMissing: return "Account credential not found." case .badRequest: return "Request invalid." @@ -75,7 +75,7 @@ extension APIService.APIError: LocalizedError { } } - var helpAnchor: String? { + public var helpAnchor: String? { switch errorReason { case .authenticationMissing: return "Please request after authenticated." case .badRequest: return L10n.Common.Alerts.Common.pleaseTryAgain diff --git a/Mastodon/Service/APIService/APIService+Account.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift similarity index 93% rename from Mastodon/Service/APIService/APIService+Account.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift index 11da2f4ee..520c566c1 100644 --- a/Mastodon/Service/APIService/APIService+Account.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Account.swift @@ -9,6 +9,7 @@ import os.log import Foundation import Combine import CommonOSLog +import MastodonCommon import MastodonSDK extension APIService { @@ -59,7 +60,7 @@ extension APIService { authorization: authorization ) .flatMap { response -> AnyPublisher, Error> in - let log = OSLog.api + let logger = Logger(subsystem: "Account", category: "API") let account = response.value let managedObjectContext = self.backgroundManagedObjectContext @@ -74,7 +75,7 @@ extension APIService { ) ) let flag = result.isNewInsertion ? "+" : "-" - os_log(.info, log: log, "%{public}s[%{public}ld], %{public}s: mastodon user [%s](%s)%s verifed", ((#file as NSString).lastPathComponent), #line, #function, flag, result.user.id, result.user.username) + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): mastodon user [\(flag)](\(result.user.id))\(result.user.username) verifed") } .setFailureType(to: Error.self) .tryMap { result -> Mastodon.Response.Content in @@ -95,7 +96,7 @@ extension APIService { query: Mastodon.API.Account.UpdateCredentialQuery, authorization: Mastodon.API.OAuth.Authorization ) async throws -> Mastodon.Response.Content { - let logger = Logger(subsystem: "APIService", category: "Account") + let logger = Logger(subsystem: "Account", category: "API") let response = try await Mastodon.API.Account.updateCredentials( session: session, diff --git a/Mastodon/Service/APIService/APIService+App.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+App.swift similarity index 92% rename from Mastodon/Service/APIService/APIService+App.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+App.swift index 7153bc2af..cb46c7e76 100644 --- a/Mastodon/Service/APIService/APIService+App.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+App.swift @@ -24,7 +24,7 @@ extension APIService { func createApplication(domain: String) -> AnyPublisher, Error> { let query = Mastodon.API.App.CreateQuery( clientName: APIService.clientName, - redirectURIs: MastodonAuthenticationController.callbackURL, + redirectURIs: APIService.oauthCallbackURL, website: APIService.appWebsite ) return Mastodon.API.App.create( diff --git a/Mastodon/Service/APIService/APIService+Authentication.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Authentication.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Authentication.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Authentication.swift diff --git a/Mastodon/Service/APIService/APIService+Block.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Block.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Block.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Block.swift diff --git a/Mastodon/Service/APIService/APIService+Bookmark.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Bookmark.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Bookmark.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Bookmark.swift diff --git a/Mastodon/Service/APIService/APIService+CustomEmoji.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+CustomEmoji.swift similarity index 95% rename from Mastodon/Service/APIService/APIService+CustomEmoji.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+CustomEmoji.swift index 2a80eca4c..647bb4956 100644 --- a/Mastodon/Service/APIService/APIService+CustomEmoji.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+CustomEmoji.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+DomainBlock.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+DomainBlock.swift similarity index 99% rename from Mastodon/Service/APIService/APIService+DomainBlock.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+DomainBlock.swift index 222e12999..138997500 100644 --- a/Mastodon/Service/APIService/APIService+DomainBlock.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+DomainBlock.swift @@ -9,7 +9,6 @@ import Combine import CommonOSLog import CoreData import CoreDataStack -import DateToolsSwift import Foundation import MastodonSDK diff --git a/Mastodon/Service/APIService/APIService+Favorite.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Favorite.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Favorite.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Favorite.swift diff --git a/Mastodon/Service/APIService/APIService+Filter.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Filter.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Filter.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Filter.swift diff --git a/Mastodon/Service/APIService/APIService+Follow.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Follow.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Follow.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Follow.swift diff --git a/Mastodon/Service/APIService/APIService+FollowRequest.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+FollowRequest.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+FollowRequest.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+FollowRequest.swift diff --git a/Mastodon/Service/APIService/APIService+Follower.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Follower.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Follower.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Follower.swift diff --git a/Mastodon/Service/APIService/APIService+Following.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Following.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Following.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Following.swift diff --git a/Mastodon/Service/APIService/APIService+HashtagTimeline.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+HashtagTimeline.swift similarity index 98% rename from Mastodon/Service/APIService/APIService+HashtagTimeline.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+HashtagTimeline.swift index ce8783895..319cec4f3 100644 --- a/Mastodon/Service/APIService/APIService+HashtagTimeline.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+HashtagTimeline.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+HomeTimeline.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+HomeTimeline.swift similarity index 99% rename from Mastodon/Service/APIService/APIService+HomeTimeline.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+HomeTimeline.swift index 863510af4..612b60d55 100644 --- a/Mastodon/Service/APIService/APIService+HomeTimeline.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+HomeTimeline.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+Instance.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Instance.swift similarity index 95% rename from Mastodon/Service/APIService/APIService+Instance.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Instance.swift index 4bc613b55..477b1a5b5 100644 --- a/Mastodon/Service/APIService/APIService+Instance.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Instance.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+Media.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Media.swift similarity index 97% rename from Mastodon/Service/APIService/APIService+Media.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Media.swift index 0c7822c9d..58932ece8 100644 --- a/Mastodon/Service/APIService/APIService+Media.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Media.swift @@ -11,7 +11,7 @@ import MastodonSDK extension APIService { - func uploadMedia( + public func uploadMedia( domain: String, query: Mastodon.API.Media.UploadMediaQuery, mastodonAuthenticationBox: MastodonAuthenticationBox, @@ -59,7 +59,7 @@ extension APIService { extension APIService { - func getMedia( + public func getMedia( attachmentID: Mastodon.Entity.Attachment.ID, mastodonAuthenticationBox: MastodonAuthenticationBox ) -> AnyPublisher, Error> { @@ -78,7 +78,7 @@ extension APIService { extension APIService { - func updateMedia( + public func updateMedia( domain: String, attachmentID: Mastodon.Entity.Attachment.ID, query: Mastodon.API.Media.UpdateMediaQuery, diff --git a/Mastodon/Service/APIService/APIService+Mute.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Mute.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Mute.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Mute.swift diff --git a/Mastodon/Service/APIService/APIService+Notification.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Notification.swift similarity index 86% rename from Mastodon/Service/APIService/APIService+Notification.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Notification.swift index 88c69847b..871c8349c 100644 --- a/Mastodon/Service/APIService/APIService+Notification.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Notification.swift @@ -14,9 +14,35 @@ import OSLog import class CoreDataStack.Notification extension APIService { + + enum MastodonNotificationScope: Hashable, CaseIterable { + case everything + case mentions + + var includeTypes: [MastodonNotificationType]? { + switch self { + case .everything: return nil + case .mentions: return [.mention, .status] + } + } + + var excludeTypes: [MastodonNotificationType]? { + switch self { + case .everything: return nil + case .mentions: return [.follow, .followRequest, .reblog, .favourite, .poll] + } + } + + var _excludeTypes: [Mastodon.Entity.Notification.NotificationType]? { + switch self { + case .everything: return nil + case .mentions: return [.follow, .followRequest, .reblog, .favourite, .poll] + } + } + } func notifications( maxID: Mastodon.Entity.Status.ID?, - scope: NotificationTimelineViewModel.Scope, + scope: MastodonNotificationScope, authenticationBox: MastodonAuthenticationBox ) async throws -> Mastodon.Response.Content<[Mastodon.Entity.Notification]> { let authorization = authenticationBox.userAuthorization diff --git a/Mastodon/Service/APIService/APIService+Onboarding.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Onboarding.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Onboarding.swift diff --git a/Mastodon/Service/APIService/APIService+Poll.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Poll.swift similarity index 99% rename from Mastodon/Service/APIService/APIService+Poll.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Poll.swift index 15a6847c7..9d2895857 100644 --- a/Mastodon/Service/APIService/APIService+Poll.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Poll.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+PublicTimeline.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+PublicTimeline.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+PublicTimeline.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+PublicTimeline.swift diff --git a/Mastodon/Service/APIService/APIService+Reblog.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Reblog.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Reblog.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Reblog.swift diff --git a/Mastodon/Service/APIService/APIService+Recommend.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Recommend.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Recommend.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Recommend.swift diff --git a/Mastodon/Service/APIService/APIService+Relationship.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Relationship.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Relationship.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Relationship.swift diff --git a/Mastodon/Service/APIService/APIService+Report.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Report.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift diff --git a/Mastodon/Service/APIService/APIService+Search.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Search.swift similarity index 98% rename from Mastodon/Service/APIService/APIService+Search.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Search.swift index 724d7f611..5e6217bcf 100644 --- a/Mastodon/Service/APIService/APIService+Search.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Search.swift @@ -12,7 +12,7 @@ import CommonOSLog extension APIService { - func search( + public func search( query: Mastodon.API.V2.Search.Query, authenticationBox: MastodonAuthenticationBox ) async throws -> Mastodon.Response.Content { @@ -61,4 +61,5 @@ extension APIService { return response } + } diff --git a/Mastodon/Service/APIService/APIService+Status+Publish.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status+Publish.swift similarity index 98% rename from Mastodon/Service/APIService/APIService+Status+Publish.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status+Publish.swift index 2b49584f1..d2cbd3f5c 100644 --- a/Mastodon/Service/APIService/APIService+Status+Publish.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status+Publish.swift @@ -14,7 +14,7 @@ import MastodonSDK extension APIService { - func publishStatus( + public func publishStatus( domain: String, idempotencyKey: String?, query: Mastodon.API.Statuses.PublishStatusQuery, diff --git a/Mastodon/Service/APIService/APIService+Status.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status.swift similarity index 99% rename from Mastodon/Service/APIService/APIService+Status.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status.swift index cf6974fbd..b7d6484dd 100644 --- a/Mastodon/Service/APIService/APIService+Status.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Status.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService+Subscriptions.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Subscriptions.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Subscriptions.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Subscriptions.swift diff --git a/Mastodon/Service/APIService/APIService+Thread.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Thread.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Thread.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Thread.swift diff --git a/Mastodon/Service/APIService/APIService+Trend.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Trend.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+Trend.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+Trend.swift diff --git a/Mastodon/Service/APIService/APIService+UserTimeline.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+UserTimeline.swift similarity index 100% rename from Mastodon/Service/APIService/APIService+UserTimeline.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+UserTimeline.swift diff --git a/Mastodon/Service/APIService/APIService+WebFinger.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+WebFinger.swift similarity index 97% rename from Mastodon/Service/APIService/APIService+WebFinger.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService+WebFinger.swift index b49ad9e31..c506d43dc 100644 --- a/Mastodon/Service/APIService/APIService+WebFinger.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+WebFinger.swift @@ -10,7 +10,6 @@ import Combine import CoreData import CoreDataStack import CommonOSLog -import DateToolsSwift import MastodonSDK extension APIService { diff --git a/Mastodon/Service/APIService/APIService.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService.swift similarity index 71% rename from Mastodon/Service/APIService/APIService.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/APIService.swift index dabdadfea..b151ee540 100644 --- a/Mastodon/Service/APIService/APIService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService.swift @@ -12,9 +12,12 @@ import CoreData import CoreDataStack import MastodonSDK import AlamofireImage -import AlamofireNetworkActivityIndicator +// import AlamofireNetworkActivityIndicator -final class APIService { +public final class APIService { + + public static let callbackURLScheme = "mastodon" + public static let oauthCallbackURL = "mastodon://joinmastodon.org/oauth" var disposeBag = Set() @@ -27,7 +30,7 @@ final class APIService { // output let error = PassthroughSubject() - init(backgroundManagedObjectContext: NSManagedObjectContext) { + public init(backgroundManagedObjectContext: NSManagedObjectContext) { self.backgroundManagedObjectContext = backgroundManagedObjectContext self.session = URLSession(configuration: .default) @@ -35,9 +38,9 @@ final class APIService { URLCache.shared = URLCache(memoryCapacity: 10 * 1024 * 1024, diskCapacity: 50 * 1024 * 1024, diskPath: nil) // enable network activity manager for AlamofireImage - NetworkActivityIndicatorManager.shared.isEnabled = true - NetworkActivityIndicatorManager.shared.startDelay = 0.2 - NetworkActivityIndicatorManager.shared.completionDelay = 0.5 + // NetworkActivityIndicatorManager.shared.isEnabled = true + // NetworkActivityIndicatorManager.shared.startDelay = 0.2 + // NetworkActivityIndicatorManager.shared.completionDelay = 0.5 UIImageView.af.sharedImageDownloader = ImageDownloader(downloadPrioritization: .lifo) } diff --git a/Mastodon/Service/APIService/CoreData/APIService+CoreData+Instance.swift b/MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Instance.swift similarity index 99% rename from Mastodon/Service/APIService/CoreData/APIService+CoreData+Instance.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Instance.swift index 614d098aa..2127a2981 100644 --- a/Mastodon/Service/APIService/CoreData/APIService+CoreData+Instance.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Instance.swift @@ -18,7 +18,7 @@ extension APIService.CoreData { domain: String, entity: Mastodon.Entity.Instance, networkDate: Date, - log: OSLog + log: Logger ) -> (instance: Instance, isCreated: Bool) { // fetch old mastodon user let old: Instance? = { diff --git a/Mastodon/Service/APIService/CoreData/APIService+CoreData+MastodonAuthentication.swift b/MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+MastodonAuthentication.swift similarity index 100% rename from Mastodon/Service/APIService/CoreData/APIService+CoreData+MastodonAuthentication.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+MastodonAuthentication.swift diff --git a/Mastodon/Service/APIService/CoreData/APIService+CoreData+Setting.swift b/MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Setting.swift similarity index 100% rename from Mastodon/Service/APIService/CoreData/APIService+CoreData+Setting.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Setting.swift diff --git a/Mastodon/Service/APIService/CoreData/APIService+CoreData+Subscriptions.swift b/MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Subscriptions.swift similarity index 100% rename from Mastodon/Service/APIService/CoreData/APIService+CoreData+Subscriptions.swift rename to MastodonSDK/Sources/MastodonCore/Service/API/CoreData/APIService+CoreData+Subscriptions.swift diff --git a/Mastodon/Service/AuthenticationService.swift b/MastodonSDK/Sources/MastodonCore/Service/AuthenticationService.swift similarity index 89% rename from Mastodon/Service/AuthenticationService.swift rename to MastodonSDK/Sources/MastodonCore/Service/AuthenticationService.swift index 97afde932..105543d52 100644 --- a/Mastodon/Service/AuthenticationService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/AuthenticationService.swift @@ -12,7 +12,7 @@ import CoreData import CoreDataStack import MastodonSDK -final class AuthenticationService: NSObject { +public final class AuthenticationService: NSObject { var disposeBag = Set() @@ -23,10 +23,10 @@ final class AuthenticationService: NSObject { let mastodonAuthenticationFetchedResultsController: NSFetchedResultsController // output - let mastodonAuthentications = CurrentValueSubject<[MastodonAuthentication], Never>([]) - let mastodonAuthenticationBoxes = CurrentValueSubject<[MastodonAuthenticationBox], Never>([]) - let activeMastodonAuthentication = CurrentValueSubject(nil) - let activeMastodonAuthenticationBox = CurrentValueSubject(nil) + public let mastodonAuthentications = CurrentValueSubject<[MastodonAuthentication], Never>([]) + public let mastodonAuthenticationBoxes = CurrentValueSubject<[MastodonAuthenticationBox], Never>([]) + public let activeMastodonAuthentication = CurrentValueSubject(nil) + public let activeMastodonAuthenticationBox = CurrentValueSubject(nil) init( managedObjectContext: NSManagedObjectContext, @@ -94,7 +94,7 @@ final class AuthenticationService: NSObject { extension AuthenticationService { - func activeMastodonUser(domain: String, userID: MastodonUser.ID) -> AnyPublisher, Never> { + public func activeMastodonUser(domain: String, userID: MastodonUser.ID) -> AnyPublisher, Never> { var isActive = false var _mastodonAuthentication: MastodonAuthentication? @@ -180,11 +180,11 @@ extension AuthenticationService { // MARK: - NSFetchedResultsControllerDelegate extension AuthenticationService: NSFetchedResultsControllerDelegate { - func controllerWillChangeContent(_ controller: NSFetchedResultsController) { + public func controllerWillChangeContent(_ controller: NSFetchedResultsController) { os_log("%{public}s[%{public}ld], %{public}s", ((#file as NSString).lastPathComponent), #line, #function) } - func controllerDidChangeContent(_ controller: NSFetchedResultsController) { + public func controllerDidChangeContent(_ controller: NSFetchedResultsController) { if controller === mastodonAuthenticationFetchedResultsController { mastodonAuthentications.value = mastodonAuthenticationFetchedResultsController.fetchedObjects ?? [] } diff --git a/Mastodon/Service/BlockDomainService.swift b/MastodonSDK/Sources/MastodonCore/Service/BlockDomainService.swift similarity index 99% rename from Mastodon/Service/BlockDomainService.swift rename to MastodonSDK/Sources/MastodonCore/Service/BlockDomainService.swift index 90d860143..c7b2c2333 100644 --- a/Mastodon/Service/BlockDomainService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/BlockDomainService.swift @@ -13,7 +13,7 @@ import MastodonSDK import OSLog import UIKit -final class BlockDomainService { +public final class BlockDomainService { // input weak var backgroundManagedObjectContext: NSManagedObjectContext? weak var authenticationService: AuthenticationService? diff --git a/MastodonSDK/Sources/MastodonUI/Service/BlurhashImageCacheService.swift b/MastodonSDK/Sources/MastodonCore/Service/BlurhashImageCacheService.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Service/BlurhashImageCacheService.swift rename to MastodonSDK/Sources/MastodonCore/Service/BlurhashImageCacheService.swift diff --git a/Mastodon/Service/EmojiService/EmojiService+CustomEmojiViewModel+LoadState.swift b/MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService+CustomEmojiViewModel+LoadState.swift similarity index 100% rename from Mastodon/Service/EmojiService/EmojiService+CustomEmojiViewModel+LoadState.swift rename to MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService+CustomEmojiViewModel+LoadState.swift diff --git a/Mastodon/Service/EmojiService/EmojiService+CustomEmojiViewModel.swift b/MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService+CustomEmojiViewModel.swift similarity index 86% rename from Mastodon/Service/EmojiService/EmojiService+CustomEmojiViewModel.swift rename to MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService+CustomEmojiViewModel.swift index b0ee6cb80..f28dfa805 100644 --- a/Mastodon/Service/EmojiService/EmojiService+CustomEmojiViewModel.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService+CustomEmojiViewModel.swift @@ -9,9 +9,10 @@ import Foundation import Combine import GameplayKit import MastodonSDK +import MastodonCommon extension EmojiService { - final class CustomEmojiViewModel { + public final class CustomEmojiViewModel { var disposeBag = Set() @@ -31,10 +32,10 @@ extension EmojiService { stateMachine.enter(LoadState.Initial.self) return stateMachine }() - let emojis = CurrentValueSubject<[Mastodon.Entity.Emoji], Never>([]) - let emojiDict = CurrentValueSubject<[String: [Mastodon.Entity.Emoji]], Never>([:]) - let emojiMapping = CurrentValueSubject<[String: String], Never>([:]) - let emojiTrie = CurrentValueSubject?, Never>(nil) + public let emojis = CurrentValueSubject<[Mastodon.Entity.Emoji], Never>([]) + public let emojiDict = CurrentValueSubject<[String: [Mastodon.Entity.Emoji]], Never>([:]) + public let emojiMapping = CurrentValueSubject<[String: String], Never>([:]) + public let emojiTrie = CurrentValueSubject?, Never>(nil) private var learnedEmoji: Set = Set() diff --git a/Mastodon/Service/EmojiService/EmojiService.swift b/MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService.swift similarity index 97% rename from Mastodon/Service/EmojiService/EmojiService.swift rename to MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService.swift index a11ebb8bc..6f44178da 100644 --- a/Mastodon/Service/EmojiService/EmojiService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Emoji/EmojiService.swift @@ -10,7 +10,7 @@ import Foundation import Combine import MastodonSDK -final class EmojiService { +public final class EmojiService { weak var apiService: APIService? diff --git a/Mastodon/Service/EmojiService/Trie.swift b/MastodonSDK/Sources/MastodonCore/Service/Emoji/Trie.swift similarity index 88% rename from Mastodon/Service/EmojiService/Trie.swift rename to MastodonSDK/Sources/MastodonCore/Service/Emoji/Trie.swift index 3bf9eeaf0..cfb9c4362 100644 --- a/Mastodon/Service/EmojiService/Trie.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Emoji/Trie.swift @@ -7,20 +7,20 @@ import Foundation -struct Trie { - let isElement: Bool - let valueSet: NSMutableSet - var children: [Element: Trie] +public struct Trie { + public let isElement: Bool + public let valueSet: NSMutableSet + public var children: [Element: Trie] } extension Trie { - init() { + public init() { isElement = false valueSet = NSMutableSet() children = [:] } - init(_ key: ArraySlice, value: Any) { + public init(_ key: ArraySlice, value: Any) { if let (head, tail) = key.decomposed { let children = [head: Trie(tail, value: value)] self = Trie(isElement: false, valueSet: NSMutableSet(), children: children) @@ -31,7 +31,7 @@ extension Trie { } extension Trie { - var elements: [[Element]] { + public var elements: [[Element]] { var result: [[Element]] = isElement ? [[]] : [] for (key, value) in children { result += value.elements.map { [key] + $0 } @@ -40,12 +40,6 @@ extension Trie { } } -//extension Array { -// var slice: ArraySlice { -// return ArraySlice(self) -// } -//} - extension ArraySlice { var decomposed: (Element, ArraySlice)? { return isEmpty ? nil : (self[startIndex], self.dropFirst()) diff --git a/Mastodon/Service/InstanceService.swift b/MastodonSDK/Sources/MastodonCore/Service/InstanceService.swift similarity index 97% rename from Mastodon/Service/InstanceService.swift rename to MastodonSDK/Sources/MastodonCore/Service/InstanceService.swift index 03b8dfd4e..7632704b0 100644 --- a/Mastodon/Service/InstanceService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/InstanceService.swift @@ -12,7 +12,7 @@ import CoreData import CoreDataStack import MastodonSDK -final class InstanceService { +public final class InstanceService { var disposeBag = Set() @@ -59,7 +59,7 @@ extension InstanceService { domain: domain, entity: response.value, networkDate: response.networkDate, - log: OSLog.api + log: Logger(subsystem: "Update", category: "InstanceService") ) // update relationship diff --git a/Mastodon/Service/MastodonAttachmentService/MastodonAttachmentService+UploadState.swift b/MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment/MastodonAttachmentService+UploadState.swift similarity index 100% rename from Mastodon/Service/MastodonAttachmentService/MastodonAttachmentService+UploadState.swift rename to MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment/MastodonAttachmentService+UploadState.swift diff --git a/Mastodon/Service/MastodonAttachmentService/MastodonAttachmentService.swift b/MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment/MastodonAttachmentService.swift similarity index 99% rename from Mastodon/Service/MastodonAttachmentService/MastodonAttachmentService.swift rename to MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment/MastodonAttachmentService.swift index e42c9bf2e..edb8e7ae6 100644 --- a/Mastodon/Service/MastodonAttachmentService/MastodonAttachmentService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/MastodonAttachment/MastodonAttachmentService.swift @@ -12,7 +12,6 @@ import PhotosUI import GameplayKit import MobileCoreServices import MastodonSDK -import MastodonUI protocol MastodonAttachmentServiceDelegate: AnyObject { func mastodonAttachmentService(_ service: MastodonAttachmentService, uploadStateDidChange state: MastodonAttachmentService.UploadState?) diff --git a/NotificationService/MastodonPushNotification.swift b/MastodonSDK/Sources/MastodonCore/Service/Notification/MastodonPushNotification.swift similarity index 73% rename from NotificationService/MastodonPushNotification.swift rename to MastodonSDK/Sources/MastodonCore/Service/Notification/MastodonPushNotification.swift index 7d961f31d..047ba7757 100644 --- a/NotificationService/MastodonPushNotification.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Notification/MastodonPushNotification.swift @@ -7,20 +7,17 @@ import Foundation -struct MastodonPushNotification: Codable { +public struct MastodonPushNotification: Codable { - let accessToken: String -// var accessToken: String { -// return String.normalize(base64String: _accessToken) -// } + public let accessToken: String - let notificationID: Int - let notificationType: String + public let notificationID: Int + public let notificationType: String - let preferredLocale: String? - let icon: String? - let title: String - let body: String + public let preferredLocale: String? + public let icon: String? + public let title: String + public let body: String enum CodingKeys: String, CodingKey { case accessToken = "access_token" diff --git a/Mastodon/Service/NotificationService.swift b/MastodonSDK/Sources/MastodonCore/Service/Notification/NotificationService.swift similarity index 91% rename from Mastodon/Service/NotificationService.swift rename to MastodonSDK/Sources/MastodonCore/Service/Notification/NotificationService.swift index e4e7508a3..4e08cd659 100644 --- a/Mastodon/Service/NotificationService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Notification/NotificationService.swift @@ -11,9 +11,9 @@ import Combine import CoreData import CoreDataStack import MastodonSDK -import AppShared +import MastodonCommon -final class NotificationService { +public final class NotificationService { var disposeBag = Set() @@ -22,15 +22,15 @@ final class NotificationService { // input weak var apiService: APIService? weak var authenticationService: AuthenticationService? - let isNotificationPermissionGranted = CurrentValueSubject(false) - let deviceToken = CurrentValueSubject(nil) - let applicationIconBadgeNeedsUpdate = CurrentValueSubject(Void()) + public let isNotificationPermissionGranted = CurrentValueSubject(false) + public let deviceToken = CurrentValueSubject(nil) + public let applicationIconBadgeNeedsUpdate = CurrentValueSubject(Void()) // output /// [Token: NotificationViewModel] - let notificationSubscriptionDict: [String: NotificationViewModel] = [:] - let unreadNotificationCountDidUpdate = CurrentValueSubject(Void()) - let requestRevealNotificationPublisher = PassthroughSubject() + public let notificationSubscriptionDict: [String: NotificationViewModel] = [:] + public let unreadNotificationCountDidUpdate = CurrentValueSubject(Void()) + public let requestRevealNotificationPublisher = PassthroughSubject() init( apiService: APIService, @@ -55,7 +55,8 @@ final class NotificationService { guard let _ = self else { return } guard let deviceToken = deviceToken else { return } let token = [UInt8](deviceToken).toHexString() - os_log(.info, log: .api, "%{public}s[%{public}ld], %{public}s: deviceToken: %s", ((#file as NSString).lastPathComponent), #line, #function, token) + let logger = Logger(subsystem: "DeviceToken", category: "NotificationService") + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): deviceToken: \(token)") } .store(in: &disposeBag) @@ -121,7 +122,7 @@ extension NotificationService { return _notificationSubscription } - func handle( + public func handle( pushNotification: MastodonPushNotification ) { defer { @@ -239,7 +240,7 @@ extension NotificationService { // MARK: - NotificationViewModel extension NotificationService { - final class NotificationViewModel { + public final class NotificationViewModel { var disposeBag = Set() diff --git a/Mastodon/Service/PhotoLibraryService.swift b/MastodonSDK/Sources/MastodonCore/Service/PhotoLibraryService.swift similarity index 94% rename from Mastodon/Service/PhotoLibraryService.swift rename to MastodonSDK/Sources/MastodonCore/Service/PhotoLibraryService.swift index 99dcb61ff..053ab3586 100644 --- a/Mastodon/Service/PhotoLibraryService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/PhotoLibraryService.swift @@ -11,20 +11,19 @@ import Combine import Photos import Alamofire import AlamofireImage -import FLAnimatedImage -final class PhotoLibraryService: NSObject { +public final class PhotoLibraryService: NSObject { } extension PhotoLibraryService { - enum PhotoLibraryError: Error { + public enum PhotoLibraryError: Error { case noPermission case badPayload } - enum ImageSource { + public enum ImageSource { case url(URL) case image(UIImage) } @@ -33,7 +32,7 @@ extension PhotoLibraryService { extension PhotoLibraryService { - func save(imageSource source: ImageSource) -> AnyPublisher { + public func save(imageSource source: ImageSource) -> AnyPublisher { let impactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light) let notificationFeedbackGenerator = UINotificationFeedbackGenerator() @@ -68,7 +67,7 @@ extension PhotoLibraryService { extension PhotoLibraryService { - func copy(imageSource source: ImageSource) -> AnyPublisher { + public func copy(imageSource source: ImageSource) -> AnyPublisher { let impactFeedbackGenerator = UIImpactFeedbackGenerator(style: .light) let notificationFeedbackGenerator = UINotificationFeedbackGenerator() diff --git a/Mastodon/Service/PlaceholderImageCacheService.swift b/MastodonSDK/Sources/MastodonCore/Service/PlaceholderImageCacheService.swift similarity index 97% rename from Mastodon/Service/PlaceholderImageCacheService.swift rename to MastodonSDK/Sources/MastodonCore/Service/PlaceholderImageCacheService.swift index ecfde6d49..0f43db9f8 100644 --- a/Mastodon/Service/PlaceholderImageCacheService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/PlaceholderImageCacheService.swift @@ -8,7 +8,7 @@ import UIKit import AlamofireImage -final class PlaceholderImageCacheService { +public final class PlaceholderImageCacheService { let cache = NSCache() diff --git a/Mastodon/Service/PlaybackState.swift b/MastodonSDK/Sources/MastodonCore/Service/PlaybackState.swift similarity index 100% rename from Mastodon/Service/PlaybackState.swift rename to MastodonSDK/Sources/MastodonCore/Service/PlaybackState.swift diff --git a/Mastodon/Service/SettingService.swift b/MastodonSDK/Sources/MastodonCore/Service/SettingService.swift similarity index 91% rename from Mastodon/Service/SettingService.swift rename to MastodonSDK/Sources/MastodonCore/Service/SettingService.swift index bd571d8f4..fc7151605 100644 --- a/Mastodon/Service/SettingService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/SettingService.swift @@ -14,7 +14,7 @@ import MastodonAsset import MastodonLocalization import MastodonCommon -final class SettingService { +public final class SettingService { var disposeBag = Set() @@ -108,7 +108,9 @@ final class SettingService { }) } .store(in: &disposeBag) - + + let logger = Logger(subsystem: "Notification", category: "SettingService") + Publishers.CombineLatest3( notificationService.deviceToken, currentSetting.eraseToAnyPublisher(), @@ -158,12 +160,12 @@ final class SettingService { .sink { completion in switch completion { case .failure(let error): - os_log(.info, log: .api, "%{public}s[%{public}ld], %{public}s: [Push Notification] subscribe failure: %s", ((#file as NSString).lastPathComponent), #line, #function, error.localizedDescription) + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): [Push Notification] subscribe failure: \(error.localizedDescription)") case .finished: - os_log(.info, log: .default, "%{public}s[%{public}ld], %{public}s: [Push Notification] subscribe success", ((#file as NSString).lastPathComponent), #line, #function) + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): [Push Notification] subscribe success") } } receiveValue: { response in - os_log(.info, log: .default, "%{public}s[%{public}ld], %{public}s: [Push Notification] subscribe response: %s", ((#file as NSString).lastPathComponent), #line, #function, response.value.endpoint) + logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): subscribe response: \(response.value.endpoint)") } .store(in: &self.disposeBag) }) diff --git a/Mastodon/Service/StatusFilterService.swift b/MastodonSDK/Sources/MastodonCore/Service/StatusFilterService.swift similarity index 98% rename from Mastodon/Service/StatusFilterService.swift rename to MastodonSDK/Sources/MastodonCore/Service/StatusFilterService.swift index b5afd08ab..692a43706 100644 --- a/Mastodon/Service/StatusFilterService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/StatusFilterService.swift @@ -13,7 +13,7 @@ import CoreDataStack import MastodonSDK import MastodonMeta -final class StatusFilterService { +public final class StatusFilterService { var disposeBag = Set() diff --git a/MastodonSDK/Sources/MastodonCore/Service/StatusPublishService.swift b/MastodonSDK/Sources/MastodonCore/Service/StatusPublishService.swift new file mode 100644 index 000000000..a411f30c2 --- /dev/null +++ b/MastodonSDK/Sources/MastodonCore/Service/StatusPublishService.swift @@ -0,0 +1,79 @@ +// +// StatusPublishService.swift +// Mastodon +// +// Created by MainasuK Cirno on 2021-3-26. +// + +import os.log +import Foundation +import Intents +import Combine +import CoreData +import CoreDataStack +import MastodonSDK +import UIKit + +public final class StatusPublishService { + + var disposeBag = Set() + + let workingQueue = DispatchQueue(label: "org.joinmastodon.app.StatusPublishService.working-queue") + + // input + // var viewModels = CurrentValueSubject<[ComposeViewModel], Never>([]) // use strong reference to retain the view models + + // output + let composeViewModelDidUpdatePublisher = PassthroughSubject() + // let latestPublishingComposeViewModel = CurrentValueSubject(nil) + + init() { +// Publishers.CombineLatest( +// viewModels.eraseToAnyPublisher(), +// composeViewModelDidUpdatePublisher.eraseToAnyPublisher() +// ) +// .map { viewModels, _ in viewModels.last } +// .assign(to: \.value, on: latestPublishingComposeViewModel) +// .store(in: &disposeBag) + } + +} + +extension StatusPublishService { + +// func publish(composeViewModel: ComposeViewModel) { +// workingQueue.sync { +// guard !self.viewModels.value.contains(where: { $0 === composeViewModel }) else { return } +// self.viewModels.value = self.viewModels.value + [composeViewModel] +// +// composeViewModel.publishStateMachinePublisher +// .receive(on: DispatchQueue.main) +// .sink { [weak self, weak composeViewModel] state in +// guard let self = self else { return } +// guard let composeViewModel = composeViewModel else { return } +// +// os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: composeViewModelDidUpdate", ((#file as NSString).lastPathComponent), #line, #function) +// self.composeViewModelDidUpdatePublisher.send() +// +// switch state { +// case is ComposeViewModel.PublishState.Finish: +// self.remove(composeViewModel: composeViewModel) +// default: +// break +// } +// } +// .store(in: &composeViewModel.disposeBag) // cancel subscription when viewModel dealloc +// } +// } +// +// func remove(composeViewModel: ComposeViewModel) { +// workingQueue.async { +// var viewModels = self.viewModels.value +// viewModels.removeAll(where: { $0 === composeViewModel }) +// self.viewModels.value = viewModels +// +// os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s: composeViewModel removed", ((#file as NSString).lastPathComponent), #line, #function) +// } +// } + +} diff --git a/MastodonSDK/Sources/MastodonUI/Service/ThemeService/MastodonTheme.swift b/MastodonSDK/Sources/MastodonCore/Service/Theme/MastodonTheme.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Service/ThemeService/MastodonTheme.swift rename to MastodonSDK/Sources/MastodonCore/Service/Theme/MastodonTheme.swift diff --git a/MastodonSDK/Sources/MastodonUI/Service/ThemeService/SystemTheme.swift b/MastodonSDK/Sources/MastodonCore/Service/Theme/SystemTheme.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Service/ThemeService/SystemTheme.swift rename to MastodonSDK/Sources/MastodonCore/Service/Theme/SystemTheme.swift diff --git a/MastodonSDK/Sources/MastodonUI/Service/ThemeService/Theme.swift b/MastodonSDK/Sources/MastodonCore/Service/Theme/Theme.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Service/ThemeService/Theme.swift rename to MastodonSDK/Sources/MastodonCore/Service/Theme/Theme.swift diff --git a/Mastodon/Extension/MastodonUI/ThemeService.swift b/MastodonSDK/Sources/MastodonCore/Service/Theme/ThemeService.swift similarity index 73% rename from Mastodon/Extension/MastodonUI/ThemeService.swift rename to MastodonSDK/Sources/MastodonCore/Service/Theme/ThemeService.swift index 5fe213d06..869e6875f 100644 --- a/Mastodon/Extension/MastodonUI/ThemeService.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/Theme/ThemeService.swift @@ -2,15 +2,41 @@ // ThemeService.swift // Mastodon // -// Created by MainasuK on 2022-4-13. +// Created by MainasuK Cirno on 2021-7-5. // import UIKit +import Combine import MastodonCommon -import MastodonUI + +// ref: https://zamzam.io/protocol-oriented-themes-for-ios-apps/ +public final class ThemeService { + + public static let tintColor: UIColor = .label + + // MARK: - Singleton + public static let shared = ThemeService() + + public let currentTheme: CurrentValueSubject + + private init() { + let theme = ThemeName(rawValue: UserDefaults.shared.currentThemeNameRawValue)?.theme ?? ThemeName.mastodon.theme + currentTheme = CurrentValueSubject(theme) + } + +} + +extension ThemeName { + public var theme: Theme { + switch self { + case .system: return SystemTheme() + case .mastodon: return MastodonTheme() + } + } +} extension ThemeService { - func set(themeName: ThemeName) { + public func set(themeName: ThemeName) { UserDefaults.shared.currentThemeNameRawValue = themeName.rawValue let theme = themeName.theme @@ -18,7 +44,7 @@ extension ThemeService { currentTheme.value = theme } - func apply(theme: Theme) { + public func apply(theme: Theme) { // set navigation bar appearance let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() @@ -59,8 +85,9 @@ extension ThemeService { // set table view cell appearance UITableViewCell.appearance().backgroundColor = theme.tableViewCellBackgroundColor - UITableViewCell.appearance(whenContainedInInstancesOf: [SettingsViewController.self]).backgroundColor = theme.secondarySystemGroupedBackgroundColor - UITableViewCell.appearance().selectionColor = theme.tableViewCellSelectionBackgroundColor + // FIXME: refactor + // UITableViewCell.appearance(whenContainedInInstancesOf: [SettingsViewController.self]).backgroundColor = theme.secondarySystemGroupedBackgroundColor + // UITableViewCell.appearance().selectionColor = theme.tableViewCellSelectionBackgroundColor // set search bar appearance UISearchBar.appearance().tintColor = ThemeService.tintColor diff --git a/MastodonSDK/Sources/MastodonUI/Vendor/BlurHashDecode.swift b/MastodonSDK/Sources/MastodonCore/Vendor/BlurHashDecode.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Vendor/BlurHashDecode.swift rename to MastodonSDK/Sources/MastodonCore/Vendor/BlurHashDecode.swift diff --git a/MastodonSDK/Sources/MastodonUI/Vendor/BlurHashEncode.swift b/MastodonSDK/Sources/MastodonCore/Vendor/BlurHashEncode.swift similarity index 100% rename from MastodonSDK/Sources/MastodonUI/Vendor/BlurHashEncode.swift rename to MastodonSDK/Sources/MastodonCore/Vendor/BlurHashEncode.swift diff --git a/MastodonSDK/Sources/MastodonUI/Vendor/ItemProviderLoader.swift b/MastodonSDK/Sources/MastodonCore/Vendor/ItemProviderLoader.swift similarity index 99% rename from MastodonSDK/Sources/MastodonUI/Vendor/ItemProviderLoader.swift rename to MastodonSDK/Sources/MastodonCore/Vendor/ItemProviderLoader.swift index ef0c36f1b..9899620fe 100644 --- a/MastodonSDK/Sources/MastodonUI/Vendor/ItemProviderLoader.swift +++ b/MastodonSDK/Sources/MastodonCore/Vendor/ItemProviderLoader.swift @@ -1,6 +1,6 @@ // // ItemProviderLoader.swift -// MastodonUI +// MastodonCore // // Created by MainasuK Cirno on 2021-3-18. // diff --git a/Mastodon/Extension/Array.swift b/MastodonSDK/Sources/MastodonExtension/Array.swift similarity index 93% rename from Mastodon/Extension/Array.swift rename to MastodonSDK/Sources/MastodonExtension/Array.swift index 42f8594d1..3ad5b13ee 100644 --- a/Mastodon/Extension/Array.swift +++ b/MastodonSDK/Sources/MastodonExtension/Array.swift @@ -9,7 +9,7 @@ import Foundation /// https://www.hackingwithswift.com/example-code/language/how-to-remove-duplicate-items-from-an-array extension Array where Element: Hashable { - func removingDuplicates() -> [Element] { + public func removingDuplicates() -> [Element] { var addedDict = [Element: Bool]() return filter { @@ -17,7 +17,7 @@ extension Array where Element: Hashable { } } - mutating func removeDuplicates() { + public mutating func removeDuplicates() { self = self.removingDuplicates() } } @@ -38,12 +38,12 @@ extension Array where Element: Hashable { // extension Array { - init(reserveCapacity: Int) { + public init(reserveCapacity: Int) { self = Array() self.reserveCapacity(reserveCapacity) } - var slice: ArraySlice { + public var slice: ArraySlice { self[self.startIndex ..< self.endIndex] } } diff --git a/Mastodon/Extension/NSManagedObjectContext.swift b/MastodonSDK/Sources/MastodonExtension/NSManagedObjectContext.swift similarity index 77% rename from Mastodon/Extension/NSManagedObjectContext.swift rename to MastodonSDK/Sources/MastodonExtension/NSManagedObjectContext.swift index 9c569a8f4..ecf43d7d9 100644 --- a/Mastodon/Extension/NSManagedObjectContext.swift +++ b/MastodonSDK/Sources/MastodonExtension/NSManagedObjectContext.swift @@ -9,7 +9,7 @@ import Foundation import CoreData extension NSManagedObjectContext { - func safeFetch(_ request: NSFetchRequest) -> [T] where T : NSFetchRequestResult { + public func safeFetch(_ request: NSFetchRequest) -> [T] where T : NSFetchRequestResult { do { return try fetch(request) } catch { diff --git a/MastodonSDK/Sources/MastodonUI/Extension/UIView.swift b/MastodonSDK/Sources/MastodonUI/Extension/UIView.swift index 0489965b5..c66f111a0 100644 --- a/MastodonSDK/Sources/MastodonUI/Extension/UIView.swift +++ b/MastodonSDK/Sources/MastodonUI/Extension/UIView.swift @@ -6,6 +6,7 @@ // import UIKit +import MastodonCore extension UIView { diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentView.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentView.swift new file mode 100644 index 000000000..21161a0a6 --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentView.swift @@ -0,0 +1,18 @@ +// +// ComposeContentView.swift +// +// +// Created by MainasuK on 22/9/30. +// + +import SwiftUI + +public struct ComposeContentView: View { + public var body: some View { + ScrollView { + VStack { + Text("Hello") + } + } + } +} diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift new file mode 100644 index 000000000..18604c4b3 --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewController.swift @@ -0,0 +1,24 @@ +// +// ComposeContentViewController.swift +// +// +// Created by MainasuK on 22/9/30. +// + +import os.log +import UIKit + +public final class ComposeContentViewController: UIViewController { + + let logger = Logger(subsystem: "ComposeContentViewController", category: "ViewController") + + + +} + +extension ComposeContentViewController { + public override func viewDidLoad() { + super.viewDidLoad() + + } +} diff --git a/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift new file mode 100644 index 000000000..9fa94c5e0 --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/Scene/ComposeContent/ComposeContentViewModel.swift @@ -0,0 +1,20 @@ +// +// ComposeContentViewModel.swift +// +// +// Created by MainasuK on 22/9/30. +// + +import Foundation +import MastodonCore + +final class ComposeContentViewModel: ObservableObject { + + // input + let context: AppContext + + init(context: AppContext) { + self.context = context + } + +} diff --git a/MastodonSDK/Sources/MastodonUI/Service/ThemeService/ThemeService.swift b/MastodonSDK/Sources/MastodonUI/Service/ThemeService/ThemeService.swift deleted file mode 100644 index 394a5f896..000000000 --- a/MastodonSDK/Sources/MastodonUI/Service/ThemeService/ThemeService.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// ThemeService.swift -// Mastodon -// -// Created by MainasuK Cirno on 2021-7-5. -// - -import UIKit -import Combine -import MastodonCommon - -// ref: https://zamzam.io/protocol-oriented-themes-for-ios-apps/ -public final class ThemeService { - - public static let tintColor: UIColor = .label - - // MARK: - Singleton - public static let shared = ThemeService() - - public let currentTheme: CurrentValueSubject - - private init() { - let theme = ThemeName(rawValue: UserDefaults.shared.currentThemeNameRawValue)?.theme ?? ThemeName.mastodon.theme - currentTheme = CurrentValueSubject(theme) - } - -} - -extension ThemeName { - public var theme: Theme { - switch self { - case .system: return SystemTheme() - case .mastodon: return MastodonTheme() - } - } -} diff --git a/MastodonSDK/Sources/MastodonUI/View/Container/AttachmentView.swift b/MastodonSDK/Sources/MastodonUI/View/Container/AttachmentView.swift new file mode 100644 index 000000000..150ff5f51 --- /dev/null +++ b/MastodonSDK/Sources/MastodonUI/View/Container/AttachmentView.swift @@ -0,0 +1,29 @@ +// +// AttachmentView.swift +// +// +// Created by MainasuK on 22/9/30. +// + +import SwiftUI + +public struct AttachmentView: View { + + @ObservedObject public var viewModel: ViewModel + + public init(viewModel: ViewModel) { + self.viewModel = viewModel + } + + public var body: some View { + Text("Hi") + } + +} + +extension AttachmentView { + public class ViewModel: ObservableObject { + + public init() { } + } +} diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/FamiliarFollowersDashboardView+Configuration.swift b/MastodonSDK/Sources/MastodonUI/View/Content/FamiliarFollowersDashboardView+Configuration.swift index 0b63f848e..d8fbbf6ca 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/FamiliarFollowersDashboardView+Configuration.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/FamiliarFollowersDashboardView+Configuration.swift @@ -7,6 +7,7 @@ import UIKit import MastodonSDK +import MastodonCore extension FamiliarFollowersDashboardView { public func configure(familiarFollowers: Mastodon.Entity.FamiliarFollowers?) { diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/MediaView+Configuration.swift b/MastodonSDK/Sources/MastodonUI/View/Content/MediaView+Configuration.swift index cfe9e73ce..76897a46f 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/MediaView+Configuration.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/MediaView+Configuration.swift @@ -11,6 +11,7 @@ import Combine import CoreData import Photos import AlamofireImage +import MastodonCore extension MediaView { public class Configuration: Hashable { diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/NotificationView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/NotificationView+ViewModel.swift index 0e8c394b7..974069801 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/NotificationView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/NotificationView+ViewModel.swift @@ -13,6 +13,7 @@ import MastodonSDK import MastodonAsset import MastodonLocalization import MastodonExtension +import MastodonCore import CoreData import CoreDataStack diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/PollOptionView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/PollOptionView+ViewModel.swift index 7a48ddc3a..b6ea11d49 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/PollOptionView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/PollOptionView+ViewModel.swift @@ -10,6 +10,7 @@ import Combine import CoreData import MetaTextKit import MastodonAsset +import MastodonCore extension PollOptionView { diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView+ViewModel.swift index 90fedf034..55d270f74 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/ProfileCardView+ViewModel.swift @@ -14,6 +14,7 @@ import CoreDataStack import MastodonLocalization import MastodonAsset import MastodonSDK +import MastodonCore extension ProfileCardView { public class ViewModel: ObservableObject { diff --git a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift index bd80afe86..648f256b6 100644 --- a/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift +++ b/MastodonSDK/Sources/MastodonUI/View/Content/StatusView+ViewModel.swift @@ -11,6 +11,7 @@ import Combine import CoreData import Meta import MastodonSDK +import MastodonCore import MastodonAsset import MastodonLocalization import MastodonExtension diff --git a/MastodonSDK/Tests/MastodonSDKTests/API/MastodonSDK+API+TimelineTests.swift b/MastodonSDK/Tests/MastodonSDKTests/API/MastodonSDK+API+TimelineTests.swift index 371b7b034..68e5bb669 100644 --- a/MastodonSDK/Tests/MastodonSDKTests/API/MastodonSDK+API+TimelineTests.swift +++ b/MastodonSDK/Tests/MastodonSDKTests/API/MastodonSDK+API+TimelineTests.swift @@ -20,20 +20,25 @@ extension MastodonSDKTests { let theExpectation = expectation(description: "Fetch Public Timeline") let query = Mastodon.API.Timeline.PublicTimelineQuery() - Mastodon.API.Timeline.public(session: session, domain: domain, query: query) - .receive(on: DispatchQueue.main) - .sink { completion in - switch completion { - case .failure(let error): - XCTFail(error.localizedDescription) - case .finished: - break - } - } receiveValue: { response in - XCTAssert(!response.value.isEmpty) - theExpectation.fulfill() + Mastodon.API.Timeline.public( + session: session, + domain: domain, + query: query, + authorization: nil + ) + .receive(on: DispatchQueue.main) + .sink { completion in + switch completion { + case .failure(let error): + XCTFail(error.localizedDescription) + case .finished: + break } - .store(in: &disposeBag) + } receiveValue: { response in + XCTAssert(!response.value.isEmpty) + theExpectation.fulfill() + } + .store(in: &disposeBag) wait(for: [theExpectation], timeout: 10.0) } diff --git a/NotificationService/NotificationService.swift b/NotificationService/NotificationService.swift index c3d02933b..d38884aff 100644 --- a/NotificationService/NotificationService.swift +++ b/NotificationService/NotificationService.swift @@ -9,7 +9,7 @@ import UserNotifications import CommonOSLog import CryptoKit import AlamofireImage -import AppShared +import MastodonCore class NotificationService: UNNotificationServiceExtension { diff --git a/Podfile b/Podfile index a64cd0e55..774148fa0 100644 --- a/Podfile +++ b/Podfile @@ -35,14 +35,6 @@ target 'AppShared' do use_frameworks! end -plugin 'cocoapods-keys', { - :project => "Mastodon", - :keys => [ - "notification_endpoint", - "notification_endpoint_debug" - ] -} - post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/Podfile.lock b/Podfile.lock index 629a48a87..453610694 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -2,7 +2,6 @@ PODS: - DateToolsSwift (5.0.0) - FLEX (4.4.1) - Kanna (5.2.7) - - Keys (1.0.1) - Sourcery (1.6.1): - Sourcery/CLI-Only (= 1.6.1) - Sourcery/CLI-Only (1.6.1) @@ -14,7 +13,6 @@ DEPENDENCIES: - DateToolsSwift (~> 5.0.0) - FLEX (~> 4.4.0) - Kanna (~> 5.2.2) - - Keys (from `Pods/CocoaPodsKeys`) - Sourcery (~> 1.6.1) - SwiftGen (~> 6.4.0) - "UITextField+Shake (~> 1.2)" @@ -30,20 +28,15 @@ SPEC REPOS: - "UITextField+Shake" - XLPagerTabStrip -EXTERNAL SOURCES: - Keys: - :path: Pods/CocoaPodsKeys - SPEC CHECKSUMS: DateToolsSwift: 4207ada6ad615d8dc076323d27037c94916dbfa6 FLEX: 7ca2c8cd3a435ff501ff6d2f2141e9bdc934eaab Kanna: 01cfbddc127f5ff0963692f285fcbc8a9d62d234 - Keys: a576f4c9c1c641ca913a959a9c62ed3f215a8de9 Sourcery: f3759f803bd0739f74fc92a4341eed0473ce61ac SwiftGen: 67860cc7c3cfc2ed25b9b74cfd55495fc89f9108 "UITextField+Shake": 298ac5a0f239d731bdab999b19b628c956ca0ac3 XLPagerTabStrip: 61c57fd61f611ee5f01ff1495ad6fbee8bf496c5 -PODFILE CHECKSUM: 1ac960a2c981ef98f7c24a3bba57bdabc1f66103 +PODFILE CHECKSUM: d95968ab70ea5121c21dfd801aa36b12bcd59c9d COCOAPODS: 1.11.3 diff --git a/ShareActionExtension/Scene/ShareViewController.swift b/ShareActionExtension/Scene/ShareViewController.swift index 542fce6d5..a142aa69b 100644 --- a/ShareActionExtension/Scene/ShareViewController.swift +++ b/ShareActionExtension/Scene/ShareViewController.swift @@ -12,6 +12,7 @@ import MastodonUI import SwiftUI import MastodonAsset import MastodonLocalization +import MastodonCore import MastodonUI class ShareViewController: UIViewController { diff --git a/ShareActionExtension/Scene/ShareViewModel.swift b/ShareActionExtension/Scene/ShareViewModel.swift index c56f8ecfd..63a7132f6 100644 --- a/ShareActionExtension/Scene/ShareViewModel.swift +++ b/ShareActionExtension/Scene/ShareViewModel.swift @@ -17,6 +17,7 @@ import UniformTypeIdentifiers import MastodonAsset import MastodonLocalization import MastodonUI +import MastodonCore final class ShareViewModel { @@ -29,6 +30,8 @@ final class ShareViewModel { // input private var coreDataStack: CoreDataStack? var managedObjectContext: NSManagedObjectContext? + var api: APIService? + var inputItems = CurrentValueSubject<[NSExtensionItem], Never>([]) let viewDidAppear = CurrentValueSubject(false) let traitCollectionDidChangePublisher = CurrentValueSubject(Void()) // use CurrentValueSubject to make initial event emit @@ -230,6 +233,9 @@ extension ShareViewModel { guard let self = self else { return } guard didFinishLoad else { return } guard let managedObjectContext = self.managedObjectContext else { return } + + + self.api = APIService(backgroundManagedObjectContext: _coreDataStack.newTaskContext()) self.logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): fetch authentication…") managedObjectContext.perform { @@ -289,13 +295,15 @@ extension ShareViewModel { self.composeViewModel.statusContent = content } + guard let api = self.api else { return } + if let movieProvider = _movieProvider { composeViewModel.setupAttachmentViewModels([ - StatusAttachmentViewModel(itemProvider: movieProvider) + StatusAttachmentViewModel(api: api, itemProvider: movieProvider) ]) } else if !imageProviders.isEmpty { let viewModels = imageProviders.map { provider in - StatusAttachmentViewModel(itemProvider: provider) + StatusAttachmentViewModel(api: api, itemProvider: provider) } composeViewModel.setupAttachmentViewModels(viewModels) } @@ -328,7 +336,9 @@ extension ShareViewModel { extension ShareViewModel { func publish() -> AnyPublisher, Error> { - guard let authentication = composeViewModel.authentication else { + guard let authentication = composeViewModel.authentication, + let api = self.api + else { return Fail(error: APIService.APIError.implicit(.authenticationMissing)).eraseToAnyPublisher() } let authenticationBox = MastodonAuthenticationBox( @@ -364,7 +374,7 @@ extension ShareViewModel { description: description, focus: nil ) - let subscription = APIService.shared.updateMedia( + let subscription = api.updateMedia( domain: domain, attachmentID: attachmentID, query: query, @@ -390,7 +400,7 @@ extension ShareViewModel { spoilerText: spoilerText, visibility: visibility ) - return try await APIService.shared.publishStatus( + return try await api.publishStatus( domain: domain, idempotencyKey: nil, // FIXME: query: query, diff --git a/ShareActionExtension/Scene/View/ComposeToolbarView.swift b/ShareActionExtension/Scene/View/ComposeToolbarView.swift index a903d3ebd..557706fd8 100644 --- a/ShareActionExtension/Scene/View/ComposeToolbarView.swift +++ b/ShareActionExtension/Scene/View/ComposeToolbarView.swift @@ -12,6 +12,7 @@ import MastodonSDK import MastodonUI import MastodonAsset import MastodonLocalization +import MastodonCore import MastodonUI protocol ComposeToolbarViewDelegate: AnyObject { diff --git a/ShareActionExtension/Scene/View/StatusAttachmentViewModel+UploadState.swift b/ShareActionExtension/Scene/View/StatusAttachmentViewModel+UploadState.swift index ce0544aa1..56942cde0 100644 --- a/ShareActionExtension/Scene/View/StatusAttachmentViewModel+UploadState.swift +++ b/ShareActionExtension/Scene/View/StatusAttachmentViewModel+UploadState.swift @@ -10,6 +10,7 @@ import Foundation import Combine import GameplayKit import MastodonSDK +import MastodonCore extension StatusAttachmentViewModel { class UploadState: GKState { @@ -75,7 +76,7 @@ extension StatusAttachmentViewModel.UploadState { ) // and needs clone the `query` if needs retry - APIService.shared.uploadMedia( + viewModel.api.uploadMedia( domain: mastodonAuthenticationBox.domain, query: query, mastodonAuthenticationBox: mastodonAuthenticationBox, diff --git a/ShareActionExtension/Scene/View/StatusAttachmentViewModel.swift b/ShareActionExtension/Scene/View/StatusAttachmentViewModel.swift index 37d4f82e8..19251d0be 100644 --- a/ShareActionExtension/Scene/View/StatusAttachmentViewModel.swift +++ b/ShareActionExtension/Scene/View/StatusAttachmentViewModel.swift @@ -17,6 +17,7 @@ import GameplayKit import MobileCoreServices import UniformTypeIdentifiers import MastodonAsset +import MastodonCore import MastodonLocalization protocol StatusAttachmentViewModelDelegate: AnyObject { @@ -40,6 +41,7 @@ final class StatusAttachmentViewModel: ObservableObject, Identifiable { let itemProvider: NSItemProvider // input + let api: APIService let file = CurrentValueSubject(nil) let authentication = CurrentValueSubject(nil) @Published var descriptionContent = "" @@ -67,7 +69,11 @@ final class StatusAttachmentViewModel: ObservableObject, Identifiable { }() lazy var uploadStateMachineSubject = CurrentValueSubject(nil) - init(itemProvider: NSItemProvider) { + init( + api: APIService, + itemProvider: NSItemProvider + ) { + self.api = api self.itemProvider = itemProvider // bind attachment from item provider diff --git a/ShareActionExtension/Scene/View/StatusAuthorView.swift b/ShareActionExtension/Scene/View/StatusAuthorView.swift index 189a7adc5..24453abe2 100644 --- a/ShareActionExtension/Scene/View/StatusAuthorView.swift +++ b/ShareActionExtension/Scene/View/StatusAuthorView.swift @@ -8,7 +8,6 @@ import SwiftUI import MastodonUI import Nuke -import NukeFLAnimatedImagePlugin import FLAnimatedImage struct StatusAuthorView: View { diff --git a/ShareActionExtension/Service/APIService.swift b/ShareActionExtension/Service/APIService.swift deleted file mode 100644 index a8112167f..000000000 --- a/ShareActionExtension/Service/APIService.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// APIService.swift -// ShareActionExtension -// -// Created by MainasuK Cirno on 2021-7-20. -// - -import os.log -import Foundation -import Combine -import CoreData -import CoreDataStack -import MastodonSDK - -// Replica APIService for share extension -final class APIService { - - var disposeBag = Set() - - static let shared = APIService() - - // internal - let session: URLSession - - // output - let error = PassthroughSubject() - - private init() { - self.session = URLSession(configuration: .default) - } - -}