"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = _default; function _react() { const data = _interopRequireDefault(require("react")); _react = function _react() { return data; }; return data; } function _path() { const data = require("path"); _path = function _path() { return data; }; return data; } function _umi() { const data = require("umi"); _umi = function _umi() { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const winPath = _umi().utils.winPath; function _default() { return `import { useState, useEffect, useContext, useRef } from 'react'; // @ts-ignore import isEqual from '${winPath(require.resolve('fast-deep-equal'))}'; // @ts-ignore import { UmiContext } from '${winPath((0, _path().join)(__dirname, '..', 'helpers', 'constant'))}'; import { Model, models } from './Provider'; export type Models = Model[T] export function useModel>(model: T): Model[T] export function useModel, U>(model: T, selector: (model: Model[T]) => U): U export function useModel, U>( namespace: T, updater?: (model: Model[T]) => U ) : typeof updater extends undefined ? Model[T] : ReturnType>{ type RetState = typeof updater extends undefined ? Model[T] : ReturnType> const dispatcher = useContext(UmiContext); const updaterRef = useRef(updater); updaterRef.current = updater; const [state, setState] = useState( () => updaterRef.current ? updaterRef.current(dispatcher.data![namespace]) : dispatcher.data![namespace] ); const stateRef = useRef(state); stateRef.current = state; useEffect(() => { const handler = (e: any) => { if(updater && updaterRef.current){ const currentState = updaterRef.current(e); const previousState = stateRef.current if(!isEqual(currentState, previousState)){ setState(currentState); } } else { setState(e); } } try { dispatcher.callbacks![namespace]!.add(handler); } catch (e) { dispatcher.callbacks![namespace] = new Set(); dispatcher.callbacks![namespace]!.add(handler); } return () => { dispatcher.callbacks![namespace]!.delete(handler); } }, [namespace]); return state; }; `; }