mirror of
https://github.com/dergigi/boris.git
synced 2025-12-17 22:54:30 +01:00
- Add project structure with TypeScript, React, and Vite - Implement nostr authentication using browser extension (NIP-07) - Add NIP-51 compliant bookmark fetching and display - Create minimal UI with login and bookmark components - Integrate applesauce-core and applesauce-react libraries - Add responsive styling with dark/light mode support - Include comprehensive README with setup instructions This is a minimal MVP for a nostr bookmark client that allows users to view their bookmarks according to NIP-51 specification.
38 lines
1.0 KiB
JavaScript
38 lines
1.0 KiB
JavaScript
import { useCallback, useRef, useState } from "react";
|
|
import { finalize } from "rxjs";
|
|
import { useActionHub } from "./use-action-hub.js";
|
|
export function useAction(Action, args) {
|
|
const [loading, setLoading] = useState(false);
|
|
const ref = useRef(args);
|
|
ref.current = args;
|
|
const hub = useActionHub();
|
|
const run = useCallback(async () => {
|
|
if (args === undefined)
|
|
return;
|
|
setLoading(true);
|
|
try {
|
|
await hub.run(Action, ...args);
|
|
setLoading(false);
|
|
}
|
|
catch (error) {
|
|
setLoading(false);
|
|
throw error;
|
|
}
|
|
}, [Action]);
|
|
const exec = useCallback(() => {
|
|
if (args === undefined)
|
|
return;
|
|
setLoading(true);
|
|
try {
|
|
return hub.exec(Action, ...args).pipe(finalize(() => {
|
|
setLoading(false);
|
|
}));
|
|
}
|
|
catch (error) {
|
|
setLoading(false);
|
|
throw error;
|
|
}
|
|
}, [Action]);
|
|
return { loading, run, exec };
|
|
}
|