48 lines
1.1 KiB
Swift
48 lines
1.1 KiB
Swift
//
|
|
// SharedNoteEditor.swift
|
|
// Peered
|
|
//
|
|
// Created by Oskar Chybowski on 07/10/2025.
|
|
//
|
|
import SwiftUI
|
|
|
|
struct SharedNoteEditor: View {
|
|
@State var note: String?
|
|
@State var remoteNote: String? = nil
|
|
@State var invitation: NoteInvitation
|
|
@Bindable var noteClient: NoteEditingSessionClient
|
|
|
|
init(
|
|
invitation: NoteInvitation,
|
|
noteClient: NoteEditingSessionClient
|
|
) {
|
|
self._invitation = .init(initialValue: invitation)
|
|
self._noteClient = .init(noteClient)
|
|
}
|
|
|
|
var body: some View {
|
|
ZStack {
|
|
if let note = Binding($note) {
|
|
NoteTextEditor(text: note, remoteText: remoteNote)
|
|
} else {
|
|
ProgressView {
|
|
Text("Fetching note...")
|
|
}
|
|
}
|
|
}
|
|
.onReceive(noteClient.noteChangesEmitter) { message in
|
|
guard message.senderID != noteClient.ownPeer.displayName else { return }
|
|
remoteNote = message.content
|
|
}
|
|
.task(id: note) {
|
|
try? await Task.sleep(nanoseconds: 500_000_000)
|
|
guard !Task.isCancelled, let note else { return }
|
|
noteClient.send(note: note, to: invitation.invitatorID)
|
|
}
|
|
.onAppear {
|
|
invitation.accept()
|
|
note = invitation.note.noteSnapshot
|
|
}
|
|
}
|
|
}
|