Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
No EOL
1.8 KiB
Text
58 lines
No EOL
1.8 KiB
Text
'use client';
|
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
import { Component, createRef } from 'react';
|
|
function getDomNodeAttributes(node) {
|
|
const result = {};
|
|
for(let i = 0; i < node.attributes.length; i++){
|
|
const attr = node.attributes[i];
|
|
result[attr.name] = attr.value;
|
|
}
|
|
return result;
|
|
}
|
|
export class GracefulDegradeBoundary extends Component {
|
|
constructor(props){
|
|
super(props);
|
|
this.state = {
|
|
hasError: false
|
|
};
|
|
this.rootHtml = '';
|
|
this.htmlAttributes = {};
|
|
this.htmlRef = /*#__PURE__*/ createRef();
|
|
}
|
|
static getDerivedStateFromError(_) {
|
|
return {
|
|
hasError: true
|
|
};
|
|
}
|
|
componentDidMount() {
|
|
const htmlNode = this.htmlRef.current;
|
|
if (this.state.hasError && htmlNode) {
|
|
// Reapply the cached HTML attributes to the root element
|
|
Object.entries(this.htmlAttributes).forEach(([key, value])=>{
|
|
htmlNode.setAttribute(key, value);
|
|
});
|
|
}
|
|
}
|
|
render() {
|
|
const { hasError } = this.state;
|
|
// Cache the root HTML content on the first render
|
|
if (typeof window !== 'undefined' && !this.rootHtml) {
|
|
this.rootHtml = document.documentElement.innerHTML;
|
|
this.htmlAttributes = getDomNodeAttributes(document.documentElement);
|
|
}
|
|
if (hasError) {
|
|
// Render the current HTML content without hydration
|
|
return /*#__PURE__*/ _jsx("html", {
|
|
ref: this.htmlRef,
|
|
suppressHydrationWarning: true,
|
|
dangerouslySetInnerHTML: {
|
|
__html: this.rootHtml
|
|
}
|
|
});
|
|
}
|
|
return this.props.children;
|
|
}
|
|
}
|
|
export default GracefulDegradeBoundary;
|
|
|
|
//# sourceMappingURL=graceful-degrade-boundary.js.map |