import { AnnotationInstance, AnnotationLayer, AnnotationProps } from './types';
export type AnnotationsState = {
    visible: boolean;
    update: {
        required: boolean;
        ref: ReturnType<typeof setTimeout> | null;
        setRef: (v: ReturnType<typeof setTimeout>) => void;
    };
    layers: Record<string, AnnotationLayer>;
    annotations: Record<string, AnnotationProps[]>;
    instances: AnnotationInstance[];
    toggleVisibility: () => void;
    clear: () => void;
    createLayer: (newLayer: AnnotationLayer) => () => void;
    updateLayer: (id: string, updatedLayer: Partial<AnnotationLayer>) => void;
    layerExist: (id: string) => boolean;
    addLayerAnnotations: (layerId: string, scope: string, annotations: AnnotationProps[]) => void;
    removeLayerAnnotations: (layerId: string, scope?: string) => void;
    setInstances: (newInstances: AnnotationInstance[]) => void;
};
/**
 * Get access to annotations global state.
 * This is used internally and should not be used by other components. Use the `useAnnotations` hook instead.
 * @internal
 *
 * @see {@link useAnnotations}
 *
 * @group Hooks
 */
export declare const useAnnotationsState: import('zustand').UseBoundStore<Omit<import('zustand').StoreApi<AnnotationsState>, "subscribe"> & {
    subscribe: {
        (listener: (selectedState: AnnotationsState, previousSelectedState: AnnotationsState) => void): () => void;
        <U>(selector: (state: AnnotationsState) => U, listener: (selectedState: U, previousSelectedState: U) => void, options?: {
            equalityFn?: ((a: U, b: U) => boolean) | undefined;
            fireImmediately?: boolean;
        } | undefined): () => void;
    };
}>;
/**
 * This hook allow you to add annotations to an exisiting `AnnotationsLayer`.
 * A scope is a user defined string, which should uniquely tie the added anotations to your component.
 * If your annotations belong to a specific wellbore, the wellbore name or id would work well as a scope.
 *
 * A single function `addAnnotations` is returned, which you can call from within a `useEffect`
 * hook to set annotations. Annotations must be an array of `AnnotationProps`.
 * The `addAnnotations` function will return a dispose function when invoked, which you should
 * call within the effect dispose function.
 *
 * @example
 * const { addAnnotations } = useAnnotations('casings', scope)
 *
 * @remarks
 * Note that annotation positions needs to be in world space. You can optionally provide a matrixWorld to
 * the annotation props that can be used to transform the local postion to world position. In the components
 * using annotations, this is done by rendering a "dummy" Object3D and passing its matrixWorld instance to the
 * annotation props.
 *
 * @example
 * useEffect(() => {
 *   let dispose: (() => void) | null = null
 *   if (generator && id) {
 *     const v = new Vector3()
 *     generator(id).then(response => {
 *       if (response && positionRef.current) {
 *         response.forEach((d, i) => {
 *           v.set(...d.position)
 *           positionRef.current.localToWorld(v)
 *           d.position = v.toArray()
 *           d.id = i.toString()
 *         })
 *         dispose = addAnnotations(response || [])
 *       }
 *     })
 *   }
 *
 *   return () => {
 *     if (dispose) dispose()
 *   }
 * }, [addAnnotations, id, generator, positionRef])
 *
 * @see {@link AnnotationsLayer}
 * @see {@link Annotations}
 *
 * @group Hooks
 */
export declare const useAnnotations: (layer: string, scope: string) => {
    addAnnotations: (annotations: AnnotationProps[]) => (() => void) | undefined;
};
