@myrjfa/state 2.3.1 → 2.3.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.
Files changed (171) hide show
  1. package/dist/lib/actions/actions.d.ts +6 -6
  2. package/dist/lib/actions/auth.d.ts +23 -19
  3. package/dist/lib/actions/auth.d.ts.map +1 -1
  4. package/dist/lib/actions/auth.js +24 -5
  5. package/dist/lib/actions/fetcher.d.ts.map +1 -1
  6. package/dist/lib/actions/fetcher.js +15 -8
  7. package/dist/lib/actions.d.ts +12 -12
  8. package/dist/lib/actions.d.ts.map +1 -1
  9. package/dist/lib/actions.js +3 -1
  10. package/dist/lib/authSessionManager.d.ts.map +1 -1
  11. package/dist/lib/authSessionManager.js +77 -13
  12. package/dist/lib/authSessionPolicy.d.ts +34 -0
  13. package/dist/lib/authSessionPolicy.d.ts.map +1 -1
  14. package/dist/lib/authSessionPolicy.js +52 -0
  15. package/dist/lib/models/authorization.d.ts +4 -3
  16. package/dist/lib/models/authorization.d.ts.map +1 -1
  17. package/dist/lib/models/authorization.js +4 -1
  18. package/dist/lib/models/blog.d.ts +4 -4
  19. package/dist/lib/models/discount.d.ts +52 -52
  20. package/dist/lib/models/notifications.d.ts +2 -2
  21. package/dist/lib/models/opportunities/freelance.d.ts +34 -34
  22. package/dist/lib/models/opportunities/internship.d.ts +34 -34
  23. package/dist/lib/models/opportunities/job.d.ts +34 -34
  24. package/dist/lib/models/opportunities/opportunity.d.ts +34 -34
  25. package/dist/lib/models/opportunities/volunteerJob.d.ts +34 -34
  26. package/dist/lib/models/package.d.ts +16 -16
  27. package/dist/lib/models/portfolio.d.ts +2 -2
  28. package/dist/lib/models/pricing.d.ts +12 -12
  29. package/dist/lib/models/review.d.ts +2 -2
  30. package/dist/lib/models/stay.d.ts +18 -18
  31. package/dist/lib/models/travelPackage.d.ts +36 -36
  32. package/dist/lib/models/user.d.ts +12 -12
  33. package/dist/lib/userAtom.d.ts +126 -25
  34. package/dist/lib/userAtom.d.ts.map +1 -1
  35. package/dist/lib/userAtom.js +79 -45
  36. package/package.json +1 -1
  37. package/dist/lib/actions/adminDashboard.d.ts +0 -4
  38. package/dist/lib/actions/adminDashboard.d.ts.map +0 -1
  39. package/dist/lib/actions/adminDashboard.js +0 -29
  40. package/dist/lib/actions/adventure.d.ts +0 -104
  41. package/dist/lib/actions/adventure.d.ts.map +0 -1
  42. package/dist/lib/actions/adventure.js +0 -203
  43. package/dist/lib/actions/application.d.ts +0 -35
  44. package/dist/lib/actions/application.d.ts.map +0 -1
  45. package/dist/lib/actions/application.js +0 -573
  46. package/dist/lib/actions/blog.d.ts +0 -61
  47. package/dist/lib/actions/blog.d.ts.map +0 -1
  48. package/dist/lib/actions/blog.js +0 -762
  49. package/dist/lib/actions/brand.d.ts +0 -83
  50. package/dist/lib/actions/brand.d.ts.map +0 -1
  51. package/dist/lib/actions/brand.js +0 -28
  52. package/dist/lib/actions/companion.d.ts +0 -174
  53. package/dist/lib/actions/companion.d.ts.map +0 -1
  54. package/dist/lib/actions/companion.js +0 -276
  55. package/dist/lib/actions/event.d.ts +0 -178
  56. package/dist/lib/actions/event.d.ts.map +0 -1
  57. package/dist/lib/actions/event.js +0 -214
  58. package/dist/lib/actions/guide.d.ts +0 -55
  59. package/dist/lib/actions/guide.d.ts.map +0 -1
  60. package/dist/lib/actions/guide.js +0 -128
  61. package/dist/lib/actions/hostDashboard.d.ts +0 -122
  62. package/dist/lib/actions/hostDashboard.d.ts.map +0 -1
  63. package/dist/lib/actions/hostDashboard.js +0 -329
  64. package/dist/lib/actions/location.d.ts +0 -141
  65. package/dist/lib/actions/location.d.ts.map +0 -1
  66. package/dist/lib/actions/location.js +0 -113
  67. package/dist/lib/actions/notifications.d.ts +0 -91
  68. package/dist/lib/actions/notifications.d.ts.map +0 -1
  69. package/dist/lib/actions/notifications.js +0 -83
  70. package/dist/lib/actions/opportunity.d.ts +0 -44
  71. package/dist/lib/actions/opportunity.d.ts.map +0 -1
  72. package/dist/lib/actions/opportunity.js +0 -318
  73. package/dist/lib/actions/package.d.ts +0 -85
  74. package/dist/lib/actions/package.d.ts.map +0 -1
  75. package/dist/lib/actions/package.js +0 -167
  76. package/dist/lib/actions/place.d.ts +0 -191
  77. package/dist/lib/actions/place.d.ts.map +0 -1
  78. package/dist/lib/actions/place.js +0 -57
  79. package/dist/lib/actions/portfolio.d.ts +0 -65
  80. package/dist/lib/actions/portfolio.d.ts.map +0 -1
  81. package/dist/lib/actions/portfolio.js +0 -62
  82. package/dist/lib/actions/property.d.ts +0 -17
  83. package/dist/lib/actions/property.d.ts.map +0 -1
  84. package/dist/lib/actions/property.js +0 -16
  85. package/dist/lib/actions/rental.d.ts +0 -87
  86. package/dist/lib/actions/rental.d.ts.map +0 -1
  87. package/dist/lib/actions/rental.js +0 -205
  88. package/dist/lib/actions/review.d.ts +0 -8
  89. package/dist/lib/actions/review.d.ts.map +0 -1
  90. package/dist/lib/actions/review.js +0 -102
  91. package/dist/lib/actions/room.d.ts +0 -39
  92. package/dist/lib/actions/room.d.ts.map +0 -1
  93. package/dist/lib/actions/room.js +0 -74
  94. package/dist/lib/actions/stay.d.ts +0 -97
  95. package/dist/lib/actions/stay.d.ts.map +0 -1
  96. package/dist/lib/actions/stay.js +0 -138
  97. package/dist/lib/actions/travelPackage.d.ts +0 -104
  98. package/dist/lib/actions/travelPackage.d.ts.map +0 -1
  99. package/dist/lib/actions/travelPackage.js +0 -487
  100. package/dist/lib/data/adventureDummyData.d.ts +0 -3
  101. package/dist/lib/data/adventureDummyData.d.ts.map +0 -1
  102. package/dist/lib/data/adventureDummyData.js +0 -138
  103. package/dist/lib/data/adventureFormPage.d.ts +0 -28
  104. package/dist/lib/data/adventureFormPage.d.ts.map +0 -1
  105. package/dist/lib/data/adventureFormPage.js +0 -58
  106. package/dist/lib/data/companionDummyData.d.ts +0 -99
  107. package/dist/lib/data/companionDummyData.d.ts.map +0 -1
  108. package/dist/lib/data/companionDummyData.js +0 -203
  109. package/dist/lib/data/destinations.d.ts +0 -14
  110. package/dist/lib/data/destinations.d.ts.map +0 -1
  111. package/dist/lib/data/destinations.js +0 -203
  112. package/dist/lib/data/eventFormPage.d.ts +0 -38
  113. package/dist/lib/data/eventFormPage.d.ts.map +0 -1
  114. package/dist/lib/data/eventFormPage.js +0 -56
  115. package/dist/lib/data/eventsDummyData.d.ts +0 -54
  116. package/dist/lib/data/eventsDummyData.d.ts.map +0 -1
  117. package/dist/lib/data/eventsDummyData.js +0 -586
  118. package/dist/lib/data/guideDummyData.d.ts +0 -3
  119. package/dist/lib/data/guideDummyData.d.ts.map +0 -1
  120. package/dist/lib/data/guideDummyData.js +0 -66
  121. package/dist/lib/data/opportunityFormData.d.ts +0 -13
  122. package/dist/lib/data/opportunityFormData.d.ts.map +0 -1
  123. package/dist/lib/data/opportunityFormData.js +0 -62
  124. package/dist/lib/data/opportunityFormPage.d.ts +0 -12
  125. package/dist/lib/data/opportunityFormPage.d.ts.map +0 -1
  126. package/dist/lib/data/opportunityFormPage.js +0 -33
  127. package/dist/lib/data/packageDummyData.d.ts +0 -3
  128. package/dist/lib/data/packageDummyData.d.ts.map +0 -1
  129. package/dist/lib/data/packageDummyData.js +0 -56
  130. package/dist/lib/data/rentalDummyData.d.ts +0 -3
  131. package/dist/lib/data/rentalDummyData.d.ts.map +0 -1
  132. package/dist/lib/data/rentalDummyData.js +0 -382
  133. package/dist/lib/data/rentalFormPage.d.ts +0 -11
  134. package/dist/lib/data/rentalFormPage.d.ts.map +0 -1
  135. package/dist/lib/data/rentalFormPage.js +0 -86
  136. package/dist/lib/data/staysDummyData.d.ts +0 -72
  137. package/dist/lib/data/staysDummyData.d.ts.map +0 -1
  138. package/dist/lib/data/staysDummyData.js +0 -694
  139. package/dist/lib/data/storeDummyData.d.ts +0 -33
  140. package/dist/lib/data/storeDummyData.d.ts.map +0 -1
  141. package/dist/lib/data/storeDummyData.js +0 -336
  142. package/dist/lib/data/travelPackageFormData.d.ts +0 -19
  143. package/dist/lib/data/travelPackageFormData.d.ts.map +0 -1
  144. package/dist/lib/data/travelPackageFormData.js +0 -51
  145. package/dist/lib/data/travelPackageFormPage.d.ts +0 -22
  146. package/dist/lib/data/travelPackageFormPage.d.ts.map +0 -1
  147. package/dist/lib/data/travelPackageFormPage.js +0 -40
  148. package/dist/lib/data/vehicleData.d.ts +0 -2
  149. package/dist/lib/data/vehicleData.d.ts.map +0 -1
  150. package/dist/lib/data/vehicleData.js +0 -187
  151. package/dist/lib/data/vehicleModels.d.ts +0 -2
  152. package/dist/lib/data/vehicleModels.d.ts.map +0 -1
  153. package/dist/lib/data/vehicleModels.js +0 -128
  154. package/dist/lib/hooks/usePersistentDraftState.d.ts +0 -20
  155. package/dist/lib/hooks/usePersistentDraftState.d.ts.map +0 -1
  156. package/dist/lib/hooks/usePersistentDraftState.js +0 -47
  157. package/dist/lib/models/forms.d.ts +0 -384
  158. package/dist/lib/models/forms.d.ts.map +0 -1
  159. package/dist/lib/models/forms.js +0 -121
  160. package/dist/lib/pricingActions.d.ts +0 -13
  161. package/dist/lib/pricingActions.d.ts.map +0 -1
  162. package/dist/lib/pricingActions.js +0 -16
  163. package/dist/lib/utils/entitySubmission.d.ts +0 -21
  164. package/dist/lib/utils/entitySubmission.d.ts.map +0 -1
  165. package/dist/lib/utils/entitySubmission.js +0 -10
  166. package/dist/lib/utils/imageUpload.d.ts +0 -4
  167. package/dist/lib/utils/imageUpload.d.ts.map +0 -1
  168. package/dist/lib/utils/imageUpload.js +0 -36
  169. package/dist/lib/utils/tileConverters.d.ts +0 -8
  170. package/dist/lib/utils/tileConverters.d.ts.map +0 -1
  171. package/dist/lib/utils/tileConverters.js +0 -59
@@ -1,13 +1,14 @@
1
+ import { type AuthSessionStatus } from './authSessionPolicy';
1
2
  export declare const storageInitializedAtom: import("jotai").PrimitiveAtom<boolean> & {
2
3
  init: boolean;
3
4
  };
4
5
  export declare const userAtom: import("jotai").WritableAtom<{
5
6
  username: string;
7
+ email: string;
6
8
  firstName: string;
7
9
  lastName: string;
8
- email: string;
9
- password: string;
10
10
  phoneNumber: string;
11
+ password: string;
11
12
  countryCode: string;
12
13
  country: string;
13
14
  gender: "male" | "female" | "other";
@@ -20,6 +21,10 @@ export declare const userAtom: import("jotai").WritableAtom<{
20
21
  verifiedEmail: boolean;
21
22
  verifiedMobile: boolean;
22
23
  role: string;
24
+ baseAccountType?: "user" | "host" | undefined;
25
+ legacyRole?: string | undefined;
26
+ staffProfileId?: string | null | undefined;
27
+ accountType?: "user" | "host" | "staff" | undefined;
23
28
  _id?: string | undefined;
24
29
  location?: string | undefined;
25
30
  pinCode?: string | undefined;
@@ -33,10 +38,6 @@ export declare const userAtom: import("jotai").WritableAtom<{
33
38
  refreshToken?: string | undefined;
34
39
  verifiedIdCard?: boolean | undefined;
35
40
  permissions?: string[] | undefined;
36
- accountType?: "user" | "host" | "staff" | undefined;
37
- baseAccountType?: "user" | "host" | undefined;
38
- legacyRole?: string | undefined;
39
- staffProfileId?: string | null | undefined;
40
41
  baseUserId?: string | null | undefined;
41
42
  baseHostId?: string | null | undefined;
42
43
  socialLinks?: Partial<Record<"instagram" | "linkedin" | "youtube" | "googleBusiness", string>> | undefined;
@@ -73,11 +74,11 @@ export declare const userAtom: import("jotai").WritableAtom<{
73
74
  businessVerificationDenialReason?: string | undefined;
74
75
  } | null, [{
75
76
  username: string;
77
+ email: string;
76
78
  firstName: string;
77
79
  lastName: string;
78
- email: string;
79
- password: string;
80
80
  phoneNumber: string;
81
+ password: string;
81
82
  countryCode: string;
82
83
  country: string;
83
84
  gender: "male" | "female" | "other";
@@ -90,6 +91,10 @@ export declare const userAtom: import("jotai").WritableAtom<{
90
91
  verifiedEmail: boolean;
91
92
  verifiedMobile: boolean;
92
93
  role: string;
94
+ baseAccountType?: "user" | "host" | undefined;
95
+ legacyRole?: string | undefined;
96
+ staffProfileId?: string | null | undefined;
97
+ accountType?: "user" | "host" | "staff" | undefined;
93
98
  _id?: string | undefined;
94
99
  location?: string | undefined;
95
100
  pinCode?: string | undefined;
@@ -103,10 +108,6 @@ export declare const userAtom: import("jotai").WritableAtom<{
103
108
  refreshToken?: string | undefined;
104
109
  verifiedIdCard?: boolean | undefined;
105
110
  permissions?: string[] | undefined;
106
- accountType?: "user" | "host" | "staff" | undefined;
107
- baseAccountType?: "user" | "host" | undefined;
108
- legacyRole?: string | undefined;
109
- staffProfileId?: string | null | undefined;
110
111
  baseUserId?: string | null | undefined;
111
112
  baseHostId?: string | null | undefined;
112
113
  socialLinks?: Partial<Record<"instagram" | "linkedin" | "youtube" | "googleBusiness", string>> | undefined;
@@ -143,11 +144,11 @@ export declare const userAtom: import("jotai").WritableAtom<{
143
144
  businessVerificationDenialReason?: string | undefined;
144
145
  } | typeof import("jotai/utils").RESET | ((prev: {
145
146
  username: string;
147
+ email: string;
146
148
  firstName: string;
147
149
  lastName: string;
148
- email: string;
149
- password: string;
150
150
  phoneNumber: string;
151
+ password: string;
151
152
  countryCode: string;
152
153
  country: string;
153
154
  gender: "male" | "female" | "other";
@@ -160,6 +161,10 @@ export declare const userAtom: import("jotai").WritableAtom<{
160
161
  verifiedEmail: boolean;
161
162
  verifiedMobile: boolean;
162
163
  role: string;
164
+ baseAccountType?: "user" | "host" | undefined;
165
+ legacyRole?: string | undefined;
166
+ staffProfileId?: string | null | undefined;
167
+ accountType?: "user" | "host" | "staff" | undefined;
163
168
  _id?: string | undefined;
164
169
  location?: string | undefined;
165
170
  pinCode?: string | undefined;
@@ -173,10 +178,6 @@ export declare const userAtom: import("jotai").WritableAtom<{
173
178
  refreshToken?: string | undefined;
174
179
  verifiedIdCard?: boolean | undefined;
175
180
  permissions?: string[] | undefined;
176
- accountType?: "user" | "host" | "staff" | undefined;
177
- baseAccountType?: "user" | "host" | undefined;
178
- legacyRole?: string | undefined;
179
- staffProfileId?: string | null | undefined;
180
181
  baseUserId?: string | null | undefined;
181
182
  baseHostId?: string | null | undefined;
182
183
  socialLinks?: Partial<Record<"instagram" | "linkedin" | "youtube" | "googleBusiness", string>> | undefined;
@@ -213,11 +214,11 @@ export declare const userAtom: import("jotai").WritableAtom<{
213
214
  businessVerificationDenialReason?: string | undefined;
214
215
  } | null) => {
215
216
  username: string;
217
+ email: string;
216
218
  firstName: string;
217
219
  lastName: string;
218
- email: string;
219
- password: string;
220
220
  phoneNumber: string;
221
+ password: string;
221
222
  countryCode: string;
222
223
  country: string;
223
224
  gender: "male" | "female" | "other";
@@ -230,6 +231,10 @@ export declare const userAtom: import("jotai").WritableAtom<{
230
231
  verifiedEmail: boolean;
231
232
  verifiedMobile: boolean;
232
233
  role: string;
234
+ baseAccountType?: "user" | "host" | undefined;
235
+ legacyRole?: string | undefined;
236
+ staffProfileId?: string | null | undefined;
237
+ accountType?: "user" | "host" | "staff" | undefined;
233
238
  _id?: string | undefined;
234
239
  location?: string | undefined;
235
240
  pinCode?: string | undefined;
@@ -243,10 +248,95 @@ export declare const userAtom: import("jotai").WritableAtom<{
243
248
  refreshToken?: string | undefined;
244
249
  verifiedIdCard?: boolean | undefined;
245
250
  permissions?: string[] | undefined;
246
- accountType?: "user" | "host" | "staff" | undefined;
251
+ baseUserId?: string | null | undefined;
252
+ baseHostId?: string | null | undefined;
253
+ socialLinks?: Partial<Record<"instagram" | "linkedin" | "youtube" | "googleBusiness", string>> | undefined;
254
+ userResume?: string | undefined;
255
+ skills?: {
256
+ skill: string;
257
+ skillExpertise: number;
258
+ }[] | undefined;
259
+ wishlist?: string[] | undefined;
260
+ favBlogs?: string[] | undefined;
261
+ favPackages?: string[] | undefined;
262
+ id?: string | undefined;
263
+ selfie?: string | undefined;
264
+ selfieAction?: string | undefined;
265
+ jobCount?: number | undefined;
266
+ travelPackageCount?: number | undefined;
267
+ gstNumber?: string | undefined;
268
+ panCard?: string | undefined;
269
+ verifiedBusiness?: "true" | "false" | "inProgress" | undefined;
270
+ properties?: {
271
+ country: string;
272
+ type: string;
273
+ name: string;
274
+ address: string;
275
+ city: string;
276
+ state: string;
277
+ pinCode?: string | undefined;
278
+ registrationNumber?: string | undefined;
279
+ }[] | undefined;
280
+ businessDocument?: string | undefined;
281
+ businessIdType?: "PAN" | "GST" | "Udyam" | "PersonalPAN" | undefined;
282
+ businessIdNumber?: string | undefined;
283
+ businessApiVerificationStatus?: "pending" | "verified" | "failed" | undefined;
284
+ businessVerificationDenialReason?: string | undefined;
285
+ } | typeof import("jotai/utils").RESET | null) | null], void>;
286
+ export declare const isLoggedInAtom: import("jotai").WritableAtom<boolean, [boolean | typeof import("jotai/utils").RESET | ((prev: boolean) => boolean | typeof import("jotai/utils").RESET)], void>;
287
+ /**
288
+ * Changes whenever a login/logout boundary occurs.
289
+ *
290
+ * Background session requests capture this value. Responses belonging to an
291
+ * older revision must not clear a newer authenticated state.
292
+ */
293
+ export declare const authRevisionAtom: import("jotai").PrimitiveAtom<number> & {
294
+ init: number;
295
+ };
296
+ export type { AuthSessionStatus } from './authSessionPolicy';
297
+ /** Backend reconciliation state for the currently persisted identity. */
298
+ export declare const authSessionStatusAtom: import("jotai").PrimitiveAtom<AuthSessionStatus> & {
299
+ init: AuthSessionStatus;
300
+ };
301
+ /**
302
+ * Atomically commits a successful login to the active Jotai store.
303
+ */
304
+ export declare const commitLoginAtom: import("jotai").WritableAtom<null, [authenticatedUser: {
305
+ username: string;
306
+ email: string;
307
+ firstName: string;
308
+ lastName: string;
309
+ phoneNumber: string;
310
+ password: string;
311
+ countryCode: string;
312
+ country: string;
313
+ gender: "male" | "female" | "other";
314
+ rating: number;
315
+ ratingCount: number;
316
+ reviewCount: number;
317
+ joinedDate: Date;
318
+ isActive: boolean;
319
+ lastActive: Date;
320
+ verifiedEmail: boolean;
321
+ verifiedMobile: boolean;
322
+ role: string;
247
323
  baseAccountType?: "user" | "host" | undefined;
248
324
  legacyRole?: string | undefined;
249
325
  staffProfileId?: string | null | undefined;
326
+ accountType?: "user" | "host" | "staff" | undefined;
327
+ _id?: string | undefined;
328
+ location?: string | undefined;
329
+ pinCode?: string | undefined;
330
+ dob?: Date | undefined;
331
+ profilePic?: string | undefined;
332
+ blogsCount?: number | undefined;
333
+ userBio?: string | undefined;
334
+ userIdCard?: string | undefined;
335
+ watchHistory?: string[] | undefined;
336
+ accessToken?: string | undefined;
337
+ refreshToken?: string | undefined;
338
+ verifiedIdCard?: boolean | undefined;
339
+ permissions?: string[] | undefined;
250
340
  baseUserId?: string | null | undefined;
251
341
  baseHostId?: string | null | undefined;
252
342
  socialLinks?: Partial<Record<"instagram" | "linkedin" | "youtube" | "googleBusiness", string>> | undefined;
@@ -281,14 +371,25 @@ export declare const userAtom: import("jotai").WritableAtom<{
281
371
  businessIdNumber?: string | undefined;
282
372
  businessApiVerificationStatus?: "pending" | "verified" | "failed" | undefined;
283
373
  businessVerificationDenialReason?: string | undefined;
284
- } | typeof import("jotai/utils").RESET | null) | null], void>;
285
- export declare const isLoggedInAtom: import("jotai").WritableAtom<boolean, [boolean | typeof import("jotai/utils").RESET | ((prev: boolean) => boolean | typeof import("jotai/utils").RESET)], void>;
286
- export declare const userLoadingAtom: import("jotai").Atom<boolean>;
287
- export declare const initializeAuthSessionAtom: import("jotai").WritableAtom<null, [], Promise<void>> & {
374
+ }], void> & {
288
375
  init: null;
289
376
  };
377
+ export declare const userLoadingAtom: import("jotai").Atom<boolean>;
290
378
  export declare const resetAuthStateAtom: import("jotai").WritableAtom<null, [], void> & {
291
379
  init: null;
292
380
  };
381
+ /**
382
+ * Clears provisional browser identity while keeping public auth controls
383
+ * disabled until the backend cookie/device cleanup request has settled.
384
+ */
385
+ export declare const beginAuthCleanupAtom: import("jotai").WritableAtom<null, [], void> & {
386
+ init: null;
387
+ };
388
+ export declare const finishAuthCleanupAtom: import("jotai").WritableAtom<null, [expectedRevision: number], void> & {
389
+ init: null;
390
+ };
391
+ export declare const initializeAuthSessionAtom: import("jotai").WritableAtom<null, [], Promise<void>> & {
392
+ init: null;
393
+ };
293
394
  export declare function resetAuthState(): void;
294
395
  //# sourceMappingURL=userAtom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"userAtom.d.ts","sourceRoot":"","sources":["../../src/lib/userAtom.ts"],"names":[],"mappings":"AAgEA,eAAO,MAAM,sBAAsB;;CAAuB,CAAC;AAG3D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAQpB,CAAC;AAEF,eAAO,MAAM,cAAc,iKAA6C,CAAC;AAGzE,eAAO,MAAM,eAAe,+BAM1B,CAAC;AAGH,eAAO,MAAM,yBAAyB;;CA+CrC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;CAO7B,CAAC;AAEH,wBAAgB,cAAc,SAU7B"}
1
+ {"version":3,"file":"userAtom.d.ts","sourceRoot":"","sources":["../../src/lib/userAtom.ts"],"names":[],"mappings":"AAMA,OAAO,EAIH,KAAK,iBAAiB,EACzB,MAAM,qBAAqB,CAAC;AA0D7B,eAAO,MAAM,sBAAsB;;CAAuB,CAAC;AAG3D,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6DAQpB,CAAC;AAEF,eAAO,MAAM,cAAc,iKAA6C,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;CAAU,CAAC;AAExC,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,yEAAyE;AACzE,eAAO,MAAM,qBAAqB;;CAA0C,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAS3B,CAAC;AAGF,eAAO,MAAM,eAAe,+BAS1B,CAAC;AAGH,eAAO,MAAM,kBAAkB;;CAY7B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;CAU/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;CAMjC,CAAC;AAGF,eAAO,MAAM,yBAAyB;;CAiCrC,CAAC;AAEF,wBAAgB,cAAc,SAY7B"}
@@ -2,7 +2,8 @@
2
2
  import CryptoJS from 'crypto-js';
3
3
  import { atom, getDefaultStore } from 'jotai';
4
4
  import { atomWithStorage } from 'jotai/utils';
5
- import { getCurrentUser } from './actions/actions';
5
+ import { clearSessionCookies } from './actions/auth';
6
+ import { canFinishAuthCleanup, clearCacheMissSessionBoundary, isAuthSessionPending, } from './authSessionPolicy';
6
7
  const STORAGE_KEY = process.env.NEXT_PUBLIC_USER_KEY;
7
8
  const LOGIN_KEY = process.env.NEXT_PUBLIC_LOGIN_KEY;
8
9
  const SECRET_KEY = process.env.NEXT_PUBLIC_RACE;
@@ -35,14 +36,14 @@ const getWithExpiry = (key) => {
35
36
  return null;
36
37
  const { value, expiry } = data;
37
38
  if (Date.now() > expiry) {
38
- resetAuthState();
39
+ localStorage.removeItem(key);
39
40
  return null;
40
41
  }
41
42
  return value;
42
43
  }
43
44
  catch (e) {
44
45
  console.warn('Invalid user data:', e);
45
- resetAuthState();
46
+ localStorage.removeItem(key);
46
47
  return null;
47
48
  }
48
49
  };
@@ -64,68 +65,99 @@ export const userAtom = atomWithStorage(STORAGE_KEY, null, {
64
65
  removeItem: (key) => localStorage.removeItem(key),
65
66
  });
66
67
  export const isLoggedInAtom = atomWithStorage(LOGIN_KEY, false);
68
+ /**
69
+ * Changes whenever a login/logout boundary occurs.
70
+ *
71
+ * Background session requests capture this value. Responses belonging to an
72
+ * older revision must not clear a newer authenticated state.
73
+ */
74
+ export const authRevisionAtom = atom(0);
75
+ /** Backend reconciliation state for the currently persisted identity. */
76
+ export const authSessionStatusAtom = atom("initializing");
77
+ /**
78
+ * Atomically commits a successful login to the active Jotai store.
79
+ */
80
+ export const commitLoginAtom = atom(null, (_get, set, authenticatedUser) => {
81
+ set(userAtom, authenticatedUser);
82
+ set(isLoggedInAtom, true);
83
+ set(storageInitializedAtom, true);
84
+ set(authSessionStatusAtom, "authenticated");
85
+ set(authRevisionAtom, (revision) => revision + 1);
86
+ });
67
87
  // 🕒 Tracks if user is loading
68
88
  export const userLoadingAtom = atom((get) => {
69
- // The issue was here - we need to properly track initialization state
70
89
  const initialized = get(storageInitializedAtom);
71
- // We're loading if we haven't initialized storage yet
72
- return !initialized;
90
+ const sessionStatus = get(authSessionStatusAtom);
91
+ // Reconciliation is an authentication boundary, not background cosmetic
92
+ // work. Keep login/register controls unavailable until validation or
93
+ // cookie cleanup settles so a late Set-Cookie response cannot erase a
94
+ // newly-created session.
95
+ return !initialized || isAuthSessionPending(sessionStatus);
96
+ });
97
+ export const resetAuthStateAtom = atom(null, (_get, set) => {
98
+ if (typeof window === "undefined")
99
+ return;
100
+ localStorage.removeItem(STORAGE_KEY);
101
+ localStorage.removeItem(LOGIN_KEY);
102
+ // Update the active Jotai store used by the calling React component.
103
+ set(userAtom, null);
104
+ set(isLoggedInAtom, false);
105
+ set(storageInitializedAtom, true);
106
+ set(authSessionStatusAtom, "signed-out");
107
+ set(authRevisionAtom, (revision) => revision + 1);
108
+ });
109
+ /**
110
+ * Clears provisional browser identity while keeping public auth controls
111
+ * disabled until the backend cookie/device cleanup request has settled.
112
+ */
113
+ export const beginAuthCleanupAtom = atom(null, (_get, set) => {
114
+ if (typeof window === "undefined")
115
+ return;
116
+ localStorage.removeItem(STORAGE_KEY);
117
+ localStorage.removeItem(LOGIN_KEY);
118
+ set(userAtom, null);
119
+ set(isLoggedInAtom, false);
120
+ set(storageInitializedAtom, true);
121
+ set(authSessionStatusAtom, "clearing");
122
+ set(authRevisionAtom, (revision) => revision + 1);
123
+ });
124
+ export const finishAuthCleanupAtom = atom(null, (get, set, expectedRevision) => {
125
+ if (!canFinishAuthCleanup(expectedRevision, get(authRevisionAtom)))
126
+ return;
127
+ set(authSessionStatusAtom, "signed-out");
73
128
  });
74
129
  // Initialize storage atom effect
75
130
  export const initializeAuthSessionAtom = atom(null, async (get, set) => {
76
131
  // Only run in browser
77
132
  if (typeof window === 'undefined')
78
133
  return;
79
- // 1. Validate session (role-aware — host route differs from user route)
80
- // const session = await validateSession();
81
- // if (session.success) {
82
- // Session validated successfully
83
- // } else {
84
- // resetAuthState();
85
- // set(storageInitializedAtom, true);
86
- // return;
87
- // }
88
- // NOTE: if validateSession fails we do NOT reset — we just fall through
89
- // to cache/API. A failed ping could mean the backend is temporarily down,
90
- // the user is a host (different endpoint), etc. We only clear state if we
91
- // POSITIVELY know the user is logged out (getCurrentUser fails).
92
- // 2. Try cache (localStorage)
134
+ // Try the local identity cache first. It remains provisional until the
135
+ // backend confirms that the cookies belong to the same actor.
93
136
  const userData = getWithExpiry(STORAGE_KEY);
94
137
  if (userData) {
95
- set(userAtom, userData);
96
- set(isLoggedInAtom, true);
97
- set(storageInitializedAtom, true);
138
+ set(commitLoginAtom, userData);
139
+ set(authSessionStatusAtom, "validating");
98
140
  return;
99
141
  }
100
- // 3. If cache miss: fetch user from backend using session cookie
142
+ // Missing persisted identity is always a cleanup boundary. The endpoint
143
+ // is idempotent for a fresh guest and revokes stale cookie-only sessions.
144
+ set(beginAuthCleanupAtom);
145
+ const cleanupRevision = get(authRevisionAtom);
101
146
  try {
102
- // This endpoint can hit DB or another cache as needed
103
- const remoteUser = await getCurrentUser();
104
- if (remoteUser) {
105
- set(userAtom, remoteUser);
106
- set(isLoggedInAtom, true);
107
- setWithExpiry(STORAGE_KEY, remoteUser); // Write to local cache for next time
108
- }
109
- else {
110
- resetAuthState();
111
- }
147
+ await clearCacheMissSessionBoundary({
148
+ cleanupRevision,
149
+ getCurrentRevision: () => get(authRevisionAtom),
150
+ clearSession: clearSessionCookies,
151
+ });
112
152
  }
113
153
  catch {
114
- resetAuthState();
154
+ // clearSessionCookies is bounded. Local signed-out state is still
155
+ // published only after the cleanup attempt has settled.
115
156
  }
116
157
  finally {
117
- set(storageInitializedAtom, true);
158
+ set(finishAuthCleanupAtom, cleanupRevision);
118
159
  }
119
160
  });
120
- export const resetAuthStateAtom = atom(null, (_get, set) => {
121
- if (typeof window === 'undefined')
122
- return;
123
- localStorage.removeItem(STORAGE_KEY);
124
- localStorage.removeItem(LOGIN_KEY);
125
- set(userAtom, null);
126
- set(isLoggedInAtom, false);
127
- set(storageInitializedAtom, true);
128
- });
129
161
  export function resetAuthState() {
130
162
  if (typeof window === 'undefined') {
131
163
  console.warn('resetAuthState called on server — skipped');
@@ -136,4 +168,6 @@ export function resetAuthState() {
136
168
  store.set(userAtom, null);
137
169
  store.set(isLoggedInAtom, false);
138
170
  store.set(storageInitializedAtom, true);
171
+ store.set(authSessionStatusAtom, "signed-out");
172
+ store.set(authRevisionAtom, (revision) => revision + 1);
139
173
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@myrjfa/state",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./dist/*": "./dist/*.js"
@@ -1,4 +0,0 @@
1
- export declare function getPayoutRecipients(): Promise<any>;
2
- export declare function getPayoutHistory(): Promise<any>;
3
- export declare function recordManualPayout(formData: FormData): Promise<any>;
4
- //# sourceMappingURL=adminDashboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adminDashboard.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/adminDashboard.ts"],"names":[],"mappings":"AAIA,wBAAsB,mBAAmB,iBAOxC;AAED,wBAAsB,gBAAgB,iBAOrC;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,gBAO1D"}
@@ -1,29 +0,0 @@
1
- // --- Payouts actions --- //
2
- import { get, post } from "./fetcher";
3
- export async function getPayoutRecipients() {
4
- try {
5
- const data = await get("/admin/payouts/recipients");
6
- return { success: true, ...data };
7
- }
8
- catch (error) {
9
- return { success: false, error: error.message };
10
- }
11
- }
12
- export async function getPayoutHistory() {
13
- try {
14
- const data = await get("/admin/payouts/history");
15
- return { success: true, ...data };
16
- }
17
- catch (error) {
18
- return { success: false, error: error.message };
19
- }
20
- }
21
- export async function recordManualPayout(formData) {
22
- try {
23
- const data = await post("/admin/payouts/record", formData);
24
- return { success: true, ...data };
25
- }
26
- catch (error) {
27
- return { success: false, error: error.message };
28
- }
29
- }
@@ -1,104 +0,0 @@
1
- import { Adventure, AdventureMetaData } from "../models/adventure";
2
- import { TileProps } from "../models/tile";
3
- export declare function getAdventureTiles(limit?: number, filters?: {
4
- activityType?: string;
5
- difficulty?: string;
6
- sort?: "popular" | "latest";
7
- }): Promise<{
8
- success: boolean;
9
- tiles: TileProps[];
10
- message?: string;
11
- error?: string;
12
- }>;
13
- export declare function trendingAdventureTiles(limit: number): Promise<{
14
- success: boolean;
15
- tiles: TileProps[];
16
- message?: string;
17
- error?: string;
18
- }>;
19
- export declare function adventureDetails(slug: string, options?: {
20
- edit?: boolean;
21
- }): Promise<{
22
- success: boolean;
23
- adventure: Adventure | null;
24
- message?: string;
25
- error?: string;
26
- }>;
27
- export declare function adventureMetaData(slug: string): Promise<{
28
- success: boolean;
29
- metadata: AdventureMetaData | null;
30
- message?: string;
31
- error?: string;
32
- }>;
33
- export declare function adventuresByUsername(username: string, limit?: number): Promise<{
34
- success: boolean;
35
- tiles: TileProps[];
36
- message?: string;
37
- error?: string;
38
- }>;
39
- export declare function adminAdventuresByHost(username: string): Promise<{
40
- success: boolean;
41
- adventures: Adventure[];
42
- error?: string;
43
- }>;
44
- export declare function adventuresByHost(): Promise<{
45
- success: boolean;
46
- adventures: Adventure[];
47
- message?: string;
48
- error?: string;
49
- }>;
50
- export declare function createAdventure(formData: FormData): Promise<{
51
- success: boolean;
52
- slug?: string;
53
- message?: string;
54
- error?: string;
55
- }>;
56
- export declare function editAdventure(formData: FormData, slug: string): Promise<{
57
- success: boolean;
58
- message?: string;
59
- error?: string;
60
- }>;
61
- export declare function patchAdventureStatus(slug: string, status: string): Promise<{
62
- success: boolean;
63
- error?: string;
64
- }>;
65
- export declare function deleteAdventure(slug: string): Promise<{
66
- success: boolean;
67
- message?: string;
68
- error?: string;
69
- }>;
70
- export declare function getPendingAdventures(): Promise<{
71
- success: boolean;
72
- adventures: Adventure[];
73
- message?: string;
74
- error?: string;
75
- }>;
76
- export declare function approveAdventure(slug: string): Promise<{
77
- success: boolean;
78
- message?: string;
79
- error?: string;
80
- }>;
81
- export declare function rejectAdventure(slug: string, rejectionReason: string): Promise<{
82
- success: boolean;
83
- message?: string;
84
- error?: string;
85
- }>;
86
- export declare function getAdventureBookingsAdmin(slugOrId: string): Promise<{
87
- success: boolean;
88
- bookings: any[];
89
- error?: string;
90
- }>;
91
- export declare function submitAdventureQuery(slug: string, payload: {
92
- name?: string;
93
- email?: string;
94
- phone?: string;
95
- message: string;
96
- preferredDate?: string | null;
97
- preferredTime?: string | null;
98
- numberOfPeople?: number;
99
- }): Promise<{
100
- success: boolean;
101
- message?: string;
102
- error?: string;
103
- }>;
104
- //# sourceMappingURL=adventure.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adventure.d.ts","sourceRoot":"","sources":["../../../src/lib/actions/adventure.ts"],"names":[],"mappings":"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"}