diff --git a/web/src/core/constants/selected_panel.ts b/web/src/core/constants/selected_panel.ts index d9691ddb09e0f23ef56fbcb4d36001a9e65789f0..090e9ed52687a2333483c643601300b590891e8f 100644 --- a/web/src/core/constants/selected_panel.ts +++ b/web/src/core/constants/selected_panel.ts @@ -4,7 +4,8 @@ export enum AdminSelectedPanel { TOWN_INFO = "town_info", // Panel for town information PLACES = "places", // Panel for places - POINT_OF_INTEREST = "point_of_interest" // Panel for points of interest + POINT_OF_INTEREST = "point_of_interest", // Panel for points of interest + ABOUT_US = "about_us" // Panel for about us } /** @@ -13,5 +14,6 @@ export enum AdminSelectedPanel { export enum SuperAdminSelectedPanel { TOWNS = "towns", // Panel for towns ADMINS = "admins", // Panel for admins - CATEGORIES = "categories" // Panel for categories + CATEGORIES = "categories", // Panel for categories + ABOUT_US = "about_us", // Panel for about us } \ No newline at end of file diff --git a/web/src/data/datasource/api/poi_datasource.ts b/web/src/data/datasource/api/poi_datasource.ts index 4e26660e57851dd7776fc6906701b2e147cce346..625313f93f286c10671acf77f2badb39abc63241 100644 --- a/web/src/data/datasource/api/poi_datasource.ts +++ b/web/src/data/datasource/api/poi_datasource.ts @@ -1,5 +1,4 @@ import axios from "axios"; -import { Buffer } from "buffer"; import { PoiDatasourceInf } from "../poi_datasource"; import { PointOfInterest } from "./entities/poi"; import { APIUrl } from "../../../core/constants/api_url"; @@ -91,9 +90,9 @@ export class POIDatasourceProd implements PoiDatasourceInf { * Generates a PDF for the specified points of interest. * @param idPlace - The ID of the place. * @param pointsId - An array of point IDs to include in the PDF. - * @returns A promise that resolves to a base64-encoded string of the PDF. + * @returns A promise that resolves to a Blob containing the PDF data. */ - async getPDFByPoints(idPlace: number, pointsId: number[]): Promise { + async getPDFByPoints(idPlace: number, pointsId: number[]): Promise { const { data } = await axios.get( APIUrl + API_ROUTE_PLACE + `/${idPlace}` + API_ROUTE_POINT + "/generate", { @@ -103,6 +102,6 @@ export class POIDatasourceProd implements PoiDatasourceInf { responseType: "arraybuffer", } ); - return Buffer.from(data, "binary").toString("base64"); + return new Blob([data], { type: "application/pdf" }); } } diff --git a/web/src/data/datasource/poi_datasource.ts b/web/src/data/datasource/poi_datasource.ts index b03b50dd651b2308f721918326cc330c38d192d2..1b2b208fe0c49d341242a8c3ab7ea74e8e76395c 100644 --- a/web/src/data/datasource/poi_datasource.ts +++ b/web/src/data/datasource/poi_datasource.ts @@ -29,7 +29,7 @@ export interface PoiDatasourceInf { * Retrieves a PDF document containing information about specified POIs. * @param idPlace - The ID of the place. * @param pointsId - An array of POI IDs. - * @returns A promise that resolves to a string representing the PDF document. + * @returns A promise that resolves to a Blob containing the PDF data. */ - getPDFByPoints(idPlace: number, pointsId: number[]): Promise; + getPDFByPoints(idPlace: number, pointsId: number[]): Promise; } diff --git a/web/src/data/repository/poi_repository.ts b/web/src/data/repository/poi_repository.ts index 9a59ed06091faaa6d39374c8ff55cd9ee0a6cafa..d65f18246c7af3ce472f4aa81d9bcbead565414c 100644 --- a/web/src/data/repository/poi_repository.ts +++ b/web/src/data/repository/poi_repository.ts @@ -39,9 +39,9 @@ export class POIRepositoryProd implements PoiRepositoryInf { * Retrieves a PDF document for the given points of interest. * @param idPlace - The ID of the place. * @param pointsId - An array of point IDs. - * @returns A promise that resolves to a string representing the PDF document. + * @returns A promise that resolves to a Blob containing the PDF data. */ - async getPDFByPoints(idPlace: number, pointsId: number[]): Promise { + async getPDFByPoints(idPlace: number, pointsId: number[]): Promise { return this.datasouce.getPDFByPoints(idPlace, pointsId); } } diff --git a/web/src/domain/repository/poi_repository.ts b/web/src/domain/repository/poi_repository.ts index e99c809242e8520e634d478f751f252c34ef733d..a07c65ccadd7a5ff6402a17893f5fc77da5fb6e2 100644 --- a/web/src/domain/repository/poi_repository.ts +++ b/web/src/domain/repository/poi_repository.ts @@ -29,7 +29,7 @@ export interface PoiRepositoryInf { * Retrieves a PDF containing information about specified POIs. * @param idPlace - The ID of the place. * @param pointsId - An array of POI IDs. - * @returns A promise that resolves to a string representing the PDF. + * @returns A promise that resolves to a Blob containing the PDF data. */ - getPDFByPoints(idPlace: number, pointsId: number[]): Promise; + getPDFByPoints(idPlace: number, pointsId: number[]): Promise; } diff --git a/web/src/domain/useCase/usePointOfInterest.ts b/web/src/domain/useCase/usePointOfInterest.ts index 722c190ba7543be997908ef728c2643d04470e38..f3d7de229a130627df7cf973fc8a97640b8e2740 100644 --- a/web/src/domain/useCase/usePointOfInterest.ts +++ b/web/src/domain/useCase/usePointOfInterest.ts @@ -206,10 +206,10 @@ export const usePointOfInterest = ( const getPdfById = async ( idPlace: number, pointsId: number[] - ): Promise => { + ): Promise => { try { - const pdfUrl = await POIRepository.getPDFByPoints(idPlace, pointsId); - return pdfUrl; + const pdfBlob = await POIRepository.getPDFByPoints(idPlace, pointsId); + return pdfBlob; } catch (error: any) { if (axios.isAxiosError(error)) { error as AxiosError; diff --git a/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_list/admin_panel_poi_list.tsx b/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_list/admin_panel_poi_list.tsx index 086ceb60ad0f944bd7caf17f0a4866a38a24af86..37002125785729e5dd1ee73cf0cbdfaf10b16450 100644 --- a/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_list/admin_panel_poi_list.tsx +++ b/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_list/admin_panel_poi_list.tsx @@ -15,7 +15,7 @@ interface props { isWindowActive: boolean; setActualPoint: Dispatch>; setWindowVisibilityViewer: (visibility: boolean) => void; - setBinaryData: Dispatch>; + setBlobData: Dispatch>; setIsPDFViewerActive: Dispatch>; setIsWindowsActive: Dispatch>; } @@ -26,7 +26,7 @@ export const AdminPanelPoiList = ({ isWindowActive, setActualPoint, setWindowVisibilityViewer, - setBinaryData, + setBlobData, setIsPDFViewerActive, setIsWindowsActive, }: props) => { @@ -68,7 +68,7 @@ export const AdminPanelPoiList = ({ if (res !== null) { setIsPDFViewerActive(true); setIsWindowsActive(true); - setBinaryData(res); + setBlobData(res); } setIsPDFLoading(false); }; diff --git a/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_screen/admin_panel_poi_screen.tsx b/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_screen/admin_panel_poi_screen.tsx index 0b202fcfe4f47f0c93f0fdd73f495955e34b7203..820544bf3ab90dcf96e828067f13bb8e255a1ff0 100644 --- a/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_screen/admin_panel_poi_screen.tsx +++ b/web/src/presentation/admin/admin_panel_poi/admin_panel_poi_screen/admin_panel_poi_screen.tsx @@ -1,4 +1,4 @@ -import { Dispatch, SetStateAction, useState } from "react"; +import { Dispatch, SetStateAction, useEffect, useState } from "react"; import { AdminPanelPoiRegister } from "../admin_panel_poi_register/admin_panel_poi_register"; import "./assets/css/styles.css"; import { AdminPanelPoiList } from "../admin_panel_poi_list/admin_panel_poi_list"; @@ -28,7 +28,8 @@ export const AdminPanelPoiScreen = ({ const [isRegisterWindowActive, setIsRegisterWindowActive] = useState(false); // Register window visibility const [isViewerWindowActive, setIsViewerWindowActive] = useState(false); // Viewer window visibility const [isPDFViewerActive, setIsPDFViewerActive] = useState(false); // PDF viewer visibility - const [binaryData, setBinaryData] = useState(""); // Binary data for PDF + const [blobData, setBlobData] = useState(null); // Blob data for PDF + const [pdfUrl, setPdfUrl] = useState(""); // PDF URL // Function to force re-render the POI list const forceRenderList = () => { @@ -48,6 +49,18 @@ export const AdminPanelPoiScreen = ({ setIsWindowActive(visibility); }; + useEffect(() => { + if (blobData) { + const url = URL.createObjectURL(blobData); + console.log(url); + setPdfUrl(url); + + return () => { + URL.revokeObjectURL(url); + }; + } + }, [blobData]); + return (
@@ -85,7 +98,7 @@ export const AdminPanelPoiScreen = ({ setActualPoint={setActualPoint} setWindowVisibilityViewer={setWindowVisibilityViewer} isWindowActive={isWindowActive} - setBinaryData={setBinaryData} + setBlobData={setBlobData} setIsPDFViewerActive={setIsPDFViewerActive} setIsWindowsActive={setIsWindowActive} /> @@ -98,13 +111,13 @@ export const AdminPanelPoiScreen = ({ onClick={() => { setIsPDFViewerActive(false); setIsWindowActive(false); - setBinaryData(""); + setBlobData(null); }} />