first commit

This commit is contained in:
lendry
2026-06-24 14:37:15 +03:00
commit 995adeedd4
188 changed files with 28810 additions and 0 deletions

59
apps/docs/lib/api.ts Normal file
View File

@@ -0,0 +1,59 @@
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';
}