Bugfixes, simplifications

This commit is contained in:
2026-05-16 13:58:38 +02:00
parent db92487782
commit 10e08435a7
6 changed files with 150 additions and 162 deletions
@@ -1,5 +1,6 @@
import MultipeerConnectivity
import Foundation
import Combine
struct NoteInvitation: Identifiable {
struct NoteContent: Codable {
@@ -8,18 +9,16 @@ struct NoteInvitation: Identifiable {
}
var id: MCPeerID { invitatorID }
let noteName: String
var noteName: String { note.title }
let invitatorID: MCPeerID
let note: NoteContent
private var invitationHandler: ((Bool) -> Void)?
init(
noteName: String,
invitatorID: MCPeerID,
note: NoteContent,
invitationHandler: ((Bool) -> Void)? = nil
) {
self.noteName = noteName
self.invitatorID = invitatorID
self.note = note
self.invitationHandler = invitationHandler
@@ -40,13 +39,10 @@ struct NoteInvitation: Identifiable {
final class NoteEditingSessionClient: NSObject {
private let session: MCSession
private let advertiser: MCNearbyServiceAdvertiser
private let ownPeer: MCPeerID
private(set) var ownPeer: MCPeerID
var invitations: [NoteInvitation] = [] {
didSet {
print(invitations)
}
}
var invitations: [NoteInvitation] = []
let noteChangesEmitter = PassthroughSubject<NoteMessage, Never>()
init(peer: MCPeerID) {
ownPeer = peer
@@ -62,22 +58,22 @@ final class NoteEditingSessionClient: NSObject {
)
super.init()
advertiser.delegate = self
session.delegate = self
}
func startBrowsingForNotes() {
advertiser.startAdvertisingPeer()
}
func stopBrowsingForNotes() {
advertiser.stopAdvertisingPeer()
}
advertiser.startAdvertisingPeer()
}
func stopBrowsingForNotes() {
advertiser.stopAdvertisingPeer()
session.disconnect()
}
func send(note: String, to peer: MCPeerID) {
try! session.send(
note.data(using: .utf8)!,
toPeers: [peer],
with: .reliable
)
let message = NoteMessage(senderID: ownPeer.displayName, content: note)
guard let data = try? JSONEncoder().encode(message) else { return }
try? session.send(data, toPeers: [peer], with: .reliable)
}
}
@@ -91,23 +87,45 @@ extension NoteEditingSessionClient: MCNearbyServiceAdvertiserDelegate {
guard
let context,
let noteContent = try? JSONDecoder().decode(NoteInvitation.NoteContent.self, from: context)
else { fatalError() }
else { return }
invitations.append(
.init(
noteName: noteContent.title,
invitatorID: peerID,
note: noteContent,
invitationHandler: { [weak self, invitationHandler] accepted in
guard let self else { return }
invitationHandler(accepted, self.session)
DispatchQueue.main.async {
guard let idx = self.invitations.firstIndex(where: { $0.id == peerID }) else { return }
self.invitations.remove(at: idx)
DispatchQueue.main.async {
self.invitations.append(
.init(
invitatorID: peerID,
note: noteContent,
invitationHandler: { [weak self, invitationHandler] accepted in
guard let self else { return }
invitationHandler(accepted, self.session)
DispatchQueue.main.async {
self.invitations.removeAll { $0.id == peerID }
}
}
}
)
)
)
}
}
}
extension NoteEditingSessionClient: MCSessionDelegate {
func session(
_ session: MCSession,
peer peerID: MCPeerID,
didChange state: MCSessionState
) {}
func session(
_ session: MCSession,
didReceive data: Data,
fromPeer peerID: MCPeerID
) {
guard let message = try? JSONDecoder().decode(NoteMessage.self, from: data) else { return }
DispatchQueue.main.async {
self.noteChangesEmitter.send(message)
}
}
func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {}
func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {}
func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: (any Error)?) {}
}