You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.5 KiB
96 lines
2.5 KiB
"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<T extends keyof typeof models> = Model<T>[T]
|
|
|
|
export function useModel<T extends keyof Model<T>>(model: T): Model<T>[T]
|
|
export function useModel<T extends keyof Model<T>, U>(model: T, selector: (model: Model<T>[T]) => U): U
|
|
|
|
export function useModel<T extends keyof Model<T>, U>(
|
|
namespace: T,
|
|
updater?: (model: Model<T>[T]) => U
|
|
) : typeof updater extends undefined ? Model<T>[T] : ReturnType<NonNullable<typeof updater>>{
|
|
|
|
type RetState = typeof updater extends undefined ? Model<T>[T] : ReturnType<NonNullable<typeof updater>>
|
|
const dispatcher = useContext<any>(UmiContext);
|
|
const updaterRef = useRef(updater);
|
|
updaterRef.current = updater;
|
|
const [state, setState] = useState<RetState>(
|
|
() => updaterRef.current ? updaterRef.current(dispatcher.data![namespace]) : dispatcher.data![namespace]
|
|
);
|
|
const stateRef = useRef<any>(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;
|
|
};
|
|
`;
|
|
} |