@hoddy-ui/core 1.0.88 → 1.0.90

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.
@@ -0,0 +1,2143 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // index.ts
31
+ var next_exports = {};
32
+ __export(next_exports, {
33
+ AdaptiveStatusBar: () => AdaptiveStatusBarNext_default,
34
+ AlertX: () => AlertX_default,
35
+ Avatar: () => Avatar_default,
36
+ Button: () => Button_default,
37
+ CheckBox: () => CheckBox,
38
+ Divider: () => Divider,
39
+ FormWrapper: () => FormWrapper,
40
+ Grid: () => Grid,
41
+ GridItem: () => GridItem,
42
+ IconButton: () => IconButton,
43
+ LinkButton: () => LinkButton,
44
+ Locator: () => Locator,
45
+ OTPInput: () => OTPInput,
46
+ Popup: () => Popup,
47
+ RatingInput: () => RatingInput,
48
+ RatingStars: () => RatingStars,
49
+ SafeAreaView: () => SafeAreaView,
50
+ SelectMenu: () => SelectMenu_default,
51
+ Spinner: () => Spinner_default,
52
+ TextField: () => TextField_default,
53
+ TextField2: () => TextField2,
54
+ Typography: () => Typography_default,
55
+ UIThemeContext: () => UIThemeContext,
56
+ UIThemeProvider: () => UIThemeProvider,
57
+ default: () => next_default,
58
+ getPredictionsFromCoords: () => getPredictionsFromCoords,
59
+ showFlashMessage: () => showFlashMessage,
60
+ useColors: () => useColors,
61
+ useNavScreenOptions: () => useNavScreenOptions,
62
+ useTheme: () => useTheme
63
+ });
64
+ module.exports = __toCommonJS(next_exports);
65
+
66
+ // ../src/theme/colors.ts
67
+ var extraColors = {};
68
+ var setExtraColors = (c) => extraColors = c;
69
+ function colors(theme) {
70
+ const lightColors = {
71
+ white: {
72
+ 1: "#fff",
73
+ 2: "#f7f7f7",
74
+ 3: "#eee",
75
+ 4: "#ddd",
76
+ 5: "#bbb"
77
+ },
78
+ black: {
79
+ 1: "#888",
80
+ 2: "#777",
81
+ 3: "#555",
82
+ 4: "#333",
83
+ 5: "#000"
84
+ }
85
+ };
86
+ const darkColors = {
87
+ black: {
88
+ 1: "#fff",
89
+ 2: "#f7f7f7",
90
+ 3: "#eee",
91
+ 4: "#ddd",
92
+ 5: "#aaa"
93
+ },
94
+ white: {
95
+ 1: "#000",
96
+ 2: "#222",
97
+ 3: "#333",
98
+ 4: "#444",
99
+ 5: "#555"
100
+ },
101
+ dark: {
102
+ main: "#f2f3f4",
103
+ light: "#fff",
104
+ dark: "#ddd",
105
+ text: "#000",
106
+ ...extraColors?.dark?.dark
107
+ },
108
+ light: {
109
+ main: "#111",
110
+ light: "#555",
111
+ dark: "#333",
112
+ text: "#fff",
113
+ ...extraColors?.dark?.light
114
+ },
115
+ textSecondary: {
116
+ main: "#666",
117
+ light: "#777",
118
+ dark: "#444",
119
+ text: "#fff",
120
+ ...extraColors?.dark?.textSecondary
121
+ },
122
+ primary: {
123
+ main: "#f80",
124
+ light: "#FEFFD3",
125
+ dark: "#fa0",
126
+ text: "#fff",
127
+ ...extraColors?.light?.primary,
128
+ ...extraColors?.dark?.primary
129
+ }
130
+ };
131
+ const dynamicColors = theme === "dark" ? darkColors : lightColors;
132
+ return {
133
+ ...extraColors[theme],
134
+ primary: {
135
+ main: "#f80",
136
+ light: "#FEFFD3",
137
+ dark: "#fa0",
138
+ text: "#fff",
139
+ ...extraColors?.light?.primary
140
+ },
141
+ secondary: {
142
+ main: "#f11",
143
+ light: "#f43",
144
+ dark: "#d00",
145
+ text: "#fff",
146
+ ...extraColors?.light?.secondary
147
+ },
148
+ light: {
149
+ main: "#fff",
150
+ light: "#fff",
151
+ dark: "#ddd",
152
+ text: "#000",
153
+ ...extraColors?.light?.light
154
+ },
155
+ dark: {
156
+ main: "#000",
157
+ light: "#777",
158
+ dark: "#111",
159
+ text: "#fff",
160
+ ...extraColors?.light?.dark
161
+ },
162
+ textSecondary: {
163
+ main: "#aaa",
164
+ light: "#bbb",
165
+ dark: "#777",
166
+ text: "#123",
167
+ ...extraColors?.light?.textSecondary
168
+ },
169
+ blue: {
170
+ main: "#09F",
171
+ light: "#39f",
172
+ dark: "#028",
173
+ text: "#fff",
174
+ ...extraColors?.light?.blue
175
+ },
176
+ info: {
177
+ main: "#09f",
178
+ light: "#3af",
179
+ dark: "#08a",
180
+ text: "#fff",
181
+ ...extraColors?.light?.info
182
+ },
183
+ success: {
184
+ main: "#0a4",
185
+ text: "#fff",
186
+ light: "#5c3",
187
+ dark: "#062",
188
+ ...extraColors?.light?.success
189
+ },
190
+ warning: {
191
+ main: "#fa2",
192
+ light: "#fc7",
193
+ dark: "#f90",
194
+ text: "#fff",
195
+ ...extraColors?.light?.warning
196
+ },
197
+ error: {
198
+ main: "#D22",
199
+ text: "#fff",
200
+ light: "#f43",
201
+ dark: "#a20",
202
+ ...extraColors?.light?.error
203
+ },
204
+ ...dynamicColors
205
+ };
206
+ }
207
+
208
+ // ../src/config/KeyManager.ts
209
+ var config = {
210
+ GOOGLE_MAP_API_KEY: ""
211
+ };
212
+ function setConfig(key) {
213
+ config = key;
214
+ }
215
+ function getConfig() {
216
+ return config;
217
+ }
218
+
219
+ // ../src/config/index.ts
220
+ function initialize(config2) {
221
+ try {
222
+ setConfig({
223
+ GOOGLE_MAP_API_KEY: config2.googleMapApiKey,
224
+ DEFAULT_FONT_FAMILY: config2.fontFamily
225
+ });
226
+ if (config2.colors)
227
+ setExtraColors(config2.colors);
228
+ } catch (error) {
229
+ console.error("Error reading the config file:", error);
230
+ }
231
+ }
232
+
233
+ // components/AdaptiveStatusBarNext.tsx
234
+ var import_expo_router = require("expo-router");
235
+ var import_react5 = __toESM(require("react"));
236
+ var import_react_native5 = require("react-native");
237
+
238
+ // ../src/hooks.ts
239
+ var import_react4 = require("react");
240
+ var import_react_native4 = require("react-native");
241
+ var import_react_native_size_matters3 = require("react-native-size-matters");
242
+
243
+ // ../src/theme/index.tsx
244
+ var import_async_storage = __toESM(require("@react-native-async-storage/async-storage"));
245
+ var NavigationBar = __toESM(require("expo-navigation-bar"));
246
+ var SystemUI = __toESM(require("expo-system-ui"));
247
+ var import_react3 = __toESM(require("react"));
248
+ var import_react_native3 = require("react-native");
249
+
250
+ // ../src/Components/FlashMessage.tsx
251
+ var import_react2 = __toESM(require("react"));
252
+ var import_react_native2 = require("react-native");
253
+ var import_react_native_safe_area_context = require("react-native-safe-area-context");
254
+ var import_react_native_size_matters2 = require("react-native-size-matters");
255
+
256
+ // ../src/Components/Typography.tsx
257
+ var import_react = __toESM(require("react"));
258
+ var import_react_native = require("react-native");
259
+ var import_react_native_size_matters = require("react-native-size-matters");
260
+ var Typography = (0, import_react.forwardRef)(
261
+ ({
262
+ children,
263
+ color = "dark",
264
+ style = {},
265
+ textCase = null,
266
+ variant = "body1",
267
+ align = "left",
268
+ gutterBottom = 0,
269
+ numberOfLines,
270
+ adjustsFontSizeToFit,
271
+ fontWeight = 400,
272
+ fontFamily,
273
+ // NEW PROP ADDED
274
+ ...props
275
+ }, ref) => {
276
+ const colors2 = useColors();
277
+ const fontSize = {
278
+ h1: (0, import_react_native_size_matters.moderateScale)(42),
279
+ h2: (0, import_react_native_size_matters.moderateScale)(37),
280
+ h3: (0, import_react_native_size_matters.moderateScale)(32),
281
+ h4: (0, import_react_native_size_matters.moderateScale)(27),
282
+ h5: (0, import_react_native_size_matters.moderateScale)(22),
283
+ h6: (0, import_react_native_size_matters.moderateScale)(17),
284
+ body1: (0, import_react_native_size_matters.moderateScale)(15),
285
+ body2: (0, import_react_native_size_matters.moderateScale)(12),
286
+ caption: (0, import_react_native_size_matters.moderateScale)(10)
287
+ };
288
+ const styles2 = import_react_native.StyleSheet.create({
289
+ text: {
290
+ fontSize: fontSize[variant],
291
+ marginBottom: (0, import_react_native_size_matters.verticalScale)(gutterBottom) || 0,
292
+ color: colors2[color]?.main || color,
293
+ textTransform: textCase,
294
+ alignItems: "center",
295
+ textAlign: align,
296
+ fontWeight: fontWeight.toString(),
297
+ fontFamily: fontFamily || getConfig().DEFAULT_FONT_FAMILY || "System"
298
+ // Use custom font if provided, else default
299
+ }
300
+ });
301
+ return /* @__PURE__ */ import_react.default.createElement(
302
+ import_react_native.Text,
303
+ {
304
+ ref,
305
+ numberOfLines,
306
+ adjustsFontSizeToFit,
307
+ style: [styles2.text, style],
308
+ ...props
309
+ },
310
+ children
311
+ );
312
+ }
313
+ );
314
+ var Typography_default = Typography;
315
+
316
+ // ../src/Components/FlashMessage.tsx
317
+ var showFlashMessage = () => {
318
+ };
319
+ var FlashMessage = () => {
320
+ const { top } = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
321
+ const [message, setMessage] = (0, import_react2.useState)(null);
322
+ const [show, setShow] = (0, import_react2.useState)(false);
323
+ const colors2 = useColors();
324
+ const type = message?.type || "success";
325
+ showFlashMessage = (msg) => {
326
+ setMessage(msg);
327
+ setTimeout(() => {
328
+ setShow(true);
329
+ }, 50);
330
+ setTimeout(() => {
331
+ setShow(false);
332
+ setTimeout(() => {
333
+ setMessage(null);
334
+ }, 500);
335
+ }, msg.duration || 3e3);
336
+ };
337
+ (0, import_react2.useEffect)(() => {
338
+ import_react_native2.LayoutAnimation.configureNext(import_react_native2.LayoutAnimation.Presets.easeInEaseOut);
339
+ }, [show]);
340
+ const styles2 = import_react_native_size_matters2.ScaledSheet.create({
341
+ root: {
342
+ position: "absolute",
343
+ top: show ? 0 : -200,
344
+ zIndex: 1e3,
345
+ left: 0,
346
+ paddingTop: top + 10,
347
+ paddingHorizontal: "15@ms",
348
+ backgroundColor: colors2[type].main,
349
+ width: "100%",
350
+ borderBottomLeftRadius: 10,
351
+ borderBottomRightRadius: 10,
352
+ paddingBottom: "15@ms"
353
+ },
354
+ action: {
355
+ borderRadius: 20,
356
+ marginTop: "10@vs",
357
+ flexDirection: "row",
358
+ justifyContent: "center",
359
+ paddingHorizontal: "20@ms",
360
+ paddingVertical: "8@vs",
361
+ backgroundColor: "#fff3"
362
+ }
363
+ });
364
+ return /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: styles2.root }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: { flexDirection: "row" } }, /* @__PURE__ */ import_react2.default.createElement(import_react_native2.View, { style: { flex: 1, marginRight: 10 } }, message?.title && /* @__PURE__ */ import_react2.default.createElement(
365
+ Typography_default,
366
+ {
367
+ variant: "h6",
368
+ fontWeight: 600,
369
+ gutterBottom: 3,
370
+ style: { color: "#fff" }
371
+ },
372
+ message?.title
373
+ ), /* @__PURE__ */ import_react2.default.createElement(Typography_default, { style: { color: "#fff" } }, message?.message))), message?.actions?.map((cur, i) => /* @__PURE__ */ import_react2.default.createElement(import_react_native2.TouchableOpacity, { key: i, style: styles2.action, onPress: cur.onPress }, /* @__PURE__ */ import_react2.default.createElement(Typography_default, { fontWeight: 700, style: { color: "#fff" } }, cur.title))));
374
+ };
375
+ var FlashMessage_default = FlashMessage;
376
+
377
+ // ../src/theme/index.tsx
378
+ var import_react_native_safe_area_context2 = require("react-native-safe-area-context");
379
+ var UIThemeContext = (0, import_react3.createContext)({
380
+ themeState: { mode: "default", value: "light" }
381
+ });
382
+ function themeReducer(state, { type, payload }) {
383
+ if (payload === "dark" || type === "dark") {
384
+ SystemUI.setBackgroundColorAsync("#000000");
385
+ if (import_react_native3.Platform.OS === "android") {
386
+ NavigationBar.setButtonStyleAsync("light");
387
+ NavigationBar.setBackgroundColorAsync("#000000");
388
+ }
389
+ } else {
390
+ SystemUI.setBackgroundColorAsync("#ffffff");
391
+ if (import_react_native3.Platform.OS === "android") {
392
+ NavigationBar.setButtonStyleAsync("dark");
393
+ NavigationBar.setBackgroundColorAsync("#fff");
394
+ }
395
+ }
396
+ switch (type) {
397
+ case "dark":
398
+ return { mode: "dark", value: "dark" };
399
+ case "default":
400
+ return { mode: "default", value: payload };
401
+ case "light":
402
+ return { mode: "light", value: "light" };
403
+ default:
404
+ return state;
405
+ }
406
+ }
407
+ var UIThemeProvider = ({ children }) => {
408
+ const [themeState, themeDispatch] = (0, import_react3.useReducer)(themeReducer, {
409
+ mode: "default",
410
+ value: "light"
411
+ });
412
+ const colorScheme = (0, import_react_native3.useColorScheme)();
413
+ import_react3.default.useEffect(() => {
414
+ import_async_storage.default.getItem("theme").then((val) => {
415
+ if (val) {
416
+ if (val === "default") {
417
+ themeDispatch({
418
+ type: "default",
419
+ payload: colorScheme
420
+ });
421
+ } else
422
+ themeDispatch({
423
+ type: val
424
+ });
425
+ } else {
426
+ themeDispatch({
427
+ type: "default",
428
+ payload: colorScheme
429
+ });
430
+ }
431
+ });
432
+ }, [colorScheme]);
433
+ return /* @__PURE__ */ import_react3.default.createElement(import_react_native_safe_area_context2.SafeAreaProvider, null, /* @__PURE__ */ import_react3.default.createElement(
434
+ UIThemeContext.Provider,
435
+ {
436
+ value: {
437
+ themeState,
438
+ themeDispatch
439
+ }
440
+ },
441
+ children,
442
+ /* @__PURE__ */ import_react3.default.createElement(FlashMessage_default, null)
443
+ ));
444
+ };
445
+
446
+ // ../src/hooks.ts
447
+ var useColors = () => {
448
+ const { themeState } = (0, import_react4.useContext)(UIThemeContext);
449
+ return colors(themeState.value);
450
+ };
451
+ var useTheme = () => {
452
+ const { themeState } = (0, import_react4.useContext)(UIThemeContext);
453
+ return themeState.value;
454
+ };
455
+ var useNavScreenOptions = (type) => {
456
+ const colors2 = useColors();
457
+ const options = {
458
+ stack: {
459
+ headerShown: false,
460
+ headerStyle: {
461
+ backgroundColor: colors2.white[1]
462
+ },
463
+ headerShadowVisible: false,
464
+ contentStyle: {
465
+ backgroundColor: colors2.white[1]
466
+ },
467
+ headerTitleStyle: {
468
+ color: colors2.black[1]
469
+ },
470
+ headerTintColor: import_react_native4.Platform.OS === "android" ? colors2.black[1] : colors2.blue.light
471
+ },
472
+ tab: {
473
+ headerShown: false,
474
+ headerTintColor: colors2.dark.main,
475
+ tabBarStyle: {
476
+ borderTopColor: colors2.white[3],
477
+ borderTopWidth: 1,
478
+ // shadowColor: "#000",
479
+ // shadowOffset: { height: -3, width: 0 },
480
+ // shadowRadius: 7,
481
+ // shadowOpacity: 0.1,
482
+ backgroundColor: colors2.white[1]
483
+ },
484
+ tabBarActiveTintColor: colors2.blue.main,
485
+ tabBarInactiveTintColor: colors2.textSecondary.main,
486
+ tabBarLabelStyle: {
487
+ // fontSize: ms(12),
488
+ }
489
+ },
490
+ drawer: {
491
+ headerShown: false,
492
+ drawerActiveTintColor: colors2.primary.main,
493
+ drawerInactiveTintColor: colors2.textSecondary.main,
494
+ sceneContainerStyle: {
495
+ backgroundColor: colors2.white[2]
496
+ },
497
+ drawerStyle: {
498
+ backgroundColor: colors2.white[1]
499
+ },
500
+ headerStyle: {
501
+ backgroundColor: colors2.white[1]
502
+ },
503
+ headerTitleStyle: {
504
+ color: colors2.dark.main
505
+ }
506
+ }
507
+ };
508
+ if (import_react_native4.Platform.OS === "android") {
509
+ options.tab.tabBarStyle.height = import_react_native4.Dimensions.get("screen").height * 0.08;
510
+ options.tab.tabBarStyle.paddingBottom = (0, import_react_native_size_matters3.vs)(15);
511
+ }
512
+ return options[type];
513
+ };
514
+
515
+ // components/AdaptiveStatusBarNext.tsx
516
+ var AdaptiveStatusBar = ({ translucent = false }) => {
517
+ const [focused, setFocused] = (0, import_react5.useState)(false);
518
+ const colors2 = useColors();
519
+ const theme = useTheme();
520
+ (0, import_expo_router.useFocusEffect)(
521
+ import_react5.default.useCallback(() => {
522
+ import_react_native5.StatusBar.setBarStyle(
523
+ theme === "dark" ? "light-content" : "dark-content"
524
+ );
525
+ if (import_react_native5.Platform.OS === "android") {
526
+ import_react_native5.StatusBar.setBackgroundColor(
527
+ colors2.white[1] + (translucent ? "0" : "")
528
+ );
529
+ import_react_native5.StatusBar.setTranslucent(true);
530
+ }
531
+ }, [theme])
532
+ );
533
+ import_react5.default.useEffect(() => {
534
+ import_react_native5.StatusBar.setBarStyle(theme === "dark" ? "light-content" : "dark-content");
535
+ if (import_react_native5.Platform.OS === "android") {
536
+ import_react_native5.StatusBar.setBackgroundColor(colors2.white[1] + (translucent ? "0" : ""));
537
+ import_react_native5.StatusBar.setTranslucent(true);
538
+ }
539
+ }, [theme]);
540
+ return /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null);
541
+ };
542
+ var AdaptiveStatusBarNext_default = AdaptiveStatusBar;
543
+
544
+ // ../src/Components/AlertX.tsx
545
+ var import_vector_icons = require("@expo/vector-icons");
546
+ var import_react6 = __toESM(require("react"));
547
+ var import_react_native6 = require("react-native");
548
+ var import_react_native_size_matters4 = require("react-native-size-matters");
549
+ var AlertX = ({
550
+ type = "info",
551
+ variant = "contained",
552
+ title,
553
+ gutterBottom = 0,
554
+ body,
555
+ style = {}
556
+ }) => {
557
+ const colors2 = useColors();
558
+ const styles2 = import_react_native_size_matters4.ScaledSheet.create({
559
+ container: {
560
+ padding: 20,
561
+ paddingTop: 10,
562
+ paddingBottom: 10,
563
+ borderRadius: 8,
564
+ alignItems: "center",
565
+ flexDirection: "row",
566
+ marginBottom: gutterBottom + "@ms",
567
+ backgroundColor: colors2[type].main + (variant === "contained" ? "" : "3")
568
+ },
569
+ title: {
570
+ color: variant === "contained" ? "#fff" : colors2[type].main
571
+ },
572
+ body: {
573
+ color: variant === "contained" ? "#fff" : colors2[type].main
574
+ }
575
+ });
576
+ return /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: { ...styles2.container, ...style } }, /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: { width: "80%" } }, /* @__PURE__ */ import_react6.default.createElement(Typography_default, { style: styles2.title, gutterBottom: 3, fontWeight: 700 }, title), body && /* @__PURE__ */ import_react6.default.createElement(Typography_default, { fontWeight: 700, variant: "body2", style: styles2.body }, body)), /* @__PURE__ */ import_react6.default.createElement(import_react_native6.View, { style: { marginLeft: "auto" } }, /* @__PURE__ */ import_react6.default.createElement(
577
+ import_vector_icons.MaterialIcons,
578
+ {
579
+ color: variant === "contained" ? "#fff" : colors2[type].main,
580
+ size: 36,
581
+ name: type === "success" ? "check" : type
582
+ }
583
+ )));
584
+ };
585
+ var AlertX_default = AlertX;
586
+
587
+ // ../src/Components/Avatar.tsx
588
+ var import_vector_icons2 = require("@expo/vector-icons");
589
+ var import_react7 = __toESM(require("react"));
590
+ var import_react_native7 = require("react-native");
591
+ var import_react_native_size_matters5 = require("react-native-size-matters");
592
+ var Avatar = ({
593
+ color = "dark",
594
+ label,
595
+ variant = "contained",
596
+ source,
597
+ size = 48,
598
+ style = {}
599
+ }) => {
600
+ const colors2 = useColors();
601
+ const styles2 = import_react_native_size_matters5.ScaledSheet.create({
602
+ root: {
603
+ borderRadius: 150,
604
+ height: size + "@ms",
605
+ width: size + "@ms",
606
+ alignItems: "center",
607
+ justifyContent: "center",
608
+ overflow: "hidden",
609
+ borderWidth: variant === "outlined" ? 5 : 0,
610
+ borderColor: variant === "outlined" ? "#fff" : "#0000",
611
+ backgroundColor: variant === "outlined" ? null : label ? colors2[color].main : colors2.white[4],
612
+ ...style
613
+ },
614
+ image: {
615
+ height: "110%",
616
+ width: "110%"
617
+ }
618
+ });
619
+ return /* @__PURE__ */ import_react7.default.createElement(import_react_native7.View, { style: styles2.root }, source ? /* @__PURE__ */ import_react7.default.createElement(import_react_native7.Image, { resizeMode: "cover", style: styles2.image, source }) : label ? /* @__PURE__ */ import_react7.default.createElement(Typography_default, { style: { color: colors2[color].text } }, label[0]) : /* @__PURE__ */ import_react7.default.createElement(import_vector_icons2.AntDesign, { name: "user", color: "#fff", size: Math.round(size / 1.5) }));
620
+ };
621
+ var Avatar_default = Avatar;
622
+
623
+ // ../src/Components/Button.tsx
624
+ var import_vector_icons3 = require("@expo/vector-icons");
625
+ var import_react8 = __toESM(require("react"));
626
+ var import_react_native8 = require("react-native");
627
+ var import_react_native_size_matters6 = require("react-native-size-matters");
628
+ var LinkButton = ({
629
+ title,
630
+ style = {},
631
+ color = "blue",
632
+ fontSize = 12,
633
+ fontWeight = "400",
634
+ disabled,
635
+ onPress = () => {
636
+ }
637
+ }) => {
638
+ const colors2 = useColors();
639
+ const styles2 = import_react_native_size_matters6.ScaledSheet.create({
640
+ text: {
641
+ fontSize: (0, import_react_native_size_matters6.moderateScale)(fontSize),
642
+ fontWeight,
643
+ fontFamily: getConfig().DEFAULT_FONT_FAMILY || "System",
644
+ color: disabled ? "#777" : colors2[color].main
645
+ }
646
+ });
647
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_native8.TouchableOpacity, { onPress, disabled }, /* @__PURE__ */ import_react8.default.createElement(import_react_native8.Text, { style: { ...styles2.text, ...style } }, title));
648
+ };
649
+ var IconButton = ({
650
+ style = {},
651
+ color = "dark",
652
+ disabled,
653
+ icon,
654
+ elevation,
655
+ bg = false,
656
+ size = 24,
657
+ containerStyles = {},
658
+ onPress = () => {
659
+ },
660
+ iconType = "material"
661
+ }) => {
662
+ const colors2 = useColors();
663
+ const theme = useTheme();
664
+ const bgColor = theme === "light" ? "#fff" : "#222";
665
+ const styles2 = import_react_native_size_matters6.ScaledSheet.create({
666
+ container: {
667
+ alignSelf: "flex-start",
668
+ flexGrow: 0,
669
+ backgroundColor: bg ? bgColor : elevation > 0 ? bgColor : null,
670
+ padding: "5@ms",
671
+ shadowColor: "#000",
672
+ shadowOpacity: 0.1,
673
+ shadowOffset: {
674
+ height: 1,
675
+ width: 0
676
+ },
677
+ height: bg ? size + 20 + "@ms" : void 0,
678
+ width: bg ? size + 20 + "@ms" : void 0,
679
+ alignItems: "center",
680
+ justifyContent: "center",
681
+ shadowRadius: elevation,
682
+ elevation,
683
+ borderRadius: size * 5
684
+ },
685
+ text: {
686
+ color: disabled ? "#777" : colors2[color].main
687
+ }
688
+ });
689
+ const IconComp = {
690
+ material: import_vector_icons3.MaterialIcons,
691
+ ion: import_vector_icons3.Ionicons
692
+ }[iconType];
693
+ return /* @__PURE__ */ import_react8.default.createElement(
694
+ import_react_native8.TouchableOpacity,
695
+ {
696
+ onPress,
697
+ activeOpacity: 0.3,
698
+ style: { ...styles2.container, ...containerStyles }
699
+ },
700
+ /* @__PURE__ */ import_react8.default.createElement(IconComp, { style: { ...styles2.text, ...style }, name: icon, size })
701
+ );
702
+ };
703
+ var Button = (0, import_react8.forwardRef)(
704
+ ({
705
+ elevation = 0,
706
+ onPress = () => {
707
+ },
708
+ disabled = false,
709
+ title,
710
+ loading,
711
+ size = "normal",
712
+ rounded = false,
713
+ gutterBottom,
714
+ style = {},
715
+ fullWidth = false,
716
+ translucent = false,
717
+ color = "primary",
718
+ variant = "contained",
719
+ start,
720
+ end
721
+ }, ref) => {
722
+ const colors2 = useColors();
723
+ const styles2 = import_react_native_size_matters6.ScaledSheet.create({
724
+ con: {
725
+ flexDirection: "row",
726
+ alignItems: "center",
727
+ alignSelf: "flex-start",
728
+ justifyContent: "center",
729
+ backgroundColor: variant === "text" || variant === "outlined" ? null : translucent ? translucent === "dark" ? colors2.white[3] + "2" : colors2.black[3] + "2" : loading ? colors2[color].light : disabled ? colors2.white[4] : colors2[color].main,
730
+ borderRadius: rounded ? 30 : 10,
731
+ elevation: variant === "text" ? 0 : elevation,
732
+ paddingVertical: size === "small" ? 8 : size === "large" ? "15@ms" : "13@ms",
733
+ paddingHorizontal: size === "small" ? "10@ms" : "18@ms",
734
+ borderColor: colors2[color].main,
735
+ borderWidth: variant === "outlined" ? 1 : 0,
736
+ shadowColor: "#000",
737
+ shadowRadius: elevation,
738
+ marginBottom: gutterBottom,
739
+ shadowOffset: {
740
+ height: elevation / 2,
741
+ width: 0
742
+ },
743
+ shadowOpacity: variant === "text" ? 0 : 0.3,
744
+ width: fullWidth ? "100%" : null,
745
+ ...style
746
+ },
747
+ text: {
748
+ color: disabled ? variant === "text" || variant === "outlined" ? colors2.black[1] : colors2[color].text : colors2[color][variant === "text" || variant === "outlined" ? "main" : "text"],
749
+ fontWeight: variant === "outlined" ? "700" : "500",
750
+ fontSize: size === "small" ? "12@ms" : "16@ms",
751
+ fontFamily: getConfig().DEFAULT_FONT_FAMILY || "System"
752
+ }
753
+ });
754
+ return /* @__PURE__ */ import_react8.default.createElement(
755
+ import_react_native8.TouchableOpacity,
756
+ {
757
+ ref,
758
+ onPress,
759
+ disabled,
760
+ style: styles2.con
761
+ },
762
+ start,
763
+ loading && /* @__PURE__ */ import_react8.default.createElement(
764
+ import_react_native8.ActivityIndicator,
765
+ {
766
+ size: "small",
767
+ color: colors2[color].text,
768
+ style: { marginRight: 10 }
769
+ }
770
+ ),
771
+ /* @__PURE__ */ import_react8.default.createElement(import_react_native8.Text, { style: styles2.text }, title),
772
+ end
773
+ );
774
+ }
775
+ );
776
+ var Button_default = Button;
777
+
778
+ // ../src/Components/Checkbox.tsx
779
+ var import_vector_icons4 = require("@expo/vector-icons");
780
+ var import_react9 = __toESM(require("react"));
781
+ var import_react_native9 = require("react-native");
782
+ var import_react_native_size_matters7 = require("react-native-size-matters");
783
+ var CheckBox = ({
784
+ color = "primary",
785
+ checked,
786
+ size = 24,
787
+ label,
788
+ style = {},
789
+ onChange
790
+ }) => {
791
+ const iconName = checked ? "checkbox-marked" : "checkbox-blank-outline";
792
+ const colors2 = useColors();
793
+ const styles2 = import_react_native_size_matters7.ScaledSheet.create({
794
+ container: {
795
+ alignItems: "center",
796
+ flexDirection: "row",
797
+ ...style
798
+ }
799
+ });
800
+ return /* @__PURE__ */ import_react9.default.createElement(import_react_native9.View, { style: styles2.container }, /* @__PURE__ */ import_react9.default.createElement(import_react_native9.TouchableOpacity, { onPress: onChange }, /* @__PURE__ */ import_react9.default.createElement(
801
+ import_vector_icons4.MaterialCommunityIcons,
802
+ {
803
+ name: iconName,
804
+ size,
805
+ color: colors2[color].main
806
+ }
807
+ )), label);
808
+ };
809
+
810
+ // ../src/Components/FormWrapper.tsx
811
+ var import_react10 = __toESM(require("react"));
812
+ var import_react_native10 = require("react-native");
813
+ var import_react_native_size_matters8 = require("react-native-size-matters");
814
+ var FormWrapper = ({
815
+ children,
816
+ behavior = import_react_native10.Platform.OS === "ios" ? "padding" : "height",
817
+ contentContainerStyle,
818
+ mode = "scroll",
819
+ keyboardVerticalOffset = 10,
820
+ style = {},
821
+ onScroll
822
+ }) => {
823
+ const styles2 = import_react_native_size_matters8.ScaledSheet.create({
824
+ root: {
825
+ width: "100%",
826
+ flex: 1,
827
+ ...style
828
+ }
829
+ });
830
+ return mode === "static" ? /* @__PURE__ */ import_react10.default.createElement(import_react_native10.TouchableWithoutFeedback, { onPress: import_react_native10.Keyboard.dismiss, accessible: false }, /* @__PURE__ */ import_react10.default.createElement(
831
+ import_react_native10.KeyboardAvoidingView,
832
+ {
833
+ style: styles2.root,
834
+ behavior,
835
+ contentContainerStyle: styles2.root,
836
+ keyboardVerticalOffset
837
+ },
838
+ children
839
+ )) : /* @__PURE__ */ import_react10.default.createElement(
840
+ import_react_native10.KeyboardAvoidingView,
841
+ {
842
+ behavior,
843
+ style: styles2.root,
844
+ keyboardVerticalOffset
845
+ },
846
+ /* @__PURE__ */ import_react10.default.createElement(
847
+ import_react_native10.ScrollView,
848
+ {
849
+ onScroll,
850
+ showsVerticalScrollIndicator: false,
851
+ scrollEventThrottle: 40,
852
+ keyboardDismissMode: "interactive",
853
+ contentContainerStyle,
854
+ keyboardShouldPersistTaps: "handled"
855
+ },
856
+ children
857
+ )
858
+ );
859
+ };
860
+
861
+ // ../src/Components/StarRating.tsx
862
+ var import_vector_icons5 = require("@expo/vector-icons");
863
+ var Haptics = __toESM(require("expo-haptics"));
864
+ var import_react12 = require("react");
865
+ var import_react_native12 = require("react-native");
866
+ var import_react_native_size_matters10 = require("react-native-size-matters");
867
+
868
+ // ../src/Components/Popup.tsx
869
+ var import_react_native11 = require("react-native");
870
+ var import_react11 = __toESM(require("react"));
871
+ var import_react_native_size_matters9 = require("react-native-size-matters");
872
+ var Popup = ({
873
+ title,
874
+ sheet,
875
+ bare = false,
876
+ keyboardVerticalOffset,
877
+ children,
878
+ open,
879
+ onClose = () => {
880
+ }
881
+ }) => {
882
+ const colors2 = useColors();
883
+ const [show, setShow] = (0, import_react11.useState)(open);
884
+ const [showSecondary, setShowSecondary] = (0, import_react11.useState)(false);
885
+ const styles2 = import_react_native_size_matters9.ScaledSheet.create({
886
+ root: {
887
+ height: "100%",
888
+ width: "100%",
889
+ justifyContent: sheet ? "flex-end" : "center"
890
+ },
891
+ avoidingView: {
892
+ minHeight: typeof sheet === "number" ? sheet : void 0,
893
+ maxHeight: "80%",
894
+ zIndex: 1e3,
895
+ alignSelf: "center",
896
+ maxWidth: sheet ? void 0 : "90%",
897
+ width: sheet ? "100%" : void 0
898
+ },
899
+ container: {
900
+ paddingBottom: sheet ? "30@ms" : 0,
901
+ backgroundColor: colors2.white[2],
902
+ borderTopLeftRadius: 20,
903
+ borderTopRightRadius: 20,
904
+ borderBottomRightRadius: sheet ? 0 : 20,
905
+ borderBottomLeftRadius: sheet ? 0 : 20,
906
+ width: "100%"
907
+ },
908
+ content: {
909
+ paddingHorizontal: bare ? void 0 : "10@ms"
910
+ // flex: 1,
911
+ },
912
+ title: {
913
+ flexDirection: "row",
914
+ alignItems: "center",
915
+ paddingVertical: "5@ms",
916
+ paddingHorizontal: "10@ms",
917
+ marginBottom: "10@ms"
918
+ },
919
+ backdrop: {
920
+ position: "absolute",
921
+ height: "100%",
922
+ zIndex: -1,
923
+ width: "100%",
924
+ backgroundColor: "#000b"
925
+ }
926
+ });
927
+ import_react11.default.useEffect(() => {
928
+ if (open) {
929
+ setShow(open);
930
+ setTimeout(() => {
931
+ setShowSecondary(open);
932
+ }, 500);
933
+ } else {
934
+ closeAction();
935
+ }
936
+ }, [open]);
937
+ const closeAction = () => {
938
+ setShowSecondary(false);
939
+ setTimeout(() => {
940
+ setShow(false);
941
+ onClose();
942
+ }, 300);
943
+ };
944
+ return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement(
945
+ import_react_native11.Modal,
946
+ {
947
+ transparent: true,
948
+ animationType: "fade",
949
+ statusBarTranslucent: true,
950
+ visible: show,
951
+ onRequestClose: closeAction
952
+ },
953
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.backdrop }),
954
+ /* @__PURE__ */ import_react11.default.createElement(UIThemeProvider, null, /* @__PURE__ */ import_react11.default.createElement(
955
+ import_react_native11.Modal,
956
+ {
957
+ transparent: true,
958
+ animationType: "slide",
959
+ statusBarTranslucent: true,
960
+ visible: showSecondary,
961
+ onRequestClose: closeAction
962
+ },
963
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native11.TouchableWithoutFeedback, { onPress: import_react_native11.Keyboard.dismiss }, /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.root }, open && /* @__PURE__ */ import_react11.default.createElement(
964
+ import_react_native11.Pressable,
965
+ {
966
+ style: import_react_native11.StyleSheet.absoluteFill,
967
+ onPress: closeAction
968
+ }
969
+ ), /* @__PURE__ */ import_react11.default.createElement(
970
+ import_react_native11.KeyboardAvoidingView,
971
+ {
972
+ style: styles2.avoidingView,
973
+ keyboardVerticalOffset,
974
+ behavior: import_react_native11.Platform.OS === "ios" ? "position" : "padding"
975
+ },
976
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.container }, !bare && /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.title }, /* @__PURE__ */ import_react11.default.createElement(
977
+ IconButton,
978
+ {
979
+ size: 20,
980
+ icon: "close",
981
+ onPress: closeAction
982
+ }
983
+ ), /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: { flex: 1 } }, /* @__PURE__ */ import_react11.default.createElement(Typography_default, { color: "textSecondary", align: "center" }, title))), /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.content }, children))
984
+ )))
985
+ ))
986
+ ));
987
+ };
988
+
989
+ // ../src/Components/StarRating.tsx
990
+ var RatingStars = ({
991
+ rating = 0,
992
+ size = 16
993
+ }) => {
994
+ const colors2 = useColors();
995
+ const styles2 = import_react_native_size_matters10.ScaledSheet.create({
996
+ root: {
997
+ flexDirection: "row",
998
+ alignItems: "center"
999
+ }
1000
+ });
1001
+ return /* @__PURE__ */ React.createElement(import_react_native12.View, { style: styles2.root }, [...Array(Math.floor(rating))].map((_, index) => /* @__PURE__ */ React.createElement(import_vector_icons5.Ionicons, { key: index, name: "star", size, color: "#FFD700" })), [...Array(5 - Math.floor(rating))].map((_, index) => /* @__PURE__ */ React.createElement(
1002
+ import_vector_icons5.Ionicons,
1003
+ {
1004
+ key: index,
1005
+ name: "star",
1006
+ size,
1007
+ color: colors2.textSecondary.light
1008
+ }
1009
+ )));
1010
+ };
1011
+ var RatingInput = ({
1012
+ onSubmit: _onSubmit,
1013
+ rating = 0,
1014
+ size = 16
1015
+ }) => {
1016
+ const [showReviewsModal, setShowReviewsModal] = (0, import_react12.useState)(false);
1017
+ const [rate, setRate] = (0, import_react12.useState)(0);
1018
+ const colors2 = useColors();
1019
+ const [loading, setLoading] = (0, import_react12.useState)(false);
1020
+ const [review, setReview] = (0, import_react12.useState)("");
1021
+ const styles2 = import_react_native_size_matters10.ScaledSheet.create({
1022
+ root: {
1023
+ flexDirection: "row",
1024
+ alignItems: "center"
1025
+ },
1026
+ inputCon: {
1027
+ marginBottom: "20@vs",
1028
+ backgroundColor: colors2.white[3],
1029
+ padding: "15@ms",
1030
+ borderRadius: 20
1031
+ },
1032
+ input: {
1033
+ fontSize: "16@ms",
1034
+ color: colors2.dark.main,
1035
+ height: "100@vs"
1036
+ }
1037
+ });
1038
+ (0, import_react12.useEffect)(() => {
1039
+ setRate(rating);
1040
+ }, [rating]);
1041
+ const onRate = (index) => {
1042
+ setRate(index + 1);
1043
+ Haptics.selectionAsync();
1044
+ setTimeout(() => {
1045
+ setShowReviewsModal(true);
1046
+ }, 500);
1047
+ };
1048
+ const onSubmit = async () => {
1049
+ setLoading(true);
1050
+ setShowReviewsModal(false);
1051
+ _onSubmit && await _onSubmit({ rating: rate, review });
1052
+ setLoading(false);
1053
+ };
1054
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(import_react_native12.View, { style: styles2.root }, loading ? /* @__PURE__ */ React.createElement(import_react_native12.ActivityIndicator, null) : [...Array(5)].map((_, index) => /* @__PURE__ */ React.createElement(
1055
+ import_react_native12.TouchableOpacity,
1056
+ {
1057
+ key: index,
1058
+ activeOpacity: 0.9,
1059
+ onPress: () => {
1060
+ onRate(index);
1061
+ }
1062
+ },
1063
+ /* @__PURE__ */ React.createElement(
1064
+ import_vector_icons5.Ionicons,
1065
+ {
1066
+ style: { marginLeft: 10 },
1067
+ name: index < rate ? "star" : "star-outline",
1068
+ size,
1069
+ color: colors2.primary.light
1070
+ }
1071
+ )
1072
+ ))), /* @__PURE__ */ React.createElement(
1073
+ Popup,
1074
+ {
1075
+ sheet: true,
1076
+ open: showReviewsModal,
1077
+ onClose: () => {
1078
+ setShowReviewsModal(false);
1079
+ }
1080
+ },
1081
+ /* @__PURE__ */ React.createElement(
1082
+ import_react_native12.View,
1083
+ {
1084
+ style: {
1085
+ alignItems: "center",
1086
+ marginBottom: 5
1087
+ }
1088
+ },
1089
+ /* @__PURE__ */ React.createElement(RatingStars, { rating: rate, size: 24 })
1090
+ ),
1091
+ /* @__PURE__ */ React.createElement(
1092
+ Typography_default,
1093
+ {
1094
+ align: "center",
1095
+ fontWeight: 700,
1096
+ variant: "h5",
1097
+ gutterBottom: 20
1098
+ },
1099
+ "Add to your review"
1100
+ ),
1101
+ /* @__PURE__ */ React.createElement(import_react_native12.View, { style: styles2.inputCon }, /* @__PURE__ */ React.createElement(
1102
+ import_react_native12.TextInput,
1103
+ {
1104
+ style: styles2.input,
1105
+ multiline: true,
1106
+ value: review,
1107
+ onChangeText: (text) => setReview(text),
1108
+ placeholder: "Type review here.."
1109
+ }
1110
+ )),
1111
+ /* @__PURE__ */ React.createElement(
1112
+ Button_default,
1113
+ {
1114
+ gutterBottom: 40,
1115
+ title: "Submit Review",
1116
+ loading,
1117
+ disabled: loading,
1118
+ onPress: () => {
1119
+ onSubmit();
1120
+ }
1121
+ }
1122
+ )
1123
+ ));
1124
+ };
1125
+
1126
+ // ../src/Components/Grid.tsx
1127
+ var import_react_native13 = require("react-native");
1128
+ var import_react13 = __toESM(require("react"));
1129
+ var import_react_native_size_matters11 = require("react-native-size-matters");
1130
+ var GridItem = ({
1131
+ children,
1132
+ col = 2,
1133
+ alignItems,
1134
+ spacing = 1,
1135
+ style = {}
1136
+ }) => {
1137
+ const styles2 = import_react_native_size_matters11.ScaledSheet.create({
1138
+ gridItem: {
1139
+ width: 100 / col + "%",
1140
+ padding: spacing * 10 + "@ms",
1141
+ alignItems
1142
+ }
1143
+ });
1144
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native13.View, { children, style: [styles2.gridItem, style] });
1145
+ };
1146
+ var Grid = ({
1147
+ children,
1148
+ spacing = 1,
1149
+ style = {}
1150
+ }) => {
1151
+ const styles2 = import_react_native_size_matters11.ScaledSheet.create({
1152
+ grid: {
1153
+ flexWrap: "wrap",
1154
+ margin: -spacing * 10 + "@ms",
1155
+ flexDirection: "row"
1156
+ }
1157
+ });
1158
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native13.View, { children, style: [styles2.grid, style] });
1159
+ };
1160
+
1161
+ // ../src/Components/Locator.tsx
1162
+ var import_vector_icons9 = require("@expo/vector-icons");
1163
+ var import_react17 = __toESM(require("react"));
1164
+ var import_react_native17 = require("react-native");
1165
+
1166
+ // ../src/Components/List.tsx
1167
+ var import_vector_icons6 = require("@expo/vector-icons");
1168
+ var import_react14 = __toESM(require("react"));
1169
+ var import_react_native14 = require("react-native");
1170
+ var import_react_native_size_matters12 = require("react-native-size-matters");
1171
+ var ListItem = ({
1172
+ link = false,
1173
+ divider = false,
1174
+ onPress,
1175
+ index = 1,
1176
+ style = {},
1177
+ children
1178
+ }) => {
1179
+ const colors2 = useColors();
1180
+ const styles2 = import_react_native_size_matters12.ScaledSheet.create({
1181
+ root: {
1182
+ flexDirection: "row",
1183
+ alignItems: "center",
1184
+ paddingHorizontal: "10@s",
1185
+ borderBottomColor: colors2.white[4],
1186
+ borderBottomWidth: divider ? 1 : 0,
1187
+ paddingVertical: "10@vs"
1188
+ }
1189
+ });
1190
+ return /* @__PURE__ */ import_react14.default.createElement(
1191
+ import_react_native14.View,
1192
+ null,
1193
+ /* @__PURE__ */ import_react14.default.createElement(import_react_native14.TouchableOpacity, { disabled: Boolean(!onPress), onPress }, /* @__PURE__ */ import_react14.default.createElement(import_react_native14.View, { style: { ...styles2.root, ...style } }, children, link && /* @__PURE__ */ import_react14.default.createElement(
1194
+ import_vector_icons6.MaterialIcons,
1195
+ {
1196
+ color: colors2.white[5],
1197
+ style: { marginLeft: "auto" },
1198
+ name: "arrow-forward-ios",
1199
+ size: 15
1200
+ }
1201
+ )))
1202
+ );
1203
+ };
1204
+
1205
+ // ../src/Components/TextField.tsx
1206
+ var import_vector_icons8 = require("@expo/vector-icons");
1207
+ var import_react16 = __toESM(require("react"));
1208
+ var import_react_native16 = require("react-native");
1209
+ var import_react_native_size_matters14 = require("react-native-size-matters");
1210
+
1211
+ // ../src/Components/SelectMenu.tsx
1212
+ var import_vector_icons7 = require("@expo/vector-icons");
1213
+ var import_react15 = __toESM(require("react"));
1214
+ var import_react_native15 = require("react-native");
1215
+ var import_react_native_safe_area_context3 = require("react-native-safe-area-context");
1216
+ var import_react_native_size_matters13 = require("react-native-size-matters");
1217
+ var SelectMenu = ({
1218
+ open = false,
1219
+ onClose,
1220
+ value,
1221
+ options = [],
1222
+ onChange,
1223
+ disableAutoClose = false,
1224
+ label,
1225
+ secondary,
1226
+ helperText
1227
+ }) => {
1228
+ const colors2 = useColors();
1229
+ const { bottom } = (0, import_react_native_safe_area_context3.useSafeAreaInsets)();
1230
+ const [search, setSearch] = (0, import_react15.useState)("");
1231
+ const styles2 = import_react_native_size_matters13.ScaledSheet.create({
1232
+ root: {
1233
+ backgroundColor: colors2.white[1],
1234
+ flex: 1
1235
+ },
1236
+ content: {
1237
+ flex: 1,
1238
+ paddingHorizontal: "10@ms"
1239
+ },
1240
+ header: {
1241
+ paddingTop: "80@ms",
1242
+ marginBottom: "20@vs"
1243
+ },
1244
+ option: {
1245
+ paddingHorizontal: "10@s",
1246
+ paddingVertical: "10@vs",
1247
+ borderRadius: 8,
1248
+ flexDirection: "row",
1249
+ alignItems: "center",
1250
+ marginBottom: "10@vs"
1251
+ },
1252
+ footer: {
1253
+ paddingBottom: bottom,
1254
+ paddingHorizontal: "15@ms",
1255
+ paddingTop: "15@ms"
1256
+ }
1257
+ });
1258
+ const renderItem = (0, import_react15.useCallback)(
1259
+ ({ item }) => /* @__PURE__ */ import_react15.default.createElement(
1260
+ import_react_native15.TouchableOpacity,
1261
+ {
1262
+ style: {
1263
+ ...styles2.option,
1264
+ backgroundColor: item.value === value ? colors2.blue.light + "2" : colors2.white[2]
1265
+ },
1266
+ onPress: () => {
1267
+ onChange(item.value);
1268
+ if (!disableAutoClose)
1269
+ onClose();
1270
+ },
1271
+ key: item.label
1272
+ },
1273
+ item.start && /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: { marginRight: 10 } }, item.start),
1274
+ /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: { flex: 1 } }, /* @__PURE__ */ import_react15.default.createElement(
1275
+ Typography_default,
1276
+ {
1277
+ style: {
1278
+ color: item.value === value ? colors2.blue.light : colors2.black[2]
1279
+ }
1280
+ },
1281
+ item.label
1282
+ ), item.secondary ? /* @__PURE__ */ import_react15.default.createElement(
1283
+ Typography_default,
1284
+ {
1285
+ variant: "body2",
1286
+ style: {
1287
+ marginTop: 2,
1288
+ color: item.value === value ? colors2.blue.light : colors2.white[5]
1289
+ }
1290
+ },
1291
+ item.secondary
1292
+ ) : null),
1293
+ value === item.value && /* @__PURE__ */ import_react15.default.createElement(
1294
+ import_vector_icons7.MaterialIcons,
1295
+ {
1296
+ name: "check",
1297
+ color: colors2.blue.light,
1298
+ size: 24,
1299
+ style: { marginLeft: "auto" }
1300
+ }
1301
+ )
1302
+ ),
1303
+ [value, colors2]
1304
+ );
1305
+ return /* @__PURE__ */ import_react15.default.createElement(import_react_native15.Modal, { visible: open, animationType: "slide", onRequestClose: onClose }, /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: styles2.root }, /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: styles2.content }, /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: styles2.header }, /* @__PURE__ */ import_react15.default.createElement(Typography_default, { variant: "h5", gutterBottom: 5, fontWeight: 700 }, label), helperText ? /* @__PURE__ */ import_react15.default.createElement(Typography_default, { variant: "body2", color: "textSecondary" }, helperText) : null, /* @__PURE__ */ import_react15.default.createElement(
1306
+ TextField_default,
1307
+ {
1308
+ label: "Search",
1309
+ value: search,
1310
+ type: "search",
1311
+ onChangeText: setSearch,
1312
+ variant: "outlined"
1313
+ }
1314
+ )), /* @__PURE__ */ import_react15.default.createElement(
1315
+ import_react_native15.FlatList,
1316
+ {
1317
+ removeClippedSubviews: true,
1318
+ keyExtractor: (item) => item.value,
1319
+ renderItem,
1320
+ data: options.filter(
1321
+ (item) => search.length > 1 ? item.label.toLowerCase().indexOf(search.toLowerCase()) > -1 : item
1322
+ ).sort((a, b) => a.label.localeCompare(b.label))
1323
+ }
1324
+ )), /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: styles2.footer }, /* @__PURE__ */ import_react15.default.createElement(
1325
+ Button_default,
1326
+ {
1327
+ color: "error",
1328
+ variant: "outlined",
1329
+ fullWidth: true,
1330
+ title: "Close",
1331
+ onPress: onClose
1332
+ }
1333
+ ))));
1334
+ };
1335
+ var SelectMenu_default = SelectMenu;
1336
+
1337
+ // ../src/Components/TextField.tsx
1338
+ var TextField = ({
1339
+ label,
1340
+ keyboardType,
1341
+ variant,
1342
+ color = "primary",
1343
+ value,
1344
+ type,
1345
+ helperText,
1346
+ onChangeText,
1347
+ onSubmitEditing = () => {
1348
+ },
1349
+ onFocus = () => {
1350
+ },
1351
+ onBlur = () => {
1352
+ },
1353
+ error,
1354
+ start,
1355
+ size = "normal",
1356
+ rounded,
1357
+ disabled = false,
1358
+ style = {},
1359
+ inputStyles = {},
1360
+ gutterBottom = 0,
1361
+ end,
1362
+ options,
1363
+ ...props
1364
+ }) => {
1365
+ const colors2 = useColors();
1366
+ const [focused, setFocused] = (0, import_react16.useState)(false);
1367
+ const height = (0, import_react_native_size_matters14.moderateScale)(variant === "text" ? 50 : 45) * (size === "large" ? 1.2 : size === "small" ? 0.8 : 1);
1368
+ const labelAnim = (0, import_react16.useRef)(
1369
+ new import_react_native16.Animated.Value(height / (0, import_react_native_size_matters14.moderateScale)(variant === "text" ? 2.5 : 3.2))
1370
+ ).current;
1371
+ import_react16.default.useEffect(() => {
1372
+ if (focused || value) {
1373
+ import_react_native16.Animated.timing(labelAnim, {
1374
+ toValue: (0, import_react_native_size_matters14.verticalScale)(variant === "text" ? 2 : 4),
1375
+ duration: 300,
1376
+ useNativeDriver: false
1377
+ }).start();
1378
+ } else {
1379
+ import_react_native16.Animated.timing(labelAnim, {
1380
+ toValue: height / (0, import_react_native_size_matters14.moderateScale)(variant === "text" ? 2.5 : 3.2),
1381
+ duration: 300,
1382
+ useNativeDriver: false
1383
+ }).start();
1384
+ }
1385
+ }, [focused, value]);
1386
+ const styles2 = import_react_native_size_matters14.ScaledSheet.create({
1387
+ root: {
1388
+ marginBottom: gutterBottom + "@vs",
1389
+ width: "100%",
1390
+ ...style
1391
+ },
1392
+ container: {
1393
+ height,
1394
+ overflow: "hidden",
1395
+ backgroundColor: variant === "outlined" || variant === "text" ? "#fff0" : focused ? colors2.white[3] : colors2.white[4],
1396
+ flexDirection: "row",
1397
+ borderColor: error ? colors2.error.main : focused ? colors2[color].main : colors2.textSecondary.main,
1398
+ borderWidth: error ? 1 : variant === "outlined" ? focused ? 2 : 0.5 : 0,
1399
+ borderBottomWidth: variant === "text" ? 0.5 : void 0,
1400
+ width: "100%",
1401
+ borderRadius: variant === "text" ? 0 : rounded ? 30 : 7,
1402
+ alignItems: "center",
1403
+ ...inputStyles
1404
+ },
1405
+ input: {
1406
+ fontSize: "14@s",
1407
+ flex: 1,
1408
+ alignSelf: "stretch",
1409
+ paddingLeft: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1410
+ paddingRight: (0, import_react_native_size_matters14.moderateScale)(10),
1411
+ paddingTop: "11@vs",
1412
+ fontFamily: getConfig().DEFAULT_FONT_FAMILY || "System",
1413
+ color: colors2.black[1],
1414
+ zIndex: 10
1415
+ // backgroundColor: "#284",
1416
+ },
1417
+ inputText: {
1418
+ fontSize: "14@ms",
1419
+ flex: 1,
1420
+ paddingLeft: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1421
+ paddingTop: "13@ms"
1422
+ },
1423
+ label: {
1424
+ fontFamily: getConfig().DEFAULT_FONT_FAMILY || "System",
1425
+ position: "absolute",
1426
+ left: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1427
+ fontSize: focused || value ? "10@s" : "13@s",
1428
+ color: focused ? colors2[color].main : colors2.textSecondary.main
1429
+ },
1430
+ helperText: {
1431
+ paddingHorizontal: "15@s",
1432
+ flex: 1,
1433
+ color: focused ? colors2[color].dark : colors2.textSecondary.main,
1434
+ paddingTop: "4@ms"
1435
+ },
1436
+ error: {
1437
+ paddingLeft: 10,
1438
+ paddingRight: 10,
1439
+ paddingTop: 5,
1440
+ flexDirection: "row",
1441
+ alignItems: "center"
1442
+ },
1443
+ errorText: {
1444
+ fontSize: 12,
1445
+ marginLeft: 10
1446
+ }
1447
+ });
1448
+ const formProps = type === "email" ? {
1449
+ textContentType: "emailAddress",
1450
+ keyboardType: "email-address",
1451
+ autoCapitalize: "none",
1452
+ autoCompleteType: "email"
1453
+ } : type === "number" ? {
1454
+ keyboardType: "numeric"
1455
+ } : type === "tel" ? {
1456
+ textContentType: "telephoneNumber",
1457
+ keyboardType: "phone-pad"
1458
+ } : type === "search" ? {
1459
+ keyboardType: "web-search",
1460
+ returnKeyType: "search",
1461
+ autoCapitalize: "none"
1462
+ } : type === "password" ? {
1463
+ secureTextEntry: true,
1464
+ autoCompleteType: "password",
1465
+ autoCapitalize: "none",
1466
+ textContentType: "password"
1467
+ } : {};
1468
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: styles2.root }, /* @__PURE__ */ import_react16.default.createElement(
1469
+ import_react_native16.TouchableOpacity,
1470
+ {
1471
+ onPress: () => setFocused(true),
1472
+ style: styles2.container
1473
+ },
1474
+ /* @__PURE__ */ import_react16.default.createElement(import_react_native16.Animated.Text, { style: { ...styles2.label, top: labelAnim } }, label),
1475
+ start,
1476
+ options ? /* @__PURE__ */ import_react16.default.createElement(
1477
+ import_react_native16.View,
1478
+ {
1479
+ style: { flex: 1, alignItems: "center", flexDirection: "row" }
1480
+ },
1481
+ options.find((cur) => cur.value === value)?.start && /* @__PURE__ */ import_react16.default.createElement(
1482
+ import_react_native16.View,
1483
+ {
1484
+ style: {
1485
+ paddingTop: variant !== "outlined" ? (0, import_react_native_size_matters14.ms)(13) : 0,
1486
+ paddingRight: 10
1487
+ }
1488
+ },
1489
+ options.find((cur) => cur.value === value)?.start
1490
+ ),
1491
+ /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.inputText }, options.find((cur) => cur.value === value)?.label)
1492
+ ) : /* @__PURE__ */ import_react16.default.createElement(
1493
+ import_react_native16.TextInput,
1494
+ {
1495
+ onFocus: () => {
1496
+ onFocus();
1497
+ setFocused(true);
1498
+ },
1499
+ onBlur: () => {
1500
+ onBlur();
1501
+ setFocused(false);
1502
+ },
1503
+ value,
1504
+ onChangeText,
1505
+ keyboardType,
1506
+ editable: !disabled,
1507
+ selectTextOnFocus: !disabled,
1508
+ onSubmitEditing,
1509
+ placeholderTextColor: colors2.textSecondary.main,
1510
+ ...formProps,
1511
+ ...props,
1512
+ style: styles2.input
1513
+ }
1514
+ ),
1515
+ end && /* @__PURE__ */ import_react16.default.createElement(
1516
+ import_react_native16.View,
1517
+ {
1518
+ style: {
1519
+ marginRight: 20,
1520
+ paddingTop: variant === "text" ? (0, import_react_native_size_matters14.ms)(13) : 0
1521
+ }
1522
+ },
1523
+ end
1524
+ ),
1525
+ options && /* @__PURE__ */ import_react16.default.createElement(
1526
+ import_react_native16.View,
1527
+ {
1528
+ style: {
1529
+ marginRight: variant === "text" ? 0 : 20,
1530
+ paddingTop: variant === "text" ? (0, import_react_native_size_matters14.ms)(13) : 0
1531
+ }
1532
+ },
1533
+ /* @__PURE__ */ import_react16.default.createElement(
1534
+ import_vector_icons8.Ionicons,
1535
+ {
1536
+ name: "chevron-down",
1537
+ color: colors2.textSecondary.main,
1538
+ size: 24
1539
+ }
1540
+ )
1541
+ )
1542
+ ), helperText && /* @__PURE__ */ import_react16.default.createElement(
1543
+ Typography_default,
1544
+ {
1545
+ color: "textSecondary",
1546
+ style: styles2.helperText,
1547
+ variant: "caption"
1548
+ },
1549
+ helperText
1550
+ ), error && /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: styles2.error }, /* @__PURE__ */ import_react16.default.createElement(import_vector_icons8.MaterialIcons, { name: "error", color: colors2.error.main, size: 16 }), /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.errorText, color: "error" }, error))), options && /* @__PURE__ */ import_react16.default.createElement(
1551
+ SelectMenu_default,
1552
+ {
1553
+ options,
1554
+ value,
1555
+ open: focused,
1556
+ onClose: () => setFocused(false),
1557
+ label,
1558
+ helperText,
1559
+ onChange: onChangeText
1560
+ }
1561
+ ));
1562
+ };
1563
+ var TextField2 = ({
1564
+ label,
1565
+ keyboardType,
1566
+ color = "primary",
1567
+ value,
1568
+ type,
1569
+ helperText,
1570
+ onChangeText,
1571
+ onSubmitEditing = () => {
1572
+ },
1573
+ onFocus = () => {
1574
+ },
1575
+ onBlur = () => {
1576
+ },
1577
+ error,
1578
+ start,
1579
+ rounded,
1580
+ disabled = false,
1581
+ style = {},
1582
+ inputStyles = {},
1583
+ gutterBottom = 8,
1584
+ placeholder,
1585
+ end,
1586
+ options,
1587
+ ...props
1588
+ }) => {
1589
+ const colors2 = useColors();
1590
+ const [focused, _setFocused] = (0, import_react16.useState)(false);
1591
+ const [showPassword, setShowPassword] = (0, import_react16.useState)(false);
1592
+ const height = (0, import_react_native_size_matters14.moderateScale)(
1593
+ props.multiline ? 50 + (props.numberOfLines || 1) * 18 : 50
1594
+ );
1595
+ const setFocused = (value2) => {
1596
+ _setFocused(value2);
1597
+ };
1598
+ const styles2 = import_react_native_size_matters14.ScaledSheet.create({
1599
+ root: {
1600
+ marginBottom: gutterBottom + "@vs",
1601
+ ...style
1602
+ },
1603
+ container: {
1604
+ height,
1605
+ overflow: "hidden",
1606
+ flexDirection: "row",
1607
+ borderColor: error ? colors2.error.main : focused ? colors2[color].main : colors2.white[5],
1608
+ borderWidth: error ? 1 : focused ? 2 : 1,
1609
+ width: "100%",
1610
+ borderRadius: rounded ? 30 : 10,
1611
+ alignItems: "center",
1612
+ ...inputStyles
1613
+ },
1614
+ input: {
1615
+ fontSize: "14@s",
1616
+ flex: 1,
1617
+ alignSelf: "stretch",
1618
+ paddingLeft: (0, import_react_native_size_matters14.moderateScale)(10),
1619
+ paddingRight: (0, import_react_native_size_matters14.moderateScale)(10),
1620
+ color: colors2.dark.main,
1621
+ zIndex: 10
1622
+ // backgroundColor: "#284",
1623
+ },
1624
+ inputText: {
1625
+ fontSize: "14@ms",
1626
+ color: colors2.dark.main,
1627
+ paddingLeft: (0, import_react_native_size_matters14.moderateScale)(10)
1628
+ },
1629
+ placeholder: {
1630
+ fontSize: "14@ms",
1631
+ color: colors2.textSecondary.main,
1632
+ paddingLeft: (0, import_react_native_size_matters14.moderateScale)(10)
1633
+ },
1634
+ label: {},
1635
+ helperText: {
1636
+ paddingHorizontal: "15@s",
1637
+ color: focused ? colors2[color].dark : "#fffa",
1638
+ paddingTop: "4@ms"
1639
+ },
1640
+ error: {
1641
+ paddingLeft: 10,
1642
+ paddingRight: 10,
1643
+ paddingTop: 5,
1644
+ flexDirection: "row",
1645
+ alignItems: "center"
1646
+ },
1647
+ errorText: {
1648
+ fontSize: 12,
1649
+ marginLeft: 10
1650
+ }
1651
+ });
1652
+ const formProps = type === "email" ? {
1653
+ textContentType: "emailAddress",
1654
+ keyboardType: "email-address",
1655
+ autoCapitalize: "none",
1656
+ autoCompleteType: "email"
1657
+ } : type === "number" ? {
1658
+ keyboardType: "numeric"
1659
+ } : type === "tel" ? {
1660
+ textContentType: "telephoneNumber",
1661
+ keyboardType: "phone-pad"
1662
+ } : type === "search" ? {
1663
+ keyboardType: "web-search",
1664
+ returnKeyType: "search",
1665
+ autoCapitalize: "none"
1666
+ } : type === "password" ? {
1667
+ secureTextEntry: !showPassword,
1668
+ autoCompleteType: "password",
1669
+ autoCapitalize: "none",
1670
+ textContentType: "password"
1671
+ } : {};
1672
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: styles2.root }, label && /* @__PURE__ */ import_react16.default.createElement(Typography_default, { variant: "body1", color: "textSecondary", gutterBottom: 7 }, label), /* @__PURE__ */ import_react16.default.createElement(
1673
+ import_react_native16.TouchableOpacity,
1674
+ {
1675
+ onPress: () => setFocused(true),
1676
+ style: styles2.container
1677
+ },
1678
+ start,
1679
+ options ? /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, value ? /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.inputText }, options.find((cur) => cur.value === value)?.label) : /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.placeholder }, placeholder), /* @__PURE__ */ import_react16.default.createElement(
1680
+ import_vector_icons8.Ionicons,
1681
+ {
1682
+ name: "chevron-down",
1683
+ size: 24,
1684
+ style: { marginLeft: "auto", marginRight: 15 },
1685
+ color: colors2.dark.light
1686
+ }
1687
+ )) : /* @__PURE__ */ import_react16.default.createElement(
1688
+ import_react_native16.TextInput,
1689
+ {
1690
+ onFocus: () => {
1691
+ onFocus();
1692
+ setFocused(true);
1693
+ },
1694
+ onBlur: () => {
1695
+ onBlur();
1696
+ setFocused(false);
1697
+ },
1698
+ value,
1699
+ onChangeText,
1700
+ key: showPassword ? "show" : "hide",
1701
+ keyboardType,
1702
+ placeholderTextColor: colors2.textSecondary.main,
1703
+ editable: !disabled,
1704
+ placeholder,
1705
+ selectTextOnFocus: !disabled,
1706
+ onSubmitEditing,
1707
+ ...formProps,
1708
+ ...props,
1709
+ style: styles2.input
1710
+ }
1711
+ ),
1712
+ end ? /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: { marginRight: 20 } }, end) : type === "password" && /* @__PURE__ */ import_react16.default.createElement(
1713
+ import_react_native16.TouchableOpacity,
1714
+ {
1715
+ style: { marginRight: 20 },
1716
+ onPress: () => setShowPassword(!showPassword)
1717
+ },
1718
+ /* @__PURE__ */ import_react16.default.createElement(
1719
+ import_vector_icons8.Ionicons,
1720
+ {
1721
+ name: showPassword ? "eye-outline" : "eye-off-outline",
1722
+ size: 24,
1723
+ color: colors2.textSecondary.main
1724
+ }
1725
+ )
1726
+ )
1727
+ ), helperText && /* @__PURE__ */ import_react16.default.createElement(
1728
+ Typography_default,
1729
+ {
1730
+ color: "textSecondary",
1731
+ style: styles2.helperText,
1732
+ variant: "caption"
1733
+ },
1734
+ helperText
1735
+ ), error && /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: styles2.error }, /* @__PURE__ */ import_react16.default.createElement(import_vector_icons8.MaterialIcons, { name: "error", color: colors2.error.main, size: 16 }), /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.errorText, color: "error" }, error))), options && /* @__PURE__ */ import_react16.default.createElement(
1736
+ SelectMenu_default,
1737
+ {
1738
+ options,
1739
+ value,
1740
+ open: focused,
1741
+ onClose: () => setFocused(false),
1742
+ label,
1743
+ helperText,
1744
+ onChange: onChangeText
1745
+ }
1746
+ ));
1747
+ };
1748
+ var TextField_default = TextField;
1749
+
1750
+ // ../src/Components/Locator.tsx
1751
+ var Location = __toESM(require("expo-location"));
1752
+ var import_react_native_size_matters15 = require("react-native-size-matters");
1753
+ setTimeout(() => {
1754
+ const { GOOGLE_MAP_API_KEY } = getConfig();
1755
+ if (GOOGLE_MAP_API_KEY)
1756
+ Location.setGoogleApiKey(GOOGLE_MAP_API_KEY);
1757
+ }, 500);
1758
+ var getPredictionsFromCoords = async (coords) => {
1759
+ const { GOOGLE_MAP_API_KEY } = getConfig();
1760
+ if (!GOOGLE_MAP_API_KEY)
1761
+ console.error(
1762
+ "Google map api key needs to be set to use this component \nMake sure to run initialize() with a valid google map api key"
1763
+ );
1764
+ if (!coords)
1765
+ return [];
1766
+ const res = await (await fetch(
1767
+ `https://maps.googleapis.com/maps/api/geocode/json?radius=200&latlng=${coords.latitude},${coords.longitude}&key=${GOOGLE_MAP_API_KEY}`
1768
+ )).json();
1769
+ const p = [];
1770
+ for (let key in res.results) {
1771
+ const { formatted_address: description, place_id } = res.results[key];
1772
+ p.push({
1773
+ description,
1774
+ id: place_id,
1775
+ latLng: { lst: coords.latitude, lng: coords.longitude }
1776
+ });
1777
+ }
1778
+ return p;
1779
+ };
1780
+ var Locator = ({
1781
+ variant = "contained",
1782
+ onLocationSelected,
1783
+ label,
1784
+ error,
1785
+ location = {
1786
+ description: null
1787
+ },
1788
+ renderInput,
1789
+ gutterBottom = 0,
1790
+ helperText,
1791
+ float = true,
1792
+ country = "ng"
1793
+ }) => {
1794
+ const { GOOGLE_MAP_API_KEY } = getConfig();
1795
+ const [changed, setChanged] = (0, import_react17.useState)(false);
1796
+ const [value, setValue] = (0, import_react17.useState)("");
1797
+ const [prediction, setPrediction] = (0, import_react17.useState)([]);
1798
+ const colors2 = useColors();
1799
+ const styles2 = import_react_native_size_matters15.ScaledSheet.create({
1800
+ list: {
1801
+ backgroundColor: colors2.white[2],
1802
+ elevation: 10,
1803
+ shadowColor: "#000",
1804
+ shadowOpacity: 0.1,
1805
+ shadowRadius: float ? 15 : 0,
1806
+ shadowOffset: {
1807
+ height: 10
1808
+ },
1809
+ borderRadius: 10,
1810
+ marginBottom: 10,
1811
+ width: "100%",
1812
+ zIndex: 20,
1813
+ marginTop: float ? 2 : "15@ms",
1814
+ top: float ? "100%" : void 0,
1815
+ position: float ? "absolute" : "relative"
1816
+ }
1817
+ });
1818
+ const search = async (query) => {
1819
+ const endpoint = `https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${query}&components=country:${country}&radius=20000&key=${GOOGLE_MAP_API_KEY}`;
1820
+ const res = await (await fetch(endpoint)).json();
1821
+ const p = [];
1822
+ for (let key in res.predictions) {
1823
+ const { description, place_id } = res.predictions[key];
1824
+ p.push({
1825
+ description,
1826
+ id: place_id
1827
+ });
1828
+ }
1829
+ setPrediction(p);
1830
+ };
1831
+ const locateMe = () => {
1832
+ const getLoc = async () => {
1833
+ const { status } = await Location.requestForegroundPermissionsAsync();
1834
+ if (status !== "granted")
1835
+ return import_react_native17.Alert.alert(
1836
+ "Error",
1837
+ "Permission to access location was denied! "
1838
+ );
1839
+ try {
1840
+ let { coords } = await Location.getCurrentPositionAsync({
1841
+ accuracy: Location.LocationAccuracy.High
1842
+ });
1843
+ const p = await getPredictionsFromCoords(coords);
1844
+ setPrediction(p);
1845
+ } catch (err) {
1846
+ console.log(err);
1847
+ import_react_native17.Alert.alert(
1848
+ "Can't access your location",
1849
+ "Make sure your location settings are turned on and you are connected to the internet. "
1850
+ );
1851
+ }
1852
+ };
1853
+ getLoc();
1854
+ };
1855
+ const clear = () => {
1856
+ setPrediction([]);
1857
+ setValue("");
1858
+ onLocationSelected(null);
1859
+ setChanged(false);
1860
+ };
1861
+ const locationPressed = async (loc) => {
1862
+ setValue(loc.description);
1863
+ const res = await (await fetch(
1864
+ `https://maps.googleapis.com/maps/api/place/details/json?place_id=${loc.id}&fields=formatted_address%2Cgeometry&key=${GOOGLE_MAP_API_KEY}`
1865
+ )).json();
1866
+ onLocationSelected(
1867
+ {
1868
+ latitude: res.result?.geometry.location.lat,
1869
+ longitude: res.result?.geometry.location.lng,
1870
+ description: loc.description
1871
+ },
1872
+ res.result?.formatted_address
1873
+ );
1874
+ setChanged(false);
1875
+ setPrediction([]);
1876
+ };
1877
+ (0, import_react17.useEffect)(() => {
1878
+ if (!GOOGLE_MAP_API_KEY)
1879
+ console.error(
1880
+ "Google map api key needs to be set to use this component \nMake sure to run initialize() with a valid google map api key"
1881
+ );
1882
+ }, [GOOGLE_MAP_API_KEY]);
1883
+ return /* @__PURE__ */ import_react17.default.createElement(import_react_native17.View, { style: { zIndex: 10 } }, renderInput ? renderInput({
1884
+ onFocus: () => search(value),
1885
+ onBlur: () => setPrediction([]),
1886
+ value: changed ? value : location?.description || value,
1887
+ onChangeText: (val) => {
1888
+ setChanged(true);
1889
+ setValue(val);
1890
+ search(val);
1891
+ },
1892
+ clear,
1893
+ locateMe
1894
+ }) : /* @__PURE__ */ import_react17.default.createElement(
1895
+ TextField_default,
1896
+ {
1897
+ label,
1898
+ onChangeText: (val) => {
1899
+ setChanged(true);
1900
+ setValue(val);
1901
+ search(val);
1902
+ },
1903
+ onBlur: () => {
1904
+ setPrediction([]);
1905
+ },
1906
+ onFocus: () => {
1907
+ search(value);
1908
+ },
1909
+ value: changed ? value : location?.description || value,
1910
+ gutterBottom,
1911
+ error,
1912
+ helperText,
1913
+ variant,
1914
+ end: /* @__PURE__ */ import_react17.default.createElement(import_react_native17.View, { style: { flexDirection: "row" } }, /* @__PURE__ */ import_react17.default.createElement(import_react_native17.TouchableOpacity, { onPress: locateMe, style: { marginRight: 10 } }, /* @__PURE__ */ import_react17.default.createElement(
1915
+ import_vector_icons9.Ionicons,
1916
+ {
1917
+ color: colors2.primary.main,
1918
+ size: 18,
1919
+ name: "location"
1920
+ }
1921
+ )), /* @__PURE__ */ import_react17.default.createElement(import_react_native17.TouchableOpacity, { onPress: clear }, /* @__PURE__ */ import_react17.default.createElement(import_vector_icons9.Ionicons, { color: colors2.dark.main, size: 18, name: "close" })))
1922
+ }
1923
+ ), prediction.length > 0 && /* @__PURE__ */ import_react17.default.createElement(import_react_native17.View, { style: styles2.list }, prediction.map(
1924
+ (cur, i) => i < 5 && /* @__PURE__ */ import_react17.default.createElement(
1925
+ ListItem,
1926
+ {
1927
+ divider: i < prediction.length - 1,
1928
+ key: cur.id,
1929
+ link: true,
1930
+ onPress: () => locationPressed(cur)
1931
+ },
1932
+ /* @__PURE__ */ import_react17.default.createElement(
1933
+ import_vector_icons9.Ionicons,
1934
+ {
1935
+ name: "location-outline",
1936
+ style: { marginRight: 10 },
1937
+ size: 16,
1938
+ color: colors2.textSecondary.main
1939
+ }
1940
+ ),
1941
+ /* @__PURE__ */ import_react17.default.createElement(Typography_default, { style: { flex: 1 } }, cur.description)
1942
+ )
1943
+ )));
1944
+ };
1945
+
1946
+ // ../src/Components/SafeAreaView.tsx
1947
+ var import_react_native18 = require("react-native");
1948
+ var import_react18 = __toESM(require("react"));
1949
+ var import_react_native19 = require("react-native");
1950
+ var import_react_native_size_matters16 = require("react-native-size-matters");
1951
+ var styles = import_react_native19.StyleSheet.create({
1952
+ droidSafeArea: {
1953
+ flex: 1,
1954
+ paddingTop: import_react_native19.Platform.OS === "android" ? (0, import_react_native_size_matters16.moderateScale)(35) : 0
1955
+ }
1956
+ });
1957
+ var SafeAreaView = ({
1958
+ children,
1959
+ style
1960
+ }) => {
1961
+ return /* @__PURE__ */ import_react18.default.createElement(import_react_native18.SafeAreaView, { style: { ...styles.droidSafeArea, ...style } }, children);
1962
+ };
1963
+
1964
+ // ../src/Components/Divider.tsx
1965
+ var import_react_native20 = require("react-native");
1966
+ var import_react_native_size_matters17 = require("react-native-size-matters");
1967
+ var Divider = ({
1968
+ height = 1,
1969
+ color = "textSecondary",
1970
+ gutterBottom = 0,
1971
+ style
1972
+ }) => {
1973
+ const colors2 = useColors();
1974
+ const styles2 = import_react_native_size_matters17.ScaledSheet.create({
1975
+ root: {
1976
+ height,
1977
+ backgroundColor: colors2[color].main,
1978
+ marginBottom: (0, import_react_native_size_matters17.ms)(gutterBottom),
1979
+ ...style
1980
+ }
1981
+ });
1982
+ return /* @__PURE__ */ React.createElement(import_react_native20.View, { style: styles2.root });
1983
+ };
1984
+
1985
+ // ../src/Components/Spinner.tsx
1986
+ var import_react19 = __toESM(require("react"));
1987
+ var import_react_native21 = require("react-native");
1988
+ var import_react_native_size_matters18 = require("react-native-size-matters");
1989
+ var Spinner = ({
1990
+ label,
1991
+ size = "large",
1992
+ color = "primary",
1993
+ fullscreen = false,
1994
+ style = {}
1995
+ }) => {
1996
+ const colors2 = useColors();
1997
+ const styles2 = import_react_native_size_matters18.ScaledSheet.create({
1998
+ root: {
1999
+ width: fullscreen ? import_react_native21.Dimensions.get("screen").width : "100%",
2000
+ height: fullscreen ? import_react_native21.Dimensions.get("screen").height : "100%",
2001
+ left: 0,
2002
+ bottom: 0,
2003
+ zIndex: 100,
2004
+ alignItems: "center",
2005
+ justifyContent: "center",
2006
+ position: fullscreen ? "absolute" : "relative",
2007
+ backgroundColor: fullscreen ? colors2.white[1] + "d" : void 0,
2008
+ ...style
2009
+ },
2010
+ content: {
2011
+ flexDirection: "row",
2012
+ alignItems: "center",
2013
+ paddingVertical: "15@vs",
2014
+ paddingHorizontal: "20@s",
2015
+ borderRadius: 10
2016
+ // backgroundColor: fullscreen ? colors.light.main : null,
2017
+ },
2018
+ label: {
2019
+ marginLeft: "10@s",
2020
+ color: color === "light" ? colors2.white[2] : colors2.black[4]
2021
+ }
2022
+ });
2023
+ return /* @__PURE__ */ import_react19.default.createElement(import_react_native21.View, { style: styles2.root }, /* @__PURE__ */ import_react19.default.createElement(import_react_native21.View, { style: styles2.content }, /* @__PURE__ */ import_react19.default.createElement(import_react_native21.ActivityIndicator, { color: colors2[color].dark, size }), label && /* @__PURE__ */ import_react19.default.createElement(Typography_default, { style: styles2.label }, label)));
2024
+ };
2025
+ var Spinner_default = Spinner;
2026
+
2027
+ // ../src/Components/OTPInput.tsx
2028
+ var import_react20 = __toESM(require("react"));
2029
+ var import_react_native22 = require("react-native");
2030
+ var import_react_native_size_matters19 = require("react-native-size-matters");
2031
+ var OTPInput = ({
2032
+ length = 6,
2033
+ onChange = () => {
2034
+ },
2035
+ value = "",
2036
+ variant = "outlined",
2037
+ spacing = 1,
2038
+ size = 45
2039
+ }) => {
2040
+ const inputRefs = (0, import_react20.useMemo)(
2041
+ () => Array(length).fill(0).map((_) => import_react20.default.createRef()),
2042
+ [length]
2043
+ );
2044
+ console.log("v", value);
2045
+ const onChangeHandler = (val, index) => {
2046
+ if (value.length >= length && val.length > 0)
2047
+ return;
2048
+ if (val.length > 1) {
2049
+ console.log("reached", val);
2050
+ const digits = val.replace(/\D/g, "").slice(0, length);
2051
+ onChange(digits);
2052
+ if (digits.length === length) {
2053
+ inputRefs[length - 1].current?.focus();
2054
+ }
2055
+ return;
2056
+ }
2057
+ if (val.length === 0) {
2058
+ const newValue2 = value.slice(0, index) + value.slice(index + 1);
2059
+ onChange(newValue2);
2060
+ if (index > 0) {
2061
+ inputRefs[index - 1].current?.focus();
2062
+ }
2063
+ return;
2064
+ }
2065
+ const digit = val.replace(/\D/g, "").slice(0, 1);
2066
+ if (!digit)
2067
+ return;
2068
+ const newValue = value.slice(0, index) + digit + value.slice(index + 1);
2069
+ onChange(newValue);
2070
+ if (index < length - 1) {
2071
+ inputRefs[index + 1].current?.focus();
2072
+ }
2073
+ };
2074
+ const colors2 = useColors();
2075
+ const styles2 = import_react_native_size_matters19.ScaledSheet.create({
2076
+ root: {},
2077
+ container: { flexDirection: "row" },
2078
+ input: {
2079
+ height: (0, import_react_native_size_matters19.ms)(size),
2080
+ width: (0, import_react_native_size_matters19.ms)(size),
2081
+ borderColor: colors2.white[5],
2082
+ backgroundColor: variant === "contained" ? colors2.white[3] : void 0,
2083
+ borderWidth: variant === "outlined" ? 1 : 0,
2084
+ borderBottomWidth: variant === "contained" ? 0 : 1,
2085
+ marginHorizontal: (0, import_react_native_size_matters19.ms)(spacing * 5),
2086
+ textAlign: "center",
2087
+ borderRadius: variant === "text" ? 0 : 10,
2088
+ color: colors2.dark.main,
2089
+ fontSize: (0, import_react_native_size_matters19.ms)(size * 0.5)
2090
+ }
2091
+ });
2092
+ return /* @__PURE__ */ import_react20.default.createElement(import_react_native22.View, { style: styles2.root }, /* @__PURE__ */ import_react20.default.createElement(import_react_native22.View, { style: styles2.container }, [...Array(length)].map((_, index) => /* @__PURE__ */ import_react20.default.createElement(
2093
+ import_react_native22.TextInput,
2094
+ {
2095
+ ref: inputRefs[index],
2096
+ onChangeText: (val) => onChangeHandler(val, index),
2097
+ value: value[index] || "",
2098
+ blurOnSubmit: false,
2099
+ keyboardType: "number-pad",
2100
+ key: index,
2101
+ style: [styles2.input]
2102
+ }
2103
+ ))));
2104
+ };
2105
+
2106
+ // index.ts
2107
+ var HoddyUI = {
2108
+ initialize
2109
+ };
2110
+ var next_default = HoddyUI;
2111
+ // Annotate the CommonJS export names for ESM import in node:
2112
+ 0 && (module.exports = {
2113
+ AdaptiveStatusBar,
2114
+ AlertX,
2115
+ Avatar,
2116
+ Button,
2117
+ CheckBox,
2118
+ Divider,
2119
+ FormWrapper,
2120
+ Grid,
2121
+ GridItem,
2122
+ IconButton,
2123
+ LinkButton,
2124
+ Locator,
2125
+ OTPInput,
2126
+ Popup,
2127
+ RatingInput,
2128
+ RatingStars,
2129
+ SafeAreaView,
2130
+ SelectMenu,
2131
+ Spinner,
2132
+ TextField,
2133
+ TextField2,
2134
+ Typography,
2135
+ UIThemeContext,
2136
+ UIThemeProvider,
2137
+ getPredictionsFromCoords,
2138
+ showFlashMessage,
2139
+ useColors,
2140
+ useNavScreenOptions,
2141
+ useTheme
2142
+ });
2143
+ //# sourceMappingURL=index.js.map