aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/components/bookmarks/ListPickerModal.tsx
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-07-28 20:03:15 -0700
committerMohamedBassem <me@mbassem.com>2024-07-28 20:56:27 -0700
commit93afb75619a02aa741b464634911b994620092be (patch)
tree414eb0b184027c67b01112caa56c039f2d82aebf /apps/mobile/components/bookmarks/ListPickerModal.tsx
parent92c92c161b3195bdfb571284e783f39f369a25a5 (diff)
downloadkarakeep-93afb75619a02aa741b464634911b994620092be.tar.zst
feat(mobile): Add ability to manage lists
Diffstat (limited to 'apps/mobile/components/bookmarks/ListPickerModal.tsx')
-rw-r--r--apps/mobile/components/bookmarks/ListPickerModal.tsx117
1 files changed, 117 insertions, 0 deletions
diff --git a/apps/mobile/components/bookmarks/ListPickerModal.tsx b/apps/mobile/components/bookmarks/ListPickerModal.tsx
new file mode 100644
index 00000000..6079e53d
--- /dev/null
+++ b/apps/mobile/components/bookmarks/ListPickerModal.tsx
@@ -0,0 +1,117 @@
+import React from "react";
+import { Pressable, Text, View } from "react-native";
+import Checkbox from "expo-checkbox";
+import {
+ BottomSheetFlatList,
+ BottomSheetModal,
+ BottomSheetModalProps,
+} from "@gorhom/bottom-sheet";
+
+import {
+ useAddBookmarkToList,
+ useBookmarkLists,
+ useRemoveBookmarkFromList,
+} from "@hoarder/shared-react/hooks/lists";
+import { api } from "@hoarder/shared-react/trpc";
+
+import PageTitle from "../ui/PageTitle";
+import { useToast } from "../ui/Toast";
+
+const ListPickerModal = React.forwardRef<
+ BottomSheetModal,
+ Omit<BottomSheetModalProps, "children"> & {
+ bookmarkId: string;
+ }
+>(({ bookmarkId, ...props }, ref) => {
+ const { toast } = useToast();
+ const onError = () => {
+ toast({
+ message: "Something went wrong",
+ variant: "destructive",
+ showProgress: false,
+ });
+ };
+ const { data: existingLists } = api.lists.getListsOfBookmark.useQuery(
+ {
+ bookmarkId,
+ },
+ {
+ select: (data) => new Set(data.lists.map((l) => l.id)),
+ },
+ );
+ const { data } = useBookmarkLists();
+
+ const { mutate: addToList } = useAddBookmarkToList({
+ onSuccess: () => {
+ toast({
+ message: `The bookmark has been added to the list!`,
+ showProgress: false,
+ });
+ },
+ onError,
+ });
+
+ const { mutate: removeToList } = useRemoveBookmarkFromList({
+ onSuccess: () => {
+ toast({
+ message: `The bookmark has been removed from the list!`,
+ showProgress: false,
+ });
+ },
+ onError,
+ });
+
+ const toggleList = (listId: string) => {
+ if (!existingLists) {
+ return;
+ }
+ if (existingLists.has(listId)) {
+ removeToList({ bookmarkId, listId });
+ } else {
+ addToList({ bookmarkId, listId });
+ }
+ };
+
+ const { allPaths } = data ?? {};
+ return (
+ <View>
+ <BottomSheetModal ref={ref} {...props}>
+ <BottomSheetFlatList
+ ListHeaderComponent={<PageTitle title="Manage Lists" />}
+ className="h-full"
+ contentContainerStyle={{
+ gap: 5,
+ }}
+ renderItem={(l) => (
+ <View className="mx-2 flex flex-row items-center rounded-xl border border-input bg-white px-4 py-2 dark:bg-accent">
+ <Pressable
+ key={l.item[l.item.length - 1].id}
+ onPress={() => toggleList(l.item[l.item.length - 1].id)}
+ className="flex w-full flex-row justify-between"
+ >
+ <Text className="text-lg text-accent-foreground">
+ {l.item
+ .map((item) => `${item.icon} ${item.name}`)
+ .join(" / ")}
+ </Text>
+ <Checkbox
+ value={
+ existingLists &&
+ existingLists.has(l.item[l.item.length - 1].id)
+ }
+ onValueChange={() => {
+ toggleList(l.item[l.item.length - 1].id);
+ }}
+ />
+ </Pressable>
+ </View>
+ )}
+ data={allPaths}
+ />
+ </BottomSheetModal>
+ </View>
+ );
+});
+ListPickerModal.displayName = "ListPickerModal";
+
+export default ListPickerModal;