feat: media page T1
This commit is contained in:
1 parent
67d456baf6
commit
008b0dfbb9
46 files changed
+5742
-204
No files matched your search
@@ -30,6 +30,17 @@ export interface MediaUsageItem {
|
||||
published: boolean
|
||||
}
|
||||
|
||||
export interface MediaMergeResult {
|
||||
articles_updated: number
|
||||
merged: number
|
||||
}
|
||||
|
||||
export interface BulkDeleteResult {
|
||||
deleted: MediaItem[]
|
||||
failed: MediaItem[]
|
||||
handled: boolean
|
||||
}
|
||||
|
||||
interface MediaListResponse {
|
||||
items: MediaItem[]
|
||||
next_cursor: string | null
|
||||
@@ -142,6 +153,40 @@ export function useMedia() {
|
||||
removeLocal(id)
|
||||
}
|
||||
|
||||
async function deleteMany(targets: MediaItem[]): Promise<BulkDeleteResult> {
|
||||
const outcomes = await Promise.all(
|
||||
targets.map(async (item) => {
|
||||
try {
|
||||
await request<void>(`/v1/media/${item.id}`, { method: 'DELETE' })
|
||||
return { item, outcome: 'deleted' as const }
|
||||
} catch (error) {
|
||||
const failure = classifyMediaError(error)
|
||||
return {
|
||||
item,
|
||||
outcome: failure === 'not-found' ? ('deleted' as const) : failure,
|
||||
}
|
||||
}
|
||||
}),
|
||||
)
|
||||
const pick = (outcome: string) =>
|
||||
outcomes.filter((entry) => entry.outcome === outcome).map((entry) => entry.item)
|
||||
const deleted = pick('deleted')
|
||||
items.value = items.value.filter((entry) => !deleted.some((gone) => gone.id === entry.id))
|
||||
return { deleted, failed: pick('failed'), handled: pick('handled').length > 0 }
|
||||
}
|
||||
|
||||
function mergeCopies(keepId: number, mergeIds: number[]) {
|
||||
return request<MediaMergeResult>('/v1/media/merge', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ keep_id: keepId, merge_ids: mergeIds }),
|
||||
})
|
||||
}
|
||||
|
||||
function removeLocalMany(ids: number[]) {
|
||||
items.value = items.value.filter((entry) => !ids.includes(entry.id))
|
||||
}
|
||||
|
||||
function copyUrl(item: MediaItem) {
|
||||
return navigator.clipboard.writeText(`${window.location.origin}${item.url}`)
|
||||
}
|
||||
@@ -159,6 +204,9 @@ export function useMedia() {
|
||||
renameItem,
|
||||
deleteItem,
|
||||
removeLocal,
|
||||
removeLocalMany,
|
||||
deleteMany,
|
||||
mergeCopies,
|
||||
copyUrl,
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user