From f5b71b076ec59a764075f7e3acf25308b68952bc Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Mon, 16 Jan 2023 23:03:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=B7=B2=E5=8A=A0=E5=85=A5=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=B7=B2=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=88=99=E4=BC=9A=E5=8F=91=E8=B5=B7=E8=AF=B7=E6=B1=82=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=98=AF=E5=90=A6=E4=B8=BA=E7=BE=A4=E7=BB=84=E6=88=90?= =?UTF-8?q?=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/shared/model/group.ts | 12 +++++ client/web/src/routes/Invite/JoinBtn.tsx | 51 +++++++++++++++++++-- server/services/core/group/group.service.ts | 23 ++++++++++ 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/client/shared/model/group.ts b/client/shared/model/group.ts index d9a30932..118251a2 100644 --- a/client/shared/model/group.ts +++ b/client/shared/model/group.ts @@ -172,6 +172,18 @@ export async function quitGroup(groupId: string) { }); } +/** + * 检查当前用户是否是群组成员 + * @param groupId 群组ID + */ +export async function isMember(groupId: string): Promise { + const { data } = await request.post('/api/group/isMember', { + groupId, + }); + + return data; +} + /** * 更新用户所在的权限组 * @param groupId 群组ID diff --git a/client/web/src/routes/Invite/JoinBtn.tsx b/client/web/src/routes/Invite/JoinBtn.tsx index f021b1c2..daf63786 100644 --- a/client/web/src/routes/Invite/JoinBtn.tsx +++ b/client/web/src/routes/Invite/JoinBtn.tsx @@ -7,6 +7,8 @@ import { applyGroupInvite, checkTokenValid, getCachedGroupInviteInfo, + model, + showErrorToasts, t, useAsync, useAsyncRequest, @@ -36,16 +38,50 @@ export const JoinBtn: React.FC = React.memo((props) => { ); }, []); + const { value: invite } = useAsync(() => { + return getCachedGroupInviteInfo(props.inviteCode); + }, [props.inviteCode]); + + useAsync(async () => { + // 检查用户是否已经加入 + if (!isTokenValid) { + return; + } + + if (!invite) { + return; + } + + try { + const isMember = await model.group.isMember(invite.groupId); + if (isMember) { + setIsJoined(true); + } + } catch (err) {} + }, [isTokenValid, invite]); + const [{ loading: joinLoading }, handleJoinGroup] = useAsyncRequest(async () => { await applyGroupInvite(props.inviteCode); - const invite = await getCachedGroupInviteInfo(props.inviteCode); - openModal(, { + if (!invite) { + showErrorToasts(t('未找到邀请码信息')); + return; + } + openModal(, { maskClosable: false, }); setIsJoined(true); - }, [props.inviteCode]); + }, [props.inviteCode, invite]); + + const [, handleJumpToGroup] = useAsyncRequest(async () => { + if (!invite) { + showErrorToasts(t('未找到邀请码信息')); + return; + } + + navigate(`/main/group/${invite.groupId}`); + }, [navigate, invite]); if (loading) { return null; @@ -53,8 +89,13 @@ export const JoinBtn: React.FC = React.memo((props) => { if (isJoined) { return ( - ); } diff --git a/server/services/core/group/group.service.ts b/server/services/core/group/group.service.ts index de854dc7..10179af2 100644 --- a/server/services/core/group/group.service.ts +++ b/server/services/core/group/group.service.ts @@ -89,6 +89,11 @@ class GroupService extends TcService { groupId: 'string', }, }); + this.registerAction('isMember', this.isMember, { + params: { + groupId: 'string', + }, + }); this.registerAction('appendGroupMemberRoles', this.appendGroupMemberRoles, { params: { groupId: 'string', @@ -508,6 +513,24 @@ class GroupService extends TcService { } } + /** + * 检查是否为群组成员 + */ + async isMember(ctx: TcContext<{ groupId: string }>) { + const groupId = ctx.params.groupId; + const userId = ctx.meta.userId; + + const groupInfo = await call(ctx).getGroupInfo(groupId); + if (!groupInfo) { + // 没有找到群组信息 + return false; + } + + const members = groupInfo.members; + + return members.some((m) => String(m.userId) === userId); + } + /** * 追加群组成员的角色 */