fix and update

This commit is contained in:
lendry
2026-07-01 17:00:55 +03:00
parent 607397fcf3
commit 0c3c6d6d82
8 changed files with 323 additions and 184 deletions

View File

@@ -1,9 +1,6 @@
'use client';
import { useEffect, useMemo, useState, type CSSProperties, type ReactNode } from 'react';
import { fetchPublicSettingsClient } from '@/lib/api';
import { buildOneTapUrls, type OneTapUrls } from '@/lib/one-tap-examples';
import { resolveFrontendBase, resolveOAuthApiBase } from '@/lib/oauth-url';
import { CodeBlock } from '@/components/code-block';
import { cn } from '@/lib/utils';
import {
@@ -16,6 +13,7 @@ import {
VIEW_OPTIONS,
type ButtonBuilderOptions
} from '@/lib/one-tap-builder';
import { useOneTapUrls } from '@/lib/use-one-tap-urls';
type ColorKey = 'bg' | 'bgHover' | 'border' | 'borderHover' | 'text';
@@ -40,36 +38,33 @@ const inputClass =
'h-9 w-full rounded-lg border border-zinc-300 bg-white px-3 text-sm text-zinc-900 outline-none transition focus:border-zinc-400 focus:ring-2 focus:ring-zinc-200 dark:border-zinc-700 dark:bg-zinc-900 dark:text-zinc-100 dark:focus:ring-zinc-700';
export function OneTapButtonBuilder() {
const [apiBase, setApiBase] = useState('http://localhost:3000');
const [frontendBase, setFrontendBase] = useState('http://localhost:3002');
const [projectName, setProjectName] = useState('MVK ID');
const { urls, loading, error, frontendBase, projectName } = useOneTapUrls();
const [options, setOptions] = useState<ButtonBuilderOptions>(DEFAULT_BUILDER_OPTIONS);
const [hovered, setHovered] = useState(false);
const [status, setStatus] = useState<string | null>(null);
useEffect(() => {
void fetchPublicSettingsClient()
.then((settings) => {
setApiBase(resolveOAuthApiBase(settings));
setFrontendBase(resolveFrontendBase(settings));
if (settings.PROJECT_NAME?.trim()) {
const name = settings.PROJECT_NAME.trim();
setProjectName(name);
setOptions((prev) =>
prev.providerName === DEFAULT_BUILDER_OPTIONS.providerName ? { ...prev, providerName: name } : prev
);
}
})
.catch(() => undefined);
}, []);
const urls: OneTapUrls = useMemo(
() => buildOneTapUrls(apiBase, frontendBase, projectName),
[apiBase, frontendBase, projectName]
);
const snippet = useMemo(() => buildButtonSnippet(options, urls), [options, urls]);
const snippet = useMemo(() => (urls ? buildButtonSnippet(options, urls) : ''), [options, urls]);
const style = useMemo(() => resolveButtonStyle(options), [options]);
useEffect(() => {
if (!urls?.projectName) return;
setOptions((prev) =>
prev.providerName === DEFAULT_BUILDER_OPTIONS.providerName ? { ...prev, providerName: urls.projectName } : prev
);
}, [urls?.projectName]);
if (loading) {
return <p className="text-sm text-zinc-500 dark:text-zinc-400">Загрузка актуальных URL из настроек IdP</p>;
}
if (error || !urls) {
return (
<p className="rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-900 dark:bg-amber-950/40 dark:text-amber-200">
{error ?? 'Не удалось загрузить настройки для конструктора кнопок.'}
</p>
);
}
function update<K extends keyof ButtonBuilderOptions>(key: K, value: ButtonBuilderOptions[K]) {
setOptions((prev) => ({ ...prev, [key]: value }));
}