import { Observable } from "rxjs";
import firebase from "firebase/app";
import { User } from "@firebase/auth-types";
import { FirebaseApp } from "./FirebaseApp";
import { Credentials, EmailAndPassword, CustomToken } from "../../types/credentials";
import { UserClaims } from "../../types/user";
import { DeviceInfo } from "../../types/deviceInfo";
import { OAuthRemoveResponse } from "../../types/oauth";
import { Experiment } from "../../types/experiment";
import { TransferDeviceOptions } from "../../utils/transferDevice";
/**
 * @hidden
 */
export declare type UserWithMetadata = User & {
    selectedDevice: DeviceInfo | null;
};
/**
 * @hidden
 */
export declare const credentialWithLink: Function;
/**
 * @hidden
 */
export declare function createUser(...args: any[]): any;
/**
 * @hidden
 */
export declare class FirebaseUser {
    app: firebase.app.App;
    user: User | null;
    constructor(firebaseApp: FirebaseApp);
    auth(): firebase.auth.Auth;
    createAccount(credentials: EmailAndPassword): Promise<any>;
    deleteAccount(): Promise<void>;
    onAuthStateChanged(): Observable<User | null>;
    onLogin(): Observable<User>;
    login(credentials: Credentials): Promise<firebase.auth.UserCredential>;
    logout(): Promise<void>;
    createCustomToken(): Promise<CustomToken>;
    removeOAuthAccess(): Promise<OAuthRemoveResponse>;
    getDevices(): Promise<DeviceInfo[]>;
    addDevice(deviceId: string): Promise<void>;
    removeDevice(deviceId: string): Promise<void>;
    transferDevice(options: TransferDeviceOptions): Promise<void>;
    isDeviceIdValid(deviceId: string): Promise<boolean>;
    onUserDevicesChange(): Observable<DeviceInfo[]>;
    onUserClaimsChange(): Observable<UserClaims>;
    getIdToken(forceRefresh?: boolean): Promise<void>;
    getClaims(): Promise<UserClaims>;
    private userDevicesToDeviceInfoList;
    hasDevicePermission(deviceId: string): Promise<boolean>;
    private getDeviceClaimedByPath;
    private getUserClaimedDevicePath;
    private getUserDevicesPath;
    private getUserClaimsUpdatedOnPath;
    private getDeviceInfoPath;
    onUserExperiments(): Observable<Experiment[]>;
    deleteUserExperiment(experimentId: string): Promise<void>;
}
