import { Group } from '@mantine/core'; import { openModal, closeAllModals } from '@mantine/modals'; import isElectron from 'is-electron'; import { useTranslation } from 'react-i18next'; import { RiLockLine, RiWindowFill, RiArrowLeftSLine, RiArrowRightSLine, RiLayoutRightLine, RiLayoutLeftLine, RiEdit2Line, RiSettings3Line, RiServerLine, RiGithubLine, RiExternalLinkLine, RiCloseCircleLine, } from 'react-icons/ri'; import { useNavigate } from 'react-router'; import { Link } from 'react-router-dom'; import { DropdownMenu } from '/@/renderer/components'; import { ServerList } from '/@/renderer/features/servers'; import { EditServerForm } from '/@/renderer/features/servers/components/edit-server-form'; import { AppRoute } from '/@/renderer/router/routes'; import { useCurrentServer, useServerList, useAuthStoreActions, useSidebarStore, useAppStoreActions, } from '/@/renderer/store'; import { ServerListItem, ServerType } from '/@/renderer/api/types'; import packageJson from '../../../../../package.json'; const browser = isElectron() ? window.electron.browser : null; const localSettings = isElectron() ? window.electron.localSettings : null; export const AppMenu = () => { const { t } = useTranslation(); const navigate = useNavigate(); const currentServer = useCurrentServer(); const serverList = useServerList(); const { setCurrentServer } = useAuthStoreActions(); const { collapsed } = useSidebarStore(); const { setSideBar } = useAppStoreActions(); const handleSetCurrentServer = (server: ServerListItem) => { navigate(AppRoute.HOME); setCurrentServer(server); }; const handleCredentialsModal = async (server: ServerListItem) => { let password: string | null = null; try { if (localSettings && server.savePassword) { password = await localSettings.passwordGet(server.id); } } catch (error) { console.error(error); } openModal({ children: server && ( ), size: 'sm', title: `Update session for "${server.name}"`, }); }; const handleManageServersModal = () => { openModal({ children: , title: 'Manage Servers', }); }; const handleBrowserDevTools = () => { browser?.devtools(); }; const handleCollapseSidebar = () => { setSideBar({ collapsed: true }); }; const handleExpandSidebar = () => { setSideBar({ collapsed: false }); }; const handleQuit = () => { browser?.quit(); }; return ( <> } onClick={() => navigate(-1)} > {t('page.appMenu.goBack', { postProcess: 'sentenceCase' })} } onClick={() => navigate(1)} > {t('page.appMenu.goForward', { postProcess: 'sentenceCase' })} {collapsed ? ( } onClick={handleExpandSidebar} > {t('page.appMenu.expandSidebar', { postProcess: 'sentenceCase' })} ) : ( } onClick={handleCollapseSidebar} > {t('page.appMenu.collapseSidebar', { postProcess: 'sentenceCase' })} )} } to={AppRoute.SETTINGS} > {t('page.appMenu.settings', { postProcess: 'sentenceCase' })} } onClick={handleManageServersModal} > {t('page.appMenu.manageServers', { postProcess: 'sentenceCase' })} {t('page.appMenu.selectServer', { postProcess: 'sentenceCase' })} {Object.keys(serverList).map((serverId) => { const server = serverList[serverId]; const isNavidromeExpired = server.type === ServerType.NAVIDROME && !server.ndCredential; const isJellyfinExpired = server.type === ServerType.JELLYFIN && !server.credential; const isSessionExpired = isNavidromeExpired || isJellyfinExpired; return ( ) : ( ) } onClick={() => { if (!isSessionExpired) return handleSetCurrentServer(server); return handleCredentialsModal(server); }} > {server.name} ); })} } rightSection={} target="_blank" > {t('page.appMenu.version', { postProcess: 'sentenceCase', version: packageJson.version, })} {isElectron() && ( <> } onClick={handleBrowserDevTools} > {t('page.appMenu.openBrowserDevtools', { postProcess: 'sentenceCase' })} } onClick={handleQuit} > {t('page.appMenu.quit', { postProcess: 'sentenceCase' })} )} ); };