@oxyhq/services
Version:
95 lines (93 loc) • 2.62 kB
JavaScript
;
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