Re-implement user follows in profile

This commit is contained in:
AkiraFukushima 2023-01-29 18:16:22 +09:00
parent 6be10b2e09
commit 9a5ac3331e
No known key found for this signature in database
GPG Key ID: B6E51BAC4DE1A957
3 changed files with 111 additions and 10 deletions

View File

@ -97,7 +97,9 @@
<el-tab-pane :label="precision(user.statuses_count) + ' Posts'" name="posts" <el-tab-pane :label="precision(user.statuses_count) + ' Posts'" name="posts"
><Posts :user="user" :account="account.account" :server="account.server" ><Posts :user="user" :account="account.account" :server="account.server"
/></el-tab-pane> /></el-tab-pane>
<el-tab-pane :label="precision(user.following_count) + ' Following'" name="following">Following</el-tab-pane> <el-tab-pane :label="precision(user.following_count) + ' Following'" name="following"
><Following :user="user" :account="account.account" :server="account.server"
/></el-tab-pane>
<el-tab-pane :label="precision(user.followers_count) + ' Followers'" name="followers">Followers</el-tab-pane> <el-tab-pane :label="precision(user.followers_count) + ' Followers'" name="followers">Followers</el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
@ -117,12 +119,14 @@ import { ACTION_TYPES as LIST_MEMBERSHIP_ACTION } from '@/store/TimelineSpace/Mo
import { ACTION_TYPES as MUTE_ACTION } from '@/store/TimelineSpace/Modals/MuteConfirm' import { ACTION_TYPES as MUTE_ACTION } from '@/store/TimelineSpace/Modals/MuteConfirm'
import FailoverImg from '@/components/atoms/FailoverImg.vue' import FailoverImg from '@/components/atoms/FailoverImg.vue'
import Posts from './Profile/Posts.vue' import Posts from './Profile/Posts.vue'
import Following from './Profile/Following.vue'
export default defineComponent({ export default defineComponent({
name: 'Profile', name: 'Profile',
components: { components: {
FailoverImg, FailoverImg,
Posts Posts,
Following
}, },
setup() { setup() {
const win = (window as any) as MyWindow const win = (window as any) as MyWindow

View File

@ -0,0 +1,102 @@
<template>
<DynamicScroller :items="following" :min-item-size="53" class="scroller" page-mode>
<template v-slot="{ item, index, active }">
<DynamicScrollerItem :item="item" :active="active" :size-dependencies="[item.item]" :data-index="index" :watchData="true">
<User :user="item" :relationship="targetRelationship(item.id)" @follow-account="follow" @unfollow-account="unfollow" />
</DynamicScrollerItem>
</template>
</DynamicScroller>
</template>
<script lang="ts">
import { defineComponent, PropType, toRefs, ref, computed, onMounted, watch } from 'vue'
import generator, { Entity, MegalodonInterface } from 'megalodon'
import { LocalAccount } from '~/src/types/localAccount'
import { LocalServer } from '~/src/types/localServer'
import { useStore } from '@/store'
import User from '@/components/molecules/User.vue'
export default defineComponent({
name: 'Following',
components: { User },
props: {
user: {
type: Object as PropType<Entity.Account>,
required: true
},
account: {
type: Object as PropType<LocalAccount>,
required: true
},
server: {
type: Object as PropType<LocalServer>,
required: true
}
},
setup(props) {
const { user, account, server } = toRefs(props)
const store = useStore()
const following = ref<Array<Entity.Account>>([])
const relationships = ref<Array<Entity.Relationship>>([])
const client = ref<MegalodonInterface | null>(null)
const userAgent = computed(() => store.state.App.userAgent)
onMounted(async () => {
client.value = generator(server.value.sns, server.value.baseURL, account.value.accessToken, userAgent.value)
const res = await client.value.getAccountFollowing(user.value.id)
const ids = res.data.map(a => a.id)
const rel = await client.value.getRelationships(ids)
following.value = res.data
relationships.value = rel.data
})
watch(user, async current => {
if (client.value) {
const res = await client.value.getAccountFollowing(current.id)
const ids = res.data.map(a => a.id)
const rel = await client.value.getRelationships(ids)
following.value = res.data
relationships.value = rel.data
}
})
const targetRelationship = (id: string) => {
return relationships.value.find(r => r.id === id)
}
const follow = async (acct: Entity.Account) => {
if (client.value) {
const res = await client.value.followAccount(acct.id)
relationships.value = relationships.value.map(r => {
if (r.id === res.data.id) {
return res.data
}
return r
})
}
}
const unfollow = async (acct: Entity.Account) => {
if (client.value) {
const res = await client.value.unfollowAccount(acct.id)
relationships.value = relationships.value.map(r => {
if (r.id === res.data.id) {
return res.data
}
return r
})
}
}
return {
following,
targetRelationship,
follow,
unfollow
}
}
})
</script>
<style lang="scss" scoped></style>

View File

@ -51,11 +51,9 @@
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType } from 'vue' import { defineComponent, PropType } from 'vue'
import { Entity } from 'megalodon' import { Entity } from 'megalodon'
import { useStore } from '@/store'
import { ACTION_TYPES as SIDEBAR_ACTION, MUTATION_TYPES } from '@/store/TimelineSpace/Contents/SideBar'
import { ACTION_TYPES as PROFILE_ACTION } from '@/store/TimelineSpace/Contents/SideBar/AccountProfile'
import FailoverImg from '~/src/renderer/components/atoms/FailoverImg.vue' import FailoverImg from '~/src/renderer/components/atoms/FailoverImg.vue'
import emojify from '~/src/renderer/utils/emojify' import emojify from '~/src/renderer/utils/emojify'
import { useRouter } from 'vue-router'
export default defineComponent({ export default defineComponent({
name: 'user', name: 'user',
@ -81,8 +79,7 @@ export default defineComponent({
} }
}, },
setup(_props, ctx) { setup(_props, ctx) {
const store = useStore() const router = useRouter()
const username = (account: Entity.Account) => { const username = (account: Entity.Account) => {
if (account.display_name !== '') { if (account.display_name !== '') {
return emojify(account.display_name, account.emojis) return emojify(account.display_name, account.emojis)
@ -91,9 +88,7 @@ export default defineComponent({
} }
} }
const openUser = (account: Entity.Account) => { const openUser = (account: Entity.Account) => {
store.dispatch(`TimelineSpace/Contents/SideBar/${SIDEBAR_ACTION.OPEN_ACCOUNT_COMPONENT}`) router.push({ query: { detail: 'true', account_id: account.id } })
store.dispatch(`TimelineSpace/Contents/SideBar/AccountProfile/${PROFILE_ACTION.CHANGE_ACCOUNT}`, account)
store.commit(`TimelineSpace/Contents/SideBar/${MUTATION_TYPES.CHANGE_OPEN_SIDEBAR}`, true)
} }
const removeAccount = (account: Entity.Account) => { const removeAccount = (account: Entity.Account) => {
ctx.emit('removeAccount', account) ctx.emit('removeAccount', account)