fix and update
This commit is contained in:
@@ -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 }));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user