import React, { ReactNode, FC } from 'react';
import { ViewStyle, TextStyle, NativeSyntheticEvent, NativeScrollEvent, TextInputProps, TextProps, TextInput } from 'react-native';
import * as index from 'index';

type ThemeTypes = "dark" | "light";
type ThemeModes = "dark" | "light" | "default";
type colorTypes = "primary" | "secondary" | "light" | "dark" | "info" | "warning" | "error" | "success" | "blue" | "textSecondary";
type extraColorTypes = {
    dark?: {
        [key: string]: {
            main?: string;
            light?: string;
            dark?: string;
            text?: string;
            [key: number]: string;
        };
    };
    light?: {
        [key: string]: {
            main?: string;
            light?: string;
            dark?: string;
            text?: string;
            [key: number]: string;
        };
    };
};
interface ThemeActionTypes {
    type: ThemeModes;
    payload?: ThemeTypes;
}
interface ThemeState {
    value: ThemeTypes;
    mode: ThemeModes;
}
interface ThemeContext {
    themeState: ThemeState;
    themeDispatch?: any;
}
interface ThemeProviderProps {
    children: ReactNode;
}
interface AlertXProps {
    type: "info" | "warning" | "success" | "error";
    variant?: "contained" | "outlined";
    title?: string;
    gutterBottom?: number;
    body: string;
    style?: ViewStyle;
}
interface AvatarProps {
    color?: colorTypes;
    label?: string;
    variant?: "outlined" | "contained";
    source?: any;
    size?: number;
    style?: ViewStyle;
}
interface AnimatorProps {
    style?: ViewStyle;
    duration?: number;
    children: ReactNode;
    delay?: number;
    animationType?: "easeInEaseOut" | "linear" | "spring";
    type?: "fade" | "slideInLeft" | "slideInRight" | "slideInUp" | "slideInDown";
}
interface ButtonProps {
    color?: colorTypes;
    variant?: "text" | "outlined" | "contained";
    gutterBottom?: number;
    elevation?: number;
    onPress?: () => void;
    disabled?: boolean;
    title?: string;
    loading?: boolean;
    size?: "large" | "normal" | "small";
    rounded?: boolean;
    style?: ViewStyle;
    fullWidth?: boolean;
    translucent?: "dark" | undefined;
    start?: ReactNode;
    end?: ReactNode;
}
interface CheckboxProps {
    color?: colorTypes;
    label?: ReactNode;
    size?: number;
    checked?: boolean;
    style?: ViewStyle;
    onChange?: () => void;
}
interface FlashMessageProps {
    message: string;
    title?: string;
    actions?: Array<{
        title: string;
        onPress?: () => void;
    }>;
    duration?: number;
    type?: "success" | "warning" | "error";
}
interface LinkButtonProps {
    title: string;
    style?: TextStyle & ViewStyle;
    color?: colorTypes;
    fontSize?: number;
    fontWeight?: string;
    disabled?: boolean;
    onPress?: () => void;
}
interface IconButtonProps {
    style?: TextStyle;
    color?: colorTypes;
    fontSize?: number;
    disabled?: boolean;
    onPress?: () => void;
    icon: any;
    elevation?: number;
    bg?: boolean;
    size?: number;
    containerStyles?: ViewStyle;
    iconType?: "material" | "ion";
}
type locatorLocation = {
    description: string;
    formatted_address?: string;
    longitude: number;
    latitude: number;
};
type LocatorInputProps = {
    onBlur?: () => void;
    onFocus?: () => void;
    clear?: () => void;
    locateMe?: () => void;
    value?: string;
    onChangeText: (text: string) => void;
};
interface LocatorProps {
    variant?: "contained" | "outlined";
    onLocationSelected: (location: locatorLocation | null, formatted_address?: string) => void;
    label?: string;
    error?: string;
    float?: boolean;
    location?: locatorLocation | null;
    gutterBottom?: number;
    helperText?: string;
    renderInput?: (props: LocatorInputProps) => ReactNode;
    country?: string;
}
interface ListProps {
    style?: ViewStyle;
    children: ReactNode;
}
interface ListItemTextProps {
    primary: string;
    divider?: boolean;
    primaryProps?: TypographyProps;
    secondaryProps?: TypographyProps;
    secondary?: string;
    style?: ViewStyle;
}
interface ListItemProps {
    link?: boolean;
    divider?: boolean;
    onPress?: () => void;
    index?: number;
    style?: ViewStyle;
    children: ReactNode;
}
interface FormWrapperProps {
    children: ReactNode;
    behavior?: "position" | "height" | "padding";
    contentContainerStyle?: ViewStyle;
    mode?: "scroll" | "static";
    keyboardVerticalOffset?: number;
    style?: ViewStyle;
    onScroll?: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
}
interface GridItemProps {
    children: ReactNode;
    col?: number;
    alignItems?: "center" | "flex-start" | "flex-end";
    spacing?: number;
    style?: ViewStyle;
}
interface GridProps {
    children: ReactNode;
    spacing?: number;
    style?: ViewStyle;
}
interface PopupProps {
    title?: string;
    keyboardVerticalOffset?: number;
    sheet?: number | boolean;
    bare?: boolean;
    children: ReactNode;
    open: boolean;
    onClose?: () => void;
    style?: ViewStyle;
}
interface SpinnerProps {
    label?: string;
    size?: "large" | "small";
    color?: colorTypes;
    fullscreen?: boolean;
    style?: ViewStyle;
}
interface TextFieldProps extends TextInputProps {
    label?: string;
    variant?: "outlined" | "text" | "contained";
    color?: colorTypes;
    size?: "small" | "normal" | "large";
    type?: "email" | "tel" | "password" | "text" | "number" | "search";
    helperText?: string;
    value: any;
    start?: ReactNode;
    rounded?: boolean;
    error?: string | string[];
    disabled?: boolean;
    style?: ViewStyle;
    inputStyles?: any;
    gutterBottom?: number;
    end?: ReactNode;
    options?: {
        start?: ReactNode;
        secondary?: string;
        value: string | number;
        label: string;
    }[];
    onFocus?: () => void;
    onBlur?: () => void;
}
interface TypographyProps extends TextProps {
    children: ReactNode;
    color?: colorTypes | (string & {});
    style?: TextStyle | ViewStyle;
    textCase?: "capitalize" | "uppercase" | "lowercase" | undefined;
    variant?: "caption" | "body1" | "body2" | "h6" | "h5" | "h4" | "h3" | "h2" | "h1";
    align?: "center" | "left" | "right";
    gutterBottom?: number;
    numberOfLines?: number;
    adjustsFontSizeToFit?: boolean;
    fontFamily?: string;
    fontWeight?: 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;
}
interface SafeAreaViewProps {
    children: ReactNode;
    style?: ViewStyle;
}
interface SelectMenuProps {
    open: boolean;
    onClose: () => void;
    value: any;
    options: {
        secondary?: string;
        value: any;
        label: string;
    }[];
    onChange: (value: string) => void;
    disableAutoClose?: boolean;
    label?: string;
    secondary?: string;
    helperText?: string;
}
interface OTPInputProps {
    length?: number;
    onChange: (value: string) => void;
    value: string;
    variant?: "outlined" | "text" | "contained";
    spacing?: number;
    size?: number;
}
interface RatingStarsProps {
    rating: number;
    size: number;
}
interface RatingInputProps {
    rating?: number;
    noReview?: boolean;
    size?: number;
    onSubmit?: (data: {
        rating: number;
        review: string;
    }) => Promise<void>;
}
interface DividerProps {
    color?: colorTypes;
    gutterBottom?: number;
    style?: ViewStyle;
    height?: number;
}

type configProps = {
    googleMapApiKey?: string;
    colors?: extraColorTypes;
    fontFamily?: string;
    edgeToEdge?: boolean;
};
declare function initialize(config: configProps): void;

declare const AdaptiveStatusBar: ({ translucent }: {
    translucent?: boolean | undefined;
}) => React.JSX.Element;

declare const AlertX: React.FC<AlertXProps>;

declare const Avatar: React.FC<AvatarProps>;

declare const LinkButton: React.FC<LinkButtonProps>;
declare const IconButton: React.FC<IconButtonProps>;
declare const Button: React.FC<ButtonProps>;

declare const CheckBox: FC<CheckboxProps>;

declare let showFlashMessage: (msg: FlashMessageProps) => void;

declare const FormWrapper: React.FC<FormWrapperProps>;

declare const RatingStars: FC<RatingStarsProps>;
declare const RatingInput: FC<RatingInputProps>;

declare const GridItem: React.FC<GridItemProps>;
declare const Grid: React.FC<GridProps>;

type predictionType = {
    id: string;
    description: string;
};
declare const getPredictionsFromCoords: (coords: {
    latitude: number;
    longitude: number;
}) => Promise<{
    description: any;
    id: any;
    latLng: {
        lst: number;
        lng: number;
    };
}[]>;
declare const getPredictionsFromQuery: (query: string, country: string) => Promise<{
    description: any;
    id: any;
}[]>;
declare const getLocationFromPlaceId: (place_id: string) => Promise<{
    formatted_address: string;
    geometry: {
        location: {
            lat: number;
            lng: number;
        };
    };
}>;
declare const Locator: React.FC<LocatorProps>;

declare const Popup: React.FC<PopupProps>;

declare const SafeAreaView: React.FC<SafeAreaViewProps>;

declare const Divider: FC<DividerProps>;

declare const SelectMenu: React.FC<SelectMenuProps>;

declare const Spinner: React.FC<SpinnerProps>;

declare const TextField: React.FC<TextFieldProps>;
declare const TextField2: React.ForwardRefExoticComponent<TextFieldProps & React.RefAttributes<TextInput>>;

declare const Typography: React.FC<TypographyProps>;

declare const OTPInput: FC<OTPInputProps>;

declare const useColors: () => {
    white: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    black: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    primary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    secondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    light: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    dark: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    textSecondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    blue: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    info: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    success: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    warning: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    error: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
} | {
    white: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    black: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    primary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    secondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    light: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    dark: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    textSecondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    blue: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    info: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    success: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    warning: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    error: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
} | {
    white: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    black: {
        main?: string | undefined;
        light?: string | undefined;
        dark?: string | undefined;
        text?: string | undefined;
        1: string;
        2: string;
        3: string;
        4: string;
        5: string;
    };
    primary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    secondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    light: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    dark: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    textSecondary: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    blue: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    info: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    success: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    warning: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
    error: {
        main: string;
        light: string;
        dark: string;
        text: string;
    };
};
declare const useTheme: () => index.ThemeTypes;
declare const useNavScreenOptions: (type: "stack" | "tab" | "drawer") => any;

declare const UIThemeContext: React.Context<ThemeContext>;
declare const UIThemeProvider: ({ children }: ThemeProviderProps) => React.JSX.Element;

declare const HoddyUI: {
    initialize: typeof initialize;
};

export { AdaptiveStatusBar, AlertX, type AlertXProps, type AnimatorProps, Avatar, type AvatarProps, Button, type ButtonProps, CheckBox, type CheckboxProps, Divider, type DividerProps, type FlashMessageProps, FormWrapper, type FormWrapperProps, Grid, GridItem, type GridItemProps, type GridProps, IconButton, type IconButtonProps, LinkButton, type LinkButtonProps, type ListItemProps, type ListItemTextProps, type ListProps, Locator, type LocatorInputProps, type LocatorProps, OTPInput, type OTPInputProps, Popup, type PopupProps, RatingInput, type RatingInputProps, RatingStars, type RatingStarsProps, SafeAreaView, type SafeAreaViewProps, SelectMenu, type SelectMenuProps, Spinner, type SpinnerProps, TextField, TextField2, type TextFieldProps, type ThemeActionTypes, type ThemeContext, type ThemeModes, type ThemeProviderProps, type ThemeState, type ThemeTypes, Typography, type TypographyProps, UIThemeContext, UIThemeProvider, type colorTypes, HoddyUI as default, type extraColorTypes, getLocationFromPlaceId, getPredictionsFromCoords, getPredictionsFromQuery, type locatorLocation, type predictionType, showFlashMessage, useColors, useNavScreenOptions, useTheme };
