- Create packages/types with shared TypeScript domain model interfaces (User, Video, Model, Article, Comment, Recording, etc.) - Wire both frontend and backend packages to use @sexy.pivoine.art/types via workspace:* - Update backend Pothos objectRef types to use shared interfaces instead of inline types - Update frontend $lib/types.ts to re-export from shared package - Fix all type errors introduced by more accurate nullable types (avatar/banner as string|null UUIDs, author nullable, events/device_info as object[]) - Add artist_name to comment user select in backend resolver - Widen utility function signatures (getAssetUrl, getUserInitials, calcReadingTime) to accept null/undefined Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
26 lines
740 B
TypeScript
26 lines
740 B
TypeScript
import { GraphQLClient } from "graphql-request";
|
|
import { env } from "$env/dynamic/public";
|
|
import type { CurrentUser } from "./types";
|
|
|
|
export const apiUrl = env.PUBLIC_API_URL || "http://localhost:3000/api";
|
|
|
|
export const getGraphQLClient = (fetchFn?: typeof globalThis.fetch) =>
|
|
new GraphQLClient(`${apiUrl}/graphql`, {
|
|
credentials: "include",
|
|
fetch: fetchFn || globalThis.fetch,
|
|
});
|
|
|
|
export const getAssetUrl = (
|
|
id: string | null | undefined,
|
|
transform?: "mini" | "thumbnail" | "preview" | "medium" | "banner",
|
|
) => {
|
|
if (!id) {
|
|
return null;
|
|
}
|
|
return `${apiUrl}/assets/${id}${transform ? "?transform=" + transform : ""}`;
|
|
};
|
|
|
|
export const isModel = (user: CurrentUser) => {
|
|
return user.role === "model";
|
|
};
|