@korsolutions/ui 0.0.53 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babel.config.js +1 -11
- package/dist/module/components/alert/components/alert-body.js.map +1 -1
- package/dist/module/components/alert/components/alert-description.js.map +1 -1
- package/dist/module/components/alert/components/alert-icon.js.map +1 -1
- package/dist/module/components/alert/components/alert-root.js.map +1 -1
- package/dist/module/components/alert/components/alert-title.js.map +1 -1
- package/dist/module/components/alert/index.js.map +1 -1
- package/dist/module/components/alert/variants/default.js.map +1 -1
- package/dist/module/components/alert/variants/destructive.js.map +1 -1
- package/dist/module/components/alert/variants/index.js.map +1 -1
- package/dist/module/components/alert-dialog/async-alert-dialog.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-action.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-cancel.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-content.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-description.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-footer.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-overlay.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-portal.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-root.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-title.js.map +1 -1
- package/dist/module/components/alert-dialog/components/alert-dialog-trigger.js.map +1 -1
- package/dist/module/components/alert-dialog/index.js.map +1 -1
- package/dist/module/components/alert-dialog/variants/default.js.map +1 -1
- package/dist/module/components/alert-dialog/variants/index.js.map +1 -1
- package/dist/module/components/avatar/components/avatar-fallback.js.map +1 -1
- package/dist/module/components/avatar/components/avatar-image.js.map +1 -1
- package/dist/module/components/avatar/components/avatar-root.js.map +1 -1
- package/dist/module/components/avatar/index.js.map +1 -1
- package/dist/module/components/avatar/variants/default.js.map +1 -1
- package/dist/module/components/avatar/variants/index.js.map +1 -1
- package/dist/module/components/badge/components/badge-label.js.map +1 -1
- package/dist/module/components/badge/components/badge-root.js.map +1 -1
- package/dist/module/components/badge/index.js.map +1 -1
- package/dist/module/components/badge/variants/default.js.map +1 -1
- package/dist/module/components/badge/variants/index.js.map +1 -1
- package/dist/module/components/badge/variants/secondary.js.map +1 -1
- package/dist/module/components/button/components/button-label.js.map +1 -1
- package/dist/module/components/button/components/button-root.js.map +1 -1
- package/dist/module/components/button/components/button-spinner.js.map +1 -1
- package/dist/module/components/button/index.js.map +1 -1
- package/dist/module/components/button/variants/default.js.map +1 -1
- package/dist/module/components/button/variants/index.js.map +1 -1
- package/dist/module/components/button/variants/secondary.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-day.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-header.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-nav-button.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-root.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-title.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-week-labels.js.map +1 -1
- package/dist/module/components/calendar/components/calendar-weeks.js.map +1 -1
- package/dist/module/components/calendar/index.js.map +1 -1
- package/dist/module/components/calendar/variants/default.js.map +1 -1
- package/dist/module/components/calendar/variants/index.js.map +1 -1
- package/dist/module/components/card/card-body.js.map +1 -1
- package/dist/module/components/card/card-footer.js.map +1 -1
- package/dist/module/components/card/card-header.js.map +1 -1
- package/dist/module/components/card/card-root.js.map +1 -1
- package/dist/module/components/card/card-title.js.map +1 -1
- package/dist/module/components/card/index.js.map +1 -1
- package/dist/module/components/card/variants/default.js.map +1 -1
- package/dist/module/components/card/variants/index.js.map +1 -1
- package/dist/module/components/checkbox/components/checkbox-content.js.map +1 -1
- package/dist/module/components/checkbox/components/checkbox-description.js.map +1 -1
- package/dist/module/components/checkbox/components/checkbox-indicator.js.map +1 -1
- package/dist/module/components/checkbox/components/checkbox-root.js.map +1 -1
- package/dist/module/components/checkbox/components/checkbox-title.js.map +1 -1
- package/dist/module/components/checkbox/index.js.map +1 -1
- package/dist/module/components/checkbox/variants/default.js.map +1 -1
- package/dist/module/components/checkbox/variants/index.js.map +1 -1
- package/dist/module/components/checkbox/variants/outlined.js.map +1 -1
- package/dist/module/components/empty/components/empty-description.js.map +1 -1
- package/dist/module/components/empty/components/empty-media.js.map +1 -1
- package/dist/module/components/empty/components/empty-root.js.map +1 -1
- package/dist/module/components/empty/components/empty-title.js.map +1 -1
- package/dist/module/components/empty/index.js.map +1 -1
- package/dist/module/components/empty/variants/default.js.map +1 -1
- package/dist/module/components/empty/variants/index.js.map +1 -1
- package/dist/module/components/field/components/field-description.js.map +1 -1
- package/dist/module/components/field/components/field-error.js.map +1 -1
- package/dist/module/components/field/components/field-label.js.map +1 -1
- package/dist/module/components/field/components/field-root.js.map +1 -1
- package/dist/module/components/field/index.js.map +1 -1
- package/dist/module/components/field/variants/default.js.map +1 -1
- package/dist/module/components/field/variants/index.js.map +1 -1
- package/dist/module/components/icon/icon.js.map +1 -1
- package/dist/module/components/icon/index.js.map +1 -1
- package/dist/module/components/icon/variants/default.js.map +1 -1
- package/dist/module/components/icon/variants/index.js.map +1 -1
- package/dist/module/components/index.js.map +1 -1
- package/dist/module/components/input/index.js.map +1 -1
- package/dist/module/components/input/input.js.map +1 -1
- package/dist/module/components/input/numeric-input.js.map +1 -1
- package/dist/module/components/input/variants/default.js.map +1 -1
- package/dist/module/components/input/variants/index.js.map +1 -1
- package/dist/module/components/input/variants/secondary.js.map +1 -1
- package/dist/module/components/link/index.js.map +1 -1
- package/dist/module/components/link/link.js.map +1 -1
- package/dist/module/components/link/variants/default.js.map +1 -1
- package/dist/module/components/link/variants/index.js.map +1 -1
- package/dist/module/components/list/index.js.map +1 -1
- package/dist/module/components/menu/components/menu-content.js.map +1 -1
- package/dist/module/components/menu/components/menu-item.js.map +1 -1
- package/dist/module/components/menu/components/menu-overlay.js.map +1 -1
- package/dist/module/components/menu/components/menu-portal.js.map +1 -1
- package/dist/module/components/menu/components/menu-root.js.map +1 -1
- package/dist/module/components/menu/components/menu-trigger.js.map +1 -1
- package/dist/module/components/menu/index.js.map +1 -1
- package/dist/module/components/menu/variants/default.js.map +1 -1
- package/dist/module/components/menu/variants/index.js.map +1 -1
- package/dist/module/components/phone-input/components/country-picker.js +101 -0
- package/dist/module/components/phone-input/components/country-picker.js.map +1 -0
- package/dist/module/components/phone-input/components/phone-input-root.js +57 -0
- package/dist/module/components/phone-input/components/phone-input-root.js.map +1 -0
- package/dist/module/components/phone-input/components/phone-input.js +31 -0
- package/dist/module/components/phone-input/components/phone-input.js.map +1 -0
- package/dist/module/components/phone-input/context.js +12 -0
- package/dist/module/components/phone-input/context.js.map +1 -0
- package/dist/module/components/phone-input/index.js +8 -1
- package/dist/module/components/phone-input/index.js.map +1 -1
- package/dist/module/components/phone-input/variants/default.js +1 -1
- package/dist/module/components/phone-input/variants/default.js.map +1 -1
- package/dist/module/components/phone-input/variants/index.js.map +1 -1
- package/dist/module/components/popover/components/popover-close.js.map +1 -1
- package/dist/module/components/popover/components/popover-content.js.map +1 -1
- package/dist/module/components/popover/components/popover-overlay.js.map +1 -1
- package/dist/module/components/popover/components/popover-portal.js.map +1 -1
- package/dist/module/components/popover/components/popover-root.js.map +1 -1
- package/dist/module/components/popover/components/popover-trigger.js.map +1 -1
- package/dist/module/components/popover/index.js.map +1 -1
- package/dist/module/components/popover/variants/default.js.map +1 -1
- package/dist/module/components/popover/variants/index.js.map +1 -1
- package/dist/module/components/popover/variants/unstyled.js.map +1 -1
- package/dist/module/components/portal/index.js.map +1 -1
- package/dist/module/components/portal/portal.js.map +1 -1
- package/dist/module/components/portal/portal.web.js.map +1 -1
- package/dist/module/components/progress/components/progress-indicator.js.map +1 -1
- package/dist/module/components/progress/components/progress-root.js.map +1 -1
- package/dist/module/components/progress/index.js.map +1 -1
- package/dist/module/components/progress/variants/default.js.map +1 -1
- package/dist/module/components/progress/variants/index.js.map +1 -1
- package/dist/module/components/scroll-bar/index.js.map +1 -1
- package/dist/module/components/scroll-bar/scroll-bar.js.map +1 -1
- package/dist/module/components/select/components/select-content.js.map +1 -1
- package/dist/module/components/select/components/select-option.js.map +1 -1
- package/dist/module/components/select/components/select-overlay.js.map +1 -1
- package/dist/module/components/select/components/select-portal.js +10 -1
- package/dist/module/components/select/components/select-portal.js.map +1 -1
- package/dist/module/components/select/components/select-root.js.map +1 -1
- package/dist/module/components/select/components/select-trigger.js +5 -4
- package/dist/module/components/select/components/select-trigger.js.map +1 -1
- package/dist/module/components/select/index.js.map +1 -1
- package/dist/module/components/select/variants/default.js.map +1 -1
- package/dist/module/components/select/variants/index.js.map +1 -1
- package/dist/module/components/tabs/components/tabs-list.js.map +1 -1
- package/dist/module/components/tabs/components/tabs-root.js.map +1 -1
- package/dist/module/components/tabs/components/tabs-trigger-text.js.map +1 -1
- package/dist/module/components/tabs/components/tabs-trigger.js.map +1 -1
- package/dist/module/components/tabs/index.js.map +1 -1
- package/dist/module/components/tabs/variants/default.js.map +1 -1
- package/dist/module/components/tabs/variants/index.js.map +1 -1
- package/dist/module/components/tabs/variants/line.js.map +1 -1
- package/dist/module/components/textarea/index.js.map +1 -1
- package/dist/module/components/textarea/textarea.js.map +1 -1
- package/dist/module/components/textarea/variants/default.js.map +1 -1
- package/dist/module/components/textarea/variants/index.js.map +1 -1
- package/dist/module/components/toast/components/toast-body.js +16 -0
- package/dist/module/components/toast/components/toast-body.js.map +1 -0
- package/dist/module/components/toast/components/toast-description.js.map +1 -1
- package/dist/module/components/toast/components/toast-icon.js.map +1 -1
- package/dist/module/components/toast/components/toast-root.js.map +1 -1
- package/dist/module/components/toast/components/toast-title.js.map +1 -1
- package/dist/module/components/toast/index.js.map +1 -1
- package/dist/module/components/toast/manager.js +15 -5
- package/dist/module/components/toast/manager.js.map +1 -1
- package/dist/module/components/toast/variants/danger.js +6 -2
- package/dist/module/components/toast/variants/danger.js.map +1 -1
- package/dist/module/components/toast/variants/default.js +6 -2
- package/dist/module/components/toast/variants/default.js.map +1 -1
- package/dist/module/components/toast/variants/index.js.map +1 -1
- package/dist/module/components/toast/variants/success.js +6 -2
- package/dist/module/components/toast/variants/success.js.map +1 -1
- package/dist/module/components/typography/index.js.map +1 -1
- package/dist/module/components/typography/typography.js.map +1 -1
- package/dist/module/components/typography/variants/body-lg.js.map +1 -1
- package/dist/module/components/typography/variants/body-md.js.map +1 -1
- package/dist/module/components/typography/variants/body-sm.js.map +1 -1
- package/dist/module/components/typography/variants/heading-lg.js.map +1 -1
- package/dist/module/components/typography/variants/heading-md.js.map +1 -1
- package/dist/module/components/typography/variants/heading-sm.js.map +1 -1
- package/dist/module/components/typography/variants/index.js.map +1 -1
- package/dist/module/data/countries.js.map +1 -1
- package/dist/module/hooks/index.js.map +1 -1
- package/dist/module/hooks/use-phone-mask.js.map +1 -1
- package/dist/module/index.js +3 -1
- package/dist/module/index.js.map +1 -1
- package/dist/module/safe-area/index.js.map +1 -1
- package/dist/module/safe-area/provider.js.map +1 -1
- package/dist/module/themes/adapters/index.js.map +1 -1
- package/dist/module/themes/adapters/react-navigation.js.map +1 -1
- package/dist/module/themes/default/index.js.map +1 -1
- package/dist/module/themes/index.js.map +1 -1
- package/dist/module/themes/provider.js +11 -2
- package/dist/module/themes/provider.js.map +1 -1
- package/dist/module/utils/use-themed-styles.js.map +1 -1
- package/dist/typescript/babel.config.d.ts +1 -6
- package/dist/typescript/babel.config.d.ts.map +1 -1
- package/dist/typescript/src/components/phone-input/components/country-picker.d.ts +3 -0
- package/dist/typescript/src/components/phone-input/components/country-picker.d.ts.map +1 -0
- package/dist/typescript/src/components/phone-input/components/phone-input-root.d.ts +17 -0
- package/dist/typescript/src/components/phone-input/components/phone-input-root.d.ts.map +1 -0
- package/dist/typescript/src/components/phone-input/components/phone-input.d.ts +8 -0
- package/dist/typescript/src/components/phone-input/components/phone-input.d.ts.map +1 -0
- package/dist/typescript/src/components/phone-input/context.d.ts +17 -0
- package/dist/typescript/src/components/phone-input/context.d.ts.map +1 -0
- package/dist/typescript/src/components/phone-input/index.d.ts +8 -1
- package/dist/typescript/src/components/phone-input/index.d.ts.map +1 -1
- package/dist/typescript/src/components/select/components/select-portal.d.ts +1 -1
- package/dist/typescript/src/components/select/components/select-portal.d.ts.map +1 -1
- package/dist/typescript/src/components/select/components/select-trigger.d.ts.map +1 -1
- package/dist/typescript/src/components/toast/components/toast-body.d.ts +9 -0
- package/dist/typescript/src/components/toast/components/toast-body.d.ts.map +1 -0
- package/dist/typescript/src/components/toast/manager.d.ts.map +1 -1
- package/dist/typescript/src/components/toast/types.d.ts +2 -0
- package/dist/typescript/src/components/toast/types.d.ts.map +1 -1
- package/dist/typescript/src/components/toast/variants/danger.d.ts.map +1 -1
- package/dist/typescript/src/components/toast/variants/default.d.ts.map +1 -1
- package/dist/typescript/src/components/toast/variants/success.d.ts.map +1 -1
- package/dist/typescript/src/data/countries.d.ts +2 -1
- package/dist/typescript/src/data/countries.d.ts.map +1 -1
- package/dist/typescript/src/hooks/use-phone-mask.d.ts +2 -2
- package/dist/typescript/src/hooks/use-phone-mask.d.ts.map +1 -1
- package/dist/typescript/src/index.d.ts +4 -3
- package/dist/typescript/src/index.d.ts.map +1 -1
- package/dist/typescript/src/themes/provider.d.ts +10 -0
- package/dist/typescript/src/themes/provider.d.ts.map +1 -1
- package/package.json +2 -7
- package/src/components/phone-input/components/country-picker.tsx +155 -0
- package/src/components/phone-input/components/phone-input-root.tsx +85 -0
- package/src/components/phone-input/components/phone-input.tsx +43 -0
- package/src/components/phone-input/context.ts +32 -0
- package/src/components/phone-input/index.ts +10 -1
- package/src/components/phone-input/variants/default.tsx +1 -1
- package/src/components/select/components/select-portal.tsx +14 -2
- package/src/components/select/components/select-trigger.tsx +5 -6
- package/src/components/toast/components/toast-body.tsx +19 -0
- package/src/components/toast/manager.tsx +15 -5
- package/src/components/toast/types.ts +2 -0
- package/src/components/toast/variants/danger.tsx +6 -2
- package/src/components/toast/variants/default.tsx +6 -2
- package/src/components/toast/variants/success.tsx +6 -2
- package/src/data/countries.ts +606 -68
- package/src/hooks/use-phone-mask.ts +2 -2
- package/src/index.tsx +9 -3
- package/src/themes/provider.tsx +22 -1
- package/dist/module/components/phone-input/phone-input.js +0 -165
- package/dist/module/components/phone-input/phone-input.js.map +0 -1
- package/dist/typescript/src/components/phone-input/phone-input.d.ts +0 -16
- package/dist/typescript/src/components/phone-input/phone-input.d.ts.map +0 -1
- package/scripts/build.sh +0 -2
- package/src/components/phone-input/phone-input.tsx +0 -220
|
@@ -13,7 +13,7 @@ export interface UsePhoneMaskOptions {
|
|
|
13
13
|
countries?: CountryData[];
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export interface
|
|
16
|
+
export interface PhoneMask {
|
|
17
17
|
displayValue: string;
|
|
18
18
|
e164Value: string;
|
|
19
19
|
country: CountryData;
|
|
@@ -78,7 +78,7 @@ export function usePhoneMask({
|
|
|
78
78
|
onChange,
|
|
79
79
|
onCountryChange,
|
|
80
80
|
countries: customCountries,
|
|
81
|
-
}: UsePhoneMaskOptions = {}):
|
|
81
|
+
}: UsePhoneMaskOptions = {}): PhoneMask {
|
|
82
82
|
const availableCountries = customCountries ?? COUNTRIES;
|
|
83
83
|
const isInternalChange = useRef(false);
|
|
84
84
|
|
package/src/index.tsx
CHANGED
|
@@ -3,13 +3,18 @@ import { PortalHost } from "./components/portal";
|
|
|
3
3
|
import { type PortalHostProps } from "./components/portal/portal.constants";
|
|
4
4
|
import { ToastContainer } from "./components/toast/manager";
|
|
5
5
|
import { SafeAreaProvider, type SafeAreaInsets } from "./safe-area";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
ThemeProvider,
|
|
8
|
+
type ComponentsConfig,
|
|
9
|
+
type ThemeProviderProps,
|
|
10
|
+
} from "./themes";
|
|
7
11
|
|
|
8
12
|
export interface ProviderProps {
|
|
9
13
|
children: React.ReactNode;
|
|
10
14
|
portalContainer?: PortalHostProps["container"];
|
|
11
15
|
theme?: ThemeProviderProps["theme"];
|
|
12
16
|
safeAreaInsets?: SafeAreaInsets;
|
|
17
|
+
components?: ComponentsConfig;
|
|
13
18
|
}
|
|
14
19
|
|
|
15
20
|
export const UIProvider = ({
|
|
@@ -17,10 +22,11 @@ export const UIProvider = ({
|
|
|
17
22
|
portalContainer,
|
|
18
23
|
theme,
|
|
19
24
|
safeAreaInsets,
|
|
25
|
+
components,
|
|
20
26
|
}: ProviderProps) => {
|
|
21
27
|
return (
|
|
22
28
|
<SafeAreaProvider insets={safeAreaInsets}>
|
|
23
|
-
<ThemeProvider theme={theme}>
|
|
29
|
+
<ThemeProvider theme={theme} components={components}>
|
|
24
30
|
<ToastContainer />
|
|
25
31
|
{children}
|
|
26
32
|
<PortalHost container={portalContainer} />
|
|
@@ -34,7 +40,7 @@ export * from "./hooks/use-screen-size";
|
|
|
34
40
|
|
|
35
41
|
export * from "./themes/adapters";
|
|
36
42
|
export * from "./themes/default";
|
|
37
|
-
export { useTheme } from "./themes/provider";
|
|
43
|
+
export { useTheme, type ComponentsConfig } from "./themes/provider";
|
|
38
44
|
export * from "./themes/types";
|
|
39
45
|
|
|
40
46
|
export * from "./components";
|
package/src/themes/provider.tsx
CHANGED
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
useState,
|
|
7
7
|
} from "react";
|
|
8
8
|
import { useColorScheme } from "react-native";
|
|
9
|
+
import type { ToastVariants } from "../components/toast/variants";
|
|
10
|
+
import type { SvgProps } from "../types/props.types";
|
|
9
11
|
import type { DeepPartial } from "../types/util.types";
|
|
10
12
|
import { defaultThemeAssets } from "./default";
|
|
11
13
|
import type {
|
|
@@ -27,16 +29,26 @@ interface ThemeContext {
|
|
|
27
29
|
letterSpacing: LetterSpacing;
|
|
28
30
|
fontSize: FontSize;
|
|
29
31
|
setColorScheme: (scheme: ColorScheme) => void;
|
|
32
|
+
components?: ComponentsConfig;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ComponentsConfig {
|
|
36
|
+
toast?: {
|
|
37
|
+
icons?: Partial<
|
|
38
|
+
Record<keyof typeof ToastVariants, (props: SvgProps) => React.ReactNode>
|
|
39
|
+
>;
|
|
40
|
+
};
|
|
30
41
|
}
|
|
31
42
|
|
|
32
43
|
const ThemeContext = createContext<ThemeContext | null>(null);
|
|
33
44
|
|
|
34
45
|
export interface ThemeProviderProps extends PropsWithChildren {
|
|
35
46
|
theme?: DeepPartial<ThemeAssets>;
|
|
47
|
+
components?: ComponentsConfig;
|
|
36
48
|
}
|
|
37
49
|
|
|
38
50
|
export const ThemeProvider = (props: ThemeProviderProps) => {
|
|
39
|
-
const { children, theme } = props;
|
|
51
|
+
const { children, theme, components } = props;
|
|
40
52
|
|
|
41
53
|
const systemColorScheme = useColorScheme();
|
|
42
54
|
const [colorScheme, setColorScheme] = useState<ColorScheme>(
|
|
@@ -65,6 +77,7 @@ export const ThemeProvider = (props: ThemeProviderProps) => {
|
|
|
65
77
|
fontFamily: themeAssets.fontFamily,
|
|
66
78
|
letterSpacing: themeAssets.letterSpacing,
|
|
67
79
|
fontSize: themeAssets.fontSize,
|
|
80
|
+
components,
|
|
68
81
|
}}
|
|
69
82
|
>
|
|
70
83
|
{children}
|
|
@@ -79,3 +92,11 @@ export const useTheme = () => {
|
|
|
79
92
|
}
|
|
80
93
|
return context;
|
|
81
94
|
};
|
|
95
|
+
|
|
96
|
+
export const useComponentsConfig = () => {
|
|
97
|
+
const context = useContext(ThemeContext);
|
|
98
|
+
if (!context) {
|
|
99
|
+
throw new Error("useComponentsConfig must be used within a ThemeProvider");
|
|
100
|
+
}
|
|
101
|
+
return context.components;
|
|
102
|
+
};
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { usePhoneMask } from "../../hooks/use-phone-mask.js";
|
|
4
|
-
import { DEFAULT_LAYOUT, DEFAULT_POSITION, useRelativePosition } from "../../hooks/use-relative-position.js";
|
|
5
|
-
import { measureLayoutPosition } from "../../utils/normalize-layout.js";
|
|
6
|
-
import React, { useRef, useState } from "react";
|
|
7
|
-
import { Keyboard, Platform, Pressable, ScrollView, StyleSheet, Text, TextInput, View } from "react-native";
|
|
8
|
-
import { Portal } from "../portal/index.js";
|
|
9
|
-
import { PhoneInputVariants } from "./variants/index.js";
|
|
10
|
-
import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
|
-
const calculateState = (isDisabled, isFocused) => {
|
|
12
|
-
if (isDisabled) return "disabled";
|
|
13
|
-
if (isFocused) return "focused";
|
|
14
|
-
return "default";
|
|
15
|
-
};
|
|
16
|
-
export function PhoneInput({
|
|
17
|
-
value,
|
|
18
|
-
onChange,
|
|
19
|
-
defaultCountry = "US",
|
|
20
|
-
countries,
|
|
21
|
-
placeholder,
|
|
22
|
-
isDisabled = false,
|
|
23
|
-
variant = "default",
|
|
24
|
-
style
|
|
25
|
-
}) {
|
|
26
|
-
const variantStyles = PhoneInputVariants[variant]();
|
|
27
|
-
const [isFocused, setIsFocused] = useState(false);
|
|
28
|
-
const [isPickerOpen, setIsPickerOpen] = useState(false);
|
|
29
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
30
|
-
const [triggerPosition, setTriggerPosition] = useState(DEFAULT_POSITION);
|
|
31
|
-
const [contentLayout, setContentLayout] = useState(DEFAULT_LAYOUT);
|
|
32
|
-
const triggerRef = useRef(null);
|
|
33
|
-
const state = calculateState(isDisabled, isFocused);
|
|
34
|
-
const phoneMask = usePhoneMask({
|
|
35
|
-
value,
|
|
36
|
-
defaultCountry,
|
|
37
|
-
onChange,
|
|
38
|
-
countries
|
|
39
|
-
});
|
|
40
|
-
const rootStyles = StyleSheet.flatten([variantStyles.root?.default, variantStyles.root?.[state], style]);
|
|
41
|
-
const countryButtonStyles = StyleSheet.flatten([variantStyles.countryButton?.default, variantStyles.countryButton?.[state]]);
|
|
42
|
-
const countryButtonTextStyles = StyleSheet.flatten([variantStyles.countryButtonText?.default, variantStyles.countryButtonText?.[state]]);
|
|
43
|
-
const separatorStyles = StyleSheet.flatten([variantStyles.separator?.default, variantStyles.separator?.[state]]);
|
|
44
|
-
const inputStyles = StyleSheet.flatten([variantStyles.input?.default, variantStyles.input?.[state]]);
|
|
45
|
-
const openPicker = () => {
|
|
46
|
-
if (isDisabled) return;
|
|
47
|
-
if (Platform.OS !== "web") {
|
|
48
|
-
Keyboard.dismiss();
|
|
49
|
-
}
|
|
50
|
-
measureLayoutPosition(triggerRef.current, layout => {
|
|
51
|
-
setTriggerPosition(layout);
|
|
52
|
-
setSearchQuery("");
|
|
53
|
-
setIsPickerOpen(true);
|
|
54
|
-
});
|
|
55
|
-
};
|
|
56
|
-
const closePicker = () => {
|
|
57
|
-
setIsPickerOpen(false);
|
|
58
|
-
setSearchQuery("");
|
|
59
|
-
};
|
|
60
|
-
const selectCountry = country => {
|
|
61
|
-
phoneMask.setCountry(country.code);
|
|
62
|
-
closePicker();
|
|
63
|
-
};
|
|
64
|
-
const filteredCountries = searchQuery ? phoneMask.countries.filter(c => c.name.toLowerCase().includes(searchQuery.toLowerCase())) : phoneMask.countries;
|
|
65
|
-
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
66
|
-
children: [/*#__PURE__*/_jsxs(View, {
|
|
67
|
-
ref: triggerRef,
|
|
68
|
-
style: rootStyles,
|
|
69
|
-
children: [/*#__PURE__*/_jsx(Pressable, {
|
|
70
|
-
onPress: openPicker,
|
|
71
|
-
disabled: isDisabled,
|
|
72
|
-
style: countryButtonStyles,
|
|
73
|
-
children: /*#__PURE__*/_jsxs(Text, {
|
|
74
|
-
style: countryButtonTextStyles,
|
|
75
|
-
children: [phoneMask.country.flag, " +", phoneMask.country.dialCode]
|
|
76
|
-
})
|
|
77
|
-
}), /*#__PURE__*/_jsx(View, {
|
|
78
|
-
style: separatorStyles
|
|
79
|
-
}), /*#__PURE__*/_jsx(TextInput, {
|
|
80
|
-
value: phoneMask.displayValue,
|
|
81
|
-
onChangeText: phoneMask.onChangeText,
|
|
82
|
-
keyboardType: phoneMask.keyboardType,
|
|
83
|
-
placeholder: placeholder,
|
|
84
|
-
placeholderTextColor: StyleSheet.flatten(variantStyles.countryButtonText?.disabled)?.color,
|
|
85
|
-
readOnly: isDisabled,
|
|
86
|
-
onFocus: () => setIsFocused(true),
|
|
87
|
-
onBlur: () => setIsFocused(false),
|
|
88
|
-
style: inputStyles
|
|
89
|
-
})]
|
|
90
|
-
}), isPickerOpen && /*#__PURE__*/_jsx(CountryPicker, {
|
|
91
|
-
countries: filteredCountries,
|
|
92
|
-
selectedCode: phoneMask.country.code,
|
|
93
|
-
searchQuery: searchQuery,
|
|
94
|
-
onSearchChange: setSearchQuery,
|
|
95
|
-
onSelect: selectCountry,
|
|
96
|
-
onClose: closePicker,
|
|
97
|
-
triggerPosition: triggerPosition,
|
|
98
|
-
contentLayout: contentLayout,
|
|
99
|
-
onContentLayout: setContentLayout,
|
|
100
|
-
variantStyles: variantStyles,
|
|
101
|
-
state: state
|
|
102
|
-
})]
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
function CountryPicker({
|
|
106
|
-
countries,
|
|
107
|
-
selectedCode,
|
|
108
|
-
searchQuery,
|
|
109
|
-
onSearchChange,
|
|
110
|
-
onSelect,
|
|
111
|
-
onClose,
|
|
112
|
-
triggerPosition,
|
|
113
|
-
contentLayout,
|
|
114
|
-
onContentLayout,
|
|
115
|
-
variantStyles,
|
|
116
|
-
state
|
|
117
|
-
}) {
|
|
118
|
-
const positionStyle = useRelativePosition({
|
|
119
|
-
align: "start",
|
|
120
|
-
triggerPosition,
|
|
121
|
-
contentLayout,
|
|
122
|
-
alignOffset: 0,
|
|
123
|
-
preferredSide: "bottom",
|
|
124
|
-
sideOffset: 4
|
|
125
|
-
});
|
|
126
|
-
const overlayStyles = StyleSheet.flatten([variantStyles.pickerOverlay?.default, variantStyles.pickerOverlay?.[state]]);
|
|
127
|
-
const contentStyles = StyleSheet.flatten([variantStyles.pickerContent?.default, variantStyles.pickerContent?.[state]]);
|
|
128
|
-
const searchStyles = StyleSheet.flatten([variantStyles.pickerSearch?.default, variantStyles.pickerSearch?.[state]]);
|
|
129
|
-
return /*#__PURE__*/_jsxs(Portal, {
|
|
130
|
-
name: "phone-input-country-picker",
|
|
131
|
-
children: [/*#__PURE__*/_jsx(Pressable, {
|
|
132
|
-
onPress: onClose,
|
|
133
|
-
style: [StyleSheet.absoluteFill, overlayStyles]
|
|
134
|
-
}), /*#__PURE__*/_jsxs(View, {
|
|
135
|
-
style: [positionStyle, contentStyles, {
|
|
136
|
-
width: triggerPosition.width
|
|
137
|
-
}],
|
|
138
|
-
onLayout: e => onContentLayout(e.nativeEvent.layout),
|
|
139
|
-
pointerEvents: "box-none",
|
|
140
|
-
children: [/*#__PURE__*/_jsx(TextInput, {
|
|
141
|
-
value: searchQuery,
|
|
142
|
-
onChangeText: onSearchChange,
|
|
143
|
-
placeholder: "Search countries...",
|
|
144
|
-
autoFocus: true,
|
|
145
|
-
style: searchStyles
|
|
146
|
-
}), /*#__PURE__*/_jsx(ScrollView, {
|
|
147
|
-
keyboardShouldPersistTaps: "handled",
|
|
148
|
-
children: countries.map(country => {
|
|
149
|
-
const isSelected = country.code === selectedCode;
|
|
150
|
-
const optionStyles = StyleSheet.flatten([variantStyles.pickerOption?.default, isSelected && variantStyles.pickerOption?.selected]);
|
|
151
|
-
const optionTextStyles = StyleSheet.flatten([variantStyles.pickerOptionText?.default, isSelected && variantStyles.pickerOptionText?.selected]);
|
|
152
|
-
return /*#__PURE__*/_jsx(Pressable, {
|
|
153
|
-
onPress: () => onSelect(country),
|
|
154
|
-
style: optionStyles,
|
|
155
|
-
children: /*#__PURE__*/_jsxs(Text, {
|
|
156
|
-
style: optionTextStyles,
|
|
157
|
-
children: [country.flag, " ", country.name, " +", country.dialCode]
|
|
158
|
-
})
|
|
159
|
-
}, country.code);
|
|
160
|
-
})
|
|
161
|
-
})]
|
|
162
|
-
})]
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
//# sourceMappingURL=phone-input.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["usePhoneMask","DEFAULT_LAYOUT","DEFAULT_POSITION","useRelativePosition","measureLayoutPosition","React","useRef","useState","Keyboard","Platform","Pressable","ScrollView","StyleSheet","Text","TextInput","View","Portal","PhoneInputVariants","jsxs","_jsxs","jsx","_jsx","Fragment","_Fragment","calculateState","isDisabled","isFocused","PhoneInput","value","onChange","defaultCountry","countries","placeholder","variant","style","variantStyles","setIsFocused","isPickerOpen","setIsPickerOpen","searchQuery","setSearchQuery","triggerPosition","setTriggerPosition","contentLayout","setContentLayout","triggerRef","state","phoneMask","rootStyles","flatten","root","default","countryButtonStyles","countryButton","countryButtonTextStyles","countryButtonText","separatorStyles","separator","inputStyles","input","openPicker","OS","dismiss","current","layout","closePicker","selectCountry","country","setCountry","code","filteredCountries","filter","c","name","toLowerCase","includes","children","ref","onPress","disabled","flag","dialCode","displayValue","onChangeText","keyboardType","placeholderTextColor","color","readOnly","onFocus","onBlur","CountryPicker","selectedCode","onSearchChange","onSelect","onClose","onContentLayout","positionStyle","align","alignOffset","preferredSide","sideOffset","overlayStyles","pickerOverlay","contentStyles","pickerContent","searchStyles","pickerSearch","absoluteFill","width","onLayout","e","nativeEvent","pointerEvents","autoFocus","keyboardShouldPersistTaps","map","isSelected","optionStyles","pickerOption","selected","optionTextStyles","pickerOptionText"],"sourceRoot":"../../../../src","sources":["components/phone-input/phone-input.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { CountryData } from "../../data/countries";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { type StyleProp, type ViewStyle } from "react-native";
|
|
4
|
-
import { PhoneInputVariants } from "./variants";
|
|
5
|
-
export interface PhoneInputProps {
|
|
6
|
-
value?: string;
|
|
7
|
-
onChange?: (value: string) => void;
|
|
8
|
-
defaultCountry?: string;
|
|
9
|
-
countries?: CountryData[];
|
|
10
|
-
placeholder?: string;
|
|
11
|
-
isDisabled?: boolean;
|
|
12
|
-
variant?: keyof typeof PhoneInputVariants;
|
|
13
|
-
style?: StyleProp<ViewStyle>;
|
|
14
|
-
}
|
|
15
|
-
export declare function PhoneInput({ value, onChange, defaultCountry, countries, placeholder, isDisabled, variant, style, }: PhoneInputProps): React.JSX.Element;
|
|
16
|
-
//# sourceMappingURL=phone-input.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"phone-input.d.ts","sourceRoot":"","sources":["../../../../../src/components/phone-input/phone-input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAKxD,OAAO,KAA2B,MAAM,OAAO,CAAC;AAChD,OAAO,EAML,KAAK,SAAS,EAKd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,kBAAkB,CAAC;IAC1C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAQD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,cAAqB,EACrB,SAAS,EACT,WAAW,EACX,UAAkB,EAClB,OAAmB,EACnB,KAAK,GACN,EAAE,eAAe,qBAyFjB"}
|
package/scripts/build.sh
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import type { CountryData } from "../../data/countries";
|
|
2
|
-
import { usePhoneMask } from "../../hooks/use-phone-mask";
|
|
3
|
-
import { DEFAULT_LAYOUT, DEFAULT_POSITION, type LayoutPosition, useRelativePosition } from "../../hooks/use-relative-position";
|
|
4
|
-
import type { ViewRef } from "../../types/element.types";
|
|
5
|
-
import { measureLayoutPosition } from "../../utils/normalize-layout";
|
|
6
|
-
import React, { useRef, useState } from "react";
|
|
7
|
-
import {
|
|
8
|
-
Keyboard,
|
|
9
|
-
type LayoutRectangle,
|
|
10
|
-
Platform,
|
|
11
|
-
Pressable,
|
|
12
|
-
ScrollView,
|
|
13
|
-
type StyleProp,
|
|
14
|
-
StyleSheet,
|
|
15
|
-
Text,
|
|
16
|
-
TextInput,
|
|
17
|
-
View,
|
|
18
|
-
type ViewStyle,
|
|
19
|
-
} from "react-native";
|
|
20
|
-
import { Portal } from "../portal";
|
|
21
|
-
import type { PhoneInputState } from "./types";
|
|
22
|
-
import { PhoneInputVariants } from "./variants";
|
|
23
|
-
|
|
24
|
-
export interface PhoneInputProps {
|
|
25
|
-
value?: string;
|
|
26
|
-
onChange?: (value: string) => void;
|
|
27
|
-
defaultCountry?: string;
|
|
28
|
-
countries?: CountryData[];
|
|
29
|
-
placeholder?: string;
|
|
30
|
-
isDisabled?: boolean;
|
|
31
|
-
variant?: keyof typeof PhoneInputVariants;
|
|
32
|
-
style?: StyleProp<ViewStyle>;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const calculateState = (isDisabled: boolean, isFocused: boolean): PhoneInputState => {
|
|
36
|
-
if (isDisabled) return "disabled";
|
|
37
|
-
if (isFocused) return "focused";
|
|
38
|
-
return "default";
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export function PhoneInput({
|
|
42
|
-
value,
|
|
43
|
-
onChange,
|
|
44
|
-
defaultCountry = "US",
|
|
45
|
-
countries,
|
|
46
|
-
placeholder,
|
|
47
|
-
isDisabled = false,
|
|
48
|
-
variant = "default",
|
|
49
|
-
style,
|
|
50
|
-
}: PhoneInputProps) {
|
|
51
|
-
const variantStyles = PhoneInputVariants[variant]();
|
|
52
|
-
const [isFocused, setIsFocused] = useState(false);
|
|
53
|
-
const [isPickerOpen, setIsPickerOpen] = useState(false);
|
|
54
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
55
|
-
const [triggerPosition, setTriggerPosition] = useState<LayoutPosition>(DEFAULT_POSITION);
|
|
56
|
-
const [contentLayout, setContentLayout] = useState<LayoutRectangle>(DEFAULT_LAYOUT);
|
|
57
|
-
const triggerRef = useRef<ViewRef>(null);
|
|
58
|
-
|
|
59
|
-
const state = calculateState(isDisabled, isFocused);
|
|
60
|
-
|
|
61
|
-
const phoneMask = usePhoneMask({
|
|
62
|
-
value,
|
|
63
|
-
defaultCountry,
|
|
64
|
-
onChange,
|
|
65
|
-
countries,
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const rootStyles = StyleSheet.flatten([variantStyles.root?.default, variantStyles.root?.[state], style]);
|
|
69
|
-
const countryButtonStyles = StyleSheet.flatten([variantStyles.countryButton?.default, variantStyles.countryButton?.[state]]);
|
|
70
|
-
const countryButtonTextStyles = StyleSheet.flatten([variantStyles.countryButtonText?.default, variantStyles.countryButtonText?.[state]]);
|
|
71
|
-
const separatorStyles = StyleSheet.flatten([variantStyles.separator?.default, variantStyles.separator?.[state]]);
|
|
72
|
-
const inputStyles = StyleSheet.flatten([variantStyles.input?.default, variantStyles.input?.[state]]);
|
|
73
|
-
|
|
74
|
-
const openPicker = () => {
|
|
75
|
-
if (isDisabled) return;
|
|
76
|
-
if (Platform.OS !== "web") {
|
|
77
|
-
Keyboard.dismiss();
|
|
78
|
-
}
|
|
79
|
-
measureLayoutPosition(triggerRef.current, (layout) => {
|
|
80
|
-
setTriggerPosition(layout);
|
|
81
|
-
setSearchQuery("");
|
|
82
|
-
setIsPickerOpen(true);
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const closePicker = () => {
|
|
87
|
-
setIsPickerOpen(false);
|
|
88
|
-
setSearchQuery("");
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
const selectCountry = (country: CountryData) => {
|
|
92
|
-
phoneMask.setCountry(country.code);
|
|
93
|
-
closePicker();
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const filteredCountries = searchQuery
|
|
97
|
-
? phoneMask.countries.filter((c) => c.name.toLowerCase().includes(searchQuery.toLowerCase()))
|
|
98
|
-
: phoneMask.countries;
|
|
99
|
-
|
|
100
|
-
return (
|
|
101
|
-
<>
|
|
102
|
-
<View ref={triggerRef} style={rootStyles}>
|
|
103
|
-
<Pressable onPress={openPicker} disabled={isDisabled} style={countryButtonStyles}>
|
|
104
|
-
<Text style={countryButtonTextStyles}>
|
|
105
|
-
{phoneMask.country.flag} +{phoneMask.country.dialCode}
|
|
106
|
-
</Text>
|
|
107
|
-
</Pressable>
|
|
108
|
-
<View style={separatorStyles} />
|
|
109
|
-
<TextInput
|
|
110
|
-
value={phoneMask.displayValue}
|
|
111
|
-
onChangeText={phoneMask.onChangeText}
|
|
112
|
-
keyboardType={phoneMask.keyboardType}
|
|
113
|
-
placeholder={placeholder}
|
|
114
|
-
placeholderTextColor={StyleSheet.flatten(variantStyles.countryButtonText?.disabled)?.color}
|
|
115
|
-
readOnly={isDisabled}
|
|
116
|
-
onFocus={() => setIsFocused(true)}
|
|
117
|
-
onBlur={() => setIsFocused(false)}
|
|
118
|
-
style={inputStyles}
|
|
119
|
-
/>
|
|
120
|
-
</View>
|
|
121
|
-
|
|
122
|
-
{isPickerOpen && (
|
|
123
|
-
<CountryPicker
|
|
124
|
-
countries={filteredCountries}
|
|
125
|
-
selectedCode={phoneMask.country.code}
|
|
126
|
-
searchQuery={searchQuery}
|
|
127
|
-
onSearchChange={setSearchQuery}
|
|
128
|
-
onSelect={selectCountry}
|
|
129
|
-
onClose={closePicker}
|
|
130
|
-
triggerPosition={triggerPosition}
|
|
131
|
-
contentLayout={contentLayout}
|
|
132
|
-
onContentLayout={setContentLayout}
|
|
133
|
-
variantStyles={variantStyles}
|
|
134
|
-
state={state}
|
|
135
|
-
/>
|
|
136
|
-
)}
|
|
137
|
-
</>
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
interface CountryPickerProps {
|
|
142
|
-
countries: CountryData[];
|
|
143
|
-
selectedCode: string;
|
|
144
|
-
searchQuery: string;
|
|
145
|
-
onSearchChange: (query: string) => void;
|
|
146
|
-
onSelect: (country: CountryData) => void;
|
|
147
|
-
onClose: () => void;
|
|
148
|
-
triggerPosition: LayoutPosition;
|
|
149
|
-
contentLayout: LayoutRectangle;
|
|
150
|
-
onContentLayout: (layout: LayoutRectangle) => void;
|
|
151
|
-
variantStyles: ReturnType<(typeof PhoneInputVariants)["default"]>;
|
|
152
|
-
state: PhoneInputState;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function CountryPicker({
|
|
156
|
-
countries,
|
|
157
|
-
selectedCode,
|
|
158
|
-
searchQuery,
|
|
159
|
-
onSearchChange,
|
|
160
|
-
onSelect,
|
|
161
|
-
onClose,
|
|
162
|
-
triggerPosition,
|
|
163
|
-
contentLayout,
|
|
164
|
-
onContentLayout,
|
|
165
|
-
variantStyles,
|
|
166
|
-
state,
|
|
167
|
-
}: CountryPickerProps) {
|
|
168
|
-
const positionStyle = useRelativePosition({
|
|
169
|
-
align: "start",
|
|
170
|
-
triggerPosition,
|
|
171
|
-
contentLayout,
|
|
172
|
-
alignOffset: 0,
|
|
173
|
-
preferredSide: "bottom",
|
|
174
|
-
sideOffset: 4,
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
const overlayStyles = StyleSheet.flatten([variantStyles.pickerOverlay?.default, variantStyles.pickerOverlay?.[state]]);
|
|
178
|
-
const contentStyles = StyleSheet.flatten([variantStyles.pickerContent?.default, variantStyles.pickerContent?.[state]]);
|
|
179
|
-
const searchStyles = StyleSheet.flatten([variantStyles.pickerSearch?.default, variantStyles.pickerSearch?.[state]]);
|
|
180
|
-
|
|
181
|
-
return (
|
|
182
|
-
<Portal name="phone-input-country-picker">
|
|
183
|
-
<Pressable onPress={onClose} style={[StyleSheet.absoluteFill, overlayStyles]} />
|
|
184
|
-
<View
|
|
185
|
-
style={[positionStyle, contentStyles, { width: triggerPosition.width }]}
|
|
186
|
-
onLayout={(e) => onContentLayout(e.nativeEvent.layout)}
|
|
187
|
-
pointerEvents="box-none"
|
|
188
|
-
>
|
|
189
|
-
<TextInput
|
|
190
|
-
value={searchQuery}
|
|
191
|
-
onChangeText={onSearchChange}
|
|
192
|
-
placeholder="Search countries..."
|
|
193
|
-
autoFocus
|
|
194
|
-
style={searchStyles}
|
|
195
|
-
/>
|
|
196
|
-
<ScrollView keyboardShouldPersistTaps="handled">
|
|
197
|
-
{countries.map((country) => {
|
|
198
|
-
const isSelected = country.code === selectedCode;
|
|
199
|
-
const optionStyles = StyleSheet.flatten([
|
|
200
|
-
variantStyles.pickerOption?.default,
|
|
201
|
-
isSelected && variantStyles.pickerOption?.selected,
|
|
202
|
-
]);
|
|
203
|
-
const optionTextStyles = StyleSheet.flatten([
|
|
204
|
-
variantStyles.pickerOptionText?.default,
|
|
205
|
-
isSelected && variantStyles.pickerOptionText?.selected,
|
|
206
|
-
]);
|
|
207
|
-
|
|
208
|
-
return (
|
|
209
|
-
<Pressable key={country.code} onPress={() => onSelect(country)} style={optionStyles}>
|
|
210
|
-
<Text style={optionTextStyles}>
|
|
211
|
-
{country.flag} {country.name} +{country.dialCode}
|
|
212
|
-
</Text>
|
|
213
|
-
</Pressable>
|
|
214
|
-
);
|
|
215
|
-
})}
|
|
216
|
-
</ScrollView>
|
|
217
|
-
</View>
|
|
218
|
-
</Portal>
|
|
219
|
-
);
|
|
220
|
-
}
|