import React, { useRef, useState, useEffect } from 'react'; import { Home, Star, Bell, AngleDown, BarChart, CheckCircle, ListUnordered } from 'shared/icons'; import styled from 'styled-components'; import ProfileIcon from 'shared/components/ProfileIcon'; import { usePopup } from 'shared/components/PopupMenu'; import { RoleCode } from 'shared/generated/graphql'; import NOOP from 'shared/utils/noop'; import { useHistory } from 'react-router'; import { TaskcafeLogo, TaskcafeTitle, ProjectFinder, LogoContainer, NavSeparator, IconContainerWrapper, ProjectNameWrapper, ProjectNameSpan, ProjectNameTextarea, InviteButton, GlobalActions, ProjectActions, ProjectMeta, ProjectName, ProjectTabs, ProjectTab, NavbarWrapper, NavbarHeader, ProjectSettingsButton, ProfileContainer, ProfileNameWrapper, ProfileNamePrimary, ProfileNameSecondary, ProjectMember, ProjectMembers, } from './Styles'; type IconContainerProps = { disabled?: boolean; onClick?: ($target: React.RefObject) => void; }; const IconContainer: React.FC = ({ onClick, disabled = false, children }) => { const $container = useRef(null); return ( { if (onClick) { onClick($container); } }} > {children} ); }; const HomeDashboard = styled(Home)``; type ProjectHeadingProps = { onFavorite?: () => void; name: string; canEditProjectName: boolean; onSaveProjectName?: (projectName: string) => void; onOpenSettings: ($target: React.RefObject) => void; }; const ProjectHeading: React.FC = ({ onFavorite, name: initialProjectName, onSaveProjectName, canEditProjectName, onOpenSettings, }) => { const [isEditProjectName, setEditProjectName] = useState(false); const [projectName, setProjectName] = useState(initialProjectName); const $projectName = useRef(null); useEffect(() => { if (isEditProjectName && $projectName && $projectName.current) { $projectName.current.focus(); $projectName.current.select(); } }, [isEditProjectName]); useEffect(() => { setProjectName(initialProjectName); }, [initialProjectName]); const onProjectNameChange = (event: React.FormEvent): void => { setProjectName(event.currentTarget.value); }; const onProjectNameBlur = () => { if (onSaveProjectName) { onSaveProjectName(projectName); } setEditProjectName(false); }; const onProjectNameKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); if ($projectName && $projectName.current) { $projectName.current.blur(); } } }; const $settings = useRef(null); return ( <> {isEditProjectName ? ( {projectName} ) : ( { if (canEditProjectName) { setEditProjectName(true); } }} > {projectName} )} { onOpenSettings($settings); }} ref={$settings} > {onFavorite && ( onFavorite()}> )} ); }; export type MenuItem = { name: string; link: string; }; type MenuTypes = { [key: string]: Array; }; export const MENU_TYPES: MenuTypes = { PROJECT_MENU: ['Board', 'Timeline', 'Calender'], TEAM_MENU: ['Projects', 'Members', 'Settings'], }; type NavBarProps = { menuType?: Array | null; name: string | null; currentTab?: number; onSetTab?: (tab: number) => void; onOpenProjectFinder: ($target: React.RefObject) => void; onChangeProjectOwner?: (userID: string) => void; onChangeRole?: (userID: string, roleCode: RoleCode) => void; onFavorite?: () => void; onProfileClick: ($target: React.RefObject) => void; onSaveName?: (name: string) => void; onNotificationClick: ($target: React.RefObject) => void; canEditProjectName?: boolean; canInviteUser?: boolean; onInviteUser?: ($target: React.RefObject) => void; onDashboardClick: () => void; user: TaskUser | null; onOpenSettings: ($target: React.RefObject) => void; projectMembers?: Array | null; projectInvitedMembers?: Array | null; onRemoveFromBoard?: (userID: string) => void; onMemberProfile?: ($targetRef: React.RefObject, memberID: string) => void; onInvitedMemberProfile?: ($targetRef: React.RefObject, email: string) => void; onMyTasksClick: () => void; }; const NavBar: React.FC = ({ menuType, canInviteUser = false, onInviteUser, onChangeProjectOwner, currentTab, onMemberProfile, onInvitedMemberProfile, canEditProjectName = false, onOpenProjectFinder, onFavorite, onSetTab, projectInvitedMembers, onChangeRole, name, onRemoveFromBoard, onSaveName, onProfileClick, onNotificationClick, onDashboardClick, onMyTasksClick, user, projectMembers, onOpenSettings, }) => { const handleProfileClick = ($target: React.RefObject) => { if ($target && $target.current) { onProfileClick($target); } }; const history = useHistory(); const { showPopup } = usePopup(); return ( {name && ( )} {name && ( {menuType && menuType.map((menu, idx) => { return ( { // TODO }} > {menu.name} ); })} )} Taskcafé {projectMembers && projectInvitedMembers && onMemberProfile && onInvitedMemberProfile && ( <> {projectMembers.map((member, idx) => ( ))} {projectInvitedMembers.map((member, idx) => ( ))} {canInviteUser && ( { if (onInviteUser) { onInviteUser($target); } }} variant="outline" > Invite )} )} Projects onDashboardClick()}> onMyTasksClick()}> {user && ( )} ); }; export default NavBar;