@syzy/apphost 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +2 -2
- package/dist/App.js +48 -6
- package/dist/components/Login/Login.js +2 -5
- package/dist/components/Mappings/ComponentMapping/ComponentRoleMapping.js +7 -12
- package/dist/config/EnvConfig.d.ts +1 -1
- package/dist/config/EnvConfig.js +1 -1
- package/dist/hoc/withSyzyAuth.d.ts +1 -0
- package/dist/hoc/withSyzyAuth.js +86 -0
- package/dist/hooks/useCurrentUser.d.ts +3 -0
- package/dist/hooks/useCurrentUser.js +6 -0
- package/dist/hooks/useDispatch.d.ts +3 -0
- package/dist/hooks/useDispatch.js +7 -0
- package/dist/hooks/usePermission.d.ts +1 -0
- package/dist/hooks/usePermission.js +7 -0
- package/dist/store/AppAction.d.ts +11 -0
- package/dist/store/AppAction.js +5 -0
- package/dist/store/AppContext.d.ts +3 -0
- package/dist/store/AppContext.js +3 -0
- package/dist/store/AppContextType.d.ts +12 -0
- package/dist/store/AppContextType.js +6 -0
- package/dist/store/AppProvider.d.ts +7 -0
- package/dist/store/AppProvider.js +32 -0
- package/dist/store/HostedInContainerContext.d.ts +5 -0
- package/dist/store/HostedInContainerContext.js +11 -0
- package/dist/store/SesssionReducer.d.ts +4 -0
- package/dist/store/SesssionReducer.js +16 -0
- package/package.json +1 -1
- package/dist/components/api/settings-api.d.ts +0 -26
- package/dist/components/api/settings-api.js +0 -129
- package/dist/services/Storage-service.d.ts +0 -2
- package/dist/services/Storage-service.js +0 -26
package/dist/App.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export declare const componentMap: Record<string, React.ComponentType<any>>;
|
|
3
|
-
declare
|
|
4
|
-
export default
|
|
3
|
+
declare const _default: (props: any) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export default _default;
|
package/dist/App.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
2
|
-
import
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// import { configureAmplify } from "./config/amplifyConfig.ts";
|
|
3
|
+
import { Route, Routes } from 'react-router-dom';
|
|
4
|
+
import { useCurrentUser } from './hooks/useCurrentUser';
|
|
5
|
+
import { withSyzyAuth } from './hoc/withSyzyAuth';
|
|
6
|
+
import React, { useState } from 'react';
|
|
3
7
|
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
|
|
4
|
-
import LoadingSpinner from './components/Loader/Loader';
|
|
5
|
-
import Home from './components/Home/Home';
|
|
6
8
|
import BranchMapping from './components/Mappings/BranchMapping/Branch';
|
|
7
9
|
import MappingFormBranchUser from './components/Mappings/BranchMapping/MappingFormBranchUser';
|
|
8
10
|
import ComponentRoleMapping from './components/Mappings/ComponentMapping/ComponentRoleMapping';
|
|
9
11
|
import MappingFormUserRole from './components/Mappings/RoleMapping/MappingFormUserRole';
|
|
12
|
+
import Home from './components/Home/Home';
|
|
13
|
+
import LoadingSpinner from './components/Loader/Loader';
|
|
14
|
+
// import { isHostedInContainer } from "./util/hostedinContainer.ts";
|
|
15
|
+
// configureAmplify();
|
|
10
16
|
export const componentMap = {
|
|
11
17
|
BranchMapping,
|
|
12
18
|
MappingFormBranchUser,
|
|
@@ -14,7 +20,43 @@ export const componentMap = {
|
|
|
14
20
|
ComponentRoleMapping,
|
|
15
21
|
Home,
|
|
16
22
|
};
|
|
23
|
+
const flattenRoutes = (items) => {
|
|
24
|
+
const flat = [];
|
|
25
|
+
const walk = (arr) => {
|
|
26
|
+
arr.forEach(item => {
|
|
27
|
+
if (item.path && item.requiredComponent) {
|
|
28
|
+
flat.push(item);
|
|
29
|
+
}
|
|
30
|
+
if (item.children) {
|
|
31
|
+
walk(item.children);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
walk(items);
|
|
36
|
+
return flat;
|
|
37
|
+
};
|
|
38
|
+
const withAccessControl = (Component, props, requiredComponent, allowedComponents) => {
|
|
39
|
+
// Check if the user has access
|
|
40
|
+
const isAllowed = !requiredComponent || (allowedComponents?.includes(requiredComponent));
|
|
41
|
+
if (!isAllowed) {
|
|
42
|
+
return () => (_jsx("div", { className: "text-center mt-5", children: _jsx("h3", { className: "text-danger", children: "You are not allowed to see this page." }) }));
|
|
43
|
+
}
|
|
44
|
+
return () => _jsx(Component, { ...props });
|
|
45
|
+
};
|
|
17
46
|
function App({ isSessionReady }) {
|
|
18
|
-
|
|
47
|
+
const { user } = useCurrentUser();
|
|
48
|
+
const [routes, setRoutes] = useState([]);
|
|
49
|
+
const flatRoutes = flattenRoutes(routes);
|
|
50
|
+
// useEffect(() => {
|
|
51
|
+
// isHostedInContainer();
|
|
52
|
+
// configureAmplify();
|
|
53
|
+
// }, []);
|
|
54
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { style: { display: "flex", width: "100%" }, children: _jsx("div", { style: { flex: 1, padding: "10px" }, children: !isSessionReady ? (_jsx(LoadingSpinner, {})) : (_jsx(React.Fragment, { children: _jsxs(Routes, { children: [flatRoutes.map(({ path, requiredComponent, props }) => {
|
|
55
|
+
const PageComponent = componentMap[requiredComponent];
|
|
56
|
+
if (!PageComponent)
|
|
57
|
+
return null;
|
|
58
|
+
const ProtectedComponent = withAccessControl(PageComponent, props, requiredComponent, user.allowedComponents);
|
|
59
|
+
return _jsx(Route, { path: path, element: _jsx(ProtectedComponent, {}) }, path);
|
|
60
|
+
}), _jsx(Route, { path: "*", element: _jsx("h3", { className: "text-danger", children: "Page Not Found" }) })] }) })) }) }), _jsx(ReactQueryDevtools, { initialIsOpen: false })] }));
|
|
19
61
|
}
|
|
20
|
-
export default App;
|
|
62
|
+
export default withSyzyAuth(App);
|
|
@@ -9,14 +9,12 @@ import { FaEye, FaEyeSlash } from "react-icons/fa";
|
|
|
9
9
|
// import logo from "../../../src/assets/images/Hotel-Logo.jpg"
|
|
10
10
|
import { signIn, signUp, confirmSignUp, confirmResetPassword, getCurrentUser, confirmSignIn, resetPassword } from "aws-amplify/auth";
|
|
11
11
|
import { signInSchema, registerSchema, confirmSignUpSchema, resetPasswordSchema, forceResetSchema, forgotPasswordSchema, } from "./loginSchema";
|
|
12
|
-
import { ALL, HIDE_SIGN_UP, HIDE_SIGN_UP_IS_NO } from "../../static/constants";
|
|
13
|
-
import { useGetSettingsByPkAndSk } from "../api/settings-api";
|
|
14
12
|
const LoginForm = ({ login }) => {
|
|
15
13
|
const [authMode, setAuthMode] = useState("signin");
|
|
16
14
|
const navigate = useNavigate();
|
|
17
15
|
const [tempUsername, setTempUsername] = useState("");
|
|
18
16
|
const [showPassword, setShowPassword] = useState(false);
|
|
19
|
-
const { settingsByPkAndSk } = useGetSettingsByPkAndSk(ALL, HIDE_SIGN_UP);
|
|
17
|
+
// const { settingsByPkAndSk } = useGetSettingsByPkAndSk(ALL, HIDE_SIGN_UP);
|
|
20
18
|
const getSchema = () => {
|
|
21
19
|
switch (authMode) {
|
|
22
20
|
case "signin":
|
|
@@ -143,7 +141,6 @@ const LoginForm = ({ login }) => {
|
|
|
143
141
|
const isPassword = type === "password";
|
|
144
142
|
return (_jsxs("div", { className: "mb-3 position-relative", children: [_jsxs("div", { className: "input-group", children: [_jsx("input", { type: isPassword ? (showPassword ? "text" : "password") : type, placeholder: label, ...register(name), className: `form-control ${errors[name] ? "is-invalid" : ""}` }), isPassword && (_jsx("span", { className: "input-group-text bg-white", style: { cursor: "pointer" }, onClick: () => setShowPassword((prev) => !prev), children: showPassword ? _jsx(FaEye, { size: 18 }) : _jsx(FaEyeSlash, { size: 18 }) }))] }), errors[name] && (_jsx("div", { className: "invalid-feedback d-block", children: errors[name]?.message }))] }));
|
|
145
143
|
};
|
|
146
|
-
return (_jsx("div", { className: "d-flex justify-content-center align-items-center vh-100 bg-light", children: _jsx("div", { className: "card shadow-sm p-4 p-md-5 w-100", style: { maxWidth: "420px" }, children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsx("div", { className: "d-flex justify-content-center", children: _jsx("img", { className: "w-75 mx-auto mb-4", src: "logo" }) }), _jsxs("h4", { className: "text-center mb-4 fw-bold", children: [authMode === "signin" && "Sign in to your account", authMode === "register" && "Create a new account", authMode === "confirm" && "Verify your email", authMode === "forgot" && "Forgot Password?", authMode === "reset" && "Reset Password", authMode === "forceReset" && "Set New Password"] }), authMode === "signin" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Password", "password", "password"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Sign In" }),
|
|
147
|
-
_jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("register"), children: "Create Account" }), _jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("forgot"), children: "Forgot Password?" })] })] })), authMode === "register" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Email", "email", "email"), renderInput("Password", "password", "password"), renderInput("Confirm Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Register" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "confirm" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Confirm" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forgot" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), _jsx("button", { type: "submit", className: "btn btn-warning w-100 mb-2", children: "Send Reset Code" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "reset" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Reset Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forceReset" && (_jsxs(_Fragment, { children: [renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Update Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] }))] }) }) }));
|
|
144
|
+
return (_jsx("div", { className: "d-flex justify-content-center align-items-center vh-100 bg-light", children: _jsx("div", { className: "card shadow-sm p-4 p-md-5 w-100", style: { maxWidth: "420px" }, children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsx("div", { className: "d-flex justify-content-center", children: _jsx("img", { className: "w-75 mx-auto mb-4", src: "logo" }) }), _jsxs("h4", { className: "text-center mb-4 fw-bold", children: [authMode === "signin" && "Sign in to your account", authMode === "register" && "Create a new account", authMode === "confirm" && "Verify your email", authMode === "forgot" && "Forgot Password?", authMode === "reset" && "Reset Password", authMode === "forceReset" && "Set New Password"] }), authMode === "signin" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Password", "password", "password"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Sign In" }), _jsx("div", { className: "d-flex justify-content-between", children: _jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("forgot"), children: "Forgot Password?" }) })] })), authMode === "register" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Email", "email", "email"), renderInput("Password", "password", "password"), renderInput("Confirm Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Register" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "confirm" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Confirm" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forgot" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), _jsx("button", { type: "submit", className: "btn btn-warning w-100 mb-2", children: "Send Reset Code" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "reset" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Reset Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forceReset" && (_jsxs(_Fragment, { children: [renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Update Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] }))] }) }) }));
|
|
148
145
|
};
|
|
149
146
|
export default LoginForm;
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useContext, useMemo, useState } from "react";
|
|
3
3
|
import MappingForm from "../MappingForm/MappingForm";
|
|
4
4
|
import FormModal from "../../common/Modal/Modal";
|
|
5
5
|
import ListTable from "../../common/ListTable/ListTable";
|
|
6
6
|
import { toast } from "react-toastify";
|
|
7
7
|
import { MappingTypes } from "../../../domain/type/MappingTypes";
|
|
8
|
-
import { getCompoMappingByRoleIdAndCompoIdFun, useCreateMappingMutation, useListComponentRoleMappings,
|
|
8
|
+
import { getCompoMappingByRoleIdAndCompoIdFun, useCreateMappingMutation, useListComponentRoleMappings, useUpdateMappingMutation, } from "../../../api/mapping-api";
|
|
9
9
|
import { EntityTypes } from "../../../domain/type/EntityTypes";
|
|
10
10
|
import { Status } from "../../../domain/type/StatusEnum";
|
|
11
11
|
import { SyzyDate } from "../../../util/SyzyDate";
|
|
12
12
|
import { DATE_FORMAT_ISO_YYYY_MM_DD_HH_MM_SS } from "../../../util/dateUtils";
|
|
13
|
+
import AppContext from "../../../store/AppContext";
|
|
13
14
|
import { logger } from "../../../util/Logger";
|
|
14
15
|
import { componentMap } from "../../../App";
|
|
15
16
|
import { roles } from "../RoleMapping/MappingFormUserRole";
|
|
@@ -18,7 +19,8 @@ import ListHeader from "../../common/ListTable/ListHeader";
|
|
|
18
19
|
import { ToastContainer } from "react-toastify";
|
|
19
20
|
/* ---------------- Component Role Mapping ---------------- */
|
|
20
21
|
const ComponentRoleMappingPage = () => {
|
|
21
|
-
const
|
|
22
|
+
const { user } = useContext(AppContext) || {};
|
|
23
|
+
const loggedInUserName = user?.userName;
|
|
22
24
|
const [showModal, setShowModal] = useState(false);
|
|
23
25
|
const [editingRow, setEditingRow] = useState();
|
|
24
26
|
const currentISODate = new SyzyDate().toDateFormatString(DATE_FORMAT_ISO_YYYY_MM_DD_HH_MM_SS);
|
|
@@ -26,12 +28,6 @@ const ComponentRoleMappingPage = () => {
|
|
|
26
28
|
const createMappingMutation = useCreateMappingMutation();
|
|
27
29
|
const updateMappingMutation = useUpdateMappingMutation();
|
|
28
30
|
const tableLoading = isLoading || createMappingMutation.isPending || updateMappingMutation.isPending;
|
|
29
|
-
const { data: profiles } = useListProfiles();
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (profiles) {
|
|
32
|
-
setUsers(profiles.map((p) => ({ id: p.sk, name: p.name })));
|
|
33
|
-
}
|
|
34
|
-
}, [profiles]);
|
|
35
31
|
/* ---------------- Component Options ---------------- */
|
|
36
32
|
const components = useMemo(() => Object.keys(componentMap).map((key, index) => ({
|
|
37
33
|
id: `Component#${String(index + 1).padStart(2, "0")}`,
|
|
@@ -50,10 +46,9 @@ const ComponentRoleMappingPage = () => {
|
|
|
50
46
|
const handleSubmit = async (mappings) => {
|
|
51
47
|
try {
|
|
52
48
|
for (const map of mappings) {
|
|
53
|
-
const user = users.find(u => u.id === map.sourceId);
|
|
54
49
|
const role = roles.find(r => r.id === map.targetId);
|
|
55
50
|
const component = components.find(c => c.id === map.sourceId);
|
|
56
|
-
if (!
|
|
51
|
+
if (!role || !component || !loggedInUserName)
|
|
57
52
|
continue;
|
|
58
53
|
const payload = {
|
|
59
54
|
pk: role.id,
|
|
@@ -67,7 +62,7 @@ const ComponentRoleMappingPage = () => {
|
|
|
67
62
|
componentTitle: component.name,
|
|
68
63
|
status: map.status,
|
|
69
64
|
createdDt: editingRow?.createdDt || currentISODate,
|
|
70
|
-
createdBy:
|
|
65
|
+
createdBy: loggedInUserName,
|
|
71
66
|
disabledDt: map.status === Status.Inactive ? currentISODate : "",
|
|
72
67
|
};
|
|
73
68
|
const existing = await getCompoMappingByRoleIdAndCompoIdFun(payload.pk, payload.sk);
|
package/dist/config/EnvConfig.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const EnvConfig = {
|
|
2
2
|
env: import.meta.env.VITE_SERVER_ENV || "local",
|
|
3
3
|
bookingAPi: import.meta.env.VITE_BOOKING_SERVICE_SERVER_URL || "",
|
|
4
|
-
|
|
4
|
+
hmsapi: import.meta.env.VITE_HMS_SERVICE_SERVER_URL || "",
|
|
5
5
|
region: import.meta.env.VITE_AWS_REGION || "",
|
|
6
6
|
userPoolId: import.meta.env.VITE_USERPOOL_ID || "",
|
|
7
7
|
userPoolClientId: import.meta.env.VITE_USERPOOL_CLIENT_ID || "",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function withSyzyAuth<P extends object>(WrappedComponent: React.ComponentType<P>): (props: P) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useContext, useEffect, useState } from "react";
|
|
3
|
+
import AppContext from "../store/AppContext";
|
|
4
|
+
import LoginForm from "../components/Login/Login";
|
|
5
|
+
import { getCurrentUser } from "aws-amplify/auth";
|
|
6
|
+
import { AppActionEnum } from "../store/AppAction";
|
|
7
|
+
import { Client } from "../services/Client.Service";
|
|
8
|
+
import { fetchAuthSession } from 'aws-amplify/auth';
|
|
9
|
+
import { getComponentsByRoleOnly, getRolesMappingByUserIdAndEntityFun, useGetUserMappingByUserId } from "../api/mapping-api";
|
|
10
|
+
import { EntityTypes } from "../domain/type/EntityTypes";
|
|
11
|
+
import { Status } from "../domain/type/StatusEnum";
|
|
12
|
+
export function withSyzyAuth(WrappedComponent) {
|
|
13
|
+
const ComponentWithAuthenticator = (props) => {
|
|
14
|
+
const [currentUser, setCurrentUser] = useState();
|
|
15
|
+
const { user, dispatch } = useContext(AppContext) || { user: undefined, allowedComponents: undefined, dispatch: undefined };
|
|
16
|
+
const [_isLoggedIn, setIsLoggedIn] = useState(false);
|
|
17
|
+
const [_emailVerifiedStatus, setEmailVerifiedStatus] = useState("");
|
|
18
|
+
const [isSessionReady, setIsSessionReady] = useState(false);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!user?.userName) {
|
|
21
|
+
setCurrentUser(null);
|
|
22
|
+
setIsSessionReady(false);
|
|
23
|
+
}
|
|
24
|
+
}, [user]);
|
|
25
|
+
const fetchSession = async () => {
|
|
26
|
+
try {
|
|
27
|
+
const session = await getCurrentUser();
|
|
28
|
+
const userInfo = await fetchAuthSession({ forceRefresh: true });
|
|
29
|
+
setEmailVerifiedStatus(userInfo.tokens?.idToken?.payload.email_verified?.toString() ?? "");
|
|
30
|
+
if (session) {
|
|
31
|
+
const userId = session.signInDetails?.loginId ?? session.username;
|
|
32
|
+
setCurrentUser(userId);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
setCurrentUser(null);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
setCurrentUser(null);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
fetchSession();
|
|
44
|
+
}, []);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const stopResetScheduler = Client.startClientResetScheduler();
|
|
47
|
+
return () => stopResetScheduler();
|
|
48
|
+
}, []);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
setIsLoggedIn(!!user?.userName);
|
|
51
|
+
}, [user]);
|
|
52
|
+
const { userMappingByUserId } = useGetUserMappingByUserId(currentUser ?? "");
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
const updateSession = async () => {
|
|
55
|
+
if (!currentUser)
|
|
56
|
+
return;
|
|
57
|
+
const branchId = userMappingByUserId?.pk ?? "";
|
|
58
|
+
// Fetch roles of this user
|
|
59
|
+
const roleData = await getRolesMappingByUserIdAndEntityFun(branchId, currentUser, EntityTypes.ROLE);
|
|
60
|
+
const activeRoles = roleData.filter(r => r.status === Status.Active);
|
|
61
|
+
const roleNames = activeRoles.map(r => r.roleName);
|
|
62
|
+
// Fetch components for each active role
|
|
63
|
+
const compData = await Promise.all(activeRoles.map(role => getComponentsByRoleOnly(role.roleId)));
|
|
64
|
+
const allowedComponents = compData.flat().map(c => c.componentTitle);
|
|
65
|
+
// Build and dispatch user session
|
|
66
|
+
const userSession = {
|
|
67
|
+
userName: currentUser,
|
|
68
|
+
branchId,
|
|
69
|
+
roles: roleNames,
|
|
70
|
+
allowedComponents: [...new Set(allowedComponents)],
|
|
71
|
+
};
|
|
72
|
+
dispatch?.({ session: userSession, type: AppActionEnum.SignIn });
|
|
73
|
+
setIsSessionReady(true);
|
|
74
|
+
};
|
|
75
|
+
updateSession();
|
|
76
|
+
}, [currentUser, userMappingByUserId]);
|
|
77
|
+
// Login handler
|
|
78
|
+
const login = (loggedIn) => {
|
|
79
|
+
setIsLoggedIn(loggedIn);
|
|
80
|
+
if (loggedIn)
|
|
81
|
+
fetchSession();
|
|
82
|
+
};
|
|
83
|
+
return (_jsx("div", { children: currentUser === null ? _jsx(LoginForm, { login: login }) : _jsx(WrappedComponent, { ...props, isSessionReady: isSessionReady }) }));
|
|
84
|
+
};
|
|
85
|
+
return ComponentWithAuthenticator;
|
|
86
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import AppContext from "../store/AppContext";
|
|
3
|
+
import { defaultSession } from "../store/AppContextType";
|
|
4
|
+
export const useDispatch = () => {
|
|
5
|
+
const { dispatch } = useContext(AppContext) || { user: defaultSession };
|
|
6
|
+
return { dispatch };
|
|
7
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function AmIPermitted(componentName: string): boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// hooks/usePermissions.ts
|
|
2
|
+
import { useContext } from "react";
|
|
3
|
+
import AppContext from "../store/AppContext";
|
|
4
|
+
export function AmIPermitted(componentName) {
|
|
5
|
+
const { user } = useContext(AppContext) || {};
|
|
6
|
+
return user?.allowedComponents?.includes(componentName) ?? false;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AppAction } from "./AppAction";
|
|
2
|
+
export interface AppSession {
|
|
3
|
+
userName: string;
|
|
4
|
+
branchId?: string;
|
|
5
|
+
roles: string[];
|
|
6
|
+
allowedComponents?: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare const defaultSession: AppSession;
|
|
9
|
+
export interface AppContextProps {
|
|
10
|
+
user: AppSession;
|
|
11
|
+
dispatch: React.Dispatch<AppAction>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { defaultSession } from "./AppContextType";
|
|
3
|
+
import AppContext from "./AppContext";
|
|
4
|
+
import { ToastContainer } from 'react-toastify';
|
|
5
|
+
import 'react-toastify/dist/ReactToastify.css';
|
|
6
|
+
import { AppActionEnum } from "./AppAction";
|
|
7
|
+
import { sessionStorage } from "aws-amplify/utils";
|
|
8
|
+
import { APPHOSTSESSION_KEY, useSessionReducer } from "./SesssionReducer";
|
|
9
|
+
import { logger } from "../util/Logger";
|
|
10
|
+
const appContextReducer = (state, action) => {
|
|
11
|
+
logger.debug("Action:", action);
|
|
12
|
+
let newState = state;
|
|
13
|
+
switch (action.type) {
|
|
14
|
+
case AppActionEnum.SignIn:
|
|
15
|
+
newState = {
|
|
16
|
+
...action.session,
|
|
17
|
+
};
|
|
18
|
+
break;
|
|
19
|
+
case AppActionEnum.SignOut:
|
|
20
|
+
newState = { ...defaultSession };
|
|
21
|
+
sessionStorage.clear();
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
newState = state;
|
|
25
|
+
}
|
|
26
|
+
return newState;
|
|
27
|
+
};
|
|
28
|
+
const AppProvider = ({ children }) => {
|
|
29
|
+
const [state, dispatch] = useSessionReducer(appContextReducer, defaultSession, APPHOSTSESSION_KEY);
|
|
30
|
+
return (_jsxs(_Fragment, { children: [_jsx(ToastContainer, { position: "top-right", autoClose: 5000 }), _jsx(AppContext.Provider, { value: { user: state, dispatch }, children: children })] }));
|
|
31
|
+
};
|
|
32
|
+
export default AppProvider;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
const HostedInContainerContext = createContext(false);
|
|
4
|
+
export const HostedInContainerProvider = ({ children }) => {
|
|
5
|
+
const isHosted = (() => {
|
|
6
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
7
|
+
return urlParams.get('hosted_in_container') === 'true';
|
|
8
|
+
})();
|
|
9
|
+
return (_jsx(HostedInContainerContext.Provider, { value: isHosted, children: children }));
|
|
10
|
+
};
|
|
11
|
+
export const useHostedInContainer = () => useContext(HostedInContainerContext);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Reducer, Dispatch } from 'react';
|
|
2
|
+
import { AppSession } from './AppContextType';
|
|
3
|
+
export declare const APPHOSTSESSION_KEY = "AppHostSession";
|
|
4
|
+
export declare const useSessionReducer: <T extends AppSession, A>(reducer: Reducer<T, A>, initialState: T, storageKey: string) => [T, Dispatch<A>];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useReducer, useEffect } from 'react';
|
|
2
|
+
export const APPHOSTSESSION_KEY = 'AppHostSession';
|
|
3
|
+
export const useSessionReducer = (reducer, initialState, storageKey) => {
|
|
4
|
+
const [state, dispatch] = useReducer(reducer, initialState, () => {
|
|
5
|
+
const value = localStorage.getItem(storageKey); // use storageKey here
|
|
6
|
+
let retState = { ...initialState };
|
|
7
|
+
if (value) {
|
|
8
|
+
retState = JSON.parse(value);
|
|
9
|
+
}
|
|
10
|
+
return retState;
|
|
11
|
+
});
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
localStorage.setItem(storageKey, JSON.stringify(state)); // same key
|
|
14
|
+
}, [storageKey, state]);
|
|
15
|
+
return [state, dispatch];
|
|
16
|
+
};
|
package/package.json
CHANGED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { SettingsDto } from "../../domain/model/SettingsDto";
|
|
2
|
-
import { UndefinedString } from "../../domain/type/Nullable";
|
|
3
|
-
import { PrefixDescription } from "../../domain/model/PrefixDescriptionDto";
|
|
4
|
-
export declare const GET_SETTINGS_BY_PK: string;
|
|
5
|
-
export declare const GET_SETTINGS_BY_PK_AND_SK: string;
|
|
6
|
-
export declare const listSettings = "query listSettings(\n $pk: ID\n $sk: ModelStringKeyConditionInput\n $filter: ModelSettingsFilterInput\n) {\n listSettings(pk: $pk, sk: $sk, filter: $filter) {\n pk\n sk\n value\n description\n createdDt\n __typename\n }\n}";
|
|
7
|
-
export declare const updateSettings = "mutation updateSettings($input: SettingsInput!) {\n updateSettings(input: $input) {\n pk\n sk\n value\n description\n createdDt\n __typename\n }\n}";
|
|
8
|
-
export declare const transformtoSettingsDto: (interviewProspectData: any) => SettingsDto;
|
|
9
|
-
export declare const transformdToPrefixDescription: (description: string) => PrefixDescription;
|
|
10
|
-
export declare const getSettingsByPkFun: (pk: UndefinedString) => Promise<SettingsDto[]>;
|
|
11
|
-
export declare const useGetSettingsByPk: (pk: string) => {
|
|
12
|
-
settingsByPK: SettingsDto[] | undefined;
|
|
13
|
-
settingsByPKError: Error | null;
|
|
14
|
-
settingsByPKLoading: boolean;
|
|
15
|
-
settingsByPKFetching: boolean;
|
|
16
|
-
settingsByPKSuccess: boolean;
|
|
17
|
-
};
|
|
18
|
-
export declare const getSettingsByPkAndSKFun: (pk: UndefinedString, sk: UndefinedString) => Promise<SettingsDto>;
|
|
19
|
-
export declare const useGetSettingsByPkAndSk: (pk: string, sk: string) => {
|
|
20
|
-
settingsByPkAndSk: SettingsDto | undefined;
|
|
21
|
-
settingsByPkAndSkError: Error | null;
|
|
22
|
-
settingsByPkAndSkLoading: boolean;
|
|
23
|
-
settingsByPkAndSkFetching: boolean;
|
|
24
|
-
settingsByPkAndSkSuccess: boolean;
|
|
25
|
-
};
|
|
26
|
-
export declare const useUpdateSettingsMutation: () => import("@tanstack/react-query").UseMutationResult<any, Error, SettingsDto, unknown>;
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { keepPreviousData, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
2
|
-
import { initSettings } from "../../domain/model/SettingsDto";
|
|
3
|
-
import { transformToData } from "../../util/transformToData";
|
|
4
|
-
import { logger } from "../../util/Logger";
|
|
5
|
-
import { ALL } from "../../static/constants";
|
|
6
|
-
export const GET_SETTINGS_BY_PK = "settingsbypk";
|
|
7
|
-
export const GET_SETTINGS_BY_PK_AND_SK = "settingsbypkandsk";
|
|
8
|
-
const endpoint = EnvConfig.appHostAPi;
|
|
9
|
-
export const listSettings = `query listSettings(
|
|
10
|
-
$pk: ID
|
|
11
|
-
$sk: ModelStringKeyConditionInput
|
|
12
|
-
$filter: ModelSettingsFilterInput
|
|
13
|
-
) {
|
|
14
|
-
listSettings(pk: $pk, sk: $sk, filter: $filter) {
|
|
15
|
-
pk
|
|
16
|
-
sk
|
|
17
|
-
value
|
|
18
|
-
description
|
|
19
|
-
createdDt
|
|
20
|
-
__typename
|
|
21
|
-
}
|
|
22
|
-
}`;
|
|
23
|
-
export const updateSettings = `mutation updateSettings($input: SettingsInput!) {
|
|
24
|
-
updateSettings(input: $input) {
|
|
25
|
-
pk
|
|
26
|
-
sk
|
|
27
|
-
value
|
|
28
|
-
description
|
|
29
|
-
createdDt
|
|
30
|
-
__typename
|
|
31
|
-
}
|
|
32
|
-
}`;
|
|
33
|
-
export const transformtoSettingsDto = (interviewProspectData) => transformToData(interviewProspectData);
|
|
34
|
-
export const transformdToPrefixDescription = (description) => {
|
|
35
|
-
return JSON.parse(description);
|
|
36
|
-
};
|
|
37
|
-
export const getSettingsByPkFun = async (pk) => {
|
|
38
|
-
try {
|
|
39
|
-
const client = await Client.getCustomGraphqlClient(endpoint);
|
|
40
|
-
const variables = {
|
|
41
|
-
filter: {
|
|
42
|
-
or: [
|
|
43
|
-
{ pk: { eq: pk } },
|
|
44
|
-
{ pk: { eq: ALL } }
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const response = await client.request(listSettings, variables);
|
|
49
|
-
const settingsData = response.listSettings;
|
|
50
|
-
return (settingsData && settingsData.length > 0) ? settingsData.map((eventSchedule) => transformtoSettingsDto(eventSchedule)) : [];
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
export const useGetSettingsByPk = (pk) => {
|
|
57
|
-
const { data, isLoading, error, isFetching, isSuccess } = useQuery({
|
|
58
|
-
queryKey: [GET_SETTINGS_BY_PK, pk],
|
|
59
|
-
queryFn: () => getSettingsByPkFun(pk),
|
|
60
|
-
placeholderData: keepPreviousData,
|
|
61
|
-
staleTime: 1000 * 5 * 60,
|
|
62
|
-
enabled: pk !== "" && pk !== undefined,
|
|
63
|
-
});
|
|
64
|
-
return {
|
|
65
|
-
settingsByPK: data,
|
|
66
|
-
settingsByPKError: error,
|
|
67
|
-
settingsByPKLoading: isLoading,
|
|
68
|
-
settingsByPKFetching: isFetching,
|
|
69
|
-
settingsByPKSuccess: isSuccess,
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
export const getSettingsByPkAndSKFun = async (pk, sk) => {
|
|
73
|
-
try {
|
|
74
|
-
const client = await Client.getCustomGraphqlClient(endpoint);
|
|
75
|
-
const variables = {
|
|
76
|
-
pk: pk,
|
|
77
|
-
sk: {
|
|
78
|
-
eq: sk
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
const response = await client.request(listSettings, variables);
|
|
82
|
-
const settingsData = response.listSettings;
|
|
83
|
-
return (settingsData && settingsData.length > 0) ? transformtoSettingsDto(settingsData[0]) : initSettings;
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
return initSettings;
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
export const useGetSettingsByPkAndSk = (pk, sk) => {
|
|
90
|
-
const { data, isLoading, error, isFetching, isSuccess } = useQuery({
|
|
91
|
-
queryKey: [GET_SETTINGS_BY_PK_AND_SK, pk, sk],
|
|
92
|
-
queryFn: () => getSettingsByPkAndSKFun(pk, sk),
|
|
93
|
-
placeholderData: keepPreviousData,
|
|
94
|
-
staleTime: 1000 * 5 * 60,
|
|
95
|
-
enabled: pk !== "" && pk !== undefined && sk !== "" && sk !== undefined,
|
|
96
|
-
});
|
|
97
|
-
return {
|
|
98
|
-
settingsByPkAndSk: data,
|
|
99
|
-
settingsByPkAndSkError: error,
|
|
100
|
-
settingsByPkAndSkLoading: isLoading,
|
|
101
|
-
settingsByPkAndSkFetching: isFetching,
|
|
102
|
-
settingsByPkAndSkSuccess: isSuccess,
|
|
103
|
-
};
|
|
104
|
-
};
|
|
105
|
-
export const useUpdateSettingsMutation = () => {
|
|
106
|
-
async function createVersionFn(settingsData) {
|
|
107
|
-
const client = await Client.getClient();
|
|
108
|
-
const response = await client.graphql({
|
|
109
|
-
query: updateSettings,
|
|
110
|
-
variables: {
|
|
111
|
-
input: settingsData
|
|
112
|
-
},
|
|
113
|
-
});
|
|
114
|
-
return response;
|
|
115
|
-
}
|
|
116
|
-
const queryClient = useQueryClient();
|
|
117
|
-
return useMutation({
|
|
118
|
-
mutationFn: createVersionFn,
|
|
119
|
-
onSuccess: (_data, variables) => {
|
|
120
|
-
const settingsByPKQueryKey = [GET_SETTINGS_BY_PK, variables.pk];
|
|
121
|
-
queryClient.invalidateQueries({ queryKey: settingsByPKQueryKey });
|
|
122
|
-
const settingsByPKAndSKQueryKey = [GET_SETTINGS_BY_PK_AND_SK, variables.pk, variables.sk];
|
|
123
|
-
queryClient.invalidateQueries({ queryKey: settingsByPKAndSKQueryKey });
|
|
124
|
-
},
|
|
125
|
-
onError: (err) => {
|
|
126
|
-
logger.error("Error while settings updating", err);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { uploadData } from 'aws-amplify/storage';
|
|
2
|
-
import { LogCategoryEnum } from '../util/LogEnum';
|
|
3
|
-
import { logger } from '../util/Logger';
|
|
4
|
-
import { EnvConfig } from '../config/EnvConfig';
|
|
5
|
-
export const getImageUrl = async (imageKey) => {
|
|
6
|
-
logger.debug(LogCategoryEnum.Info, "imageKey passed", imageKey);
|
|
7
|
-
let returnString = undefined;
|
|
8
|
-
if (imageKey) {
|
|
9
|
-
//Below for hms-ck-dev env image bucket url -------------
|
|
10
|
-
returnString = `${EnvConfig.imageStorageBucketUrl}/${imageKey}`;
|
|
11
|
-
}
|
|
12
|
-
return returnString;
|
|
13
|
-
};
|
|
14
|
-
export const uploadImage = async (imageKey, image) => {
|
|
15
|
-
logger.debug(LogCategoryEnum.Info, "inside upload image function", imageKey);
|
|
16
|
-
logger.debug(LogCategoryEnum.Info, "inside upload image function", image);
|
|
17
|
-
await uploadData({
|
|
18
|
-
key: imageKey,
|
|
19
|
-
data: image,
|
|
20
|
-
options: {
|
|
21
|
-
accessLevel: 'guest',
|
|
22
|
-
contentType: image.type,
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
logger.debug(LogCategoryEnum.Info, "image key", imageKey);
|
|
26
|
-
};
|