Adds the /app/decos screen (dual-mode list/editor) mirroring the legacy Blazor deco form: deco/watermark/graphics/break-content/default-filler/dead-air sections with mode-gated controls, watermark/graphics multi-selects, break content with a playlist group->playlist cascade and per-placement uniqueness, and default-filler/dead-air typeahead pickers. Adds decos/playlists api modules, artist/multi-collection search wrappers, and regenerated types. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import { ApiError, request } from './client';
|
|
import type { components } from './generated/v1';
|
|
|
|
export type DecoGroup = components['schemas']['DecoGroupResponseModel'];
|
|
export type DecoListItem = components['schemas']['DecoListItemResponseModel'];
|
|
export type Deco = components['schemas']['DecoResponseModel'];
|
|
export type DecoBreakContent = components['schemas']['DecoBreakContentResponseModel'];
|
|
export type CreateDecoGroupRequest = components['schemas']['CreateDecoGroupRequest'];
|
|
export type CreateDecoRequest = components['schemas']['CreateDecoRequest'];
|
|
export type ReplaceDecoRequest = components['schemas']['ReplaceDecoRequest'];
|
|
export type DecoBreakContentRequest = components['schemas']['DecoBreakContentRequest'];
|
|
|
|
// Deco groups
|
|
|
|
export function getDecoGroups(): Promise<DecoGroup[]> {
|
|
return request<DecoGroup[]>('/api/decos/groups');
|
|
}
|
|
|
|
export function createDecoGroup(body: CreateDecoGroupRequest): Promise<DecoGroup> {
|
|
return request<DecoGroup>('/api/decos/groups', { body, method: 'POST' });
|
|
}
|
|
|
|
export function deleteDecoGroup(id: number): Promise<void> {
|
|
return request<void>(`/api/decos/groups/${id}`, { method: 'DELETE' });
|
|
}
|
|
|
|
// Decos
|
|
|
|
export function getDecos(): Promise<DecoListItem[]> {
|
|
return request<DecoListItem[]>('/api/decos');
|
|
}
|
|
|
|
export function getDeco(id: number): Promise<Deco> {
|
|
return request<Deco>(`/api/decos/${id}`);
|
|
}
|
|
|
|
export function createDeco(body: CreateDecoRequest): Promise<Deco> {
|
|
return request<Deco>('/api/decos', { body, method: 'POST' });
|
|
}
|
|
|
|
export function deleteDeco(id: number): Promise<void> {
|
|
return request<void>(`/api/decos/${id}`, { method: 'DELETE' });
|
|
}
|
|
|
|
export function replaceDeco(id: number, body: ReplaceDecoRequest): Promise<Deco> {
|
|
return request<Deco>(`/api/decos/${id}`, { body, method: 'PUT' });
|
|
}
|
|
|
|
export function messageFromDecoError(error: unknown, fallback = 'Unable to load decos'): string {
|
|
if (error instanceof ApiError) {
|
|
return error.detail ?? error.message;
|
|
}
|
|
|
|
if (error instanceof Error) {
|
|
return error.message;
|
|
}
|
|
|
|
return fallback;
|
|
}
|