amis2/src/env.tsx

112 lines
3.1 KiB
TypeScript
Raw Normal View History

/**
* @file Env ajax
*/
import React from 'react';
import {RendererConfig} from './factory';
import {ThemeInstance} from './theme';
import {Action, Api, Payload, Schema} from './types';
import hoistNonReactStatic from 'hoist-non-react-statics';
export interface RendererEnv {
fetcher: (api: Api, data?: any, options?: object) => Promise<Payload>;
isCancel: (val: any) => boolean;
notify: (
type: 'error' | 'success' | 'warning',
msg: string,
conf?: {
closeButton?: boolean;
timeout?: number;
}
) => void;
jumpTo: (to: string, action?: Action, ctx?: object) => void;
alert: (msg: string) => void;
confirm: (msg: string, title?: string) => Promise<boolean>;
updateLocation: (location: any, replace?: boolean) => void;
/**
* form
*
*
*
*/
blockRouting?: (fn: (targetLocation: any) => void | string) => () => void;
isCurrentUrl: (link: string, ctx?: any) => boolean | {params?: object};
/**
* jssdk
*/
watchRouteChange?: (fn: () => void) => () => void;
rendererResolver?: (
path: string,
schema: Schema,
props: any
) => null | RendererConfig;
copy?: (contents: string) => void;
getModalContainer?: () => HTMLElement;
theme: ThemeInstance;
affixOffsetTop: number;
affixOffsetBottom: number;
richTextToken: string;
loadRenderer: (
schema: Schema,
path: string,
reRender: Function
) => Promise<React.ReactType> | React.ReactType | JSX.Element | void;
loadChartExtends?: () => void | Promise<void>;
[propName: string]: any;
}
export const EnvContext = React.createContext<RendererEnv | void>(undefined);
export interface EnvProps {
env: RendererEnv;
}
export function withRendererEnv<
T extends React.ComponentType<React.ComponentProps<T> & EnvProps>
>(ComposedComponent: T) {
type OuterProps = JSX.LibraryManagedAttributes<
T,
Omit<React.ComponentProps<T>, keyof EnvProps>
> & {
env?: RendererEnv;
};
const result = hoistNonReactStatic(
class extends React.Component<OuterProps> {
static displayName = `WithEnv(${
ComposedComponent.displayName || ComposedComponent.name
})`;
static contextType = EnvContext;
static ComposedComponent = ComposedComponent;
render() {
const injectedProps: {
env: RendererEnv;
} = {
env: this.props.env || this.context
};
if (!injectedProps.env) {
throw new Error('Env 信息获取失败,组件用法不正确');
}
return (
<ComposedComponent
{...(this.props as JSX.LibraryManagedAttributes<
T,
React.ComponentProps<T>
>)}
{...injectedProps}
/>
);
}
},
ComposedComponent
);
return result as typeof result & {
ComposedComponent: T;
};
}