Release 1.0.3: refine tablet layouts, pointer selection and account sync cleanup
This commit is contained in:
@@ -149,6 +149,18 @@ enum NativeServices {
|
||||
// Fire and forget, like Android: the status stream reports the result.
|
||||
Task { _ = await coordinator.resolveConflict(conflict, resolution: resolution, creds: creds) }
|
||||
}
|
||||
case "removeAccountData":
|
||||
guard let accountId = args["accountId"] as? String else {
|
||||
return result(FlutterError(code: "bad_args", message: "Missing accountId", details: nil))
|
||||
}
|
||||
Task {
|
||||
do {
|
||||
try await coordinator.removeAccountData(accountId: accountId)
|
||||
await MainActor.run { result(nil) }
|
||||
} catch {
|
||||
await MainActor.run { result(FlutterError(code: "cleanup_failed", message: error.localizedDescription, details: nil)) }
|
||||
}
|
||||
}
|
||||
case "removeLocalSync":
|
||||
guard let accountId = args["accountId"] as? String, let path = args["path"] as? String else {
|
||||
return result(FlutterError(code: "bad_args", message: "Missing required arguments", details: nil))
|
||||
|
||||
@@ -194,6 +194,16 @@ final class SyncCoordinator {
|
||||
/// removal under the same mutex as runs - a run still holding the old
|
||||
/// state would otherwise write it back over the removal (and a transfer
|
||||
/// finishing after it would leave a file the state doesn't know about).
|
||||
func removeAccountData(accountId: String) async throws {
|
||||
cancel(accountId: accountId, forget: true)
|
||||
try await mutex.withLock {
|
||||
try store.removeAccountData(accountId: accountId)
|
||||
for conflict in bus.snapshot().conflicts where conflict.accountId == accountId {
|
||||
bus.removeConflict(accountId: accountId, fileId: conflict.fileId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func removeLocalSync(accountId: String, path: String) async {
|
||||
cancelRun(accountId: accountId, invalidateQueued: true)
|
||||
_ = try? await mutex.withLock {
|
||||
|
||||
@@ -108,6 +108,13 @@ final class SyncStore {
|
||||
if changed { _ = write(Array(current).sorted(), to: file(accountId, "missing.json")) }
|
||||
}
|
||||
|
||||
func removeAccountData(accountId: String) throws {
|
||||
for directory in ["sync", "sync-state"] {
|
||||
let url = base.appendingPathComponent(directory).appendingPathComponent(accountId)
|
||||
if fileManager.fileExists(atPath: url.path) { try fileManager.removeItem(at: url) }
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Removing a path's mirror
|
||||
|
||||
/// Deletes [path]'s local mirror (a file, or a whole folder's worth) and
|
||||
|
||||
Reference in New Issue
Block a user