Skip to content

Commit cd3e91c

Browse files
committed
feat: enhance password management features in random-password-generator
- Updated localization files for English, Spanish, French, Japanese, Portuguese, and Chinese to include new password management strings. - Refactored PasswordDisplay component to support editing and deleting passwords with a dialog interface. - Improved the password display layout and added functionality for copying, showing, and hiding passwords. - Removed the delete password functionality from the main page and integrated it into the PasswordDisplay component. - Enhanced the password vault page to dynamically fetch and display saved passwords with loading states.
1 parent 20eb289 commit cd3e91c

12 files changed

Lines changed: 636 additions & 173 deletions

File tree

src/lib/remote/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export { getCurrentUser, loginUser, registerUser } from './auth.remote';
55
export { getMantra, likeMantra } from './mantra.remote';
66

77
// Remote functions for password management
8-
export { getSavedPasswords, savePassword, deletePassword } from './password.remote';
8+
export { getSavedPasswords, savePassword, deletePassword, editPassword } from './password.remote';
99

1010
// Remote functions for purchase tracker
1111
export {

src/lib/remote/password.remote.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,44 @@ export const deletePassword = command(v.string(), async (passwordId) => {
7272

7373
return { success: true };
7474
});
75+
76+
// Command to edit a saved password
77+
export const editPassword = command(
78+
v.object({
79+
passwordId: v.pipe(v.string(), v.nonEmpty('Password ID is required')),
80+
password: v.pipe(v.string(), v.nonEmpty('Password is required')),
81+
details: v.optional(
82+
v.nullable(v.pipe(v.string(), v.maxLength(200, 'Details must be 200 characters or less')))
83+
)
84+
}),
85+
async (data) => {
86+
const user = await getCurrentUser();
87+
88+
if (!user) {
89+
throw new Error('User not authenticated');
90+
}
91+
92+
// Update password - ensure user can only update their own passwords
93+
const updatedPassword = await prisma.userPassword.updateMany({
94+
where: {
95+
id: data.passwordId,
96+
userId: user.id
97+
},
98+
data: {
99+
passwordHash: data.password, // Note: field name is passwordHash but we store plain text
100+
details: data.details ?? null,
101+
updatedAt: new Date()
102+
}
103+
});
104+
105+
// Check if any password was actually updated
106+
if (updatedPassword.count === 0) {
107+
throw new Error('Password not found or unauthorized');
108+
}
109+
110+
// Refresh the query to get the updated list
111+
await getSavedPasswords().refresh();
112+
113+
return { success: true, passwordId: data.passwordId };
114+
}
115+
);

src/locales/de.po

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ msgstr ""
33
"Project-Id-Version: \n"
44
"Report-Msgid-Bugs-To: \n"
55
"POT-Creation-Date: 2025-10-29T11:50:39.124Z\n"
6-
"PO-Revision-Date: 2025-10-30T12:49:01.290Z\n"
6+
"PO-Revision-Date: 2025-10-30T13:17:53.462Z\n"
77
"Last-Translator: \n"
88
"Language: de\n"
99
"Language-Team: \n"
@@ -2256,6 +2256,7 @@ msgstr "3-31 Zeichen: Kleinbuchstaben, Zahlen, Unterstriche und Bindestriche"
22562256

22572257
#: src/routes/(auth)/login/+page.svelte
22582258
#: src/routes/(auth)/register/+page.svelte
2259+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
22592260
msgid "Password"
22602261
msgstr "Passwort"
22612262

@@ -2565,6 +2566,7 @@ msgstr "Geben Sie Ihren Benutzernamen ein"
25652566
#: src/routes/apps/(app)/purchase-tracker/AddEditPurchaseDialog.svelte
25662567
#: src/routes/apps/(app)/purchase-tracker/ConfirmDeleteDialog.svelte
25672568
#: src/routes/apps/(app)/random-password-generator/+page.svelte
2569+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
25682570
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
25692571
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
25702572
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
@@ -3007,6 +3009,7 @@ msgstr "Speichern..."
30073009

30083010
#: src/routes/(auth)/profile/UserProfileCard.svelte
30093011
#: src/routes/apps/(app)/budget-tracker/BudgetDialog.svelte
3012+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
30103013
msgid "Save changes"
30113014
msgstr "Änderungen speichern"
30123015

@@ -7399,7 +7402,9 @@ msgid "Description (Optional)"
73997402
msgstr "Beschreibung (Optional)"
74007403

74017404
#. placeholder {0}: passwordDetails.length
7405+
#. placeholder {0}: editedDetails.length
74027406
#: src/routes/apps/(app)/random-password-generator/+page.svelte
7407+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
74037408
msgid "{0}/200 characters"
74047409
msgstr "{0}/200 Zeichen"
74057410

@@ -7532,8 +7537,8 @@ msgstr "Erstellen Sie Ihr erstes Passwort"
75327537
msgid "Your Password Vault"
75337538
msgstr "Ihr Passwort-Tresor"
75347539

7535-
#. placeholder {0}: savedPasswords.length
7536-
#. placeholder {1}: savedPasswords.length === 1 ? 'password' : 'passwords'
7540+
#. placeholder {0}: passwords.length
7541+
#. placeholder {1}: passwords.length === 1 ? 'password' : 'passwords'
75377542
#: src/routes/apps/(app)/random-password-generator/passwords/+page.svelte
75387543
msgid "{0} {1} stored securely"
75397544
msgstr "{0} {1} sicher gespeichert"
@@ -7551,3 +7556,47 @@ msgstr ""
75517556
"Alle Passwörter werden verschlüsselt und sicher gespeichert. Sie können Ihre Passwörter\n"
75527557
"jederzeit anzeigen, kopieren und löschen. Für maximale Sicherheit sollten Sie einen\n"
75537558
"dedizierten Passwort-Manager für sensible Konten verwenden.```"
7559+
7560+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7561+
msgid "Hide password"
7562+
msgstr "Passwort ausblenden"
7563+
7564+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7565+
msgid "Show password"
7566+
msgstr "Passwort anzeigen"
7567+
7568+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7569+
msgid "Copy password"
7570+
msgstr "Passwort kopieren"
7571+
7572+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7573+
msgid "Edit password"
7574+
msgstr "Passwort bearbeiten"
7575+
7576+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7577+
msgid "Delete password"
7578+
msgstr "Passwort löschen"
7579+
7580+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7581+
msgid "Edit Password"
7582+
msgstr "Passwort bearbeiten"
7583+
7584+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7585+
msgid "Update your password and its details. Click save when you're done."
7586+
msgstr "Aktualisieren Sie Ihr Passwort und dessen Details. Klicken Sie auf Speichern, wenn Sie fertig sind."
7587+
7588+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7589+
msgid "Enter password"
7590+
msgstr "Passwort eingeben"
7591+
7592+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7593+
msgid "Details (optional)"
7594+
msgstr "Details (optional)"
7595+
7596+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7597+
msgid "Add details about this password..."
7598+
msgstr "Fügen Sie Details zu diesem Passwort hinzu..."
7599+
7600+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7601+
msgid "<0/> Saving..."
7602+
msgstr "<0/> Speichern...```"

src/locales/en.po

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ msgstr ""
33
"Project-Id-Version: \n"
44
"Report-Msgid-Bugs-To: \n"
55
"POT-Creation-Date: 2025-10-24T09:30:24.009Z\n"
6-
"PO-Revision-Date: 2025-10-30T12:48:45.726Z\n"
6+
"PO-Revision-Date: 2025-10-30T13:17:53.354Z\n"
77
"Last-Translator: \n"
88
"Language: en\n"
99
"Language-Team: \n"
@@ -1668,6 +1668,7 @@ msgstr "3-31 characters: lowercase letters, numbers, underscores, and hyphens"
16681668

16691669
#: src/routes/(auth)/login/+page.svelte
16701670
#: src/routes/(auth)/register/+page.svelte
1671+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
16711672
msgid "Password"
16721673
msgstr "Password"
16731674

@@ -1899,6 +1900,7 @@ msgstr "Enter your username"
18991900
#: src/routes/apps/(app)/purchase-tracker/AddEditPurchaseDialog.svelte
19001901
#: src/routes/apps/(app)/purchase-tracker/ConfirmDeleteDialog.svelte
19011902
#: src/routes/apps/(app)/random-password-generator/+page.svelte
1903+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
19021904
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
19031905
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
19041906
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
@@ -2343,6 +2345,7 @@ msgstr "Saving..."
23432345

23442346
#: src/routes/(auth)/profile/UserProfileCard.svelte
23452347
#: src/routes/apps/(app)/budget-tracker/BudgetDialog.svelte
2348+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
23462349
msgid "Save changes"
23472350
msgstr "Save changes"
23482351

@@ -7484,7 +7487,9 @@ msgid "Description (Optional)"
74847487
msgstr "Description (Optional)"
74857488

74867489
#. placeholder {0}: passwordDetails.length
7490+
#. placeholder {0}: editedDetails.length
74877491
#: src/routes/apps/(app)/random-password-generator/+page.svelte
7492+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
74887493
msgid "{0}/200 characters"
74897494
msgstr "{0}/200 characters"
74907495

@@ -7617,8 +7622,8 @@ msgstr "Create Your First Password"
76177622
msgid "Your Password Vault"
76187623
msgstr "Your Password Vault"
76197624

7620-
#. placeholder {0}: savedPasswords.length
7621-
#. placeholder {1}: savedPasswords.length === 1 ? 'password' : 'passwords'
7625+
#. placeholder {0}: passwords.length
7626+
#. placeholder {1}: passwords.length === 1 ? 'password' : 'passwords'
76227627
#: src/routes/apps/(app)/random-password-generator/passwords/+page.svelte
76237628
msgid "{0} {1} stored securely"
76247629
msgstr "{0} {1} stored securely"
@@ -7636,3 +7641,47 @@ msgstr ""
76367641
"All passwords are encrypted and stored securely. You can view, copy, and delete your\n"
76377642
"passwords at any time. For maximum security, consider using a dedicated password\n"
76387643
"manager for sensitive accounts."
7644+
7645+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7646+
msgid "Hide password"
7647+
msgstr "Hide password"
7648+
7649+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7650+
msgid "Show password"
7651+
msgstr "Show password"
7652+
7653+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7654+
msgid "Copy password"
7655+
msgstr "Copy password"
7656+
7657+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7658+
msgid "Edit password"
7659+
msgstr "Edit password"
7660+
7661+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7662+
msgid "Delete password"
7663+
msgstr "Delete password"
7664+
7665+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7666+
msgid "Edit Password"
7667+
msgstr "Edit Password"
7668+
7669+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7670+
msgid "Update your password and its details. Click save when you're done."
7671+
msgstr "Update your password and its details. Click save when you're done."
7672+
7673+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7674+
msgid "Enter password"
7675+
msgstr "Enter password"
7676+
7677+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7678+
msgid "Details (optional)"
7679+
msgstr "Details (optional)"
7680+
7681+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7682+
msgid "Add details about this password..."
7683+
msgstr "Add details about this password..."
7684+
7685+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7686+
msgid "<0/> Saving..."
7687+
msgstr "<0/> Saving..."

src/locales/es.po

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ msgstr ""
33
"Project-Id-Version: \n"
44
"Report-Msgid-Bugs-To: \n"
55
"POT-Creation-Date: 2025-10-24T09:30:24.050Z\n"
6-
"PO-Revision-Date: 2025-10-30T12:48:50.255Z\n"
6+
"PO-Revision-Date: 2025-10-30T13:17:53.397Z\n"
77
"Last-Translator: \n"
88
"Language: es\n"
99
"Language-Team: \n"
@@ -1657,6 +1657,7 @@ msgstr "3-31 caracteres: letras minúsculas, números, guiones bajos y guiones"
16571657

16581658
#: src/routes/(auth)/login/+page.svelte
16591659
#: src/routes/(auth)/register/+page.svelte
1660+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
16601661
msgid "Password"
16611662
msgstr "Contraseña"
16621663

@@ -1888,6 +1889,7 @@ msgstr "Ingresa tu nombre de usuario"
18881889
#: src/routes/apps/(app)/purchase-tracker/AddEditPurchaseDialog.svelte
18891890
#: src/routes/apps/(app)/purchase-tracker/ConfirmDeleteDialog.svelte
18901891
#: src/routes/apps/(app)/random-password-generator/+page.svelte
1892+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
18911893
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
18921894
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
18931895
#: src/routes/apps/(app)/smoke-free-tracker/+page.svelte
@@ -2332,6 +2334,7 @@ msgstr "Guardando..."
23322334

23332335
#: src/routes/(auth)/profile/UserProfileCard.svelte
23342336
#: src/routes/apps/(app)/budget-tracker/BudgetDialog.svelte
2337+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
23352338
msgid "Save changes"
23362339
msgstr "Guardar cambios"
23372340

@@ -7445,7 +7448,9 @@ msgid "Description (Optional)"
74457448
msgstr "Descripción (Opcional)"
74467449

74477450
#. placeholder {0}: passwordDetails.length
7451+
#. placeholder {0}: editedDetails.length
74487452
#: src/routes/apps/(app)/random-password-generator/+page.svelte
7453+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
74497454
msgid "{0}/200 characters"
74507455
msgstr "{0}/200 caracteres"
74517456

@@ -7578,8 +7583,8 @@ msgstr "Crea Tu Primera Contraseña"
75787583
msgid "Your Password Vault"
75797584
msgstr "Tu Bóveda de Contraseñas"
75807585

7581-
#. placeholder {0}: savedPasswords.length
7582-
#. placeholder {1}: savedPasswords.length === 1 ? 'password' : 'passwords'
7586+
#. placeholder {0}: passwords.length
7587+
#. placeholder {1}: passwords.length === 1 ? 'password' : 'passwords'
75837588
#: src/routes/apps/(app)/random-password-generator/passwords/+page.svelte
75847589
msgid "{0} {1} stored securely"
75857590
msgstr "{0} {1} almacenada(s) de forma segura"
@@ -7597,3 +7602,47 @@ msgstr ""
75977602
"Todas las contraseñas están encriptadas y almacenadas de forma segura. Puedes ver, copiar y eliminar tus\n"
75987603
"contraseñas en cualquier momento. Para máxima seguridad, considera usar un administrador de contraseñas dedicado\n"
75997604
"para cuentas confidenciales.```"
7605+
7606+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7607+
msgid "Hide password"
7608+
msgstr "Ocultar contraseña"
7609+
7610+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7611+
msgid "Show password"
7612+
msgstr "Mostrar contraseña"
7613+
7614+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7615+
msgid "Copy password"
7616+
msgstr "Copiar contraseña"
7617+
7618+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7619+
msgid "Edit password"
7620+
msgstr "Editar contraseña"
7621+
7622+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7623+
msgid "Delete password"
7624+
msgstr "Eliminar contraseña"
7625+
7626+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7627+
msgid "Edit Password"
7628+
msgstr "Editar Contraseña"
7629+
7630+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7631+
msgid "Update your password and its details. Click save when you're done."
7632+
msgstr "Actualiza tu contraseña y sus detalles. Haz clic en guardar cuando hayas terminado."
7633+
7634+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7635+
msgid "Enter password"
7636+
msgstr "Introduce la contraseña"
7637+
7638+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7639+
msgid "Details (optional)"
7640+
msgstr "Detalles (opcional)"
7641+
7642+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7643+
msgid "Add details about this password..."
7644+
msgstr "Añade detalles sobre esta contraseña..."
7645+
7646+
#: src/routes/apps/(app)/random-password-generator/PasswordDisplay.svelte
7647+
msgid "<0/> Saving..."
7648+
msgstr "<0/> Guardando...```"

0 commit comments

Comments
 (0)