/** * 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 { ArrowRight, Bell, CheckCircle2, MailCheck, Sparkles } from "lucide-react"; // plane imports import { ROLE_DETAILS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // types import { Button } from "@plane/propel/button"; import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IWorkspaceMemberInvitation } from "@plane/types"; import { truncateText } from "@plane/utils"; import { NodeDCStandaloneShell } from "@/components/nodedc/standalone-shell"; import { WorkspaceLogo } from "@/components/workspace/logo"; import { USER_WORKSPACES_LIST } from "@/constants/fetch-keys"; // hooks import { useWorkspaceNotifications } from "@/hooks/store/notifications"; 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, workspaces } = useWorkspace(); const { unreadNotificationsCount, getUnreadNotificationsCount } = useWorkspaceNotifications(); const { data: invitations } = useSWR("USER_WORKSPACE_INVITATIONS", () => workspaceService.userWorkspaceInvitations()); useSWR(USER_WORKSPACES_LIST, () => fetchWorkspaces()); const fallbackWorkspaceSlug = Object.values(workspaces ?? {})?.[0]?.slug; useSWR( fallbackWorkspaceSlug ? ["STANDALONE_UNREAD_NOTIFICATION_COUNT", fallbackWorkspaceSlug] : null, fallbackWorkspaceSlug ? () => getUnreadNotificationsCount(fallbackWorkspaceSlug) : null ); const notificationsCount = unreadNotificationsCount.mention_unread_notifications_count > 0 ? unreadNotificationsCount.mention_unread_notifications_count : unreadNotificationsCount.total_unread_notifications_count || invitations?.length || 0; const redirectWorkspaceSlug = // currentUserSettings?.workspace?.last_workspace_slug || // currentUserSettings?.workspace?.fallback_workspace_slug || ""; const hasInvitations = !!invitations && invitations.length > 0; 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 = async () => { if (invitationsRespond.length === 0) { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("please_select_at_least_one_invitation"), }); return; } setIsJoiningWorkspaces(true); try { await workspaceService.joinWorkspaces({ invitations: invitationsRespond }); void mutate(USER_WORKSPACES_LIST); const firstInviteId = invitationsRespond[0]; const redirectWorkspace = invitations?.find((i) => i.id === firstInviteId)?.workspace; await updateUserProfile({ last_workspace_id: redirectWorkspace?.id }); await fetchWorkspaces(); router.push(redirectWorkspace?.slug ? `/${redirectWorkspace.slug}` : "/"); } catch { setToast({ type: TOAST_TYPE.ERROR, title: t("error"), message: t("something_went_wrong_please_try_again"), }); } finally { setIsJoiningWorkspaces(false); } }; const openNotifications = () => { if (fallbackWorkspaceSlug) { router.push(`/${fallbackWorkspaceSlug}?workspaceNotifications=open`); return; } router.push("/invitations"); }; return ( {invitations ? ( hasInvitations ? (
Новые приглашения

Принять доступ

Выберите рабочие пространства, к которым хотите присоединиться. После принятия Tasker откроет первый выбранный workspace.

{invitations.map((invitation) => { const isSelected = invitationsRespond.includes(invitation.id); return ( ); })}
) : (

Нет ожидающих приглашений

Когда вас пригласят в workspace, здесь появится карточка доступа с возможностью принять приглашение.

) ) : null} ); } export default observer(UserInvitationsPage);