change public app name for oauth

This commit is contained in:
lendry
2026-06-26 11:00:48 +03:00
parent b81c0cedbb
commit 489b4d4a23
8 changed files with 130 additions and 8 deletions

View File

@@ -6,11 +6,13 @@ import { useRouter, useSearchParams } from 'next/navigation';
import { CheckCircle2, Loader2, ShieldCheck } from 'lucide-react';
import { BrandLogo } from '@/components/id/brand-logo';
import { useAuth } from '@/components/id/auth-provider';
import { usePublicSettings } from '@/components/id/public-settings-provider';
import { Button } from '@/components/ui/button';
import {
approveOAuthAuthorization,
checkOAuthConsent,
fetchAuthSession,
fetchOAuthClientPublicInfo,
type OAuthConsentCheckResponse
} from '@/lib/api';
@@ -26,11 +28,13 @@ function OAuthAuthorizeContent() {
const searchParams = useSearchParams();
const router = useRouter();
const { user, token, isPinLocked, isLoading } = useAuth();
const { projectName } = usePublicSettings();
const [submitting, setSubmitting] = useState(false);
const [checkingConsent, setCheckingConsent] = useState(false);
const [error, setError] = useState<string | null>(null);
const [sessionChecked, setSessionChecked] = useState(false);
const [consentInfo, setConsentInfo] = useState<OAuthConsentCheckResponse | null>(null);
const [clientName, setClientName] = useState<string | null>(null);
const autoApproveStartedRef = useRef(false);
const oauthQuery = useMemo(() => buildOAuthQuery(searchParams), [searchParams]);
@@ -42,7 +46,22 @@ function OAuthAuthorizeContent() {
const returnUrl = useMemo(() => `/auth/oauth/authorize?${oauthQuery.toString()}`, [oauthQuery]);
const clientLabel = consentInfo?.client?.name ?? clientId ?? 'Приложение';
const clientLabel = clientName ?? consentInfo?.client?.name ?? 'Приложение';
useEffect(() => {
if (!clientId) return;
let cancelled = false;
void fetchOAuthClientPublicInfo(clientId)
.then((info) => {
if (!cancelled && info.name.trim()) {
setClientName(info.name.trim());
}
})
.catch(() => undefined);
return () => {
cancelled = true;
};
}, [clientId]);
useEffect(() => {
if (!searchParams.has('userId')) return;
@@ -107,6 +126,9 @@ function OAuthAuthorizeContent() {
.then((result) => {
if (cancelled) return;
setConsentInfo(result);
if (result.client?.name?.trim()) {
setClientName(result.client.name.trim());
}
if (result.granted && !autoApproveStartedRef.current) {
autoApproveStartedRef.current = true;
void approve();
@@ -193,7 +215,7 @@ function OAuthAuthorizeContent() {
</div>
<h1 className="text-2xl font-semibold">Разрешить доступ?</h1>
<p className="mt-2 text-sm leading-relaxed text-[#667085]">
Приложение <span className="font-medium text-[#1f2430]">{clientLabel}</span> запрашивает доступ к данным вашего аккаунта Lendry ID.
Приложение <span className="font-medium text-[#1f2430]">{clientLabel}</span> запрашивает доступ к данным вашего аккаунта {projectName}.
</p>
<div className="mt-4 space-y-3 rounded-2xl bg-[#f4f5f8] p-4 text-sm">
<p>

View File

@@ -5,6 +5,7 @@ import { useRouter } from 'next/navigation';
import { Ban, CheckCircle2, ChevronRight, FileKey2, Loader2 } from 'lucide-react';
import { useAuth } from '@/components/id/auth-provider';
import { IdShell } from '@/components/id/shell';
import { usePublicSettings } from '@/components/id/public-settings-provider';
import { useToast } from '@/components/id/toast-provider';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
@@ -29,6 +30,7 @@ function formatGrantedAt(value: string) {
export default function DataConsentsPage() {
const router = useRouter();
const { user, token } = useAuth();
const { projectName } = usePublicSettings();
const { isReady, isPinLocked } = useRequireAuth();
const { showToast } = useToast();
const [consents, setConsents] = useState<OAuthUserConsent[]>([]);
@@ -126,7 +128,7 @@ export default function DataConsentsPage() {
Выданы {formatGrantedAt(selectedConsent.grantedAt)}
</p>
<div className="mt-4 rounded-2xl bg-[#f4f5f8] p-4">
<p className="text-sm font-medium">API Lendry ID</p>
<p className="text-sm font-medium">API {projectName}</p>
<ul className="mt-3 space-y-2">
{selectedConsent.scopes.map((scope) => (
<li key={scope.slug} className="flex items-start gap-2 text-sm">