Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 

196 righe
6.5 KiB

  1. "use client";
  2. import Check from "@mui/icons-material/Check";
  3. import Close from "@mui/icons-material/Close";
  4. import Button from "@mui/material/Button";
  5. import Stack from "@mui/material/Stack";
  6. import { useRouter } from "next/navigation";
  7. import React, { useCallback, useState } from "react";
  8. import { useTranslation } from "react-i18next";
  9. import {
  10. FieldErrors,
  11. FormProvider,
  12. SubmitErrorHandler,
  13. SubmitHandler,
  14. useForm,
  15. } from "react-hook-form";
  16. import { Tab, Tabs, TabsProps, Typography } from "@mui/material";
  17. import TimesheetMailDetails from "./TimesheetMailDetails";
  18. import { Error } from "@mui/icons-material";
  19. import { MailSave, saveMail, testEveryone, test7th, test15th, testEmail } from "@/app/api/mail/actions";
  20. import SettingDetails from "./SettingDetails";
  21. import { errorDialog, submitDialog, successDialog } from "../Swal/CustomAlerts";
  22. export interface Props {
  23. defaultInputs?: MailSave,
  24. }
  25. const hasErrorsInTab = (
  26. tabIndex: number,
  27. errors: FieldErrors<MailSave>,
  28. ) => {
  29. switch (tabIndex) {
  30. case 0:
  31. return (
  32. errors.settings
  33. );
  34. case 1:
  35. return (
  36. errors.template
  37. );
  38. default:
  39. false;
  40. }
  41. };
  42. const MailSetting: React.FC<Props> = ({
  43. defaultInputs,
  44. }) => {
  45. const [serverError, setServerError] = useState("");
  46. const { t } = useTranslation();
  47. const router = useRouter();
  48. const [tabIndex, setTabIndex] = useState(0);
  49. const [test, setTest] = useState(false)
  50. const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>(
  51. (_e, newValue) => {
  52. setTabIndex(newValue);
  53. },
  54. [],
  55. );
  56. const formProps = useForm<MailSave>({
  57. defaultValues: defaultInputs
  58. });
  59. const handleCancel = () => {
  60. router.back();
  61. };
  62. const onSubmit = useCallback<SubmitHandler<MailSave>>(
  63. async (data) => {
  64. try {
  65. console.log(data);
  66. let haveError = false
  67. // if (data.name.length === 0) {
  68. // haveError = true
  69. // formProps.setError("name", { message: "Name is empty", type: "required" })
  70. // }
  71. if (haveError) {
  72. return false
  73. }
  74. setServerError("");
  75. submitDialog(async () => {
  76. const response = await saveMail(data);
  77. console.log(response)
  78. if (response !== null) {
  79. if (test) {
  80. let msg = ""
  81. try {
  82. // msg = "testEveryone"
  83. // await testEveryone()
  84. // msg = "test7th"
  85. // await test7th()
  86. // msg = "test15th"
  87. // await test15th()
  88. msg = "testEmail"
  89. await testEmail()
  90. } catch (error) {
  91. console.log(error)
  92. console.log(msg)
  93. }
  94. }
  95. successDialog(t("Save Success"), t)
  96. } else {
  97. errorDialog(t("Save Fail"), t).then(() => {
  98. // formProps.setError("code", { message: response.message, type: "custom" })
  99. // setTabIndex(0)
  100. return false
  101. })
  102. }
  103. }, t)
  104. } catch (e) {
  105. console.log(e)
  106. setServerError(t("An error has occurred. Please try again later."));
  107. }
  108. },
  109. [router, t, test],
  110. );
  111. const onSubmitError = useCallback<SubmitErrorHandler<MailSave>>(
  112. (errors) => {
  113. console.log(errors)
  114. },
  115. [],
  116. );
  117. const errors = formProps.formState.errors;
  118. return (
  119. <FormProvider {...formProps}>
  120. <Stack
  121. spacing={2}
  122. component="form"
  123. onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}
  124. >
  125. {serverError && (
  126. <Typography variant="body2" color="error" alignSelf="flex-end">
  127. {serverError}
  128. </Typography>
  129. )}
  130. <Tabs
  131. value={tabIndex}
  132. onChange={handleTabChange}
  133. variant="scrollable"
  134. >
  135. <Tab
  136. label={t("Setting")}
  137. sx={{ marginInlineEnd: hasErrorsInTab(1, errors) && !hasErrorsInTab(1, errors) ? 1 : undefined }}
  138. icon={
  139. hasErrorsInTab(0, errors) ? (
  140. <Error sx={{ marginInlineEnd: 1 }} color="error" />
  141. ) : undefined
  142. }
  143. iconPosition="end"
  144. />
  145. <Tab
  146. label={t("Timesheet Template")}
  147. icon={
  148. hasErrorsInTab(1, errors) ? (
  149. <Error sx={{ marginInlineEnd: 1 }} color="error" />
  150. ) : undefined
  151. }
  152. iconPosition="end"
  153. />
  154. </Tabs>
  155. <SettingDetails isActive={tabIndex === 0}/>
  156. <TimesheetMailDetails isActive={tabIndex === 1} />
  157. <Stack direction="row" justifyContent="flex-end" gap={1}>
  158. <Button
  159. variant="outlined"
  160. startIcon={<Close />}
  161. onClick={handleCancel}
  162. >
  163. {t("Cancel")}
  164. </Button>
  165. <Button variant="contained" startIcon={<Check />} onClick={() => setTest(true)} type="submit">
  166. {t("send to everyone")}
  167. </Button>
  168. <Button variant="contained" startIcon={<Check />} onClick={() => setTest(false)} type="submit">
  169. {t("Save")}
  170. </Button>
  171. </Stack>
  172. </Stack>
  173. </FormProvider>
  174. );
  175. };
  176. export default MailSetting;