From e506ba152f73cb0e75ef985d6d23b7ae9615fa63 Mon Sep 17 00:00:00 2001 From: Eric Andrews Date: Sun, 5 May 2024 15:11:33 -0400 Subject: [PATCH] 1.3 (#1053) Co-authored-by: Bosco Ho Co-authored-by: Sjmarf <78750526+Sjmarf@users.noreply.github.com> Co-authored-by: Sumeet Co-authored-by: Zach McGaughey <1799888+made2k@users.noreply.github.com> --- Mlem.xcodeproj/project.pbxproj | 1017 +++++++++++++++-- .../xcshareddata/swiftpm/Package.resolved | 9 + Mlem/API/APIClient/APIClient+Comment.swift | 24 + Mlem/API/APIClient/APIClient+Community.swift | 70 ++ Mlem/API/APIClient/APIClient+Instance.swift | 93 ++ Mlem/API/APIClient/APIClient+Moderation.swift | 268 +++++ Mlem/API/APIClient/APIClient+Post.swift | 47 + Mlem/API/APIClient/APIClient.swift | 25 + Mlem/API/APIRequest.swift | 2 + Mlem/API/Internal/HierarchicalComment.swift | 52 +- Mlem/API/Models/Comments/APIComment.swift | 2 +- Mlem/API/Models/Comments/APICommentView.swift | 6 +- Mlem/API/Models/Common/SuccessResponse.swift | 4 +- Mlem/API/Models/Person/APIPerson.swift | 2 +- Mlem/API/Models/Posts/APIPost.swift | 6 +- Mlem/API/Models/Posts/APIPostResponse.swift | 13 + .../APICommentReport.swift | 4 +- .../APICommentReportView.swift | 2 +- .../{Posts => Reports}/APIPostReport.swift | 4 +- .../APIPostReportView.swift | 2 +- .../APIPrivateMessageReport.swift | 2 +- .../APIPrivateMessageReportView.swift | 0 Mlem/API/Models/Site/APIMyUserInfo.swift | 25 + .../Site/APIRegistrationApplication.swift | 18 + .../Site/APIRegistrationApplicationView.swift | 16 + .../Site/Modlog/APIAdminPurgeComment.swift | 17 + .../Modlog/APIAdminPurgeCommentView.swift | 15 + .../Site/Modlog/APIAdminPurgeCommunity.swift | 16 + .../Modlog/APIAdminPurgeCommunityView.swift | 14 + .../Site/Modlog/APIAdminPurgePerson.swift | 16 + .../Site/Modlog/APIAdminPurgePersonView.swift | 14 + .../Site/Modlog/APIAdminPurgePost.swift | 17 + .../Site/Modlog/APIAdminPurgePostView.swift | 15 + Mlem/API/Models/Site/Modlog/APIModAdd.swift | 17 + .../Site/Modlog/APIModAddCommunity.swift | 18 + .../Site/Modlog/APIModAddCommunityView.swift | 16 + .../Models/Site/Modlog/APIModAddView.swift | 15 + Mlem/API/Models/Site/Modlog/APIModBan.swift | 19 + .../Site/Modlog/APIModBanFromCommunity.swift | 20 + .../Modlog/APIModBanFromCommunityView.swift | 16 + .../Models/Site/Modlog/APIModBanView.swift | 15 + .../Site/Modlog/APIModFeaturePost.swift | 18 + .../Site/Modlog/APIModFeaturePostView.swift | 16 + .../Site/Modlog/APIModHideCommunityView.swift | 15 + .../Models/Site/Modlog/APIModLockPost.swift | 17 + .../Site/Modlog/APIModLockPostView.swift | 16 + .../Site/Modlog/APIModRemoveComment.swift | 18 + .../Site/Modlog/APIModRemoveCommentView.swift | 18 + .../Site/Modlog/APIModRemoveCommunity.swift | 19 + .../Modlog/APIModRemoveCommunityView.swift | 15 + .../Models/Site/Modlog/APIModRemovePost.swift | 18 + .../Site/Modlog/APIModRemovePostView.swift | 16 + .../Site/Modlog/APIModTransferCommunity.swift | 17 + .../Modlog/APIModTransferCommunityView.swift | 16 + .../Site/Modlog/APIModlogActionType.swift | 28 + .../Site/Modlog/ApiModHideCommunity.swift | 18 + .../Comment/ListCommentLikesRequest.swift | 35 + .../Comment/PurgeCommentRequest.swift | 35 + .../Comment/RemoveCommentRequest.swift | 38 + .../Community/AddModToCommunity.swift | 42 + .../Requests/Community/BanFromCommunity.swift | 52 + .../Requests/Community/ListCommunities.swift | 2 +- .../Community/PurgeCommunityRequest.swift | 35 + .../Community/RemoveCommunityRequest.swift | 38 + ...pproveRegistrationApplicationRequest.swift | 42 + .../Moderation/GetReportCountRequest.swift | 35 + ...dRegistrationApplicationCountRequest.swift | 30 + .../ListCommentReportsRequest.swift | 37 + .../Moderation/ListPostReportsRequest.swift | 37 + .../ListPrivateMessageReportsRequest.swift | 35 + .../ListRegistrationApplicationsRequest.swift | 35 + .../ResolveCommentReportRequest.swift | 39 + .../Moderation/ResolvePostReportRequest.swift | 39 + .../ResolvePrivateMessageReportRequest.swift | 39 + Mlem/API/Requests/Person/BanPerson.swift | 50 + .../Requests/Person/PurgePersonRequest.swift | 33 + Mlem/API/Requests/Post/DeletePictrsFile.swift | 4 +- .../Requests/Post/FeaturePostRequest.swift | 39 + .../Requests/Post/ListPostLikesRequest.swift | 44 + Mlem/API/Requests/Post/LockPostRequest.swift | 35 + Mlem/API/Requests/Post/MarkPostRead.swift | 22 +- Mlem/API/Requests/Post/PurgePostRequest.swift | 35 + .../API/Requests/Post/RemovePostRequest.swift | 38 + Mlem/API/Requests/Site/BlockInstance.swift | 41 + Mlem/API/Requests/Site/GetModlogRequest.swift | 61 + .../{Comments.swift => Animations.swift} | 8 +- Mlem/App Constants.swift | 12 +- .../Contents.json | 14 + .../icon.sjmarf.ocean.appiconset/logo.png | Bin 0 -> 880335 bytes Mlem/ContentView.swift | 84 +- .../MarkReadBatcher+Dependency.swift | 20 + Mlem/Enums/APIPostFeatureType.swift | 14 + Mlem/Enums/Content Type.swift | 3 +- .../{FeedType.swift => PostFeedType.swift} | 74 +- Mlem/Enums/Settings/CommentSortType.swift | 7 +- Mlem/Enums/Settings/DefaultFeedType.swift | 2 +- Mlem/Enums/Settings/InternetSpeed.swift | 3 +- Mlem/Enums/Settings/PostSize.swift | 8 + Mlem/Extensions/Array/Array+IsNotEmpty.swift | 14 + Mlem/Extensions/Color/Color+Colors.swift | 2 + Mlem/Extensions/Date/Date+DaysFromNow.swift | 15 + .../EnvironmentValues+FeedType.swift | 4 +- Mlem/Extensions/Int/Int+Abbreviated.swift | 26 + Mlem/Extensions/Mocks/APILocalSite+Mock.swift | 48 + .../Mocks/APILocalSiteRateLimit+Mock.swift | 47 + .../Mocks/APIPersonAggregates+Mock.swift | 25 + .../Extensions/Mocks/APIPersonView+Mock.swift | 22 + Mlem/Extensions/Mocks/APIPost+Mock.swift | 2 +- Mlem/Extensions/Mocks/APISite+Mock.swift | 4 +- .../Mocks/APISiteAggregates+Mock.swift | 35 + Mlem/Extensions/Mocks/APISiteView+Mock.swift | 24 + Mlem/Extensions/Mocks/SiteResponse+Mock.swift | 32 + Mlem/Extensions/String/String+Alphabet.swift | 5 + .../String/String+StrippingDiacritics.swift | 14 + .../CommentReportModel+TrackerItem.swift | 17 + .../HierarchicalComment+TrackerItem.swift | 5 +- .../CommentReportModel+InboxItem.swift | 38 + .../Inbox Items/MentionModel+InboxItem.swift | 18 +- .../Inbox Items/MessageModel+InboxItem.swift | 20 +- .../MessageReportModel+InboxItem.swift | 38 + .../PostReportModel+InboxItem.swift | 37 + .../RegistrationApplication+InboxItem.swift | 34 + .../Inbox Items/ReplyModel+InboxItem.swift | 18 +- .../MentionModel+TrackerItem.swift | 6 +- .../MessageModel+TrackerItem.swift | 6 +- .../MessageReportModel+TrackerItem.swift | 17 + .../ModlogEntry+TrackerItem.swift | 19 + .../Tracker Items/PostModel+TrackerItem.swift | 6 +- .../PostReportModel+TrackerItem.swift | 17 + .../RegistrationApplication+TrackerItem.swift | 19 + .../ReplyModel+TrackerItem.swift | 6 +- .../UserContentModel+TrackerItem.swift | 2 +- .../View Modifiers/View+CustomBadge.swift | 2 +- .../View+DestructiveConfirmation.swift | 30 +- .../View+HandleLemmyLinks.swift | 43 +- .../View Modifiers/View+SwipeyActions.swift | 44 +- ...ew+PresentationBackgroundInteraction.swift | 8 + Mlem/Haptics/Haptic Manager.swift | 2 +- Mlem/Icons.swift | 90 +- Mlem/Info.plist | 4 - Mlem/Logic/Abbreviate Numbers.swift | 24 - Mlem/Logic/BiometricUnlock.swift | 8 +- Mlem/Logic/URLHandler.swift | 5 +- Mlem/MlemApp.swift | 2 +- Mlem/Models/Batchers/MarkReadBatcher.swift | 100 ++ .../Administration/BanUserEditorModel.swift | 18 + .../Replies/ReplyToComment.swift | 6 +- .../Replies/ReplyToCommentReply.swift | 3 +- .../Replies/ReplyToMention.swift | 1 - .../Replies/ReplyToMessage.swift | 2 +- .../Replies/ReplyToPost.swift | 2 +- .../Reports/ReportComment.swift | 6 +- .../Reports/ReportCommentReply.swift | 3 +- .../Reports/ReportMention.swift | 1 - .../Reports/ReportMessage.swift | 2 +- .../Reports/ReportPost.swift | 6 +- .../Community List/CommunityListModel.swift | 252 ++-- .../Community List/CommunityListSection.swift | 3 +- .../CommunityModel+MenuFunctions.swift | 154 ++- .../CommunityModel+SwipeActions.swift | 62 +- .../Content/Community/CommunityModel.swift | 127 +- .../Content/Inbox/CommentReportModel.swift | 282 +++++ Mlem/Models/Content/Inbox/MentionModel.swift | 102 +- Mlem/Models/Content/Inbox/MessageModel.swift | 21 +- .../Content/Inbox/MessageReportModel.swift | 156 +++ .../Content/Inbox/PostReportModel.swift | 276 +++++ .../Inbox/RegistrationApplicationModel.swift | 142 +++ Mlem/Models/Content/Inbox/ReplyModel.swift | 91 +- .../InstanceModel+MenuFunctions.swift | 30 +- .../Instance/InstanceModel+Uptime.swift | 60 + .../Content/Instance/InstanceModel.swift | 107 +- Mlem/Models/Content/Modlog/ModlogEntry.swift | 495 ++++++++ .../Post/PostModel+MenuFunctions.swift | 504 ++++++-- Mlem/Models/Content/Post/PostModel.swift | 100 +- .../User/UserModel+MenuFunctions.swift | 110 +- Mlem/Models/Content/User/UserModel.swift | 75 +- Mlem/Models/Menu Function.swift | 163 ++- .../Lazy Load Post Link.swift | 4 +- .../Navigation Contexts/ModlogLink.swift | 27 + Mlem/Models/PictrsImageModel.swift | 4 +- .../Settings/LayoutWidgets/LayoutWidget.swift | 83 +- Mlem/Models/Trackers/Editor Tracker.swift | 10 + .../Trackers/Feeds/Modlog/ModlogAction.swift | 107 ++ .../Feeds/Modlog/ModlogChildTracker.swift | 87 ++ .../Trackers/Feeds/Modlog/ModlogTracker.swift | 42 + .../Trackers/Feeds/StandardPostTracker.swift | 9 +- .../Trackers/Generics/ChildTracker.swift | 100 +- .../Generics/ChildTrackerProtocol.swift | 14 +- .../Trackers/Generics/CoreTracker.swift | 2 +- .../Trackers/Generics/ParentTracker.swift | 54 +- .../Generics/ParentTrackerProtocol.swift | 6 +- .../Generics/README - Generic Trackers.md | 2 +- .../Trackers/Generics/TrackerItem.swift | 2 +- .../Trackers/Generics/TrackerProtocol.swift | 18 + .../Trackers/Generics/TrackerSort.swift | 42 +- .../ChildTrackers/CommentReportTracker.swift | 34 + .../{ => ChildTrackers}/MentionTracker.swift | 2 +- .../ChildTrackers/MessageReportTracker.swift | 29 + .../{ => ChildTrackers}/MessageTracker.swift | 2 +- .../ChildTrackers/PostReportTracker.swift | 34 + .../RegistrationApplicationTracker.swift | 33 + .../{ => ChildTrackers}/ReplyTracker.swift | 3 +- Mlem/Models/Trackers/Inbox/InboxItem.swift | 38 +- .../Models/Trackers/Inbox/UnreadTracker.swift | 183 +-- .../Models/Trackers/LayoutWidgetTracker.swift | 17 +- Mlem/Models/Trackers/ModToolTracker.swift | 116 ++ .../Trackers/SiteInformationTracker.swift | 52 + Mlem/Models/Trackers/UserRemovalWalker.swift | 58 + Mlem/Models/UserFlair.swift | 19 +- .../Destination Values/SettingsValues.swift | 7 + Mlem/Navigation/DismissAction.swift | 32 +- Mlem/Navigation/Routes/AppRoutes.swift | 14 +- Mlem/Protocols/Removable.swift | 12 + Mlem/Repositories/InboxRepository.swift | 112 +- Mlem/Repositories/PersonRepository.swift | 6 +- Mlem/Repositories/PostRepository.swift | 15 + Mlem/Temp Image Viewer/ImageDetailView.swift | 10 +- Mlem/Temp Image Viewer/ImageSaver.swift | 12 +- .../Temp Image Viewer/ZoomableImageView.swift | 19 +- .../Shared/Accounts/DeleteAccountView.swift | 12 +- Mlem/Views/Shared/Cached Image.swift | 146 ++- Mlem/Views/Shared/CloseButtonView.swift | 28 + .../Shared/Comments/Comment Item Logic.swift | 161 +-- Mlem/Views/Shared/Comments/Comment Item.swift | 48 +- .../Comments/CommentItem+MenuFunctions.swift | 255 +++++ .../Comments/Components/CommentBodyView.swift | 73 +- .../Comments/Components/Embedded Post.swift | 8 +- .../CommunityList/CommunityListRow.swift | 109 ++ .../CommunityList/CommunityListRowBody.swift | 99 ++ .../Components/Components/BanButtonView.swift | 48 + .../Components/Components/Ellipsis Menu.swift | 26 +- .../Components/Components/Menu Button.swift | 42 +- .../Components/PurgeButtonView.swift | 37 + .../Components/RemoveButtonView.swift | 35 + .../Components/ResolveButtonView.swift | 37 + .../Components/SaveButtonView.swift | 12 +- ... View.swift => WebsiteIndicatorView.swift} | 2 +- .../Shared/Components/EasyTapLinkView.swift | 22 +- .../Components/EmbeddedCommentView.swift | 49 + .../Shared/Components/End Of Feed View.swift | 7 +- .../Image Upload/LinkAttatchmentView.swift | 26 +- .../Image Upload/LinkUploadOptionsView.swift | 6 +- .../Components/InteractionBarView.swift | 244 ++-- Mlem/Views/Shared/Components/Line.swift | 19 + .../Components/Modlog/ModlogEntryView.swift | 86 ++ .../Shared/Components/Modlog/ModlogView.swift | 443 +++++++ .../Components/Thumbnail Image View.swift | 66 +- .../Shared/Composer/BodyEditorView.swift | 85 ++ .../Shared/Composer/PostComposerView.swift | 246 ++-- .../Shared/Composer/ProgressOverlayView.swift | 32 + .../Shared/Composer/ResponseEditorView.swift | 173 +-- Mlem/Views/Shared/Instance/Fediseer.swift | 151 +++ .../Shared/Instance/FediseerInfoView.swift | 75 ++ .../Instance/FediseerOpinionListView.swift | 60 + .../Shared/Instance/FediseerOpinionView.swift | 63 + .../Shared/Instance/InstanceDetailsView.swift | 10 +- .../Shared/Instance/InstanceSafetyView.swift | 153 +++ .../Shared/Instance/InstanceUptimeView.swift | 263 +++++ .../Shared/Instance/InstanceView+Logic.swift | 137 +++ Mlem/Views/Shared/Instance/InstanceView.swift | 232 ++-- Mlem/Views/Shared/Instance/UptimeData.swift | 115 ++ .../Links/Community/CommunityLinkView.swift | 1 - .../Shared/Links/InstanceLabelView.swift | 27 + .../Shared/Links/User/UserLabelView.swift | 57 +- .../Shared/Links/User/UserLinkView.swift | 6 + Mlem/Views/Shared/Loading View.swift | 8 +- Mlem/Views/Shared/Markdown View.swift | 9 +- .../Components/BanFormButtonStyle.swift | 25 + .../Components/ModlogNavigationLinkView.swift | 42 + .../Moderation/Components/ReasonView.swift | 68 ++ .../Shared/Moderation/ModToolSheet.swift | 41 + .../Shared/Moderation/Tools/AddModView.swift | 183 +++ .../Moderation/Tools/BanUserView+Logic.swift | 106 ++ .../Shared/Moderation/Tools/BanUserView.swift | 259 +++++ .../Tools/DenyApplicationView.swift | 80 ++ .../Moderation/Tools/PurgeContentView.swift | 129 +++ .../Moderation/Tools/RemoveCommentView.swift | 80 ++ .../Tools/RemoveCommunityView.swift | 89 ++ .../Moderation/Tools/RemovePostView.swift | 85 ++ .../Tools/SimpleCommunitySearchView.swift | 91 ++ .../Tools/SimpleUserSearchView.swift | 82 ++ .../Moderation/Tools/VotesListView.swift | 145 +++ .../Moderation/Tools/VotesTracker.swift | 98 ++ .../Shared/Posts/Components/LockedTag.swift | 19 + .../Posts/Components/PostEllipsisMenus.swift | 73 ++ .../Shared/Posts/Components/RemovedTag.swift | 19 + .../Posts/Components/Stickied Tag.swift | 2 +- Mlem/Views/Shared/Posts/Expanded Post.swift | 68 +- .../Shared/Posts/ExpandedPostLogic.swift | 37 + Mlem/Views/Shared/Posts/Feed Post.swift | 135 ++- .../Posts/Lazy Load Expanded Post.swift | 8 +- .../Posts/Post Sizes/Compact Post.swift | 56 +- .../Posts/Post Sizes/Headline Post.swift | 30 +- .../Shared/Posts/Post Sizes/Large Post.swift | 9 +- Mlem/Views/Shared/SelectTextView.swift | 47 + Mlem/Views/Shared/ToolbarEllipsisMenu.swift | 26 + .../Shared/UserList/ModeratorListView.swift | 108 ++ Mlem/Views/Shared/UserList/UserListRow.swift | 106 ++ .../Shared/UserList/UserListRowBody.swift | 128 +++ Mlem/Views/Shared/WarningView.swift | 52 + Mlem/Views/Shared/WebView.swift | 23 + Mlem/Views/Shared/Website Icon Complex.swift | 27 +- .../CommunityListSidebarEntry.swift | 46 +- .../Components/CommunityDetailsView.swift | 6 +- .../Feeds/Components/FeedHeaderView.swift | 62 +- .../Tabs/Feeds/Components/FeedRowView.swift | 25 +- .../PostFeedView+MenuFunctions.swift | 44 - .../Tabs/Feeds/Components/PostFeedView.swift | 60 +- .../UserContentFeedView+Logic.swift | 42 - .../Components/UserContentFeedView.swift | 41 +- .../Feed Types/AggregateFeedView+Logic.swift | 2 - .../Feeds/Feed Types/AggregateFeedView.swift | 56 +- .../Feeds/Feed Types/CommunityFeedView.swift | 156 +-- .../Feeds/Feed Types/FeedToolbarContent.swift | 85 ++ Mlem/Views/Tabs/Feeds/FeedsView.swift | 58 +- .../Tabs/Inbox/Feed/AllItemsFeedView.swift | 71 -- .../Feed/Item Types/Inbox ReplyBodyView.swift | 83 -- .../Item Types/InboxMentionBodyView.swift | 87 -- .../Feed/Item Types/InboxMentionView.swift | 24 - .../Item Types/InboxMessageBodyView.swift | 74 -- .../Feed/Item Types/InboxReplyView.swift | 24 - .../Tabs/Inbox/Feed/Mentions Feed View.swift | 51 - .../Tabs/Inbox/Feed/Messages Feed View.swift | 51 - .../Tabs/Inbox/Feed/Replies Feed View.swift | 51 - Mlem/Views/Tabs/Inbox/Inbox View.swift | 212 ---- Mlem/Views/Tabs/Inbox/InboxFeedView.swift | 70 ++ Mlem/Views/Tabs/Inbox/InboxRoot.swift | 29 + Mlem/Views/Tabs/Inbox/InboxView+Feeds.swift | 75 ++ Mlem/Views/Tabs/Inbox/InboxView+Logic.swift | 80 +- Mlem/Views/Tabs/Inbox/InboxView.swift | 368 ++++++ .../InboxCommentReportBodyView.swift | 64 ++ .../Item Types/InboxCommentReportView.swift | 82 ++ .../Item Types/InboxMentionBodyView.swift | 59 + .../Inbox/Item Types/InboxMentionView.swift | 94 ++ .../Item Types/InboxMessageBodyView.swift | 73 ++ .../InboxMessageReportBodyView.swift | 73 ++ .../Item Types/InboxMessageReportView.swift | 70 ++ .../Item Types/InboxMessageView.swift | 11 + .../Item Types/InboxPostReportBodyView.swift | 61 + .../Item Types/InboxPostReportView.swift | 85 ++ ...InboxRegistrationApplicationBodyView.swift | 72 ++ .../InboxRegistrationApplicationView.swift | 73 ++ .../Inbox/Item Types/InboxReplyBodyView.swift | 58 + .../Inbox/Item Types/InboxReplyView.swift | 94 ++ Mlem/Views/Tabs/Profile/Profile View.swift | 10 +- Mlem/Views/Tabs/Profile/UserFeedView.swift | 2 +- Mlem/Views/Tabs/Profile/UserView+Logic.swift | 29 +- Mlem/Views/Tabs/Profile/UserView.swift | 296 ++--- Mlem/Views/Tabs/Search/BubblePicker.swift | 78 -- .../Search/BubblePicker/BubblePicker.swift | 220 ++++ .../Search/BubblePicker/ChildSizeReader.swift | 43 + .../Tabs/Search/RecentSearchesView.swift | 4 +- .../Search/Results/CommunityResultView.swift | 167 --- .../Search/Results/InstanceResultView.swift | 6 +- .../Tabs/Search/Results/UserResultView.swift | 186 --- Mlem/Views/Tabs/Search/SearchHomeView.swift | 15 +- .../Tabs/Search/SearchResultListView.swift | 4 +- .../Views/Tabs/Search/SearchResultsView.swift | 18 +- .../Settings/Components/AccountListView.swift | 2 +- .../Settings/Components/Settings Item.swift | 2 +- .../Settings/Components/SettingsView.swift | 11 +- .../AccessibilitySettingsView.swift | 7 + .../Views/Account/AccountSettingsView.swift | 17 +- .../Views/Account/BlockListView+Logic.swift | 61 + .../Views/Account/BlockListView.swift | 177 +++ .../Views/Account/ProfileSettingsView.swift | 106 +- .../Comment/CommentSettingsView.swift | 2 +- .../Appearance/Icons/IconSettingsView.swift | 3 +- .../Appearance/Post/PostSettingsView.swift | 4 +- .../Shared/LayoutWidgetEditView.swift | 68 +- .../Appearance/Shared/LayoutWidgetView.swift | 12 +- .../TabBar/TabBarSettingsView.swift | 33 +- .../Views/Filters/FiltersSettingsView.swift | 2 +- .../Views/General/GeneralSettingsView.swift | 23 +- .../Views/Links/LinksSettingsView.swift | 57 + .../Moderation/ModerationSettingsView.swift | 70 ++ Mlem/Window.swift | 7 + .../CommunityListModelTests.swift | 95 +- .../PersistenceRepositoryTests.swift | 3 +- PrivacyInfo.xcprivacy | 17 + 380 files changed, 17235 insertions(+), 3621 deletions(-) create mode 100644 Mlem/API/APIClient/APIClient+Instance.swift create mode 100644 Mlem/API/APIClient/APIClient+Moderation.swift create mode 100644 Mlem/API/Models/Posts/APIPostResponse.swift rename Mlem/API/Models/{Comments => Reports}/APICommentReport.swift (83%) rename Mlem/API/Models/{Comments => Reports}/APICommentReportView.swift (93%) rename Mlem/API/Models/{Posts => Reports}/APIPostReport.swift (88%) rename Mlem/API/Models/{Posts => Reports}/APIPostReportView.swift (92%) rename Mlem/API/Models/{Messages => Reports}/APIPrivateMessageReport.swift (88%) rename Mlem/API/Models/{Messages => Reports}/APIPrivateMessageReportView.swift (100%) create mode 100644 Mlem/API/Models/Site/APIRegistrationApplication.swift create mode 100644 Mlem/API/Models/Site/APIRegistrationApplicationView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgeComment.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgeCommentView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunity.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgePerson.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgePersonView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgePost.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIAdminPurgePostView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModAdd.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModAddCommunity.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModAddCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModAddView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModBan.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModBanFromCommunity.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModBanFromCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModBanView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModFeaturePost.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModFeaturePostView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModHideCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModLockPost.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModLockPostView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemoveComment.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemoveCommentView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemoveCommunity.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemoveCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemovePost.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModRemovePostView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModTransferCommunity.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModTransferCommunityView.swift create mode 100644 Mlem/API/Models/Site/Modlog/APIModlogActionType.swift create mode 100644 Mlem/API/Models/Site/Modlog/ApiModHideCommunity.swift create mode 100644 Mlem/API/Requests/Comment/ListCommentLikesRequest.swift create mode 100644 Mlem/API/Requests/Comment/PurgeCommentRequest.swift create mode 100644 Mlem/API/Requests/Comment/RemoveCommentRequest.swift create mode 100644 Mlem/API/Requests/Community/AddModToCommunity.swift create mode 100644 Mlem/API/Requests/Community/BanFromCommunity.swift create mode 100644 Mlem/API/Requests/Community/PurgeCommunityRequest.swift create mode 100644 Mlem/API/Requests/Community/RemoveCommunityRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ApproveRegistrationApplicationRequest.swift create mode 100644 Mlem/API/Requests/Moderation/GetReportCountRequest.swift create mode 100644 Mlem/API/Requests/Moderation/GetUnreadRegistrationApplicationCountRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ListCommentReportsRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ListPostReportsRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ListPrivateMessageReportsRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ListRegistrationApplicationsRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ResolveCommentReportRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ResolvePostReportRequest.swift create mode 100644 Mlem/API/Requests/Moderation/ResolvePrivateMessageReportRequest.swift create mode 100644 Mlem/API/Requests/Person/BanPerson.swift create mode 100644 Mlem/API/Requests/Person/PurgePersonRequest.swift create mode 100644 Mlem/API/Requests/Post/FeaturePostRequest.swift create mode 100644 Mlem/API/Requests/Post/ListPostLikesRequest.swift create mode 100644 Mlem/API/Requests/Post/LockPostRequest.swift create mode 100644 Mlem/API/Requests/Post/PurgePostRequest.swift create mode 100644 Mlem/API/Requests/Post/RemovePostRequest.swift create mode 100644 Mlem/API/Requests/Site/BlockInstance.swift create mode 100644 Mlem/API/Requests/Site/GetModlogRequest.swift rename Mlem/Animations/{Comments.swift => Animations.swift} (67%) create mode 100644 Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/Contents.json create mode 100644 Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/logo.png create mode 100644 Mlem/Dependency/MarkReadBatcher+Dependency.swift create mode 100644 Mlem/Enums/APIPostFeatureType.swift rename Mlem/Enums/{FeedType.swift => PostFeedType.swift} (62%) create mode 100644 Mlem/Extensions/Array/Array+IsNotEmpty.swift create mode 100644 Mlem/Extensions/Date/Date+DaysFromNow.swift create mode 100644 Mlem/Extensions/Int/Int+Abbreviated.swift create mode 100644 Mlem/Extensions/Mocks/APILocalSite+Mock.swift create mode 100644 Mlem/Extensions/Mocks/APILocalSiteRateLimit+Mock.swift create mode 100644 Mlem/Extensions/Mocks/APIPersonAggregates+Mock.swift create mode 100644 Mlem/Extensions/Mocks/APIPersonView+Mock.swift create mode 100644 Mlem/Extensions/Mocks/APISiteAggregates+Mock.swift create mode 100644 Mlem/Extensions/Mocks/APISiteView+Mock.swift create mode 100644 Mlem/Extensions/Mocks/SiteResponse+Mock.swift create mode 100644 Mlem/Extensions/String/String+StrippingDiacritics.swift create mode 100644 Mlem/Extensions/Tracker Items/CommentReportModel+TrackerItem.swift create mode 100644 Mlem/Extensions/Tracker Items/Inbox Items/CommentReportModel+InboxItem.swift create mode 100644 Mlem/Extensions/Tracker Items/Inbox Items/MessageReportModel+InboxItem.swift create mode 100644 Mlem/Extensions/Tracker Items/Inbox Items/PostReportModel+InboxItem.swift create mode 100644 Mlem/Extensions/Tracker Items/Inbox Items/RegistrationApplication+InboxItem.swift create mode 100644 Mlem/Extensions/Tracker Items/MessageReportModel+TrackerItem.swift create mode 100644 Mlem/Extensions/Tracker Items/ModlogEntry+TrackerItem.swift create mode 100644 Mlem/Extensions/Tracker Items/PostReportModel+TrackerItem.swift create mode 100644 Mlem/Extensions/Tracker Items/RegistrationApplication+TrackerItem.swift delete mode 100644 Mlem/Logic/Abbreviate Numbers.swift create mode 100644 Mlem/Models/Batchers/MarkReadBatcher.swift create mode 100644 Mlem/Models/Composers/Administration/BanUserEditorModel.swift create mode 100644 Mlem/Models/Content/Inbox/CommentReportModel.swift create mode 100644 Mlem/Models/Content/Inbox/MessageReportModel.swift create mode 100644 Mlem/Models/Content/Inbox/PostReportModel.swift create mode 100644 Mlem/Models/Content/Inbox/RegistrationApplicationModel.swift create mode 100644 Mlem/Models/Content/Instance/InstanceModel+Uptime.swift create mode 100644 Mlem/Models/Content/Modlog/ModlogEntry.swift create mode 100644 Mlem/Models/Navigation Contexts/ModlogLink.swift create mode 100644 Mlem/Models/Trackers/Feeds/Modlog/ModlogAction.swift create mode 100644 Mlem/Models/Trackers/Feeds/Modlog/ModlogChildTracker.swift create mode 100644 Mlem/Models/Trackers/Feeds/Modlog/ModlogTracker.swift create mode 100644 Mlem/Models/Trackers/Generics/TrackerProtocol.swift create mode 100644 Mlem/Models/Trackers/Inbox/ChildTrackers/CommentReportTracker.swift rename Mlem/Models/Trackers/Inbox/{ => ChildTrackers}/MentionTracker.swift (90%) create mode 100644 Mlem/Models/Trackers/Inbox/ChildTrackers/MessageReportTracker.swift rename Mlem/Models/Trackers/Inbox/{ => ChildTrackers}/MessageTracker.swift (90%) create mode 100644 Mlem/Models/Trackers/Inbox/ChildTrackers/PostReportTracker.swift create mode 100644 Mlem/Models/Trackers/Inbox/ChildTrackers/RegistrationApplicationTracker.swift rename Mlem/Models/Trackers/Inbox/{ => ChildTrackers}/ReplyTracker.swift (85%) create mode 100644 Mlem/Models/Trackers/ModToolTracker.swift create mode 100644 Mlem/Models/Trackers/UserRemovalWalker.swift create mode 100644 Mlem/Protocols/Removable.swift create mode 100644 Mlem/Views/Shared/CloseButtonView.swift create mode 100644 Mlem/Views/Shared/Comments/CommentItem+MenuFunctions.swift create mode 100644 Mlem/Views/Shared/CommunityList/CommunityListRow.swift create mode 100644 Mlem/Views/Shared/CommunityList/CommunityListRowBody.swift create mode 100644 Mlem/Views/Shared/Components/Components/BanButtonView.swift create mode 100644 Mlem/Views/Shared/Components/Components/PurgeButtonView.swift create mode 100644 Mlem/Views/Shared/Components/Components/RemoveButtonView.swift create mode 100644 Mlem/Views/Shared/Components/Components/ResolveButtonView.swift rename Mlem/Views/Shared/Components/Components/{Website Indicator View.swift => WebsiteIndicatorView.swift} (94%) create mode 100644 Mlem/Views/Shared/Components/EmbeddedCommentView.swift create mode 100644 Mlem/Views/Shared/Components/Line.swift create mode 100644 Mlem/Views/Shared/Components/Modlog/ModlogEntryView.swift create mode 100644 Mlem/Views/Shared/Components/Modlog/ModlogView.swift create mode 100644 Mlem/Views/Shared/Composer/BodyEditorView.swift create mode 100644 Mlem/Views/Shared/Composer/ProgressOverlayView.swift create mode 100644 Mlem/Views/Shared/Instance/Fediseer.swift create mode 100644 Mlem/Views/Shared/Instance/FediseerInfoView.swift create mode 100644 Mlem/Views/Shared/Instance/FediseerOpinionListView.swift create mode 100644 Mlem/Views/Shared/Instance/FediseerOpinionView.swift create mode 100644 Mlem/Views/Shared/Instance/InstanceSafetyView.swift create mode 100644 Mlem/Views/Shared/Instance/InstanceUptimeView.swift create mode 100644 Mlem/Views/Shared/Instance/InstanceView+Logic.swift create mode 100644 Mlem/Views/Shared/Instance/UptimeData.swift create mode 100644 Mlem/Views/Shared/Links/InstanceLabelView.swift create mode 100644 Mlem/Views/Shared/Moderation/Components/BanFormButtonStyle.swift create mode 100644 Mlem/Views/Shared/Moderation/Components/ModlogNavigationLinkView.swift create mode 100644 Mlem/Views/Shared/Moderation/Components/ReasonView.swift create mode 100644 Mlem/Views/Shared/Moderation/ModToolSheet.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/AddModView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/BanUserView+Logic.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/BanUserView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/DenyApplicationView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/PurgeContentView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/RemoveCommentView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/RemoveCommunityView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/RemovePostView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/SimpleCommunitySearchView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/SimpleUserSearchView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/VotesListView.swift create mode 100644 Mlem/Views/Shared/Moderation/Tools/VotesTracker.swift create mode 100644 Mlem/Views/Shared/Posts/Components/LockedTag.swift create mode 100644 Mlem/Views/Shared/Posts/Components/PostEllipsisMenus.swift create mode 100644 Mlem/Views/Shared/Posts/Components/RemovedTag.swift create mode 100644 Mlem/Views/Shared/SelectTextView.swift create mode 100644 Mlem/Views/Shared/ToolbarEllipsisMenu.swift create mode 100644 Mlem/Views/Shared/UserList/ModeratorListView.swift create mode 100644 Mlem/Views/Shared/UserList/UserListRow.swift create mode 100644 Mlem/Views/Shared/UserList/UserListRowBody.swift create mode 100644 Mlem/Views/Shared/WarningView.swift create mode 100644 Mlem/Views/Shared/WebView.swift delete mode 100644 Mlem/Views/Tabs/Feeds/Components/UserContentFeedView+Logic.swift create mode 100644 Mlem/Views/Tabs/Feeds/Feed Types/FeedToolbarContent.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/AllItemsFeedView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Item Types/Inbox ReplyBodyView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Item Types/InboxMentionBodyView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Item Types/InboxMentionView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Item Types/InboxMessageBodyView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Item Types/InboxReplyView.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Mentions Feed View.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Messages Feed View.swift delete mode 100644 Mlem/Views/Tabs/Inbox/Feed/Replies Feed View.swift create mode 100644 Mlem/Views/Tabs/Inbox/InboxFeedView.swift create mode 100644 Mlem/Views/Tabs/Inbox/InboxRoot.swift create mode 100644 Mlem/Views/Tabs/Inbox/InboxView+Feeds.swift create mode 100644 Mlem/Views/Tabs/Inbox/InboxView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxCommentReportBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxCommentReportView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxMentionBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxMentionView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxMessageBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxMessageReportBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxMessageReportView.swift rename Mlem/Views/Tabs/Inbox/{Feed => }/Item Types/InboxMessageView.swift (54%) create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxPostReportBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxPostReportView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxRegistrationApplicationBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxRegistrationApplicationView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxReplyBodyView.swift create mode 100644 Mlem/Views/Tabs/Inbox/Item Types/InboxReplyView.swift delete mode 100644 Mlem/Views/Tabs/Search/BubblePicker.swift create mode 100644 Mlem/Views/Tabs/Search/BubblePicker/BubblePicker.swift create mode 100644 Mlem/Views/Tabs/Search/BubblePicker/ChildSizeReader.swift delete mode 100644 Mlem/Views/Tabs/Search/Results/CommunityResultView.swift create mode 100644 Mlem/Views/Tabs/Settings/Components/Views/Account/BlockListView+Logic.swift create mode 100644 Mlem/Views/Tabs/Settings/Components/Views/Account/BlockListView.swift create mode 100644 Mlem/Views/Tabs/Settings/Components/Views/Links/LinksSettingsView.swift create mode 100644 Mlem/Views/Tabs/Settings/Components/Views/Moderation/ModerationSettingsView.swift create mode 100644 PrivacyInfo.xcprivacy diff --git a/Mlem.xcodeproj/project.pbxproj b/Mlem.xcodeproj/project.pbxproj index 4e7762481..fcccc1cb2 100644 --- a/Mlem.xcodeproj/project.pbxproj +++ b/Mlem.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 0300F2C62B9C7D4B0022F7C4 /* CloseButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0300F2C52B9C7D4B0022F7C4 /* CloseButtonView.swift */; }; + 030245C02BA607EA00D07747 /* FeedToolbarContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245BF2BA607EA00D07747 /* FeedToolbarContent.swift */; }; + 030245C22BA60A2600D07747 /* ToolbarEllipsisMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245C12BA60A2600D07747 /* ToolbarEllipsisMenu.swift */; }; + 030245C42BA6123A00D07747 /* RemoveCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245C32BA6123A00D07747 /* RemoveCommunityView.swift */; }; + 030245C62BA6138100D07747 /* RemoveCommunityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245C52BA6138100D07747 /* RemoveCommunityRequest.swift */; }; + 030245C82BA617FE00D07747 /* PurgeCommunityRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245C72BA617FE00D07747 /* PurgeCommunityRequest.swift */; }; + 030245CA2BA70F5200D07747 /* LinksSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030245C92BA70F5200D07747 /* LinksSettingsView.swift */; }; 0304F58A2B44AF5B00537BFA /* CollapsibleSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0304F5892B44AF5B00537BFA /* CollapsibleSection.swift */; }; 0308E1142B0EA32A000CA955 /* AccountSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0308E1132B0EA32A000CA955 /* AccountSettingsView.swift */; }; 0308E1162B0EA42B000CA955 /* APILocalUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0308E1152B0EA42B000CA955 /* APILocalUserView.swift */; }; @@ -26,6 +33,8 @@ 030E86462AC6FC1B000283A6 /* DefaultTextInputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030E86452AC6FC1B000283A6 /* DefaultTextInputType.swift */; }; 030E86482AC6FD1D000283A6 /* _assignIfNotEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030E86472AC6FD1D000283A6 /* _assignIfNotEqual.swift */; }; 030E864C2AC7037F000283A6 /* SearchBarExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030E864B2AC7037F000283A6 /* SearchBarExtensions.swift */; }; + 030FF6862BCB218000F6BFAC /* Int+Abbreviated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030FF6852BCB218000F6BFAC /* Int+Abbreviated.swift */; }; + 030FF6882BCEE58900F6BFAC /* BlockInstance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030FF6872BCEE58900F6BFAC /* BlockInstance.swift */; }; 0317D46F2B558CB500EEE72C /* BadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0317D46E2B558CB500EEE72C /* BadgeView.swift */; }; 0317D4712B55AE0700EEE72C /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0317D4702B55AE0700EEE72C /* Color+Hex.swift */; }; 031A617C2B1BDFD100ABF23B /* AdvancedAccountSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 031A617B2B1BDFD100ABF23B /* AdvancedAccountSettingsView.swift */; }; @@ -40,12 +49,15 @@ 032C1E042B5D7DAC00FB4F23 /* QuickSwitcherSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 032C1E032B5D7DAC00FB4F23 /* QuickSwitcherSettingsView.swift */; }; 032C1E062B5DBDB100FB4F23 /* LocalAccountSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 032C1E052B5DBDB100FB4F23 /* LocalAccountSettingsView.swift */; }; 032DD2FD2AC3594B00F1B33D /* LinkAttatchmentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 032DD2FC2AC3594B00F1B33D /* LinkAttatchmentView.swift */; }; + 033EC0AF2BD3030A00AA238F /* BlockListView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 033EC0AE2BD3030A00AA238F /* BlockListView+Logic.swift */; }; 034C724F2A82B61200B8A4B8 /* LayoutWidgetTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 034C724E2A82B61200B8A4B8 /* LayoutWidgetTracker.swift */; }; + 0355A1DE2BB1F12500D54F9F /* ModerationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355A1DD2BB1F12500D54F9F /* ModerationSettingsView.swift */; }; 0355DA4D2B5EB51900CDF5A5 /* InstanceModel+ContentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355DA4C2B5EB51900CDF5A5 /* InstanceModel+ContentModel.swift */; }; 0355DA4F2B5EB63600CDF5A5 /* InstanceStub.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355DA4E2B5EB63600CDF5A5 /* InstanceStub.swift */; }; 0355DA512B5EB87700CDF5A5 /* InstanceResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0355DA502B5EB87700CDF5A5 /* InstanceResultView.swift */; }; 035EB0CA2A8687C200227859 /* JumpButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 035EB0C92A8687C200227859 /* JumpButtonView.swift */; }; 036ED3BC2ABF1058009664BC /* SearchModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 036ED3BB2ABF1058009664BC /* SearchModel.swift */; }; + 038142F22BB46FFF00856C9B /* CommentItem+MenuFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038142F12BB46FFF00856C9B /* CommentItem+MenuFunctions.swift */; }; 038A16DF2A75172C0087987E /* LayoutWidgetEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038A16DE2A75172C0087987E /* LayoutWidgetEditView.swift */; }; 038A16E12A75AA880087987E /* LayoutWidgetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038A16E02A75AA880087987E /* LayoutWidgetModel.swift */; }; 038A16E52A7A97380087987E /* LayoutWidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 038A16E42A7A97380087987E /* LayoutWidgetView.swift */; }; @@ -54,6 +66,13 @@ 0394398F2A98EB2300463032 /* APIComment+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0394398E2A98EB2300463032 /* APIComment+Mock.swift */; }; 039439912A98FA6100463032 /* UserFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039439902A98FA6100463032 /* UserFeedView.swift */; }; 039439932A99098900463032 /* InternetConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039439922A99098900463032 /* InternetConnectionManager.swift */; }; + 039B4FE92BD2D81D00E42114 /* BlockListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039B4FE82BD2D81D00E42114 /* BlockListView.swift */; }; + 039C59A72BADA04100C18765 /* RemoveCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59A62BADA04100C18765 /* RemoveCommentView.swift */; }; + 039C59A92BADA5DA00C18765 /* PurgeCommentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59A82BADA5DA00C18765 /* PurgeCommentRequest.swift */; }; + 039C59AB2BADC85400C18765 /* RemoveCommentRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59AA2BADC85400C18765 /* RemoveCommentRequest.swift */; }; + 039C59AD2BADFF6200C18765 /* ListPostLikesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59AC2BADFF6200C18765 /* ListPostLikesRequest.swift */; }; + 039C59AF2BAE029300C18765 /* VotesListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59AE2BAE029300C18765 /* VotesListView.swift */; }; + 039C59B12BAF272E00C18765 /* VotesTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C59B02BAF272E00C18765 /* VotesTracker.swift */; }; 039C8DB72B35A32D0096BAAF /* AccountSwitcherSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C8DB62B35A32D0096BAAF /* AccountSwitcherSettingsView.swift */; }; 039C8DB92B35A81C0096BAAF /* AccountIconStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C8DB82B35A81C0096BAAF /* AccountIconStack.swift */; }; 039C8DBB2B35B2EB0096BAAF /* AccountListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039C8DBA2B35B2EB0096BAAF /* AccountListView.swift */; }; @@ -69,17 +88,32 @@ 03A276792AFD903600C0D66B /* CommunityModel+MenuFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A276782AFD903600C0D66B /* CommunityModel+MenuFunctions.swift */; }; 03A2767B2AFE560000C0D66B /* CommunityModel+SwipeActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A2767A2AFE560000C0D66B /* CommunityModel+SwipeActions.swift */; }; 03A2767D2AFE656700C0D66B /* UserModel+MenuFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A2767C2AFE656700C0D66B /* UserModel+MenuFunctions.swift */; }; + 03A4330B2B6FB2C10004E743 /* FediseerOpinionListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A4330A2B6FB2C10004E743 /* FediseerOpinionListView.swift */; }; + 03A4330D2B6FC0940004E743 /* FediseerInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A4330C2B6FC0940004E743 /* FediseerInfoView.swift */; }; + 03A4330F2B7186C20004E743 /* WebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A4330E2B7186C20004E743 /* WebView.swift */; }; 03A54C322B5331F30064CCDE /* InstanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A54C312B5331F30064CCDE /* InstanceView.swift */; }; 03A54C352B533BC50064CCDE /* InstanceModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A54C342B533BC50064CCDE /* InstanceModel.swift */; }; 03A54C372B545A430064CCDE /* InstanceModel+MenuFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A54C362B545A430064CCDE /* InstanceModel+MenuFunctions.swift */; }; + 03AFBEA32B6EA86B00F01F3C /* SiteResponse+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEA22B6EA86B00F01F3C /* SiteResponse+Mock.swift */; }; + 03AFBEA52B6EA90400F01F3C /* APIPersonView+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEA42B6EA90400F01F3C /* APIPersonView+Mock.swift */; }; + 03AFBEA72B6EA94900F01F3C /* APIPersonAggregates+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEA62B6EA94900F01F3C /* APIPersonAggregates+Mock.swift */; }; + 03AFBEA92B6EA9BC00F01F3C /* APISiteView+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEA82B6EA9BC00F01F3C /* APISiteView+Mock.swift */; }; + 03AFBEAB2B6EAA0C00F01F3C /* APILocalSite+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEAA2B6EAA0C00F01F3C /* APILocalSite+Mock.swift */; }; + 03AFBEAD2B6EAAF000F01F3C /* APILocalSiteRateLimit+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEAC2B6EAAF000F01F3C /* APILocalSiteRateLimit+Mock.swift */; }; + 03AFBEAF2B6EAB9C00F01F3C /* APISiteAggregates+Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEAE2B6EAB9C00F01F3C /* APISiteAggregates+Mock.swift */; }; + 03AFBEB12B6EAD5B00F01F3C /* InstanceSafetyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEB02B6EAD5B00F01F3C /* InstanceSafetyView.swift */; }; + 03AFBEB32B6EB8B800F01F3C /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03AFBEB22B6EB8B800F01F3C /* Line.swift */; }; 03B15BED2B55CBBB00E7C30A /* MarkdownTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B15BEC2B55CBBB00E7C30A /* MarkdownTheme.swift */; }; 03B643572A6864CD00F65700 /* TabBarSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B643562A6864CD00F65700 /* TabBarSettingsView.swift */; }; 03B7AAEF2ABCB9DC00068B23 /* ContentTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B7AAEE2ABCB9DC00068B23 /* ContentTracker.swift */; }; 03B7AAF12ABE404300068B23 /* ContentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B7AAF02ABE404300068B23 /* ContentModel.swift */; }; 03B7AAF32ABEF85300068B23 /* UserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B7AAF22ABEF85200068B23 /* UserModel.swift */; }; - 03B7AAF52ABEFA7A00068B23 /* UserResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B7AAF42ABEFA7A00068B23 /* UserResultView.swift */; }; + 03B7AAF52ABEFA7A00068B23 /* UserListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B7AAF42ABEFA7A00068B23 /* UserListRow.swift */; }; + 03B85A3C2BB34D1F003C4203 /* PurgeContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B85A3B2BB34D1F003C4203 /* PurgeContentView.swift */; }; + 03B85A3E2BB36C4B003C4203 /* UserRemovalWalker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B85A3D2BB36C4B003C4203 /* UserRemovalWalker.swift */; }; + 03B85A402BB38868003C4203 /* PostEllipsisMenus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03B85A3F2BB38868003C4203 /* PostEllipsisMenus.swift */; }; 03BAA23A2A57DC1400D48252 /* PublishedTimestampView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03BAA2392A57DC1400D48252 /* PublishedTimestampView.swift */; }; - 03C897F62ABF49BD005F3403 /* Abbreviate Numbers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C897F52ABF49BD005F3403 /* Abbreviate Numbers.swift */; }; + 03C194082BA25B5200B00349 /* ProgressOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C194072BA25B5200B00349 /* ProgressOverlayView.swift */; }; 03C897F82ABF652D005F3403 /* SearchRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C897F72ABF652D005F3403 /* SearchRoot.swift */; }; 03C898012AC04EF9005F3403 /* SearchResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C898002AC04EF9005F3403 /* SearchResultsView.swift */; }; 03C898032AC04F61005F3403 /* RecentSearchesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C898022AC04F61005F3403 /* RecentSearchesView.swift */; }; @@ -87,10 +121,20 @@ 03C905CA2B3C834C00B9082F /* AvatarBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C905C92B3C834C00B9082F /* AvatarBannerView.swift */; }; 03C905CC2B3C88F700B9082F /* SearchTab.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C905CB2B3C88F700B9082F /* SearchTab.swift */; }; 03C905CE2B3C8DC400B9082F /* UserView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C905CD2B3C8DC400B9082F /* UserView+Logic.swift */; }; + 03C942922B6457B4002068A4 /* BanUserEditorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C942912B6457B4002068A4 /* BanUserEditorModel.swift */; }; + 03C942962B648252002068A4 /* BanPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03C942952B648252002068A4 /* BanPerson.swift */; }; 03CB329E2A6D8E910021EF27 /* PostComposerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CB329D2A6D8E910021EF27 /* PostComposerView.swift */; }; + 03CEE04B2B6EB9CD00D65B1B /* Fediseer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CEE04A2B6EB9CD00D65B1B /* Fediseer.swift */; }; + 03CEE04D2B6EBEA800D65B1B /* InstanceView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CEE04C2B6EBEA800D65B1B /* InstanceView+Logic.swift */; }; + 03CEE04F2B6ECFFC00D65B1B /* FediseerOpinionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CEE04E2B6ECFFC00D65B1B /* FediseerOpinionView.swift */; }; + 03CEE0512B6EED2C00D65B1B /* Array+IsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CEE0502B6EED2C00D65B1B /* Array+IsNotEmpty.swift */; }; + 03D89E722BB1BB0100F49DB3 /* ListCommentLikesRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D89E712BB1BB0100F49DB3 /* ListCommentLikesRequest.swift */; }; 03E0B9C82A61F0F400FED265 /* AdvancedSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E0B9C72A61F0F400FED265 /* AdvancedSettingsView.swift */; }; 03E0B9CA2A62B4A400FED265 /* ContributorsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E0B9C92A62B4A400FED265 /* ContributorsView.swift */; }; 03E0B9CC2A62CD5800FED265 /* ThemeSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E0B9CB2A62CD5800FED265 /* ThemeSettingsView.swift */; }; + 03E47AEB2B66BADC00A3E4DB /* UptimeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E47AEA2B66BADC00A3E4DB /* UptimeData.swift */; }; + 03E47AED2B66BC0000A3E4DB /* InstanceUptimeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E47AEC2B66BC0000A3E4DB /* InstanceUptimeView.swift */; }; + 03E47AEF2B66BD3C00A3E4DB /* InstanceModel+Uptime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E47AEE2B66BD3C00A3E4DB /* InstanceModel+Uptime.swift */; }; 03E79F3F2AE3E7100006700D /* SortingSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E79F3E2AE3E7100006700D /* SortingSettingsView.swift */; }; 03E90FB12B3703ED00E5A802 /* AccountSortMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E90FB02B3703ED00E5A802 /* AccountSortMode.swift */; }; 03EA79C42AC0D92C00BCDC91 /* PostComposerView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EA79C32AC0D92C00BCDC91 /* PostComposerView+Logic.swift */; }; @@ -98,13 +142,20 @@ 03EC92972AC069CE007BBE7E /* SearchResultListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EC92962AC069CE007BBE7E /* SearchResultListView.swift */; }; 03EC92992AC0BF8A007BBE7E /* APIClient+Pictrs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EC92982AC0BF8A007BBE7E /* APIClient+Pictrs.swift */; }; 03ED5D5F2B6560FE005C245B /* PostModel+MenuFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03ED5D5E2B6560FE005C245B /* PostModel+MenuFunctions.swift */; }; - 03EEEAF32AB8DCDF0087F8D8 /* CommunityResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EEEAF22AB8DCDF0087F8D8 /* CommunityResultView.swift */; }; + 03EEEAF32AB8DCDF0087F8D8 /* CommunityListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EEEAF22AB8DCDF0087F8D8 /* CommunityListRow.swift */; }; 03EEEAF72AB8ED3C0087F8D8 /* BubblePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EEEAF62AB8ED3C0087F8D8 /* BubblePicker.swift */; }; 03EEEAF92ABB985D0087F8D8 /* CommunityModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EEEAF82ABB985D0087F8D8 /* CommunityModel.swift */; }; 03EF1D0C2B434CB10056175C /* CommunityDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03EF1D0B2B434CB10056175C /* CommunityDetailsView.swift */; }; + 03F0DF542B9D129D0018F239 /* BanUserView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F0DF532B9D129D0018F239 /* BanUserView+Logic.swift */; }; + 03F0DF562B9E0E210018F239 /* PurgePostRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F0DF552B9E0E210018F239 /* PurgePostRequest.swift */; }; + 03F0DF582B9E24EF0018F239 /* PurgePersonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F0DF572B9E24EF0018F239 /* PurgePersonRequest.swift */; }; + 03F0DF5A2B9E28F30018F239 /* InstanceLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F0DF592B9E28F30018F239 /* InstanceLabelView.swift */; }; 03F4DC9D2B193F4C00556C67 /* MatrixLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F4DC9C2B193F4C00556C67 /* MatrixLinkView.swift */; }; 03F4DC9F2B1A8AD500556C67 /* SignInAndSecuritySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F4DC9E2B1A8AD500556C67 /* SignInAndSecuritySettingsView.swift */; }; 03F4DCA32B1A8B0400556C67 /* AccountGeneralSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F4DCA22B1A8B0400556C67 /* AccountGeneralSettingsView.swift */; }; + 03F6D4B92B951E21008235A0 /* SwiftUIIntrospect in Frameworks */ = {isa = PBXBuildFile; productRef = 03F6D4B82B951E21008235A0 /* SwiftUIIntrospect */; }; + 03F6D4BB2B952738008235A0 /* SelectTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F6D4BA2B952738008235A0 /* SelectTextView.swift */; }; + 03F6D4BD2B966D53008235A0 /* BodyEditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F6D4BC2B966D53008235A0 /* BodyEditorView.swift */; }; 03F76FA02B2F5EF900E2B54A /* LinkAttachmentModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F76F9F2B2F5EF900E2B54A /* LinkAttachmentModel.swift */; }; 03F76FA22B2F5F1100E2B54A /* LinkAttachmentProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F76FA12B2F5F1100E2B54A /* LinkAttachmentProxy.swift */; }; 03F76FA42B2F5F3500E2B54A /* UploadProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03F76FA32B2F5F3500E2B54A /* UploadProgressView.swift */; }; @@ -121,7 +172,6 @@ 504ECBAE2AB45B2A006C0B96 /* LemmyURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ECBAD2AB45B2A006C0B96 /* LemmyURL.swift */; }; 504ECBB12AB4B101006C0B96 /* LemmyURLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ECBB02AB4B101006C0B96 /* LemmyURLTests.swift */; }; 505240E32A86916500EA4558 /* FavoriteCommunitiesTracker+Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505240E22A86916500EA4558 /* FavoriteCommunitiesTracker+Dependency.swift */; }; - 505240E52A86E32700EA4558 /* CommunityListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505240E42A86E32700EA4558 /* CommunityListModel.swift */; }; 505240E72A88D36D00EA4558 /* SectionIndexTitles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505240E62A88D36D00EA4558 /* SectionIndexTitles.swift */; }; 5064D03D2A6DE0AA00B22EE3 /* Notifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5064D03C2A6DE0AA00B22EE3 /* Notifier.swift */; }; 5064D03F2A6DE0DB00B22EE3 /* Notifier+Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5064D03E2A6DE0DB00B22EE3 /* Notifier+Dependency.swift */; }; @@ -296,7 +346,6 @@ 6DCE71292A53C26600CFEB5E /* ServerInstanceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DCE71282A53C26600CFEB5E /* ServerInstanceLocation.swift */; }; 6DE118392A4A20D600810C7E /* Lazy Load Post Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DE118382A4A20D600810C7E /* Lazy Load Post Link.swift */; }; 6DE1183C2A4A217400810C7E /* Profile View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DE1183B2A4A217400810C7E /* Profile View.swift */; }; - 6DFF50432A48DED3001E648D /* Inbox View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFF50422A48DED3001E648D /* Inbox View.swift */; }; 6DFF50452A48E373001E648D /* GetPrivateMessages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFF50442A48E373001E648D /* GetPrivateMessages.swift */; }; 6FB4A4DE2B47860B00A7CD82 /* CollapsedCommentReplies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FB4A4DD2B47860B00A7CD82 /* CollapsedCommentReplies.swift */; }; 6FF17D012B685C16007E1814 /* AppLockView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF17D002B685C16007E1814 /* AppLockView.swift */; }; @@ -333,6 +382,10 @@ CD05E7792A4E381A0081D102 /* PostSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD05E7782A4E381A0081D102 /* PostSize.swift */; }; CD05E77F2A4F263B0081D102 /* Menu Function.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD05E77E2A4F263B0081D102 /* Menu Function.swift */; }; CD0BE42F2A65A73600314B24 /* Haptic Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0BE42E2A65A73600314B24 /* Haptic Manager.swift */; }; + CD0D5A432B8EC4DA005E3365 /* RemovePostRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0D5A422B8EC4DA005E3365 /* RemovePostRequest.swift */; }; + CD0D5A452B8EC5D9005E3365 /* RemovePostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0D5A442B8EC5D9005E3365 /* RemovePostView.swift */; }; + CD0D5A482B8EC6F3005E3365 /* ReasonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0D5A472B8EC6F3005E3365 /* ReasonView.swift */; }; + CD0D5A4A2B8ED320005E3365 /* BanFormButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0D5A492B8ED320005E3365 /* BanFormButtonStyle.swift */; }; CD12627A2B4759BC007549F9 /* StandardPostTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1262792B4759BC007549F9 /* StandardPostTracker.swift */; }; CD12627D2B475E45007549F9 /* PostModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD12627C2B475E45007549F9 /* PostModel+TrackerItem.swift */; }; CD1446182A58FC3B00610EF1 /* InfoStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD1446172A58FC3B00610EF1 /* InfoStackView.swift */; }; @@ -346,8 +399,12 @@ CD16A0642B66F81A000312D2 /* UserContentModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD16A0632B66F81A000312D2 /* UserContentModel+TrackerItem.swift */; }; CD16A0662B670039000312D2 /* HierarchicalComment+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD16A0652B670039000312D2 /* HierarchicalComment+TrackerItem.swift */; }; CD16A0682B670327000312D2 /* UserContentFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD16A0672B670327000312D2 /* UserContentFeedView.swift */; }; - CD16A06A2B670ABE000312D2 /* UserContentFeedView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD16A0692B670ABE000312D2 /* UserContentFeedView+Logic.swift */; }; CD16A06C2B674ABF000312D2 /* FeedHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD16A06B2B674ABF000312D2 /* FeedHeaderView.swift */; }; + CD17C1D92BA2660300A0C8BC /* ModlogNavigationLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD17C1D82BA2660300A0C8BC /* ModlogNavigationLinkView.swift */; }; + CD17C1DB2BA358FD00A0C8BC /* ModlogTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD17C1DA2BA358FD00A0C8BC /* ModlogTracker.swift */; }; + CD17C1DD2BA3596000A0C8BC /* ModlogEntry+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD17C1DC2BA3596000A0C8BC /* ModlogEntry+TrackerItem.swift */; }; + CD17C1E62BA369C700A0C8BC /* ModlogChildTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD17C1E52BA369C700A0C8BC /* ModlogChildTracker.swift */; }; + CD17C1EA2BA3997000A0C8BC /* TrackerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD17C1E92BA3997000A0C8BC /* TrackerProtocol.swift */; }; CD1824402AA8E24100D9BEB5 /* View+DestructiveConfirmation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD18243F2AA8E24100D9BEB5 /* View+DestructiveConfirmation.swift */; }; CD18DC6B2A5202D4002C56BC /* MarkPersonMentionAsReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD18DC6A2A5202D4002C56BC /* MarkPersonMentionAsReadRequest.swift */; }; CD18DC6F2A5209C3002C56BC /* MarkPrivateMessageAsReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD18DC6E2A5209C3002C56BC /* MarkPrivateMessageAsReadRequest.swift */; }; @@ -356,6 +413,41 @@ CD2053122ACB72190000AA38 /* AccountTransitionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2053112ACB72190000AA38 /* AccountTransitionView.swift */; }; CD2053142ACBAF150000AA38 /* AvatarType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2053132ACBAF150000AA38 /* AvatarType.swift */; }; CD2053172ACBBB5A0000AA38 /* DefaultAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2053162ACBBB5A0000AA38 /* DefaultAvatarView.swift */; }; + CD268C112B9A3CB30074DBEE /* SimpleCommunitySearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD268C102B9A3CB30074DBEE /* SimpleCommunitySearchView.swift */; }; + CD268C142B9A3DD80074DBEE /* CommunityListRowBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD268C132B9A3DD80074DBEE /* CommunityListRowBody.swift */; }; + CD2697E32B9E13B70002B459 /* ModlogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697E22B9E13B70002B459 /* ModlogView.swift */; }; + CD2697E52B9E14FB0002B459 /* GetModlogRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697E42B9E14FB0002B459 /* GetModlogRequest.swift */; }; + CD2697E82B9E15580002B459 /* APIModRemovePostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697E72B9E15580002B459 /* APIModRemovePostView.swift */; }; + CD2697EA2B9E15610002B459 /* APIModLockPostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697E92B9E15610002B459 /* APIModLockPostView.swift */; }; + CD2697EC2B9E156D0002B459 /* APIModFeaturePostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697EB2B9E156D0002B459 /* APIModFeaturePostView.swift */; }; + CD2697EE2B9E15740002B459 /* APIModRemoveCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697ED2B9E15740002B459 /* APIModRemoveCommentView.swift */; }; + CD2697F02B9E157E0002B459 /* APIModBanFromCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697EF2B9E157E0002B459 /* APIModBanFromCommunityView.swift */; }; + CD2697F22B9E15860002B459 /* APIModRemoveCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697F12B9E15860002B459 /* APIModRemoveCommunityView.swift */; }; + CD2697F42B9E158E0002B459 /* APIModBanView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697F32B9E158E0002B459 /* APIModBanView.swift */; }; + CD2697F62B9E15A60002B459 /* APIModAddCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697F52B9E15A60002B459 /* APIModAddCommunityView.swift */; }; + CD2697F82B9E15AD0002B459 /* APIModTransferCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697F72B9E15AD0002B459 /* APIModTransferCommunityView.swift */; }; + CD2697FA2B9E15B90002B459 /* APIModAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697F92B9E15B90002B459 /* APIModAddView.swift */; }; + CD2697FC2B9E15C10002B459 /* APIAdminPurgePersonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697FB2B9E15C10002B459 /* APIAdminPurgePersonView.swift */; }; + CD2697FE2B9E15C80002B459 /* APIAdminPurgeCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697FD2B9E15C80002B459 /* APIAdminPurgeCommunityView.swift */; }; + CD2698002B9E15CF0002B459 /* APIAdminPurgePostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2697FF2B9E15CF0002B459 /* APIAdminPurgePostView.swift */; }; + CD2698022B9E15D60002B459 /* APIAdminPurgeCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698012B9E15D60002B459 /* APIAdminPurgeCommentView.swift */; }; + CD2698042B9E15E50002B459 /* APIModHideCommunityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698032B9E15E50002B459 /* APIModHideCommunityView.swift */; }; + CD2698062B9E15F10002B459 /* APIModlogActionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698052B9E15F10002B459 /* APIModlogActionType.swift */; }; + CD2698082B9E162A0002B459 /* APIModRemovePost.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698072B9E162A0002B459 /* APIModRemovePost.swift */; }; + CD26980A2B9E166D0002B459 /* APIModLockPost.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698092B9E166D0002B459 /* APIModLockPost.swift */; }; + CD26980C2B9E16810002B459 /* APIModRemoveComment.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26980B2B9E16810002B459 /* APIModRemoveComment.swift */; }; + CD26980E2B9E16A70002B459 /* APIModFeaturePost.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26980D2B9E16A70002B459 /* APIModFeaturePost.swift */; }; + CD2698102B9E174C0002B459 /* APIModBanFromCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26980F2B9E174C0002B459 /* APIModBanFromCommunity.swift */; }; + CD2698122B9E17660002B459 /* APIModRemoveCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698112B9E17660002B459 /* APIModRemoveCommunity.swift */; }; + CD2698152B9E17AE0002B459 /* APIModBan.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698142B9E17AD0002B459 /* APIModBan.swift */; }; + CD2698172B9E17C60002B459 /* APIModAddCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698162B9E17C60002B459 /* APIModAddCommunity.swift */; }; + CD2698192B9E17DE0002B459 /* APIModTransferCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698182B9E17DE0002B459 /* APIModTransferCommunity.swift */; }; + CD26981B2B9E17F70002B459 /* APIModAdd.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26981A2B9E17F70002B459 /* APIModAdd.swift */; }; + CD26981D2B9E18090002B459 /* APIAdminPurgePerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26981C2B9E18090002B459 /* APIAdminPurgePerson.swift */; }; + CD26981F2B9E181D0002B459 /* APIAdminPurgeCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD26981E2B9E181D0002B459 /* APIAdminPurgeCommunity.swift */; }; + CD2698212B9E18350002B459 /* APIAdminPurgePost.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698202B9E18350002B459 /* APIAdminPurgePost.swift */; }; + CD2698232B9E18450002B459 /* APIAdminPurgeComment.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698222B9E18450002B459 /* APIAdminPurgeComment.swift */; }; + CD2698252B9E18770002B459 /* ApiModHideCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2698242B9E18760002B459 /* ApiModHideCommunity.swift */; }; CD29ED372B2E85EA006937CE /* String+Alphabet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD29ED362B2E85EA006937CE /* String+Alphabet.swift */; }; CD29ED392B2E860C006937CE /* String+Trimmed.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD29ED382B2E860C006937CE /* String+Trimmed.swift */; }; CD29ED3B2B2E8624006937CE /* String+IsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD29ED3A2B2E8624006937CE /* String+IsNotEmpty.swift */; }; @@ -363,6 +455,10 @@ CD29ED412B2E867C006937CE /* UIApplication+TopMostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD29ED402B2E867C006937CE /* UIApplication+TopMostViewController.swift */; }; CD29ED472B2E8785006937CE /* EnvironmentValues+NavigationPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD29ED462B2E8785006937CE /* EnvironmentValues+NavigationPath.swift */; }; CD2BD6782A79F55800ECFF89 /* ImageSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BD6772A79F55800ECFF89 /* ImageSize.swift */; }; + CD2BFE742B9F5BE800717611 /* ModlogEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BFE732B9F5BE800717611 /* ModlogEntry.swift */; }; + CD2BFE782B9F60AC00717611 /* APIClient+Instance.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BFE772B9F60AC00717611 /* APIClient+Instance.swift */; }; + CD2BFE7E2B9F670B00717611 /* ModlogEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BFE7D2B9F670B00717611 /* ModlogEntryView.swift */; }; + CD2BFE822B9FA05300717611 /* ModlogLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2BFE812B9FA05300717611 /* ModlogLink.swift */; }; CD2E182B2A3B708500224F8A /* Settings Options.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD2E182A2A3B708500224F8A /* Settings Options.swift */; }; CD309C462A93FBD300988F95 /* Logo View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD309C452A93FBD300988F95 /* Logo View.swift */; }; CD3720EC2B2E8F96004D7103 /* AlternativeIconCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3720EB2B2E8F96004D7103 /* AlternativeIconCell.swift */; }; @@ -376,10 +472,6 @@ CD391F9E2A539F1800E213B5 /* ReplyToMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD391F9D2A539F1800E213B5 /* ReplyToMention.swift */; }; CD391FA02A545F8600E213B5 /* Compact Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD391F9F2A545F8600E213B5 /* Compact Post.swift */; }; CD3FBCDD2A4A6F0600B2063F /* GetReplies.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCDC2A4A6F0600B2063F /* GetReplies.swift */; }; - CD3FBCE12A4A836000B2063F /* AllItemsFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCE02A4A836000B2063F /* AllItemsFeedView.swift */; }; - CD3FBCE32A4A844800B2063F /* Replies Feed View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCE22A4A844800B2063F /* Replies Feed View.swift */; }; - CD3FBCE52A4A89B900B2063F /* Mentions Feed View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCE42A4A89B900B2063F /* Mentions Feed View.swift */; }; - CD3FBCE72A4A8CE300B2063F /* Messages Feed View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCE62A4A8CE300B2063F /* Messages Feed View.swift */; }; CD3FBCE92A4B482700B2063F /* Generic Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD3FBCE82A4B482700B2063F /* Generic Merge.swift */; }; CD4368AE2AE23ED400BD8BD1 /* StandardTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4368AD2AE23ED400BD8BD1 /* StandardTracker.swift */; }; CD4368B02AE23F1400BD8BD1 /* ChildTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4368AF2AE23F1400BD8BD1 /* ChildTracker.swift */; }; @@ -403,16 +495,24 @@ CD4368D92AE2478300BD8BD1 /* MentionModel+InboxItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4368D82AE2478300BD8BD1 /* MentionModel+InboxItem.swift */; }; CD4368DB2AE247B700BD8BD1 /* MentionTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4368DA2AE247B700BD8BD1 /* MentionTracker.swift */; }; CD4368DD2AE24E1A00BD8BD1 /* InboxView+Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4368DC2AE24E1A00BD8BD1 /* InboxView+Logic.swift */; }; + CD436F292BD325CB001711B9 /* String+StrippingDiacritics.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD436F282BD325CB001711B9 /* String+StrippingDiacritics.swift */; }; CD45BCEE2A75CA7200A2899C /* Thumbnail Image View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD45BCED2A75CA7200A2899C /* Thumbnail Image View.swift */; }; CD46C1F62B0D0A5700065953 /* EnvironmentValues+TabReselectionHashValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD46C1F52B0D0A5700065953 /* EnvironmentValues+TabReselectionHashValue.swift */; }; CD46C1F82B0D0A8A00065953 /* View+ReselectAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD46C1F72B0D0A8A00065953 /* View+ReselectAction.swift */; }; CD4BAD352B4B2C0B00A1E726 /* FeedsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4BAD342B4B2C0B00A1E726 /* FeedsView.swift */; }; CD4BAD3B2B4C6C3200A1E726 /* FeedRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4BAD3A2B4C6C3200A1E726 /* FeedRowView.swift */; }; - CD4BAD3D2B4C6C8E00A1E726 /* FeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4BAD3C2B4C6C8E00A1E726 /* FeedType.swift */; }; + CD4BAD3D2B4C6C8E00A1E726 /* PostFeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4BAD3C2B4C6C8E00A1E726 /* PostFeedType.swift */; }; CD4BAD432B507F2B00A1E726 /* AggregateFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4BAD422B507F2B00A1E726 /* AggregateFeedView.swift */; }; CD4DBC032A6F803C001A1E61 /* ReplyToPost.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4DBC022A6F803C001A1E61 /* ReplyToPost.swift */; }; + CD4DD9DA2BABABB000085D41 /* InboxRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4DD9D92BABABB000085D41 /* InboxRoot.swift */; }; + CD50504D2B80065300632C56 /* Date+DaysFromNow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD50504C2B80065300632C56 /* Date+DaysFromNow.swift */; }; + CD5050542B807BF800632C56 /* AddModToCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD5050532B807BF800632C56 /* AddModToCommunity.swift */; }; CD525F652A4B6D8F00BCA794 /* CommunityLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD525F642A4B6D8F00BCA794 /* CommunityLinkView.swift */; }; + CD55FE262B97F37A0020EE24 /* AddModView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD55FE252B97F37A0020EE24 /* AddModView.swift */; }; + CD55FE282B9A28D00020EE24 /* SimpleUserSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD55FE272B9A28D00020EE24 /* SimpleUserSearchView.swift */; }; CD59E8A52A72C943005757F4 /* MarkAllAsReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD59E8A42A72C943005757F4 /* MarkAllAsReadRequest.swift */; }; + CD5BB8172BADF7700027398F /* ChildSizeReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD5BB8162BADF7700027398F /* ChildSizeReader.swift */; }; + CD5F76BC2B75BE700013A827 /* MarkReadBatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD5F76BB2B75BE700013A827 /* MarkReadBatcher.swift */; }; CD6483302A38D31C00EE6CA3 /* UpvoteCounterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD64832F2A38D31C00EE6CA3 /* UpvoteCounterView.swift */; }; CD6483322A38D3A600EE6CA3 /* ScoreCounterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6483312A38D3A600EE6CA3 /* ScoreCounterView.swift */; }; CD6483362A39F20800EE6CA3 /* Post Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6483352A39F20800EE6CA3 /* Post Type.swift */; }; @@ -429,6 +529,7 @@ CD6F29A82A77FF1700F20B6B /* MarkPostRead.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6F29A72A77FF1700F20B6B /* MarkPostRead.swift */; }; CD6F29AA2A78003A00F20B6B /* PostRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6F29A92A78003A00F20B6B /* PostRepository.swift */; }; CD6F29AC2A78015200F20B6B /* PostRepository+Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD6F29AB2A78015200F20B6B /* PostRepository+Dependency.swift */; }; + CD7798A62BB0E5B50067DF82 /* InboxView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7798A52BB0E5B50067DF82 /* InboxView.swift */; }; CD7B53B52A5F251400006E81 /* CreatePrivateMessageReportRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7B53B42A5F251400006E81 /* CreatePrivateMessageReportRequest.swift */; }; CD7B53B72A5F258B00006E81 /* APIPrivateMessageReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7B53B62A5F258B00006E81 /* APIPrivateMessageReportView.swift */; }; CD7B53B92A5F263D00006E81 /* APIPrivateMessageReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD7B53B82A5F263D00006E81 /* APIPrivateMessageReport.swift */; }; @@ -438,11 +539,12 @@ CD82A2552A716C7C00111034 /* APIPersonUnreadCounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD82A2542A716C7C00111034 /* APIPersonUnreadCounts.swift */; }; CD82A2572A716D7C00111034 /* PersonRepository+Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD82A2562A716D7C00111034 /* PersonRepository+Dependency.swift */; }; CD82A2592A71775E00111034 /* UnreadTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD82A2582A71775E00111034 /* UnreadTracker.swift */; }; - CD8461662A96F9EB0026A627 /* Website Indicator View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8461652A96F9EB0026A627 /* Website Indicator View.swift */; }; CD863FBA2A6AEB5900A31ED9 /* View+FancyTabScrollCompatible.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD863FB92A6AEB5900A31ED9 /* View+FancyTabScrollCompatible.swift */; }; CD863FBC2A6B026400A31ED9 /* DocumentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD863FBB2A6B026400A31ED9 /* DocumentView.swift */; }; + CD876EC72B7736370075DC15 /* MarkReadBatcher+Dependency.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD876EC62B7736370075DC15 /* MarkReadBatcher+Dependency.swift */; }; CD8C55342A95515C0060B75B /* Onboarding Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8C55332A95515C0060B75B /* Onboarding Text.swift */; }; CD8CF2092AF3F131009FFC23 /* Firm Info.ahap in Resources */ = {isa = PBXBuildFile; fileRef = CD8CF2082AF3F131009FFC23 /* Firm Info.ahap */; }; + CD9395272BA7CF92008F6C4C /* ModlogAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9395262BA7CF92008F6C4C /* ModlogAction.swift */; }; CD963FCB2B5F0388002352FD /* DefaultFeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD963FCA2B5F0388002352FD /* DefaultFeedType.swift */; }; CD9A03C62B34D20500C16276 /* EnvironmentValues+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9A03C52B34D20500C16276 /* EnvironmentValues+Navigation.swift */; }; CD9A03C82B389F7000C16276 /* EnvironmentValues+FeedType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9A03C72B389F7000C16276 /* EnvironmentValues+FeedType.swift */; }; @@ -453,6 +555,9 @@ CD9DD8832A622A6C0044EA8E /* ReportCommentReply.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9DD8822A622A6C0044EA8E /* ReportCommentReply.swift */; }; CD9DD8852A62302A0044EA8E /* ConcreteEditorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9DD8842A62302A0044EA8E /* ConcreteEditorModel.swift */; }; CDA145ED2A510AC100DDAFC9 /* MarkCommentReplyAsReadRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA145EC2A510AC100DDAFC9 /* MarkCommentReplyAsReadRequest.swift */; }; + CDA1E84D2B93FC7C007953EF /* BanUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA1E84C2B93FC7C007953EF /* BanUserView.swift */; }; + CDA1E84F2B93FF83007953EF /* RemovedTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA1E84E2B93FF83007953EF /* RemovedTag.swift */; }; + CDA1E8512B940390007953EF /* LockedTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA1E8502B940390007953EF /* LockedTag.swift */; }; CDA217E42A62FB3300BDA173 /* ReplyToMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA217E32A62FB3300BDA173 /* ReplyToMessage.swift */; }; CDA217E62A63016A00BDA173 /* ReportMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA217E52A63016A00BDA173 /* ReportMessage.swift */; }; CDA217E82A63029B00BDA173 /* ReportMention.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA217E72A63029B00BDA173 /* ReportMention.swift */; }; @@ -469,12 +574,20 @@ CDB45C602AF1AF4900A1FF08 /* MentionModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB45C5F2AF1AF4900A1FF08 /* MentionModel+TrackerItem.swift */; }; CDB45C622AF1AF9B00A1FF08 /* ReplyModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB45C612AF1AF9B00A1FF08 /* ReplyModel+TrackerItem.swift */; }; CDB45C642AF1AFB900A1FF08 /* MessageModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB45C632AF1AFB900A1FF08 /* MessageModel+TrackerItem.swift */; }; + CDB652532B8EABFC007B7797 /* FeaturePostRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB652522B8EABFC007B7797 /* FeaturePostRequest.swift */; }; + CDB652552B8EAC3E007B7797 /* APIPostFeatureType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB652542B8EAC3E007B7797 /* APIPostFeatureType.swift */; }; + CDB652572B8EAE15007B7797 /* APIPostResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB652562B8EAE15007B7797 /* APIPostResponse.swift */; }; + CDB652592B8EC024007B7797 /* LockPostRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB652582B8EC024007B7797 /* LockPostRequest.swift */; }; + CDBA5FC62BC9C58300469C05 /* GetUnreadRegistrationApplicationCountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBA5FC52BC9C58300469C05 /* GetUnreadRegistrationApplicationCountRequest.swift */; }; + CDBA5FC82BCC477F00469C05 /* WarningView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBA5FC72BCC477F00469C05 /* WarningView.swift */; }; + CDBA5FCA2BD17F3D00469C05 /* CommunityListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBA5FC92BD17F3D00469C05 /* CommunityListModel.swift */; }; CDBCBA202B537A4B0070F60D /* PostFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBCBA1F2B537A4B0070F60D /* PostFeedView.swift */; }; CDBCBA242B54A5F40070F60D /* NoPostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBCBA232B54A5F40070F60D /* NoPostsView.swift */; }; CDC1C93C2A7AA76000072E3D /* InternetSpeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC1C93B2A7AA76000072E3D /* InternetSpeed.swift */; }; CDC1C93F2A7AB8C700072E3D /* AccessibilitySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC1C93E2A7AB8C700072E3D /* AccessibilitySettingsView.swift */; }; CDC1C9412A7ABA9C00072E3D /* ReadMarkStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC1C9402A7ABA9C00072E3D /* ReadMarkStyle.swift */; }; CDC1C9432A7AC24600072E3D /* ReadCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC1C9422A7AC24600072E3D /* ReadCheck.swift */; }; + CDC24EA62BC9B352009AA6D1 /* GetReportCountRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC24EA52BC9B352009AA6D1 /* GetReportCountRequest.swift */; }; CDC3E8002AEAFEAF008062CA /* InboxTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC3E7FF2AEAFEAF008062CA /* InboxTracker.swift */; }; CDC65D8F2A86B6DD007205E5 /* DeleteUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC65D8E2A86B6DD007205E5 /* DeleteUser.swift */; }; CDC65D912A86B830007205E5 /* DeleteAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC65D902A86B830007205E5 /* DeleteAccountView.swift */; }; @@ -484,6 +597,57 @@ CDCBD7262A8D69A200387A2C /* Instance Picker View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCBD7252A8D69A200387A2C /* Instance Picker View.swift */; }; CDCBD7282A8D6B7700387A2C /* Instance Picker View Logic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCBD7272A8D6B7700387A2C /* Instance Picker View Logic.swift */; }; CDCBD72B2A8EC0A800387A2C /* Instance Summary.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDCBD72A2A8EC0A800387A2C /* Instance Summary.swift */; }; + CDD0B8AB2BB37B3D003E7174 /* WebsiteIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8AA2BB37B3D003E7174 /* WebsiteIndicatorView.swift */; }; + CDD0B8AD2BB4CD7D003E7174 /* CommentReportModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8AC2BB4CD7D003E7174 /* CommentReportModel.swift */; }; + CDD0B8B22BB4D990003E7174 /* CommentReportModel+InboxItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8B12BB4D990003E7174 /* CommentReportModel+InboxItem.swift */; }; + CDD0B8B42BB4DAFE003E7174 /* CommentReportModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8B32BB4DAFE003E7174 /* CommentReportModel+TrackerItem.swift */; }; + CDD0B8B62BB4DC12003E7174 /* CommentReportTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8B52BB4DC12003E7174 /* CommentReportTracker.swift */; }; + CDD0B8B92BB4E407003E7174 /* ListCommentReportsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8B82BB4E407003E7174 /* ListCommentReportsRequest.swift */; }; + CDD0B8BB2BB4E51C003E7174 /* APIClient+Moderation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8BA2BB4E51B003E7174 /* APIClient+Moderation.swift */; }; + CDD0B8BD2BB4F3D3003E7174 /* InboxCommentReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8BC2BB4F3D3003E7174 /* InboxCommentReportView.swift */; }; + CDD0B8BF2BB5B68F003E7174 /* EmbeddedCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8BE2BB5B68F003E7174 /* EmbeddedCommentView.swift */; }; + CDD0B8C12BB5BC51003E7174 /* InboxMessageBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8C02BB5BC51003E7174 /* InboxMessageBodyView.swift */; }; + CDD0B8C32BB5BCFD003E7174 /* InboxCommentReportBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8C22BB5BCFD003E7174 /* InboxCommentReportBodyView.swift */; }; + CDD0B8C52BB78056003E7174 /* ResolveButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8C42BB78056003E7174 /* ResolveButtonView.swift */; }; + CDD0B8C72BB78260003E7174 /* RemoveButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8C62BB78260003E7174 /* RemoveButtonView.swift */; }; + CDD0B8C92BB782CF003E7174 /* PurgeButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8C82BB782CF003E7174 /* PurgeButtonView.swift */; }; + CDD0B8CB2BB7844F003E7174 /* BanButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8CA2BB7844F003E7174 /* BanButtonView.swift */; }; + CDD0B8CD2BB9E53F003E7174 /* Removable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8CC2BB9E53F003E7174 /* Removable.swift */; }; + CDD0B8CF2BBA0D31003E7174 /* ResolveCommentReportRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8CE2BBA0D31003E7174 /* ResolveCommentReportRequest.swift */; }; + CDD0B8D32BBB4158003E7174 /* InboxView+Feeds.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8D22BBB4158003E7174 /* InboxView+Feeds.swift */; }; + CDD0B8D52BBB41CC003E7174 /* InboxFeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8D42BBB41CB003E7174 /* InboxFeedView.swift */; }; + CDD0B8D82BBF3C5A003E7174 /* PostReportTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8D72BBF3C5A003E7174 /* PostReportTracker.swift */; }; + CDD0B8DA2BBF3C87003E7174 /* PostReportModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8D92BBF3C87003E7174 /* PostReportModel.swift */; }; + CDD0B8DC2BBF4238003E7174 /* ListPostReportsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8DB2BBF4238003E7174 /* ListPostReportsRequest.swift */; }; + CDD0B8DE2BBF4601003E7174 /* PostReportModel+InboxItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8DD2BBF4601003E7174 /* PostReportModel+InboxItem.swift */; }; + CDD0B8E02BBF4689003E7174 /* PostReportModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8DF2BBF4689003E7174 /* PostReportModel+TrackerItem.swift */; }; + CDD0B8E22BBF49DB003E7174 /* InboxPostReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8E12BBF49DB003E7174 /* InboxPostReportView.swift */; }; + CDD0B8E42BBF4D4B003E7174 /* InboxPostReportBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8E32BBF4D4B003E7174 /* InboxPostReportBodyView.swift */; }; + CDD0B8E62BBF57D9003E7174 /* ResolvePostReportRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8E52BBF57D9003E7174 /* ResolvePostReportRequest.swift */; }; + CDD0B8E82BBF7C8B003E7174 /* MessageReportTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8E72BBF7C8B003E7174 /* MessageReportTracker.swift */; }; + CDD0B8EA2BBF7CAB003E7174 /* MessageReportModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8E92BBF7CAB003E7174 /* MessageReportModel.swift */; }; + CDD0B8EC2BBF7D0F003E7174 /* ListPrivateMessageReportsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8EB2BBF7D0F003E7174 /* ListPrivateMessageReportsRequest.swift */; }; + CDD0B8EE2BBF7F21003E7174 /* MessageReportModel+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8ED2BBF7F21003E7174 /* MessageReportModel+TrackerItem.swift */; }; + CDD0B8F02BBF7FB7003E7174 /* MessageReportModel+InboxItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8EF2BBF7FB7003E7174 /* MessageReportModel+InboxItem.swift */; }; + CDD0B8F22BBF8406003E7174 /* InboxMessageReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8F12BBF8406003E7174 /* InboxMessageReportView.swift */; }; + CDD0B8F42BBF843C003E7174 /* InboxMessageReportBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8F32BBF843B003E7174 /* InboxMessageReportBodyView.swift */; }; + CDD0B8F62BC064F0003E7174 /* ResolvePrivateMessageReportRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8F52BC064F0003E7174 /* ResolvePrivateMessageReportRequest.swift */; }; + CDD0B8F82BC07E6A003E7174 /* ListRegistrationApplicationsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8F72BC07E6A003E7174 /* ListRegistrationApplicationsRequest.swift */; }; + CDD0B8FA2BC07EA9003E7174 /* APIRegistrationApplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8F92BC07EA9003E7174 /* APIRegistrationApplicationView.swift */; }; + CDD0B8FC2BC07ED7003E7174 /* APIRegistrationApplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8FB2BC07ED7003E7174 /* APIRegistrationApplication.swift */; }; + CDD0B8FE2BC07F4B003E7174 /* RegistrationApplicationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8FD2BC07F4B003E7174 /* RegistrationApplicationModel.swift */; }; + CDD0B9002BC080C7003E7174 /* ApproveRegistrationApplicationRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B8FF2BC080C7003E7174 /* ApproveRegistrationApplicationRequest.swift */; }; + CDD0B9022BC084A9003E7174 /* DenyApplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B9012BC084A9003E7174 /* DenyApplicationView.swift */; }; + CDD0B9042BC08987003E7174 /* RegistrationApplication+TrackerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B9032BC08987003E7174 /* RegistrationApplication+TrackerItem.swift */; }; + CDD0B9062BC089EA003E7174 /* RegistrationApplication+InboxItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B9052BC089EA003E7174 /* RegistrationApplication+InboxItem.swift */; }; + CDD0B9082BC08A6D003E7174 /* RegistrationApplicationTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B9072BC08A6D003E7174 /* RegistrationApplicationTracker.swift */; }; + CDD0B90A2BC08E02003E7174 /* InboxRegistrationApplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B9092BC08E02003E7174 /* InboxRegistrationApplicationView.swift */; }; + CDD0B90C2BC08E21003E7174 /* InboxRegistrationApplicationBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0B90B2BC08E21003E7174 /* InboxRegistrationApplicationBodyView.swift */; }; + CDD0EF9C2B7D6B9100CA3504 /* ModToolTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0EF9B2B7D6B9100CA3504 /* ModToolTracker.swift */; }; + CDD0EF9E2B7D6F3E00CA3504 /* ModToolSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0EF9D2B7D6F3E00CA3504 /* ModToolSheet.swift */; }; + CDD0EFA22B7D9E5800CA3504 /* UserListRowBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0EFA12B7D9E5800CA3504 /* UserListRowBody.swift */; }; + CDD0EFA52B7E8B3200CA3504 /* ModeratorListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0EFA42B7E8B3200CA3504 /* ModeratorListView.swift */; }; + CDD0EFAD2B7EA73000CA3504 /* BanFromCommunity.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0EFAC2B7EA73000CA3504 /* BanFromCommunity.swift */; }; CDD55D1D2B23BA41002020C7 /* EasyTapLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD55D1C2B23BA41002020C7 /* EasyTapLinkView.swift */; }; CDD55D222B2674BD002020C7 /* String+ParseLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD55D212B2674BD002020C7 /* String+ParseLinks.swift */; }; CDDB08782A5DF1330075BFEE /* CommentSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDDB08772A5DF1330075BFEE /* CommentSettingsView.swift */; }; @@ -500,9 +664,8 @@ CDE3BA892A8C64BD00B972E2 /* Collapsible Text Item.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE3BA882A8C64BD00B972E2 /* Collapsible Text Item.swift */; }; CDE6A80B2A43E9F00062D161 /* CommentSortType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A80A2A43E9F00062D161 /* CommentSortType.swift */; }; CDE6A80D2A45EAB30062D161 /* Embedded Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A80C2A45EAB30062D161 /* Embedded Post.swift */; }; - CDE6A8162A490AE00062D161 /* InboxMessageBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A8152A490AE00062D161 /* InboxMessageBodyView.swift */; }; CDE6A8182A490AF20062D161 /* InboxMentionBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A8172A490AF20062D161 /* InboxMentionBodyView.swift */; }; - CDE6A81A2A490B970062D161 /* Inbox ReplyBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A8192A490B970062D161 /* Inbox ReplyBodyView.swift */; }; + CDE6A81A2A490B970062D161 /* InboxReplyBodyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE6A8192A490B970062D161 /* InboxReplyBodyView.swift */; }; CDE9CE4C2A7B0831002B97DD /* Gentle Info.ahap in Resources */ = {isa = PBXBuildFile; fileRef = CDE9CE4B2A7B0831002B97DD /* Gentle Info.ahap */; }; CDE9CE4F2A7B0B1B002B97DD /* Haptic.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE9CE4E2A7B0B1B002B97DD /* Haptic.swift */; }; CDE9CE512A7B0C66002B97DD /* Light Success.ahap in Resources */ = {isa = PBXBuildFile; fileRef = CDE9CE502A7B0C66002B97DD /* Light Success.ahap */; }; @@ -548,7 +711,7 @@ E49F0E762A90395400BC4EE3 /* NavigationPath+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E49F0E752A90395400BC4EE3 /* NavigationPath+Helpers.swift */; }; E4A7BFD12B35912500B95F56 /* InboxMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4A7BFD02B35912500B95F56 /* InboxMessageView.swift */; }; E4A7BFD32B35913F00B95F56 /* InboxMentionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4A7BFD22B35913F00B95F56 /* InboxMentionView.swift */; }; - E4D4DBA02A7C7B9D00C4F3DE /* Comments.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4D4DB9F2A7C7B9D00C4F3DE /* Comments.swift */; }; + E4D4DBA02A7C7B9D00C4F3DE /* Animations.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4D4DB9F2A7C7B9D00C4F3DE /* Animations.swift */; }; E4DDB4322A81819300B3A7E0 /* Double+MaxZIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4DDB4312A81819300B3A7E0 /* Double+MaxZIndex.swift */; }; E4DDB4342A819C8000B3A7E0 /* QuickLookView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4DDB4332A819C8000B3A7E0 /* QuickLookView.swift */; }; E4F0B56F2ABD00A000BC3E4A /* View+PresentationBackgroundInteraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4F0B56E2ABD00A000BC3E4A /* View+PresentationBackgroundInteraction.swift */; }; @@ -573,6 +736,13 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0300F2C52B9C7D4B0022F7C4 /* CloseButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButtonView.swift; sourceTree = ""; }; + 030245BF2BA607EA00D07747 /* FeedToolbarContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedToolbarContent.swift; sourceTree = ""; }; + 030245C12BA60A2600D07747 /* ToolbarEllipsisMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarEllipsisMenu.swift; sourceTree = ""; }; + 030245C32BA6123A00D07747 /* RemoveCommunityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveCommunityView.swift; sourceTree = ""; }; + 030245C52BA6138100D07747 /* RemoveCommunityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveCommunityRequest.swift; sourceTree = ""; }; + 030245C72BA617FE00D07747 /* PurgeCommunityRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgeCommunityRequest.swift; sourceTree = ""; }; + 030245C92BA70F5200D07747 /* LinksSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinksSettingsView.swift; sourceTree = ""; }; 0304F5892B44AF5B00537BFA /* CollapsibleSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsibleSection.swift; sourceTree = ""; }; 0308E1132B0EA32A000CA955 /* AccountSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSettingsView.swift; sourceTree = ""; }; 0308E1152B0EA42B000CA955 /* APILocalUserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APILocalUserView.swift; sourceTree = ""; }; @@ -592,6 +762,8 @@ 030E86452AC6FC1B000283A6 /* DefaultTextInputType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultTextInputType.swift; sourceTree = ""; }; 030E86472AC6FD1D000283A6 /* _assignIfNotEqual.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _assignIfNotEqual.swift; sourceTree = ""; }; 030E864B2AC7037F000283A6 /* SearchBarExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarExtensions.swift; sourceTree = ""; }; + 030FF6852BCB218000F6BFAC /* Int+Abbreviated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Abbreviated.swift"; sourceTree = ""; }; + 030FF6872BCEE58900F6BFAC /* BlockInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockInstance.swift; sourceTree = ""; }; 0317D46E2B558CB500EEE72C /* BadgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeView.swift; sourceTree = ""; }; 0317D4702B55AE0700EEE72C /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; 031A617B2B1BDFD100ABF23B /* AdvancedAccountSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedAccountSettingsView.swift; sourceTree = ""; }; @@ -606,12 +778,15 @@ 032C1E032B5D7DAC00FB4F23 /* QuickSwitcherSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSwitcherSettingsView.swift; sourceTree = ""; }; 032C1E052B5DBDB100FB4F23 /* LocalAccountSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalAccountSettingsView.swift; sourceTree = ""; }; 032DD2FC2AC3594B00F1B33D /* LinkAttatchmentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkAttatchmentView.swift; sourceTree = ""; }; + 033EC0AE2BD3030A00AA238F /* BlockListView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlockListView+Logic.swift"; sourceTree = ""; }; 034C724E2A82B61200B8A4B8 /* LayoutWidgetTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutWidgetTracker.swift; sourceTree = ""; }; + 0355A1DD2BB1F12500D54F9F /* ModerationSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModerationSettingsView.swift; sourceTree = ""; }; 0355DA4C2B5EB51900CDF5A5 /* InstanceModel+ContentModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InstanceModel+ContentModel.swift"; sourceTree = ""; }; 0355DA4E2B5EB63600CDF5A5 /* InstanceStub.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceStub.swift; sourceTree = ""; }; 0355DA502B5EB87700CDF5A5 /* InstanceResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceResultView.swift; sourceTree = ""; }; 035EB0C92A8687C200227859 /* JumpButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JumpButtonView.swift; sourceTree = ""; }; 036ED3BB2ABF1058009664BC /* SearchModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchModel.swift; sourceTree = ""; }; + 038142F12BB46FFF00856C9B /* CommentItem+MenuFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommentItem+MenuFunctions.swift"; sourceTree = ""; }; 038A16DE2A75172C0087987E /* LayoutWidgetEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutWidgetEditView.swift; sourceTree = ""; }; 038A16E02A75AA880087987E /* LayoutWidgetModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutWidgetModel.swift; sourceTree = ""; }; 038A16E42A7A97380087987E /* LayoutWidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutWidgetView.swift; sourceTree = ""; }; @@ -620,6 +795,13 @@ 0394398E2A98EB2300463032 /* APIComment+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIComment+Mock.swift"; sourceTree = ""; }; 039439902A98FA6100463032 /* UserFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFeedView.swift; sourceTree = ""; }; 039439922A99098900463032 /* InternetConnectionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternetConnectionManager.swift; sourceTree = ""; }; + 039B4FE82BD2D81D00E42114 /* BlockListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockListView.swift; sourceTree = ""; }; + 039C59A62BADA04100C18765 /* RemoveCommentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveCommentView.swift; sourceTree = ""; }; + 039C59A82BADA5DA00C18765 /* PurgeCommentRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgeCommentRequest.swift; sourceTree = ""; }; + 039C59AA2BADC85400C18765 /* RemoveCommentRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveCommentRequest.swift; sourceTree = ""; }; + 039C59AC2BADFF6200C18765 /* ListPostLikesRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListPostLikesRequest.swift; sourceTree = ""; }; + 039C59AE2BAE029300C18765 /* VotesListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotesListView.swift; sourceTree = ""; }; + 039C59B02BAF272E00C18765 /* VotesTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotesTracker.swift; sourceTree = ""; }; 039C8DB62B35A32D0096BAAF /* AccountSwitcherSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSwitcherSettingsView.swift; sourceTree = ""; }; 039C8DB82B35A81C0096BAAF /* AccountIconStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountIconStack.swift; sourceTree = ""; }; 039C8DBA2B35B2EB0096BAAF /* AccountListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountListView.swift; sourceTree = ""; }; @@ -635,17 +817,32 @@ 03A276782AFD903600C0D66B /* CommunityModel+MenuFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommunityModel+MenuFunctions.swift"; sourceTree = ""; }; 03A2767A2AFE560000C0D66B /* CommunityModel+SwipeActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommunityModel+SwipeActions.swift"; sourceTree = ""; }; 03A2767C2AFE656700C0D66B /* UserModel+MenuFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserModel+MenuFunctions.swift"; sourceTree = ""; }; + 03A4330A2B6FB2C10004E743 /* FediseerOpinionListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FediseerOpinionListView.swift; sourceTree = ""; }; + 03A4330C2B6FC0940004E743 /* FediseerInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FediseerInfoView.swift; sourceTree = ""; }; + 03A4330E2B7186C20004E743 /* WebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebView.swift; sourceTree = ""; }; 03A54C312B5331F30064CCDE /* InstanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceView.swift; sourceTree = ""; }; 03A54C342B533BC50064CCDE /* InstanceModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceModel.swift; sourceTree = ""; }; 03A54C362B545A430064CCDE /* InstanceModel+MenuFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InstanceModel+MenuFunctions.swift"; sourceTree = ""; }; + 03AFBEA22B6EA86B00F01F3C /* SiteResponse+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SiteResponse+Mock.swift"; sourceTree = ""; }; + 03AFBEA42B6EA90400F01F3C /* APIPersonView+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIPersonView+Mock.swift"; sourceTree = ""; }; + 03AFBEA62B6EA94900F01F3C /* APIPersonAggregates+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIPersonAggregates+Mock.swift"; sourceTree = ""; }; + 03AFBEA82B6EA9BC00F01F3C /* APISiteView+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APISiteView+Mock.swift"; sourceTree = ""; }; + 03AFBEAA2B6EAA0C00F01F3C /* APILocalSite+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APILocalSite+Mock.swift"; sourceTree = ""; }; + 03AFBEAC2B6EAAF000F01F3C /* APILocalSiteRateLimit+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APILocalSiteRateLimit+Mock.swift"; sourceTree = ""; }; + 03AFBEAE2B6EAB9C00F01F3C /* APISiteAggregates+Mock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APISiteAggregates+Mock.swift"; sourceTree = ""; }; + 03AFBEB02B6EAD5B00F01F3C /* InstanceSafetyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceSafetyView.swift; sourceTree = ""; }; + 03AFBEB22B6EB8B800F01F3C /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = ""; }; 03B15BEC2B55CBBB00E7C30A /* MarkdownTheme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkdownTheme.swift; sourceTree = ""; }; 03B643562A6864CD00F65700 /* TabBarSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarSettingsView.swift; sourceTree = ""; }; 03B7AAEE2ABCB9DC00068B23 /* ContentTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentTracker.swift; sourceTree = ""; }; 03B7AAF02ABE404300068B23 /* ContentModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentModel.swift; sourceTree = ""; }; 03B7AAF22ABEF85200068B23 /* UserModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserModel.swift; sourceTree = ""; }; - 03B7AAF42ABEFA7A00068B23 /* UserResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserResultView.swift; sourceTree = ""; }; + 03B7AAF42ABEFA7A00068B23 /* UserListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListRow.swift; sourceTree = ""; }; + 03B85A3B2BB34D1F003C4203 /* PurgeContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgeContentView.swift; sourceTree = ""; }; + 03B85A3D2BB36C4B003C4203 /* UserRemovalWalker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserRemovalWalker.swift; sourceTree = ""; }; + 03B85A3F2BB38868003C4203 /* PostEllipsisMenus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostEllipsisMenus.swift; sourceTree = ""; }; 03BAA2392A57DC1400D48252 /* PublishedTimestampView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublishedTimestampView.swift; sourceTree = ""; }; - 03C897F52ABF49BD005F3403 /* Abbreviate Numbers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Abbreviate Numbers.swift"; sourceTree = ""; }; + 03C194072BA25B5200B00349 /* ProgressOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressOverlayView.swift; sourceTree = ""; }; 03C897F72ABF652D005F3403 /* SearchRoot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRoot.swift; sourceTree = ""; }; 03C898002AC04EF9005F3403 /* SearchResultsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultsView.swift; sourceTree = ""; }; 03C898022AC04F61005F3403 /* RecentSearchesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecentSearchesView.swift; sourceTree = ""; }; @@ -653,10 +850,20 @@ 03C905C92B3C834C00B9082F /* AvatarBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarBannerView.swift; sourceTree = ""; }; 03C905CB2B3C88F700B9082F /* SearchTab.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTab.swift; sourceTree = ""; }; 03C905CD2B3C8DC400B9082F /* UserView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserView+Logic.swift"; sourceTree = ""; }; + 03C942912B6457B4002068A4 /* BanUserEditorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BanUserEditorModel.swift; sourceTree = ""; }; + 03C942952B648252002068A4 /* BanPerson.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BanPerson.swift; sourceTree = ""; }; 03CB329D2A6D8E910021EF27 /* PostComposerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostComposerView.swift; sourceTree = ""; }; + 03CEE04A2B6EB9CD00D65B1B /* Fediseer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Fediseer.swift; sourceTree = ""; }; + 03CEE04C2B6EBEA800D65B1B /* InstanceView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InstanceView+Logic.swift"; sourceTree = ""; }; + 03CEE04E2B6ECFFC00D65B1B /* FediseerOpinionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FediseerOpinionView.swift; sourceTree = ""; }; + 03CEE0502B6EED2C00D65B1B /* Array+IsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+IsNotEmpty.swift"; sourceTree = ""; }; + 03D89E712BB1BB0100F49DB3 /* ListCommentLikesRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCommentLikesRequest.swift; sourceTree = ""; }; 03E0B9C72A61F0F400FED265 /* AdvancedSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsView.swift; sourceTree = ""; }; 03E0B9C92A62B4A400FED265 /* ContributorsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContributorsView.swift; sourceTree = ""; }; 03E0B9CB2A62CD5800FED265 /* ThemeSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsView.swift; sourceTree = ""; }; + 03E47AEA2B66BADC00A3E4DB /* UptimeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UptimeData.swift; sourceTree = ""; }; + 03E47AEC2B66BC0000A3E4DB /* InstanceUptimeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceUptimeView.swift; sourceTree = ""; }; + 03E47AEE2B66BD3C00A3E4DB /* InstanceModel+Uptime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InstanceModel+Uptime.swift"; sourceTree = ""; }; 03E79F3E2AE3E7100006700D /* SortingSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortingSettingsView.swift; sourceTree = ""; }; 03E90FB02B3703ED00E5A802 /* AccountSortMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSortMode.swift; sourceTree = ""; }; 03EA79C32AC0D92C00BCDC91 /* PostComposerView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostComposerView+Logic.swift"; sourceTree = ""; }; @@ -664,13 +871,19 @@ 03EC92962AC069CE007BBE7E /* SearchResultListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultListView.swift; sourceTree = ""; }; 03EC92982AC0BF8A007BBE7E /* APIClient+Pictrs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIClient+Pictrs.swift"; sourceTree = ""; }; 03ED5D5E2B6560FE005C245B /* PostModel+MenuFunctions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostModel+MenuFunctions.swift"; sourceTree = ""; }; - 03EEEAF22AB8DCDF0087F8D8 /* CommunityResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityResultView.swift; sourceTree = ""; }; + 03EEEAF22AB8DCDF0087F8D8 /* CommunityListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListRow.swift; sourceTree = ""; }; 03EEEAF62AB8ED3C0087F8D8 /* BubblePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BubblePicker.swift; sourceTree = ""; }; 03EEEAF82ABB985D0087F8D8 /* CommunityModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityModel.swift; sourceTree = ""; }; 03EF1D0B2B434CB10056175C /* CommunityDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityDetailsView.swift; sourceTree = ""; }; + 03F0DF532B9D129D0018F239 /* BanUserView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BanUserView+Logic.swift"; sourceTree = ""; }; + 03F0DF552B9E0E210018F239 /* PurgePostRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgePostRequest.swift; sourceTree = ""; }; + 03F0DF572B9E24EF0018F239 /* PurgePersonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgePersonRequest.swift; sourceTree = ""; }; + 03F0DF592B9E28F30018F239 /* InstanceLabelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstanceLabelView.swift; sourceTree = ""; }; 03F4DC9C2B193F4C00556C67 /* MatrixLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatrixLinkView.swift; sourceTree = ""; }; 03F4DC9E2B1A8AD500556C67 /* SignInAndSecuritySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInAndSecuritySettingsView.swift; sourceTree = ""; }; 03F4DCA22B1A8B0400556C67 /* AccountGeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountGeneralSettingsView.swift; sourceTree = ""; }; + 03F6D4BA2B952738008235A0 /* SelectTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTextView.swift; sourceTree = ""; }; + 03F6D4BC2B966D53008235A0 /* BodyEditorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BodyEditorView.swift; sourceTree = ""; }; 03F76F9F2B2F5EF900E2B54A /* LinkAttachmentModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkAttachmentModel.swift; sourceTree = ""; }; 03F76FA12B2F5F1100E2B54A /* LinkAttachmentProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkAttachmentProxy.swift; sourceTree = ""; }; 03F76FA32B2F5F3500E2B54A /* UploadProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadProgressView.swift; sourceTree = ""; }; @@ -687,7 +900,6 @@ 504ECBAD2AB45B2A006C0B96 /* LemmyURL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LemmyURL.swift; sourceTree = ""; }; 504ECBB02AB4B101006C0B96 /* LemmyURLTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LemmyURLTests.swift; sourceTree = ""; }; 505240E22A86916500EA4558 /* FavoriteCommunitiesTracker+Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FavoriteCommunitiesTracker+Dependency.swift"; sourceTree = ""; }; - 505240E42A86E32700EA4558 /* CommunityListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListModel.swift; sourceTree = ""; }; 505240E62A88D36D00EA4558 /* SectionIndexTitles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionIndexTitles.swift; sourceTree = ""; }; 5064D03C2A6DE0AA00B22EE3 /* Notifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notifier.swift; sourceTree = ""; }; 5064D03E2A6DE0DB00B22EE3 /* Notifier+Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Notifier+Dependency.swift"; sourceTree = ""; }; @@ -864,7 +1076,6 @@ 6DCE71282A53C26600CFEB5E /* ServerInstanceLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerInstanceLocation.swift; sourceTree = ""; }; 6DE118382A4A20D600810C7E /* Lazy Load Post Link.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Lazy Load Post Link.swift"; sourceTree = ""; }; 6DE1183B2A4A217400810C7E /* Profile View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Profile View.swift"; sourceTree = ""; }; - 6DFF50422A48DED3001E648D /* Inbox View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Inbox View.swift"; sourceTree = ""; }; 6DFF50442A48E373001E648D /* GetPrivateMessages.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetPrivateMessages.swift; sourceTree = ""; }; 6FB4A4DD2B47860B00A7CD82 /* CollapsedCommentReplies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollapsedCommentReplies.swift; sourceTree = ""; }; 6FF17D002B685C16007E1814 /* AppLockView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppLockView.swift; sourceTree = ""; }; @@ -898,6 +1109,10 @@ CD05E7782A4E381A0081D102 /* PostSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostSize.swift; sourceTree = ""; }; CD05E77E2A4F263B0081D102 /* Menu Function.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Menu Function.swift"; sourceTree = ""; }; CD0BE42E2A65A73600314B24 /* Haptic Manager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Haptic Manager.swift"; sourceTree = ""; }; + CD0D5A422B8EC4DA005E3365 /* RemovePostRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemovePostRequest.swift; sourceTree = ""; }; + CD0D5A442B8EC5D9005E3365 /* RemovePostView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemovePostView.swift; sourceTree = ""; }; + CD0D5A472B8EC6F3005E3365 /* ReasonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReasonView.swift; sourceTree = ""; }; + CD0D5A492B8ED320005E3365 /* BanFormButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BanFormButtonStyle.swift; sourceTree = ""; }; CD1262792B4759BC007549F9 /* StandardPostTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardPostTracker.swift; sourceTree = ""; }; CD12627B2B475A80007549F9 /* README - Generic Trackers.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "README - Generic Trackers.md"; sourceTree = ""; }; CD12627C2B475E45007549F9 /* PostModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostModel+TrackerItem.swift"; sourceTree = ""; }; @@ -912,8 +1127,12 @@ CD16A0632B66F81A000312D2 /* UserContentModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserContentModel+TrackerItem.swift"; sourceTree = ""; }; CD16A0652B670039000312D2 /* HierarchicalComment+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HierarchicalComment+TrackerItem.swift"; sourceTree = ""; }; CD16A0672B670327000312D2 /* UserContentFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserContentFeedView.swift; sourceTree = ""; }; - CD16A0692B670ABE000312D2 /* UserContentFeedView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserContentFeedView+Logic.swift"; sourceTree = ""; }; CD16A06B2B674ABF000312D2 /* FeedHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedHeaderView.swift; sourceTree = ""; }; + CD17C1D82BA2660300A0C8BC /* ModlogNavigationLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogNavigationLinkView.swift; sourceTree = ""; }; + CD17C1DA2BA358FD00A0C8BC /* ModlogTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogTracker.swift; sourceTree = ""; }; + CD17C1DC2BA3596000A0C8BC /* ModlogEntry+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ModlogEntry+TrackerItem.swift"; sourceTree = ""; }; + CD17C1E52BA369C700A0C8BC /* ModlogChildTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogChildTracker.swift; sourceTree = ""; }; + CD17C1E92BA3997000A0C8BC /* TrackerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrackerProtocol.swift; sourceTree = ""; }; CD18243F2AA8E24100D9BEB5 /* View+DestructiveConfirmation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+DestructiveConfirmation.swift"; sourceTree = ""; }; CD18DC6A2A5202D4002C56BC /* MarkPersonMentionAsReadRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkPersonMentionAsReadRequest.swift; sourceTree = ""; }; CD18DC6E2A5209C3002C56BC /* MarkPrivateMessageAsReadRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkPrivateMessageAsReadRequest.swift; sourceTree = ""; }; @@ -922,6 +1141,41 @@ CD2053112ACB72190000AA38 /* AccountTransitionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountTransitionView.swift; sourceTree = ""; }; CD2053132ACBAF150000AA38 /* AvatarType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarType.swift; sourceTree = ""; }; CD2053162ACBBB5A0000AA38 /* DefaultAvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultAvatarView.swift; sourceTree = ""; }; + CD268C102B9A3CB30074DBEE /* SimpleCommunitySearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleCommunitySearchView.swift; sourceTree = ""; }; + CD268C132B9A3DD80074DBEE /* CommunityListRowBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListRowBody.swift; sourceTree = ""; }; + CD2697E22B9E13B70002B459 /* ModlogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogView.swift; sourceTree = ""; }; + CD2697E42B9E14FB0002B459 /* GetModlogRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetModlogRequest.swift; sourceTree = ""; }; + CD2697E72B9E15580002B459 /* APIModRemovePostView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemovePostView.swift; sourceTree = ""; }; + CD2697E92B9E15610002B459 /* APIModLockPostView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModLockPostView.swift; sourceTree = ""; }; + CD2697EB2B9E156D0002B459 /* APIModFeaturePostView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModFeaturePostView.swift; sourceTree = ""; }; + CD2697ED2B9E15740002B459 /* APIModRemoveCommentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemoveCommentView.swift; sourceTree = ""; }; + CD2697EF2B9E157E0002B459 /* APIModBanFromCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModBanFromCommunityView.swift; sourceTree = ""; }; + CD2697F12B9E15860002B459 /* APIModRemoveCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemoveCommunityView.swift; sourceTree = ""; }; + CD2697F32B9E158E0002B459 /* APIModBanView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModBanView.swift; sourceTree = ""; }; + CD2697F52B9E15A60002B459 /* APIModAddCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModAddCommunityView.swift; sourceTree = ""; }; + CD2697F72B9E15AD0002B459 /* APIModTransferCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModTransferCommunityView.swift; sourceTree = ""; }; + CD2697F92B9E15B90002B459 /* APIModAddView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModAddView.swift; sourceTree = ""; }; + CD2697FB2B9E15C10002B459 /* APIAdminPurgePersonView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgePersonView.swift; sourceTree = ""; }; + CD2697FD2B9E15C80002B459 /* APIAdminPurgeCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgeCommunityView.swift; sourceTree = ""; }; + CD2697FF2B9E15CF0002B459 /* APIAdminPurgePostView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgePostView.swift; sourceTree = ""; }; + CD2698012B9E15D60002B459 /* APIAdminPurgeCommentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgeCommentView.swift; sourceTree = ""; }; + CD2698032B9E15E50002B459 /* APIModHideCommunityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModHideCommunityView.swift; sourceTree = ""; }; + CD2698052B9E15F10002B459 /* APIModlogActionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModlogActionType.swift; sourceTree = ""; }; + CD2698072B9E162A0002B459 /* APIModRemovePost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemovePost.swift; sourceTree = ""; }; + CD2698092B9E166D0002B459 /* APIModLockPost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModLockPost.swift; sourceTree = ""; }; + CD26980B2B9E16810002B459 /* APIModRemoveComment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemoveComment.swift; sourceTree = ""; }; + CD26980D2B9E16A70002B459 /* APIModFeaturePost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModFeaturePost.swift; sourceTree = ""; }; + CD26980F2B9E174C0002B459 /* APIModBanFromCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModBanFromCommunity.swift; sourceTree = ""; }; + CD2698112B9E17660002B459 /* APIModRemoveCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModRemoveCommunity.swift; sourceTree = ""; }; + CD2698142B9E17AD0002B459 /* APIModBan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModBan.swift; sourceTree = ""; }; + CD2698162B9E17C60002B459 /* APIModAddCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModAddCommunity.swift; sourceTree = ""; }; + CD2698182B9E17DE0002B459 /* APIModTransferCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModTransferCommunity.swift; sourceTree = ""; }; + CD26981A2B9E17F70002B459 /* APIModAdd.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIModAdd.swift; sourceTree = ""; }; + CD26981C2B9E18090002B459 /* APIAdminPurgePerson.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgePerson.swift; sourceTree = ""; }; + CD26981E2B9E181D0002B459 /* APIAdminPurgeCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgeCommunity.swift; sourceTree = ""; }; + CD2698202B9E18350002B459 /* APIAdminPurgePost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgePost.swift; sourceTree = ""; }; + CD2698222B9E18450002B459 /* APIAdminPurgeComment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIAdminPurgeComment.swift; sourceTree = ""; }; + CD2698242B9E18760002B459 /* ApiModHideCommunity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiModHideCommunity.swift; sourceTree = ""; }; CD29ED362B2E85EA006937CE /* String+Alphabet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Alphabet.swift"; sourceTree = ""; }; CD29ED382B2E860C006937CE /* String+Trimmed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Trimmed.swift"; sourceTree = ""; }; CD29ED3A2B2E8624006937CE /* String+IsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+IsNotEmpty.swift"; sourceTree = ""; }; @@ -929,6 +1183,10 @@ CD29ED402B2E867C006937CE /* UIApplication+TopMostViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+TopMostViewController.swift"; sourceTree = ""; }; CD29ED462B2E8785006937CE /* EnvironmentValues+NavigationPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+NavigationPath.swift"; sourceTree = ""; }; CD2BD6772A79F55800ECFF89 /* ImageSize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageSize.swift; sourceTree = ""; }; + CD2BFE732B9F5BE800717611 /* ModlogEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogEntry.swift; sourceTree = ""; }; + CD2BFE772B9F60AC00717611 /* APIClient+Instance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIClient+Instance.swift"; sourceTree = ""; }; + CD2BFE7D2B9F670B00717611 /* ModlogEntryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogEntryView.swift; sourceTree = ""; }; + CD2BFE812B9FA05300717611 /* ModlogLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogLink.swift; sourceTree = ""; }; CD2E182A2A3B708500224F8A /* Settings Options.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Settings Options.swift"; sourceTree = ""; }; CD309C452A93FBD300988F95 /* Logo View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Logo View.swift"; sourceTree = ""; }; CD3720EB2B2E8F96004D7103 /* AlternativeIconCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlternativeIconCell.swift; sourceTree = ""; }; @@ -942,10 +1200,6 @@ CD391F9D2A539F1800E213B5 /* ReplyToMention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyToMention.swift; sourceTree = ""; }; CD391F9F2A545F8600E213B5 /* Compact Post.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Compact Post.swift"; sourceTree = ""; }; CD3FBCDC2A4A6F0600B2063F /* GetReplies.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetReplies.swift; sourceTree = ""; }; - CD3FBCE02A4A836000B2063F /* AllItemsFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllItemsFeedView.swift; sourceTree = ""; }; - CD3FBCE22A4A844800B2063F /* Replies Feed View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Replies Feed View.swift"; sourceTree = ""; }; - CD3FBCE42A4A89B900B2063F /* Mentions Feed View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Mentions Feed View.swift"; sourceTree = ""; }; - CD3FBCE62A4A8CE300B2063F /* Messages Feed View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Messages Feed View.swift"; sourceTree = ""; }; CD3FBCE82A4B482700B2063F /* Generic Merge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Generic Merge.swift"; sourceTree = ""; }; CD4368AD2AE23ED400BD8BD1 /* StandardTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardTracker.swift; sourceTree = ""; }; CD4368AF2AE23F1400BD8BD1 /* ChildTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildTracker.swift; sourceTree = ""; }; @@ -968,16 +1222,24 @@ CD4368D82AE2478300BD8BD1 /* MentionModel+InboxItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MentionModel+InboxItem.swift"; sourceTree = ""; }; CD4368DA2AE247B700BD8BD1 /* MentionTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MentionTracker.swift; sourceTree = ""; }; CD4368DC2AE24E1A00BD8BD1 /* InboxView+Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InboxView+Logic.swift"; sourceTree = ""; }; + CD436F282BD325CB001711B9 /* String+StrippingDiacritics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+StrippingDiacritics.swift"; sourceTree = ""; }; CD45BCED2A75CA7200A2899C /* Thumbnail Image View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Thumbnail Image View.swift"; sourceTree = ""; }; CD46C1F52B0D0A5700065953 /* EnvironmentValues+TabReselectionHashValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+TabReselectionHashValue.swift"; sourceTree = ""; }; CD46C1F72B0D0A8A00065953 /* View+ReselectAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+ReselectAction.swift"; sourceTree = ""; }; CD4BAD342B4B2C0B00A1E726 /* FeedsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedsView.swift; sourceTree = ""; }; CD4BAD3A2B4C6C3200A1E726 /* FeedRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedRowView.swift; sourceTree = ""; }; - CD4BAD3C2B4C6C8E00A1E726 /* FeedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedType.swift; sourceTree = ""; }; + CD4BAD3C2B4C6C8E00A1E726 /* PostFeedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostFeedType.swift; sourceTree = ""; }; CD4BAD422B507F2B00A1E726 /* AggregateFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AggregateFeedView.swift; sourceTree = ""; }; CD4DBC022A6F803C001A1E61 /* ReplyToPost.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyToPost.swift; sourceTree = ""; }; + CD4DD9D92BABABB000085D41 /* InboxRoot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxRoot.swift; sourceTree = ""; }; + CD50504C2B80065300632C56 /* Date+DaysFromNow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+DaysFromNow.swift"; sourceTree = ""; }; + CD5050532B807BF800632C56 /* AddModToCommunity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddModToCommunity.swift; sourceTree = ""; }; CD525F642A4B6D8F00BCA794 /* CommunityLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityLinkView.swift; sourceTree = ""; }; + CD55FE252B97F37A0020EE24 /* AddModView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddModView.swift; sourceTree = ""; }; + CD55FE272B9A28D00020EE24 /* SimpleUserSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleUserSearchView.swift; sourceTree = ""; }; CD59E8A42A72C943005757F4 /* MarkAllAsReadRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkAllAsReadRequest.swift; sourceTree = ""; }; + CD5BB8162BADF7700027398F /* ChildSizeReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildSizeReader.swift; sourceTree = ""; }; + CD5F76BB2B75BE700013A827 /* MarkReadBatcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkReadBatcher.swift; sourceTree = ""; }; CD64832F2A38D31C00EE6CA3 /* UpvoteCounterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpvoteCounterView.swift; sourceTree = ""; }; CD6483312A38D3A600EE6CA3 /* ScoreCounterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScoreCounterView.swift; sourceTree = ""; }; CD6483352A39F20800EE6CA3 /* Post Type.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Post Type.swift"; sourceTree = ""; }; @@ -994,6 +1256,7 @@ CD6F29A72A77FF1700F20B6B /* MarkPostRead.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkPostRead.swift; sourceTree = ""; }; CD6F29A92A78003A00F20B6B /* PostRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostRepository.swift; sourceTree = ""; }; CD6F29AB2A78015200F20B6B /* PostRepository+Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostRepository+Dependency.swift"; sourceTree = ""; }; + CD7798A52BB0E5B50067DF82 /* InboxView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxView.swift; sourceTree = ""; }; CD7B53B42A5F251400006E81 /* CreatePrivateMessageReportRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreatePrivateMessageReportRequest.swift; sourceTree = ""; }; CD7B53B62A5F258B00006E81 /* APIPrivateMessageReportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIPrivateMessageReportView.swift; sourceTree = ""; }; CD7B53B82A5F263D00006E81 /* APIPrivateMessageReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIPrivateMessageReport.swift; sourceTree = ""; }; @@ -1003,11 +1266,13 @@ CD82A2542A716C7C00111034 /* APIPersonUnreadCounts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIPersonUnreadCounts.swift; sourceTree = ""; }; CD82A2562A716D7C00111034 /* PersonRepository+Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PersonRepository+Dependency.swift"; sourceTree = ""; }; CD82A2582A71775E00111034 /* UnreadTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadTracker.swift; sourceTree = ""; }; - CD8461652A96F9EB0026A627 /* Website Indicator View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Website Indicator View.swift"; sourceTree = ""; }; CD863FB92A6AEB5900A31ED9 /* View+FancyTabScrollCompatible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+FancyTabScrollCompatible.swift"; sourceTree = ""; }; CD863FBB2A6B026400A31ED9 /* DocumentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DocumentView.swift; sourceTree = ""; }; + CD876EC62B7736370075DC15 /* MarkReadBatcher+Dependency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MarkReadBatcher+Dependency.swift"; sourceTree = ""; }; + CD88B8FB2BDD4B4D0026A6C8 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; CD8C55332A95515C0060B75B /* Onboarding Text.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Onboarding Text.swift"; sourceTree = ""; }; CD8CF2082AF3F131009FFC23 /* Firm Info.ahap */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Firm Info.ahap"; sourceTree = ""; }; + CD9395262BA7CF92008F6C4C /* ModlogAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModlogAction.swift; sourceTree = ""; }; CD963FCA2B5F0388002352FD /* DefaultFeedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFeedType.swift; sourceTree = ""; }; CD9A03C52B34D20500C16276 /* EnvironmentValues+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+Navigation.swift"; sourceTree = ""; }; CD9A03C72B389F7000C16276 /* EnvironmentValues+FeedType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+FeedType.swift"; sourceTree = ""; }; @@ -1018,6 +1283,9 @@ CD9DD8822A622A6C0044EA8E /* ReportCommentReply.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportCommentReply.swift; sourceTree = ""; }; CD9DD8842A62302A0044EA8E /* ConcreteEditorModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcreteEditorModel.swift; sourceTree = ""; }; CDA145EC2A510AC100DDAFC9 /* MarkCommentReplyAsReadRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkCommentReplyAsReadRequest.swift; sourceTree = ""; }; + CDA1E84C2B93FC7C007953EF /* BanUserView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BanUserView.swift; sourceTree = ""; }; + CDA1E84E2B93FF83007953EF /* RemovedTag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemovedTag.swift; sourceTree = ""; }; + CDA1E8502B940390007953EF /* LockedTag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockedTag.swift; sourceTree = ""; }; CDA217E32A62FB3300BDA173 /* ReplyToMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyToMessage.swift; sourceTree = ""; }; CDA217E52A63016A00BDA173 /* ReportMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportMessage.swift; sourceTree = ""; }; CDA217E72A63029B00BDA173 /* ReportMention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportMention.swift; sourceTree = ""; }; @@ -1033,12 +1301,20 @@ CDB45C5F2AF1AF4900A1FF08 /* MentionModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MentionModel+TrackerItem.swift"; sourceTree = ""; }; CDB45C612AF1AF9B00A1FF08 /* ReplyModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ReplyModel+TrackerItem.swift"; sourceTree = ""; }; CDB45C632AF1AFB900A1FF08 /* MessageModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageModel+TrackerItem.swift"; sourceTree = ""; }; + CDB652522B8EABFC007B7797 /* FeaturePostRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeaturePostRequest.swift; sourceTree = ""; }; + CDB652542B8EAC3E007B7797 /* APIPostFeatureType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIPostFeatureType.swift; sourceTree = ""; }; + CDB652562B8EAE15007B7797 /* APIPostResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIPostResponse.swift; sourceTree = ""; }; + CDB652582B8EC024007B7797 /* LockPostRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LockPostRequest.swift; sourceTree = ""; }; + CDBA5FC52BC9C58300469C05 /* GetUnreadRegistrationApplicationCountRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetUnreadRegistrationApplicationCountRequest.swift; sourceTree = ""; }; + CDBA5FC72BCC477F00469C05 /* WarningView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WarningView.swift; sourceTree = ""; }; + CDBA5FC92BD17F3D00469C05 /* CommunityListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListModel.swift; sourceTree = ""; }; CDBCBA1F2B537A4B0070F60D /* PostFeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostFeedView.swift; sourceTree = ""; }; CDBCBA232B54A5F40070F60D /* NoPostsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoPostsView.swift; sourceTree = ""; }; CDC1C93B2A7AA76000072E3D /* InternetSpeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternetSpeed.swift; sourceTree = ""; }; CDC1C93E2A7AB8C700072E3D /* AccessibilitySettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilitySettingsView.swift; sourceTree = ""; }; CDC1C9402A7ABA9C00072E3D /* ReadMarkStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadMarkStyle.swift; sourceTree = ""; }; CDC1C9422A7AC24600072E3D /* ReadCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadCheck.swift; sourceTree = ""; }; + CDC24EA52BC9B352009AA6D1 /* GetReportCountRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetReportCountRequest.swift; sourceTree = ""; }; CDC3E7FF2AEAFEAF008062CA /* InboxTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxTracker.swift; sourceTree = ""; }; CDC65D8E2A86B6DD007205E5 /* DeleteUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteUser.swift; sourceTree = ""; }; CDC65D902A86B830007205E5 /* DeleteAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteAccountView.swift; sourceTree = ""; }; @@ -1048,6 +1324,57 @@ CDCBD7252A8D69A200387A2C /* Instance Picker View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance Picker View.swift"; sourceTree = ""; }; CDCBD7272A8D6B7700387A2C /* Instance Picker View Logic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance Picker View Logic.swift"; sourceTree = ""; }; CDCBD72A2A8EC0A800387A2C /* Instance Summary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Instance Summary.swift"; sourceTree = ""; }; + CDD0B8AA2BB37B3D003E7174 /* WebsiteIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebsiteIndicatorView.swift; sourceTree = ""; }; + CDD0B8AC2BB4CD7D003E7174 /* CommentReportModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentReportModel.swift; sourceTree = ""; }; + CDD0B8B12BB4D990003E7174 /* CommentReportModel+InboxItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommentReportModel+InboxItem.swift"; sourceTree = ""; }; + CDD0B8B32BB4DAFE003E7174 /* CommentReportModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommentReportModel+TrackerItem.swift"; sourceTree = ""; }; + CDD0B8B52BB4DC12003E7174 /* CommentReportTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentReportTracker.swift; sourceTree = ""; }; + CDD0B8B82BB4E407003E7174 /* ListCommentReportsRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListCommentReportsRequest.swift; sourceTree = ""; }; + CDD0B8BA2BB4E51B003E7174 /* APIClient+Moderation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIClient+Moderation.swift"; sourceTree = ""; }; + CDD0B8BC2BB4F3D3003E7174 /* InboxCommentReportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxCommentReportView.swift; sourceTree = ""; }; + CDD0B8BE2BB5B68F003E7174 /* EmbeddedCommentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmbeddedCommentView.swift; sourceTree = ""; }; + CDD0B8C02BB5BC51003E7174 /* InboxMessageBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMessageBodyView.swift; sourceTree = ""; }; + CDD0B8C22BB5BCFD003E7174 /* InboxCommentReportBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxCommentReportBodyView.swift; sourceTree = ""; }; + CDD0B8C42BB78056003E7174 /* ResolveButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolveButtonView.swift; sourceTree = ""; }; + CDD0B8C62BB78260003E7174 /* RemoveButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveButtonView.swift; sourceTree = ""; }; + CDD0B8C82BB782CF003E7174 /* PurgeButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurgeButtonView.swift; sourceTree = ""; }; + CDD0B8CA2BB7844F003E7174 /* BanButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BanButtonView.swift; sourceTree = ""; }; + CDD0B8CC2BB9E53F003E7174 /* Removable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Removable.swift; sourceTree = ""; }; + CDD0B8CE2BBA0D31003E7174 /* ResolveCommentReportRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolveCommentReportRequest.swift; sourceTree = ""; }; + CDD0B8D22BBB4158003E7174 /* InboxView+Feeds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "InboxView+Feeds.swift"; sourceTree = ""; }; + CDD0B8D42BBB41CB003E7174 /* InboxFeedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxFeedView.swift; sourceTree = ""; }; + CDD0B8D72BBF3C5A003E7174 /* PostReportTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostReportTracker.swift; sourceTree = ""; }; + CDD0B8D92BBF3C87003E7174 /* PostReportModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostReportModel.swift; sourceTree = ""; }; + CDD0B8DB2BBF4238003E7174 /* ListPostReportsRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListPostReportsRequest.swift; sourceTree = ""; }; + CDD0B8DD2BBF4601003E7174 /* PostReportModel+InboxItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostReportModel+InboxItem.swift"; sourceTree = ""; }; + CDD0B8DF2BBF4689003E7174 /* PostReportModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostReportModel+TrackerItem.swift"; sourceTree = ""; }; + CDD0B8E12BBF49DB003E7174 /* InboxPostReportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxPostReportView.swift; sourceTree = ""; }; + CDD0B8E32BBF4D4B003E7174 /* InboxPostReportBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxPostReportBodyView.swift; sourceTree = ""; }; + CDD0B8E52BBF57D9003E7174 /* ResolvePostReportRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvePostReportRequest.swift; sourceTree = ""; }; + CDD0B8E72BBF7C8B003E7174 /* MessageReportTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReportTracker.swift; sourceTree = ""; }; + CDD0B8E92BBF7CAB003E7174 /* MessageReportModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageReportModel.swift; sourceTree = ""; }; + CDD0B8EB2BBF7D0F003E7174 /* ListPrivateMessageReportsRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListPrivateMessageReportsRequest.swift; sourceTree = ""; }; + CDD0B8ED2BBF7F21003E7174 /* MessageReportModel+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReportModel+TrackerItem.swift"; sourceTree = ""; }; + CDD0B8EF2BBF7FB7003E7174 /* MessageReportModel+InboxItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReportModel+InboxItem.swift"; sourceTree = ""; }; + CDD0B8F12BBF8406003E7174 /* InboxMessageReportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMessageReportView.swift; sourceTree = ""; }; + CDD0B8F32BBF843B003E7174 /* InboxMessageReportBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMessageReportBodyView.swift; sourceTree = ""; }; + CDD0B8F52BC064F0003E7174 /* ResolvePrivateMessageReportRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvePrivateMessageReportRequest.swift; sourceTree = ""; }; + CDD0B8F72BC07E6A003E7174 /* ListRegistrationApplicationsRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListRegistrationApplicationsRequest.swift; sourceTree = ""; }; + CDD0B8F92BC07EA9003E7174 /* APIRegistrationApplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRegistrationApplicationView.swift; sourceTree = ""; }; + CDD0B8FB2BC07ED7003E7174 /* APIRegistrationApplication.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIRegistrationApplication.swift; sourceTree = ""; }; + CDD0B8FD2BC07F4B003E7174 /* RegistrationApplicationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationApplicationModel.swift; sourceTree = ""; }; + CDD0B8FF2BC080C7003E7174 /* ApproveRegistrationApplicationRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApproveRegistrationApplicationRequest.swift; sourceTree = ""; }; + CDD0B9012BC084A9003E7174 /* DenyApplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DenyApplicationView.swift; sourceTree = ""; }; + CDD0B9032BC08987003E7174 /* RegistrationApplication+TrackerItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RegistrationApplication+TrackerItem.swift"; sourceTree = ""; }; + CDD0B9052BC089EA003E7174 /* RegistrationApplication+InboxItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "RegistrationApplication+InboxItem.swift"; sourceTree = ""; }; + CDD0B9072BC08A6D003E7174 /* RegistrationApplicationTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegistrationApplicationTracker.swift; sourceTree = ""; }; + CDD0B9092BC08E02003E7174 /* InboxRegistrationApplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxRegistrationApplicationView.swift; sourceTree = ""; }; + CDD0B90B2BC08E21003E7174 /* InboxRegistrationApplicationBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxRegistrationApplicationBodyView.swift; sourceTree = ""; }; + CDD0EF9B2B7D6B9100CA3504 /* ModToolTracker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModToolTracker.swift; sourceTree = ""; }; + CDD0EF9D2B7D6F3E00CA3504 /* ModToolSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModToolSheet.swift; sourceTree = ""; }; + CDD0EFA12B7D9E5800CA3504 /* UserListRowBody.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListRowBody.swift; sourceTree = ""; }; + CDD0EFA42B7E8B3200CA3504 /* ModeratorListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModeratorListView.swift; sourceTree = ""; }; + CDD0EFAC2B7EA73000CA3504 /* BanFromCommunity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BanFromCommunity.swift; sourceTree = ""; }; CDD55D1C2B23BA41002020C7 /* EasyTapLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EasyTapLinkView.swift; sourceTree = ""; }; CDD55D212B2674BD002020C7 /* String+ParseLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+ParseLinks.swift"; sourceTree = ""; }; CDDB08772A5DF1330075BFEE /* CommentSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentSettingsView.swift; sourceTree = ""; }; @@ -1064,9 +1391,8 @@ CDE3BA882A8C64BD00B972E2 /* Collapsible Text Item.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collapsible Text Item.swift"; sourceTree = ""; }; CDE6A80A2A43E9F00062D161 /* CommentSortType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentSortType.swift; sourceTree = ""; }; CDE6A80C2A45EAB30062D161 /* Embedded Post.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Embedded Post.swift"; sourceTree = ""; }; - CDE6A8152A490AE00062D161 /* InboxMessageBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMessageBodyView.swift; sourceTree = ""; }; CDE6A8172A490AF20062D161 /* InboxMentionBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMentionBodyView.swift; sourceTree = ""; }; - CDE6A8192A490B970062D161 /* Inbox ReplyBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Inbox ReplyBodyView.swift"; sourceTree = ""; }; + CDE6A8192A490B970062D161 /* InboxReplyBodyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxReplyBodyView.swift; sourceTree = ""; }; CDE9CE4B2A7B0831002B97DD /* Gentle Info.ahap */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Gentle Info.ahap"; sourceTree = ""; }; CDE9CE4E2A7B0B1B002B97DD /* Haptic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Haptic.swift; sourceTree = ""; }; CDE9CE502A7B0C66002B97DD /* Light Success.ahap */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Light Success.ahap"; sourceTree = ""; }; @@ -1112,7 +1438,7 @@ E49F0E752A90395400BC4EE3 /* NavigationPath+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NavigationPath+Helpers.swift"; sourceTree = ""; }; E4A7BFD02B35912500B95F56 /* InboxMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMessageView.swift; sourceTree = ""; }; E4A7BFD22B35913F00B95F56 /* InboxMentionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxMentionView.swift; sourceTree = ""; }; - E4D4DB9F2A7C7B9D00C4F3DE /* Comments.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Comments.swift; sourceTree = ""; }; + E4D4DB9F2A7C7B9D00C4F3DE /* Animations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Animations.swift; sourceTree = ""; }; E4DDB4312A81819300B3A7E0 /* Double+MaxZIndex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+MaxZIndex.swift"; sourceTree = ""; }; E4DDB4332A819C8000B3A7E0 /* QuickLookView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickLookView.swift; sourceTree = ""; }; E4F0B56E2ABD00A000BC3E4A /* View+PresentationBackgroundInteraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+PresentationBackgroundInteraction.swift"; sourceTree = ""; }; @@ -1124,6 +1450,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 03F6D4B92B951E21008235A0 /* SwiftUIIntrospect in Frameworks */, B104A6DA2A59BF3C00B3E725 /* NukeExtensions in Frameworks */, 63D24EDC2A169F12005CCA81 /* MarkdownUI in Frameworks */, B104A6D82A59BF3C00B3E725 /* Nuke in Frameworks */, @@ -1152,10 +1479,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 030245CB2BA70F5F00D07747 /* Links */ = { + isa = PBXGroup; + children = ( + 030245C92BA70F5200D07747 /* LinksSettingsView.swift */, + ); + path = Links; + sourceTree = ""; + }; 0308E1122B0EA31F000CA955 /* Account */ = { isa = PBXGroup; children = ( 0308E1132B0EA32A000CA955 /* AccountSettingsView.swift */, + 039B4FE82BD2D81D00E42114 /* BlockListView.swift */, + 033EC0AE2BD3030A00AA238F /* BlockListView+Logic.swift */, 03A18CBA2B0FD6F000BA69D2 /* ProfileSettingsView.swift */, 031A617B2B1BDFD100ABF23B /* AdvancedAccountSettingsView.swift */, 03F4DC9E2B1A8AD500556C67 /* SignInAndSecuritySettingsView.swift */, @@ -1271,9 +1608,7 @@ 030D00832AD0842900953B1D /* Results */ = { isa = PBXGroup; children = ( - 03EEEAF22AB8DCDF0087F8D8 /* CommunityResultView.swift */, 0355DA502B5EB87700CDF5A5 /* InstanceResultView.swift */, - 03B7AAF42ABEFA7A00068B23 /* UserResultView.swift */, ); path = Results; sourceTree = ""; @@ -1301,6 +1636,14 @@ path = "Search Bar"; sourceTree = ""; }; + 030FF6842BCB217700F6BFAC /* Int */ = { + isa = PBXGroup; + children = ( + 030FF6852BCB218000F6BFAC /* Int+Abbreviated.swift */, + ); + path = Int; + sourceTree = ""; + }; 031A93D42AC847D10077030C /* Image Upload */ = { isa = PBXGroup; children = ( @@ -1368,6 +1711,14 @@ path = Shared; sourceTree = ""; }; + 0355A1DC2BB1F0FE00D54F9F /* Moderation */ = { + isa = PBXGroup; + children = ( + 0355A1DD2BB1F12500D54F9F /* ModerationSettingsView.swift */, + ); + path = Moderation; + sourceTree = ""; + }; 03A1B3F52A83FFDA00AB0DE0 /* Protocol */ = { isa = PBXGroup; children = ( @@ -1381,6 +1732,14 @@ isa = PBXGroup; children = ( 03A54C312B5331F30064CCDE /* InstanceView.swift */, + 03CEE04C2B6EBEA800D65B1B /* InstanceView+Logic.swift */, + 03A4330A2B6FB2C10004E743 /* FediseerOpinionListView.swift */, + 03E47AEC2B66BC0000A3E4DB /* InstanceUptimeView.swift */, + 03AFBEB02B6EAD5B00F01F3C /* InstanceSafetyView.swift */, + 03A4330C2B6FC0940004E743 /* FediseerInfoView.swift */, + 03CEE04E2B6ECFFC00D65B1B /* FediseerOpinionView.swift */, + 03CEE04A2B6EB9CD00D65B1B /* Fediseer.swift */, + 03E47AEA2B66BADC00A3E4DB /* UptimeData.swift */, 031F95562B5C7FF20069C244 /* InstanceDetailsView.swift */, ); path = Instance; @@ -1390,6 +1749,7 @@ isa = PBXGroup; children = ( 03A54C342B533BC50064CCDE /* InstanceModel.swift */, + 03E47AEE2B66BD3C00A3E4DB /* InstanceModel+Uptime.swift */, 0355DA4E2B5EB63600CDF5A5 /* InstanceStub.swift */, 0355DA4C2B5EB51900CDF5A5 /* InstanceModel+ContentModel.swift */, 03A54C362B545A430064CCDE /* InstanceModel+MenuFunctions.swift */, @@ -1405,6 +1765,14 @@ path = TabBar; sourceTree = ""; }; + 03C942902B6457A3002068A4 /* Administration */ = { + isa = PBXGroup; + children = ( + 03C942912B6457B4002068A4 /* BanUserEditorModel.swift */, + ); + path = Administration; + sourceTree = ""; + }; 03E79F3D2AE3E6FF0006700D /* Sorting */ = { isa = PBXGroup; children = ( @@ -1422,6 +1790,13 @@ path = Post; sourceTree = ""; }; + 03F6D4B72B951E21008235A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; 03FD64FD2AE538C600957AA9 /* Community */ = { isa = PBXGroup; children = ( @@ -1489,11 +1864,18 @@ 0394398E2A98EB2300463032 /* APIComment+Mock.swift */, 50811B312A9204C1006BA3F2 /* APICommunity+Mock.swift */, 50811B332A9204EB006BA3F2 /* APICommunityAggregates+Mock.swift */, + 03AFBEAE2B6EAB9C00F01F3C /* APISiteAggregates+Mock.swift */, 50811B372A920545006BA3F2 /* APICommunityModeratorView+Mock.swift */, 50811B2F2A92049B006BA3F2 /* APICommunityView+Mock.swift */, 50811B392A920569006BA3F2 /* APIPerson+Mock.swift */, + 03AFBEA42B6EA90400F01F3C /* APIPersonView+Mock.swift */, + 03AFBEA62B6EA94900F01F3C /* APIPersonAggregates+Mock.swift */, 50811B432A920945006BA3F2 /* APIPost+Mock.swift */, 50811B352A920519006BA3F2 /* APISite+Mock.swift */, + 03AFBEA82B6EA9BC00F01F3C /* APISiteView+Mock.swift */, + 03AFBEAC2B6EAAF000F01F3C /* APILocalSiteRateLimit+Mock.swift */, + 03AFBEAA2B6EAA0C00F01F3C /* APILocalSite+Mock.swift */, + 03AFBEA22B6EA86B00F01F3C /* SiteResponse+Mock.swift */, 50811B3B2A92059C006BA3F2 /* BlockCommunityResponse+Mock.swift */, 50811B3F2A9205EE006BA3F2 /* CommunityResponse+Mock.swift */, 50811B2B2A920443006BA3F2 /* Date+Mock.swift */, @@ -1534,6 +1916,7 @@ 5064D03E2A6DE0DB00B22EE3 /* Notifier+Dependency.swift */, 50785F722A98E03F00117245 /* SiteInformationTracker+Dependency.swift */, CD4368CD2AE242C900BD8BD1 /* InboxRepository+Dependency.swift */, + CD876EC62B7736370075DC15 /* MarkReadBatcher+Dependency.swift */, ); path = Dependency; sourceTree = ""; @@ -1588,6 +1971,7 @@ CD4368B72AE23F5400BD8BD1 /* ParentTrackerProtocol.swift */, CD4368B92AE23F6400BD8BD1 /* TrackerItem.swift */, CD4368BB2AE23F6F00BD8BD1 /* TrackerSort.swift */, + CD17C1E92BA3997000A0C8BC /* TrackerProtocol.swift */, ); path = Generics; sourceTree = ""; @@ -1607,6 +1991,9 @@ children = ( 6318DE5327FB958800CC2AD6 /* Stickied Tag.swift */, CD6483372A3A0F2200EE6CA3 /* NSFW Tag.swift */, + 03B85A3F2BB38868003C4203 /* PostEllipsisMenus.swift */, + CDA1E84E2B93FF83007953EF /* RemovedTag.swift */, + CDA1E8502B940390007953EF /* LockedTag.swift */, ); path = Components; sourceTree = ""; @@ -1614,6 +2001,7 @@ 6318EDC427EE4E0500BFCAE8 /* Models */ = { isa = PBXGroup; children = ( + CD5F76BA2B75B8290013A827 /* Batchers */, CDEBC3262A9A57E900518D9D /* Content */, CDA2C5242A705D3100649D5A /* Composers */, B14E93BE2A45CA1A00D6DA93 /* Navigation Contexts */, @@ -1641,7 +2029,6 @@ B1955A1B2A606B810056CF99 /* Easter */, 630049EB27EF390900D5105B /* Networking */, 6322A5D127F88CFD00135D4F /* Time Parser.swift */, - 03C897F52ABF49BD005F3403 /* Abbreviate Numbers.swift */, 50EC39B12A346DDC00E014C2 /* URLHandler.swift */, CD3FBCE82A4B482700B2063F /* Generic Merge.swift */, 50CC4A7E2AA0D3A90074C845 /* InstanceMetadataParser.swift */, @@ -1665,7 +2052,11 @@ 035EB0C92A8687C200227859 /* JumpButtonView.swift */, CD1446172A58FC3B00610EF1 /* InfoStackView.swift */, CDE3BA882A8C64BD00B972E2 /* Collapsible Text Item.swift */, - CD8461652A96F9EB0026A627 /* Website Indicator View.swift */, + CDD0B8AA2BB37B3D003E7174 /* WebsiteIndicatorView.swift */, + CDD0B8C42BB78056003E7174 /* ResolveButtonView.swift */, + CDD0B8C62BB78260003E7174 /* RemoveButtonView.swift */, + CDD0B8C82BB782CF003E7174 /* PurgeButtonView.swift */, + CDD0B8CA2BB7844F003E7174 /* BanButtonView.swift */, ); path = Components; sourceTree = ""; @@ -1687,6 +2078,7 @@ 6332FDC127EFCB530009A98A /* Extensions */ = { isa = PBXGroup; children = ( + 030FF6842BCB217700F6BFAC /* Int */, CD29ED2C2B2E829B006937CE /* Array */, CD29ED2D2B2E82D1006937CE /* Bundle */, CD29ED2F2B2E83F6006937CE /* Color */, @@ -1727,9 +2119,11 @@ 63344C522A07D189001BC616 /* Views */ = { isa = PBXGroup; children = ( + 0355A1DC2BB1F0FE00D54F9F /* Moderation */, 032C1E022B5D7D9C00FB4F23 /* AccountList */, 0308E1122B0EA31F000CA955 /* Account */, 030AC0432A62F82B00037155 /* General */, + 030245CB2BA70F5F00D07747 /* Links */, 03E79F3D2AE3E6FF0006700D /* Sorting */, 030AC0442A62F83100037155 /* Filters */, CDC1C93D2A7AB8B400072E3D /* Accessibility */, @@ -1751,10 +2145,12 @@ 6363D5B827EE196700E34822 = { isa = PBXGroup; children = ( + CD88B8FB2BDD4B4D0026A6C8 /* PrivacyInfo.xcprivacy */, 6363D5C327EE196700E34822 /* Mlem */, 6363D5D927EE196A00E34822 /* MlemTests */, 6363D5E327EE196A00E34822 /* MlemUITests */, 6363D5C227EE196700E34822 /* Products */, + 03F6D4B72B951E21008235A0 /* Frameworks */, ); sourceTree = ""; }; @@ -1896,6 +2292,7 @@ 637218042A3A2AAD008C4816 /* Models */ = { isa = PBXGroup; children = ( + CDD0B8AE2BB4CE44003E7174 /* Reports */, CD6A2A772B1A552800003E23 /* Common */, CDF842582A49D23800723DA0 /* Messages */, 637218052A3A2AAD008C4816 /* Comments */, @@ -1918,8 +2315,6 @@ 637218082A3A2AAD008C4816 /* APICommentView.swift */, 637218092A3A2AAD008C4816 /* APICommentReply.swift */, 6372180A2A3A2AAD008C4816 /* APICommentReplyView.swift */, - 6D693A492A51B98F009E2D76 /* APICommentReportView.swift */, - 6D693A4B2A51B99E009E2D76 /* APICommentReport.swift */, ); path = Comments; sourceTree = ""; @@ -1927,11 +2322,10 @@ 6372180B2A3A2AAD008C4816 /* Posts */ = { isa = PBXGroup; children = ( + CDB652562B8EAE15007B7797 /* APIPostResponse.swift */, 6372180C2A3A2AAD008C4816 /* APIPost.swift */, 6372180D2A3A2AAD008C4816 /* APIPostAggregates.swift */, 6372180E2A3A2AAD008C4816 /* APIPostView.swift */, - 6D693A3F2A51147E009E2D76 /* APIPostReportView.swift */, - 6D693A412A5114DF009E2D76 /* APIPostReport.swift */, ); path = Posts; sourceTree = ""; @@ -1952,6 +2346,7 @@ 637218142A3A2AAD008C4816 /* Site */ = { isa = PBXGroup; children = ( + CD2698132B9E17870002B459 /* Modlog */, 637218152A3A2AAD008C4816 /* APILocalSiteRateLimit.swift */, 637218162A3A2AAD008C4816 /* APIFederatedInstances.swift */, 637218172A3A2AAD008C4816 /* APIMyUserInfo.swift */, @@ -1963,6 +2358,8 @@ 6372181B2A3A2AAD008C4816 /* APISiteView.swift */, 6372181C2A3A2AAD008C4816 /* APISite.swift */, 6372181D2A3A2AAD008C4816 /* APISiteAggregates.swift */, + CDD0B8F92BC07EA9003E7174 /* APIRegistrationApplicationView.swift */, + CDD0B8FB2BC07ED7003E7174 /* APIRegistrationApplication.swift */, ); path = Site; sourceTree = ""; @@ -1982,6 +2379,7 @@ 637218242A3A2AAD008C4816 /* Requests */ = { isa = PBXGroup; children = ( + CDD0B8B72BB4E3F2003E7174 /* Moderation */, CDC65D8D2A86B6D4007205E5 /* User */, CDF842622A49EAEC00723DA0 /* Messages */, 637218252A3A2AAD008C4816 /* LoginRequest.swift */, @@ -1999,7 +2397,11 @@ 637218262A3A2AAD008C4816 /* Post */ = { isa = PBXGroup; children = ( + CDB652582B8EC024007B7797 /* LockPostRequest.swift */, + 03F0DF552B9E0E210018F239 /* PurgePostRequest.swift */, + CDB652522B8EABFC007B7797 /* FeaturePostRequest.swift */, 637218272A3A2AAD008C4816 /* EditPost.swift */, + 039C59AC2BADFF6200C18765 /* ListPostLikesRequest.swift */, 637218282A3A2AAD008C4816 /* CreatePostLike.swift */, 637218292A3A2AAD008C4816 /* DeletePost.swift */, 6372182A2A3A2AAD008C4816 /* CreatePost.swift */, @@ -2009,6 +2411,7 @@ 6372182D2A3A2AAD008C4816 /* SavePost.swift */, 6D693A3D2A5113DF009E2D76 /* CreatePostReport.swift */, CD6F29A72A77FF1700F20B6B /* MarkPostRead.swift */, + CD0D5A422B8EC4DA005E3365 /* RemovePostRequest.swift */, ); path = Post; sourceTree = ""; @@ -2016,9 +2419,11 @@ 6372182E2A3A2AAD008C4816 /* Person */ = { isa = PBXGroup; children = ( + 03C942952B648252002068A4 /* BanPerson.swift */, 6372182F2A3A2AAD008C4816 /* GetPersonDetails.swift */, CDF842632A49EAFA00723DA0 /* GetPersonMentions.swift */, CD3FBCDC2A4A6F0600B2063F /* GetReplies.swift */, + 03F0DF572B9E24EF0018F239 /* PurgePersonRequest.swift */, CDA145EC2A510AC100DDAFC9 /* MarkCommentReplyAsReadRequest.swift */, CD18DC6A2A5202D4002C56BC /* MarkPersonMentionAsReadRequest.swift */, CD18DC6E2A5209C3002C56BC /* MarkPrivateMessageAsReadRequest.swift */, @@ -2034,8 +2439,11 @@ children = ( 637218312A3A2AAD008C4816 /* CreateComment.swift */, 637218322A3A2AAD008C4816 /* CreateCommentLike.swift */, + 039C59A82BADA5DA00C18765 /* PurgeCommentRequest.swift */, + 03D89E712BB1BB0100F49DB3 /* ListCommentLikesRequest.swift */, 637218332A3A2AAD008C4816 /* GetComment.swift */, 637218342A3A2AAD008C4816 /* GetComments.swift */, + 039C59AA2BADC85400C18765 /* RemoveCommentRequest.swift */, 637218352A3A2AAD008C4816 /* SaveComment.swift */, 637218362A3A2AAD008C4816 /* EditComment.swift */, 637218372A3A2AAD008C4816 /* DeleteComment.swift */, @@ -2047,8 +2455,10 @@ 6372183A2A3A2AAD008C4816 /* Site */ = { isa = PBXGroup; children = ( + CD2697E42B9E14FB0002B459 /* GetModlogRequest.swift */, 6372183B2A3A2AAD008C4816 /* GetSite.swift */, 031A617F2B1CEA7300ABF23B /* ChangePassword.swift */, + 030FF6872BCEE58900F6BFAC /* BlockInstance.swift */, 03A18CBC2B1005A400BA69D2 /* SaveUserSettings.swift */, ); path = Site; @@ -2060,8 +2470,12 @@ 6372183D2A3A2AAD008C4816 /* HideCommunity.swift */, 6372183E2A3A2AAD008C4816 /* FollowCommunity.swift */, 6372183F2A3A2AAD008C4816 /* ListCommunities.swift */, + 030245C72BA617FE00D07747 /* PurgeCommunityRequest.swift */, + 030245C52BA6138100D07747 /* RemoveCommunityRequest.swift */, 637218402A3A2AAD008C4816 /* GetCommunity.swift */, 637218412A3A2AAD008C4816 /* BlockCommunity.swift */, + CDD0EFAC2B7EA73000CA3504 /* BanFromCommunity.swift */, + CD5050532B807BF800632C56 /* AddModToCommunity.swift */, ); path = Community; sourceTree = ""; @@ -2082,6 +2496,8 @@ CDB0117E2A6F70A000D043EB /* Editor Tracker.swift */, 50785F702A98C4F600117245 /* SiteInformationTracker.swift */, 03B7AAEE2ABCB9DC00068B23 /* ContentTracker.swift */, + CDD0EF9B2B7D6B9100CA3504 /* ModToolTracker.swift */, + 03B85A3D2BB36C4B003C4203 /* UserRemovalWalker.swift */, ); path = Trackers; sourceTree = ""; @@ -2090,30 +2506,38 @@ isa = PBXGroup; children = ( 6FF17D002B685C16007E1814 /* AppLockView.swift */, - CD2053152ACBBB490000AA38 /* Avatars */, - CD2E147B2A6B2891004198DE /* Components */, - 6332FDCD27EFDD0A0009A98A /* Accounts */, - CD2E147A2A6B2871004198DE /* Comments */, - CD2E14792A6B285F004198DE /* Posts */, - ADF266932A4E89F800EBA648 /* Composer */, - CD525F662A4B892900BCA794 /* Links */, - E453A1CE2A81C1F20004BB8A /* Quick Look */, + 0317D46E2B558CB500EEE72C /* BadgeView.swift */, + B11D72822A49FAA7009DC22F /* Cached Image.swift */, + 0300F2C52B9C7D4B0022F7C4 /* CloseButtonView.swift */, + 0304F5892B44AF5B00537BFA /* CollapsibleSection.swift */, + 6374570F2A18CB6600B69C03 /* Custom Text Field.swift */, + CD863FBB2A6B026400A31ED9 /* DocumentView.swift */, 63A09B68285F53E9004F0032 /* Error View.swift */, 6322A5CA27F77A4D00135D4F /* Loading View.swift */, - 6386E03F2A045723006B3C1D /* Website Icon Complex.swift */, 63D24EDD2A169F2A005CCA81 /* Markdown View.swift */, 03B15BEC2B55CBBB00E7C30A /* MarkdownTheme.swift */, - 03A54C302B5331D50064CCDE /* Instance */, 03BAA2392A57DC1400D48252 /* PublishedTimestampView.swift */, - 6374570F2A18CB6600B69C03 /* Custom Text Field.swift */, - 0304F5892B44AF5B00537BFA /* CollapsibleSection.swift */, - B11D72822A49FAA7009DC22F /* Cached Image.swift */, - 0317D46E2B558CB500EEE72C /* BadgeView.swift */, + E46AF9912B29AA340087FDF3 /* ScrollToView.swift */, + 03F6D4BA2B952738008235A0 /* SelectTextView.swift */, 50F2851B2A5C5C1500CF8865 /* TokenRefreshView.swift */, - CD863FBB2A6B026400A31ED9 /* DocumentView.swift */, - 030E86422AC6F6CB000283A6 /* Search Bar */, + 030245C12BA60A2600D07747 /* ToolbarEllipsisMenu.swift */, CD20530F2AC878B50000AA38 /* UpdatedTimestampView.swift */, - E46AF9912B29AA340087FDF3 /* ScrollToView.swift */, + 6386E03F2A045723006B3C1D /* Website Icon Complex.swift */, + 03A4330E2B7186C20004E743 /* WebView.swift */, + 6332FDCD27EFDD0A0009A98A /* Accounts */, + CD2053152ACBBB490000AA38 /* Avatars */, + CD2E147A2A6B2871004198DE /* Comments */, + CD268C122B9A3DCF0074DBEE /* CommunityList */, + CD2E147B2A6B2891004198DE /* Components */, + ADF266932A4E89F800EBA648 /* Composer */, + 03A54C302B5331D50064CCDE /* Instance */, + CD525F662A4B892900BCA794 /* Links */, + CDD0EF922B7A957B00CA3504 /* Moderation */, + CD2E14792A6B285F004198DE /* Posts */, + E453A1CE2A81C1F20004BB8A /* Quick Look */, + 030E86422AC6F6CB000283A6 /* Search Bar */, + CDD0EFA32B7E8AF900CA3504 /* UserList */, + CDBA5FC72BCC477F00469C05 /* WarningView.swift */, ); path = Shared; sourceTree = ""; @@ -2142,7 +2566,8 @@ CD2053132ACBAF150000AA38 /* AvatarType.swift */, CD4368BD2AE23FA600BD8BD1 /* LoadingState.swift */, CD4368C92AE2428C00BD8BD1 /* ContentIdentifiable.swift */, - CD4BAD3C2B4C6C8E00A1E726 /* FeedType.swift */, + CD4BAD3C2B4C6C8E00A1E726 /* PostFeedType.swift */, + CDB652542B8EAC3E007B7797 /* APIPostFeatureType.swift */, ); path = Enums; sourceTree = ""; @@ -2150,6 +2575,7 @@ 6DA61F7F2A55B831001EA633 /* Search */ = { isa = PBXGroup; children = ( + CD5BB8152BADF7660027398F /* BubblePicker */, 6DA61F802A55B83F001EA633 /* SearchView.swift */, 03C897F72ABF652D005F3403 /* SearchRoot.swift */, 03C898002AC04EF9005F3403 /* SearchResultsView.swift */, @@ -2157,7 +2583,6 @@ 03C898022AC04F61005F3403 /* RecentSearchesView.swift */, 03EC92942AC064AE007BBE7E /* SearchHomeView.swift */, 036ED3BB2ABF1058009664BC /* SearchModel.swift */, - 03EEEAF62AB8ED3C0087F8D8 /* BubblePicker.swift */, 030D00832AD0842900953B1D /* Results */, ); path = Search; @@ -2186,9 +2611,12 @@ 6DFF50412A48DEC0001E648D /* Inbox */ = { isa = PBXGroup; children = ( - CDE6A80E2A4908200062D161 /* Feed */, - 6DFF50422A48DED3001E648D /* Inbox View.swift */, + CDD0B8D42BBB41CB003E7174 /* InboxFeedView.swift */, + CD4DD9D92BABABB000085D41 /* InboxRoot.swift */, + CD7798A52BB0E5B50067DF82 /* InboxView.swift */, + CDD0B8D22BBB4158003E7174 /* InboxView+Feeds.swift */, CD4368DC2AE24E1A00BD8BD1 /* InboxView+Logic.swift */, + CDE6A8142A490AC60062D161 /* Item Types */, ); path = Inbox; sourceTree = ""; @@ -2205,9 +2633,11 @@ ADF266932A4E89F800EBA648 /* Composer */ = { isa = PBXGroup; children = ( + 03EA79C32AC0D92C00BCDC91 /* PostComposerView+Logic.swift */, CD391F952A535F5400E213B5 /* ResponseEditorView.swift */, + 03C194072BA25B5200B00349 /* ProgressOverlayView.swift */, + 03F6D4BC2B966D53008235A0 /* BodyEditorView.swift */, 03CB329D2A6D8E910021EF27 /* PostComposerView.swift */, - 03EA79C32AC0D92C00BCDC91 /* PostComposerView+Logic.swift */, ); path = Composer; sourceTree = ""; @@ -2218,6 +2648,7 @@ B14E93BF2A45CA3400D6DA93 /* Post Link.swift */, B14E93C12A45D3B300D6DA93 /* Community Link.swift */, 6DE118382A4A20D600810C7E /* Lazy Load Post Link.swift */, + CD2BFE812B9FA05300717611 /* ModlogLink.swift */, ); path = "Navigation Contexts"; sourceTree = ""; @@ -2239,6 +2670,8 @@ 50A8812D2A72D76C003E3661 /* APIClient+Comment.swift */, 03EC92982AC0BF8A007BBE7E /* APIClient+Pictrs.swift */, CDEBC3382A9ADE6C00518D9D /* APIClient+Post.swift */, + CD2BFE772B9F60AC00717611 /* APIClient+Instance.swift */, + CDD0B8BA2BB4E51B003E7174 /* APIClient+Moderation.swift */, ); path = APIClient; sourceTree = ""; @@ -2246,6 +2679,7 @@ CD1262782B47597E007549F9 /* Feeds */ = { isa = PBXGroup; children = ( + CD17C1DE2BA3642800A0C8BC /* Modlog */, CD1262792B4759BC007549F9 /* StandardPostTracker.swift */, CD16A05F2B66F724000312D2 /* UserContentTracker.swift */, ); @@ -2264,6 +2698,16 @@ path = Data; sourceTree = ""; }; + CD17C1DE2BA3642800A0C8BC /* Modlog */ = { + isa = PBXGroup; + children = ( + CD17C1DA2BA358FD00A0C8BC /* ModlogTracker.swift */, + CD17C1E52BA369C700A0C8BC /* ModlogChildTracker.swift */, + CD9395262BA7CF92008F6C4C /* ModlogAction.swift */, + ); + path = Modlog; + sourceTree = ""; + }; CD18243E2AA8E23100D9BEB5 /* View Modifiers */ = { isa = PBXGroup; children = ( @@ -2288,6 +2732,53 @@ path = Avatars; sourceTree = ""; }; + CD268C122B9A3DCF0074DBEE /* CommunityList */ = { + isa = PBXGroup; + children = ( + CD268C132B9A3DD80074DBEE /* CommunityListRowBody.swift */, + 03EEEAF22AB8DCDF0087F8D8 /* CommunityListRow.swift */, + ); + path = CommunityList; + sourceTree = ""; + }; + CD2698132B9E17870002B459 /* Modlog */ = { + isa = PBXGroup; + children = ( + CD26980B2B9E16810002B459 /* APIModRemoveComment.swift */, + CD2698092B9E166D0002B459 /* APIModLockPost.swift */, + CD2698072B9E162A0002B459 /* APIModRemovePost.swift */, + CD2697E72B9E15580002B459 /* APIModRemovePostView.swift */, + CD26980D2B9E16A70002B459 /* APIModFeaturePost.swift */, + CD2697E92B9E15610002B459 /* APIModLockPostView.swift */, + CD2697ED2B9E15740002B459 /* APIModRemoveCommentView.swift */, + CD2697EB2B9E156D0002B459 /* APIModFeaturePostView.swift */, + CD2697EF2B9E157E0002B459 /* APIModBanFromCommunityView.swift */, + CD26980F2B9E174C0002B459 /* APIModBanFromCommunity.swift */, + CD2697F12B9E15860002B459 /* APIModRemoveCommunityView.swift */, + CD2698142B9E17AD0002B459 /* APIModBan.swift */, + CD2698112B9E17660002B459 /* APIModRemoveCommunity.swift */, + CD2697F32B9E158E0002B459 /* APIModBanView.swift */, + CD2697F52B9E15A60002B459 /* APIModAddCommunityView.swift */, + CD2698162B9E17C60002B459 /* APIModAddCommunity.swift */, + CD2697F72B9E15AD0002B459 /* APIModTransferCommunityView.swift */, + CD2698182B9E17DE0002B459 /* APIModTransferCommunity.swift */, + CD2697F92B9E15B90002B459 /* APIModAddView.swift */, + CD26981A2B9E17F70002B459 /* APIModAdd.swift */, + CD2697FB2B9E15C10002B459 /* APIAdminPurgePersonView.swift */, + CD26981C2B9E18090002B459 /* APIAdminPurgePerson.swift */, + CD2697FD2B9E15C80002B459 /* APIAdminPurgeCommunityView.swift */, + CD26981E2B9E181D0002B459 /* APIAdminPurgeCommunity.swift */, + CD2697FF2B9E15CF0002B459 /* APIAdminPurgePostView.swift */, + CD2698202B9E18350002B459 /* APIAdminPurgePost.swift */, + CD2698012B9E15D60002B459 /* APIAdminPurgeCommentView.swift */, + CD2698222B9E18450002B459 /* APIAdminPurgeComment.swift */, + CD2698032B9E15E50002B459 /* APIModHideCommunityView.swift */, + CD2698242B9E18760002B459 /* ApiModHideCommunity.swift */, + CD2698052B9E15F10002B459 /* APIModlogActionType.swift */, + ); + path = Modlog; + sourceTree = ""; + }; CD29ED2B2B2E8119006937CE /* View */ = { isa = PBXGroup; children = ( @@ -2302,6 +2793,7 @@ isa = PBXGroup; children = ( 63344C552A07D81D001BC616 /* Array+Prepend.swift */, + 03CEE0502B6EED2C00D65B1B /* Array+IsNotEmpty.swift */, 63344C572A07DB9A001BC616 /* Array+MoveElements.swift */, E453477D2A9DE37300D1B46F /* Array+SafeIndexing.swift */, ); @@ -2321,6 +2813,7 @@ isa = PBXGroup; children = ( 6D15D74B2A44DC240061B5CB /* Date+Formatter.swift */, + CD50504C2B80065300632C56 /* Date+DaysFromNow.swift */, ); path = Date; sourceTree = ""; @@ -2432,6 +2925,23 @@ path = TimeInterval; sourceTree = ""; }; + CD2BFE702B9E6CC700717611 /* Modlog */ = { + isa = PBXGroup; + children = ( + CD2BFE732B9F5BE800717611 /* ModlogEntry.swift */, + ); + path = Modlog; + sourceTree = ""; + }; + CD2BFE7C2B9F64E000717611 /* Modlog */ = { + isa = PBXGroup; + children = ( + CD2697E22B9E13B70002B459 /* ModlogView.swift */, + CD2BFE7D2B9F670B00717611 /* ModlogEntryView.swift */, + ); + path = Modlog; + sourceTree = ""; + }; CD2E14792A6B285F004198DE /* Posts */ = { isa = PBXGroup; children = ( @@ -2450,6 +2960,7 @@ children = ( CD69F5722A4239D70028D4F7 /* Comment Item.swift */, CD69F5742A42479A0028D4F7 /* Comment Item Logic.swift */, + 038142F12BB46FFF00856C9B /* CommentItem+MenuFunctions.swift */, 6399719427F463150057F611 /* Components */, ); path = Comments; @@ -2458,6 +2969,7 @@ CD2E147B2A6B2891004198DE /* Components */ = { isa = PBXGroup; children = ( + CD2BFE7C2B9F64E000717611 /* Modlog */, CD69F5702A422EDD0028D4F7 /* InteractionBarView.swift */, 632E8EE427EE63BD007E8D75 /* Components */, CDF1EF152A6C3BC2003594B6 /* End Of Feed View.swift */, @@ -2465,7 +2977,9 @@ CD45BCED2A75CA7200A2899C /* Thumbnail Image View.swift */, CDC1C9422A7AC24600072E3D /* ReadCheck.swift */, CD309C452A93FBD300988F95 /* Logo View.swift */, + 03AFBEB22B6EB8B800F01F3C /* Line.swift */, CDD55D1C2B23BA41002020C7 /* EasyTapLinkView.swift */, + CDD0B8BE2BB5B68F003E7174 /* EmbeddedCommentView.swift */, ); path = Components; sourceTree = ""; @@ -2509,6 +3023,10 @@ CD4368C32AE240B100BD8BD1 /* MentionModel.swift */, CD4368C52AE240BF00BD8BD1 /* MessageModel.swift */, CD4368C72AE2426700BD8BD1 /* ReplyModel.swift */, + CDD0B8AC2BB4CD7D003E7174 /* CommentReportModel.swift */, + CDD0B8D92BBF3C87003E7174 /* PostReportModel.swift */, + CDD0B8E92BBF7CAB003E7174 /* MessageReportModel.swift */, + CDD0B8FD2BC07F4B003E7174 /* RegistrationApplicationModel.swift */, ); path = Inbox; sourceTree = ""; @@ -2523,6 +3041,11 @@ CD12627C2B475E45007549F9 /* PostModel+TrackerItem.swift */, CD16A0632B66F81A000312D2 /* UserContentModel+TrackerItem.swift */, CD16A0652B670039000312D2 /* HierarchicalComment+TrackerItem.swift */, + CD17C1DC2BA3596000A0C8BC /* ModlogEntry+TrackerItem.swift */, + CDD0B8B32BB4DAFE003E7174 /* CommentReportModel+TrackerItem.swift */, + CDD0B8DF2BBF4689003E7174 /* PostReportModel+TrackerItem.swift */, + CDD0B8ED2BBF7F21003E7174 /* MessageReportModel+TrackerItem.swift */, + CDD0B9032BC08987003E7174 /* RegistrationApplication+TrackerItem.swift */, ); path = "Tracker Items"; sourceTree = ""; @@ -2548,27 +3071,63 @@ CDCA28D32B58AF53009D9F54 /* PostFeedView+MenuFunctions.swift */, CDEC95182B5D950D004BA288 /* PostFeedView+Logic.swift */, CD16A0672B670327000312D2 /* UserContentFeedView.swift */, - CD16A0692B670ABE000312D2 /* UserContentFeedView+Logic.swift */, CD16A06B2B674ABF000312D2 /* FeedHeaderView.swift */, ); path = Components; sourceTree = ""; }; + CD50504E2B80098F00632C56 /* Tools */ = { + isa = PBXGroup; + children = ( + CDA1E84C2B93FC7C007953EF /* BanUserView.swift */, + 03F0DF532B9D129D0018F239 /* BanUserView+Logic.swift */, + 039C59AE2BAE029300C18765 /* VotesListView.swift */, + 039C59B02BAF272E00C18765 /* VotesTracker.swift */, + CD55FE252B97F37A0020EE24 /* AddModView.swift */, + CD55FE272B9A28D00020EE24 /* SimpleUserSearchView.swift */, + CD268C102B9A3CB30074DBEE /* SimpleCommunitySearchView.swift */, + CD0D5A442B8EC5D9005E3365 /* RemovePostView.swift */, + 03B85A3B2BB34D1F003C4203 /* PurgeContentView.swift */, + 039C59A62BADA04100C18765 /* RemoveCommentView.swift */, + 030245C32BA6123A00D07747 /* RemoveCommunityView.swift */, + CDD0B9012BC084A9003E7174 /* DenyApplicationView.swift */, + ); + path = Tools; + sourceTree = ""; + }; CD525F662A4B892900BCA794 /* Links */ = { isa = PBXGroup; children = ( 032109482AA7C41800912DFC /* AvatarView.swift */, + 03F0DF592B9E28F30018F239 /* InstanceLabelView.swift */, 032109442AA7C32100912DFC /* User */, 032109452AA7C32F00912DFC /* Community */, ); path = Links; sourceTree = ""; }; + CD5BB8152BADF7660027398F /* BubblePicker */ = { + isa = PBXGroup; + children = ( + 03EEEAF62AB8ED3C0087F8D8 /* BubblePicker.swift */, + CD5BB8162BADF7700027398F /* ChildSizeReader.swift */, + ); + path = BubblePicker; + sourceTree = ""; + }; + CD5F76BA2B75B8290013A827 /* Batchers */ = { + isa = PBXGroup; + children = ( + CD5F76BB2B75BE700013A827 /* MarkReadBatcher.swift */, + ); + path = Batchers; + sourceTree = ""; + }; CD62D12D2B5ED48000395BD9 /* Community List */ = { isa = PBXGroup; children = ( 6D8F08FE2A4029AE003EB4FD /* CommunityListSection.swift */, - 505240E42A86E32700EA4558 /* CommunityListModel.swift */, + CDBA5FC92BD17F3D00469C05 /* CommunityListModel.swift */, ); path = "Community List"; sourceTree = ""; @@ -2635,6 +3194,7 @@ CDA2C5242A705D3100649D5A /* Composers */ = { isa = PBXGroup; children = ( + 03C942902B6457A3002068A4 /* Administration */, CD391F922A533B6C00E213B5 /* Response Composers */, CDA2C5252A705D6000649D5A /* PostEditor.swift */, ); @@ -2679,6 +3239,10 @@ CD4368D82AE2478300BD8BD1 /* MentionModel+InboxItem.swift */, CD4368D42AE2463900BD8BD1 /* MessageModel+InboxItem.swift */, CD4368D62AE2464D00BD8BD1 /* ReplyModel+InboxItem.swift */, + CDD0B8B12BB4D990003E7174 /* CommentReportModel+InboxItem.swift */, + CDD0B8DD2BBF4601003E7174 /* PostReportModel+InboxItem.swift */, + CDD0B8EF2BBF7FB7003E7174 /* MessageReportModel+InboxItem.swift */, + CDD0B9052BC089EA003E7174 /* RegistrationApplication+InboxItem.swift */, ); path = "Inbox Items"; sourceTree = ""; @@ -2704,6 +3268,7 @@ children = ( CDB45C5D2AF1A96C00A1FF08 /* AssociatedColorProtocol.swift */, CDC6A8C92A6F1C8D00CC11AC /* AssociatedIconProtocol.swift */, + CDD0B8CC2BB9E53F003E7174 /* Removable.swift */, ); path = Protocols; sourceTree = ""; @@ -2717,6 +3282,80 @@ path = Components; sourceTree = ""; }; + CDD0B8AE2BB4CE44003E7174 /* Reports */ = { + isa = PBXGroup; + children = ( + 6D693A4B2A51B99E009E2D76 /* APICommentReport.swift */, + 6D693A492A51B98F009E2D76 /* APICommentReportView.swift */, + 6D693A412A5114DF009E2D76 /* APIPostReport.swift */, + 6D693A3F2A51147E009E2D76 /* APIPostReportView.swift */, + CD7B53B82A5F263D00006E81 /* APIPrivateMessageReport.swift */, + CD7B53B62A5F258B00006E81 /* APIPrivateMessageReportView.swift */, + ); + path = Reports; + sourceTree = ""; + }; + CDD0B8B72BB4E3F2003E7174 /* Moderation */ = { + isa = PBXGroup; + children = ( + CDD0B8B82BB4E407003E7174 /* ListCommentReportsRequest.swift */, + CDD0B8CE2BBA0D31003E7174 /* ResolveCommentReportRequest.swift */, + CDD0B8DB2BBF4238003E7174 /* ListPostReportsRequest.swift */, + CDD0B8E52BBF57D9003E7174 /* ResolvePostReportRequest.swift */, + CDD0B8EB2BBF7D0F003E7174 /* ListPrivateMessageReportsRequest.swift */, + CDD0B8F52BC064F0003E7174 /* ResolvePrivateMessageReportRequest.swift */, + CDD0B8F72BC07E6A003E7174 /* ListRegistrationApplicationsRequest.swift */, + CDD0B8FF2BC080C7003E7174 /* ApproveRegistrationApplicationRequest.swift */, + CDC24EA52BC9B352009AA6D1 /* GetReportCountRequest.swift */, + CDBA5FC52BC9C58300469C05 /* GetUnreadRegistrationApplicationCountRequest.swift */, + ); + path = Moderation; + sourceTree = ""; + }; + CDD0B8D62BBB8E4E003E7174 /* ChildTrackers */ = { + isa = PBXGroup; + children = ( + CDD0B8B52BB4DC12003E7174 /* CommentReportTracker.swift */, + CD4368DA2AE247B700BD8BD1 /* MentionTracker.swift */, + CD4368CF2AE245F400BD8BD1 /* MessageTracker.swift */, + CD4368D12AE2460100BD8BD1 /* ReplyTracker.swift */, + CDD0B8D72BBF3C5A003E7174 /* PostReportTracker.swift */, + CDD0B8E72BBF7C8B003E7174 /* MessageReportTracker.swift */, + CDD0B9072BC08A6D003E7174 /* RegistrationApplicationTracker.swift */, + ); + path = ChildTrackers; + sourceTree = ""; + }; + CDD0EF922B7A957B00CA3504 /* Moderation */ = { + isa = PBXGroup; + children = ( + CD50504E2B80098F00632C56 /* Tools */, + CDD0EFAE2B7EF34D00CA3504 /* Components */, + CDD0EF9D2B7D6F3E00CA3504 /* ModToolSheet.swift */, + ); + path = Moderation; + sourceTree = ""; + }; + CDD0EFA32B7E8AF900CA3504 /* UserList */ = { + isa = PBXGroup; + children = ( + CDD0EFA12B7D9E5800CA3504 /* UserListRowBody.swift */, + 03B7AAF42ABEFA7A00068B23 /* UserListRow.swift */, + CDD0EFA42B7E8B3200CA3504 /* ModeratorListView.swift */, + ); + path = UserList; + sourceTree = ""; + }; + CDD0EFAE2B7EF34D00CA3504 /* Components */ = { + isa = PBXGroup; + children = ( + CD0D5A492B8ED320005E3365 /* BanFormButtonStyle.swift */, + CD0D5A472B8EC6F3005E3365 /* ReasonView.swift */, + CD17C1D82BA2660300A0C8BC /* ModlogNavigationLinkView.swift */, + ); + path = Components; + sourceTree = ""; + }; CDD55D202B2674B3002020C7 /* String */ = { isa = PBXGroup; children = ( @@ -2726,6 +3365,7 @@ CDD55D212B2674BD002020C7 /* String+ParseLinks.swift */, CD29ED382B2E860C006937CE /* String+Trimmed.swift */, CD29ED3C2B2E863C006937CE /* String+WithEscapedCharacters.swift */, + CD436F282BD325CB001711B9 /* String+StrippingDiacritics.swift */, ); path = String; sourceTree = ""; @@ -2742,27 +3382,23 @@ path = "Fancy Tab Bar"; sourceTree = ""; }; - CDE6A80E2A4908200062D161 /* Feed */ = { - isa = PBXGroup; - children = ( - CDE6A8142A490AC60062D161 /* Item Types */, - CD3FBCE02A4A836000B2063F /* AllItemsFeedView.swift */, - CD3FBCE22A4A844800B2063F /* Replies Feed View.swift */, - CD3FBCE42A4A89B900B2063F /* Mentions Feed View.swift */, - CD3FBCE62A4A8CE300B2063F /* Messages Feed View.swift */, - ); - path = Feed; - sourceTree = ""; - }; CDE6A8142A490AC60062D161 /* Item Types */ = { isa = PBXGroup; children = ( - E449C5962B35239500E3BCF4 /* InboxReplyView.swift */, - E4A7BFD02B35912500B95F56 /* InboxMessageView.swift */, - E4A7BFD22B35913F00B95F56 /* InboxMentionView.swift */, - CDE6A8152A490AE00062D161 /* InboxMessageBodyView.swift */, + CDD0B8C22BB5BCFD003E7174 /* InboxCommentReportBodyView.swift */, + CDD0B8BC2BB4F3D3003E7174 /* InboxCommentReportView.swift */, CDE6A8172A490AF20062D161 /* InboxMentionBodyView.swift */, - CDE6A8192A490B970062D161 /* Inbox ReplyBodyView.swift */, + E4A7BFD22B35913F00B95F56 /* InboxMentionView.swift */, + CDD0B8C02BB5BC51003E7174 /* InboxMessageBodyView.swift */, + E4A7BFD02B35912500B95F56 /* InboxMessageView.swift */, + CDD0B8F32BBF843B003E7174 /* InboxMessageReportBodyView.swift */, + CDD0B8F12BBF8406003E7174 /* InboxMessageReportView.swift */, + CDD0B8E32BBF4D4B003E7174 /* InboxPostReportBodyView.swift */, + CDD0B8E12BBF49DB003E7174 /* InboxPostReportView.swift */, + CDD0B90B2BC08E21003E7174 /* InboxRegistrationApplicationBodyView.swift */, + CDD0B9092BC08E02003E7174 /* InboxRegistrationApplicationView.swift */, + CDE6A8192A490B970062D161 /* InboxReplyBodyView.swift */, + E449C5962B35239500E3BCF4 /* InboxReplyView.swift */, ); path = "Item Types"; sourceTree = ""; @@ -2811,6 +3447,7 @@ CDEBC3262A9A57E900518D9D /* Content */ = { isa = PBXGroup; children = ( + CD2BFE702B9E6CC700717611 /* Modlog */, CD4368C22AE2409D00BD8BD1 /* Inbox */, CDEBC3272A9A57F200518D9D /* Content Model Identifier.swift */, 03ED5D5D2B6560F4005C245B /* Post */, @@ -2828,6 +3465,7 @@ children = ( CDEC95112B5B318B004BA288 /* CommunityFeedView.swift */, CD4BAD422B507F2B00A1E726 /* AggregateFeedView.swift */, + 030245BF2BA607EA00D07747 /* FeedToolbarContent.swift */, CDEC95132B5CBC42004BA288 /* AggregateFeedView+Logic.swift */, ); path = "Feed Types"; @@ -2838,8 +3476,6 @@ children = ( 6D7782332A48EE8C008AC1BF /* APIPrivateMessageView.swift */, 6D7782352A48EED8008AC1BF /* APIPrivateMessage.swift */, - CD7B53B62A5F258B00006E81 /* APIPrivateMessageReportView.swift */, - CD7B53B82A5F263D00006E81 /* APIPrivateMessageReport.swift */, ); path = Messages; sourceTree = ""; @@ -2847,11 +3483,9 @@ CDF8425F2A49EA2A00723DA0 /* Inbox */ = { isa = PBXGroup; children = ( + CDD0B8D62BBB8E4E003E7174 /* ChildTrackers */, CDF8426A2A4A2AB600723DA0 /* InboxItem.swift */, CD82A2582A71775E00111034 /* UnreadTracker.swift */, - CD4368CF2AE245F400BD8BD1 /* MessageTracker.swift */, - CD4368D12AE2460100BD8BD1 /* ReplyTracker.swift */, - CD4368DA2AE247B700BD8BD1 /* MentionTracker.swift */, CDC3E7FF2AEAFEAF008062CA /* InboxTracker.swift */, ); path = Inbox; @@ -2914,7 +3548,7 @@ E4D4DB9E2A7C7A5800C4F3DE /* Animations */ = { isa = PBXGroup; children = ( - E4D4DB9F2A7C7B9D00C4F3DE /* Comments.swift */, + E4D4DB9F2A7C7B9D00C4F3DE /* Animations.swift */, ); path = Animations; sourceTree = ""; @@ -2953,6 +3587,7 @@ B104A6DD2A59BF3C00B3E725 /* NukeVideo */, 50C99B552A61D792005D57DD /* Dependencies */, CD4368C02AE23FD400BD8BD1 /* Semaphore */, + 03F6D4B82B951E21008235A0 /* SwiftUIIntrospect */, ); productName = Mlem; productReference = 6363D5C127EE196700E34822 /* Mlem.app */; @@ -3032,6 +3667,7 @@ B104A6D62A59BF3C00B3E725 /* XCRemoteSwiftPackageReference "Nuke" */, 50C99B542A61D792005D57DD /* XCRemoteSwiftPackageReference "swift-dependencies" */, CD4368BF2AE23FD400BD8BD1 /* XCRemoteSwiftPackageReference "Semaphore" */, + 03F6D4B62B951D64008235A0 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */, ); productRefGroup = 6363D5C227EE196700E34822 /* Products */; projectDirPath = ""; @@ -3111,56 +3747,75 @@ buildActionMask = 2147483647; files = ( CDA77C322B6BD74400B8B8B4 /* CommunityListSection.swift in Sources */, + CDBA5FC82BCC477F00469C05 /* WarningView.swift in Sources */, + 039C59B12BAF272E00C18765 /* VotesTracker.swift in Sources */, CD16A0622B66F7FC000312D2 /* UserContentModel.swift in Sources */, CDDB2EDE2A85C2F1001D4B16 /* HapticPriority.swift in Sources */, CD6F29AA2A78003A00F20B6B /* PostRepository.swift in Sources */, 63F0C7A82A0522FC00A18C5D /* Saved Account Tracker.swift in Sources */, E449C5972B35239500E3BCF4 /* InboxReplyView.swift in Sources */, 6372186A2A3A2AAD008C4816 /* GetComment.swift in Sources */, + CDD0B8BB2BB4E51C003E7174 /* APIClient+Moderation.swift in Sources */, 03C905CA2B3C834C00B9082F /* AvatarBannerView.swift in Sources */, 03F76FA42B2F5F3500E2B54A /* UploadProgressView.swift in Sources */, + 0355A1DE2BB1F12500D54F9F /* ModerationSettingsView.swift in Sources */, 03EC92972AC069CE007BBE7E /* SearchResultListView.swift in Sources */, 637218472A3A2AAD008C4816 /* APICommentView.swift in Sources */, + CDD0B8BF2BB5B68F003E7174 /* EmbeddedCommentView.swift in Sources */, + 03CEE04F2B6ECFFC00D65B1B /* FediseerOpinionView.swift in Sources */, + CD2BFE742B9F5BE800717611 /* ModlogEntry.swift in Sources */, CDD55D1D2B23BA41002020C7 /* EasyTapLinkView.swift in Sources */, CDDCF6492A6641F0003DA3AC /* FancyTabItemLabelBuilder.swift in Sources */, 63344C542A07D193001BC616 /* FiltersSettingsView.swift in Sources */, E40E01902AABFC9300410B2C /* AnyNavigablePath.swift in Sources */, 6372185C2A3A2AAD008C4816 /* APICommunity.swift in Sources */, + CDA1E84F2B93FF83007953EF /* RemovedTag.swift in Sources */, + CD268C112B9A3CB30074DBEE /* SimpleCommunitySearchView.swift in Sources */, + 030245C62BA6138100D07747 /* RemoveCommunityRequest.swift in Sources */, + CD17C1E62BA369C700A0C8BC /* ModlogChildTracker.swift in Sources */, 6372185D2A3A2AAD008C4816 /* APICommunityAggregates.swift in Sources */, - 03B7AAF52ABEFA7A00068B23 /* UserResultView.swift in Sources */, + 03B7AAF52ABEFA7A00068B23 /* UserListRow.swift in Sources */, E47478152AAC3C19001CB1AC /* NavigationContext.swift in Sources */, + CDD0B8BD2BB4F3D3003E7174 /* InboxCommentReportView.swift in Sources */, 03C898012AC04EF9005F3403 /* SearchResultsView.swift in Sources */, CD04D5DB2A36154F008EF95B /* SaveButtonView.swift in Sources */, CDE6A80D2A45EAB30062D161 /* Embedded Post.swift in Sources */, B1955A212A6145C00056CF99 /* EnvironmentValues+EasterFlagSetter.swift in Sources */, 6386E02F2A03ED39006B3C1D /* Comment Tracker.swift in Sources */, + 03F6D4BD2B966D53008235A0 /* BodyEditorView.swift in Sources */, 6372185F2A3A2AAD008C4816 /* LoginRequest.swift in Sources */, + 03F0DF562B9E0E210018F239 /* PurgePostRequest.swift in Sources */, 637218442A3A2AAD008C4816 /* HierarchicalComment.swift in Sources */, CDDCF6472A663849003DA3AC /* EnvironmentValues+TabSelectionHashValue.swift in Sources */, 63D24EDE2A169F2A005CCA81 /* Markdown View.swift in Sources */, + 03C942962B648252002068A4 /* BanPerson.swift in Sources */, E453A1D02A81C2140004BB8A /* QuickLookPreviewController.swift in Sources */, B104A6E02A59C19400B3E725 /* OperationQueue+ConvenienceInit.swift in Sources */, + CD26981B2B9E17F70002B459 /* APIModAdd.swift in Sources */, CD2053122ACB72190000AA38 /* AccountTransitionView.swift in Sources */, 03B7AAF32ABEF85300068B23 /* UserModel.swift in Sources */, CDC1C9432A7AC24600072E3D /* ReadCheck.swift in Sources */, 63F0C7A22A0519BA00A18C5D /* PostSortType.swift in Sources */, 034C724F2A82B61200B8A4B8 /* LayoutWidgetTracker.swift in Sources */, 030D00852AD1B94F00953B1D /* UserFlair.swift in Sources */, + 03AFBEAF2B6EAB9C00F01F3C /* APISiteAggregates+Mock.swift in Sources */, 637218682A3A2AAD008C4816 /* CreateComment.swift in Sources */, 637218722A3A2AAD008C4816 /* HideCommunity.swift in Sources */, - 03EEEAF32AB8DCDF0087F8D8 /* CommunityResultView.swift in Sources */, + 03EEEAF32AB8DCDF0087F8D8 /* CommunityListRow.swift in Sources */, E47478132AAC350E001CB1AC /* NavigationLink+Helpers.swift in Sources */, 5064D0432A6E645D00B22EE3 /* Notifiable.swift in Sources */, 039439932A99098900463032 /* InternetConnectionManager.swift in Sources */, CD82A2592A71775E00111034 /* UnreadTracker.swift in Sources */, 0355DA4F2B5EB63600CDF5A5 /* InstanceStub.swift in Sources */, CD4368CA2AE2428C00BD8BD1 /* ContentIdentifiable.swift in Sources */, - CD3FBCE32A4A844800B2063F /* Replies Feed View.swift in Sources */, + CDD0B90C2BC08E21003E7174 /* InboxRegistrationApplicationBodyView.swift in Sources */, 637218652A3A2AAD008C4816 /* GetPosts.swift in Sources */, + CD2697F42B9E158E0002B459 /* APIModBanView.swift in Sources */, E4DDB4342A819C8000B3A7E0 /* QuickLookView.swift in Sources */, 6372185E2A3A2AAD008C4816 /* APICommunityModeratorView.swift in Sources */, CD18DC732A522A7C002C56BC /* CreatePrivateMessageRequest.swift in Sources */, CD525F652A4B6D8F00BCA794 /* CommunityLinkView.swift in Sources */, + 03A4330F2B7186C20004E743 /* WebView.swift in Sources */, 637218592A3A2AAD008C4816 /* APISiteAggregates.swift in Sources */, 50A881262A71A511003E3661 /* PersistenceRepository+Dependency.swift in Sources */, 032C1E062B5DBDB100FB4F23 /* LocalAccountSettingsView.swift in Sources */, @@ -3169,15 +3824,18 @@ CD863FBA2A6AEB5900A31ED9 /* View+FancyTabScrollCompatible.swift in Sources */, 637218772A3A2AAD008C4816 /* APIRequest.swift in Sources */, 63A09B69285F53E9004F0032 /* Error View.swift in Sources */, + CDA1E84D2B93FC7C007953EF /* BanUserView.swift in Sources */, CD2053172ACBBB5A0000AA38 /* DefaultAvatarView.swift in Sources */, - CD3FBCE72A4A8CE300B2063F /* Messages Feed View.swift in Sources */, + 03A4330D2B6FC0940004E743 /* FediseerInfoView.swift in Sources */, 63344C582A07DB9A001BC616 /* Array+MoveElements.swift in Sources */, + CD55FE262B97F37A0020EE24 /* AddModView.swift in Sources */, 03A18CBD2B1005A400BA69D2 /* SaveUserSettings.swift in Sources */, 03E0B9C82A61F0F400FED265 /* AdvancedSettingsView.swift in Sources */, 63344C622A08460D001BC616 /* View+Border.swift in Sources */, 03A54C352B533BC50064CCDE /* InstanceModel.swift in Sources */, + CD26981D2B9E18090002B459 /* APIAdminPurgePerson.swift in Sources */, 637218702A3A2AAD008C4816 /* ResolveObject.swift in Sources */, - CDE6A8162A490AE00062D161 /* InboxMessageBodyView.swift in Sources */, + 03AFBEA52B6EA90400F01F3C /* APIPersonView+Mock.swift in Sources */, CD04D5DD2A361564008EF95B /* ReplyButtonView.swift in Sources */, CD4368D22AE2460100BD8BD1 /* ReplyTracker.swift in Sources */, CD9A49D32B045B81001E18A0 /* ZoomableImageView.swift in Sources */, @@ -3185,22 +3843,27 @@ ADDC9E3A2A5CEAA100383D58 /* BlockPerson.swift in Sources */, CD6F29A82A77FF1700F20B6B /* MarkPostRead.swift in Sources */, 031A617E2B1CE90F00ABF23B /* ChangePasswordView.swift in Sources */, - CD4BAD3D2B4C6C8E00A1E726 /* FeedType.swift in Sources */, + CD4BAD3D2B4C6C8E00A1E726 /* PostFeedType.swift in Sources */, 6372186B2A3A2AAD008C4816 /* GetComments.swift in Sources */, + CDD0B8FE2BC07F4B003E7174 /* RegistrationApplicationModel.swift in Sources */, B1DD00BD2A62DDEC002A7B39 /* RecognizedLemmyInstances.swift in Sources */, + CDD0B8AD2BB4CD7D003E7174 /* CommentReportModel.swift in Sources */, 6DA61F892A575DF1001EA633 /* URL+WithIconSize.swift in Sources */, 50811B3E2A9205BA006BA3F2 /* GetCommunityResponse+Mock.swift in Sources */, E48DE4A22AC3F23F004E6291 /* DestinationValue.swift in Sources */, + 03F6D4BB2B952738008235A0 /* SelectTextView.swift in Sources */, E4DDB4322A81819300B3A7E0 /* Double+MaxZIndex.swift in Sources */, 5016A2B32A67EC0700B257E8 /* NotificationDisplayer.swift in Sources */, E42D9B5A2AD6802B0087693C /* OnboardingRoutes.swift in Sources */, CD1446212A5B328E00610EF1 /* Privacy Policy.swift in Sources */, 507573942A5AD59E00AA7ABD /* EquatableError.swift in Sources */, - CDE6A81A2A490B970062D161 /* Inbox ReplyBodyView.swift in Sources */, + CDE6A81A2A490B970062D161 /* InboxReplyBodyView.swift in Sources */, + CD5BB8172BADF7700027398F /* ChildSizeReader.swift in Sources */, 50811B3C2A92059C006BA3F2 /* BlockCommunityResponse+Mock.swift in Sources */, CD12627A2B4759BC007549F9 /* StandardPostTracker.swift in Sources */, CD391F9E2A539F1800E213B5 /* ReplyToMention.swift in Sources */, CD1446272A5B36DA00610EF1 /* EULA.swift in Sources */, + CDD0B8E82BBF7C8B003E7174 /* MessageReportTracker.swift in Sources */, 500C168E2A66FAAB006F243B /* HapticManager+Dependency.swift in Sources */, 038A16E52A7A97380087987E /* LayoutWidgetView.swift in Sources */, E40E018E2AABFBDE00410B2C /* AnyNavigationPath.swift in Sources */, @@ -3208,13 +3871,19 @@ 039C8DBB2B35B2EB0096BAAF /* AccountListView.swift in Sources */, CD1446252A5B357900610EF1 /* Document.swift in Sources */, CDEBC32C2A9A582500518D9D /* Votes Model.swift in Sources */, + 03E47AED2B66BC0000A3E4DB /* InstanceUptimeView.swift in Sources */, CDEBC3282A9A57F200518D9D /* Content Model Identifier.swift in Sources */, + 03CEE0512B6EED2C00D65B1B /* Array+IsNotEmpty.swift in Sources */, 6FF17D012B685C16007E1814 /* AppLockView.swift in Sources */, B1955A1D2A606B950056CF99 /* Easter Rewards.swift in Sources */, CD16A0642B66F81A000312D2 /* UserContentModel+TrackerItem.swift in Sources */, + CD4DD9DA2BABABB000085D41 /* InboxRoot.swift in Sources */, CDB0117F2A6F70A000D043EB /* Editor Tracker.swift in Sources */, 03ED5D5F2B6560FE005C245B /* PostModel+MenuFunctions.swift in Sources */, 030E86482AC6FD1D000283A6 /* _assignIfNotEqual.swift in Sources */, + CD17C1DD2BA3596000A0C8BC /* ModlogEntry+TrackerItem.swift in Sources */, + CD26980E2B9E16A70002B459 /* APIModFeaturePost.swift in Sources */, + CD2BFE822B9FA05300717611 /* ModlogLink.swift in Sources */, 03A54C372B545A430064CCDE /* InstanceModel+MenuFunctions.swift in Sources */, 6354F30A2A2E20040074C08D /* View+Alert.swift in Sources */, 03EC92992AC0BF8A007BBE7E /* APIClient+Pictrs.swift in Sources */, @@ -3222,28 +3891,35 @@ 6372186C2A3A2AAD008C4816 /* SaveComment.swift in Sources */, CD4368B62AE23F4700BD8BD1 /* ParentTracker.swift in Sources */, 03C898032AC04F61005F3403 /* RecentSearchesView.swift in Sources */, + CD55FE282B9A28D00020EE24 /* SimpleUserSearchView.swift in Sources */, 50811B382A920545006BA3F2 /* APICommunityModeratorView+Mock.swift in Sources */, 50F2851C2A5C5C1500CF8865 /* TokenRefreshView.swift in Sources */, 03F4DCA32B1A8B0400556C67 /* AccountGeneralSettingsView.swift in Sources */, 507573962A5AD5CF00AA7ABD /* ContextualError.swift in Sources */, 50C99B592A61D889005D57DD /* APIClient+Dependency.swift in Sources */, 031A617C2B1BDFD100ABF23B /* AdvancedAccountSettingsView.swift in Sources */, + CD2697F22B9E15860002B459 /* APIModRemoveCommunityView.swift in Sources */, CD3720EE2B2E8FE6004D7103 /* IconSettingsView.swift in Sources */, CDDCF6572A678298003DA3AC /* FancyTabBarSelection.swift in Sources */, CDB45C5E2AF1A96C00A1FF08 /* AssociatedColorProtocol.swift in Sources */, CD3FBCE92A4B482700B2063F /* Generic Merge.swift in Sources */, E47B2B762A902DE200629AF7 /* SettingsValues.swift in Sources */, CDBCBA242B54A5F40070F60D /* NoPostsView.swift in Sources */, + CD2698042B9E15E50002B459 /* APIModHideCommunityView.swift in Sources */, CDA145ED2A510AC100DDAFC9 /* MarkCommentReplyAsReadRequest.swift in Sources */, + 03F0DF542B9D129D0018F239 /* BanUserView+Logic.swift in Sources */, CD391F982A537E8E00E213B5 /* ReplyToComment.swift in Sources */, 5064D03D2A6DE0AA00B22EE3 /* Notifier.swift in Sources */, CD9A49D52B0587F1001E18A0 /* ImageDetailView.swift in Sources */, CDC65D912A86B830007205E5 /* DeleteAccountView.swift in Sources */, 039C8DBD2B361C160096BAAF /* AccountButtonView.swift in Sources */, CDC3E8002AEAFEAF008062CA /* InboxTracker.swift in Sources */, + CD17C1DB2BA358FD00A0C8BC /* ModlogTracker.swift in Sources */, + CD2698152B9E17AE0002B459 /* APIModBan.swift in Sources */, CD391F9C2A53980900E213B5 /* ReplyToCommentReply.swift in Sources */, 030E863D2AC6C49E000283A6 /* PictrsRepository+Dependency.swift in Sources */, 50811B402A9205EE006BA3F2 /* CommunityResponse+Mock.swift in Sources */, + 03A4330B2B6FB2C10004E743 /* FediseerOpinionListView.swift in Sources */, 03E0B9CC2A62CD5800FED265 /* ThemeSettingsView.swift in Sources */, 637218532A3A2AAD008C4816 /* APIMyUserInfo.swift in Sources */, 0317D46F2B558CB500EEE72C /* BadgeView.swift in Sources */, @@ -3251,26 +3927,30 @@ B11D72832A49FAA7009DC22F /* Cached Image.swift in Sources */, 637218752A3A2AAD008C4816 /* GetCommunity.swift in Sources */, 03A2767B2AFE560000C0D66B /* CommunityModel+SwipeActions.swift in Sources */, - 6DFF50432A48DED3001E648D /* Inbox View.swift in Sources */, + CD2697FE2B9E15C80002B459 /* APIAdminPurgeCommunityView.swift in Sources */, 03EEEAF72AB8ED3C0087F8D8 /* BubblePicker.swift in Sources */, + 039C59AD2BADFF6200C18765 /* ListPostLikesRequest.swift in Sources */, CD2053102AC878B50000AA38 /* UpdatedTimestampView.swift in Sources */, CD1446232A5B336900610EF1 /* LicensesView.swift in Sources */, CD4368D02AE245F400BD8BD1 /* MessageTracker.swift in Sources */, + CDB652532B8EABFC007B7797 /* FeaturePostRequest.swift in Sources */, 0304F58A2B44AF5B00537BFA /* CollapsibleSection.swift in Sources */, CDDCF6432A66343D003DA3AC /* FancyTabBar.swift in Sources */, - 505240E52A86E32700EA4558 /* CommunityListModel.swift in Sources */, CD05E77F2A4F263B0081D102 /* Menu Function.swift in Sources */, 036ED3BC2ABF1058009664BC /* SearchModel.swift in Sources */, CDDB08782A5DF1330075BFEE /* CommentSettingsView.swift in Sources */, 6386E02C2A03D1EC006B3C1D /* App State.swift in Sources */, 504106CD2A744D7F000AAEF8 /* CommentRepository+Dependency.swift in Sources */, CD4BAD432B507F2B00A1E726 /* AggregateFeedView.swift in Sources */, + CDD0B8E22BBF49DB003E7174 /* InboxPostReportView.swift in Sources */, 6372186F2A3A2AAD008C4816 /* SearchRequest.swift in Sources */, 03EC92952AC064AE007BBE7E /* SearchHomeView.swift in Sources */, CD46C1F62B0D0A5700065953 /* EnvironmentValues+TabReselectionHashValue.swift in Sources */, CD16A0602B66F724000312D2 /* UserContentTracker.swift in Sources */, 50811B362A920519006BA3F2 /* APISite+Mock.swift in Sources */, + CDD0EFA52B7E8B3200CA3504 /* ModeratorListView.swift in Sources */, 503422562AAB784000EFE88D /* EnvironmentValues+AppFlow.swift in Sources */, + CDA1E8512B940390007953EF /* LockedTag.swift in Sources */, CDDCF6512A677E1B003DA3AC /* FancyTabItemPreferenceKeys.swift in Sources */, CDEBC32A2A9A580B00518D9D /* PostModel.swift in Sources */, CDC6A8CA2A6F1C8D00CC11AC /* AssociatedIconProtocol.swift in Sources */, @@ -3278,26 +3958,40 @@ 50785F762A9A684300117245 /* SavedAccountTracker+Dependency.swift in Sources */, 504ECBAE2AB45B2A006C0B96 /* LemmyURL.swift in Sources */, CDA217EA2A63093E00BDA173 /* ReportComment.swift in Sources */, + CDC24EA62BC9B352009AA6D1 /* GetReportCountRequest.swift in Sources */, + CDD0B8E02BBF4689003E7174 /* PostReportModel+TrackerItem.swift in Sources */, CDA217E82A63029B00BDA173 /* ReportMention.swift in Sources */, 504ECBAA2AB27C73006C0B96 /* LandingPage.swift in Sources */, + CD2698062B9E15F10002B459 /* APIModlogActionType.swift in Sources */, 508845CF2A3641160088E483 /* JSONDecoder+Default.swift in Sources */, + 03F0DF5A2B9E28F30018F239 /* InstanceLabelView.swift in Sources */, 637218672A3A2AAD008C4816 /* GetPersonDetails.swift in Sources */, B1A26FE12A44AAB200B91A32 /* EnvironmentValues+NavigationPathWithRoutes.swift in Sources */, + 0300F2C62B9C7D4B0022F7C4 /* CloseButtonView.swift in Sources */, + 039C59AF2BAE029300C18765 /* VotesListView.swift in Sources */, CDD55D222B2674BD002020C7 /* String+ParseLinks.swift in Sources */, 6332FDC027EFB05F0009A98A /* Settings Item.swift in Sources */, 031A93D62AC847DA0077030C /* UploadConfirmationView.swift in Sources */, + CDD0B8EE2BBF7F21003E7174 /* MessageReportModel+TrackerItem.swift in Sources */, CD8C55342A95515C0060B75B /* Onboarding Text.swift in Sources */, CD4368CC2AE242AD00BD8BD1 /* InboxRepository.swift in Sources */, 50C99B602A6299D8005D57DD /* ErrorHandler.swift in Sources */, 030D4AE62AA1273200A3393D /* ErrorDetails.swift in Sources */, CD14461B2A5A4B6D00610EF1 /* PostSettingsView.swift in Sources */, + CD2698082B9E162A0002B459 /* APIModRemovePost.swift in Sources */, CD7B53B52A5F251400006E81 /* CreatePrivateMessageReportRequest.swift in Sources */, 50CC4A7F2AA0D3AA0074C845 /* InstanceMetadataParser.swift in Sources */, CD4368B82AE23F5400BD8BD1 /* ParentTrackerProtocol.swift in Sources */, 637218492A3A2AAD008C4816 /* APICommentReplyView.swift in Sources */, + CD2697E82B9E15580002B459 /* APIModRemovePostView.swift in Sources */, CD4368C82AE2426700BD8BD1 /* ReplyModel.swift in Sources */, CDC65D8F2A86B6DD007205E5 /* DeleteUser.swift in Sources */, + CDD0EFAD2B7EA73000CA3504 /* BanFromCommunity.swift in Sources */, + 03AFBEB32B6EB8B800F01F3C /* Line.swift in Sources */, CD6483382A3A0F2200EE6CA3 /* NSFW Tag.swift in Sources */, + CD2697FA2B9E15B90002B459 /* APIModAddView.swift in Sources */, + CD0D5A4A2B8ED320005E3365 /* BanFormButtonStyle.swift in Sources */, + CD17C1EA2BA3997000A0C8BC /* TrackerProtocol.swift in Sources */, 503422582AAB798600EFE88D /* AppFlow.swift in Sources */, 039C8DBF2B363DAD0096BAAF /* AccountListView+Logic.swift in Sources */, 637218642A3A2AAD008C4816 /* GetPost.swift in Sources */, @@ -3306,10 +4000,12 @@ 038A16DF2A75172C0087987E /* LayoutWidgetEditView.swift in Sources */, CD69F5732A4239D70028D4F7 /* Comment Item.swift in Sources */, 6FF17D062B685CF6007E1814 /* UIDevice+DynamicIsland.swift in Sources */, + 03C194082BA25B5200B00349 /* ProgressOverlayView.swift in Sources */, CD29ED412B2E867C006937CE /* UIApplication+TopMostViewController.swift in Sources */, CDB45C622AF1AF9B00A1FF08 /* ReplyModel+TrackerItem.swift in Sources */, 6318EDC327EE4D7F00BFCAE8 /* Feed Post.swift in Sources */, 03F76FA22B2F5F1100E2B54A /* LinkAttachmentProxy.swift in Sources */, + CD26981F2B9E181D0002B459 /* APIAdminPurgeCommunity.swift in Sources */, CD05E7792A4E381A0081D102 /* PostSize.swift in Sources */, 6D7782362A48EED8008AC1BF /* APIPrivateMessage.swift in Sources */, CDE3BA892A8C64BD00B972E2 /* Collapsible Text Item.swift in Sources */, @@ -3318,28 +4014,47 @@ 505240E72A88D36D00EA4558 /* SectionIndexTitles.swift in Sources */, 5064D0452A71549C00B22EE3 /* NotificationMessage.swift in Sources */, E4F0B56F2ABD00A000BC3E4A /* View+PresentationBackgroundInteraction.swift in Sources */, + CDBA5FC62BC9C58300469C05 /* GetUnreadRegistrationApplicationCountRequest.swift in Sources */, + CDD0B8FC2BC07ED7003E7174 /* APIRegistrationApplication.swift in Sources */, 6D693A4C2A51B99E009E2D76 /* APICommentReport.swift in Sources */, 030E863B2AC6C3B1000283A6 /* PictrsRespository.swift in Sources */, + CD2697E32B9E13B70002B459 /* ModlogView.swift in Sources */, 63344C672A08D4E3001BC616 /* AppearanceSettingsView.swift in Sources */, + CDD0B8DA2BBF3C87003E7174 /* PostReportModel.swift in Sources */, E49F0E762A90395400BC4EE3 /* NavigationPath+Helpers.swift in Sources */, + CDD0B8CB2BB7844F003E7174 /* BanButtonView.swift in Sources */, + CDD0B8B42BB4DAFE003E7174 /* CommentReportModel+TrackerItem.swift in Sources */, + CD2697F02B9E157E0002B459 /* APIModBanFromCommunityView.swift in Sources */, B1955A1F2A606F010056CF99 /* EasterFlagsTracker.swift in Sources */, + CDD0B8FA2BC07EA9003E7174 /* APIRegistrationApplicationView.swift in Sources */, + CD0D5A482B8EC6F3005E3365 /* ReasonView.swift in Sources */, + 038142F22BB46FFF00856C9B /* CommentItem+MenuFunctions.swift in Sources */, 63D24ED92A169A5F005CCA81 /* UIApplication+FirstKeyWindow.swift in Sources */, 039439912A98FA6100463032 /* UserFeedView.swift in Sources */, 03EA79C42AC0D92C00BCDC91 /* PostComposerView+Logic.swift in Sources */, + CDD0B8EA2BBF7CAB003E7174 /* MessageReportModel.swift in Sources */, 03A18CBF2B1252BD00BA69D2 /* ListingType.swift in Sources */, + 03E47AEF2B66BD3C00A3E4DB /* InstanceModel+Uptime.swift in Sources */, 637218482A3A2AAD008C4816 /* APICommentReply.swift in Sources */, CD3720EC2B2E8F96004D7103 /* AlternativeIconCell.swift in Sources */, 032109472AA7C3FC00912DFC /* CommunityLabelView.swift in Sources */, 637218502A3A2AAD008C4816 /* APIPersonAggregates.swift in Sources */, + 03E47AEB2B66BADC00A3E4DB /* UptimeData.swift in Sources */, CD4368D72AE2464D00BD8BD1 /* ReplyModel+InboxItem.swift in Sources */, 6D693A422A5114DF009E2D76 /* APIPostReport.swift in Sources */, 5064D03F2A6DE0DB00B22EE3 /* Notifier+Dependency.swift in Sources */, + CDD0B8C92BB782CF003E7174 /* PurgeButtonView.swift in Sources */, 6D8003792A45FD1300363206 /* Bundle+VersionNumbers.swift in Sources */, + CD2698002B9E15CF0002B459 /* APIAdminPurgePostView.swift in Sources */, CDB45C642AF1AFB900A1FF08 /* MessageModel+TrackerItem.swift in Sources */, + CD2698172B9E17C60002B459 /* APIModAddCommunity.swift in Sources */, + CD2697EE2B9E15740002B459 /* APIModRemoveCommentView.swift in Sources */, + CD2698252B9E18770002B459 /* ApiModHideCommunity.swift in Sources */, 6DE118392A4A20D600810C7E /* Lazy Load Post Link.swift in Sources */, CDF8426B2A4A2AB600723DA0 /* InboxItem.swift in Sources */, 637218572A3A2AAD008C4816 /* APISiteView.swift in Sources */, B14E93C02A45CA3400D6DA93 /* Post Link.swift in Sources */, + 03AFBEA72B6EA94900F01F3C /* APIPersonAggregates+Mock.swift in Sources */, CD2BD6782A79F55800ECFF89 /* ImageSize.swift in Sources */, 50785F712A98C4F600117245 /* SiteInformationTracker.swift in Sources */, CD46C1F82B0D0A8A00065953 /* View+ReselectAction.swift in Sources */, @@ -3348,14 +4063,15 @@ CD391F9A2A537EF900E213B5 /* CommentBodyView.swift in Sources */, 63344C562A07D81D001BC616 /* Array+Prepend.swift in Sources */, CDBCBA202B537A4B0070F60D /* PostFeedView.swift in Sources */, + 039C59A72BADA04100C18765 /* RemoveCommentView.swift in Sources */, CDDCF64F2A672C0A003DA3AC /* FancyTabBarLabel.swift in Sources */, + CD2698232B9E18450002B459 /* APIAdminPurgeComment.swift in Sources */, CD04D5D92A3614BE008EF95B /* Large Post.swift in Sources */, CDF8425E2A49E61A00723DA0 /* APIPersonMention.swift in Sources */, 50A881242A71A4CD003E3661 /* PersistenceRepository.swift in Sources */, 032109492AA7C41800912DFC /* AvatarView.swift in Sources */, CD4368B02AE23F1400BD8BD1 /* ChildTracker.swift in Sources */, CD863FBC2A6B026400A31ED9 /* DocumentView.swift in Sources */, - CD8461662A96F9EB0026A627 /* Website Indicator View.swift in Sources */, 038A16E92A7A9C640087987E /* LayoutWidget.swift in Sources */, CDEC95192B5D950D004BA288 /* PostFeedView+Logic.swift in Sources */, CD9A03C82B389F7000C16276 /* EnvironmentValues+FeedType.swift in Sources */, @@ -3363,38 +4079,56 @@ 03C905CC2B3C88F700B9082F /* SearchTab.swift in Sources */, 6FF17D032B685C55007E1814 /* AppLock.swift in Sources */, E409E16E2AFEFB8C0026FDC2 /* ImageDetailSheetState.swift in Sources */, - CD3FBCE52A4A89B900B2063F /* Mentions Feed View.swift in Sources */, CD391F962A535F5400E213B5 /* ResponseEditorView.swift in Sources */, 03EEEAF92ABB985D0087F8D8 /* CommunityModel.swift in Sources */, + 039B4FE92BD2D81D00E42114 /* BlockListView.swift in Sources */, CD391F8B2A53371300E213B5 /* ExpandedPostLogic.swift in Sources */, CD16A0682B670327000312D2 /* UserContentFeedView.swift in Sources */, CD4BAD352B4B2C0B00A1E726 /* FeedsView.swift in Sources */, CDCBD7242A8D62FF00387A2C /* InstanceMetadata.swift in Sources */, + CDB652572B8EAE15007B7797 /* APIPostResponse.swift in Sources */, + CD268C142B9A3DD80074DBEE /* CommunityListRowBody.swift in Sources */, CD18DC6B2A5202D4002C56BC /* MarkPersonMentionAsReadRequest.swift in Sources */, - CD16A06A2B670ABE000312D2 /* UserContentFeedView+Logic.swift in Sources */, + 03D89E722BB1BB0100F49DB3 /* ListCommentLikesRequest.swift in Sources */, + 030245C22BA60A2600D07747 /* ToolbarEllipsisMenu.swift in Sources */, + CDD0B8DC2BBF4238003E7174 /* ListPostReportsRequest.swift in Sources */, CD4BAD3B2B4C6C3200A1E726 /* FeedRowView.swift in Sources */, + 03B85A402BB38868003C4203 /* PostEllipsisMenus.swift in Sources */, CD1824402AA8E24100D9BEB5 /* View+DestructiveConfirmation.swift in Sources */, CD82A2502A7162D400111034 /* GetPersonUnreadCount.swift in Sources */, 0317D4712B55AE0700EEE72C /* Color+Hex.swift in Sources */, 030D00882AD1BB2600953B1D /* UserModel+ContentModel.swift in Sources */, CD82A24C2A70A26900111034 /* View+CustomBadge.swift in Sources */, B1CB6E752A4C729D00DA9675 /* Bundle+IconFileName.swift in Sources */, + 03C942922B6457B4002068A4 /* BanUserEditorModel.swift in Sources */, + CD2698212B9E18350002B459 /* APIAdminPurgePost.swift in Sources */, 030D4AE82AA1278400A3393D /* ErrorDetails+Mock.swift in Sources */, + CD2697F82B9E15AD0002B459 /* APIModTransferCommunityView.swift in Sources */, + 039C59AB2BADC85400C18765 /* RemoveCommentRequest.swift in Sources */, CD4368C62AE240BF00BD8BD1 /* MessageModel.swift in Sources */, + CD2BFE782B9F60AC00717611 /* APIClient+Instance.swift in Sources */, 6363D60427EE20A200E34822 /* Expanded Post.swift in Sources */, 6DE1183C2A4A217400810C7E /* Profile View.swift in Sources */, + CD2BFE7E2B9F670B00717611 /* ModlogEntryView.swift in Sources */, + CDD0B8B22BB4D990003E7174 /* CommentReportModel+InboxItem.swift in Sources */, CD04D5DF2A361585008EF95B /* Empty Button Style.swift in Sources */, + CD7798A62BB0E5B50067DF82 /* InboxView.swift in Sources */, CD69F55B2A400D820028D4F7 /* App Theme.swift in Sources */, CDEBC3392A9ADE6C00518D9D /* APIClient+Post.swift in Sources */, E4A7BFD12B35912500B95F56 /* InboxMessageView.swift in Sources */, + 030245C02BA607EA00D07747 /* FeedToolbarContent.swift in Sources */, + CD2697F62B9E15A60002B459 /* APIModAddCommunityView.swift in Sources */, CDF9EF332AB2845C003F885B /* Icons.swift in Sources */, B14E93C22A45D3B300D6DA93 /* Community Link.swift in Sources */, 637218712A3A2AAD008C4816 /* GetSite.swift in Sources */, CD29ED3D2B2E863C006937CE /* String+WithEscapedCharacters.swift in Sources */, + CDD0B8F22BBF8406003E7174 /* InboxMessageReportView.swift in Sources */, CD0BE42F2A65A73600314B24 /* Haptic Manager.swift in Sources */, + CDD0B8C52BB78056003E7174 /* ResolveButtonView.swift in Sources */, 50811B422A92061E006BA3F2 /* SavedAccount+Mock.swift in Sources */, + 03AFBEAB2B6EAA0C00F01F3C /* APILocalSite+Mock.swift in Sources */, + CD2697E52B9E14FB0002B459 /* GetModlogRequest.swift in Sources */, CD29ED392B2E860C006937CE /* String+Trimmed.swift in Sources */, - 03C897F62ABF49BD005F3403 /* Abbreviate Numbers.swift in Sources */, 637218522A3A2AAD008C4816 /* APIFederatedInstances.swift in Sources */, CD59E8A52A72C943005757F4 /* MarkAllAsReadRequest.swift in Sources */, 03A1B3F22A83F33900AB0DE0 /* DownvoteCounterView.swift in Sources */, @@ -3406,17 +4140,23 @@ 031BF9532AB24BAF00F4517F /* SiteVersion.swift in Sources */, 637218452A3A2AAD008C4816 /* APICommentAggregates.swift in Sources */, 6D80037B2A46458800363206 /* Lazy Load Expanded Post.swift in Sources */, + CDB652592B8EC024007B7797 /* LockPostRequest.swift in Sources */, 6372184F2A3A2AAD008C4816 /* APIPerson.swift in Sources */, + CDD0B8D82BBF3C5A003E7174 /* PostReportTracker.swift in Sources */, CD4368BC2AE23F6F00BD8BD1 /* TrackerSort.swift in Sources */, + CDD0B8E62BBF57D9003E7174 /* ResolvePostReportRequest.swift in Sources */, E46AF98E2B29A4AA0087FDF3 /* DismissAction.swift in Sources */, + CDD0EFA22B7D9E5800CA3504 /* UserListRowBody.swift in Sources */, CD45BCEE2A75CA7200A2899C /* Thumbnail Image View.swift in Sources */, E4A7BFD32B35913F00B95F56 /* InboxMentionView.swift in Sources */, 03A1B3F92A8400DD00AB0DE0 /* APIContentViewProtocol.swift in Sources */, 6322A5D027F8629700135D4F /* UserLinkView.swift in Sources */, 030E864C2AC7037F000283A6 /* SearchBarExtensions.swift in Sources */, 6372184B2A3A2AAD008C4816 /* APIPostAggregates.swift in Sources */, + CD876EC72B7736370075DC15 /* MarkReadBatcher+Dependency.swift in Sources */, 50A8812C2A72D727003E3661 /* CommunityRepository+Dependency.swift in Sources */, 0394398F2A98EB2300463032 /* APIComment+Mock.swift in Sources */, + 030245CA2BA70F5200D07747 /* LinksSettingsView.swift in Sources */, E453477E2A9DE37300D1B46F /* Array+SafeIndexing.swift in Sources */, CD4368BE2AE23FA600BD8BD1 /* LoadingState.swift in Sources */, CD9DD8852A62302A0044EA8E /* ConcreteEditorModel.swift in Sources */, @@ -3427,11 +4167,15 @@ 03F76FA02B2F5EF900E2B54A /* LinkAttachmentModel.swift in Sources */, 6372185A2A3A2AAD008C4816 /* APISubscribedStatus.swift in Sources */, CDDCF6452A66375E003DA3AC /* View+FancyTabItem.swift in Sources */, + CD2698192B9E17DE0002B459 /* APIModTransferCommunity.swift in Sources */, 6DA61F872A5720EA001EA633 /* RecentSearchesTracker.swift in Sources */, 03B15BED2B55CBBB00E7C30A /* MarkdownTheme.swift in Sources */, + 03CEE04B2B6EB9CD00D65B1B /* Fediseer.swift in Sources */, CD4368DD2AE24E1A00BD8BD1 /* InboxView+Logic.swift in Sources */, 03A276792AFD903600C0D66B /* CommunityModel+MenuFunctions.swift in Sources */, + CD0D5A432B8EC4DA005E3365 /* RemovePostRequest.swift in Sources */, 637218762A3A2AAD008C4816 /* BlockCommunity.swift in Sources */, + CDD0B8B92BB4E407003E7174 /* ListCommentReportsRequest.swift in Sources */, 03CB329E2A6D8E910021EF27 /* PostComposerView.swift in Sources */, CD69F5752A42479A0028D4F7 /* Comment Item Logic.swift in Sources */, 6D7782342A48EE8C008AC1BF /* APIPrivateMessageView.swift in Sources */, @@ -3443,9 +4187,12 @@ CD309C462A93FBD300988F95 /* Logo View.swift in Sources */, CD9A49D72B059303001E18A0 /* ImageSaver.swift in Sources */, 03E90FB12B3703ED00E5A802 /* AccountSortMode.swift in Sources */, + CD436F292BD325CB001711B9 /* String+StrippingDiacritics.swift in Sources */, CDC1C93C2A7AA76000072E3D /* InternetSpeed.swift in Sources */, 50EC39B22A346DDC00E014C2 /* URLHandler.swift in Sources */, + 03AFBEAD2B6EAAF000F01F3C /* APILocalSiteRateLimit+Mock.swift in Sources */, 63F0C7BF2A058EDE00A18C5D /* Get Correct URL to Endpoint.swift in Sources */, + CDD0EF9E2B7D6F3E00CA3504 /* ModToolSheet.swift in Sources */, 031F95572B5C7FF20069C244 /* InstanceDetailsView.swift in Sources */, 632E8EE827EE63DB007E8D75 /* DownvoteButtonView.swift in Sources */, 50D61E5B2AA32B9400A926EC /* APISession.swift in Sources */, @@ -3454,12 +4201,15 @@ 6372186D2A3A2AAD008C4816 /* EditComment.swift in Sources */, 6D693A4A2A51B98F009E2D76 /* APICommentReportView.swift in Sources */, 637218622A3A2AAD008C4816 /* DeletePost.swift in Sources */, + CDD0B9062BC089EA003E7174 /* RegistrationApplication+InboxItem.swift in Sources */, 505240E32A86916500EA4558 /* FavoriteCommunitiesTracker+Dependency.swift in Sources */, + CD17C1D92BA2660300A0C8BC /* ModlogNavigationLinkView.swift in Sources */, 6332FDC327EFCB5F0009A98A /* Color+Colors.swift in Sources */, E46AF9942B29AB270087FDF3 /* EnvironmentValues+ScrollViewReaderProxy.swift in Sources */, 637218432A3A2AAD008C4816 /* APIClient.swift in Sources */, CD82A2572A716D7C00111034 /* PersonRepository+Dependency.swift in Sources */, 63DF71F12A02999C002AC14E /* App Constants.swift in Sources */, + CDD0B8E42BBF4D4B003E7174 /* InboxPostReportBodyView.swift in Sources */, CD82A2532A716B8100111034 /* PersonRepository.swift in Sources */, CD69F55F2A40121D0028D4F7 /* Ellipsis Menu.swift in Sources */, CD4368D52AE2463900BD8BD1 /* MessageModel+InboxItem.swift in Sources */, @@ -3471,26 +4221,35 @@ 6D693A482A51B904009E2D76 /* CreateCommentReport.swift in Sources */, CD2E182B2A3B708500224F8A /* Settings Options.swift in Sources */, 50A881282A71D66B003E3661 /* APIClient+Community.swift in Sources */, + CDD0B8D52BBB41CC003E7174 /* InboxFeedView.swift in Sources */, 039C8DB72B35A32D0096BAAF /* AccountSwitcherSettingsView.swift in Sources */, CD29ED472B2E8785006937CE /* EnvironmentValues+NavigationPath.swift in Sources */, CD2053142ACBAF150000AA38 /* AvatarType.swift in Sources */, CD69F55D2A400DF50028D4F7 /* UIUserInterfaceStyle+SettingsOptions.swift in Sources */, CDF1EF182A6C40C9003594B6 /* Menu Button.swift in Sources */, + CD5050542B807BF800632C56 /* AddModToCommunity.swift in Sources */, 6D91D4552A415994006B8F9A /* CommunityListSidebarEntry.swift in Sources */, 50A8812A2A72D6BD003E3661 /* CommunityRepository.swift in Sources */, + CD0D5A452B8EC5D9005E3365 /* RemovePostView.swift in Sources */, 6FF17D082B685D0D007E1814 /* BiometricUnlock.swift in Sources */, 038A16E72A7A9C430087987E /* LayoutWidgetCollection.swift in Sources */, 6322A5D227F88CFD00135D4F /* Time Parser.swift in Sources */, + CD2697EC2B9E156D0002B459 /* APIModFeaturePostView.swift in Sources */, AD1B0D352A5F63F60006F554 /* AboutView.swift in Sources */, + 030245C82BA617FE00D07747 /* PurgeCommunityRequest.swift in Sources */, 50811B442A920945006BA3F2 /* APIPost+Mock.swift in Sources */, 030E86462AC6FC1B000283A6 /* DefaultTextInputType.swift in Sources */, + 03B85A3C2BB34D1F003C4203 /* PurgeContentView.swift in Sources */, + 030FF6862BCB218000F6BFAC /* Int+Abbreviated.swift in Sources */, 50811B3A2A920569006BA3F2 /* APIPerson+Mock.swift in Sources */, 03C897F82ABF652D005F3403 /* SearchRoot.swift in Sources */, + 03CEE04D2B6EBEA800D65B1B /* InstanceView+Logic.swift in Sources */, 637218612A3A2AAD008C4816 /* CreatePostLike.swift in Sources */, CD69F5712A422EDD0028D4F7 /* InteractionBarView.swift in Sources */, 50C99B5C2A61F5EB005D57DD /* CommentRepository.swift in Sources */, 637218732A3A2AAD008C4816 /* FollowCommunity.swift in Sources */, 03B7AAF12ABE404300068B23 /* ContentModel.swift in Sources */, + CDD0B8F02BBF7FB7003E7174 /* MessageReportModel+InboxItem.swift in Sources */, 637218742A3A2AAD008C4816 /* ListCommunities.swift in Sources */, CD1446182A58FC3B00610EF1 /* InfoStackView.swift in Sources */, CDE9CE4F2A7B0B1B002B97DD /* Haptic.swift in Sources */, @@ -3500,13 +4259,16 @@ CDE3BA872A8C25B000B972E2 /* OnboardingView.swift in Sources */, CD9A03C62B34D20500C16276 /* EnvironmentValues+Navigation.swift in Sources */, 5064D0412A6E63E000B22EE3 /* Task+Notifiable.swift in Sources */, + CDD0B8F62BC064F0003E7174 /* ResolvePrivateMessageReportRequest.swift in Sources */, 63F0C7BD2A058CD200A18C5D /* Check if Endpoint Exists.swift in Sources */, - E4D4DBA02A7C7B9D00C4F3DE /* Comments.swift in Sources */, + E4D4DBA02A7C7B9D00C4F3DE /* Animations.swift in Sources */, 03EF1D0C2B434CB10056175C /* CommunityDetailsView.swift in Sources */, 6363D5C727EE196700E34822 /* ContentView.swift in Sources */, 03F4DC9D2B193F4C00556C67 /* MatrixLinkView.swift in Sources */, + 03AFBEA92B6EA9BC00F01F3C /* APISiteView+Mock.swift in Sources */, 03A54C322B5331F30064CCDE /* InstanceView.swift in Sources */, 035EB0CA2A8687C200227859 /* JumpButtonView.swift in Sources */, + CD26980A2B9E166D0002B459 /* APIModLockPost.swift in Sources */, 5016A2B12A67EB8600B257E8 /* UIViewController+TopMostViewController.swift in Sources */, 6372184C2A3A2AAD008C4816 /* APIPostView.swift in Sources */, CD12627D2B475E45007549F9 /* PostModel+TrackerItem.swift in Sources */, @@ -3515,12 +4277,18 @@ 0308E1162B0EA42B000CA955 /* APILocalUserView.swift in Sources */, 030E863F2AC6C5E9000283A6 /* PictrsImageModel.swift in Sources */, 632E8EE627EE63D3007E8D75 /* UpvoteButtonView.swift in Sources */, + CDBA5FCA2BD17F3D00469C05 /* CommunityListModel.swift in Sources */, + CDD0B9022BC084A9003E7174 /* DenyApplicationView.swift in Sources */, B1A26FE32A45B11800B91A32 /* View+HandleLemmyLinks.swift in Sources */, 03B643572A6864CD00F65700 /* TabBarSettingsView.swift in Sources */, CDF842642A49EAFA00723DA0 /* GetPersonMentions.swift in Sources */, CD6A2A792B1A553500003E23 /* SuccessResponse.swift in Sources */, 031A61802B1CEA7300ABF23B /* ChangePassword.swift in Sources */, + 030245C42BA6123A00D07747 /* RemoveCommunityView.swift in Sources */, + CDB652552B8EAC3E007B7797 /* APIPostFeatureType.swift in Sources */, CD4368B42AE23F3500BD8BD1 /* ChildTrackerProtocol.swift in Sources */, + CDD0B90A2BC08E02003E7174 /* InboxRegistrationApplicationView.swift in Sources */, + 03AFBEA32B6EA86B00F01F3C /* SiteResponse+Mock.swift in Sources */, 0355DA512B5EB87700CDF5A5 /* InstanceResultView.swift in Sources */, CD4368D92AE2478300BD8BD1 /* MentionModel+InboxItem.swift in Sources */, CDB45C5A2AF0AEFE00A1FF08 /* AlternativeIconLabel.swift in Sources */, @@ -3528,12 +4296,16 @@ 0308E1182B0EA466000CA955 /* APILocalUser.swift in Sources */, CDA217F32A63202600BDA173 /* View+NsfwOverlay.swift in Sources */, CDB45C602AF1AF4900A1FF08 /* MentionModel+TrackerItem.swift in Sources */, + 03B85A3E2BB36C4B003C4203 /* UserRemovalWalker.swift in Sources */, + CDD0B8F42BBF843C003E7174 /* InboxMessageReportBodyView.swift in Sources */, 6372184E2A3A2AAD008C4816 /* APIPersonView.swift in Sources */, 6363D5FA27EE1BDA00E34822 /* SettingsView.swift in Sources */, + CDD0B8C72BB78260003E7174 /* RemoveButtonView.swift in Sources */, CDDCF6532A677F45003DA3AC /* TabSelection.swift in Sources */, CD4368C42AE240B100BD8BD1 /* MentionModel.swift in Sources */, 03A2767D2AFE656700C0D66B /* UserModel+MenuFunctions.swift in Sources */, 0308E1142B0EA32A000CA955 /* AccountSettingsView.swift in Sources */, + CD2697EA2B9E15610002B459 /* APIModLockPostView.swift in Sources */, 6372184D2A3A2AAD008C4816 /* APIErrorResponse.swift in Sources */, CD7B53B92A5F263D00006E81 /* APIPrivateMessageReport.swift in Sources */, 637218602A3A2AAD008C4816 /* EditPost.swift in Sources */, @@ -3541,16 +4313,21 @@ CD29ED372B2E85EA006937CE /* String+Alphabet.swift in Sources */, 637218562A3A2AAD008C4816 /* APILocalSite.swift in Sources */, CDA217EE2A630F3300BDA173 /* ReportPost.swift in Sources */, + 039C59A92BADA5DA00C18765 /* PurgeCommentRequest.swift in Sources */, 03E79F3F2AE3E7100006700D /* SortingSettingsView.swift in Sources */, 039C8DB92B35A81C0096BAAF /* AccountIconStack.swift in Sources */, + CD2698022B9E15D60002B459 /* APIAdminPurgeCommentView.swift in Sources */, CDCBD7262A8D69A200387A2C /* Instance Picker View.swift in Sources */, 03C905CE2B3C8DC400B9082F /* UserView+Logic.swift in Sources */, + CDD0B9082BC08A6D003E7174 /* RegistrationApplicationTracker.swift in Sources */, CDEC95122B5B318B004BA288 /* CommunityFeedView.swift in Sources */, 6372185B2A3A2AAD008C4816 /* APICommunityView.swift in Sources */, 030E86442AC6F6D5000283A6 /* SearchBar+NavigationView.swift in Sources */, 637218552A3A2AAD008C4816 /* APITagline.swift in Sources */, + CD9395272BA7CF92008F6C4C /* ModlogAction.swift in Sources */, 6322A5CB27F77A4D00135D4F /* Loading View.swift in Sources */, 03A1B3F72A84000400AB0DE0 /* APIContentAggregatesProtocol.swift in Sources */, + CD26980C2B9E16810002B459 /* APIModRemoveComment.swift in Sources */, 032C1E042B5D7DAC00FB4F23 /* QuickSwitcherSettingsView.swift in Sources */, CD4DBC032A6F803C001A1E61 /* ReplyToPost.swift in Sources */, CD6483302A38D31C00EE6CA3 /* UpvoteCounterView.swift in Sources */, @@ -3559,9 +4336,13 @@ 88B165B82A8643F4007C9115 /* View+NavigationBarColor.swift in Sources */, 030AC0522A64666C00037155 /* UserSettingsView.swift in Sources */, CDA2C5262A705D6000649D5A /* PostEditor.swift in Sources */, + CDD0B9042BC08987003E7174 /* RegistrationApplication+TrackerItem.swift in Sources */, + 03F0DF582B9E24EF0018F239 /* PurgePersonRequest.swift in Sources */, E449C5912B2AA8A300E3BCF4 /* AccountDiscussionLanguagesView.swift in Sources */, 6372184A2A3A2AAD008C4816 /* APIPost.swift in Sources */, 6D693A3E2A5113DF009E2D76 /* CreatePostReport.swift in Sources */, + CDD0B9002BC080C7003E7174 /* ApproveRegistrationApplicationRequest.swift in Sources */, + 033EC0AF2BD3030A00AA238F /* BlockListView+Logic.swift in Sources */, E46AF9922B29AA350087FDF3 /* ScrollToView.swift in Sources */, CD391F942A533B7700E213B5 /* EditorModelProtocol.swift in Sources */, CD69F56F2A41EDF50028D4F7 /* View+SwipeyActions.swift in Sources */, @@ -3571,21 +4352,25 @@ CD6483322A38D3A600EE6CA3 /* ScoreCounterView.swift in Sources */, 50CC4A7A2A9CC45D0074C845 /* InstanceMetadata+Mock.swift in Sources */, 6318DE5427FB958800CC2AD6 /* Stickied Tag.swift in Sources */, + CDD0B8DE2BBF4601003E7174 /* PostReportModel+InboxItem.swift in Sources */, CD7B53B72A5F258B00006E81 /* APIPrivateMessageReportView.swift in Sources */, 030AC04F2A6464DA00037155 /* CommunitySettingsView.swift in Sources */, 6386E03A2A0455BC006B3C1D /* String+Contains.swift in Sources */, 63F0C7A62A05225100A18C5D /* Saved Account.swift in Sources */, 637218462A3A2AAD008C4816 /* APIComment.swift in Sources */, CDCBD7282A8D6B7700387A2C /* Instance Picker View Logic.swift in Sources */, + CD5F76BC2B75BE700013A827 /* MarkReadBatcher.swift in Sources */, 637457102A18CB6600B69C03 /* Custom Text Field.swift in Sources */, 038A16E12A75AA880087987E /* LayoutWidgetModel.swift in Sources */, 63344C4F2A07BD2A001BC616 /* Filters Tracker.swift in Sources */, 03B7AAEF2ABCB9DC00068B23 /* ContentTracker.swift in Sources */, CDEC95142B5CBC42004BA288 /* AggregateFeedView+Logic.swift in Sources */, + CDD0B8B62BB4DC12003E7174 /* CommentReportTracker.swift in Sources */, 50811B2C2A920443006BA3F2 /* Date+Mock.swift in Sources */, CD391FA02A545F8600E213B5 /* Compact Post.swift in Sources */, B1A5A8152A4C882F00F203DB /* AlternativeIcon.swift in Sources */, 637218512A3A2AAD008C4816 /* APILocalSiteRateLimit.swift in Sources */, + 03AFBEB12B6EAD5B00F01F3C /* InstanceSafetyView.swift in Sources */, 50BC1ABB2A8D6A5A00E3C48B /* ScoringOperation.swift in Sources */, CD4368BA2AE23F6400BD8BD1 /* TrackerItem.swift in Sources */, 6386E0362A042C59006B3C1D /* Contributor.swift in Sources */, @@ -3594,32 +4379,45 @@ CD82A2552A716C7C00111034 /* APIPersonUnreadCounts.swift in Sources */, CD04D5E72A3636FB008EF95B /* Headline Post.swift in Sources */, 50A8812E2A72D76C003E3661 /* APIClient+Comment.swift in Sources */, + CDD0B8CF2BBA0D31003E7174 /* ResolveCommentReportRequest.swift in Sources */, + 030FF6882BCEE58900F6BFAC /* BlockInstance.swift in Sources */, 6363D5C527EE196700E34822 /* MlemApp.swift in Sources */, CDF1EF162A6C3BC2003594B6 /* End Of Feed View.swift in Sources */, + CDD0B8D32BBB4158003E7174 /* InboxView+Feeds.swift in Sources */, + CDD0B8CD2BB9E53F003E7174 /* Removable.swift in Sources */, 637218542A3A2AAD008C4816 /* APILanguage.swift in Sources */, + CDD0EF9C2B7D6B9100CA3504 /* ModToolTracker.swift in Sources */, CD963FCB2B5F0388002352FD /* DefaultFeedType.swift in Sources */, 50CC4A722A9CB07F0074C845 /* TimeInterval+Period.swift in Sources */, + CDD0B8C32BB5BCFD003E7174 /* InboxCommentReportBodyView.swift in Sources */, AD1B0D372A5F7A260006F554 /* Licenses.swift in Sources */, 6372186E2A3A2AAD008C4816 /* DeleteComment.swift in Sources */, CDB45C5C2AF1A1D800A1FF08 /* CoreTracker.swift in Sources */, 507573982A5AD60100AA7ABD /* ErrorAlert.swift in Sources */, CD4368AE2AE23ED400BD8BD1 /* StandardTracker.swift in Sources */, + CDD0B8F82BC07E6A003E7174 /* ListRegistrationApplicationsRequest.swift in Sources */, + CD50504D2B80065300632C56 /* Date+DaysFromNow.swift in Sources */, CDE6A8182A490AF20062D161 /* InboxMentionBodyView.swift in Sources */, CD3FBCDD2A4A6F0600B2063F /* GetReplies.swift in Sources */, CD4368DB2AE247B700BD8BD1 /* MentionTracker.swift in Sources */, + CD2697FC2B9E15C10002B459 /* APIAdminPurgePersonView.swift in Sources */, E49E01F42ABD99D300E42BB3 /* Routable.swift in Sources */, 03F4DC9F2B1A8AD500556C67 /* SignInAndSecuritySettingsView.swift in Sources */, 03F76FA62B2F5F4700E2B54A /* LinkUploadOptionsView.swift in Sources */, 6D15D74C2A44DC240061B5CB /* Date+Formatter.swift in Sources */, + CD2698122B9E17660002B459 /* APIModRemoveCommunity.swift in Sources */, CDA217E62A63016A00BDA173 /* ReportMessage.swift in Sources */, + CDD0B8C12BB5BC51003E7174 /* InboxMessageBodyView.swift in Sources */, CD9DD8832A622A6C0044EA8E /* ReportCommentReply.swift in Sources */, 6FB4A4DE2B47860B00A7CD82 /* CollapsedCommentReplies.swift in Sources */, - CD3FBCE12A4A836000B2063F /* AllItemsFeedView.swift in Sources */, + CDD0B8AB2BB37B3D003E7174 /* WebsiteIndicatorView.swift in Sources */, 6D91D4582A4159D8006B8F9A /* FavoriteStarButtonStyle.swift in Sources */, 63F0C7B92A0533C700A18C5D /* Add Account View.swift in Sources */, 63E5D3922A13CF2300EC1FBD /* Favorite Community Tracker.swift in Sources */, B1B78D642A51D53900F72485 /* AppDelegate.swift in Sources */, 03A1B3F42A83F46200AB0DE0 /* ShareButtonView.swift in Sources */, + CD2698102B9E174C0002B459 /* APIModBanFromCommunity.swift in Sources */, + CDD0B8EC2BBF7D0F003E7174 /* ListPrivateMessageReportsRequest.swift in Sources */, 03FD64FF2AE53D0E00957AA9 /* CommunityModel+ContentModel.swift in Sources */, 6DA61F812A55B83F001EA633 /* SearchView.swift in Sources */, ); @@ -3799,6 +4597,7 @@ INFOPLIST_FILE = Mlem/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Mlem; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "$(PRODUCT_NAME) requires Face ID permissions for app locking feature."; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = ""; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -3811,7 +4610,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.hanners.Mlem; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -3841,6 +4640,7 @@ INFOPLIST_FILE = Mlem/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Mlem; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "$(PRODUCT_NAME) requires Face ID permissions for app locking feature."; INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = ""; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -3853,7 +4653,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2; + MARKETING_VERSION = 1.3; PRODUCT_BUNDLE_IDENTIFIER = com.hanners.Mlem; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -3990,6 +4790,14 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ + 03F6D4B62B951D64008235A0 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/siteline/SwiftUI-Introspect"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.1.3; + }; + }; 50C99B542A61D792005D57DD /* XCRemoteSwiftPackageReference "swift-dependencies" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/pointfreeco/swift-dependencies"; @@ -4033,6 +4841,11 @@ /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ + 03F6D4B82B951E21008235A0 /* SwiftUIIntrospect */ = { + isa = XCSwiftPackageProductDependency; + package = 03F6D4B62B951D64008235A0 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; + productName = SwiftUIIntrospect; + }; 50C99B552A61D792005D57DD /* Dependencies */ = { isa = XCSwiftPackageProductDependency; package = 50C99B542A61D792005D57DD /* XCRemoteSwiftPackageReference "swift-dependencies" */; diff --git a/Mlem.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Mlem.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index d9b5f5c17..acfdc223d 100644 --- a/Mlem.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Mlem.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -72,6 +72,15 @@ "version" : "2.1.0" } }, + { + "identity" : "swiftui-introspect", + "kind" : "remoteSourceControl", + "location" : "https://github.com/siteline/SwiftUI-Introspect", + "state" : { + "revision" : "0cd2a5a5895306bc21d54a2254302d24a9a571e4", + "version" : "1.1.3" + } + }, { "identity" : "xctest-dynamic-overlay", "kind" : "remoteSourceControl", diff --git a/Mlem/API/APIClient/APIClient+Comment.swift b/Mlem/API/APIClient/APIClient+Comment.swift index 99c6430af..2b41804e8 100644 --- a/Mlem/API/APIClient/APIClient+Comment.swift +++ b/Mlem/API/APIClient/APIClient+Comment.swift @@ -101,4 +101,28 @@ extension APIClient { let request = try CreateCommentReportRequest(session: session, commentId: id, reason: reason) return try await perform(request: request) } + + func removeComment(id: Int, shouldRemove: Bool, reason: String?) async throws -> CommentResponse { + let request = try RemoveCommentRequest(session: session, commentId: id, removed: shouldRemove, reason: reason) + return try await perform(request: request) + } + + func purgeComment(id: Int, reason: String?) async throws -> SuccessResponse { + let request = try PurgeCommentRequest(session: session, commentId: id, reason: reason) + return try await perform(request: request) + } + + func getCommentLikes( + id: Int, + page: Int, + limit: Int? + ) async throws -> APIListCommentLikesResponse { + let request = try ListCommentLikesRequest( + session: session, + commentId: id, + page: page, + limit: limit + ) + return try await perform(request: request) + } } diff --git a/Mlem/API/APIClient/APIClient+Community.swift b/Mlem/API/APIClient/APIClient+Community.swift index c98904398..f5913c6c0 100644 --- a/Mlem/API/APIClient/APIClient+Community.swift +++ b/Mlem/API/APIClient/APIClient+Community.swift @@ -57,4 +57,74 @@ extension APIClient { return try await perform(request: request) } + + /// Bans the given user from the given community, provided the current user has permissions to do so + /// - Parameters: + /// - userId: id of the user to ban + /// - communityId: id of the community to ban the user from + /// - ban: true if user should be banned, false if unbanned + /// - removeData: true if user data should be removed from community, false or nil otherwise + /// - reason: reason for ban + /// - expires: expiration date of ban (unit???) + /// - Returns: updated ban status of user (true if banned, false otherwise) + func banFromCommunity( + userId: Int, + communityId: Int, + ban: Bool, + removeData: Bool? = nil, + reason: String? = nil, + expires: Int? = nil + ) async throws -> Bool { + let request = try BanFromCommunityRequest( + session: session, + communityId: communityId, + personId: userId, + ban: ban, + removeData: removeData, + reason: reason, + expires: expires + ) + + let response = try await perform(request: request) + + return response.banned + } + + func removeCommunity(id: Int, shouldRemove: Bool, reason: String?) async throws -> CommunityResponse { + let request = try RemoveCommunityRequest(session: session, communityId: id, removed: shouldRemove, reason: reason) + return try await perform(request: request) + } + + func purgeCommunity(id: Int, reason: String?) async throws -> SuccessResponse { + let request = try PurgeCommunityRequest(session: session, communityId: id, reason: reason) + return try await perform(request: request) + } + + /// Adds or removes the given user from the mod list of the given community + /// - Parameters: + /// - of: id of user to add/remove + /// - in: id of the community to add/remove to/from + /// - status: whether to add (true) or remove (false) + /// - Returns: new list of moderators + /// - Throws: error upon failed update + func updateModStatus(of userId: Int, in communityId: Int, status: Bool) async throws -> [UserModel] { + // perform update + let request = try AddModToCommunityRequest( + session: session, + communityId: communityId, + personId: userId, + added: status + ) + print(request) + let response = try await perform(request: request) + + // validate response + let isMod = response.moderators.contains(where: { $0.moderator.id == userId }) + if isMod != status { + throw ContextualError(title: "Failed to add mod", underlyingError: APIClientError.unexpectedResponse) + } + + // return new mod list + return response.moderators.map { UserModel(from: $0.moderator) } + } } diff --git a/Mlem/API/APIClient/APIClient+Instance.swift b/Mlem/API/APIClient/APIClient+Instance.swift new file mode 100644 index 000000000..a444d7081 --- /dev/null +++ b/Mlem/API/APIClient/APIClient+Instance.swift @@ -0,0 +1,93 @@ +// +// APIClient+Instance.swift +// Mlem +// +// Created by Eric Andrews on 2024-03-11. +// + +import Foundation + +extension APIClient { + // swiftlint:disable:next function_body_length + func getModlog( + for instanceUrl: URL? = nil, + modPersonId: Int? = nil, + communityId: Int? = nil, + page: Int, + limit: Int, + type: APIModlogActionType? = nil, + otherPersonId: Int? = nil + ) async throws -> [ModlogEntry] { + var useSession: APISession + + if let instanceUrl { + useSession = .unauthenticated(instanceUrl.appending(path: "/api/v3")) + } else { + useSession = session + } + + #if DEBUG + if let host = instanceUrl?.host(), ["lemmy-alpha", "lemmy-beta", "lemmy-delta"].contains(host) { + useSession = .unauthenticated(.init(string: "http://localhost:8536/api/v3")!) + } + #endif + + let request = try GetModlogRequest( + session: useSession, + modPersonId: nil, + communityId: communityId, + page: page, + limit: limit, + type_: type, + otherPersonId: otherPersonId + ) + + let response = try await perform(request: request) + + func isAdmin(for actorId: URL?) -> Bool { + // can only view admin actions if the logged in user is an admin and the modlog is sourced from their instance + siteInformation.isAdmin && actorId?.host() == siteInformation.instance?.url.host() + } + + func canViewRemovedPost(in community: APICommunity) -> Bool { + siteInformation.isMod(communityActorId: community.actorId) || + isAdmin(for: community.actorId) + } + + var ret: [ModlogEntry] = .init() + ret.append(contentsOf: response.removedPosts.map { ModlogEntry( + from: $0, + canViewRemovedPost: canViewRemovedPost(in: $0.community) + ) }) + ret.append(contentsOf: response.lockedPosts.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.featuredPosts.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.removedComments.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.removedCommunities.map { ModlogEntry( + from: $0, + canViewRemovedCommunity: isAdmin(for: $0.community.actorId) + ) }) + ret.append(contentsOf: response.bannedFromCommunity.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.banned.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.addedToCommunity.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.transferredToCommunity.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.added.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.adminPurgedPersons.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.adminPurgedCommunities.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.adminPurgedPosts.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.adminPurgedComments.map { ModlogEntry(from: $0) }) + ret.append(contentsOf: response.hiddenCommunities.map { ModlogEntry(from: $0) }) + + return ret.sorted(by: { $0.date > $1.date }) + } + + @discardableResult + func blockSite(id: Int, shouldBlock: Bool) async throws -> BlockInstanceResponse { + let request = try BlockInstanceRequest( + session: session, + instanceId: id, + block: shouldBlock + ) + + return try await perform(request: request) + } +} diff --git a/Mlem/API/APIClient/APIClient+Moderation.swift b/Mlem/API/APIClient/APIClient+Moderation.swift new file mode 100644 index 000000000..9b4699288 --- /dev/null +++ b/Mlem/API/APIClient/APIClient+Moderation.swift @@ -0,0 +1,268 @@ +// +// APIClient+Moderation.swift +// Mlem +// +// Created by Eric Andrews on 2024-03-27. +// + +import Foundation + +extension APIClient { + // MARK: - Comment Reports + + func loadCommentReports( + page: Int, + limit: Int, + unresolvedOnly: Bool, + communityId: Int? + ) async throws -> [CommentReportModel] { + // the request throws an error if the calling user is not mod or admin--should never be called + guard siteInformation.isAdmin || !siteInformation.moderatedCommunities.isEmpty else { + assertionFailure("loadCommentReports called by non-moderator user!") + return .init() + } + + let request = try ListCommentReportsRequest( + session: session, + page: page, + limit: limit, + unresolvedOnly: unresolvedOnly, + communityId: communityId + ) + let response = try await perform(request: request) + + return response.commentReports.map { report in + var resolver: UserModel? + if let apiResolver = report.resolver { + resolver = UserModel(from: apiResolver) + } + + return CommentReportModel( + reporter: UserModel(from: report.creator), + resolver: resolver, + commentCreator: UserModel(from: report.commentCreator), + community: CommunityModel(from: report.community), + commentReport: report.commentReport, + comment: report.comment, + votes: VotesModel(from: report.counts, myVote: report.myVote ?? .resetVote), + numReplies: report.counts.childCount, + commentCreatorBannedFromCommunity: report.creatorBannedFromCommunity + ) + } + } + + func markCommentReportResolved( + reportId: Int, + resolved: Bool + ) async throws -> CommentReportModel { + let request = try ResolveCommentReportRequest(session: session, reportId: reportId, resolved: resolved) + let response = try await perform(request: request) + + var resolver: UserModel? + if let apiResolver = response.commentReportView.resolver { + resolver = UserModel(from: apiResolver) + } + + return CommentReportModel( + reporter: UserModel(from: response.commentReportView.creator), + resolver: resolver, + commentCreator: UserModel(from: response.commentReportView.commentCreator), + community: CommunityModel(from: response.commentReportView.community), + commentReport: response.commentReportView.commentReport, + comment: response.commentReportView.comment, + votes: VotesModel(from: response.commentReportView.counts, myVote: response.commentReportView.myVote), + numReplies: response.commentReportView.counts.childCount, + commentCreatorBannedFromCommunity: response.commentReportView.creatorBannedFromCommunity + ) + } + + // MARK: - Post Reports + + func loadPostReports( + page: Int, + limit: Int, + unresolvedOnly: Bool, + communityId: Int? + ) async throws -> [PostReportModel] { + // the request throws an error if the calling user is not mod or admin--should never be called + guard siteInformation.isAdmin || !siteInformation.moderatedCommunities.isEmpty else { + assertionFailure("loadPostReports called by non-moderator user!") + return .init() + } + + let request = try ListPostReportsRequest( + session: session, + page: page, + limit: limit, + unresolvedOnly: unresolvedOnly, + communityId: communityId + ) + let response = try await perform(request: request) + + return response.postReports.map { report in + var resolver: UserModel? + if let apiResolver = report.resolver { + resolver = UserModel(from: apiResolver) + } + + return PostReportModel( + reporter: UserModel(from: report.creator), + resolver: resolver, + postCreator: UserModel(from: report.postCreator), + community: CommunityModel(from: report.community), + postReport: report.postReport, + post: report.post, + votes: VotesModel(from: report.counts, myVote: report.myVote ?? .resetVote), + numReplies: report.counts.comments, + postCreatorBannedFromCommunity: report.creatorBannedFromCommunity + ) + } + } + + func markPostReportResolved( + reportId: Int, + resolved: Bool + ) async throws -> PostReportModel { + let request = try ResolvePostReportRequest(session: session, reportId: reportId, resolved: resolved) + let response = try await perform(request: request) + + var resolver: UserModel? + if let apiResolver = response.postReportView.resolver { + resolver = UserModel(from: apiResolver) + } + + return PostReportModel( + reporter: UserModel(from: response.postReportView.creator), + resolver: resolver, + postCreator: UserModel(from: response.postReportView.postCreator), + community: CommunityModel(from: response.postReportView.community), + postReport: response.postReportView.postReport, + post: response.postReportView.post, + votes: VotesModel(from: response.postReportView.counts, myVote: response.postReportView.myVote ?? .resetVote), + numReplies: response.postReportView.counts.comments, + postCreatorBannedFromCommunity: response.postReportView.creatorBannedFromCommunity + ) + } + + // MARK: - Message Reports + + func loadMessageReports( + page: Int, + limit: Int, + unresolvedOnly: Bool + ) async throws -> [MessageReportModel] { + let request = try ListPrivateMessageReportsRequest(session: session, page: page, limit: limit, unresolvedOnly: unresolvedOnly) + let response = try await perform(request: request) + + return response.privateMessageReports.map { report in + var resolver: UserModel? + if let apiResolver = report.resolver { + resolver = UserModel(from: apiResolver) + } + + return MessageReportModel( + reporter: UserModel(from: report.creator), + resolver: resolver, + messageCreator: UserModel(from: report.privateMessageCreator), + messageReport: report.privateMessageReport + ) + } + } + + func markPrivateMessageReportResolved( + reportId: Int, + resolved: Bool + ) async throws -> MessageReportModel { + let request = try ResolvePrivateMessageReportRequest(session: session, reportId: reportId, resolved: resolved) + let response = try await perform(request: request).privateMessageReportView + + var resolver: UserModel? + if let apiResolver = response.resolver { + resolver = UserModel(from: apiResolver) + } + + return MessageReportModel( + reporter: UserModel(from: response.creator), + resolver: resolver, + messageCreator: UserModel(from: response.privateMessageCreator), + messageReport: response.privateMessageReport + ) + } + + // MARK: - Registration Applications + + func loadRegistrationApplications( + page: Int, + limit: Int, + unresolvedOnly: Bool + ) async throws -> [RegistrationApplicationModel] { + let request = try ListRegistrationApplicationsRequest(session: session, unreadOnly: unresolvedOnly, page: page, limit: limit) + let response = try await perform(request: request) + + return response.registrationApplications.map { registrationApplication in + var resolver: UserModel? + if let apiResolver = registrationApplication.admin { + resolver = UserModel(from: apiResolver) + } + + return RegistrationApplicationModel( + application: registrationApplication.registrationApplication, + creator: UserModel(from: registrationApplication.creator), + resolver: resolver, + approved: resolver != nil ? registrationApplication.creatorLocalUser.acceptedApplication : nil + ) + } + } + + func approveRegistrationApplication( + applicationId: Int, + approve: Bool, + denyReason: String? + ) async throws -> RegistrationApplicationModel { + let request = try ApproveRegistrationApplicationRequest( + session: session, + id: applicationId, + approve: approve, + denyReason: denyReason + ) + let response = try await perform(request: request).registrationApplication + + var resolver: UserModel? + if let apiResolver = response.admin { + resolver = UserModel(from: apiResolver) + } + + return RegistrationApplicationModel( + application: response.registrationApplication, + creator: UserModel(from: response.creator), + resolver: resolver, + approved: resolver != nil ? response.creatorLocalUser.acceptedApplication : nil + ) + } + + // MARK: - Unread Counts + + func getUnreadReports(for communityId: Int?) async throws -> APIGetReportCountResponse { + // the request throws an error if the calling user is not mod or admin--should never be called + guard siteInformation.isAdmin || !siteInformation.moderatedCommunities.isEmpty else { + assertionFailure("getUnreadReports called by non-moderator user!") + return .init(communityId: communityId, commentReports: 0, postReports: 0, privateMessageReports: 0) + } + + let request = try GetReportCountRequest(session: session, communityId: communityId) + let response = try await perform(request: request) + return response + } + + func getUnreadRegistrationApplications() async throws -> APIGetUnreadRegistrationApplicationCountResponse { + // the request throws an error if the calling user is not an admin--should never be called + guard siteInformation.isAdmin else { + assertionFailure("getUnreadRegistrationApplications called by non-admin user!") + return .init(registrationApplications: 0) + } + + let request = try GetUnreadRegistrationApplicationCountRequest(session: session) + let response = try await perform(request: request) + return response + } +} diff --git a/Mlem/API/APIClient/APIClient+Post.swift b/Mlem/API/APIClient/APIClient+Post.swift index 055ba6fe7..79bfe4c82 100644 --- a/Mlem/API/APIClient/APIClient+Post.swift +++ b/Mlem/API/APIClient/APIClient+Post.swift @@ -43,6 +43,13 @@ extension APIClient { return SuccessResponse(from: compatibilityResponse) } + func markPostsAsRead(for postIds: [Int], read: Bool) async throws -> SuccessResponse { + let request = try MarkPostReadRequest(session: session, postIds: postIds, read: read) + // TODO: 0.18 deprecation simply return result of perform + let compatibilityResponse = try await perform(request: request) + return SuccessResponse(from: compatibilityResponse) + } + func loadPost(id: Int, commentId: Int? = nil) async throws -> APIPostView { let request = try GetPostRequest(session: session, id: id, commentId: commentId) return try await perform(request: request).postView @@ -111,4 +118,44 @@ extension APIClient { let request = try SavePostRequest(session: session, postId: id, save: shouldSave) return try await perform(request: request).postView } + + func featurePost(id: Int, shouldFeature: Bool, featureType: APIPostFeatureType) async throws -> APIPostView { + let request = try FeaturePostRequest( + session: session, + postId: id, + featured: shouldFeature, + featureType: featureType + ) + return try await perform(request: request).postView + } + + func lockPost(id: Int, shouldLock: Bool) async throws -> APIPostView { + let request = try LockPostRequest(session: session, postId: id, locked: shouldLock) + return try await perform(request: request).postView + } + + func removePost(id: Int, shouldRemove: Bool, reason: String?) async throws -> PostModel { + let request = try RemovePostRequest(session: session, postId: id, removed: shouldRemove, reason: reason) + let response = try await perform(request: request).postView + return PostModel(from: response) + } + + func purgePost(id: Int, reason: String?) async throws -> SuccessResponse { + let request = try PurgePostRequest(session: session, postId: id, reason: reason) + return try await perform(request: request) + } + + func getPostLikes( + id: Int, + page: Int, + limit: Int? + ) async throws -> APIListPostLikesResponse { + let request = try ListPostLikesRequest( + session: session, + postId: id, + page: page, + limit: limit + ) + return try await perform(request: request) + } } diff --git a/Mlem/API/APIClient/APIClient.swift b/Mlem/API/APIClient/APIClient.swift index 4ac211de8..80bd255a3 100644 --- a/Mlem/API/APIClient/APIClient.swift +++ b/Mlem/API/APIClient/APIClient.swift @@ -5,6 +5,7 @@ // Created by Nicholas Lawson on 04/06/2023. // +import Dependencies import Foundation // swiftlint:disable file_length @@ -21,6 +22,7 @@ enum APIClientError: Error { case cancelled case invalidSession case decoding(Data, Error?) + case unexpectedResponse } extension APIClientError: CustomStringConvertible { @@ -49,11 +51,15 @@ extension APIClientError: CustomStringConvertible { } return "Unable to decode: \(string)" + case .unexpectedResponse: + return "Unexpected response" } } } class APIClient { + @Dependency(\.siteInformation) var siteInformation + let urlSession: URLSession let decoder: JSONDecoder let transport: (URLSession, URLRequest) async throws -> (Data, URLResponse) @@ -173,6 +179,8 @@ class APIClient { } else if let putDefinition = definition as? any APIPutRequest { urlRequest.httpMethod = "PUT" urlRequest.httpBody = try createBodyData(for: putDefinition) + } else if let deleteDefinition = definition as? any APIDeleteRequest { + urlRequest.httpMethod = "DELETE" } return urlRequest @@ -256,6 +264,23 @@ extension APIClient { return try await perform(request: request) } + func banPerson(id: Int, shouldBan: Bool, expires: Int?, reason: String?, removeData: Bool) async throws -> BanPersonResponse { + let request = try BanPersonRequest( + session: session, + personId: id, + ban: shouldBan, + expires: expires, + reason: reason, + removeData: removeData + ) + return try await perform(request: request) + } + + func purgePerson(id: Int, reason: String?) async throws -> SuccessResponse { + let request = try PurgePersonRequest(session: session, personId: id, reason: reason) + return try await perform(request: request) + } + func markPersonMentionAsRead(mentionId: Int, isRead: Bool) async throws -> APIPersonMentionView { let request = try MarkPersonMentionAsRead(session: session, personMentionId: mentionId, read: isRead) return try await perform(request: request).personMentionView diff --git a/Mlem/API/APIRequest.swift b/Mlem/API/APIRequest.swift index 6e5286289..b30fbada2 100644 --- a/Mlem/API/APIRequest.swift +++ b/Mlem/API/APIRequest.swift @@ -23,6 +23,8 @@ protocol APIRequest { var headers: [String: String] { get } } +protocol APIDeleteRequest: APIRequest {} + extension APIRequest { var headers: [String: String] { defaultHeaders } diff --git a/Mlem/API/Internal/HierarchicalComment.swift b/Mlem/API/Internal/HierarchicalComment.swift index 9883b7544..9ca461d5e 100644 --- a/Mlem/API/Internal/HierarchicalComment.swift +++ b/Mlem/API/Internal/HierarchicalComment.swift @@ -5,11 +5,19 @@ // Created by Nicholas Lawson on 08/06/2023. // +import Dependencies import Foundation +import SwiftUI /// A model which represents a comment and it's child relationships -class HierarchicalComment: ObservableObject { +class HierarchicalComment: Purgable, ObservableObject { + @Dependency(\.apiClient) var apiClient + @Dependency(\.hapticManager) var hapticManager + @Dependency(\.errorHandler) var errorHandler + @Published var commentView: APICommentView + @Published var purged: Bool = false + var children: [HierarchicalComment] /// Indicates comment's position in a post's parent/child comment thread. /// Values range from `0...Int.max`, where 0 indicates the parent comment. @@ -37,6 +45,26 @@ class HierarchicalComment: ObservableObject { self.isCollapsed = shouldCollapseChildren && depth == 1 || collapsed self.links = comment.comment.content.parseLinks() } + + func purge(reason: String?) async -> Bool { + DispatchQueue.main.async { + self.purged = true + } + do { + let response = try await apiClient.purgeComment(id: commentView.id, reason: reason) + if !response.success { + throw APIClientError.unexpectedResponse + } + return true + } catch { + DispatchQueue.main.async { + self.hapticManager.play(haptic: .failure, priority: .high) + self.errorHandler.handle(error) + self.purged = false + } + } + return false + } } extension HierarchicalComment: Identifiable { @@ -158,9 +186,30 @@ extension HierarchicalComment { } } +extension HierarchicalComment: Removable { + func remove(reason: String?, shouldRemove: Bool) async -> Bool { + do { + let response = try await apiClient.removeComment( + id: commentView.comment.id, + shouldRemove: shouldRemove, + reason: reason + ) + DispatchQueue.main.async { + self.commentView = response.commentView + } + return true + } catch { + errorHandler.handle(error) + } + return false + } +} + extension [APICommentView] { /// A representation of this array of `APICommentView` in a hierarchy that is suitable for rendering the UI with parent/child relationships var hierarchicalRepresentation: [HierarchicalComment] { + @AppStorage("collapseChildComments") var collapseChildComments = false + var allComments = self let childrenStartIndex = allComments.partition(by: { $0.comment.parentId != nil }) @@ -173,7 +222,6 @@ extension [APICommentView] { } let identifiedComments = Dictionary(uniqueKeysWithValues: allComments.lazy.map { ($0.id, $0) }) - let collapseChildComments = UserDefaults.standard.bool(forKey: "collapseChildComments") /// Recursively populates child comments by looking up IDs from `childrenById` func populateChildren(_ comment: APICommentView) -> HierarchicalComment { diff --git a/Mlem/API/Models/Comments/APIComment.swift b/Mlem/API/Models/Comments/APIComment.swift index 355332713..6c8b006e5 100644 --- a/Mlem/API/Models/Comments/APIComment.swift +++ b/Mlem/API/Models/Comments/APIComment.swift @@ -13,7 +13,7 @@ struct APIComment: Decodable, Identifiable { let creatorId: Int let postId: Int let content: String - let removed: Bool + var removed: Bool let deleted: Bool let published: Date let updated: Date? diff --git a/Mlem/API/Models/Comments/APICommentView.swift b/Mlem/API/Models/Comments/APICommentView.swift index 56c515db7..15aa8f55a 100644 --- a/Mlem/API/Models/Comments/APICommentView.swift +++ b/Mlem/API/Models/Comments/APICommentView.swift @@ -9,12 +9,12 @@ import Foundation // lemmy_db_views::structs::CommentView struct APICommentView: Decodable, APIContentViewProtocol { - let comment: APIComment - let creator: APIPerson + var comment: APIComment + var creator: APIPerson let post: APIPost let community: APICommunity let counts: APICommentAggregates - let creatorBannedFromCommunity: Bool + var creatorBannedFromCommunity: Bool let creatorIsModerator: Bool? // TODO: 0.18 deprecation make this field non-optional let creatorIsAdmin: Bool? // TODO: 0.18 deprecation make this field non-optional let subscribed: APISubscribedStatus diff --git a/Mlem/API/Models/Common/SuccessResponse.swift b/Mlem/API/Models/Common/SuccessResponse.swift index b732efe93..e11e6d82f 100644 --- a/Mlem/API/Models/Common/SuccessResponse.swift +++ b/Mlem/API/Models/Common/SuccessResponse.swift @@ -29,8 +29,8 @@ struct SuccessResponse: Decodable { } struct MarkReadCompatibilityResponse: Decodable { - let success: Bool? - let postView: APIPostView? + let success: Bool? // 0.19+ response + let postView: APIPostView? // 0.18- response } struct SaveUserSettingsCompatibilityResponse: Decodable { diff --git a/Mlem/API/Models/Person/APIPerson.swift b/Mlem/API/Models/Person/APIPerson.swift index 278f2c02c..e5eb44bc5 100644 --- a/Mlem/API/Models/Person/APIPerson.swift +++ b/Mlem/API/Models/Person/APIPerson.swift @@ -13,7 +13,7 @@ struct APIPerson: Decodable, Identifiable, Hashable, Equatable { let name: String var displayName: String? var avatar: String? - let banned: Bool + var banned: Bool let published: Date let updated: Date? let actorId: URL diff --git a/Mlem/API/Models/Posts/APIPost.swift b/Mlem/API/Models/Posts/APIPost.swift index f520ea20b..39aa6ceab 100644 --- a/Mlem/API/Models/Posts/APIPost.swift +++ b/Mlem/API/Models/Posts/APIPost.swift @@ -19,15 +19,15 @@ struct APIPost: Decodable { let embedDescription: String? let embedTitle: String? let embedVideoUrl: String? - let featuredCommunity: Bool + var featuredCommunity: Bool let featuredLocal: Bool let languageId: Int - let apId: String + let apId: URL let local: Bool let locked: Bool let nsfw: Bool let published: Date - let removed: Bool + var removed: Bool let thumbnailUrl: String? let updated: Date? } diff --git a/Mlem/API/Models/Posts/APIPostResponse.swift b/Mlem/API/Models/Posts/APIPostResponse.swift new file mode 100644 index 000000000..179db3320 --- /dev/null +++ b/Mlem/API/Models/Posts/APIPostResponse.swift @@ -0,0 +1,13 @@ +// +// APIPostResponse.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-25 +// + +import Foundation + +// PostResponse.ts +struct APIPostResponse: Decodable { + let postView: APIPostView +} diff --git a/Mlem/API/Models/Comments/APICommentReport.swift b/Mlem/API/Models/Reports/APICommentReport.swift similarity index 83% rename from Mlem/API/Models/Comments/APICommentReport.swift rename to Mlem/API/Models/Reports/APICommentReport.swift index 6e8b577cb..3ad1f4315 100644 --- a/Mlem/API/Models/Comments/APICommentReport.swift +++ b/Mlem/API/Models/Reports/APICommentReport.swift @@ -8,13 +8,13 @@ import Foundation // lemmy_db_schema::source::comment::CommentReport -struct APICommentReport: Decodable { +struct APICommentReport: Hashable, Decodable { let id: Int let creatorId: Int let commentId: Int let originalCommentText: String let reason: String - let resolved: Bool + var resolved: Bool let resolverId: Int? let published: Date let updated: Date? diff --git a/Mlem/API/Models/Comments/APICommentReportView.swift b/Mlem/API/Models/Reports/APICommentReportView.swift similarity index 93% rename from Mlem/API/Models/Comments/APICommentReportView.swift rename to Mlem/API/Models/Reports/APICommentReportView.swift index fb1419b63..61a19cf5d 100644 --- a/Mlem/API/Models/Comments/APICommentReportView.swift +++ b/Mlem/API/Models/Reports/APICommentReportView.swift @@ -17,6 +17,6 @@ struct APICommentReportView: Decodable { let commentCreator: APIPerson let counts: APICommentAggregates let creatorBannedFromCommunity: Bool - let myVote: Int? + let myVote: ScoringOperation? let resolver: APIPerson? } diff --git a/Mlem/API/Models/Posts/APIPostReport.swift b/Mlem/API/Models/Reports/APIPostReport.swift similarity index 88% rename from Mlem/API/Models/Posts/APIPostReport.swift rename to Mlem/API/Models/Reports/APIPostReport.swift index 5a15e0392..ef5fd3dd0 100644 --- a/Mlem/API/Models/Posts/APIPostReport.swift +++ b/Mlem/API/Models/Reports/APIPostReport.swift @@ -8,7 +8,7 @@ import Foundation // lemmy_db_schema::source::post::PostReport -struct APIPostReport: Decodable { +struct APIPostReport: Hashable, Decodable { let id: Int let creatorId: Int let postId: Int @@ -16,7 +16,7 @@ struct APIPostReport: Decodable { let originalPostUrl: String? let originalPostBody: String? let reason: String - let resolved: Bool + var resolved: Bool let resolverId: Int? let published: Date let updated: Date? diff --git a/Mlem/API/Models/Posts/APIPostReportView.swift b/Mlem/API/Models/Reports/APIPostReportView.swift similarity index 92% rename from Mlem/API/Models/Posts/APIPostReportView.swift rename to Mlem/API/Models/Reports/APIPostReportView.swift index a53f003f9..8d551de08 100644 --- a/Mlem/API/Models/Posts/APIPostReportView.swift +++ b/Mlem/API/Models/Reports/APIPostReportView.swift @@ -14,7 +14,7 @@ struct APIPostReportView: Decodable { let creator: APIPerson let postCreator: APIPerson let creatorBannedFromCommunity: Bool - let myVote: Int? + let myVote: ScoringOperation? let counts: APIPostAggregates let resolver: APIPerson? } diff --git a/Mlem/API/Models/Messages/APIPrivateMessageReport.swift b/Mlem/API/Models/Reports/APIPrivateMessageReport.swift similarity index 88% rename from Mlem/API/Models/Messages/APIPrivateMessageReport.swift rename to Mlem/API/Models/Reports/APIPrivateMessageReport.swift index 6a93ea8a6..93587b5e9 100644 --- a/Mlem/API/Models/Messages/APIPrivateMessageReport.swift +++ b/Mlem/API/Models/Reports/APIPrivateMessageReport.swift @@ -8,7 +8,7 @@ import Foundation // crates/db_schema/src/source/private_message_report.rs PrivateMessageReport -struct APIPrivateMessageReport: Decodable { +struct APIPrivateMessageReport: Decodable, Hashable { let id: Int let creatorId: Int let privateMessageId: Int diff --git a/Mlem/API/Models/Messages/APIPrivateMessageReportView.swift b/Mlem/API/Models/Reports/APIPrivateMessageReportView.swift similarity index 100% rename from Mlem/API/Models/Messages/APIPrivateMessageReportView.swift rename to Mlem/API/Models/Reports/APIPrivateMessageReportView.swift diff --git a/Mlem/API/Models/Site/APIMyUserInfo.swift b/Mlem/API/Models/Site/APIMyUserInfo.swift index 163c5ba5e..2adab3d60 100644 --- a/Mlem/API/Models/Site/APIMyUserInfo.swift +++ b/Mlem/API/Models/Site/APIMyUserInfo.swift @@ -11,5 +11,30 @@ import Foundation struct APIMyUserInfo: Decodable { // Some properties aren't implemented yet: https://join-lemmy.org/api/interfaces/MyUserInfo.html var localUserView: APILocalUserView + let moderates: [APICommunityModeratorView] var discussionLanguages: [Int] + var communityBlocks: [APICommunityBlockView] + var personBlocks: [APIUserBlockView] + var instanceBlocks: [APIInstanceBlockView]? // Nil pre-0.19.0 +} + +struct APICommunityBlockView: Decodable { + let community: APICommunity + let person: APIPerson +} + +struct APIUserBlockView: Decodable { + let target: APIPerson + let person: APIPerson +} + +struct APIInstanceBlockView: Decodable { + let instance: APIInstance + let person: APIPerson +} + +struct APIInstance: Decodable, Identifiable { + // Not all properties implemented yet https://join-lemmy.org/api/interfaces/Instance.html + let id: Int + let domain: String } diff --git a/Mlem/API/Models/Site/APIRegistrationApplication.swift b/Mlem/API/Models/Site/APIRegistrationApplication.swift new file mode 100644 index 000000000..558761ad0 --- /dev/null +++ b/Mlem/API/Models/Site/APIRegistrationApplication.swift @@ -0,0 +1,18 @@ +// +// APIRegistrationApplication.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// RegistrationApplication.ts +struct APIRegistrationApplication: Decodable, Hashable { + let id: Int + let localUserId: Int + let answer: String + let adminId: Int? + let denyReason: String? + let published: Date +} diff --git a/Mlem/API/Models/Site/APIRegistrationApplicationView.swift b/Mlem/API/Models/Site/APIRegistrationApplicationView.swift new file mode 100644 index 000000000..afd91f3ef --- /dev/null +++ b/Mlem/API/Models/Site/APIRegistrationApplicationView.swift @@ -0,0 +1,16 @@ +// +// APIRegistrationApplicationView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// RegistrationApplicationView.ts +struct APIRegistrationApplicationView: Decodable { + let registrationApplication: APIRegistrationApplication + let creatorLocalUser: APILocalUser + let creator: APIPerson + let admin: APIPerson? +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgeComment.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgeComment.swift new file mode 100644 index 000000000..ea892f4a5 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgeComment.swift @@ -0,0 +1,17 @@ +// +// APIAdminPurgeComment.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgeComment.ts +struct APIAdminPurgeComment: Decodable { + let id: Int + let adminPersonId: Int + let postId: Int + let reason: String? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommentView.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommentView.swift new file mode 100644 index 000000000..042fb24ad --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommentView.swift @@ -0,0 +1,15 @@ +// +// APIAdminPurgeCommentView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgeCommentView.ts +struct APIAdminPurgeCommentView: Decodable { + let adminPurgeComment: APIAdminPurgeComment + let admin: APIPerson? + let post: APIPost +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunity.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunity.swift new file mode 100644 index 000000000..47c2939bd --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunity.swift @@ -0,0 +1,16 @@ +// +// APIAdminPurgeCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgeCommunity.ts +struct APIAdminPurgeCommunity: Decodable { + let id: Int + let adminPersonId: Int + let reason: String? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunityView.swift new file mode 100644 index 000000000..1e1e1ef69 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgeCommunityView.swift @@ -0,0 +1,14 @@ +// +// APIAdminPurgeCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgeCommunityView.ts +struct APIAdminPurgeCommunityView: Decodable { + let adminPurgeCommunity: APIAdminPurgeCommunity + let admin: APIPerson? +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgePerson.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgePerson.swift new file mode 100644 index 000000000..ff1b684e6 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgePerson.swift @@ -0,0 +1,16 @@ +// +// APIAdminPurgePerson.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgePerson.ts +struct APIAdminPurgePerson: Decodable { + let id: Int + let adminPersonId: Int + let reason: String? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgePersonView.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgePersonView.swift new file mode 100644 index 000000000..6acd68676 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgePersonView.swift @@ -0,0 +1,14 @@ +// +// APIAdminPurgePersonView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgePersonView.ts +struct APIAdminPurgePersonView: Decodable { + let adminPurgePerson: APIAdminPurgePerson + let admin: APIPerson? +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgePost.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgePost.swift new file mode 100644 index 000000000..c292b8423 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgePost.swift @@ -0,0 +1,17 @@ +// +// APIAdminPurgePost.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgePost.ts +struct APIAdminPurgePost: Decodable { + let id: Int + let adminPersonId: Int + let communityId: Int + let reason: String? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIAdminPurgePostView.swift b/Mlem/API/Models/Site/Modlog/APIAdminPurgePostView.swift new file mode 100644 index 000000000..1265580e9 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIAdminPurgePostView.swift @@ -0,0 +1,15 @@ +// +// APIAdminPurgePostView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// AdminPurgePostView.ts +struct APIAdminPurgePostView: Decodable { + let adminPurgePost: APIAdminPurgePost + let admin: APIPerson? + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModAdd.swift b/Mlem/API/Models/Site/Modlog/APIModAdd.swift new file mode 100644 index 000000000..c321df8a0 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModAdd.swift @@ -0,0 +1,17 @@ +// +// APIModAdd.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModAdd.ts +struct APIModAdd: Decodable { + let id: Int + let modPersonId: Int + let otherPersonId: Int + let removed: Bool + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModAddCommunity.swift b/Mlem/API/Models/Site/Modlog/APIModAddCommunity.swift new file mode 100644 index 000000000..41bb5e2e3 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModAddCommunity.swift @@ -0,0 +1,18 @@ +// +// APIModAddCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModAddCommunity.ts +struct APIModAddCommunity: Decodable { + let id: Int + let modPersonId: Int + let otherPersonId: Int + let communityId: Int + let removed: Bool + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModAddCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIModAddCommunityView.swift new file mode 100644 index 000000000..cd534abcf --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModAddCommunityView.swift @@ -0,0 +1,16 @@ +// +// APIModAddCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModAddCommunityView.ts +struct APIModAddCommunityView: Decodable { + let modAddCommunity: APIModAddCommunity + let moderator: APIPerson? + let community: APICommunity + let moddedPerson: APIPerson +} diff --git a/Mlem/API/Models/Site/Modlog/APIModAddView.swift b/Mlem/API/Models/Site/Modlog/APIModAddView.swift new file mode 100644 index 000000000..a65cd215e --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModAddView.swift @@ -0,0 +1,15 @@ +// +// APIModAddView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModAddView.ts +struct APIModAddView: Decodable { + let modAdd: APIModAdd + let moderator: APIPerson? + let moddedPerson: APIPerson +} diff --git a/Mlem/API/Models/Site/Modlog/APIModBan.swift b/Mlem/API/Models/Site/Modlog/APIModBan.swift new file mode 100644 index 000000000..5f2267758 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModBan.swift @@ -0,0 +1,19 @@ +// +// APIModBan.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModBan.ts +struct APIModBan: Decodable { + let id: Int + let modPersonId: Int + let otherPersonId: Int + let reason: String? + let banned: Bool + let expires: Date? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModBanFromCommunity.swift b/Mlem/API/Models/Site/Modlog/APIModBanFromCommunity.swift new file mode 100644 index 000000000..a34b2ec2c --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModBanFromCommunity.swift @@ -0,0 +1,20 @@ +// +// APIModBanFromCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModBanFromCommunity.ts +struct APIModBanFromCommunity: Decodable { + let id: Int + let modPersonId: Int + let otherPersonId: Int + let communityId: Int + let reason: String? + let banned: Bool + let expires: Date? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModBanFromCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIModBanFromCommunityView.swift new file mode 100644 index 000000000..38cbdefc1 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModBanFromCommunityView.swift @@ -0,0 +1,16 @@ +// +// APIModBanFromCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModBanFromCommunityView.ts +struct APIModBanFromCommunityView: Decodable { + let modBanFromCommunity: APIModBanFromCommunity + let moderator: APIPerson? + let community: APICommunity + let bannedPerson: APIPerson +} diff --git a/Mlem/API/Models/Site/Modlog/APIModBanView.swift b/Mlem/API/Models/Site/Modlog/APIModBanView.swift new file mode 100644 index 000000000..05871fcfd --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModBanView.swift @@ -0,0 +1,15 @@ +// +// APIModBanView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModBanView.ts +struct APIModBanView: Decodable { + let modBan: APIModBan + let moderator: APIPerson? + let bannedPerson: APIPerson +} diff --git a/Mlem/API/Models/Site/Modlog/APIModFeaturePost.swift b/Mlem/API/Models/Site/Modlog/APIModFeaturePost.swift new file mode 100644 index 000000000..2e6594a43 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModFeaturePost.swift @@ -0,0 +1,18 @@ +// +// APIModFeaturePost.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModFeaturePost.ts +struct APIModFeaturePost: Decodable { + let id: Int + let modPersonId: Int + let postId: Int + let featured: Bool + let when_: Date + let isFeaturedCommunity: Bool +} diff --git a/Mlem/API/Models/Site/Modlog/APIModFeaturePostView.swift b/Mlem/API/Models/Site/Modlog/APIModFeaturePostView.swift new file mode 100644 index 000000000..606edc346 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModFeaturePostView.swift @@ -0,0 +1,16 @@ +// +// APIModFeaturePostView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModFeaturePostView.ts +struct APIModFeaturePostView: Decodable { + let modFeaturePost: APIModFeaturePost + let moderator: APIPerson? + let post: APIPost + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModHideCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIModHideCommunityView.swift new file mode 100644 index 000000000..4f53e48a3 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModHideCommunityView.swift @@ -0,0 +1,15 @@ +// +// APIModHideCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModHideCommunityView.ts +struct APIModHideCommunityView: Decodable { + let modHideCommunity: APIModHideCommunity + let admin: APIPerson? + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModLockPost.swift b/Mlem/API/Models/Site/Modlog/APIModLockPost.swift new file mode 100644 index 000000000..3ddd8ff0b --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModLockPost.swift @@ -0,0 +1,17 @@ +// +// APIModLockPost.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModLockPost.ts +struct APIModLockPost: Decodable { + let id: Int + let modPersonId: Int + let postId: Int + let locked: Bool + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModLockPostView.swift b/Mlem/API/Models/Site/Modlog/APIModLockPostView.swift new file mode 100644 index 000000000..0461414ee --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModLockPostView.swift @@ -0,0 +1,16 @@ +// +// APIModLockPostView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModLockPostView.ts +struct APIModLockPostView: Decodable { + let modLockPost: APIModLockPost + let moderator: APIPerson? + let post: APIPost + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemoveComment.swift b/Mlem/API/Models/Site/Modlog/APIModRemoveComment.swift new file mode 100644 index 000000000..654c2cc9d --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemoveComment.swift @@ -0,0 +1,18 @@ +// +// APIModRemoveComment.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemoveComment.ts +struct APIModRemoveComment: Decodable { + let id: Int + let modPersonId: Int + let commentId: Int + let reason: String? + let removed: Bool + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemoveCommentView.swift b/Mlem/API/Models/Site/Modlog/APIModRemoveCommentView.swift new file mode 100644 index 000000000..afc163d28 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemoveCommentView.swift @@ -0,0 +1,18 @@ +// +// APIModRemoveCommentView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemoveCommentView.ts +struct APIModRemoveCommentView: Decodable { + let modRemoveComment: APIModRemoveComment + let moderator: APIPerson? + let comment: APIComment + let commenter: APIPerson + let post: APIPost + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemoveCommunity.swift b/Mlem/API/Models/Site/Modlog/APIModRemoveCommunity.swift new file mode 100644 index 000000000..b82f6a4c5 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemoveCommunity.swift @@ -0,0 +1,19 @@ +// +// APIModRemoveCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemoveCommunity.ts +struct APIModRemoveCommunity: Codable { + let id: Int + let modPersonId: Int + let communityId: Int + let reason: String? + let removed: Bool + let expires: String? + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemoveCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIModRemoveCommunityView.swift new file mode 100644 index 000000000..800a488b7 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemoveCommunityView.swift @@ -0,0 +1,15 @@ +// +// APIModRemoveCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemoveCommunityView.ts +struct APIModRemoveCommunityView: Decodable { + let modRemoveCommunity: APIModRemoveCommunity + let moderator: APIPerson? + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemovePost.swift b/Mlem/API/Models/Site/Modlog/APIModRemovePost.swift new file mode 100644 index 000000000..3a3586c77 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemovePost.swift @@ -0,0 +1,18 @@ +// +// APIModRemovePost.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemovePost.ts +struct APIModRemovePost: Decodable { + let id: Int + let modPersonId: Int + let postId: Int + let reason: String? + let removed: Bool + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModRemovePostView.swift b/Mlem/API/Models/Site/Modlog/APIModRemovePostView.swift new file mode 100644 index 000000000..43dbbce3e --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModRemovePostView.swift @@ -0,0 +1,16 @@ +// +// APIModRemovePostView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModRemovePostView.ts +struct APIModRemovePostView: Decodable { + let modRemovePost: APIModRemovePost + let moderator: APIPerson? + let post: APIPost + let community: APICommunity +} diff --git a/Mlem/API/Models/Site/Modlog/APIModTransferCommunity.swift b/Mlem/API/Models/Site/Modlog/APIModTransferCommunity.swift new file mode 100644 index 000000000..8c95903f3 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModTransferCommunity.swift @@ -0,0 +1,17 @@ +// +// APIModTransferCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModTransferCommunity.ts +struct APIModTransferCommunity: Decodable { + let id: Int + let modPersonId: Int + let otherPersonId: Int + let communityId: Int + let when_: Date +} diff --git a/Mlem/API/Models/Site/Modlog/APIModTransferCommunityView.swift b/Mlem/API/Models/Site/Modlog/APIModTransferCommunityView.swift new file mode 100644 index 000000000..2d0bce122 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModTransferCommunityView.swift @@ -0,0 +1,16 @@ +// +// APIModTransferCommunityView.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModTransferCommunityView.ts +struct APIModTransferCommunityView: Decodable { + let modTransferCommunity: APIModTransferCommunity + let moderator: APIPerson? + let community: APICommunity + let moddedPerson: APIPerson +} diff --git a/Mlem/API/Models/Site/Modlog/APIModlogActionType.swift b/Mlem/API/Models/Site/Modlog/APIModlogActionType.swift new file mode 100644 index 000000000..e31c79a93 --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/APIModlogActionType.swift @@ -0,0 +1,28 @@ +// +// APIModlogActionType.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModlogActionType.ts +enum APIModlogActionType: String, Decodable { + case all = "All" + case modRemovePost = "ModRemovePost" + case modLockPost = "ModLockPost" + case modFeaturePost = "ModFeaturePost" + case modRemoveComment = "ModRemoveComment" + case modRemoveCommunity = "ModRemoveCommunity" + case modBanFromCommunity = "ModBanFromCommunity" + case modAddCommunity = "ModAddCommunity" + case modTransferCommunity = "ModTransferCommunity" + case modAdd = "ModAdd" + case modBan = "ModBan" + case modHideCommunity = "ModHideCommunity" + case adminPurgePerson = "AdminPurgePerson" + case adminPurgeCommunity = "AdminPurgeCommunity" + case adminPurgePost = "AdminPurgePost" + case adminPurgeComment = "AdminPurgeComment" +} diff --git a/Mlem/API/Models/Site/Modlog/ApiModHideCommunity.swift b/Mlem/API/Models/Site/Modlog/ApiModHideCommunity.swift new file mode 100644 index 000000000..0ec85115d --- /dev/null +++ b/Mlem/API/Models/Site/Modlog/ApiModHideCommunity.swift @@ -0,0 +1,18 @@ +// +// APIModHideCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// ModHideCommunity.ts +struct APIModHideCommunity: Codable { + let id: Int + let communityId: Int + let modPersonId: Int + let when_: Date + let reason: String? + let hidden: Bool +} diff --git a/Mlem/API/Requests/Comment/ListCommentLikesRequest.swift b/Mlem/API/Requests/Comment/ListCommentLikesRequest.swift new file mode 100644 index 000000000..f05898eb5 --- /dev/null +++ b/Mlem/API/Requests/Comment/ListCommentLikesRequest.swift @@ -0,0 +1,35 @@ +// +// ListCommentLikesRequest.swift +// Mlem +// +// Created by Sjmarf on 25/03/2024. +// + +import Foundation + +struct ListCommentLikesRequest: APIGetRequest { + typealias Response = APIListCommentLikesResponse + + var instanceURL: URL + let path = "comment/like/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + commentId: Int, + page: Int?, + limit: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "auth", value: session.token), + .init(name: "comment_id", value: String(commentId)), + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)) + ] + } +} + +struct APIListCommentLikesResponse: Decodable { + let commentLikes: [APIVoteView] +} diff --git a/Mlem/API/Requests/Comment/PurgeCommentRequest.swift b/Mlem/API/Requests/Comment/PurgeCommentRequest.swift new file mode 100644 index 000000000..ff8f56b2b --- /dev/null +++ b/Mlem/API/Requests/Comment/PurgeCommentRequest.swift @@ -0,0 +1,35 @@ +// +// PurgeCommentRequest.swift +// Mlem +// +// Created by Sjmarf on 22/03/2024. +// + +import Foundation + +struct PurgeCommentRequest: APIPostRequest { + typealias Response = SuccessResponse + + var instanceURL: URL + let path = "admin/purge/comment" + let body: Body + + struct Body: Codable { + let comment_id: Int + let reason: String? + let auth: String + } + + init( + session: APISession, + commentId: Int, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + comment_id: commentId, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Comment/RemoveCommentRequest.swift b/Mlem/API/Requests/Comment/RemoveCommentRequest.swift new file mode 100644 index 000000000..ac63a730f --- /dev/null +++ b/Mlem/API/Requests/Comment/RemoveCommentRequest.swift @@ -0,0 +1,38 @@ +// +// RemoveCommentRequest.swift +// Mlem +// +// Created by Sjmarf on 22/03/2024. +// + +import Foundation + +struct RemoveCommentRequest: APIPostRequest { + typealias Response = CommentResponse + + var instanceURL: URL + let path = "comment/remove" + let body: Body + + struct Body: Codable { + let comment_id: Int + let removed: Bool + let reason: String? + let auth: String + } + + init( + session: APISession, + commentId: Int, + removed: Bool, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + comment_id: commentId, + removed: removed, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Community/AddModToCommunity.swift b/Mlem/API/Requests/Community/AddModToCommunity.swift new file mode 100644 index 000000000..07a6a25ea --- /dev/null +++ b/Mlem/API/Requests/Community/AddModToCommunity.swift @@ -0,0 +1,42 @@ +// +// AddModToCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-17. +// + +import Foundation + +struct AddModToCommunityRequest: APIPostRequest { + typealias Response = AddModToCommunityResponse + + let instanceURL: URL + let path = "community/mod" + let body: Body + + struct Body: Encodable { + let community_id: Int + let person_id: Int + let added: Bool + let auth: String + } + + init( + session: APISession, + communityId: Int, + personId: Int, + added: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + community_id: communityId, + person_id: personId, + added: added, + auth: session.token + ) + } +} + +struct AddModToCommunityResponse: Decodable { + let moderators: [APICommunityModeratorView] +} diff --git a/Mlem/API/Requests/Community/BanFromCommunity.swift b/Mlem/API/Requests/Community/BanFromCommunity.swift new file mode 100644 index 000000000..df21c1c6c --- /dev/null +++ b/Mlem/API/Requests/Community/BanFromCommunity.swift @@ -0,0 +1,52 @@ +// +// BanFromCommunity.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-15. +// + +import Foundation + +struct BanFromCommunityRequest: APIPostRequest { + typealias Response = BanFromCommunityResponse + + let instanceURL: URL + let path = "community/ban_user" + let body: Body + + struct Body: Encodable { + let community_id: Int + let person_id: Int + let ban: Bool + let remove_data: Bool? + let reason: String? + let expires: Int? + let auth: String + } + + init( + session: APISession, + communityId: Int, + personId: Int, + ban: Bool, + removeData: Bool?, + reason: String?, + expires: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + community_id: communityId, + person_id: personId, + ban: ban, + remove_data: removeData, + reason: reason, + expires: expires, + auth: session.token + ) + } +} + +struct BanFromCommunityResponse: Decodable { + let personView: APIPersonView + let banned: Bool +} diff --git a/Mlem/API/Requests/Community/ListCommunities.swift b/Mlem/API/Requests/Community/ListCommunities.swift index e30536f10..3fb3cf5b7 100644 --- a/Mlem/API/Requests/Community/ListCommunities.swift +++ b/Mlem/API/Requests/Community/ListCommunities.swift @@ -24,7 +24,7 @@ struct ListCommunitiesRequest: APIGetRequest { ) throws { self.instanceURL = try session.instanceUrl var queryItems: [URLQueryItem] = [ - .init(name: "sort", value: sort), + .init(name: "sort", value: sort ?? "Old"), // provide explicit sort if not provided to ensure consistent pagination .init(name: "limit", value: limit?.description), .init(name: "page", value: page?.description), .init(name: "type_", value: type) diff --git a/Mlem/API/Requests/Community/PurgeCommunityRequest.swift b/Mlem/API/Requests/Community/PurgeCommunityRequest.swift new file mode 100644 index 000000000..d68d5138d --- /dev/null +++ b/Mlem/API/Requests/Community/PurgeCommunityRequest.swift @@ -0,0 +1,35 @@ +// +// PurgePostRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct PurgeCommunityRequest: APIPostRequest { + typealias Response = SuccessResponse + + var instanceURL: URL + let path = "admin/purge/community" + let body: Body + + struct Body: Codable { + let community_id: Int + let reason: String? + let auth: String + } + + init( + session: APISession, + communityId: Int, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + community_id: communityId, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Community/RemoveCommunityRequest.swift b/Mlem/API/Requests/Community/RemoveCommunityRequest.swift new file mode 100644 index 000000000..cb6e4c82b --- /dev/null +++ b/Mlem/API/Requests/Community/RemoveCommunityRequest.swift @@ -0,0 +1,38 @@ +// +// RemoveCommunityRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct RemoveCommunityRequest: APIPostRequest { + typealias Response = CommunityResponse + + struct Body: Codable { + let community_id: Int + let removed: Bool + let reason: String? + let auth: String + } + + let instanceURL: URL + let path = "community/remove" + let body: Body + + init( + session: APISession, + communityId: Int, + removed: Bool, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + community_id: communityId, + removed: removed, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Moderation/ApproveRegistrationApplicationRequest.swift b/Mlem/API/Requests/Moderation/ApproveRegistrationApplicationRequest.swift new file mode 100644 index 000000000..a301b8703 --- /dev/null +++ b/Mlem/API/Requests/Moderation/ApproveRegistrationApplicationRequest.swift @@ -0,0 +1,42 @@ +// +// ApproveRegistrationApplicationRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ApproveRegistrationApplicationRequest: APIPutRequest { + typealias Response = APIRegistrationApplicationResponse + + let instanceURL: URL + let path = "admin/registration_application/approve" + let body: Body + + struct Body: Encodable { + let id: Int + let approve: Bool + let deny_reason: String? + let auth: String + } + + init( + session: APISession, + id: Int, + approve: Bool, + denyReason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + id: id, + approve: approve, + deny_reason: denyReason, + auth: session.token + ) + } +} + +struct APIRegistrationApplicationResponse: Decodable { + let registrationApplication: APIRegistrationApplicationView +} diff --git a/Mlem/API/Requests/Moderation/GetReportCountRequest.swift b/Mlem/API/Requests/Moderation/GetReportCountRequest.swift new file mode 100644 index 000000000..01ac04078 --- /dev/null +++ b/Mlem/API/Requests/Moderation/GetReportCountRequest.swift @@ -0,0 +1,35 @@ +// +// GetReportCountRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct GetReportCountRequest: APIGetRequest { + typealias Response = APIGetReportCountResponse + + let instanceURL: URL + let path = "user/report_count" + let queryItems: [URLQueryItem] + + init( + session: APISession, + communityId: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "community_id", value: communityId.map(String.init)), + .init(name: "auth", value: session.token) + ] + } +} + +// GetReportCountResponse.ts +struct APIGetReportCountResponse: Decodable { + let communityId: Int? + let commentReports: Int + let postReports: Int + let privateMessageReports: Int? +} diff --git a/Mlem/API/Requests/Moderation/GetUnreadRegistrationApplicationCountRequest.swift b/Mlem/API/Requests/Moderation/GetUnreadRegistrationApplicationCountRequest.swift new file mode 100644 index 000000000..d61caa9e3 --- /dev/null +++ b/Mlem/API/Requests/Moderation/GetUnreadRegistrationApplicationCountRequest.swift @@ -0,0 +1,30 @@ +// +// GetUnreadRegistrationApplicationCountRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +// swiftlint:disable:next type_name +struct GetUnreadRegistrationApplicationCountRequest: APIGetRequest { + typealias Response = APIGetUnreadRegistrationApplicationCountResponse + + let instanceURL: URL + let path = "admin/registration_application/count" + let queryItems: [URLQueryItem] + + init(session: APISession) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "auth", value: session.token) + ] + } +} + +// GetUnreadRegistrationApplicationCountResponse.ts +// swiftlint:disable:next type_name +struct APIGetUnreadRegistrationApplicationCountResponse: Decodable { + let registrationApplications: Int +} diff --git a/Mlem/API/Requests/Moderation/ListCommentReportsRequest.swift b/Mlem/API/Requests/Moderation/ListCommentReportsRequest.swift new file mode 100644 index 000000000..a447ae3fd --- /dev/null +++ b/Mlem/API/Requests/Moderation/ListCommentReportsRequest.swift @@ -0,0 +1,37 @@ +// +// ListCommentReportsRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ListCommentReportsRequest: APIGetRequest { + typealias Response = APIListCommentReportsResponse + + let instanceURL: URL + let path = "comment/report/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + page: Int?, + limit: Int?, + unresolvedOnly: Bool?, + communityId: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)), + .init(name: "unresolved_only", value: unresolvedOnly.map(String.init)), + .init(name: "community_id", value: communityId.map(String.init)), + .init(name: "auth", value: session.token) + ] + } +} + +struct APIListCommentReportsResponse: Decodable { + let commentReports: [APICommentReportView] +} diff --git a/Mlem/API/Requests/Moderation/ListPostReportsRequest.swift b/Mlem/API/Requests/Moderation/ListPostReportsRequest.swift new file mode 100644 index 000000000..c6fece037 --- /dev/null +++ b/Mlem/API/Requests/Moderation/ListPostReportsRequest.swift @@ -0,0 +1,37 @@ +// +// ListPostReportsRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ListPostReportsRequest: APIGetRequest { + typealias Response = APIListPostReportsResponse + + let instanceURL: URL + let path = "post/report/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + page: Int?, + limit: Int?, + unresolvedOnly: Bool?, + communityId: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)), + .init(name: "unresolved_only", value: unresolvedOnly.map(String.init)), + .init(name: "community_id", value: communityId.map(String.init)), + .init(name: "auth", value: session.token) + ] + } +} + +struct APIListPostReportsResponse: Decodable { + let postReports: [APIPostReportView] +} diff --git a/Mlem/API/Requests/Moderation/ListPrivateMessageReportsRequest.swift b/Mlem/API/Requests/Moderation/ListPrivateMessageReportsRequest.swift new file mode 100644 index 000000000..2130174de --- /dev/null +++ b/Mlem/API/Requests/Moderation/ListPrivateMessageReportsRequest.swift @@ -0,0 +1,35 @@ +// +// ListPrivateMessageReportsRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ListPrivateMessageReportsRequest: APIGetRequest { + typealias Response = APIListPrivateMessageReportsResponse + + let instanceURL: URL + let path = "private_message/report/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + page: Int?, + limit: Int?, + unresolvedOnly: Bool? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)), + .init(name: "unresolved_only", value: unresolvedOnly.map(String.init)), + .init(name: "auth", value: session.token) + ] + } +} + +struct APIListPrivateMessageReportsResponse: Decodable { + let privateMessageReports: [APIPrivateMessageReportView] +} diff --git a/Mlem/API/Requests/Moderation/ListRegistrationApplicationsRequest.swift b/Mlem/API/Requests/Moderation/ListRegistrationApplicationsRequest.swift new file mode 100644 index 000000000..f6b12335a --- /dev/null +++ b/Mlem/API/Requests/Moderation/ListRegistrationApplicationsRequest.swift @@ -0,0 +1,35 @@ +// +// ListRegistrationApplicationsRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ListRegistrationApplicationsRequest: APIGetRequest { + typealias Response = APIListRegistrationApplicationsResponse + + let instanceURL: URL + let path = "admin/registration_application/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + unreadOnly: Bool?, + page: Int?, + limit: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "unread_only", value: unreadOnly.map(String.init)), + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)), + .init(name: "auth", value: session.token) + ] + } +} + +struct APIListRegistrationApplicationsResponse: Decodable { + let registrationApplications: [APIRegistrationApplicationView] +} diff --git a/Mlem/API/Requests/Moderation/ResolveCommentReportRequest.swift b/Mlem/API/Requests/Moderation/ResolveCommentReportRequest.swift new file mode 100644 index 000000000..1566aec1c --- /dev/null +++ b/Mlem/API/Requests/Moderation/ResolveCommentReportRequest.swift @@ -0,0 +1,39 @@ +// +// ResolveCommentReportRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ResolveCommentReportRequest: APIPutRequest { + typealias Response = APICommentReportResponse + + let instanceURL: URL + let path = "comment/report/resolve" + let body: Body + + struct Body: Encodable { + let auth: String + let report_id: Int + let resolved: Bool + } + + init( + session: APISession, + reportId: Int, + resolved: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + auth: session.token, + report_id: reportId, + resolved: resolved + ) + } +} + +struct APICommentReportResponse: Decodable { + let commentReportView: APICommentReportView +} diff --git a/Mlem/API/Requests/Moderation/ResolvePostReportRequest.swift b/Mlem/API/Requests/Moderation/ResolvePostReportRequest.swift new file mode 100644 index 000000000..7f3bc985f --- /dev/null +++ b/Mlem/API/Requests/Moderation/ResolvePostReportRequest.swift @@ -0,0 +1,39 @@ +// +// ResolvePostReportRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ResolvePostReportRequest: APIPutRequest { + typealias Response = APIPostReportResponse + + let instanceURL: URL + let path = "post/report/resolve" + let body: Body + + struct Body: Encodable { + let auth: String + let report_id: Int + let resolved: Bool + } + + init( + session: APISession, + reportId: Int, + resolved: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + auth: session.token, + report_id: reportId, + resolved: resolved + ) + } +} + +struct APIPostReportResponse: Decodable { + let postReportView: APIPostReportView +} diff --git a/Mlem/API/Requests/Moderation/ResolvePrivateMessageReportRequest.swift b/Mlem/API/Requests/Moderation/ResolvePrivateMessageReportRequest.swift new file mode 100644 index 000000000..addf85c06 --- /dev/null +++ b/Mlem/API/Requests/Moderation/ResolvePrivateMessageReportRequest.swift @@ -0,0 +1,39 @@ +// +// ResolvePrivateMessageReportRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct ResolvePrivateMessageReportRequest: APIPutRequest { + typealias Response = APIPrivateMessageReportResponse + + let instanceURL: URL + let path = "private_message/report/resolve" + let body: Body + + struct Body: Encodable { + let auth: String + let report_id: Int + let resolved: Bool + } + + init( + session: APISession, + reportId: Int, + resolved: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + auth: session.token, + report_id: reportId, + resolved: resolved + ) + } +} + +struct APIPrivateMessageReportResponse: Decodable { + let privateMessageReportView: APIPrivateMessageReportView +} diff --git a/Mlem/API/Requests/Person/BanPerson.swift b/Mlem/API/Requests/Person/BanPerson.swift new file mode 100644 index 000000000..41d1a0688 --- /dev/null +++ b/Mlem/API/Requests/Person/BanPerson.swift @@ -0,0 +1,50 @@ +// +// BanPerson.swift +// Mlem +// +// Created by Sjmarf on 27/01/2024. +// + +import Foundation + +struct BanPersonRequest: APIPostRequest { + typealias Response = BanPersonResponse + + let instanceURL: URL + let path = "user/ban" + let body: Body + + struct Body: Encodable { + let personId: Int + let ban: Bool + let expires: Int? + let reason: String? + let removeData: Bool + let auth: String + } + + init( + session: APISession, + personId: Int, + ban: Bool, + expires: Int?, + reason: String?, + removeData: Bool + ) throws { + self.instanceURL = try session.instanceUrl + + self.body = try .init( + personId: personId, + ban: ban, + expires: expires, + reason: reason, + removeData: removeData, + auth: session.token + ) + } +} + +struct BanPersonResponse: Decodable { + let banned: Bool + let personView: APIPersonView +} diff --git a/Mlem/API/Requests/Person/PurgePersonRequest.swift b/Mlem/API/Requests/Person/PurgePersonRequest.swift new file mode 100644 index 000000000..d60018ba4 --- /dev/null +++ b/Mlem/API/Requests/Person/PurgePersonRequest.swift @@ -0,0 +1,33 @@ +// +// PurgePersonRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct PurgePersonRequest: APIPostRequest { + typealias Response = SuccessResponse + + var instanceURL: URL + let path = "admin/purge/person" + let body: Body + + struct Body: Codable { + let person_id: Int + let reason: String? + } + + init( + session: APISession, + personId: Int, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = .init( + person_id: personId, + reason: reason + ) + } +} diff --git a/Mlem/API/Requests/Post/DeletePictrsFile.swift b/Mlem/API/Requests/Post/DeletePictrsFile.swift index fbd486fe4..ca5834c27 100644 --- a/Mlem/API/Requests/Post/DeletePictrsFile.swift +++ b/Mlem/API/Requests/Post/DeletePictrsFile.swift @@ -7,7 +7,7 @@ import Foundation -struct ImageDeleteRequest: APIRequest { +struct ImageDeleteRequest: APIDeleteRequest { var path: String var instanceURL: URL @@ -33,4 +33,4 @@ struct ImageDeleteRequest: APIRequest { } } -struct ImageDeleteResponse: Decodable { } +struct ImageDeleteResponse: Decodable {} diff --git a/Mlem/API/Requests/Post/FeaturePostRequest.swift b/Mlem/API/Requests/Post/FeaturePostRequest.swift new file mode 100644 index 000000000..753ba1dee --- /dev/null +++ b/Mlem/API/Requests/Post/FeaturePostRequest.swift @@ -0,0 +1,39 @@ +// +// FeaturePostRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-25 +// + +import Foundation + +struct FeaturePostRequest: APIPostRequest { + typealias Response = APIPostResponse + + var instanceURL: URL + let path = "post/feature" + let body: Body + + struct Body: Encodable { + let post_id: Int + let featured: Bool + let feature_type: String + let auth: String + } + + init( + session: APISession, + postId: Int, + featured: Bool, + featureType: APIPostFeatureType + ) throws { + self.instanceURL = try session.instanceUrl + + self.body = try .init( + post_id: postId, + featured: featured, + feature_type: featureType.rawValue, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Post/ListPostLikesRequest.swift b/Mlem/API/Requests/Post/ListPostLikesRequest.swift new file mode 100644 index 000000000..2d58c1029 --- /dev/null +++ b/Mlem/API/Requests/Post/ListPostLikesRequest.swift @@ -0,0 +1,44 @@ +// +// ListPostLikesRequest.swift +// Mlem +// +// Created by Sjmarf on 22/03/2024. +// + +import Foundation + +struct ListPostLikesRequest: APIGetRequest { + typealias Response = APIListPostLikesResponse + + var instanceURL: URL + let path = "post/like/list" + let queryItems: [URLQueryItem] + + init( + session: APISession, + postId: Int, + page: Int?, + limit: Int? + ) throws { + self.instanceURL = try session.instanceUrl + self.queryItems = try [ + .init(name: "auth", value: session.token), + .init(name: "post_id", value: String(postId)), + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)) + ] + } +} + +struct APIVoteView: Decodable { + let creator: APIPerson + + // Not in a live version yet as of the time of writing, but was merged in https://github.com/LemmyNet/lemmy/pull/4568 + let creatorBannedFromCommunity: Bool? + + let score: ScoringOperation +} + +struct APIListPostLikesResponse: Decodable { + let postLikes: [APIVoteView] +} diff --git a/Mlem/API/Requests/Post/LockPostRequest.swift b/Mlem/API/Requests/Post/LockPostRequest.swift new file mode 100644 index 000000000..2de37de33 --- /dev/null +++ b/Mlem/API/Requests/Post/LockPostRequest.swift @@ -0,0 +1,35 @@ +// +// LockPostRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct LockPostRequest: APIPostRequest { + typealias Response = APIPostResponse + + var instanceURL: URL + let path = "post/lock" + let body: Body + + struct Body: Codable { + let post_id: Int + let locked: Bool + let auth: String + } + + init( + session: APISession, + postId: Int, + locked: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + post_id: postId, + locked: locked, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Post/MarkPostRead.swift b/Mlem/API/Requests/Post/MarkPostRead.swift index fd899dd0d..1af50cb3e 100644 --- a/Mlem/API/Requests/Post/MarkPostRead.swift +++ b/Mlem/API/Requests/Post/MarkPostRead.swift @@ -15,12 +15,13 @@ struct MarkPostReadRequest: APIPostRequest { let body: Body struct Body: Encodable { - let post_id: Int + let post_id: Int? + let post_ids: [Int]? let read: Bool let auth: String - // TODO: 0.19 support add post_ids? field } + /// Create a request to mark a single post as read init( session: APISession, postId: Int, @@ -30,6 +31,23 @@ struct MarkPostReadRequest: APIPostRequest { self.body = try .init( post_id: postId, + post_ids: nil, + read: read, + auth: session.token + ) + } + + /// Create a request to mark multiple posts as read + init( + session: APISession, + postIds: [Int], + read: Bool + ) throws { + self.instanceURL = try session.instanceUrl + + self.body = try .init( + post_id: nil, + post_ids: postIds, read: read, auth: session.token ) diff --git a/Mlem/API/Requests/Post/PurgePostRequest.swift b/Mlem/API/Requests/Post/PurgePostRequest.swift new file mode 100644 index 000000000..bfaf6a4ad --- /dev/null +++ b/Mlem/API/Requests/Post/PurgePostRequest.swift @@ -0,0 +1,35 @@ +// +// PurgePostRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct PurgePostRequest: APIPostRequest { + typealias Response = SuccessResponse + + var instanceURL: URL + let path = "admin/purge/post" + let body: Body + + struct Body: Codable { + let post_id: Int + let reason: String? + let auth: String + } + + init( + session: APISession, + postId: Int, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + post_id: postId, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Post/RemovePostRequest.swift b/Mlem/API/Requests/Post/RemovePostRequest.swift new file mode 100644 index 000000000..d992d7152 --- /dev/null +++ b/Mlem/API/Requests/Post/RemovePostRequest.swift @@ -0,0 +1,38 @@ +// +// RemovePostRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct RemovePostRequest: APIPostRequest { + typealias Response = APIPostResponse + + var instanceURL: URL + let path = "post/remove" + let body: Body + + struct Body: Codable { + let post_id: Int + let removed: Bool + let reason: String? + let auth: String + } + + init( + session: APISession, + postId: Int, + removed: Bool, + reason: String? + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + post_id: postId, + removed: removed, + reason: reason, + auth: session.token + ) + } +} diff --git a/Mlem/API/Requests/Site/BlockInstance.swift b/Mlem/API/Requests/Site/BlockInstance.swift new file mode 100644 index 000000000..28b778ba1 --- /dev/null +++ b/Mlem/API/Requests/Site/BlockInstance.swift @@ -0,0 +1,41 @@ +// +// BlockInstance.swift +// Mlem +// +// Created by Sjmarf on 16/04/2024. +// + +import Foundation + +struct BlockInstanceRequest: APIPostRequest { + typealias Response = BlockInstanceResponse + + let instanceURL: URL + let path = "site/block" + let body: Body + + // lemmy_api_common::community::BlockCommunity + struct Body: Encodable { + let instance_id: Int + let block: Bool + + let auth: String + } + + init( + session: APISession, + instanceId: Int, + block: Bool + ) throws { + self.instanceURL = try session.instanceUrl + self.body = try .init( + instance_id: instanceId, + block: block, + auth: session.token + ) + } +} + +struct BlockInstanceResponse: Decodable { + let blocked: Bool +} diff --git a/Mlem/API/Requests/Site/GetModlogRequest.swift b/Mlem/API/Requests/Site/GetModlogRequest.swift new file mode 100644 index 000000000..1e7ff2939 --- /dev/null +++ b/Mlem/API/Requests/Site/GetModlogRequest.swift @@ -0,0 +1,61 @@ +// +// GetModlogRequest.swift +// Mlem +// +// Created by Eric Andrews on 2024-02-27 +// + +import Foundation + +struct GetModlogRequest: APIGetRequest { + typealias Response = APIGetModlogResponse + + let instanceURL: URL + let path = "modlog" + let queryItems: [URLQueryItem] + + init( + session: APISession, + modPersonId: Int?, + communityId: Int?, + page: Int?, + limit: Int?, + type_: APIModlogActionType?, + otherPersonId: Int? + ) throws { + self.instanceURL = try session.instanceUrl + + var queryItems: [URLQueryItem] = [ + .init(name: "mod_person_id", value: modPersonId.map(String.init)), + .init(name: "community_id", value: communityId.map(String.init)), + .init(name: "page", value: page.map(String.init)), + .init(name: "limit", value: limit.map(String.init)), + .init(name: "type_", value: type_?.rawValue), + .init(name: "other_person_id", value: otherPersonId.map(String.init)) + ] + if let token = try? session.token { + queryItems.append( + .init(name: "auth", value: token) + ) + } + self.queryItems = queryItems + } +} + +struct APIGetModlogResponse: Decodable { + let removedPosts: [APIModRemovePostView] + let lockedPosts: [APIModLockPostView] + let featuredPosts: [APIModFeaturePostView] + let removedComments: [APIModRemoveCommentView] + let removedCommunities: [APIModRemoveCommunityView] + let bannedFromCommunity: [APIModBanFromCommunityView] + let banned: [APIModBanView] + let addedToCommunity: [APIModAddCommunityView] + let transferredToCommunity: [APIModTransferCommunityView] + let added: [APIModAddView] + let adminPurgedPersons: [APIAdminPurgePersonView] + let adminPurgedCommunities: [APIAdminPurgeCommunityView] + let adminPurgedPosts: [APIAdminPurgePostView] + let adminPurgedComments: [APIAdminPurgeCommentView] + let hiddenCommunities: [APIModHideCommunityView] +} diff --git a/Mlem/Animations/Comments.swift b/Mlem/Animations/Animations.swift similarity index 67% rename from Mlem/Animations/Comments.swift rename to Mlem/Animations/Animations.swift index ec88237d6..4392b041c 100644 --- a/Mlem/Animations/Comments.swift +++ b/Mlem/Animations/Animations.swift @@ -9,7 +9,8 @@ import SwiftUI extension Animation { /// Animation for expanding or collapsing a comment and its child comments. - static func showHideComment(_ collapse: Bool) -> Animation { + static func showHideComment(_ collapse: Bool) -> Animation? { + if UIAccessibility.isReduceMotionEnabled { return nil } let standard = (0.4, 1.0, collapse ? 0.25 : 0.3) let animationValues = standard return .interactiveSpring( @@ -18,6 +19,11 @@ extension Animation { blendDuration: animationValues.2 ) } + + static var showHidePost: Animation? { + if UIAccessibility.isReduceMotionEnabled { return nil } + return .interactiveSpring(response: 0.4, dampingFraction: 1, blendDuration: 0.25) + } } extension AnyTransition { diff --git a/Mlem/App Constants.swift b/Mlem/App Constants.swift index d849bf529..b87459cd3 100644 --- a/Mlem/App Constants.swift +++ b/Mlem/App Constants.swift @@ -38,9 +38,13 @@ enum AppConstants { static let smallAvatarSize: CGFloat = 16 static let defaultAvatarSize: CGFloat = 24 static let largeAvatarSpacing: CGFloat = 10 - static let postAndCommentSpacing: CGFloat = 10 // standard spacing for the app + static let doubleSpacing: CGFloat = 20 + static let standardSpacing: CGFloat = 10 // standard spacing for the app + static let halfSpacing: CGFloat = 5 + @available(*, deprecated, message: "prefer standardSpacing") + static let postAndCommentSpacing: CGFloat = 10 static let compactSpacing: CGFloat = 6 // standard spacing for compact things - static let appIconCornerRadius: CGFloat = 10 + static let appIconCornerRadius: CGFloat = 14 static let largeItemCornerRadius: CGFloat = 8 // posts, website previews, etc static let smallItemCornerRadius: CGFloat = 6 // settings items, compact thumbnails static let tinyItemCornerRadius: CGFloat = 4 // buttons @@ -63,7 +67,5 @@ enum AppConstants { static let blockUserPrompt: String = "Really block this user?" static let blockCommunityPrompt: String = "Really block this community?" - static let reportPostPrompt: String = "Really report this post?" - static let reportCommentPrompt: String = "Really report this comment?" - static let reportMessagePrompt: String = "Really report this message?" + static let blockInstancePrompt: String = "Really block this instance?" } diff --git a/Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/Contents.json b/Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/Contents.json new file mode 100644 index 000000000..f4344003c --- /dev/null +++ b/Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "logo.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/logo.png b/Mlem/Assets.xcassets/Icons/icon.sjmarf.ocean.appiconset/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3af19754440a98f5604713f275c0e4a040ebae02 GIT binary patch literal 880335 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�+vxkn2Q8>mIO@nv_ zc|2-~<}L4SPxNoXsLWVcrV_HPR2M~i&tfhMc*sEhV2831d!D^S>WF)1Inv>2Zc4<+ zM?^viT49A)qBkA2Jr$?&VEHO!6!+cLV4HX={{qOQ{J;{fkU(Z%nq-^zQMk#M;nWmH zHZO?foK3(D7|b@+d)v}el?gFwXKabDw@F?ykr0-UtiTU)#_KL-lzc~@Y5?hpAXAZy zG4BlxYCJjZYp#c08YQgR>d@rP+7HXifk*;rso)^bJJl5|c(^#&46}>0sYyC!82Evy z-c;%I*YUSl5R;)|IRhHw(Wyo;VdG~q9X4jeoQ|$p>Z_oT`xiqDoTAg%# z<1xE*6=|4U1<-d0I{W4sD_c;jGXcj3HbiQB-0nO^fpc6Z%C!UKYTbAbt9+d&7Rx;S z0z7UTWjzFYa}yZDB8j=sjYM3Bp;=Lt^IMcD^m$N|eoSMLp1dzSLOlB713(0=vm*^B zgHG&&?)n8W{q(X@Vi}Y~5aTz+mBmp?>=?&eI&+moX833*Xe$UAVL;maXf;Jn2$7G< zIx#?Oo&{Q?w}_~U2i`i{QtK6Sf^8?JQ%6*`@`rmUm6?7SaogbtVik3Z2p?3#z9PKU z1#D<3ONaEHOx~|xNQpvA zIWqjpB%4bUqhdRv$MW(b8w)*+K56ZW>ZW_ zM?Q^4FfqOfd9iO6rZ$@AkXCFUBJfU%SkT@vFU2m`d99z5A!YN&2bE;=tIy9a+F4s|~P5=wRb3-7syZKD3o}Yj?vS8p>YQ{BNn`aLdNx)&cY`@FW&2xyC*(Flo zUaGP&@#n1X8qC3F1ibBVW6@3M`;dz2Cam_6Mt(>>(c#s|tmR19ak%gsV!Uh!H^M9w zrt9qri~cYy0)$ z*5Zy$Uig?c1>gQx?U$9+2R#`RW%@4U5He`WO1dsM<{Syw!qqzrNq%@jnzU+b#7Do&7(>*||$e#c@(zRbcWmXm#wKw_P0FT%d#Ha0W$0 z*lQqor9wFv5MFwl=(H?(B=URTzlIQFKiElB;{~5W%!<(ri`PWefV&76NAX%wjgD5X z(67U4qB>z@_#Wqy4se{4BD2Y*pKwqi7W{Urp@b{jy+?HSZDCN!%AEnpN+sbWU?yZ^ z9v_`KH%rquNRkcN;&3-~$4UjAq!)O7YZ-|WRhoYN_y79OnSZI}afiuRhx%B|AH@7_ zu+~wX?^ALw*o#IJQCExRh+N*yr-&uBft0L=8*%i*8L^cr8rZhDrulsG|WG(uOANbOj|5}IKmR=Pa6 zp97sAWA_p-BBMJ^DmS)Nj-?i+>$qn17sk{t)D)$6db|%>&~*$v_5n3=p$)qz{uXWC z%tjfpqUTn2c)a-%7ees5%EI)wSm&$m-rE=la#@Bk@`oy+N#dEODAs$PvQFhASMvbJ zhRuPj5q!r~#>4Qctbs6frhkMXMI5~@#gpfn^rl$cQKA-g{KTi{FpyBj~I}8vZ zv{Z6AKZonQ0IT9Xw4eL4nPYylX0@-vuAR4d?^OUj2v6uM7ZLwbei zx8Ye*O0^(;BxpF*Wx+gyuQUFIwsEU3wWUd8;4z#UG)srn?D!cxLHhoxWm2sq0A{@E zEUHcG7;S4bcM9cxh(7{J?go#e?Y>9ksdV05>V-Gu3uzvkEM84ajm0yB<#b@)!ltUI8b^2kf=rw9mdS9(oJJpzw_cgP*cuwScHc
Ui%NO;{$~ny=<9TZ2 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