-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAlbumIntents.swift
131 lines (101 loc) · 3.18 KB
/
AlbumIntents.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
See the LICENSE.txt file for this sample’s licensing information.
Abstract:
App intents that represent actions that a person performs on photo albums.
*/
import AppIntents
import Foundation
@AssistantIntent(schema: .photos.createAlbum)
struct CreateAlbumIntent: AppIntent {
var name: String
@Dependency
var library: MediaLibrary
func perform() async throws -> some ReturnsValue<AlbumEntity> {
let album = try await library.createAlbum(with: name)
return .result(value: album.entity)
}
}
@AssistantIntent(schema: .photos.openAlbum)
struct OpenAlbumIntent: OpenIntent {
var target: AlbumEntity
@Dependency
var library: MediaLibrary
@Dependency
var navigation: NavigationManager
@MainActor
func perform() async throws -> some IntentResult {
let albums = library.albums(for: [target.id])
guard let album = albums.first else {
throw IntentError.noEntity
}
navigation.openAlbum(album)
return .result()
}
}
@AssistantIntent(schema: .photos.updateAlbum)
struct UpdateAlbumIntent: AppIntent {
var target: AlbumEntity
var name: String
@Dependency
var library: MediaLibrary
func perform() async throws -> some IntentResult {
let albums = await library.albums(for: [target.id])
for album in albums {
try await album.setTitle(name)
}
return .result()
}
}
@AssistantIntent(schema: .photos.deleteAlbum)
struct DeleteAlbumIntent: DeleteIntent {
static let openAppWhenRun = true
var entities: [AlbumEntity]
@Dependency
var library: MediaLibrary
@MainActor
func perform() async throws -> some IntentResult {
let identifiers = entities.map(\.id)
let albums = library.albums(for: identifiers)
try await library.deleteAlbums(albums)
return .result()
}
}
@AssistantIntent(schema: .photos.addAssetsToAlbum)
struct AddAssetsToAlbumIntent: AppIntent {
var assets: [AssetEntity]
var album: AlbumEntity
@Dependency
var library: MediaLibrary
@MainActor
func perform() async throws -> some IntentResult {
let albums = library.albums(for: [album.id])
guard let album = albums.first else {
throw IntentError.noEntity
}
let identifiers = assets.map(\.id)
let toInsert = library.assets(for: identifiers)
let albumAssets = Set(album.assets + toInsert)
try await album.setAssets(albumAssets)
return .result()
}
}
@AssistantIntent(schema: .photos.removeAssetsFromAlbum)
struct RemoveAssetsFromAlbumIntent: AppIntent {
var assets: [AssetEntity]
var album: AlbumEntity
@Dependency
var library: MediaLibrary
@MainActor
func perform() async throws -> some IntentResult {
let albums = library.albums(for: [album.id])
guard let album = albums.first else {
throw IntentError.noEntity
}
let identifiers = assets.map(\.id)
let toRemove = library.assets(for: identifiers)
var albumAssets = Set(album.assets)
albumAssets.subtract(toRemove)
try await album.setAssets(albumAssets)
return .result()
}
}