wujingjing
2024-06-28 96d13ee431fef2fb5eaba05654cd7e0216ce36ab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<template>
    <div class="w100 h100 flex items-center flex-column box-border pr-1">
        <div class="w100 box-border px-[18px] py-0 flex-0">
            <el-button
                @click="newChatRoomClick"
                icon="ele-Plus"
                color="#1c86ff"
                class="flex items-center box-border mb-3 justify-center add_room cursor-pointer w-[124px] h-[32.88px] rounded-s-md text-white opacity-100"
            >
                新建聊天室
            </el-button>
        </div>
        <div
            class="flex flex-col flex-auto w-[210.98px] rounded-t-lg box-border mb-3 relative opacity-100 shadow-lg shadow-[[#0e0e0f]-500/50"
        >
            <div class="flex-0 relative w100 h-[34px] bg-[#2b2c30]">
                <el-input v-model="state.searchInput" placeholder="搜索" class="set-input">
                    <template #prefix>
                        <el-icon @click="selectDateChange"><search /></el-icon>
                    </template>
                </el-input>
            </div>
            <div class="absolute top-[100%] w-[84px] z-[1001] left-0" v-show="state.isShowDate">
                <div class="w100 bg-[#fff] px-[0px] py-[5px]" v-for="item in state.selectDateOption" :key="item.value">
                    <div class="w100 relative h-[28px] flex items-center justify-center cursor-pointer">{{ item.label }}</div>
                </div>
            </div>
 
            <div class="flex-auto text-[#ccc] flex flex-col items-center mt-6 overflow-y-auto" ref="chatRoomRef">
                <div
                    :class="{ 'bg-[#41424a]': item.id === activeRoomId }"
                    class="group flex items-center w-full h-10 rounded-md cursor-pointer px-2 py-2 flex-0"
                    v-for="(item, index) in chatRoomList"
                    :key="index"
                    @click="roomClick(item)"
                >
                    <div class="ywicon icon-xiaoxi flex-0 mr-2.5"></div>
                    <div class="flex-auto text-ellipsis text-nowrap text-sm group-hover:text-[#0084ff]">chat room</div>
                    <div class="text-gray-100 flex items-center space-x-2 ml-1">
                        <div class="ywicon invisible icon-bianji visible group-hover:visible !text-sm"></div>
 
                        <el-popconfirm title="确定删除这个聊天室?" @confirm.stop="confirmDeleteChatRoom(item)">
                            <template #reference>
                                <div class="ywicon invisible icon-shanchu3 visible group-hover:visible"></div>
                            </template>
                        </el-popconfirm>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>
 
<script setup lang="ts">
import { Search } from '@element-plus/icons-vue';
import { nextTick, onMounted, reactive, ref } from 'vue';
import type { ChatRoomItem } from './types';
import router from '/@/router';
import { activeRoomId, chatRoomList } from '/@/stores/chatRoom';
let state = reactive({
    searchInput: '',
    selectDateOption: [
        {
            label: '全部',
            value: 0,
        },
        {
            label: '一周内',
            value: 1,
        },
        {
            label: '一月内',
            value: 2,
        },
        {
            label: '一月前',
            value: 3,
        },
    ],
    isShowDate: false,
});
 
const chatRoomRef = ref<HTMLDivElement>(null);
 
const selectDateChange = () => {
    state.isShowDate = !state.isShowDate;
};
 
const gotoAnswerPage = (room: ChatRoomItem) => {
    if (room.isInitial) {
        router.push({
            name: 'Home',
        });
    } else {
        router.push({
            name: 'AskAnswer',
            query: {
                id: room.id,
            },
        });
    }
};
 
const newChatRoomClick = () => {
    const newRoom = {
        id: new Date().getTime() + '' + Math.floor(Math.random() * 1000),
        isInitial: true,
        title: 'chat room',
    };
    if (!chatRoomList.value) {
        chatRoomList.value = [newRoom];
    } else {
        chatRoomList.value.unshift(newRoom);
    }
    activeRoomId.value = newRoom.id;
    nextTick(() => {
        gotoAnswerPage(newRoom);
    });
};
 
const roomClick = (room: ChatRoomItem) => {
    activeRoomId.value = room.id;
    gotoAnswerPage(room);
};
 
const confirmDeleteChatRoom = (room: ChatRoomItem) => {
    const foundIndex = chatRoomList.value.findIndex((item) => item === room);
    chatRoomList.value.splice(foundIndex, 1);
    if (chatRoomList.value.length === 0) {
        newChatRoomClick();
        return;
    }
    roomClick(chatRoomList.value[0]);
    chatRoomRef.value.firstElementChild?.scrollIntoView();
};
 
onMounted(() => {
    if (router.currentRoute.value.name === 'Home') {
        if (!chatRoomList.value || chatRoomList.value.length === 0) {
            newChatRoomClick();
        } else {
            roomClick(chatRoomList.value[0]);
        }
    }
});
</script>
<style scoped lang="scss">
.set-input {
    :deep(.el-input__wrapper) {
        width: 100%;
        height: 100%;
        font-size: 12px;
        font-weight: 400;
        letter-spacing: 0;
        color: #e5e5e5;
        border-radius: 6px;
        border: 1px solid transparent;
        box-sizing: border-box;
        line-height: 34px;
        // padding-left: 31px;
        padding-right: 10px;
        background-color: transparent;
        cursor: pointer;
        transition: color 0.2s ease-in-out;
        box-shadow: unset;
    }
}
</style>