diff --git a/web/src/containers/Drive/index.tsx b/web/src/containers/Drive/index.tsx index bac5119..9ec1119 100644 --- a/web/src/containers/Drive/index.tsx +++ b/web/src/containers/Drive/index.tsx @@ -1,4 +1,6 @@ -import React, { useState } from 'react' +import React, { useState, useEffect, useCallback } from 'react' +import { useLocation } from 'react-router-dom' +import axios from 'axios' import CssBaseline from '@mui/material/CssBaseline' import Box from '@mui/material/Box' @@ -6,12 +8,56 @@ import Box from '@mui/material/Box' import SideBar from './sideBar' import Main from './main' +export interface TreeNode { + name: string + relativePath: string + absolutePath: string + children: Array +} + const Drive = () => { + const location = useLocation() + const baseUrl = window.location.origin + const [selectedFilePath, setSelectedFilePath] = useState('') + const [directoryData, setDirectoryData] = useState(null) + + const setFilePathOnMount = useCallback(() => { + const queryParams = new URLSearchParams(location.search) + setSelectedFilePath(queryParams.get('filePath') ?? '') + }, [location.search]) + + useEffect(() => { + axios + .get(`/SASjsApi/drive/fileTree`) + .then((res: any) => { + if (res.data && res.data?.status === 'success') { + setDirectoryData(res.data.tree) + } + }) + .catch((err) => { + console.log(err) + }) + setFilePathOnMount() + }, [setFilePathOnMount]) + + const handleSelect = (node: TreeNode) => { + if (node.children.length) return + + if (!node.name.includes('.')) return + + window.history.pushState( + '', + '', + `${baseUrl}/#/SASjsDrive?filePath=${node.relativePath}` + ) + setSelectedFilePath(node.relativePath) + } + return ( - +
) diff --git a/web/src/containers/Drive/sideBar.tsx b/web/src/containers/Drive/sideBar.tsx index 3d07302..db3d63d 100644 --- a/web/src/containers/Drive/sideBar.tsx +++ b/web/src/containers/Drive/sideBar.tsx @@ -1,6 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react' -import axios from 'axios' -import { useLocation } from 'react-router-dom' +import React from 'react' import { makeStyles } from '@mui/styles' @@ -16,12 +14,7 @@ import TreeItem from '@mui/lab/TreeItem' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import ChevronRightIcon from '@mui/icons-material/ChevronRight' -interface TreeNode { - name: string - relativePath: string - absolutePath: string - children: Array -} +import { TreeNode } from '.' const useStyles = makeStyles(() => ({ root: { @@ -36,46 +29,14 @@ const useStyles = makeStyles(() => ({ const drawerWidth = 240 -const SideBar = (props: any) => { - const location = useLocation() - const baseUrl = window.location.origin +type Props = { + directoryData: TreeNode | null + handleSelect: (node: TreeNode) => void +} + +const SideBar = ({ directoryData, handleSelect }: Props) => { const classes = useStyles() - const { setSelectedFilePath } = props - const [directoryData, setDirectoryData] = useState(null) - - const setFilePathOnMount = useCallback(() => { - const queryParams = new URLSearchParams(location.search) - setSelectedFilePath(queryParams.get('filePath')) - }, [location.search, setSelectedFilePath]) - - useEffect(() => { - axios - .get(`/SASjsApi/drive/fileTree`) - .then((res: any) => { - if (res.data && res.data?.status === 'success') { - setDirectoryData(res.data.tree) - } - }) - .catch((err) => { - console.log(err) - }) - setFilePathOnMount() - }, [setFilePathOnMount]) - - const handleSelect = (node: TreeNode) => { - if (node.children.length) return - - if (!node.name.includes('.')) return - - window.history.pushState( - '', - '', - `${baseUrl}/#/SASjsDrive?filePath=${node.relativePath}` - ) - setSelectedFilePath(node.relativePath) - } - const renderTree = (nodes: TreeNode) => (