|
import { useEffect, useRef, useState } from 'react'; |
|
import { |
|
FaPaperclip, |
|
FaCubes, |
|
FaGoogle, |
|
FaMicrosoft, |
|
FaSlack, |
|
FaChevronRight, |
|
FaFileAlt, |
|
FaTable, |
|
FaDesktop, |
|
FaStickyNote, |
|
FaTasks, |
|
FaCalendarAlt, |
|
FaFolderOpen, |
|
FaEnvelope, |
|
FaFileWord, |
|
FaFileExcel, |
|
FaFilePowerpoint, |
|
FaClipboardList, |
|
FaExchangeAlt, |
|
FaCloud |
|
} from 'react-icons/fa'; |
|
import './AddContentDropdown.css'; |
|
|
|
function AddContentDropdown({ |
|
isOpen, |
|
onClose, |
|
toggleButtonRef, |
|
onAddFilesClick, |
|
onServiceClick, |
|
selectedServices = { google: [], microsoft: [], slack: false } |
|
}) { |
|
const dropdownRef = useRef(null); |
|
const [openSubMenus, setOpenSubMenus] = useState({ |
|
connectApps: false, |
|
googleWorkspace: false, |
|
microsoft365: false |
|
}); |
|
|
|
|
|
useEffect(() => { |
|
const handleClickOutside = (event) => { |
|
|
|
if (toggleButtonRef && toggleButtonRef.current && toggleButtonRef.current.contains(event.target)) { |
|
return; |
|
} |
|
|
|
|
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { |
|
onClose(); |
|
|
|
setOpenSubMenus({ |
|
connectApps: false, |
|
googleWorkspace: false, |
|
microsoft365: false |
|
}); |
|
} |
|
}; |
|
|
|
if (isOpen) { |
|
document.addEventListener('mousedown', handleClickOutside); |
|
} else { |
|
document.removeEventListener('mousedown', handleClickOutside); |
|
} |
|
|
|
return () => { |
|
document.removeEventListener('mousedown', handleClickOutside); |
|
}; |
|
}, [isOpen, onClose, toggleButtonRef]); |
|
|
|
|
|
useEffect(() => { |
|
if (!isOpen) { |
|
setOpenSubMenus({ |
|
connectApps: false, |
|
googleWorkspace: false, |
|
microsoft365: false |
|
}); |
|
} |
|
}, [isOpen]); |
|
|
|
const handleConnectAppsHover = () => { |
|
setOpenSubMenus(prev => ({ |
|
...prev, |
|
connectApps: true |
|
})); |
|
}; |
|
|
|
const handleGoogleWorkspaceHover = () => { |
|
setOpenSubMenus(prev => ({ |
|
...prev, |
|
googleWorkspace: true, |
|
|
|
microsoft365: false |
|
})); |
|
}; |
|
|
|
const handleMicrosoft365Hover = () => { |
|
setOpenSubMenus(prev => ({ |
|
...prev, |
|
microsoft365: true, |
|
|
|
googleWorkspace: false |
|
})); |
|
}; |
|
|
|
const handleSlackHover = () => { |
|
|
|
setOpenSubMenus(prev => ({ |
|
...prev, |
|
googleWorkspace: false, |
|
microsoft365: false |
|
})); |
|
}; |
|
|
|
const handleAddFilesHover = () => { |
|
|
|
setOpenSubMenus({ |
|
connectApps: false, |
|
googleWorkspace: false, |
|
microsoft365: false |
|
}); |
|
}; |
|
|
|
|
|
const handleGoogleServiceClick = (service) => { |
|
if (onServiceClick && typeof onServiceClick === 'function') { |
|
onServiceClick('google', service); |
|
} |
|
}; |
|
|
|
const handleMicrosoftServiceClick = (service) => { |
|
if (onServiceClick && typeof onServiceClick === 'function') { |
|
onServiceClick('microsoft', service); |
|
} |
|
}; |
|
|
|
const handleSlackClick = () => { |
|
if (onServiceClick && typeof onServiceClick === 'function') { |
|
onServiceClick('slack', 'slack'); |
|
} |
|
}; |
|
|
|
|
|
const isServiceSelected = (provider, service) => { |
|
if (provider === 'slack') { |
|
return selectedServices.slack || false; |
|
} |
|
return selectedServices[provider]?.includes(service) || false; |
|
}; |
|
|
|
return ( |
|
<div className={`add-content-dropdown ${isOpen ? 'open' : ''}`} ref={dropdownRef}> |
|
<ul> |
|
<li onClick={onAddFilesClick} onMouseEnter={handleAddFilesHover}> |
|
<div className="menu-item-content"> |
|
<FaPaperclip className="dropdown-icon" /> |
|
<span>Add Files and Links</span> |
|
</div> |
|
</li> |
|
<li className={`has-submenu ${openSubMenus.connectApps ? 'active' : ''}`} onMouseEnter={handleConnectAppsHover}> |
|
<div className="menu-item-content"> |
|
<FaCubes className="dropdown-icon" /> |
|
<span>Connect Apps</span> |
|
</div> |
|
<FaChevronRight className="submenu-arrow" /> |
|
<div className={`sub-dropdown ${openSubMenus.connectApps ? 'open' : ''}`}> |
|
<ul> |
|
<li className={`has-submenu ${openSubMenus.googleWorkspace ? 'active' : ''}`} onMouseEnter={handleGoogleWorkspaceHover}> |
|
<div className="menu-item-content"> |
|
<FaGoogle className="dropdown-icon" /> |
|
<span>Google Workspace</span> |
|
</div> |
|
<FaChevronRight className="submenu-arrow" /> |
|
<div className={`sub-dropdown ${openSubMenus.googleWorkspace ? 'open' : ''}`}> |
|
<ul> |
|
<li |
|
onClick={() => handleGoogleServiceClick('docs')} |
|
className={isServiceSelected('google', 'docs') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaFileAlt className="dropdown-icon" /> |
|
<span>Docs</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('sheets')} |
|
className={isServiceSelected('google', 'sheets') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaTable className="dropdown-icon" /> |
|
<span>Sheets</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('slides')} |
|
className={isServiceSelected('google', 'slides') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaDesktop className="dropdown-icon" /> |
|
<span>Slides</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('keep')} |
|
className={isServiceSelected('google', 'keep') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaStickyNote className="dropdown-icon" /> |
|
<span>Keep</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('tasks')} |
|
className={isServiceSelected('google', 'tasks') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaTasks className="dropdown-icon" /> |
|
<span>Tasks</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('calendar')} |
|
className={isServiceSelected('google', 'calendar') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaCalendarAlt className="dropdown-icon" /> |
|
<span>Calendar</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('drive')} |
|
className={isServiceSelected('google', 'drive') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaFolderOpen className="dropdown-icon" /> |
|
<span>Drive</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleGoogleServiceClick('gmail')} |
|
className={isServiceSelected('google', 'gmail') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaEnvelope className="dropdown-icon" /> |
|
<span>Gmail</span> |
|
</div> |
|
</li> |
|
</ul> |
|
</div> |
|
</li> |
|
<li className={`has-submenu ${openSubMenus.microsoft365 ? 'active' : ''}`} onMouseEnter={handleMicrosoft365Hover}> |
|
<div className="menu-item-content"> |
|
<FaMicrosoft className="dropdown-icon" /> |
|
<span>Microsoft 365</span> |
|
</div> |
|
<FaChevronRight className="submenu-arrow" /> |
|
<div className={`sub-dropdown ${openSubMenus.microsoft365 ? 'open' : ''}`}> |
|
<ul> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('word')} |
|
className={isServiceSelected('microsoft', 'word') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaFileWord className="dropdown-icon" /> |
|
<span>Word</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('excel')} |
|
className={isServiceSelected('microsoft', 'excel') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaFileExcel className="dropdown-icon" /> |
|
<span>Excel</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('powerpoint')} |
|
className={isServiceSelected('microsoft', 'powerpoint') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaFilePowerpoint className="dropdown-icon" /> |
|
<span>PowerPoint</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('onenote')} |
|
className={isServiceSelected('microsoft', 'onenote') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaStickyNote className="dropdown-icon" /> |
|
<span>OneNote</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('todo')} |
|
className={isServiceSelected('microsoft', 'todo') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaClipboardList className="dropdown-icon" /> |
|
<span>To Do</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('exchange')} |
|
className={isServiceSelected('microsoft', 'exchange') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaExchangeAlt className="dropdown-icon" /> |
|
<span>Exchange</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('onedrive')} |
|
className={isServiceSelected('microsoft', 'onedrive') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaCloud className="dropdown-icon" /> |
|
<span>OneDrive</span> |
|
</div> |
|
</li> |
|
<li |
|
onClick={() => handleMicrosoftServiceClick('outlook')} |
|
className={isServiceSelected('microsoft', 'outlook') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaEnvelope className="dropdown-icon" /> |
|
<span>Outlook</span> |
|
</div> |
|
</li> |
|
</ul> |
|
</div> |
|
</li> |
|
<li |
|
onMouseEnter={handleSlackHover} |
|
onClick={handleSlackClick} |
|
className={isServiceSelected('slack', 'slack') ? 'selected' : ''} |
|
> |
|
<div className="menu-item-content"> |
|
<FaSlack className="dropdown-icon" /> |
|
<span>Slack</span> |
|
{isServiceSelected('slack', 'slack') && sessionStorage.getItem('slack_workspace') && ( |
|
<span className="workspace-info"> |
|
({JSON.parse(sessionStorage.getItem('slack_workspace')).team_name}) |
|
</span> |
|
)} |
|
</div> |
|
</li> |
|
</ul> |
|
</div> |
|
</li> |
|
</ul> |
|
</div> |
|
); |
|
} |
|
|
|
export default AddContentDropdown; |