import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery } from "@tanstack/react-query"; import { useRouter } from "expo-router"; import React, { useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { Linking, ScrollView, Switch, Text, View } from "react-native"; import { z } from "zod"; import { useApp } from "../src/app-context"; import { dialogApi, publicApi } from "../src/services"; import type { Consents } from "../src/types"; import { Button, ErrorNotice, Field, Header, Loading, styles } from "../src/ui"; const schema = z.object({ text: z.string().trim().min(1, "Введите сообщение").max(4000, "Сообщение слишком длинное") }); type Form = z.infer; export default function HomeScreen() { const { authStatus, realtimeState, authorize, signOut } = useApp(); const config = useQuery({ queryKey: ["public-config"], queryFn: publicApi.config }); const content = useQuery({ queryKey: ["public-content"], queryFn: publicApi.content }); const [consentOpen, setConsentOpen] = useState(false); const [required, setRequired] = useState({ personal: false, agreement: false, marketing: false }); const [pending, setPending] = useState(null); const [sendError, setSendError] = useState(); const [sending, setSending] = useState(false); const router = useRouter(); const { control, handleSubmit, setValue, reset, formState: { errors } } = useForm
({ defaultValues: { text: "" }, resolver: zodResolver(schema), }); const sendAuthenticated = async (text: string) => { setSending(true); setSendError(undefined); try { const dialog = await dialogApi.create(crypto.randomUUID()); await dialogApi.sendText(dialog.dialog_id, text, crypto.randomUUID()); reset(); router.push(`/dialogs/${dialog.dialog_id}`); } catch (error) { setSendError(error); } finally { setSending(false); } }; const send = async (text: string) => { if (authStatus !== "authenticated") { setPending(text); setConsentOpen(true); return; } await sendAuthenticated(text); }; const accept = async () => { if (!required.personal || !required.agreement) return; const versions = config.data?.consents; const consents: Consents = { personal_data: { accepted: true, version: versions?.personal_data?.version ?? "current" }, user_agreement: { accepted: true, version: versions?.user_agreement?.version ?? "current" }, marketing: { accepted: required.marketing, version: versions?.marketing?.version ?? "current" }, }; setConsentOpen(false); try { const authorized = await authorize(consents); if (authorized && pending) await sendAuthenticated(pending); } catch (error) { setSendError(error); } }; const questions = content.data?.popular_questions ?? []; return
void signOut() : undefined} /> Помощь мигрантам {content.data?.texts.welcome ?? "Задайте вопрос — оператор ответит в чате."} {(config.isLoading || content.isLoading) && } {(config.error || content.error) && { void config.refetch(); void content.refetch(); }} />} Популярные вопросы {questions.map((question, index) => { const text = question.text; return