import {
Bug,
Check,
ChevronDown,
Cog,
Euro,
ExternalLink,
Logs,
Plus,
Search,
Trash2,
} from "lucide-react";
import Link from "next/link";
import { useRouter } from "next/router";
import { useState } from "react";
import toast from "react-hot-toast";
import {
Credenza,
CredenzaBody,
CredenzaContent,
CredenzaDescription,
CredenzaHeader,
CredenzaTitle,
CredenzaTrigger,
} from "~/components/custom_ui/credenza";
import { MultiSelect } from "~/components/custom_ui/multiselect";
import { LoadingPage } from "~/components/loading";
import { InterruzioneServizio } from "~/components/servizio/interruzione";
import { EditServizioModal } from "~/components/servizio/parametri_ricerca";
import { Button } from "~/components/ui/button";
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "~/components/ui/collapsible";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "~/components/ui/dialog";
import {
type FormValues as EditFormValues,
FormEditServizio,
} from "~/forms/FormEditServizioAdmin";
import { FormNewOrder } from "~/forms/FormNewOrdine";
import { cn, formatCurrency } from "~/lib/utils";
import { useTranslation } from "~/providers/I18nProvider";
import { useServizio } from "~/providers/ServizioProvider";
import type { AnnunciId } from "~/schemas/public/Annunci";
import type { Ordini } from "~/schemas/public/Ordini";
import type { Prezziario } from "~/schemas/public/Prezziario";
import type { ServizioServizioId } from "~/schemas/public/Servizio";
import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum";
import type { UsersId } from "~/schemas/public/Users";
import { api } from "~/utils/api";
import { Confirm } from "../confirm";
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "../ui/table";
export const ServizioInfos = () => {
return (
);
};
export const AdminServizioActions = () => {
const { servizio, isAdmin, userId } = useServizio();
if (!isAdmin) return null;
return (
);
};
const UserActions = () => {
const { servizio, isAdmin } = useServizio();
const canUserEdit = servizio.isOkAcconto && servizio.decorrenza !== null;
/*&&
new Date() <= add(new Date(servizio.decorrenza), { days: 60 }) &&
!servizio.annunci.some((a) => a.user_confirmed_at !== null) &&
!servizio.isInterrotto &&
!servizio.annunci.some((a) => a.user_confirmed_at !== null);*/
if (isAdmin || canUserEdit) {
return (
<>
>
);
}
return null;
};
const ServizioPrezzo = () => {
const { servizio } = useServizio();
const { t } = useTranslation();
const { data: packs } = api.servizio.getPacksSolution.useQuery({
servizioId: servizio.servizio_id,
});
if (!packs) return null;
return (
);
};
const ServizioOrders = () => {
const { isAdmin, servizio } = useServizio();
return (
);
};
export const OrdersModal = ({
children,
isAdmin,
ordini,
}: {
children: React.ReactNode;
isAdmin: boolean;
ordini: (Ordini & Pick)[];
}) => {
const [openOrders, setOpenOrders] = useState(false);
const [openEdit, setOpenEdit] = useState(false);
const swapToEdit = () => {
setOpenOrders(false);
setOpenEdit(true);
};
const swapToOrders = () => {
setOpenEdit(false);
setOpenOrders(true);
};
return (
<>
>
);
};
const AddOrderDialogContent = ({ swapBack }: { swapBack: () => void }) => {
const { servizioId, userId } = useServizio();
const { data, isLoading } = api.prezziario.getPrezziario.useQuery();
if (isLoading) return ;
if (!data)
return (
<>
Errore nel caricamento del prezziario.
>
);
return (
);
};
export const ServizioPacksInfos = () => {
const { servizio } = useServizio();
const { t } = useTranslation();
const { data: packs } = api.servizio.getPacksSolution.useQuery({
servizioId: servizio.servizio_id,
});
if (!packs) return null;
return (
{t.servizio.prezzi.sub}
{packs.acconto.success ? (
<>
{packs.acconto.pack.nome_it}
{packs.acconto.pack.desc_it}
{formatCurrency(packs.acconto.pack.prezzo_cent / 100)}
COD: {packs.acconto.pack.idprezziario}
>
) : (
{packs.acconto.message}
)}
{packs.saldo.success ? (
<>
{packs.saldo.pack.nome_it}
{packs.saldo.pack.desc_it}
{formatCurrency(packs.saldo.pack.prezzo_cent / 100)}
COD: {packs.saldo.pack.idprezziario}
>
) : (
{packs.saldo.message}
)}
{servizio.tipologia === TipologiaPosizioneEnum.Stabile && (
<>
{t.servizio.prezzi.consulenza}
{t.servizio.prezzi.consulenza_desc}
{t.servizio.prezzi.gotoprezzi}
>
)}
);
};
const AdminActivationUfficio = () => {
const { servizio } = useServizio();
const utils = api.useUtils();
const { mutate } = api.servizio.AdminAttivaServizio_Ufficio.useMutation({
onError: (error) => {
toast.error(error.message);
},
onSuccess: async () => {
toast.success("Servizio attivato con successo");
await utils.servizio.invalidate();
},
});
if (servizio.onboardOk) return null;
if (!servizio.ordini.some((o) => o.isActive)) return null;
return (
mutate({ servizioId: servizio.servizio_id })}
title="Attivazione Servizio"
>
);
};
const AddAnnuncio = ({
servizioId,
}: {
servizioId: ServizioServizioId;
userId: UsersId;
}) => {
const { data: codici, isLoading: loading } =
api.servizio.getAnnunciAvailableToAdd.useQuery({
servizioId,
});
const [selectedAnnunci, setSelectedAnnunci] = useState<
{ value: AnnunciId; label: string }[]
>([]);
const [openModal, setOpenModal] = useState(false);
const utils = api.useUtils();
const { mutate } = api.servizio.addServizioAnnunci.useMutation({
onError: (error) => {
console.error(error);
toast.error("Errore durante l'aggiunta dell'annuncio");
},
onSuccess: async () => {
await utils.servizio.invalidate();
toast.success("Annuncio aggiunto");
setOpenModal(false);
setSelectedAnnunci([]);
},
});
return (
);
};
const EditServizioAdmin = () => {
const { servizioId, userId, servizio } = useServizio();
const [open, setOpen] = useState(false);
const utils = api.useUtils();
const router = useRouter();
const { mutate: update } = api.servizio.updateServizio.useMutation({
onError: (error) => {
toast.error(error.message);
},
onSuccess: async () => {
toast.success("Servizio modificato con successo");
await utils.servizio.invalidate();
setOpen(false);
},
});
const { mutate: remove } = api.servizio.deleteServizio.useMutation({
onError: (error) => {
toast.error(error.message);
},
onMutate: async () => {
await router.push(`/area-riservata/admin/user-view/ricerca/${userId}`);
},
onSuccess: async () => {
toast.success("Servizio rimosso con successo");
await utils.servizio.invalidate();
},
});
function onSubmit(fields: EditFormValues) {
update({
data: {
...fields,
},
servizioId,
});
}
return (
Modifica Servizio Admin
Modifica
{(() => {
const { annunci, ...rest } = servizio;
return {JSON.stringify(rest, null, 2)};
})()}
{
remove({ servizioId });
}}
title="Elimina servizio"
>
);
};