akkoma-fe/src/components/user_settings/user_settings.js

313 lines
11 KiB
JavaScript
Raw Normal View History

import unescape from 'lodash/unescape'
import get from 'lodash/get'
2019-02-04 20:03:01 +00:00
import TabSwitcher from '../tab_switcher/tab_switcher.js'
2019-02-07 08:05:59 +00:00
import ImageCropper from '../image_cropper/image_cropper.vue'
import StyleSwitcher from '../style_switcher/style_switcher.vue'
import fileSizeFormatService from '../../services/file_size_format/file_size_format.js'
2019-02-13 19:55:02 +00:00
import BlockCard from '../block_card/block_card.vue'
2019-02-14 03:04:28 +00:00
import MuteCard from '../mute_card/mute_card.vue'
import withSubscription from '../../hocs/with_subscription/with_subscription'
import withList from '../../hocs/with_list/with_list'
const BlockList = withList(BlockCard, userId => ({ userId }))
const BlockListWithSubscription = withSubscription(
2019-02-13 19:55:02 +00:00
BlockList,
2019-02-13 17:05:23 +00:00
(props, $store) => $store.dispatch('fetchBlocks'),
(props, $store) => get($store.state.users.currentUser, 'blockIds', []),
'entries'
)
2019-02-14 03:04:28 +00:00
const MuteList = withList(MuteCard, userId => ({ userId }))
const MuteListWithSubscription = withSubscription(
MuteList,
(props, $store) => $store.dispatch('fetchMutes'),
(props, $store) => get($store.state.users.currentUser, 'muteIds', []),
'entries'
)
const UserSettings = {
data () {
return {
newName: this.$store.state.users.currentUser.name,
2019-02-04 20:03:01 +00:00
newBio: unescape(this.$store.state.users.currentUser.description),
newLocked: this.$store.state.users.currentUser.locked,
newNoRichText: this.$store.state.users.currentUser.no_rich_text,
newDefaultScope: this.$store.state.users.currentUser.default_scope,
hideFollows: this.$store.state.users.currentUser.hide_follows,
hideFollowers: this.$store.state.users.currentUser.hide_followers,
showRole: this.$store.state.users.currentUser.show_role,
role: this.$store.state.users.currentUser.role,
2017-12-23 14:44:22 +00:00
followList: null,
followImportError: false,
followsImported: false,
2018-05-13 23:47:08 +00:00
enableFollowsExport: true,
2019-02-09 02:59:33 +00:00
pickAvatarBtnVisible: true,
2018-12-13 08:25:03 +00:00
bannerUploading: false,
backgroundUploading: false,
followListUploading: false,
bannerPreview: null,
backgroundPreview: null,
bannerUploadError: null,
backgroundUploadError: null,
deletingAccount: false,
deleteAccountConfirmPasswordInput: '',
2018-05-21 22:01:09 +00:00
deleteAccountError: false,
changePasswordInputs: [ '', '', '' ],
changedPassword: false,
2018-08-18 23:23:03 +00:00
changePasswordError: false,
activeTab: 'profile'
}
},
components: {
StyleSwitcher,
2019-02-07 08:05:59 +00:00
TabSwitcher,
ImageCropper,
2019-02-14 03:04:28 +00:00
'block-list': BlockListWithSubscription,
'mute-list': MuteListWithSubscription
},
computed: {
user () {
return this.$store.state.users.currentUser
2017-12-23 14:44:22 +00:00
},
pleromaBackend () {
2018-09-09 18:21:23 +00:00
return this.$store.state.instance.pleromaBackend
},
scopeOptionsEnabled () {
2018-09-09 18:21:23 +00:00
return this.$store.state.instance.scopeOptionsEnabled
},
vis () {
return {
public: { selected: this.newDefaultScope === 'public' },
unlisted: { selected: this.newDefaultScope === 'unlisted' },
private: { selected: this.newDefaultScope === 'private' },
direct: { selected: this.newDefaultScope === 'direct' }
}
},
currentSaveStateNotice () {
return this.$store.state.interface.settings.currentSaveStateNotice
2018-06-27 13:28:07 +00:00
}
},
methods: {
updateProfile () {
2018-12-15 00:30:39 +00:00
const name = this.newName
const description = this.newBio
const locked = this.newLocked
// Backend notation.
2018-06-27 13:28:07 +00:00
/* eslint-disable camelcase */
const default_scope = this.newDefaultScope
const no_rich_text = this.newNoRichText
const hide_follows = this.hideFollows
const hide_followers = this.hideFollowers
const show_role = this.showRole
2018-06-27 13:28:07 +00:00
/* eslint-enable camelcase */
this.$store.state.api.backendInteractor
.updateProfile({
params: {
name,
description,
locked,
// Backend notation.
/* eslint-disable camelcase */
default_scope,
no_rich_text,
hide_follows,
hide_followers,
show_role
/* eslint-enable camelcase */
}}).then((user) => {
if (!user.error) {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
}
})
},
changeVis (visibility) {
this.newDefaultScope = visibility
},
uploadFile (slot, e) {
const file = e.target.files[0]
if (!file) { return }
2018-12-13 14:51:29 +00:00
if (file.size > this.$store.state.instance[slot + 'limit']) {
const filesize = fileSizeFormatService.fileSizeFormat(file.size)
2018-12-13 14:51:29 +00:00
const allowedsize = fileSizeFormatService.fileSizeFormat(this.$store.state.instance[slot + 'limit'])
2018-12-13 14:44:37 +00:00
this[slot + 'UploadError'] = this.$t('upload.error.base') + ' ' + this.$t('upload.error.file_too_big', {filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit})
return
}
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({target}) => {
const img = target.result
2018-12-13 14:44:37 +00:00
this[slot + 'Preview'] = img
}
reader.readAsDataURL(file)
},
2019-02-07 08:05:59 +00:00
submitAvatar (cropper) {
2019-02-09 03:06:02 +00:00
const img = cropper.getCroppedCanvas().toDataURL('image/jpeg')
2019-02-09 02:59:33 +00:00
return this.$store.state.api.backendInteractor.updateAvatar({ params: { img } }).then((user) => {
if (!user.error) {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
2018-12-12 16:31:16 +00:00
} else {
2019-02-09 03:17:53 +00:00
throw new Error(this.$t('upload.error.base') + user.error)
}
})
},
clearUploadError (slot) {
2018-12-13 14:44:37 +00:00
this[slot + 'UploadError'] = null
},
submitBanner () {
2018-12-13 08:25:03 +00:00
if (!this.bannerPreview) { return }
2018-12-13 08:25:03 +00:00
let banner = this.bannerPreview
2017-08-15 21:46:55 +00:00
// eslint-disable-next-line no-undef
let imginfo = new Image()
2017-08-15 21:46:55 +00:00
/* eslint-disable camelcase */
let offset_top, offset_left, width, height
imginfo.src = banner
width = imginfo.width
height = imginfo.height
offset_top = 0
offset_left = 0
2018-12-13 08:25:03 +00:00
this.bannerUploading = true
this.$store.state.api.backendInteractor.updateBanner({params: {banner, offset_top, offset_left, width, height}}).then((data) => {
if (!data.error) {
let clone = JSON.parse(JSON.stringify(this.$store.state.users.currentUser))
clone.cover_photo = data.url
this.$store.commit('addNewUsers', [clone])
this.$store.commit('setCurrentUser', clone)
2018-12-13 08:25:03 +00:00
this.bannerPreview = null
2018-12-12 16:31:16 +00:00
} else {
2018-12-13 08:25:03 +00:00
this.bannerUploadError = this.$t('upload.error.base') + data.error
}
2018-12-13 08:25:03 +00:00
this.bannerUploading = false
})
2017-08-15 21:46:55 +00:00
/* eslint-enable camelcase */
},
submitBg () {
2018-12-13 08:25:03 +00:00
if (!this.backgroundPreview) { return }
let img = this.backgroundPreview
2017-08-15 21:46:55 +00:00
// eslint-disable-next-line no-undef
let imginfo = new Image()
let cropX, cropY, cropW, cropH
imginfo.src = img
cropX = 0
cropY = 0
cropW = imginfo.width
cropH = imginfo.width
2018-12-13 08:25:03 +00:00
this.backgroundUploading = true
this.$store.state.api.backendInteractor.updateBg({params: {img, cropX, cropY, cropW, cropH}}).then((data) => {
if (!data.error) {
let clone = JSON.parse(JSON.stringify(this.$store.state.users.currentUser))
clone.background_image = data.url
this.$store.commit('addNewUsers', [clone])
this.$store.commit('setCurrentUser', clone)
2018-12-13 08:25:03 +00:00
this.backgroundPreview = null
2018-12-12 16:31:16 +00:00
} else {
2018-12-13 08:25:03 +00:00
this.backgroundUploadError = this.$t('upload.error.base') + data.error
}
2018-12-13 08:25:03 +00:00
this.backgroundUploading = false
})
2017-12-23 14:44:22 +00:00
},
importFollows () {
2018-12-13 08:25:03 +00:00
this.followListUploading = true
2017-12-23 14:44:22 +00:00
const followList = this.followList
this.$store.state.api.backendInteractor.followImport({params: followList})
.then((status) => {
if (status) {
this.followsImported = true
} else {
this.followImportError = true
}
2018-12-13 08:25:03 +00:00
this.followListUploading = false
2017-12-23 14:44:22 +00:00
})
},
2018-05-13 23:47:08 +00:00
/* This function takes an Array of Users
* and outputs a file with all the addresses for the user to download
*/
2018-05-16 22:51:52 +00:00
exportPeople (users, filename) {
2018-05-13 23:47:08 +00:00
// Get all the friends addresses
2018-05-16 22:51:52 +00:00
var UserAddresses = users.map(function (user) {
// check is it's a local user
if (user && user.is_local) {
// append the instance address
// eslint-disable-next-line no-undef
user.screen_name += '@' + location.hostname
}
return user.screen_name
}).join('\n')
2018-05-13 23:47:08 +00:00
// Make the user download the file
2018-05-16 22:51:52 +00:00
var fileToDownload = document.createElement('a')
fileToDownload.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(UserAddresses))
fileToDownload.setAttribute('download', filename)
fileToDownload.style.display = 'none'
document.body.appendChild(fileToDownload)
fileToDownload.click()
document.body.removeChild(fileToDownload)
2018-05-13 23:47:08 +00:00
},
2018-05-16 22:51:52 +00:00
exportFollows () {
this.enableFollowsExport = false
2018-05-13 23:47:08 +00:00
this.$store.state.api.backendInteractor
.exportFriends({
id: this.$store.state.users.currentUser.id
2019-02-06 16:17:23 +00:00
})
2018-05-18 10:34:36 +00:00
.then((friendList) => {
2018-05-16 22:51:52 +00:00
this.exportPeople(friendList, 'friends.csv')
setTimeout(() => { this.enableFollowsExport = true }, 2000)
2018-05-18 10:34:36 +00:00
})
2018-05-13 23:47:08 +00:00
},
2017-12-23 14:44:22 +00:00
followListChange () {
// eslint-disable-next-line no-undef
let formData = new FormData()
formData.append('list', this.$refs.followlist.files[0])
this.followList = formData
},
dismissImported () {
this.followsImported = false
this.followImportError = false
},
confirmDelete () {
this.deletingAccount = true
},
deleteAccount () {
this.$store.state.api.backendInteractor.deleteAccount({password: this.deleteAccountConfirmPasswordInput})
.then((res) => {
if (res.status === 'success') {
this.$store.dispatch('logout')
this.$router.push({name: 'root'})
} else {
this.deleteAccountError = res.error
}
})
2018-05-21 22:01:09 +00:00
},
changePassword () {
const params = {
password: this.changePasswordInputs[0],
newPassword: this.changePasswordInputs[1],
newPasswordConfirmation: this.changePasswordInputs[2]
}
this.$store.state.api.backendInteractor.changePassword(params)
.then((res) => {
if (res.status === 'success') {
this.changedPassword = true
this.changePasswordError = false
this.logout()
2018-05-21 22:01:09 +00:00
} else {
this.changedPassword = false
this.changePasswordError = res.error
}
})
2018-08-18 23:23:03 +00:00
},
activateTab (tabName) {
this.activeTab = tabName
2018-11-30 13:30:55 +00:00
},
logout () {
2018-11-30 13:30:55 +00:00
this.$store.dispatch('logout')
this.$router.replace('/')
}
}
}
export default UserSettings