@hoddy-ui/next 1.0.2

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,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 = ({
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 = ({
693
+ elevation = 0,
694
+ onPress = () => {
695
+ },
696
+ disabled = false,
697
+ title,
698
+ loading,
699
+ size = "normal",
700
+ rounded = false,
701
+ gutterBottom,
702
+ style = {},
703
+ fullWidth = false,
704
+ translucent = false,
705
+ color = "primary",
706
+ variant = "contained",
707
+ start,
708
+ end
709
+ }) => {
710
+ const colors2 = useColors();
711
+ const styles2 = import_react_native_size_matters6.ScaledSheet.create({
712
+ con: {
713
+ flexDirection: "row",
714
+ alignItems: "center",
715
+ alignSelf: "flex-start",
716
+ justifyContent: "center",
717
+ 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,
718
+ borderRadius: rounded ? 30 : 10,
719
+ elevation: variant === "text" ? 0 : elevation,
720
+ paddingVertical: size === "small" ? 8 : size === "large" ? "15@ms" : "13@ms",
721
+ paddingHorizontal: size === "small" ? "10@ms" : "18@ms",
722
+ borderColor: colors2[color].main,
723
+ borderWidth: variant === "outlined" ? 1 : 0,
724
+ shadowColor: "#000",
725
+ shadowRadius: elevation,
726
+ marginBottom: gutterBottom,
727
+ shadowOffset: {
728
+ height: elevation / 2,
729
+ width: 0
730
+ },
731
+ shadowOpacity: variant === "text" ? 0 : 0.3,
732
+ width: fullWidth ? "100%" : null,
733
+ ...style
734
+ },
735
+ text: {
736
+ color: disabled ? variant === "text" || variant === "outlined" ? colors2.black[1] : colors2[color].text : colors2[color][variant === "text" || variant === "outlined" ? "main" : "text"],
737
+ fontWeight: variant === "outlined" ? "700" : "500",
738
+ fontSize: size === "small" ? "12@ms" : "16@ms"
739
+ }
740
+ });
741
+ return /* @__PURE__ */ import_react8.default.createElement(import_react_native8.TouchableOpacity, { onPress, disabled, style: styles2.con }, start, loading && /* @__PURE__ */ import_react8.default.createElement(
742
+ import_react_native8.ActivityIndicator,
743
+ {
744
+ size: "small",
745
+ color: colors2[color].text,
746
+ style: { marginRight: 10 }
747
+ }
748
+ ), /* @__PURE__ */ import_react8.default.createElement(import_react_native8.Text, { style: styles2.text }, title), end);
749
+ };
750
+ var Button_default = Button;
751
+
752
+ // ../src/Components/Checkbox.tsx
753
+ var import_vector_icons4 = require("@expo/vector-icons");
754
+ var import_react9 = __toESM(require("react"));
755
+ var import_react_native9 = require("react-native");
756
+ var import_react_native_size_matters7 = require("react-native-size-matters");
757
+ var CheckBox = ({
758
+ color = "primary",
759
+ checked,
760
+ size = 24,
761
+ label,
762
+ style = {},
763
+ onChange
764
+ }) => {
765
+ const iconName = checked ? "checkbox-marked" : "checkbox-blank-outline";
766
+ const colors2 = useColors();
767
+ const styles2 = import_react_native_size_matters7.ScaledSheet.create({
768
+ container: {
769
+ alignItems: "center",
770
+ flexDirection: "row",
771
+ ...style
772
+ }
773
+ });
774
+ 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(
775
+ import_vector_icons4.MaterialCommunityIcons,
776
+ {
777
+ name: iconName,
778
+ size,
779
+ color: colors2[color].main
780
+ }
781
+ )), label);
782
+ };
783
+
784
+ // ../src/Components/FormWrapper.tsx
785
+ var import_react10 = __toESM(require("react"));
786
+ var import_react_native10 = require("react-native");
787
+ var import_react_native_size_matters8 = require("react-native-size-matters");
788
+ var FormWrapper = ({
789
+ children,
790
+ behavior = import_react_native10.Platform.OS === "ios" ? "padding" : "height",
791
+ contentContainerStyle,
792
+ mode = "scroll",
793
+ keyboardVerticalOffset = 10,
794
+ style = {},
795
+ onScroll
796
+ }) => {
797
+ const styles2 = import_react_native_size_matters8.ScaledSheet.create({
798
+ root: {
799
+ width: "100%",
800
+ flex: 1,
801
+ ...style
802
+ }
803
+ });
804
+ 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(
805
+ import_react_native10.KeyboardAvoidingView,
806
+ {
807
+ style: styles2.root,
808
+ behavior,
809
+ contentContainerStyle: styles2.root,
810
+ keyboardVerticalOffset
811
+ },
812
+ children
813
+ )) : /* @__PURE__ */ import_react10.default.createElement(
814
+ import_react_native10.KeyboardAvoidingView,
815
+ {
816
+ behavior,
817
+ style: styles2.root,
818
+ keyboardVerticalOffset
819
+ },
820
+ /* @__PURE__ */ import_react10.default.createElement(
821
+ import_react_native10.ScrollView,
822
+ {
823
+ onScroll,
824
+ showsVerticalScrollIndicator: false,
825
+ scrollEventThrottle: 40,
826
+ keyboardDismissMode: "interactive",
827
+ contentContainerStyle,
828
+ keyboardShouldPersistTaps: "handled"
829
+ },
830
+ children
831
+ )
832
+ );
833
+ };
834
+
835
+ // ../src/Components/StarRating.tsx
836
+ var import_vector_icons5 = require("@expo/vector-icons");
837
+ var Haptics = __toESM(require("expo-haptics"));
838
+ var import_react12 = require("react");
839
+ var import_react_native12 = require("react-native");
840
+ var import_react_native_size_matters10 = require("react-native-size-matters");
841
+
842
+ // ../src/Components/Popup.tsx
843
+ var import_react_native11 = require("react-native");
844
+ var import_react11 = __toESM(require("react"));
845
+ var import_react_native_size_matters9 = require("react-native-size-matters");
846
+ var Popup = ({
847
+ title,
848
+ sheet,
849
+ bare = false,
850
+ keyboardVerticalOffset,
851
+ children,
852
+ open,
853
+ onClose = () => {
854
+ }
855
+ }) => {
856
+ const colors2 = useColors();
857
+ const [show, setShow] = (0, import_react11.useState)(open);
858
+ const [showSecondary, setShowSecondary] = (0, import_react11.useState)(false);
859
+ const styles2 = import_react_native_size_matters9.ScaledSheet.create({
860
+ root: {
861
+ height: "100%",
862
+ width: "100%",
863
+ justifyContent: sheet ? "flex-end" : "center"
864
+ },
865
+ avoidingView: {
866
+ minHeight: typeof sheet === "number" ? sheet : void 0,
867
+ maxHeight: "80%",
868
+ zIndex: 1e3,
869
+ alignSelf: "center",
870
+ maxWidth: sheet ? void 0 : "90%",
871
+ width: sheet ? "100%" : void 0
872
+ },
873
+ container: {
874
+ paddingBottom: sheet ? "30@ms" : 0,
875
+ backgroundColor: colors2.white[2],
876
+ borderTopLeftRadius: 20,
877
+ borderTopRightRadius: 20,
878
+ borderBottomRightRadius: sheet ? 0 : 20,
879
+ borderBottomLeftRadius: sheet ? 0 : 20,
880
+ width: "100%"
881
+ },
882
+ content: {
883
+ paddingHorizontal: bare ? void 0 : "10@ms"
884
+ // flex: 1,
885
+ },
886
+ title: {
887
+ flexDirection: "row",
888
+ alignItems: "center",
889
+ paddingVertical: "5@ms",
890
+ paddingHorizontal: "10@ms",
891
+ marginBottom: "10@ms"
892
+ },
893
+ backdrop: {
894
+ position: "absolute",
895
+ height: "100%",
896
+ zIndex: -1,
897
+ width: "100%",
898
+ backgroundColor: "#000b"
899
+ }
900
+ });
901
+ import_react11.default.useEffect(() => {
902
+ setShow(open);
903
+ setTimeout(() => {
904
+ setShowSecondary(open);
905
+ }, 500);
906
+ }, [open]);
907
+ const closeAction = () => {
908
+ setShow(false);
909
+ onClose();
910
+ };
911
+ return /* @__PURE__ */ import_react11.default.createElement(import_react11.default.Fragment, null, /* @__PURE__ */ import_react11.default.createElement(
912
+ import_react_native11.Modal,
913
+ {
914
+ transparent: true,
915
+ animationType: "fade",
916
+ statusBarTranslucent: true,
917
+ visible: show,
918
+ onRequestClose: closeAction
919
+ },
920
+ /* @__PURE__ */ import_react11.default.createElement(import_react_native11.View, { style: styles2.backdrop }),
921
+ /* @__PURE__ */ import_react11.default.createElement(UIThemeProvider, null, /* @__PURE__ */ import_react11.default.createElement(
922
+ import_react_native11.Modal,
923
+ {
924
+ transparent: true,
925
+ animationType: "slide",
926
+ statusBarTranslucent: true,
927
+ visible: showSecondary,
928
+ onRequestClose: closeAction
929
+ },
930
+ /* @__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(
931
+ import_react_native11.Pressable,
932
+ {
933
+ style: import_react_native11.StyleSheet.absoluteFill,
934
+ onPress: closeAction
935
+ }
936
+ ), /* @__PURE__ */ import_react11.default.createElement(
937
+ import_react_native11.KeyboardAvoidingView,
938
+ {
939
+ style: styles2.avoidingView,
940
+ keyboardVerticalOffset,
941
+ behavior: import_react_native11.Platform.OS === "ios" ? "position" : "padding"
942
+ },
943
+ /* @__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(
944
+ IconButton,
945
+ {
946
+ size: 20,
947
+ icon: "close",
948
+ onPress: closeAction
949
+ }
950
+ ), /* @__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))
951
+ )))
952
+ ))
953
+ ));
954
+ };
955
+
956
+ // ../src/Components/StarRating.tsx
957
+ var RatingStars = ({
958
+ rating = 0,
959
+ size = 16
960
+ }) => {
961
+ const colors2 = useColors();
962
+ const styles2 = import_react_native_size_matters10.ScaledSheet.create({
963
+ root: {
964
+ flexDirection: "row",
965
+ alignItems: "center"
966
+ }
967
+ });
968
+ 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(
969
+ import_vector_icons5.Ionicons,
970
+ {
971
+ key: index,
972
+ name: "star",
973
+ size,
974
+ color: colors2.textSecondary.light
975
+ }
976
+ )));
977
+ };
978
+ var RatingInput = ({
979
+ onSubmit: _onSubmit,
980
+ rating = 0,
981
+ size = 16
982
+ }) => {
983
+ const [showReviewsModal, setShowReviewsModal] = (0, import_react12.useState)(false);
984
+ const [rate, setRate] = (0, import_react12.useState)(0);
985
+ const colors2 = useColors();
986
+ const [loading, setLoading] = (0, import_react12.useState)(false);
987
+ const [review, setReview] = (0, import_react12.useState)("");
988
+ const styles2 = import_react_native_size_matters10.ScaledSheet.create({
989
+ root: {
990
+ flexDirection: "row",
991
+ alignItems: "center"
992
+ },
993
+ inputCon: {
994
+ marginBottom: "20@vs",
995
+ backgroundColor: colors2.white[3],
996
+ padding: "15@ms",
997
+ borderRadius: 20
998
+ },
999
+ input: {
1000
+ fontSize: "16@ms",
1001
+ color: colors2.dark.main,
1002
+ height: "100@vs"
1003
+ }
1004
+ });
1005
+ (0, import_react12.useEffect)(() => {
1006
+ setRate(rating);
1007
+ }, [rating]);
1008
+ const onRate = (index) => {
1009
+ setRate(index + 1);
1010
+ Haptics.selectionAsync();
1011
+ setTimeout(() => {
1012
+ setShowReviewsModal(true);
1013
+ }, 500);
1014
+ };
1015
+ const onSubmit = async () => {
1016
+ setLoading(true);
1017
+ setShowReviewsModal(false);
1018
+ _onSubmit && await _onSubmit({ rating: rate, review });
1019
+ setLoading(false);
1020
+ };
1021
+ 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(
1022
+ import_react_native12.TouchableOpacity,
1023
+ {
1024
+ key: index,
1025
+ activeOpacity: 0.9,
1026
+ onPress: () => {
1027
+ onRate(index);
1028
+ }
1029
+ },
1030
+ /* @__PURE__ */ React.createElement(
1031
+ import_vector_icons5.Ionicons,
1032
+ {
1033
+ style: { marginLeft: 10 },
1034
+ name: index < rate ? "star" : "star-outline",
1035
+ size,
1036
+ color: colors2.primary.light
1037
+ }
1038
+ )
1039
+ ))), /* @__PURE__ */ React.createElement(
1040
+ Popup,
1041
+ {
1042
+ sheet: true,
1043
+ open: showReviewsModal,
1044
+ onClose: () => {
1045
+ setShowReviewsModal(false);
1046
+ }
1047
+ },
1048
+ /* @__PURE__ */ React.createElement(
1049
+ import_react_native12.View,
1050
+ {
1051
+ style: {
1052
+ alignItems: "center",
1053
+ marginBottom: 5
1054
+ }
1055
+ },
1056
+ /* @__PURE__ */ React.createElement(RatingStars, { rating: rate, size: 24 })
1057
+ ),
1058
+ /* @__PURE__ */ React.createElement(
1059
+ Typography_default,
1060
+ {
1061
+ align: "center",
1062
+ fontWeight: 700,
1063
+ variant: "h5",
1064
+ gutterBottom: 20
1065
+ },
1066
+ "Add to your review"
1067
+ ),
1068
+ /* @__PURE__ */ React.createElement(import_react_native12.View, { style: styles2.inputCon }, /* @__PURE__ */ React.createElement(
1069
+ import_react_native12.TextInput,
1070
+ {
1071
+ style: styles2.input,
1072
+ multiline: true,
1073
+ value: review,
1074
+ onChangeText: (text) => setReview(text),
1075
+ placeholder: "Type review here.."
1076
+ }
1077
+ )),
1078
+ /* @__PURE__ */ React.createElement(
1079
+ Button_default,
1080
+ {
1081
+ gutterBottom: 40,
1082
+ title: "Submit Review",
1083
+ loading,
1084
+ disabled: loading,
1085
+ onPress: () => {
1086
+ onSubmit();
1087
+ }
1088
+ }
1089
+ )
1090
+ ));
1091
+ };
1092
+
1093
+ // ../src/Components/Grid.tsx
1094
+ var import_react_native13 = require("react-native");
1095
+ var import_react13 = __toESM(require("react"));
1096
+ var import_react_native_size_matters11 = require("react-native-size-matters");
1097
+ var GridItem = ({
1098
+ children,
1099
+ col = 2,
1100
+ alignItems,
1101
+ spacing = 1,
1102
+ style = {}
1103
+ }) => {
1104
+ const styles2 = import_react_native_size_matters11.ScaledSheet.create({
1105
+ gridItem: {
1106
+ width: 100 / col + "%",
1107
+ padding: spacing * 10 + "@ms",
1108
+ alignItems
1109
+ }
1110
+ });
1111
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native13.View, { children, style: [styles2.gridItem, style] });
1112
+ };
1113
+ var Grid = ({
1114
+ children,
1115
+ spacing = 1,
1116
+ style = {}
1117
+ }) => {
1118
+ const styles2 = import_react_native_size_matters11.ScaledSheet.create({
1119
+ grid: {
1120
+ flexWrap: "wrap",
1121
+ margin: -spacing * 10 + "@ms",
1122
+ flexDirection: "row"
1123
+ }
1124
+ });
1125
+ return /* @__PURE__ */ import_react13.default.createElement(import_react_native13.View, { children, style: [styles2.grid, style] });
1126
+ };
1127
+
1128
+ // ../src/Components/Locator.tsx
1129
+ var import_vector_icons9 = require("@expo/vector-icons");
1130
+ var import_react17 = __toESM(require("react"));
1131
+ var import_react_native17 = require("react-native");
1132
+
1133
+ // ../src/Components/List.tsx
1134
+ var import_vector_icons6 = require("@expo/vector-icons");
1135
+ var import_react14 = __toESM(require("react"));
1136
+ var import_react_native14 = require("react-native");
1137
+ var import_react_native_size_matters12 = require("react-native-size-matters");
1138
+ var ListItem = ({
1139
+ link = false,
1140
+ divider = false,
1141
+ onPress,
1142
+ index = 1,
1143
+ style = {},
1144
+ children
1145
+ }) => {
1146
+ const colors2 = useColors();
1147
+ const styles2 = import_react_native_size_matters12.ScaledSheet.create({
1148
+ root: {
1149
+ flexDirection: "row",
1150
+ alignItems: "center",
1151
+ paddingHorizontal: "10@s",
1152
+ borderBottomColor: colors2.white[4],
1153
+ borderBottomWidth: divider ? 1 : 0,
1154
+ paddingVertical: "10@vs"
1155
+ }
1156
+ });
1157
+ return /* @__PURE__ */ import_react14.default.createElement(
1158
+ import_react_native14.View,
1159
+ null,
1160
+ /* @__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(
1161
+ import_vector_icons6.MaterialIcons,
1162
+ {
1163
+ color: colors2.white[5],
1164
+ style: { marginLeft: "auto" },
1165
+ name: "arrow-forward-ios",
1166
+ size: 15
1167
+ }
1168
+ )))
1169
+ );
1170
+ };
1171
+
1172
+ // ../src/Components/TextField.tsx
1173
+ var import_vector_icons8 = require("@expo/vector-icons");
1174
+ var import_react16 = __toESM(require("react"));
1175
+ var import_react_native16 = require("react-native");
1176
+ var import_react_native_size_matters14 = require("react-native-size-matters");
1177
+
1178
+ // ../src/Components/SelectMenu.tsx
1179
+ var import_vector_icons7 = require("@expo/vector-icons");
1180
+ var import_react15 = __toESM(require("react"));
1181
+ var import_react_native15 = require("react-native");
1182
+ var import_react_native_safe_area_context3 = require("react-native-safe-area-context");
1183
+ var import_react_native_size_matters13 = require("react-native-size-matters");
1184
+ var SelectMenu = ({
1185
+ open = false,
1186
+ onClose,
1187
+ value,
1188
+ options = [],
1189
+ onChange,
1190
+ disableAutoClose = false,
1191
+ label,
1192
+ secondary,
1193
+ helperText
1194
+ }) => {
1195
+ const colors2 = useColors();
1196
+ const { bottom } = (0, import_react_native_safe_area_context3.useSafeAreaInsets)();
1197
+ const [search, setSearch] = (0, import_react15.useState)("");
1198
+ const styles2 = import_react_native_size_matters13.ScaledSheet.create({
1199
+ root: {
1200
+ backgroundColor: colors2.white[1],
1201
+ flex: 1
1202
+ },
1203
+ content: {
1204
+ flex: 1,
1205
+ paddingHorizontal: "10@ms"
1206
+ },
1207
+ header: {
1208
+ paddingTop: "80@ms",
1209
+ marginBottom: "20@vs"
1210
+ },
1211
+ option: {
1212
+ paddingHorizontal: "10@s",
1213
+ paddingVertical: "10@vs",
1214
+ borderRadius: 8,
1215
+ flexDirection: "row",
1216
+ alignItems: "center",
1217
+ marginBottom: "10@vs"
1218
+ },
1219
+ footer: {
1220
+ paddingBottom: bottom,
1221
+ paddingHorizontal: "15@ms",
1222
+ paddingTop: "15@ms"
1223
+ }
1224
+ });
1225
+ const renderItem = (0, import_react15.useCallback)(
1226
+ ({ item }) => /* @__PURE__ */ import_react15.default.createElement(
1227
+ import_react_native15.TouchableOpacity,
1228
+ {
1229
+ style: {
1230
+ ...styles2.option,
1231
+ backgroundColor: item.value === value ? colors2.blue.light + "2" : colors2.white[2]
1232
+ },
1233
+ onPress: () => {
1234
+ onChange(item.value);
1235
+ if (!disableAutoClose)
1236
+ onClose();
1237
+ },
1238
+ key: item.label
1239
+ },
1240
+ item.start && /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: { marginRight: 10 } }, item.start),
1241
+ /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: { flex: 1 } }, /* @__PURE__ */ import_react15.default.createElement(
1242
+ Typography_default,
1243
+ {
1244
+ style: {
1245
+ color: item.value === value ? colors2.blue.light : colors2.black[2]
1246
+ }
1247
+ },
1248
+ item.label
1249
+ ), item.secondary ? /* @__PURE__ */ import_react15.default.createElement(
1250
+ Typography_default,
1251
+ {
1252
+ variant: "body2",
1253
+ style: {
1254
+ marginTop: 2,
1255
+ color: item.value === value ? colors2.blue.light : colors2.white[5]
1256
+ }
1257
+ },
1258
+ item.secondary
1259
+ ) : null),
1260
+ value === item.value && /* @__PURE__ */ import_react15.default.createElement(
1261
+ import_vector_icons7.MaterialIcons,
1262
+ {
1263
+ name: "check",
1264
+ color: colors2.blue.light,
1265
+ size: 24,
1266
+ style: { marginLeft: "auto" }
1267
+ }
1268
+ )
1269
+ ),
1270
+ [value, colors2]
1271
+ );
1272
+ 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(
1273
+ TextField_default,
1274
+ {
1275
+ label: "Search",
1276
+ value: search,
1277
+ type: "search",
1278
+ onChangeText: setSearch,
1279
+ variant: "outlined"
1280
+ }
1281
+ )), /* @__PURE__ */ import_react15.default.createElement(
1282
+ import_react_native15.FlatList,
1283
+ {
1284
+ removeClippedSubviews: true,
1285
+ keyExtractor: (item) => item.value,
1286
+ renderItem,
1287
+ data: options.filter(
1288
+ (item) => search.length > 1 ? item.label.toLowerCase().indexOf(search.toLowerCase()) > -1 : item
1289
+ ).sort((a, b) => a.label.localeCompare(b.label))
1290
+ }
1291
+ )), /* @__PURE__ */ import_react15.default.createElement(import_react_native15.View, { style: styles2.footer }, /* @__PURE__ */ import_react15.default.createElement(
1292
+ Button_default,
1293
+ {
1294
+ color: "error",
1295
+ variant: "outlined",
1296
+ fullWidth: true,
1297
+ title: "Close",
1298
+ onPress: onClose
1299
+ }
1300
+ ))));
1301
+ };
1302
+ var SelectMenu_default = SelectMenu;
1303
+
1304
+ // ../src/Components/TextField.tsx
1305
+ var TextField = ({
1306
+ label,
1307
+ keyboardType,
1308
+ variant,
1309
+ color = "primary",
1310
+ value,
1311
+ type,
1312
+ helperText,
1313
+ onChangeText,
1314
+ onSubmitEditing = () => {
1315
+ },
1316
+ onFocus = () => {
1317
+ },
1318
+ onBlur = () => {
1319
+ },
1320
+ error,
1321
+ start,
1322
+ size = "normal",
1323
+ rounded,
1324
+ disabled = false,
1325
+ style = {},
1326
+ inputStyles = {},
1327
+ gutterBottom = 0,
1328
+ end,
1329
+ options,
1330
+ ...props
1331
+ }) => {
1332
+ const colors2 = useColors();
1333
+ const [focused, setFocused] = (0, import_react16.useState)(false);
1334
+ const labelAnim = (0, import_react16.useRef)(new import_react_native16.Animated.Value(0)).current;
1335
+ const height = (0, import_react_native_size_matters14.moderateScale)(variant === "text" ? 50 : 45) * (size === "large" ? 1.2 : size === "small" ? 0.8 : 1);
1336
+ import_react16.default.useEffect(() => {
1337
+ if (focused || value) {
1338
+ import_react_native16.Animated.timing(labelAnim, {
1339
+ toValue: (0, import_react_native_size_matters14.verticalScale)(variant === "text" ? 2 : 4),
1340
+ duration: 300,
1341
+ useNativeDriver: false
1342
+ }).start();
1343
+ } else {
1344
+ import_react_native16.Animated.timing(labelAnim, {
1345
+ toValue: height / (0, import_react_native_size_matters14.moderateScale)(variant === "text" ? 2.5 : 3.2),
1346
+ duration: 300,
1347
+ useNativeDriver: false
1348
+ }).start();
1349
+ }
1350
+ }, [focused, value]);
1351
+ const styles2 = import_react_native_size_matters14.ScaledSheet.create({
1352
+ root: {
1353
+ marginBottom: gutterBottom + "@vs",
1354
+ width: "100%",
1355
+ ...style
1356
+ },
1357
+ container: {
1358
+ height,
1359
+ overflow: "hidden",
1360
+ backgroundColor: variant === "outlined" || variant === "text" ? "#fff0" : focused ? colors2.white[3] : colors2.white[4],
1361
+ flexDirection: "row",
1362
+ borderColor: error ? colors2.error.main : focused ? colors2[color].main : colors2.textSecondary.main,
1363
+ borderWidth: error ? 1 : variant === "outlined" ? focused ? 2 : 0.5 : 0,
1364
+ borderBottomWidth: variant === "text" ? 0.5 : void 0,
1365
+ width: "100%",
1366
+ borderRadius: variant === "text" ? 0 : rounded ? 30 : 7,
1367
+ alignItems: "center",
1368
+ ...inputStyles
1369
+ },
1370
+ input: {
1371
+ fontSize: "14@s",
1372
+ flex: 1,
1373
+ alignSelf: "stretch",
1374
+ paddingLeft: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1375
+ paddingRight: (0, import_react_native_size_matters14.moderateScale)(10),
1376
+ paddingTop: "11@vs",
1377
+ color: colors2.black[1],
1378
+ zIndex: 10
1379
+ // backgroundColor: "#284",
1380
+ },
1381
+ inputText: {
1382
+ fontSize: "14@ms",
1383
+ flex: 1,
1384
+ paddingLeft: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1385
+ paddingTop: "13@ms"
1386
+ },
1387
+ label: {
1388
+ position: "absolute",
1389
+ left: variant === "text" ? 0 : (0, import_react_native_size_matters14.moderateScale)(15),
1390
+ fontSize: focused || value ? "10@s" : "13@s",
1391
+ color: focused ? colors2[color].main : colors2.textSecondary.main
1392
+ },
1393
+ helperText: {
1394
+ paddingHorizontal: "15@s",
1395
+ flex: 1,
1396
+ color: focused ? colors2[color].dark : colors2.textSecondary.main,
1397
+ paddingTop: "4@ms"
1398
+ },
1399
+ error: {
1400
+ paddingLeft: 10,
1401
+ paddingRight: 10,
1402
+ paddingTop: 5,
1403
+ flexDirection: "row",
1404
+ alignItems: "center"
1405
+ },
1406
+ errorText: {
1407
+ fontSize: 12,
1408
+ marginLeft: 10
1409
+ }
1410
+ });
1411
+ const formProps = type === "email" ? {
1412
+ textContentType: "emailAddress",
1413
+ keyboardType: "email-address",
1414
+ autoCapitalize: "none",
1415
+ autoCompleteType: "email"
1416
+ } : type === "number" ? {
1417
+ keyboardType: "numeric"
1418
+ } : type === "tel" ? {
1419
+ textContentType: "telephoneNumber",
1420
+ keyboardType: "phone-pad"
1421
+ } : type === "search" ? {
1422
+ keyboardType: "web-search",
1423
+ returnKeyType: "search",
1424
+ autoCapitalize: "none"
1425
+ } : type === "password" ? {
1426
+ secureTextEntry: true,
1427
+ autoCompleteType: "password",
1428
+ autoCapitalize: "none",
1429
+ textContentType: "password"
1430
+ } : {};
1431
+ 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(
1432
+ import_react_native16.TouchableOpacity,
1433
+ {
1434
+ onPress: () => setFocused(true),
1435
+ style: styles2.container
1436
+ },
1437
+ /* @__PURE__ */ import_react16.default.createElement(import_react_native16.Animated.Text, { style: { ...styles2.label, top: labelAnim } }, label),
1438
+ start,
1439
+ options ? /* @__PURE__ */ import_react16.default.createElement(
1440
+ import_react_native16.View,
1441
+ {
1442
+ style: { flex: 1, alignItems: "center", flexDirection: "row" }
1443
+ },
1444
+ options.find((cur) => cur.value === value)?.start && /* @__PURE__ */ import_react16.default.createElement(
1445
+ import_react_native16.View,
1446
+ {
1447
+ style: {
1448
+ paddingTop: variant !== "outlined" ? (0, import_react_native_size_matters14.ms)(13) : 0,
1449
+ paddingRight: 10
1450
+ }
1451
+ },
1452
+ options.find((cur) => cur.value === value)?.start
1453
+ ),
1454
+ /* @__PURE__ */ import_react16.default.createElement(Typography_default, { style: styles2.inputText }, options.find((cur) => cur.value === value)?.label)
1455
+ ) : /* @__PURE__ */ import_react16.default.createElement(
1456
+ import_react_native16.TextInput,
1457
+ {
1458
+ onFocus: () => {
1459
+ onFocus();
1460
+ setFocused(true);
1461
+ },
1462
+ onBlur: () => {
1463
+ onBlur();
1464
+ setFocused(false);
1465
+ },
1466
+ value,
1467
+ onChangeText,
1468
+ keyboardType,
1469
+ editable: !disabled,
1470
+ selectTextOnFocus: !disabled,
1471
+ onSubmitEditing,
1472
+ placeholderTextColor: colors2.textSecondary.main,
1473
+ ...formProps,
1474
+ ...props,
1475
+ style: styles2.input
1476
+ }
1477
+ ),
1478
+ end && /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: { marginRight: 20 } }, end),
1479
+ options && /* @__PURE__ */ import_react16.default.createElement(import_react_native16.View, { style: { marginRight: 20 } }, /* @__PURE__ */ import_react16.default.createElement(
1480
+ import_vector_icons8.Ionicons,
1481
+ {
1482
+ name: "chevron-down",
1483
+ color: colors2.textSecondary.main,
1484
+ size: 24
1485
+ }
1486
+ ))
1487
+ ), helperText && /* @__PURE__ */ import_react16.default.createElement(
1488
+ Typography_default,
1489
+ {
1490
+ color: "textSecondary",
1491
+ style: styles2.helperText,
1492
+ variant: "caption"
1493
+ },
1494
+ helperText
1495
+ ), 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(
1496
+ SelectMenu_default,
1497
+ {
1498
+ options,
1499
+ value,
1500
+ open: focused,
1501
+ onClose: () => setFocused(false),
1502
+ label,
1503
+ helperText,
1504
+ onChange: onChangeText
1505
+ }
1506
+ ));
1507
+ };
1508
+ var TextField2 = ({
1509
+ label,
1510
+ keyboardType,
1511
+ variant,
1512
+ color = "primary",
1513
+ value,
1514
+ type,
1515
+ helperText,
1516
+ onChangeText,
1517
+ onSubmitEditing = () => {
1518
+ },
1519
+ onFocus = () => {
1520
+ },
1521
+ onBlur = () => {
1522
+ },
1523
+ error,
1524
+ start,
1525
+ rounded,
1526
+ disabled = false,
1527
+ style = {},
1528
+ inputStyles = {},
1529
+ gutterBottom = 8,
1530
+ placeholder,
1531
+ end,
1532
+ options,
1533
+ ...props
1534
+ }) => {
1535
+ const colors2 = useColors();
1536
+ const [focused, _setFocused] = (0, import_react16.useState)(false);
1537
+ const [showPassword, setShowPassword] = (0, import_react16.useState)(false);
1538
+ const labelAnim = (0, import_react16.useRef)(new import_react_native16.Animated.Value(0)).current;
1539
+ const height = (0, import_react_native_size_matters14.moderateScale)(
1540
+ props.multiline ? 50 + (props.numberOfLines || 1) * 18 : 50
1541
+ );
1542
+ const setFocused = (value2) => {
1543
+ (0, import_react16.startTransition)(() => {
1544
+ _setFocused(value2);
1545
+ });
1546
+ };
1547
+ import_react16.default.useEffect(() => {
1548
+ if (focused || value) {
1549
+ import_react_native16.Animated.timing(labelAnim, {
1550
+ toValue: (0, import_react_native_size_matters14.verticalScale)(5),
1551
+ duration: 300,
1552
+ useNativeDriver: false
1553
+ }).start();
1554
+ } else {
1555
+ import_react_native16.Animated.timing(labelAnim, {
1556
+ toValue: height / (0, import_react_native_size_matters14.moderateScale)(3),
1557
+ duration: 300,
1558
+ useNativeDriver: false
1559
+ }).start();
1560
+ }
1561
+ }, [focused, value]);
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