IceCubesApp/IceCubesApp/App/AppRegistry.swift

226 lines
8 KiB
Swift
Raw Normal View History

2022-11-29 10:46:02 +00:00
import Account
2023-01-17 10:36:01 +00:00
import AppAccount
import Conversations
2022-12-20 08:37:07 +00:00
import DesignSystem
2023-01-17 10:36:01 +00:00
import Env
2023-03-13 12:38:28 +00:00
import Explore
2023-02-21 06:23:42 +00:00
import LinkPresentation
import Lists
2023-11-01 17:58:44 +00:00
import MediaUI
2023-02-21 06:23:42 +00:00
import Models
2024-01-06 18:27:26 +00:00
import StatusKit
2023-01-17 10:36:01 +00:00
import SwiftUI
import Timeline
import Notifications
2022-11-29 10:46:02 +00:00
@MainActor
2022-11-29 10:46:02 +00:00
extension View {
func withAppRouter() -> some View {
2023-02-21 17:52:30 +00:00
navigationDestination(for: RouterDestination.self) { destination in
2022-11-29 10:46:02 +00:00
switch destination {
case let .accountDetail(id):
AccountDetailView(accountId: id, scrollToTopSignal: .constant(0))
2022-12-17 12:37:46 +00:00
case let .accountDetailWithAccount(account):
AccountDetailView(account: account, scrollToTopSignal: .constant(0))
case let .accountSettingsWithAccount(account, appAccount):
AccountSettingsView(account: account, appAccount: appAccount)
2022-11-29 10:46:02 +00:00
case let .statusDetail(id):
StatusDetailView(statusId: id)
case let .statusDetailWithStatus(status):
StatusDetailView(status: status)
case let .remoteStatusDetail(url):
StatusDetailView(remoteStatusURL: url)
case let .conversationDetail(conversation):
ConversationDetailView(conversation: conversation)
2022-12-21 19:26:38 +00:00
case let .hashTag(tag, accountId):
TimelineView(timeline: .constant(.hashtag(tag: tag, accountId: accountId)),
2023-12-30 13:54:09 +00:00
pinnedFilters: .constant([]),
2023-09-22 17:33:53 +00:00
selectedTagGroup: .constant(nil),
scrollToTopSignal: .constant(0),
canFilterTimeline: false)
case let .list(list):
TimelineView(timeline: .constant(.list(list: list)),
2023-12-30 13:54:09 +00:00
pinnedFilters: .constant([]),
2023-09-22 17:33:53 +00:00
selectedTagGroup: .constant(nil),
scrollToTopSignal: .constant(0),
canFilterTimeline: false)
2022-12-23 17:47:19 +00:00
case let .following(id):
2022-12-28 09:08:41 +00:00
AccountsListView(mode: .following(accountId: id))
2022-12-23 17:47:19 +00:00
case let .followers(id):
2022-12-24 12:41:25 +00:00
AccountsListView(mode: .followers(accountId: id))
case let .favoritedBy(id):
AccountsListView(mode: .favoritedBy(statusId: id))
2022-12-24 12:41:25 +00:00
case let .rebloggedBy(id):
AccountsListView(mode: .rebloggedBy(statusId: id))
case let .accountsList(accounts):
AccountsListView(mode: .accountsList(accounts: accounts))
2023-03-02 19:15:07 +00:00
case .trendingTimeline:
2023-09-22 17:33:53 +00:00
TimelineView(timeline: .constant(.trending),
2023-12-30 13:54:09 +00:00
pinnedFilters: .constant([]),
2023-09-22 17:33:53 +00:00
selectedTagGroup: .constant(nil),
scrollToTopSignal: .constant(0),
canFilterTimeline: false)
case let .trendingLinks(cards):
2024-02-10 10:26:22 +00:00
TrendingLinksListView(cards: cards)
2023-03-02 19:15:07 +00:00
case let .tagsList(tags):
TagsListView(tags: tags)
case .notificationsRequests:
NotificationsRequestsListView()
case let .notificationForAccount(accountId):
NotificationsListView(lockedType: nil ,
lockedAccountId: accountId,
scrollToTopSignal: .constant(0))
2022-11-29 10:46:02 +00:00
}
}
}
2023-02-21 06:23:42 +00:00
2023-02-21 17:52:30 +00:00
func withSheetDestinations(sheetDestinations: Binding<SheetDestination?>) -> some View {
2023-01-17 10:36:01 +00:00
sheet(item: sheetDestinations) { destination in
2024-01-11 19:02:48 +00:00
switch destination {
case let .replyToStatusEditor(status):
StatusEditor.MainView(mode: .replyTo(status: status))
.withEnvironments()
case let .newStatusEditor(visibility):
StatusEditor.MainView(mode: .new(visibility: visibility))
.withEnvironments()
case let .editStatusEditor(status):
StatusEditor.MainView(mode: .edit(status: status))
.withEnvironments()
case let .quoteStatusEditor(status):
StatusEditor.MainView(mode: .quote(status: status))
.withEnvironments()
2024-02-10 10:26:22 +00:00
case let .quoteLinkStatusEditor(link):
StatusEditor.MainView(mode: .quoteLink(link: link))
.withEnvironments()
2024-01-11 19:02:48 +00:00
case let .mentionStatusEditor(account, visibility):
StatusEditor.MainView(mode: .mention(account: account, visibility: visibility))
.withEnvironments()
case .listCreate:
ListCreateView()
.withEnvironments()
case let .listEdit(list):
ListEditView(list: list)
.withEnvironments()
case let .listAddAccount(account):
ListAddAccountView(account: account)
.withEnvironments()
case .addAccount:
AddAccountView()
.withEnvironments()
case .addRemoteLocalTimeline:
AddRemoteTimelineView()
.withEnvironments()
case .addTagGroup:
EditTagGroupView()
.withEnvironments()
case let .statusEditHistory(status):
StatusEditHistoryView(statusId: status)
.withEnvironments()
case .settings:
SettingsTabs(popToRootTab: .constant(.settings), isModal: true)
.withEnvironments()
.preferredColorScheme(Theme.shared.selectedScheme == .dark ? .dark : .light)
case .accountPushNotficationsSettings:
if let subscription = PushNotificationsService.shared.subscriptions.first(where: { $0.account.token == AppAccountsManager.shared.currentAccount.oauthToken }) {
NavigationSheet { PushNotificationsView(subscription: subscription) }
.withEnvironments()
} else {
EmptyView()
}
2024-01-11 19:02:48 +00:00
case .about:
NavigationSheet { AboutView() }
.withEnvironments()
case .support:
NavigationSheet { SupportAppView() }
.withEnvironments()
case let .report(status):
ReportView(status: status)
.withEnvironments()
case let .shareImage(image, status):
ActivityView(image: image, status: status)
.withEnvironments()
case let .editTagGroup(tagGroup, onSaved):
EditTagGroupView(tagGroup: tagGroup, onSaved: onSaved)
.withEnvironments()
case .timelineContentFilter:
NavigationSheet { TimelineContentFilterView() }
.presentationDetents([.medium])
.presentationBackground(.thinMaterial)
2024-01-11 19:02:48 +00:00
.withEnvironments()
case .accountEditInfo:
EditAccountView()
.withEnvironments()
case .accountFiltersList:
FiltersListView()
.withEnvironments()
2022-12-20 08:37:07 +00:00
}
}
}
2023-02-21 06:23:42 +00:00
func withEnvironments() -> some View {
environment(CurrentAccount.shared)
2023-09-19 07:18:20 +00:00
.environment(UserPreferences.shared)
.environment(CurrentInstance.shared)
2023-09-18 19:03:52 +00:00
.environment(Theme.shared)
.environment(AppAccountsManager.shared)
.environment(PushNotificationsService.shared)
.environment(AppAccountsManager.shared.currentClient)
2023-10-26 04:23:00 +00:00
.environment(QuickLook.shared)
}
2023-09-22 07:31:35 +00:00
func withModelContainer() -> some View {
modelContainer(for: [
Draft.self,
2023-09-22 10:49:25 +00:00
LocalTimeline.self,
TagGroup.self,
2024-01-05 09:57:26 +00:00
RecentTag.self,
2023-09-22 07:31:35 +00:00
])
}
2022-11-29 10:46:02 +00:00
}
2023-02-19 14:29:07 +00:00
struct ActivityView: UIViewControllerRepresentable {
let image: UIImage
let status: Status
2023-02-21 06:23:42 +00:00
2023-02-19 14:29:07 +00:00
class LinkDelegate: NSObject, UIActivityItemSource {
let image: UIImage
let status: Status
2023-02-21 06:23:42 +00:00
2023-02-19 14:29:07 +00:00
init(image: UIImage, status: Status) {
self.image = image
self.status = status
}
2023-02-21 06:23:42 +00:00
func activityViewControllerLinkMetadata(_: UIActivityViewController) -> LPLinkMetadata? {
2023-02-19 14:29:07 +00:00
let imageProvider = NSItemProvider(object: image)
let metadata = LPLinkMetadata()
metadata.imageProvider = imageProvider
metadata.title = status.reblog?.content.asRawText ?? status.content.asRawText
return metadata
}
2023-02-21 06:23:42 +00:00
func activityViewControllerPlaceholderItem(_: UIActivityViewController) -> Any {
2023-02-19 14:29:07 +00:00
image
}
2023-02-21 06:23:42 +00:00
func activityViewController(_: UIActivityViewController,
itemForActivityType _: UIActivity.ActivityType?) -> Any?
{
2023-02-19 14:29:07 +00:00
nil
}
}
2023-02-21 06:23:42 +00:00
func makeUIViewController(context _: UIViewControllerRepresentableContext<ActivityView>) -> UIActivityViewController {
2023-09-16 12:15:03 +00:00
UIActivityViewController(activityItems: [image, LinkDelegate(image: image, status: status)],
applicationActivities: nil)
2023-02-19 14:29:07 +00:00
}
2023-02-21 06:23:42 +00:00
func updateUIViewController(_: UIActivityViewController, context _: UIViewControllerRepresentableContext<ActivityView>) {}
2023-02-19 14:29:07 +00:00
}
2023-10-23 17:12:25 +00:00
extension URL: Identifiable {
public var id: String {
absoluteString
}
}