@campxdev/shared 1.8.32 → 1.8.34

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 (230) 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 +336 -336
  10. package/src/components/ApplicationProfile/Service.ts +68 -68
  11. package/src/components/ApplicationProfile/UserProfileRelation.tsx +174 -174
  12. package/src/components/ApplicationProfile/index.tsx +1 -1
  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 +110 -110
  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 +241 -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/JsonPreview.tsx +7 -7
  86. package/src/components/LabelValue.tsx +21 -21
  87. package/src/components/Layout/ChangePassword.tsx +49 -49
  88. package/src/components/Layout/Header/AppHeader.tsx +112 -112
  89. package/src/components/Layout/Header/AppsMenu.tsx +133 -133
  90. package/src/components/Layout/Header/HeaderActions/CogWheelMenu.tsx +33 -33
  91. package/src/components/Layout/Header/HeaderActions/FreshChatButton.tsx +61 -61
  92. package/src/components/Layout/Header/HeaderActions/FreshDeskHelpButton.tsx +28 -28
  93. package/src/components/Layout/Header/HeaderActions/HeaderActions.tsx +18 -18
  94. package/src/components/Layout/Header/HeaderActions/UserBox.tsx +56 -56
  95. package/src/components/Layout/Header/Notification.tsx +13 -13
  96. package/src/components/Layout/Header/applications.ts +97 -97
  97. package/src/components/Layout/Header/assets/campx_square_small.svg +8 -8
  98. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  99. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  100. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  101. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  102. package/src/components/Layout/Header/assets/exams_small.svg +11 -11
  103. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  104. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  105. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  106. package/src/components/Layout/Header/assets/index.ts +37 -37
  107. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  108. package/src/components/Layout/Header/assets/pay_small.svg +15 -15
  109. package/src/components/Layout/Header/assets/payx.svg +19 -19
  110. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  111. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  112. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  113. package/src/components/Layout/Header/icons.tsx +57 -57
  114. package/src/components/Layout/Header/index.tsx +1 -1
  115. package/src/components/Layout/Header/styles.tsx +133 -133
  116. package/src/components/Layout/Helmet.tsx +105 -105
  117. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  118. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  119. package/src/components/Layout/SideNav.tsx +168 -168
  120. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  121. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  122. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  123. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  124. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  125. package/src/components/Layout/Tickets/index.tsx +1 -1
  126. package/src/components/Layout/Tickets/services.ts +11 -11
  127. package/src/components/Layout/Tickets/styles.tsx +136 -136
  128. package/src/components/LinearProgress.tsx +19 -19
  129. package/src/components/ListItemButton.tsx +95 -95
  130. package/src/components/LoginForm.tsx +279 -279
  131. package/src/components/MediaRow/MediaRow.tsx +67 -67
  132. package/src/components/MediaRow/index.tsx +1 -1
  133. package/src/components/ModalButtons/DialogButton.tsx +126 -126
  134. package/src/components/ModalButtons/DrawerButton.tsx +115 -115
  135. package/src/components/ModalButtons/index.tsx +4 -4
  136. package/src/components/NoDataIllustration.tsx +32 -32
  137. package/src/components/PageContent.tsx +12 -12
  138. package/src/components/PageHeader.tsx +55 -55
  139. package/src/components/PageNotFound.tsx +26 -26
  140. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  141. package/src/components/PopupConfirm/PopupConfirm.tsx +67 -67
  142. package/src/components/PopupConfirm/index.tsx +1 -1
  143. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  144. package/src/components/ResetPassword.tsx +107 -107
  145. package/src/components/Row.tsx +24 -24
  146. package/src/components/Spinner.tsx +18 -18
  147. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  148. package/src/components/StepsHeader/index.tsx +1 -1
  149. package/src/components/StyledTableContainer.tsx +33 -33
  150. package/src/components/SwitchButton.tsx +41 -41
  151. package/src/components/Table.tsx +42 -42
  152. package/src/components/Tables/BasicTable/Table.tsx +198 -198
  153. package/src/components/Tables/BasicTable/TableFooter.tsx +86 -86
  154. package/src/components/Tables/BasicTable/index.tsx +1 -1
  155. package/src/components/Tables/ReactTable/BatchActionsHeader.tsx +58 -58
  156. package/src/components/Tables/ReactTable/ReactTable.tsx +295 -295
  157. package/src/components/Tables/ReactTable/RenderTableBody.tsx +49 -49
  158. package/src/components/Tables/ReactTable/index.tsx +1 -1
  159. package/src/components/Tables/ReactTable/react-table-config.d.ts +128 -128
  160. package/src/components/Tables/common/NoRecordsFound.tsx +27 -27
  161. package/src/components/Tables/common/TableStats.tsx +22 -22
  162. package/src/components/Tables/common/icons.tsx +50 -50
  163. package/src/components/Tables/common/styles.tsx +170 -170
  164. package/src/components/Tables/common/types.ts +57 -57
  165. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  166. package/src/components/Tabs/Tabs.tsx +53 -53
  167. package/src/components/Tabs/TabsContainer.tsx +53 -53
  168. package/src/components/Tabs/index.tsx +1 -1
  169. package/src/components/Tabs/styles.tsx +55 -55
  170. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  171. package/src/components/ToastContainer/index.tsx +1 -1
  172. package/src/components/UploadButton/UploadButton.tsx +126 -126
  173. package/src/components/UploadButton/index.tsx +1 -1
  174. package/src/components/UploadButton/types.ts +19 -19
  175. package/src/components/UploadDocument.tsx +108 -108
  176. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  177. package/src/components/UploadFileDialog/index.tsx +1 -1
  178. package/src/components/index.ts +108 -108
  179. package/src/config/axios.ts +73 -73
  180. package/src/config/axiosEvaluator.ts +53 -53
  181. package/src/config/axiosXTenant.ts +57 -57
  182. package/src/constants/UIConstants.ts +124 -124
  183. package/src/constants/formValidations.ts +6 -6
  184. package/src/constants/index.ts +5 -5
  185. package/src/constants/isDevelopment.ts +4 -4
  186. package/src/constants/permissions.ts +67 -67
  187. package/src/constants/validateMessages.ts +12 -12
  188. package/src/contexts/LoginFormProvider.tsx +39 -39
  189. package/src/contexts/Providers.tsx +52 -52
  190. package/src/contexts/PublicProviders.tsx +30 -30
  191. package/src/contexts/QueryClientProvider.tsx +22 -22
  192. package/src/hooks/index.ts +5 -5
  193. package/src/hooks/useAuth.ts +131 -112
  194. package/src/hooks/useExternalScript.ts +38 -38
  195. package/src/hooks/useFetch.ts +53 -53
  196. package/src/hooks/useFilters.ts +83 -83
  197. package/src/hooks/useRouter.ts +31 -31
  198. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  199. package/src/layouts/Components/icons/index.tsx +403 -403
  200. package/src/layouts/Components/styles.tsx +74 -74
  201. package/src/layouts/ComponentsLayout.tsx +3 -3
  202. package/src/permissions/PageWithPermission.tsx +18 -18
  203. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  204. package/src/permissions/ValidateAccess.tsx +18 -18
  205. package/src/permissions/index.ts +2 -2
  206. package/src/react-app-env.d.ts +1 -1
  207. package/src/shared-state/AssetsStore.ts +15 -15
  208. package/src/shared-state/PermissionsStore.ts +1064 -1062
  209. package/src/shared-state/UserStore.ts +13 -13
  210. package/src/shared-state/index.ts +4 -4
  211. package/src/theme/App.less +3 -3
  212. package/src/theme/MuiThemeProvider.tsx +18 -18
  213. package/src/theme/customCssBaseline.ts +135 -135
  214. package/src/theme/index.css +28 -28
  215. package/src/theme/muiTheme.ts +597 -597
  216. package/src/theme/theme.d.ts +77 -77
  217. package/src/utils/adminAxios.ts +15 -15
  218. package/src/utils/alphabet.ts +23 -23
  219. package/src/utils/arrayPadEnd.ts +3 -3
  220. package/src/utils/formatCurrency.ts +9 -9
  221. package/src/utils/getUrlParams.ts +5 -5
  222. package/src/utils/index.ts +7 -7
  223. package/src/utils/logout.ts +25 -25
  224. package/src/utils/ordinalSuffixOf.ts +14 -14
  225. package/src/utils/romanize.ts +40 -40
  226. package/src/utils/withRouteWrapper.tsx +25 -25
  227. package/src/utils/withSuspense.tsx +6 -6
  228. package/styled-components.tsx +60 -60
  229. package/tsconfig.json +21 -21
  230. package/src/components/Layout/Header/assets/commuteX.png +0 -0
@@ -1,279 +1,279 @@
1
- import { Visibility, VisibilityOff } from '@mui/icons-material'
2
- import {
3
- Alert,
4
- Box,
5
- Button,
6
- IconButton,
7
- InputAdornment,
8
- Stack,
9
- Typography,
10
- styled,
11
- } from '@mui/material'
12
- import axiosBase from 'axios'
13
- import Cookies from 'js-cookie'
14
- import { useEffect, useState } from 'react'
15
- import { useForm } from 'react-hook-form'
16
- import ActionButton from './ActionButton'
17
- import { FormTextField } from './HookForm'
18
- import axios from '../config/axios'
19
- import ResetPassword from './ResetPassword'
20
- import { Link } from 'react-router-dom'
21
- import { DialogButton } from './ModalButtons'
22
- import adminAxios from '../utils/adminAxios'
23
-
24
- export function LoginForm({
25
- loginUrl,
26
- showSuperAdminForm,
27
- }: {
28
- loginUrl?: string
29
- showSuperAdminForm?: boolean
30
- }) {
31
- const [showPassword, setShowPassword] = useState(false)
32
- const [forgotMail, setForgotMail] = useState(null)
33
- const [forgotPassword, setForgotPassword] = useState(true)
34
- const [resetPassword, setResetPassword] = useState(false)
35
- const { handleSubmit, control } = useForm()
36
- const [error, setError] = useState('')
37
-
38
- const onSubmit = async (values) => {
39
- try {
40
- const res = await axiosBase({
41
- method: 'POST',
42
- baseURL: process.env.REACT_APP_API_HOST,
43
- url: loginUrl ? loginUrl : `/auth-server/auth/login`,
44
- data: values,
45
- })
46
- Cookies.set('campx_tenant', res?.data?.subDomain)
47
- Cookies.set('campx_session_key', res.data?.token)
48
- window.location.href = window.location.origin + `/${res?.data?.subDomain}`
49
- } catch (err) {
50
- // eslint-disable-next-line no-console
51
- console.log(err)
52
- setError(err?.response?.data?.message ?? 'Server Error')
53
- }
54
- }
55
-
56
- const [mailSent, setMailSent] = useState(false)
57
-
58
- async function handleSendMail() {
59
- try {
60
- await axios
61
- .get(
62
- `https://api.campx.dev/auth-server/auth/forgot-password?email=${forgotMail}`,
63
- )
64
- .then((res) => {
65
- setForgotMail(null)
66
- setMailSent(true)
67
- setError(null)
68
- })
69
- } catch (err) {
70
- if (!forgotMail) {
71
- setError('Email should not be empty')
72
- setMailSent(false)
73
- } else {
74
- setError(err.response.data.message ?? 'Server Error')
75
- setMailSent(false)
76
- }
77
- }
78
- }
79
-
80
- useEffect(() => {
81
- const restLink = window.location.pathname.split('/')[1]
82
- if (restLink == 'reset-password') {
83
- setResetPassword(true)
84
- }
85
- }, [])
86
-
87
- return (
88
- <Box sx={{ position: 'relative', height: '100%' }}>
89
- {resetPassword ? (
90
- <>
91
- <ResetPassword />
92
- </>
93
- ) : forgotPassword ? (
94
- <form onSubmit={handleSubmit(onSubmit)}>
95
- <Stack gap={'30px'} sx={{ display: resetPassword ? 'none' : 'flex' }}>
96
- <FormTextField
97
- control={control}
98
- name="username"
99
- label="User ID"
100
- required
101
- />
102
- <FormTextField
103
- control={control}
104
- name="password"
105
- label="Password"
106
- type={showPassword ? 'text' : 'password'}
107
- required
108
- InputProps={{
109
- endAdornment: (
110
- <InputAdornment position="end">
111
- <IconButton
112
- size="small"
113
- aria-label="toggle password visibility"
114
- onClick={() => setShowPassword((prev) => !prev)}
115
- edge="end"
116
- >
117
- {showPassword ? <VisibilityOff /> : <Visibility />}
118
- </IconButton>
119
- </InputAdornment>
120
- ),
121
- }}
122
- />
123
- <ActionButton type="submit">Login</ActionButton>
124
- <Typography
125
- variant="h6"
126
- align="right"
127
- onClick={() => setForgotPassword(false)}
128
- >
129
- <StyledLink to="/">Forgot Password</StyledLink>
130
- </Typography>
131
- </Stack>
132
- </form>
133
- ) : (
134
- <>
135
- <Stack gap={'30px'}>
136
- <FormTextField
137
- control={control}
138
- name="email"
139
- label="Email"
140
- required
141
- onChange={(e) => setForgotMail(e.target.value)}
142
- />
143
- <Button onClick={() => handleSendMail()}>Send Email</Button>
144
-
145
- <Typography
146
- variant="subtitle2"
147
- onClick={() => {
148
- setForgotPassword(true)
149
- setError('')
150
- setMailSent(false)
151
- }}
152
- align="right"
153
- >
154
- <StyledLink to="/">Login here</StyledLink>
155
- </Typography>
156
-
157
- {mailSent && (
158
- <Alert severity="success">
159
- Reset password link has been sent to your email.
160
- </Alert>
161
- )}
162
- </Stack>
163
- </>
164
- )}
165
-
166
- {error && (
167
- <Alert severity="error" sx={{ marginTop: '20px' }}>
168
- {error}
169
- </Alert>
170
- )}
171
-
172
- {showSuperAdminForm && (
173
- <Box
174
- sx={{
175
- position: 'absolute',
176
- bottom: '20px',
177
- right: '20px',
178
- }}
179
- >
180
- <DialogButton
181
- title="Super Admin Login"
182
- anchor={({ open }) => (
183
- <Button onClick={open} size="small" variant="text">
184
- Super Admin Login
185
- </Button>
186
- )}
187
- content={({ close }) => <SuperAdminLoginForm close={close} />}
188
- />
189
- </Box>
190
- )}
191
- </Box>
192
- )
193
- }
194
-
195
- export const StyledLink = styled(Link)({
196
- textDecoration: 'none',
197
- color: 'black',
198
- })
199
-
200
- export default LoginForm
201
-
202
- const SuperAdminLoginForm = ({ close }) => {
203
- const [showPassword, setShowPassword] = useState(false)
204
- const [loading, setLoading] = useState(false)
205
- const { handleSubmit, control } = useForm({
206
- defaultValues: null,
207
- })
208
- const [error, setError] = useState('')
209
-
210
- const onSubmit = async (values) => {
211
- setLoading(true)
212
- try {
213
- const res = await adminAxios.post(`/auth/login`, values)
214
- Cookies.set('campx_admin_session_key', res?.data?.cookie)
215
-
216
- setLoading(false)
217
- window.location.href = '/campx'
218
- } catch (err) {
219
- setLoading(false)
220
- setError(err.response.data.message ?? 'Server Error')
221
- }
222
- }
223
-
224
- const onError = (e) => {
225
- console.log(e)
226
- }
227
-
228
- return (
229
- <Box width={'100%'} marginTop="20px">
230
- <form onSubmit={handleSubmit(onSubmit, onError)}>
231
- <Stack gap={'40px'}>
232
- <Typography variant="h6" textAlign={'center'}>
233
- Sign in to Super Admin Account
234
- </Typography>
235
- <FormTextField
236
- control={control}
237
- name="username"
238
- label="Username/Email"
239
- required
240
- />
241
- <FormTextField
242
- control={control}
243
- name="password"
244
- label="Password"
245
- type={showPassword ? 'text' : 'password'}
246
- required
247
- InputProps={{
248
- endAdornment: (
249
- <InputAdornment position="end">
250
- <IconButton
251
- size="small"
252
- aria-label="toggle password visibility"
253
- onClick={() => setShowPassword((prev) => !prev)}
254
- edge="end"
255
- >
256
- {showPassword ? <VisibilityOff /> : <Visibility />}
257
- </IconButton>
258
- </InputAdornment>
259
- ),
260
- }}
261
- />
262
- <ActionButton
263
- type="submit"
264
- fullWidth
265
- disabled={loading}
266
- loading={loading}
267
- >
268
- Login
269
- </ActionButton>
270
- </Stack>
271
- </form>
272
- {error && (
273
- <Alert severity="error" sx={{ marginTop: '20px' }}>
274
- {error}
275
- </Alert>
276
- )}
277
- </Box>
278
- )
279
- }
1
+ import { Visibility, VisibilityOff } from '@mui/icons-material'
2
+ import {
3
+ Alert,
4
+ Box,
5
+ Button,
6
+ IconButton,
7
+ InputAdornment,
8
+ Stack,
9
+ Typography,
10
+ styled,
11
+ } from '@mui/material'
12
+ import axiosBase from 'axios'
13
+ import Cookies from 'js-cookie'
14
+ import { useEffect, useState } from 'react'
15
+ import { useForm } from 'react-hook-form'
16
+ import ActionButton from './ActionButton'
17
+ import { FormTextField } from './HookForm'
18
+ import axios from '../config/axios'
19
+ import ResetPassword from './ResetPassword'
20
+ import { Link } from 'react-router-dom'
21
+ import { DialogButton } from './ModalButtons'
22
+ import adminAxios from '../utils/adminAxios'
23
+
24
+ export function LoginForm({
25
+ loginUrl,
26
+ showSuperAdminForm,
27
+ }: {
28
+ loginUrl?: string
29
+ showSuperAdminForm?: boolean
30
+ }) {
31
+ const [showPassword, setShowPassword] = useState(false)
32
+ const [forgotMail, setForgotMail] = useState(null)
33
+ const [forgotPassword, setForgotPassword] = useState(true)
34
+ const [resetPassword, setResetPassword] = useState(false)
35
+ const { handleSubmit, control } = useForm()
36
+ const [error, setError] = useState('')
37
+
38
+ const onSubmit = async (values) => {
39
+ try {
40
+ const res = await axiosBase({
41
+ method: 'POST',
42
+ baseURL: process.env.REACT_APP_API_HOST,
43
+ url: loginUrl ? loginUrl : `/auth-server/auth/login`,
44
+ data: values,
45
+ })
46
+ Cookies.set('campx_tenant', res?.data?.subDomain)
47
+ Cookies.set('campx_session_key', res.data?.token)
48
+ window.location.href = window.location.origin + `/${res?.data?.subDomain}`
49
+ } catch (err) {
50
+ // eslint-disable-next-line no-console
51
+ console.log(err)
52
+ setError(err?.response?.data?.message ?? 'Server Error')
53
+ }
54
+ }
55
+
56
+ const [mailSent, setMailSent] = useState(false)
57
+
58
+ async function handleSendMail() {
59
+ try {
60
+ await axios
61
+ .get(
62
+ `https://api.campx.dev/auth-server/auth/forgot-password?email=${forgotMail}`,
63
+ )
64
+ .then((res) => {
65
+ setForgotMail(null)
66
+ setMailSent(true)
67
+ setError(null)
68
+ })
69
+ } catch (err) {
70
+ if (!forgotMail) {
71
+ setError('Email should not be empty')
72
+ setMailSent(false)
73
+ } else {
74
+ setError(err.response.data.message ?? 'Server Error')
75
+ setMailSent(false)
76
+ }
77
+ }
78
+ }
79
+
80
+ useEffect(() => {
81
+ const restLink = window.location.pathname.split('/')[1]
82
+ if (restLink == 'reset-password') {
83
+ setResetPassword(true)
84
+ }
85
+ }, [])
86
+
87
+ return (
88
+ <Box sx={{ position: 'relative', height: '100%' }}>
89
+ {resetPassword ? (
90
+ <>
91
+ <ResetPassword />
92
+ </>
93
+ ) : forgotPassword ? (
94
+ <form onSubmit={handleSubmit(onSubmit)}>
95
+ <Stack gap={'30px'} sx={{ display: resetPassword ? 'none' : 'flex' }}>
96
+ <FormTextField
97
+ control={control}
98
+ name="username"
99
+ label="User ID"
100
+ required
101
+ />
102
+ <FormTextField
103
+ control={control}
104
+ name="password"
105
+ label="Password"
106
+ type={showPassword ? 'text' : 'password'}
107
+ required
108
+ InputProps={{
109
+ endAdornment: (
110
+ <InputAdornment position="end">
111
+ <IconButton
112
+ size="small"
113
+ aria-label="toggle password visibility"
114
+ onClick={() => setShowPassword((prev) => !prev)}
115
+ edge="end"
116
+ >
117
+ {showPassword ? <VisibilityOff /> : <Visibility />}
118
+ </IconButton>
119
+ </InputAdornment>
120
+ ),
121
+ }}
122
+ />
123
+ <ActionButton type="submit">Login</ActionButton>
124
+ <Typography
125
+ variant="h6"
126
+ align="right"
127
+ onClick={() => setForgotPassword(false)}
128
+ >
129
+ <StyledLink to="/">Forgot Password</StyledLink>
130
+ </Typography>
131
+ </Stack>
132
+ </form>
133
+ ) : (
134
+ <>
135
+ <Stack gap={'30px'}>
136
+ <FormTextField
137
+ control={control}
138
+ name="email"
139
+ label="Email"
140
+ required
141
+ onChange={(e) => setForgotMail(e.target.value)}
142
+ />
143
+ <Button onClick={() => handleSendMail()}>Send Email</Button>
144
+
145
+ <Typography
146
+ variant="subtitle2"
147
+ onClick={() => {
148
+ setForgotPassword(true)
149
+ setError('')
150
+ setMailSent(false)
151
+ }}
152
+ align="right"
153
+ >
154
+ <StyledLink to="/">Login here</StyledLink>
155
+ </Typography>
156
+
157
+ {mailSent && (
158
+ <Alert severity="success">
159
+ Reset password link has been sent to your email.
160
+ </Alert>
161
+ )}
162
+ </Stack>
163
+ </>
164
+ )}
165
+
166
+ {error && (
167
+ <Alert severity="error" sx={{ marginTop: '20px' }}>
168
+ {error}
169
+ </Alert>
170
+ )}
171
+
172
+ {showSuperAdminForm && (
173
+ <Box
174
+ sx={{
175
+ position: 'absolute',
176
+ bottom: '20px',
177
+ right: '20px',
178
+ }}
179
+ >
180
+ <DialogButton
181
+ title="Super Admin Login"
182
+ anchor={({ open }) => (
183
+ <Button onClick={open} size="small" variant="text">
184
+ Super Admin Login
185
+ </Button>
186
+ )}
187
+ content={({ close }) => <SuperAdminLoginForm close={close} />}
188
+ />
189
+ </Box>
190
+ )}
191
+ </Box>
192
+ )
193
+ }
194
+
195
+ export const StyledLink = styled(Link)({
196
+ textDecoration: 'none',
197
+ color: 'black',
198
+ })
199
+
200
+ export default LoginForm
201
+
202
+ const SuperAdminLoginForm = ({ close }) => {
203
+ const [showPassword, setShowPassword] = useState(false)
204
+ const [loading, setLoading] = useState(false)
205
+ const { handleSubmit, control } = useForm({
206
+ defaultValues: null,
207
+ })
208
+ const [error, setError] = useState('')
209
+
210
+ const onSubmit = async (values) => {
211
+ setLoading(true)
212
+ try {
213
+ const res = await adminAxios.post(`/auth/login`, values)
214
+ Cookies.set('campx_admin_session_key', res?.data?.cookie)
215
+
216
+ setLoading(false)
217
+ window.location.href = '/campx'
218
+ } catch (err) {
219
+ setLoading(false)
220
+ setError(err.response.data.message ?? 'Server Error')
221
+ }
222
+ }
223
+
224
+ const onError = (e) => {
225
+ console.log(e)
226
+ }
227
+
228
+ return (
229
+ <Box width={'100%'} marginTop="20px">
230
+ <form onSubmit={handleSubmit(onSubmit, onError)}>
231
+ <Stack gap={'40px'}>
232
+ <Typography variant="h6" textAlign={'center'}>
233
+ Sign in to Super Admin Account
234
+ </Typography>
235
+ <FormTextField
236
+ control={control}
237
+ name="username"
238
+ label="Username/Email"
239
+ required
240
+ />
241
+ <FormTextField
242
+ control={control}
243
+ name="password"
244
+ label="Password"
245
+ type={showPassword ? 'text' : 'password'}
246
+ required
247
+ InputProps={{
248
+ endAdornment: (
249
+ <InputAdornment position="end">
250
+ <IconButton
251
+ size="small"
252
+ aria-label="toggle password visibility"
253
+ onClick={() => setShowPassword((prev) => !prev)}
254
+ edge="end"
255
+ >
256
+ {showPassword ? <VisibilityOff /> : <Visibility />}
257
+ </IconButton>
258
+ </InputAdornment>
259
+ ),
260
+ }}
261
+ />
262
+ <ActionButton
263
+ type="submit"
264
+ fullWidth
265
+ disabled={loading}
266
+ loading={loading}
267
+ >
268
+ Login
269
+ </ActionButton>
270
+ </Stack>
271
+ </form>
272
+ {error && (
273
+ <Alert severity="error" sx={{ marginTop: '20px' }}>
274
+ {error}
275
+ </Alert>
276
+ )}
277
+ </Box>
278
+ )
279
+ }