mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-12 05:29:57 +02:00
refactor(core): remove prototype contact paths for experimental saved devices
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -12,7 +12,6 @@ final class AppGraph: ObservableObject {
|
||||
let preferencesRepository: AppPreferencesRepository
|
||||
let filePreviewRepository: FilePreviewRepository
|
||||
let approvalCoordinator: ApprovalCoordinator
|
||||
let contactsModel: ContactsModel
|
||||
let transferNotificationCoordinator: TransferNotificationCoordinator
|
||||
let backgroundActivity: BackgroundActivityController
|
||||
|
||||
@@ -28,12 +27,6 @@ final class AppGraph: ObservableObject {
|
||||
themeMode: .system
|
||||
)
|
||||
)
|
||||
self.contactsModel = ContactsModel(
|
||||
repository: coreRepository,
|
||||
messages: messages,
|
||||
preferences: preferencesRepository,
|
||||
fileSystemService: dependencies.fileSystemService
|
||||
)
|
||||
self.approvalCoordinator = ApprovalCoordinator(
|
||||
repository: coreRepository,
|
||||
notifications: dependencies.notificationService,
|
||||
|
||||
@@ -60,11 +60,6 @@ struct RootView: View {
|
||||
approvals: graph.approvalCoordinator,
|
||||
sendModel: sendModel
|
||||
)
|
||||
ContactPromptLayer(
|
||||
contacts: graph.contactsModel,
|
||||
receiveModel: receiveModel,
|
||||
approvals: graph.approvalCoordinator
|
||||
)
|
||||
// Top-most so the toast is never covered by the approval overlay's
|
||||
// full-bleed clear layer. Observes the live `graph.messages` directly.
|
||||
SnackbarHost(controller: graph.messages)
|
||||
@@ -93,9 +88,6 @@ struct RootView: View {
|
||||
// unfocused/occluded (common on macOS) live events may not have
|
||||
// rendered, leaving progress/status stale.
|
||||
Task { _ = await graph.coreRepository.refresh() }
|
||||
// Opt-in and foreground-only: collecting transfers held for this
|
||||
// device also tells every contact that the app was opened.
|
||||
Task { await graph.contactsModel.checkForOffersOnForeground() }
|
||||
case .background:
|
||||
graph.visibility.setForeground(false)
|
||||
// Hold the process open for iOS's grace window so an active
|
||||
@@ -173,10 +165,10 @@ struct RootView: View {
|
||||
@ViewBuilder
|
||||
private func screen(for destination: AppDestination, windowClass: WindowClass) -> some View {
|
||||
switch destination {
|
||||
case .send: SendScreen(model: sendModel, contacts: graph.contactsModel, windowClass: windowClass)
|
||||
case .send: SendScreen(model: sendModel, windowClass: windowClass)
|
||||
case .receive: ReceiveScreen(model: receiveModel, windowClass: windowClass)
|
||||
case .settings:
|
||||
SettingsScreen(model: settingsModel, contacts: graph.contactsModel, windowClass: windowClass)
|
||||
SettingsScreen(model: settingsModel, windowClass: windowClass)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -299,50 +291,3 @@ import AppKit
|
||||
/// belongs to a transfer this device is sending, and these belong to a device
|
||||
/// asking to reach it. Both are suppressed while the other is up so the user is
|
||||
/// never answering two modals at once.
|
||||
private struct ContactPromptLayer: View {
|
||||
@ObservedObject var contacts: ContactsModel
|
||||
let receiveModel: ReceiveModel
|
||||
@ObservedObject var approvals: ApprovalCoordinator
|
||||
|
||||
@State private var showPrompt = false
|
||||
|
||||
var body: some View {
|
||||
ContactPromptHost(
|
||||
isPresented: $showPrompt,
|
||||
state: contacts.state,
|
||||
onPairingResponse: { endpointId, accepted in
|
||||
Task { await contacts.respondToPairing(endpointId: endpointId, accepted: accepted) }
|
||||
},
|
||||
onOfferResponse: { offerId, accepted in
|
||||
Task {
|
||||
// The ticket is released only on acceptance; the receive then
|
||||
// runs through the ordinary path so the platform picks the
|
||||
// destination.
|
||||
if let ticket = await contacts.respondToOffer(offerId: offerId, accepted: accepted) {
|
||||
receiveModel.receiveOffered(ticket: ticket)
|
||||
}
|
||||
}
|
||||
},
|
||||
onSuggestionResponse: { suggestion, accepted in
|
||||
if accepted {
|
||||
Task { await contacts.acceptSuggestion(suggestion) }
|
||||
} else {
|
||||
contacts.declineSuggestion(suggestion)
|
||||
}
|
||||
}
|
||||
)
|
||||
.onChange(of: promptKey) { _, key in
|
||||
showPrompt = key != nil
|
||||
}
|
||||
}
|
||||
|
||||
/// One identity for "is there something to answer", so an offer replacing a
|
||||
/// pairing prompt re-presents rather than silently swapping content.
|
||||
private var promptKey: String? {
|
||||
guard approvals.state.current == nil else { return nil }
|
||||
if let offer = contacts.state.currentOffer { return "offer-\(offer.offerId)" }
|
||||
if let pairing = contacts.state.currentPairing { return "pairing-\(pairing.endpointId)" }
|
||||
if let suggestion = contacts.state.currentSuggestion { return "suggest-\(suggestion.endpointId)" }
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user