seitu
Version:
110 lines • 3.27 kB
text/typescript
import { i as Subscribable, n as Readable } from "../../index-B0IeflOl.mjs";
import { Accessor } from "solid-js";
//#region src/solid/hooks/index.d.ts
interface UseSubscriptionOptions<S extends Subscribable<any> & Readable<any>, R = S['~']['output']> {
selector?: (value: S['~']['output']) => R;
isEqual?: (prev: R, next: R) => boolean;
}
/**
* Subscribe to a reactive value. Pass a handle or a getter (reactive:
* re-subscribes when it reads a signal). Returns an `Accessor<R>` (`value()`).
*
* @example Inline subscription
* ```tsx
* import { createWebStorageValue } from 'seitu/web'
* import { useSubscription } from 'seitu/solid'
* import * as z from 'zod'
*
* function Counter() {
* const value = useSubscription(() => createWebStorageValue({
* type: 'sessionStorage',
* key: 'test',
* defaultValue: 0,
* schema: z.number(),
* }))
*
* return <div>{value()}</div>
* }
* ```
*
* @example Instance outside of component
* ```tsx
* import { createWebStorage } from 'seitu/web'
* import { useSubscription } from 'seitu/solid'
* import * as z from 'zod'
*
* const sessionStorage = createWebStorage({
* type: 'sessionStorage',
* schemas: { count: z.number(), name: z.string() },
* defaultValues: { count: 0, name: '' },
* })
*
* function Counter() {
* const value = useSubscription(sessionStorage)
* return <div>{value().count}</div>
* }
* ```
*
* @example Subscription with selector
* ```tsx
* import { createWebStorage } from 'seitu/web'
* import { useSubscription } from 'seitu/solid'
* import * as z from 'zod'
*
* const sessionStorage = createWebStorage({
* type: 'sessionStorage',
* schemas: {
* count: z.number(),
* name: z.string(),
* },
* defaultValues: { count: 0, name: '' },
* })
*
* function Counter() {
* // Accessor updates only when count changes
* const count = useSubscription(sessionStorage, { selector: value => value.count })
*
* return <div>{count()}</div>
* }
* ```
*
* @example Reactive source (re-subscribes when a signal changes)
* ```tsx
* import { createSignal } from 'solid-js'
* import { createWebStorageValue } from 'seitu/web'
* import { useSubscription } from 'seitu/solid'
* import * as z from 'zod'
*
* function User() {
* const [userId, setUserId] = createSignal('user-1')
* const data = useSubscription(() => createWebStorageValue({
* type: 'localStorage',
* key: `user:${userId()}`,
* schema: z.object({ name: z.string() }),
* defaultValue: { name: '' },
* }))
*
* return <div>{data().name}</div>
* }
* ```
*
* @example Ref example
* ```tsx
* import { createScrollState } from 'seitu/web'
* import { useSubscription } from 'seitu/solid'
*
* function Page() {
* let ref: HTMLDivElement | undefined
* const state = useSubscription(() => createScrollState({ element: () => ref, direction: 'vertical' }))
*
* return (
* <div ref={ref}>
* {String(state().top.reached)}
* </div>
* )
* }
* ```
*/
declare function useSubscription<S extends Subscribable<any> & Readable<any>, R = S['~']['output']>(source: S | Accessor<S>, options?: UseSubscriptionOptions<S, R>): Accessor<R>;
//#endregion
export { UseSubscriptionOptions, useSubscription };