fix: rewrite backend hooks, fix invitation flow, align frontend API, fix component naming
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
// src/api/invitations.ts
|
||||
import pb from './pocketbase'
|
||||
import type { Invitation, InviteStatus } from '@/types'
|
||||
import { joinTeamSession } from './sessions'
|
||||
import { updateUserStatus } from './users'
|
||||
import type { Invitation } from '@/types'
|
||||
|
||||
// 发送邀请
|
||||
export async function sendInvitation(data: {
|
||||
@@ -71,35 +69,16 @@ export async function respondInvitation(
|
||||
response: 'accepted' | 'rejected',
|
||||
rejectReason?: string
|
||||
) {
|
||||
const user = pb.authStore.model
|
||||
if (!user) throw new Error('未登录')
|
||||
|
||||
const invitation = await pb.collection('invitations').getOne(invitationId)
|
||||
|
||||
if (invitation.to !== user.id) {
|
||||
throw new Error('无权操作此邀请')
|
||||
}
|
||||
|
||||
const updateData: Partial<Invitation> = {
|
||||
status: response as InviteStatus,
|
||||
respondedAt: new Date().toISOString()
|
||||
const updateData: Record<string, unknown> = {
|
||||
status: response
|
||||
}
|
||||
|
||||
if (response === 'rejected' && rejectReason) {
|
||||
updateData.rejectReason = rejectReason
|
||||
}
|
||||
|
||||
// 更新邀请状态
|
||||
// 后端 hook 会自动处理:加入 team members + 更新用户状态
|
||||
await pb.collection('invitations').update(invitationId, updateData)
|
||||
|
||||
// 如果接受,加入临时小组
|
||||
if (response === 'accepted') {
|
||||
await joinTeamSession(invitation.teamSession)
|
||||
// 更新用户状态
|
||||
await updateUserStatus('in_team')
|
||||
}
|
||||
|
||||
return updateData
|
||||
}
|
||||
|
||||
// 订阅邀请变更
|
||||
|
||||
@@ -51,17 +51,6 @@ export async function updateTeamStatus(sessionId: string, status: TeamStatus): P
|
||||
|
||||
// 结束游戏(解散临时小组)
|
||||
export async function endGame(sessionId: string) {
|
||||
const session = await pb.collection('teamSessions').getOne(sessionId)
|
||||
|
||||
// 将所有成员状态恢复为 idle
|
||||
const members = session.members as string[]
|
||||
const updatePromises = members.map(userId =>
|
||||
pb.collection('users').update(userId, { status: 'idle' })
|
||||
)
|
||||
|
||||
await Promise.all(updatePromises)
|
||||
|
||||
// 解散临时小组
|
||||
return updateTeamStatus(sessionId, 'dissolved')
|
||||
}
|
||||
|
||||
|
||||
@@ -21,12 +21,18 @@ const idleMembers = computed(() =>
|
||||
)
|
||||
|
||||
async function inviteMember(userId: string, username: string) {
|
||||
const { getActiveTeamSession } = await import('@/api/sessions')
|
||||
const session = await getActiveTeamSession()
|
||||
|
||||
if (!session) {
|
||||
ElMessage.warning('请先创建临时小组')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// 这里需要先创建临时小组,或者检查是否有活跃的临时小组
|
||||
// 简化版本:发送邀请
|
||||
await sendInvitation({
|
||||
to: userId,
|
||||
teamSession: '' // 实际使用时需要先创建临时小组
|
||||
teamSession: session.id
|
||||
})
|
||||
ElMessage.success(`已邀请 ${username}`)
|
||||
} catch (error: any) {
|
||||
|
||||
@@ -57,7 +57,7 @@ async function refreshMembers() {
|
||||
|
||||
<!-- 主内容区 -->
|
||||
<main class="main-content">
|
||||
<idle-membersList status="idle" />
|
||||
<IdleMembersList status="idle" />
|
||||
</main>
|
||||
|
||||
<!-- 右侧边栏 -->
|
||||
@@ -70,7 +70,7 @@ async function refreshMembers() {
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<idle-membersList />
|
||||
<IdleMembersList />
|
||||
</el-card>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
@@ -110,7 +110,7 @@ function selectGroup(groupId: string) {
|
||||
<h3>空闲成员</h3>
|
||||
</template>
|
||||
|
||||
<idle-membersList />
|
||||
<IdleMembersList />
|
||||
</el-card>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user