import { ZBookmark } from "@hoarder/trpc/types/bookmarks"; import { ZBookmarkTags } from "@hoarder/trpc/types/tags"; import { Star, Archive, Trash } from "lucide-react-native"; import { View, Text, Image, ScrollView, Pressable } from "react-native"; import Markdown from "react-native-markdown-display"; import { api } from "@/lib/trpc"; function ActionBar({ bookmark }: { bookmark: ZBookmark }) { const apiUtils = api.useUtils(); const { mutate: deleteBookmark } = api.bookmarks.deleteBookmark.useMutation({ onSuccess: () => { apiUtils.bookmarks.getBookmarks.invalidate(); }, }); const { mutate: updateBookmark, variables } = api.bookmarks.updateBookmark.useMutation({ onSuccess: () => { apiUtils.bookmarks.getBookmarks.invalidate(); apiUtils.bookmarks.getBookmark.invalidate({ bookmarkId: bookmark.id }); }, }); return ( updateBookmark({ bookmarkId: bookmark.id, favourited: !bookmark.favourited, }) } > {(variables ? variables.favourited : bookmark.favourited) ? ( ) : ( )} updateBookmark({ bookmarkId: bookmark.id, archived: !bookmark.archived, }) } > deleteBookmark({ bookmarkId: bookmark.id, }) } > ); } function TagList({ tags }: { tags: ZBookmarkTags[] }) { return ( {tags.map((t) => ( {t.name} ))} ); } function LinkCard({ bookmark }: { bookmark: ZBookmark }) { if (bookmark.content.type !== "link") { throw new Error("Wrong content type rendered"); } const parsedUrl = new URL(bookmark.content.url); return ( {bookmark.content.title || parsedUrl.host} {parsedUrl.host} ); } function TextCard({ bookmark }: { bookmark: ZBookmark }) { if (bookmark.content.type !== "text") { throw new Error("Wrong content type rendered"); } return ( {bookmark.content.text} ); } export default function BookmarkCard({ bookmark: initialData, }: { bookmark: ZBookmark; }) { const { data: bookmark } = api.bookmarks.getBookmark.useQuery( { bookmarkId: initialData.id, }, { initialData }, ); let comp; switch (bookmark.content.type) { case "link": comp = ; break; case "text": comp = ; break; } return {comp}; }