Refactor settings to use common lang keys for titles (#1674)
This commit is contained in:
parent
9c4421bfe0
commit
372d021062
@ -88,7 +88,7 @@
|
|||||||
<NuxtLink class="item button-transparent" :to="`/user/${auth.user.username}`">
|
<NuxtLink class="item button-transparent" :to="`/user/${auth.user.username}`">
|
||||||
<div class="title profile-link">
|
<div class="title profile-link">
|
||||||
<div class="username">@{{ auth.user.username }}</div>
|
<div class="username">@{{ auth.user.username }}</div>
|
||||||
<div class="prompt">{{ formatMessage(messages.visitYourProfile) }}</div>
|
<div class="prompt">{{ formatMessage(commonMessages.visitYourProfile) }}</div>
|
||||||
</div>
|
</div>
|
||||||
</NuxtLink>
|
</NuxtLink>
|
||||||
<hr class="divider" />
|
<hr class="divider" />
|
||||||
@ -492,10 +492,6 @@ const navMenuMessages = defineMessages({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
visitYourProfile: {
|
|
||||||
id: 'layout.label.visit-your-profile',
|
|
||||||
defaultMessage: 'Visit your profile',
|
|
||||||
},
|
|
||||||
toggleMenu: {
|
toggleMenu: {
|
||||||
id: 'layout.menu-toggle.action',
|
id: 'layout.menu-toggle.action',
|
||||||
defaultMessage: 'Toggle menu',
|
defaultMessage: 'Toggle menu',
|
||||||
|
|||||||
@ -344,6 +344,9 @@
|
|||||||
"label.visibility": {
|
"label.visibility": {
|
||||||
"message": "Visibility"
|
"message": "Visibility"
|
||||||
},
|
},
|
||||||
|
"label.visit-your-profile": {
|
||||||
|
"message": "Visit your profile"
|
||||||
|
},
|
||||||
"layout.action.change-theme": {
|
"layout.action.change-theme": {
|
||||||
"message": "Change theme"
|
"message": "Change theme"
|
||||||
},
|
},
|
||||||
@ -410,9 +413,6 @@
|
|||||||
"layout.footer.resources.title": {
|
"layout.footer.resources.title": {
|
||||||
"message": "Resources"
|
"message": "Resources"
|
||||||
},
|
},
|
||||||
"layout.label.visit-your-profile": {
|
|
||||||
"message": "Visit your profile"
|
|
||||||
},
|
|
||||||
"layout.menu-toggle.action": {
|
"layout.menu-toggle.action": {
|
||||||
"message": "Toggle menu"
|
"message": "Toggle menu"
|
||||||
},
|
},
|
||||||
@ -440,18 +440,9 @@
|
|||||||
"profile.error.not-found": {
|
"profile.error.not-found": {
|
||||||
"message": "User not found"
|
"message": "User not found"
|
||||||
},
|
},
|
||||||
"profile.input.upload-avatar": {
|
|
||||||
"message": "Upload avatar"
|
|
||||||
},
|
|
||||||
"profile.joined-at": {
|
"profile.joined-at": {
|
||||||
"message": "Joined {ago}"
|
"message": "Joined {ago}"
|
||||||
},
|
},
|
||||||
"profile.label.edit-bio": {
|
|
||||||
"message": "Bio"
|
|
||||||
},
|
|
||||||
"profile.label.edit-username": {
|
|
||||||
"message": "Username"
|
|
||||||
},
|
|
||||||
"profile.label.no-collections": {
|
"profile.label.no-collections": {
|
||||||
"message": "This user has no collections!"
|
"message": "This user has no collections!"
|
||||||
},
|
},
|
||||||
@ -1019,9 +1010,6 @@
|
|||||||
"settings.profile.username.title": {
|
"settings.profile.username.title": {
|
||||||
"message": "Username"
|
"message": "Username"
|
||||||
},
|
},
|
||||||
"settings.profile.visit-profile": {
|
|
||||||
"message": "Visit your profile"
|
|
||||||
},
|
|
||||||
"settings.sessions.action.revoke-session": {
|
"settings.sessions.action.revoke-session": {
|
||||||
"message": "Revoke session"
|
"message": "Revoke session"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -8,45 +8,57 @@
|
|||||||
<aside class="universal-card">
|
<aside class="universal-card">
|
||||||
<NavStack>
|
<NavStack>
|
||||||
<h3>Display</h3>
|
<h3>Display</h3>
|
||||||
<NavStackItem link="/settings" :label="formatMessage(messages.appearanceTitle)">
|
<NavStackItem
|
||||||
|
link="/settings"
|
||||||
|
:label="formatMessage(commonSettingsMessages.appearance)"
|
||||||
|
>
|
||||||
<PaintBrushIcon />
|
<PaintBrushIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<NavStackItem
|
<NavStackItem
|
||||||
v-if="isStaging"
|
v-if="isStaging"
|
||||||
link="/settings/language"
|
link="/settings/language"
|
||||||
:label="formatMessage(messages.languageTitle)"
|
:label="formatMessage(commonSettingsMessages.language)"
|
||||||
>
|
>
|
||||||
<LanguagesIcon />
|
<LanguagesIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<template v-if="auth.user">
|
<template v-if="auth.user">
|
||||||
<h3>Account</h3>
|
<h3>Account</h3>
|
||||||
<NavStackItem link="/settings/profile" :label="formatMessage(messages.profileTitle)">
|
<NavStackItem
|
||||||
|
link="/settings/profile"
|
||||||
|
:label="formatMessage(commonSettingsMessages.profile)"
|
||||||
|
>
|
||||||
<UserIcon />
|
<UserIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<NavStackItem link="/settings/account" :label="formatMessage(messages.accountTitle)">
|
<NavStackItem
|
||||||
|
link="/settings/account"
|
||||||
|
:label="formatMessage(commonSettingsMessages.account)"
|
||||||
|
>
|
||||||
<ShieldIcon />
|
<ShieldIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<NavStackItem
|
<NavStackItem
|
||||||
link="/settings/authorizations"
|
link="/settings/authorizations"
|
||||||
:label="formatMessage(messages.authorizedAppsTitle)"
|
:label="formatMessage(commonSettingsMessages.authorizedApps)"
|
||||||
>
|
>
|
||||||
<GridIcon />
|
<GridIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<NavStackItem
|
<NavStackItem
|
||||||
link="/settings/sessions"
|
link="/settings/sessions"
|
||||||
:label="formatMessage(messages.sessionsTitle)"
|
:label="formatMessage(commonSettingsMessages.sessions)"
|
||||||
>
|
>
|
||||||
<MonitorSmartphoneIcon />
|
<MonitorSmartphoneIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="auth.user">
|
<template v-if="auth.user">
|
||||||
<h3>Developer</h3>
|
<h3>Developer</h3>
|
||||||
<NavStackItem link="/settings/pats" :label="formatMessage(messages.patsTitle)">
|
<NavStackItem
|
||||||
|
link="/settings/pats"
|
||||||
|
:label="formatMessage(commonSettingsMessages.pats)"
|
||||||
|
>
|
||||||
<KeyIcon />
|
<KeyIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
<NavStackItem
|
<NavStackItem
|
||||||
link="/settings/applications"
|
link="/settings/applications"
|
||||||
:label="formatMessage(messages.applicationsTitle)"
|
:label="formatMessage(commonSettingsMessages.applications)"
|
||||||
>
|
>
|
||||||
<ServerIcon />
|
<ServerIcon />
|
||||||
</NavStackItem>
|
</NavStackItem>
|
||||||
@ -62,7 +74,6 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
UsersIcon,
|
|
||||||
ServerIcon,
|
ServerIcon,
|
||||||
GridIcon,
|
GridIcon,
|
||||||
PaintBrushIcon,
|
PaintBrushIcon,
|
||||||
@ -75,45 +86,10 @@ import NavStack from '~/components/ui/NavStack.vue'
|
|||||||
import NavStackItem from '~/components/ui/NavStackItem.vue'
|
import NavStackItem from '~/components/ui/NavStackItem.vue'
|
||||||
import MonitorSmartphoneIcon from '~/assets/images/utils/monitor-smartphone.svg'
|
import MonitorSmartphoneIcon from '~/assets/images/utils/monitor-smartphone.svg'
|
||||||
|
|
||||||
import { commonMessages } from '~/utils/common-messages.ts'
|
import { commonMessages, commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
const messages = defineMessages({
|
|
||||||
appearanceTitle: {
|
|
||||||
id: 'settings.appearance.title',
|
|
||||||
defaultMessage: 'Appearance',
|
|
||||||
},
|
|
||||||
languageTitle: {
|
|
||||||
id: 'settings.language.title',
|
|
||||||
defaultMessage: 'Language',
|
|
||||||
},
|
|
||||||
profileTitle: {
|
|
||||||
id: 'settings.profile.title',
|
|
||||||
defaultMessage: 'Public profile',
|
|
||||||
},
|
|
||||||
accountTitle: {
|
|
||||||
id: 'settings.account.title',
|
|
||||||
defaultMessage: 'Account and security',
|
|
||||||
},
|
|
||||||
authorizedAppsTitle: {
|
|
||||||
id: 'settings.authorized-apps.title',
|
|
||||||
defaultMessage: 'Authorized apps',
|
|
||||||
},
|
|
||||||
sessionsTitle: {
|
|
||||||
id: 'settings.sessions.title',
|
|
||||||
defaultMessage: 'Sessions',
|
|
||||||
},
|
|
||||||
patsTitle: {
|
|
||||||
id: 'settings.pats.title',
|
|
||||||
defaultMessage: 'Personal access tokens',
|
|
||||||
},
|
|
||||||
applicationsTitle: {
|
|
||||||
id: 'settings.applications.title',
|
|
||||||
defaultMessage: 'Your applications',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const auth = await useAuth()
|
const auth = await useAuth()
|
||||||
const isStaging = useRuntimeConfig().public.siteUrl !== 'https://modrinth.com'
|
const isStaging = useRuntimeConfig().public.siteUrl !== 'https://modrinth.com'
|
||||||
|
|||||||
@ -128,7 +128,7 @@
|
|||||||
|
|
||||||
<div class="header__row">
|
<div class="header__row">
|
||||||
<div class="header__title">
|
<div class="header__title">
|
||||||
<h2>Applications</h2>
|
<h2>{{ formatMessage(commonSettingsMessages.applications) }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
@ -238,6 +238,9 @@ import {
|
|||||||
useScopes,
|
useScopes,
|
||||||
getScopeValue,
|
getScopeValue,
|
||||||
} from '~/composables/auth/scopes.ts'
|
} from '~/composables/auth/scopes.ts'
|
||||||
|
import { commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
definePageMeta({
|
definePageMeta({
|
||||||
middleware: 'auth',
|
middleware: 'auth',
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
proceed-label="Revoke"
|
proceed-label="Revoke"
|
||||||
@proceed="revokeApp(revokingId)"
|
@proceed="revokeApp(revokingId)"
|
||||||
/>
|
/>
|
||||||
<h2>Authorizations</h2>
|
<h2>{{ formatMessage(commonSettingsMessages.authorizedApps) }}</h2>
|
||||||
<p>
|
<p>
|
||||||
When you authorize an application with your Modrinth account, you grant it access to your
|
When you authorize an application with your Modrinth account, you grant it access to your
|
||||||
account. You can manage and review access to your account here at any time.
|
account. You can manage and review access to your account here at any time.
|
||||||
@ -89,9 +89,11 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { Button, TrashIcon, CheckIcon, ConfirmModal, Avatar } from 'omorphia'
|
import { Button, TrashIcon, CheckIcon, ConfirmModal, Avatar } from 'omorphia'
|
||||||
|
import { commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
import { useScopes } from '~/composables/auth/scopes.ts'
|
import { useScopes } from '~/composables/auth/scopes.ts'
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
const { scopesToDefinitions } = useScopes()
|
const { scopesToDefinitions } = useScopes()
|
||||||
|
|
||||||
const revokingId = ref(null)
|
const revokingId = ref(null)
|
||||||
|
|||||||
@ -4,15 +4,12 @@ import RadioButtonIcon from '~/assets/images/utils/radio-button.svg'
|
|||||||
import RadioButtonCheckedIcon from '~/assets/images/utils/radio-button-checked.svg'
|
import RadioButtonCheckedIcon from '~/assets/images/utils/radio-button-checked.svg'
|
||||||
import WarningIcon from '~/assets/images/utils/issues.svg'
|
import WarningIcon from '~/assets/images/utils/issues.svg'
|
||||||
import { isModifierKeyDown } from '~/helpers/events.ts'
|
import { isModifierKeyDown } from '~/helpers/events.ts'
|
||||||
|
import { commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
|
|
||||||
const vintl = useVIntl()
|
const vintl = useVIntl()
|
||||||
const { formatMessage } = vintl
|
const { formatMessage } = vintl
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
languagesTitle: {
|
|
||||||
id: 'settings.language.title',
|
|
||||||
defaultMessage: 'Language',
|
|
||||||
},
|
|
||||||
languagesDescription: {
|
languagesDescription: {
|
||||||
id: 'settings.language.description',
|
id: 'settings.language.description',
|
||||||
defaultMessage:
|
defaultMessage:
|
||||||
@ -288,7 +285,7 @@ function getItemLabel(locale: Locale) {
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<section class="universal-card">
|
<section class="universal-card">
|
||||||
<h2>{{ formatMessage(messages.languagesTitle) }}</h2>
|
<h2>{{ formatMessage(commonSettingsMessages.language) }}</h2>
|
||||||
|
|
||||||
<div class="card-description">
|
<div class="card-description">
|
||||||
<IntlFormatted :message-id="messages.languagesDescription">
|
<IntlFormatted :message-id="messages.languagesDescription">
|
||||||
|
|||||||
@ -74,7 +74,7 @@
|
|||||||
|
|
||||||
<div class="header__row">
|
<div class="header__row">
|
||||||
<div class="header__title">
|
<div class="header__title">
|
||||||
<h2>{{ formatMessage(messages.title) }}</h2>
|
<h2>{{ formatMessage(commonSettingsMessages.pats) }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
class="btn btn-primary"
|
class="btn btn-primary"
|
||||||
@ -204,6 +204,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { PlusIcon, XIcon, Checkbox, TrashIcon, EditIcon, SaveIcon, ConfirmModal } from 'omorphia'
|
import { PlusIcon, XIcon, Checkbox, TrashIcon, EditIcon, SaveIcon, ConfirmModal } from 'omorphia'
|
||||||
|
|
||||||
|
import { commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
import {
|
import {
|
||||||
hasScope,
|
hasScope,
|
||||||
scopeList,
|
scopeList,
|
||||||
@ -262,10 +263,6 @@ const deleteModalMessages = defineMessages({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
title: {
|
|
||||||
id: 'settings.pats.title',
|
|
||||||
defaultMessage: 'Personal access tokens',
|
|
||||||
},
|
|
||||||
description: {
|
description: {
|
||||||
id: 'settings.pats.description',
|
id: 'settings.pats.description',
|
||||||
defaultMessage:
|
defaultMessage:
|
||||||
|
|||||||
@ -78,7 +78,7 @@
|
|||||||
}}
|
}}
|
||||||
</Button>
|
</Button>
|
||||||
<Button :link="`/user/${auth.user.username}`">
|
<Button :link="`/user/${auth.user.username}`">
|
||||||
<UserIcon /> {{ formatMessage(messages.visitProfile) }}
|
<UserIcon /> {{ formatMessage(commonMessages.visitYourProfile) }}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@ -96,10 +96,10 @@ import {
|
|||||||
UndoIcon,
|
UndoIcon,
|
||||||
XIcon,
|
XIcon,
|
||||||
} from 'omorphia'
|
} from 'omorphia'
|
||||||
import { commonMessages } from '~/utils/common-messages'
|
import { commonMessages } from '~/utils/common-messages.ts'
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
title: 'Account settings - Modrinth',
|
title: 'Profile settings - Modrinth',
|
||||||
})
|
})
|
||||||
|
|
||||||
definePageMeta({
|
definePageMeta({
|
||||||
@ -142,10 +142,6 @@ const messages = defineMessages({
|
|||||||
id: 'settings.profile.bio.description',
|
id: 'settings.profile.bio.description',
|
||||||
defaultMessage: 'A short description to tell everyone a little bit about you.',
|
defaultMessage: 'A short description to tell everyone a little bit about you.',
|
||||||
},
|
},
|
||||||
visitProfile: {
|
|
||||||
id: 'settings.profile.visit-profile',
|
|
||||||
defaultMessage: 'Visit your profile',
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const auth = await useAuth()
|
const auth = await useAuth()
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="universal-card">
|
<div class="universal-card">
|
||||||
<h2>{{ formatMessage(messages.sessionsTitle) }}</h2>
|
<h2>{{ formatMessage(commonSettingsMessages.sessions) }}</h2>
|
||||||
<p class="preserve-lines">
|
<p class="preserve-lines">
|
||||||
{{ formatMessage(messages.sessionsDescription) }}
|
{{ formatMessage(messages.sessionsDescription) }}
|
||||||
</p>
|
</p>
|
||||||
@ -57,6 +57,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { XIcon } from 'omorphia'
|
import { XIcon } from 'omorphia'
|
||||||
|
import { commonSettingsMessages } from '~/utils/common-messages.ts'
|
||||||
|
|
||||||
definePageMeta({
|
definePageMeta({
|
||||||
middleware: 'auth',
|
middleware: 'auth',
|
||||||
@ -87,10 +88,6 @@ const messages = defineMessages({
|
|||||||
id: 'settings.sessions.last-accessed-ago',
|
id: 'settings.sessions.last-accessed-ago',
|
||||||
defaultMessage: 'Last accessed {ago}',
|
defaultMessage: 'Last accessed {ago}',
|
||||||
},
|
},
|
||||||
sessionsTitle: {
|
|
||||||
id: 'settings.sessions.title',
|
|
||||||
defaultMessage: 'Sessions',
|
|
||||||
},
|
|
||||||
unknownOsLabel: {
|
unknownOsLabel: {
|
||||||
id: 'settings.sessions.unknown-os',
|
id: 'settings.sessions.unknown-os',
|
||||||
defaultMessage: 'Unknown OS',
|
defaultMessage: 'Unknown OS',
|
||||||
@ -102,7 +99,7 @@ const messages = defineMessages({
|
|||||||
})
|
})
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
title: () => `${formatMessage(messages.sessionsTitle)} - Modrinth`,
|
title: () => `${formatMessage(messages.sessions)} - Modrinth`,
|
||||||
})
|
})
|
||||||
|
|
||||||
const data = useNuxtApp()
|
const data = useNuxtApp()
|
||||||
|
|||||||
@ -355,18 +355,6 @@ const messages = defineMessages({
|
|||||||
id: 'profile.button.report',
|
id: 'profile.button.report',
|
||||||
defaultMessage: 'Report',
|
defaultMessage: 'Report',
|
||||||
},
|
},
|
||||||
profileUploadAvatarInput: {
|
|
||||||
id: 'profile.input.upload-avatar',
|
|
||||||
defaultMessage: 'Upload avatar',
|
|
||||||
},
|
|
||||||
profileEditUsernameLabel: {
|
|
||||||
id: 'profile.label.edit-username',
|
|
||||||
defaultMessage: 'Username',
|
|
||||||
},
|
|
||||||
profileEditBioLabel: {
|
|
||||||
id: 'profile.label.edit-bio',
|
|
||||||
defaultMessage: 'Bio',
|
|
||||||
},
|
|
||||||
profileNoProjectsLabel: {
|
profileNoProjectsLabel: {
|
||||||
id: 'profile.label.no-projects',
|
id: 'profile.label.no-projects',
|
||||||
defaultMessage: 'This user has no projects!',
|
defaultMessage: 'This user has no projects!',
|
||||||
|
|||||||
@ -135,4 +135,43 @@ export const commonMessages = defineMessages({
|
|||||||
id: 'label.visibility',
|
id: 'label.visibility',
|
||||||
defaultMessage: 'Visibility',
|
defaultMessage: 'Visibility',
|
||||||
},
|
},
|
||||||
|
visitYourProfile: {
|
||||||
|
id: 'label.visit-your-profile',
|
||||||
|
defaultMessage: 'Visit your profile',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const commonSettingsMessages = defineMessages({
|
||||||
|
appearance: {
|
||||||
|
id: 'settings.appearance.title',
|
||||||
|
defaultMessage: 'Appearance',
|
||||||
|
},
|
||||||
|
language: {
|
||||||
|
id: 'settings.language.title',
|
||||||
|
defaultMessage: 'Language',
|
||||||
|
},
|
||||||
|
profile: {
|
||||||
|
id: 'settings.profile.title',
|
||||||
|
defaultMessage: 'Public profile',
|
||||||
|
},
|
||||||
|
account: {
|
||||||
|
id: 'settings.account.title',
|
||||||
|
defaultMessage: 'Account and security',
|
||||||
|
},
|
||||||
|
authorizedApps: {
|
||||||
|
id: 'settings.authorized-apps.title',
|
||||||
|
defaultMessage: 'Authorized apps',
|
||||||
|
},
|
||||||
|
sessions: {
|
||||||
|
id: 'settings.sessions.title',
|
||||||
|
defaultMessage: 'Sessions',
|
||||||
|
},
|
||||||
|
pats: {
|
||||||
|
id: 'settings.pats.title',
|
||||||
|
defaultMessage: 'Personal access tokens',
|
||||||
|
},
|
||||||
|
applications: {
|
||||||
|
id: 'settings.applications.title',
|
||||||
|
defaultMessage: 'Your applications',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user