feat: onboarding optimization, invite links, admin roles, and event board

- Home: hide duplicate create/join buttons when user has no groups
- Invite links: /join/group/:id and /join/team/:id pages for one-click joining
- Admin: group admins field, ownership transfer, member management toggle
- Events: new events collection with RSVP (going/interested/maybe) and comments

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wjl
2026-04-21 17:27:24 +08:00
parent 0cde794c85
commit 2fec2108ca
19 changed files with 2644 additions and 21 deletions
+70
View File
@@ -189,6 +189,76 @@ export function subscribeGroup(groupId: string, callback: (group: Group) => void
})
}
// 转让群主
export async function transferGroupOwnership(groupId: string, newOwnerId: string) {
const user = pb.authStore.model
if (!user) throw new Error('未登录')
const group = await pb.collection('groups').getOne(groupId)
if (group.owner !== user.id) {
throw new Error('只有群主可以转让群组')
}
const admins = (group.admins as string[]) || []
// 将原群主加入 admins,新群主从 admins 中移除
const newAdmins = [...new Set([...admins, user.id])].filter(id => id !== newOwnerId)
return pb.collection('groups').update(groupId, {
owner: newOwnerId,
admins: newAdmins
})
}
// 添加管理员
export async function addGroupAdmin(groupId: string, userId: string) {
const user = pb.authStore.model
if (!user) throw new Error('未登录')
const group = await pb.collection('groups').getOne(groupId)
if (group.owner !== user.id) {
throw new Error('只有群主可以设置管理员')
}
const admins = (group.admins as string[]) || []
if (admins.includes(userId)) {
throw new Error('该用户已是管理员')
}
return pb.collection('groups').update(groupId, {
admins: [...admins, userId]
})
}
// 移除管理员
export async function removeGroupAdmin(groupId: string, userId: string) {
const user = pb.authStore.model
if (!user) throw new Error('未登录')
const group = await pb.collection('groups').getOne(groupId)
if (group.owner !== user.id) {
throw new Error('只有群主可以移除管理员')
}
const admins = (group.admins as string[]) || []
return pb.collection('groups').update(groupId, {
admins: admins.filter(id => id !== userId)
})
}
// 更新全员管理设置
export async function updateGroupMemberManage(groupId: string, allow: boolean) {
const user = pb.authStore.model
if (!user) throw new Error('未登录')
const group = await pb.collection('groups').getOne(groupId)
if (group.owner !== user.id) {
throw new Error('只有群主可以修改此设置')
}
return pb.collection('groups').update(groupId, { allowMemberManage: allow })
}
// 订阅加入申请变更
export function subscribeJoinRequests(groupId: string, callback: (request: JoinRequest) => void) {
return pb.collection('join_requests').subscribe('*', (payload) => {