d7973b0b80
* upstream/develop: (45 commits) fix chrome Prevent html-minifier to remove placeholder comment in index.html template Add placeholder to insert server generated metatags. Related to #430 added condition to check for logined user fix gradients and minor artifacts keep track of new instance options fix old MR oof get rid of slots fix timeago font added hide_network option, fixed properties naming Fix fetching new users, add storing local users in usersObjects with their screen_name as well as id, so that they could be fetched zero-state with screen-name link. improve notification subscription Refactor arrays to individual options Reset enableFollowsExport to true after 2 sec when an export file is available to download Write a unit test for fileSizeFormatService add checkbox to disable web push I am dumb Handle errors from server Moved upload errors in user_settings to an array. Moved upload error strings to its separate section in i18n ...
171 lines
5.8 KiB
JavaScript
171 lines
5.8 KiB
JavaScript
import StillImage from '../still-image/still-image.vue'
|
|
import { hex2rgb } from '../../services/color_convert/color_convert.js'
|
|
|
|
export default {
|
|
props: [ 'user', 'switcher', 'selected', 'hideBio', 'activatePanel' ],
|
|
data () {
|
|
return {
|
|
followRequestInProgress: false,
|
|
followRequestSent: false,
|
|
hideUserStatsLocal: typeof this.$store.state.config.hideUserStats === 'undefined'
|
|
? this.$store.state.instance.hideUserStats
|
|
: this.$store.state.config.hideUserStats,
|
|
betterShadow: this.$store.state.interface.browserSupport.cssFilter
|
|
}
|
|
},
|
|
computed: {
|
|
headingStyle () {
|
|
const color = this.$store.state.config.customTheme.colors
|
|
? this.$store.state.config.customTheme.colors.bg // v2
|
|
: this.$store.state.config.colors.bg // v1
|
|
|
|
if (color) {
|
|
const rgb = (typeof color === 'string') ? hex2rgb(color) : color
|
|
const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .5)`
|
|
|
|
const gradient = [
|
|
[tintColor, this.hideBio ? '60%' : ''],
|
|
this.hideBio ? [
|
|
color, '100%'
|
|
] : [
|
|
tintColor, ''
|
|
]
|
|
].map(_ => _.join(' ')).join(', ')
|
|
|
|
return {
|
|
backgroundColor: `rgb(${Math.floor(rgb.r * 0.53)}, ${Math.floor(rgb.g * 0.56)}, ${Math.floor(rgb.b * 0.59)})`,
|
|
backgroundImage: [
|
|
`linear-gradient(to bottom, ${gradient})`,
|
|
`url(${this.user.cover_photo})`
|
|
].join(', ')
|
|
}
|
|
}
|
|
},
|
|
isOtherUser () {
|
|
return this.user.id !== this.$store.state.users.currentUser.id
|
|
},
|
|
subscribeUrl () {
|
|
// eslint-disable-next-line no-undef
|
|
const serverUrl = new URL(this.user.statusnet_profile_url)
|
|
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
|
|
},
|
|
loggedIn () {
|
|
return this.$store.state.users.currentUser
|
|
},
|
|
dailyAvg () {
|
|
const days = Math.ceil((new Date() - new Date(this.user.created_at)) / (60 * 60 * 24 * 1000))
|
|
return Math.round(this.user.statuses_count / days)
|
|
},
|
|
userHighlightType: {
|
|
get () {
|
|
const data = this.$store.state.config.highlight[this.user.screen_name]
|
|
return data && data.type || 'disabled'
|
|
},
|
|
set (type) {
|
|
const data = this.$store.state.config.highlight[this.user.screen_name]
|
|
if (type !== 'disabled') {
|
|
this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: data && data.color || '#FFFFFF', type })
|
|
} else {
|
|
this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: undefined })
|
|
}
|
|
}
|
|
},
|
|
userHighlightColor: {
|
|
get () {
|
|
const data = this.$store.state.config.highlight[this.user.screen_name]
|
|
return data && data.color
|
|
},
|
|
set (color) {
|
|
this.$store.dispatch('setHighlight', { user: this.user.screen_name, color })
|
|
}
|
|
}
|
|
},
|
|
components: {
|
|
StillImage
|
|
},
|
|
methods: {
|
|
followUser () {
|
|
const store = this.$store
|
|
this.followRequestInProgress = true
|
|
store.state.api.backendInteractor.followUser(this.user.id)
|
|
.then((followedUser) => store.commit('addNewUsers', [followedUser]))
|
|
.then(() => {
|
|
if (this.user.following) {
|
|
this.followRequestInProgress = false
|
|
return
|
|
}
|
|
if (!this.user.locked) {
|
|
let attemptsLeft = 3
|
|
const fetchUser = () => new Promise((resolve, reject) => {
|
|
setTimeout(() => {
|
|
store.state.api.backendInteractor.fetchUser({ id: this.user.id })
|
|
.then((user) => store.commit('addNewUsers', [user]))
|
|
.then(() => resolve(this.user.following))
|
|
.catch((e) => reject(e))
|
|
}, 500)
|
|
}).then((confirmed) => {
|
|
if (!confirmed && attemptsLeft > 0) {
|
|
attemptsLeft--
|
|
return fetchUser()
|
|
} else if (confirmed) {
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
})
|
|
|
|
return fetchUser()
|
|
.then((successfulConfirmation) => {
|
|
if (successfulConfirmation) {
|
|
this.followRequestInProgress = false
|
|
} else {
|
|
this.followRequestInProgress = false
|
|
this.followRequestSent = true
|
|
}
|
|
})
|
|
} else {
|
|
this.followRequestInProgress = false
|
|
this.followRequestSent = true
|
|
}
|
|
})
|
|
},
|
|
unfollowUser () {
|
|
const store = this.$store
|
|
this.followRequestInProgress = true
|
|
store.state.api.backendInteractor.unfollowUser(this.user.id)
|
|
.then((unfollowedUser) => store.commit('addNewUsers', [unfollowedUser]))
|
|
.then(() => {
|
|
this.followRequestInProgress = false
|
|
})
|
|
},
|
|
blockUser () {
|
|
const store = this.$store
|
|
store.state.api.backendInteractor.blockUser(this.user.id)
|
|
.then((blockedUser) => store.commit('addNewUsers', [blockedUser]))
|
|
},
|
|
unblockUser () {
|
|
const store = this.$store
|
|
store.state.api.backendInteractor.unblockUser(this.user.id)
|
|
.then((unblockedUser) => store.commit('addNewUsers', [unblockedUser]))
|
|
},
|
|
toggleMute () {
|
|
const store = this.$store
|
|
store.commit('setMuted', {user: this.user, muted: !this.user.muted})
|
|
store.state.api.backendInteractor.setUserMute(this.user)
|
|
},
|
|
setProfileView (v) {
|
|
if (this.switcher) {
|
|
const store = this.$store
|
|
store.commit('setProfileView', { v })
|
|
}
|
|
},
|
|
linkClicked ({target}) {
|
|
if (target.tagName === 'SPAN') {
|
|
target = target.parentNode
|
|
}
|
|
if (target.tagName === 'A') {
|
|
window.open(target.href, '_blank')
|
|
}
|
|
}
|
|
}
|
|
}
|