diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index e0f45c1a0c3764093887865048d34d6a3a963554..4cd8e405c1f5e28edee19bbf47fa0768eec30c30 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1,18 +1,39 @@ -import { routes } from './routes'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; - +import { useState, useEffect } from 'react'; +import { BucketInfo } from './models/bucket'; +import { routes } from './routes'; +import APIService from './services/APIService'; +import { BucketsListContext } from './services/BucketListContext'; function App() { + + const [isAuthenticated, setIsAuthenticated] = useState(false); + const [bucketList, setBucketLists] = useState<BucketInfo[]>([]); + + useEffect(() => { + setIsAuthenticated(APIService.isAuthenticated()); + APIService + .get("buckets") + .then(data => { + const buckets: BucketInfo[] = data["buckets"]; + console.log(`Fetched ${buckets.length} buckets`); + setBucketLists(buckets); + }); + }, [isAuthenticated]); + + const router = createBrowserRouter(routes.map(route => { return { path: route.path, element: route.element } - })); + })) return ( <div className="flex mb-4"> - <RouterProvider router={router} /> + <BucketsListContext.Provider value={bucketList}> + <RouterProvider router={router} /> + </BucketsListContext.Provider> </div> ) } diff --git a/frontend/src/routes/Buckets/index.tsx b/frontend/src/routes/Buckets/index.tsx index 6b60f7d1f064aca12f62792d4ff6a217d93a63ea..71aee77dde794004b20c2da6ed0225fa57442e06 100644 --- a/frontend/src/routes/Buckets/index.tsx +++ b/frontend/src/routes/Buckets/index.tsx @@ -1,8 +1,8 @@ -import { useState } from 'react'; +import { useContext } from 'react'; import { Page } from '../../components/Page'; -import APIService from "../../services/APIService"; import { getHumanSize } from '../../commons/utils'; import { BucketInfo } from '../../models/bucket'; +import { BucketsListContext } from '../../services/BucketListContext'; const BucketView = (bucketInfo: BucketInfo) => { const creationDate = new Date(bucketInfo.creation_date); @@ -18,25 +18,16 @@ const BucketView = (bucketInfo: BucketInfo) => { } export const Buckets = () => { - const [isFirstRender, setIsFirstRender] = useState(true); - const [buckestList, setBucketLists] = useState<BucketInfo[]>([]); - - if (isFirstRender) { - setIsFirstRender(false); - APIService.get("buckets") - .then(data => { - setBucketLists(data["buckets"]); - }); - } + const bucketList = useContext(BucketsListContext); return ( <Page title='Buckets'> - {buckestList ? buckestList.map(bucketInfo => + {bucketList.map(bucketInfo => <BucketView key={bucketInfo.name + bucketInfo.creation_date} {...bucketInfo} /> - ) : null} + )} </Page> ) } \ No newline at end of file diff --git a/frontend/src/routes/Home/index.tsx b/frontend/src/routes/Home/index.tsx index a001a0c3bd7a9ecbece8937c0afa3cd2fec3c0b3..f563dc5106850e3d75c931314dd83bd26efbbffc 100644 --- a/frontend/src/routes/Home/index.tsx +++ b/frontend/src/routes/Home/index.tsx @@ -1,39 +1,39 @@ import { Page } from '../../components/Page'; import { Table } from '../../components/Table'; -import './index.css'; -import { useState } from 'react'; +import { useContext } from 'react'; import { BucketInfo } from '../../models/bucket'; -import APIService from '../../services/APIService'; import { getHumanSize, parseReadWriteAccess } from '../../commons/utils'; - +import { BucketsListContext } from '../../services/BucketListContext'; +import './index.css'; export const Home = () => { - const [isFirstRender, setIsFirstRender] = useState(true); - const [bucketList, setBucketLists] = useState<BucketInfo[][]>([]); + const onClick = (element: React.MouseEvent<HTMLTableRowElement>, index: number) => { + const bucketName = element.currentTarget.firstChild?.textContent; + console.log(bucketName); + } const columns = ["Bucket", "Objects", "Size", "Access"]; - if (isFirstRender) { - setIsFirstRender(false); - APIService.get("buckets") - .then(data => { - setBucketLists(data["buckets"].map((bucket: BucketInfo) => { - return [ - bucket.name, - bucket.objects, - getHumanSize(bucket.size), - parseReadWriteAccess(bucket.rw_access) - ] - })); - }); - } + const bucketList = useContext(BucketsListContext).map((bucket: BucketInfo) => { + return [ + bucket.name, + bucket.objects, + getHumanSize(bucket.size), + parseReadWriteAccess(bucket.rw_access) + ] + }); return ( <Page title="Home"> <div className="Home"> <div className="flex place-content-center"> - <Table className="table-auto w-2/3" columns={columns} data={bucketList} /> + <Table + className="table-auto w-2/3" + columns={columns} + data={bucketList} + onClick={onClick} + /> </div> </div> </Page> diff --git a/frontend/src/services/BucketListContext.tsx b/frontend/src/services/BucketListContext.tsx new file mode 100644 index 0000000000000000000000000000000000000000..28f1726c4e8585ba10575907ec65c62577775656 --- /dev/null +++ b/frontend/src/services/BucketListContext.tsx @@ -0,0 +1,4 @@ +import { createContext } from "react"; +import { BucketInfo } from "../models/bucket"; + +export const BucketsListContext = createContext<BucketInfo[]>([]);