import { useEffect, useState } from "react"; import { Text, View } from "react-native"; import { Link, useRouter } from "expo-router"; import { useShareIntentContext } from "expo-share-intent"; import { api } from "@/lib/trpc"; import { z } from "zod"; type Mode = | { type: "idle" } | { type: "success"; bookmarkId: string } | { type: "error" }; function SaveBookmark({ setMode }: { setMode: (mode: Mode) => void }) { const { hasShareIntent, shareIntent, resetShareIntent } = useShareIntentContext(); const invalidateAllBookmarks = api.useUtils().bookmarks.getBookmarks.invalidate; useEffect(() => { if (!isPending && shareIntent?.text) { const val = z.string().url(); if (val.safeParse(shareIntent.text).success) { // This is a URL, else treated as text mutate({ type: "link", url: shareIntent.text }); } else { mutate({ type: "text", text: shareIntent.text }); } } if (hasShareIntent) { resetShareIntent(); } }, []); const { mutate, isPending } = api.bookmarks.createBookmark.useMutation({ onSuccess: (d) => { invalidateAllBookmarks(); setMode({ type: "success", bookmarkId: d.id }); }, onError: () => { setMode({ type: "error" }); }, }); return Hoarding ...; } export default function Sharing() { const router = useRouter(); const [mode, setMode] = useState({ type: "idle" }); let comp; switch (mode.type) { case "idle": { comp = ; break; } case "success": { comp = Hoarded!; break; } case "error": { comp = Error!; break; } } // Auto dismiss the modal after saving. useEffect(() => { if (mode.type === "idle") { return; } const timeoutId = setTimeout(() => { router.replace("dashboard"); }, 2000); return () => clearTimeout(timeoutId); }, [mode.type]); return ( {comp} Dismiss ); }