From a5bb7dafd9b7d82c17e4f8f31ac32379d95f4971 Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 2 Jun 2026 21:22:57 +0200 Subject: [PATCH] pdf generation toasts --- package.json | 1 + pnpm-lock.yaml | 15 +++++++++++++++ src/hooks/useChessGame.ts | 19 ++++++++++++++++--- src/routes/__root.tsx | 2 ++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 0daac11..b41ad62 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "react-icons": "^5.6.0", + "react-toastify": "^11.1.0", "tailwindcss": "^4.1.18", "zod": "^4.4.3" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3933f4..4f66bbd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: react-icons: specifier: ^5.6.0 version: 5.6.0(react@19.2.6) + react-toastify: + specifier: ^11.1.0 + version: 11.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) tailwindcss: specifier: ^4.1.18 version: 4.3.0 @@ -1858,6 +1861,12 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-toastify@11.1.0: + resolution: {integrity: sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==} + peerDependencies: + react: ^18 || ^19 + react-dom: ^18 || ^19 + react@19.2.6: resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} engines: {node: '>=0.10.0'} @@ -3839,6 +3848,12 @@ snapshots: react-is@17.0.2: {} + react-toastify@11.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + dependencies: + clsx: 2.1.1 + react: 19.2.6 + react-dom: 19.2.6(react@19.2.6) + react@19.2.6: {} readdirp@5.0.0: {} diff --git a/src/hooks/useChessGame.ts b/src/hooks/useChessGame.ts index 7c34c40..103240f 100644 --- a/src/hooks/useChessGame.ts +++ b/src/hooks/useChessGame.ts @@ -5,6 +5,7 @@ import { useRef, useState, } from "react"; +import { toast } from "react-toastify"; import type { IPosition } from "#/interfaces.ts"; import { gameReducer, initialGameState } from "#/reducers/gameReducer.ts"; import { downloadPDF } from "#/utils/pdfUtils.ts"; @@ -54,17 +55,29 @@ export const useChessGame = () => { if (response.ok) { downloadPDF(await response.blob()); - // TODO toast + + // TODO add metrics logger - add success to analytics + + toast.success("PDF successfully generated!", { + toastId: "pdf-success", + }); } else { - const body = await response.json(); // TODO toast and remove console but pass to logger + const body = await response.json(); console.error("Error saving PDF:", body.error); + + toast.error("An error has occurred. Please try again later.", { + toastId: "pdf-error", + }); } } catch (error: unknown) { + // TODO add metrics / logger console.error("Error saving PDF:", error); if (error instanceof Error) { - // do something here such as toast + toast.error("An error has occurred. Please try again later.", { + toastId: "pdf-error", + }); } } finally { setGeneratingPdf(false); diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index 972d8a2..6960b21 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -2,6 +2,7 @@ import { TanStackDevtools } from "@tanstack/react-devtools"; import { createRootRoute, HeadContent, Scripts } from "@tanstack/react-router"; import { TanStackRouterDevtoolsPanel } from "@tanstack/react-router-devtools"; import { type ReactNode, Suspense } from "react"; +import { ToastContainer } from "react-toastify"; import { MatomoAnalytics } from "#/components/MatomoAnalytics.tsx"; import Footer from "../components/Footer"; import Header from "../components/Header"; @@ -40,6 +41,7 @@ function RootDocument({ children }: { children: ReactNode }) {
{children} +