diff --git a/.agents/skills/flotilla-views/SKILL.md b/.agents/skills/flotilla-views/SKILL.md index 03ce225c..d0b7486c 100644 --- a/.agents/skills/flotilla-views/SKILL.md +++ b/.agents/skills/flotilla-views/SKILL.md @@ -393,7 +393,9 @@ ahead. All ten `*Item` components that appear in a list use it. ## Mutations from a component flotilla-state covers the writer → command → thunk path. The component around it owns a -`loading` flag, awaits the first error, toasts it, and closes: +`loading` flag, awaits the first error, toasts it, and closes. Anything thrown on the way (a signer +refusing, a relay unreachable) is logged and toasted in a `catch`, so a bare `try`/`finally` never +lets it escape the handler: ```typescript const submit = async () => { @@ -408,6 +410,9 @@ const submit = async () => { } history.back() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your changes."}) } finally { loading = false } diff --git a/src/app/components/ArticleForm.svelte b/src/app/components/ArticleForm.svelte index b986bdba..10336be4 100644 --- a/src/app/components/ArticleForm.svelte +++ b/src/app/components/ArticleForm.svelte @@ -139,6 +139,9 @@ draftKey.clear() goto(makeArticlePath(url, getAddress(thunk.options.event))) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to publish your article."}) } finally { loading = false } diff --git a/src/app/components/CalendarEventForm.svelte b/src/app/components/CalendarEventForm.svelte index 3b8d1cb1..bf3be6ed 100644 --- a/src/app/components/CalendarEventForm.svelte +++ b/src/app/components/CalendarEventForm.svelte @@ -115,6 +115,9 @@ draftKey?.clear() history.back() pushToast({message: "Your event has been saved!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your event."}) } finally { loading = false } diff --git a/src/app/components/CalendarRsvp.svelte b/src/app/components/CalendarRsvp.svelte index f4a4ce4d..f46a9063 100644 --- a/src/app/components/CalendarRsvp.svelte +++ b/src/app/components/CalendarRsvp.svelte @@ -13,6 +13,7 @@ import {reader, user} from "@app/core" import {getRsvpsByStatus, isAttending, publishRsvp, retractRsvp} from "@app/calendar" import {setEventReminders} from "@app/reminders" + import {pushToast} from "@app/toast" type Props = { url: string @@ -40,6 +41,9 @@ } await setEventReminders(url, event, !retracting && isAttending(status)) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update your RSVP."}) } finally { loading = false } diff --git a/src/app/components/ChatEnable.svelte b/src/app/components/ChatEnable.svelte index 3c54a025..c3a9ba67 100644 --- a/src/app/components/ChatEnable.svelte +++ b/src/app/components/ChatEnable.svelte @@ -53,6 +53,9 @@ } await next() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to enable messaging."}) } finally { loading = false } diff --git a/src/app/components/ClassifiedForm.svelte b/src/app/components/ClassifiedForm.svelte index 70eb46d2..1760c293 100644 --- a/src/app/components/ClassifiedForm.svelte +++ b/src/app/components/ClassifiedForm.svelte @@ -117,6 +117,9 @@ draftKey?.clear() history.back() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to publish your listing."}) } finally { loading = false } diff --git a/src/app/components/CommentCompose.svelte b/src/app/components/CommentCompose.svelte index e30978f9..bde6da75 100644 --- a/src/app/components/CommentCompose.svelte +++ b/src/app/components/CommentCompose.svelte @@ -76,6 +76,9 @@ draftKey.clear() onSubmit() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to send your reply."}) } finally { loading = false } diff --git a/src/app/components/EventReply.svelte b/src/app/components/EventReply.svelte index a851ec84..9443b747 100644 --- a/src/app/components/EventReply.svelte +++ b/src/app/components/EventReply.svelte @@ -52,14 +52,20 @@ } const tags = ed.storage.nostr.getEditorTags() - const thunk = await publishComment({ - url, - event, - ...(await prependParent(parent, {content, tags}, url)), - }) - draftKey.clear() - onSubmit(thunk) + try { + const thunk = await publishComment({ + url, + event, + ...(await prependParent(parent, {content, tags}, url)), + }) + + draftKey.clear() + onSubmit(thunk) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to send your reply."}) + } } let form: HTMLElement diff --git a/src/app/components/GoalCreate.svelte b/src/app/components/GoalCreate.svelte index 3812a4a9..01e5425c 100644 --- a/src/app/components/GoalCreate.svelte +++ b/src/app/components/GoalCreate.svelte @@ -123,6 +123,9 @@ draftKey.clear() history.back() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to create your funding goal."}) } finally { loading = false } diff --git a/src/app/components/HealthCheckReview.svelte b/src/app/components/HealthCheckReview.svelte index 89dac60c..4658a5b1 100644 --- a/src/app/components/HealthCheckReview.svelte +++ b/src/app/components/HealthCheckReview.svelte @@ -44,12 +44,15 @@ try { await Promise.all(plans.map(save)) + + clearModals() + next?.() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Your relays couldn't be saved."}) } finally { loading = false } - - clearModals() - next?.() } diff --git a/src/app/components/InputProfilePicture.svelte b/src/app/components/InputProfilePicture.svelte index cfdcfaa9..214a1d49 100644 --- a/src/app/components/InputProfilePicture.svelte +++ b/src/app/components/InputProfilePicture.svelte @@ -7,6 +7,7 @@ import Icon from "@lib/components/Icon.svelte" import Spinner from "@lib/components/Spinner.svelte" import {compressFileForUpload, uploadFileOrFallback} from "@app/uploads" + import {pushToast} from "@app/toast" interface Props { file?: File | undefined @@ -53,6 +54,9 @@ try { file = await compressFileForUpload(newFile, compressOptions) url = (await uploadFileOrFallback(file)).url + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to process your profile picture."}) } finally { loading = false } diff --git a/src/app/components/InviteLink.svelte b/src/app/components/InviteLink.svelte index 9dee6915..8651881a 100644 --- a/src/app/components/InviteLink.svelte +++ b/src/app/components/InviteLink.svelte @@ -66,6 +66,9 @@ roomCode = roomInvite.code roomInviteError = roomInvite.error + } catch (e) { + console.error(e) + claimFailed = true } finally { loading = false } diff --git a/src/app/components/KeyRecoveryConfirm.svelte b/src/app/components/KeyRecoveryConfirm.svelte index 7d23d696..3e0eb6c0 100644 --- a/src/app/components/KeyRecoveryConfirm.svelte +++ b/src/app/components/KeyRecoveryConfirm.svelte @@ -62,6 +62,9 @@ try { await confirmRecovery() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to recover your key."}) } finally { loading = false } diff --git a/src/app/components/KeyRecoveryRequest.svelte b/src/app/components/KeyRecoveryRequest.svelte index a829290f..981f87e5 100644 --- a/src/app/components/KeyRecoveryRequest.svelte +++ b/src/app/components/KeyRecoveryRequest.svelte @@ -16,6 +16,7 @@ import {session} from "@app/core" import {requirePomadeSession} from "@app/pomade" import KeyRecoveryConfirm from "@app/components/KeyRecoveryConfirm.svelte" + import {pushToast} from "@app/toast" const { email, @@ -33,6 +34,9 @@ try { await requestRecovery() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to request key recovery."}) } finally { loading = false } diff --git a/src/app/components/LogIn.svelte b/src/app/components/LogIn.svelte index 2d203576..33ba2b4c 100644 --- a/src/app/components/LogIn.svelte +++ b/src/app/components/LogIn.svelte @@ -57,6 +57,9 @@ message: "Something went wrong! Please try again.", }) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Something went wrong! Please try again."}) } finally { loading = undefined } @@ -77,6 +80,9 @@ message: "Something went wrong! Please try again.", }) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Something went wrong! Please try again."}) } finally { loading = undefined } diff --git a/src/app/components/PasswordReset.svelte b/src/app/components/PasswordReset.svelte index 1224febc..944ace81 100644 --- a/src/app/components/PasswordReset.svelte +++ b/src/app/components/PasswordReset.svelte @@ -68,6 +68,9 @@ try { await confirmRecovery() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to validate email ownership."}) } finally { loading = false } diff --git a/src/app/components/PinSave.svelte b/src/app/components/PinSave.svelte index bfed52f6..135cfc4c 100644 --- a/src/app/components/PinSave.svelte +++ b/src/app/components/PinSave.svelte @@ -79,6 +79,9 @@ pushToast({message: pin ? "Link updated!" : "Link added!"}) clearModals() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save the link."}) } finally { loading = false } diff --git a/src/app/components/PollCreate.svelte b/src/app/components/PollCreate.svelte index 1d286243..aefd02d5 100644 --- a/src/app/components/PollCreate.svelte +++ b/src/app/components/PollCreate.svelte @@ -139,6 +139,9 @@ draftKey.clear() history.back() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to create your poll."}) } finally { loading = false } diff --git a/src/app/components/ProfileEdit.svelte b/src/app/components/ProfileEdit.svelte index bfceff9d..f0267bd9 100644 --- a/src/app/components/ProfileEdit.svelte +++ b/src/app/components/ProfileEdit.svelte @@ -30,6 +30,9 @@ pushToast({message: "Your profile has been updated!"}) clearModals() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update your profile."}) } finally { loading = false } diff --git a/src/app/components/ProfilePage.svelte b/src/app/components/ProfilePage.svelte index 786440f5..48ce018a 100644 --- a/src/app/components/ProfilePage.svelte +++ b/src/app/components/ProfilePage.svelte @@ -90,7 +90,12 @@ await command.publish().waitForCompletion() pushToast({message: "Banner updated."}) + } else { + pushToast({theme: "error", message: "Failed to upload your banner."}) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update your banner."}) } finally { bannerLoading = false } diff --git a/src/app/components/RelayAdd.svelte b/src/app/components/RelayAdd.svelte index e43a3c0c..4e8330fa 100644 --- a/src/app/components/RelayAdd.svelte +++ b/src/app/components/RelayAdd.svelte @@ -45,6 +45,9 @@ message: `Failed to add relay: ${errorMessage(error)}`, }) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to add relay."}) } finally { loading.delete(url) } diff --git a/src/app/components/RelayList.svelte b/src/app/components/RelayList.svelte index b4412b68..970f49e9 100644 --- a/src/app/components/RelayList.svelte +++ b/src/app/components/RelayList.svelte @@ -47,6 +47,9 @@ message: `Failed to remove relay: ${errorMessage(error)}`, }) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to remove relay."}) } finally { loading.delete(url) } diff --git a/src/app/components/Report.svelte b/src/app/components/Report.svelte index 530271c0..ffd4d55d 100644 --- a/src/app/components/Report.svelte +++ b/src/app/components/Report.svelte @@ -30,24 +30,29 @@ loading = true - const eventWriter = writer(Report) - .setPubkey(event.pubkey) - .setEventId(event.id) - .setReason(reason.toLowerCase()) - .setContent(content) + try { + const eventWriter = writer(Report) + .setPubkey(event.pubkey) + .setEventId(event.id) + .setReason(reason.toLowerCase()) + .setContent(content) - const reportCommand = await command(eventWriter) - const error = await reportCommand.publishToRelays([url]).waitForError() + const reportCommand = await command(eventWriter) + const error = await reportCommand.publishToRelays([url]).waitForError() - loading = false + if (error) { + return pushToast({theme: "error", message: error}) + } - if (error) { - return pushToast({theme: "error", message: error}) + history.back() + + pushToast({message: "Your report has been sent!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to send your report."}) + } finally { + loading = false } - - history.back() - - return pushToast({message: "Your report has been sent!"}) } let reason = $state("") diff --git a/src/app/components/RoleAddMembers.svelte b/src/app/components/RoleAddMembers.svelte index dd0e8579..17fd9b79 100644 --- a/src/app/components/RoleAddMembers.svelte +++ b/src/app/components/RoleAddMembers.svelte @@ -46,6 +46,9 @@ pushToast({message: "Members assigned!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to assign members."}) } finally { loading = false } diff --git a/src/app/components/RoleCreate.svelte b/src/app/components/RoleCreate.svelte index 904c47d7..488eb83f 100644 --- a/src/app/components/RoleCreate.svelte +++ b/src/app/components/RoleCreate.svelte @@ -34,6 +34,9 @@ pushToast({message: "Role created!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to create role."}) } finally { loading = false } diff --git a/src/app/components/RoleEdit.svelte b/src/app/components/RoleEdit.svelte index b46d3d15..189ab9a7 100644 --- a/src/app/components/RoleEdit.svelte +++ b/src/app/components/RoleEdit.svelte @@ -45,6 +45,9 @@ pushToast({message: "Role updated!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update role."}) } finally { loading = false } diff --git a/src/app/components/RoomDetailMenu.svelte b/src/app/components/RoomDetailMenu.svelte index d01617b2..48a7cf47 100644 --- a/src/app/components/RoomDetailMenu.svelte +++ b/src/app/components/RoomDetailMenu.svelte @@ -37,6 +37,9 @@ const message = await action() pushToast(message ? {theme: "error", message} : {message: successMessage}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update your room membership."}) } finally { loading = false } diff --git a/src/app/components/RoomForm.svelte b/src/app/components/RoomForm.svelte index 9babeca3..443fe42c 100644 --- a/src/app/components/RoomForm.svelte +++ b/src/app/components/RoomForm.svelte @@ -75,6 +75,9 @@ try { await submit() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save the room."}) } finally { loading = false } diff --git a/src/app/components/RoomJoinItem.svelte b/src/app/components/RoomJoinItem.svelte index 519b099b..becebb53 100644 --- a/src/app/components/RoomJoinItem.svelte +++ b/src/app/components/RoomJoinItem.svelte @@ -41,6 +41,9 @@ $app.repository.removeEvent(event.id) onResolved?.() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to dismiss join request."}) } finally { loading = false } @@ -58,6 +61,9 @@ pushToast({message: "Member has been added to the room!"}) onResolved?.() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to add member to the room."}) } finally { loading = false } diff --git a/src/app/components/RoomMembersAdd.svelte b/src/app/components/RoomMembersAdd.svelte index 02edf137..33ac10e3 100644 --- a/src/app/components/RoomMembersAdd.svelte +++ b/src/app/components/RoomMembersAdd.svelte @@ -47,6 +47,9 @@ pushToast({message: "Members have successfully been added!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to add members."}) } finally { loading = false } diff --git a/src/app/components/RoomMembershipButton.svelte b/src/app/components/RoomMembershipButton.svelte index af5ee17b..874e2591 100644 --- a/src/app/components/RoomMembershipButton.svelte +++ b/src/app/components/RoomMembershipButton.svelte @@ -33,6 +33,9 @@ } else { onJoin() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to join the room."}) } finally { joining = false } @@ -49,6 +52,9 @@ } else { pushToast({message: "You have left the room."}) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to leave the room."}) } finally { leaving = false } diff --git a/src/app/components/SignUpComplete.svelte b/src/app/components/SignUpComplete.svelte index 803b30ce..3eb97b82 100644 --- a/src/app/components/SignUpComplete.svelte +++ b/src/app/components/SignUpComplete.svelte @@ -11,6 +11,7 @@ import ModalTitle from "@lib/components/ModalTitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" import ProgressBar from "@app/components/ProgressBar.svelte" + import {pushToast} from "@app/toast" type Props = { next: () => void @@ -27,6 +28,9 @@ try { await next() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to complete sign up."}) } finally { loading = false } diff --git a/src/app/components/SpaceAccessRequest.svelte b/src/app/components/SpaceAccessRequest.svelte index ed7d292d..69034f86 100644 --- a/src/app/components/SpaceAccessRequest.svelte +++ b/src/app/components/SpaceAccessRequest.svelte @@ -38,6 +38,9 @@ } callback() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to request access."}) } finally { loading = false } diff --git a/src/app/components/SpaceAuthError.svelte b/src/app/components/SpaceAuthError.svelte index 153772e5..fbf39ad9 100644 --- a/src/app/components/SpaceAuthError.svelte +++ b/src/app/components/SpaceAuthError.svelte @@ -16,6 +16,7 @@ import SpaceAccessRequest from "@app/components/SpaceAccessRequest.svelte" import {leaveSpace} from "@app/access" import {clearModals, navigate, pushModal} from "@app/modal" + import {pushToast} from "@app/toast" type Props = { url: string @@ -34,6 +35,9 @@ try { await leaveSpace(url) await navigate("/home") + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to leave the space."}) } finally { loading = false } diff --git a/src/app/components/SpaceEdit.svelte b/src/app/components/SpaceEdit.svelte index 4eee32df..1a43043e 100644 --- a/src/app/components/SpaceEdit.svelte +++ b/src/app/components/SpaceEdit.svelte @@ -73,6 +73,9 @@ try { await submit() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your changes."}) } finally { loading = false } diff --git a/src/app/components/SpaceExit.svelte b/src/app/components/SpaceExit.svelte index 807f838d..90991597 100644 --- a/src/app/components/SpaceExit.svelte +++ b/src/app/components/SpaceExit.svelte @@ -12,6 +12,7 @@ import ModalTitle from "@lib/components/ModalTitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" import {leaveSpace} from "@app/access" + import {pushToast} from "@app/toast" const {url} = $props() @@ -23,6 +24,9 @@ try { await leaveSpace(url) await navigate("/home") + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to leave the space."}) } finally { loading = false } diff --git a/src/app/components/SpaceInviteAccept.svelte b/src/app/components/SpaceInviteAccept.svelte index 474cc829..a7d2a9b2 100644 --- a/src/app/components/SpaceInviteAccept.svelte +++ b/src/app/components/SpaceInviteAccept.svelte @@ -69,6 +69,9 @@ try { await joinRelay() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to accept the invite."}) } finally { loading = false } diff --git a/src/app/components/SpaceMemberMethods.svelte b/src/app/components/SpaceMemberMethods.svelte index c15e733c..3e6fdb5d 100644 --- a/src/app/components/SpaceMemberMethods.svelte +++ b/src/app/components/SpaceMemberMethods.svelte @@ -68,6 +68,9 @@ pushToast({message: "Permissions updated!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update permissions."}) } finally { saving = false } diff --git a/src/app/components/SpaceMemberRoles.svelte b/src/app/components/SpaceMemberRoles.svelte index 9947e42a..bbe966d1 100644 --- a/src/app/components/SpaceMemberRoles.svelte +++ b/src/app/components/SpaceMemberRoles.svelte @@ -58,6 +58,9 @@ pushToast({message: "Roles updated!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update roles."}) } finally { loading = false } diff --git a/src/app/components/SpaceMembersAdd.svelte b/src/app/components/SpaceMembersAdd.svelte index a06a9c69..08c969ec 100644 --- a/src/app/components/SpaceMembersAdd.svelte +++ b/src/app/components/SpaceMembersAdd.svelte @@ -35,6 +35,9 @@ pushToast({message: "Members have successfully been added!"}) back() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to add members."}) } finally { loading = false } diff --git a/src/app/components/SpaceRedirect.svelte b/src/app/components/SpaceRedirect.svelte index a8141a1d..8975fc52 100644 --- a/src/app/components/SpaceRedirect.svelte +++ b/src/app/components/SpaceRedirect.svelte @@ -14,6 +14,7 @@ import ModalFooter from "@lib/components/ModalFooter.svelte" import {roomLists} from "@app/core" import {goToMovedSpace} from "@app/routes" + import {pushToast} from "@app/toast" type Props = { url: string @@ -30,6 +31,9 @@ try { await $roomLists.migrateRelay(url, newUrl).then(command => command?.publish()) await goToMovedSpace(url, newUrl) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to move to the new space."}) } finally { loading = false } diff --git a/src/app/components/SpaceTrustRelay.svelte b/src/app/components/SpaceTrustRelay.svelte index c26aa7b8..1b86417e 100644 --- a/src/app/components/SpaceTrustRelay.svelte +++ b/src/app/components/SpaceTrustRelay.svelte @@ -19,6 +19,7 @@ import {addTrustedRelay, removeTrustedRelay} from "@app/settings" import {navigate, popModal, pushModal} from "@app/modal" import {roomLists} from "@app/core" + import {pushToast} from "@app/toast" type Props = { url: string @@ -35,6 +36,9 @@ await $roomLists.removeRelay(url).then(publish) await removeTrustedRelay(url) navigate("/home") + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to leave the space."}) } finally { loading = false } @@ -48,6 +52,9 @@ relaysPendingTrust.update($r => remove(url, $r)) popModal() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to trust this space."}) } finally { loading = false } diff --git a/src/app/components/ThreadCreate.svelte b/src/app/components/ThreadCreate.svelte index f5cdcbf7..c0585a05 100644 --- a/src/app/components/ThreadCreate.svelte +++ b/src/app/components/ThreadCreate.svelte @@ -83,6 +83,9 @@ draftKey.clear() history.back() + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to create your thread."}) } finally { loading = false } diff --git a/src/app/components/WalletAsReceivingAddress.svelte b/src/app/components/WalletAsReceivingAddress.svelte index 7375c5dd..ff4b8cea 100644 --- a/src/app/components/WalletAsReceivingAddress.svelte +++ b/src/app/components/WalletAsReceivingAddress.svelte @@ -30,6 +30,9 @@ } else { clearModals() } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to update profile."}) } finally { loading = false } diff --git a/src/app/components/ZapButton.svelte b/src/app/components/ZapButton.svelte index 99c94a89..a2d633fb 100644 --- a/src/app/components/ZapButton.svelte +++ b/src/app/components/ZapButton.svelte @@ -8,6 +8,7 @@ import InfoZapperError from "@app/components/InfoZapperError.svelte" import {pushModal} from "@app/modal" import {app} from "@app/core" + import {pushToast} from "@app/toast" type Props = { url?: string @@ -34,6 +35,9 @@ } else { pushModal(InfoZapperError, {url, pubkey: event.pubkey}, {replaceState}) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to load zap details."}) } finally { loading = false } diff --git a/src/app/push/index.ts b/src/app/push/index.ts index 7361c4ef..0d01e8f5 100644 --- a/src/app/push/index.ts +++ b/src/app/push/index.ts @@ -1,5 +1,7 @@ import {Capacitor} from "@capacitor/core" import {notificationSettings, setSpaceNotifications} from "@app/settings" +import {clearBadges} from "@app/notifications" +import {syncEventReminders} from "@app/reminders" import {pushState} from "@app/push/adapters/common" import {ElectronNotifications} from "@app/push/adapters/electron" import {WebNotifications} from "@app/push/adapters/web" @@ -76,3 +78,20 @@ export const optInSpaceNotifications = async (url: string, notify: boolean) => { await setSpaceNotifications(url, notify) } } + +export const saveNotificationSettings = async ( + values: ReturnType, +) => { + if (!values.badge) { + clearBadges() + } + + const permission = values.push ? await Push.request() : "granted" + + if (permission.startsWith("granted")) { + notificationSettings.set(values) + syncEventReminders() + } + + return permission +} diff --git a/src/routes/settings/alerts/+page.svelte b/src/routes/settings/alerts/+page.svelte index ef67b007..f22e62ad 100644 --- a/src/routes/settings/alerts/+page.svelte +++ b/src/routes/settings/alerts/+page.svelte @@ -14,9 +14,7 @@ import Button from "@lib/components/Button.svelte" import PageContent from "@lib/components/PageContent.svelte" import {pushToast} from "@app/toast" - import {clearBadges} from "@app/notifications" - import {Push} from "@app/push" - import {syncEventReminders} from "@app/reminders" + import {saveNotificationSettings} from "@app/push" import {notificationSettings} from "@app/settings" const reset = () => { @@ -49,32 +47,23 @@ }) } - if (!settings.badge) { - clearBadges() + const permission = await saveNotificationSettings($state.snapshot(settings)) + + if (permission.startsWith("granted")) { + pushToast({message: "Your settings have been saved!"}) + } else { + await sleep(300) + + settings.push = false + + pushToast({ + theme: "error", + message: `Failed to request notification permissions (${permission}).`, + }) } - - let permission = "granted" - - if (settings.push) { - permission = await Push.request() - - if (!permission.startsWith("granted")) { - await sleep(300) - - settings.push = false - - return pushToast({ - theme: "error", - message: `Failed to request notification permissions (${permission}).`, - }) - } - } - - notificationSettings.set(settings) - - syncEventReminders() - - pushToast({message: "Your settings have been saved!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your alert settings."}) } finally { loading = false } diff --git a/src/routes/settings/content/+page.svelte b/src/routes/settings/content/+page.svelte index 0d2274ed..e0ed5c29 100644 --- a/src/routes/settings/content/+page.svelte +++ b/src/routes/settings/content/+page.svelte @@ -64,6 +64,9 @@ await $blossomServerLists.setUrls($state.snapshot(blossomServers)).then(publish) pushToast({message: "Your settings have been saved!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your settings."}) } finally { loading = false } diff --git a/src/routes/settings/privacy/+page.svelte b/src/routes/settings/privacy/+page.svelte index f5c6070e..6255c576 100644 --- a/src/routes/settings/privacy/+page.svelte +++ b/src/routes/settings/privacy/+page.svelte @@ -42,6 +42,9 @@ } else { pushToast({message: "Your logs have been sent. Thank you!"}) } + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to send your logs."}) } finally { sendingLogs = false } @@ -67,6 +70,9 @@ await publishSettings($settings) pushToast({message: "Your settings have been saved!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your settings."}) } finally { loading = false } diff --git a/src/routes/settings/wallet/+page.svelte b/src/routes/settings/wallet/+page.svelte index 850d25fc..43ebbdb9 100644 --- a/src/routes/settings/wallet/+page.svelte +++ b/src/routes/settings/wallet/+page.svelte @@ -128,6 +128,9 @@ await publishSettings({zap_amounts: $settings.zap_amounts}) pushToast({message: "Your zap amounts have been saved!"}) + } catch (e) { + console.error(e) + pushToast({theme: "error", message: "Failed to save your zap amounts."}) } finally { zapAmountsLoading = false }