<!-- SPDX-FileCopyrightText: syuilo and other misskey contributors SPDX-License-Identifier: AGPL-3.0-only --> <template> <div class="_gaps"> <MkInfo>{{ i18n.ts._initialAccountSetting.theseSettingsCanEditLater }}</MkInfo> <FormSlot> <template #label>{{ i18n.ts.avatar }}</template> <div v-adaptive-bg :class="$style.avatarSection" class="_panel"> <MkAvatar :class="$style.avatar" :user="$i" @click="setAvatar"/> <div style="margin-top: 16px;"> <MkButton primary rounded inline @click="setAvatar">{{ i18n.ts._profile.changeAvatar }}</MkButton> </div> </div> </FormSlot> <MkInput v-model="name" :max="30" manualSave data-cy-user-setup-user-name> <template #label>{{ i18n.ts._profile.name }}</template> </MkInput> <MkTextarea v-model="description" :max="500" tall manualSave data-cy-user-setup-user-description> <template #label>{{ i18n.ts._profile.description }}</template> </MkTextarea> <MkInfo>{{ i18n.ts._initialAccountSetting.youCanEditMoreSettingsInSettingsPageLater }}</MkInfo> </div> </template> <script lang="ts" setup> import { computed, ref, watch } from 'vue'; import { instance } from '@/instance.js'; import { i18n } from '@/i18n.js'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; import MkTextarea from '@/components/MkTextarea.vue'; import FormSlot from '@/components/form/slot.vue'; import MkInfo from '@/components/MkInfo.vue'; import { chooseFileFromPc } from '@/scripts/select-file.js'; import * as os from '@/os.js'; import { $i } from '@/account.js'; const name = ref($i.name ?? ''); const description = ref($i.description ?? ''); watch(name, () => { os.apiWithDialog('i/update', { // 空文字列をnullにしたいので??は使うな // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing name: name.value || null, }); }); watch(description, () => { os.apiWithDialog('i/update', { // 空文字列をnullにしたいので??は使うな // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing description: description.value || null, }); }); function setAvatar(ev) { chooseFileFromPc(false).then(async (files) => { const file = files[0]; let originalOrCropped = file; const { canceled } = await os.confirm({ type: 'question', text: i18n.t('cropImageAsk'), okText: i18n.ts.cropYes, cancelText: i18n.ts.cropNo, }); if (!canceled) { originalOrCropped = await os.cropImage(file, { aspectRatio: 1, }); } const i = await os.apiWithDialog('i/update', { avatarId: originalOrCropped.id, }); $i.avatarId = i.avatarId; $i.avatarUrl = i.avatarUrl; }); } </script> <style lang="scss" module> .avatarSection { text-align: center; padding: 20px; } .avatar { width: 100px; height: 100px; } </style>