edit-user-form.svelte 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script lang="ts">
  2. import { api, UserResponseDto } from '@api';
  3. import { createEventDispatcher } from 'svelte';
  4. import AccountEditOutline from 'svelte-material-icons/AccountEditOutline.svelte';
  5. export let user: UserResponseDto;
  6. let error: string;
  7. let success: string;
  8. const dispatch = createEventDispatcher();
  9. // eslint-disable-next-line no-undef
  10. const editUser = async (event: SubmitEvent) => {
  11. const formElement = event.target as HTMLFormElement;
  12. const form = new FormData(formElement);
  13. const firstName = form.get('firstName');
  14. const lastName = form.get('lastName');
  15. const {status} = await api.userApi.updateUser({
  16. id: user.id,
  17. firstName: firstName.toString(),
  18. lastName: lastName.toString()
  19. }).catch(e => console.log("Error updating user ", e));
  20. if (status == 200) {
  21. dispatch('edit-success');
  22. }
  23. }
  24. const resetPassword = async () => {
  25. const defaultPassword = 'password'
  26. const {status} = await api.userApi.updateUser({
  27. id: user.id,
  28. password: defaultPassword,
  29. shouldChangePassword: true,
  30. }).catch(e => console.log("Error updating user ", e));
  31. if (status == 200) {
  32. dispatch('reset-password-success');
  33. }
  34. }
  35. </script>
  36. <div class="border bg-white p-4 shadow-sm w-[500px] rounded-3xl py-8">
  37. <div class="flex flex-col place-items-center place-content-center gap-4 px-4">
  38. <!-- <img class="text-center" src="/immich-logo.svg" height="100" width="100" alt="immich-logo"/>-->
  39. <AccountEditOutline size="4em" color="#4250affe"/>
  40. <h1 class="text-2xl text-immich-primary font-medium">Edit user</h1>
  41. </div>
  42. <form on:submit|preventDefault={editUser} autocomplete="off">
  43. <div class="m-4 flex flex-col gap-2">
  44. <label class="immich-form-label" for="email">Email
  45. (cannot change)</label>
  46. <input class="immich-form-input disabled:bg-gray-200 hover:cursor-not-allowed"
  47. id="email" name="email"
  48. type="email" disabled
  49. bind:value={user.email}/>
  50. </div>
  51. <div class="m-4 flex flex-col gap-2">
  52. <label class="immich-form-label" for="firstName">First Name</label>
  53. <input class="immich-form-input" id="firstName" name="firstName" type="text" required
  54. bind:value={user.firstName}/>
  55. </div>
  56. <div class="m-4 flex flex-col gap-2">
  57. <label class="immich-form-label" for="lastName">Last Name</label>
  58. <input class="immich-form-input" id="lastName" name="lastName" type="text" required
  59. bind:value={user.lastName}/>
  60. </div>
  61. {#if error}
  62. <p class="text-red-400 ml-4 text-sm">{error}</p>
  63. {/if}
  64. {#if success}
  65. <p class="text-immich-primary ml-4 text-sm">{success}</p>
  66. {/if}
  67. <div class="flex w-full px-4 gap-4 mt-8">
  68. <button on:click={resetPassword}
  69. class="flex-1 transition-colors bg-[#F9DEDC] hover:bg-red-50 text-[#410E0B] px-6 py-3 rounded-full w-full font-medium"
  70. >Reset password
  71. </button
  72. >
  73. <button
  74. type="submit"
  75. class="flex-1 transition-colors bg-immich-primary hover:bg-immich-primary/75 px-6 py-3 text-white rounded-full shadow-md w-full font-medium"
  76. >Confirm
  77. </button
  78. >
  79. </div>
  80. </form>
  81. </div>