"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { startTransition, useState } from "react"; export function BindDeviceForm() { const router = useRouter(); const [rawCode, setRawCode] = useState(""); const [submitting, setSubmitting] = useState(false); const [notice, setNotice] = useState(null); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!rawCode.trim()) { setNotice("请先粘贴长辈手机上的设备码。\n"); return; } setSubmitting(true); setNotice("正在建立连接,请稍候……"); try { const response = await fetch("/api/family/bind", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ deviceUuid: rawCode }), }); const payload = (await response.json().catch(() => null)) as | { error?: string } | null; if (!response.ok) { throw new Error(payload?.error || "连接失败,请稍后再试。"); } setNotice("连接成功!现在可以查看长辈的留言和动态了。\n"); setRawCode(""); startTransition(() => { router.refresh(); }); } catch (error) { setNotice( error instanceof Error ? error.message : "连接失败,请稍后再试。", ); } finally { setSubmitting(false); } } return (

添加设备

扫码或粘贴设备码连接长辈

让长辈打开手机上的「家人连接」页面,扫描二维码最快;也可以将设备码粘贴到下方。

扫码连接
setRawCode(event.target.value)} placeholder="粘贴设备码或二维码链接" className="h-13 flex-1 rounded-full border border-[var(--line)] bg-[var(--paper-soft)] px-5 text-sm text-[var(--ink)] outline-none transition focus:border-[var(--copper)] focus:bg-white" />
{notice ? (

{notice}

) : null}
); } type SendMessageFormProps = { deviceUuid: string; }; export function SendMessageForm({ deviceUuid }: SendMessageFormProps) { const router = useRouter(); const [content, setContent] = useState(""); const [importance, setImportance] = useState("NORMAL"); const [submitting, setSubmitting] = useState(false); const [notice, setNotice] = useState(null); const [createdMessagePublicId, setCreatedMessagePublicId] = useState(null); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!content.trim()) { setNotice("请先写下您想说的话。\n"); setCreatedMessagePublicId(null); return; } setSubmitting(true); setNotice("正在送达这条留言……"); try { const response = await fetch("/api/family/messages", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ deviceUuid, content, importance, }), }); const payload = (await response.json().catch(() => null)) as | { error?: string; publicId?: number } | null; if (!response.ok) { throw new Error(payload?.error || "留言发送失败,请稍后再试。"); } setNotice("留言已发出,长辈下次使用时就能看到。\n"); setCreatedMessagePublicId( typeof payload?.publicId === "number" ? payload.publicId : null, ); setContent(""); setImportance("NORMAL"); startTransition(() => { router.refresh(); }); } catch (error) { setCreatedMessagePublicId(null); setNotice( error instanceof Error ? error.message : "留言发送失败,请稍后再试。", ); } finally { setSubmitting(false); } } return (

留言

给长辈写一句问候