@hoddy-ui/core 1.0.87 → 1.0.89

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