Files
ERitors-Scribe-Desktop/lib/utils/db-error-handler.ts
natreex ee4438834c Migrate from window.electron to tauri IPC functions across components
- Replaced `window.electron.invoke` calls with equivalent `tauri` function calls for all IPC interactions.
- Removed `electron.d.ts` TypeScript definitions as they are no longer needed.
- Updated related logic for offline/online state synchronization.
- Added `types.rs` and `shared/mod.rs` modules to support Tauri IPC integration with Rust enums and shared logic.
- Refactored IPC request queues to use updated handler names for consistency with Tauri.
2026-03-21 09:34:13 -04:00

107 lines
2.8 KiB
TypeScript

/**
* Database Error Handler for Frontend
* Handles errors from Tauri invoke calls
*/
export interface SerializedError {
name: string;
message: string;
messageFr: string;
messageEn: string;
statusCode: number;
stack?: string;
}
/**
* Check if error is a serialized database error
*/
export function isDbError(error: unknown): error is SerializedError {
return (
typeof error === 'object' &&
error !== null &&
'name' in error &&
'messageFr' in error &&
'messageEn' in error &&
'statusCode' in error
);
}
/**
* Get error message based on current language
*/
export function getErrorMessage(error: SerializedError, lang: 'fr' | 'en' = 'fr'): string {
return lang === 'fr' ? error.messageFr : error.messageEn;
}
/**
* Handle database operation with error catching
* Use this to wrap all IPC calls
*/
export async function handleDbOperation<T>(
operation: () => Promise<T>,
onError?: (error: SerializedError) => void,
lang: 'fr' | 'en' = 'fr'
): Promise<T> {
try {
return await operation();
} catch (error: unknown) {
if (isDbError(error)) {
const errorMessage = getErrorMessage(error, lang);
console.error(`[DB Error ${error.statusCode}]: ${errorMessage}`);
if (onError) {
onError(error);
} else {
// Default: throw with localized message
throw new Error(errorMessage);
}
}
// Not a database error, rethrow as-is
throw error;
}
}
/**
* React Hook for database operations
* Example usage in a React component:
*
* const { data, error, loading, execute } = useDbOperation();
*
* const loadBooks = async () => {
* await execute(() => tauri.getBooks());
* };
*/
export function useDbOperation<T>() {
const [data, setData] = React.useState<T | null>(null);
const [error, setError] = React.useState<SerializedError | null>(null);
const [loading, setLoading] = React.useState<boolean>(false);
const execute = async (
operation: () => Promise<T>,
lang: 'fr' | 'en' = 'fr'
): Promise<T | null> => {
setLoading(true);
setError(null);
try {
const result = await handleDbOperation(
operation,
(err) => setError(err),
lang
);
setData(result);
setLoading(false);
return result;
} catch (err) {
setLoading(false);
return null;
}
};
return { data, error, loading, execute };
}
// For non-React usage
import React from 'react';