diff options
| author | MohamedBassem <me@mbassem.com> | 2024-03-13 21:43:44 +0000 |
|---|---|---|
| committer | Mohamed Bassem <me@mbassem.com> | 2024-03-14 16:40:45 +0000 |
| commit | 04572a8e5081b1e4871e273cde9dbaaa44c52fe0 (patch) | |
| tree | 8e993acb732a50d1306d4d6953df96c165c57f57 /apps/mobile/app/sharing.tsx | |
| parent | 2df08ed08c065e8b91bc8df0266bd4bcbb062be4 (diff) | |
| download | karakeep-04572a8e5081b1e4871e273cde9dbaaa44c52fe0.tar.zst | |
structure: Create apps dir and copy tooling dir from t3-turbo repo
Diffstat (limited to 'apps/mobile/app/sharing.tsx')
| -rw-r--r-- | apps/mobile/app/sharing.tsx | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/apps/mobile/app/sharing.tsx b/apps/mobile/app/sharing.tsx new file mode 100644 index 00000000..64bbd933 --- /dev/null +++ b/apps/mobile/app/sharing.tsx @@ -0,0 +1,99 @@ +import { Link, useLocalSearchParams, useRouter } from "expo-router"; +import { ShareIntent, useShareIntent } from "expo-share-intent"; +import { useEffect, useMemo, useState } from "react"; +import { View, Text } from "react-native"; +import { z } from "zod"; + +import { api } from "@/lib/trpc"; + +type Mode = + | { type: "idle" } + | { type: "success"; bookmarkId: string } + | { type: "error" }; + +function SaveBookmark({ setMode }: { setMode: (mode: Mode) => void }) { + // Desperate attempt to fix sharing duplication + const { hasShareIntent, resetShareIntent } = useShareIntent(); + + const params = useLocalSearchParams(); + + const shareIntent = useMemo(() => { + if (params && params.shareIntent) { + if (typeof params.shareIntent === "string") { + return JSON.parse(params.shareIntent) as ShareIntent; + } + } + return null; + }, [params]); + + 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 <Text className="text-4xl">Hoarding ...</Text>; +} + +export default function Sharing() { + const router = useRouter(); + const [mode, setMode] = useState<Mode>({ type: "idle" }); + + let comp; + switch (mode.type) { + case "idle": { + comp = <SaveBookmark setMode={setMode} />; + break; + } + case "success": { + comp = <Text className="text-4xl">Hoarded!</Text>; + break; + } + case "error": { + comp = <Text className="text-4xl">Error!</Text>; + 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 ( + <View className="flex-1 items-center justify-center gap-4"> + {comp} + <Link href="dashboard">Dismiss</Link> + </View> + ); +} |
