@roomstay/frontend 2.6.108 → 2.6.110
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/836.bundle.js +1 -1
- package/dist/978.bundle.js +1 -1
- package/dist/main.bundle.js +1 -1
- package/dist/src/components/steps/addons/AddonCard.js +3 -0
- package/dist/src/components/steps/addons/AddonCard.js.map +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js +1 -1
- package/dist/src/contexts/CompanyContext/CompanyContextWrapper.js.map +1 -1
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js +7 -2
- package/dist/src/contexts/ConfirmationStepContext/ConfirmationStepContextWrapper.js.map +1 -1
- package/dist/src/events/actions/AddAddonToCartEvent.d.ts +7 -0
- package/dist/src/events/actions/AddAddonToCartEvent.js +15 -0
- package/dist/src/events/actions/AddAddonToCartEvent.js.map +1 -0
- package/dist/src/events/index.d.ts +1 -0
- package/dist/src/events/index.js +1 -0
- package/dist/src/events/index.js.map +1 -1
- package/dist/src/events/views/CommittedBookingEvent.d.ts +3 -1
- package/dist/src/events/views/CommittedBookingEvent.js +2 -1
- package/dist/src/events/views/CommittedBookingEvent.js.map +1 -1
- package/dist/src/events/views/StepCheckoutViewEvent.d.ts +3 -1
- package/dist/src/events/views/StepCheckoutViewEvent.js +2 -1
- package/dist/src/events/views/StepCheckoutViewEvent.js.map +1 -1
- package/dist/src/models/Confirmation.d.ts +1 -0
- package/dist/src/models/Confirmation.js.map +1 -1
- package/dist/src/models/Room/Room.d.ts +1 -0
- package/dist/src/models/Room/Room.js +3 -0
- package/dist/src/models/Room/Room.js.map +1 -1
- package/dist/src/models/Room/RoomRate.d.ts +1 -0
- package/dist/src/models/Room/RoomRate.js +3 -0
- package/dist/src/models/Room/RoomRate.js.map +1 -1
- package/dist/src/models/Room/RoomRateSortable.d.ts +1 -0
- package/dist/src/models/Room/RoomRateSortable.js.map +1 -1
- package/dist/src/models/RoomstaySession.d.ts +1 -0
- package/dist/src/models/RoomstaySession.js.map +1 -1
- package/dist/src/pages/steps/StepConfirmation/StepConfirmationComponent.js +2 -2
- package/dist/src/pages/steps/StepConfirmation/StepConfirmationComponent.js.map +1 -1
- package/dist/src/providers/RoomSortProvider.js +15 -3
- package/dist/src/providers/RoomSortProvider.js.map +1 -1
- package/dist/src/providers/feature/AnalyticsEventsFeature.js +1 -0
- package/dist/src/providers/feature/AnalyticsEventsFeature.js.map +1 -1
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.d.ts +9 -3
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js +51 -12
- package/dist/src/util/AnalyticsEvents/AnalyticsEvents.js.map +1 -1
- package/dist/src/util/AnalyticsEvents/helpers.d.ts +12 -3
- package/dist/src/util/AnalyticsEvents/helpers.js +27 -3
- package/dist/src/util/AnalyticsEvents/helpers.js.map +1 -1
- package/dist/test.bundle.js +1 -1
- package/dist/vendors.bundle.js +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsEvents.js","sourceRoot":"/","sources":["src/util/AnalyticsEvents/AnalyticsEvents.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;AAEH,yCAUwB;AAExB,iEAA8D;AAC9D,oEAAiE;AACjE,yFAAiE;AACjE,gFAA6E;AAC7E,gFAA6E;AAG7E,uCAA2H;AAyB3H;;GAEG;AACH,SAAS,cAAc,CAAC,GAAY;IAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,OAAO,GAAG,GAA8B,CAAC;IAC/C,OAAO,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;AACzK,CAAC;AAED,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AACxD,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAExD;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IAClC,OAAO,GAAG,kBAAkB,IAAI,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY;IACjB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,SAAiB,EAAE,OAAe,EAAE,UAA2B;IACnF,MAAM,oBAAoB,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,OAAQ,MAAc,CAAC,GAAG,KAAK,UAAU,CAAC;IACxG,IAAI,CAAC,oBAAoB;QAAE,OAAO;IAElC,IAAI,CAAC;QACA,MAAc,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;AACL,CAAC;AAED,MAAM,eAAe;IAArB;QACY,YAAO,GAA4B,IAAI,CAAC;QACxC,WAAM,GAA0B,EAAE,CAAC;QACnC,gBAAW,GAAG,KAAK,CAAC;QACpB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,iBAAY,GAA4B,IAAI,CAAC;IAwTzD,CAAC;IAtTG;;OAEG;IACI,UAAU,CAAC,MAA8B;;QAC5C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAE3B,kCAAkC;QAClC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAA,wBAAc,GAAE,CAAC;QAEjC,+DAA+D;QAC/D,MAAM,eAAe,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,mCAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,eAAe,CAAC;QAChF,MAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,mCAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ,CAAC;QAEnE,4CAA4C;QAC5C,IAAI,CAAC,eAAe,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,mCACL,eAAe,KAClB,GAAG,EAAE,MAAA,OAAO,CAAC,GAAG,mCAAI,eAAe,CAAC,GAAG,EACvC,GAAG,EAAE,MAAA,OAAO,CAAC,GAAG,mCAAI,eAAe,CAAC,GAAG,EACvC,eAAe;gBACf,QAAQ,GACX,CAAC;YACF,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,OAAO,GAAG;gBACX,SAAS,EAAE,YAAY,EAAE;gBACzB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,eAAe;gBACf,QAAQ;aACX,CAAC;YAEF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACW,mBAAmB;;YAC7B,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAEhC,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,uCAAkB,CAAC,aAAa,CAAC;oBACpD,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;oBACjC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;oBAC7C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;oBACrB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;iBACxB,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACrF,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAC1D,OAAO,IAAI,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;gBACzE,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;KAAA;IAED;;OAEG;IACK,sBAAsB;QAC1B,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QAErC,sBAAsB;QACtB,8BAAoB,CAAC,QAAQ,CACzB,6CAAqB,EACrB,CAAO,KAA4B,EAAE,EAAE;YACnC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC,CAAA,EACD,2BAA2B,CAC9B,CAAC;QAEF,mBAAmB;QACnB,8BAAoB,CAAC,QAAQ,CACzB,+BAAc,EACd,CAAO,KAAqB,EAAE,EAAE;YAC5B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC,CAAA,EACD,8BAA8B,CACjC,CAAC;QAEF,0BAA0B;QAC1B,8BAAoB,CAAC,QAAQ,CACzB,6CAAqB,EACrB,CAAO,KAA4B,EAAE,EAAE;YACnC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5D,CAAC,CAAA,EACD,2BAA2B,CAC9B,CAAC;QAEF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,UAAuB;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAA,6BAAmB,EAAC,UAAU,CAAC,CAAC;QAE9C,sCAAsC;QACtC,MAAM,SAAS,GAAmC;YAC9C,KAAK;YACL,QAAQ;YACR,UAAU,EAAE,IAAA,6BAAmB,EAAC,KAAK,CAAC;SACzC,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,yBAAkB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEpF,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAA,+BAAwB,EAAC,SAAS,CAAC,CAAC;YAC1D,cAAc,CAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,SAAoB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAE7B,sCAAsC;QACtC,MAAM,SAAS,GAAgC;YAC3C,IAAI,EAAE,IAAA,4BAAkB,EAAC,SAAS,CAAC;YACnC,QAAQ;SACX,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,yBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEjF,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAA,+BAAwB,EAAC,SAAS,CAAC,CAAC;YAC1D,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,WAA4B,EAAE,UAAuB;QACtE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAA,6BAAmB,EAAC,UAAU,CAAC,CAAC;QAE9C,+DAA+D;QAC/D,MAAM,SAAS,GAAuC;YAClD,KAAK;YACL,QAAQ;YACR,UAAU,EAAE,IAAA,6BAAmB,EAAC,KAAK,CAAC;YACtC,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,kBAAkB,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;YAC5E,KAAK,kCACE,IAAA,0BAAgB,EAAC,WAAW,CAAC,KAChC,UAAU,EAAE,OAAO,CAAC,UAAU,GACjC;SACJ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,yBAAkB,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAExF,wCAAwC;QACxC,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9B,MAAM,aAAa,GAAG,IAAA,+BAAwB,EAAC,SAAS,CAAC,CAAC;YAC1D,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,UAAkB;QACnC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC;YACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEO,kBAAkB,CAAC,SAA6B,EAAE,SAA6B;;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,OAAO;YACH,OAAO,EAAE,YAAY,EAAE;YACvB,SAAS,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,EAAE;YACnC,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,eAAe,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,mCAAI,EAAE;YAC/C,GAAG,EAAE,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,KAAI,SAAS;YAC9B,GAAG,EAAE,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,KAAI,SAAS;YAC9B,SAAS;SACZ,CAAC;IACN,CAAC;IAEa,SAAS,CAAC,SAAiC;;YACrD,IAAI,CAAC;gBACD,iEAAiE;gBACjE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrB,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;oBAChF,OAAO;gBACX,CAAC;gBAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC;gBAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;oBAClB,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;oBACjF,OAAO;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,uCAAkB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC/D,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACvE,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YACpE,CAAC;QACL,CAAC;KAAA;IAEO,WAAW;QACf,IAAI,OAAO,YAAY,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,eAAe,EAAE,CAAC;oBAC9E,OAAO,OAAO,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,WAAW;QACf,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QACjE,IAAI,CAAC;YACD,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACpG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAEO,GAAG,CAAC,GAAG,IAAW;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;CACJ;AAED,kBAAe,IAAI,eAAe,EAAE,CAAC","sourcesContent":["/**\n * Analytics Events Utility\n */\n\nimport {\n ERoomstayEventName,\n IAnalyticsEventRequest,\n IMetaEventData,\n IRoomstayBasketAddEventData,\n IRoomstayBookingCommittedEventData,\n IRoomstayCheckoutViewEventData,\n IRoomstayEventData,\n ReservationsDTO,\n transformToMetaEventData,\n} from '@roomstay/core';\n\nimport { analyticsEventsAPI } from '@/api/AnalyticsEventsAPI';\nimport { AddToCartEvent } from '@/events/actions/AddToCartEvent';\nimport RoomstayEventManager from '@/events/RoomstayEventManager';\nimport { CommittedBookingEvent } from '@/events/views/CommittedBookingEvent';\nimport { StepCheckoutViewEvent } from '@/events/views/StepCheckoutViewEvent';\nimport BasketRow from '@/models/BasketRow';\n\nimport { calculateTotalValue, extractGuestData, getMetaCookies, serializeBasketRow, serializeBasketRows } from './helpers';\n\n/**\n * Configuration for AnalyticsEvents\n */\nexport interface AnalyticsEventsConfig {\n hotelId?: string;\n currency?: string;\n firePixelEvents?: boolean;\n debug?: boolean;\n}\n\n/**\n * Analytics session data\n */\ninterface AnalyticsSession {\n sessionId: string;\n fbc?: string;\n fbp?: string;\n createdAt: number;\n hotelFrontendId: string;\n currency: string;\n externalId?: string;\n}\n\n/**\n * Validate session from storage\n */\nfunction isValidSession(obj: unknown): obj is AnalyticsSession {\n if (!obj || typeof obj !== 'object') return false;\n const session = obj as Record<string, unknown>;\n return typeof session.sessionId === 'string' && typeof session.createdAt === 'number' && typeof session.hotelId === 'string' && typeof session.currency === 'string';\n}\n\nconst STORAGE_KEY_PREFIX = 'roomstay-analytics-session';\nconst SESSION_MAX_AGE = 12 * 60 * 60 * 1000; // 12 hours\n\n/**\n * Get storage key for a specific hotel's session\n */\nfunction getStorageKey(hotelId: string): string {\n return `${STORAGE_KEY_PREFIX}-${hotelId}`;\n}\n\nfunction generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Fire a Meta Pixel event with Event ID for deduplication\n */\nfunction firePixelEvent(eventName: string, eventId: string, customData?: IMetaEventData): void {\n const metaPixelIsAvailable = typeof window !== 'undefined' && typeof (window as any).fbq === 'function';\n if (!metaPixelIsAvailable) return;\n\n try {\n (window as any).fbq('track', eventName, customData, { eventID: eventId });\n } catch (error) {\n console.error('[AnalyticsEvents] Error firing pixel event:', error);\n }\n}\n\nclass AnalyticsEvents {\n private session: AnalyticsSession | null = null;\n private config: AnalyticsEventsConfig = {};\n private initialized = false;\n private listenersRegistered = false;\n private sessionReady: Promise<boolean> | null = null;\n\n /**\n * Initialize analytics with configuration\n */\n public initialize(config?: AnalyticsEventsConfig): void {\n if (this.initialized) {\n return;\n }\n\n this.config = config || {};\n\n // Try to restore existing session\n const existingSession = this.loadSession();\n const cookies = getMetaCookies();\n\n // Resolve hotelId and currency from config or existing session\n const hotelFrontendId = this.config.hotelId ?? existingSession?.hotelFrontendId;\n const currency = this.config.currency ?? existingSession?.currency;\n\n // Cannot initialize without required fields\n if (!hotelFrontendId || !currency) {\n this.log('Cannot initialize: hotelId and currency are required');\n return;\n }\n\n if (existingSession) {\n this.session = {\n ...existingSession,\n fbc: cookies.fbc ?? existingSession.fbc,\n fbp: cookies.fbp ?? existingSession.fbp,\n hotelFrontendId,\n currency,\n };\n this.sessionReady = Promise.resolve(true);\n this.log('Session restored:', this.session.sessionId);\n } else {\n this.session = {\n sessionId: generateUUID(),\n fbc: cookies.fbc,\n fbp: cookies.fbp,\n createdAt: Date.now(),\n hotelFrontendId,\n currency,\n };\n\n this.sessionReady = this.createServerSession();\n }\n\n this.saveSession();\n this.initialized = true;\n this.registerEventListeners();\n\n this.log('Session initialized:', this.session.sessionId);\n }\n\n /**\n * Create session on the server\n */\n private async createServerSession(): Promise<boolean> {\n if (!this.session) return false;\n\n try {\n const response = await analyticsEventsAPI.createSession({\n sessionId: this.session.sessionId,\n hotelFrontendId: this.session.hotelFrontendId,\n fbc: this.session.fbc,\n fbp: this.session.fbp,\n });\n\n if (!response.success) {\n console.warn('[AnalyticsEvents] Failed to create server session:', response.message);\n return false;\n }\n\n this.log('Server session ready:', this.session.sessionId);\n return true;\n } catch (error) {\n console.error('[AnalyticsEvents] Error creating server session:', error);\n return false;\n }\n }\n\n /**\n * Register listeners for Roomstay events\n */\n private registerEventListeners(): void {\n if (this.listenersRegistered) return;\n\n // View/Checkout event\n RoomstayEventManager.addEvent(\n StepCheckoutViewEvent,\n async (event: StepCheckoutViewEvent) => {\n this.trackInitiateCheckout(event.basketRows);\n },\n 'analytics-events-checkout'\n );\n\n // Basket/Add event\n RoomstayEventManager.addEvent(\n AddToCartEvent,\n async (event: AddToCartEvent) => {\n this.trackAddToCart(event.basketRow);\n },\n 'analytics-events-add-to-cart'\n );\n\n // Booking/Committed event\n RoomstayEventManager.addEvent(\n CommittedBookingEvent,\n async (event: CommittedBookingEvent) => {\n this.trackPurchase(event.reservation, event.basketRows);\n },\n 'analytics-events-purchase'\n );\n\n this.listenersRegistered = true;\n this.log('Event listeners registered');\n }\n\n /**\n * Track View/Checkout event\n */\n public trackInitiateCheckout(basketRows: BasketRow[]): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n const items = serializeBasketRows(basketRows);\n\n // Build event data in Roomstay format\n const eventData: IRoomstayCheckoutViewEventData = {\n items,\n currency,\n totalValue: calculateTotalValue(items),\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.ViewCheckout, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('InitiateCheckout', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('View/Checkout tracked:', payload);\n }\n\n /**\n * Track Basket/Add event\n */\n public trackAddToCart(basketRow: BasketRow): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n\n // Build event data in Roomstay format\n const eventData: IRoomstayBasketAddEventData = {\n item: serializeBasketRow(basketRow),\n currency,\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.BasketAdd, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('AddToCart', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('Basket/Add tracked:', payload);\n }\n\n /**\n * Track Booking/Committed event\n */\n public trackPurchase(reservation: ReservationsDTO, basketRows: BasketRow[]): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n const items = serializeBasketRows(basketRows);\n\n // Build event data in Roomstay format with embedded guest data\n const eventData: IRoomstayBookingCommittedEventData = {\n items,\n currency,\n totalValue: calculateTotalValue(items),\n roomstayId: reservation.roomstayId,\n itineraryNumber: reservation.itineraryNumber,\n reservationNumbers: reservation.reservations.map((r) => r.reservationNumber),\n guest: {\n ...extractGuestData(reservation),\n externalId: session.externalId,\n },\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.BookingCommitted, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('Purchase', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('Booking/Committed tracked:', payload);\n }\n\n /**\n * Set external user ID (e.g. member portal ID)\n */\n public setExternalId(externalId: string): void {\n if (this.session) {\n this.log('Setting external ID:', externalId);\n this.session.externalId = externalId;\n this.saveSession();\n }\n }\n\n /**\n * Ensure session is initialized and has required fields for tracking.\n * Returns the session if tracking can proceed, null otherwise.\n */\n private getValidatedSession(): AnalyticsSession | null {\n if (!this.initialized) {\n this.initialize(this.config);\n }\n\n if (!this.session) {\n console.warn('[AnalyticsEvents] Cannot track: session not initialized');\n return null;\n }\n\n return this.session;\n }\n\n private createEventPayload(eventName: ERoomstayEventName, eventData: IRoomstayEventData): IAnalyticsEventRequest {\n const session = this.session;\n return {\n eventId: generateUUID(),\n sessionId: session?.sessionId ?? '',\n eventName,\n eventTime: Math.floor(Date.now() / 1000),\n hotelFrontendId: session?.hotelFrontendId ?? '',\n fbc: session?.fbc || undefined,\n fbp: session?.fbp || undefined,\n eventData,\n };\n }\n\n private async sendEvent(eventData: IAnalyticsEventRequest): Promise<void> {\n try {\n // Wait for session to be created on server before sending events\n if (!this.sessionReady) {\n console.warn('[AnalyticsEvents] Skipping event - sessionReady not initialized');\n return;\n }\n\n const sessionCreated = await this.sessionReady;\n if (!sessionCreated) {\n console.warn('[AnalyticsEvents] Skipping event - session not created on server');\n return;\n }\n\n const response = await analyticsEventsAPI.sendEvent(eventData);\n if (!response.success) {\n console.warn('[AnalyticsEvents] Backend error:', response.message);\n }\n } catch (error) {\n console.error('[AnalyticsEvents] Failed to send event:', error);\n }\n }\n\n private loadSession(): AnalyticsSession | null {\n if (typeof localStorage === 'undefined') return null;\n\n const hotelId = this.config.hotelId;\n if (!hotelId) return null;\n\n try {\n const stored = localStorage.getItem(getStorageKey(hotelId));\n if (stored) {\n const session: unknown = JSON.parse(stored);\n if (isValidSession(session) && Date.now() - session.createdAt < SESSION_MAX_AGE) {\n return session;\n }\n }\n } catch (e) {\n this.log('Failed to load session:', e);\n }\n\n return null;\n }\n\n private saveSession(): void {\n if (typeof localStorage === 'undefined' || !this.session) return;\n try {\n localStorage.setItem(getStorageKey(this.session.hotelFrontendId), JSON.stringify(this.session));\n } catch (e) {\n this.log('Failed to save session:', e);\n }\n }\n\n private log(...args: any[]): void {\n if (this.config.debug) {\n console.log('[AnalyticsEvents]', ...args);\n }\n }\n}\n\nexport default new AnalyticsEvents();\n"]}
|
|
1
|
+
{"version":3,"file":"AnalyticsEvents.js","sourceRoot":"/","sources":["src/util/AnalyticsEvents/AnalyticsEvents.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Events Utility\n */\n\nimport {\n ERoomstayEventName,\n IAnalyticsEventRequest,\n IMetaEventData,\n IMetaUserData,\n IRoomstayAddonAddEventData,\n IRoomstayBasketAddEventData,\n IRoomstayBookingCommittedEventData,\n IRoomstayCheckoutViewEventData,\n IRoomstayEventData,\n ReservationsDTO,\n transformToMetaEventData,\n transformToMetaUserData,\n} from '@roomstay/core';\n\nimport { analyticsEventsAPI } from '@/api/AnalyticsEventsAPI';\nimport { AddAddonToCartEvent } from '@/events/actions/AddAddonToCartEvent';\nimport { AddToCartEvent } from '@/events/actions/AddToCartEvent';\nimport RoomstayEventManager from '@/events/RoomstayEventManager';\nimport { CommittedBookingEvent } from '@/events/views/CommittedBookingEvent';\nimport { StepCheckoutViewEvent } from '@/events/views/StepCheckoutViewEvent';\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\n\nimport { calculateTotalValue, extractGuestData, getMetaCookies, serializeBasketAddonRow, serializeBasketAddonRows, serializeBasketRow, serializeBasketRows } from './helpers';\n\n/**\n * Configuration for AnalyticsEvents\n */\nexport interface AnalyticsEventsConfig {\n hotelId?: string;\n currency?: string;\n metaPixelId?: string;\n firePixelEvents?: boolean;\n debug?: boolean;\n}\n\n/**\n * Analytics session data\n */\ninterface AnalyticsSession {\n sessionId: string;\n fbc?: string;\n fbp?: string;\n createdAt: number;\n hotelFrontendId: string;\n currency: string;\n externalId?: string;\n}\n\n/**\n * Validate session from storage\n */\nfunction isValidSession(obj: unknown): obj is AnalyticsSession {\n if (!obj || typeof obj !== 'object') return false;\n const session = obj as Record<string, unknown>;\n return typeof session.sessionId === 'string' && typeof session.createdAt === 'number' && typeof session.hotelFrontendId === 'string' && typeof session.currency === 'string';\n}\n\nconst STORAGE_KEY_PREFIX = 'roomstay-analytics-session';\nconst SESSION_MAX_AGE = 12 * 60 * 60 * 1000; // 12 hours\n\n/**\n * Get storage key for a specific hotel's session\n */\nfunction getStorageKey(hotelId: string): string {\n return `${STORAGE_KEY_PREFIX}-${hotelId}`;\n}\n\nfunction generateUUID(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Fire a Meta Pixel event with Event ID for deduplication\n */\nfunction firePixelEvent(eventName: string, eventId: string, customData?: IMetaEventData, userData?: IMetaUserData, pixelId?: string): void {\n const metaPixelIsAvailable = typeof window !== 'undefined' && typeof (window as any).fbq === 'function';\n if (!metaPixelIsAvailable) return;\n\n try {\n // Re-init with user data before firing the event. I can't find any other way of achieving this.\n // Meta seems to assume you already have all the user data when the pixel is initially loaded,\n // I guess this is more of an issue with SPA apps.\n if (userData && pixelId) {\n (window as any).fbq('init', pixelId, userData);\n }\n\n (window as any).fbq('track', eventName, customData, { eventID: eventId });\n } catch (error) {\n console.error('[AnalyticsEvents] Error firing pixel event:', error);\n }\n}\n\nclass AnalyticsEvents {\n private session: AnalyticsSession | null = null;\n private config: AnalyticsEventsConfig = {};\n private initialized = false;\n private listenersRegistered = false;\n private sessionReady: Promise<boolean> | null = null;\n\n /**\n * Initialize analytics with configuration\n */\n public initialize(config?: AnalyticsEventsConfig): void {\n if (this.initialized) {\n return;\n }\n\n this.config = config || {};\n\n // Try to restore existing session\n const existingSession = this.loadSession();\n const cookies = getMetaCookies();\n\n // Resolve hotelId and currency from config or existing session\n const hotelFrontendId = this.config.hotelId ?? existingSession?.hotelFrontendId;\n const currency = this.config.currency ?? existingSession?.currency;\n\n // Cannot initialize without required fields\n if (!hotelFrontendId || !currency) {\n this.log('Cannot initialize: hotelId and currency are required');\n return;\n }\n\n if (existingSession) {\n this.session = {\n ...existingSession,\n fbc: cookies.fbc ?? existingSession.fbc,\n fbp: cookies.fbp ?? existingSession.fbp,\n hotelFrontendId,\n currency,\n };\n this.sessionReady = Promise.resolve(true);\n this.log('Session restored:', this.session.sessionId);\n } else {\n this.session = {\n sessionId: generateUUID(),\n fbc: cookies.fbc,\n fbp: cookies.fbp,\n createdAt: Date.now(),\n hotelFrontendId,\n currency,\n };\n\n this.sessionReady = this.createServerSession();\n }\n\n this.saveSession();\n this.initialized = true;\n this.registerEventListeners();\n\n this.log('Session initialized:', this.session.sessionId);\n }\n\n /**\n * Create session on the server\n */\n private async createServerSession(): Promise<boolean> {\n if (!this.session) return false;\n\n try {\n const response = await analyticsEventsAPI.createSession({\n sessionId: this.session.sessionId,\n hotelFrontendId: this.session.hotelFrontendId,\n fbc: this.session.fbc,\n fbp: this.session.fbp,\n });\n\n if (!response.success) {\n console.warn('[AnalyticsEvents] Failed to create server session:', response.message);\n return false;\n }\n\n this.log('Server session ready:', this.session.sessionId);\n return true;\n } catch (error) {\n console.error('[AnalyticsEvents] Error creating server session:', error);\n return false;\n }\n }\n\n /**\n * Register listeners for Roomstay events\n */\n private registerEventListeners(): void {\n if (this.listenersRegistered) return;\n\n // View/Checkout event\n RoomstayEventManager.addEvent(\n StepCheckoutViewEvent,\n async (event: StepCheckoutViewEvent) => {\n this.trackInitiateCheckout(event.basketRows, event.basketAddonRows);\n },\n 'analytics-events-checkout'\n );\n\n // Basket/Add event (room)\n RoomstayEventManager.addEvent(\n AddToCartEvent,\n async (event: AddToCartEvent) => {\n this.trackAddToCart(event.basketRow);\n },\n 'analytics-events-add-to-cart'\n );\n\n // Basket/AddAddon event (addon)\n RoomstayEventManager.addEvent(\n AddAddonToCartEvent,\n async (event: AddAddonToCartEvent) => {\n this.trackAddonAddToCart(event.basketAddonRow);\n },\n 'analytics-events-add-addon'\n );\n\n // Booking/Committed event\n RoomstayEventManager.addEvent(\n CommittedBookingEvent,\n async (event: CommittedBookingEvent) => {\n this.trackPurchase(event.reservation, event.basketRows, event.basketAddonRows);\n },\n 'analytics-events-purchase'\n );\n\n this.listenersRegistered = true;\n this.log('Event listeners registered');\n }\n\n /**\n * Track View/Checkout event\n */\n public trackInitiateCheckout(basketRows: BasketRow[], addonRows?: BasketAddonRow[]): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n const items = serializeBasketRows(basketRows);\n const addons = addonRows?.length ? serializeBasketAddonRows(addonRows) : undefined;\n\n // Build event data in Roomstay format\n const eventData: IRoomstayCheckoutViewEventData = {\n items,\n addons,\n currency,\n totalValue: calculateTotalValue(items, addons),\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.ViewCheckout, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('InitiateCheckout', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('View/Checkout tracked:', payload);\n }\n\n /**\n * Track Basket/Add event (room)\n */\n public trackAddToCart(basketRow: BasketRow): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n\n // Build event data in Roomstay format\n const eventData: IRoomstayBasketAddEventData = {\n item: serializeBasketRow(basketRow),\n currency,\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.BasketAdd, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('AddToCart', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('Basket/Add tracked:', payload);\n }\n\n /**\n * Track Basket/AddAddon event (addon)\n */\n public trackAddonAddToCart(addonRow: BasketAddonRow): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n\n // Build event data in Roomstay format\n const eventData: IRoomstayAddonAddEventData = {\n addon: serializeBasketAddonRow(addonRow),\n currency,\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.BasketAddAddon, eventData);\n\n // Fire Meta Pixel with transformed data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n firePixelEvent('AddToCart', payload.eventId, metaEventData);\n }\n\n this.sendEvent(payload);\n this.log('Basket/AddAddon tracked:', payload);\n }\n\n /**\n * Track Booking/Committed event\n */\n public trackPurchase(reservation: ReservationsDTO, basketRows: BasketRow[], addonRows?: BasketAddonRow[]): void {\n const session = this.getValidatedSession();\n if (!session) return;\n\n const { currency } = session;\n const items = serializeBasketRows(basketRows);\n const addons = addonRows?.length ? serializeBasketAddonRows(addonRows) : undefined;\n\n // Build event data in Roomstay format with embedded guest data\n const eventData: IRoomstayBookingCommittedEventData = {\n items,\n addons,\n currency,\n totalValue: calculateTotalValue(items, addons),\n roomstayId: reservation.roomstayId,\n itineraryNumber: reservation.itineraryNumber,\n reservationNumbers: reservation.reservations.map((r) => r.reservationNumber),\n guest: {\n ...extractGuestData(reservation),\n externalId: session.externalId,\n },\n };\n\n const payload = this.createEventPayload(ERoomstayEventName.BookingCommitted, eventData);\n\n // Fire Meta Pixel with transformed event data and user data\n if (this.config.firePixelEvents) {\n const metaEventData = transformToMetaEventData(eventData);\n const metaUserData = transformToMetaUserData(eventData.guest);\n firePixelEvent('Purchase', payload.eventId, metaEventData, metaUserData, this.config.metaPixelId);\n }\n\n this.sendEvent(payload);\n this.log('Booking/Committed tracked:', payload);\n }\n\n /**\n * Set external user ID (e.g. member portal ID)\n */\n public setExternalId(externalId: string): void {\n if (this.session) {\n this.log('Setting external ID:', externalId);\n this.session.externalId = externalId;\n this.saveSession();\n }\n }\n\n /**\n * Ensure session is initialized and has required fields for tracking.\n * Returns the session if tracking can proceed, null otherwise.\n */\n private getValidatedSession(): AnalyticsSession | null {\n if (!this.initialized) {\n this.initialize(this.config);\n }\n\n if (!this.session) {\n console.warn('[AnalyticsEvents] Cannot track: session not initialized');\n return null;\n }\n\n return this.session;\n }\n\n private createEventPayload(eventName: ERoomstayEventName, eventData: IRoomstayEventData): IAnalyticsEventRequest {\n const session = this.session;\n return {\n eventId: generateUUID(),\n sessionId: session?.sessionId ?? '',\n eventName,\n eventTime: Math.floor(Date.now() / 1000),\n hotelFrontendId: session?.hotelFrontendId ?? '',\n fbc: session?.fbc || undefined,\n fbp: session?.fbp || undefined,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n eventData,\n };\n }\n\n private async sendEvent(eventData: IAnalyticsEventRequest): Promise<void> {\n try {\n // Wait for session to be created on server before sending events\n if (!this.sessionReady) {\n console.warn('[AnalyticsEvents] Skipping event - sessionReady not initialized');\n return;\n }\n\n const sessionCreated = await this.sessionReady;\n if (!sessionCreated) {\n console.warn('[AnalyticsEvents] Skipping event - session not created on server');\n return;\n }\n\n const response = await analyticsEventsAPI.sendEvent(eventData);\n if (!response.success) {\n console.warn('[AnalyticsEvents] Backend error:', response.message);\n }\n } catch (error) {\n console.error('[AnalyticsEvents] Failed to send event:', error);\n }\n }\n\n private loadSession(): AnalyticsSession | null {\n if (typeof localStorage === 'undefined') return null;\n\n const hotelId = this.config.hotelId;\n if (!hotelId) return null;\n\n try {\n const stored = localStorage.getItem(getStorageKey(hotelId));\n if (stored) {\n const session: unknown = JSON.parse(stored);\n if (isValidSession(session) && Date.now() - session.createdAt < SESSION_MAX_AGE) {\n return session;\n }\n }\n } catch (e) {\n this.log('Failed to load session:', e);\n }\n\n return null;\n }\n\n private saveSession(): void {\n if (typeof localStorage === 'undefined' || !this.session) return;\n try {\n localStorage.setItem(getStorageKey(this.session.hotelFrontendId), JSON.stringify(this.session));\n } catch (e) {\n this.log('Failed to save session:', e);\n }\n }\n\n private log(...args: any[]): void {\n if (this.config.debug) {\n console.log('[AnalyticsEvents]', ...args);\n }\n }\n}\n\nexport default new AnalyticsEvents();\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Analytics Events Helpers
|
|
3
3
|
*/
|
|
4
|
-
import { IRoomstayBasketItem, IRoomstayGuestData, ReservationsDTO } from '@roomstay/core';
|
|
4
|
+
import { IRoomstayBasketAddonItem, IRoomstayBasketItem, IRoomstayGuestData, ReservationsDTO } from '@roomstay/core';
|
|
5
|
+
import BasketAddonRow from '../../models/BasketAddonRow';
|
|
5
6
|
import BasketRow from '../../models/BasketRow';
|
|
6
7
|
/**
|
|
7
8
|
* Get Meta cookies for tracking
|
|
@@ -20,11 +21,19 @@ export declare function serializeBasketRow(basketRow: BasketRow): IRoomstayBaske
|
|
|
20
21
|
* Serialize multiple BasketRows
|
|
21
22
|
*/
|
|
22
23
|
export declare function serializeBasketRows(basketRows: BasketRow[]): IRoomstayBasketItem[];
|
|
24
|
+
/**
|
|
25
|
+
* Serialize a BasketAddonRow to IRoomstayBasketAddonItem for analytics events.
|
|
26
|
+
*/
|
|
27
|
+
export declare function serializeBasketAddonRow(addonRow: BasketAddonRow): IRoomstayBasketAddonItem;
|
|
28
|
+
/**
|
|
29
|
+
* Serialize multiple BasketAddonRows
|
|
30
|
+
*/
|
|
31
|
+
export declare function serializeBasketAddonRows(addonRows: BasketAddonRow[]): IRoomstayBasketAddonItem[];
|
|
23
32
|
/**
|
|
24
33
|
* Extract guest data from a ReservationsDTO
|
|
25
34
|
*/
|
|
26
35
|
export declare function extractGuestData(reservation: ReservationsDTO): IRoomstayGuestData;
|
|
27
36
|
/**
|
|
28
|
-
* Calculate total value from basket items
|
|
37
|
+
* Calculate total value from basket items and addons
|
|
29
38
|
*/
|
|
30
|
-
export declare function calculateTotalValue(items: IRoomstayBasketItem[]): number;
|
|
39
|
+
export declare function calculateTotalValue(items: IRoomstayBasketItem[], addons?: IRoomstayBasketAddonItem[]): number;
|
|
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.getMetaCookies = getMetaCookies;
|
|
7
7
|
exports.serializeBasketRow = serializeBasketRow;
|
|
8
8
|
exports.serializeBasketRows = serializeBasketRows;
|
|
9
|
+
exports.serializeBasketAddonRow = serializeBasketAddonRow;
|
|
10
|
+
exports.serializeBasketAddonRows = serializeBasketAddonRows;
|
|
9
11
|
exports.extractGuestData = extractGuestData;
|
|
10
12
|
exports.calculateTotalValue = calculateTotalValue;
|
|
11
13
|
/**
|
|
@@ -66,6 +68,25 @@ function serializeBasketRow(basketRow) {
|
|
|
66
68
|
function serializeBasketRows(basketRows) {
|
|
67
69
|
return basketRows.map(serializeBasketRow);
|
|
68
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Serialize a BasketAddonRow to IRoomstayBasketAddonItem for analytics events.
|
|
73
|
+
*/
|
|
74
|
+
function serializeBasketAddonRow(addonRow) {
|
|
75
|
+
const addon = addonRow.getAddon();
|
|
76
|
+
return {
|
|
77
|
+
addonCode: (addon === null || addon === void 0 ? void 0 : addon.code) || '',
|
|
78
|
+
addonName: (addon === null || addon === void 0 ? void 0 : addon.name) || '',
|
|
79
|
+
quantity: addonRow.getTotalQuantity(),
|
|
80
|
+
unitPrice: addonRow.getAddonSubtotal(),
|
|
81
|
+
totalPrice: addonRow.getTotalPrice(),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Serialize multiple BasketAddonRows
|
|
86
|
+
*/
|
|
87
|
+
function serializeBasketAddonRows(addonRows) {
|
|
88
|
+
return addonRows.map(serializeBasketAddonRow);
|
|
89
|
+
}
|
|
69
90
|
/**
|
|
70
91
|
* Extract guest data from a ReservationsDTO
|
|
71
92
|
*/
|
|
@@ -88,9 +109,12 @@ function extractGuestData(reservation) {
|
|
|
88
109
|
};
|
|
89
110
|
}
|
|
90
111
|
/**
|
|
91
|
-
* Calculate total value from basket items
|
|
112
|
+
* Calculate total value from basket items and addons
|
|
92
113
|
*/
|
|
93
|
-
function calculateTotalValue(items) {
|
|
94
|
-
|
|
114
|
+
function calculateTotalValue(items, addons) {
|
|
115
|
+
var _a;
|
|
116
|
+
const itemsTotal = items.reduce((sum, item) => sum + item.totalPrice, 0);
|
|
117
|
+
const addonsTotal = (_a = addons === null || addons === void 0 ? void 0 : addons.reduce((sum, addon) => sum + addon.totalPrice, 0)) !== null && _a !== void 0 ? _a : 0;
|
|
118
|
+
return itemsTotal + addonsTotal;
|
|
95
119
|
}
|
|
96
120
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"/","sources":["src/util/AnalyticsEvents/helpers.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"/","sources":["src/util/AnalyticsEvents/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Analytics Events Helpers\n */\n\nimport { IRoomstayBasketAddonItem, IRoomstayBasketItem, IRoomstayGuestData, ReservationsDTO } from '@roomstay/core';\n\nimport BasketAddonRow from '@/models/BasketAddonRow';\nimport BasketRow from '@/models/BasketRow';\n\n/**\n * Get a cookie value by name\n */\nfunction getCookie(name: string): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const cookies = document.cookie.split(';');\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=');\n if (cookieName === name) {\n return decodeURIComponent(cookieValue);\n }\n }\n return undefined;\n}\n\n/**\n * Get Meta cookies for tracking\n * - fbc (_fbc): Click ID - tracks users who clicked on a Facebook ad\n * - fbp (_fbp): Browser ID - unique identifier for the browser\n */\nexport function getMetaCookies(): { fbc?: string; fbp?: string } {\n return {\n fbc: getCookie('_fbc'),\n fbp: getCookie('_fbp'),\n };\n}\n\n/**\n * Serialize a BasketRow to IRoomstayBasketItem for analytics events.\n */\nexport function serializeBasketRow(basketRow: BasketRow): IRoomstayBasketItem {\n const room = basketRow.getRoom();\n const rate = basketRow.getRate();\n const startDate = basketRow.getStartDate();\n const endDate = basketRow.getEndDate();\n\n return {\n roomCode: room?.code || '',\n roomId: room?.id,\n roomName: room?.name,\n\n rateCode: rate?.code || '',\n rateName: rate?.name,\n\n startDate: startDate?.format('YYYY-MM-DD') || '',\n endDate: endDate?.format('YYYY-MM-DD') || '',\n numberOfNights: basketRow.getNumberOfDays(),\n\n adults: basketRow.getAdults(),\n children: basketRow.getChildren(),\n infants: basketRow.getInfants(),\n\n totalPrice: basketRow.getTotalPrice() || 0,\n averageNightlyRate: rate?.getAveragePrice() || 0,\n\n promoCode: basketRow.getPromoCode() || undefined,\n };\n}\n\n/**\n * Serialize multiple BasketRows\n */\nexport function serializeBasketRows(basketRows: BasketRow[]): IRoomstayBasketItem[] {\n return basketRows.map(serializeBasketRow);\n}\n\n/**\n * Serialize a BasketAddonRow to IRoomstayBasketAddonItem for analytics events.\n */\nexport function serializeBasketAddonRow(addonRow: BasketAddonRow): IRoomstayBasketAddonItem {\n const addon = addonRow.getAddon();\n\n return {\n addonCode: addon?.code || '',\n addonName: addon?.name || '',\n quantity: addonRow.getTotalQuantity(),\n unitPrice: addonRow.getAddonSubtotal(),\n totalPrice: addonRow.getTotalPrice(),\n };\n}\n\n/**\n * Serialize multiple BasketAddonRows\n */\nexport function serializeBasketAddonRows(addonRows: BasketAddonRow[]): IRoomstayBasketAddonItem[] {\n return addonRows.map(serializeBasketAddonRow);\n}\n\n/**\n * Extract guest data from a ReservationsDTO\n */\nexport function extractGuestData(reservation: ReservationsDTO): IRoomstayGuestData {\n const firstReservation = reservation.reservations?.[0];\n const guest = firstReservation?.guest;\n\n if (!guest) {\n return {};\n }\n\n return {\n email: guest.email,\n phone: guest.phone,\n firstName: guest.firstName,\n lastName: guest.lastName,\n city: guest.address?.city,\n state: guest.address?.state,\n postalCode: guest.address?.postalCode,\n country: guest.address?.country,\n };\n}\n\n/**\n * Calculate total value from basket items and addons\n */\nexport function calculateTotalValue(items: IRoomstayBasketItem[], addons?: IRoomstayBasketAddonItem[]): number {\n const itemsTotal = items.reduce((sum, item) => sum + item.totalPrice, 0);\n const addonsTotal = addons?.reduce((sum, addon) => sum + addon.totalPrice, 0) ?? 0;\n return itemsTotal + addonsTotal;\n}\n"]}
|