@campxdev/shared 1.8.50 → 1.9.0

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.
Files changed (240) hide show
  1. package/antd.customize.less +73 -73
  2. package/exports.ts +19 -19
  3. package/package.json +86 -86
  4. package/src/assets/fonts/avenir/index.ts +13 -13
  5. package/src/assets/fonts/poppins/index.ts +18 -18
  6. package/src/assets/images/index.ts +17 -17
  7. package/src/assets/images/unauth.svg +92 -92
  8. package/src/components/ActionButton.tsx +20 -20
  9. package/src/components/ApplicationProfile/ApplicationProfile.tsx +344 -342
  10. package/src/components/ApplicationProfile/UserProfileRelation.tsx +130 -174
  11. package/src/components/ApplicationProfile/index.tsx +1 -1
  12. package/src/components/ApplicationProfile/{Service.ts → services.ts} +68 -68
  13. package/src/components/Attachment.tsx +26 -26
  14. package/src/components/AutocompleteSearch/AutocompleteSearch.tsx +57 -57
  15. package/src/components/AutocompleteSearch/index.tsx +1 -1
  16. package/src/components/Breadcrumbs.tsx +72 -72
  17. package/src/components/Card.tsx +98 -98
  18. package/src/components/CardsGrid.tsx +28 -28
  19. package/src/components/ChangePassword.tsx +123 -123
  20. package/src/components/Chips.tsx +81 -81
  21. package/src/components/Detail.tsx +15 -15
  22. package/src/components/DetailsGrid.tsx +52 -52
  23. package/src/components/DividerHeading.tsx +41 -41
  24. package/src/components/DrawerWrapper/DialogWrapper.tsx +67 -67
  25. package/src/components/DrawerWrapper/DrawerTemplate.tsx +53 -53
  26. package/src/components/DrawerWrapper/DrawerWrapper.tsx +53 -53
  27. package/src/components/DropDownButton/AnchorElement.tsx +44 -44
  28. package/src/components/DropDownButton/DropDownButton.tsx +184 -184
  29. package/src/components/DropDownButton/DropdownMenuItem.tsx +122 -122
  30. package/src/components/DropDownButton/index.tsx +1 -1
  31. package/src/components/DropDownButton/styles.tsx +59 -59
  32. package/src/components/ErrorBoundary/ErrorBoundary.tsx +33 -33
  33. package/src/components/ErrorBoundary/ErrorFallback.tsx +240 -241
  34. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  35. package/src/components/ErrorBoundary/index.tsx +1 -1
  36. package/src/components/ErrorBox.tsx +42 -42
  37. package/src/components/ExcelToJsonInput/ExcelJsonUpload.tsx +50 -50
  38. package/src/components/ExcelToJsonInput/ExcelToJsonInput.tsx +57 -57
  39. package/src/components/ExcelToJsonInput/index.tsx +1 -1
  40. package/src/components/FilterComponents/FilterButton.tsx +56 -56
  41. package/src/components/FilterComponents/SearchBar.tsx +45 -45
  42. package/src/components/FloatingContainer.tsx +33 -33
  43. package/src/components/Form/Form.tsx +147 -147
  44. package/src/components/Form/RenderForm.tsx +189 -189
  45. package/src/components/FullScreenLoader.tsx +19 -19
  46. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  47. package/src/components/HookForm/DatePicker.tsx +40 -40
  48. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  49. package/src/components/HookForm/FormLabel.tsx +14 -14
  50. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  51. package/src/components/HookForm/MultiSelect.tsx +61 -61
  52. package/src/components/HookForm/RadioGroup.tsx +47 -47
  53. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  54. package/src/components/HookForm/SingleSelect.tsx +46 -46
  55. package/src/components/HookForm/TextField.tsx +40 -40
  56. package/src/components/HookForm/TimePicker.tsx +40 -40
  57. package/src/components/HookForm/index.ts +23 -23
  58. package/src/components/IconButtons/IconButtons.tsx +137 -137
  59. package/src/components/IconButtons/Icons.tsx +268 -268
  60. package/src/components/IconButtons/assets/edit.svg +4 -4
  61. package/src/components/IconButtons/assets/eye.svg +6 -6
  62. package/src/components/IconButtons/assets/trash.svg +7 -7
  63. package/src/components/IconButtons/index.tsx +8 -8
  64. package/src/components/IconLabel.tsx +37 -37
  65. package/src/components/Image/Image.tsx +45 -45
  66. package/src/components/Image/index.tsx +1 -1
  67. package/src/components/ImageUpload.tsx +98 -98
  68. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  69. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  70. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  71. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  72. package/src/components/Input/DatePicker.tsx +87 -87
  73. package/src/components/Input/DateRangePicker.tsx +105 -105
  74. package/src/components/Input/DateTimePicker.tsx +84 -84
  75. package/src/components/Input/FormLabel.tsx +21 -21
  76. package/src/components/Input/MultiCheckbox.tsx +64 -64
  77. package/src/components/Input/MultiSelect.tsx +161 -161
  78. package/src/components/Input/RadioGroup.tsx +104 -104
  79. package/src/components/Input/SingleCheckbox.tsx +78 -78
  80. package/src/components/Input/SingleSelect.tsx +104 -104
  81. package/src/components/Input/TextField.tsx +46 -46
  82. package/src/components/Input/TimePicker.tsx +77 -77
  83. package/src/components/Input/index.ts +26 -26
  84. package/src/components/Input/types.ts +3 -3
  85. package/src/components/Institutions/InsititutionsDialog.tsx +70 -0
  86. package/src/components/Institutions/InsititutionsNotAssignedDialog .tsx +12 -0
  87. package/src/components/Institutions/InstitutionsDropdown.tsx +33 -0
  88. package/src/components/Institutions/index.tsx +1 -0
  89. package/src/components/Institutions/services.ts +12 -0
  90. package/src/components/JsonPreview.tsx +7 -7
  91. package/src/components/LabelValue.tsx +21 -21
  92. package/src/components/Layout/ChangePassword.tsx +49 -49
  93. package/src/components/Layout/Header/AppHeader.tsx +109 -113
  94. package/src/components/Layout/Header/AppsMenu.tsx +132 -133
  95. package/src/components/Layout/Header/HeaderActions/CogWheelMenu.tsx +33 -33
  96. package/src/components/Layout/Header/HeaderActions/FreshChatButton.tsx +61 -61
  97. package/src/components/Layout/Header/HeaderActions/FreshDeskHelpButton.tsx +53 -53
  98. package/src/components/Layout/Header/HeaderActions/HeaderActions.tsx +20 -20
  99. package/src/components/Layout/Header/HeaderActions/UserBox.tsx +56 -56
  100. package/src/components/Layout/Header/Notification.tsx +13 -13
  101. package/src/components/Layout/Header/applications.ts +102 -102
  102. package/src/components/Layout/Header/assets/campx_square_small.svg +8 -8
  103. package/src/components/Layout/Header/assets/commuteX.png +0 -0
  104. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  105. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  106. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  107. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  108. package/src/components/Layout/Header/assets/exams_small.svg +11 -11
  109. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  110. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  111. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  112. package/src/components/Layout/Header/assets/index.ts +37 -37
  113. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  114. package/src/components/Layout/Header/assets/pay_small.svg +15 -15
  115. package/src/components/Layout/Header/assets/payx.svg +19 -19
  116. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  117. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  118. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  119. package/src/components/Layout/Header/icons.tsx +57 -57
  120. package/src/components/Layout/Header/index.tsx +1 -1
  121. package/src/components/Layout/Header/styles.tsx +133 -133
  122. package/src/components/Layout/Helmet.tsx +108 -108
  123. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  124. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  125. package/src/components/Layout/SideNav.tsx +168 -168
  126. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  127. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  128. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  129. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  130. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  131. package/src/components/Layout/Tickets/index.tsx +1 -1
  132. package/src/components/Layout/Tickets/services.ts +11 -11
  133. package/src/components/Layout/Tickets/styles.tsx +136 -136
  134. package/src/components/LinearProgress.tsx +19 -19
  135. package/src/components/ListItemButton.tsx +95 -95
  136. package/src/components/LoginForm.tsx +274 -279
  137. package/src/components/MediaRow/MediaRow.tsx +67 -67
  138. package/src/components/MediaRow/index.tsx +1 -1
  139. package/src/components/ModalButtons/DialogButton.tsx +130 -126
  140. package/src/components/ModalButtons/DrawerButton.tsx +115 -115
  141. package/src/components/ModalButtons/PopoverButton.tsx +99 -99
  142. package/src/components/ModalButtons/index.tsx +4 -4
  143. package/src/components/NoDataIllustration.tsx +35 -32
  144. package/src/components/PageContent.tsx +12 -12
  145. package/src/components/PageHeader.tsx +55 -55
  146. package/src/components/PageNotFound.tsx +26 -26
  147. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  148. package/src/components/PopupConfirm/PopupConfirm.tsx +67 -67
  149. package/src/components/PopupConfirm/index.tsx +1 -1
  150. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  151. package/src/components/ResetPassword.tsx +107 -107
  152. package/src/components/Row.tsx +24 -24
  153. package/src/components/Spinner.tsx +18 -18
  154. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  155. package/src/components/StepsHeader/index.tsx +1 -1
  156. package/src/components/StyledTableContainer.tsx +33 -33
  157. package/src/components/SwitchButton.tsx +41 -41
  158. package/src/components/Table.tsx +42 -42
  159. package/src/components/Tables/BasicTable/Table.tsx +198 -198
  160. package/src/components/Tables/BasicTable/TableFooter.tsx +86 -86
  161. package/src/components/Tables/BasicTable/index.tsx +1 -1
  162. package/src/components/Tables/ReactTable/BatchActionsHeader.tsx +58 -58
  163. package/src/components/Tables/ReactTable/ReactTable.tsx +295 -295
  164. package/src/components/Tables/ReactTable/RenderTableBody.tsx +49 -49
  165. package/src/components/Tables/ReactTable/index.tsx +1 -1
  166. package/src/components/Tables/ReactTable/react-table-config.d.ts +128 -128
  167. package/src/components/Tables/common/NoRecordsFound.tsx +31 -27
  168. package/src/components/Tables/common/TableStats.tsx +22 -22
  169. package/src/components/Tables/common/icons.tsx +50 -50
  170. package/src/components/Tables/common/no-data-illu.svg +24 -1
  171. package/src/components/Tables/common/styles.tsx +170 -170
  172. package/src/components/Tables/common/types.ts +57 -57
  173. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  174. package/src/components/Tabs/Tabs.tsx +53 -53
  175. package/src/components/Tabs/TabsContainer.tsx +53 -53
  176. package/src/components/Tabs/index.tsx +1 -1
  177. package/src/components/Tabs/styles.tsx +55 -55
  178. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  179. package/src/components/ToastContainer/index.tsx +1 -1
  180. package/src/components/UploadButton/UploadButton.tsx +126 -126
  181. package/src/components/UploadButton/index.tsx +1 -1
  182. package/src/components/UploadButton/types.ts +19 -19
  183. package/src/components/UploadDocument.tsx +108 -108
  184. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  185. package/src/components/UploadFileDialog/index.tsx +1 -1
  186. package/src/components/index.ts +110 -110
  187. package/src/config/axios.ts +80 -79
  188. package/src/config/axiosEvaluator.ts +53 -53
  189. package/src/config/axiosXTenant.ts +57 -57
  190. package/src/constants/UIConstants.ts +124 -124
  191. package/src/constants/formValidations.ts +6 -6
  192. package/src/constants/index.ts +5 -5
  193. package/src/constants/isDevelopment.ts +4 -4
  194. package/src/constants/permissions.ts +67 -67
  195. package/src/constants/validateMessages.ts +12 -12
  196. package/src/contexts/LoginFormProvider.tsx +37 -39
  197. package/src/contexts/Providers.tsx +74 -52
  198. package/src/contexts/PublicProviders.tsx +30 -30
  199. package/src/contexts/QueryClientProvider.tsx +22 -22
  200. package/src/contexts/RootModal.tsx +76 -0
  201. package/src/hooks/index.ts +5 -5
  202. package/src/hooks/useAuth.ts +248 -153
  203. package/src/hooks/useExternalScript.ts +38 -38
  204. package/src/hooks/useFetch.ts +53 -53
  205. package/src/hooks/useFilters.ts +83 -83
  206. package/src/hooks/useRouter.ts +31 -31
  207. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  208. package/src/layouts/Components/icons/index.tsx +403 -403
  209. package/src/layouts/Components/styles.tsx +74 -74
  210. package/src/layouts/ComponentsLayout.tsx +3 -3
  211. package/src/permissions/PageWithPermission.tsx +18 -18
  212. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  213. package/src/permissions/ValidateAccess.tsx +18 -18
  214. package/src/permissions/index.ts +2 -2
  215. package/src/react-app-env.d.ts +1 -1
  216. package/src/shared-state/AssetsStore.ts +15 -15
  217. package/src/shared-state/InstitutionsStore.ts +8 -0
  218. package/src/shared-state/PermissionsStore.ts +1155 -1155
  219. package/src/shared-state/UserStore.ts +13 -13
  220. package/src/shared-state/index.ts +4 -4
  221. package/src/theme/App.less +3 -3
  222. package/src/theme/MuiThemeProvider.tsx +18 -18
  223. package/src/theme/customCssBaseline.ts +135 -135
  224. package/src/theme/index.css +28 -28
  225. package/src/theme/muiTheme.ts +597 -597
  226. package/src/theme/theme.d.ts +77 -77
  227. package/src/utils/adminAxios.ts +15 -15
  228. package/src/utils/alphabet.ts +23 -23
  229. package/src/utils/arrayPadEnd.ts +3 -3
  230. package/src/utils/formatCurrency.ts +9 -9
  231. package/src/utils/getUrlParams.ts +5 -5
  232. package/src/utils/index.ts +7 -7
  233. package/src/utils/logout.ts +25 -25
  234. package/src/utils/ordinalSuffixOf.ts +14 -14
  235. package/src/utils/romanize.ts +40 -40
  236. package/src/utils/withRouteWrapper.tsx +25 -25
  237. package/src/utils/withSuspense.tsx +6 -6
  238. package/styled-components.tsx +60 -60
  239. package/tsconfig.json +21 -21
  240. package/src/components/Layout/Header/SchoolSwitch/SchoolSwitch.tsx +0 -33
@@ -1,30 +1,30 @@
1
- import { CssBaseline } from '@mui/material'
2
- import { BrowserRouter } from 'react-router-dom'
3
- import ConfirmContextProvider from '../components/PopupConfirm/ConfirmContextProvider'
4
- import MuiThemeProvider from '../theme/MuiThemeProvider'
5
- import QueryClientProvider from './QueryClientProvider'
6
-
7
- import { ReactNode } from 'react'
8
- import { ToastContainer } from '../components'
9
- import DialogProvider from '../components/DrawerWrapper/DrawerWrapper'
10
-
11
- // export const campxTenantKey = Cookies.get('campx_tenant')
12
- // export const urlTenantKey = window.location.pathname.split('/')[1]
13
-
14
- export default function PublicProviders({ children }: { children: ReactNode }) {
15
- return (
16
- <BrowserRouter>
17
- <QueryClientProvider>
18
- <MuiThemeProvider>
19
- <ConfirmContextProvider>
20
- <DialogProvider>
21
- {children}
22
- <CssBaseline />
23
- <ToastContainer />
24
- </DialogProvider>
25
- </ConfirmContextProvider>
26
- </MuiThemeProvider>
27
- </QueryClientProvider>
28
- </BrowserRouter>
29
- )
30
- }
1
+ import { CssBaseline } from '@mui/material'
2
+ import { BrowserRouter } from 'react-router-dom'
3
+ import ConfirmContextProvider from '../components/PopupConfirm/ConfirmContextProvider'
4
+ import MuiThemeProvider from '../theme/MuiThemeProvider'
5
+ import QueryClientProvider from './QueryClientProvider'
6
+
7
+ import { ReactNode } from 'react'
8
+ import { ToastContainer } from '../components'
9
+ import DialogProvider from '../components/DrawerWrapper/DrawerWrapper'
10
+
11
+ // export const campxTenantKey = Cookies.get('campx_tenant')
12
+ // export const urlTenantKey = window.location.pathname.split('/')[1]
13
+
14
+ export default function PublicProviders({ children }: { children: ReactNode }) {
15
+ return (
16
+ <BrowserRouter>
17
+ <QueryClientProvider>
18
+ <MuiThemeProvider>
19
+ <ConfirmContextProvider>
20
+ <DialogProvider>
21
+ {children}
22
+ <CssBaseline />
23
+ <ToastContainer />
24
+ </DialogProvider>
25
+ </ConfirmContextProvider>
26
+ </MuiThemeProvider>
27
+ </QueryClientProvider>
28
+ </BrowserRouter>
29
+ )
30
+ }
@@ -1,22 +1,22 @@
1
- import {
2
- QueryClient,
3
- QueryClientProvider as ReactQueryClientProvider,
4
- } from 'react-query'
5
-
6
- export const queryClient = new QueryClient({
7
- defaultOptions: {
8
- queries: {
9
- refetchOnWindowFocus: false,
10
- retry: false,
11
- useErrorBoundary: true,
12
- },
13
- },
14
- })
15
-
16
- export default function QueryClientProvider({ children }) {
17
- return (
18
- <ReactQueryClientProvider client={queryClient}>
19
- {children}
20
- </ReactQueryClientProvider>
21
- )
22
- }
1
+ import {
2
+ QueryClient,
3
+ QueryClientProvider as ReactQueryClientProvider,
4
+ } from 'react-query'
5
+
6
+ export const queryClient = new QueryClient({
7
+ defaultOptions: {
8
+ queries: {
9
+ refetchOnWindowFocus: false,
10
+ retry: false,
11
+ useErrorBoundary: true,
12
+ },
13
+ },
14
+ })
15
+
16
+ export default function QueryClientProvider({ children }) {
17
+ return (
18
+ <ReactQueryClientProvider client={queryClient}>
19
+ {children}
20
+ </ReactQueryClientProvider>
21
+ )
22
+ }
@@ -0,0 +1,76 @@
1
+ import { Store } from 'pullstate'
2
+ import { CustomDialog, LoginForm } from '../components'
3
+ import { DialogProps } from '@mui/material'
4
+ import InsititutionsDialog from '../components/Institutions'
5
+ import InsititutionsNotAssignedDialog from '../components/Institutions/InsititutionsNotAssignedDialog '
6
+
7
+ const getRootDialogContent = (
8
+ key: string,
9
+ ): (({ close, data }) => JSX.Element) => {
10
+ switch (key) {
11
+ case 'login':
12
+ return ({ close, data }) => (
13
+ <LoginForm loginUrl={data?.loginUrl} close={close} />
14
+ )
15
+ case 'institutions':
16
+ return ({ close }) => <InsititutionsDialog close={close} />
17
+ case 'institutions-not-assigned':
18
+ return ({ close }) => <InsititutionsNotAssignedDialog />
19
+ default:
20
+ return () => <></>
21
+ }
22
+ }
23
+
24
+ const initState = {
25
+ isOpen: false,
26
+ key: '',
27
+ content: ({ close, data }) => <></>,
28
+ contentData: null,
29
+ dialogProps: null,
30
+ }
31
+
32
+ const rootModalStore = new Store(initState)
33
+
34
+ export default function RootModal() {
35
+ const {
36
+ isOpen,
37
+ content: Content,
38
+ contentData,
39
+ dialogProps,
40
+ } = rootModalStore.useState()
41
+
42
+ const onClose = () => {
43
+ rootModalStore.update((s) => {
44
+ s.isOpen = false
45
+ s.key = ''
46
+ s.content = ({ close }) => <></>
47
+ })
48
+ }
49
+
50
+ const dialogContent = () => (
51
+ <Content close={dialogProps?.onClose ?? onClose} data={contentData} />
52
+ )
53
+
54
+ return (
55
+ <CustomDialog
56
+ content={dialogContent}
57
+ onClose={dialogProps?.onClose ?? onClose}
58
+ open={isOpen}
59
+ dialogProps={dialogProps}
60
+ />
61
+ )
62
+ }
63
+
64
+ export const openRootModal = (props: {
65
+ key: string
66
+ contentData?: any
67
+ dialogProps?: Omit<DialogProps, 'open'>
68
+ }) => {
69
+ rootModalStore.update((s) => {
70
+ s.isOpen = true
71
+ s.key = props.key
72
+ s.content = getRootDialogContent(props.key)
73
+ s.contentData = props.contentData
74
+ s.dialogProps = props.dialogProps
75
+ })
76
+ }
@@ -1,5 +1,5 @@
1
- export { default as useFetch } from './useFetch'
2
- export * from './useRouter'
3
- export { default as useAuth } from './useAuth'
4
- export { default as useFilter } from './useFilters'
5
- export { default as useExternalScript } from './useExternalScript'
1
+ export { default as useFetch } from './useFetch'
2
+ export * from './useRouter'
3
+ export { default as useAuth } from './useAuth'
4
+ export { default as useFilter } from './useFilters'
5
+ export { default as useExternalScript } from './useExternalScript'
@@ -1,153 +1,248 @@
1
- import { AxiosError } from 'axios'
2
- import { useEffect, useState } from 'react'
3
- import { toast } from 'react-toastify'
4
- import axios from '../config/axios'
5
- import { isDevelopment } from '../constants'
6
- import { useLoginForm } from '../contexts/LoginFormProvider'
7
- import { PermissionsStore, AssetsStore, UserStore } from '../shared-state'
8
-
9
- const url = window.location.origin
10
-
11
- type AuthParams = {
12
- permissionsEndpoint: string
13
- loginUrl?: string
14
- }
15
-
16
- type AuthResponse = {
17
- loading: boolean
18
- data: {
19
- user?: any
20
- roles?: any
21
- fullName?: any
22
- permissions?: any
23
- assets?: {
24
- logo: string
25
- logo_square: string
26
- }
27
- }
28
- }
29
-
30
- const ApplicationObj = {
31
- enroll: 'enroll_x',
32
- ums: 'square',
33
- payments: 'payments',
34
- exams: 'exams',
35
- hostel: 'hostels',
36
- }
37
-
38
- const checkIsAdmin = (user) => {
39
- let subDomain = window.location.host.split('.')?.slice(-3)[0]
40
- const localSubDomain = process.env.REACT_APP_SUBDOMAIN
41
-
42
- if (user?.isSuperuser) return 1
43
-
44
- if (process.env.NODE_ENV === 'development') {
45
- subDomain = localSubDomain
46
-
47
- if (!localSubDomain) {
48
- toast.warn('missing REACT_APP_SUBDOMAIN in .env')
49
- }
50
- }
51
-
52
- // eslint-disable-next-line no-console
53
- console.log(
54
- 'Current App ->',
55
- ApplicationObj[subDomain],
56
- '; subdomain env ->',
57
- subDomain,
58
- )
59
-
60
- const profile = user?.profiles?.find(
61
- (item) => item.application == ApplicationObj[subDomain],
62
- )
63
- return profile ? (profile.isAdmin == true ? 1 : 0) : 0
64
- }
65
-
66
- function useAuth({ permissionsEndpoint, loginUrl }: AuthParams): AuthResponse {
67
- const { openLoginForm } = useLoginForm()
68
- const [loading, setLoading] = useState<boolean>(false)
69
- const [data, setData] = useState(null)
70
-
71
- const appInit = async () => {
72
- setLoading(true)
73
- axios
74
- .get(permissionsEndpoint)
75
- .then((res) => {
76
- const origin = window.location.origin
77
- const originSubdomain =
78
- window.location.host.split('.')?.slice(-3)[0] ?? 'ums'
79
-
80
- const isStaging = origin.split('campx')[1] === '.dev'
81
-
82
- if (isDevelopment == false && isStaging == false) {
83
- if (
84
- !res.data.applications.includes(ApplicationObj[originSubdomain])
85
- ) {
86
- window.location.replace(
87
- `https://www.id.campx.in/apps?redirect_to=${url}`,
88
- )
89
- }
90
- }
91
-
92
- setLoading(false)
93
- setData(res.data)
94
- UserStore.update((s) => {
95
- s.username = res.data?.user?.username
96
- s.user = res.data?.user
97
- s.roles = res.data?.roles
98
- })
99
- const isAdmin = checkIsAdmin(res.data.user)
100
- // eslint-disable-next-line no-console
101
- console.log('Is Admin -> ', isAdmin)
102
-
103
- PermissionsStore.update((s) => {
104
- s.permissions = {
105
- ...res.data?.permissions,
106
- can_settings_view: 1,
107
- can_dashboard_view: 1,
108
- can_individual_pages_view: 1,
109
- can_analatics_view: isAdmin,
110
- can_admin_view: isAdmin,
111
- } as any
112
- s.applications = res.data?.applications ?? []
113
- })
114
- AssetsStore.update((s) => {
115
- s.logo = res.data?.assets.logo
116
- s.logo_square = res.data?.assets.logo_square
117
- })
118
- })
119
- .catch((err: AxiosError) => {
120
- setLoading(false)
121
- const origin = window.location.origin
122
- const isStaging = origin.split('campx')[1] === '.dev'
123
-
124
- if (isDevelopment || isStaging) {
125
- openLoginForm(loginUrl)
126
- return
127
- } else {
128
- window.location.replace(`https://www.id.campx.in/?redirect_to=${url}`)
129
- }
130
-
131
- if (err.response.status !== 401) {
132
- if (err.response.status > 400 && err.response.status < 500) {
133
- window.location.replace(
134
- `https://www.id.campx.in/?redirect_to=${url}`,
135
- )
136
- } else {
137
- toast.error('Server Error')
138
- }
139
- }
140
- })
141
- }
142
-
143
- useEffect(() => {
144
- appInit()
145
- }, [])
146
-
147
- return {
148
- loading: loading || !data?.permissions,
149
- data,
150
- }
151
- }
152
-
153
- export default useAuth
1
+ import { AxiosError } from 'axios'
2
+ import { useEffect, useState } from 'react'
3
+ import { toast } from 'react-toastify'
4
+ import { institutions } from '../components/Institutions/services'
5
+ import axios from '../config/axios'
6
+ import { isDevelopment } from '../constants'
7
+ import { urlTenantKey } from '../contexts/Providers'
8
+ import { openRootModal } from '../contexts/RootModal'
9
+ import { AssetsStore, PermissionsStore, UserStore } from '../shared-state'
10
+ import { InsititutionsStore } from '../shared-state/InstitutionsStore'
11
+
12
+ const url = window.location.origin
13
+
14
+ type AuthParams = {
15
+ permissionsEndpoint: string
16
+ loginUrl?: string
17
+ }
18
+
19
+ type AuthResponse = {
20
+ loading: boolean
21
+ data: {
22
+ user?: any
23
+ roles?: any
24
+ fullName?: any
25
+ permissions?: any
26
+ assets?: {
27
+ logo: string
28
+ logo_square: string
29
+ }
30
+ }
31
+ }
32
+
33
+ const ApplicationObj = {
34
+ enroll: 'enroll_x',
35
+ ums: 'square',
36
+ payments: 'payments',
37
+ exams: 'exams',
38
+ hostel: 'hostels',
39
+ }
40
+ const checkIsAdmin = (user) => {
41
+ let subDomain = window.location.host.split('.')?.slice(-3)[0]
42
+ const localSubDomain = process.env.REACT_APP_SUBDOMAIN
43
+
44
+ if (user?.isSuperuser) return 1
45
+
46
+ if (process.env.NODE_ENV === 'development') {
47
+ subDomain = localSubDomain
48
+
49
+ if (!localSubDomain) {
50
+ toast.warn('missing REACT_APP_SUBDOMAIN in .env')
51
+ }
52
+ }
53
+
54
+ // eslint-disable-next-line no-console
55
+ console.log(
56
+ 'Current App ->',
57
+ ApplicationObj[subDomain],
58
+ '; subdomain env ->',
59
+ subDomain,
60
+ )
61
+
62
+ const profile = user?.profiles?.find(
63
+ (item) => item.application == ApplicationObj[subDomain],
64
+ )
65
+ return profile ? (profile.isAdmin == true ? 1 : 0) : 0
66
+ }
67
+ const getInstitutionKey = () => {
68
+ const instituitionKey = window.location.pathname.split('/')[2]
69
+ if (!instituitionKey) {
70
+ const localInstituitionKey = localStorage.getItem('institution_key')
71
+ if (localInstituitionKey) {
72
+ return localInstituitionKey
73
+ } else {
74
+ return null
75
+ }
76
+ } else {
77
+ return instituitionKey
78
+ }
79
+ return instituitionKey
80
+ }
81
+
82
+ function handleInstitutions(institutions) {
83
+ const insititutionKey = getInstitutionKey()
84
+ if (institutions?.length === 0) {
85
+ openRootModal({
86
+ key: 'institutions-not-assigned',
87
+ dialogProps: {
88
+ disableEscapeKeyDown: true,
89
+ onClose: () => {},
90
+ },
91
+ })
92
+ }
93
+ if (institutions?.length === 1) {
94
+ if (!insititutionKey) {
95
+ window.location.replace(
96
+ `${window.location.origin}/${urlTenantKey}/${institutions[0]?.code}`,
97
+ )
98
+ }
99
+ if (insititutionKey !== institutions[0]?.code) {
100
+ window.location.replace(
101
+ `${window.location.origin}/${urlTenantKey}/${institutions[0]?.code}`,
102
+ )
103
+ }
104
+ InsititutionsStore.update((s) => {
105
+ s.current = institutions[0]
106
+ s.institutions = institutions
107
+ })
108
+ }
109
+ if (institutions?.length > 1) {
110
+ if (!insititutionKey) {
111
+ openRootModal({
112
+ key: 'institutions',
113
+ dialogProps: {
114
+ disableEscapeKeyDown: true,
115
+ onClose: () => {},
116
+ },
117
+ })
118
+ }
119
+ if (
120
+ insititutionKey &&
121
+ !institutions?.find((item) => item.code === insititutionKey)
122
+ ) {
123
+ openRootModal({
124
+ key: 'institutions',
125
+ dialogProps: {
126
+ disableEscapeKeyDown: true,
127
+ onClose: () => {},
128
+ },
129
+ })
130
+ }
131
+ InsititutionsStore.update((s) => {
132
+ s.institutions = institutions
133
+ s.current = institutions.find((item) => item.code === insititutionKey)
134
+ })
135
+ }
136
+ }
137
+
138
+ const loginErrorHandler = ({
139
+ loginUrl,
140
+ setLoading,
141
+ err,
142
+ }: {
143
+ loginUrl: string
144
+ setLoading?: any
145
+ err: AxiosError
146
+ }) => {
147
+ setLoading && setLoading(false)
148
+ const origin = window.location.origin
149
+ const isStaging = origin.split('campx')[1] === '.dev'
150
+
151
+ if (isDevelopment || isStaging) {
152
+ openRootModal({
153
+ key: 'login',
154
+ contentData: {
155
+ loginUrl,
156
+ },
157
+ dialogProps: {
158
+ disableEscapeKeyDown: true,
159
+ onClose: () => {},
160
+ },
161
+ })
162
+ return
163
+ } else {
164
+ window.location.replace(`https://www.id.campx.in/?redirect_to=${url}`)
165
+ }
166
+
167
+ if (err.response.status !== 401) {
168
+ if (err.response.status > 400 && err.response.status < 500) {
169
+ window.location.replace(`https://www.id.campx.in/?redirect_to=${url}`)
170
+ } else {
171
+ toast.error('Server Error')
172
+ }
173
+ }
174
+ }
175
+
176
+ function useAuth({ permissionsEndpoint, loginUrl }: AuthParams): AuthResponse {
177
+ const [loading, setLoading] = useState<boolean>(false)
178
+ const [data, setData] = useState(null)
179
+ const { current } = InsititutionsStore.useState()
180
+
181
+ const appInit = async () => {
182
+ setLoading(true)
183
+ axios
184
+ .get(permissionsEndpoint)
185
+ .then((res) => {
186
+ const origin = window.location.origin
187
+ const originSubdomain =
188
+ window.location.host.split('.')?.slice(-3)[0] ?? 'ums'
189
+ const isStaging = origin.split('campx')[1] === '.dev'
190
+
191
+ if (isDevelopment == false && isStaging == false) {
192
+ if (
193
+ !res.data.applications.includes(ApplicationObj[originSubdomain])
194
+ ) {
195
+ window.location.replace(
196
+ `https://www.id.campx.in/apps?redirect_to=${url}`,
197
+ )
198
+ }
199
+ }
200
+
201
+ if (res.data?.institutions) {
202
+ handleInstitutions(res.data?.institutions)
203
+ }
204
+
205
+ setData(res.data)
206
+ UserStore.update((s) => {
207
+ s.username = res.data?.user?.username
208
+ s.user = res.data?.user
209
+ s.roles = res.data?.roles
210
+ })
211
+ const isAdmin = checkIsAdmin(res.data.user)
212
+ // eslint-disable-next-line no-console
213
+ console.log('Is Admin -> ', isAdmin)
214
+
215
+ PermissionsStore.update((s) => {
216
+ s.permissions = {
217
+ ...res.data?.permissions,
218
+ can_settings_view: 1,
219
+ can_dashboard_view: 1,
220
+ can_individual_pages_view: 1,
221
+ can_analatics_view: isAdmin,
222
+ can_admin_view: isAdmin,
223
+ } as any
224
+ s.applications = res.data?.applications ?? []
225
+ })
226
+ AssetsStore.update((s) => {
227
+ s.logo = res.data?.assets.logo
228
+ s.logo_square = res.data?.assets.logo_square
229
+ })
230
+
231
+ setLoading(false)
232
+ })
233
+ .catch((err: AxiosError) => {
234
+ loginErrorHandler({ loginUrl, setLoading, err })
235
+ })
236
+ }
237
+
238
+ useEffect(() => {
239
+ appInit()
240
+ }, [])
241
+
242
+ return {
243
+ loading: loading || !data?.permissions || !current,
244
+ data,
245
+ }
246
+ }
247
+
248
+ export default useAuth
@@ -1,38 +1,38 @@
1
- import { useEffect, useState } from 'react'
2
- const useExternalScript = (url) => {
3
- let [state, setState] = useState(url ? 'loading' : 'idle')
4
-
5
- useEffect(() => {
6
- if (!url) {
7
- setState('idle')
8
- return
9
- }
10
- let script: any = document.querySelector(`script[src="${url}"]`)
11
-
12
- const handleScript = (e) => {
13
- setState(e.type === 'load' ? 'ready' : 'error')
14
- }
15
- if (!script) {
16
- script = document.createElement('script')
17
- script.type = 'application/javascript'
18
- script.src = url
19
- script.async = true
20
- document.body.appendChild(script)
21
- script.addEventListener('load', handleScript)
22
- script.addEventListener('error', handleScript)
23
- }
24
-
25
- script.addEventListener('load', handleScript)
26
- script.addEventListener('error', handleScript)
27
-
28
- return () => {
29
- script.removeEventListener('load', handleScript)
30
- script.removeEventListener('error', handleScript)
31
- document.body.removeChild(script)
32
- }
33
- }, [url])
34
-
35
- return state
36
- }
37
-
38
- export default useExternalScript
1
+ import { useEffect, useState } from 'react'
2
+ const useExternalScript = (url) => {
3
+ let [state, setState] = useState(url ? 'loading' : 'idle')
4
+
5
+ useEffect(() => {
6
+ if (!url) {
7
+ setState('idle')
8
+ return
9
+ }
10
+ let script: any = document.querySelector(`script[src="${url}"]`)
11
+
12
+ const handleScript = (e) => {
13
+ setState(e.type === 'load' ? 'ready' : 'error')
14
+ }
15
+ if (!script) {
16
+ script = document.createElement('script')
17
+ script.type = 'application/javascript'
18
+ script.src = url
19
+ script.async = true
20
+ document.body.appendChild(script)
21
+ script.addEventListener('load', handleScript)
22
+ script.addEventListener('error', handleScript)
23
+ }
24
+
25
+ script.addEventListener('load', handleScript)
26
+ script.addEventListener('error', handleScript)
27
+
28
+ return () => {
29
+ script.removeEventListener('load', handleScript)
30
+ script.removeEventListener('error', handleScript)
31
+ document.body.removeChild(script)
32
+ }
33
+ }, [url])
34
+
35
+ return state
36
+ }
37
+
38
+ export default useExternalScript