import React from 'react'; import TopNavbar, { MenuItem } from 'shared/components/TopNavbar'; import { ProfileMenu } from 'shared/components/DropdownMenu'; import ProjectSettings, { DeleteConfirm, DELETE_INFO } from 'shared/components/ProjectSettings'; import { useHistory } from 'react-router'; import { PermissionLevel, PermissionObjectType, useCurrentUser } from 'App/context'; import { RoleCode, useTopNavbarQuery, useDeleteProjectMutation, GetProjectsDocument, } from 'shared/generated/graphql'; import { usePopup, Popup } from 'shared/components/PopupMenu'; import produce from 'immer'; import MiniProfile from 'shared/components/MiniProfile'; import cache from 'App/cache'; import NotificationPopup, { NotificationItem } from 'shared/components/NotifcationPopup'; import theme from './ThemeStyles'; import ProjectFinder from './ProjectFinder'; type ProjectPopupProps = { history: any; name: string; projectID: string; }; export const ProjectPopup: React.FC = ({ history, name, projectID }) => { const { hidePopup, setTab } = usePopup(); const [deleteProject] = useDeleteProjectMutation({ update: (client, deleteData) => { const cacheData: any = client.readQuery({ query: GetProjectsDocument, }); const newData = produce(cacheData, (draftState: any) => { draftState.projects = draftState.projects.filter( (project: any) => project.id !== deleteData.data?.deleteProject.project.id, ); }); client.writeQuery({ query: GetProjectsDocument, data: { ...newData, }, }); }, }); return ( <> { setTab(1, { width: 300 }); }} /> { if (projectID) { deleteProject({ variables: { projectID } }); hidePopup(); history.push('/projects'); } }} /> ); }; type GlobalTopNavbarProps = { nameOnly?: boolean; projectID: string | null; teamID?: string | null; onChangeProjectOwner?: (userID: string) => void; name: string | null; currentTab?: number; popupContent?: JSX.Element; menuType?: Array; onChangeRole?: (userID: string, roleCode: RoleCode) => void; projectMembers?: null | Array; projectInvitedMembers?: null | Array; onSaveProjectName?: (projectName: string) => void; onInviteUser?: ($target: React.RefObject) => void; onSetTab?: (tab: number) => void; onRemoveFromBoard?: (userID: string) => void; onRemoveInvitedFromBoard?: (email: string) => void; }; const GlobalTopNavbar: React.FC = ({ currentTab, onSetTab, menuType, teamID, onChangeProjectOwner, onChangeRole, name, popupContent, projectMembers, projectInvitedMembers, onInviteUser, onSaveProjectName, onRemoveInvitedFromBoard, onRemoveFromBoard, }) => { const { user, setUserRoles, setUser } = useCurrentUser(); const { loading, data } = useTopNavbarQuery({ onCompleted: response => { if (user && user.roles) { setUserRoles({ org: user.roles.org, teams: response.me.teamRoles.reduce((map, obj) => { map.set(obj.teamID, obj.roleCode); return map; }, new Map()), projects: response.me.projectRoles.reduce((map, obj) => { map.set(obj.projectID, obj.roleCode); return map; }, new Map()), }); } }, }); const { showPopup, hidePopup } = usePopup(); const history = useHistory(); const onLogout = () => { fetch('/auth/logout', { method: 'POST', credentials: 'include', }).then(async x => { const { status } = x; if (status === 200) { cache.reset(); history.replace('/login'); setUser(null); hidePopup(); } }); }; const onProfileClick = ($target: React.RefObject) => { showPopup( $target, { history.push('/admin'); hidePopup(); }} onProfile={() => { history.push('/profile'); hidePopup(); }} /> , { width: 195 }, ); }; const onOpenSettings = ($target: React.RefObject) => { if (popupContent) { showPopup($target, popupContent, { width: 185 }); } }; const onNotificationClick = ($target: React.RefObject) => { if (data) { showPopup( $target, {data.notifications.map(notification => ( ))} , { width: 415, borders: false, diamondColor: theme.colors.primary }, ); } }; if (!user) { return null; } const userIsTeamOrProjectAdmin = user.isAdmin(PermissionLevel.TEAM, PermissionObjectType.TEAM, teamID); const onInvitedMemberProfile = ($targetRef: React.RefObject, email: string) => { const member = projectInvitedMembers ? projectInvitedMembers.find(u => u.email === email) : null; if (member) { showPopup( $targetRef, { if (onRemoveInvitedFromBoard) { onRemoveInvitedFromBoard(member.email); } }} invited user={{ id: member.email, fullName: member.email, bio: 'Invited', profileIcon: { bgColor: '#000', url: null, initials: member.email.charAt(0), }, }} bio="" />, ); } }; const onMemberProfile = ($targetRef: React.RefObject, memberID: string) => { const member = projectMembers ? projectMembers.find(u => u.id === memberID) : null; const warning = 'You can’t leave because you are the only admin. To make another user an admin, click their avatar, select “Change permissions…”, and select “Admin”.'; if (member) { showPopup( $targetRef, { if (onChangeRole) { onChangeRole(member.id, roleCode); } }} onRemoveFromBoard={ member.role && member.role.code === 'owner' ? undefined : () => { if (onRemoveFromBoard) { onRemoveFromBoard(member.id); } } } user={member} bio="" />, ); } }; return ( <> { showPopup( $target, , ); }} currentTab={currentTab} user={data ? data.me.user : null} canEditProjectName={userIsTeamOrProjectAdmin} canInviteUser={userIsTeamOrProjectAdmin} onMemberProfile={onMemberProfile} onInvitedMemberProfile={onInvitedMemberProfile} onInviteUser={onInviteUser} onChangeRole={onChangeRole} onChangeProjectOwner={onChangeProjectOwner} onNotificationClick={onNotificationClick} onSetTab={onSetTab} onRemoveFromBoard={onRemoveFromBoard} onDashboardClick={() => { history.push('/'); }} onMyTasksClick={() => { history.push('/tasks'); }} projectMembers={projectMembers} projectInvitedMembers={projectInvitedMembers} onProfileClick={onProfileClick} onSaveName={onSaveProjectName} onOpenSettings={onOpenSettings} /> ); }; export default GlobalTopNavbar;