The communications platform that puts data protection first.
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.
 
 
 
 
 
Rocket.Chat/client/lib/portals/createLazyElement.ts

31 lines
882 B

import { Tracker } from 'meteor/tracker';
import { ComponentType, ReactElement, PropsWithoutRef, createElement, lazy, useEffect, useState, Suspense, FC } from 'react';
export const createLazyElement = <Props extends {} = {}>(
factory: () => Promise<{ default: ComponentType<Props> }>,
getProps?: () => PropsWithoutRef<Props> | undefined,
): ReactElement => {
const LazyComponent = lazy(factory);
if (!getProps) {
return createElement(LazyComponent);
}
const WrappedComponent: FC = () => {
const [props, setProps] = useState(() => Tracker.nonreactive(getProps));
useEffect(() => {
const computation = Tracker.autorun(() => {
setProps(getProps());
});
return (): void => {
computation.stop();
};
}, []);
return createElement(Suspense, { fallback: null }, createElement(LazyComponent, props));
};
return createElement(WrappedComponent);
};