// // DraggedItem.swift // Confab // // Drag-and-drop payload wire format for the conversation lists // // SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0 // Copyright (C) 2026 Rune Olsen // // This file is part of Confab. // // Confab is licensed under the PolyForm Noncommercial License 1.0.0. // You may use, study, modify, and share it for any noncommercial // purpose. Commercial use — including selling Confab or any part of // it, standalone or bundled into another product or service — // requires a separate commercial license from the copyright holder. // // See the LICENSE file or // for // the full license text. For commercial licensing, contact Rune // Olsen via . import Foundation /// Disambiguates what's being dragged in the sidebar/advanced-list conversation trees, now that /// both conversations and folders are draggable. `.conversations` carries one or more IDs — a /// single drag, or every ID in an active multi-selection bundled together so dropping any one of /// them moves the whole selection. enum DraggedItem: Equatable { case conversations([UUID]) case folder(UUID) var rawValue: String { switch self { case .conversations(let ids): return "conversation:" + ids.map(\.uuidString).joined(separator: ",") case .folder(let id): return "folder:\(id.uuidString)" } } init?(rawValue: String) { if rawValue.hasPrefix("conversation:") { let ids = rawValue.dropFirst(13).split(separator: ",").compactMap { UUID(uuidString: String($0)) } guard !ids.isEmpty else { return nil } self = .conversations(ids) } else if rawValue.hasPrefix("folder:"), let id = UUID(uuidString: String(rawValue.dropFirst(7))) { self = .folder(id) } else { return nil } } }