Files
IdP/apps/docs/lib/api.ts
2026-06-24 14:37:15 +03:00

60 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const clientApiUrl = (process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:3000').replace(/\/$/, '');
function getServerApiUrl() {
return (process.env.INTERNAL_API_URL ?? process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:3000').replace(/\/$/, '');
}
export interface PublicSetting {
key: string;
value: string;
}
async function fetchWithTimeout(url: string, init: RequestInit & { timeoutMs?: number } = {}) {
const { timeoutMs = 3000, ...rest } = init;
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeoutMs);
try {
return await fetch(url, { ...rest, signal: controller.signal });
} finally {
clearTimeout(timer);
}
}
function mapSettings(payload: { settings?: PublicSetting[] }) {
return Object.fromEntries((payload.settings ?? []).map((item) => [item.key, item.value]));
}
export async function fetchPublicSettings(): Promise<Record<string, string>> {
try {
const response = await fetchWithTimeout(`${getServerApiUrl()}/settings/public`, {
cache: 'no-store'
});
if (!response.ok) {
return {};
}
return mapSettings((await response.json()) as { settings?: PublicSetting[] });
} catch {
return {};
}
}
export async function fetchPublicSettingsClient(): Promise<Record<string, string>> {
const response = await fetchWithTimeout('/api/public-settings', { cache: 'no-store' });
if (!response.ok) {
throw new Error('Не удалось загрузить публичные настройки');
}
return mapSettings((await response.json()) as { settings?: PublicSetting[] });
}
export function getApiBaseUrl() {
return clientApiUrl;
}
export function getDefaultProjectName() {
return 'Lendry ID';
}
export function getDefaultProjectTagline() {
return 'Единый аккаунт для сервисов Lendry';
}