import { Box, Tab as TabRaw, Tabs as TabsRaw } from '@mui/material'; import { keyframes, styled, Theme } from '@mui/material/styles'; import { SupportedStorageServices } from '@services/types'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { ListItemText } from '../ListItem'; import { CustomServerTokenForm } from './CustomServerTokenForm'; import { GitTokenForm } from './GitTokenForm'; const Container = styled('div')` width: 100%; display: flex; flex-direction: column; background-color: ${({ theme }) => theme.palette.background.paper}; `; const TabPanel = styled(Box)` padding: 5px 0; padding-left: 16px; background-color: ${({ theme }) => theme.palette.background.paper}; `; const Tabs = styled(TabsRaw)` background-color: ${({ theme }) => theme.palette.background.paper}; & button { background-color: ${({ theme }) => theme.palette.background.paper} !important; } `; const TabsContainer = styled('div')` background-color: ${({ theme }) => theme.palette.background.paper}; color: ${({ theme }) => theme.palette.text.primary}; display: flex; padding: 15px 0; flex-direction: row; & .MuiTabs-root { min-width: 160px; } `; const backgroundColorShift = ({ theme }: { theme: Theme }) => keyframes` from {background-color: ${theme.palette.background.default};} to {background-color: ${theme.palette.background.default};} `; const Tab = styled(TabRaw)` background-color: ${({ theme }) => theme.palette.action.active}; color: ${({ theme }) => theme.palette.text.secondary}; animation: ${backgroundColorShift} 5s infinite; animation-direction: alternate; animation-timing-function: cubic-bezier(0.4, 0, 1, 1); `; interface Props { storageProvider?: SupportedStorageServices; storageProviderSetter?: (next: SupportedStorageServices) => void; } /** * Create storage provider's token. * @returns */ export function TokenForm({ storageProvider, storageProviderSetter }: Props): React.JSX.Element { const { t } = useTranslation(); let [currentTab, currentTabSetter] = useState(SupportedStorageServices.github); // use external controls if provided if (storageProvider !== undefined && typeof storageProviderSetter === 'function') { currentTab = storageProvider; currentTabSetter = storageProviderSetter as unknown as React.Dispatch>; } // update storageProvider to be an online service, if this Component is opened useEffect(() => { if (storageProvider === SupportedStorageServices.local && typeof storageProviderSetter === 'function') { storageProviderSetter(SupportedStorageServices.github); } }, [storageProvider, storageProviderSetter]); return ( { currentTabSetter(newValue); }} orientation='vertical' variant='scrollable' value={currentTab} aria-label='Vertical tabs example' > {currentTab === SupportedStorageServices.github && ( )} {currentTab === SupportedStorageServices.codeberg && ( )} {currentTab === SupportedStorageServices.gitea && ( )} {currentTab === SupportedStorageServices.testOAuth && ( )} ); }