mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 23:24:32 +00:00
59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
//
|
|
// ShelfActionService.swift
|
|
// boringNotch
|
|
//
|
|
// Created by Alexander on 2025-10-07.
|
|
//
|
|
|
|
import AppKit
|
|
import Foundation
|
|
|
|
/// A service providing common actions for `ShelfItem`s, such as opening, revealing, or copying paths.
|
|
@MainActor
|
|
enum ShelfActionService {
|
|
|
|
static func open(_ item: ShelfItem) {
|
|
switch item.kind {
|
|
case .file(let bookmark):
|
|
handleBookmarkedFile(bookmark) { url in
|
|
NSWorkspace.shared.open(url)
|
|
}
|
|
case .link(let url):
|
|
NSWorkspace.shared.open(url)
|
|
case .text(let string):
|
|
NSPasteboard.general.clearContents()
|
|
NSPasteboard.general.setString(string, forType: .string)
|
|
}
|
|
}
|
|
|
|
static func reveal(_ item: ShelfItem) {
|
|
guard case .file(let bookmark) = item.kind else { return }
|
|
handleBookmarkedFile(bookmark) { url in
|
|
NSWorkspace.shared.activateFileViewerSelecting([url])
|
|
}
|
|
}
|
|
|
|
static func copyPath(_ item: ShelfItem) {
|
|
guard case .file(let bookmark) = item.kind else { return }
|
|
handleBookmarkedFile(bookmark) { url in
|
|
NSPasteboard.general.clearContents()
|
|
NSPasteboard.general.setString(url.path, forType: .string)
|
|
}
|
|
}
|
|
|
|
static func remove(_ item: ShelfItem) {
|
|
ShelfStateViewModel.shared.remove(item)
|
|
}
|
|
|
|
private static func handleBookmarkedFile(_ bookmarkData: Data, action: @escaping @Sendable (URL) -> Void) {
|
|
Task {
|
|
let bookmark = Bookmark(data: bookmarkData)
|
|
if let url = bookmark.resolveURL() {
|
|
url.accessSecurityScopedResource { accessibleURL in
|
|
action(accessibleURL)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|