@myrjfa/state 3.0.9 → 3.0.11

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.
Files changed (44) hide show
  1. package/dist/lib/actions/auth.d.ts +2 -0
  2. package/dist/lib/actions/auth.d.ts.map +1 -1
  3. package/dist/lib/actions/auth.js +9 -0
  4. package/dist/lib/actions/chat.d.ts +10 -13
  5. package/dist/lib/actions/chat.d.ts.map +1 -1
  6. package/dist/lib/actions/chat.js +26 -3
  7. package/dist/lib/actions/companion.d.ts +134 -59
  8. package/dist/lib/actions/companion.d.ts.map +1 -1
  9. package/dist/lib/actions/companion.js +51 -50
  10. package/dist/lib/actions/companionUpload.d.ts +4 -6
  11. package/dist/lib/actions/companionUpload.d.ts.map +1 -1
  12. package/dist/lib/actions/companionUpload.js +2 -1
  13. package/dist/lib/actions/fetcher.d.ts.map +1 -1
  14. package/dist/lib/actions/fetcher.js +29 -54
  15. package/dist/lib/actions/serverActions.d.ts.map +1 -1
  16. package/dist/lib/actions/serverActions.js +3 -2
  17. package/dist/lib/actions/user.d.ts +7 -10
  18. package/dist/lib/actions/user.d.ts.map +1 -1
  19. package/dist/lib/actions/user.js +2 -2
  20. package/dist/lib/authSessionManager.d.ts.map +1 -1
  21. package/dist/lib/authSessionManager.js +42 -39
  22. package/dist/lib/authSessionPolicy.d.ts +2 -0
  23. package/dist/lib/authSessionPolicy.d.ts.map +1 -1
  24. package/dist/lib/authSessionPolicy.js +3 -1
  25. package/dist/lib/companion/eligibility.d.ts +14 -0
  26. package/dist/lib/companion/eligibility.d.ts.map +1 -0
  27. package/dist/lib/companion/eligibility.js +24 -0
  28. package/dist/lib/context/ChatContext.d.ts +1 -1
  29. package/dist/lib/context/ChatContext.d.ts.map +1 -1
  30. package/dist/lib/hooks/useCompanionEligibility.d.ts +13 -0
  31. package/dist/lib/hooks/useCompanionEligibility.d.ts.map +1 -0
  32. package/dist/lib/hooks/useCompanionEligibility.js +126 -0
  33. package/dist/lib/models/chat.d.ts +37 -2
  34. package/dist/lib/models/chat.d.ts.map +1 -1
  35. package/dist/lib/models/companion.d.ts +4 -0
  36. package/dist/lib/models/companion.d.ts.map +1 -1
  37. package/dist/lib/models/user.d.ts +9 -0
  38. package/dist/lib/models/user.d.ts.map +1 -1
  39. package/dist/lib/userAtom.d.ts.map +1 -1
  40. package/dist/lib/userAtom.js +16 -25
  41. package/dist/lib/utils/authCookies.d.ts +3 -0
  42. package/dist/lib/utils/authCookies.d.ts.map +1 -0
  43. package/dist/lib/utils/authCookies.js +4 -0
  44. package/package.json +1 -2
@@ -1,5 +1,6 @@
1
1
  "use server";
2
2
  import { del, get, post, put } from "./fetcher";
3
+ import { companionEligibilityFailure } from "../companion/eligibility";
3
4
  import { uploadCompanionTripCover as uploadTripCover } from "./companionUpload";
4
5
  const BASE_PATH = "/companion";
5
6
  export async function getCompanionEligibility() {
@@ -18,8 +19,8 @@ export async function getCompanionSavedStatus(type, targetId) {
18
19
  const data = await get(`${BASE_PATH}/saved/${type}/${encodeURIComponent(targetId)}`);
19
20
  return { success: true, saved: data.data.saved };
20
21
  }
21
- catch {
22
- return { success: false, error: "Could not load saved status. Please retry." };
22
+ catch (error) {
23
+ return { success: false, ...companionEligibilityFailure(error), error: "Could not load saved status. Please retry." };
23
24
  }
24
25
  }
25
26
  export async function setCompanionSavedItem(type, targetId, saved) {
@@ -27,8 +28,8 @@ export async function setCompanionSavedItem(type, targetId, saved) {
27
28
  const data = await put(`${BASE_PATH}/saved/${type}/${encodeURIComponent(targetId)}`, { saved });
28
29
  return { success: true, saved: data.data.saved };
29
30
  }
30
- catch {
31
- return { success: false, error: "Could not update your saved items. Please retry." };
31
+ catch (error) {
32
+ return { success: false, ...companionEligibilityFailure(error), error: "Could not update your saved items. Please retry." };
32
33
  }
33
34
  }
34
35
  export async function getCompanionSavedItems(type, cursor) {
@@ -37,8 +38,8 @@ export async function getCompanionSavedItems(type, cursor) {
37
38
  const data = await get(`${BASE_PATH}/saved?${query}`);
38
39
  return { success: true, ...data.data };
39
40
  }
40
- catch {
41
- return { success: false, items: [], nextCursor: null, error: "Could not load your saved items. Please retry." };
41
+ catch (error) {
42
+ return { success: false, ...companionEligibilityFailure(error), items: [], nextCursor: null, error: "Could not load your saved items. Please retry." };
42
43
  }
43
44
  }
44
45
  // ── Travel Profile ──────────────────────────────────────────────────────────────
@@ -51,7 +52,7 @@ export async function getMyTravelProfile() {
51
52
  }
52
53
  catch (error) {
53
54
  const missing = typeof error === "object" && error !== null && "statusCode" in error && error.statusCode === 404;
54
- return { success: false, missing, error: "Could not load your travel profile. Please try again." };
55
+ return { success: false, ...companionEligibilityFailure(error), missing, error: "Could not load your travel profile. Please try again." };
55
56
  }
56
57
  }
57
58
  export async function saveMyTravelProfile(profileData) {
@@ -61,8 +62,8 @@ export async function saveMyTravelProfile(profileData) {
61
62
  return { success: false, error: data.message };
62
63
  return { success: true, profile: data.data };
63
64
  }
64
- catch {
65
- return { success: false, error: "Failed to save profile" };
65
+ catch (error) {
66
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to save profile" };
66
67
  }
67
68
  }
68
69
  // ── Travel Plans ────────────────────────────────────────────────────────────────
@@ -73,8 +74,8 @@ export async function createTravelPlan(planData) {
73
74
  return { success: false, error: data.message };
74
75
  return { success: true, plan: data.data };
75
76
  }
76
- catch {
77
- return { success: false, error: "Failed to create travel plan" };
77
+ catch (error) {
78
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to create travel plan" };
78
79
  }
79
80
  }
80
81
  export async function uploadCompanionTripCover(file) {
@@ -87,8 +88,8 @@ export async function createTravelPlanFromItinerary(itineraryId, inviteCount, jo
87
88
  return { success: false, error: data.message };
88
89
  return { success: true, plan: data.data, message: data.message };
89
90
  }
90
- catch {
91
- return { success: false, error: "We could not post this trip. Please try again." };
91
+ catch (error) {
92
+ return { success: false, ...companionEligibilityFailure(error), error: "We could not post this trip. Please try again." };
92
93
  }
93
94
  }
94
95
  export async function attachItineraryToTravelPlan(planId, itineraryId) {
@@ -102,7 +103,7 @@ export async function attachItineraryToTravelPlan(planId, itineraryId) {
102
103
  const message = typeof error === "object" && error !== null && "message" in error
103
104
  ? String(error.message)
104
105
  : "We could not link this itinerary. Please try again.";
105
- return { success: false, error: message };
106
+ return { success: false, ...companionEligibilityFailure(error), error: message };
106
107
  }
107
108
  }
108
109
  export async function getCompanionListingSuggestions(planId) {
@@ -111,7 +112,7 @@ export async function getCompanionListingSuggestions(planId) {
111
112
  return { success: true, suggestions: data.data };
112
113
  }
113
114
  catch (error) {
114
- return { success: false, suggestions: null, error: error instanceof Error ? error.message : "Could not load trip suggestions." };
115
+ return { success: false, ...companionEligibilityFailure(error), suggestions: null, error: error instanceof Error ? error.message : "Could not load trip suggestions." };
115
116
  }
116
117
  }
117
118
  export async function addCompanionStandaloneLink(planId, kind, entityId) {
@@ -120,7 +121,7 @@ export async function addCompanionStandaloneLink(planId, kind, entityId) {
120
121
  return { success: true, item: data.data };
121
122
  }
122
123
  catch (error) {
123
- return { success: false, error: error instanceof Error ? error.message : "Could not add this listing to your trip." };
124
+ return { success: false, ...companionEligibilityFailure(error), error: error instanceof Error ? error.message : "Could not add this listing to your trip." };
124
125
  }
125
126
  }
126
127
  export async function removeCompanionStandaloneLink(planId, kind, entityId) {
@@ -129,7 +130,7 @@ export async function removeCompanionStandaloneLink(planId, kind, entityId) {
129
130
  return { success: true };
130
131
  }
131
132
  catch (error) {
132
- return { success: false, error: error instanceof Error ? error.message : "Could not remove this listing from your trip." };
133
+ return { success: false, ...companionEligibilityFailure(error), error: error instanceof Error ? error.message : "Could not remove this listing from your trip." };
133
134
  }
134
135
  }
135
136
  export async function getCompanionTripInspiration(filters) {
@@ -139,7 +140,7 @@ export async function getCompanionTripInspiration(filters) {
139
140
  return { success: true, items: data.data || [] };
140
141
  }
141
142
  catch (error) {
142
- return { success: false, items: [], error: error instanceof Error ? error.message : "Could not load trip inspiration." };
143
+ return { success: false, ...companionEligibilityFailure(error), items: [], error: error instanceof Error ? error.message : "Could not load trip inspiration." };
143
144
  }
144
145
  }
145
146
  export async function getTravelPlans(filters = {}) {
@@ -150,8 +151,8 @@ export async function getTravelPlans(filters = {}) {
150
151
  return { success: false, error: data.message, plans: [] };
151
152
  return { success: true, plans: data.data?.plans ?? data.data ?? [], total: data.data?.total ?? 0 };
152
153
  }
153
- catch {
154
- return { success: false, error: "Failed to fetch plans", plans: [] };
154
+ catch (error) {
155
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch plans", plans: [] };
155
156
  }
156
157
  }
157
158
  export async function getTravelPlan(id) {
@@ -161,8 +162,8 @@ export async function getTravelPlan(id) {
161
162
  return { success: false, error: data.message };
162
163
  return { success: true, plan: data.data };
163
164
  }
164
- catch {
165
- return { success: false, error: "Failed to fetch plan" };
165
+ catch (error) {
166
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch plan" };
166
167
  }
167
168
  }
168
169
  export async function updateTravelPlan(id, planData) {
@@ -172,8 +173,8 @@ export async function updateTravelPlan(id, planData) {
172
173
  return { success: false, error: data.message };
173
174
  return { success: true, plan: data.data };
174
175
  }
175
- catch {
176
- return { success: false, error: "Failed to update plan" };
176
+ catch (error) {
177
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to update plan" };
177
178
  }
178
179
  }
179
180
  export async function deleteTravelPlan(id) {
@@ -183,8 +184,8 @@ export async function deleteTravelPlan(id) {
183
184
  return { success: false, error: data.message };
184
185
  return { success: true, message: data.message };
185
186
  }
186
- catch {
187
- return { success: false, error: "Failed to delete plan" };
187
+ catch (error) {
188
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to delete plan" };
188
189
  }
189
190
  }
190
191
  export async function toggleLikePlan(id) {
@@ -194,8 +195,8 @@ export async function toggleLikePlan(id) {
194
195
  return { success: false, error: data.message };
195
196
  return { success: true, isLiked: data.data?.isLiked };
196
197
  }
197
- catch {
198
- return { success: false, error: "Failed to like plan" };
198
+ catch (error) {
199
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to like plan" };
199
200
  }
200
201
  }
201
202
  export async function getMyTravelPlans(options) {
@@ -206,8 +207,8 @@ export async function getMyTravelPlans(options) {
206
207
  return { success: false, error: data.message, plans: [] };
207
208
  return { success: true, plans: data.data?.plans ?? data.data ?? [] };
208
209
  }
209
- catch {
210
- return { success: false, error: "Failed to fetch my plans", plans: [] };
210
+ catch (error) {
211
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch my plans", plans: [] };
211
212
  }
212
213
  }
213
214
  export async function getMySentRequests() {
@@ -217,8 +218,8 @@ export async function getMySentRequests() {
217
218
  return { success: false, error: data.message, requests: [] };
218
219
  return { success: true, requests: data.data ?? [] };
219
220
  }
220
- catch {
221
- return { success: false, error: "Failed to fetch sent requests", requests: [] };
221
+ catch (error) {
222
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch sent requests", requests: [] };
222
223
  }
223
224
  }
224
225
  // ── Join Requests ───────────────────────────────────────────────────────────────
@@ -234,8 +235,8 @@ export async function sendJoinRequest(planId, message) {
234
235
  chatId: data.data?.chatId ?? null,
235
236
  };
236
237
  }
237
- catch {
238
- return { success: false, error: "Failed to send join request" };
238
+ catch (error) {
239
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to send join request" };
239
240
  }
240
241
  }
241
242
  export async function withdrawJoinRequest(planId, requestId) {
@@ -245,8 +246,8 @@ export async function withdrawJoinRequest(planId, requestId) {
245
246
  return { success: false, error: data.message };
246
247
  return { success: true, status: data.data?.status };
247
248
  }
248
- catch {
249
- return { success: false, error: "Could not withdraw this request. Please refresh and try again." };
249
+ catch (error) {
250
+ return { success: false, ...companionEligibilityFailure(error), error: "Could not withdraw this request. Please refresh and try again." };
250
251
  }
251
252
  }
252
253
  export async function getJoinRequests(planId) {
@@ -256,8 +257,8 @@ export async function getJoinRequests(planId) {
256
257
  return { success: false, error: data.message, requests: [] };
257
258
  return { success: true, requests: data.data ?? [] };
258
259
  }
259
- catch {
260
- return { success: false, error: "Failed to fetch requests", requests: [] };
260
+ catch (error) {
261
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch requests", requests: [] };
261
262
  }
262
263
  }
263
264
  export async function handleJoinRequest(planId, requestId, action) {
@@ -267,8 +268,8 @@ export async function handleJoinRequest(planId, requestId, action) {
267
268
  return { success: false, error: data.message };
268
269
  return { success: true, status: data.data?.status, chatId: data.data?.chatId ?? null };
269
270
  }
270
- catch {
271
- return { success: false, error: "Failed to handle request" };
271
+ catch (error) {
272
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to handle request" };
272
273
  }
273
274
  }
274
275
  // ── Swipe Discovery ─────────────────────────────────────────────────────────────
@@ -280,8 +281,8 @@ export async function discoverTrips(filters = {}) {
280
281
  return { success: false, error: data.message, trips: [] };
281
282
  return { success: true, trips: data.data ?? [] };
282
283
  }
283
- catch {
284
- return { success: false, error: "Failed to discover trips", trips: [] };
284
+ catch (error) {
285
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to discover trips", trips: [] };
285
286
  }
286
287
  }
287
288
  export async function swipeTrip(travelPlanId, action) {
@@ -291,8 +292,8 @@ export async function swipeTrip(travelPlanId, action) {
291
292
  return { success: false, error: data.message };
292
293
  return { success: true, joinRequestSent: data.data?.joinRequestSent ?? false };
293
294
  }
294
- catch {
295
- return { success: false, error: "Failed to swipe trip" };
295
+ catch (error) {
296
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to swipe trip" };
296
297
  }
297
298
  }
298
299
  export async function discoverTravelers(filters = {}) {
@@ -303,8 +304,8 @@ export async function discoverTravelers(filters = {}) {
303
304
  return { success: false, error: data.message, travelers: [] };
304
305
  return { success: true, travelers: data.data ?? [] };
305
306
  }
306
- catch {
307
- return { success: false, error: "Failed to discover travelers", travelers: [] };
307
+ catch (error) {
308
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to discover travelers", travelers: [] };
308
309
  }
309
310
  }
310
311
  export async function swipeTraveler(targetUserId, action) {
@@ -319,8 +320,8 @@ export async function swipeTraveler(targetUserId, action) {
319
320
  matchScore: data.data?.matchScore ?? 0,
320
321
  };
321
322
  }
322
- catch {
323
- return { success: false, error: "Failed to swipe traveler" };
323
+ catch (error) {
324
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to swipe traveler" };
324
325
  }
325
326
  }
326
327
  // ── Matches ─────────────────────────────────────────────────────────────────────
@@ -332,8 +333,8 @@ export async function getMyMatches(options) {
332
333
  return { success: false, error: data.message, matches: [] };
333
334
  return { success: true, matches: data.data ?? [] };
334
335
  }
335
- catch {
336
- return { success: false, error: "Failed to fetch matches", matches: [] };
336
+ catch (error) {
337
+ return { success: false, ...companionEligibilityFailure(error), error: "Failed to fetch matches", matches: [] };
337
338
  }
338
339
  }
339
340
  // ── Safety ──────────────────────────────────────────────────────────────────────
@@ -1,11 +1,9 @@
1
1
  import { type UploadFile } from "../utils/uploadFile";
2
+ import type { CompanionEligibilityDenial } from "../models/companion";
2
3
  export declare function uploadCompanionTripCover(file: UploadFile): Promise<{
3
4
  success: boolean;
4
- url: string;
5
- error?: undefined;
6
- } | {
7
- success: boolean;
8
- error: string;
9
- url?: undefined;
5
+ url?: string;
6
+ error?: string;
7
+ eligibilityDenial?: CompanionEligibilityDenial;
10
8
  }>;
11
9
  //# sourceMappingURL=companionUpload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"companionUpload.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/companionUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAExE,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,UAAU;;;;;;;;GAS9D"}
1
+ {"version":3,"file":"companionUpload.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/companionUpload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEtE,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IACxE,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;CAChD,CAAC,CASD"}
@@ -1,6 +1,7 @@
1
1
  import { post } from "./fetcher";
2
2
  import { runUploadTask } from "../utils/uploadTasks";
3
3
  import { appendUploadFile } from "../utils/uploadFile";
4
+ import { companionEligibilityFailure } from "../companion/eligibility";
4
5
  export async function uploadCompanionTripCover(file) {
5
6
  const body = new FormData();
6
7
  appendUploadFile(body, "images", file);
@@ -9,6 +10,6 @@ export async function uploadCompanionTripCover(file) {
9
10
  return { success: true, url: response.data.url };
10
11
  }
11
12
  catch (error) {
12
- return { success: false, error: error instanceof Error ? error.message : "Could not upload the trip cover." };
13
+ return { success: false, ...companionEligibilityFailure(error), error: error instanceof Error ? error.message : "Could not upload the trip cover." };
13
14
  }
14
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/fetcher.ts"],"names":[],"mappings":"AA0BA,UAAU,YAAY;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAuCD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAYnD;AAoLD,wBAAsB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,OAAc,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAM,cAEhH;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,OAAc,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,kBAAkB,CAAM,cAErL;AAED,wBAAsB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAM,cAExG;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAM,cAE1G;AAED,wBAAsB,GAAG,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,WAAW,GAAE,OAAc,EAC3B,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAM,cAGnE"}
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/fetcher.ts"],"names":[],"mappings":"AA0BA,UAAU,YAAY;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAuCD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAYnD;AAwJD,wBAAsB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,GAAE,OAAc,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAM,cAEhH;AAED,wBAAsB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,OAAc,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,kBAAkB,CAAM,cAErL;AAED,wBAAsB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAM,cAExG;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAM,cAE1G;AAED,wBAAsB,GAAG,CAAC,CAAC,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,WAAW,GAAE,OAAc,EAC3B,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAM,cAGnE"}
@@ -1,4 +1,4 @@
1
- import { getAccountType, getCookieHeader, getRole } from "./serverActions";
1
+ import { getCookieHeader } from "./serverActions";
2
2
  import { normalizeRefreshFailureStatus } from "../authSessionPolicy";
3
3
  import { acceptNativeSession, getNativeTransport, nativeSessionGeneration } from "./nativeTransport";
4
4
  // Custom API error class — do NOT import from next/dist internals
@@ -175,61 +175,36 @@ async function refreshToken(input, method, body, options = {}) {
175
175
  throw new ApiError(401, 'Session changed');
176
176
  return customFetch(input, method, body, { ...options, includeAuth: true, retry: false });
177
177
  }
178
- let refreshEndpoint = "/auth/session/refresh";
179
- if (typeof window === "undefined") {
180
- const accountType = await getAccountType();
181
- const legacyRole = accountType ? null : await getRole();
182
- refreshEndpoint = accountType === "staff"
183
- ? "/auth/staff/refresh-token"
184
- : accountType === "host" || legacyRole === "host"
185
- ? "/hosts/refresh-token"
186
- : "/users/refresh-token";
187
- }
188
- // Deduplicate: if a refresh is already in flight, wait for it rather than firing a second one
189
- if (!refreshPromise) {
190
- refreshPromise = (async () => {
191
- const refreshHeaders = {};
192
- // Always include device ID so backend can match the device record
193
- const deviceId = getOrCreateDeviceId();
194
- if (deviceId)
195
- refreshHeaders['X-Device-Id'] = deviceId;
196
- try {
197
- const cookieHeader = await getCookieHeader();
198
- if (cookieHeader)
199
- refreshHeaders['Cookie'] = cookieHeader;
200
- }
201
- catch {
202
- // CSR or static context — credentials:'include' handles cookie forwarding to backend
203
- }
204
- const response = await fetch(`${baseURL}${refreshEndpoint}`, {
205
- method: 'POST',
206
- credentials: 'include',
207
- headers: refreshHeaders,
208
- });
209
- if (!response.ok) {
210
- const data = await response.json();
211
- // A rejected refresh means this browser no longer has a usable
212
- // session, regardless of whether validation/auth middleware
213
- // returned 400, 401, 403, or 422. Normalize client-side refresh
214
- // failures to 401 so expected signed-out initialization stays
215
- // quiet instead of surfacing as a Next.js error overlay.
216
- const statusCode = normalizeRefreshFailureStatus(response.status);
217
- throw { statusCode, error: data.error || data.message || 'Session expired' };
218
- }
219
- })().finally(() => { refreshPromise = null; });
220
- }
221
- try {
222
- await refreshPromise;
223
- return customFetch(input, method, body, { ...options, includeAuth: true, retry: false });
224
- }
225
- catch (error) {
226
- if (error?.name === 'AbortError')
227
- throw error;
228
- if (error && typeof error === 'object' && ('$$typeof' in error || error.digest === 'DYNAMIC_SERVER_USAGE')) {
229
- throw error; // Re-throw Next.js PPR bail-out
178
+ // Rendering cannot reliably deliver Set-Cookie. Browser bootstrap owns
179
+ // rotation; server requests must never consume its refresh credential.
180
+ if (typeof window === "undefined")
181
+ throw new ApiError(401, 'Browser session requires client refresh');
182
+ const refresh = async () => {
183
+ const deviceId = getOrCreateDeviceId();
184
+ const response = await fetch(`${baseURL}/auth/session/refresh`, {
185
+ // Rotation consumes the old credential. Let the browser receive
186
+ // replacement cookies even if this document navigates away.
187
+ method: 'POST', credentials: 'include', keepalive: true,
188
+ headers: deviceId ? { 'X-Device-Id': deviceId } : {},
189
+ });
190
+ if (!response.ok) {
191
+ const data = await response.json();
192
+ throw new ApiError(normalizeRefreshFailureStatus(response.status), data.error || data.message || 'Session expired');
230
193
  }
231
- throw new ApiError(error.statusCode ?? 500, error.error || error.message || 'Session expired. Please log in again.');
194
+ };
195
+ if (!refreshPromise) {
196
+ const locks = typeof navigator !== 'undefined' ? navigator.locks : undefined;
197
+ refreshPromise = (locks ? locks.request(`trippeaze-refresh:${baseURL}`, async () => {
198
+ const probe = await fetch(`${baseURL}/auth/session`, { credentials: 'include' });
199
+ if (probe.ok)
200
+ return;
201
+ if (probe.status !== 401)
202
+ throw new ApiError(probe.status, 'Session validation temporarily unavailable');
203
+ await refresh();
204
+ }) : refresh()).finally(() => { refreshPromise = null; });
232
205
  }
206
+ await refreshPromise;
207
+ return customFetch(input, method, body, { ...options, includeAuth: true, retry: false });
233
208
  }
234
209
  // ✅ Server-safe exported functions
235
210
  export async function get(url, includeAuth = true, options = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"serverActions.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/serverActions.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAKvD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWtD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAahF"}
1
+ {"version":3,"file":"serverActions.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/serverActions.ts"],"names":[],"mappings":"AAMA,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAKvD;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWtD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAahF"}
@@ -1,4 +1,5 @@
1
1
  'use server';
2
+ import { authCookieName } from '../utils/authCookies';
2
3
  import { cookies } from 'next/headers';
3
4
  import { validRoles } from '../utils/text';
4
5
  export async function getCookieHeader() {
@@ -9,7 +10,7 @@ export async function getCookieHeader() {
9
10
  }
10
11
  export async function getRole() {
11
12
  try {
12
- const role = (await cookies()).get("role")?.value ?? null;
13
+ const role = (await cookies()).get(authCookieName("role"))?.value ?? null;
13
14
  return (role && validRoles.includes(role)) ? role : null;
14
15
  }
15
16
  catch (err) {
@@ -22,7 +23,7 @@ export async function getRole() {
22
23
  }
23
24
  export async function getAccountType() {
24
25
  try {
25
- const accountType = (await cookies()).get("accountType")?.value;
26
+ const accountType = (await cookies()).get(authCookieName("accountType"))?.value;
26
27
  return accountType === "user" || accountType === "host" || accountType === "staff"
27
28
  ? accountType
28
29
  : null;
@@ -1,5 +1,5 @@
1
1
  import type { UserRole } from "../models/props";
2
- import type { User } from "../models/user";
2
+ import type { User, UserContactDetails, UserContactIdentity } from "../models/user";
3
3
  /** Strict session read for native restoration: outages must not look signed out. */
4
4
  export declare function getTravellerSessionUser(): Promise<User>;
5
5
  export declare function getCurrentUser(): Promise<User | null>;
@@ -34,16 +34,13 @@ export declare const userApi: {
34
34
  };
35
35
  /** Public compatibility name used by profile surfaces. */
36
36
  export declare const userDetails: typeof getUserDetails;
37
- export declare function getUserContact(username: string, role: string): Promise<{
37
+ type ContactLookupResult<T> = {
38
38
  success: boolean;
39
39
  message?: string;
40
40
  error?: string;
41
- details: {
42
- _id: string;
43
- name: string;
44
- email: string;
45
- countryCode: string;
46
- phoneNumber: string;
47
- } | null;
48
- }>;
41
+ details: T | null;
42
+ };
43
+ export declare function getUserContact(username: string, role: string, identityOnly: true): Promise<ContactLookupResult<UserContactIdentity>>;
44
+ export declare function getUserContact(username: string, role: string, identityOnly?: false): Promise<ContactLookupResult<UserContactDetails>>;
45
+ export {};
49
46
  //# sourceMappingURL=user.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAK3C,oFAAoF;AACpF,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAe3D;AACD,wBAAsB,cAAc,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,GAAG,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBrG;AAED,eAAO,MAAM,OAAO;wBAEU,MAAM,QAAQ,MAAM;eAED,MAAM;cAAQ,GAAG;;;;;0BAQlC,MAAM,QAAQ,MAAM;eAEH,MAAM;cAAQ,GAAG;;;;;;;6BA4B/B,MAAM,QAAQ,MAAM;mBAEoB,OAAO;oBAAc,OAAO;;CAOtG,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,WAAW,uBAAiB,CAAC;AAE1C,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,CAAC,CAiB5O"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKpF,oFAAoF;AACpF,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7D;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAe3D;AACD,wBAAsB,cAAc,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,GAAG,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBrG;AAED,eAAO,MAAM,OAAO;wBAEU,MAAM,QAAQ,MAAM;eAED,MAAM;cAAQ,GAAG;;;;;0BAQlC,MAAM,QAAQ,MAAM;eAEH,MAAM;cAAQ,GAAG;;;;;;;6BA4B/B,MAAM,QAAQ,MAAM;mBAEoB,OAAO;oBAAc,OAAO;;CAOtG,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,WAAW,uBAAiB,CAAC;AAE1C,KAAK,mBAAmB,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACtI,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC"}
@@ -97,9 +97,9 @@ export const userApi = {
97
97
  };
98
98
  /** Public compatibility name used by profile surfaces. */
99
99
  export const userDetails = getUserDetails;
100
- export async function getUserContact(username, role) {
100
+ export async function getUserContact(username, role, identityOnly = false) {
101
101
  try {
102
- const endpoint = `/${role}s/getUserContact/${username}`;
102
+ const endpoint = `/${role}s/getUserContact/${encodeURIComponent(username)}${identityOnly ? "?identityOnly=true" : ""}`;
103
103
  const data = await get(endpoint);
104
104
  return {
105
105
  success: true,
@@ -1 +1 @@
1
- {"version":3,"file":"authSessionManager.d.ts","sourceRoot":"","sources":["../../src/lib/authSessionManager.tsx"],"names":[],"mappings":"AAuBA,MAAM,CAAC,OAAO,UAAU,kBAAkB,SA2GzC"}
1
+ {"version":3,"file":"authSessionManager.d.ts","sourceRoot":"","sources":["../../src/lib/authSessionManager.tsx"],"names":[],"mappings":"AAuBA,MAAM,CAAC,OAAO,UAAU,kBAAkB,SAiGzC"}