From 39cc58480c8b33100fe389a0f05bdacf09d4c5de Mon Sep 17 00:00:00 2001 From: ammarahm-ed Date: Tue, 10 Jan 2023 16:43:34 +0500 Subject: [PATCH] mobile: improve error handle in reminder sheet --- .../app/components/sheets/reminder/index.tsx | 711 +++++++++--------- 1 file changed, 364 insertions(+), 347 deletions(-) diff --git a/apps/mobile/app/components/sheets/reminder/index.tsx b/apps/mobile/app/components/sheets/reminder/index.tsx index 84e3cf8ef..046b9c3f1 100644 --- a/apps/mobile/app/components/sheets/reminder/index.tsx +++ b/apps/mobile/app/components/sheets/reminder/index.tsx @@ -17,7 +17,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ import React, { RefObject, useRef, useState } from "react"; -import { Platform, ScrollView, View, TextInput } from "react-native"; +import { + Platform, + ScrollView, + View, + TextInput, + useWindowDimensions +} from "react-native"; import ActionSheet from "react-native-actions-sheet"; import DateTimePickerModal from "react-native-modal-datetime-picker"; import { @@ -112,6 +118,7 @@ export default function ReminderSheet({ const title = useRef(reminder?.title); const details = useRef(reminder?.description); const titleRef = useRef(null); + const { height } = useWindowDimensions(); const showDatePicker = () => { setDatePickerVisibility(true); }; @@ -148,69 +155,70 @@ export default function ReminderSheet({ } async function saveReminder() { - if (!(await Notifications.checkAndRequestPermissions())) return; - if (!date && reminderMode !== ReminderModes.Permanent) return; - if (!title.current) { - ToastEvent.show({ - heading: "Please set title of the reminder", - type: "error", - context: "local" - }); - return; - } - if (date.getTime() < Date.now() && reminderMode === "once") { - ToastEvent.show({ - heading: "Reminder date must be set in future", - type: "error", - context: "local" - }); - titleRef?.current?.focus(); - return; - } + try { + if (!(await Notifications.checkAndRequestPermissions())) + throw new Error( + "App does not have permission to schedule notifications" + ); + if (!date && reminderMode !== ReminderModes.Permanent) return; + if ( + reminderMode === ReminderModes.Repeat && + recurringMode !== "day" && + selectedDays.length === 0 + ) + throw new Error("Please select the day to repeat the reminder on"); - date.setSeconds(0, 0); + if (!title.current) throw new Error("Please set title of the reminder"); + if (date.getTime() < Date.now() && reminderMode === "once") { + titleRef?.current?.focus(); + throw new Error("Reminder date must be set in future"); + } - const reminderId = await db.reminders?.add({ - id: reminder?.id, - date: date?.getTime(), - priority: reminderNotificationMode, - title: title.current, - description: details.current, - recurringMode: recurringMode, - selectedDays: selectedDays, - mode: reminderMode, - localOnly: reminderMode === "permanent", - snoozeUntil: - date?.getTime() > Date.now() ? undefined : reminder?.snoozeUntil, - disabled: false - }); + date.setSeconds(0, 0); - const _reminder = db.reminders?.reminder(reminderId); - - if (!_reminder) { - ToastEvent.show({ - heading: "Failed to add a new reminder" + const reminderId = await db.reminders?.add({ + id: reminder?.id, + date: date?.getTime(), + priority: reminderNotificationMode, + title: title.current, + description: details.current, + recurringMode: recurringMode, + selectedDays: selectedDays, + mode: reminderMode, + localOnly: reminderMode === "permanent", + snoozeUntil: + date?.getTime() > Date.now() ? undefined : reminder?.snoozeUntil, + disabled: false }); + + const _reminder = db.reminders?.reminder(reminderId); + + if (!_reminder) { + ToastEvent.show({ + heading: "Failed to add a new reminder" + }); + } + if (reference) { + await db.relations?.add(reference, { + id: _reminder?.id as string, + type: _reminder?.type as string + }); + } + Notifications.scheduleNotification(_reminder as Reminder); + Navigation.queueRoutesForUpdate( + "TaggedNotes", + "ColoredNotes", + "Notes", + "NotesPage", + "Reminders", + "Favorites", + "TopicNotes" + ); + useRelationStore.getState().update(); + close?.(); + } catch (e) { + ToastEvent.error(e as Error); } - if (reference) { - await db.relations?.add(reference, { - id: _reminder?.id as string, - type: _reminder?.type as string - }); - } - Notifications.scheduleNotification(_reminder as Reminder); - Navigation.queueRoutesForUpdate( - "TaggedNotes", - "ColoredNotes", - "Notes", - "NotesPage", - "Reminders", - "Favorites", - "TopicNotes" - ); - useRelationStore.getState().update(); - close?.("local"); - close?.(); } return ( @@ -219,324 +227,333 @@ export default function ReminderSheet({ paddingHorizontal: 12 }} > - (title.current = text)} - containerStyle={{ borderWidth: 0, borderBottomWidth: 1 }} - /> - - (details.current = text)} - containerStyle={{ borderWidth: 0, borderBottomWidth: 1 }} - /> - - actionSheetRef.current?.handleChildScrollEnd()} style={{ - flexDirection: "row", - marginBottom: 12 + maxHeight: height * 0.85 }} > - {Object.keys(ReminderModes).map((mode) => ( -