{{ props.user.display_name || "display_name" }}
-{{ props.user.username || "username" }}
++ {{ props.user.display_name || "display_name" }} +
++ {{ props.user.username || "username" }} - {{ props.user.pronouns || "un/defined" }} +
My Account
-AVATAR
+ + +DISPLAY NAME
+ +USERNAME
+ +PRONOUNS
+ +ABOUT ME
+{{ user?.about_me || "TBD" }}
+ + ++
+
+
+
Password (and eventually authenticator)
@@ -19,10 +40,81 @@ import Button from '~/components/buttons/Button.vue'; import ButtonScary from '~/components/buttons/ButtonScary.vue'; -const { user, fetchUser } = useAuth(); +const { fetchUser } = useAuth(); const user_me = await fetchUser() +let user_reference = Object.assign({}, user_me) +const user = user_me! +let new_pfp_file: any = null + +const saveChanges = async () => { + try { + const formData = new FormData() + + if (new_pfp_file) { + formData.append('avatar', new_pfp_file, new_pfp_file.name) + new_pfp_file = null + } + + // oh lord praise deep seek v3 + const jsonBlob = new Blob( + [JSON.stringify({ + display_name: user.display_name, + username: user.username, + pronouns: user.pronouns, + })], + { type: 'application/json' } + ); + formData.append('json', jsonBlob, 'data.json'); + + await fetchWithApi("/me", { + method: "PATCH", + body: formData + }) + + user_reference = Object.assign({}, user_me) + alert("success!!") + } catch (error: any) { + if (error?.response?.status !== 200) { + const errorData = await error?.response?.json() + + alert(`error ${error?.response?.status} met whilst trying to update profile info\n${errorData}`) + } + } +}; + + +const removeAvatar = async () => { + alert("TBD") + // await fetchWithApi(`/auth/reset-password`); +} + +const changeAvatar = async () => { + try { + let input = document.createElement('input'); + input.type = 'file'; + input.accept = 'image/*'; + + input.onchange = async(e) => { + const file = e.target.files?.[0]; + if (!file) return; + + new_pfp_file = file; + + const reader = new FileReader(); + reader.onload = (e) => { + user.avatar = e?.target?.result; + }; + reader.readAsDataURL(file); + } + + input.oncancel = () => alert("cancelled upload!"); + input.click(); + } catch (err) { + console.error('User canceled or error:', err); + } +} const resetPassword = async () => { alert("TBD") @@ -35,11 +127,24 @@ const deleteAccount = async () => { \ No newline at end of file diff --git a/composables/auth.ts b/composables/auth.ts index 4ec2f32..0ac2e8b 100644 --- a/composables/auth.ts +++ b/composables/auth.ts @@ -76,7 +76,6 @@ export const useAuth = () => { if (!accessToken.value) return; console.log("fetchuser access token:", accessToken.value); const res = await fetchWithApi("/me") as UserResponse; - res.avatar = res.avatar ?? "https://gorb.b-cdn.net/avatar/default-pfp.png"; user.value = res; return user.value; } diff --git a/pages/settings.vue b/pages/settings.vue index 050c1f8..fb66aa2 100644 --- a/pages/settings.vue +++ b/pages/settings.vue @@ -115,8 +115,8 @@ const selectCategory = (_category: Category, page: Page) => { } #sidebar { - min-width: 200px; - max-width: 200px; + min-width: 250px; + max-width: 250px; background-color: #2f3136; color: white; padding: 10px; @@ -127,7 +127,7 @@ const selectCategory = (_category: Category, page: Page) => { } #sidebar h2 { - font-size: 1.5em; + font-size: 2em; padding: 0 8px; } @@ -140,6 +140,7 @@ const selectCategory = (_category: Category, page: Page) => { #sidebar li { border-radius: 8px; padding: 8px; + font-size: 1.3em; margin: 2px 0; cursor: pointer; transition: background-color 0.3s; @@ -155,7 +156,7 @@ const selectCategory = (_category: Category, page: Page) => { #sub_page { flex-grow: 1; - max-width: 600px; + max-width: 800px; margin-left: 1.5rem; margin-right: auto; diff --git a/types/interfaces.ts b/types/interfaces.ts index a0d7d39..04da39a 100644 --- a/types/interfaces.ts +++ b/types/interfaces.ts @@ -57,8 +57,9 @@ export interface UserResponse { uuid: string, username: string, display_name: string | null, - avatar: string, + avatar: string | null, pronouns: string | null, + about_me: string | null, email?: string, email_verified?: boolean } From 0ddddd210e2c4b5be417c3ae94a5db2e24b40879 Mon Sep 17 00:00:00 2001 From: JustTemmie <47639983+JustTemmie@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:19:04 +0200 Subject: [PATCH 09/17] feat: fucking explode i hate this --- components/settings/user_settings/Account.vue | 54 ++++++++----------- pages/settings.vue | 4 +- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/components/settings/user_settings/Account.vue b/components/settings/user_settings/Account.vue index 74d120d..c1fdc77 100644 --- a/components/settings/user_settings/Account.vue +++ b/components/settings/user_settings/Account.vue @@ -1,5 +1,6 @@My Account
My Account
- +AVATAR
- +DISPLAY NAME
- +USERNAME
- +PRONOUNS
- +ABOUT ME
-{{ user?.about_me || "TBD" }}
+ ++
Password (and eventually authenticator)
- +Account Deletion
-AVATAR
+AVATAR
-DISPLAY NAME
- -USERNAME
- -PRONOUNS
- -ABOUT ME
- + + + + + + + +@@ -141,6 +141,7 @@ const deleteAccount = async () => { } .subtitle { + display: block; font-size: 14px; font-weight: 800; margin: 12px 0; From 556068063548e1be8c2be067bbdca8b4ac9c8061 Mon Sep 17 00:00:00 2001 From: JustTemmie <47639983+JustTemmie@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:42:35 +0200 Subject: [PATCH 15/17] feat: use dynamic units, minor refactoring --- components/{buttons => Buttons}/Button.vue | 0 .../{buttons => Buttons}/ButtonScary.vue | 0 .../AppSettings}/Appearance.vue | 0 .../AppSettings}/Keybinds.vue | 0 .../AppSettings}/Language.vue | 0 .../AppSettings}/Notifications.vue | 0 .../UserSettings}/Account.vue | 81 +++++++++---------- .../UserSettings}/Connections.vue | 0 .../UserSettings}/Devices.vue | 0 .../UserSettings}/Privacy.vue | 2 +- components/{Userpopup.vue => UserPopup.vue} | 9 ++- pages/settings.vue | 50 +++++------- 12 files changed, 66 insertions(+), 76 deletions(-) rename components/{buttons => Buttons}/Button.vue (100%) rename components/{buttons => Buttons}/ButtonScary.vue (100%) rename components/{settings/app_settings => Settings/AppSettings}/Appearance.vue (100%) rename components/{settings/app_settings => Settings/AppSettings}/Keybinds.vue (100%) rename components/{settings/app_settings => Settings/AppSettings}/Language.vue (100%) rename components/{settings/app_settings => Settings/AppSettings}/Notifications.vue (100%) rename components/{settings/user_settings => Settings/UserSettings}/Account.vue (71%) rename components/{settings/user_settings => Settings/UserSettings}/Connections.vue (100%) rename components/{settings/user_settings => Settings/UserSettings}/Devices.vue (100%) rename components/{settings/user_settings => Settings/UserSettings}/Privacy.vue (70%) rename components/{Userpopup.vue => UserPopup.vue} (81%) diff --git a/components/buttons/Button.vue b/components/Buttons/Button.vue similarity index 100% rename from components/buttons/Button.vue rename to components/Buttons/Button.vue diff --git a/components/buttons/ButtonScary.vue b/components/Buttons/ButtonScary.vue similarity index 100% rename from components/buttons/ButtonScary.vue rename to components/Buttons/ButtonScary.vue diff --git a/components/settings/app_settings/Appearance.vue b/components/Settings/AppSettings/Appearance.vue similarity index 100% rename from components/settings/app_settings/Appearance.vue rename to components/Settings/AppSettings/Appearance.vue diff --git a/components/settings/app_settings/Keybinds.vue b/components/Settings/AppSettings/Keybinds.vue similarity index 100% rename from components/settings/app_settings/Keybinds.vue rename to components/Settings/AppSettings/Keybinds.vue diff --git a/components/settings/app_settings/Language.vue b/components/Settings/AppSettings/Language.vue similarity index 100% rename from components/settings/app_settings/Language.vue rename to components/Settings/AppSettings/Language.vue diff --git a/components/settings/app_settings/Notifications.vue b/components/Settings/AppSettings/Notifications.vue similarity index 100% rename from components/settings/app_settings/Notifications.vue rename to components/Settings/AppSettings/Notifications.vue diff --git a/components/settings/user_settings/Account.vue b/components/Settings/UserSettings/Account.vue similarity index 71% rename from components/settings/user_settings/Account.vue rename to components/Settings/UserSettings/Account.vue index 28f6a25..120ceb3 100644 --- a/components/settings/user_settings/Account.vue +++ b/components/Settings/UserSettings/Account.vue @@ -1,14 +1,13 @@
My Account
AVATAR
- - + + + @@ -19,19 +18,13 @@-
- +
-
-
-
- -
Password (and eventually authenticator)
+Password (and eventually authenticator)
Account Deletion
@@ -41,22 +34,27 @@ \ No newline at end of file diff --git a/components/settings/user_settings/Connections.vue b/components/Settings/UserSettings/Connections.vue similarity index 100% rename from components/settings/user_settings/Connections.vue rename to components/Settings/UserSettings/Connections.vue diff --git a/components/settings/user_settings/Devices.vue b/components/Settings/UserSettings/Devices.vue similarity index 100% rename from components/settings/user_settings/Devices.vue rename to components/Settings/UserSettings/Devices.vue diff --git a/components/settings/user_settings/Privacy.vue b/components/Settings/UserSettings/Privacy.vue similarity index 70% rename from components/settings/user_settings/Privacy.vue rename to components/Settings/UserSettings/Privacy.vue index b805a7c..1e1c2a1 100644 --- a/components/settings/user_settings/Privacy.vue +++ b/components/Settings/UserSettings/Privacy.vue @@ -5,7 +5,7 @@ - - - \ No newline at end of file From 714f75ce1230e9c49ee16336859c008fef4ed7a1 Mon Sep 17 00:00:00 2001 From: RadicalAVATAR
- + @@ -34,8 +34,7 @@ \ No newline at end of file diff --git a/components/Settings/UserSettings/Account.vue b/components/Settings/UserSettings/Account.vue index 5e883f5..0fe5013 100644 --- a/components/Settings/UserSettings/Account.vue +++ b/components/Settings/UserSettings/Account.vue @@ -2,8 +2,8 @@My Account
-AVATAR
@@ -21,14 +21,14 @@