Skip to content

Commit

Permalink
Merge pull request #254 from Dias999/feature/packages_structure
Browse files Browse the repository at this point in the history
Feature/packages structure
  • Loading branch information
andreneto97 authored Oct 11, 2024
2 parents 69ca80f + 001258e commit f552228
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 190 deletions.
4 changes: 1 addition & 3 deletions packages/react-auth-provider/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@
"dist"
],
"peerDependencies": {
"@concepta/react-data-provider": "^2.0.0-alpha.10",
"react": "^18.2.0"
},
"dependencies": {
"@concepta/react-data-provider": "^2.0.0-alpha.10"
}
}
1 change: 1 addition & 0 deletions packages/react-auth-provider/src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ const AuthProvider = ({
const doLogout = async () => {
setAccessToken(undefined);
setRefreshToken(undefined);
setUser(undefined);
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
};
Expand Down
14 changes: 7 additions & 7 deletions packages/react-material-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@
"dist"
],
"peerDependencies": {
"@concepta/react-auth-provider": "^1.0.0-alpha.23",
"@concepta/react-data-provider": "^1.0.0-alpha.23"
"@concepta/react-auth-provider": "^2.0.0-alpha.10",
"@concepta/react-data-provider": "^2.0.0-alpha.10",
"json-schema": "0.4.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-toastify": "^10.0.5"
},
"peerDependenciesMeta": {
"@types/react": {
Expand All @@ -36,11 +40,7 @@
"@rjsf/mui": "^5.0.0-beta.13",
"@rjsf/utils": "^5.0.0-beta.13",
"@rjsf/validator-ajv6": "^5.0.0-beta.13",
"json-schema": "0.4.0",
"lodash": "^4.17.21",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-toastify": "^10.0.5"
"lodash": "^4.17.21"
},
"devDependencies": {
"@types/lodash": "^4.14.198",
Expand Down
6 changes: 4 additions & 2 deletions packages/react-navigation/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@
"optional": true
}
},
"dependencies": {
"peerDependencies": {
"@concepta/react-auth-provider": "^2.0.0-alpha.10",
"@concepta/react-data-provider": "^2.0.0-alpha.10",
"@concepta/react-material-ui": "^2.0.0-alpha.10",
"@mui/material": "^5.16.6",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-dom": "^18.2.0"
},
"dependencies": {
"react-router": "^6.26.0",
"react-router-dom": "^6.26.0",
"react-toastify": "^10.0.5"
Expand Down
139 changes: 139 additions & 0 deletions packages/react-navigation/src/components/ChildRoutes.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
import React, { Children, ReactElement, ReactNode } from 'react';
import { useRoutes } from 'react-router-dom';
import {
DrawerItemProps,
AuthModuleProps,
DrawerProps,
NavbarProps,
} from '@concepta/react-material-ui/';

import DefaultRoute from './DefaultRoute';
import AuthRoute from './AuthRoute';

export type AuthModule = {
signIn?: AuthModuleProps;
signUp?: AuthModuleProps;
forgotPassword?: AuthModuleProps;
resetPassword?: AuthModuleProps;
};

type ChildRoutesProps = {
children: ReactElement[];
useNavigateFilter?: boolean;
authModuleProps?: AuthModule;
drawerProps?: DrawerProps;
navbarProps?: NavbarProps;
renderAppBar?: (
menuItems: DrawerItemProps[],
children: ReactNode,
) => ReactNode;
renderSignIn?: (home: string) => ReactNode;
renderSignUp?: (home: string) => ReactNode;
renderForgotPassword?: (home: string) => ReactNode;
renderResetPassword?: (home: string) => ReactNode;
};

const ChildRoutes = ({
children,
useNavigateFilter,
authModuleProps,
drawerProps,
navbarProps,
renderAppBar,
renderSignIn,
renderSignUp,
renderForgotPassword,
renderResetPassword,
}: ChildRoutesProps) => {
const items = Children.map(children, (child) => {
// This validation is needed so `showDrawerItem`
// can be `true` by default
if (
child.props.showDrawerItem !== undefined &&
!child.props.showDrawerItem
) {
return null;
}

return {
id: child.props.id,
text: child.props.name,
icon: child.props.icon,
};
}).filter((item) => !!item);

const home = children[0].props.id;

const routesChildren = useRoutes([
{
path: 'sign-in',
element: renderSignIn ? (
renderSignIn(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.signIn}
route="signIn"
/>
),
},
{
path: 'sign-up',
element: renderSignUp ? (
renderSignUp(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.signUp}
route="signUp"
/>
),
},
{
path: 'forgot-password',
element: renderForgotPassword ? (
renderForgotPassword(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.forgotPassword}
route={'forgotPassword'}
/>
),
},
{
path: 'reset-password',
element: renderResetPassword ? (
renderResetPassword(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.resetPassword}
route="resetPassword"
/>
),
},
...Children.map(children, (child) => ({
path: child.props.id,
element: (
<DefaultRoute
renderAppBar={renderAppBar}
isUnprotected={child.props.isUnprotected}
useNavigateFilter={useNavigateFilter}
resource={child.props.id}
name={child.props.name}
showAppBar={child.props.showAppBar}
module={child.props.module}
page={child.props.page}
items={items}
drawerProps={drawerProps}
navbarProps={navbarProps}
/>
),
})),
]);

return routesChildren;
};

export default ChildRoutes;
149 changes: 25 additions & 124 deletions packages/react-navigation/src/components/Router.tsx
Original file line number Diff line number Diff line change
@@ -1,153 +1,54 @@
import React, { Children, ReactElement, ReactNode } from 'react';
import React, { ReactElement } from 'react';
import {
createMemoryRouter,
createBrowserRouter,
RouterProvider,
Outlet,
Navigate,
} from 'react-router-dom';
import {
DrawerItemProps,
AuthModuleProps,
DrawerProps,
NavbarProps,
} from '@concepta/react-material-ui/';

import DefaultRoute from './DefaultRoute';
import AuthRoute from './AuthRoute';

export type AuthModule = {
signIn?: AuthModuleProps;
signUp?: AuthModuleProps;
forgotPassword?: AuthModuleProps;
resetPassword?: AuthModuleProps;
};

type RouterProps = {
children: ReactElement[];
useNavigateFilter?: boolean;
rootElement?: ReactElement;
childRoutes?: ReactElement;
initialRoute?: string;
useMemoryRouter?: boolean;
authModuleProps?: AuthModule;
drawerProps?: DrawerProps;
navbarProps?: NavbarProps;
renderAppBar?: (
menuItems: DrawerItemProps[],
children: ReactNode,
) => ReactNode;
renderSignIn?: (home: string) => ReactNode;
renderSignUp?: (home: string) => ReactNode;
renderForgotPassword?: (home: string) => ReactNode;
renderResetPassword?: (home: string) => ReactNode;
};

const Router = ({
children,
useNavigateFilter,
rootElement,
initialRoute,
childRoutes,
useMemoryRouter = false,
authModuleProps,
drawerProps,
navbarProps,
renderAppBar,
renderSignIn,
renderSignUp,
renderForgotPassword,
renderResetPassword,
}: RouterProps) => {
const items = Children.map(children, (child) => {
// This validation is needed so `showDrawerItem`
// can be `true` by default
if (
child.props.showDrawerItem !== undefined &&
!child.props.showDrawerItem
) {
return null;
}

return {
id: child.props.id,
text: child.props.name,
icon: child.props.icon,
};
}).filter((item) => !!item);

const home = children[0].props.id;

const createRouter = useMemoryRouter
? createMemoryRouter
: createBrowserRouter;

const router = createRouter([
{
path: '/',
element: <Navigate to={initialRoute ?? home} replace />,
},
{
path: '/sign-in',
element: renderSignIn ? (
renderSignIn(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.signIn}
route="signIn"
/>
),
},
{
path: '/sign-up',
element: renderSignUp ? (
renderSignUp(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.signUp}
route="signUp"
/>
),
},
{
path: '/forgot-password',
element: renderForgotPassword ? (
renderForgotPassword(home)
element: rootElement ? (
React.cloneElement(
rootElement,
{},
<>
<Outlet />
{initialRoute && <Navigate to={initialRoute} replace />}
</>,
)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.forgotPassword}
route={'forgotPassword'}
/>
<div>
Home test no root
<Outlet />
</div>
),
children: [
{
path: '*',
element: childRoutes,
},
],
},
{
path: '/reset-password',
element: renderResetPassword ? (
renderResetPassword(home)
) : (
<AuthRoute
home={home}
moduleProps={authModuleProps?.resetPassword}
route="resetPassword"
/>
),
},
...Children.map(children, (child) => ({
path: child.props.id,
element: (
<DefaultRoute
renderAppBar={renderAppBar}
isUnprotected={child.props.isUnprotected}
useNavigateFilter={useNavigateFilter}
resource={child.props.id}
name={child.props.name}
showAppBar={child.props.showAppBar}
module={child.props.module}
page={child.props.page}
items={items}
drawerProps={drawerProps}
navbarProps={navbarProps}
/>
),
})),
]);

return <RouterProvider router={router} />;
Expand Down
3 changes: 2 additions & 1 deletion packages/react-navigation/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Router from './components/Router';
import ChildRoutes from './components/ChildRoutes';
import Resource from './components/Resource';

export { Router, Resource };
export { Router, ChildRoutes, Resource };
Loading

0 comments on commit f552228

Please sign in to comment.