All files / react-tao/src Provider.js

100% Statements 4/4
100% Branches 0/0
100% Functions 1/1
100% Lines 4/4

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                                                11x                           65x 65x                   11x        
import React from 'react';
import TAO, { Kernel } from '@tao.js/core';
 
import { DataLayerContext } from './DataLayerContext';
 
/**
 * Value provided by {@link TaoProvider}: the Kernel for this tree.
 * @typedef {Object} ProviderContextValue
 * @property {Kernel} TAO - the Kernel descendants signal and subscribe on
 */
 
/**
 * Props for {@link TaoProvider}.
 * @typedef {Object} TaoProviderProps
 * @property {Kernel} TAO - the Kernel instance this React tree uses
 * @property {import('react').ReactNode} [children]
 */
 
/**
 * Root TAO context. Named data lives on the tree-scoped
 * {@link DataLayerContext} stack maintained by `DataHandler` and read with
 * `useTaoData(name)`.
 * @type {import('react').Context<ProviderContextValue>}
 */
const Context = React.createContext({
  TAO,
});
 
export { Context };
 
/**
 * Makes a Kernel available to all @tao.js/react components and hooks in the
 * tree (and resets the tree-scoped DataHandler layer stack).
 * @param {TaoProviderProps} props
 * @returns {import('react').ReactElement}
 */
function TaoProvider({ TAO: kernel, children }) {
  // Root layer stack must be empty so useTaoData() is undefined until a DataHandler pushes.
  const emptyLayers = [];
  return (
    <Context.Provider value={{ TAO: kernel }}>
      <DataLayerContext.Provider value={emptyLayers}>
        {children}
      </DataLayerContext.Provider>
    </Context.Provider>
  );
}
 
// Stryker disable next-line StringLiteral: displayName is DX-only
TaoProvider.displayName = 'TaoProvider';
 
export { TaoProvider };
export default TaoProvider;