mirror of
https://github.com/tiddly-gittly/TidGi-Desktop.git
synced 2025-12-06 02:30:47 -08:00
190 lines
8 KiB
TypeScript
190 lines
8 KiB
TypeScript
import { Accordion as AccordionRaw, AccordionDetails, AccordionSummary, AppBar, Paper as PaperRaw, Tab as TabRaw } from '@material-ui/core';
|
|
import { ExpandMore as ExpandMoreIcon } from '@material-ui/icons';
|
|
import { TabContext, TabList as TabListRaw, TabPanel as TabPanelRaw } from '@material-ui/lab';
|
|
import React, { useEffect, useState } from 'react';
|
|
import { Helmet } from 'react-helmet';
|
|
import { useTranslation } from 'react-i18next';
|
|
import styled from 'styled-components';
|
|
|
|
import { SupportedStorageServices } from '@services/types';
|
|
|
|
import { MainSubWikiDescription, SyncedWikiDescription } from './Description';
|
|
|
|
import { CloneWikiDoneButton } from './CloneWikiDoneButton';
|
|
import { CloneWikiForm } from './CloneWikiForm';
|
|
import { ExistedWikiDoneButton } from './ExistedWikiDoneButton';
|
|
import { ExistedWikiForm } from './ExistedWikiForm';
|
|
import { NewWikiDoneButton } from './NewWikiDoneButton';
|
|
import { NewWikiForm } from './NewWikiForm';
|
|
import { IErrorInWhichComponent, useWikiWorkspaceForm } from './useForm';
|
|
|
|
import { TokenForm } from '@/components/TokenForm';
|
|
import { usePromiseValue } from '@/helpers/useServiceValue';
|
|
import { LocationPickerContainer, LocationPickerInput } from './FormComponents';
|
|
import { GitRepoUrlForm } from './GitRepoUrlForm';
|
|
import { ImportHtmlWikiDoneButton } from './ImportHtmlWikiDoneButton';
|
|
import { ImportHtmlWikiForm } from './ImportHtmlWikiForm';
|
|
|
|
enum CreateWorkspaceTabs {
|
|
CloneOnlineWiki = 'CloneOnlineWiki',
|
|
CreateNewWiki = 'CreateNewWiki',
|
|
OpenLocalWiki = 'OpenLocalWiki',
|
|
OpenLocalWikiFromHtml = 'OpenLocalWikiFromHtml',
|
|
}
|
|
|
|
export const Paper = styled(PaperRaw)`
|
|
border-color: ${({ theme }) => theme.palette.divider};
|
|
background: ${({ theme }) => theme.palette.background.paper};
|
|
color: ${({ theme }) => theme.palette.text.primary};
|
|
`;
|
|
export const Accordion = styled(AccordionRaw)`
|
|
border-color: ${({ theme }) => theme.palette.divider};
|
|
background: ${({ theme }) => theme.palette.background.paper};
|
|
color: ${({ theme }) => theme.palette.text.primary};
|
|
`;
|
|
const Container = styled.main`
|
|
display: flex;
|
|
flex-direction: column;
|
|
overflow: scroll;
|
|
&::-webkit-scrollbar {
|
|
width: 0;
|
|
}
|
|
`;
|
|
const TokenFormContainer = styled(Paper)`
|
|
margin: 10px 0;
|
|
padding: 5px 10px;
|
|
background-color: ${({ theme }) => theme.palette.background.paper};
|
|
color: ${({ theme }) => theme.palette.text.primary};
|
|
`;
|
|
TokenFormContainer.defaultProps = {
|
|
square: true,
|
|
elevation: 2,
|
|
};
|
|
const TabList = styled(TabListRaw)`
|
|
background: ${({ theme }) => theme.palette.background.paper};
|
|
color: ${({ theme }) => theme.palette.text.secondary};
|
|
`;
|
|
const Tab = styled(TabRaw)`
|
|
background: ${({ theme }) => theme.palette.background.paper};
|
|
color: ${({ theme }) => theme.palette.text.secondary};
|
|
`;
|
|
const TabPanel = styled(TabPanelRaw)`
|
|
margin-bottom: 10px;
|
|
padding: 0 !important;
|
|
`;
|
|
const AdvancedSettingsAccordionSummary = styled(AccordionSummary)`
|
|
margin-top: 10px;
|
|
`;
|
|
|
|
export function AddWorkspace(): JSX.Element {
|
|
const { t } = useTranslation();
|
|
const [currentTab, currentTabSetter] = useState<CreateWorkspaceTabs>(CreateWorkspaceTabs.CreateNewWiki);
|
|
const isCreateSyncedWorkspace = currentTab === CreateWorkspaceTabs.CloneOnlineWiki;
|
|
const [isCreateMainWorkspace, isCreateMainWorkspaceSetter] = useState(true);
|
|
const form = useWikiWorkspaceForm();
|
|
const [errorInWhichComponent, errorInWhichComponentSetter] = useState<IErrorInWhichComponent>({});
|
|
const workspaceList = usePromiseValue(async () => await window.service.workspace.getWorkspacesAsList());
|
|
|
|
// update storageProviderSetter to local based on isCreateSyncedWorkspace. Other services value will be changed by TokenForm
|
|
const { storageProvider, storageProviderSetter, wikiFolderName, wikiPort } = form;
|
|
useEffect(() => {
|
|
if (!isCreateSyncedWorkspace && storageProvider !== SupportedStorageServices.local) {
|
|
storageProviderSetter(SupportedStorageServices.local);
|
|
}
|
|
}, [isCreateSyncedWorkspace, storageProvider, storageProviderSetter]);
|
|
|
|
// const [onClickLogin] = useAuth(storageService);
|
|
|
|
const formProps = {
|
|
form,
|
|
isCreateMainWorkspace,
|
|
errorInWhichComponent,
|
|
errorInWhichComponentSetter,
|
|
};
|
|
|
|
if (workspaceList === undefined) {
|
|
return <Container>{t('Loading')}</Container>;
|
|
}
|
|
|
|
return (
|
|
<TabContext value={currentTab}>
|
|
<div id='test' data-usage='For spectron automating testing' />
|
|
<Helmet>
|
|
<title>
|
|
{t('AddWorkspace.AddWorkspace')} {wikiFolderName}
|
|
</title>
|
|
</Helmet>
|
|
<AppBar position='static'>
|
|
<Paper square>
|
|
<TabList
|
|
onChange={(_event, newValue) => {
|
|
currentTabSetter(newValue as CreateWorkspaceTabs);
|
|
}}
|
|
variant='scrollable'
|
|
value={currentTab}
|
|
aria-label={t('AddWorkspace.SwitchCreateNewOrOpenExisted')}
|
|
>
|
|
<Tab label={t('AddWorkspace.CreateNewWiki')} value={CreateWorkspaceTabs.CreateNewWiki} />
|
|
<Tab label={t(`AddWorkspace.CloneOnlineWiki`)} value={CreateWorkspaceTabs.CloneOnlineWiki} />
|
|
<Tab label={t('AddWorkspace.OpenLocalWiki')} value={CreateWorkspaceTabs.OpenLocalWiki} />
|
|
<Tab label={t('AddWorkspace.OpenLocalWikiFromHTML')} value={CreateWorkspaceTabs.OpenLocalWikiFromHtml} />
|
|
</TabList>
|
|
</Paper>
|
|
</AppBar>
|
|
|
|
{/* show advanced options if user have already created a workspace */}
|
|
<Accordion defaultExpanded={workspaceList.length > 0}>
|
|
<AdvancedSettingsAccordionSummary expandIcon={<ExpandMoreIcon />}>{t('AddWorkspace.Advanced')}</AdvancedSettingsAccordionSummary>
|
|
<AccordionDetails>
|
|
{/* Force it only show sync option when clone online wiki, because many user encounter sync problem here. Recommend them create local first and sync later. */}
|
|
{isCreateSyncedWorkspace && <SyncedWikiDescription isCreateSyncedWorkspace={isCreateSyncedWorkspace} isCreateSyncedWorkspaceSetter={() => {}} />}
|
|
<MainSubWikiDescription isCreateMainWorkspace={isCreateMainWorkspace} isCreateMainWorkspaceSetter={isCreateMainWorkspaceSetter} />
|
|
{isCreateMainWorkspace && (
|
|
<LocationPickerContainer>
|
|
<LocationPickerInput
|
|
error={errorInWhichComponent.wikiPort}
|
|
onChange={(event) => {
|
|
form.wikiPortSetter(Number(event.target.value));
|
|
}}
|
|
label={t('AddWorkspace.WikiServerPort')}
|
|
value={wikiPort}
|
|
/>
|
|
</LocationPickerContainer>
|
|
)}
|
|
</AccordionDetails>
|
|
</Accordion>
|
|
|
|
{isCreateSyncedWorkspace && (
|
|
<TokenFormContainer>
|
|
<TokenForm storageProvider={storageProvider} storageProviderSetter={storageProviderSetter} />
|
|
</TokenFormContainer>
|
|
)}
|
|
{storageProvider !== SupportedStorageServices.local && <GitRepoUrlForm error={errorInWhichComponent.gitRepoUrl} {...formProps} {...formProps.form} />}
|
|
|
|
<TabPanel value={CreateWorkspaceTabs.CreateNewWiki}>
|
|
<Container>
|
|
<NewWikiForm {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
<NewWikiDoneButton {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
</Container>
|
|
</TabPanel>
|
|
<TabPanel value={CreateWorkspaceTabs.CloneOnlineWiki}>
|
|
<Container>
|
|
<CloneWikiForm {...formProps} />
|
|
<CloneWikiDoneButton {...formProps} />
|
|
</Container>
|
|
</TabPanel>
|
|
<TabPanel value={CreateWorkspaceTabs.OpenLocalWiki}>
|
|
<Container>
|
|
<ExistedWikiForm {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
<ExistedWikiDoneButton {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
</Container>
|
|
</TabPanel>
|
|
<TabPanel value={CreateWorkspaceTabs.OpenLocalWikiFromHtml}>
|
|
<Container>
|
|
<ImportHtmlWikiForm {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
<ImportHtmlWikiDoneButton {...formProps} isCreateSyncedWorkspace={isCreateSyncedWorkspace} />
|
|
</Container>
|
|
</TabPanel>
|
|
</TabContext>
|
|
);
|
|
}
|