101 lines
3.0 KiB
HTML
101 lines
3.0 KiB
HTML
<div class="account-profile-follow {{shown ? 'shown' : ''}}">
|
|
<IconButton
|
|
label="{{followLabel}}"
|
|
href="{{followIcon}}"
|
|
pressable="true"
|
|
pressed="{{following}}"
|
|
big="true"
|
|
on:click="onFollowButtonClick(event)"
|
|
animation="{{animateFollowButton && followButtonAnimation}}"
|
|
/>
|
|
</div>
|
|
<style>
|
|
.account-profile-follow {
|
|
grid-area: follow;
|
|
align-self: flex-start;
|
|
display: none;
|
|
}
|
|
.account-profile-follow.shown {
|
|
display: block;
|
|
}
|
|
</style>
|
|
<script>
|
|
import IconButton from '../IconButton.html'
|
|
import { FOLLOW_BUTTON_ANIMATION } from '../../_static/animations'
|
|
import { store } from '../../_store/store'
|
|
import { setAccountFollowed } from '../../_actions/follow'
|
|
import { setAccountBlocked } from '../../_actions/block'
|
|
|
|
export default {
|
|
methods: {
|
|
async onFollowButtonClick(e) {
|
|
e.preventDefault()
|
|
e.stopPropagation()
|
|
let {
|
|
account,
|
|
accountId,
|
|
following,
|
|
followRequested,
|
|
blocking
|
|
} = this.get()
|
|
this.set({animateFollowButton: true}) // TODO: this should be an event, not toggling a boolean
|
|
if (blocking) { // unblock
|
|
await setAccountBlocked(accountId, false)
|
|
} else { // follow/unfollow
|
|
let newFollowingValue = !(following || followRequested)
|
|
if (!account.locked) { // be optimistic, show the user that it succeeded
|
|
this.set({overrideFollowing: newFollowingValue})
|
|
}
|
|
await setAccountFollowed(accountId, newFollowingValue)
|
|
}
|
|
|
|
this.set({animateFollowButton: false}) // let animation play next time
|
|
}
|
|
},
|
|
store: () => store,
|
|
data: () => ({
|
|
followButtonAnimation: FOLLOW_BUTTON_ANIMATION
|
|
}),
|
|
computed: {
|
|
accountId: (account) => account.id,
|
|
following: (relationship, overrideFollowing) => {
|
|
if (typeof overrideFollowing === 'boolean') {
|
|
return overrideFollowing
|
|
}
|
|
return relationship && relationship.following
|
|
},
|
|
blocking: (relationship) => relationship && relationship.blocking,
|
|
followRequested: (relationship, account) => {
|
|
return relationship && relationship.requested && account && account.locked
|
|
},
|
|
followLabel: (blocking, following, followRequested) => {
|
|
if (blocking) {
|
|
return 'Unblock'
|
|
} else if (following) {
|
|
return 'Unfollow'
|
|
} else if (followRequested) {
|
|
return 'Unfollow (follow requested)'
|
|
} else {
|
|
return 'Follow'
|
|
}
|
|
},
|
|
followIcon: (blocking, following, followRequested) => {
|
|
if (blocking) {
|
|
return '#fa-unlock'
|
|
} else if (following) {
|
|
return '#fa-user-times'
|
|
} else if (followRequested) {
|
|
return '#fa-hourglass'
|
|
} else {
|
|
return '#fa-user-plus'
|
|
}
|
|
},
|
|
shown: (verifyCredentials, relationship) => {
|
|
return verifyCredentials && relationship && verifyCredentials.id !== relationship.id
|
|
}
|
|
},
|
|
components: {
|
|
IconButton
|
|
}
|
|
}
|
|
</script> |