From 109377f08367a5817f706c5e878fd9fa3846a08d Mon Sep 17 00:00:00 2001 From: ryan Date: Fri, 27 Jun 2025 14:44:09 +0300 Subject: [PATCH] feat(UrlPage): add encoded url pages --- prisma/dev.db | Bin 0 -> 69632 bytes src/app/[encodedUrl]/page.tsx | 132 ++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 src/app/[encodedUrl]/page.tsx diff --git a/prisma/dev.db b/prisma/dev.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e374783190dd3c32b08ce3df422d31eb13d1b96f 100644 GIT binary patch literal 69632 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 +
+
+ Loading items... +
+ + ); +} + +// Error boundary component +function ErrorFallback({ error, resetError }: { error: Error; resetError: () => void }) { + return ( +
+
+

+ Something went wrong +

+

+ {error.message || 'An unexpected error occurred while loading the items.'} +

+
+ + +
+
+
+ ); +} + +// Simple error boundary implementation +class ErrorBoundary extends React.Component< + { children: React.ReactNode; fallback: (error: Error, resetError: () => void) => React.ReactNode }, + { hasError: boolean; error?: Error } +> { + constructor(props: { children: React.ReactNode; fallback: (error: Error, resetError: () => void) => React.ReactNode }) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(error: Error) { + return { hasError: true, error }; + } + + componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { + console.error('Error caught by boundary:', error, errorInfo); + } + + render() { + if (this.state.hasError && this.state.error) { + return this.props.fallback(this.state.error, () => { + this.setState({ hasError: false, error: undefined }); + }); + } + + return this.props.children; + } +} + +export default function UrlPage() { + const params = useParams(); + const encodedUrlParam = params.encodedUrl || ''; + + // Handle both string and string[] cases + const encodedUrl = Array.isArray(encodedUrlParam) ? encodedUrlParam[0] : encodedUrlParam; + const decodedUrl = decodeURIComponent(encodedUrl); + + return ( +
+ {/* Header */} +
+
+
+
+

+ CompareWare +

+
+
+
+ Item Comparison Tool +
+
+
+
+
+ + {/* Main content */} +
+
+

+ {`Items Comparison for "${decodedUrl}"`} +

+
+ + {/* Items list with error boundary and suspense */} + }> + }> + + + +
+ + {/* Footer */} + +
+ ); +}