diff --git a/frontend/appflowy_flutter/lib/user/application/user_service.dart b/frontend/appflowy_flutter/lib/user/application/user_service.dart index 9b0dbb2d90..5eeaacdc77 100644 --- a/frontend/appflowy_flutter/lib/user/application/user_service.dart +++ b/frontend/appflowy_flutter/lib/user/application/user_service.dart @@ -177,6 +177,20 @@ class UserBackendService { return UserEventAddWorkspaceMember(data).send(); } + Future> inviteWorkspaceMember( + String workspaceId, + String email, { + AFRolePB? role, + }) async { + final data = WorkspaceMemberInvitationPB() + ..workspaceId = workspaceId + ..inviteeEmail = email; + if (role != null) { + data.role = role; + } + return UserEventInviteWorkspaceMember(data).send(); + } + Future> removeWorkspaceMember( String workspaceId, String email, diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_bloc.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_bloc.dart index 6b148b8f2b..7b9dc4354b 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_bloc.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_bloc.dart @@ -91,6 +91,21 @@ class WorkspaceMemberBloc add(const WorkspaceMemberEvent.getWorkspaceMembers()); }); }, + inviteWorkspaceMember: (email) async { + final result = await _userBackendService.inviteWorkspaceMember( + _workspaceId, + email, + role: AFRolePB.Member, + ); + emit( + state.copyWith( + actionResult: WorkspaceMemberActionResult( + actionType: WorkspaceMemberActionType.invite, + result: result, + ), + ), + ); + }, removeWorkspaceMember: (email) async { final result = await _userBackendService.removeWorkspaceMember( _workspaceId, @@ -186,6 +201,8 @@ class WorkspaceMemberEvent with _$WorkspaceMemberEvent { GetWorkspaceMembers; const factory WorkspaceMemberEvent.addWorkspaceMember(String email) = AddWorkspaceMember; + const factory WorkspaceMemberEvent.inviteWorkspaceMember(String email) = + InviteWorkspaceMember; const factory WorkspaceMemberEvent.removeWorkspaceMember(String email) = RemoveWorkspaceMember; const factory WorkspaceMemberEvent.updateWorkspaceMember( @@ -197,6 +214,9 @@ class WorkspaceMemberEvent with _$WorkspaceMemberEvent { enum WorkspaceMemberActionType { none, get, + // this event will send an invitation to the member + invite, + // this event will add the member without sending an invitation add, remove, updateRole, diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_page.dart b/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_page.dart index f44cd67e67..55316d2305 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_page.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/settings/widgets/members/workspace_member_page.dart @@ -75,6 +75,7 @@ class WorkspaceMembersPage extends StatelessWidget { ); }, (f) { + Log.error('add workspace member failed: $f'); final message = f.code == ErrorCode.WorkspaceMemberLimitExceeded ? LocaleKeys.settings_appearance_members_memberLimitExceeded.tr() : LocaleKeys.settings_appearance_members_failedToAddMember.tr(); @@ -84,6 +85,26 @@ class WorkspaceMembersPage extends StatelessWidget { ); }, ); + } else if (actionType == WorkspaceMemberActionType.invite) { + result.fold( + (s) { + showSnackBarMessage( + context, + LocaleKeys.settings_appearance_members_inviteMemberSuccess.tr(), + ); + }, + (f) { + Log.error('invite workspace member failed: $f'); + final message = f.code == ErrorCode.WorkspaceMemberLimitExceeded + ? LocaleKeys.settings_appearance_members_memberLimitExceeded.tr() + : LocaleKeys.settings_appearance_members_failedToInviteMember + .tr(); + showDialog( + context: context, + builder: (context) => NavigatorOkCancelDialog(message: message), + ); + }, + ); } result.onFailure((f) { @@ -193,7 +214,7 @@ class _InviteMemberState extends State<_InviteMember> { } context .read() - .add(WorkspaceMemberEvent.addWorkspaceMember(email)); + .add(WorkspaceMemberEvent.inviteWorkspaceMember(email)); } } diff --git a/frontend/resources/translations/en.json b/frontend/resources/translations/en.json index 318908b76c..2d3eb6038a 100644 --- a/frontend/resources/translations/en.json +++ b/frontend/resources/translations/en.json @@ -500,7 +500,9 @@ "failedToAddMember": "Failed to add member", "addMemberSuccess": "Member added successfully", "removeMember": "Remove Member", - "areYouSureToRemoveMember": "Are you sure you want to remove this member?" + "areYouSureToRemoveMember": "Are you sure you want to remove this member?", + "inviteMemberSuccess": "The invitation has been sent successfully", + "failedToInviteMember": "Failed to invite member" } }, "files": {