import { useLocalSearchParams, useRouter } from "expo-router"; import React, { useEffect, useRef, useState } from "react"; import { Text, View } from "react-native"; import { useApp } from "../../src/app-context"; import { AuthLoadingView } from "../../src/components/AuthLoadingView"; import { ScreenShell } from "../../src/components/ScreenShell"; import { loadPendingTextIntent } from "../../src/pending-intent"; import { spacing } from "../../src/theme"; import type { Consents } from "../../src/types"; import { Button, ErrorNotice, styles } from "../../src/ui"; export default function AuthCallbackScreen() { const params = useLocalSearchParams<{ code?: string; state?: string; error?: string }>(); const app = useApp(); const router = useRouter(); const [error, setError] = useState(); const completionStarted = useRef(false); const complete = async () => { if (!params.code || !params.state || typeof window === "undefined") return; const raw = window.sessionStorage.getItem("han.pending-consents"); if (!raw) throw new Error("Не найдены локально принятые согласия. Начните вход заново."); setError(undefined); const consents = JSON.parse(raw) as Consents; await app.finishCallback(params.code, params.state, consents); window.sessionStorage.removeItem("han.pending-consents"); const intent = loadPendingTextIntent(); if (intent) { router.replace("/dialogs?pending=1"); return; } router.replace("/"); }; useEffect(() => { if (completionStarted.current) return; if (params.error) { completionStarted.current = true; setError(new Error("Авторизация отменена или отклонена.")); return; } if (!params.code || !params.state) return; completionStarted.current = true; void complete().catch(setError); }, [params.code, params.state, params.error]); return ( {!error ? ( ) : ( Не удалось завершить вход <>