@superbright/indexeddb-orm 1.0.28 → 1.0.30

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.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./zustand-store.cjs");function u(t,i){return{property:{unit:{favorites:{toggle:t.toggleFavorite.bind(t)},viewed:{mark:t.markUnitAsViewed.bind(t)}},questionnaire:{setResults:t.setQuestionnaireResults.bind(t)},tour:{setContactedOn:t.setTourContactedOn.bind(t),getContactedOn:t.getTourContactedOn.bind(t),setContactData:t.setTourContactData.bind(t)}},filters:{set:t.setFilters.bind(t),setTemp:t.setTempFilters.bind(t),setToDefault:t.setFiltersToDefault.bind(t),commitTemp:async(e,n)=>{const c=(i?i():t).tempFilters[e]??n;await t.handleTempFilterChange(e,c),await t.submitFilterUpdate()},commitDateAvailability:async()=>{await t.submitFilterUpdate()},submit:t.submitFilterUpdate.bind(t)}}}function d(t){return(i,e)=>{const n=r.createZustandUnifiedStore(t)(i,e),a=u(n,e);return{...n,...a}}}exports.createStructuredStore=d;exports.createStructuredStoreActions=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./zustand-store.cjs");function u(t,i){return{property:{unit:{favorites:{toggle:t.toggleFavorite.bind(t),setAll:t.setFavoriteUnitIds.bind(t)},viewed:{mark:t.markUnitAsViewed.bind(t)}},questionnaire:{setResults:t.setQuestionnaireResults.bind(t)},tour:{setContactedOn:t.setTourContactedOn.bind(t),getContactedOn:t.getTourContactedOn.bind(t),setContactData:t.setTourContactData.bind(t)}},filters:{set:t.setFilters.bind(t),setTemp:t.setTempFilters.bind(t),setToDefault:t.setFiltersToDefault.bind(t),commitTemp:async(e,n)=>{const c=(i?i():t).tempFilters[e]??n;await t.handleTempFilterChange(e,c),await t.submitFilterUpdate()},commitDateAvailability:async()=>{await t.submitFilterUpdate()},submit:t.submitFilterUpdate.bind(t)}}}function r(t){return(i,e)=>{const n=d.createZustandUnifiedStore(t)(i,e),a=u(n,e);return{...n,...a}}}exports.createStructuredStore=r;exports.createStructuredStoreActions=u;
2
2
  //# sourceMappingURL=structured-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-store.cjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitDateAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitDateAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":"uHAiDO,SAASA,EAA6BC,EAAiCC,EAA8D,CAC1I,MAAO,CACL,SAAU,CACR,KAAM,CACJ,UAAW,CACT,OAAQD,EAAM,eAAe,KAAKA,CAAK,CAAA,EAEzC,OAAQ,CACN,KAAMA,EAAM,iBAAiB,KAAKA,CAAK,CAAA,CACzC,EAEF,cAAe,CACb,WAAYA,EAAM,wBAAwB,KAAKA,CAAK,CAAA,EAEtD,KAAM,CACJ,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CACrD,EAEF,QAAS,CACP,IAAKA,EAAM,WAAW,KAAKA,CAAK,EAChC,QAASA,EAAM,eAAe,KAAKA,CAAK,EACxC,aAAcA,EAAM,oBAAoB,KAAKA,CAAK,EAClD,WAAY,MAAOE,EAAKC,IAAiB,CAEvC,MAAMC,GADQH,EAAMA,EAAA,EAASD,GACR,YAAwBE,CAAG,GAAKC,EACrD,MAAMH,EAAM,uBAAuBE,EAAKE,CAAY,EACpD,MAAMJ,EAAM,mBAAA,CACd,EACA,uBAAwB,SAAY,CAClC,MAAMA,EAAM,mBAAA,CACd,EACA,OAAQA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CAC7C,CAEJ,CAIO,SAASK,EAAsBC,EAEnC,CACD,MAAO,CAACC,EAAUN,IAA8B,CAC9C,MAAMO,EAAYC,EAAAA,0BAA0BH,CAAO,EAAEC,EAAKN,CAAG,EACvDS,EAAUX,EAA6BS,EAAWP,CAAG,EAE3D,MAAO,CACL,GAAGO,EACH,GAAGE,CAAA,CAEP,CACF"}
1
+ {"version":3,"file":"structured-store.cjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n setAll: (unitIds: string[]) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitDateAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n setAll: store.setFavoriteUnitIds.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitDateAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":"uHAkDO,SAASA,EAA6BC,EAAiCC,EAA8D,CAC1I,MAAO,CACL,SAAU,CACR,KAAM,CACJ,UAAW,CACT,OAAQD,EAAM,eAAe,KAAKA,CAAK,EACvC,OAAQA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,EAE7C,OAAQ,CACN,KAAMA,EAAM,iBAAiB,KAAKA,CAAK,CAAA,CACzC,EAEF,cAAe,CACb,WAAYA,EAAM,wBAAwB,KAAKA,CAAK,CAAA,EAEtD,KAAM,CACJ,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,EACnD,eAAgBA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CACrD,EAEF,QAAS,CACP,IAAKA,EAAM,WAAW,KAAKA,CAAK,EAChC,QAASA,EAAM,eAAe,KAAKA,CAAK,EACxC,aAAcA,EAAM,oBAAoB,KAAKA,CAAK,EAClD,WAAY,MAAOE,EAAKC,IAAiB,CAEvC,MAAMC,GADQH,EAAMA,EAAA,EAASD,GACR,YAAwBE,CAAG,GAAKC,EACrD,MAAMH,EAAM,uBAAuBE,EAAKE,CAAY,EACpD,MAAMJ,EAAM,mBAAA,CACd,EACA,uBAAwB,SAAY,CAClC,MAAMA,EAAM,mBAAA,CACd,EACA,OAAQA,EAAM,mBAAmB,KAAKA,CAAK,CAAA,CAC7C,CAEJ,CAIO,SAASK,EAAsBC,EAEnC,CACD,MAAO,CAACC,EAAUN,IAA8B,CAC9C,MAAMO,EAAYC,EAAAA,0BAA0BH,CAAO,EAAEC,EAAKN,CAAG,EACvDS,EAAUX,EAA6BS,EAAWP,CAAG,EAE3D,MAAO,CACL,GAAGO,EACH,GAAGE,CAAA,CAEP,CACF"}
@@ -14,6 +14,7 @@ export interface StructuredStoreActions {
14
14
  unit: {
15
15
  favorites: {
16
16
  toggle: (unitId: string) => Promise<void>;
17
+ setAll: (unitIds: string[]) => Promise<void>;
17
18
  };
18
19
  viewed: {
19
20
  mark: (unitId: string, slug: string) => Promise<void>;
@@ -1,10 +1,11 @@
1
- import { createZustandUnifiedStore as d } from "./zustand-store.mjs";
1
+ import { createZustandUnifiedStore as u } from "./zustand-store.mjs";
2
2
  function c(t, i) {
3
3
  return {
4
4
  property: {
5
5
  unit: {
6
6
  favorites: {
7
- toggle: t.toggleFavorite.bind(t)
7
+ toggle: t.toggleFavorite.bind(t),
8
+ setAll: t.setFavoriteUnitIds.bind(t)
8
9
  },
9
10
  viewed: {
10
11
  mark: t.markUnitAsViewed.bind(t)
@@ -24,8 +25,8 @@ function c(t, i) {
24
25
  setTemp: t.setTempFilters.bind(t),
25
26
  setToDefault: t.setFiltersToDefault.bind(t),
26
27
  commitTemp: async (e, n) => {
27
- const u = (i ? i() : t).tempFilters[e] ?? n;
28
- await t.handleTempFilterChange(e, u), await t.submitFilterUpdate();
28
+ const d = (i ? i() : t).tempFilters[e] ?? n;
29
+ await t.handleTempFilterChange(e, d), await t.submitFilterUpdate();
29
30
  },
30
31
  commitDateAvailability: async () => {
31
32
  await t.submitFilterUpdate();
@@ -34,9 +35,9 @@ function c(t, i) {
34
35
  }
35
36
  };
36
37
  }
37
- function r(t) {
38
+ function s(t) {
38
39
  return (i, e) => {
39
- const n = d(t)(i, e), a = c(n, e);
40
+ const n = u(t)(i, e), a = c(n, e);
40
41
  return {
41
42
  ...n,
42
43
  ...a
@@ -44,7 +45,7 @@ function r(t) {
44
45
  };
45
46
  }
46
47
  export {
47
- r as createStructuredStore,
48
+ s as createStructuredStore,
48
49
  c as createStructuredStoreActions
49
50
  };
50
51
  //# sourceMappingURL=structured-store.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"structured-store.mjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitDateAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitDateAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":";AAiDO,SAASA,EAA6BC,GAAiCC,GAA8D;AAC1I,SAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,WAAW;AAAA,UACT,QAAQD,EAAM,eAAe,KAAKA,CAAK;AAAA,QAAA;AAAA,QAEzC,QAAQ;AAAA,UACN,MAAMA,EAAM,iBAAiB,KAAKA,CAAK;AAAA,QAAA;AAAA,MACzC;AAAA,MAEF,eAAe;AAAA,QACb,YAAYA,EAAM,wBAAwB,KAAKA,CAAK;AAAA,MAAA;AAAA,MAEtD,MAAM;AAAA,QACJ,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,MAAA;AAAA,IACrD;AAAA,IAEF,SAAS;AAAA,MACP,KAAKA,EAAM,WAAW,KAAKA,CAAK;AAAA,MAChC,SAASA,EAAM,eAAe,KAAKA,CAAK;AAAA,MACxC,cAAcA,EAAM,oBAAoB,KAAKA,CAAK;AAAA,MAClD,YAAY,OAAOE,GAAKC,MAAiB;AAEvC,cAAMC,KADQH,IAAMA,EAAA,IAASD,GACR,YAAwBE,CAAG,KAAKC;AACrD,cAAMH,EAAM,uBAAuBE,GAAKE,CAAY,GACpD,MAAMJ,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,wBAAwB,YAAY;AAClC,cAAMA,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,QAAQA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,IAAA;AAAA,EAC7C;AAEJ;AAIO,SAASK,EAAsBC,GAEnC;AACD,SAAO,CAACC,GAAUN,MAA8B;AAC9C,UAAMO,IAAYC,EAA0BH,CAAO,EAAEC,GAAKN,CAAG,GACvDS,IAAUX,EAA6BS,GAAWP,CAAG;AAE3D,WAAO;AAAA,MACL,GAAGO;AAAA,MACH,GAAGE;AAAA,IAAA;AAAA,EAEP;AACF;"}
1
+ {"version":3,"file":"structured-store.mjs","sources":["../../src/adapters/structured-store.ts"],"sourcesContent":["/**\n * Structured store wrapper (preferred DX)\n *\n * This layer wraps the flat Zustand adapter with domain‑grouped actions\n * for a more discoverable API in apps. It does not add new behavior —\n * it simply organizes calls like:\n * - `property.unit.favorites.toggle` → `toggleFavorite`\n * - `property.unit.viewed.mark` → `markUnitAsViewed`\n * - `filters.set/submit/...` → filter methods\n */\nimport {\n type ZustandUnifiedStoreState,\n createZustandUnifiedStore,\n type Filters,\n type UnitData,\n type TourContactData,\n type QueryParams\n} from \"./zustand-store\";\n\nexport interface StructuredStoreActions {\n property: {\n unit: {\n favorites: {\n toggle: (unitId: string) => Promise<void>;\n setAll: (unitIds: string[]) => Promise<void>;\n };\n viewed: {\n mark: (unitId: string, slug: string) => Promise<void>;\n };\n };\n questionnaire: {\n setResults: (results: unknown) => Promise<void>;\n };\n tour: {\n setContactedOn: () => Promise<void>;\n getContactedOn: () => Promise<string | null>;\n setContactData: (data: TourContactData) => Promise<void>;\n };\n };\n\n filters: {\n set: (filters: Partial<Filters>) => Promise<void>;\n setTemp: (filters: Partial<Filters>) => Promise<void>;\n setToDefault: () => Promise<void>;\n commitTemp: <K extends keyof Filters>(key: K, defaultValue: Filters[K]) => Promise<void>;\n commitDateAvailability: () => Promise<void>;\n submit: () => Promise<void>;\n };\n}\n\nexport function createStructuredStoreActions(store: ZustandUnifiedStoreState, get?: () => ZustandUnifiedStoreState): StructuredStoreActions {\n return {\n property: {\n unit: {\n favorites: {\n toggle: store.toggleFavorite.bind(store),\n setAll: store.setFavoriteUnitIds.bind(store),\n },\n viewed: {\n mark: store.markUnitAsViewed.bind(store),\n },\n },\n questionnaire: {\n setResults: store.setQuestionnaireResults.bind(store),\n },\n tour: {\n setContactedOn: store.setTourContactedOn.bind(store),\n getContactedOn: store.getTourContactedOn.bind(store),\n setContactData: store.setTourContactData.bind(store),\n },\n },\n filters: {\n set: store.setFilters.bind(store),\n setTemp: store.setTempFilters.bind(store),\n setToDefault: store.setFiltersToDefault.bind(store),\n commitTemp: async (key, defaultValue) => {\n const state = get ? get() : (store as unknown as ZustandUnifiedStoreState);\n const value = (state.tempFilters as Filters)[key] ?? defaultValue;\n await store.handleTempFilterChange(key, value as any);\n await store.submitFilterUpdate();\n },\n commitDateAvailability: async () => {\n await store.submitFilterUpdate();\n },\n submit: store.submitFilterUpdate.bind(store),\n },\n };\n}\n\nexport type StructuredStore = ZustandUnifiedStoreState & StructuredStoreActions;\n\nexport function createStructuredStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): StructuredStore => {\n const baseStore = createZustandUnifiedStore(options)(set, get);\n const actions = createStructuredStoreActions(baseStore, get);\n\n return {\n ...baseStore,\n ...actions,\n };\n };\n}\n"],"names":["createStructuredStoreActions","store","get","key","defaultValue","value","createStructuredStore","options","set","baseStore","createZustandUnifiedStore","actions"],"mappings":";AAkDO,SAASA,EAA6BC,GAAiCC,GAA8D;AAC1I,SAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,WAAW;AAAA,UACT,QAAQD,EAAM,eAAe,KAAKA,CAAK;AAAA,UACvC,QAAQA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QAAA;AAAA,QAE7C,QAAQ;AAAA,UACN,MAAMA,EAAM,iBAAiB,KAAKA,CAAK;AAAA,QAAA;AAAA,MACzC;AAAA,MAEF,eAAe;AAAA,QACb,YAAYA,EAAM,wBAAwB,KAAKA,CAAK;AAAA,MAAA;AAAA,MAEtD,MAAM;AAAA,QACJ,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,QACnD,gBAAgBA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,MAAA;AAAA,IACrD;AAAA,IAEF,SAAS;AAAA,MACP,KAAKA,EAAM,WAAW,KAAKA,CAAK;AAAA,MAChC,SAASA,EAAM,eAAe,KAAKA,CAAK;AAAA,MACxC,cAAcA,EAAM,oBAAoB,KAAKA,CAAK;AAAA,MAClD,YAAY,OAAOE,GAAKC,MAAiB;AAEvC,cAAMC,KADQH,IAAMA,EAAA,IAASD,GACR,YAAwBE,CAAG,KAAKC;AACrD,cAAMH,EAAM,uBAAuBE,GAAKE,CAAY,GACpD,MAAMJ,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,wBAAwB,YAAY;AAClC,cAAMA,EAAM,mBAAA;AAAA,MACd;AAAA,MACA,QAAQA,EAAM,mBAAmB,KAAKA,CAAK;AAAA,IAAA;AAAA,EAC7C;AAEJ;AAIO,SAASK,EAAsBC,GAEnC;AACD,SAAO,CAACC,GAAUN,MAA8B;AAC9C,UAAMO,IAAYC,EAA0BH,CAAO,EAAEC,GAAKN,CAAG,GACvDS,IAAUX,EAA6BS,GAAWP,CAAG;AAE3D,WAAO;AAAA,MACL,GAAGO;AAAA,MACH,GAAGE;AAAA,IAAA;AAAA,EAEP;AACF;"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../stores/store.cjs");function d(n){return(a,o)=>{const s=async()=>{const t=await e.store.getFullState();a({properties:t.properties,currentPropertyId:t.currentPropertyId,currentPropertySlug:t.currentPropertySlug,hasPreviouslySearched:t.hasPreviouslySearched,unitResults:t.unitResults,filters:t.filters,tempFilters:t.tempFilters,apiFilters:t.apiFilters,resultsMode:t.resultsMode,resolvedQuestionnaireValues:t.resolvedQuestionnaireValues,sortBy:t.sortBy})},u=async()=>{if(n!=null&&n.onFilterUpdate){const t=(await e.store.getFullState()).apiFilters;n.onFilterUpdate(t)}};return{properties:{},currentPropertyId:null,currentPropertySlug:null,hasPreviouslySearched:[],unitResults:[],filters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0},tempFilters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0},apiFilters:{limit:10,page:1,sortBy:"relevance"},resultsMode:"all",resolvedQuestionnaireValues:{},sortBy:"relevance",filtersLoaded:!1,async initializeProperty(t,r){await e.store.initializeProperty(t,r),await s()},async setCurrentProperty(t,r){await e.store.setCurrentProperty(t,r),a({currentPropertyId:t,...r&&{currentPropertySlug:r}})},async setCurrentPropertySlug(t){await e.store.setCurrentPropertySlug(t),a({currentPropertySlug:t})},async setHasPreviouslySearched(t){await e.store.setHasPreviouslySearched(t),await s()},async toggleFavorite(t){await e.store.toggleFavorite(t),await s()},async markUnitAsViewed(t,r){await e.store.markUnitAsViewed(t,r),await s()},async setTourContactedOn(){await e.store.setTourContactedOn(),await s()},getTourContactedOn:e.store.getTourContactedOn.bind(e.store),async setQuestionnaireResults(t){await e.store.setQuestionnaireResults(t),await s()},async setTourContactData(t){await e.store.setTourContactData(t),await s()},async setUnitResults(t){await e.store.setUnitResults(t),await s()},async clearUnitResults(){await e.store.clearUnitResults(),await s()},async setFilters(t){await e.store.setFilters(t);const r=o();a({filters:{...r.filters,...t}})},async setTempFilters(t){await e.store.setTempFilters(t);const r=o();a({tempFilters:{...r.tempFilters,...t}})},async setFiltersToDefault(){await e.store.setFiltersToDefault(),a({filters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0}})},async setApiFilters(t){await e.store.setApiFilters(t);const r=o();a({apiFilters:{...r.apiFilters,...t}})},async handleTempFilterChange(t,r){await e.store.handleTempFilterChange(t,r);const i=o();a({tempFilters:{...i.tempFilters,[t]:r}})},async submitFilterUpdate(){await e.store.submitFilterUpdate(),await s(),await u()},async setResultsMode(t){await e.store.setResultsMode(t),a({resultsMode:t})},async setSortBy(t){await e.store.setSortBy(t),a({sortBy:t})},async setResolvedQuestionnaireValues(t,r){await e.store.setResolvedQuestionnaireValues(t,r);const i=o();a({resolvedQuestionnaireValues:{...i.resolvedQuestionnaireValues,[t]:r}})},getUnitState(t){var l;const r=o(),i=r.currentPropertyId?r.properties[r.currentPropertyId]:null;return{isFavorite:(i==null?void 0:i.favoritedUnits.includes(t))??!1,viewedDate:((l=i==null?void 0:i.viewedUnits.find(c=>c.unitId===t))==null?void 0:l.viewedDate)??""}},getResultsUrl:e.store.getResultsUrl.bind(e.store),getCurrentProperty:e.store.getCurrentProperty.bind(e.store),getPropertyData:e.store.getPropertyData.bind(e.store),async _hydrate(){await s()},async _initialize(){await e.store.initialize(),await s(),a({filtersLoaded:!0})}}}}function y(){return n=>a=>n(o=>o.getUnitState(a))}exports.createUseUnitState=y;exports.createZustandUnifiedStore=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../stores/store.cjs");function c(n){return(a,o)=>{const s=async()=>{const t=await e.store.getFullState();a({properties:t.properties,currentPropertyId:t.currentPropertyId,currentPropertySlug:t.currentPropertySlug,hasPreviouslySearched:t.hasPreviouslySearched,unitResults:t.unitResults,filters:t.filters,tempFilters:t.tempFilters,apiFilters:t.apiFilters,resultsMode:t.resultsMode,resolvedQuestionnaireValues:t.resolvedQuestionnaireValues,sortBy:t.sortBy})},u=async()=>{if(n!=null&&n.onFilterUpdate){const t=(await e.store.getFullState()).apiFilters;n.onFilterUpdate(t)}};return{properties:{},currentPropertyId:null,currentPropertySlug:null,hasPreviouslySearched:[],unitResults:[],filters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0},tempFilters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0},apiFilters:{limit:10,page:1,sortBy:"relevance"},resultsMode:"all",resolvedQuestionnaireValues:{},sortBy:"relevance",filtersLoaded:!1,async initializeProperty(t,r){await e.store.initializeProperty(t,r),await s()},async setCurrentProperty(t,r){await e.store.setCurrentProperty(t,r),a({currentPropertyId:t,...r&&{currentPropertySlug:r}})},async setCurrentPropertySlug(t){await e.store.setCurrentPropertySlug(t),a({currentPropertySlug:t})},async setHasPreviouslySearched(t){await e.store.setHasPreviouslySearched(t),await s()},async setFavoriteUnitIds(t){await e.store.setFavoriteUnitIds(t),await s()},async toggleFavorite(t){await e.store.toggleFavorite(t),await s()},async markUnitAsViewed(t,r){await e.store.markUnitAsViewed(t,r),await s()},async setTourContactedOn(){await e.store.setTourContactedOn(),await s()},getTourContactedOn:e.store.getTourContactedOn.bind(e.store),async setQuestionnaireResults(t){await e.store.setQuestionnaireResults(t),await s()},async setTourContactData(t){await e.store.setTourContactData(t),await s()},async setUnitResults(t){await e.store.setUnitResults(t),await s()},async clearUnitResults(){await e.store.clearUnitResults(),await s()},async setFilters(t){await e.store.setFilters(t);const r=o();a({filters:{...r.filters,...t}})},async setTempFilters(t){await e.store.setTempFilters(t);const r=o();a({tempFilters:{...r.tempFilters,...t}})},async setFiltersToDefault(){await e.store.setFiltersToDefault(),a({filters:{date_availability:void 0,qty_bedrooms:void 0,base_price:void 0,highlights:void 0}})},async setApiFilters(t){await e.store.setApiFilters(t);const r=o();a({apiFilters:{...r.apiFilters,...t}})},async handleTempFilterChange(t,r){await e.store.handleTempFilterChange(t,r);const i=o();a({tempFilters:{...i.tempFilters,[t]:r}})},async submitFilterUpdate(){await e.store.submitFilterUpdate(),await s(),await u()},async setResultsMode(t){await e.store.setResultsMode(t),a({resultsMode:t})},async setSortBy(t){await e.store.setSortBy(t),a({sortBy:t})},async setResolvedQuestionnaireValues(t,r){await e.store.setResolvedQuestionnaireValues(t,r);const i=o();a({resolvedQuestionnaireValues:{...i.resolvedQuestionnaireValues,[t]:r}})},getUnitState(t){var l;const r=o(),i=r.currentPropertyId?r.properties[r.currentPropertyId]:null;return{isFavorite:(i==null?void 0:i.favoritedUnits.includes(t))??!1,viewedDate:((l=i==null?void 0:i.viewedUnits.find(d=>d.unitId===t))==null?void 0:l.viewedDate)??""}},getResultsUrl:e.store.getResultsUrl.bind(e.store),getCurrentProperty:e.store.getCurrentProperty.bind(e.store),getPropertyData:e.store.getPropertyData.bind(e.store),async _hydrate(){await s()},async _initialize(){await e.store.initialize(),await s(),a({filtersLoaded:!0})}}}}function y(){return n=>a=>n(o=>o.getUnitState(a))}exports.createUseUnitState=y;exports.createZustandUnifiedStore=c;
2
2
  //# sourceMappingURL=zustand-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"zustand-store.cjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n tempFilters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n sortBy: \"relevance\",\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"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"}
1
+ {"version":3,"file":"zustand-store.cjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n setFavoriteUnitIds: (unitIds: string[]) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n tempFilters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n sortBy: \"relevance\",\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async setFavoriteUnitIds(unitIds) {\n await store.setFavoriteUnitIds(unitIds);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitIds","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"uHAgFO,SAASA,EAA0BC,EAEvC,CACD,MAAO,CAACC,EAAUC,IAAuC,CAEvD,MAAMC,EAAY,SAAY,CAC5B,MAAMC,EAAW,MAAMC,EAAAA,MAAM,aAAA,EAC7BJ,EAAI,CACF,WAAYG,EAAS,WACrB,kBAAmBA,EAAS,kBAC5B,oBAAqBA,EAAS,oBAC9B,sBAAuBA,EAAS,sBAChC,YAAaA,EAAS,YACtB,QAASA,EAAS,QAClB,YAAaA,EAAS,YACtB,WAAYA,EAAS,WACrB,YAAaA,EAAS,YACtB,4BAA6BA,EAAS,4BACtC,OAAQA,EAAS,MAAA,CAClB,CACH,EAGME,EAAqB,SAAY,CACrC,GAAIN,GAAA,MAAAA,EAAS,eAAgB,CAC3B,MAAMO,GAAc,MAAMF,QAAM,aAAA,GAAgB,WAChDL,EAAQ,eAAeO,CAAU,CACnC,CACF,EAEA,MAAO,CAEL,WAAY,CAAA,EACZ,kBAAmB,KACnB,oBAAqB,KACrB,sBAAuB,CAAA,EACvB,YAAa,CAAA,EACb,QAAS,CACP,kBAAmB,OACnB,aAAc,OACd,WAAY,OACZ,WAAY,MAAA,EAEd,YAAa,CACX,kBAAmB,OACnB,aAAc,OACd,WAAY,OACZ,WAAY,MAAA,EAEd,WAAY,CACV,MAAO,GACP,KAAM,EACN,OAAQ,WAAA,EAEV,YAAa,MACb,4BAA6B,CAAA,EAC7B,OAAQ,YACR,cAAe,GAGf,MAAM,mBAAmBC,EAAYC,EAAM,CACzC,MAAMJ,QAAM,mBAAmBG,EAAYC,CAAI,EAC/C,MAAMN,EAAA,CACR,EAEA,MAAM,mBAAmBK,EAAYC,EAAM,CACzC,MAAMJ,QAAM,mBAAmBG,EAAYC,CAAI,EAC/CR,EAAI,CACF,kBAAmBO,EACnB,GAAIC,GAAQ,CAAE,oBAAqBA,CAAA,CAAK,CACzC,CACH,EAEA,MAAM,uBAAuBA,EAAM,CACjC,MAAMJ,EAAAA,MAAM,uBAAuBI,CAAI,EACvCR,EAAI,CAAE,oBAAqBQ,EAAM,CACnC,EAEA,MAAM,yBAAyBA,EAAM,CACnC,MAAMJ,EAAAA,MAAM,yBAAyBI,CAAI,EACzC,MAAMN,EAAA,CACR,EAEA,MAAM,mBAAmBO,EAAS,CAChC,MAAML,EAAAA,MAAM,mBAAmBK,CAAO,EACtC,MAAMP,EAAA,CACR,EAEA,MAAM,eAAeQ,EAAQ,CAC3B,MAAMN,EAAAA,MAAM,eAAeM,CAAM,EACjC,MAAMR,EAAA,CACR,EAEA,MAAM,iBAAiBQ,EAAQF,EAAM,CACnC,MAAMJ,QAAM,iBAAiBM,EAAQF,CAAI,EACzC,MAAMN,EAAA,CACR,EAEA,MAAM,oBAAqB,CACzB,MAAME,EAAAA,MAAM,mBAAA,EACZ,MAAMF,EAAA,CACR,EAEA,mBAAoBE,EAAAA,MAAM,mBAAmB,KAAKA,EAAAA,KAAK,EAEvD,MAAM,wBAAwBO,EAAS,CACrC,MAAMP,EAAAA,MAAM,wBAAwBO,CAAO,EAC3C,MAAMT,EAAA,CACR,EAEA,MAAM,mBAAmBU,EAAM,CAC7B,MAAMR,EAAAA,MAAM,mBAAmBQ,CAAI,EACnC,MAAMV,EAAA,CACR,EAEA,MAAM,eAAeW,EAAO,CAC1B,MAAMT,EAAAA,MAAM,eAAeS,CAAK,EAChC,MAAMX,EAAA,CACR,EAEA,MAAM,kBAAmB,CACvB,MAAME,EAAAA,MAAM,iBAAA,EACZ,MAAMF,EAAA,CACR,EAIA,MAAM,WAAWY,EAAS,CACxB,MAAMV,EAAAA,MAAM,WAAWU,CAAO,EAC9B,MAAMC,EAAQd,EAAA,EACdD,EAAI,CAAE,QAAS,CAAE,GAAGe,EAAM,QAAS,GAAGD,CAAA,EAAW,CACnD,EAEA,MAAM,eAAeA,EAAS,CAC5B,MAAMV,EAAAA,MAAM,eAAeU,CAAO,EAClC,MAAMC,EAAQd,EAAA,EACdD,EAAI,CAAE,YAAa,CAAE,GAAGe,EAAM,YAAa,GAAGD,CAAA,EAAW,CAC3D,EAEA,MAAM,qBAAsB,CAC1B,MAAMV,EAAAA,MAAM,oBAAA,EAOZJ,EAAI,CAAE,QANiB,CACrB,kBAAmB,OACnB,aAAc,OACd,WAAY,OACZ,WAAY,MAAA,EAEiB,CACjC,EAEA,MAAM,cAAcc,EAAS,CAC3B,MAAMV,EAAAA,MAAM,cAAcU,CAAO,EACjC,MAAMC,EAAQd,EAAA,EACdD,EAAI,CAAE,WAAY,CAAE,GAAGe,EAAM,WAAY,GAAGD,CAAA,EAAW,CACzD,EAEA,MAAM,uBAAuBE,EAAKC,EAAO,CACvC,MAAMb,QAAM,uBAAuBY,EAAKC,CAAK,EAC7C,MAAMF,EAAQd,EAAA,EACdD,EAAI,CAAE,YAAa,CAAE,GAAGe,EAAM,YAAa,CAACC,CAAG,EAAGC,CAAA,EAAS,CAC7D,EAEA,MAAM,oBAAqB,CACzB,MAAMb,EAAAA,MAAM,mBAAA,EACZ,MAAMF,EAAA,EACN,MAAMG,EAAA,CACR,EAGA,MAAM,eAAea,EAAM,CACzB,MAAMd,EAAAA,MAAM,eAAec,CAAI,EAC/BlB,EAAI,CAAE,YAAakB,EAAM,CAC3B,EAEA,MAAM,UAAUC,EAAQ,CACtB,MAAMf,EAAAA,MAAM,UAAUe,CAAM,EAC5BnB,EAAI,CAAE,OAAAmB,EAAQ,CAChB,EAGA,MAAM,+BAA+BC,EAAMC,EAAQ,CACjD,MAAMjB,QAAM,+BAA+BgB,EAAMC,CAAM,EACvD,MAAMN,EAAQd,EAAA,EACdD,EAAI,CACF,4BAA6B,CAC3B,GAAGe,EAAM,4BACT,CAACK,CAAI,EAAGC,CAAA,CACV,CACD,CACH,EAGA,aAAaX,EAAgB,OAC3B,MAAMK,EAAQd,EAAA,EACRqB,EAAWP,EAAM,kBAAoBA,EAAM,WAAWA,EAAM,iBAAiB,EAAI,KAEvF,MAAO,CACL,YAAYO,GAAA,YAAAA,EAAU,eAAe,SAASZ,KAAW,GACzD,aACEa,EAAAD,GAAA,YAAAA,EAAU,YAAY,KAAME,GAAWA,EAAE,SAAWd,KAApD,YAAAa,EAA6D,aAAc,EAAA,CAEjF,EAEA,cAAenB,EAAAA,MAAM,cAAc,KAAKA,EAAAA,KAAK,EAC7C,mBAAoBA,EAAAA,MAAM,mBAAmB,KAAKA,EAAAA,KAAK,EACvD,gBAAiBA,EAAAA,MAAM,gBAAgB,KAAKA,EAAAA,KAAK,EAGjD,MAAM,UAAW,CACf,MAAMF,EAAA,CACR,EAEA,MAAM,aAAc,CAClB,MAAME,EAAAA,MAAM,WAAA,EACZ,MAAMF,EAAA,EACNF,EAAI,CAAE,cAAe,GAAM,CAC7B,CAAA,CAEJ,CACF,CAGO,SAASyB,GAAqB,CACnC,OAAQC,GAAmBhB,GACzBgB,EAAUX,GAAoCA,EAAM,aAAaL,CAAM,CAAC,CAC5E"}
@@ -16,6 +16,7 @@ export interface ZustandUnifiedStoreState {
16
16
  setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;
17
17
  setCurrentPropertySlug: (slug: string) => Promise<void>;
18
18
  setHasPreviouslySearched: (slug: string) => Promise<void>;
19
+ setFavoriteUnitIds: (unitIds: string[]) => Promise<void>;
19
20
  toggleFavorite: (unitId: string) => Promise<void>;
20
21
  markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;
21
22
  setTourContactedOn: () => Promise<void>;
@@ -66,6 +66,9 @@ function y(l) {
66
66
  async setHasPreviouslySearched(t) {
67
67
  await e.setHasPreviouslySearched(t), await r();
68
68
  },
69
+ async setFavoriteUnitIds(t) {
70
+ await e.setFavoriteUnitIds(t), await r();
71
+ },
69
72
  async toggleFavorite(t) {
70
73
  await e.toggleFavorite(t), await r();
71
74
  },
@@ -1 +1 @@
1
- {"version":3,"file":"zustand-store.mjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n tempFilters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n sortBy: \"relevance\",\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"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"}
1
+ {"version":3,"file":"zustand-store.mjs","sources":["../../src/adapters/zustand-store.ts"],"sourcesContent":["/**\n * Zustand adapter (flat API)\n *\n * This file exposes a flat, unified Zustand store that mirrors the underlying\n * ORM store and keeps React state in sync. It is the low-level bridge.\n *\n * For a friendlier, domain-grouped API, use `createStructuredStore` from\n * `./structured-store`, which wraps this adapter and exposes nested actions\n * like `property.unit.favorites.toggle`, `filters.set`, etc.\n */\nimport { store } from \"../stores/store\";\nimport type { UnifiedStoreData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Unified Zustand store interface\nexport interface ZustandUnifiedStoreState {\n // Property data\n properties: Record<string, UserPropertyState>;\n currentPropertyId: string | null;\n currentPropertySlug: string | null;\n hasPreviouslySearched: string[];\n\n // App data\n unitResults: Unit[];\n filters: Filters;\n tempFilters: Filters;\n apiFilters: QueryParams;\n resultsMode: ResultsMode;\n resolvedQuestionnaireValues: Record<string, string[]>;\n sortBy: SortBy;\n filtersLoaded: boolean;\n\n // === PROPERTY OPERATIONS ===\n initializeProperty: (propertyId: string, slug: string) => Promise<void>;\n setCurrentProperty: (propertyId: string, slug?: string) => Promise<void>;\n setCurrentPropertySlug: (slug: string) => Promise<void>;\n setHasPreviouslySearched: (slug: string) => Promise<void>;\n setFavoriteUnitIds: (unitIds: string[]) => Promise<void>;\n toggleFavorite: (unitId: string) => Promise<void>;\n markUnitAsViewed: (unitId: string, slug: string) => Promise<void>;\n setTourContactedOn: () => Promise<void>;\n getTourContactedOn: () => Promise<string | null>;\n setQuestionnaireResults: (results: unknown) => Promise<void>;\n setTourContactData: (data: TourContactData) => Promise<void>;\n setUnitResults: (units: unknown) => Promise<void>;\n clearUnitResults: () => Promise<void>;\n\n\n // === FILTER OPERATIONS ===\n setFilters: (filters: Partial<Filters>) => Promise<void>;\n setTempFilters: (filters: Partial<Filters>) => Promise<void>;\n setFiltersToDefault: () => Promise<void>;\n setApiFilters: (filters: Partial<QueryParams>) => Promise<void>;\n handleTempFilterChange: <K extends keyof Filters>(key: K, value: Filters[K]) => Promise<void>;\n submitFilterUpdate: () => Promise<void>;\n\n // === RESULTS AND SORTING ===\n setResultsMode: (mode: ResultsMode) => Promise<void>;\n setSortBy: (sortBy: SortBy) => Promise<void>;\n\n // === QUESTIONNAIRE ===\n setResolvedQuestionnaireValues: (name: string, values: string[]) => Promise<void>;\n\n // === UTILITY METHODS ===\n getUnitState: (unitId: string) => {\n isFavorite: boolean;\n viewedDate: string;\n };\n getResultsUrl: () => Promise<string | null>;\n getCurrentProperty: () => Promise<UserPropertyState | null>;\n getPropertyData: (propertyId?: string) => Promise<UserPropertyState | null>;\n\n // === INTERNAL ===\n _hydrate: () => Promise<void>;\n _initialize: () => Promise<void>;\n}\n\n/**\n * @deprecated For new apps, use `createStructuredStore` from `./structured-store`.\n * This flat adapter remains for migration/advanced cases.\n */\nexport function createZustandUnifiedStore(options?: {\n onFilterUpdate?: (apiParams: QueryParams) => void;\n}) {\n return (set: any, get: any): ZustandUnifiedStoreState => {\n // Helper to update local state after ORM operations\n const syncState = async () => {\n const ormState = await store.getFullState();\n set({\n properties: ormState.properties,\n currentPropertyId: ormState.currentPropertyId,\n currentPropertySlug: ormState.currentPropertySlug,\n hasPreviouslySearched: ormState.hasPreviouslySearched,\n unitResults: ormState.unitResults,\n filters: ormState.filters,\n tempFilters: ormState.tempFilters,\n apiFilters: ormState.apiFilters,\n resultsMode: ormState.resultsMode,\n resolvedQuestionnaireValues: ormState.resolvedQuestionnaireValues,\n sortBy: ormState.sortBy,\n });\n };\n\n // Helper to notify of filter updates\n const notifyFilterUpdate = async () => {\n if (options?.onFilterUpdate) {\n const apiFilters = (await store.getFullState()).apiFilters;\n options.onFilterUpdate(apiFilters);\n }\n };\n\n return {\n // Initial state\n properties: {},\n currentPropertyId: null,\n currentPropertySlug: null,\n hasPreviouslySearched: [],\n unitResults: [],\n filters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n tempFilters: {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n },\n apiFilters: {\n limit: 10,\n page: 1,\n sortBy: \"relevance\",\n },\n resultsMode: \"all\",\n resolvedQuestionnaireValues: {},\n sortBy: \"relevance\",\n filtersLoaded: false,\n\n // === PROPERTY OPERATIONS ===\n async initializeProperty(propertyId, slug) {\n await store.initializeProperty(propertyId, slug);\n await syncState();\n },\n\n async setCurrentProperty(propertyId, slug) {\n await store.setCurrentProperty(propertyId, slug);\n set({\n currentPropertyId: propertyId,\n ...(slug && { currentPropertySlug: slug })\n });\n },\n\n async setCurrentPropertySlug(slug) {\n await store.setCurrentPropertySlug(slug);\n set({ currentPropertySlug: slug });\n },\n\n async setHasPreviouslySearched(slug) {\n await store.setHasPreviouslySearched(slug);\n await syncState();\n },\n\n async setFavoriteUnitIds(unitIds) {\n await store.setFavoriteUnitIds(unitIds);\n await syncState();\n },\n\n async toggleFavorite(unitId) {\n await store.toggleFavorite(unitId);\n await syncState();\n },\n\n async markUnitAsViewed(unitId, slug) {\n await store.markUnitAsViewed(unitId, slug);\n await syncState();\n },\n\n async setTourContactedOn() {\n await store.setTourContactedOn();\n await syncState();\n },\n\n getTourContactedOn: store.getTourContactedOn.bind(store),\n\n async setQuestionnaireResults(results) {\n await store.setQuestionnaireResults(results);\n await syncState();\n },\n\n async setTourContactData(data) {\n await store.setTourContactData(data);\n await syncState();\n },\n\n async setUnitResults(units) {\n await store.setUnitResults(units);\n await syncState();\n },\n\n async clearUnitResults() {\n await store.clearUnitResults();\n await syncState();\n },\n\n\n // === FILTER OPERATIONS ===\n async setFilters(filters) {\n await store.setFilters(filters);\n const state = get();\n set({ filters: { ...state.filters, ...filters } });\n },\n\n async setTempFilters(filters) {\n await store.setTempFilters(filters);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, ...filters } });\n },\n\n async setFiltersToDefault() {\n await store.setFiltersToDefault();\n const defaultFilters = {\n date_availability: undefined,\n qty_bedrooms: undefined,\n base_price: undefined,\n highlights: undefined,\n };\n set({ filters: defaultFilters });\n },\n\n async setApiFilters(filters) {\n await store.setApiFilters(filters);\n const state = get();\n set({ apiFilters: { ...state.apiFilters, ...filters } });\n },\n\n async handleTempFilterChange(key, value) {\n await store.handleTempFilterChange(key, value);\n const state = get();\n set({ tempFilters: { ...state.tempFilters, [key]: value } });\n },\n\n async submitFilterUpdate() {\n await store.submitFilterUpdate();\n await syncState();\n await notifyFilterUpdate();\n },\n\n // === RESULTS AND SORTING ===\n async setResultsMode(mode) {\n await store.setResultsMode(mode);\n set({ resultsMode: mode });\n },\n\n async setSortBy(sortBy) {\n await store.setSortBy(sortBy);\n set({ sortBy });\n },\n\n // === QUESTIONNAIRE ===\n async setResolvedQuestionnaireValues(name, values) {\n await store.setResolvedQuestionnaireValues(name, values);\n const state = get();\n set({\n resolvedQuestionnaireValues: {\n ...state.resolvedQuestionnaireValues,\n [name]: values,\n }\n });\n },\n\n // === UTILITY METHODS ===\n getUnitState(unitId: string) {\n const state = get();\n const property = state.currentPropertyId ? state.properties[state.currentPropertyId] : null;\n\n return {\n isFavorite: property?.favoritedUnits.includes(unitId) ?? false,\n viewedDate:\n property?.viewedUnits.find((u: any) => u.unitId === unitId)?.viewedDate ?? \"\",\n };\n },\n\n getResultsUrl: store.getResultsUrl.bind(store),\n getCurrentProperty: store.getCurrentProperty.bind(store),\n getPropertyData: store.getPropertyData.bind(store),\n\n // === INTERNAL ===\n async _hydrate() {\n await syncState();\n },\n\n async _initialize() {\n await store.initialize();\n await syncState();\n set({ filtersLoaded: true });\n },\n };\n };\n}\n\n// Helper hook factory for unit state\nexport function createUseUnitState() {\n return (useStore: any) => (unitId: string) =>\n useStore((state: ZustandUnifiedStoreState) => state.getUnitState(unitId));\n}\n\n// Export types for consuming apps\nexport type { UnitData, UserPropertyState, Filters, QueryParams, ResultsMode, SortBy, TourContactData, Unit } from \"../schema\";\n\n// Intentionally no alias exports in vNext; use `createStructuredStore` or `createZustandUnifiedStore` explicitly.\n"],"names":["createZustandUnifiedStore","options","set","get","syncState","ormState","store","notifyFilterUpdate","apiFilters","propertyId","slug","unitIds","unitId","results","data","units","filters","state","key","value","mode","sortBy","name","values","property","_a","u","createUseUnitState","useStore"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var h=Object.create;var y=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var A=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var M=(t,o,r,l)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of w(o))!C.call(t,i)&&i!==r&&y(t,i,{get:()=>o[i],enumerable:!(l=k(o,i))||l.enumerable});return t};var m=(t,o,r)=>(r=t!=null?h(A(t)):{},M(o||!t||!t.__esModule?y(r,"default",{value:t,enumerable:!0}):r,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),a=require("react"),v=require("./generateUserUUID.cjs"),P=a.createContext({track:()=>{},identify:()=>{}}),_=({children:t,mixpanelToken:o,posthogKey:r,posthogHost:l,envMode:i})=>{const d=a.useRef(null),p=a.useRef(null),f=a.useCallback((n,s)=>{var c,e;(c=d.current)==null||c.track(n,s),(e=p.current)==null||e.capture(n,s)},[]),g=a.useCallback(n=>{var s,c;(s=d.current)==null||s.identify(n),(c=p.current)==null||c.identify(n)},[]);a.useEffect(()=>{const n=(i??"production").toLowerCase(),s=n==="development"||n==="staging",c=n==="development";if(o)(async()=>{try{const{default:e}=await import("mixpanel-browser");e.init(o,{debug:c,persistence:"localStorage",autocapture:{pageview:"full-url",click:!0,input:!0,rage_click:!0,scroll:!0,submit:!0,capture_text_content:!1}}),d.current=e;const u=await v.generateUserUUID;e.identify(u)}catch(e){console.error("❌ Failed to initialize Mixpanel:",e)}})();else{const e="Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.";s?console.error(`❌ ${e}`):console.warn(`⚠️ ${e}`)}r?(async()=>{try{const u=(await import("posthog-js")).default;u.init(r,{api_host:l||"https://us.i.posthog.com",loaded:U=>{c&&U.debug()}}),p.current=u;const x=await v.generateUserUUID;u.identify(x)}catch(e){console.error("❌ Failed to initialize PostHog:",e)}})():s&&console.warn("⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.")},[i,o,r,l]);const b=a.useMemo(()=>({track:f,identify:g}),[f,g]);return R.jsx(P.Provider,{value:b,children:t})},j=()=>a.useContext(P);exports.AnalyticsProvider=_;exports.useAnalytics=j;
1
+ "use strict";var k=Object.create;var m=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var M=(o,e,n,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of v(e))!C.call(o,s)&&s!==n&&m(o,s,{get:()=>e[s],enumerable:!(l=A(e,s))||l.enumerable});return o};var b=(o,e,n)=>(n=o!=null?k(w(o)):{},M(e||!o||!o.__esModule?m(n,"default",{value:o,enumerable:!0}):n,o));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),a=require("react"),P=a.createContext({track:()=>{},identify:()=>{}}),j=({children:o,visitor_uuid:e,mixpanelToken:n,posthogKey:l,posthogHost:s,envMode:f})=>{const u=a.useRef(null),d=a.useRef(null),y=a.useCallback((r,c)=>{var i,t;(i=u.current)==null||i.track(r,c),(t=d.current)==null||t.capture(r,c)},[]),g=a.useCallback(r=>{var c,i;(c=u.current)==null||c.identify(r),(i=d.current)==null||i.identify(r)},[]);a.useEffect(()=>{if(!e)return;const r=(f??"production").toLowerCase(),c=r==="development"||r==="staging",i=r==="development";if(n)(async()=>{try{const{default:t}=await import("mixpanel-browser");t.init(n,{debug:i,persistence:"localStorage",autocapture:{pageview:"full-url",click:!0,input:!0,rage_click:!0,scroll:!0,submit:!0,capture_text_content:!1}}),u.current=t,t.identify(e)}catch(t){console.error("❌ Failed to initialize Mixpanel:",t)}})();else{const t="Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.";c?console.error(`❌ ${t}`):console.warn(`⚠️ ${t}`)}l?(async()=>{try{const p=(await import("posthog-js")).default;p.init(l,{api_host:s||"https://us.i.posthog.com",bootstrap:{distinctID:e},loaded:h=>{i&&h.debug()}}),d.current=p,p.identify(e)}catch(t){console.error("❌ Failed to initialize PostHog:",t)}})():c&&console.warn("⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.")},[e,f,n,l,s]);const x=a.useMemo(()=>({track:y,identify:g}),[y,g]);return R.jsx(P.Provider,{value:x,children:o})},z=()=>a.useContext(P);exports.AnalyticsProvider=j;exports.useAnalytics=z;
2
2
  //# sourceMappingURL=AnalyticsProvider.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsProvider.cjs","sources":["../../../src/features/analytics/AnalyticsProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { generateUserUUID } from \"./generateUserUUID\";\n\ntype MixpanelInstance = typeof import(\"mixpanel-browser\")[\"default\"];\n\ninterface AnalyticsContextValue {\n track: (eventName: string, payload?: Record<string, any>) => void;\n identify: (userId: string) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>({\n track: () => undefined,\n identify: () => undefined,\n});\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n mixpanelToken?: string;\n posthogKey?: string;\n posthogHost?: string;\n envMode?: string;\n}\n\nexport const AnalyticsProvider = ({\n children,\n mixpanelToken,\n posthogKey,\n posthogHost,\n envMode,\n}: AnalyticsProviderProps) => {\n const mixpanelRef = useRef<MixpanelInstance | null>(null);\n const posthogRef = useRef<any>(null);\n\n const track = useCallback(\n (eventName: string, payload?: Record<string, any>) => {\n mixpanelRef.current?.track(eventName, payload);\n posthogRef.current?.capture(eventName, payload);\n },\n [],\n );\n\n const identify = useCallback((userId: string) => {\n mixpanelRef.current?.identify(userId);\n posthogRef.current?.identify(userId);\n }, []);\n\n useEffect(() => {\n const normalizedMode = (envMode ?? \"production\").toLowerCase();\n const shouldWarnLoudly =\n normalizedMode === \"development\" || normalizedMode === \"staging\";\n const debugEnabled = normalizedMode === \"development\";\n\n // ── Mixpanel ──────────────────────────────────────────────\n if (mixpanelToken) {\n (async () => {\n try {\n const { default: mixpanel } = await import(\"mixpanel-browser\");\n mixpanel.init(mixpanelToken, {\n debug: debugEnabled,\n persistence: \"localStorage\",\n autocapture: {\n pageview: \"full-url\",\n click: true,\n input: true,\n rage_click: true,\n scroll: true,\n submit: true,\n capture_text_content: false,\n },\n });\n mixpanelRef.current = mixpanel;\n\n const uuid = await generateUserUUID;\n mixpanel.identify(uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize Mixpanel:\", err);\n }\n })();\n } else {\n const msg =\n \"Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.\";\n if (shouldWarnLoudly) console.error(`❌ ${msg}`);\n else console.warn(`⚠️ ${msg}`);\n }\n\n // ── PostHog ───────────────────────────────────────────────\n if (posthogKey) {\n (async () => {\n try {\n const posthogModule = await import(\"posthog-js\");\n const posthog = posthogModule.default;\n posthog.init(posthogKey, {\n api_host: posthogHost || \"https://us.i.posthog.com\",\n loaded: (ph) => {\n if (debugEnabled) ph.debug();\n },\n });\n posthogRef.current = posthog;\n\n const uuid = await generateUserUUID;\n posthog.identify(uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize PostHog:\", err);\n }\n })();\n } else if (shouldWarnLoudly) {\n console.warn(\n \"⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.\",\n );\n }\n }, [envMode, mixpanelToken, posthogKey, posthogHost]);\n\n const value = useMemo(() => ({ track, identify }), [track, identify]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `useAnalytics()` instead. */\nexport const useMixpanel = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const MixpanelProvider = ({\n children,\n token,\n envMode,\n}: {\n children: React.ReactNode;\n token?: string;\n envMode?: string;\n}) => (\n <AnalyticsProvider mixpanelToken={token} envMode={envMode}>\n {children}\n </AnalyticsProvider>\n);\n"],"names":["AnalyticsContext","createContext","AnalyticsProvider","children","mixpanelToken","posthogKey","posthogHost","envMode","mixpanelRef","useRef","posthogRef","track","useCallback","eventName","payload","_a","_b","identify","userId","useEffect","normalizedMode","shouldWarnLoudly","debugEnabled","mixpanel","uuid","generateUserUUID","err","msg","posthog","ph","value","useMemo","jsx","useAnalytics","useContext"],"mappings":"unBAkBMA,EAAmBC,EAAAA,cAAqC,CAC5D,MAAO,IAAA,GACP,SAAU,IAAA,EACZ,CAAC,EAUYC,EAAoB,CAAC,CAChC,SAAAC,EACA,cAAAC,EACA,WAAAC,EACA,YAAAC,EACA,QAAAC,CACF,IAA8B,CAC5B,MAAMC,EAAcC,EAAAA,OAAgC,IAAI,EAClDC,EAAaD,EAAAA,OAAY,IAAI,EAE7BE,EAAQC,EAAAA,YACZ,CAACC,EAAmBC,IAAkC,UACpDC,EAAAP,EAAY,UAAZ,MAAAO,EAAqB,MAAMF,EAAWC,IACtCE,EAAAN,EAAW,UAAX,MAAAM,EAAoB,QAAQH,EAAWC,EACzC,EACA,CAAA,CAAC,EAGGG,EAAWL,cAAaM,GAAmB,UAC/CH,EAAAP,EAAY,UAAZ,MAAAO,EAAqB,SAASG,IAC9BF,EAAAN,EAAW,UAAX,MAAAM,EAAoB,SAASE,EAC/B,EAAG,CAAA,CAAE,EAELC,EAAAA,UAAU,IAAM,CACd,MAAMC,GAAkBb,GAAW,cAAc,YAAA,EAC3Cc,EACJD,IAAmB,eAAiBA,IAAmB,UACnDE,EAAeF,IAAmB,cAGxC,GAAIhB,GACD,SAAY,CACX,GAAI,CACF,KAAM,CAAE,QAASmB,GAAa,KAAM,QAAO,kBAAkB,EAC7DA,EAAS,KAAKnB,EAAe,CAC3B,MAAOkB,EACP,YAAa,eACb,YAAa,CACX,SAAU,WACV,MAAO,GACP,MAAO,GACP,WAAY,GACZ,OAAQ,GACR,OAAQ,GACR,qBAAsB,EAAA,CACxB,CACD,EACDd,EAAY,QAAUe,EAEtB,MAAMC,EAAO,MAAMC,EAAAA,iBACnBF,EAAS,SAASC,CAAI,CACxB,OAASE,EAAK,CACZ,QAAQ,MAAM,mCAAoCA,CAAG,CACvD,CACF,GAAA,MACK,CACL,MAAMC,EACJ,0EACEN,EAAkB,QAAQ,MAAM,KAAKM,CAAG,EAAE,EACzC,QAAQ,KAAK,MAAMA,CAAG,EAAE,CAC/B,CAGItB,GACD,SAAY,CACX,GAAI,CAEF,MAAMuB,GADgB,KAAM,QAAO,YAAY,GACjB,QAC9BA,EAAQ,KAAKvB,EAAY,CACvB,SAAUC,GAAe,2BACzB,OAASuB,GAAO,CACVP,KAAiB,MAAA,CACvB,CAAA,CACD,EACDZ,EAAW,QAAUkB,EAErB,MAAMJ,EAAO,MAAMC,EAAAA,iBACnBG,EAAQ,SAASJ,CAAI,CACvB,OAASE,EAAK,CACZ,QAAQ,MAAM,kCAAmCA,CAAG,CACtD,CACF,GAAA,EACSL,GACT,QAAQ,KACN,sEAAA,CAGN,EAAG,CAACd,EAASH,EAAeC,EAAYC,CAAW,CAAC,EAEpD,MAAMwB,EAAQC,UAAQ,KAAO,CAAE,MAAApB,EAAO,SAAAM,IAAa,CAACN,EAAOM,CAAQ,CAAC,EAEpE,OACEe,EAAAA,IAAChC,EAAiB,SAAjB,CAA0B,MAAA8B,EACxB,SAAA3B,CAAA,CACH,CAEJ,EAEa8B,EAAe,IAAMC,EAAAA,WAAWlC,CAAgB"}
1
+ {"version":3,"file":"AnalyticsProvider.cjs","sources":["../../../src/features/analytics/AnalyticsProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\ntype MixpanelInstance = typeof import(\"mixpanel-browser\")[\"default\"];\n\ninterface AnalyticsContextValue {\n track: (eventName: string, payload?: Record<string, any>) => void;\n identify: (userId: string) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>({\n track: () => undefined,\n identify: () => undefined,\n});\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n visitor_uuid?: string;\n mixpanelToken?: string;\n posthogKey?: string;\n posthogHost?: string;\n envMode?: string;\n}\n\nexport const AnalyticsProvider = ({\n children,\n visitor_uuid,\n mixpanelToken,\n posthogKey,\n posthogHost,\n envMode,\n}: AnalyticsProviderProps) => {\n const mixpanelRef = useRef<MixpanelInstance | null>(null);\n const posthogRef = useRef<any>(null);\n\n const track = useCallback(\n (eventName: string, payload?: Record<string, any>) => {\n mixpanelRef.current?.track(eventName, payload);\n posthogRef.current?.capture(eventName, payload);\n },\n [],\n );\n\n const identify = useCallback((userId: string) => {\n mixpanelRef.current?.identify(userId);\n posthogRef.current?.identify(userId);\n }, []);\n\n useEffect(() => {\n if (!visitor_uuid) return;\n\n const normalizedMode = (envMode ?? \"production\").toLowerCase();\n const shouldWarnLoudly =\n normalizedMode === \"development\" || normalizedMode === \"staging\";\n const debugEnabled = normalizedMode === \"development\";\n\n // ── Mixpanel ──────────────────────────────────────────────\n if (mixpanelToken) {\n (async () => {\n try {\n const { default: mixpanel } = await import(\"mixpanel-browser\");\n mixpanel.init(mixpanelToken, {\n debug: debugEnabled,\n persistence: \"localStorage\",\n autocapture: {\n pageview: \"full-url\",\n click: true,\n input: true,\n rage_click: true,\n scroll: true,\n submit: true,\n capture_text_content: false,\n },\n });\n mixpanelRef.current = mixpanel;\n mixpanel.identify(visitor_uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize Mixpanel:\", err);\n }\n })();\n } else {\n const msg =\n \"Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.\";\n if (shouldWarnLoudly) console.error(`❌ ${msg}`);\n else console.warn(`⚠️ ${msg}`);\n }\n\n // ── PostHog ───────────────────────────────────────────────\n if (posthogKey) {\n (async () => {\n try {\n const posthogModule = await import(\"posthog-js\");\n const posthog = posthogModule.default;\n posthog.init(posthogKey, {\n api_host: posthogHost || \"https://us.i.posthog.com\",\n bootstrap: { distinctID: visitor_uuid },\n loaded: (ph) => {\n if (debugEnabled) ph.debug();\n },\n });\n posthogRef.current = posthog;\n posthog.identify(visitor_uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize PostHog:\", err);\n }\n })();\n } else if (shouldWarnLoudly) {\n console.warn(\n \"⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.\",\n );\n }\n }, [visitor_uuid, envMode, mixpanelToken, posthogKey, posthogHost]);\n\n const value = useMemo(() => ({ track, identify }), [track, identify]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `useAnalytics()` instead. */\nexport const useMixpanel = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const MixpanelProvider = ({\n children,\n token,\n envMode,\n}: {\n children: React.ReactNode;\n token?: string;\n envMode?: string;\n}) => (\n <AnalyticsProvider mixpanelToken={token} envMode={envMode}>\n {children}\n </AnalyticsProvider>\n);\n"],"names":["AnalyticsContext","createContext","AnalyticsProvider","children","visitor_uuid","mixpanelToken","posthogKey","posthogHost","envMode","mixpanelRef","useRef","posthogRef","track","useCallback","eventName","payload","_a","_b","identify","userId","useEffect","normalizedMode","shouldWarnLoudly","debugEnabled","mixpanel","err","msg","posthog","ph","value","useMemo","jsx","useAnalytics","useContext"],"mappings":"mlBAgBMA,EAAmBC,EAAAA,cAAqC,CAC5D,MAAO,IAAA,GACP,SAAU,IAAA,EACZ,CAAC,EAWYC,EAAoB,CAAC,CAChC,SAAAC,EACA,aAAAC,EACA,cAAAC,EACA,WAAAC,EACA,YAAAC,EACA,QAAAC,CACF,IAA8B,CAC5B,MAAMC,EAAcC,EAAAA,OAAgC,IAAI,EAClDC,EAAaD,EAAAA,OAAY,IAAI,EAE7BE,EAAQC,EAAAA,YACZ,CAACC,EAAmBC,IAAkC,UACpDC,EAAAP,EAAY,UAAZ,MAAAO,EAAqB,MAAMF,EAAWC,IACtCE,EAAAN,EAAW,UAAX,MAAAM,EAAoB,QAAQH,EAAWC,EACzC,EACA,CAAA,CAAC,EAGGG,EAAWL,cAAaM,GAAmB,UAC/CH,EAAAP,EAAY,UAAZ,MAAAO,EAAqB,SAASG,IAC9BF,EAAAN,EAAW,UAAX,MAAAM,EAAoB,SAASE,EAC/B,EAAG,CAAA,CAAE,EAELC,EAAAA,UAAU,IAAM,CACd,GAAI,CAAChB,EAAc,OAEnB,MAAMiB,GAAkBb,GAAW,cAAc,YAAA,EAC3Cc,EACJD,IAAmB,eAAiBA,IAAmB,UACnDE,EAAeF,IAAmB,cAGxC,GAAIhB,GACD,SAAY,CACX,GAAI,CACF,KAAM,CAAE,QAASmB,GAAa,KAAM,QAAO,kBAAkB,EAC7DA,EAAS,KAAKnB,EAAe,CAC3B,MAAOkB,EACP,YAAa,eACb,YAAa,CACX,SAAU,WACV,MAAO,GACP,MAAO,GACP,WAAY,GACZ,OAAQ,GACR,OAAQ,GACR,qBAAsB,EAAA,CACxB,CACD,EACDd,EAAY,QAAUe,EACtBA,EAAS,SAASpB,CAAY,CAChC,OAASqB,EAAK,CACZ,QAAQ,MAAM,mCAAoCA,CAAG,CACvD,CACF,GAAA,MACK,CACL,MAAMC,EACJ,0EACEJ,EAAkB,QAAQ,MAAM,KAAKI,CAAG,EAAE,EACzC,QAAQ,KAAK,MAAMA,CAAG,EAAE,CAC/B,CAGIpB,GACD,SAAY,CACX,GAAI,CAEF,MAAMqB,GADgB,KAAM,QAAO,YAAY,GACjB,QAC9BA,EAAQ,KAAKrB,EAAY,CACvB,SAAUC,GAAe,2BACzB,UAAW,CAAE,WAAYH,CAAA,EACzB,OAASwB,GAAO,CACVL,KAAiB,MAAA,CACvB,CAAA,CACD,EACDZ,EAAW,QAAUgB,EACrBA,EAAQ,SAASvB,CAAY,CAC/B,OAASqB,EAAK,CACZ,QAAQ,MAAM,kCAAmCA,CAAG,CACtD,CACF,GAAA,EACSH,GACT,QAAQ,KACN,sEAAA,CAGN,EAAG,CAAClB,EAAcI,EAASH,EAAeC,EAAYC,CAAW,CAAC,EAElE,MAAMsB,EAAQC,UAAQ,KAAO,CAAE,MAAAlB,EAAO,SAAAM,IAAa,CAACN,EAAOM,CAAQ,CAAC,EAEpE,OACEa,EAAAA,IAAC/B,EAAiB,SAAjB,CAA0B,MAAA6B,EACxB,SAAA1B,CAAA,CACH,CAEJ,EAEa6B,EAAe,IAAMC,EAAAA,WAAWjC,CAAgB"}
@@ -5,12 +5,13 @@ interface AnalyticsContextValue {
5
5
  }
6
6
  export interface AnalyticsProviderProps {
7
7
  children: React.ReactNode;
8
+ visitor_uuid?: string;
8
9
  mixpanelToken?: string;
9
10
  posthogKey?: string;
10
11
  posthogHost?: string;
11
12
  envMode?: string;
12
13
  }
13
- export declare const AnalyticsProvider: ({ children, mixpanelToken, posthogKey, posthogHost, envMode, }: AnalyticsProviderProps) => import("react/jsx-runtime").JSX.Element;
14
+ export declare const AnalyticsProvider: ({ children, visitor_uuid, mixpanelToken, posthogKey, posthogHost, envMode, }: AnalyticsProviderProps) => import("react/jsx-runtime").JSX.Element;
14
15
  export declare const useAnalytics: () => AnalyticsContextValue;
15
16
  /** @deprecated Use `useAnalytics()` instead. */
16
17
  export declare const useMixpanel: () => AnalyticsContextValue;
@@ -1,36 +1,37 @@
1
- import { jsx as P } from "react/jsx-runtime";
2
- import { useContext as k, useRef as f, useCallback as g, useEffect as b, useMemo as A, createContext as C } from "react";
3
- import { generateUserUUID as m } from "./generateUserUUID.mjs";
4
- const y = C({
1
+ import { jsx as b } from "react/jsx-runtime";
2
+ import { useContext as k, useRef as y, useCallback as g, useEffect as w, useMemo as A, createContext as C } from "react";
3
+ const m = C({
5
4
  track: () => {
6
5
  },
7
6
  identify: () => {
8
7
  }
9
- }), R = ({
8
+ }), z = ({
10
9
  children: x,
11
- mixpanelToken: i,
10
+ visitor_uuid: r,
11
+ mixpanelToken: c,
12
12
  posthogKey: s,
13
- posthogHost: l,
14
- envMode: u
13
+ posthogHost: u,
14
+ envMode: p
15
15
  }) => {
16
- const c = f(null), a = f(null), d = g(
16
+ const i = y(null), a = y(null), d = g(
17
17
  (e, o) => {
18
- var r, t;
19
- (r = c.current) == null || r.track(e, o), (t = a.current) == null || t.capture(e, o);
18
+ var n, t;
19
+ (n = i.current) == null || n.track(e, o), (t = a.current) == null || t.capture(e, o);
20
20
  },
21
21
  []
22
- ), p = g((e) => {
23
- var o, r;
24
- (o = c.current) == null || o.identify(e), (r = a.current) == null || r.identify(e);
22
+ ), f = g((e) => {
23
+ var o, n;
24
+ (o = i.current) == null || o.identify(e), (n = a.current) == null || n.identify(e);
25
25
  }, []);
26
- b(() => {
27
- const e = (u ?? "production").toLowerCase(), o = e === "development" || e === "staging", r = e === "development";
28
- if (i)
26
+ w(() => {
27
+ if (!r) return;
28
+ const e = (p ?? "production").toLowerCase(), o = e === "development" || e === "staging", n = e === "development";
29
+ if (c)
29
30
  (async () => {
30
31
  try {
31
32
  const { default: t } = await import("mixpanel-browser");
32
- t.init(i, {
33
- debug: r,
33
+ t.init(c, {
34
+ debug: n,
34
35
  persistence: "localStorage",
35
36
  autocapture: {
36
37
  pageview: "full-url",
@@ -41,9 +42,7 @@ const y = C({
41
42
  submit: !0,
42
43
  capture_text_content: !1
43
44
  }
44
- }), c.current = t;
45
- const n = await m;
46
- t.identify(n);
45
+ }), i.current = t, t.identify(r);
47
46
  } catch (t) {
48
47
  console.error("❌ Failed to initialize Mixpanel:", t);
49
48
  }
@@ -54,27 +53,26 @@ const y = C({
54
53
  }
55
54
  s ? (async () => {
56
55
  try {
57
- const n = (await import("posthog-js")).default;
58
- n.init(s, {
59
- api_host: l || "https://us.i.posthog.com",
60
- loaded: (w) => {
61
- r && w.debug();
56
+ const l = (await import("posthog-js")).default;
57
+ l.init(s, {
58
+ api_host: u || "https://us.i.posthog.com",
59
+ bootstrap: { distinctID: r },
60
+ loaded: (P) => {
61
+ n && P.debug();
62
62
  }
63
- }), a.current = n;
64
- const v = await m;
65
- n.identify(v);
63
+ }), a.current = l, l.identify(r);
66
64
  } catch (t) {
67
65
  console.error("❌ Failed to initialize PostHog:", t);
68
66
  }
69
67
  })() : o && console.warn(
70
68
  "⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider."
71
69
  );
72
- }, [u, i, s, l]);
73
- const h = A(() => ({ track: d, identify: p }), [d, p]);
74
- return /* @__PURE__ */ P(y.Provider, { value: h, children: x });
75
- }, U = () => k(y);
70
+ }, [r, p, c, s, u]);
71
+ const h = A(() => ({ track: d, identify: f }), [d, f]);
72
+ return /* @__PURE__ */ b(m.Provider, { value: h, children: x });
73
+ }, R = () => k(m);
76
74
  export {
77
- R as AnalyticsProvider,
78
- U as useAnalytics
75
+ z as AnalyticsProvider,
76
+ R as useAnalytics
79
77
  };
80
78
  //# sourceMappingURL=AnalyticsProvider.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsProvider.mjs","sources":["../../../src/features/analytics/AnalyticsProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\nimport { generateUserUUID } from \"./generateUserUUID\";\n\ntype MixpanelInstance = typeof import(\"mixpanel-browser\")[\"default\"];\n\ninterface AnalyticsContextValue {\n track: (eventName: string, payload?: Record<string, any>) => void;\n identify: (userId: string) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>({\n track: () => undefined,\n identify: () => undefined,\n});\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n mixpanelToken?: string;\n posthogKey?: string;\n posthogHost?: string;\n envMode?: string;\n}\n\nexport const AnalyticsProvider = ({\n children,\n mixpanelToken,\n posthogKey,\n posthogHost,\n envMode,\n}: AnalyticsProviderProps) => {\n const mixpanelRef = useRef<MixpanelInstance | null>(null);\n const posthogRef = useRef<any>(null);\n\n const track = useCallback(\n (eventName: string, payload?: Record<string, any>) => {\n mixpanelRef.current?.track(eventName, payload);\n posthogRef.current?.capture(eventName, payload);\n },\n [],\n );\n\n const identify = useCallback((userId: string) => {\n mixpanelRef.current?.identify(userId);\n posthogRef.current?.identify(userId);\n }, []);\n\n useEffect(() => {\n const normalizedMode = (envMode ?? \"production\").toLowerCase();\n const shouldWarnLoudly =\n normalizedMode === \"development\" || normalizedMode === \"staging\";\n const debugEnabled = normalizedMode === \"development\";\n\n // ── Mixpanel ──────────────────────────────────────────────\n if (mixpanelToken) {\n (async () => {\n try {\n const { default: mixpanel } = await import(\"mixpanel-browser\");\n mixpanel.init(mixpanelToken, {\n debug: debugEnabled,\n persistence: \"localStorage\",\n autocapture: {\n pageview: \"full-url\",\n click: true,\n input: true,\n rage_click: true,\n scroll: true,\n submit: true,\n capture_text_content: false,\n },\n });\n mixpanelRef.current = mixpanel;\n\n const uuid = await generateUserUUID;\n mixpanel.identify(uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize Mixpanel:\", err);\n }\n })();\n } else {\n const msg =\n \"Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.\";\n if (shouldWarnLoudly) console.error(`❌ ${msg}`);\n else console.warn(`⚠️ ${msg}`);\n }\n\n // ── PostHog ───────────────────────────────────────────────\n if (posthogKey) {\n (async () => {\n try {\n const posthogModule = await import(\"posthog-js\");\n const posthog = posthogModule.default;\n posthog.init(posthogKey, {\n api_host: posthogHost || \"https://us.i.posthog.com\",\n loaded: (ph) => {\n if (debugEnabled) ph.debug();\n },\n });\n posthogRef.current = posthog;\n\n const uuid = await generateUserUUID;\n posthog.identify(uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize PostHog:\", err);\n }\n })();\n } else if (shouldWarnLoudly) {\n console.warn(\n \"⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.\",\n );\n }\n }, [envMode, mixpanelToken, posthogKey, posthogHost]);\n\n const value = useMemo(() => ({ track, identify }), [track, identify]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `useAnalytics()` instead. */\nexport const useMixpanel = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const MixpanelProvider = ({\n children,\n token,\n envMode,\n}: {\n children: React.ReactNode;\n token?: string;\n envMode?: string;\n}) => (\n <AnalyticsProvider mixpanelToken={token} envMode={envMode}>\n {children}\n </AnalyticsProvider>\n);\n"],"names":["AnalyticsContext","createContext","AnalyticsProvider","children","mixpanelToken","posthogKey","posthogHost","envMode","mixpanelRef","useRef","posthogRef","track","useCallback","eventName","payload","_a","_b","identify","userId","useEffect","normalizedMode","shouldWarnLoudly","debugEnabled","mixpanel","uuid","generateUserUUID","err","msg","posthog","ph","value","useMemo","jsx","useAnalytics","useContext"],"mappings":";;;AAkBA,MAAMA,IAAmBC,EAAqC;AAAA,EAC5D,OAAO,MAAA;AAAA;AAAA,EACP,UAAU,MAAA;AAAA;AACZ,CAAC,GAUYC,IAAoB,CAAC;AAAA,EAChC,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AACF,MAA8B;AAC5B,QAAMC,IAAcC,EAAgC,IAAI,GAClDC,IAAaD,EAAY,IAAI,GAE7BE,IAAQC;AAAA,IACZ,CAACC,GAAmBC,MAAkC;;AACpD,OAAAC,IAAAP,EAAY,YAAZ,QAAAO,EAAqB,MAAMF,GAAWC,KACtCE,IAAAN,EAAW,YAAX,QAAAM,EAAoB,QAAQH,GAAWC;AAAA,IACzC;AAAA,IACA,CAAA;AAAA,EAAC,GAGGG,IAAWL,EAAY,CAACM,MAAmB;;AAC/C,KAAAH,IAAAP,EAAY,YAAZ,QAAAO,EAAqB,SAASG,KAC9BF,IAAAN,EAAW,YAAX,QAAAM,EAAoB,SAASE;AAAA,EAC/B,GAAG,CAAA,CAAE;AAEL,EAAAC,EAAU,MAAM;AACd,UAAMC,KAAkBb,KAAW,cAAc,YAAA,GAC3Cc,IACJD,MAAmB,iBAAiBA,MAAmB,WACnDE,IAAeF,MAAmB;AAGxC,QAAIhB;AACF,OAAC,YAAY;AACX,YAAI;AACF,gBAAM,EAAE,SAASmB,MAAa,MAAM,OAAO,kBAAkB;AAC7D,UAAAA,EAAS,KAAKnB,GAAe;AAAA,YAC3B,OAAOkB;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,cACX,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,sBAAsB;AAAA,YAAA;AAAA,UACxB,CACD,GACDd,EAAY,UAAUe;AAEtB,gBAAMC,IAAO,MAAMC;AACnB,UAAAF,EAAS,SAASC,CAAI;AAAA,QACxB,SAASE,GAAK;AACZ,kBAAQ,MAAM,oCAAoCA,CAAG;AAAA,QACvD;AAAA,MACF,GAAA;AAAA,SACK;AACL,YAAMC,IACJ;AACF,MAAIN,IAAkB,QAAQ,MAAM,KAAKM,CAAG,EAAE,IACzC,QAAQ,KAAK,MAAMA,CAAG,EAAE;AAAA,IAC/B;AAGA,IAAItB,KACD,YAAY;AACX,UAAI;AAEF,cAAMuB,KADgB,MAAM,OAAO,YAAY,GACjB;AAC9B,QAAAA,EAAQ,KAAKvB,GAAY;AAAA,UACvB,UAAUC,KAAe;AAAA,UACzB,QAAQ,CAACuB,MAAO;AACd,YAAIP,OAAiB,MAAA;AAAA,UACvB;AAAA,QAAA,CACD,GACDZ,EAAW,UAAUkB;AAErB,cAAMJ,IAAO,MAAMC;AACnB,QAAAG,EAAQ,SAASJ,CAAI;AAAA,MACvB,SAASE,GAAK;AACZ,gBAAQ,MAAM,mCAAmCA,CAAG;AAAA,MACtD;AAAA,IACF,GAAA,IACSL,KACT,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EAGN,GAAG,CAACd,GAASH,GAAeC,GAAYC,CAAW,CAAC;AAEpD,QAAMwB,IAAQC,EAAQ,OAAO,EAAE,OAAApB,GAAO,UAAAM,MAAa,CAACN,GAAOM,CAAQ,CAAC;AAEpE,SACE,gBAAAe,EAAChC,EAAiB,UAAjB,EAA0B,OAAA8B,GACxB,UAAA3B,EAAA,CACH;AAEJ,GAEa8B,IAAe,MAAMC,EAAWlC,CAAgB;"}
1
+ {"version":3,"file":"AnalyticsProvider.mjs","sources":["../../../src/features/analytics/AnalyticsProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\n\ntype MixpanelInstance = typeof import(\"mixpanel-browser\")[\"default\"];\n\ninterface AnalyticsContextValue {\n track: (eventName: string, payload?: Record<string, any>) => void;\n identify: (userId: string) => void;\n}\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>({\n track: () => undefined,\n identify: () => undefined,\n});\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n visitor_uuid?: string;\n mixpanelToken?: string;\n posthogKey?: string;\n posthogHost?: string;\n envMode?: string;\n}\n\nexport const AnalyticsProvider = ({\n children,\n visitor_uuid,\n mixpanelToken,\n posthogKey,\n posthogHost,\n envMode,\n}: AnalyticsProviderProps) => {\n const mixpanelRef = useRef<MixpanelInstance | null>(null);\n const posthogRef = useRef<any>(null);\n\n const track = useCallback(\n (eventName: string, payload?: Record<string, any>) => {\n mixpanelRef.current?.track(eventName, payload);\n posthogRef.current?.capture(eventName, payload);\n },\n [],\n );\n\n const identify = useCallback((userId: string) => {\n mixpanelRef.current?.identify(userId);\n posthogRef.current?.identify(userId);\n }, []);\n\n useEffect(() => {\n if (!visitor_uuid) return;\n\n const normalizedMode = (envMode ?? \"production\").toLowerCase();\n const shouldWarnLoudly =\n normalizedMode === \"development\" || normalizedMode === \"staging\";\n const debugEnabled = normalizedMode === \"development\";\n\n // ── Mixpanel ──────────────────────────────────────────────\n if (mixpanelToken) {\n (async () => {\n try {\n const { default: mixpanel } = await import(\"mixpanel-browser\");\n mixpanel.init(mixpanelToken, {\n debug: debugEnabled,\n persistence: \"localStorage\",\n autocapture: {\n pageview: \"full-url\",\n click: true,\n input: true,\n rage_click: true,\n scroll: true,\n submit: true,\n capture_text_content: false,\n },\n });\n mixpanelRef.current = mixpanel;\n mixpanel.identify(visitor_uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize Mixpanel:\", err);\n }\n })();\n } else {\n const msg =\n \"Mixpanel token not set. Pass a mixpanelToken prop to AnalyticsProvider.\";\n if (shouldWarnLoudly) console.error(`❌ ${msg}`);\n else console.warn(`⚠️ ${msg}`);\n }\n\n // ── PostHog ───────────────────────────────────────────────\n if (posthogKey) {\n (async () => {\n try {\n const posthogModule = await import(\"posthog-js\");\n const posthog = posthogModule.default;\n posthog.init(posthogKey, {\n api_host: posthogHost || \"https://us.i.posthog.com\",\n bootstrap: { distinctID: visitor_uuid },\n loaded: (ph) => {\n if (debugEnabled) ph.debug();\n },\n });\n posthogRef.current = posthog;\n posthog.identify(visitor_uuid);\n } catch (err) {\n console.error(\"❌ Failed to initialize PostHog:\", err);\n }\n })();\n } else if (shouldWarnLoudly) {\n console.warn(\n \"⚠️ PostHog key not set. Pass a posthogKey prop to AnalyticsProvider.\",\n );\n }\n }, [visitor_uuid, envMode, mixpanelToken, posthogKey, posthogHost]);\n\n const value = useMemo(() => ({ track, identify }), [track, identify]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n};\n\nexport const useAnalytics = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `useAnalytics()` instead. */\nexport const useMixpanel = () => useContext(AnalyticsContext);\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const MixpanelProvider = ({\n children,\n token,\n envMode,\n}: {\n children: React.ReactNode;\n token?: string;\n envMode?: string;\n}) => (\n <AnalyticsProvider mixpanelToken={token} envMode={envMode}>\n {children}\n </AnalyticsProvider>\n);\n"],"names":["AnalyticsContext","createContext","AnalyticsProvider","children","visitor_uuid","mixpanelToken","posthogKey","posthogHost","envMode","mixpanelRef","useRef","posthogRef","track","useCallback","eventName","payload","_a","_b","identify","userId","useEffect","normalizedMode","shouldWarnLoudly","debugEnabled","mixpanel","err","msg","posthog","ph","value","useMemo","jsx","useAnalytics","useContext"],"mappings":";;AAgBA,MAAMA,IAAmBC,EAAqC;AAAA,EAC5D,OAAO,MAAA;AAAA;AAAA,EACP,UAAU,MAAA;AAAA;AACZ,CAAC,GAWYC,IAAoB,CAAC;AAAA,EAChC,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AACF,MAA8B;AAC5B,QAAMC,IAAcC,EAAgC,IAAI,GAClDC,IAAaD,EAAY,IAAI,GAE7BE,IAAQC;AAAA,IACZ,CAACC,GAAmBC,MAAkC;;AACpD,OAAAC,IAAAP,EAAY,YAAZ,QAAAO,EAAqB,MAAMF,GAAWC,KACtCE,IAAAN,EAAW,YAAX,QAAAM,EAAoB,QAAQH,GAAWC;AAAA,IACzC;AAAA,IACA,CAAA;AAAA,EAAC,GAGGG,IAAWL,EAAY,CAACM,MAAmB;;AAC/C,KAAAH,IAAAP,EAAY,YAAZ,QAAAO,EAAqB,SAASG,KAC9BF,IAAAN,EAAW,YAAX,QAAAM,EAAoB,SAASE;AAAA,EAC/B,GAAG,CAAA,CAAE;AAEL,EAAAC,EAAU,MAAM;AACd,QAAI,CAAChB,EAAc;AAEnB,UAAMiB,KAAkBb,KAAW,cAAc,YAAA,GAC3Cc,IACJD,MAAmB,iBAAiBA,MAAmB,WACnDE,IAAeF,MAAmB;AAGxC,QAAIhB;AACF,OAAC,YAAY;AACX,YAAI;AACF,gBAAM,EAAE,SAASmB,MAAa,MAAM,OAAO,kBAAkB;AAC7D,UAAAA,EAAS,KAAKnB,GAAe;AAAA,YAC3B,OAAOkB;AAAA,YACP,aAAa;AAAA,YACb,aAAa;AAAA,cACX,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,sBAAsB;AAAA,YAAA;AAAA,UACxB,CACD,GACDd,EAAY,UAAUe,GACtBA,EAAS,SAASpB,CAAY;AAAA,QAChC,SAASqB,GAAK;AACZ,kBAAQ,MAAM,oCAAoCA,CAAG;AAAA,QACvD;AAAA,MACF,GAAA;AAAA,SACK;AACL,YAAMC,IACJ;AACF,MAAIJ,IAAkB,QAAQ,MAAM,KAAKI,CAAG,EAAE,IACzC,QAAQ,KAAK,MAAMA,CAAG,EAAE;AAAA,IAC/B;AAGA,IAAIpB,KACD,YAAY;AACX,UAAI;AAEF,cAAMqB,KADgB,MAAM,OAAO,YAAY,GACjB;AAC9B,QAAAA,EAAQ,KAAKrB,GAAY;AAAA,UACvB,UAAUC,KAAe;AAAA,UACzB,WAAW,EAAE,YAAYH,EAAA;AAAA,UACzB,QAAQ,CAACwB,MAAO;AACd,YAAIL,OAAiB,MAAA;AAAA,UACvB;AAAA,QAAA,CACD,GACDZ,EAAW,UAAUgB,GACrBA,EAAQ,SAASvB,CAAY;AAAA,MAC/B,SAASqB,GAAK;AACZ,gBAAQ,MAAM,mCAAmCA,CAAG;AAAA,MACtD;AAAA,IACF,GAAA,IACSH,KACT,QAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EAGN,GAAG,CAAClB,GAAcI,GAASH,GAAeC,GAAYC,CAAW,CAAC;AAElE,QAAMsB,IAAQC,EAAQ,OAAO,EAAE,OAAAlB,GAAO,UAAAM,MAAa,CAACN,GAAOM,CAAQ,CAAC;AAEpE,SACE,gBAAAa,EAAC/B,EAAiB,UAAjB,EAA0B,OAAA6B,GACxB,UAAA1B,EAAA,CACH;AAEJ,GAEa6B,IAAe,MAAMC,EAAWjC,CAAgB;"}
@@ -1,4 +1,3 @@
1
1
  export * from "./analytics";
2
2
  export { AnalyticsProvider, useAnalytics, } from "./AnalyticsProvider";
3
3
  export type { AnalyticsProviderProps } from "./AnalyticsProvider";
4
- export { generateUserUUID } from "./generateUserUUID";
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./errors.cjs"),e=require("./schema.cjs"),m=require("./db.cjs"),s=require("./api/users.cjs"),S=require("./debug.cjs"),a=require("./storage.cjs"),n=require("./api/favorites.cjs"),d=require("./api/properties.cjs"),u=require("./stores/store.cjs"),U=require("./adapters/zustand-store.cjs"),p=require("./adapters/structured-store.cjs"),h=require("./units/favorites.cjs"),t=require("./features/units/transformers.cjs"),c=require("./features/filters/transformers.cjs"),o=require("./utils/dimensions.cjs"),M=require("./validation.cjs"),v=require("./base/overviewimagesonproperty.cjs"),g=require("./base/amenityimagesonproperty.cjs"),E=require("./base/floorplan.cjs"),P=require("./base/media.cjs"),D=require("./base/property.cjs"),f=require("./base/propertyhighlight.cjs"),q=require("./base/room.cjs"),A=require("./base/style.cjs"),F=require("./base/unit.cjs"),r=require("./base/enums.cjs"),T=require("./base/renderedstyle.cjs"),I=require("./base/propertyamenity.cjs"),R=require("./base/favoriteunit.cjs"),O=require("./base/user.cjs"),b=require("./base/propertylink.cjs"),y=require("./features/analytics/AnalyticsProvider.cjs"),k=require("./features/analytics/generateUserUUID.cjs"),i=require("./features/analytics/analytics.cjs");exports.OpenDBError=l.OpenDBError;exports.SchemaMismatchError=l.SchemaMismatchError;exports.ApiUserSchema=e.ApiUserSchema;exports.AppStoreDataSchema=e.AppStoreDataSchema;exports.FavoritesSchema=e.FavoritesSchema;exports.FiltersSchema=e.FiltersSchema;exports.PropertySchema=e.PropertySchema;exports.PropertyStoreDataSchema=e.PropertyStoreDataSchema;exports.QueryParamsSchema=e.QueryParamsSchema;exports.ResultsModeEnum=e.ResultsModeEnum;exports.SCHEMA_VERSION=e.SCHEMA_VERSION;exports.SortByEnum=e.SortByEnum;exports.TourContactDataSchema=e.TourContactDataSchema;exports.UnifiedStoreDataSchema=e.UnifiedStoreDataSchema;exports.UnitDataSchema=e.UnitDataSchema;exports.UnitFavoriteSchema=e.UnitFavoriteSchema;exports.UnitSchema=e.UnitSchema;exports.UserPropertyStateSchema=e.UserPropertyStateSchema;exports.UserSchema=e.UserSchema;exports.UserUnitDataSchema=e.UserUnitDataSchema;exports.ViewedUnitSchema=e.ViewedUnitSchema;exports.getDB=m.getDB;exports.resetDB=m.resetDB;exports.defaultIdGenerator=s.defaultIdGenerator;exports.ensureUser=s.ensureUser;exports.getUserUUID=s.getUserUUID;exports.debugDump=S.debugDump;exports.exportJSON=S.exportJSON;exports.createORMStringStorage=a.createORMStringStorage;exports.kvGet=a.kvGet;exports.kvRemove=a.kvRemove;exports.kvSet=a.kvSet;exports.getFavoritedUnitsForProperty=n.getFavoritedUnitsForProperty;exports.isUnitFavorited=n.isUnitFavorited;exports.setFavoriteUnit=n.setFavoriteUnit;exports.toggleFavoriteUnit=n.toggleFavoriteUnit;exports.PropertyStore=d.PropertyStore;exports.propertyStore=d.propertyStore;exports.Store=u.UnifiedStore;exports.UnifiedStore=u.UnifiedStore;exports.store=u.store;exports.createUseUnitState=U.createUseUnitState;exports.createZustandUnifiedStore=U.createZustandUnifiedStore;exports.createStructuredStore=p.createStructuredStore;exports.createStructuredStoreActions=p.createStructuredStoreActions;exports.favorites=h.favorites;exports.DEFAULT_PLACEHOLDER_IMAGE=t.DEFAULT_PLACEHOLDER_IMAGE;exports.DEFAULT_WEB_ORIGIN=t.DEFAULT_WEB_ORIGIN;exports.buildExploreUrl=t.buildExploreUrl;exports.buildImageUrl=t.buildImageUrl;exports.transformUnitsApiResponse=t.transformUnitsApiResponse;exports.transformUnitsApiResponseToClient=t.transformUnitsApiResponseToClient;exports.transformUnitsApiResponseToClientFilters=t.transformUnitsApiResponseToClientFilters;exports.defaultSortParamMap=c.defaultSortParamMap;exports.transformFiltersToPreferences=c.transformFiltersToPreferences;exports.transformFiltersToUnitsSearchParams=c.transformFiltersToUnitsSearchParams;exports.dimensionToMmNumber=o.dimensionToMmNumber;exports.formatDimensions=o.formatDimensions;exports.imperialToMm=o.imperialToMm;exports.inchesToMm=o.inchesToMm;exports.mmToInches=o.mmToInches;exports.toInchesDisplay=o.toInchesDisplay;exports.configureValidation=M.configureValidation;exports.OverviewImagesOnPropertyModel=v.OverviewImagesOnPropertyModel;exports.AmenityImagesOnPropertyModel=g.AmenityImagesOnPropertyModel;exports.FloorPlanModel=E.FloorPlanModel;exports.MediaModel=P.MediaModel;exports.PropertyModel=D.PropertyModel;exports.PropertyHighlightModel=f.PropertyHighlightModel;exports.RoomModel=q.RoomModel;exports.StyleModel=A.StyleModel;exports.UnitModel=F.UnitModel;exports.Currency=r.Currency;exports.DeliveryStatus=r.DeliveryStatus;exports.ExternalService=r.ExternalService;exports.FurnitureAvailability=r.FurnitureAvailability;exports.Highlights=r.Highlights;exports.MediaType=r.MediaType;exports.QueueJobStatus=r.QueueJobStatus;exports.RenderStatus=r.RenderStatus;exports.Status=r.Status;exports.UserRole=r.UserRole;exports.RenderedStyleModel=T.RenderedStyleModel;exports.PropertyAmenityModel=I.PropertyAmenityModel;exports.FavoriteUnitModel=R.FavoriteUnitModel;exports.UserModel=O.UserModel;exports.PropertyLinkModel=b.PropertyLinkModel;exports.AnalyticsProvider=y.AnalyticsProvider;exports.useAnalytics=y.useAnalytics;exports.generateUserUUID=k.generateUserUUID;exports.QuestionEnumValues=i.QuestionEnumValues;exports.QuestionnaireInteractionValues=i.QuestionnaireInteractionValues;exports.SortEnumValues=i.SortEnumValues;exports.buildTrackingEvents=i.buildTrackingEvents;exports.useTrackEvent=i.useTrackEvent;exports.useTrackingEvents=i.useTrackingEvents;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("./errors.cjs"),e=require("./schema.cjs"),m=require("./db.cjs"),s=require("./api/users.cjs"),S=require("./debug.cjs"),a=require("./storage.cjs"),n=require("./api/favorites.cjs"),d=require("./api/properties.cjs"),u=require("./stores/store.cjs"),p=require("./adapters/zustand-store.cjs"),U=require("./adapters/structured-store.cjs"),h=require("./units/favorites.cjs"),t=require("./features/units/transformers.cjs"),c=require("./features/filters/transformers.cjs"),o=require("./utils/dimensions.cjs"),M=require("./validation.cjs"),v=require("./base/overviewimagesonproperty.cjs"),g=require("./base/amenityimagesonproperty.cjs"),E=require("./base/floorplan.cjs"),P=require("./base/media.cjs"),f=require("./base/property.cjs"),D=require("./base/propertyhighlight.cjs"),q=require("./base/room.cjs"),A=require("./base/style.cjs"),F=require("./base/unit.cjs"),r=require("./base/enums.cjs"),T=require("./base/renderedstyle.cjs"),R=require("./base/propertyamenity.cjs"),I=require("./base/favoriteunit.cjs"),O=require("./base/user.cjs"),b=require("./base/propertylink.cjs"),y=require("./features/analytics/AnalyticsProvider.cjs"),i=require("./features/analytics/analytics.cjs");exports.OpenDBError=l.OpenDBError;exports.SchemaMismatchError=l.SchemaMismatchError;exports.ApiUserSchema=e.ApiUserSchema;exports.AppStoreDataSchema=e.AppStoreDataSchema;exports.FavoritesSchema=e.FavoritesSchema;exports.FiltersSchema=e.FiltersSchema;exports.PropertySchema=e.PropertySchema;exports.PropertyStoreDataSchema=e.PropertyStoreDataSchema;exports.QueryParamsSchema=e.QueryParamsSchema;exports.ResultsModeEnum=e.ResultsModeEnum;exports.SCHEMA_VERSION=e.SCHEMA_VERSION;exports.SortByEnum=e.SortByEnum;exports.TourContactDataSchema=e.TourContactDataSchema;exports.UnifiedStoreDataSchema=e.UnifiedStoreDataSchema;exports.UnitDataSchema=e.UnitDataSchema;exports.UnitFavoriteSchema=e.UnitFavoriteSchema;exports.UnitSchema=e.UnitSchema;exports.UserPropertyStateSchema=e.UserPropertyStateSchema;exports.UserSchema=e.UserSchema;exports.UserUnitDataSchema=e.UserUnitDataSchema;exports.ViewedUnitSchema=e.ViewedUnitSchema;exports.getDB=m.getDB;exports.resetDB=m.resetDB;exports.defaultIdGenerator=s.defaultIdGenerator;exports.ensureUser=s.ensureUser;exports.getUserUUID=s.getUserUUID;exports.debugDump=S.debugDump;exports.exportJSON=S.exportJSON;exports.createORMStringStorage=a.createORMStringStorage;exports.kvGet=a.kvGet;exports.kvRemove=a.kvRemove;exports.kvSet=a.kvSet;exports.getFavoritedUnitsForProperty=n.getFavoritedUnitsForProperty;exports.isUnitFavorited=n.isUnitFavorited;exports.setFavoriteUnit=n.setFavoriteUnit;exports.toggleFavoriteUnit=n.toggleFavoriteUnit;exports.PropertyStore=d.PropertyStore;exports.propertyStore=d.propertyStore;exports.Store=u.UnifiedStore;exports.UnifiedStore=u.UnifiedStore;exports.store=u.store;exports.createUseUnitState=p.createUseUnitState;exports.createZustandUnifiedStore=p.createZustandUnifiedStore;exports.createStructuredStore=U.createStructuredStore;exports.createStructuredStoreActions=U.createStructuredStoreActions;exports.favorites=h.favorites;exports.DEFAULT_PLACEHOLDER_IMAGE=t.DEFAULT_PLACEHOLDER_IMAGE;exports.DEFAULT_WEB_ORIGIN=t.DEFAULT_WEB_ORIGIN;exports.buildExploreUrl=t.buildExploreUrl;exports.buildImageUrl=t.buildImageUrl;exports.transformUnitsApiResponse=t.transformUnitsApiResponse;exports.transformUnitsApiResponseToClient=t.transformUnitsApiResponseToClient;exports.transformUnitsApiResponseToClientFilters=t.transformUnitsApiResponseToClientFilters;exports.defaultSortParamMap=c.defaultSortParamMap;exports.transformFiltersToPreferences=c.transformFiltersToPreferences;exports.transformFiltersToUnitsSearchParams=c.transformFiltersToUnitsSearchParams;exports.dimensionToMmNumber=o.dimensionToMmNumber;exports.formatDimensions=o.formatDimensions;exports.imperialToMm=o.imperialToMm;exports.inchesToMm=o.inchesToMm;exports.mmToInches=o.mmToInches;exports.toInchesDisplay=o.toInchesDisplay;exports.configureValidation=M.configureValidation;exports.OverviewImagesOnPropertyModel=v.OverviewImagesOnPropertyModel;exports.AmenityImagesOnPropertyModel=g.AmenityImagesOnPropertyModel;exports.FloorPlanModel=E.FloorPlanModel;exports.MediaModel=P.MediaModel;exports.PropertyModel=f.PropertyModel;exports.PropertyHighlightModel=D.PropertyHighlightModel;exports.RoomModel=q.RoomModel;exports.StyleModel=A.StyleModel;exports.UnitModel=F.UnitModel;exports.Currency=r.Currency;exports.DeliveryStatus=r.DeliveryStatus;exports.ExternalService=r.ExternalService;exports.FurnitureAvailability=r.FurnitureAvailability;exports.Highlights=r.Highlights;exports.MediaType=r.MediaType;exports.QueueJobStatus=r.QueueJobStatus;exports.RenderStatus=r.RenderStatus;exports.Status=r.Status;exports.UserRole=r.UserRole;exports.RenderedStyleModel=T.RenderedStyleModel;exports.PropertyAmenityModel=R.PropertyAmenityModel;exports.FavoriteUnitModel=I.FavoriteUnitModel;exports.UserModel=O.UserModel;exports.PropertyLinkModel=b.PropertyLinkModel;exports.AnalyticsProvider=y.AnalyticsProvider;exports.useAnalytics=y.useAnalytics;exports.QuestionEnumValues=i.QuestionEnumValues;exports.QuestionnaireInteractionValues=i.QuestionnaireInteractionValues;exports.SortEnumValues=i.SortEnumValues;exports.buildTrackingEvents=i.buildTrackingEvents;exports.useTrackEvent=i.useTrackEvent;exports.useTrackingEvents=i.useTrackingEvents;
2
2
  //# sourceMappingURL=index.cjs.map