/** * Copyright (c) 2023-present Plane Software, Inc. and contributors * SPDX-License-Identifier: AGPL-3.0-only * See the LICENSE file for details. */ import { useState } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; import useSWR, { mutate } from "swr"; import { CheckCircle2 } from "lucide-react"; // plane imports import { ROLE } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import { Button } from "@plane/propel/button"; import { PlaneLogo } from "@plane/propel/icons"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IWorkspaceMemberInvitation } from "@plane/types"; import { truncateText } from "@plane/utils"; // assets import emptyInvitation from "@/app/assets/empty-state/invitation.svg?url"; // components import { EmptyState } from "@/components/common/empty-state"; import { WorkspaceLogo } from "@/components/workspace/logo"; import { USER_WORKSPACES_LIST } from "@/constants/fetch-keys"; // hooks import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserProfile } from "@/hooks/store/user"; import { useAppRouter } from "@/hooks/use-app-router"; // services import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; // plane web services import { WorkspaceService } from "@/services/workspace.service"; const workspaceService = new WorkspaceService(); function UserInvitationsPage() { // states const [invitationsRespond, setInvitationsRespond] = useState([]); const [isJoiningWorkspaces, setIsJoiningWorkspaces] = useState(false); // router const router = useAppRouter(); // store hooks const { t } = useTranslation(); const { data: currentUser } = useUser(); const { updateUserProfile } = useUserProfile(); const { fetchWorkspaces } = useWorkspace(); const { data: invitations } = useSWR("USER_WORKSPACE_INVITATIONS", () => workspaceService.userWorkspaceInvitations()); const redirectWorkspaceSlug = // currentUserSettings?.workspace?.last_workspace_slug || // currentUserSettings?.workspace?.fallback_workspace_slug || ""; const handleInvitation = (workspace_invitation: IWorkspaceMemberInvitation, action: "accepted" | "withdraw") => { if (action === "accepted") { setInvitationsRespond((prevData) => [...prevData, workspace_invitation.id]); } else if (action === "withdraw") { setInvitationsRespond((prevData) => prevData.filter((item: string) => item !== workspace_invitation.id)); } }; const submitInvitations = () => { if (invitationsRespond.length === 0) { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("please_select_at_least_one_invitation"), }); return; } setIsJoiningWorkspaces(true); workspaceService .joinWorkspaces({ invitations: invitationsRespond }) .then(() => { mutate(USER_WORKSPACES_LIST); const firstInviteId = invitationsRespond[0]; const redirectWorkspace = invitations?.find((i) => i.id === firstInviteId)?.workspace; updateUserProfile({ last_workspace_id: redirectWorkspace?.id }) .then(() => { setIsJoiningWorkspaces(false); fetchWorkspaces().then(() => { router.push(`/${redirectWorkspace?.slug}`); }); }) .catch(() => { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("something_went_wrong_please_try_again"), }); setIsJoiningWorkspaces(false); }); }) .catch((_err) => { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("something_went_wrong_please_try_again"), }); setIsJoiningWorkspaces(false); }); }; return (
{currentUser?.email}
{invitations ? ( invitations.length > 0 ? (
{t("we_see_that_someone_has_invited_you_to_join_a_workspace")}

{t("join_a_workspace")}

{invitations.map((invitation) => { const isSelected = invitationsRespond.includes(invitation.id); return (
handleInvitation(invitation, isSelected ? "withdraw" : "accepted")} >
{truncateText(invitation.workspace.name, 30)}

{ROLE[invitation.role]}

); })}
) : (
router.push("/"), }} />
) ) : null}
); } export default observer(UserInvitationsPage);