aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mobile/components/bookmarks/NewBookmarkModal.tsx
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-08-26 13:13:24 +0300
committerMohamedBassem <me@mbassem.com>2024-08-26 13:13:24 +0300
commit8410a6d3c125cf27daa4e3abeb4c4a4d228e2cfd (patch)
tree76c4b52283d6c096fc17fe3f554651dca5e19988 /apps/mobile/components/bookmarks/NewBookmarkModal.tsx
parentd8cf7c17a2b0a437cf4a2f983f5ab48fba775a64 (diff)
downloadkarakeep-8410a6d3c125cf27daa4e3abeb4c4a4d228e2cfd.tar.zst
ui(mobile): Change the add/edit note editor dialogs to be bottom sheets
Diffstat (limited to 'apps/mobile/components/bookmarks/NewBookmarkModal.tsx')
-rw-r--r--apps/mobile/components/bookmarks/NewBookmarkModal.tsx129
1 files changed, 129 insertions, 0 deletions
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;