add Corporate Context Provider

This commit is contained in:
R
2022-12-23 11:53:27 +07:00
parent 88ad144921
commit 9fe12b5948
11 changed files with 125 additions and 17 deletions

View File

@@ -31,6 +31,7 @@
"import/no-useless-path-segments": 1, "import/no-useless-path-segments": 1,
"import/no-extraneous-dependencies": 0, "import/no-extraneous-dependencies": 0,
"@typescript-eslint/naming-convention": 0, "@typescript-eslint/naming-convention": 0,
"import/extensions": "never",
"object-curly-spacing": [ "object-curly-spacing": [
1, 1,
"always" "always"

View File

@@ -0,0 +1,49 @@
import { Corporate } from '@/@types/corporates';
import axios from '@/utils/axios';
import { ReactNode, createContext, useState, useEffect } from 'react';
import { useParams } from 'react-router';
// hooks
import useResponsive from '../hooks/useResponsive';
// ----------------------------------------------------------------------
export type ConfiguredCorporateContextProps = {
currentCorporate?: Corporate | null;
};
const initialState: ConfiguredCorporateContextProps = {
currentCorporate: null,
};
const ConfiguredCorporateContext = createContext(initialState);
type ConfiguredCorporateProviderProps = {
children: ReactNode;
};
function ConfiguredCorporateProvider({ children }: ConfiguredCorporateProviderProps) {
const { corporate_id } = useParams();
const [corporate, setCorporate] = useState(null);
useEffect(() => {
// Load Corporate
console.log('calling corporate' + corporate_id);
axios.get(`corporates/${corporate_id}`)
.then((res) => {
setCorporate(res.data)
})
}, []);
return (
<ConfiguredCorporateContext.Provider
value={{
currentCorporate: corporate,
}}
>
{children}
</ConfiguredCorporateContext.Provider>
);
}
export { ConfiguredCorporateProvider, ConfiguredCorporateContext };

View File

@@ -90,6 +90,15 @@ export default function DashboardLayout() {
sx={{ sx={{
display: { lg: 'flex' }, display: { lg: 'flex' },
minHeight: { lg: 1 }, minHeight: { lg: 1 },
pl: {
xs: 2,
lg: 0
},
pr: {
xs: 2,
lg: 0
},
}} }}
> >
<DashboardHeader isCollapse={isCollapse} onOpenSidebar={() => setOpen(true)} /> <DashboardHeader isCollapse={isCollapse} onOpenSidebar={() => setOpen(true)} />

View File

@@ -0,0 +1,19 @@
import { Outlet } from 'react-router-dom';
// @mui
import { Stack } from '@mui/material';
import { ConfiguredCorporateProvider } from '@/contexts/ConfiguredCorporateContext';
export default function ConfigLayout() {
return (
<Stack
sx={{
display: { lg: 'flex' },
minHeight: { lg: 1 },
}}
>
<ConfiguredCorporateProvider>
<Outlet />
</ConfiguredCorporateProvider>
</Stack>
);
}

View File

@@ -80,7 +80,7 @@ export default function CorporateTabNavigations({ position }: Props) {
allowScrollButtonsMobile allowScrollButtonsMobile
aria-label="scrollable force tabs example" aria-label="scrollable force tabs example"
> >
{mainTabItems.map((tabItem, index) => (<Tab key={index} onClick={() => { navigate("/corporates/"+corporate_id+"/"+mainTabItems[index].path) }}label={tabItem.label}/>))} {mainTabItems.map((tabItem, index) => (<Tab key={index} onClick={() => { navigate("/corporate/"+corporate_id+"/"+mainTabItems[index].path) }}label={tabItem.label}/>))}
</Tabs> </Tabs>
) )
} }

View File

@@ -1,4 +1,7 @@
import { Corporate } from "@/@types/corporates";
import { ConfiguredCorporateContext } from "@/contexts/ConfiguredCorporateContext";
import { Card, Grid } from "@mui/material"; import { Card, Grid } from "@mui/material";
import { useContext, useEffect, useState } from "react";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs"; import HeaderBreadcrumbs from "../../../components/HeaderBreadcrumbs";
import Page from "../../../components/Page"; import Page from "../../../components/Page";
@@ -12,6 +15,14 @@ export default function Divisions() {
const { themeStretch } = useSettings(); const { themeStretch } = useSettings();
const { corporate_id } = useParams(); const { corporate_id } = useParams();
const [corporate, setCorporate] = useState<Corporate|null>();
const configuredCorporateContext = useContext(ConfiguredCorporateContext);
useEffect(() => {
setCorporate(configuredCorporateContext.currentCorporate);
}, [configuredCorporateContext])
return ( return (
<Page title="Division"> <Page title="Division">
@@ -24,7 +35,7 @@ export default function Divisions() {
href: '/corporates', href: '/corporates',
}, },
{ {
name: 'Corporate Name', name: corporate?.name ?? '-',
href: '/corporates/'+corporate_id, href: '/corporates/'+corporate_id,
}, },
{ {

View File

@@ -333,7 +333,7 @@ export default function Corporates() {
Edit Edit
</Button> </Button>
</Link> </Link>
<Link to={'/corporates/' + row.id + ''}> <Link to={'/corporate/' + row.id + ''}>
<Button variant="outlined" color="primary" size="small"> <Button variant="outlined" color="primary" size="small">
Config Config
</Button> </Button>

View File

@@ -11,26 +11,25 @@ import Page from '../../components/Page';
import axios from '../../utils/axios'; import axios from '../../utils/axios';
import useAuth from '../../hooks/useAuth'; import useAuth from '../../hooks/useAuth';
import { Link , NavLink as RouterLink, useParams } from 'react-router-dom'; import { Link , NavLink as RouterLink, useParams } from 'react-router-dom';
import React, { useEffect, useRef, useState } from 'react'; import React, { useContext, useEffect, useRef, useState } from 'react';
import { Theme, useTheme } from '@mui/material/styles'; import { Theme, useTheme } from '@mui/material/styles';
import { Corporate } from '../../@types/corporates'; import { Corporate } from '../../@types/corporates';
import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data'; import { LaravelPaginatedData, LaravelPaginatedDataDefault } from '../../@types/paginated-data';
import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs'; import HeaderBreadcrumbs from '../../components/HeaderBreadcrumbs';
import CorporateTabNavigations from './CorporateTabNavigations'; import CorporateTabNavigations from './CorporateTabNavigations';
import { fCurrency } from '../../utils/formatNumber'; import { fCurrency } from '../../utils/formatNumber';
import { ConfiguredCorporateContext } from '@/contexts/ConfiguredCorporateContext';
export default function Corporates() { export default function Corporates() {
const { themeStretch } = useSettings(); const { themeStretch } = useSettings();
const { corporate_id } = useParams(); const { corporate_id } = useParams();
const [corporate, setCorporate] = useState<Corporate>(); const [corporate, setCorporate] = useState<Corporate|null>();
const configuredCorporateContext = useContext(ConfiguredCorporateContext);
useEffect(() => { useEffect(() => {
// TODO Use Hooks setCorporate(configuredCorporateContext.currentCorporate);
axios.get(`corporates/${corporate_id}`) }, [configuredCorporateContext])
.then((res) => {
setCorporate(res.data)
})
}, [])
const headStyle = { const headStyle = {
fontWeight: 'bold', fontWeight: 'bold',
@@ -51,8 +50,7 @@ export default function Corporates() {
}, },
]} ]}
/> />
{/* <Container maxWidth={themeStretch ? false : 'xl'}> */} {/* <Container maxWidth={themeStretch ? false : 'xl'}> */}
<Card> <Card>
<Stack spacing="3"> <Stack spacing="3">

View File

@@ -89,8 +89,18 @@ export default function Router() {
element: <CorporateCreate />, element: <CorporateCreate />,
}, },
{ {
path: 'corporates/:corporate_id', path: 'corporate',
element: <CorporateShow />, element: <ConfigLayout />, // Layout that use the context
children: [
{
path: ':corporate_id',
element: <CorporateShow />,
},
{
path: ':corporate_id/divisions',
element: <CorporateDivisions />,
},
]
}, },
{ {
path: 'corporates/:corporate_id/edit', path: 'corporates/:corporate_id/edit',
@@ -272,6 +282,9 @@ const NotFound = Loadable(lazy(() => import('../pages/Page404')));
const Members = Loadable(lazy(() => import('../pages/Members/Index'))); const Members = Loadable(lazy(() => import('../pages/Members/Index')));
const MedicinesCreate = Loadable(lazy(() => import('../pages/Medicines/Create'))); const MedicinesCreate = Loadable(lazy(() => import('../pages/Medicines/Create')));
// Corporate
const ConfigLayout = Loadable(lazy(() => import('../pages/Corporates/ConfigLayout')));
const Corporate = Loadable(lazy(() => import('../pages/Corporates/Index'))); const Corporate = Loadable(lazy(() => import('../pages/Corporates/Index')));
const CorporateCreate = Loadable(lazy(() => import('../pages/Corporates/CreateUpdate'))); const CorporateCreate = Loadable(lazy(() => import('../pages/Corporates/CreateUpdate')));
const CorporateShow = Loadable(lazy(() => import('../pages/Corporates/Show'))); const CorporateShow = Loadable(lazy(() => import('../pages/Corporates/Show')));

View File

@@ -15,7 +15,11 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"noEmit": true, "noEmit": true,
"jsx": "react-jsx" "jsx": "react-jsx",
"paths": {
"@/*": ["./src/*"]
}
}, },
"include": ["src"] "include": ["src"],
"references": [{ "path": "./tsconfig.json" }]
} }

View File

@@ -2,6 +2,7 @@ import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react' import react from '@vitejs/plugin-react'
import svgrPlugin from 'vite-plugin-svgr' import svgrPlugin from 'vite-plugin-svgr'
import { VitePWA } from 'vite-plugin-pwa' import { VitePWA } from 'vite-plugin-pwa'
import path from 'path'
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
@@ -20,4 +21,7 @@ export default defineConfig({
}, },
}), }),
], ],
resolve: {
alias: [{ find: '@', replacement: path.resolve(__dirname, 'src') }],
}
}) })