/**
 * Copyright (c) 2024 Lark Technologies Pte. Ltd.
 * 
 * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted,provided that the above copyright notice and this permission notice appear in all copies.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
export interface IPortalPayload<Context = Record<string, any>, K extends keyof Context = keyof Context> {
    type: K;
    sessionId?: string;
    payload?: Context[K];
}
export type IPortalDispatch = <DispatchContext extends IPortalPayload>(context: DispatchContext, cb?: (ret: any) => void) => Promise<void>;
export type IPortalOnMessage = <Context = Record<string, any>, K extends keyof Context = keyof Context>(type: K, cb: (payload?: Context[K]) => void) => () => void;
export interface IRect {
    height: number;
    bottom: number;
    left: number;
    right: number;
    top: number;
    width: number;
    x: number;
    y: number;
}
export interface IPortalEvent<Context = any> {
    payload: Context;
}
export interface ITargetListenerMap {
    bounding: IPortalEvent<{
        rect: IRect;
    }>;
    clickOutSide: IPortalEvent<undefined>;
    hover: IPortalEvent<{
        hovering: boolean;
    }>;
    viewportVisible: IPortalEvent<{
        visible: boolean;
    }>;
}
export interface IPortalHandler {
    destroy: () => void;
    open: <Context extends Record<string, any>>(context?: Context, option?: {
        noBounding?: boolean;
    }) => Promise<void>;
    close: () => Promise<void>;
    dispatch: IPortalDispatch;
    onMessage: IPortalOnMessage;
    addTargetListener: <K extends keyof ITargetListenerMap>(type: K, handler: (payload: ITargetListenerMap[K]) => void) => () => void;
}
