|
- "use client";
-
- import Stack from "@mui/material/Stack";
- import Box from "@mui/material/Box";
- import Card from "@mui/material/Card";
- import CardContent from "@mui/material/CardContent";
- import Grid from "@mui/material/Grid";
- import TextField from "@mui/material/TextField";
- import Typography from "@mui/material/Typography";
- import { useTranslation } from "react-i18next";
- import { Controller, useFieldArray, useFormContext } from "react-hook-form";
- import Link from "next/link";
- import React from "react";
- import MailField from "../MailField/MailField";
- import { MailSetting } from "@/app/api/mail";
- import { MailSave } from "@/app/api/mail/actions";
- import { Checkbox, IconButton, InputAdornment } from "@mui/material";
- import { Visibility, VisibilityOff } from "@mui/icons-material";
-
- interface Props {
- isActive: boolean;
- }
-
- const SettingDetails: React.FC<Props> = ({ isActive }) => {
- const requiredFields = ["host", "port", "username"];
- const { t } = useTranslation();
- const {
- register,
- formState: { errors },
- control,
- watch,
- } = useFormContext<MailSave>();
-
- const { fields } = useFieldArray({
- control,
- name: "settings",
- });
-
- const [showSMTPPassword, setShowSMTPPassword] = React.useState(false);
-
- const handleClickShowPassword = () => setShowSMTPPassword((show) => !show);
-
- const handleMouseDownPassword = (
- event: React.MouseEvent<HTMLButtonElement>,
- ) => {
- event.preventDefault();
- };
-
- return (
- <Card sx={{ display: isActive ? "block" : "none" }}>
- <CardContent component={Stack} spacing={4}>
- <Box>
- <Typography variant="overline" display="block" marginBlockEnd={1}>
- {t("Settings")}
- </Typography>
- {fields.map((field, index) => (
- <Grid
- container
- key={"row-" + index}
- justifyContent="flex-start"
- alignItems="center"
- spacing={2}
- columns={{ xs: 6, sm: 12 }}
- sx={{ mt: 1 }}
- >
- <Grid item key={"col-1-" + index} xs={4}>
- <Typography variant="body2">{`${t(field.name)}${
- requiredFields.some((name) =>
- field.name.toLowerCase().includes(name),
- )
- ? "*"
- : ""
- }`}</Typography>
- </Grid>
- {field.name.toLowerCase().includes("password") === true ? (
- <Grid item key={"col-2-" + index} xs={8}>
- <TextField
- label={t(field.name)}
- type={showSMTPPassword ? "text" : "password"}
- InputProps={{
- endAdornment: (
- <InputAdornment position="end">
- <IconButton
- aria-label="toggle password visibility"
- onClick={handleClickShowPassword}
- onMouseDown={handleMouseDownPassword}
- >
- {showSMTPPassword ? (
- <Visibility />
- ) : (
- <VisibilityOff />
- )}
- </IconButton>
- </InputAdornment>
- ),
- }}
- fullWidth
- {...register(`settings.${index}.value`)}
- />
- </Grid>
- ) : field.type.toLowerCase() === "boolean" ? (
- <Grid item xs={8}>
- <Checkbox
- {...register(`settings.${index}.value`)}
- checked={Boolean(watch(`settings.${index}.value`))}
- />
- </Grid>
- ) : field.type.toLowerCase() === "integer" ? (
- <Grid item xs={8}>
- <TextField
- label={t(field.name)}
- type="number"
- InputProps={{
- inputProps: {
- step: 1,
- min: 0,
- },
- }}
- fullWidth
- {...register(`settings.${index}.value`, {
- required: requiredFields.some((name) =>
- field.name.toLowerCase().includes(name),
- ),
- })}
- error={Boolean(
- errors.settings &&
- errors.settings.length &&
- errors.settings.length > index &&
- errors.settings[index]?.value,
- )}
- />
- </Grid>
- ) : (
- <Grid item xs={8}>
- <TextField
- label={t(field.name)}
- fullWidth
- {...register(`settings.${index}.value`, {
- required: requiredFields.some((name) =>
- field.name.toLowerCase().includes(name),
- ),
- })}
- error={Boolean(
- errors.settings &&
- errors.settings.length &&
- errors.settings.length > index &&
- errors.settings[index]?.value,
- )}
- />
- </Grid>
- )}
- </Grid>
- ))}
- </Box>
- </CardContent>
- </Card>
- );
- };
-
- export default SettingDetails;
|