All files / react-classic/src fetch.ts

100% Statements 40/40
100% Branches 6/6
100% Functions 2/2
100% Lines 40/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 1341x                     1x 1x 1x                                                                                 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x   4x 4x 4x 4x 4x   4x 4x                                                                               1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x   4x 4x 4x 4x 4x   4x 4x  
import {
  type FetchOptions,
  fetchState,
  type FetchState,
  type GetMethods,
  type LinkableSchema,
  type PutMethods,
  type ReqMethods,
  type StreamOptions,
  streamState,
} from '@anchorlib/core';
import { useEffect } from 'react';
import { useMicrotask } from './hooks.js';
import { useVariable } from './ref.js';
import type { AnchorState } from './types.js';
 
/**
 * Fetch hook for GET or DELETE requests.
 *
 * @template R - The type of the initial data
 * @template S - The schema type for linkable data
 * @param init - Initial data or fetch configuration
 * @param options - Fetch options with method restricted to GET or DELETE
 * @returns Anchor state containing the fetch result
 */
export function useFetch<R, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: FetchOptions<S> & { method: GetMethods }
): AnchorState<FetchState<R>>;
 
/**
 * Fetch hook for POST, PUT, or PATCH requests.
 *
 * @template R - The type of the initial data
 * @template P - The type of the request body
 * @template S - The schema type for linkable data
 * @param init - Initial data or fetch configuration
 * @param options - Fetch options with method restricted to POST, PUT, or PATCH and requiring a body
 * @returns Anchor state containing the fetch result
 */
export function useFetch<R, P, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: FetchOptions<S> & { method: PutMethods; body: P }
): AnchorState<FetchState<R>>;
 
/**
 * General fetch hook for any HTTP method.
 *
 * @template R - The type of the initial data
 * @template S - The schema type for linkable data
 * @param init - Initial data or fetch configuration
 * @param options - Fetch options
 * @returns Anchor state containing the fetch result
 */
export function useFetch<R, P, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: FetchOptions<S> & { method: ReqMethods; body?: P }
): AnchorState<FetchState<R>> {
  const [schedule] = useMicrotask(0);
  const [state, setState] = useVariable<FetchState<R>>(
    (newInit) => {
      return fetchState((newInit ?? init) as R, { ...options, deferred: true }) as FetchState<R>;
    },
    [init, options]
  );
 
  useEffect(() => {
    if (!options.deferred) {
      schedule(state.value.fetch);
    }
  }, [state]);
 
  return [state.value, state, setState];
}
 
/**
 * Stream hook for GET or DELETE requests.
 *
 * @template R - The type of the initial data
 * @template S - The schema type for linkable data
 * @param init - Initial data or stream configuration
 * @param options - Stream options with method restricted to GET or DELETE
 * @returns Anchor state containing the stream result
 */
export function useStream<R, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: StreamOptions<R, S> & { method: GetMethods }
): AnchorState<FetchState<R>>;
 
/**
 * Stream hook for POST, PUT, or PATCH requests.
 *
 * @template R - The type of the initial data
 * @template P - The type of the request body
 * @template S - The schema type for linkable data
 * @param init - Initial data or stream configuration
 * @param options - Stream options with method restricted to POST, PUT, or PATCH and requiring a body
 * @returns Anchor state containing the stream result
 */
export function useStream<R, P, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: StreamOptions<R, S> & { method: PutMethods; body: P }
): AnchorState<FetchState<R>>;
 
/**
 * General stream hook for any HTTP method.
 *
 * @template R - The type of the initial data
 * @template S - The schema type for linkable data
 * @param init - Initial data or stream configuration
 * @param options - Stream options
 * @returns Anchor state containing the stream result
 */
export function useStream<R, P, S extends LinkableSchema = LinkableSchema>(
  init: R,
  options: StreamOptions<R, S> & { method: ReqMethods; body?: P }
): AnchorState<FetchState<R>> {
  const [schedule] = useMicrotask(0);
  const [state, setState] = useVariable<FetchState<R>>(
    (newInit) => {
      return streamState((newInit ?? init) as R, { ...options, deferred: true }) as FetchState<R>;
    },
    [init, options]
  );
 
  useEffect(() => {
    if (!options.deferred) {
      schedule(state.value.fetch);
    }
  }, [state]);
 
  return [state.value, state, setState];
}