Files
boris/node_modules/observable-hooks/src/use-observable-suspense.ts
Gigi 5d53a827e0 feat: initialize markr nostr bookmark client
- 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.
2025-10-02 07:17:07 +02:00

34 lines
1.0 KiB
TypeScript

import { useDebugValue, useState } from "react";
import { useSubscription } from "./use-subscription";
import { useForceUpdate } from "./helpers";
import { ObservableResource } from "./observable-resource";
/**
* Consume the Observable resource.
*
* Unlike Promise, Observable is a multiple push mechanism.
* This hook triggers extra re-rendering when Suspense should restart.
*
* @param resource Observable resource
*/
export function useObservableSuspense<TInput, TOutput extends TInput = TInput>(
resource: ObservableResource<TInput, TOutput>
): TOutput {
const resourceValue = resource.read();
const forceUpdate = useForceUpdate();
const [state, setState] = useState<TOutput>(resourceValue);
useSubscription(resource.valueRef$$, valueRef => {
/* Guard code. Value should always be ready when reaching this far. */
/* istanbul ignore else */
if (valueRef) {
setState(valueRef.current);
}
});
useSubscription(resource.shouldUpdate$$, forceUpdate);
useDebugValue(state);
return state;
}