89 lines
2.1 KiB
TypeScript
89 lines
2.1 KiB
TypeScript
|
|
// src/stores/group.ts
|
||
|
|
import { defineStore } from 'pinia'
|
||
|
|
import { ref, computed } from 'vue'
|
||
|
|
import type { Group, User } from '@/types'
|
||
|
|
import { getUserGroups, getGroup, getGroupMembers } from '@/api/groups'
|
||
|
|
|
||
|
|
export const useGroupStore = defineStore('group', () => {
|
||
|
|
// 状态
|
||
|
|
const groups = ref<Group[]>([])
|
||
|
|
const currentGroup = ref<Group | null>(null)
|
||
|
|
const currentMembers = ref<User[]>([])
|
||
|
|
const loading = ref(false)
|
||
|
|
|
||
|
|
// 计算属性
|
||
|
|
const currentGroupId = computed(() => currentGroup.value?.id || '')
|
||
|
|
const isGroupOwner = computed(() => {
|
||
|
|
const userId = localStorage.getItem('userId')
|
||
|
|
return currentGroup.value?.owner === userId
|
||
|
|
})
|
||
|
|
|
||
|
|
// 加载用户的群组列表
|
||
|
|
async function loadGroups() {
|
||
|
|
try {
|
||
|
|
loading.value = true
|
||
|
|
groups.value = await getUserGroups()
|
||
|
|
} catch (error) {
|
||
|
|
console.error('加载群组列表失败:', error)
|
||
|
|
} finally {
|
||
|
|
loading.value = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 设置当前群组
|
||
|
|
async function setCurrentGroup(groupId: string) {
|
||
|
|
try {
|
||
|
|
loading.value = true
|
||
|
|
currentGroup.value = await getGroup(groupId)
|
||
|
|
currentMembers.value = await getGroupMembers(groupId) as unknown as User[]
|
||
|
|
} catch (error) {
|
||
|
|
console.error('加载群组详情失败:', error)
|
||
|
|
throw error
|
||
|
|
} finally {
|
||
|
|
loading.value = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 清除当前群组
|
||
|
|
function clearCurrentGroup() {
|
||
|
|
currentGroup.value = null
|
||
|
|
currentMembers.value = []
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新群组成员列表
|
||
|
|
function updateMembers(members: User[]) {
|
||
|
|
currentMembers.value = members
|
||
|
|
}
|
||
|
|
|
||
|
|
// 添加群组到列表
|
||
|
|
function addGroup(group: Group) {
|
||
|
|
groups.value.push(group)
|
||
|
|
}
|
||
|
|
|
||
|
|
// 从列表中移除群组
|
||
|
|
function removeGroup(groupId: string) {
|
||
|
|
const index = groups.value.findIndex(g => g.id === groupId)
|
||
|
|
if (index !== -1) {
|
||
|
|
groups.value.splice(index, 1)
|
||
|
|
}
|
||
|
|
if (currentGroup.value?.id === groupId) {
|
||
|
|
clearCurrentGroup()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
groups,
|
||
|
|
currentGroup,
|
||
|
|
currentMembers,
|
||
|
|
loading,
|
||
|
|
currentGroupId,
|
||
|
|
isGroupOwner,
|
||
|
|
loadGroups,
|
||
|
|
setCurrentGroup,
|
||
|
|
clearCurrentGroup,
|
||
|
|
updateMembers,
|
||
|
|
addGroup,
|
||
|
|
removeGroup
|
||
|
|
}
|
||
|
|
})
|