{"version":3,"mappings":";gxCAeA,IAAKA,OACHA,EAAA,QAAU,UACVA,EAAA,mBAAqB,qBACrBA,EAAA,eAAiB,iBACjBA,EAAA,aAAe,eACfA,EAAA,aAAe,eALZA,OAAA,IAwBL,MAAMC,GAAOC,GACJC,EAAQ,QAAAC,EAAA,IACb,OACE,wBACF,OAED,KAAMC,GACEC,EACL,CAEE,IAAKD,EAAO,sBAAsB,CAChC,GAAIH,EAAO,sBACZ,EACD,OAAU,MACV,SAAU,MACZ,EACA,CACE,qBAAsB,CAAC,CAAC,iBAAAK,KAClBA,IAAqB,IAChBC,EAA2B,WAEhCD,IAAqB,IAChBC,EAA2B,WAG7BA,EAA2B,cACpC,CAEJ,CACD,EACA,KAAK,CAAC,CAAC,KAAAC,MAEJ,CACE,YAAa,UACb,KAAM,CACJ,sBAAuBA,EAAK,KAAK,sBAEjC,aAAwBA,EAAK,KAAK,aAClC,sBAAwBA,EAAK,KAAK,sBAClC,qBAAwBA,EAAK,KAAK,qBAElC,sCAAuCA,EAAK,KAAK,sCAErD,EAEH,EACA,MAAOC,GAAoB,CAC1B,GAAIA,aAA2B,MACvB,MAAAA,EAGF,MAAE,SAAAC,GAAaD,EACrB,OAAQC,EAAS,OAAQ,CACvB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACK,OAAC,YAAa,cAA4B,EACpD,IAAK,KACK,OAAC,YAAa,cAA4B,EACpD,IAAK,KACK,OAAC,YAAa,oBAAkC,EAC1D,IAAK,KACK,OAAC,YAAa,oBAAkC,EAC1D,QACU,OAAC,YAAa,gBAA8B,EACxD,CACD,ECxFH,IAAKX,OACHA,EAAA,QAAU,UACVA,EAAA,iBAAmB,mBAEnBA,EAAA,gBAAkB,kBAClBA,EAAA,QAAU,UACVA,EAAA,aAAe,eANZA,OAAA,IAeL,MAAMY,GAAS,CAAC,CAAC,2BAAAC,EAA4B,QAAAC,KACpCX,EAAQ,QAAAC,EAAA,IACb,OACE,wBACF,OAED,KAAMC,GACEC,EACL,CACE,IAAUD,EAAO,oGAAoG,EACrH,OAAU,OACV,SAAU,OAEV,KAAM,CACJ,2BAAAQ,EACA,QAAAC,EACA,OAAQC,EAAK,OAEjB,EACA,CACE,qBAAsB,CAAC,CAAC,iBAAAR,KAClBA,IAAqB,IAChBC,EAA2B,WAEhCD,IAAqB,IAChBC,EAA2B,WAG7BA,EAA2B,cACpC,CAEJ,CACD,EACA,KAAK,CAAC,CAAE,SAAAG,KAAe,CACtB,IAAIK,EAA+B,UAC/B,OAAAL,EAAS,SAAW,MACRK,EAAA,oBAId,CACE,YAAAA,EACA,KAAM,EACR,EAEH,EACA,MAAON,GAAoB,CAC1B,GAAIA,aAA2B,MACvB,MAAAA,EAGF,MAAE,SAAAC,GAAaD,EACrB,OAAQC,EAAS,OAAQ,CACvB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACK,OAAC,YAAa,cAA4B,EACpD,IAAK,KACK,OAAC,YAAa,iBAA+B,EACvD,IAAK,KACL,QACU,OAAC,YAAa,SAAuB,EACjD,CACD,EC/EH,IAAKX,OACHA,EAAA,QAAU,UACVA,EAAA,gBAAkB,kBAClBA,EAAA,QAAU,UACVA,EAAA,aAAe,eAJZA,OAAA,IAaL,MAAMiB,GAAU,CAAC,CAAC,2BAAAJ,EAA4B,QAAAC,KACrCX,EAAQ,QAAAC,EAAA,IACb,OACE,wBACF,OAED,KAAMC,GACEC,EACL,CACE,IAAUD,EAAO,qGAAqG,EACtH,OAAU,SACV,SAAU,OAEV,KAAM,CACJ,2BAAAQ,EACA,QAAAC,EACA,OAAQC,EAAK,OAEjB,EACA,CACE,qBAAsB,CAAC,CAAC,iBAAAR,KAClBA,IAAqB,IAChBC,EAA2B,WAEhCD,IAAqB,IAChBC,EAA2B,WAG7BA,EAA2B,cACpC,CAEJ,CACD,EACA,KAAK,KAEF,CACE,YAAc,UACd,KAAc,EAChB,EAEH,EACA,MAAOE,GAAoB,CAC1B,GAAIA,aAA2B,MACvB,MAAAA,EAGF,MAAE,SAAAC,GAAaD,EACrB,OAAQC,EAAS,OAAQ,CACvB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACK,OAAC,YAAa,cAA4B,EACpD,IAAK,KACK,OAAC,YAAa,iBAA+B,EACvD,IAAK,KACL,QACU,OAAC,YAAa,SAAuB,EACjD,CACD,EC3BGO,EAAmB,CACvB,eAAgB,gBAClB,EAIMC,EAA0B,2CAC1BC,EAA2B,6CAmB3BC,EAAmB,CACvB,KAAMC,EAAE,EACR,uBAAwB,8EACxB,cAAe,iFACf,iBAAkB,mFACpB,EAGMC,EAAmB,kHAGzB,cAA2CC,cAAa,CAOtD,YAAYC,EAAwB,CAC5B,QAEN,KAAK,SAAW,OAAO,OAAO,CAAC,EAAGJ,EAAkBI,CAAQ,EAE5D,KAAK,IAAMH,EAAE,KAAK,SAAS,IAAI,EAE/B,KAAK,eAAiB,KAAK,IAAI,KAAK,KAAK,SAAS,aAAa,EAC/D,KAAK,kBAAoB,KAAK,IAAI,KAAK,KAAK,SAAS,gBAAgB,EAEjE,KAAK,IAAI,SAAW,GAIxB,KAAK,YAAY,EAIX,aAAa,CACnB,YAAK,eAAe,GAAG,QAAU,GAAM,CACrC,EAAE,eAAe,EAEjB,KAAK,eAAe,EACrB,EAED,KAAK,kBAAkB,GAAG,QAAU,GAAM,CACxC,EAAE,eAAe,EAEjB,KAAK,iBAAiB,EACvB,EAEM,KAED,kBAAmB,CACzB,MAAMI,EAA0BC,EAAmB,EAC7CC,EAAuBC,EAAW,KAAK,IAAI,CAAC,EAAuB,CAAC,KAAM,GAAK,EAMrF,IAAIf,EAAU,KAKV,GAJA,OAAOc,EAAqB,+BAAkC,UAChEA,EAAqB,8BAA8B,SAAW,OACpDd,EAAAc,EAAqB,8BAA8B,QAAQ,SAAS,GAE5E,OAAOd,GAAY,SAAU,CAC/BgB,EACE,2EACA,CACE,iBACAP,CAAA,CAEJ,EACA,OAGF,GAAI,CAAEQ,EAAgBL,EAAwB,qBAAqB,EAAG,CACpEM,EAAoB,IAAI,IAAM,CAC5BC,EAAA,EACC,KAAK,IAAM,KAAK,iBAAiB,CAAC,EAClC,KAAK,GACL,kDAAkD,EAErDC,EAAY,gBAAgB,CAC1B,4CAA6C,EAC9C,GACA,KAAK,CAAC,CAAC,OAAAC,EAAQ,mBAAAC,KAAwB,CACtCA,EAAmB,GAAG,gCAAiC,CAAC,CAAC,cAAAC,KAAmB,CAC1EF,EAAO,MAAM,MAAM,EAEAG,EAAA,CACjB,sBAAuBD,CAAA,CACxB,EACD,KAAK,iBAAiB,EACvB,CACF,GACA,KAAK,EACN,OAGMlC,EAAA,UACP,KAAK,IAEAoC,IACKpC,EAAQ,QAAQ,EAGlBqC,EAAY,CACjB,sBAAuBd,EAAwB,4BAA8BA,EAAwB,uBAAyB,GAC9H,cAAeA,EAAwB,uBAAyB,GAChE,mBAAoB,EACrB,GACA,KAAK,CAAC,CAAC,YAAAV,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKyB,EAAsB,QACbC,EAAA,EACZC,EAAA,EAAmC,KAAK,EACxC,OACF,KAAKF,EAAsB,SACzB,OACF,QACE,MAAAX,EACE,sCAAsC,OAAAd,EAAW,KACjD,CACE,iBACE,uEAEN,EACME,EAAiB,eAC3B,CACD,CACF,EACA,KAAK,IAAM,CAEN,GADJ,KAAK,sBAAsB,EACvB,OAAOJ,GAAY,SAAkB,UAAI,MAAM,uBAAuB,EAC1E,OAAO8B,GAAmC,CAExC,2BAA4BlB,EAAwB,4BAA8BA,EAAwB,uBAAyB,GACnI,QAAAZ,CAAA,CACD,CACF,GACA,KAAK,CAAC,CAAC,YAAAE,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAK6B,EAA2C,QAC9C,OACF,QACE,MAAAf,EACE,8EAA8E,OAAAd,EAAW,KACzF,CACE,iBACAO,CAAA,CAEJ,EACML,EAAiB,eAC3B,CACD,EACA,KAAK,IAAM,CACV,KAAK,sBAAsB,EAE3B,KAAK,KAAK,2BAA2B,EAErC,MAAM4B,EAAgB,KAAK,IAAI,KAAK,eAAe,EACnDC,EAAS,YAAYhC,EAAK,EAAE,sFAAuF,CAAC,cAAA+B,CAAA,CAA6B,CAAC,EACnJ,EACA,MAAOE,GAAa,CAEf,GADJ,KAAK,uBAAuB,EACxBA,IAAa9B,EAAiB,eAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACAzB,CAAA,CAEJ,EACA,OAGFO,EACEkB,EAAS,SAAS,EAClB,CACE,iBACAzB,CAAA,CAEJ,EACD,GACA,KAAK,EAEA,gBAAiB,CACvB,MAAMG,EAA0BC,EAAmB,EAC7CC,EAAuBC,EAAW,KAAK,IAAI,CAAC,EAAuB,CAAC,KAAM,GAAK,EAMrF,IAAIf,EAAU,KAKV,GAJA,OAAOc,EAAqB,+BAAkC,UAChEA,EAAqB,8BAA8B,SAAW,OACpDd,EAAAc,EAAqB,8BAA8B,QAAQ,SAAS,GAE5E,OAAOd,GAAY,SAAU,CAC/BgB,EACE,2EACA,CACE,iBACAP,CAAA,CAEJ,EACA,OAGF,GAAI,CAAEQ,EAAgBL,EAAwB,qBAAqB,EAAG,CACpEM,EAAoB,IAAI,IAAM,CAC5BC,EAAA,EACC,KAAK,IAAM,KAAK,eAAe,CAAC,EAChC,KAAK,GACL,gDAAgD,EAEnDC,EAAY,gBAAgB,CAC1B,4CAA6C,EAC9C,GACA,KAAK,CAAC,CAAC,OAAAC,EAAQ,mBAAAC,KAAwB,CACtCA,EAAmB,GAAG,gCAAiC,CAAC,CAAC,cAAAC,KAAmB,CAC1EF,EAAO,MAAM,MAAM,EAEAG,EAAA,CACjB,sBAAuBD,CAAA,CACxB,EACD,KAAK,eAAe,EACrB,CACF,GACA,KAAK,EACN,OAGMlC,EAAA,UACP,KAAK,IAEAoC,IACKpC,EAAQ,QAAQ,EAGlBqC,EAAY,CACjB,sBAAuBd,EAAwB,4BAA8BA,EAAwB,uBAAyB,GAC9H,cAAeA,EAAwB,uBAAyB,GAChE,mBAAoB,EACrB,GACA,KAAK,CAAC,CAAC,YAAAV,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKyB,EAAsB,QACbC,EAAA,EACZC,EAAA,EAAmC,KAAK,EACxC,OACF,KAAKF,EAAsB,SACzB,OACF,QACE,MAAAX,EACE,sCAAsC,OAAAd,EAAW,KACjD,CACE,iBACE,uEAEN,EACME,EAAiB,eAC3B,CACD,CACF,EACA,KAAK,IAAM,CAEN,GADJ,KAAK,sBAAsB,EACvB,OAAOJ,GAAY,SAAkB,UAAI,MAAM,uBAAuB,EAC1E,OAAOoC,GAAkC,CAEvC,2BAA4BxB,EAAwB,4BAA8BA,EAAwB,uBAAyB,GACnI,QAAAZ,CAAA,CACD,CACF,GACA,KAAK,CAAC,CAAC,YAAAE,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKmC,EAA0C,QAC7C,OACF,KAAKA,EAA0C,iBAC1BC,GAAA,CACjB,SAAUC,GAAa,2BAA2B,EAClD,OAAU,SACV,QAAU,CACR,WAAY,yBACd,CACD,EACD,OACF,QACE,MAAAvB,EACE,6EAA6E,OAAAd,EAAW,KACxF,CACE,iBACAO,CAAA,CAEJ,EACML,EAAiB,eAC3B,CACD,EACA,KAAK,IAAM,CACV,KAAK,uBAAuB,EAE5B,KAAK,KAAK,2BAA2B,EAErC,MAAM4B,EAAgB,KAAK,IAAI,KAAK,eAAe,EACnDC,EAAS,YAAYhC,EAAK,EAAE,oFAAqF,CAAC,cAAA+B,CAAA,CAA6B,CAAC,EACjJ,EACA,MAAOE,GAAa,CAEf,GADJ,KAAK,sBAAsB,EACvBA,IAAa9B,EAAiB,eAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACAzB,CAAA,CAEJ,EACA,OAGFO,EACEkB,EAAS,SAAS,EAClB,CACE,iBACAzB,CAAA,CAEJ,EACD,GACA,KAAK,EAEA,uBAAwB,CAC5BD,EAAAD,EAAiB,sBAAsB,EACxC,YACCD,CAAA,EAED,YACCD,CACF,EAEM,uBAAwB,CAC5BG,EAAAD,EAAiB,sBAAsB,EACxC,YACCD,CAAA,EAED,SACCD,CACF,EAEM,wBAAyB,CAC7BG,EAAAD,EAAiB,sBAAsB,EACxC,YACCF,CAAA,EAED,SACCC,CACF,EAEJ,EAEA,MAAMkC,GAAU,CACd,OAAO7B,EAAwB,CACtB,WAAI8B,GAA6B9B,CAAQ,EAEpD,ECpbM+B,GAAkB,6EAClBC,EAA8B,GAAGD,UAAe,6BAEhDE,GAAO,IAAM,CACjBC,EAAE,IAAIH,UAAiB,EAAE,KAAMI,GAAO,CAC9B,MAAAC,EAAMvC,EAAEsC,CAAE,EAEZA,EAAG,UAAU,SAASH,CAA2B,IAClDG,EAAA,UAAU,IAAIH,CAA2B,EAE5CH,GAAQ,OAAO,CACb,KAAMO,CAAA,CACP,GACF,CACH,EAEeN,GAAA,CACbG,OACF,EC1BY,IAAAI,QACVA,EAAA,SAAW,WADDA,QAAA,IAcP9D,QACHA,EAAA,QAAU,UACVA,EAAA,gBAAkB,kBAClBA,EAAA,QAAU,UACVA,EAAA,aAAe,eAJZA,QAAA,IAkBL,MAAM+D,GAAY,CAAC,CAAC,2BAAAlD,EAA4B,mBAAAmD,EAAoB,YAAAC,KAC3D3D,EACL,CACE,IAAU,oEACV,KAAU,OAGV,SAAU,OAGV,YAAc,kCACd,KAAc,KAAK,UAAU,CAC3B,2BAAAO,EACA,mBAAAmD,EACA,YAAAC,EAEA,OAAQlD,EAAK,MACd,EACH,EACA,CACE,qBAAsB,CAAC,CAAC,iBAAAR,KAClBA,IAAqB,IAChBC,EAA2B,WAEhCD,IAAqB,IAChBC,EAA2B,WAG7BA,EAA2B,cACpC,CAEJ,EACC,KAAK,KAEF,CACE,YAAc,UACd,KAAc,EAChB,EAEH,EACA,MAAOE,GAAoB,CAC1B,GAAIA,aAA2B,MACvB,MAAAA,EAGF,MAAE,SAAAC,GAAaD,EACrB,OAAQC,EAAS,OAAQ,CACvB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACK,OACN,YAAa,cACf,EACF,IAAK,KACK,OACN,YAAa,iBACf,EACF,IAAK,KACK,OACN,YAAa,SACf,EACF,QACU,OACN,YAAa,SACf,EACJ,CACD,ECnGS,IAAAmD,QACVA,EAAA,SAAW,WADDA,QAAA,IAcP9D,QACHA,EAAA,QAAU,UACVA,EAAA,gBAAkB,kBAClBA,EAAA,QAAU,UACVA,EAAA,aAAe,eAJZA,QAAA,IAkBL,MAAMkE,GAAc,CAAC,CAAC,2BAAArD,EAA4B,mBAAAmD,EAAoB,YAAAC,KAC7D3D,EACL,CACE,IAAU,sEACV,KAAU,OAGV,SAAU,OAGV,YAAc,kCACd,KAAc,KAAK,UAAU,CAC3B,2BAAAO,EACA,mBAAAmD,EACA,YAAAC,EAEA,OAAQlD,EAAK,MACd,EACH,EACA,CACE,qBAAsB,CAAC,CAAC,iBAAAR,KAClBA,IAAqB,IAChBC,EAA2B,WAEhCD,IAAqB,IAChBC,EAA2B,WAG7BA,EAA2B,cACpC,CAEJ,EACC,KAAK,KAEF,CACE,YAAc,UACd,KAAc,EAChB,EAEH,EACA,MAAOE,GAAoB,CAC1B,GAAIA,aAA2B,MACvB,MAAAA,EAGF,MAAE,SAAAC,GAAaD,EACrB,OAAQC,EAAS,OAAQ,CACvB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACK,OACN,YAAa,cACf,EACF,IAAK,KACK,OACN,YAAa,iBACf,EACF,IAAK,KACK,OACN,YAAa,SACf,EACF,QACU,OACN,YAAa,SACf,EACJ,CACD,ECrDGO,EAAmB,CACvB,eAAgB,gBAClB,EAEMK,EAAmB,oDAkBnBF,GAAmB,CACvB,UAAwBC,EAAE,EAC1B,uBAAwB,kCAExB,sBAA0B,gDAC1B,wBAA0B,iDAC5B,EAEO,MAAM6C,WAAqB3C,cAAa,CAU7C,YAAYC,EAAyB,CAc/B,GAbE,QAHR,KAAiB,sBAA2C,CAAC,EAK3D,KAAK,SAAW,OAAO,OAAO,CAAC,EAAGJ,GAAkBI,CAAQ,EAE5D,KAAK,WAAaH,EAAE,KAAK,SAAS,SAAS,EAE3C,KAAK,mBAAqB,KAAK,WAAW,KAAK,oBAAoB,EAEnE,KAAK,uBACH,KAAK,WAAW,KAAK,KAAK,SAAS,qBAAqB,EAC1D,KAAK,yBACH,KAAK,WAAW,KAAK,KAAK,SAAS,uBAAuB,EAExD,KAAK,WAAW,SAAW,EAAE,CAC/BQ,EACE,8BAA8B,YAAK,WAAW,OAAM,cACpD,CACE,iBAAkBP,CAAA,CAEtB,EACA,OAGF,KAAK,YAAY,EAGZ,WAAW6C,EAAgB,CAC3B,2BAAsB,KAAKA,CAAE,EAG5B,wBAAyB,CAC/B,KAAK,sBAAsB,QAASA,GAAOA,GAAI,EAGzC,aAAa,CAEf,GADA,KAAK,wBAA0B,MAC/B,KAAK,0BAA4B,KAAQ,OAE7C,MAAMC,EAAyB,KAAK,uBAC9BC,EAA2B,KAAK,yBAGrC,OAAAD,EAAA,GAAG,QAAUE,GAAM,CAClBA,EAAE,eAAe,EAGX,MAAAN,EADqB,KAAK,WACe,KAAK,aAAa,EAE7D,IACqBI,EAAA,KAAK,WAAY,EAAI,EAC5C,KAAK,cAAcJ,CAAW,SAEhC,CACyBI,EAAA,KAAK,WAAY,EAAK,EAC/C,CACD,EAGAC,EAAA,GAAG,QAAUC,GAAM,CAClBA,EAAE,eAAe,EAGX,MAAAN,EADqB,KAAK,WACe,KAAK,aAAa,EAE7D,IACuBK,EAAA,KAAK,WAAY,EAAI,EAC9C,KAAK,gBAAgBL,CAAW,SAElC,CAC2BK,EAAA,KAAK,WAAY,EAAK,EACjD,CACD,EAEM,KAGD,cAAcL,EAAqB,CACzCO,EAAM,qBAAqB,EAE3B,MAAM9C,EAA0BC,EAAmB,EAEnD,GAAI,CAAEI,EAAgBL,EAAwB,qBAAqB,EAAG,CACpEM,EAAoB,IAAI,IAAM,CACEC,EAAA,EAC7B,KAAK,IAAM,KAAK,cAAcgC,CAAW,CAAC,EAC1C,KAAK,GACL,iCAAiC,EAEpC/B,EAAY,gBAAgB,CAC1B,4CAA6C,EAC9C,GACA,KAAK,CAAC,CAAC,OAAAC,EAAQ,mBAAAC,KAAwB,CACtCA,EAAmB,GAAG,gCAAiC,CAAC,CAAC,cAAAC,KAAmB,CAC1EF,EAAO,MAAM,MAAM,EAEAG,EAAA,CACjB,sBAAuBD,CAAA,CACxB,EACD,KAAK,cAAc4B,CAAW,EAC/B,CACF,GACA,KAAK,EACN,OAGF,IAAIQ,EAAsC,CAAC,EACnCtE,EAAA,UACP,KAAK,KACJqE,EAAM,qBAAqB,EAEvBjC,IACKpC,EAAQ,QAAQ,EAGlBqC,EAAY,CACjB,sBAAwBd,EAAwB,4BAA8BA,EAAwB,uBAAyB,GAC/H,cAAwBA,EAAwB,uBAAyB,GACzE,mBAAwB,EACzB,GACA,KAAK,CAAC,CAAC,YAAAV,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKyB,EAAsB,QACbC,EAAA,EACZC,EAAA,EAAmC,KAAK,EACxC,OACF,KAAKF,EAAsB,SACzB,OACF,QACE,MAAAX,EACE,sCAAsC,OAAAd,EAAW,KACjD,CACE,iBACE,uEAEN,EACME,EAAiB,eAC3B,CACD,EACF,EACA,KAAK,IAAM,CACV,MAAMhB,EAAS,CAEb,2BACEwB,EAAwB,4BACxBA,EAAwB,uBACxB,GAEF,mBAAoB,KAAK,mBACzB,YAAoBgD,GAAsC,QAC5D,EACsC,OAAAD,EAAAvE,EAC/ByE,GAAiCzE,CAAM,CAC/C,GACA,KAAK,CAAC,CAAC,YAAAc,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAK4D,GAAsC,QACzC,OACF,QACE,MAAA9C,EACE,wEAAwE,OAAAd,EAAW,KACnF,OAAO,OAAO,CACZ,iBACEO,EACF,gDACEG,EAAwB,uBAAyB,WAClD+C,CAAmC,CACxC,EACMvD,EAAiB,eAC3B,CACD,EACA,KAAK,IAAM,CACVsD,EAAM,qBAAqB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC7B,EACA,MAAOxB,GAAa,CAEf,GADJwB,EAAM,qBAAqB,EACvBxB,IAAa9B,EAAiB,eAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACAzB,CAAA,CAEJ,EACA,OAGFO,EACEkB,EAAS,SAAS,EAClB,CACE,iBACAzB,CAAA,CAEJ,EACD,GACA,KAAK,EAGA,gBAAgBsD,EAAsB,CAC5C,MAAMnD,EAA0BC,EAAmB,EAE7CI,EAAgBL,EAAwB,qBAAqB,GAK3DvB,EAAA,UACP,KAAK,IACG2E,GAAmC,CAExC,2BACEpD,EAAwB,4BACxBA,EAAwB,uBACxB,GAEF,mBAAoB,KAAK,mBACzB,YAAoBqD,GAAwC,SAC7D,CACF,EACA,KAAK,CAAC,CAAC,YAAA/D,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKgE,GAAwC,QAC3C,OACF,QACE,MAAAlD,EACE,0EAA0E,OAAAd,EAAW,KACrF,CACE,iBACAO,CAAA,CAEJ,EACML,EAAiB,eAC3B,CACD,EACA,KAAK,IAAM,CACV,KAAK,sBAAsB,EAC5B,EACA,MAAO8B,GAAa,CACf,GAAAA,IAAa9B,EAAiB,eAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACAzB,CAAA,CAEJ,EACA,OAGFO,EACEkB,EAAS,SAAS,EAClB,CACE,iBACAzB,CAAA,CAEJ,EACD,GACA,KAAK,EAGA,oBAAqB,CACtB,gBACJ,SAAS,WAAW,EAErB,KAAK,KAAK,mBAAmB,EAEvB,uBAAwB,CACzB,gBACJ,YAAY,WAAW,EAE5B,CAEA,MAAM+B,GAAU,CACd,UAAW,KACX,SAAS7B,EAAwB,CAC3B,YAAK,YAAc,KAAe,KAAK,WAEtC,eAAY,KAAK,OAAOA,CAAQ,EAC9B,KAAK,UACd,EACA,OAAOA,EAAwB,CACtB,WAAI0C,GAAa1C,CAAQ,EAEpC,EC1WM+B,GAAkB,iCAClBC,EAA8B,GAAGD,UAAe,6BAUhDyB,GAA6B,CACjC,UAAW,MACb,EAGMvB,GAAO,CAACxD,EAAiB,KAAO,CACpC,MAAMgF,EAAmC,OAAO,OAAO,GAAID,GAAgB/E,CAAM,EAEjF,OAAOC,EAAQ,UACbwD,EAAEuB,EAAqB,SAAS,EAAE,KAAK,IAAI1B,UAAiB,EAAE,MAC7DI,GAAO,CACN,GAAI,CAAAA,EAAG,UAAU,SAASH,CAA2B,EAClD,OAAAG,EAAA,UAAU,IAAIH,CAA2B,EAErCH,GAAQ,OAAO,CACpB,UAAWM,CAAA,CACZ,EACH,EAED,KAAMuB,GACEA,EAAQ,OAAsBC,GAC5BA,GAAW,IACnB,CACF,CACH,ECuCMlE,EAAmB,CACvB,eAAmB,iBACnB,kBAAmB,mBACrB,EASA,MAAMmE,WAA6B7D,cAAa,CAK9C,YAAYC,EAAwB,CAC5B,QAEN,KAAK,SAAW,OAAO,OAAO,GAAIA,CAAQ,EAC1C,KAAK,IAAMH,EAAE,KAAK,SAAS,IAAI,EAC/B,KAAK,WAAa,KAAK,IAAI,KAAK,YAAY,EAE5C,KAAK,YAAY,EAIT,aAAa,CACrB,KAAK,IAAI,GAAG,QAAU,GAAM,CAC1B,KAAK,QAAQ,CAAC,EACf,EAGO,QAAQ,EAAU,CAC1B,EAAE,eAAe,EAEjB,MAAMgE,EAAkB,KAAK,IAEzB,GAAAA,EAAgB,SAAS,0CAA0C,EACrE,OAGFC,GAAgB,WAAW,EAE3B,IAAIC,EAA0B,GAC1BF,EAAgB,QAAQ,kCAAkC,EAAE,OAAS,EAC7CE,EAAA,iBAEnBF,EAAgB,QAAQ,kCAAkC,EAAE,OAAS,IAClDE,EAAA,8CAGZC,GAAA,MACd,CACE,aACA,yBACA,UAAU,OAAAC,GAAe,6BACzB,cAAc,OAAAF,GACd,yBACA,eACF,EAAE,KAAK,EAAE,CACX,EAEA,MAAM9D,EAA0BC,EAAmB,EAE7Cd,EACJa,EAAwB,4BAA8BA,EAAwB,uBAAyB,GACnGiE,EACJjE,EAAwB,sBACpBkE,EACJlE,EAAwB,qBAE1B,GAAIiE,GAAyB,MAC3B,CAAC5D,EAAgB4D,CAAqB,EAAG,CAGzC,KAAK,iBAAiB,EACtB,OAGFvF,EAAA,8BAAAyF,CAAA,eACE,qBACF,uBAAAA,EAAA,MACC,KAAK,CAAC,CAAC,cAAeA,KAAwB,CACpCC,GAAA,CACP,sBAAuBjF,CACxB,GACA,KAAK,CAAC,CAAC,YAAAG,EAAa,KAAAP,KAAU,CAC7B,OAAQO,EAAa,CACnB,KAAK+E,EAAmB,QAAS,CAC/B,GAAItF,GAAQ,KACV,MAAMS,EAAiB,kBAGzB,MAAM8E,EAA6CvF,EAAK,qBACxD,IAAIwF,EAA6BL,EAE7B,GAAAA,GAAwB,MAC1B,CAAC7D,EAAgB6D,CAAoB,GACrC,CAACC,EAAmBD,CAAoB,EAAG,CAEvC,GAAAI,GAA+B,MACjC,CAACjE,EAAgBiE,CAA2B,GAC5C,CAACH,EAAmBG,CAA2B,EAE/C,WAAK,iBAAiB,EAChB9E,EAAiB,kBAGNoB,EAAA,CACjB,qBAAsB0D,CAAA,CACvB,EAC4BC,EAAAD,CAAA,MAGAC,EAAAL,EAG3B,GAAAnF,EAAK,wCAA0C,GACjD,WAAK,iBAAiB,EAChBS,EAAiB,kBAGzB,KAAK,iCAAiC,CACpC,2BAAAL,EACA,sBAAA8E,EACA,qBAA4BM,CAAA,CAC7B,EACD,OAEF,KAAKF,EAAmB,mBAEtB,WAAK,iBAAiB,EAChB7E,EAAiB,kBAGzB,KAAK6E,EAAmB,aACtB,MAAAhD,EAAS,YAAYhC,EAAK,EAAE,mEAAmE,CAAC,EAC1FG,EAAiB,kBAEzB,KAAK6E,EAAmB,aACtB,MAAAhD,EAAS,YAAYhC,EAAK,EAAE,mEAAmE,CAAC,EAC1FG,EAAiB,kBAEzB,QACE,MAAAY,EACE,sCAAsC,OAAAd,EAAW,KACjD,OAAO,OAAO,CACZ,iBACE,uEACF,sBACEH,CACH,EACH,EACMK,EAAiB,cACzB,CACF,CACD,EACA,MAAO8B,GAAa,CAEf,GAAAA,IAAa9B,EAAiB,gBAC9B8B,IAAa9B,EAAiB,kBAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACE,gDAEN,EACA,OAGFlB,EACEkB,EAAS,SAAS,EAClB,CACE,iBACE,gDAEN,EACD,GACA,KAAK,EACP,EAGO,iCAAiC,CACzC,2BAAAnC,EACA,sBAAA8E,EACA,qBAAAC,CAAA,EAKC,CAEOzF,EAAA,UACP,KAAK,IACAoC,IACKpC,EAAQ,QAAQ,EAGlBqC,EAAY,CACjB,sBAAwB3B,EACxB,cAAwB8E,EACxB,mBAAwB,EACzB,GACA,KAAK,CAAC,CAAC,YAAA3E,KAAiB,CACvB,OAAQA,EAAa,CACnB,KAAKyB,EAAsB,QACbC,EAAA,EACZC,EAAA,EAAmC,KAAK,EACxC,OACF,KAAKF,EAAsB,SACzB,OACF,QACE,MAAAX,EACE,sCAAsC,OAAAd,EAAW,KACjD,CACE,iBACE,uEAEN,EACME,EAAiB,eAC3B,CACD,CACF,EACA,KAAK,IACGgF,GAA6B,CAClC,2BAAArF,EAEA,WAAY,KAAK,WAEjB,mCAAoC,CAClC,wBACA8E,EACA,uBACAC,CACF,EACA,kBAAmB,KACpB,CACF,EACA,KAAK,CAAC,CAAC,YAAA5E,EAAa,KAAAP,KAAU,CACzB,GAAAO,IAAgBmF,EAAuC,sCACzD,WAAK,iBAAiB,EAChBjF,EAAiB,kBAIrB,GAAAF,IAAgBmF,EAAuC,aACzD,MAAApD,EAAS,YAAYhC,EAAK,EAAE,mEAAmE,CAAC,EAC1FG,EAAiB,kBAGrB,GAAAF,IAAgBmF,EAAuC,gBACzD,MAAApD,EAAS,YAAYhC,EAAK,EAAE,sEAAsE,CAAC,EAC7FG,EAAiB,kBAMrB,GAAAF,IAAgBmF,EAAuC,oCACzD,MAAApD,EAAS,YAAYhC,EAAK,EAAE,0FAA0F,CAAC,EACjHG,EAAiB,kBAGrB,GAAAF,IAAgBmF,EAAuC,6BACzD,MAAApD,EAAS,UAAUhC,EAAK,EAAE,mFAAmF,CAAC,EACxGG,EAAiB,kBAIrB,GAAAF,IAAgBmF,EAAuC,QACzD,MAAArE,EACE,6DAA6D,OAAAd,GAC7D,CACE,iBACE,gDACF,sBAAA2E,EAEA,qBAAAC,CAAA,CAGJ,EACM1E,EAAiB,eAGlB,OAAAT,CAAA,CACR,EACA,KAAMA,IACL,KAAK,iBAAiB,EAEN2F,GAAA,CACd,GAAI,KAAK,WACV,EACA,KAAK,CAAC,CAAC,YAAApF,EAAa,KAAMqF,KAAkB,CAC3C,OAAQrF,EAAa,CACnB,KAAKsF,GAAyB,QAAS,CACrC,GAAID,GAAgB,KAClB,MAAAvE,EACE,mEAAmE,OAAAd,EAAW,KAC9E,CACE,iBACE,2EAEN,EACME,EAAiB,eAGzB,GAAImF,EAAa,uBAAwB,CACvCE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,eACvD,EACAC,EAAoB,iBAAiB,oBAAoB,EACzD,OAEF,GAAIH,EAAa,uBAAwB,CACvCE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,eACvD,EACAC,EAAoB,iBAAiB,oBAAoB,EACzD,OAEF,GAAIH,EAAa,uBAAwB,CAGvCE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,eACvD,EACAC,EAAoB,iBAAiB,oBAAoB,EACzD,OAEF,GAAIH,EAAa,4BAA6B,CAC5CE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,QACvD,EACAC,EAAoB,iBAAiB,iBAAiB,EACtD,OAEF,GAAIH,EAAa,0BAA2B,CAC1CE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,kBACvD,EACAC,EAAoB,iBAAiB,oBAAoB,EACzD,OAEF,GAAIH,EAAa,sBAAuB,CACtCE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,cACvD,EACAC,EAAoB,iBAAiB,oBAAoB,EACzD,OAGF,GAAIH,EAAa,WAAa,CAACA,EAAa,sBAAuB,CACjEE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,kBACvD,EACAC,EAAoB,iBAAiB,mBAAmB,EACxD,OAEF,GAAI,CAACH,EAAa,WAAa,CAACA,EAAa,sBAAuB,CAClEE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,gBACvD,EACAC,EAAoB,iBAAiB,mBAAmB,EACxD,OAGE,GAAAH,EAAa,WAAaA,EAAa,sBAAuB,CAChEE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,iBACvD,EACAC,EAAoB,iBAAiB,mBAAmB,EACxD,OAEF,GAAI,CAACH,EAAa,WAAaA,EAAa,sBAAuB,CACjEE,EAAY,sBAAsB,MAChCA,EAAY,sBAAsB,mBAAmB,eACvD,EACAC,EAAoB,iBAAiB,mBAAmB,EACxD,OAGF,MAEF,QACE,MAAA1E,EACE,6DAA6D,OAAAd,EAAW,KACxE,CACE,iBACE,2EAEN,EACME,EAAiB,cACzB,CACF,CACD,EAEMf,EAAQ,QAAAC,EAAA,IACb,OACE,wBACF,OAED,KAAMC,GACEC,EAAS,CACd,IAAUD,EAAO,oFAAoF,CACnG,OAA4BU,EAAK,OACjC,2BAA4BN,GAAQ,KAAOA,EAAK,2BAA6B,KAC9E,EACD,OAAU,MACV,SAAU,OACX,CACF,EACF,EACA,KAAK,CAAC,CAAC,KAAAA,KACCN,EAAQ,QACbC,EAAA,WAAO,0BAAsB,kFAE9B,KAAK,CAAC,CAAC,QAASoE,KAAW,CAC1BA,EAAM,aAAa,EACnBA,EAAM,qBAAqB/D,CAAI,EACAgG,GAAA,EACLC,GAAA,EAC1BC,GAAA,EAAgC,KAAK,EACrCpD,GAA6B,KAAK,EAClCqD,GAAA,EAA2B,KAAK,EACjC,CACF,EACA,MAAO5D,GAAa,CAEf,GAAAA,IAAa9B,EAAiB,gBAC9B8B,IAAa9B,EAAiB,kBAElC,IAAI8B,aAAoB,MAAO,CAC7BC,EACED,EACA,CACE,iBACE,gDAEN,EACA,OAGFlB,EACEkB,EAAS,SAAS,EAClB,CACE,iBACE,gDAEN,EACD,GACA,KAAK,EAGE,kBAAkB,CACrB,SAAI,SAAS,0CAA0C,EAGpD,kBAAmB,CAC3B,MAAM6D,EAAc,KAAK,IAAI,KAAK,YAAY,EAErCvG,EAAA,CACP,IAAU,IAAI,OAAAS,EAAK,OAAM,cAAa,OAAA8F,EAAU,oBAChD,OAAU,MACV,SAAU,MACX,GACA,KAAK,CAAC,CAAC,KAAApG,KACCqG,GAAc,iBAAiBrG,CAAI,CAC3C,EACA,KAAK,EAEV,CAGA,MAAM6C,GAAU,CACd,OAAO7B,EAAwB,CACtB,WAAI4D,GAAqB5D,CAAQ,EAE5C,EC3iBM+B,GAAkB,kCAClBC,EAA8B,GAAG,OAAAD,GAAe,6BAGhDE,GAAQqD,GAELpD,EAAE,IAAI,OAAAH,GAAiB,EAAE,MAAM,KAAMI,GAAO,CAEjD,GAAImD,GAAY,MAAQA,EAAS,cAAc,GAAK,EAAY,SAE1D,MAAAlD,EAAMvC,EAAEsC,CAAE,EAEZA,EAAG,UAAU,SAASH,CAA2B,IAClDG,EAAA,UAAU,IAAIH,CAA2B,EAE5CuD,GAAc,OAAO,CACnB,KAAMnD,CAAA,CACP,GACF,EAIGoD,GAAUF,GACPrD,GAAKqD,CAAQ,EAGPG,GAAA,CACb,KAAAxD,GACA,OAAAuD,EACF","names":["ResultTypeEnums","get","inputs","Promise","__vitePreload","Routes","q_ajax_3","http_status_code","AJAX_ERROR_HANDLER_ACTIONS","data","reason_or_error","response","create","user_authentication_handle","city_id","I18n","result_type","destroy","RejectionReasons","STATE_CLASS_FOR_WORKING","STATE_CLASS_FOR_FOLLOWED","default_selector","$","SOURCE_FILE_PATH","EventEmitter","selector","local_contact_info_data","getContactInfoData","serialized_form_data","serialize","captureMessage","isPresentString","Auth_callback_queue","getLastContactInfoSyncPromise","Auth_action","$modal","authentication_box","email_address","setContactInfoData","isSignedIn","create_user","CreateUserResultTypes","trackSignUp","refreshAndUpdateComponentPromise","destroy_city_specific_subscription","DestroyCitySpecificSubscriptionResultTypes","location_name","Notifier","whatever","captureException","create_city_specific_subscription","CreateCitySpecificSubscriptionResultTypes","Google_Event_track","PageInstance","Factory","CityUpdateSubscriptionButton","CELL_CLASS_NAME","CELL_INITIALIZED_CLASS_NAME","init","u","el","$el","FollowTypes","subscribe","country_name_in_en","follow_type","unsubscribe","FollowButton","cb","$follow_button_primary","$unfollow_button_primary","e","Modal","subscribe_building_following_inputs","SubscribeCountryUFollowingFollowTypes","subscribe_country_user_following","SubscribeCountryUFollowingResultTypes","_follow_type","unsubscribe_country_user_following","UnsubscribeCountryUFollowingFollowTypes","UnsubscribeCountryUFollowingResultTypes","DEFAULT_INPUTS","inputs_with_defaults","results","element","ListingContactButton","$clicked_button","Concierge_Timer","tracking_container_name","Google_PageView","Contact_shared","contact_email_address","contact_phone_number","isValidPhoneNumber","get_user","GetUserResultTypes","remote_contact_phone_number","final_contact_phone_number","createListingContactRequests","createListingContactRequestResultTypes","get_one_listing","listing_data","GetOneListingResultTypes","Goals_track","FacebookPixel_Event","initNeighbourhoodFollowButtons","initBuildingFollowButtons","listing_shortlist_button_init","CountryFollowButton_init","listing_id","Contact_Modal","deadline","EventsFactory","onLoad","Listings_Contact_Button"],"ignoreList":[],"sources":["../../../app/assets/javascripts/app/resources/users/get/index.ts","../../../app/assets/javascripts/app/resources/city_specific_listing_update_subscription/create/index.ts","../../../app/assets/javascripts/app/resources/city_specific_listing_update_subscription/destroy/index.ts","../../../app/assets/javascripts/concepts/buildings/overseas_marketing/city_update_subscription/button/factory.ts","../../../app/assets/javascripts/concepts/buildings/overseas_marketing/city_update_subscription/button/index.ts","../../../app/assets/javascripts/app/resources/spacious_country_user_follow_relationships/subscribe/index.ts","../../../app/assets/javascripts/app/resources/spacious_country_user_follow_relationships/unsubscribe/index.ts","../../../app/assets/javascripts/apps/spacious_website/components/countries/follow_button/factory.ts","../../../app/assets/javascripts/apps/spacious_website/components/countries/follow_button/index.ts","../../../app/assets/javascripts/concepts/listings/contact/button/events/index.ts","../../../app/assets/javascripts/concepts/listings/contact/button/index.ts"],"sourcesContent":["\n/* eslint-disable no-unused-vars */\nimport Promise from \"plugins/bluebird/index\"\n/* eslint-enable no-unused-vars */\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n\n\ninterface Inputs {\n authentication_handle: string,\n}\n\n/* eslint-disable no-unused-vars */\nenum ResultTypeEnums {\n SUCCESS = \"SUCCESS\",\n RESOURCE_NOT_FOUND = \"RESOURCE_NOT_FOUND\",\n INPUTS_INVALID = \"INPUTS_INVALID\",\n SERVER_ERROR = \"SERVER_ERROR\",\n UNAUTHORIZED = \"UNAUTHORIZED\",\n}\n/* eslint-enable no-unused-vars */\n\ninterface UserDetails {\n authentication_handle: string,\n\n contact_name: string | null,\n contact_email_address: string,\n contact_phone_number: string | null,\n\n fast_contact_request_creation_enabled: boolean,\n}\n\ninterface PromiseResolvePayload {\n result_type: ResultTypeEnums,\n data?: UserDetails,\n}\n\nconst get = (inputs: Inputs): Promise => {\n return Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n return q_ajax_3(\n {\n // Routes don't encode input automatically\n url: Routes.api_web_app_user_path({\n id: inputs.authentication_handle,\n }),\n method: \"GET\",\n dataType: \"json\",\n },\n {\n custom_error_handler: ({http_status_code}) => {\n if (http_status_code === 404) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n if (http_status_code === 422) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n\n return AJAX_ERROR_HANDLER_ACTIONS.CONTINUE_RETRY\n },\n },\n )\n })\n .then(({data}) => {\n return (\n {\n result_type: ResultTypeEnums.SUCCESS,\n data: {\n authentication_handle: data.data.authentication_handle,\n\n contact_name: data.data.contact_name,\n contact_email_address: data.data.contact_email_address,\n contact_phone_number: data.data.contact_phone_number,\n\n fast_contact_request_creation_enabled: data.data.fast_contact_request_creation_enabled,\n },\n }\n )\n })\n .catch((reason_or_error) => {\n if (reason_or_error instanceof Error) {\n throw reason_or_error\n }\n\n const { response } = reason_or_error\n switch (response.status) {\n case 500:\n case 502:\n case 503:\n case 504:\n return ({result_type: ResultTypeEnums.SERVER_ERROR})\n case 403:\n return ({result_type: ResultTypeEnums.UNAUTHORIZED})\n case 404:\n return ({result_type: ResultTypeEnums.RESOURCE_NOT_FOUND})\n case 422:\n return ({result_type: ResultTypeEnums.RESOURCE_NOT_FOUND})\n default:\n return ({result_type: ResultTypeEnums.INPUTS_INVALID})\n }\n })\n}\n\nexport {\n get,\n ResultTypeEnums,\n}\n","\nimport Promise from \"plugins/bluebird\"\n\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\ninterface Input {\n user_authentication_handle: string,\n city_id: string,\n}\n\n/* eslint-disable no-unused-vars */\nenum ResultTypeEnums {\n SUCCESS = \"SUCCESS\",\n RESOURCE_CREATED = \"RESOURCE_CREATED\",\n\n UNAUTHENTICATED = \"UNAUTHENTICATED\",\n INVALID = \"INVALID\",\n SERVER_ERROR = \"SERVER_ERROR\",\n}\n/* eslint-enable no-unused-vars */\n\ninterface PromiseResolvePayload {\n result_type: ResultTypeEnums,\n data?: {},\n}\n\nconst create = ({user_authentication_handle, city_id}: Input): Promise => {\n return Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n return q_ajax_3(\n {\n url: Routes.create_api_web_app_pages_city_level_overseas_marketing_projects_page_city_update_subscriptions_path(),\n method: \"POST\",\n dataType: \"json\",\n\n data: {\n user_authentication_handle: user_authentication_handle,\n city_id: city_id,\n locale: I18n.locale,\n },\n },\n {\n custom_error_handler: ({http_status_code}) => {\n if (http_status_code === 401) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n if (http_status_code === 422) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n\n return AJAX_ERROR_HANDLER_ACTIONS.CONTINUE_RETRY\n },\n },\n )\n })\n .then(({ response }) => {\n let result_type: ResultTypeEnums = ResultTypeEnums.SUCCESS\n if (response.status === 201) {\n result_type = ResultTypeEnums.RESOURCE_CREATED\n }\n\n return (\n {\n result_type: result_type,\n data: {},\n }\n )\n })\n .catch((reason_or_error) => {\n if (reason_or_error instanceof Error) {\n throw reason_or_error\n }\n\n const { response } = reason_or_error\n switch (response.status) {\n case 500:\n case 502:\n case 503:\n case 504:\n return ({result_type: ResultTypeEnums.SERVER_ERROR})\n case 401:\n return ({result_type: ResultTypeEnums.UNAUTHENTICATED})\n case 422:\n default:\n return ({result_type: ResultTypeEnums.INVALID})\n }\n })\n}\n\nexport {\n create as default,\n create,\n ResultTypeEnums,\n}\n","\nimport Promise from \"plugins/bluebird\"\n\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\ninterface Input {\n user_authentication_handle: string,\n city_id: string,\n}\n\n/* eslint-disable no-unused-vars */\nenum ResultTypeEnums {\n SUCCESS = \"SUCCESS\",\n UNAUTHENTICATED = \"UNAUTHENTICATED\",\n INVALID = \"INVALID\",\n SERVER_ERROR = \"SERVER_ERROR\",\n}\n/* eslint-enable no-unused-vars */\n\ninterface PromiseResolvePayload {\n result_type: ResultTypeEnums,\n data?: {},\n}\n\nconst destroy = ({user_authentication_handle, city_id}: Input): Promise => {\n return Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n return q_ajax_3(\n {\n url: Routes.destroy_api_web_app_pages_city_level_overseas_marketing_projects_page_city_update_subscriptions_path(),\n method: \"DELETE\",\n dataType: \"json\",\n\n data: {\n user_authentication_handle: user_authentication_handle,\n city_id: city_id,\n locale: I18n.locale,\n },\n },\n {\n custom_error_handler: ({http_status_code}) => {\n if (http_status_code === 401) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n if (http_status_code === 422) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n\n return AJAX_ERROR_HANDLER_ACTIONS.CONTINUE_RETRY\n },\n },\n )\n })\n .then(() => {\n return (\n {\n result_type: ResultTypeEnums.SUCCESS,\n data: {},\n }\n )\n })\n .catch((reason_or_error) => {\n if (reason_or_error instanceof Error) {\n throw reason_or_error\n }\n\n const { response } = reason_or_error\n switch (response.status) {\n case 500:\n case 502:\n case 503:\n case 504:\n return ({result_type: ResultTypeEnums.SERVER_ERROR})\n case 401:\n return ({result_type: ResultTypeEnums.UNAUTHENTICATED})\n case 422:\n default:\n return ({result_type: ResultTypeEnums.INVALID})\n }\n })\n}\n\nexport {\n destroy as default,\n destroy,\n ResultTypeEnums,\n}\n","\nimport $ from \"jquery\"\nimport serialize from \"form-serialize\"\n\nimport { EventEmitter } from \"events\"\nimport Promise from \"plugins/bluebird\"\n\nimport Notifier from \"app/notifier/index\"\n\nimport Auth_action from \"app/authentication/action\"\nimport Auth_callback_queue from \"app/authentication/callback_queue\"\n\nimport {\n refreshAndUpdateComponentPromise,\n} from \"app/authentication/remote_state\"\n\nimport {\n captureMessage,\n captureException,\n} from \"app/error_reporting/index\"\n\nimport {\n getContactInfoData,\n setContactInfoData,\n} from \"app/local_storages/contact_info_storage/index\"\n\nimport {\n create as create_user,\n ResultTypeEnums as CreateUserResultTypes,\n} from \"app/resources/users/create/index\"\n\nimport {\n isPresentString,\n} from \"app/utils/type_checking/index\"\n\nimport {\n isSignedIn,\n} from \"app/authentication/state\"\n\nimport {\n create as create_city_specific_subscription,\n ResultTypeEnums as CreateCitySpecificSubscriptionResultTypes,\n} from \"app/resources/city_specific_listing_update_subscription/create/index\"\n\nimport {\n destroy as destroy_city_specific_subscription,\n ResultTypeEnums as DestroyCitySpecificSubscriptionResultTypes,\n} from \"app/resources/city_specific_listing_update_subscription/destroy/index\"\n\n\nimport {\n trackSignUp,\n} from \"app/authentication/tracking/index\"\n\nimport {\n getLastContactInfoSyncPromise,\n} from \"app/authentication/contact_info_caching/index\"\n\nimport { track as Google_Event_track } from \"app/tracking/google/event\"\nimport { PageInstance } from \"app/page_instance\"\n\n\n\nconst RejectionReasons = {\n ERROR_REPORTED: \"ERROR_REPORTED\",\n}\n\nimport I18n from \"plugins/i18n-js\"\n\nconst STATE_CLASS_FOR_WORKING = \"city-update-subscription-button--working\"\nconst STATE_CLASS_FOR_FOLLOWED = \"city-update-subscription-button--following\"\n\n\ninterface Selector {\n main: string | JQuery\n\n all_containers_on_page: string\n follow_button: string\n following_button: string\n}\n\ninterface InputSelector {\n main: string | JQuery\n\n all_containers_on_page?: string\n follow_button?: string\n following_button?: string\n}\n\nconst default_selector = {\n main: $(),\n all_containers_on_page: \".cell--buildings--overseas-marketing--city-update-subscription--button-form\",\n follow_button: \".cell--buildings--overseas-marketing--city-update-subscription--button--follow\",\n following_button: \".cell--buildings--overseas-marketing--city-update-subscription--button--following\",\n}\n\n\nconst SOURCE_FILE_PATH = \"app/assets/javascripts/concepts/buildings/overseas_marketing/city_update_subscription/button/factory.es6\"\n\n\nclass CityUpdateSubscriptionButton extends EventEmitter {\n private selector: Selector\n\n private $el: JQuery\n private $follow_button: JQuery\n private $following_button: JQuery\n\n constructor(selector: InputSelector){\n super()\n\n this.selector = Object.assign({}, default_selector, selector)\n\n this.$el = $(this.selector.main)\n\n this.$follow_button = this.$el.find(this.selector.follow_button)\n this.$following_button = this.$el.find(this.selector.following_button)\n\n if (this.$el.length === 0) {\n return\n }\n\n this.bind_action()\n }\n\n\n private bind_action(){\n this.$follow_button.on(\"click\", (e) => {\n e.preventDefault()\n\n this.onFollowSubmit()\n })\n\n this.$following_button.on(\"click\", (e) => {\n e.preventDefault()\n\n this.onUnFollowSubmit()\n })\n\n return this\n }\n private onUnFollowSubmit() {\n const local_contact_info_data = getContactInfoData()\n const serialized_form_data = serialize((this.$el[0] as HTMLFormElement), {hash: true}) as {\n city_update_subscription_form?: {\n city_id: any\n }\n }\n\n let city_id = null as null | string\n if (typeof serialized_form_data.city_update_subscription_form === \"object\" &&\n serialized_form_data.city_update_subscription_form.city_id != null) {\n city_id = serialized_form_data.city_update_subscription_form.city_id.toString()\n }\n if (typeof city_id !== \"string\") {\n captureMessage(\n \"serialized_form_data.city_update_subscription_form.city_id is not string\",\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n if (! isPresentString(local_contact_info_data.contact_email_address)) {\n Auth_callback_queue.add(() => {\n getLastContactInfoSyncPromise()\n .then(() => this.onUnFollowSubmit())\n .done()\n }, \"event:unsubscribe_overseas_marketing_city_update\")\n\n Auth_action.showSignUpModal({\n enable_account_already_exists_error_message: false,\n })\n .then(({$modal, authentication_box}) => {\n authentication_box.on(\"sign_up:fail:account_conflict\", ({email_address}) => {\n $modal.modal(\"hide\")\n // Retry AFTER setting local contact email\n setContactInfoData({\n contact_email_address: email_address,\n })\n this.onUnFollowSubmit()\n })\n })\n .done()\n return\n }\n\n Promise.resolve()\n .then(() => {\n\n if (isSignedIn()) {\n return Promise.resolve()\n }\n\n return create_user({\n authentication_handle: local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\",\n email_address: local_contact_info_data.contact_email_address || \"\",\n sign_in_on_success: true,\n })\n .then(({result_type}) => {\n switch (result_type) {\n case CreateUserResultTypes.SUCCESS:\n trackSignUp()\n refreshAndUpdateComponentPromise().done()\n return\n case CreateUserResultTypes.CONFLICT:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type: <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n })\n .then(() => {\n this.setFormStateAsWorking()\n if (typeof city_id !== \"string\") { throw new Error(\"city_id is not string\") }\n return destroy_city_specific_subscription({\n // Need `||` to make flow happy\n user_authentication_handle: local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\",\n city_id: city_id,\n })\n })\n .then(({result_type}) => {\n switch (result_type) {\n case DestroyCitySpecificSubscriptionResultTypes.SUCCESS:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type from destroy_city_specific_subscription: <${result_type}>`,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n .then(() => {\n this.setFormStateAsDefault()\n\n this.emit(\"form_submission_succeeded\")\n\n const location_name = this.$el.data(\"location-name\")\n Notifier.showSuccess(I18n.t(`concepts.buildings.overseas_marketing.city_update_subscription.button.js.unfollowed`, {location_name: location_name}))\n })\n .catch((whatever) => {\n this.setFormStateAsFollowed()\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n })\n .done()\n }\n private onFollowSubmit() {\n const local_contact_info_data = getContactInfoData()\n const serialized_form_data = serialize((this.$el[0] as HTMLFormElement), {hash: true}) as {\n city_update_subscription_form?: {\n city_id: any\n }\n }\n\n let city_id = null as null | string\n if (typeof serialized_form_data.city_update_subscription_form === \"object\" &&\n serialized_form_data.city_update_subscription_form.city_id != null) {\n city_id = serialized_form_data.city_update_subscription_form.city_id.toString()\n }\n if (typeof city_id !== \"string\") {\n captureMessage(\n \"serialized_form_data.city_update_subscription_form.city_id is not string\",\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n if (! isPresentString(local_contact_info_data.contact_email_address)) {\n Auth_callback_queue.add(() => {\n getLastContactInfoSyncPromise()\n .then(() => this.onFollowSubmit())\n .done()\n }, \"event:subscribe_overseas_marketing_city_update\")\n\n Auth_action.showSignUpModal({\n enable_account_already_exists_error_message: false,\n })\n .then(({$modal, authentication_box}) => {\n authentication_box.on(\"sign_up:fail:account_conflict\", ({email_address}) => {\n $modal.modal(\"hide\")\n // Retry AFTER setting local contact email\n setContactInfoData({\n contact_email_address: email_address,\n })\n this.onFollowSubmit()\n })\n })\n .done()\n return\n }\n\n Promise.resolve()\n .then(() => {\n\n if (isSignedIn()) {\n return Promise.resolve()\n }\n\n return create_user({\n authentication_handle: local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\",\n email_address: local_contact_info_data.contact_email_address || \"\",\n sign_in_on_success: true,\n })\n .then(({result_type}) => {\n switch (result_type) {\n case CreateUserResultTypes.SUCCESS:\n trackSignUp()\n refreshAndUpdateComponentPromise().done()\n return\n case CreateUserResultTypes.CONFLICT:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type: <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n })\n .then(() => {\n this.setFormStateAsWorking()\n if (typeof city_id !== \"string\") { throw new Error(\"city_id is not string\") }\n return create_city_specific_subscription({\n // Need `||` to make flow happy\n user_authentication_handle: local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\",\n city_id: city_id,\n })\n })\n .then(({result_type}) => {\n switch (result_type) {\n case CreateCitySpecificSubscriptionResultTypes.SUCCESS:\n return\n case CreateCitySpecificSubscriptionResultTypes.RESOURCE_CREATED:\n Google_Event_track({\n category: PageInstance.currentPageNameForTracking(),\n action: \"Follow\",\n options: {\n eventLabel: \"Follow City - Followed\",\n },\n })\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type from create_city_specific_subscription: <${result_type}>`,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n .then(() => {\n this.setFormStateAsFollowed()\n\n this.emit(\"form_submission_succeeded\")\n\n const location_name = this.$el.data(\"location-name\")\n Notifier.showSuccess(I18n.t(`concepts.buildings.overseas_marketing.city_update_subscription.button.js.followed`, {location_name: location_name}))\n })\n .catch((whatever) => {\n this.setFormStateAsDefault()\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n })\n .done()\n }\n private setFormStateAsDefault() {\n $(default_selector.all_containers_on_page)\n .removeClass(\n STATE_CLASS_FOR_FOLLOWED\n )\n .removeClass(\n STATE_CLASS_FOR_WORKING\n )\n }\n private setFormStateAsWorking() {\n $(default_selector.all_containers_on_page)\n .removeClass(\n STATE_CLASS_FOR_FOLLOWED\n )\n .addClass(\n STATE_CLASS_FOR_WORKING\n )\n }\n private setFormStateAsFollowed() {\n $(default_selector.all_containers_on_page)\n .removeClass(\n STATE_CLASS_FOR_WORKING\n )\n .addClass(\n STATE_CLASS_FOR_FOLLOWED\n )\n }\n}\n\nconst Factory = {\n create(selector: InputSelector){\n return new CityUpdateSubscriptionButton(selector)\n },\n}\n\nexport {\n Factory,\n}\n","\n// region JS Imports\n\n// region External Modules\nimport $ from \"jquery\"\nimport u from \"umbrellajs\"\n// endregion External Modules\n\n// Private Modules\n// Private Modules\n\n// region Public Components\n// endregion Public Components\n\n// region Private Components\n// endregion Private Components\n\n// endregion JS Imports\nimport { Factory } from \"./factory\"\n\nconst CELL_CLASS_NAME = \"cell--buildings--overseas-marketing--city-update-subscription--button-form\"\nconst CELL_INITIALIZED_CLASS_NAME = `${CELL_CLASS_NAME}--js-spacious-initialized`\n\nconst init = () => {\n u(`.${CELL_CLASS_NAME}`).each((el) => {\n const $el = $(el)\n\n if (el.classList.contains(CELL_INITIALIZED_CLASS_NAME)) { return }\n el.classList.add(CELL_INITIALIZED_CLASS_NAME)\n\n Factory.create({\n main: $el,\n })\n })\n}\n\nexport default {\n init,\n}\n","\nimport Promise from \"plugins/bluebird\"\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\n/* eslint-disable no-unused-vars */\nexport enum FollowTypes {\n OVERSEAS = \"overseas\",\n}\n/* eslint-enable no-unused-vars */\n\ninterface Input {\n user_authentication_handle: string,\n\n country_name_in_en: string | number,\n\n follow_type: FollowTypes,\n}\n\n/* eslint-disable no-unused-vars */\nenum ResultTypeEnums {\n SUCCESS = \"SUCCESS\",\n UNAUTHENTICATED = \"UNAUTHENTICATED\",\n INVALID = \"INVALID\",\n SERVER_ERROR = \"SERVER_ERROR\",\n}\n/* eslint-enable no-unused-vars */\n\ntype PromiseResolvePayload = {\n result_type: ResultTypeEnums.SUCCESS,\n data: {},\n} | {\n result_type:\n ResultTypeEnums.UNAUTHENTICATED |\n ResultTypeEnums.INVALID |\n ResultTypeEnums.SERVER_ERROR,\n}\n\nconst subscribe = ({user_authentication_handle, country_name_in_en, follow_type}: Input): Promise => {\n return q_ajax_3(\n {\n url: \"/api/web_app/spacious_country_user_follow_relationships/subscribe\",\n type: \"POST\",\n\n // Expect JSON in response\n dataType: \"JSON\",\n\n // Sending JSON to server\n contentType: \"application/json; charset=utf-8\",\n data: JSON.stringify({\n user_authentication_handle: user_authentication_handle,\n country_name_in_en: country_name_in_en,\n follow_type: follow_type,\n\n locale: I18n.locale,\n }),\n },\n {\n custom_error_handler: ({http_status_code}) => {\n if (http_status_code === 401) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n if (http_status_code === 422) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n\n return AJAX_ERROR_HANDLER_ACTIONS.CONTINUE_RETRY\n },\n },\n )\n .then(() => {\n return (\n {\n result_type: ResultTypeEnums.SUCCESS,\n data: {},\n }\n )\n })\n .catch((reason_or_error) => {\n if (reason_or_error instanceof Error) {\n throw reason_or_error\n }\n\n const { response } = reason_or_error\n switch (response.status) {\n case 500:\n case 502:\n case 503:\n case 504:\n return ({\n result_type: ResultTypeEnums.SERVER_ERROR,\n })\n case 401:\n return ({\n result_type: ResultTypeEnums.UNAUTHENTICATED,\n })\n case 422:\n return ({\n result_type: ResultTypeEnums.INVALID,\n })\n default:\n return ({\n result_type: ResultTypeEnums.INVALID,\n })\n }\n })\n}\n\nexport {\n subscribe,\n ResultTypeEnums,\n}\n","\nimport Promise from \"plugins/bluebird\"\nimport {\n q_ajax_3,\n ERROR_HANDLER_ACTIONS as AJAX_ERROR_HANDLER_ACTIONS,\n} from \"app/utils/q_ajax/q_ajax_3\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\n/* eslint-disable no-unused-vars */\nexport enum FollowTypes {\n OVERSEAS = \"overseas\",\n}\n/* eslint-enable no-unused-vars */\n\ninterface Input {\n user_authentication_handle: string,\n\n country_name_in_en: string | number,\n\n follow_type: FollowTypes,\n}\n\n/* eslint-disable no-unused-vars */\nenum ResultTypeEnums {\n SUCCESS = \"SUCCESS\",\n UNAUTHENTICATED = \"UNAUTHENTICATED\",\n INVALID = \"INVALID\",\n SERVER_ERROR = \"SERVER_ERROR\",\n}\n/* eslint-enable no-unused-vars */\n\ntype PromiseResolvePayload = {\n result_type: ResultTypeEnums.SUCCESS,\n data: {},\n} | {\n result_type:\n ResultTypeEnums.UNAUTHENTICATED |\n ResultTypeEnums.INVALID |\n ResultTypeEnums.SERVER_ERROR,\n}\n\nconst unsubscribe = ({user_authentication_handle, country_name_in_en, follow_type}: Input): Promise => {\n return q_ajax_3(\n {\n url: \"/api/web_app/spacious_country_user_follow_relationships/unsubscribe\",\n type: \"POST\",\n\n // Expect JSON in response\n dataType: \"JSON\",\n\n // Sending JSON to server\n contentType: \"application/json; charset=utf-8\",\n data: JSON.stringify({\n user_authentication_handle: user_authentication_handle,\n country_name_in_en: country_name_in_en,\n follow_type: follow_type,\n\n locale: I18n.locale,\n }),\n },\n {\n custom_error_handler: ({http_status_code}) => {\n if (http_status_code === 401) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n if (http_status_code === 422) {\n return AJAX_ERROR_HANDLER_ACTIONS.STOP_RETRY\n }\n\n return AJAX_ERROR_HANDLER_ACTIONS.CONTINUE_RETRY\n },\n },\n )\n .then(() => {\n return (\n {\n result_type: ResultTypeEnums.SUCCESS,\n data: {},\n }\n )\n })\n .catch((reason_or_error) => {\n if (reason_or_error instanceof Error) {\n throw reason_or_error\n }\n\n const { response } = reason_or_error\n switch (response.status) {\n case 500:\n case 502:\n case 503:\n case 504:\n return ({\n result_type: ResultTypeEnums.SERVER_ERROR,\n })\n case 401:\n return ({\n result_type: ResultTypeEnums.UNAUTHENTICATED,\n })\n case 422:\n return ({\n result_type: ResultTypeEnums.INVALID,\n })\n default:\n return ({\n result_type: ResultTypeEnums.INVALID,\n })\n }\n })\n}\n\nexport {\n unsubscribe,\n ResultTypeEnums,\n}\n","\nimport { EventEmitter } from \"events\"\n\nimport Promise from \"plugins/bluebird/index\"\nimport $ from \"jquery\"\n\nimport Modal from \"app/modal/show-modal\"\nimport Auth_action from \"app/authentication/action\"\nimport Auth_callback_queue from \"app/authentication/callback_queue\"\n\nimport {\n refreshAndUpdateComponentPromise,\n} from \"app/authentication/remote_state\"\n\nimport {\n captureMessage,\n captureException,\n} from \"app/error_reporting/index\"\n\nimport {\n getContactInfoData,\n setContactInfoData,\n} from \"app/local_storages/contact_info_storage/index\"\n\nimport {\n create as create_user,\n ResultTypeEnums as CreateUserResultTypes,\n} from \"app/resources/users/create/index\"\n\nimport {\n isPresentString,\n} from \"app/utils/type_checking\"\n\nimport {\n isSignedIn,\n} from \"app/authentication/state\"\n\nimport {\n subscribe as subscribe_country_user_following,\n ResultTypeEnums as SubscribeCountryUFollowingResultTypes,\n FollowTypes as SubscribeCountryUFollowingFollowTypes,\n} from \"app/resources/spacious_country_user_follow_relationships/subscribe/index\"\n\nimport {\n unsubscribe as unsubscribe_country_user_following,\n ResultTypeEnums as UnsubscribeCountryUFollowingResultTypes,\n FollowTypes as UnsubscribeCountryUFollowingFollowTypes,\n} from \"app/resources/spacious_country_user_follow_relationships/unsubscribe/index\"\n\nimport {\n trackSignUp,\n} from \"app/authentication/tracking\"\n\nimport {\n getLastContactInfoSyncPromise,\n} from \"app/authentication/contact_info_caching\"\n\n\nconst RejectionReasons = {\n ERROR_REPORTED: \"ERROR_REPORTED\",\n}\n\nconst SOURCE_FILE_PATH = \"concepts/buildings/building_follow_button/factory\"\n\n\ninterface InputSelector {\n container: Element | JQuery,\n\n follow_button_primary?: string,\n unfollow_button_primary?: string,\n}\n\ninterface Selector {\n container: Element | JQuery,\n all_containers_on_page: string | JQuery,\n\n follow_button_primary: string,\n unfollow_button_primary: string,\n}\n\nconst default_selector = {\n container: $(),\n all_containers_on_page: \".cell--countries--follow-button\",\n\n follow_button_primary: \".cell--countries--follow-button__link--follow\",\n unfollow_button_primary: \".cell--countries--follow-button__link--unfollow\",\n}\n\nexport class FollowButton extends EventEmitter {\n private selector: Selector\n\n private readonly $container: JQuery\n private country_name_in_en: any\n\n private readonly $follow_button_primary: JQuery\n private readonly $unfollow_button_primary: JQuery\n private readonly on_followed_callbacks: Array<() => void> = []\n\n constructor(selector: InputSelector) {\n super()\n\n this.selector = Object.assign({}, default_selector, selector)\n\n this.$container = $(this.selector.container)\n\n this.country_name_in_en = this.$container.data(\"country-name-in-en\")\n\n this.$follow_button_primary =\n this.$container.find(this.selector.follow_button_primary)\n this.$unfollow_button_primary =\n this.$container.find(this.selector.unfollow_button_primary)\n\n if (this.$container.length !== 1){\n captureMessage(\n `$container contains non 1 (${this.$container.length}) elements`,\n {\n source_file_path: SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n this.bind_action()\n }\n\n public onFollowed(cb: () => void) {\n this.on_followed_callbacks.push(cb)\n }\n\n private runOnFollowedCallbacks() {\n this.on_followed_callbacks.forEach((cb) => cb())\n }\n\n private bind_action(){\n if (this.$follow_button_primary == null) { return }\n if (this.$unfollow_button_primary == null) { return }\n\n const $follow_button_primary = this.$follow_button_primary\n const $unfollow_button_primary = this.$unfollow_button_primary\n\n $follow_button_primary\n .on(\"click\", (e) => {\n e.preventDefault()\n\n const $nearest_container = this.$container\n const follow_type: string = $nearest_container.data(\"follow-type\")\n\n try {\n $follow_button_primary.prop(\"disabled\", true)\n this.onFollowClick(follow_type)\n }\n finally {\n $follow_button_primary.prop(\"disabled\", false)\n }\n })\n\n $unfollow_button_primary\n .on(\"click\", (e) => {\n e.preventDefault()\n\n const $nearest_container = this.$container\n const follow_type: string = $nearest_container.data(\"follow-type\")\n\n try {\n $unfollow_button_primary.prop(\"disabled\", true)\n this.onUnfollowClick(follow_type)\n }\n finally {\n $unfollow_button_primary.prop(\"disabled\", false)\n }\n })\n\n return this\n }\n\n private onFollowClick(follow_type: string) {\n Modal.showLoadingIndicator()\n\n const local_contact_info_data = getContactInfoData()\n\n if (! isPresentString(local_contact_info_data.contact_email_address)) {\n Auth_callback_queue.add(() => {\n getLastContactInfoSyncPromise()\n .then(() => this.onFollowClick(follow_type))\n .done()\n }, \"event:create_building_following\")\n\n Auth_action.showSignUpModal({\n enable_account_already_exists_error_message: false,\n })\n .then(({$modal, authentication_box}) => {\n authentication_box.on(\"sign_up:fail:account_conflict\", ({email_address}) => {\n $modal.modal(\"hide\")\n // Retry AFTER setting local contact email\n setContactInfoData({\n contact_email_address: email_address,\n })\n this.onFollowClick(follow_type)\n })\n })\n .done()\n return\n }\n\n let subscribe_building_following_inputs = {}\n Promise.resolve()\n .then(() => {\n Modal.showLoadingIndicator()\n\n if (isSignedIn()) {\n return Promise.resolve()\n }\n\n return create_user({\n authentication_handle: local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\",\n email_address: local_contact_info_data.contact_email_address || \"\",\n sign_in_on_success: true,\n })\n .then(({result_type}) => {\n switch (result_type) {\n case CreateUserResultTypes.SUCCESS:\n trackSignUp()\n refreshAndUpdateComponentPromise().done()\n return\n case CreateUserResultTypes.CONFLICT:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type: <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n })\n .then(() => {\n const inputs = {\n // Need `||` to make flow happy\n user_authentication_handle:\n local_contact_info_data.user_authentication_handle ||\n local_contact_info_data.contact_email_address ||\n \"\",\n\n country_name_in_en: this.country_name_in_en,\n follow_type: SubscribeCountryUFollowingFollowTypes.OVERSEAS,\n }\n subscribe_building_following_inputs = inputs\n return subscribe_country_user_following(inputs)\n })\n .then(({result_type}) => {\n switch (result_type) {\n case SubscribeCountryUFollowingResultTypes.SUCCESS:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type from subscribe_building_following: <${result_type}>`,\n Object.assign({\n \"source_file_path\":\n SOURCE_FILE_PATH,\n \"local_contact_info_data.contact_email_address\":\n local_contact_info_data.contact_email_address || \"unknown\",\n }, subscribe_building_following_inputs),\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n .then(() => {\n Modal.hideLoadingIndicator()\n this.displayAsFollowing()\n this.runOnFollowedCallbacks()\n })\n .catch((whatever) => {\n Modal.hideLoadingIndicator()\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n })\n .done()\n }\n\n private onUnfollowClick(_follow_type: string) {\n const local_contact_info_data = getContactInfoData()\n\n if (! isPresentString(local_contact_info_data.contact_email_address)) {\n // Do nothing but just pretend to have unfollow\n return\n }\n\n Promise.resolve()\n .then(() => {\n return unsubscribe_country_user_following({\n // Need `||` to make flow happy\n user_authentication_handle:\n local_contact_info_data.user_authentication_handle ||\n local_contact_info_data.contact_email_address ||\n \"\",\n\n country_name_in_en: this.country_name_in_en,\n follow_type: UnsubscribeCountryUFollowingFollowTypes.OVERSEAS,\n })\n })\n .then(({result_type}) => {\n switch (result_type) {\n case UnsubscribeCountryUFollowingResultTypes.SUCCESS:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type from unsubscribe_building_following: <${result_type}>`,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n .then(() => {\n this.displayAsNotFollowing()\n })\n .catch((whatever) => {\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n SOURCE_FILE_PATH,\n }\n )\n })\n .done()\n }\n\n private displayAsFollowing() {\n this.$container\n .addClass(\"following\")\n\n this.emit(\"country_following\")\n }\n private displayAsNotFollowing() {\n this.$container\n .removeClass(\"following\")\n }\n}\n\nconst Factory = {\n _instance: null as null | FollowButton,\n instance(selector: InputSelector){\n if (this._instance !== null) { return this._instance }\n\n this._instance = this.create(selector)\n return this._instance\n },\n create(selector: InputSelector){\n return new FollowButton(selector)\n },\n}\n\nexport {\n Factory,\n}\n","\n\n// region JS Imports\n\n// region External Modules\nimport u from \"umbrellajs\"\nimport Promise from \"plugins/bluebird\"\n// endregion External Modules\n\n// Private Modules\n// Private Modules\n\n// region Public Components\n// endregion Public Components\n\n// region Private Components\nimport {\n Factory,\n FollowButton,\n} from \"./factory\"\n// endregion Private Components\n\n// endregion JS Imports\n\n\nconst CELL_CLASS_NAME = \"cell--countries--follow-button\"\nconst CELL_INITIALIZED_CLASS_NAME = `${CELL_CLASS_NAME}--js-spacious-initialized`\n\n\ninterface Inputs {\n container?: string | HTMLElement\n}\ninterface SafeInputs {\n container: string | HTMLElement\n}\n\nconst DEFAULT_INPUTS: SafeInputs = {\n container: \"body\",\n}\n\n\nconst init = (inputs: Inputs = {}) => {\n const inputs_with_defaults: SafeInputs = Object.assign({}, DEFAULT_INPUTS, inputs)\n\n return Promise.mapSeries(\n u(inputs_with_defaults.container).find(`.${CELL_CLASS_NAME}`).nodes,\n (el) => {\n if (el.classList.contains(CELL_INITIALIZED_CLASS_NAME)) { return }\n el.classList.add(CELL_INITIALIZED_CLASS_NAME)\n\n return Factory.create({\n container: el,\n })\n },\n )\n .then((results) => {\n return results.filter((element): element is FollowButton => {\n return element != null\n })\n })\n}\n\n\nexport {\n init,\n}\n","\n// region JS Imports\n\n// region External Modules\nimport { EventEmitter } from \"events\"\nimport $ from \"jquery\"\nimport Promise from \"plugins/bluebird\"\n\nimport q_ajax_3 from \"app/utils/q_ajax/q_ajax_3\"\n// endregion External Modules\n\n// region Private Modules\nimport Google_PageView from \"app/tracking/google/page_view\"\nimport Goals_track from \"app/tracking/goals/track\"\nimport FacebookPixel_Event from \"app/tracking/facebook-pixel/event\"\n\nimport Concierge_Timer from \"app/concierge/timer\"\nimport Contact_shared from \"concepts/listings/contact/shared/index\"\nimport Contact_Modal from \"concepts/listings/contact/request/modal/index\"\nimport Notifier from \"app/notifier/index\"\n\nimport {\n refreshAndUpdateComponentPromise,\n} from \"app/authentication/remote_state\"\n\nimport {\n getContactInfoData,\n setContactInfoData,\n} from \"app/local_storages/contact_info_storage/index\"\n// endregion Private Modules\n\n// region Public Components\n// endregion Public Components\n\n// region Private Components\n// endregion Private Components\n\n// endregion JS Imports\n\n\nimport {\n get as get_user,\n ResultTypeEnums as GetUserResultTypes,\n} from \"app/resources/users/get/index\"\n\nimport {\n get_one as get_one_listing,\n ResultTypeEnums as GetOneListingResultTypes,\n} from \"app/resources/listings/get_one/index\"\n\nimport {\n create as create_user,\n ResultTypeEnums as CreateUserResultTypes,\n} from \"app/resources/users/create/index\"\n\nimport {\n create as createListingContactRequests,\n ResultTypeEnums as createListingContactRequestResultTypes,\n} from \"app/resources/listing_contact_requests/create/index\"\n\nimport {\n captureMessage,\n captureException,\n} from \"app/error_reporting/index\"\n\nimport {\n isSignedIn,\n} from \"app/authentication/state\"\n\nimport {\n isPresentString,\n} from \"app/utils/type_checking/index\"\n\nimport {\n trackSignUp,\n} from \"app/authentication/tracking/index\"\n\nimport {\n init as initBuildingFollowButtons,\n} from \"concepts/buildings/building_follow_button/index\"\n\nimport {\n init as initNeighbourhoodFollowButtons,\n} from \"concepts/neighbourhoods/neighbourhood_follow_button/index\"\n\nimport {\n init as listing_shortlist_button_init,\n} from \"concepts/listings/listing_shortlist_button/index\"\n\nimport CityUpdateSubscriptionButton from \"concepts/buildings/overseas_marketing/city_update_subscription/button/index\"\n\nimport {\n init as CountryFollowButton_init,\n} from \"apps/spacious_website/components/countries/follow_button\"\n\n\nimport I18n from \"plugins/i18n-js\"\n\n\nconst RejectionReasons = {\n ERROR_REPORTED: \"ERROR_REPORTED\",\n OPERATION_ABORTED: \"OPERATION_ABORTED\",\n}\n\ninterface Selector {\n main: JQuery\n}\ninterface InputSelector {\n main: JQuery\n}\n\nclass ListingContactButton extends EventEmitter {\n protected selector: Selector\n protected $el: JQuery\n protected listing_id: any\n\n constructor(selector: InputSelector){\n super()\n\n this.selector = Object.assign({}, selector)\n this.$el = $(this.selector.main)\n this.listing_id = this.$el.data(\"listing-id\")\n\n this.bind_action()\n }\n\n\n protected bind_action(){\n this.$el.on(\"click\", (e) => {\n this.onClick(e)\n })\n }\n\n protected onClick(e: Event) {\n e.preventDefault()\n\n const $clicked_button = this.$el\n\n if ($clicked_button.hasClass(\"cell--listings--contact--button--clicked\")){\n return\n }\n\n Concierge_Timer.clearTimer()\n\n let tracking_container_name = \"\"\n if ($clicked_button.parents(\".cell-listings-modals-basic-info\").length > 0) {\n tracking_container_name = \"/listing-modal\"\n }\n else if ($clicked_button.parents(\".listing-search-result--listings\").length > 0) {\n tracking_container_name = \"/listing-search-result-container-list-view\"\n }\n\n Google_PageView.track(\n [\n \"/fake-path\",\n \"/apps/spacious-web-app\",\n `/pages/${Contact_shared.getPageElementForTracking()}`,\n `/components${tracking_container_name}`,\n \"/contact-lister-button\",\n \"/events/click\",\n ].join(\"\")\n )\n\n const local_contact_info_data = getContactInfoData()\n\n const user_authentication_handle =\n local_contact_info_data.user_authentication_handle || local_contact_info_data.contact_email_address || \"\"\n const contact_email_address =\n local_contact_info_data.contact_email_address\n const contact_phone_number =\n local_contact_info_data.contact_phone_number\n\n if (contact_email_address == null ||\n !isPresentString(contact_email_address)) {\n\n // Not enough contact into\n this.showContactModal()\n return\n }\n\n import(\n \"libphonenumber-js\"\n )\n .then(({isValidNumber: isValidPhoneNumber}) => {\n get_user({\n authentication_handle: user_authentication_handle,\n })\n .then(({result_type, data}) => {\n switch (result_type) {\n case GetUserResultTypes.SUCCESS: {\n if (data == null) {\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n const remote_contact_phone_number: null | string = data.contact_phone_number\n let final_contact_phone_number = contact_phone_number\n\n if (contact_phone_number == null ||\n !isPresentString(contact_phone_number) ||\n !isValidPhoneNumber(contact_phone_number)) {\n\n if (remote_contact_phone_number == null ||\n !isPresentString(remote_contact_phone_number) ||\n !isValidPhoneNumber(remote_contact_phone_number)) {\n\n this.showContactModal()\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n setContactInfoData({\n contact_phone_number: remote_contact_phone_number,\n })\n final_contact_phone_number = remote_contact_phone_number\n }\n else {\n final_contact_phone_number = contact_phone_number\n }\n\n if (data.fast_contact_request_creation_enabled === false) {\n this.showContactModal()\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n this._tryCreateListingContactRequests({\n user_authentication_handle: user_authentication_handle,\n contact_email_address: contact_email_address,\n contact_phone_number: final_contact_phone_number,\n })\n return\n }\n case GetUserResultTypes.RESOURCE_NOT_FOUND: {\n // no way to auto-fill, show modal\n this.showContactModal()\n throw RejectionReasons.OPERATION_ABORTED\n }\n // Pointless to show contact modal since unauthorized\n case GetUserResultTypes.UNAUTHORIZED: {\n Notifier.showWarning(I18n.t(\"app_resources.listing_contact_requests_create.errors.unauthorized\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n case GetUserResultTypes.SERVER_ERROR: {\n Notifier.showWarning(I18n.t(\"app_resources.listing_contact_requests_create.errors.server_error\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n default: {\n captureMessage(\n `unexpected/unhandled result_type: <${result_type}>`,\n Object.assign({\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index\",\n authentication_handle:\n user_authentication_handle,\n }),\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n }\n })\n .catch((whatever) => {\n\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n if (whatever === RejectionReasons.OPERATION_ABORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n \"concepts/listings/contact/button/events/index\",\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n \"concepts/listings/contact/button/events/index\",\n }\n )\n })\n .done()\n })\n }\n\n protected _tryCreateListingContactRequests({\n user_authentication_handle,\n contact_email_address,\n contact_phone_number,\n }: {\n user_authentication_handle: string,\n contact_email_address: string,\n contact_phone_number: string,\n }) {\n\n Promise.resolve()\n .then(() => {\n if (isSignedIn()) {\n return Promise.resolve()\n }\n\n return create_user({\n authentication_handle: user_authentication_handle,\n email_address: contact_email_address,\n sign_in_on_success: true,\n })\n .then(({result_type}) => {\n switch (result_type) {\n case CreateUserResultTypes.SUCCESS:\n trackSignUp()\n refreshAndUpdateComponentPromise().done()\n return\n case CreateUserResultTypes.CONFLICT:\n return\n default:\n captureMessage(\n `unexpected/unhandled result_type: <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n })\n })\n .then(() => {\n return createListingContactRequests({\n user_authentication_handle: user_authentication_handle,\n\n listing_id: this.listing_id,\n\n listing_contact_request_attributes: {\n requester_email_address:\n contact_email_address,\n requester_phone_number:\n contact_phone_number,\n },\n reject_promotions: null,\n })\n })\n .then(({result_type, data}) => {\n if (result_type === createListingContactRequestResultTypes.LISTING_CONTACT_EMAIL_OR_PHONE_ABSENT) {\n this.showContactModal()\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n // Pointless to show contact modal since unauthorized\n if (result_type === createListingContactRequestResultTypes.UNAUTHORIZED) {\n Notifier.showWarning(I18n.t(\"app_resources.listing_contact_requests_create.errors.unauthorized\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n if (result_type === createListingContactRequestResultTypes.LISTING_EXPIRED) {\n Notifier.showWarning(I18n.t(\"app_resources.listing_contact_requests_create.errors.listing_expired\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n // Since enquiry already sent\n // We prevent further enquiries to be created\n // And no modal shown\n if (result_type === createListingContactRequestResultTypes.CONFLICTING_RESOURCE_ALREADY_EXISTS) {\n Notifier.showWarning(I18n.t(\"app_resources.listing_contact_requests_create.errors.conflicting_resource_already_exists\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n if (result_type === createListingContactRequestResultTypes.INVALID_CONTACT_PHONE_NUMBER) {\n Notifier.showError(I18n.t(\"app_resources.listing_contact_requests_create.errors.invalid_contact_phone_number\"))\n throw RejectionReasons.OPERATION_ABORTED\n }\n\n\n if (result_type !== createListingContactRequestResultTypes.SUCCESS) {\n captureMessage(\n `unexpected result_type from createListingContactRequests: ${result_type}`,\n {\n source_file_path:\n \"concepts/listings/contact/button/events/index\",\n contact_email_address:\n contact_email_address,\n contact_phone_number:\n contact_phone_number,\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n\n return data\n })\n .then((data) => {\n this.setAsEnquirySent()\n\n get_one_listing({\n id: this.listing_id,\n })\n .then(({result_type, data: listing_data}) => {\n switch (result_type) {\n case GetOneListingResultTypes.SUCCESS: {\n if (listing_data == null) {\n captureMessage(\n `unexpected/unhandled null listing_data from \"get_one_listing\": <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index.es6\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n\n if (listing_data.is_for_serviced_office) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.SERVICED_OFFICE,\n )\n FacebookPixel_Event.trackCustomEvent(\"SOCWS-EmailEnquiry\")\n return\n }\n if (listing_data.is_for_coworking_space) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.COWORKING_SPACE,\n )\n FacebookPixel_Event.trackCustomEvent(\"SOCWS-EmailEnquiry\")\n return\n }\n if (listing_data.is_for_business_center) {\n // Fallback for other business center types\n // If there are other new types in the future\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.BUSINESS_CENTER,\n )\n FacebookPixel_Event.trackCustomEvent(\"SOCWS-EmailEnquiry\")\n return\n }\n if (listing_data.for_overseas_marketing_only) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.OVERSEAS,\n )\n FacebookPixel_Event.trackCustomEvent(\"OP-EmailEnquiry\")\n return\n }\n if (listing_data.is_for_serviced_apartment) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.SERVICED_APARTMENT,\n )\n FacebookPixel_Event.trackCustomEvent(\"SACLS-EmailEnquiry\")\n return\n }\n if (listing_data.is_for_coliving_space) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.COLIVING_SPACE,\n )\n FacebookPixel_Event.trackCustomEvent(\"SACLS-EmailEnquiry\")\n return\n }\n\n if (listing_data.is_rental && !listing_data.is_commercial_listing) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.RESIDENTIAL_RENTAL,\n )\n FacebookPixel_Event.trackCustomEvent(\"RRRS-EmailEnquiry\")\n return\n }\n if (!listing_data.is_rental && !listing_data.is_commercial_listing) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.RESIDENTIAL_SALE,\n )\n FacebookPixel_Event.trackCustomEvent(\"RRRS-EmailEnquiry\")\n return\n }\n\n if (listing_data.is_rental && listing_data.is_commercial_listing) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.COMMERCIAL_RENTAL,\n )\n FacebookPixel_Event.trackCustomEvent(\"CRCS-EmailEnquiry\")\n return\n }\n if (!listing_data.is_rental && listing_data.is_commercial_listing) {\n Goals_track.ListingContactByEmail.track(\n Goals_track.ListingContactByEmail.PropertyTypeLabels.COMMERCIAL_SALE,\n )\n FacebookPixel_Event.trackCustomEvent(\"CRCS-EmailEnquiry\")\n return\n }\n\n break\n }\n default: {\n captureMessage(\n `unexpected/unhandled result_type from \"get_one_listing\": <${result_type}>`,\n {\n source_file_path:\n \"app/assets/javascripts/concepts/listings/contact/button/events/index.es6\",\n }\n )\n throw RejectionReasons.ERROR_REPORTED\n }\n }\n })\n\n return Promise.resolve(\n import(\n \"plugins/js-routes\"\n )\n )\n .then((Routes) => {\n return q_ajax_3({\n url: Routes.show_one_apps_spacious_website_partials_listing_contact_request_success_modals_path({\n locale: I18n.locale,\n listing_contact_request_id: data != null ? data.listing_contact_request_id : \"-1\",\n }),\n method: \"GET\",\n dataType: \"html\",\n })\n })\n })\n .then(({data}) => {\n return Promise.resolve(\n import(\"app/modal/show-modal\")\n )\n .then(({default: Modal}) => {\n Modal.hideTopModal()\n Modal.showModalWithContent(data)\n initNeighbourhoodFollowButtons()\n initBuildingFollowButtons()\n listing_shortlist_button_init().done()\n CityUpdateSubscriptionButton.init()\n CountryFollowButton_init().done()\n })\n })\n .catch((whatever) => {\n\n if (whatever === RejectionReasons.ERROR_REPORTED) { return }\n if (whatever === RejectionReasons.OPERATION_ABORTED) { return }\n\n if (whatever instanceof Error) {\n captureException(\n whatever,\n {\n source_file_path:\n \"concepts/listings/contact/button/events/index\",\n }\n )\n return\n }\n\n captureMessage(\n whatever.toString(),\n {\n source_file_path:\n \"concepts/listings/contact/button/events/index\",\n }\n )\n })\n .done()\n }\n\n protected setAsEnquirySent(){\n this.$el.addClass(\"cell--listings--contact--button--clicked\")\n }\n\n protected showContactModal() {\n const listing_id = this.$el.data(\"listing-id\")\n\n q_ajax_3({\n url: `/${I18n.locale}/listings/${listing_id}/contact_request`,\n method: \"GET\",\n dataType: \"html\",\n })\n .then(({data}) => {\n return Contact_Modal.loadAndShowModal(data)\n })\n .done()\n }\n}\n\n\nconst Factory = {\n create(selector: InputSelector){\n return new ListingContactButton(selector)\n },\n}\n\nexport {\n Factory,\n}\n","\n// region JS Imports\n\n// region External Modules\nimport $ from \"jquery\"\nimport u from \"umbrellajs\"\nimport {\n RequestIdleCallbackPayload,\n} from \"plugins/request-animation-frame-polyfill\"\n// endregion External Modules\n\n// Private Modules\n// Private Modules\n\n// region Public Components\n// endregion Public Components\n\n// region Private Components\nimport {\n Factory as EventsFactory,\n} from \"./events/index\"\n// endregion Private Components\n\n// endregion JS Imports\n\n\nconst CELL_CLASS_NAME = \"cell--listings--contact--button\"\nconst CELL_INITIALIZED_CLASS_NAME = `${CELL_CLASS_NAME}--js-spacious-initialized`\n\n// Returns whether something left not initialized\nconst init = (deadline?: RequestIdleCallbackPayload): boolean => {\n // using `#some` to allow short circuit (by returning true)\n return u(`.${CELL_CLASS_NAME}`).nodes.some((el) => {\n // Assume 5ms require for 1 contact button to be initialized\n if (deadline != null && deadline.timeRemaining() <= 5.0) return true\n\n const $el = $(el)\n\n if (el.classList.contains(CELL_INITIALIZED_CLASS_NAME)) { return }\n el.classList.add(CELL_INITIALIZED_CLASS_NAME)\n\n EventsFactory.create({\n main: $el,\n })\n })\n}\n\n// Returns whether something left not initialized\nconst onLoad = (deadline: RequestIdleCallbackPayload): boolean => {\n return init(deadline)\n}\n\nexport default {\n init,\n onLoad,\n}\n"],"file":"assets/index-C47Elvxa.js"}