import { useState } from 'react'; // material-ui import { Avatar, Button, FormControlLabel, Grid, InputLabel, MenuItem, Paper, Select, Stack, Switch, TextField, Typography, useMediaQuery, useTheme } from '@mui/material'; import { MdPersonAddAlt1 } from 'react-icons/md'; import { useMutation } from '@tanstack/react-query'; // project import import MainCard from 'components/MainCard'; import { createAdminTenant } from 'pages/api/doormileApi'; import Loader from 'components/Loader'; import { enqueueSnackbar } from 'notistack'; import { useNavigate } from 'react-router'; import { DT, tint } from 'themes/dt/tokens'; const Createclient = () => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down('md')); const navigate = useNavigate(); const [tenantname, setTenantname] = useState(''); const [primaryemail, setPrimaryemail] = useState(''); const [primarycontact, setPrimarycontact] = useState(''); // Confirmed live: POST /admin/tenants doesn't reject lowercase status, but // stores it exactly as sent — every real tenant uses "Active" (title // case), so a lowercase one would be inconsistent with the rest of the // data even though the request itself succeeds. const [status, setStatus] = useState('Active'); const [requiredeliveryotp, setRequiredeliveryotp] = useState(false); const opentoast = (message) => { enqueueSnackbar(message, { variant: 'error', anchorOrigin: { vertical: 'top', horizontal: 'right' }, autoHideDuration: 2000 }); }; const createTenantMutation = useMutation({ mutationFn: (payload) => createAdminTenant(payload), onSuccess: (res) => { if (res.success) { enqueueSnackbar('Client created successfully', { variant: 'success', anchorOrigin: { vertical: 'top', horizontal: 'right' }, autoHideDuration: 2000 }); navigate('/doormile/tenants'); } else { opentoast(res.message || 'Client already exists'); } }, onError: (err) => { opentoast(err.response?.data?.message || err.message || 'Failed to create client'); } }); const createprofile = () => { if (!tenantname) { opentoast('Fill Client / Business Name'); } else if (!primarycontact || primarycontact.length !== 10) { opentoast('Fill a valid 10-digit Contact Number'); } else if (!primaryemail) { opentoast('Fill Primary Email'); } else { // POST /admin/tenants — requiredeliveryotp is a pointer server-side; // it's opt-in and off by default, so we only send it when the operator // explicitly turns it on rather than always sending false. const obj = { tenantname, primaryemail, primarycontact, status, ...(requiredeliveryotp ? { requiredeliveryotp: true } : {}) }; createTenantMutation.mutate(obj); } }; return ( <> {createTenantMutation.isPending && } Create Client Client / Business Name setTenantname(e.target.value)} value={tenantname} autoComplete="off" /> Status Primary Contact Number { if (e.target.value.toString().length <= 10) { setPrimarycontact(e.target.value); } }} value={primarycontact} autoComplete="off" /> Primary Email setPrimaryemail(e.target.value)} value={primaryemail} autoComplete="off" /> setRequiredeliveryotp(e.target.checked)} />} label="Require delivery OTP for this client (off by default)" /> ); }; export default Createclient;