chat-pc/src/components/group/GroupNotice.vue
2024-12-24 16:14:21 +08:00

187 lines
3.6 KiB
Vue

<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { Up, Down, Close } from '@icon-park/vue-next'
import Loading from '@/components/base/Loading.vue'
import { ServeGetGroupNotices } from '@/api/group'
const emit = defineEmits(['close'])
const props = defineProps({
groupId: {
type: Number,
default: 0
}
})
const title = ref('群公告')
const loading = ref(false)
const items = ref<any[]>([])
const onClose = () => {
emit('close')
}
const onLoadData = () => {
loading.value = true
ServeGetGroupNotices({
group_id: props.groupId
}).then((res) => {
if (res.code == 200) {
let list = res.data.items || []
list.forEach((item: any) => {
item.is_show = false
})
items.value = list
title.value = `群公告(${items.value.length})`
}
loading.value = false
})
}
onMounted(() => {
onLoadData()
})
</script>
<template>
<section class="el-container is-vertical">
<header class="el-header bdr-b">
<div class="center-text">
<span>{{ title }}</span>
</div>
<div class="right-icon">
<n-icon size="21" :component="Close" @click="onClose" />
</div>
</header>
<main class="el-main me-scrollbar me-scrollbar-thumb">
<div v-if="loading" class="flex-box flex-center">
<Loading />
</div>
<div v-else-if="items.length === 0" class="flex-box flex-center">
<n-empty size="200" description="暂无相关数据">
<template #icon>
<img src="@/assets/image/no-data.svg" alt="" />
</template>
</n-empty>
</div>
<div v-for="item in items" :key="item.id" class="items">
<div class="title text-ellipsis">
{{ item.title }}
</div>
<div class="describe">
<n-avatar round :size="15" :src="item.avatar" />
<span class="nickname text-ellipsis">{{ item.nickname }}</span>
<span class="datetime">发表于 {{ item.created_at }}</span>
<span class="btn" @click="item.is_show = !item.is_show">
<n-icon :size="18" :component="item.is_show ? Up : Down" />
{{ item.is_show ? '收起' : '展开' }}
</span>
</div>
<div class="detail" v-show="item.is_show">
{{ item.content }}
</div>
</div>
</main>
</section>
</template>
<style lang="less" scoped>
.el-header {
width: 100%;
height: 60px;
display: flex;
align-items: center;
justify-content: center;
padding-left: 15px;
> div {
display: flex;
align-items: center;
justify-content: center;
}
.center-text {
flex: auto;
font-weight: 500;
font-size: 16px;
justify-content: flex-start;
}
.left-icon,
.right-icon {
width: 50px;
height: 100%;
flex-shrink: 0;
cursor: pointer;
}
}
.el-main {
padding: 0 15px;
.flex-box {
height: 100%;
}
}
.items {
width: 100%;
border-bottom: 1px solid var(--border-color);
box-sizing: border-box;
margin: 10px 0;
.title {
height: 30px;
line-height: 30px;
font-size: 15px;
}
.describe {
height: 30px;
line-height: 30px;
margin-top: 5px;
display: flex;
align-items: center;
position: relative;
.datetime {
margin-left: 10px;
font-size: 12px;
color: #a59696;
font-weight: 300;
}
.btn {
position: absolute;
right: 0;
bottom: 0;
cursor: pointer;
user-select: none;
display: flex;
align-items: center;
font-size: 13px;
}
}
.detail {
min-height: 30px;
width: 100%;
margin: 15px 0;
font-size: 13px;
span {
color: #887f7f;
}
}
}
</style>