From d116ebd3d598bf581ed85517c04d963aa083b7f6 Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Tue, 11 Nov 2025 15:41:20 +0100 Subject: [PATCH] feat: integrate DocumentiUploadSection for document handling in various components --- .../area-riservata/documenti_personali.tsx | 243 +++++++++--------- .../src/components/servizio/conferma.tsx | 55 +--- .../components/servizio/modale_contatti.tsx | 144 +++++------ 3 files changed, 207 insertions(+), 235 deletions(-) diff --git a/apps/infoalloggi/src/components/area-riservata/documenti_personali.tsx b/apps/infoalloggi/src/components/area-riservata/documenti_personali.tsx index f020011..a9157d8 100644 --- a/apps/infoalloggi/src/components/area-riservata/documenti_personali.tsx +++ b/apps/infoalloggi/src/components/area-riservata/documenti_personali.tsx @@ -1,13 +1,15 @@ -import { ExternalLink, Trash2 } from "lucide-react"; +import { CircleCheck, ExternalLink, Trash2 } from "lucide-react"; import Link from "next/link"; import toast from "react-hot-toast"; import { useSession } from "~/providers/SessionProvider"; +import type { UsersId } from "~/schemas/public/Users"; import type { UsersStorageUserStorageId } from "~/schemas/public/UsersStorage"; import type { UserWithAnagrafica } from "~/server/services/user.service"; import { api } from "~/utils/api"; import { Confirm } from "../confirm"; import { ImageFlbk } from "../ImageWithFallback"; import { LoadingPage } from "../loading"; +import { LoadingSpinner } from "../spinner"; import { Button } from "../ui/button"; import { Card, @@ -63,125 +65,35 @@ export const DocumentiPersonali = ({
-
-
-

- Documento d'identità - Fronte -

+ + mutate({ + userId: userData.id, + data: { doc_personale_fronte_ref: null }, + }) + } + onUpload={(id) => handleUpload("doc_personale_fronte_ref", id)} + title="Documento d'identità - Fronte" + userId={userData.id} + /> - {userData.doc_personale_fronte?.storageId ? ( -
- - -
- - - - { - mutate({ - userId: userData.id, - data: { doc_personale_fronte_ref: null }, - }); - }} - title="Elimina Documento" - > - - -
-
- ) : ( - - userStorageIds.length > 0 && - userStorageIds[0] && - handleUpload("doc_personale_fronte_ref", userStorageIds[0]) - } - isAdmin={user.isAdmin} - maxFiles={1} - userId={userData.id} - /> - )} -
-
-
-
-

Documento d'identità - Retro

- {userData.doc_personale_retro?.storageId ? ( -
- - -
- - - - { - mutate({ - userId: userData.id, - data: { doc_personale_retro_ref: null }, - }); - }} - title="Elimina Documento" - > - - -
-
- ) : ( - - userStorageIds.length > 0 && - userStorageIds[0] && - handleUpload("doc_personale_retro_ref", userStorageIds[0]) - } - isAdmin={user.isAdmin} - maxFiles={1} - userId={userData.id} - /> - )} -
-
+ + mutate({ + userId: userData.id, + data: { doc_personale_retro_ref: null }, + }) + } + onUpload={(id) => handleUpload("doc_personale_retro_ref", id)} + title="Documento d'identità - Retro" + userId={userData.id} + />
@@ -196,3 +108,96 @@ export const DocumentiPersonali = ({ ); }; + +export const DocumentiUploadSection = ({ + title, + document, + onUpload, + onRemove, + isAdmin, + userId, + isPending, + caricatoNote, +}: { + title: string; + document: { + storageId: string; + ref: UsersStorageUserStorageId | null; + } | null; + onUpload: (id: UsersStorageUserStorageId) => void; + onRemove?: () => void; + isAdmin: boolean; + userId: UsersId; + isPending: boolean; + caricatoNote?: boolean; +}) => { + if (document?.storageId) { + return ( +
+

{title}

+ {caricatoNote && ( +
+ + Documento caricato +
+ )} +
+ {isPending ? ( + + ) : ( + + )} +
+ + + + {onRemove && ( + + + + )} +
+
+
+ ); + } + + return ( +
+

{title}

+ { + const id = userStorageIds[0]; + if (id) onUpload(id); + }} + isAdmin={isAdmin} + maxFiles={1} + userId={userId} + /> +
+ ); +}; diff --git a/apps/infoalloggi/src/components/servizio/conferma.tsx b/apps/infoalloggi/src/components/servizio/conferma.tsx index aa19370..e18e73c 100644 --- a/apps/infoalloggi/src/components/servizio/conferma.tsx +++ b/apps/infoalloggi/src/components/servizio/conferma.tsx @@ -9,6 +9,7 @@ import { useServizio, useServizioAnnuncio } from "~/providers/ServizioProvider"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { UsersStorageUserStorageId } from "~/schemas/public/UsersStorage"; import { api } from "~/utils/api"; +import { DocumentiUploadSection } from "../area-riservata/documenti_personali"; import { Credenza, CredenzaBody, @@ -22,7 +23,6 @@ import { } from "../custom_ui/credenza"; import LoadingButton from "../custom_ui/loading-button"; import { Button } from "../ui/button"; -import { type UploadCallback, UploadModal } from "../upload_modal"; export const FileSection = ({ storageId }: { storageId: string }) => { const { data: fileInfos, isLoading } = api.storage.getFileInfos.useQuery({ @@ -134,40 +134,9 @@ const InvioConferma = ({ setOpen }: { setOpen: (value: boolean) => void }) => { ); }; -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 { userId, servizio, isAdmin } = useServizio(); const utils = api.useUtils(); const { mutate, isPending } = api.servizio.updateServizio.useMutation({ onSuccess: async () => { @@ -198,17 +167,15 @@ const DocCheckpoint = () => { motivazione di transitorietà

-
- Documento: - - userStorageIds.length > 0 && - userStorageIds[0] && - handleUpload(userStorageIds[0]) - } - docInfo={servizio.doc_motivazione} - /> -
+

diff --git a/apps/infoalloggi/src/components/servizio/modale_contatti.tsx b/apps/infoalloggi/src/components/servizio/modale_contatti.tsx index ae1f38b..a7f6667 100644 --- a/apps/infoalloggi/src/components/servizio/modale_contatti.tsx +++ b/apps/infoalloggi/src/components/servizio/modale_contatti.tsx @@ -1,17 +1,12 @@ -import { - CircleCheck, - CircleUser, - Navigation, - Phone, - TriangleAlert, -} from "lucide-react"; +import { CircleUser, Navigation, Phone, TriangleAlert } from "lucide-react"; import Link from "next/link"; -import { useMemo } from "react"; +import { useMemo, useState } 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 { DocumentiUploadSection } from "../area-riservata/documenti_personali"; import { Credenza, CredenzaBody, @@ -26,22 +21,32 @@ import { 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 [open, setOpen] = useState(false); 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); + const [showDocStep, setShowDocStep] = useState( + open && (needsDocuments || !isUnlocked), + ); return ( - + { + setOpen(o); + if (o && (needsDocuments || !isUnlocked)) { + setShowDocStep(true); + } + }} + open={open} + > - {data.open_contatti_at != null ? ( + {isUnlocked ? (