From 8410a6d3c125cf27daa4e3abeb4c4a4d228e2cfd Mon Sep 17 00:00:00 2001
From: MohamedBassem <me@mbassem.com>
Date: Mon, 26 Aug 2024 13:13:24 +0300
Subject: ui(mobile): Change the add/edit note editor dialogs to be bottom
 sheets

---
 .../components/bookmarks/NewBookmarkModal.tsx      | 129 +++++++++++++++++++++
 1 file changed, 129 insertions(+)
 create mode 100644 apps/mobile/components/bookmarks/NewBookmarkModal.tsx

(limited to 'apps/mobile/components/bookmarks/NewBookmarkModal.tsx')

diff --git a/apps/mobile/components/bookmarks/NewBookmarkModal.tsx b/apps/mobile/components/bookmarks/NewBookmarkModal.tsx
new file mode 100644
index 00000000..8ac8bb39
--- /dev/null
+++ b/apps/mobile/components/bookmarks/NewBookmarkModal.tsx
@@ -0,0 +1,129 @@
+import React, { useEffect, useState } from "react";
+import { Text, View } from "react-native";
+import {
+  BottomSheetBackdrop,
+  BottomSheetModal,
+  BottomSheetModalProps,
+  BottomSheetTextInput,
+  BottomSheetView,
+  useBottomSheetModal,
+} from "@gorhom/bottom-sheet";
+
+import {
+  useCreateBookmark,
+  useUpdateBookmarkText,
+} from "@hoarder/shared-react/hooks/bookmarks";
+import { BookmarkTypes, ZBookmark } from "@hoarder/shared/types/bookmarks";
+
+import { Button } from "../ui/Button";
+import PageTitle from "../ui/PageTitle";
+
+const NoteEditorModal = React.forwardRef<
+  BottomSheetModal,
+  Omit<
+    BottomSheetModalProps,
+    "children" | "backdropComponent" | "onDismiss"
+  > & {
+    bookmark?: ZBookmark;
+  }
+>(({ bookmark, ...props }, ref) => {
+  const { dismiss } = useBottomSheetModal();
+  const isEditing = !!bookmark;
+
+  const [text, setText] = useState("");
+  const [error, setError] = useState<string | undefined>();
+
+  const resetText = () => {
+    if (bookmark) {
+      if (bookmark.content.type !== BookmarkTypes.TEXT) {
+        throw new Error("Wrong content type rendered");
+      }
+      setText(bookmark.content.text);
+    }
+  };
+
+  useEffect(resetText, []);
+
+  const onSuccess = () => {
+    resetText();
+    dismiss();
+  };
+
+  const { mutate: createBookmark } = useCreateBookmark({
+    onSuccess,
+    onError: (e) => {
+      let message;
+      if (e.data?.zodError) {
+        const zodError = e.data.zodError;
+        message = JSON.stringify(zodError);
+      } else {
+        message = `Something went wrong: ${e.message}`;
+      }
+      setError(message);
+    },
+  });
+
+  const { mutate: updateBookmark } = useUpdateBookmarkText({
+    onSuccess,
+    onError: (e) => {
+      let message;
+      if (e.data?.zodError) {
+        const zodError = e.data.zodError;
+        message = JSON.stringify(zodError);
+      } else {
+        message = `Something went wrong: ${e.message}`;
+      }
+      setError(message);
+    },
+  });
+
+  const mutate = (text: string) => {
+    if (isEditing) {
+      updateBookmark({
+        bookmarkId: bookmark.id,
+        text,
+      });
+    } else {
+      createBookmark({ type: BookmarkTypes.TEXT, text });
+    }
+  };
+
+  return (
+    <View>
+      <BottomSheetModal
+        ref={ref}
+        backdropComponent={(props) => (
+          <BottomSheetBackdrop
+            appearsOnIndex={0}
+            disappearsOnIndex={-1}
+            {...props}
+          />
+        )}
+        {...props}
+      >
+        <PageTitle title={isEditing ? "Edit Note" : "New Note"} />
+        <BottomSheetView className="p-4">
+          {error && (
+            <Text className="w-full text-center text-red-500">{error}</Text>
+          )}
+          <BottomSheetTextInput
+            value={text}
+            onChangeText={setText}
+            multiline
+            numberOfLines={8}
+            placeholder="What's on your mind?"
+            autoFocus
+            textAlignVertical="top"
+          />
+          <Button
+            onPress={() => mutate(text)}
+            label={isEditing ? "Save" : "Add Note"}
+          />
+        </BottomSheetView>
+      </BottomSheetModal>
+    </View>
+  );
+});
+NoteEditorModal.displayName = "NewBookmarkModal";
+
+export default NoteEditorModal;
-- 
cgit v1.2.3-70-g09d2

