@hoddy-ui/next 2.0.11 → 2.0.13

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