UNPKG

@oxyhq/services

Version:

OxyHQ Expo/React Native SDK — UI components, screens, and native features

95 lines (93 loc) 2.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.executeWithToast = executeWithToast; exports.useAsyncAction = useAsyncAction; var _react = require("react"); var _sonner = require("../../lib/sonner"); /** * Hook for handling async actions with loading state, error handling, and toast notifications. * Reduces boilerplate for common patterns like try-catch with toast feedback. * * @example * const { execute, isLoading } = useAsyncAction({ * action: () => api.saveSettings(settings), * successMessage: 'Settings saved!', * errorMessage: 'Failed to save settings', * }); * * <Button onPress={execute} disabled={isLoading}>Save</Button> */ function useAsyncAction(options) { const [isLoading, setIsLoading] = (0, _react.useState)(false); const [error, setError] = (0, _react.useState)(null); const execute = (0, _react.useCallback)(async () => { const { action, successMessage, errorMessage, onSuccess, onError, showLoadingToast, loadingMessage } = options; setIsLoading(true); setError(null); if (showLoadingToast && loadingMessage) { _sonner.toast.loading(loadingMessage); } try { const result = await action(); if (successMessage) { _sonner.toast.success(successMessage); } onSuccess?.(result); return result; } catch (err) { const message = typeof errorMessage === 'function' ? errorMessage(err) : errorMessage || err?.message || 'An error occurred'; _sonner.toast.error(message); setError(err instanceof Error ? err : new Error(message)); onError?.(err); return undefined; } finally { setIsLoading(false); } }, [options]); const resetError = (0, _react.useCallback)(() => { setError(null); }, []); return { execute, isLoading, error, resetError }; } /** * Simplified version that just executes an async action with toast feedback. * Useful for one-off actions. */ async function executeWithToast(action, options) { const { successMessage, errorMessage, loadingMessage } = options || {}; if (loadingMessage) { _sonner.toast.loading(loadingMessage); } try { const result = await action(); if (successMessage) { _sonner.toast.success(successMessage); } return result; } catch (err) { _sonner.toast.error(errorMessage || err?.message || 'An error occurred'); return undefined; } } var _default = exports.default = useAsyncAction; //# sourceMappingURL=useAsyncAction.js.map