diff options
| author | Henry Jameson <me@hjkos.com> | 2020-05-10 06:46:06 +0300 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2020-05-10 06:46:06 +0300 |
| commit | bcebec478e43b3851e85c94335940e8fc7546cc8 (patch) | |
| tree | 085b19f056e0d2522f0b0a0f9125fda3fd082f66 /src/components/user_settings | |
| parent | 2e35289c3376881ca17b9330113c816a3327f245 (diff) | |
moved stuff from settings, cleaned up naming for tabs, added close and peek
Diffstat (limited to 'src/components/user_settings')
| -rw-r--r-- | src/components/user_settings/confirm.js | 9 | ||||
| -rw-r--r-- | src/components/user_settings/confirm.vue | 22 | ||||
| -rw-r--r-- | src/components/user_settings/mfa.js | 155 | ||||
| -rw-r--r-- | src/components/user_settings/mfa.vue | 173 | ||||
| -rw-r--r-- | src/components/user_settings/mfa_backup_codes.js | 17 | ||||
| -rw-r--r-- | src/components/user_settings/mfa_backup_codes.vue | 33 | ||||
| -rw-r--r-- | src/components/user_settings/mfa_totp.js | 49 | ||||
| -rw-r--r-- | src/components/user_settings/mfa_totp.vue | 43 | ||||
| -rw-r--r-- | src/components/user_settings/user_settings.js | 140 | ||||
| -rw-r--r-- | src/components/user_settings/user_settings.vue | 119 |
10 files changed, 0 insertions, 760 deletions
diff --git a/src/components/user_settings/confirm.js b/src/components/user_settings/confirm.js deleted file mode 100644 index 0f4ddfc9..00000000 --- a/src/components/user_settings/confirm.js +++ /dev/null @@ -1,9 +0,0 @@ -const Confirm = { - props: ['disabled'], - data: () => ({}), - methods: { - confirm () { this.$emit('confirm') }, - cancel () { this.$emit('cancel') } - } -} -export default Confirm diff --git a/src/components/user_settings/confirm.vue b/src/components/user_settings/confirm.vue deleted file mode 100644 index 69b3811b..00000000 --- a/src/components/user_settings/confirm.vue +++ /dev/null @@ -1,22 +0,0 @@ -<template> - <div> - <slot /> - <button - class="btn btn-default" - :disabled="disabled" - @click="confirm" - > - {{ $t('general.confirm') }} - </button> - <button - class="btn btn-default" - :disabled="disabled" - @click="cancel" - > - {{ $t('general.cancel') }} - </button> - </div> -</template> - -<script src="./confirm.js"> -</script> diff --git a/src/components/user_settings/mfa.js b/src/components/user_settings/mfa.js deleted file mode 100644 index abf37062..00000000 --- a/src/components/user_settings/mfa.js +++ /dev/null @@ -1,155 +0,0 @@ -import RecoveryCodes from './mfa_backup_codes.vue' -import TOTP from './mfa_totp.vue' -import Confirm from './confirm.vue' -import VueQrcode from '@chenfengyuan/vue-qrcode' -import { mapState } from 'vuex' - -const Mfa = { - data: () => ({ - settings: { // current settings of MFA - available: false, - enabled: false, - totp: false - }, - setupState: { // setup mfa - state: '', // state of setup. '' -> 'getBackupCodes' -> 'setupOTP' -> 'complete' - setupOTPState: '' // state of setup otp. '' -> 'prepare' -> 'confirm' -> 'complete' - }, - backupCodes: { - getNewCodes: false, - inProgress: false, // progress of fetch codes - codes: [] - }, - otpSettings: { // pre-setup setting of OTP. secret key, qrcode url. - provisioning_uri: '', - key: '' - }, - currentPassword: null, - otpConfirmToken: null, - error: null, - readyInit: false - }), - components: { - 'recovery-codes': RecoveryCodes, - 'totp-item': TOTP, - 'qrcode': VueQrcode, - 'confirm': Confirm - }, - computed: { - canSetupOTP () { - return ( - (this.setupInProgress && this.backupCodesPrepared) || - this.settings.enabled - ) && !this.settings.totp && !this.setupOTPInProgress - }, - setupInProgress () { - return this.setupState.state !== '' && this.setupState.state !== 'complete' - }, - setupOTPInProgress () { - return this.setupState.state === 'setupOTP' && !this.completedOTP - }, - prepareOTP () { - return this.setupState.setupOTPState === 'prepare' - }, - confirmOTP () { - return this.setupState.setupOTPState === 'confirm' - }, - completedOTP () { - return this.setupState.setupOTPState === 'completed' - }, - backupCodesPrepared () { - return !this.backupCodes.inProgress && this.backupCodes.codes.length > 0 - }, - confirmNewBackupCodes () { - return this.backupCodes.getNewCodes - }, - ...mapState({ - backendInteractor: (state) => state.api.backendInteractor - }) - }, - - methods: { - activateOTP () { - if (!this.settings.enabled) { - this.setupState.state = 'getBackupcodes' - this.fetchBackupCodes() - } - }, - fetchBackupCodes () { - this.backupCodes.inProgress = true - this.backupCodes.codes = [] - - return this.backendInteractor.generateMfaBackupCodes() - .then((res) => { - this.backupCodes.codes = res.codes - this.backupCodes.inProgress = false - }) - }, - getBackupCodes () { // get a new backup codes - this.backupCodes.getNewCodes = true - }, - confirmBackupCodes () { // confirm getting new backup codes - this.fetchBackupCodes().then((res) => { - this.backupCodes.getNewCodes = false - }) - }, - cancelBackupCodes () { // cancel confirm form of new backup codes - this.backupCodes.getNewCodes = false - }, - - // Setup OTP - setupOTP () { // prepare setup OTP - this.setupState.state = 'setupOTP' - this.setupState.setupOTPState = 'prepare' - this.backendInteractor.mfaSetupOTP() - .then((res) => { - this.otpSettings = res - this.setupState.setupOTPState = 'confirm' - }) - }, - doConfirmOTP () { // handler confirm enable OTP - this.error = null - this.backendInteractor.mfaConfirmOTP({ - token: this.otpConfirmToken, - password: this.currentPassword - }) - .then((res) => { - if (res.error) { - this.error = res.error - return - } - this.completeSetup() - }) - }, - - completeSetup () { - this.setupState.setupOTPState = 'complete' - this.setupState.state = 'complete' - this.currentPassword = null - this.error = null - this.fetchSettings() - }, - cancelSetup () { // cancel setup - this.setupState.setupOTPState = '' - this.setupState.state = '' - this.currentPassword = null - this.error = null - }, - // end Setup OTP - - // fetch settings from server - async fetchSettings () { - let result = await this.backendInteractor.settingsMFA() - if (result.error) return - this.settings = result.settings - this.settings.available = true - return result - } - }, - mounted () { - this.fetchSettings().then(() => { - this.readyInit = true - }) - } -} -export default Mfa diff --git a/src/components/user_settings/mfa.vue b/src/components/user_settings/mfa.vue deleted file mode 100644 index 14ea10a1..00000000 --- a/src/components/user_settings/mfa.vue +++ /dev/null @@ -1,173 +0,0 @@ -<template> - <div - v-if="readyInit && settings.available" - class="setting-item mfa-settings" - > - <div class="mfa-heading"> - <h2>{{ $t('settings.mfa.title') }}</h2> - </div> - - <div> - <div - v-if="!setupInProgress" - class="setting-item" - > - <!-- Enabled methods --> - <h3>{{ $t('settings.mfa.authentication_methods') }}</h3> - <totp-item - :settings="settings" - @deactivate="fetchSettings" - @activate="activateOTP" - /> - <br> - - <div v-if="settings.enabled"> - <!-- backup codes block--> - <recovery-codes - v-if="!confirmNewBackupCodes" - :backup-codes="backupCodes" - /> - <button - v-if="!confirmNewBackupCodes" - class="btn btn-default" - @click="getBackupCodes" - > - {{ $t('settings.mfa.generate_new_recovery_codes') }} - </button> - - <div v-if="confirmNewBackupCodes"> - <confirm - :disabled="backupCodes.inProgress" - @confirm="confirmBackupCodes" - @cancel="cancelBackupCodes" - > - <p class="warning"> - {{ $t('settings.mfa.warning_of_generate_new_codes') }} - </p> - </confirm> - </div> - </div> - </div> - - <div v-if="setupInProgress"> - <!-- setup block--> - - <h3>{{ $t('settings.mfa.setup_otp') }}</h3> - - <recovery-codes - v-if="!setupOTPInProgress" - :backup-codes="backupCodes" - /> - - <button - v-if="canSetupOTP" - class="btn btn-default" - @click="cancelSetup" - > - {{ $t('general.cancel') }} - </button> - - <button - v-if="canSetupOTP" - class="btn btn-default" - @click="setupOTP" - > - {{ $t('settings.mfa.setup_otp') }} - </button> - - <template v-if="setupOTPInProgress"> - <i v-if="prepareOTP">{{ $t('settings.mfa.wait_pre_setup_otp') }}</i> - - <div v-if="confirmOTP"> - <div class="setup-otp"> - <div class="qr-code"> - <h4>{{ $t('settings.mfa.scan.title') }}</h4> - <p>{{ $t('settings.mfa.scan.desc') }}</p> - <qrcode - :value="otpSettings.provisioning_uri" - :options="{ width: 200 }" - /> - <p> - {{ $t('settings.mfa.scan.secret_code') }}: - {{ otpSettings.key }} - </p> - </div> - - <div class="verify"> - <h4>{{ $t('general.verify') }}</h4> - <p>{{ $t('settings.mfa.verify.desc') }}</p> - <input - v-model="otpConfirmToken" - type="text" - > - - <p>{{ $t('settings.enter_current_password_to_confirm') }}:</p> - <input - v-model="currentPassword" - type="password" - > - <div class="confirm-otp-actions"> - <button - class="btn btn-default" - @click="doConfirmOTP" - > - {{ $t('settings.mfa.confirm_and_enable') }} - </button> - <button - class="btn btn-default" - @click="cancelSetup" - > - {{ $t('general.cancel') }} - </button> - </div> - <div - v-if="error" - class="alert error" - > - {{ error }} - </div> - </div> - </div> - </div> - </template> - </div> - </div> - </div> -</template> - -<script src="./mfa.js"></script> -<style lang="scss"> -@import '../../_variables.scss'; -.warning { - color: $fallback--cOrange; - color: var(--cOrange, $fallback--cOrange); -} -.mfa-settings { - .mfa-heading, .method-item { - overflow: hidden; - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: baseline; - } - - .setup-otp { - display: flex; - justify-content: center; - flex-wrap: wrap; - .qr-code { - flex: 1; - padding-right: 10px; - } - .verify { flex: 1; } - .error { margin: 4px 0 0 0; } - .confirm-otp-actions { - button { - width: 15em; - margin-top: 5px; - } - - } - } -} -</style> diff --git a/src/components/user_settings/mfa_backup_codes.js b/src/components/user_settings/mfa_backup_codes.js deleted file mode 100644 index f0a984ec..00000000 --- a/src/components/user_settings/mfa_backup_codes.js +++ /dev/null @@ -1,17 +0,0 @@ -export default { - props: { - backupCodes: { - type: Object, - default: () => ({ - inProgress: false, - codes: [] - }) - } - }, - data: () => ({}), - computed: { - inProgress () { return this.backupCodes.inProgress }, - ready () { return this.backupCodes.codes.length > 0 }, - displayTitle () { return this.inProgress || this.ready } - } -} diff --git a/src/components/user_settings/mfa_backup_codes.vue b/src/components/user_settings/mfa_backup_codes.vue deleted file mode 100644 index e6c8ede2..00000000 --- a/src/components/user_settings/mfa_backup_codes.vue +++ /dev/null @@ -1,33 +0,0 @@ -<template> - <div> - <h4 v-if="displayTitle"> - {{ $t('settings.mfa.recovery_codes') }} - </h4> - <i v-if="inProgress">{{ $t('settings.mfa.waiting_a_recovery_codes') }}</i> - <template v-if="ready"> - <p class="alert warning"> - {{ $t('settings.mfa.recovery_codes_warning') }} - </p> - <ul class="backup-codes"> - <li - v-for="code in backupCodes.codes" - :key="code" - > - {{ code }} - </li> - </ul> - </template> - </div> -</template> -<script src="./mfa_backup_codes.js"></script> -<style lang="scss"> -@import '../../_variables.scss'; - -.warning { - color: $fallback--cOrange; - color: var(--cOrange, $fallback--cOrange); -} -.backup-codes { - font-family: var(--postCodeFont, monospace); -} -</style> diff --git a/src/components/user_settings/mfa_totp.js b/src/components/user_settings/mfa_totp.js deleted file mode 100644 index 8408d8e9..00000000 --- a/src/components/user_settings/mfa_totp.js +++ /dev/null @@ -1,49 +0,0 @@ -import Confirm from './confirm.vue' -import { mapState } from 'vuex' - -export default { - props: ['settings'], - data: () => ({ - error: false, - currentPassword: '', - deactivate: false, - inProgress: false // progress peform request to disable otp method - }), - components: { - 'confirm': Confirm - }, - computed: { - isActivated () { - return this.settings.totp - }, - ...mapState({ - backendInteractor: (state) => state.api.backendInteractor - }) - }, - methods: { - doActivate () { - this.$emit('activate') - }, - cancelDeactivate () { this.deactivate = false }, - doDeactivate () { - this.error = null - this.deactivate = true - }, - confirmDeactivate () { // confirm deactivate TOTP method - this.error = null - this.inProgress = true - this.backendInteractor.mfaDisableOTP({ - password: this.currentPassword - }) - .then((res) => { - this.inProgress = false - if (res.error) { - this.error = res.error - return - } - this.deactivate = false - this.$emit('deactivate') - }) - } - } -} diff --git a/src/components/user_settings/mfa_totp.vue b/src/components/user_settings/mfa_totp.vue deleted file mode 100644 index c6f2cc7b..00000000 --- a/src/components/user_settings/mfa_totp.vue +++ /dev/null @@ -1,43 +0,0 @@ -<template> - <div> - <div class="method-item"> - <strong>{{ $t('settings.mfa.otp') }}</strong> - <button - v-if="!isActivated" - class="btn btn-default" - @click="doActivate" - > - {{ $t('general.enable') }} - </button> - - <button - v-if="isActivated" - class="btn btn-default" - :disabled="deactivate" - @click="doDeactivate" - > - {{ $t('general.disable') }} - </button> - </div> - - <confirm - v-if="deactivate" - :disabled="inProgress" - @confirm="confirmDeactivate" - @cancel="cancelDeactivate" - > - {{ $t('settings.enter_current_password_to_confirm') }}: - <input - v-model="currentPassword" - type="password" - > - </confirm> - <div - v-if="error" - class="alert error" - > - {{ error }} - </div> - </div> -</template> -<script src="./mfa_totp.js"></script> diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js deleted file mode 100644 index e07d4e56..00000000 --- a/src/components/user_settings/user_settings.js +++ /dev/null @@ -1,140 +0,0 @@ -import get from 'lodash/get' -import map from 'lodash/map' -import reject from 'lodash/reject' -import Autosuggest from '../autosuggest/autosuggest.vue' -import TabSwitcher from '../tab_switcher/tab_switcher.js' -import BlockCard from '../block_card/block_card.vue' -import MuteCard from '../mute_card/mute_card.vue' -import DomainMuteCard from '../domain_mute_card/domain_mute_card.vue' -import SelectableList from '../selectable_list/selectable_list.vue' -import ProgressButton from '../progress_button/progress_button.vue' -import Importer from '../importer/importer.vue' -import Exporter from '../exporter/exporter.vue' -import withSubscription from '../../hocs/with_subscription/with_subscription' -import Checkbox from '../checkbox/checkbox.vue' - -const BlockList = withSubscription({ - fetch: (props, $store) => $store.dispatch('fetchBlocks'), - select: (props, $store) => get($store.state.users.currentUser, 'blockIds', []), - childPropName: 'items' -})(SelectableList) - -const MuteList = withSubscription({ - fetch: (props, $store) => $store.dispatch('fetchMutes'), - select: (props, $store) => get($store.state.users.currentUser, 'muteIds', []), - childPropName: 'items' -})(SelectableList) - -const DomainMuteList = withSubscription({ - fetch: (props, $store) => $store.dispatch('fetchDomainMutes'), - select: (props, $store) => get($store.state.users.currentUser, 'domainMutes', []), - childPropName: 'items' -})(SelectableList) - -const UserSettings = { - data () { - return { - activeTab: 'profile', - newDomainToMute: '' - } - }, - created () { - this.$store.dispatch('fetchTokens') - }, - components: { - TabSwitcher, - BlockList, - MuteList, - DomainMuteList, - BlockCard, - MuteCard, - DomainMuteCard, - ProgressButton, - Autosuggest, - Checkbox - }, - computed: { - user () { - return this.$store.state.users.currentUser - }, - pleromaBackend () { - return this.$store.state.instance.pleromaBackend - }, - currentSaveStateNotice () { - return this.$store.state.interface.settings.currentSaveStateNotice - } - }, - methods: { - importFollows (file) { - return this.$store.state.api.backendInteractor.importFollows({ file }) - .then((status) => { - if (!status) { - throw new Error('failed') - } - }) - }, - importBlocks (file) { - return this.$store.state.api.backendInteractor.importBlocks({ file }) - .then((status) => { - if (!status) { - throw new Error('failed') - } - }) - }, - generateExportableUsersContent (users) { - // Get addresses - return users.map((user) => { - // check is it's a local user - if (user && user.is_local) { - // append the instance address - // eslint-disable-next-line no-undef - return user.screen_name + '@' + location.hostname - } - return user.screen_name - }).join('\n') - }, - activateTab (tabName) { - this.activeTab = tabName - }, - filterUnblockedUsers (userIds) { - return reject(userIds, (userId) => { - const user = this.$store.getters.findUser(userId) - return !user || user.statusnet_blocking || user.id === this.$store.state.users.currentUser.id - }) - }, - filterUnMutedUsers (userIds) { - return reject(userIds, (userId) => { - const user = this.$store.getters.findUser(userId) - return !user || user.muted || user.id === this.$store.state.users.currentUser.id - }) - }, - queryUserIds (query) { - return this.$store.dispatch('searchUsers', query) - .then((users) => map(users, 'id')) - }, - blockUsers (ids) { - return this.$store.dispatch('blockUsers', ids) - }, - unblockUsers (ids) { - return this.$store.dispatch('unblockUsers', ids) - }, - muteUsers (ids) { - return this.$store.dispatch('muteUsers', ids) - }, - unmuteUsers (ids) { - return this.$store.dispatch('unmuteUsers', ids) - }, - unmuteDomains (domains) { - return this.$store.dispatch('unmuteDomains', domains) - }, - muteDomain () { - return this.$store.dispatch('muteDomain', this.newDomainToMute) - .then(() => { this.newDomainToMute = '' }) - }, - identity (value) { - return value - } - } -} - -export default UserSettings diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue deleted file mode 100644 index 2a88714f..00000000 --- a/src/components/user_settings/user_settings.vue +++ /dev/null @@ -1,119 +0,0 @@ -<template> - <div class="settings panel panel-default"> - <div class="panel-heading"> - <div class="title"> - {{ $t('settings.user_settings') }} - </div> - <transition name="fade"> - <template v-if="currentSaveStateNotice"> - <div - v-if="currentSaveStateNotice.error" - class="alert error" - @click.prevent - > - {{ $t('settings.saving_err') }} - </div> - - <div - v-if="!currentSaveStateNotice.error" - class="alert transparent" - @click.prevent - > - {{ $t('settings.saving_ok') }} - </div> - </template> - </transition> - </div> - <div class="panel-body profile-edit"> - </div> - </div> -</template> - -<script src="./user_settings.js"> -</script> - -<style lang="scss"> -@import '../../_variables.scss'; - -.profile-edit { - .bio { - margin: 0; - } - - .visibility-tray { - padding-top: 5px; - } - - input[type=file] { - padding: 5px; - height: auto; - } - - .banner { - max-width: 100%; - } - - .uploading { - font-size: 1.5em; - margin: 0.25em; - } - - .name-changer { - width: 100%; - } - - .bg { - max-width: 100%; - } - - .current-avatar { - display: block; - width: 150px; - height: 150px; - border-radius: $fallback--avatarRadius; - border-radius: var(--avatarRadius, $fallback--avatarRadius); - } - - .oauth-tokens { - width: 100%; - - th { - text-align: left; - } - - .actions { - text-align: right; - } - } - - &-usersearch-wrapper { - padding: 1em; - } - - &-bulk-actions { - text-align: right; - padding: 0 1em; - min-height: 28px; - - button { - width: 10em; - } - } - - &-domain-mute-form { - padding: 1em; - display: flex; - flex-direction: column; - - button { - align-self: flex-end; - margin-top: 1em; - width: 10em; - } - } - - .setting-subitem { - margin-left: 1.75em; - } -} -</style> |
