import Link from "next/link";
import { Button, type ButtonConfigs } from "~/components/ui/button";
import { useTranslation } from "~/providers/I18nProvider";
import { api } from "~/utils/api";
import toast from "react-hot-toast";
import {
Credenza,
CredenzaBody,
CredenzaClose,
CredenzaContent,
CredenzaDescription,
CredenzaFooter,
CredenzaHeader,
CredenzaTitle,
CredenzaTrigger,
} from "~/components/custom_ui/credenza";
import {
CircleCheck,
CircleUser,
FileBadge,
FileText,
Handshake,
Navigation,
PackageCheck,
Phone,
Pointer,
TriangleAlert,
} from "lucide-react";
import LoadingButton from "~/components/custom_ui/loading-button";
import { LoadingPage } from "~/components/loading";
import { useRouter } from "next/router";
import { cn } from "~/lib/utils";
import { useEffect, useState } from "react";
import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "~/components/ui/tooltip";
import type { AnnunciId } from "~/schemas/public/Annunci";
export const Interactions = () => {
const { servizio, servizioId } = useServizio();
const { data, annuncioId } = useServizioAnnuncio();
return (
<>
{data.open_contatti_at !== null && data.user_confirmed_at == null && (
)}
{data.user_confirmed_at && !data.hasConfermaAdmin && (
)}
{data.doc_conferma_added &&
data.accettato_conferma_at == null &&
data.hasConfermaAdmin &&
(data.doc_conferma_ref ? (
Confermato - Procedi ora
) : (
Confermato - Procedi ora
Il documento non è più disponibile
Se hai bisogno di una copia, contattaci via email o chat.
))}
{!servizio.isOkSaldo && data.accettato_conferma_at != null && (
Questo annuncio è stato confermato, procedi al saldo:
)}
{data.accettato_conferma_at != null && (
Rivedi la conferma
)}
{servizio.isOkSaldo &&
data.accettato_conferma_at != null &&
data.doc_contratto_added == null && (
Ci siamo quasi! Stiamo preparando il contratto per te.
Una volta pronto, riceverai una notifica via email.
)}
{servizio.isOkSaldo &&
data.accettato_conferma_at != null &&
data.doc_contratto_added && (
{servizio.isOkConsulenza
? "Il contratto è pronto, puoi visualizzarlo:"
: "Il contratto è pronto, puoi visualizzarlo e procedere al saldo:"}
{data.doc_contratto_ref ? (
Visualizza il contratto
) : (
Visualizza il contratto
Il documento non è più disponibile
Se hai bisogno di una copia, contattaci via email o
chat.
)}
{!servizio.isOkConsulenza && data.contratto_tipo && (
)}
{data.doc_registrazione_added &&
(data.doc_registrazione_ref ? (
Visualizza la registrazione
) : (
Visualizza la registrazione
Il documento non è più disponibile
Se hai bisogno di una copia, contattaci via email o
chat.
))}
)}
>
);
};
export const SaldoButton = ({
annuncioId,
variant = "info",
className,
}: {
annuncioId: AnnunciId;
variant?: ButtonConfigs["variant"];
className?: string;
}) => {
const { servizioId } = useServizio();
const router = useRouter();
const { mutate } = api.servizio.setupSaldoServizio.useMutation({
onMutate: () => {
toast.loading("Caricamento ...", { id: "preparazioneSaldo" });
},
onSuccess: async (data) => {
toast.success("Pagamento saldo preparato", {
id: "preparazioneSaldo",
});
await router.push(`/servizio/pagamento/${data}`);
},
});
return (
{
mutate({
servizioId,
annuncioId,
});
}}
>
Procedi al saldo
);
};
const SaldoConsulenzaButton = ({
variant = "info",
className,
}: {
variant?: ButtonConfigs["variant"];
className?: string;
}) => {
const { annuncioId } = useServizioAnnuncio();
const { servizioId } = useServizio();
const router = useRouter();
const { mutate } = api.servizio.setupSaldoConsulenzaServizio.useMutation({
onMutate: () => {
toast.loading("Caricamento ...", { id: "preparazioneSaldo" });
},
onSuccess: async (data) => {
toast.success("Pagamento saldo preparato", {
id: "preparazioneSaldo",
});
await router.push(`/servizio/pagamento/${data}`);
},
});
return (
{
mutate({
servizioId,
annuncioId,
});
}}
>
Procedi al saldo della consulenza
);
};
const AnnuncioConfirm = () => {
const { userId, servizioId } = useServizio();
const { annuncioId } = useServizioAnnuncio();
const { t } = useTranslation();
const [open, setOpen] = useState(false);
const utils = api.useUtils();
const { mutate, isPending } = api.servizio.userConfirmImmobile.useMutation({
onMutate: () => {
toast.loading("Conferma in corso", { id: "updateRichiestaToast" });
},
onError: (err) => {
toast.error(err.message, { id: "updateRichiestaToast" });
},
onSuccess: async () => {
toast.success("Richiesta confermata con successo", {
id: "updateRichiestaToast",
});
await utils.servizio.getAllServizioAnnunci.invalidate({ userId });
setOpen(false);
},
});
return (
Conferma immobile
{t.richieste.conf_title}
{t.richieste.conf_desc}
{t.richieste.conferma_txt}
{
mutate({
annuncioId,
servizioId,
});
}}
>
{t.conferma}
Chiudi
);
};
const ConfermaLavorazioneModal = () => {
const { t } = useTranslation();
const { data } = useServizioAnnuncio();
return (
Conferma in lavorazione
In attesa di conferma
Consegna status modal
Richiesta di conferma inviata il:{" "}
{data.user_confirmed_at &&
new Date(data.user_confirmed_at).toLocaleString("it", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
})}
La conferma è ancora in lavorazione. Stiamo verificando con i
proprietari le condizioni e dettagli della conferma per riferirteli.
Attendi una comunicazione.
{t.chiudi}
);
};
const ContattiProprietarioModal = () => {
const { servizioId, userId } = useServizio();
const { data, annuncioId } = useServizioAnnuncio();
const { t } = useTranslation();
const [showContacts, setShowContacts] = useState(
data.open_contatti_at != null,
);
const utils = api.useUtils();
const { mutate } = api.servizio.unlockServizioContatti.useMutation({
onMutate: () => {
toast.loading("Caricamento ...", {
id: "unlock-contacts",
});
},
onSuccess: async (data) => {
if (!data) {
toast.error("Limite di sblocchi raggiunto", {
id: "unlock-contacts",
});
return;
}
toast.success("Successo", {
id: "unlock-contacts",
});
await utils.servizio.getAllServizioAnnunci.invalidate({
userId,
});
setShowContacts(true);
},
onError: (err) => {
toast.error(err.message, {
id: "unlock-contacts",
});
},
});
const d = new Date();
const tooEarly = d.getHours() < 9;
const tooLate = d.getHours() >= 20;
return (
{showContacts ? (
Vedi i contatti
) : (
Ottieni i contatti
)}
{t.contatto.title}
{t.contatto.descrizione}
{showContacts ? (
) : (
{t.contatto.disclaimer}
{t.contatto.disclaimer2}
{t.contatto.disclaimer3}
{(tooEarly || tooLate) && (
{/*TODO testare */}
Il proprietario riceverà la notifica alle ore 9.00{" "}
{tooLate && "di domani"}
)}
)}
{!showContacts && (
mutate({
servizioId,
annuncioId,
})
}
>
{t.accetta}
)}
{t.chiudi}
);
};
const ContattiProprietarioData = () => {
const { servizioId } = useServizio();
const { annuncioId } = useServizioAnnuncio();
const { data, isLoading } = api.annunci.getProprietarioData.useQuery({
annuncioId,
servizioId,
});
const [navigationUrl, setNavigationUrl] = useState(
undefined,
);
const { t } = useTranslation();
useEffect(() => {
if (!data || !data.propData) return;
if (typeof window === "undefined") return;
if (
navigator.userAgent.toUpperCase().includes("MAC") ||
navigator.userAgent.toUpperCase().includes("IPAD") ||
navigator.userAgent.toUpperCase().includes("IPHONE") ||
navigator.userAgent.toUpperCase().includes("IOS") ||
navigator.userAgent.toUpperCase().includes("IPOD")
) {
setNavigationUrl(
`maps://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${data.propData.lat},${data.propData.lon}`,
);
} else {
setNavigationUrl(
`https://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${data.propData.lat},${data.propData.lon}`,
);
}
}, [data]);
if (isLoading) {
return (
);
}
if (!data || !data.propData) {
return {t.contatto.error}
;
}
return (
{t.contatto.propietario}:
{t.contatto.nome}: {data.propData.locatore}
:
{data.propData.numero}
{t.contatto.immobile}:
{t.contatto.indirizzo}: {data.propData.indirizzo},{" "}
{data.propData.civico} {data.propData.comune} ({data.propData.provincia}
)
{t.contatto.apri_nav}
{t.contatto.sbloccato_il}:{" "}
{data.opened_at.toLocaleString("it", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
})}
{t.contatto.contatta}
{t.contatto.orari}
);
};