(props: UserHomePageProps)
| 75 | } |
| 76 | |
| 77 | export const UserHomePage = (props: UserHomePageProps) => { |
| 78 | const history = useHistory() |
| 79 | const [projects, setProjects] = useState([]) |
| 80 | const [saveProjectModalState, setSaveProjectModalState] = useState({ open: false, clonedFrom: null }) |
| 81 | |
| 82 | useEffect(() => { |
| 83 | props.projectLoader.listProjectMetadata().then((projects) => { |
| 84 | setProjects(projects) |
| 85 | }) |
| 86 | }, []) |
| 87 | |
| 88 | const newProject = (clonedFrom?: Project) => { |
| 89 | setSaveProjectModalState({ |
| 90 | open: true, |
| 91 | clonedFrom: clonedFrom || null, |
| 92 | }) |
| 93 | } |
| 94 | |
| 95 | const menuItems: MainMenuItem[] = [ |
| 96 | { |
| 97 | name: 'New Project', |
| 98 | onClick: () => { |
| 99 | newProject() |
| 100 | }, |
| 101 | }, |
| 102 | { |
| 103 | name: 'Import Project', |
| 104 | onClick: async () => { |
| 105 | const dirHandle = await window.showDirectoryPicker() |
| 106 | const proj = await loadProjectFromFolder(dirHandle) |
| 107 | setSaveProjectModalState({ open: true, clonedFrom: proj }) |
| 108 | }, |
| 109 | }, |
| 110 | ] |
| 111 | return ( |
| 112 | <React.Fragment> |
| 113 | <SaveProjectModal |
| 114 | clonedFrom={saveProjectModalState.clonedFrom} |
| 115 | newOwner="local" |
| 116 | isOpen={saveProjectModalState.open} |
| 117 | projectLoader={props.projectLoader} |
| 118 | onClose={() => setSaveProjectModalState({ open: false, clonedFrom: null })} |
| 119 | onComplete={(owner, projectID) => { |
| 120 | setSaveProjectModalState({ open: false, clonedFrom: null }) |
| 121 | history.push(`/p/${owner}/${projectID}`) |
| 122 | }} |
| 123 | /> |
| 124 | <MenuBar menuItems={menuItems}></MenuBar> |
| 125 | <Container maxW="container.md" paddingTop={8}> |
| 126 | <VStack align="stretch" spacing={10}> |
| 127 | <Box> |
| 128 | <Flex justifyContent="space-between" marginBottom={2} alignItems="flex-end"> |
| 129 | <Heading as="h2" size="md" fontSize={'20pt'} py={2}> |
| 130 | My projects |
| 131 | </Heading> |
| 132 | <Button size="lg" colorScheme="purple" height={8} my={2} onClick={() => newProject()}> |
| 133 | New Project |
| 134 | </Button> |
nothing calls this directly
no test coverage detected