FPSMS-frontend
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 

143 rindas
7.7 KiB

  1. "use client";
  2. import Stack from "@mui/material/Stack";
  3. import Box from "@mui/material/Box";
  4. import Card from "@mui/material/Card";
  5. import CardContent from "@mui/material/CardContent";
  6. import Grid from "@mui/material/Grid";
  7. import TextField from "@mui/material/TextField";
  8. import Typography from "@mui/material/Typography";
  9. import { useTranslation } from "react-i18next";
  10. import { Controller, useFieldArray, useFormContext } from "react-hook-form";
  11. import Link from "next/link";
  12. import React from "react";
  13. import MailField from "../MailField/MailField";
  14. import { MailSetting } from "@/app/api/mail";
  15. import { MailSave } from "@/app/api/mail/actions";
  16. import { Checkbox, IconButton, InputAdornment } from "@mui/material";
  17. import { Visibility, VisibilityOff } from "@mui/icons-material";
  18. interface Props {
  19. isActive: boolean;
  20. }
  21. const SettingDetails: React.FC<Props> = ({ isActive }) => {
  22. const requiredFields = ["host", "port", "username"]
  23. const { t } = useTranslation();
  24. const {
  25. register,
  26. formState: { errors },
  27. control,
  28. watch
  29. } = useFormContext<MailSave>();
  30. const { fields } = useFieldArray({
  31. control,
  32. name: "settings"
  33. })
  34. const [showSMTPPassword, setShowSMTPPassword] = React.useState(false)
  35. const handleClickShowPassword = () => setShowSMTPPassword((show) => !show);
  36. const handleMouseDownPassword = (event: React.MouseEvent<HTMLButtonElement>) => {
  37. event.preventDefault();
  38. };
  39. return (
  40. <Card sx={{ display: isActive ? "block" : "none" }}>
  41. <CardContent component={Stack} spacing={4}>
  42. <Box>
  43. <Typography variant="overline" display="block" marginBlockEnd={1}>
  44. {t("Settings")}
  45. </Typography>
  46. {
  47. fields.map((field, index) => (
  48. <Grid container key={"row-" + index} justifyContent="flex-start" alignItems="center" spacing={2} columns={{ xs: 6, sm: 12 }} sx={{ mt: 1 }}>
  49. <Grid item key={"col-1-" + index} xs={4}>
  50. <Typography variant="body2">{`${t(field.name)}${requiredFields.some(name => field.name.toLowerCase().includes(name)) ? "*" : ""}`}</Typography>
  51. </Grid>
  52. {
  53. field.name.toLowerCase().includes("password") === true ?
  54. <Grid item key={"col-2-" + index} xs={8}>
  55. <TextField
  56. label={t(field.name)}
  57. type={showSMTPPassword ? "text" : "password"}
  58. InputProps={{
  59. endAdornment: (
  60. <InputAdornment position="end">
  61. <IconButton
  62. aria-label="toggle password visibility"
  63. onClick={handleClickShowPassword}
  64. onMouseDown={handleMouseDownPassword}
  65. >
  66. {showSMTPPassword ? <Visibility /> : <VisibilityOff />}
  67. </IconButton>
  68. </InputAdornment>
  69. ),
  70. }}
  71. fullWidth
  72. {...register(`settings.${index}.value`)}
  73. />
  74. </Grid>
  75. :
  76. field.type.toLowerCase() === "boolean" ?
  77. <Grid item xs={8}>
  78. <Checkbox
  79. {...register(`settings.${index}.value`)}
  80. checked={Boolean(watch(`settings.${index}.value`))}
  81. />
  82. </Grid>
  83. :
  84. field.type.toLowerCase() === "integer" ?
  85. <Grid item xs={8}>
  86. <TextField
  87. label={t(field.name)}
  88. type="number"
  89. InputProps={{
  90. inputProps: {
  91. step: 1,
  92. min: 0,
  93. }
  94. }}
  95. fullWidth
  96. {...register(`settings.${index}.value`,
  97. {
  98. required: requiredFields.some(name => field.name.toLowerCase().includes(name))
  99. })}
  100. error={Boolean(
  101. errors.settings
  102. && errors.settings.length
  103. && errors.settings.length > index
  104. && errors.settings[index]?.value
  105. )}
  106. />
  107. </Grid>
  108. :
  109. <Grid item xs={8}>
  110. <TextField
  111. label={t(field.name)}
  112. fullWidth
  113. {...register(`settings.${index}.value`,
  114. {
  115. required: requiredFields.some(name => field.name.toLowerCase().includes(name))
  116. })}
  117. error={Boolean(
  118. errors.settings
  119. && errors.settings.length
  120. && errors.settings.length > index
  121. && errors.settings[index]?.value
  122. )}
  123. />
  124. </Grid>
  125. }
  126. </Grid>
  127. ))
  128. }
  129. </Box>
  130. </CardContent>
  131. </Card >
  132. );
  133. };
  134. export default SettingDetails;