diff --git a/kordophone2/App.swift b/kordophone2/App.swift index 918a3ad..5f36b24 100644 --- a/kordophone2/App.swift +++ b/kordophone2/App.swift @@ -9,33 +9,10 @@ import SwiftUI @main struct KordophoneApp: App -{ - @State var conversationListModel = ConversationListView.ViewModel() - @State var transcriptViewModel = TranscriptView.ViewModel() - @State var entryViewModel = MessageEntryView.ViewModel() - - private let xpcClient = XPCClient() - private var selectedConversation: Display.Conversation? { - guard let id = conversationListModel.selectedConversations.first else { return nil } - return conversationListModel.conversations.first { $0.id == id } - } - +{ var body: some Scene { WindowGroup { - NavigationSplitView { - ConversationListView(model: $conversationListModel) - .frame(minWidth: 330.0) - .xpcClient(xpcClient) - } detail: { - ConversationView(transcriptModel: $transcriptViewModel, entryModel: $entryViewModel) - .xpcClient(xpcClient) - .selectedConversation(selectedConversation) - .navigationTitle("Kordophone") - .navigationSubtitle(selectedConversation?.displayName ?? "") - .onChange(of: conversationListModel.selectedConversations) { oldValue, newValue in - transcriptViewModel.displayedConversation = newValue.first - } - } + SplitView() } Settings { @@ -48,21 +25,3 @@ struct KordophoneApp: App print("Error: \(e.localizedDescription)") } } - -extension EnvironmentValues -{ - @Entry var xpcClient: XPCClient = XPCClient() - @Entry var selectedConversation: Display.Conversation? = nil -} - -extension View -{ - func xpcClient(_ client: XPCClient) -> some View { - environment(\.xpcClient, client) - } - - func selectedConversation(_ convo: Display.Conversation?) -> some View { - environment(\.selectedConversation, convo) - } -} - diff --git a/kordophone2/Environment.swift b/kordophone2/Environment.swift new file mode 100644 index 0000000..4483850 --- /dev/null +++ b/kordophone2/Environment.swift @@ -0,0 +1,26 @@ +// +// Environment.swift +// kordophone2 +// +// Created by James Magahern on 8/29/25. +// + +import SwiftUI + +extension EnvironmentValues +{ + @Entry var xpcClient: XPCClient = XPCClient() + @Entry var selectedConversation: Display.Conversation? = nil +} + +extension View +{ + func xpcClient(_ client: XPCClient) -> some View { + environment(\.xpcClient, client) + } + + func selectedConversation(_ convo: Display.Conversation?) -> some View { + environment(\.selectedConversation, convo) + } +} + diff --git a/kordophone2/SplitView.swift b/kordophone2/SplitView.swift new file mode 100644 index 0000000..d37a603 --- /dev/null +++ b/kordophone2/SplitView.swift @@ -0,0 +1,38 @@ +// +// SplitView.swift +// kordophone2 +// +// Created by James Magahern on 8/29/25. +// + +import SwiftUI + +struct SplitView: View +{ + @State var conversationListModel = ConversationListView.ViewModel() + @State var transcriptViewModel = TranscriptView.ViewModel() + @State var entryViewModel = MessageEntryView.ViewModel() + + private let xpcClient = XPCClient() + private var selectedConversation: Display.Conversation? { + guard let id = conversationListModel.selectedConversations.first else { return nil } + return conversationListModel.conversations.first { $0.id == id } + } + + var body: some View { + NavigationSplitView { + ConversationListView(model: $conversationListModel) + .frame(minWidth: 330.0) + .xpcClient(xpcClient) + } detail: { + ConversationView(transcriptModel: $transcriptViewModel, entryModel: $entryViewModel) + .xpcClient(xpcClient) + .selectedConversation(selectedConversation) + .navigationTitle("Kordophone") + .navigationSubtitle(selectedConversation?.displayName ?? "") + .onChange(of: conversationListModel.selectedConversations) { oldValue, newValue in + transcriptViewModel.displayedConversation = newValue.first + } + } + } +} diff --git a/kordophone2/Supporting Files/kordophone2.entitlements b/kordophone2/Supporting Files/kordophone2.entitlements index da519ee..d56bd85 100644 --- a/kordophone2/Supporting Files/kordophone2.entitlements +++ b/kordophone2/Supporting Files/kordophone2.entitlements @@ -2,12 +2,6 @@ - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - com.apple.security.network.client - com.apple.security.temporary-exception.mach-lookup.global-name net.buzzert.kordophonecd