Emdash source with visual editor image upload fix
Fixes: 1. media.ts: wrap placeholder generation in try-catch 2. toolbar.ts: check r.ok, display error message in popover
This commit is contained in:
87
packages/admin/src/lib/api/bylines.ts
Normal file
87
packages/admin/src/lib/api/bylines.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import {
|
||||
API_BASE,
|
||||
apiFetch,
|
||||
parseApiResponse,
|
||||
throwResponseError,
|
||||
type FindManyResult,
|
||||
} from "./client.js";
|
||||
|
||||
export interface BylineSummary {
|
||||
id: string;
|
||||
slug: string;
|
||||
displayName: string;
|
||||
bio: string | null;
|
||||
avatarMediaId: string | null;
|
||||
websiteUrl: string | null;
|
||||
userId: string | null;
|
||||
isGuest: boolean;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
}
|
||||
|
||||
export interface BylineInput {
|
||||
slug: string;
|
||||
displayName: string;
|
||||
bio?: string | null;
|
||||
avatarMediaId?: string | null;
|
||||
websiteUrl?: string | null;
|
||||
userId?: string | null;
|
||||
isGuest?: boolean;
|
||||
}
|
||||
|
||||
export interface BylineCreditInput {
|
||||
bylineId: string;
|
||||
roleLabel?: string | null;
|
||||
}
|
||||
|
||||
export async function fetchBylines(options?: {
|
||||
search?: string;
|
||||
isGuest?: boolean;
|
||||
userId?: string;
|
||||
cursor?: string;
|
||||
limit?: number;
|
||||
}): Promise<FindManyResult<BylineSummary>> {
|
||||
const params = new URLSearchParams();
|
||||
if (options?.search) params.set("search", options.search);
|
||||
if (options?.isGuest !== undefined) params.set("isGuest", String(options.isGuest));
|
||||
if (options?.userId) params.set("userId", options.userId);
|
||||
if (options?.cursor) params.set("cursor", options.cursor);
|
||||
if (options?.limit) params.set("limit", String(options.limit));
|
||||
|
||||
const url = `${API_BASE}/admin/bylines${params.toString() ? `?${params}` : ""}`;
|
||||
const response = await apiFetch(url);
|
||||
return parseApiResponse<FindManyResult<BylineSummary>>(response, "Failed to fetch bylines");
|
||||
}
|
||||
|
||||
export async function fetchByline(id: string): Promise<BylineSummary> {
|
||||
const response = await apiFetch(`${API_BASE}/admin/bylines/${id}`);
|
||||
return parseApiResponse<BylineSummary>(response, "Failed to fetch byline");
|
||||
}
|
||||
|
||||
export async function createByline(input: BylineInput): Promise<BylineSummary> {
|
||||
const response = await apiFetch(`${API_BASE}/admin/bylines`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(input),
|
||||
});
|
||||
return parseApiResponse<BylineSummary>(response, "Failed to create byline");
|
||||
}
|
||||
|
||||
export async function updateByline(
|
||||
id: string,
|
||||
input: Partial<BylineInput>,
|
||||
): Promise<BylineSummary> {
|
||||
const response = await apiFetch(`${API_BASE}/admin/bylines/${id}`, {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(input),
|
||||
});
|
||||
return parseApiResponse<BylineSummary>(response, "Failed to update byline");
|
||||
}
|
||||
|
||||
export async function deleteByline(id: string): Promise<void> {
|
||||
const response = await apiFetch(`${API_BASE}/admin/bylines/${id}`, {
|
||||
method: "DELETE",
|
||||
});
|
||||
if (!response.ok) await throwResponseError(response, "Failed to delete byline");
|
||||
}
|
||||
Reference in New Issue
Block a user