import { useQuery } from "@tanstack/react-query"; import * as Crypto from "expo-crypto"; import { useRouter } from "expo-router"; import React, { useEffect, useState } from "react"; import { Text, View } from "react-native"; import { useApp } from "../../src/app-context"; import { AppHeader } from "../../src/components/AppHeader"; import { ChatScreenHeader } from "../../src/components/ChatScreenHeader"; import { GuestAuthGate } from "../../src/components/GuestAuthGate"; import { ScreenShell } from "../../src/components/ScreenShell"; import { bindPendingFileIntent, bindPendingTextIntent, loadPendingTextIntent, pendingDialogKey, } from "../../src/pending-intent"; import { dialogApi } from "../../src/services"; import { ErrorNotice, Loading, styles } from "../../src/ui"; import { spacing } from "../../src/theme"; export default function DialogsScreen() { const app = useApp(); const router = useRouter(); const [requestKey, setRequestKey] = useState(); const [bindError, setBindError] = useState(); const [bindAttempt, setBindAttempt] = useState(0); useEffect(() => { if (app.authStatus === "authenticated" && !requestKey) { setRequestKey(pendingDialogKey() ?? Crypto.randomUUID()); } }, [app.authStatus, requestKey]); const chat = useQuery({ queryKey: ["current-dialog", requestKey], queryFn: () => dialogApi.create(requestKey!), enabled: app.authStatus === "authenticated" && Boolean(requestKey), }); useEffect(() => { if (chat.data) { const bindAndOpen = async () => { const intent = loadPendingTextIntent(); if (intent && !intent.dialogId) { await bindPendingTextIntent(intent, chat.data.dialog_id); } await bindPendingFileIntent(chat.data.dialog_id); router.replace(`/dialogs/${chat.data.dialog_id}`); }; void bindAndOpen().catch(setBindError); } }, [bindAttempt, chat.data, router]); if (app.authStatus !== "authenticated") { return ( ); } return ( Открываем чат… {chat.isLoading && } {Boolean(chat.error || bindError) && ( { setBindError(undefined); if (chat.error) void chat.refetch(); else setBindAttempt((attempt) => attempt + 1); }} /> )} ); }