feat(server): delay subscription after invitation accepted or approved (#11992)

This commit is contained in:
liuyi
2025-04-30 14:27:47 +08:00
committed by GitHub
parent 9a721c65b5
commit 2e1bed061e
49 changed files with 1990 additions and 2694 deletions

View File

@@ -206,7 +206,7 @@ export const CloudWorkspaceMembersPanel = ({
setIsMutating(false);
return;
}
const results = await membersService.inviteMembers(uniqueEmails, true);
const results = await membersService.inviteMembers(uniqueEmails);
const unSuccessInvites = results.reduce<string[]>((acc, result) => {
if (!result.sentSuccess) {
acc.push(result.email);

View File

@@ -256,12 +256,14 @@ const MemberItem = ({
const getMemberStatus = (member: Member): I18nString => {
switch (member.status) {
case WorkspaceMemberStatus.NeedMoreSeat:
case WorkspaceMemberStatus.NeedMoreSeatAndReview:
return 'insufficient-team-seat';
case WorkspaceMemberStatus.Pending:
return 'Pending';
case WorkspaceMemberStatus.NeedMoreSeatAndReview:
case WorkspaceMemberStatus.UnderReview:
return 'Under-Review';
case WorkspaceMemberStatus.AllocatingSeat:
return 'Allocating Seat';
case WorkspaceMemberStatus.Accepted:
switch (member.permission) {
case Permission.Owner:

View File

@@ -63,8 +63,7 @@ export class InvitationService extends Service {
}
return await this.acceptInviteStore.acceptInvite(
this.inviteInfo$.value.workspace.id,
inviteId,
true
inviteId
);
}

View File

@@ -11,7 +11,6 @@ export class AcceptInviteStore extends Store {
async acceptInvite(
workspaceId: string,
inviteId: string,
sendAcceptMail?: boolean,
signal?: AbortSignal
) {
const data = await this.gqlService.gql({
@@ -20,7 +19,6 @@ export class AcceptInviteStore extends Store {
variables: {
workspaceId,
inviteId,
sendAcceptMail,
},
context: { signal },
});

View File

@@ -18,19 +18,10 @@ export class WorkspaceMembersService extends Service {
members = this.framework.createEntity(WorkspaceMembers);
async inviteMember(email: string, sendInviteMail?: boolean) {
return await this.store.inviteMember(
this.workspaceService.workspace.id,
email,
sendInviteMail
);
}
async inviteMembers(emails: string[], sendInviteMail?: boolean) {
async inviteMembers(emails: string[]) {
return await this.store.inviteBatch(
this.workspaceService.workspace.id,
emails,
sendInviteMail
emails
);
}

View File

@@ -3,7 +3,6 @@ import {
createInviteLinkMutation,
getMembersByWorkspaceIdQuery,
grantWorkspaceTeamMemberMutation,
inviteByEmailMutation,
inviteByEmailsMutation,
type Permission,
revokeInviteLinkMutation,
@@ -43,30 +42,7 @@ export class WorkspaceMembersStore extends Store {
return data.workspace;
}
async inviteMember(
workspaceId: string,
email: string,
sendInviteMail = false
) {
if (!this.workspaceServerService.server) {
throw new Error('No Server');
}
const invite = await this.workspaceServerService.server.gql({
query: inviteByEmailMutation,
variables: {
workspaceId,
email,
sendInviteMail,
},
});
return invite.invite;
}
async inviteBatch(
workspaceId: string,
emails: string[],
sendInviteMail = false
) {
async inviteBatch(workspaceId: string, emails: string[]) {
if (!this.workspaceServerService.server) {
throw new Error('No Server');
}
@@ -75,10 +51,9 @@ export class WorkspaceMembersStore extends Store {
variables: {
workspaceId,
emails,
sendInviteMail,
},
});
return inviteBatch.inviteBatch;
return inviteBatch.inviteMembers;
}
async generateInviteLink(
@@ -128,7 +103,7 @@ export class WorkspaceMembersStore extends Store {
},
context: { signal },
});
return revoke.revoke;
return revoke.revokeMember;
}
async approveMember(workspaceId: string, userId: string) {

View File

@@ -373,6 +373,10 @@ export function useAFFiNEI18N(): {
* `Need More Seats`
*/
["Need-More-Seats"](): string;
/**
* `Allocating Seat`
*/
["Allocating Seat"](): string;
/**
* `Admin`
*/
@@ -8078,6 +8082,20 @@ export function useAFFiNEI18N(): {
* `Can not batch grant doc owner permissions.`
*/
["error.CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS"](): string;
/**
* `Can not set a non-active member as owner.`
*/
["error.NEW_OWNER_IS_NOT_ACTIVE_MEMBER"](): string;
/**
* `Invalid invitation provided.`
*/
["error.INVALID_INVITATION"](): string;
/**
* `No more seat available in the Space {{spaceId}}.`
*/
["error.NO_MORE_SEAT"](options: {
readonly spaceId: string;
}): string;
/**
* `Unsupported subscription plan: {{plan}}.`
*/

View File

@@ -83,6 +83,7 @@
"Collaborator": "Collaborator",
"Under-Review": "Under Review",
"Need-More-Seats": "Need More Seats",
"Allocating Seat": "Allocating Seat",
"Admin": "Admin",
"Publish": "Publish",
"Published to Web": "Published to web",
@@ -2005,6 +2006,9 @@
"error.ACTION_FORBIDDEN_ON_NON_TEAM_WORKSPACE": "A Team workspace is required to perform this action.",
"error.DOC_DEFAULT_ROLE_CAN_NOT_BE_OWNER": "Doc default role can not be owner.",
"error.CAN_NOT_BATCH_GRANT_DOC_OWNER_PERMISSIONS": "Can not batch grant doc owner permissions.",
"error.NEW_OWNER_IS_NOT_ACTIVE_MEMBER": "Can not set a non-active member as owner.",
"error.INVALID_INVITATION": "Invalid invitation provided.",
"error.NO_MORE_SEAT": "No more seat available in the Space {{spaceId}}.",
"error.UNSUPPORTED_SUBSCRIPTION_PLAN": "Unsupported subscription plan: {{plan}}.",
"error.FAILED_TO_CHECKOUT": "Failed to create checkout session.",
"error.INVALID_CHECKOUT_PARAMETERS": "Invalid checkout parameters provided.",