From 32a31045ef01ebeba66727b1b0803232ecfd0feb Mon Sep 17 00:00:00 2001 From: Pratyush Mohanty Date: Fri, 17 Apr 2026 21:58:52 +0000 Subject: [PATCH 1/4] fix: Improve toggle switch placement in settings screen (#208) (#232) Co-authored-by: Pratyush Mohanty Co-committed-by: Pratyush Mohanty --- src/lib/components/FieldInline.svelte | 28 +++++---- src/lib/components/InputList.svelte | 25 +++++--- src/routes/settings/alerts/+page.svelte | 73 ++++++++++++++++-------- src/routes/settings/content/+page.svelte | 27 ++++++--- src/routes/settings/privacy/+page.svelte | 66 +++++++++++++-------- 5 files changed, 141 insertions(+), 78 deletions(-) diff --git a/src/lib/components/FieldInline.svelte b/src/lib/components/FieldInline.svelte index 235a1a7b..01bfdf6a 100644 --- a/src/lib/components/FieldInline.svelte +++ b/src/lib/components/FieldInline.svelte @@ -9,16 +9,22 @@ const {...props}: Props = $props() -
- -
- {@render props.input?.()} -
-

- {#if props.info} - {@render props.info?.()} +

+
+ {#if props.label} + {/if} -

+
+ {#if props.input} + {@render props.input()} + {/if} +
+
+ {#if props.info} +

+ {@render props.info()} +

+ {/if}
diff --git a/src/lib/components/InputList.svelte b/src/lib/components/InputList.svelte index 1483d22e..5aba26fd 100644 --- a/src/lib/components/InputList.svelte +++ b/src/lib/components/InputList.svelte @@ -13,7 +13,12 @@ placeholder?: string } - let {value = $bindable(), addLabel, placeholder = "Enter text..."}: Props = $props() + let { + value = $bindable(), + addLabel, + placeholder = "Enter text...", + allowAdd = true, + }: Props & {allowAdd?: boolean} = $props() let draggedIndex: number | null = $state(null) const onChange = (newValue: string[]) => { @@ -72,12 +77,14 @@
{/each} - + {#if allowAdd} + + {/if} diff --git a/src/routes/settings/alerts/+page.svelte b/src/routes/settings/alerts/+page.svelte index 49934829..55bc2a7d 100644 --- a/src/routes/settings/alerts/+page.svelte +++ b/src/routes/settings/alerts/+page.svelte @@ -5,6 +5,7 @@ import {Badge} from "@capawesome/capacitor-badge" import Bell from "@assets/icons/bell.svg?dataurl" import {preventDefault} from "@lib/html" + import FieldInline from "@lib/components/FieldInline.svelte" import Spinner from "@lib/components/Spinner.svelte" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" @@ -63,40 +64,64 @@ {:then { isSupported }} {#if isSupported} -
-

Show badge for unread alerts

- -
+ + {#snippet label()} +

Show badge for unread alerts

+ {/snippet} + {#snippet input()} + + {/snippet} +
{/if} {/await} {#if !Capacitor.isNativePlatform()} -
-

Play sound for new activity

- -
+ + {#snippet label()} +

Play sound for new activity

+ {/snippet} + {#snippet input()} + + {/snippet} +
{/if} -
-

Enable push notifications

- -
+ + {#snippet label()} +

Enable push notifications

+ {/snippet} + {#snippet input()} + + {/snippet} +
Alert Types -
-

Notify me about new activity

- -
-
-

Always notify me when mentioned

- -
-
-

Notify me about new messages

- -
+ + {#snippet label()} +

Notify me about new activity

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Always notify me when mentioned

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Notify me about new messages

+ {/snippet} + {#snippet input()} + + {/snippet} +
diff --git a/src/routes/settings/content/+page.svelte b/src/routes/settings/content/+page.svelte index 3c86cd03..fbae0cb4 100644 --- a/src/routes/settings/content/+page.svelte +++ b/src/routes/settings/content/+page.svelte @@ -11,6 +11,7 @@ import {Router} from "@welshman/router" import {userMuteList, tagPubkey, publishThunk, userBlossomServerList} from "@welshman/app" import NotesMinimalistic from "@assets/icons/notes-minimalistic.svg?dataurl" + import AddCircle from "@assets/icons/add-circle.svg?dataurl" import {preventDefault} from "@lib/html" import Field from "@lib/components/Field.svelte" import FieldInline from "@lib/components/FieldInline.svelte" @@ -28,6 +29,10 @@ blossomServers = getTagValues("server", getListTags($userBlossomServerList)) } + const addServer = () => { + blossomServers = [...blossomServers, ""] + } + const onsubmit = preventDefault(async () => { await publishSettings($state.snapshot(settings)) @@ -104,7 +109,7 @@ {/snippet} {#snippet input()}
Editor Settings - + {#snippet label()}

Send Delay

{/snippet} {#snippet input()} {/snippet} -
+ {#snippet label()}

Media Server

{/snippet} + {#snippet secondary()} + + {/snippet} {#snippet input()} - - {#snippet addLabel()} - Add Server - {/snippet} - + {/snippet} {#snippet info()}

Choose a media server type and url for files you upload to {PLATFORM_NAME}.

diff --git a/src/routes/settings/privacy/+page.svelte b/src/routes/settings/privacy/+page.svelte index 4ab74fa6..4b864bb8 100644 --- a/src/routes/settings/privacy/+page.svelte +++ b/src/routes/settings/privacy/+page.svelte @@ -1,6 +1,7 @@ From 24aa62a503633423d8fca20b8c4eb18b91663a18 Mon Sep 17 00:00:00 2001 From: userAdityaa Date: Fri, 17 Apr 2026 23:00:03 +0000 Subject: [PATCH 3/4] chore: carify Pomade login errors with actionable invalid vs network messaging (#233) Co-authored-by: userAdityaa Co-committed-by: userAdityaa --- src/app/components/LogInEmail.svelte | 12 ++++++++++-- src/app/components/LogInOTP.svelte | 12 +++++++++++- src/app/components/LogInOTPConfirm.svelte | 16 ++++++++++++---- src/app/components/LogInSelect.svelte | 10 +++++++++- src/app/util/pomadeErrors.ts | 11 +++++++++++ src/routes/settings/profile/+page.svelte | 14 +++++++++++++- 6 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 src/app/util/pomadeErrors.ts diff --git a/src/app/components/LogInEmail.svelte b/src/app/components/LogInEmail.svelte index 597ad074..eecc9042 100644 --- a/src/app/components/LogInEmail.svelte +++ b/src/app/components/LogInEmail.svelte @@ -19,6 +19,7 @@ import LogInOTP from "@app/components/LogInOTP.svelte" import LogInSelect from "@app/components/LogInSelect.svelte" import {deleteDeactivatedPomadeSessions, loginWithPomade} from "@app/util/pomade" + import {getPomadeLoginFailureMessage, POMADE_NETWORK_ERROR_MESSAGE} from "@app/util/pomadeErrors" import {pushModal, clearModals} from "@app/util/modal" import {setChecked} from "@app/util/notifications" import {pushToast} from "@app/util/toast" @@ -44,7 +45,7 @@ return pushToast({ theme: "error", - message: "Sorry, we were unable to log you in.", + message: getPomadeLoginFailureMessage(messages), }) } @@ -64,10 +65,17 @@ pushToast({ theme: "error", - message: "Sorry, we were unable to log you in.", + message: getPomadeLoginFailureMessage(res.messages), }) } } + } catch (error) { + console.error("Login error:", error) + + pushToast({ + theme: "error", + message: POMADE_NETWORK_ERROR_MESSAGE, + }) } finally { loading = false } diff --git a/src/app/components/LogInOTP.svelte b/src/app/components/LogInOTP.svelte index b0d71e19..a5658e5d 100644 --- a/src/app/components/LogInOTP.svelte +++ b/src/app/components/LogInOTP.svelte @@ -15,6 +15,7 @@ import ModalSubtitle from "@lib/components/ModalSubtitle.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte" import LogInOTPConfirm from "@app/components/LogInOTPConfirm.svelte" + import {POMADE_NETWORK_ERROR_MESSAGE} from "@app/util/pomadeErrors" import {pushModal} from "@app/util/modal" import {pushToast} from "@app/util/toast" @@ -35,11 +36,20 @@ if (ok) { pushModal(LogInOTPConfirm, {email, peersByPrefix}) } else { + console.error("Pomade challenge request failed during OTP login") + pushToast({ theme: "error", - message: "Sorry, we were unable to request a login code.", + message: POMADE_NETWORK_ERROR_MESSAGE, }) } + } catch (error) { + console.error(error) + + pushToast({ + theme: "error", + message: POMADE_NETWORK_ERROR_MESSAGE, + }) } finally { loading = false } diff --git a/src/app/components/LogInOTPConfirm.svelte b/src/app/components/LogInOTPConfirm.svelte index d0ce449a..4b16a49f 100644 --- a/src/app/components/LogInOTPConfirm.svelte +++ b/src/app/components/LogInOTPConfirm.svelte @@ -15,10 +15,11 @@ import ModalFooter from "@lib/components/ModalFooter.svelte" import StringMultiInput from "@lib/components/StringMultiInput.svelte" import LogInSelect from "@app/components/LogInSelect.svelte" - import {pushToast} from "@app/util/toast" - import {setChecked} from "@app/util/notifications" import {pushModal, clearModals} from "@app/util/modal" + import {setChecked} from "@app/util/notifications" import {deleteDeactivatedPomadeSessions, loginWithPomade} from "@app/util/pomade" + import {getPomadeLoginFailureMessage, POMADE_NETWORK_ERROR_MESSAGE} from "@app/util/pomadeErrors" + import {pushToast} from "@app/util/toast" type Props = { email: string @@ -44,7 +45,7 @@ return pushToast({ theme: "error", - message: "Sorry, we were unable to log you in.", + message: getPomadeLoginFailureMessage(messages), }) } @@ -64,10 +65,17 @@ pushToast({ theme: "error", - message: "Sorry, we were unable to log you in.", + message: getPomadeLoginFailureMessage(res.messages), }) } } + } catch (error) { + console.error("Login error:", error) + + pushToast({ + theme: "error", + message: POMADE_NETWORK_ERROR_MESSAGE, + }) } finally { loading = false } diff --git a/src/app/components/LogInSelect.svelte b/src/app/components/LogInSelect.svelte index 9da7c432..8d416afd 100644 --- a/src/app/components/LogInSelect.svelte +++ b/src/app/components/LogInSelect.svelte @@ -14,6 +14,7 @@ import ModalFooter from "@lib/components/ModalFooter.svelte" import Profile from "@app/components/Profile.svelte" import {deleteDeactivatedPomadeSessions, loginWithPomade} from "@app/util/pomade" + import {getPomadeLoginFailureMessage, POMADE_NETWORK_ERROR_MESSAGE} from "@app/util/pomadeErrors" import {setChecked} from "@app/util/notifications" import {clearModals} from "@app/util/modal" import {pushToast} from "@app/util/toast" @@ -46,9 +47,16 @@ pushToast({ theme: "error", - message: "Sorry, we were unable to log you in.", + message: getPomadeLoginFailureMessage(res.messages), }) } + } catch (error) { + console.error("Login error:", error) + + pushToast({ + theme: "error", + message: POMADE_NETWORK_ERROR_MESSAGE, + }) } finally { loading = false } diff --git a/src/app/util/pomadeErrors.ts b/src/app/util/pomadeErrors.ts new file mode 100644 index 00000000..595e1b73 --- /dev/null +++ b/src/app/util/pomadeErrors.ts @@ -0,0 +1,11 @@ +export const POMADE_INVALID_LOGIN_MESSAGE = "Invalid login information" +export const POMADE_NETWORK_ERROR_MESSAGE = "Network error, please try again" + +type PomadeMessage = { + res?: unknown +} + +export const getPomadeLoginFailureMessage = (messages: PomadeMessage[]) => + messages.some(message => message.res !== undefined) + ? POMADE_INVALID_LOGIN_MESSAGE + : POMADE_NETWORK_ERROR_MESSAGE diff --git a/src/routes/settings/profile/+page.svelte b/src/routes/settings/profile/+page.svelte index 4fb05e09..79c49087 100644 --- a/src/routes/settings/profile/+page.svelte +++ b/src/routes/settings/profile/+page.svelte @@ -27,6 +27,7 @@ import PasswordReset from "@app/components/PasswordReset.svelte" import InfoKeys from "@app/components/InfoKeys.svelte" import {pushModal} from "@app/util/modal" + import {POMADE_NETWORK_ERROR_MESSAGE} from "@app/util/pomadeErrors" import {clip, pushToast} from "@app/util/toast" const npub = nip19.npubEncode($pubkey!) @@ -48,13 +49,24 @@ const {ok, peersByPrefix} = await Client.requestChallenge($session!.email) if (!ok) { + console.error("Pomade challenge request failed during password reset initiation") + pushToast({ theme: "error", - message: "Failed to initiate password reset!", + message: POMADE_NETWORK_ERROR_MESSAGE, }) + + return } pushModal(PasswordReset, {peersByPrefix}) + } catch (error) { + console.error(error) + + pushToast({ + theme: "error", + message: POMADE_NETWORK_ERROR_MESSAGE, + }) } finally { loading = false } From 53954aae89c430f97b0b9f2bbec5cc679683acfd Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 17 Apr 2026 16:05:26 -0700 Subject: [PATCH 4/4] classnames tweak --- src/routes/settings/content/+page.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/routes/settings/content/+page.svelte b/src/routes/settings/content/+page.svelte index fbae0cb4..ee7a5d56 100644 --- a/src/routes/settings/content/+page.svelte +++ b/src/routes/settings/content/+page.svelte @@ -145,9 +145,7 @@

Media Server

{/snippet} {#snippet secondary()} -