Something went wrong. Try again.
Website hub for the atmosphere community, aggregating posts, events, regional, and more
Something went wrong. Try again.
1.9 kB · 91 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192export function pickFirst<TItem, TValue>({ items, select,}: { items: Array<TItem | null | undefined>; select: (item: TItem | null | undefined) => TValue | null | undefined;}): TValue | null { for (const item of items) { const value = select(item); if (value) { return value; } }
return null;}
export function pickFirstActionResult<TResult extends { data?: unknown; error?: unknown;}>({ items, hasMeaningfulData,}: { items: Array<TResult | null | undefined>; hasMeaningfulData: ( data: TResult["data"] | null | undefined, ) => boolean;}): TResult | null { return pickFirst({ items, select: (item) => hasMeaningfulData(item?.data) || item?.error ? item : null, });}
export type ActionResultLike<TData extends object> = { data?: TData | null; error?: { code?: string; message?: string; } | null;} | null | undefined;
interface NoticeMessage { tone: "success" | "info" | "neutral" | "error"; message: string;}
export function getActionErrorNotice< TCode extends string, TNotice extends NoticeMessage,>( notices: Record<TCode, TNotice>, code?: string, message?: string,): TNotice | { tone: "error"; message: string } | null { if (!code) { return message ? { tone: "error", message } : null; }
const fallback = notices[code as TCode]; if (!fallback) { return message ? { tone: "error", message } : null; }
return { ...fallback, message: message || fallback.message, };}
export function isPermissionError(error: unknown): boolean { if (typeof error !== "object" || error === null) { return false; }
const maybeError = error as { status?: number; error?: string; message?: string; }; const text = `${maybeError.error ?? ""} ${maybeError.message ?? ""}`.toLowerCase();
return ( maybeError.status === 401 || maybeError.status === 403 || text.includes("scope") );}