import { AnyBlobLink, AnyRecord, CleanRecordType, EntityRecord, Handler, IO, LiveQuery, Query, RecordKey, StandingDecision, StandingRecord, SubscriptionRecord, VersionHash } from "@baqhub/sdk";
import { FC, PropsWithChildren, ReactNode } from "react";
import { StoreIdentity } from "./storeIdentity.js";
import { UseRecordQueryOptions, UseRecordsQueryOptions, UseStaticRecordQueryOptions, UseStaticRecordsQueryOptions } from "./storeQuery.js";
export interface StoreEntityProviderProps extends PropsWithChildren {
    entity: string;
}
export interface StoreProps extends PropsWithChildren {
    identity?: StoreIdentity;
    onDisconnectRequest?: Handler;
}
export declare function createStore<R extends CleanRecordType<AnyRecord>[]>(...types: R): {
    RKnownRecord: IO.UnionC<[IO.UnionC<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R]>, CleanRecordType<StandingRecord>, CleanRecordType<SubscriptionRecord>]>;
    ProxyStore: FC<StoreEntityProviderProps>;
    Store: FC<StoreProps>;
    wrapInProxyStore: (entity: string) => (children: ReactNode) => import("react/jsx-runtime").JSX.Element;
    useRecordsQuery: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(requestedQuery: LiveQuery<Q>, options?: UseRecordsQueryOptions) => {
        isLoading: boolean;
        error: unknown;
        isLoadingMore: boolean;
        loadMoreError: unknown;
        loadMore: (() => void) | undefined;
        records: readonly Q[];
        deferredRecords: readonly Q[];
        getRecords: () => readonly Q[];
        getDeferredRecords: () => readonly Q[];
        query: Query<Q>;
        deferredQuery: Query<Q>;
    };
    useStaticRecordsQuery: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(requestedQuery: Query<Q>, options?: UseStaticRecordsQueryOptions) => {
        isLoading: boolean;
        isRefreshing: boolean;
        error: unknown;
        isLoadingMore: boolean;
        loadMoreError: unknown;
        loadMore: (() => void) | undefined;
        hasResults: boolean;
        records: readonly Q[];
        deferredRecords: readonly Q[];
        getRecords: () => readonly Q[];
        getDeferredRecords: () => readonly Q[];
        query: Query<Q>;
        deferredQuery: Query<Q>;
    };
    useRecordQuery: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(requestedQuery: LiveQuery<Q>, options?: UseRecordQueryOptions) => {
        isLoading: boolean;
        record: Q | undefined;
        deferredRecord: Q | undefined;
        getRecord: (() => Q | undefined) & import("lodash").MemoizedFunction;
        getDeferredRecord: (() => Q | undefined) & import("lodash").MemoizedFunction;
    };
    useStaticRecordQuery: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(requestedQuery: Query<Q>, { refreshIntervalSeconds }?: UseStaticRecordQueryOptions) => {
        isLoading: boolean;
        record: Q | undefined;
        deferredRecord: Q | undefined;
        getRecord: (() => Q | undefined) & import("lodash").MemoizedFunction;
        getDeferredRecord: (() => Q | undefined) & import("lodash").MemoizedFunction;
    };
    useRecordHelpers: () => {
        isAuthenticated: boolean;
        entity: string;
        proxyEntity: string;
        discover: (entity: string, signal?: AbortSignal) => Promise<EntityRecord>;
        downloadBlob: (record: AnyRecord, blob: AnyBlobLink, signal?: AbortSignal) => Promise<Blob>;
        recordByVersion: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(version: VersionHash<Q>) => Extract<StandingRecord, Q> | Extract<IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]>, Q> | Extract<SubscriptionRecord, Q>;
        recordByKey: <Q extends AnyRecord>(key: RecordKey<Q>) => Extract<AnyRecord, Q>;
        findRecordByKey: <Q extends AnyRecord>(key: RecordKey<Q>) => Extract<AnyRecord, Q> | undefined;
        findRecordByQuery: <Q extends AnyRecord>(query: Query<Q>) => Q | undefined;
        findEntityRecord: (targetEntity: string) => EntityRecord | undefined;
        findStandingDecision: (publisherEntity: string) => `${StandingDecision}`;
        updateStandingDecision: (publisherEntity: string, decision: StandingDecision) => void;
        updateRecords: import("./storeTypes.js").UpdateRecords<StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>;
        uploadBlob: (blob: Blob, signal?: AbortSignal) => Promise<import("@baqhub/sdk").BlobResponse>;
        buildBlobUrl: <R_1 extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(record: R_1, blob: AnyBlobLink, expiresInSeconds?: number) => string;
        onDisconnectRequest: Handler;
    };
    useRecordByVersion: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord, K extends RecordKey<Q> | undefined>(version: VersionHash<Q> | K) => (undefined extends K ? undefined : never) | Extract<StandingRecord, Q> | Extract<IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]>, Q> | Extract<SubscriptionRecord, Q>;
    useRecordByKey: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord, K extends RecordKey<Q> | undefined>(key: RecordKey<Q> | K) => (undefined extends K ? undefined : never) | Extract<StandingRecord, Q> | Extract<IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]>, Q> | Extract<SubscriptionRecord, Q>;
    useFindRecordByKey: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(key: RecordKey<Q> | undefined) => Extract<AnyRecord, Q> | undefined;
    useFindRecordByQuery: <Q extends StandingRecord | IO.TypeOf<[CleanRecordType<EntityRecord>, CleanRecordType<EntityRecord>, ...R][number]> | SubscriptionRecord>(query: Query<Q> | undefined) => Q | undefined;
    useFindEntityRecord: (entity: string | undefined) => EntityRecord | undefined;
    useFindStandingDecision: (entity: string | undefined) => "undecided" | "allow" | "block";
};
