Bubble/Threaded/Views/ContentView.swift

129 lines
4.5 KiB
Swift
Raw Normal View History

2023-12-29 11:17:37 +01:00
//Made by Lumaa
import SwiftUI
struct ContentView: View {
@UIApplicationDelegateAdaptor private var appDelegate: AppDelegate
2024-01-21 13:18:25 +01:00
@State private var preferences: UserPreferences = .defaultPreferences
2023-12-29 11:17:37 +01:00
@State private var navigator = Navigator()
@State private var sheet: SheetDestination?
@State private var accountManager: AccountManager = AccountManager()
2023-12-29 11:17:37 +01:00
var body: some View {
TabView(selection: $navigator.selectedTab, content: {
ZStack {
if accountManager.getClient() != nil {
TimelineView(navigator: navigator, timelineModel: FetchTimeline(client: accountManager.forceClient()))
2023-12-29 11:17:37 +01:00
.background(Color.appBackground)
.safeAreaPadding()
} else {
ZStack {
Color.appBackground
.ignoresSafeArea()
}
}
}
.background(Color.appBackground)
.tag(TabDestination.timeline)
Text(String("Search"))
.background(Color.appBackground)
.tag(TabDestination.search)
2024-01-26 23:01:20 +01:00
//TODO: Messaging UI in Activity tab
2023-12-29 11:17:37 +01:00
Text(String("Activity"))
.background(Color.appBackground)
.tag(TabDestination.activity)
2024-01-13 13:15:46 +01:00
ZStack {
if accountManager.getAccount() != nil {
AccountView(isCurrent: true, account: accountManager.forceAccount())
2024-01-21 13:08:43 +01:00
.environment(navigator)
2024-01-13 13:15:46 +01:00
.background(Color.appBackground)
} else {
ZStack {
Color.appBackground
.ignoresSafeArea()
}
}
}
.background(Color.appBackground)
.tag(TabDestination.profile)
2023-12-29 11:17:37 +01:00
})
.overlay(alignment: .bottom) {
TabsView(navigator: navigator)
.safeAreaPadding(.vertical)
.zIndex(10)
}
.withCovers(sheetDestination: $sheet)
.withSheets(sheetDestination: $navigator.presentedSheet)
.environment(accountManager)
2023-12-29 11:17:37 +01:00
.environment(navigator)
.environment(appDelegate)
2024-01-10 17:40:05 +01:00
.onAppear {
2024-01-21 13:18:25 +01:00
do {
preferences = try UserPreferences.loadAsCurrent() ?? .defaultPreferences
} catch {
print(error)
}
2024-01-10 17:40:05 +01:00
if accountManager.getClient() == nil {
Task {
await recognizeAccount()
}
}
}
.task {
await recognizeAccount()
}
2024-01-21 13:08:43 +01:00
.environment(\.openURL, OpenURLAction { url in
// Open internal URL.
2024-01-21 13:18:25 +01:00
guard preferences.browserType == .inApp else { return .systemAction }
2024-01-21 13:08:43 +01:00
navigator.presentedSheet = .safari(url: url)
return OpenURLAction.Result.handled
})
.onOpenURL(perform: { url in
2024-01-21 13:18:25 +01:00
guard preferences.browserType == .inApp else { return }
2024-01-21 13:08:43 +01:00
navigator.presentedSheet = .safari(url: url)
})
}
func recognizeAccount() async {
let acc = try? AppAccount.loadAsCurrent()
if acc == nil {
sheet = .welcome
} else {
Task {
accountManager.setClient(.init(server: acc!.server, oauthToken: acc!.oauthToken))
2024-01-10 17:40:05 +01:00
// check if token is still working
let fetched: Account? = await accountManager.fetchAccount()
if fetched == nil {
accountManager.clear()
AppAccount.clear()
sheet = .welcome
}
2023-12-29 11:17:37 +01:00
}
}
}
init() {
let appearance = UITabBarAppearance()
appearance.configureWithTransparentBackground()
appearance.stackedLayoutAppearance.normal.iconColor = .white
appearance.stackedLayoutAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
appearance.stackedLayoutAppearance.selected.iconColor = UIColor(Color.accentColor)
appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor(Color.accentColor)]
UITabBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().tintColor = UIColor.label
2023-12-29 11:17:37 +01:00
}
}
#Preview {
ContentView()
}