"use client" // import gdi from "@/bootstrap/di/init-di"; /* eslint-disable react/display-name */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react/jsx-props-no-spreading */ import IBaseVM from "@/bootstrap/helpers/vm/i-base-vm"; import { Component, ReactNode, FC, PropsWithChildren, memo } from "react"; /* -------------------------------------------------------------------------- */ /* Connector Component */ /* -------------------------------------------------------------------------- */ interface IVvmConnector extends PropsWithChildren { View: FC; Vm: IBaseVM; restProps?: PROPS; memoizedByVM?: boolean; } /** * This function is just will be used in */ const VvmConnector = memo( (props: IVvmConnector) => { const { View, Vm, restProps, children } = props; const vm = Vm.useVM() const allProps = { restProps, vm, }; return {children}; }, (prevProps) => { if (prevProps.memoizedByVM) return true; return false; }, ); /* -------------------------------------------------------------------------- */ /* BaseView */ /* -------------------------------------------------------------------------- */ type IVMParent = Record; type IPropParent = Record | undefined; type BaseProps = { vm: IBaseVM; restProps?: PROPS; /** * By default it's true. * If you pass true this view will update just by changes of vm not rest props * */ memoizedByVM?: boolean; children?: ReactNode; }; export type BuildProps< IVM extends IVMParent, PROPS extends IPropParent = undefined, > = { vm: IVM; restProps: PROPS; children?: ReactNode; }; export default abstract class BaseView< IVM extends IVMParent, PROPS extends IPropParent = undefined, > extends Component> { protected abstract Build(props: BuildProps): ReactNode; protected get componentName() { return this.constructor.name } render(): ReactNode { const { vm, restProps, memoizedByVM, children, ...rest } = this.props; VvmConnector.displayName = this.componentName return ( {children} ); } /* -------------------------------------------------------------------------- */ }