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 ? (