import {
CircleCheck,
CircleUser,
Navigation,
Phone,
TriangleAlert,
} from "lucide-react";
import Link from "next/link";
import { useMemo } from "react";
import toast from "react-hot-toast";
import { useTranslation } from "~/providers/I18nProvider";
import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider";
import type { UsersStorageUserStorageId } from "~/schemas/public/UsersStorage";
import { api } from "~/utils/api";
import {
Credenza,
CredenzaBody,
CredenzaClose,
CredenzaContent,
CredenzaDescription,
CredenzaFooter,
CredenzaHeader,
CredenzaTitle,
CredenzaTrigger,
} from "../custom_ui/credenza";
import { LoadingPage } from "../loading";
import { WhatsAppIcon2 } from "../svgs";
import { Button } from "../ui/button";
import { type UploadCallback, UploadModal } from "../upload_modal";
export const ContattiProprietarioModal = () => {
const { servizio } = useServizio();
const { data } = useServizioAnnuncio();
const { t } = useTranslation();
const isUnlocked = data.open_contatti_at != null;
const needsDocuments =
!servizio.skipControlloDoc &&
(!servizio.doc_personale_fronte || !servizio.doc_personale_retro);
return (
{data.open_contatti_at != null ? (
) : (
)}
{t.contatto.title}
{t.contatto.descrizione}
{needsDocuments ? (
) : isUnlocked ? (
) : (
)}
);
};
const DocComponent = ({
docInfo,
cb,
}: {
docInfo: {
storageId: string;
ref: UsersStorageUserStorageId | null;
} | null;
cb: UploadCallback;
}) => {
const { isAdmin, userId } = useServizio();
if (docInfo?.storageId) {
return (
Documento caricato
);
}
return (
);
};
const DocCheckpoint = () => {
const { t } = useTranslation();
const { userId, servizio } = useServizio();
const utils = api.useUtils();
const { mutate, isPending } = api.servizio.updateServizio.useMutation({
onSuccess: async () => {
await utils.servizio.getAllServizioAnnunci.invalidate({
userId,
});
await utils.storage.retrieveUserFileData.invalidate({ userId });
await utils.servizio.getServizio.invalidate({
servizioId: servizio.servizio_id,
});
},
onError: (err) => {
toast.error(`Errore aggiornamento servizio: ${err.message}`);
},
});
const handleUpload = (
field: "doc_personale_fronte_ref" | "doc_personale_retro_ref",
id: UsersStorageUserStorageId,
) => {
mutate({
servizioId: servizio.servizio_id,
data: { [field]: id },
});
};
return (
<>
Devi ancora caricare un tuo documento
Fronte documento:
userStorageIds.length > 0 &&
userStorageIds[0] &&
handleUpload("doc_personale_fronte_ref", userStorageIds[0])
}
docInfo={servizio.doc_personale_fronte}
/>
Retro documento:
userStorageIds.length > 0 &&
userStorageIds[0] &&
handleUpload("doc_personale_retro_ref", userStorageIds[0])
}
docInfo={servizio.doc_personale_retro}
/>
I tuoi dati saranno conservati solamente per la durata del servizio,
in conformità con la nostra{" "}
Informativa sulla Privacy
>
);
};
const PreUnlock = () => {
const { userId, servizioId } = useServizio();
const { annuncioId } = useServizioAnnuncio();
const { t } = useTranslation();
const utils = api.useUtils();
const { mutate, isPending } = api.servizio.unlockServizioContatti.useMutation(
{
onError: (err) => {
toast.error(err.message, {
id: "unlock-contacts",
});
},
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,
});
},
},
);
const currentHour = new Date().getHours();
const isOutsideBusinessHours = currentHour < 9 || currentHour >= 20;
return (
<>
{t.contatto.disclaimer}
{t.contatto.disclaimer2}
{t.contatto.disclaimer3}
{isOutsideBusinessHours && (
Il proprietario riceverà la notifica alle ore 9.00{" "}
{currentHour >= 20 && "di domani"}
)}
>
);
};
function getNavigationUrl(lat: string, lon: string): string {
if (typeof window === "undefined") {
return `https://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${lat},${lon}`;
}
const isIOS = /iPad|iPhone|iPod|Mac/.test(navigator.userAgent);
const protocol = isIOS ? "maps" : "https";
return `${protocol}://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=${lat},${lon}`;
}
const PostUnlock = () => {
const { servizioId } = useServizio();
const { annuncioId } = useServizioAnnuncio();
const { data, isLoading } = api.annunci.getProprietarioData.useQuery({
annuncioId,
servizioId,
});
const { t } = useTranslation();
// Memoize navigation URL
const navigationUrl = useMemo(() => {
if (!data?.propData || !data.propData.lat || !data.propData.lon)
return undefined;
return getNavigationUrl(data.propData.lat, data.propData.lon);
}, [data?.propData]);
if (isLoading) {
return (
);
}
if (!data || !data.propData) {
return (
{t.contatto.error}
);
}
const { opened_at, propData } = data;
return (
<>
{/* Proprietario Section */}
{t.contatto.propietario}:
{t.contatto.nome}: {propData.locatore}
{/* Immobile Section */}
{t.contatto.immobile}:
{t.contatto.indirizzo}: {propData.indirizzo}, {propData.civico}{" "}
{propData.comune} ({propData.provincia})
{navigationUrl && (
{t.contatto.apri_nav}
)}
{/* Warning */}
{t.contatto.contatta}
{t.contatto.orari}
{/* Metadata */}
{t.contatto.sbloccato_il}:{" "}
{opened_at.toLocaleString("it", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
})}
>
);
};