import { IUiConfigContainer, UiConfigContainer } from 'uiconfig.js';
import { Class, IDisposable, IJSONSerializable } from 'ts-browser-helpers';
import { SerializationMetaType } from '../utils';
import { ISerializedConfig, ThreeViewer } from './ThreeViewer';
/**
 * Interface for Viewer Plugins
 * @category Viewer
 */
export interface IViewerPlugin<TViewer extends ThreeViewer = ThreeViewer, IsSync extends boolean = boolean> extends IUiConfigContainer, Partial<IJSONSerializable<ISerializedConfig, SerializationMetaType>>, IDisposable, Partial<UiConfigContainer> {
    constructor: {
        PluginType: string;
        PluginTags?: string[];
        OldPluginType?: string;
    };
    dependencies?: Class<IViewerPlugin<TViewer, IsSync>>[];
    onAdded(viewer: TViewer): IsSync extends false ? Promise<void> : void;
    onRemove(viewer: TViewer): IsSync extends false ? Promise<void> : void;
    dirty?: boolean;
    serializeWithViewer?: boolean | undefined;
    storeState?: (prefix?: string, storage?: Storage, data?: any) => void;
    loadState?: (prefix?: string, storage?: Storage) => Promise<void>;
}
export interface IViewerPluginSync<TViewer extends ThreeViewer = ThreeViewer> extends IViewerPlugin<TViewer, true> {
    onAdded(viewer: TViewer): void;
    onRemove(viewer: TViewer): void;
    dependencies?: Class<IViewerPluginSync>[];
}
export interface IViewerPluginAsync<TViewer extends ThreeViewer = ThreeViewer> extends IViewerPlugin<TViewer, false> {
    onAdded(viewer: TViewer): Promise<void>;
    onRemove(viewer: TViewer): Promise<void>;
    dependencies?: Class<IViewerPlugin>[];
}
//# sourceMappingURL=../src/viewer/IViewerPlugin.d.ts.map