Files
ttstd-infinite-canvas/web/src/services/api/appearance.ts

115 lines
3.3 KiB
TypeScript

import { apiClient, request } from "@/services/api/request";
import type { SkinDefinition } from "@/lib/skin-themes";
export type PublicAppearance = {
schemaVersion: number;
brandName: string;
brandSlug: string;
authHeroTitle: string;
authHeroDescription: string;
logoUrl: string;
darkLogoUrl: string;
logoFrameEnabled: boolean;
authVideoUrl: string;
authVideoPosterUrl: string;
skinId: string;
activeSkin: SkinDefinition;
seoTitle: string;
seoDescription: string;
seoKeywords: string;
footerCopyright: string;
icpFilingEnabled: boolean;
icpFilingNumber: string;
logoConfigured: boolean;
darkLogoConfigured: boolean;
authVideoConfigured: boolean;
authVideoPosterConfigured: boolean;
configured: boolean;
revision: string;
updatedAt?: string;
};
export type AdminAppearance = {
schemaVersion: number;
brandName: string;
brandSlug: string;
authHeroTitle: string;
authHeroDescription: string;
logoResourceId: string;
darkLogoResourceId: string;
logoFrameEnabled: boolean;
authVideoResourceId: string;
authVideoPosterResourceId: string;
skinId: string;
skinThemes: SkinDefinition[];
seoTitle: string;
seoDescription: string;
seoKeywords: string;
footerCopyright: string;
icpFilingEnabled: boolean;
icpFilingNumber: string;
public: PublicAppearance;
configured: boolean;
updatedBy?: string;
createdAt?: string;
updatedAt?: string;
};
export type AppearanceAssetSlot = "logo" | "logo-dark" | "video" | "poster";
export type AppearanceResource = {
id: string;
kind: string;
status: string;
mimeType: string;
size: number;
};
export async function getPublicAppearance(signal?: AbortSignal) {
const result = await request<{ appearance: PublicAppearance }>(apiClient.get("/public/appearance", { signal }));
return result.appearance;
}
export async function getAdminAppearance(signal?: AbortSignal) {
const result = await request<{ setting: AdminAppearance }>(apiClient.get("/admin/settings/appearance", { signal }));
return result.setting;
}
export async function updateAdminAppearance(
input: Pick<
AdminAppearance,
| "brandName"
| "brandSlug"
| "authHeroTitle"
| "authHeroDescription"
| "logoResourceId"
| "darkLogoResourceId"
| "logoFrameEnabled"
| "authVideoResourceId"
| "authVideoPosterResourceId"
| "skinId"
| "skinThemes"
| "seoTitle"
| "seoDescription"
| "seoKeywords"
| "footerCopyright"
| "icpFilingEnabled"
| "icpFilingNumber"
>,
) {
const result = await request<{ setting: AdminAppearance }>(apiClient.patch("/admin/settings/appearance", input));
return result.setting;
}
export async function resetAdminAppearance() {
const result = await request<{ setting: AdminAppearance }>(apiClient.delete("/admin/settings/appearance"));
return result.setting;
}
export async function uploadAppearanceAsset(slot: AppearanceAssetSlot, file: File) {
const body = new FormData();
body.append("file", file);
const result = await request<{ resource: AppearanceResource }>(apiClient.post(`/admin/settings/appearance/assets/${slot}`, body));
return result.resource;
}