UNPKG

piral-menu

Version:

Plugin for the integration of menu items in Piral.

182 lines (162 loc) 4.12 kB
import type { ComponentType, ReactNode } from 'react'; import type { WrappedComponent, Dict, BaseComponentProps, AnyComponent, BaseRegistration, RegistrationDisposer, UnionOf, } from 'piral-core'; declare module 'piral-core/lib/types/custom' { interface PiletCustomApi extends PiletMenuApi {} interface PiralCustomState {} interface PiralCustomActions { /** * Registers a new menu item. * @param name The name of the menu item. * @param value The menu registration. */ registerMenuItem(name: string, value: MenuItemRegistration): void; /** * Unregisters an existing menu item. * @param name The name of the menu item to be removed. */ unregisterMenuItem(name: string): void; } interface PiralCustomRegistryState { /** * The registered menu items for global display. */ menuItems: Dict<MenuItemRegistration>; } interface PiralCustomErrors { menu: MenuItemErrorInfoProps; } interface PiralCustomComponentsState { /** * The menu container component. */ MenuContainer: ComponentType<MenuContainerProps>; /** * The menu item component. */ MenuItem: ComponentType<MenuItemProps>; } } export interface MenuProps { /** * The type of the menu. */ type: MenuType; } export interface MenuContainerProps { /** * The type of the menu. */ type: MenuType; /** * The menu items to display. */ children?: ReactNode; } export interface MenuItemProps { /** * The type of the menu. */ type: MenuType; /** * The provided menu settings. */ meta: MenuSettings; /** * The content of the menu item. */ children?: ReactNode; } /** * The error used when a registered menu item component crashed. */ export interface MenuItemErrorInfoProps { /** * The type of the error. */ type: 'menu'; /** * The provided error details. */ error: any; /** * The type of the used menu. */ menu: MenuType; /** * The name of the pilet emitting the error. */ pilet?: string; } export interface MenuComponentProps extends BaseComponentProps {} export interface PiralCustomMenuSettings {} export interface PiralCustomMenuTypes {} export type MenuSettings = PiralCustomMenuSettings & PiralSpecificMenuSettings; export interface PiralMenuType extends PiralCustomMenuTypes { /** * The general type. No extra options. */ general: {}; /** * The admin type. No extra options. */ admin: {}; /** * The user type. No extra options. */ user: {}; /** * The header type. No extra options. */ header: {}; /** * The footer type. No extra options. */ footer: {}; } export type PiralSpecificMenuSettings = UnionOf<{ [P in keyof PiralMenuType]: Partial<PiralMenuType[P]> & { /** * The type of the menu used. */ type?: P; }; }>; export type MenuType = PiralSpecificMenuSettings['type']; export interface MenuItemRegistration extends BaseRegistration { component: WrappedComponent<MenuComponentProps>; settings: MenuSettings; } export interface PiletMenuApi { /** * Registers a menu item for a predefined menu component. * The name has to be unique within the current pilet. * @param name The name of the menu item. * @param Component The component to be rendered within the menu. * @param settings The optional configuration for the menu item. */ registerMenu( name: string, Component: AnyComponent<MenuComponentProps>, settings?: MenuSettings, ): RegistrationDisposer; /** * Registers a menu item for a predefined menu component. * @param Component The component to be rendered within the menu. * @param settings The optional configuration for the menu item. */ registerMenu(Component: AnyComponent<MenuComponentProps>, settings?: MenuSettings): RegistrationDisposer; /** * Unregisters a menu item known by the given name. * Only previously registered menu items can be unregistered. * @param name The name of the menu item to unregister. */ unregisterMenu(name: string): void; }