mirror of
https://github.com/dergigi/boris.git
synced 2026-01-03 06:54:53 +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.
34 lines
1.0 KiB
TypeScript
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;
|
|
}
|