Skip to content

Commit e1766a3

Browse files
maxstellarclaude
andcommitted
feat: add editable nickname field to account settings
Nickname was previously HCA-managed only and reset on every login. Users can now set their own nickname from the account page, and the HCA sync preserves it across future logins. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 710a48d commit e1766a3

3 files changed

Lines changed: 87 additions & 0 deletions

File tree

src/routes/(app)/account/+page.server.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ export const actions = {
2727
return { success: true };
2828
},
2929

30+
saveNickname: async ({ request, locals }) => {
31+
if (!locals.user) redirect(302, '/login');
32+
const form = await request.formData();
33+
await db
34+
.update(users)
35+
.set({ nickname: (form.get('nickname') as string)?.trim() || null, updatedAt: new Date() })
36+
.where(eq(users.hcaId, locals.user.sub));
37+
return { success: true };
38+
},
39+
3040
saveDarkMode: async ({ request, locals }) => {
3141
if (!locals.user) redirect(302, '/login');
3242
const form = await request.formData();

src/routes/(app)/account/+page.svelte

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
untrack(() => page.url.searchParams.get('edit') === 'address')
1212
);
1313
14+
let editingNickname = $state(false);
15+
1416
let addressCardEl = $state<HTMLDivElement | null>(null);
1517
1618
onMount(() => {
@@ -51,6 +53,44 @@
5153
<div class="card card-wide">
5254
<span class="card-label">details</span>
5355
<div class="field-list">
56+
<div class="field">
57+
<span class="field-key">nickname</span>
58+
{#if editingNickname}
59+
<form
60+
method="POST"
61+
action="?/saveNickname"
62+
class="inline-edit-form"
63+
use:enhance={() => {
64+
return ({ update }) => {
65+
update();
66+
editingNickname = false;
67+
};
68+
}}
69+
>
70+
<input
71+
class="edit-input inline-input"
72+
type="text"
73+
name="nickname"
74+
value={data.user?.nickname ?? ''}
75+
placeholder="nickname"
76+
maxlength="40"
77+
/>
78+
<button type="submit" class="btn-save btn-save-sm">save</button>
79+
<button
80+
type="button"
81+
class="btn-cancel btn-cancel-sm"
82+
onclick={() => (editingNickname = false)}>cancel</button
83+
>
84+
</form>
85+
{:else}
86+
<span class="field-val">
87+
{data.user?.nickname ?? ''}
88+
<button class="edit-link-inline" onclick={() => (editingNickname = true)}
89+
>edit</button
90+
>
91+
</span>
92+
{/if}
93+
</div>
5494
{#if data.user?.name}
5595
<div class="field">
5696
<span class="field-key">name</span>
@@ -374,6 +414,40 @@
374414
padding: 0.2em 0.55em;
375415
}
376416
417+
.edit-link-inline {
418+
font-size: 0.7rem;
419+
font-weight: bold;
420+
text-transform: uppercase;
421+
letter-spacing: 0.1em;
422+
color: var(--rail-label);
423+
background: none;
424+
border: none;
425+
cursor: pointer;
426+
padding: 0;
427+
}
428+
429+
.edit-link-inline:hover {
430+
color: var(--color-text);
431+
}
432+
433+
.inline-edit-form {
434+
display: flex;
435+
align-items: center;
436+
gap: 0.5rem;
437+
flex-wrap: wrap;
438+
}
439+
440+
.inline-input {
441+
width: 12rem;
442+
padding: 0.3rem 0.5rem;
443+
}
444+
445+
.btn-save-sm,
446+
.btn-cancel-sm {
447+
font-size: 0.75rem;
448+
padding: 0.3rem 0.7rem;
449+
}
450+
377451
.logout-link {
378452
display: inline-block;
379453
margin-top: 1.5rem;

src/routes/auth/callback/+server.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,9 @@ export const GET: RequestHandler = async ({ url, cookies }) => {
121121
target: users.hcaId,
122122
set: {
123123
...userRow,
124+
// Users can set their own nickname in account settings — never let the
125+
// HCA-synced value clobber it on a later login.
126+
nickname: sql`coalesce(nullif(${users.nickname}, ''), ${userRow.nickname})`,
124127
streetAddress: sql`coalesce(nullif(${users.streetAddress}, ''), ${addressInsert.streetAddress})`,
125128
addressLine2: sql`coalesce(nullif(${users.addressLine2}, ''), ${addressInsert.addressLine2})`,
126129
locality: sql`coalesce(nullif(${users.locality}, ''), ${addressInsert.locality})`,

0 commit comments

Comments
 (0)