import * as _platform_modules_menus from '@platform-modules/menus';
import { MenuRow, MenuTree, MenuTarget, MenuItemRow } from '@platform-modules/menus';
export { MenuItemNode, MenuItemRow, MenuRow, MenuTarget, MenuTree } from '@platform-modules/menus';
import * as react from 'react';
import { ReactNode } from 'react';

type EntityTarget = {
    entityType: string;
    entityId: string;
    label: string;
};
interface MenuClient {
    listMenus(): Promise<MenuRow[]>;
    getMenuTree(key: string): Promise<MenuTree | null>;
    createMenu(input: {
        key: string;
        label: string;
    }): Promise<MenuRow>;
    updateMenu(menuId: string, patch: {
        label?: string;
    }): Promise<MenuRow>;
    deleteMenu(menuId: string): Promise<void>;
    addItem(menuId: string, input: {
        label: string;
        target: MenuTarget;
        parentId?: string | null;
    }): Promise<MenuItemRow>;
    updateItem(itemId: string, patch: {
        label?: string;
        target?: MenuTarget;
        openInNew?: boolean;
    }): Promise<MenuItemRow>;
    removeItem(itemId: string): Promise<void>;
    moveItem(itemId: string, input: {
        newParentId: string | null;
        newPosition: number;
    }): Promise<MenuItemRow>;
    reorder(menuId: string, parentId: string | null, orderedIds: string[]): Promise<void>;
}

declare function MenuProvider({ client, children }: {
    client: MenuClient;
    children: ReactNode;
}): react.JSX.Element;
declare function useMenuClient(): MenuClient;

declare function useMenus(opts?: {
    initialData?: MenuRow[];
}): {
    menus: MenuRow[];
    loading: boolean;
    error: Error | null;
    reload: () => void;
    createMenu: (input: {
        key: string;
        label: string;
    }) => Promise<MenuRow>;
    updateMenu: (menuId: string, patch: {
        label?: string;
    }) => Promise<MenuRow>;
    deleteMenu: (menuId: string) => Promise<void>;
};
declare function useMenuTree(key: string, opts?: {
    initialData?: MenuTree | null;
}): {
    tree: MenuTree | null;
    loading: boolean;
    error: Error | null;
    reload: () => void;
    addItem: (menuId: string, input: {
        label: string;
        target: MenuTarget;
        parentId?: string | null;
    }) => Promise<_platform_modules_menus.MenuItemRow>;
    updateItem: (itemId: string, patch: {
        label?: string;
        target?: MenuTarget;
        openInNew?: boolean;
    }) => Promise<_platform_modules_menus.MenuItemRow>;
    removeItem: (itemId: string) => Promise<void>;
    moveItem: (itemId: string, input: {
        newParentId: string | null;
        newPosition: number;
    }) => Promise<_platform_modules_menus.MenuItemRow>;
    reorder: (menuId: string, parentId: string | null, orderedIds: string[]) => Promise<void>;
};

interface MenuEditorProps {
    menuKey: string;
    availableTargets: EntityTarget[];
}
declare function MenuEditor({ menuKey, availableTargets }: MenuEditorProps): react.JSX.Element;

export { type EntityTarget, type MenuClient, MenuEditor, type MenuEditorProps, MenuProvider, useMenuClient, useMenuTree, useMenus };
