Files
goodgo-platform/apps/web/components/providers/query-provider.tsx
Ho Ngoc Hai bd33c92977 fix: resolve lint error and typecheck failures for MVP launch readiness
- Remove unused `registerUser` import in e2e/api/inquiries.spec.ts
- Add `override` modifier to class methods in query-provider.tsx

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-10 19:01:45 +07:00

79 lines
2.2 KiB
TypeScript

'use client';
import { QueryClientProvider, QueryErrorResetBoundary } from '@tanstack/react-query';
import { useTranslations } from 'next-intl';
import { Component, type ErrorInfo, type ReactNode } from 'react';
import { getQueryClient } from '@/lib/query-client';
interface FallbackProps {
error: Error;
reset: () => void;
}
function QueryErrorFallback({ error, reset }: FallbackProps) {
const t = useTranslations();
return (
<div className="flex min-h-[200px] flex-col items-center justify-center px-4" role="alert">
<p className="text-sm text-destructive">{t('error.description')}</p>
{error.message && (
<p className="mt-1 text-xs text-muted-foreground">{error.message}</p>
)}
<button
onClick={reset}
className="mt-3 inline-flex h-8 items-center rounded-md bg-primary px-4 text-xs font-medium text-primary-foreground hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
>
{t('common.retry')}
</button>
</div>
);
}
interface ErrorBoundaryState {
error: Error | null;
}
class QueryErrorBoundaryInner extends Component<
{ children: ReactNode; onReset: () => void },
ErrorBoundaryState
> {
override state: ErrorBoundaryState = { error: null };
static getDerivedStateFromError(error: Error) {
return { error };
}
override componentDidCatch(error: Error, info: ErrorInfo) {
if (process.env.NODE_ENV !== 'production') {
console.error('Query error boundary caught:', error, info);
}
}
reset = () => {
this.props.onReset();
this.setState({ error: null });
};
override render() {
if (this.state.error) {
return <QueryErrorFallback error={this.state.error} reset={this.reset} />;
}
return this.props.children;
}
}
export function QueryProvider({ children }: { children: React.ReactNode }) {
const queryClient = getQueryClient();
return (
<QueryClientProvider client={queryClient}>
<QueryErrorResetBoundary>
{({ reset }) => (
<QueryErrorBoundaryInner onReset={reset}>
{children}
</QueryErrorBoundaryInner>
)}
</QueryErrorResetBoundary>
</QueryClientProvider>
);
}