@timardex/cluemart-shared 2.0.18 → 2.1.1
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/{ad-ZwLtQn9a.d.ts → ad-CUckkB7I.d.ts} +2 -2
- package/dist/{ad-xO8ltnGA.d.mts → ad-sqc3JME-.d.mts} +2 -2
- package/dist/{affiliate-Bv4PXBXC.d.mts → affiliate-7SDCo04C.d.mts} +2 -2
- package/dist/{affiliate-xDFlLdJI.d.ts → affiliate-C03r7ssL.d.ts} +2 -2
- package/dist/auth/index.d.mts +3 -3
- package/dist/auth/index.d.ts +3 -3
- package/dist/auth/index.mjs +5 -16
- package/dist/auth/index.mjs.map +1 -1
- package/dist/{chunk-ZUXHEXJU.mjs → chunk-6ZH75TAT.mjs} +3 -3
- package/dist/{chunk-3DYFIY72.mjs → chunk-7TZDJXYL.mjs} +1 -2
- package/dist/chunk-7TZDJXYL.mjs.map +1 -0
- package/dist/{chunk-UH6POK3Y.mjs → chunk-7XIDMA4Z.mjs} +2 -2
- package/dist/chunk-N46DFZ3R.mjs +20 -0
- package/dist/chunk-N46DFZ3R.mjs.map +1 -0
- package/dist/{chunk-JESR7H4R.mjs → chunk-PIEXGXTD.mjs} +1 -1
- package/dist/chunk-PIEXGXTD.mjs.map +1 -0
- package/dist/chunk-RE4NZPYY.mjs +43 -0
- package/dist/chunk-RE4NZPYY.mjs.map +1 -0
- package/dist/{chunk-5G3MQXQX.mjs → chunk-UHZHNJHO.mjs} +4 -4
- package/dist/{chunk-KUC252SN.mjs → chunk-YMLEIEZD.mjs} +5 -27
- package/dist/chunk-YMLEIEZD.mjs.map +1 -0
- package/dist/{chunk-PNKTKJ47.mjs → chunk-Z4FML4VL.mjs} +2 -2
- package/dist/{contactUs-DtKFwekV.d.ts → contactUs-BG3sJ6gc.d.ts} +1 -1
- package/dist/{contactUs-0IhAsiDW.d.mts → contactUs-CWFP59_0.d.mts} +1 -1
- package/dist/enums/index.cjs +0 -1
- package/dist/enums/index.cjs.map +1 -1
- package/dist/enums/index.d.mts +1 -2
- package/dist/enums/index.d.ts +1 -2
- package/dist/enums/index.mjs +1 -1
- package/dist/formFields/index.cjs.map +1 -1
- package/dist/formFields/index.d.mts +1 -1
- package/dist/formFields/index.d.ts +1 -1
- package/dist/formFields/index.mjs +6 -5
- package/dist/{global-C6w0hQ5Y.d.mts → global-BqeTWrvk.d.ts} +4 -1
- package/dist/{global-Coz5Jgi2.d.ts → global-CWo-hWKZ.d.mts} +4 -1
- package/dist/graphql/index.cjs +4 -27
- package/dist/graphql/index.cjs.map +1 -1
- package/dist/graphql/index.d.mts +6 -14
- package/dist/graphql/index.d.ts +6 -14
- package/dist/graphql/index.mjs +2 -4
- package/dist/hooks/index.cjs +0 -8
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.mts +5 -5
- package/dist/hooks/index.d.ts +5 -5
- package/dist/hooks/index.mjs +8 -7
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.cjs +47 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +9 -11
- package/dist/index.d.ts +9 -11
- package/dist/index.mjs +44 -27
- package/dist/index.mjs.map +1 -1
- package/dist/map/index.d.mts +1 -1
- package/dist/map/index.d.ts +1 -1
- package/dist/region/index.cjs +290 -0
- package/dist/region/index.cjs.map +1 -0
- package/dist/region/index.d.mts +36 -0
- package/dist/region/index.d.ts +36 -0
- package/dist/region/index.mjs +220 -0
- package/dist/region/index.mjs.map +1 -0
- package/dist/{resourceActivities-DScv6fiM.d.ts → resourceActivities-BbhGFtZA.d.ts} +1 -1
- package/dist/{resourceActivities-DIK3bwZg.d.mts → resourceActivities-D81u7Mu0.d.mts} +1 -1
- package/dist/sharing/index.cjs.map +1 -1
- package/dist/sharing/index.d.mts +1 -1
- package/dist/sharing/index.d.ts +1 -1
- package/dist/sharing/index.mjs +3 -3
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.mts +7 -7
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.mjs +2 -2
- package/dist/{user-DhxdbFT7.d.ts → user-2peJoOeK.d.ts} +1 -1
- package/dist/{user-BwcVKK-h.d.mts → user-DKcyf8gn.d.mts} +1 -1
- package/dist/utils/index.cjs +43 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.mts +8 -4
- package/dist/utils/index.d.ts +8 -4
- package/dist/utils/index.mjs +12 -4
- package/package.json +6 -1
- package/dist/chunk-3DYFIY72.mjs.map +0 -1
- package/dist/chunk-JESR7H4R.mjs.map +0 -1
- package/dist/chunk-KUC252SN.mjs.map +0 -1
- /package/dist/{chunk-ZUXHEXJU.mjs.map → chunk-6ZH75TAT.mjs.map} +0 -0
- /package/dist/{chunk-UH6POK3Y.mjs.map → chunk-7XIDMA4Z.mjs.map} +0 -0
- /package/dist/{chunk-5G3MQXQX.mjs.map → chunk-UHZHNJHO.mjs.map} +0 -0
- /package/dist/{chunk-PNKTKJ47.mjs.map → chunk-Z4FML4VL.mjs.map} +0 -0
package/dist/map/index.d.mts
CHANGED
package/dist/map/index.d.ts
CHANGED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/region/index.ts
|
|
22
|
+
var region_exports = {};
|
|
23
|
+
__export(region_exports, {
|
|
24
|
+
REGION_CENTERS: () => REGION_CENTERS,
|
|
25
|
+
nzRegions: () => nzRegions,
|
|
26
|
+
useRegionSelectionState: () => useRegionSelectionState
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(region_exports);
|
|
29
|
+
|
|
30
|
+
// src/enums/index.ts
|
|
31
|
+
var EnumRegions = /* @__PURE__ */ ((EnumRegions2) => {
|
|
32
|
+
EnumRegions2["All"] = "All Regions";
|
|
33
|
+
EnumRegions2["Auckland"] = "Auckland";
|
|
34
|
+
EnumRegions2["BayOfPlentyGisborne"] = "Bay of Plenty & Gisborne";
|
|
35
|
+
EnumRegions2["CanterburyWestCoast"] = "Canterbury & West Coast";
|
|
36
|
+
EnumRegions2["HawkesBay"] = "Hawke's Bay";
|
|
37
|
+
EnumRegions2["ManawatuWanganui"] = "Manawatu-Wanganui";
|
|
38
|
+
EnumRegions2["MarlboroughNelsonTasman"] = "Marlborough & Nelson & Tasman";
|
|
39
|
+
EnumRegions2["Northland"] = "Northland";
|
|
40
|
+
EnumRegions2["Otago"] = "Otago";
|
|
41
|
+
EnumRegions2["Southland"] = "Southland";
|
|
42
|
+
EnumRegions2["Taranaki"] = "Taranaki";
|
|
43
|
+
EnumRegions2["Waikato"] = "Waikato";
|
|
44
|
+
EnumRegions2["Wellington"] = "Wellington";
|
|
45
|
+
return EnumRegions2;
|
|
46
|
+
})(EnumRegions || {});
|
|
47
|
+
|
|
48
|
+
// src/region/constants.ts
|
|
49
|
+
var REGION_CENTERS = [
|
|
50
|
+
{
|
|
51
|
+
latitude: -36.8485,
|
|
52
|
+
latitudeDelta: 2,
|
|
53
|
+
longitude: 174.7633,
|
|
54
|
+
longitudeDelta: 2,
|
|
55
|
+
region: "Auckland" /* Auckland */
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
latitude: -38.1387,
|
|
59
|
+
latitudeDelta: 2,
|
|
60
|
+
longitude: 176.2452,
|
|
61
|
+
longitudeDelta: 2,
|
|
62
|
+
region: "Bay of Plenty & Gisborne" /* BayOfPlentyGisborne */
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
latitude: -43.5321,
|
|
66
|
+
latitudeDelta: 2,
|
|
67
|
+
longitude: 172.6362,
|
|
68
|
+
longitudeDelta: 2,
|
|
69
|
+
region: "Canterbury & West Coast" /* CanterburyWestCoast */
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
latitude: -39.4928,
|
|
73
|
+
latitudeDelta: 2,
|
|
74
|
+
longitude: 176.912,
|
|
75
|
+
longitudeDelta: 2,
|
|
76
|
+
region: "Hawke's Bay" /* HawkesBay */
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
latitude: -40.3523,
|
|
80
|
+
latitudeDelta: 2,
|
|
81
|
+
longitude: 175.6082,
|
|
82
|
+
longitudeDelta: 2,
|
|
83
|
+
region: "Manawatu-Wanganui" /* ManawatuWanganui */
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
latitude: -41.2706,
|
|
87
|
+
latitudeDelta: 2,
|
|
88
|
+
longitude: 173.284,
|
|
89
|
+
longitudeDelta: 2,
|
|
90
|
+
region: "Marlborough & Nelson & Tasman" /* MarlboroughNelsonTasman */
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
latitude: -35.7251,
|
|
94
|
+
latitudeDelta: 2,
|
|
95
|
+
longitude: 174.3237,
|
|
96
|
+
longitudeDelta: 2,
|
|
97
|
+
region: "Northland" /* Northland */
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
latitude: -45.8788,
|
|
101
|
+
latitudeDelta: 2,
|
|
102
|
+
longitude: 170.5028,
|
|
103
|
+
longitudeDelta: 2,
|
|
104
|
+
region: "Otago" /* Otago */
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
latitude: -46.4132,
|
|
108
|
+
latitudeDelta: 2,
|
|
109
|
+
longitude: 168.3538,
|
|
110
|
+
longitudeDelta: 2,
|
|
111
|
+
region: "Southland" /* Southland */
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
latitude: -39.0556,
|
|
115
|
+
latitudeDelta: 2,
|
|
116
|
+
longitude: 174.0752,
|
|
117
|
+
longitudeDelta: 2,
|
|
118
|
+
region: "Taranaki" /* Taranaki */
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
latitude: -37.787,
|
|
122
|
+
latitudeDelta: 2,
|
|
123
|
+
longitude: 175.2793,
|
|
124
|
+
longitudeDelta: 2,
|
|
125
|
+
region: "Waikato" /* Waikato */
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
latitude: -41.2866,
|
|
129
|
+
latitudeDelta: 2,
|
|
130
|
+
longitude: 174.7756,
|
|
131
|
+
longitudeDelta: 2,
|
|
132
|
+
region: "Wellington" /* Wellington */
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
latitude: -36.8624942,
|
|
136
|
+
// Default: New Zealand
|
|
137
|
+
latitudeDelta: 2,
|
|
138
|
+
longitude: 174.7450494,
|
|
139
|
+
longitudeDelta: 2,
|
|
140
|
+
region: "All Regions" /* All */
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
var nzRegions = Object.values(EnumRegions).filter(
|
|
144
|
+
(region) => region !== "All Regions" /* All */
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
// src/region/useRegionSelectionState.ts
|
|
148
|
+
var import_react2 = require("react");
|
|
149
|
+
|
|
150
|
+
// src/auth/UserProvider.tsx
|
|
151
|
+
var import_react = require("react");
|
|
152
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
153
|
+
var UserContext = (0, import_react.createContext)(void 0);
|
|
154
|
+
var useAuthUser = () => {
|
|
155
|
+
const context = (0, import_react.useContext)(UserContext);
|
|
156
|
+
if (!context) {
|
|
157
|
+
throw new Error("useAuthUser must be used within a UserProvider");
|
|
158
|
+
}
|
|
159
|
+
return context;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/utils/distance.ts
|
|
163
|
+
function getDistanceInMeters(coordinates1, coordinates2) {
|
|
164
|
+
const [lon1, lat1] = coordinates1;
|
|
165
|
+
const [lon2, lat2] = coordinates2;
|
|
166
|
+
const values = [lon1, lat1, lon2, lat2];
|
|
167
|
+
if (values.some((v) => !Number.isFinite(v))) {
|
|
168
|
+
return Infinity;
|
|
169
|
+
}
|
|
170
|
+
const toRadians = (deg) => deg * Math.PI / 180;
|
|
171
|
+
const R = 6371e3;
|
|
172
|
+
const dLat = toRadians(lat2 - lat1);
|
|
173
|
+
const dLon = toRadians(lon2 - lon1);
|
|
174
|
+
const radLat1 = toRadians(lat1);
|
|
175
|
+
const radLat2 = toRadians(lat2);
|
|
176
|
+
const a = Math.sin(dLat / 2) ** 2 + Math.sin(dLon / 2) ** 2 * Math.cos(radLat1) * Math.cos(radLat2);
|
|
177
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
178
|
+
return R * c;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// src/region/useRegionSelectionState.ts
|
|
182
|
+
function getDefaultRegion() {
|
|
183
|
+
const [first] = REGION_CENTERS;
|
|
184
|
+
if (first === void 0) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
"[useRegionSelectionState] REGION_CENTERS is empty \u2014 check the import."
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
return first;
|
|
190
|
+
}
|
|
191
|
+
function deriveRegion(location, preferredRegion) {
|
|
192
|
+
if (location) {
|
|
193
|
+
const { latitude, longitude } = location;
|
|
194
|
+
const userCoords = [longitude, latitude];
|
|
195
|
+
let nearestRegion = getDefaultRegion();
|
|
196
|
+
let nearestDistance = Infinity;
|
|
197
|
+
for (const region of REGION_CENTERS) {
|
|
198
|
+
const regionCoords = [
|
|
199
|
+
region.longitude,
|
|
200
|
+
region.latitude
|
|
201
|
+
];
|
|
202
|
+
const distance = getDistanceInMeters(userCoords, regionCoords);
|
|
203
|
+
if (Number.isFinite(distance) && distance < nearestDistance) {
|
|
204
|
+
nearestDistance = distance;
|
|
205
|
+
nearestRegion = region;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (Number.isFinite(nearestDistance)) {
|
|
209
|
+
return nearestRegion;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (preferredRegion) {
|
|
213
|
+
const preferred = REGION_CENTERS.find((r) => r.region === preferredRegion);
|
|
214
|
+
if (preferred) return preferred;
|
|
215
|
+
}
|
|
216
|
+
return getDefaultRegion();
|
|
217
|
+
}
|
|
218
|
+
function useRegionSelectionState({
|
|
219
|
+
location
|
|
220
|
+
}) {
|
|
221
|
+
const { authUser } = useAuthUser();
|
|
222
|
+
const preferredRegion = authUser?.preferredRegion;
|
|
223
|
+
const [selectedRegion, setSelectedRegion] = (0, import_react2.useState)(
|
|
224
|
+
() => deriveRegion(location, preferredRegion ?? null)
|
|
225
|
+
);
|
|
226
|
+
const [derivedRegion, setDerivedRegion] = (0, import_react2.useState)(
|
|
227
|
+
() => deriveRegion(location, preferredRegion ?? null)
|
|
228
|
+
);
|
|
229
|
+
const [loading, setLoading] = (0, import_react2.useState)(false);
|
|
230
|
+
const [hasManualSelection, setHasManualSelection] = (0, import_react2.useState)(false);
|
|
231
|
+
const timerRef = (0, import_react2.useRef)(null);
|
|
232
|
+
const prevUserIdRef = (0, import_react2.useRef)(authUser?._id);
|
|
233
|
+
(0, import_react2.useEffect)(() => {
|
|
234
|
+
if (prevUserIdRef.current !== authUser?._id) {
|
|
235
|
+
prevUserIdRef.current = authUser?._id;
|
|
236
|
+
setHasManualSelection(false);
|
|
237
|
+
}
|
|
238
|
+
}, [authUser?._id]);
|
|
239
|
+
(0, import_react2.useEffect)(() => {
|
|
240
|
+
const derived = deriveRegion(location, preferredRegion ?? null);
|
|
241
|
+
setDerivedRegion(derived);
|
|
242
|
+
if (hasManualSelection) return;
|
|
243
|
+
setSelectedRegion(derived);
|
|
244
|
+
}, [location, preferredRegion, hasManualSelection]);
|
|
245
|
+
const handleSelectRegion = (0, import_react2.useCallback)((region) => {
|
|
246
|
+
if (timerRef.current) {
|
|
247
|
+
clearTimeout(timerRef.current);
|
|
248
|
+
}
|
|
249
|
+
const regionCenter = REGION_CENTERS.find((r) => r.region === region) ?? getDefaultRegion();
|
|
250
|
+
setLoading(true);
|
|
251
|
+
setSelectedRegion(regionCenter);
|
|
252
|
+
setHasManualSelection(true);
|
|
253
|
+
timerRef.current = setTimeout(() => {
|
|
254
|
+
setLoading(false);
|
|
255
|
+
timerRef.current = null;
|
|
256
|
+
}, 500);
|
|
257
|
+
}, []);
|
|
258
|
+
const handleResetRegion = (0, import_react2.useCallback)(() => {
|
|
259
|
+
if (timerRef.current) {
|
|
260
|
+
clearTimeout(timerRef.current);
|
|
261
|
+
timerRef.current = null;
|
|
262
|
+
}
|
|
263
|
+
setLoading(false);
|
|
264
|
+
const derived = deriveRegion(location, preferredRegion ?? null);
|
|
265
|
+
setDerivedRegion(derived);
|
|
266
|
+
setSelectedRegion(derived);
|
|
267
|
+
setHasManualSelection(false);
|
|
268
|
+
}, [location, preferredRegion]);
|
|
269
|
+
(0, import_react2.useEffect)(() => {
|
|
270
|
+
return () => {
|
|
271
|
+
if (timerRef.current) {
|
|
272
|
+
clearTimeout(timerRef.current);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}, []);
|
|
276
|
+
return {
|
|
277
|
+
derivedRegion,
|
|
278
|
+
handleResetRegion,
|
|
279
|
+
handleSelectRegion,
|
|
280
|
+
loading,
|
|
281
|
+
selectedRegion
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
285
|
+
0 && (module.exports = {
|
|
286
|
+
REGION_CENTERS,
|
|
287
|
+
nzRegions,
|
|
288
|
+
useRegionSelectionState
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/region/index.ts","../../src/enums/index.ts","../../src/region/constants.ts","../../src/region/useRegionSelectionState.ts","../../src/auth/UserProvider.tsx","../../src/utils/distance.ts"],"sourcesContent":["/**\n * Region selection — shared state hook and NZ region constants.\n *\n * The hook takes `location` as a prop (platform-specific: Expo geolocation on\n * mobile, `navigator.geolocation` on web) and reads `authUser` from the shared\n * auth context. Apps keep a thin local `RegionSelectionProvider` that feeds\n * the platform location and exposes the result via context.\n *\n * `\"use client\"`: required for Next.js; ignored by React Native.\n */\n\"use client\";\n\nexport { REGION_CENTERS, nzRegions, type RegionCenterType } from \"./constants\";\nexport {\n useRegionSelectionState,\n type IUseRegionSelectionReturn,\n type UseRegionSelectionStateArgs,\n} from \"./useRegionSelectionState\";\n","export enum EnumInviteStatus {\n ACCEPTED = \"Accepted\",\n COMPLETED = \"Completed\",\n EXPIRED = \"Expired\",\n NO_STATUS = \"No_Status\",\n PENDING = \"Pending\",\n REJECTED = \"Rejected\",\n UNAVAILABLE = \"Unavailable\",\n}\n\nexport enum EnumChatReportReason {\n INAPPROPRIATE_CONTENT = \"Inappropriate_Content\",\n HARASSMENT_OR_BULLYING = \"Harassment_or_Bullying\",\n HATE_SPEECH = \"Hate_Speech\",\n SPAM_OR_SCAM = \"Spam_or_Scam\",\n VIOLENCE_OR_DANGEROUS_BEHAVIOR = \"Violence_or_Dangerous_Behavior\",\n OTHER = \"Other\",\n}\n\nexport enum EnumChatType {\n GROUP = \"group\",\n PRIVATE = \"private\",\n}\n\nexport enum EnumPaymentMethod {\n CASH = \"cash\",\n EFTPOS = \"eftpos\",\n BANK_TRANSFER = \"bank_transfer\",\n PAYPAL = \"paypal\",\n STRIPE = \"stripe\",\n}\n\nexport enum EnumFoodFlavor {\n SALTY = \"Salty\",\n SAVOURY = \"Savoury\",\n SPICY = \"Spicy\",\n SWEET = \"Sweet\",\n OTHER = \"Not_Applicable\",\n}\n\nexport enum EnumFoodType {\n ADDITIVE_FREE = \"Additive_Free\",\n AIR_FRIED = \"Air_Fried\",\n ALLERGEN_FRIENDLY = \"Allergen_Friendly\",\n ATHLETE_FRIENDLY = \"Athlete_Friendly\",\n BAKED = \"Baked\",\n DAIRY_FREE = \"Dairy_Free\",\n DIABETIC_FRIENDLY = \"Diabetic_Friendly\",\n EGG_FREE = \"Egg_Free\",\n FRESH = \"Fresh\",\n GLUTEN_FREE = \"Gluten_Free\",\n GRILLED = \"Grilled\",\n HALAL = \"Halal\",\n HEART_HEALTHY = \"Heart_Healthy\",\n HIGH_FIBER = \"High_Fiber\",\n HIGH_PROTEIN = \"High_Protein\",\n KETO = \"Keto\",\n KOSHER = \"Kosher\",\n LACTOSE_FREE = \"Lactose_Free\",\n LOW_CALORIE = \"Low_Calorie\",\n LOW_CARB = \"Low_Carb\",\n LOW_FAT = \"Low_Fat\",\n LOW_SODIUM = \"Low_Sodium\",\n NO_ADDED_SUGAR = \"No_Added_Sugar\",\n NO_PRESERVATIVES = \"No_Preservatives\",\n NON_GMO = \"Non_GMO\",\n NUT_FREE = \"Nut_Free\",\n ORGANIC = \"Organic\",\n PALEO = \"Paleo\",\n PLANT_BASED = \"Plant_Based\",\n RAW = \"Raw\",\n SMOKED = \"Smoked\",\n SOY_FREE = \"Soy_Free\",\n SUGAR_FREE = \"Sugar_Free\",\n VEGAN = \"Vegan\",\n VEGETARIAN = \"Vegetarian\",\n}\n\nexport enum EnumResourceType {\n AFFILIATE = \"affiliate\",\n EVENT = \"event\",\n PARTNER = \"partner\",\n SCHOOL = \"school\",\n VENDOR = \"vendor\",\n VISITOR = \"visitor\",\n}\n\n/** `EnumResourceType` values that map to a stored resource — excludes the user-only `VISITOR` type. */\nexport type NonVisitorResourceType = Exclude<\n EnumResourceType,\n EnumResourceType.VISITOR\n>;\n\n/** Type guard that narrows an `EnumResourceType` to `NonVisitorResourceType`. */\nexport function isNonVisitorResourceType(\n value: EnumResourceType,\n): value is NonVisitorResourceType {\n return value !== EnumResourceType.VISITOR;\n}\n\nexport enum EnumEventType {\n MARKET = \"Market\",\n EXPO = \"Expo\",\n FAIR = \"Fair\",\n FESTIVAL = \"Festival\",\n}\n\nexport enum EnumVendorType {\n STALLHOLDER = \"Stallholder\",\n SHOP = \"Shop\",\n}\n\nexport enum EnumPartnerType {\n CHARITY_PARTNER = \"Charity_Partner\",\n MEDIA_PARTNER = \"Media_Partner\",\n SUPPORTING_PARTNER = \"Supporting_Partner\",\n}\n\nexport enum EnumOSPlatform {\n ANDROID = \"android\",\n IOS = \"ios\",\n WEB = \"web\",\n}\n\nexport enum EnumRelationResource {\n EVENT_INVITE_VENDOR = \"event_invite_vendor\",\n EVENT_UPDATE_RELATION_TO_VENDOR = \"event_update_relation_to_vendor\",\n VENDOR_UPDATE_RELATION_TO_EVENT = \"vendor_update_relation_to_event\",\n VENDOR_APPLICATION_TO_EVENT = \"vendor_application_to_event\",\n}\n\nexport enum EnumNotificationResourceType {\n AFFILIATE_REWARD_RECEIVED = \"affiliate_reward_received\",\n APPROVED_AFFILIATE = \"approved_affiliate\",\n APPROVED_EVENT = \"approved_event\",\n APPROVED_PARTNER = \"approved_partner\",\n APPROVED_SCHOOL = \"approved_school\",\n APPROVED_VENDOR = \"approved_vendor\",\n CREATED_EVENT = \"created_event\",\n CREATED_PARTNER = \"created_partner\",\n CREATED_VENDOR = \"created_vendor\",\n DAILY_CLUE_GAME = \"daily_clue_game\",\n DEACTIVATED_EVENT = \"deactivated_event\",\n DEACTIVATED_PARTNER = \"deactivated_partner\",\n DEACTIVATED_VENDOR = \"deactivated_vendor\",\n DECLINED_EVENT = \"declined_event\",\n DECLINED_PARTNER = \"declined_partner\",\n DECLINED_VENDOR = \"declined_vendor\",\n DOWNGRADED_EVENT = \"downgraded_event\",\n DOWNGRADED_PARTNER = \"downgraded_partner\",\n DOWNGRADED_VENDOR = \"downgraded_vendor\",\n EVENT_INVITE_VENDOR = EnumRelationResource.EVENT_INVITE_VENDOR,\n EVENT_STARTING_SOON = \"event_starting_soon\",\n EVENT_UPDATE_RELATION_TO_VENDOR = EnumRelationResource.EVENT_UPDATE_RELATION_TO_VENDOR,\n EXPIRATION_REMINDER_EVENT = \"expiration_reminder_event\",\n EXPIRATION_REMINDER_PARTNER = \"expiration_reminder_partner\",\n EXPIRATION_REMINDER_VENDOR = \"expiration_reminder_vendor\",\n NEW_CHAT_MESSAGE = \"new_chat_message\",\n NEW_POST_CREATED = \"new_post_created\",\n REGISTERED_USER_BY_SCHOOL_CODE = \"registered_user_by_school_code\",\n SYSTEM_ALERT = \"system_alert\",\n USER_COUPON_REDEEMED = \"user_coupon_redeemed\",\n VENDOR_APPLICATION_TO_EVENT = EnumRelationResource.VENDOR_APPLICATION_TO_EVENT,\n VENDOR_UPDATE_RELATION_TO_EVENT = EnumRelationResource.VENDOR_UPDATE_RELATION_TO_EVENT,\n}\n\nexport enum EnumNotificationType {\n CHAT = \"chat\",\n EVENT = EnumResourceType.EVENT,\n RELATION = \"relation\",\n SYSTEM = \"system\",\n VENDOR = EnumResourceType.VENDOR,\n}\n\nexport enum EnumRegions {\n All = \"All Regions\",\n Auckland = \"Auckland\",\n BayOfPlentyGisborne = \"Bay of Plenty & Gisborne\",\n CanterburyWestCoast = \"Canterbury & West Coast\",\n HawkesBay = \"Hawke's Bay\",\n ManawatuWanganui = \"Manawatu-Wanganui\",\n MarlboroughNelsonTasman = \"Marlborough & Nelson & Tasman\",\n Northland = \"Northland\",\n Otago = \"Otago\",\n Southland = \"Southland\",\n Taranaki = \"Taranaki\",\n Waikato = \"Waikato\",\n Wellington = \"Wellington\",\n}\n\nexport enum ImageTypeEnum {\n AVATAR = \"avatar\",\n COVER = \"cover\",\n IMAGE = \"image\",\n LOGO = \"logo\",\n}\n\nexport enum EnumUserLicence {\n PRO_EVENT = \"pro_event\",\n PRO_PLUS_EVENT = \"pro_plus_event\",\n PRO_PLUS_VENDOR = \"pro_plus_vendor\",\n PRO_VENDOR = \"pro_vendor\",\n STANDARD_EVENT = \"standard_event\",\n STANDARD_VENDOR = \"standard_vendor\",\n STANDARD_PARTNER = \"standard_partner\",\n STANDARD_AFFILIATE = \"standard_affiliate\",\n STANDARD_SCHOOL = \"standard_school\",\n}\n\nexport enum LicenceExpiryDate {\n ONE_YEAR = \"1 year\",\n ONE_MONTH = \"1 month\",\n TWO_MONTHS = \"2 months\",\n THREE_MONTHS = \"3 months\",\n SIX_MONTHS = \"6 months\",\n}\n\nexport enum EnumUserRole {\n ADMIN = \"admin\",\n AFFILIATE = \"affiliate\",\n CUSTOMER = \"customer\",\n EVENT = \"event\",\n PARTNER = \"partner\",\n SCHOOL = \"school\",\n SUPER_ADMIN = \"super_admin\",\n VENDOR = \"vendor\",\n}\n\nexport enum EnumSocialMedia {\n FACEBOOK = \"facebook\",\n INSTAGRAM = \"instagram\",\n TIKTOK = \"tiktok\",\n TWITTER = \"twitter\",\n WEBSITE = \"website\",\n YOUTUBE = \"youtube\",\n}\n\nexport enum EnumEventDateStatus {\n STARTING_SOON = \"Starting_Soon\",\n STARTED = \"Started\",\n TODAY = \"Today\",\n TOMORROW = \"Tomorrow\",\n THIS_WEEK = \"This_Week\",\n NEXT_WEEK = \"Next_Week\",\n UPCOMING = \"Upcoming\",\n ENDED = \"Ended\",\n RE_SCHEDULED = \"Rescheduled\",\n CANCELED = \"Canceled\",\n INVALID = \"Invalid\",\n}\n\nexport enum EnumSubscriptionStatus {\n ACTIVE = \"active\",\n INACTIVE = \"inactive\",\n CANCELLED = \"cancelled\",\n NO_SUBSCRIPTION = \"no_subscription\",\n PAST_DUE = \"past_due\",\n TRIALING = \"trialing\",\n}\n\nexport enum EnumBillingPeriod {\n MONTHLY_CANCEL_ANYTIME = \"monthly_cancel_anytime\",\n YEARLY_ANNUAL_BILLED = \"yearly_annual_billed\",\n}\n\nexport enum EnumReward {\n MYSTERY_JOY_BOX = \"mystery_joy_box\",\n MYSTERY_SQUEEZE_BOX = \"mystery_squeeze_box\",\n MYSTERY_DELUXE_BOX = \"mystery_deluxe_box\",\n}\n","import { EnumRegions } from \"../enums\";\nimport type { Region } from \"../types\";\n\nexport type RegionCenterType = Region & { region: EnumRegions };\n\n/**\n * New Zealand region centres used to derive the nearest region from a\n * location and to map a region selection to map coordinates.\n *\n * The final `EnumRegions.All` entry is the NZ-wide default.\n */\nexport const REGION_CENTERS: RegionCenterType[] = [\n {\n latitude: -36.8485,\n latitudeDelta: 2,\n longitude: 174.7633,\n longitudeDelta: 2,\n region: EnumRegions.Auckland,\n },\n {\n latitude: -38.1387,\n latitudeDelta: 2,\n longitude: 176.2452,\n longitudeDelta: 2,\n region: EnumRegions.BayOfPlentyGisborne,\n },\n {\n latitude: -43.5321,\n latitudeDelta: 2,\n longitude: 172.6362,\n longitudeDelta: 2,\n region: EnumRegions.CanterburyWestCoast,\n },\n {\n latitude: -39.4928,\n latitudeDelta: 2,\n longitude: 176.912,\n longitudeDelta: 2,\n region: EnumRegions.HawkesBay,\n },\n {\n latitude: -40.3523,\n latitudeDelta: 2,\n longitude: 175.6082,\n longitudeDelta: 2,\n region: EnumRegions.ManawatuWanganui,\n },\n {\n latitude: -41.2706,\n latitudeDelta: 2,\n longitude: 173.284,\n longitudeDelta: 2,\n region: EnumRegions.MarlboroughNelsonTasman,\n },\n {\n latitude: -35.7251,\n latitudeDelta: 2,\n longitude: 174.3237,\n longitudeDelta: 2,\n region: EnumRegions.Northland,\n },\n {\n latitude: -45.8788,\n latitudeDelta: 2,\n longitude: 170.5028,\n longitudeDelta: 2,\n region: EnumRegions.Otago,\n },\n {\n latitude: -46.4132,\n latitudeDelta: 2,\n longitude: 168.3538,\n longitudeDelta: 2,\n region: EnumRegions.Southland,\n },\n {\n latitude: -39.0556,\n latitudeDelta: 2,\n longitude: 174.0752,\n longitudeDelta: 2,\n region: EnumRegions.Taranaki,\n },\n {\n latitude: -37.787,\n latitudeDelta: 2,\n longitude: 175.2793,\n longitudeDelta: 2,\n region: EnumRegions.Waikato,\n },\n {\n latitude: -41.2866,\n latitudeDelta: 2,\n longitude: 174.7756,\n longitudeDelta: 2,\n region: EnumRegions.Wellington,\n },\n {\n latitude: -36.8624942, // Default: New Zealand\n latitudeDelta: 2,\n longitude: 174.7450494,\n longitudeDelta: 2,\n region: EnumRegions.All,\n },\n];\n\n/**\n * All selectable NZ regions, excluding the `All` pseudo-region.\n */\nexport const nzRegions = Object.values(EnumRegions).filter(\n (region) => region !== EnumRegions.All,\n);\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useAuthUser } from \"../auth/UserProvider\";\nimport { EnumRegions } from \"../enums\";\nimport { getDistanceInMeters } from \"../utils/distance\";\n\nimport { REGION_CENTERS, type RegionCenterType } from \"./constants\";\n\nexport interface IUseRegionSelectionReturn {\n derivedRegion: RegionCenterType;\n handleResetRegion: () => void;\n handleSelectRegion: (region: EnumRegions) => void;\n loading: boolean;\n selectedRegion: RegionCenterType;\n}\n\ntype DeriveRegionLocation = {\n latitude: number;\n longitude: number;\n};\n\nexport interface UseRegionSelectionStateArgs {\n location: DeriveRegionLocation | null | undefined;\n}\n\n// AUDIT-DECISION: Fail fast if REGION_CENTERS is empty. It is a compile-time\n// constant, so an empty array means the import is broken — an invariant beats\n// a silent undefined that surfaces as a crash three screens away.\nfunction getDefaultRegion(): RegionCenterType {\n const [first] = REGION_CENTERS;\n if (first === undefined) {\n throw new Error(\n \"[useRegionSelectionState] REGION_CENTERS is empty — check the import.\",\n );\n }\n return first;\n}\n\n// AUDIT-DECISION: Pure helper — no side effects, no hook calls.\n// Accepts nullable inputs so callers never need to guard before calling it.\nfunction deriveRegion(\n location: DeriveRegionLocation | null | undefined,\n preferredRegion: EnumRegions | null | undefined,\n): RegionCenterType {\n // 1. Location available — pick nearest valid region.\n if (location) {\n const { latitude, longitude } = location;\n const userCoords: [number, number] = [longitude, latitude];\n\n let nearestRegion: RegionCenterType = getDefaultRegion();\n let nearestDistance = Infinity;\n\n for (const region of REGION_CENTERS) {\n const regionCoords: [number, number] = [\n region.longitude,\n region.latitude,\n ];\n const distance = getDistanceInMeters(userCoords, regionCoords);\n\n // AUDIT-DECISION: Skip non-finite distances — getDistanceInMeters\n // returns Infinity for invalid coords. We do not want a bogus distance to\n // \"win\" the reduce by being the first candidate with the starting Infinity\n // baseline, which was the original bug.\n if (Number.isFinite(distance) && distance < nearestDistance) {\n nearestDistance = distance;\n nearestRegion = region;\n }\n }\n\n // AUDIT-DECISION: If every distance was non-finite (malformed location),\n // fall through to the preference path rather than returning REGION_CENTERS[0]\n // unconditionally. This keeps the fallback chain consistent.\n if (Number.isFinite(nearestDistance)) {\n return nearestRegion;\n }\n }\n\n // 2. No usable location — use the user's stored preference.\n if (preferredRegion) {\n const preferred = REGION_CENTERS.find((r) => r.region === preferredRegion);\n if (preferred) return preferred;\n }\n\n // 3. Last resort — first entry in the array.\n return getDefaultRegion();\n}\n\nexport function useRegionSelectionState({\n location,\n}: UseRegionSelectionStateArgs): IUseRegionSelectionReturn {\n const { authUser } = useAuthUser();\n\n const preferredRegion = authUser?.preferredRegion as\n EnumRegions | null | undefined;\n\n // AUDIT-DECISION: Derive the initial region synchronously so the very first\n // render never sees undefined. deriveRegion is cheap (O(n) array scan).\n const [selectedRegion, setSelectedRegion] = useState<RegionCenterType>(() =>\n deriveRegion(location, preferredRegion ?? null),\n );\n // AUDIT-DECISION: Track the auto-derived default separately from the user's\n // manual selection. derivedRegion always reflects deriveRegion(location,\n // preferredRegion) — nearest location → preferred region → first region — so\n // consumers can detect divergence from the default and reset back to it.\n const [derivedRegion, setDerivedRegion] = useState<RegionCenterType>(() =>\n deriveRegion(location, preferredRegion ?? null),\n );\n const [loading, setLoading] = useState<boolean>(false);\n const [hasManualSelection, setHasManualSelection] = useState<boolean>(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // AUDIT-DECISION: Reset manual selection when the authenticated user changes\n // so the auto-derive re-runs for the new identity. Keying on authUser?._id\n // (not the full object) avoids false resets on reference-stable re-renders.\n const prevUserIdRef = useRef<string | undefined>(authUser?._id);\n useEffect(() => {\n if (prevUserIdRef.current !== authUser?._id) {\n prevUserIdRef.current = authUser?._id;\n setHasManualSelection(false);\n }\n }, [authUser?._id]);\n\n // AUDIT-DECISION: Compute and apply the derived region in a single effect —\n // no intermediate memo. This removes the two-cycle race window where the\n // memoised value existed before the state write committed.\n useEffect(() => {\n const derived = deriveRegion(location, preferredRegion ?? null);\n setDerivedRegion(derived);\n\n if (hasManualSelection) return;\n setSelectedRegion(derived);\n }, [location, preferredRegion, hasManualSelection]);\n\n const handleSelectRegion = useCallback((region: EnumRegions) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n const regionCenter =\n REGION_CENTERS.find((r) => r.region === region) ?? getDefaultRegion();\n\n setLoading(true);\n setSelectedRegion(regionCenter);\n setHasManualSelection(true);\n\n timerRef.current = setTimeout(() => {\n setLoading(false);\n timerRef.current = null;\n }, 500);\n }, []);\n\n const handleResetRegion = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n setLoading(false);\n const derived = deriveRegion(location, preferredRegion ?? null);\n setDerivedRegion(derived);\n setSelectedRegion(derived);\n setHasManualSelection(false);\n }, [location, preferredRegion]);\n\n // Cleanup on unmount.\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return {\n derivedRegion,\n handleResetRegion,\n handleSelectRegion,\n loading,\n selectedRegion,\n };\n}\n\nexport default useRegionSelectionState;\n","/**\n * Shared React context for auth session state.\n *\n * Apps keep a thin local UserProvider that calls their platform `useAuth`\n * (adapters) and pass the result here as `value`. Import `useAuthUser` from\n * this module (or re-export it) so consumers share one context instance.\n *\n * `\"use client\"`: required for Next.js; ignored by React Native.\n */\n\"use client\";\n\nimport React, { createContext, useContext, type ReactNode } from \"react\";\n\nimport type { UseAuthReturnType } from \"./types\";\n\nconst UserContext = createContext<UseAuthReturnType | undefined>(undefined);\n\n/**\n * Provides auth session value from the app's thin useAuth wrapper.\n */\nexport const UserProvider: React.FC<{\n children: ReactNode;\n value: UseAuthReturnType;\n}> = ({ children, value }) => {\n return <UserContext.Provider value={value}>{children}</UserContext.Provider>;\n};\n\nexport const useAuthUser = (): UseAuthReturnType => {\n const context = useContext(UserContext);\n if (!context) {\n throw new Error(\"useAuthUser must be used within a UserProvider\");\n }\n return context;\n};\n","export function getDistanceInMeters(\n coordinates1: number[],\n coordinates2: number[],\n): number {\n const [lon1, lat1] = coordinates1;\n const [lon2, lat2] = coordinates2;\n\n const values = [lon1, lat1, lon2, lat2];\n if (values.some((v) => !Number.isFinite(v))) {\n return Infinity;\n }\n\n const toRadians = (deg: number) => (deg * Math.PI) / 180;\n const R = 6371000; // Earth radius in meters\n\n const dLat = toRadians(lat2 - lat1);\n const dLon = toRadians(lon2 - lon1);\n const radLat1 = toRadians(lat1);\n const radLat2 = toRadians(lat2);\n\n const a =\n Math.sin(dLat / 2) ** 2 +\n Math.sin(dLon / 2) ** 2 * Math.cos(radLat1) * Math.cos(radLat2);\n\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return R * c;\n}\n\nexport function getDistanceInKilometers(\n coordinates1: number[],\n coordinates2: number[],\n): number {\n const distanceInMeters = getDistanceInMeters(coordinates1, coordinates2);\n\n if (!Number.isFinite(distanceInMeters)) {\n return Infinity;\n }\n\n return Math.round(distanceInMeters / 1000);\n}\n\nexport function formatDistance(\n coordinates1: number[],\n coordinates2: number[],\n): string {\n const distanceInMeters = getDistanceInMeters(coordinates1, coordinates2);\n\n if (!Number.isFinite(distanceInMeters)) {\n return \"—\";\n }\n\n const roundedMeters = Math.round(distanceInMeters);\n\n if (roundedMeters < 1000) {\n return `${roundedMeters} m`;\n }\n\n return `${Math.round(roundedMeters / 1000)} km`;\n}\n"],"mappings":"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","names":["EnumRegions","import_react"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EnumRegions } from '../enums/index.mjs';
|
|
2
|
+
import { J as Region } from '../global-CWo-hWKZ.mjs';
|
|
3
|
+
import 'react-hook-form';
|
|
4
|
+
|
|
5
|
+
type RegionCenterType = Region & {
|
|
6
|
+
region: EnumRegions;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* New Zealand region centres used to derive the nearest region from a
|
|
10
|
+
* location and to map a region selection to map coordinates.
|
|
11
|
+
*
|
|
12
|
+
* The final `EnumRegions.All` entry is the NZ-wide default.
|
|
13
|
+
*/
|
|
14
|
+
declare const REGION_CENTERS: RegionCenterType[];
|
|
15
|
+
/**
|
|
16
|
+
* All selectable NZ regions, excluding the `All` pseudo-region.
|
|
17
|
+
*/
|
|
18
|
+
declare const nzRegions: (EnumRegions.Auckland | EnumRegions.BayOfPlentyGisborne | EnumRegions.CanterburyWestCoast | EnumRegions.HawkesBay | EnumRegions.ManawatuWanganui | EnumRegions.MarlboroughNelsonTasman | EnumRegions.Northland | EnumRegions.Otago | EnumRegions.Southland | EnumRegions.Taranaki | EnumRegions.Waikato | EnumRegions.Wellington)[];
|
|
19
|
+
|
|
20
|
+
interface IUseRegionSelectionReturn {
|
|
21
|
+
derivedRegion: RegionCenterType;
|
|
22
|
+
handleResetRegion: () => void;
|
|
23
|
+
handleSelectRegion: (region: EnumRegions) => void;
|
|
24
|
+
loading: boolean;
|
|
25
|
+
selectedRegion: RegionCenterType;
|
|
26
|
+
}
|
|
27
|
+
type DeriveRegionLocation = {
|
|
28
|
+
latitude: number;
|
|
29
|
+
longitude: number;
|
|
30
|
+
};
|
|
31
|
+
interface UseRegionSelectionStateArgs {
|
|
32
|
+
location: DeriveRegionLocation | null | undefined;
|
|
33
|
+
}
|
|
34
|
+
declare function useRegionSelectionState({ location, }: UseRegionSelectionStateArgs): IUseRegionSelectionReturn;
|
|
35
|
+
|
|
36
|
+
export { type IUseRegionSelectionReturn, REGION_CENTERS, type RegionCenterType, type UseRegionSelectionStateArgs, nzRegions, useRegionSelectionState };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EnumRegions } from '../enums/index.js';
|
|
2
|
+
import { J as Region } from '../global-BqeTWrvk.js';
|
|
3
|
+
import 'react-hook-form';
|
|
4
|
+
|
|
5
|
+
type RegionCenterType = Region & {
|
|
6
|
+
region: EnumRegions;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* New Zealand region centres used to derive the nearest region from a
|
|
10
|
+
* location and to map a region selection to map coordinates.
|
|
11
|
+
*
|
|
12
|
+
* The final `EnumRegions.All` entry is the NZ-wide default.
|
|
13
|
+
*/
|
|
14
|
+
declare const REGION_CENTERS: RegionCenterType[];
|
|
15
|
+
/**
|
|
16
|
+
* All selectable NZ regions, excluding the `All` pseudo-region.
|
|
17
|
+
*/
|
|
18
|
+
declare const nzRegions: (EnumRegions.Auckland | EnumRegions.BayOfPlentyGisborne | EnumRegions.CanterburyWestCoast | EnumRegions.HawkesBay | EnumRegions.ManawatuWanganui | EnumRegions.MarlboroughNelsonTasman | EnumRegions.Northland | EnumRegions.Otago | EnumRegions.Southland | EnumRegions.Taranaki | EnumRegions.Waikato | EnumRegions.Wellington)[];
|
|
19
|
+
|
|
20
|
+
interface IUseRegionSelectionReturn {
|
|
21
|
+
derivedRegion: RegionCenterType;
|
|
22
|
+
handleResetRegion: () => void;
|
|
23
|
+
handleSelectRegion: (region: EnumRegions) => void;
|
|
24
|
+
loading: boolean;
|
|
25
|
+
selectedRegion: RegionCenterType;
|
|
26
|
+
}
|
|
27
|
+
type DeriveRegionLocation = {
|
|
28
|
+
latitude: number;
|
|
29
|
+
longitude: number;
|
|
30
|
+
};
|
|
31
|
+
interface UseRegionSelectionStateArgs {
|
|
32
|
+
location: DeriveRegionLocation | null | undefined;
|
|
33
|
+
}
|
|
34
|
+
declare function useRegionSelectionState({ location, }: UseRegionSelectionStateArgs): IUseRegionSelectionReturn;
|
|
35
|
+
|
|
36
|
+
export { type IUseRegionSelectionReturn, REGION_CENTERS, type RegionCenterType, type UseRegionSelectionStateArgs, nzRegions, useRegionSelectionState };
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useAuthUser
|
|
4
|
+
} from "../chunk-N46DFZ3R.mjs";
|
|
5
|
+
import {
|
|
6
|
+
getDistanceInMeters
|
|
7
|
+
} from "../chunk-RE4NZPYY.mjs";
|
|
8
|
+
import {
|
|
9
|
+
EnumRegions
|
|
10
|
+
} from "../chunk-7TZDJXYL.mjs";
|
|
11
|
+
|
|
12
|
+
// src/region/constants.ts
|
|
13
|
+
var REGION_CENTERS = [
|
|
14
|
+
{
|
|
15
|
+
latitude: -36.8485,
|
|
16
|
+
latitudeDelta: 2,
|
|
17
|
+
longitude: 174.7633,
|
|
18
|
+
longitudeDelta: 2,
|
|
19
|
+
region: "Auckland" /* Auckland */
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
latitude: -38.1387,
|
|
23
|
+
latitudeDelta: 2,
|
|
24
|
+
longitude: 176.2452,
|
|
25
|
+
longitudeDelta: 2,
|
|
26
|
+
region: "Bay of Plenty & Gisborne" /* BayOfPlentyGisborne */
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
latitude: -43.5321,
|
|
30
|
+
latitudeDelta: 2,
|
|
31
|
+
longitude: 172.6362,
|
|
32
|
+
longitudeDelta: 2,
|
|
33
|
+
region: "Canterbury & West Coast" /* CanterburyWestCoast */
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
latitude: -39.4928,
|
|
37
|
+
latitudeDelta: 2,
|
|
38
|
+
longitude: 176.912,
|
|
39
|
+
longitudeDelta: 2,
|
|
40
|
+
region: "Hawke's Bay" /* HawkesBay */
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
latitude: -40.3523,
|
|
44
|
+
latitudeDelta: 2,
|
|
45
|
+
longitude: 175.6082,
|
|
46
|
+
longitudeDelta: 2,
|
|
47
|
+
region: "Manawatu-Wanganui" /* ManawatuWanganui */
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
latitude: -41.2706,
|
|
51
|
+
latitudeDelta: 2,
|
|
52
|
+
longitude: 173.284,
|
|
53
|
+
longitudeDelta: 2,
|
|
54
|
+
region: "Marlborough & Nelson & Tasman" /* MarlboroughNelsonTasman */
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
latitude: -35.7251,
|
|
58
|
+
latitudeDelta: 2,
|
|
59
|
+
longitude: 174.3237,
|
|
60
|
+
longitudeDelta: 2,
|
|
61
|
+
region: "Northland" /* Northland */
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
latitude: -45.8788,
|
|
65
|
+
latitudeDelta: 2,
|
|
66
|
+
longitude: 170.5028,
|
|
67
|
+
longitudeDelta: 2,
|
|
68
|
+
region: "Otago" /* Otago */
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
latitude: -46.4132,
|
|
72
|
+
latitudeDelta: 2,
|
|
73
|
+
longitude: 168.3538,
|
|
74
|
+
longitudeDelta: 2,
|
|
75
|
+
region: "Southland" /* Southland */
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
latitude: -39.0556,
|
|
79
|
+
latitudeDelta: 2,
|
|
80
|
+
longitude: 174.0752,
|
|
81
|
+
longitudeDelta: 2,
|
|
82
|
+
region: "Taranaki" /* Taranaki */
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
latitude: -37.787,
|
|
86
|
+
latitudeDelta: 2,
|
|
87
|
+
longitude: 175.2793,
|
|
88
|
+
longitudeDelta: 2,
|
|
89
|
+
region: "Waikato" /* Waikato */
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
latitude: -41.2866,
|
|
93
|
+
latitudeDelta: 2,
|
|
94
|
+
longitude: 174.7756,
|
|
95
|
+
longitudeDelta: 2,
|
|
96
|
+
region: "Wellington" /* Wellington */
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
latitude: -36.8624942,
|
|
100
|
+
// Default: New Zealand
|
|
101
|
+
latitudeDelta: 2,
|
|
102
|
+
longitude: 174.7450494,
|
|
103
|
+
longitudeDelta: 2,
|
|
104
|
+
region: "All Regions" /* All */
|
|
105
|
+
}
|
|
106
|
+
];
|
|
107
|
+
var nzRegions = Object.values(EnumRegions).filter(
|
|
108
|
+
(region) => region !== "All Regions" /* All */
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// src/region/useRegionSelectionState.ts
|
|
112
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
113
|
+
function getDefaultRegion() {
|
|
114
|
+
const [first] = REGION_CENTERS;
|
|
115
|
+
if (first === void 0) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
"[useRegionSelectionState] REGION_CENTERS is empty \u2014 check the import."
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return first;
|
|
121
|
+
}
|
|
122
|
+
function deriveRegion(location, preferredRegion) {
|
|
123
|
+
if (location) {
|
|
124
|
+
const { latitude, longitude } = location;
|
|
125
|
+
const userCoords = [longitude, latitude];
|
|
126
|
+
let nearestRegion = getDefaultRegion();
|
|
127
|
+
let nearestDistance = Infinity;
|
|
128
|
+
for (const region of REGION_CENTERS) {
|
|
129
|
+
const regionCoords = [
|
|
130
|
+
region.longitude,
|
|
131
|
+
region.latitude
|
|
132
|
+
];
|
|
133
|
+
const distance = getDistanceInMeters(userCoords, regionCoords);
|
|
134
|
+
if (Number.isFinite(distance) && distance < nearestDistance) {
|
|
135
|
+
nearestDistance = distance;
|
|
136
|
+
nearestRegion = region;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (Number.isFinite(nearestDistance)) {
|
|
140
|
+
return nearestRegion;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (preferredRegion) {
|
|
144
|
+
const preferred = REGION_CENTERS.find((r) => r.region === preferredRegion);
|
|
145
|
+
if (preferred) return preferred;
|
|
146
|
+
}
|
|
147
|
+
return getDefaultRegion();
|
|
148
|
+
}
|
|
149
|
+
function useRegionSelectionState({
|
|
150
|
+
location
|
|
151
|
+
}) {
|
|
152
|
+
const { authUser } = useAuthUser();
|
|
153
|
+
const preferredRegion = authUser?.preferredRegion;
|
|
154
|
+
const [selectedRegion, setSelectedRegion] = useState(
|
|
155
|
+
() => deriveRegion(location, preferredRegion ?? null)
|
|
156
|
+
);
|
|
157
|
+
const [derivedRegion, setDerivedRegion] = useState(
|
|
158
|
+
() => deriveRegion(location, preferredRegion ?? null)
|
|
159
|
+
);
|
|
160
|
+
const [loading, setLoading] = useState(false);
|
|
161
|
+
const [hasManualSelection, setHasManualSelection] = useState(false);
|
|
162
|
+
const timerRef = useRef(null);
|
|
163
|
+
const prevUserIdRef = useRef(authUser?._id);
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
if (prevUserIdRef.current !== authUser?._id) {
|
|
166
|
+
prevUserIdRef.current = authUser?._id;
|
|
167
|
+
setHasManualSelection(false);
|
|
168
|
+
}
|
|
169
|
+
}, [authUser?._id]);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
const derived = deriveRegion(location, preferredRegion ?? null);
|
|
172
|
+
setDerivedRegion(derived);
|
|
173
|
+
if (hasManualSelection) return;
|
|
174
|
+
setSelectedRegion(derived);
|
|
175
|
+
}, [location, preferredRegion, hasManualSelection]);
|
|
176
|
+
const handleSelectRegion = useCallback((region) => {
|
|
177
|
+
if (timerRef.current) {
|
|
178
|
+
clearTimeout(timerRef.current);
|
|
179
|
+
}
|
|
180
|
+
const regionCenter = REGION_CENTERS.find((r) => r.region === region) ?? getDefaultRegion();
|
|
181
|
+
setLoading(true);
|
|
182
|
+
setSelectedRegion(regionCenter);
|
|
183
|
+
setHasManualSelection(true);
|
|
184
|
+
timerRef.current = setTimeout(() => {
|
|
185
|
+
setLoading(false);
|
|
186
|
+
timerRef.current = null;
|
|
187
|
+
}, 500);
|
|
188
|
+
}, []);
|
|
189
|
+
const handleResetRegion = useCallback(() => {
|
|
190
|
+
if (timerRef.current) {
|
|
191
|
+
clearTimeout(timerRef.current);
|
|
192
|
+
timerRef.current = null;
|
|
193
|
+
}
|
|
194
|
+
setLoading(false);
|
|
195
|
+
const derived = deriveRegion(location, preferredRegion ?? null);
|
|
196
|
+
setDerivedRegion(derived);
|
|
197
|
+
setSelectedRegion(derived);
|
|
198
|
+
setHasManualSelection(false);
|
|
199
|
+
}, [location, preferredRegion]);
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
return () => {
|
|
202
|
+
if (timerRef.current) {
|
|
203
|
+
clearTimeout(timerRef.current);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
}, []);
|
|
207
|
+
return {
|
|
208
|
+
derivedRegion,
|
|
209
|
+
handleResetRegion,
|
|
210
|
+
handleSelectRegion,
|
|
211
|
+
loading,
|
|
212
|
+
selectedRegion
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export {
|
|
216
|
+
REGION_CENTERS,
|
|
217
|
+
nzRegions,
|
|
218
|
+
useRegionSelectionState
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=index.mjs.map
|