chat-app/src/pages/creatGroupChat/index.vue

432 lines
12 KiB
Vue
Raw Normal View History

2024-12-24 08:28:44 +00:00
<template>
<div class="outer-layer">
<div>
<tm-navbar
:hideBack="false"
hideHome
title="发起群聊"
:leftWidth="220"
></tm-navbar>
2024-12-24 08:28:44 +00:00
</div>
<div class="root">
<div class="w-full pl-[32rpx] pr-[32rpx] mb-[20rpx]">
<div class="w-full mt-[60rpx] flex justify-center">
<div v-if="groupActiveIndex === -1" class="avatar-placeholder"></div>
2024-12-24 08:28:44 +00:00
<div class="mb-[40rpx]" v-else>
<tm-image
:width="192"
:height="192"
:round="24"
2024-12-24 08:28:44 +00:00
:src="avatarImg"
></tm-image>
</div>
</div>
<div class="input-group flex items-center justify-between">
2024-12-24 08:28:44 +00:00
<div class="input-item">
群名称
</div>
<div class="input-box">
<tm-input
2025-01-08 01:18:41 +00:00
v-model="groupName"
:followTheme="false"
fontColor="#747474"
2024-12-24 08:28:44 +00:00
placeholderStyle="color: #B4B4B4"
focusColor="#FFF"
2024-12-24 08:28:44 +00:00
:fontSize="28"
:maxlength="20"
2025-01-08 01:18:41 +00:00
:height="40"
:transprent="true"
2024-12-24 08:28:44 +00:00
placeholder="请输入群名称1~20个字"
:padding="[0, 0]"
2025-01-08 01:18:41 +00:00
align="right"
></tm-input>
2024-12-24 08:28:44 +00:00
</div>
</div>
<div
class="input-group w-full flex flex-col mt-[20rpx] leading-[40rpx]"
>
<div class="flex items-center justify-between">
2025-01-08 01:18:41 +00:00
<div class="input-item">
群类型
</div>
<div @click="chooseGroupType" class="left-box">
<div class="text-[#B4B4B4] text-[28rpx] font-bold">
<span v-if="groupActiveIndex === -1">请选择群类型</span>
<span v-else-if="groupActiveIndex === 0">普通群</span>
<span v-else-if="groupActiveIndex === 1">部门群</span>
<span v-else-if="groupActiveIndex === 2">项目群</span>
2025-01-08 01:18:41 +00:00
</div>
<div class="ml-[32rpx]">
<tm-icon
:font-size="22"
color="#747474"
name="tmicon-angle-right"
></tm-icon>
2025-01-08 01:18:41 +00:00
</div>
</div>
2024-12-24 08:28:44 +00:00
</div>
<div v-if="depCheckedKeys.length" class="mt-[32rpx]">
<div
v-for="(item, index) in depCheckedKeys"
2025-01-08 01:18:41 +00:00
class="text-[#747474] text-[28rpx] leading-[40rpx] font-bold"
:class="[
index !== 0 ? 'mt-[10rpx]' : '',
depsNoExpanded && index > 4 ? 'hidden' : '',
2025-01-08 01:18:41 +00:00
]"
>
{{ item.name }}
2024-12-24 08:28:44 +00:00
</div>
<div
class="text-[#46299D] text-[28rpx] mt-[20rpx] font-bold flex justify-center"
>
<div
v-if="depCheckedKeys.length > 5"
@click="depsNoExpanded = !depsNoExpanded"
class="w-[100rpx]"
>
{{ depsNoExpanded ? '展开' : '收起' }}
2025-01-08 01:18:41 +00:00
</div>
2024-12-24 08:28:44 +00:00
</div>
</div>
</div>
<div
v-if="groupActiveIndex === 0 || groupActiveIndex === 2"
class="input-group w-full flex flex-col mt-[20rpx] leading-[40rpx]"
>
<div class="flex items-center justify-between">
2025-01-13 03:13:51 +00:00
<div class="input-item">
群成员
</div>
<div @click="chooseMembers" class="left-box">
<div class="ml-[32rpx] flex items-center">
<div
v-if="!groupAdmins.length"
class="text-[#B4B4B4] text-[28rpx] font-bold mr-[32rpx]"
>
全部({{ 0 }})
</div>
<tm-icon
:font-size="22"
color="#747474"
name="tmicon-angle-right"
></tm-icon>
2025-01-13 03:13:51 +00:00
</div>
</div>
</div>
<div v-if="groupAdmins.length" class="mt-[32rpx]">
<div
v-for="(item, index) in groupAdmins"
2025-01-13 03:13:51 +00:00
class="text-[#747474] text-[28rpx] leading-[40rpx] font-bold"
:class="[
index !== 0 ? 'mt-[10rpx]' : '',
depsNoExpanded && index > 4 ? 'hidden' : '',
2025-01-13 03:13:51 +00:00
]"
>
{{ item.name }}
</div>
<div
class="text-[#46299D] text-[28rpx] mt-[20rpx] font-bold flex justify-center"
>
<div
v-if="groupAdmins.length > 5"
@click="depsNoExpanded = !depsNoExpanded"
class="w-[100rpx]"
>
{{ depsNoExpanded ? '展开' : '收起' }}
2025-01-13 03:13:51 +00:00
</div>
</div>
</div>
</div>
<div
v-if="groupActiveIndex === 1"
class="input-group w-full flex flex-col mt-[20rpx] leading-[40rpx]"
>
<div class="flex items-center justify-between">
2025-01-08 01:18:41 +00:00
<div class="input-item">
群管理员
</div>
<div @click="chooseGroupAdmin" class="left-box">
<div class="ml-[32rpx] flex items-center">
<div
v-if="!groupAdmins.length"
class="text-[#B4B4B4] text-[28rpx] font-bold mr-[32rpx]"
>
请选择群管理员
</div>
<tm-icon
:font-size="22"
color="#747474"
name="tmicon-angle-right"
></tm-icon>
2025-01-08 01:18:41 +00:00
</div>
</div>
</div>
<div v-if="groupAdmins.length" class="mt-[32rpx]">
<div
v-for="(item, index) in groupAdmins"
2025-01-08 01:18:41 +00:00
class="text-[#747474] text-[28rpx] leading-[40rpx] font-bold"
:class="[
index !== 0 ? 'mt-[10rpx]' : '',
depsNoExpanded && index > 4 ? 'hidden' : '',
2025-01-08 01:18:41 +00:00
]"
>
{{ item.name }}
</div>
<div
class="text-[#46299D] text-[28rpx] mt-[20rpx] font-bold flex justify-center"
>
<div
v-if="groupAdmins.length > 5"
@click="depsNoExpanded = !depsNoExpanded"
class="w-[100rpx]"
>
{{ depsNoExpanded ? '展开' : '收起' }}
2025-01-08 01:18:41 +00:00
</div>
</div>
</div>
</div>
2024-12-24 08:28:44 +00:00
</div>
<div class="h-[162rpx] flex justify-center bg-[#FFFFFF]">
<div class="mt-[14rpx] btnBox">
<tm-button
2025-01-08 01:18:41 +00:00
@click="handleConfirm"
color="#46299D"
2025-01-08 01:18:41 +00:00
:disabled="confirmBtnStatus"
2024-12-24 08:28:44 +00:00
disabledColor="#E6E6E6"
:margin="[0]"
:shadow="0"
2024-12-24 08:28:44 +00:00
:width="426"
:height="76"
size="large"
2025-01-08 01:18:41 +00:00
label="发起群聊"
></tm-button>
2024-12-24 08:28:44 +00:00
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch, computed } from 'vue'
import { onShow, onLoad } from '@dcloudio/uni-app'
import { useChatList } from '@/store/chatList/index.js'
import { useAuth } from '@/store/auth'
import { useTalkStore, useUserStore } from '@/store'
import addCircle from '@/static/image/chatList/addCircle.png'
import cahtPopover from '@/static/image/chatList/cahtPopover.png'
import groupDepartment from '@/static/image/chatList/groupDepartment.png'
import groupProject from '@/static/image/chatList/groupProject.png'
import groupNormal from '@/static/image/chatList/groupNormal.png'
import { ServeCreateGroup } from '@/api/group/index'
import { useGroupTypeStore } from '@/store/groupType'
2024-12-24 08:28:44 +00:00
const {
groupName,
groupActiveIndex,
depCheckedKeys,
groupAdmins,
createDepGroup,
resetGroupInfo,
allChooseMembers,
} = useGroupTypeStore()
const talkStore = useTalkStore()
const userStore = useUserStore()
const { userInfo } = useAuth()
2024-12-24 08:28:44 +00:00
const groupChatType = ref('')
const depsNoExpanded = ref(true)
2024-12-24 08:28:44 +00:00
const avatarImg = computed(() => {
let srcT = ''
2025-01-08 01:18:41 +00:00
switch (groupActiveIndex.value) {
case 0:
srcT = groupNormal
break
2025-01-08 01:18:41 +00:00
case 1:
srcT = groupDepartment
break
2025-01-08 01:18:41 +00:00
case 2:
srcT = groupProject
break
2024-12-24 08:28:44 +00:00
default:
srcT = groupNormal
2024-12-24 08:28:44 +00:00
}
return srcT
2024-12-24 08:28:44 +00:00
})
const chooseGroupType = () => {
uni.navigateTo({
url: '/pages/chooseGroupType/index',
2024-12-24 08:28:44 +00:00
})
}
2025-01-08 01:18:41 +00:00
const chooseGroupAdmin = () => {
uni.navigateTo({
url: '/pages/chooseGroupAdmin/index',
2025-01-08 01:18:41 +00:00
})
}
2025-01-13 03:13:51 +00:00
const chooseMembers = () => {
uni.navigateTo({
url: '/pages/chooseMembers/index',
2025-01-13 03:13:51 +00:00
})
}
2025-01-08 01:18:41 +00:00
const handleConfirm = async () => {
console.log(allChooseMembers.value)
let erp_ids = ''
if (allChooseMembers?.value?.length > 0) {
allChooseMembers?.value?.forEach((ele) => {
if (!erp_ids) {
erp_ids = ele.ID
} else {
erp_ids += ',' + ele.ID
}
})
}
2025-01-08 01:18:41 +00:00
if (groupActiveIndex.value === 0) {
//普通群
let params = {
avatar: '',
name: groupName.value,
erp_ids: erp_ids,
type: 1,
profile: '',
}
console.log(params)
const res = await ServeCreateGroup(params)
if (res.code === 200) {
resetGroupInfo()
uni.navigateBack()
}
} else if (groupActiveIndex.value === 1) {
//部门群
2025-01-08 01:18:41 +00:00
const res = await createDepGroup()
if (res.code === 200) {
resetGroupInfo()
uni.navigateBack()
}
} else if (groupActiveIndex.value === 2) {
//项目群
let params = {
avatar: '',
name: groupName.value,
erp_ids: erp_ids,
type: 3,
profile: '',
}
console.log(params)
const res = await ServeCreateGroup(params)
if (res.code === 200) {
resetGroupInfo()
uni.navigateBack()
}
} else {
2025-01-08 01:18:41 +00:00
}
}
const confirmBtnStatus = computed(() => {
let disabledT = false
console.log(groupActiveIndex.value !== -1)
if (
groupName.value === '' ||
(groupActiveIndex.value && groupActiveIndex.value === -1) ||
(!groupActiveIndex.value && groupActiveIndex.value !== 0)
) {
return true
2025-01-08 01:18:41 +00:00
}
switch (groupActiveIndex.value) {
case 0:
if (allChooseMembers?.value?.length < 3) {
return true
}
break
2025-01-08 01:18:41 +00:00
case 1:
if (!depCheckedKeys.value.length) {
disabledT = true
2025-01-08 01:18:41 +00:00
}
if (!groupAdmins.value.length) {
disabledT = true
2025-01-08 01:18:41 +00:00
}
break
2025-01-08 01:18:41 +00:00
case 2:
if (allChooseMembers?.value?.length < 3) {
return true
}
break
2025-01-08 01:18:41 +00:00
default:
break
2025-01-08 01:18:41 +00:00
}
return disabledT
})
onShow(() => {
depsNoExpanded.value = true
2025-01-08 01:18:41 +00:00
})
2024-12-24 08:28:44 +00:00
</script>
<style scoped lang="scss">
uni-page-body,
page {
height: 100%;
}
.outer-layer {
overflow-y: auto;
flex: 1;
background-image: url('@/static/image/clockIn/z3280@3x.png');
2024-12-24 08:28:44 +00:00
background-size: cover;
padding-bottom: 0;
display: flex;
flex-direction: column;
}
.root {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.divider {
2024-12-24 08:28:44 +00:00
height: 1rpx;
background-color: #7c7c7c;
2024-12-24 08:28:44 +00:00
opacity: 0.6;
}
.avatar-placeholder {
width: 192rpx;
height: 192rpx;
background-color: #e0e0e0;
border-radius: 50%;
margin-bottom: 40rpx;
}
.input-group {
background-color: #fff;
2025-01-08 01:18:41 +00:00
padding-top: 38rpx;
padding-bottom: 32rpx;
2024-12-24 08:28:44 +00:00
padding-left: 32rpx;
padding-right: 40rpx;
2025-01-08 01:18:41 +00:00
// display: flex;
// align-items: center;
// justify-content: space-between;
2024-12-24 08:28:44 +00:00
}
.input-item {
2025-01-08 01:18:41 +00:00
line-height: 40rpx;
2024-12-24 08:28:44 +00:00
font-size: 28rpx;
color: #000;
font-weight: bold;
}
.input-box {
margin-left: 84rpx;
2025-01-08 01:18:41 +00:00
line-height: 40rpx;
2024-12-24 08:28:44 +00:00
width: 404rpx;
2025-01-13 03:13:51 +00:00
font-weight: bold;
2024-12-24 08:28:44 +00:00
}
.left-box {
display: flex;
align-items: center;
}
2025-01-08 01:18:41 +00:00
.btnBox {
:deep(uni-button[disabled='true']) {
2025-01-08 01:18:41 +00:00
color: #bebebe !important;
}
}
2024-12-24 08:28:44 +00:00
</style>