mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 11:05:19 +00:00
- Added LICENSE file with Unlicense (public domain dedication) - Added public domain headers to all main source files - Updated README to mention public domain status - All code is free and unencumbered, released into the public domain Anyone is free to use this code for any purpose without restriction.
80 lines
2.6 KiB
Swift
80 lines
2.6 KiB
Swift
//
|
|
// BitchatApp.swift
|
|
// bitchat
|
|
//
|
|
// This is free and unencumbered software released into the public domain.
|
|
// For more information, see <https://unlicense.org>
|
|
//
|
|
|
|
import SwiftUI
|
|
import UserNotifications
|
|
|
|
@main
|
|
struct BitchatApp: App {
|
|
@StateObject private var chatViewModel = ChatViewModel()
|
|
#if os(iOS)
|
|
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
|
|
#endif
|
|
|
|
init() {
|
|
UNUserNotificationCenter.current().delegate = NotificationDelegate.shared
|
|
}
|
|
|
|
var body: some Scene {
|
|
WindowGroup {
|
|
ContentView()
|
|
.environmentObject(chatViewModel)
|
|
.onAppear {
|
|
NotificationDelegate.shared.chatViewModel = chatViewModel
|
|
}
|
|
}
|
|
#if os(macOS)
|
|
.windowStyle(.hiddenTitleBar)
|
|
.windowResizability(.contentSize)
|
|
#endif
|
|
}
|
|
}
|
|
|
|
#if os(iOS)
|
|
class AppDelegate: NSObject, UIApplicationDelegate {
|
|
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
|
return true
|
|
}
|
|
}
|
|
#endif
|
|
|
|
class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
|
|
static let shared = NotificationDelegate()
|
|
weak var chatViewModel: ChatViewModel?
|
|
|
|
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
|
|
let identifier = response.notification.request.identifier
|
|
|
|
// Check if this is a private message notification
|
|
if identifier.hasPrefix("private-") {
|
|
// Extract sender from notification title
|
|
let title = response.notification.request.content.title
|
|
if let senderName = title.replacingOccurrences(of: "Private message from ", with: "").nilIfEmpty {
|
|
// Find peer ID and open chat
|
|
if let peerID = chatViewModel?.getPeerIDForNickname(senderName) {
|
|
DispatchQueue.main.async {
|
|
self.chatViewModel?.startPrivateChat(with: peerID)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
completionHandler()
|
|
}
|
|
|
|
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
|
|
// Show notification even when app is in foreground (for testing)
|
|
completionHandler([.banner, .sound])
|
|
}
|
|
}
|
|
|
|
extension String {
|
|
var nilIfEmpty: String? {
|
|
self.isEmpty ? nil : self
|
|
}
|
|
} |