|
|
@@ -1,16 +1,29 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <n-scrollbar x-scrollable>
|
|
|
- <div class="flex">
|
|
|
- <div class="flex flex-col items-center p-[10px]" v-for="i in 20" :key="i">
|
|
|
- <n-avatar round :size="60"> 醉 </n-avatar>
|
|
|
- <div class="text-xs leading-6 mt-1">醉汉</div>
|
|
|
+ <div class="overflow-x-auto roles-list" ref="rolesListRef">
|
|
|
+ <div class="flex px-[10px]">
|
|
|
+ <div
|
|
|
+ class="roles flex flex-col items-center p-[10px] w-[80px] flex-shrink-0 overflow-hidden"
|
|
|
+ :class="{ 'roles-show': showRoles[index] }"
|
|
|
+ ref="rolesRef"
|
|
|
+ v-for="(item, index) in chatRoles"
|
|
|
+ :key="index"
|
|
|
+ @click="goAgent(item.id)"
|
|
|
+ >
|
|
|
+ <n-avatar round :size="60" :src="item.pic"></n-avatar>
|
|
|
+ <div class="text-xs leading-6 mt-1 truncate w-full">{{ item.name }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </n-scrollbar>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="px-5">
|
|
|
- <div v-for="(item, index) in list" :key="index" class="bg-white mt-[12px] p-4 rounded-lg">
|
|
|
+ <div class="px-5 moment-list overflow-x-hidden pb-7">
|
|
|
+ <div
|
|
|
+ ref="target"
|
|
|
+ v-for="(item, index) in list"
|
|
|
+ :key="index"
|
|
|
+ class="moment-box bg-white mt-[12px] p-4 rounded-lg"
|
|
|
+ :class="{ 'moment-center': showList[index] }"
|
|
|
+ >
|
|
|
<moment-info @goDetail="goDetail" :info="item"></moment-info>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -20,8 +33,9 @@
|
|
|
import { NScrollbar, NAvatar, NList, NListItem, NThing, NSpace, NTag, NIcon, NImage } from 'naive-ui'
|
|
|
import { useRouter } from 'vue-router'
|
|
|
import { MomentInfo } from '@/components/common'
|
|
|
-import { fetchGetMoments } from '@/api'
|
|
|
-import { ref } from 'vue'
|
|
|
+import { fetchGetMoments, fetchChatRoles } from '@/api'
|
|
|
+import { useWindowScroll, useElementVisibility, useElementBounding, useWindowSize, useScroll } from '@vueuse/core'
|
|
|
+import { ref, watch, computed, nextTick } from 'vue'
|
|
|
|
|
|
const router = useRouter()
|
|
|
function goDetail(id: any) {
|
|
|
@@ -34,7 +48,7 @@ function goDetail(id: any) {
|
|
|
}
|
|
|
getMoments()
|
|
|
|
|
|
-const list = ref([])
|
|
|
+const list = ref(<any>[])
|
|
|
function getMoments() {
|
|
|
fetchGetMoments({
|
|
|
page: {
|
|
|
@@ -47,7 +61,120 @@ function getMoments() {
|
|
|
}
|
|
|
}
|
|
|
}).then((res: any) => {
|
|
|
- list.value = res.items
|
|
|
+ list.value = [...res.items, ...res.items, ...res.items]
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+getRoles()
|
|
|
+const chatRoles = ref(<any>[])
|
|
|
+function getRoles() {
|
|
|
+ fetchChatRoles(20).then((res: any) => {
|
|
|
+ chatRoles.value = [...res, ...res, ...res]
|
|
|
+ })
|
|
|
+}
|
|
|
+const target = ref([])
|
|
|
+const showList = ref(<any>[])
|
|
|
+const { y } = useWindowScroll()
|
|
|
+const { width, height } = useWindowSize()
|
|
|
+watch(y, () => {
|
|
|
+ showList.value = target.value.map((item: any) => {
|
|
|
+ return useElementBounding(item).top.value < height.value - 80
|
|
|
+ })
|
|
|
+})
|
|
|
+watch(list, () => {
|
|
|
+ nextTick(() => {
|
|
|
+ showList.value = target.value.map((item: any) => {
|
|
|
+ return useElementBounding(item).top.value < height.value - 80
|
|
|
+ })
|
|
|
+ })
|
|
|
+})
|
|
|
+
|
|
|
+const rolesListRef = ref(null)
|
|
|
+const { x: roleListX } = useScroll(rolesListRef)
|
|
|
+
|
|
|
+const rolesRef = ref([])
|
|
|
+const showRoles = ref(<any>[])
|
|
|
+watch(
|
|
|
+ chatRoles,
|
|
|
+ () => {
|
|
|
+ nextTick(() => {
|
|
|
+ showRoles.value = rolesRef.value.map(item => {
|
|
|
+ return useElementBounding(item).left.value < width.value
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+)
|
|
|
+
|
|
|
+watch(
|
|
|
+ roleListX,
|
|
|
+ () => {
|
|
|
+ nextTick(() => {
|
|
|
+ showRoles.value = rolesRef.value.map(item => {
|
|
|
+ return useElementBounding(item).left.value < width.value
|
|
|
+ })
|
|
|
+ })
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+)
|
|
|
+
|
|
|
+function goAgent(id: any) {
|
|
|
+ router.push({
|
|
|
+ name: 'agent',
|
|
|
+ query: {
|
|
|
+ id: id
|
|
|
+ }
|
|
|
})
|
|
|
}
|
|
|
</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+.moment-list {
|
|
|
+ :nth-child(n) {
|
|
|
+ &.moment-box {
|
|
|
+ transition: transform ease-in-out 0.3s;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ :nth-child(2n + 1) {
|
|
|
+ &.moment-box {
|
|
|
+ transform: translateX(200%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ :nth-child(2n) {
|
|
|
+ &.moment-box {
|
|
|
+ transform: translateX(-200%);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .moment-box {
|
|
|
+ &.moment-center {
|
|
|
+ transform: translateX(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .targe {
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: 50px;
|
|
|
+ // background-color: red;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ z-index: 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.roles {
|
|
|
+ transform: scale(0.1);
|
|
|
+ transition: transform ease-in-out 0.3s;
|
|
|
+
|
|
|
+ &.roles-show {
|
|
|
+ transform: scale(1);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.roles-list {
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ height: 5px;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|