Files
damus/damus/damusApp.swift
2023-08-23 09:24:13 -07:00

85 lines
3.0 KiB
Swift

//
// damusApp.swift
// damus
//
// Created by William Casarin on 2022-04-01.
//
import SwiftUI
@main
struct damusApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
MainView()
}
}
}
struct MainView: View {
@State var needs_setup = false;
@State var keypair: Keypair? = nil;
@StateObject private var orientationTracker = OrientationTracker()
var body: some View {
Group {
if let kp = keypair, !needs_setup {
ContentView(keypair: kp)
.environmentObject(orientationTracker)
} else {
SetupView()
.onReceive(handle_notify(.login)) { notif in
needs_setup = false
keypair = get_saved_keypair()
}
}
}
.dynamicTypeSize(.xSmall ... .xxxLarge)
.onReceive(handle_notify(.logout)) { () in
try? clear_keypair()
keypair = nil
}
.onReceive(NotificationCenter.default.publisher(for: UIDevice.orientationDidChangeNotification)) { _ in
orientationTracker.setDeviceMajorAxis()
}
.onAppear {
orientationTracker.setDeviceMajorAxis()
keypair = get_saved_keypair()
}
}
}
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
UNUserNotificationCenter.current().delegate = self
return true
}
// Handle the notification in the foreground state
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// Display the notification in the foreground
completionHandler([.banner, .list, .sound, .badge])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
guard let notification = LossyLocalNotification.from_user_info(user_info: userInfo) else {
return
}
notify(.local_notification(notification))
completionHandler()
}
}
class OrientationTracker: ObservableObject {
var deviceMajorAxis: CGFloat = 0
func setDeviceMajorAxis() {
let bounds = UIScreen.main.bounds
let height = max(bounds.height, bounds.width) /// device's longest dimension
let width = min(bounds.height, bounds.width) /// device's shortest dimension
let orientation = UIDevice.current.orientation
deviceMajorAxis = (orientation == .portrait || orientation == .unknown) ? height : width
}
}