Modrinth/pages/dashboard/settings.vue
calum6541 dff34a8ae2
Added new options to the settings dashboard tab. (#60)
* Created developer tools dashboard

* Remove PopUp and use inline version

* Moved developer tools to the settings tab

At request of Geo

* Fixed some bugs.

* Fix Typos and flex on buttons

* Lowercased token

* Fix button styles

* Move screenshot in-house.

* Move screenshot in-house.

* Completed Developer Settings and Added features to Settings Tab.

Also fixed the about page, updated the "alpha" mention to beta.

* Update revoke-token.vue
2020-12-24 18:24:37 -07:00

222 lines
5.2 KiB
Vue

/* eslint-disable vue/attribute-hyphenation */
<template>
<DashboardPage>
<div class="section-header columns">
<h3 class="column-grow-1">Settings</h3>
<button class="brand-button column" @click="editProfile">Save</button>
</div>
<section class="essentials">
<h3>Username</h3>
<label>
<span>
The username used on the Modrinth site to identify yourself. This must
be unique.
</span>
<input
v-model="username"
type="text"
placeholder="Enter your username"
/>
</label>
<h3>Name</h3>
<label>
<span>
Your display name on your Modrinth profile. This does not have to be
unique, can be set to anything, and is optional.
</span>
<input v-model="name" type="text" placeholder="Enter your name" />
</label>
<h3>Email</h3>
<label>
<span>
The email for your account. This is private information which is not
displayed in any API routes or your profile. It is also optional.
</span>
<input v-model="email" type="email" placeholder="Enter your email" />
</label>
<h3>Bio</h3>
<label>
<span>
A description of yourself which other users can see on your profile.
</span>
<input v-model="bio" type="text" placeholder="Enter your bio" />
</label>
</section>
<section class="essentials pad-maker">
<h3>Theme</h3>
<label>
<span
>Change the global site theme of Modrinth. You can choose from light
mode and dark mode. You can switch it using this button or anywhere by
accessing the theme switcher in the navigation bar dropdown.</span
>
<input
type="button"
class="button pad-rem"
value="Change Theme"
@click="changeTheme"
/>
</label>
</section>
<section class="essentials pad-maker">
<h3>Authorization token</h3>
<label>
<span>
Your authorization token can be used with the Modrinth API and for the
Minotaur Gradle plugin. However, it must be kept secret!
</span>
<input
type="button"
class="button pad-rem"
value="Copy to clipboard"
@click="copyToken"
/>
</label>
<h3>Revoke your token</h3>
<label>
<span
>Beware, this will log you out of Modrinth, and you will have to login
again to access Modrinth with a new token.</span
>
<input
type="button"
class="button"
value="Revoke token"
@click="gotoRevoke"
/>
</label>
</section>
</DashboardPage>
</template>
<script>
import DashboardPage from '@/components/DashboardPage'
import axios from 'axios'
export default {
components: {
DashboardPage,
},
fetch() {
this.username = this.$auth.user.username
this.name = this.$auth.user.name
this.email = this.$auth.user.email
this.bio = this.$auth.user.bio
this.token = this.$auth.getToken('local')
},
data() {
return {
username: '',
name: '',
email: '',
bio: '',
token: '',
}
},
methods: {
changeTheme() {
this.$colorMode.preference =
this.$colorMode.value === 'dark' ? 'light' : 'dark'
this.themeAds()
},
themeAds() {
const elements = document.getElementsByClassName('ethical-ad')
for (const elem of elements) {
elem.className = 'ethical-ad loaded ' + this.$colorMode.preference
}
},
gotoRevoke() {
this.$router.replace('/dashboard/misc/revoke-token')
},
async copyToken() {
await this.$copyText(this.token)
this.$notify({
group: 'main',
title: 'Copied to clipboard.',
text: 'Copied your Modrinth token to the clipboard.',
type: 'success',
})
},
async editProfile() {
const config = {
headers: {
Authorization: this.$auth.getToken('local'),
},
}
this.$nuxt.$loading.start()
try {
const data = {
username: this.username,
name: this.name,
email: this.email,
bio: this.bio,
}
await axios.patch(
`https://api.modrinth.com/api/v1/user/${this.$auth.user.id}`,
data,
config
)
} catch (err) {
this.$notify({
group: 'main',
title: 'An Error Occurred',
text: err.response.data.description,
type: 'error',
})
}
this.$nuxt.$loading.finish()
},
},
}
</script>
<style lang="scss" scoped>
.pad-rem {
margin-top: 0;
}
.pad-maker {
margin-top: var(--spacing-card-md);
}
.save-btn-div {
overflow: hidden;
clear: both;
}
.save-btn {
float: right;
}
section {
@extend %card;
padding: var(--spacing-card-md) var(--spacing-card-lg);
}
label {
display: flex;
span {
flex: 2;
padding-right: var(--spacing-card-lg);
}
input {
flex: 3;
height: fit-content;
}
input[type='button'] {
height: fit-content;
flex: 1;
}
input[type='button']:hover {
cursor: pointer;
}
}
</style>