diff --git a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAccountCard.vue b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAccountCard.vue index a935c24..69d0b28 100644 --- a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAccountCard.vue +++ b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAccountCard.vue @@ -29,9 +29,10 @@ const messages = defineMessages({ loading: { id: 'app.skin-site.home.loading', defaultMessage: 'Loading…' }, error: { id: 'app.skin-site.home.error', defaultMessage: 'Could not load players.' }, signIn: { id: 'app.skin-site.home.sign-in', defaultMessage: 'Sign in' }, + settings: { id: 'app.skin-site.home.settings', defaultMessage: 'Account' }, }) -const emit = defineEmits<{ (e: 'sign-in'): void }>() +const emit = defineEmits<{ (e: 'sign-in' | 'open-settings'): void }>() const luck = ref(null) const luckLoading = ref(false) @@ -89,6 +90,13 @@ watch(signedIn, loadLuck) {{ skinSiteUser!.username }} {{ skinSiteUser!.uuid }} +
>() +const profileModal = ref>() async function copyAddress() { try { @@ -43,7 +45,7 @@ async function copyAddress() {

{{ formatMessage(messages.subtitle) }}

- +
@@ -71,5 +73,6 @@ async function copyAddress() {
+
diff --git a/apps/app-frontend/src/components/ui/skin-site/SkinSiteProfileModal.vue b/apps/app-frontend/src/components/ui/skin-site/SkinSiteProfileModal.vue new file mode 100644 index 0000000..b263a7b --- /dev/null +++ b/apps/app-frontend/src/components/ui/skin-site/SkinSiteProfileModal.vue @@ -0,0 +1,402 @@ + + diff --git a/apps/app-frontend/src/helpers/skin-site-api.ts b/apps/app-frontend/src/helpers/skin-site-api.ts index 90e3017..0879bc7 100644 --- a/apps/app-frontend/src/helpers/skin-site-api.ts +++ b/apps/app-frontend/src/helpers/skin-site-api.ts @@ -431,3 +431,52 @@ export interface SkinSiteAnnouncement { export function skinSiteAnnouncements(): Promise> { return skinSiteRequest('broadcast/all', { type: 'skin' }) } +// --------------------------------------------------------------------------- +// Account updates (requires the JWT) +// --------------------------------------------------------------------------- + +export function skinSiteChangeUsername(newUsername: string): Promise> { + return skinSiteRequest('update/username', { + method: 'POST', + body: { newUsername }, + }) +} + +export function skinSiteChangePassword( + oldPassword: string, + newPassword: string, +): Promise> { + return skinSiteRequest('update/password', { + method: 'POST', + body: { oldPassword, newPassword }, + }) +} + +/** Pass null to reset the Minecraft password back to the website password. */ +export function skinSiteChangeYggdrasilPassword( + newPassword: string | null, +): Promise> { + return skinSiteRequest('update/yggdrasilPassword', { + method: 'POST', + body: { newPassword }, + }) +} + +/** Upload a new avatar image (multipart). */ +export async function skinSiteUploadAvatar(blob: Blob): Promise> { + const form = new FormData() + form.append('avatar', blob) + + const url = `${SKIN_SITE_ORIGIN}/starlight/update/avatar` + const headers: Record = {} + const token = getSkinSiteToken() + if (token) headers['Authorization'] = `Bearer ${token}` + + let response: Response + try { + response = await tauriFetch(url, { method: 'POST', headers, body: form }) + } catch { + return handleException(0) + } + return processResponse(response) +}