{"version":3,"file":"main-bundle.e3dc618e5126a15c7568.js","mappings":"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uE,GACVl/E,EAAagY,IACb2kB,EACA38B,EAAay5B,yBACbiD,EACA18B,EAAa+5B,wBACbolD,EACAC,EACAC,EACA4mB,EACAC,EACAC,EACA7mB,EACAC,EACAC,IArCJ57D,EAAK7S,OAAS4uE,GACVknB,EAAuBh/E,EAAAA,GAAY+Z,+BAAiC/Z,EAAAA,GAAY8Z,mBAChFhF,EACAijD,EACA5/E,EAAay5B,yBACbiD,EACAmjD,EACA7/E,EAAa+5B,wBACbolD,EACAC,EACAC,EACA4mB,EACAC,EACAC,EACA7mB,EACAC,EACAC,EACA4mB,EACAC,EACAC,GAsBD1iF,CAAI,EAiQQk9D,CACHnkD,EACA8jD,EAAe9jD,OACfD,EACA+jD,EAAe/jD,UACf7xB,EACA7K,EACA6gF,EACAJ,EAAe9gE,KACfw/D,EACAC,EACAC,EACA4mB,EACAC,EACAC,EACA1lB,EAAetB,YACfsB,EAAerB,YACfqB,EAAepB,wBACfoB,EAAewlB,gBACfxlB,EAAeylB,aACfzlB,EAAe0lB,cACfU,EAGZ,CACJ,MAAO,GAAIpmB,EAAeC,SACtB,MAzRcK,EAClBpkD,EACAD,EACA7xB,EACA7K,EACAm/E,EACAC,EACAC,EACA4mB,EACAC,EACAC,KAEa,CACT1oB,eAAgBz9E,EAAay5B,yBAC7BikD,kBAAmB19E,EAAa+5B,wBAChChpB,OAAQmuE,GACJl/E,EAAagY,IACb2kB,EACA38B,EAAay5B,yBACbiD,EACA18B,EAAa+5B,wBACbolD,EACAC,EACAC,EACA4mB,EACAC,EACAC,GAEJnsE,YAAaw4C,GACTxyE,EACAm/E,EACAC,EACAC,EACA4mB,EACAC,EACAC,GAEJt7F,mBACAioE,gBAAgB,EAChBqN,uBAAuB,EACvBC,uBAAuB,EACvBC,mCAAmC,EACnCqmB,2BAA2B,EAC3BC,wBAAwB,EACxBC,yBAAyB,EACzBtmB,4BAA4B,EAC5BlmD,sBAAsB,EACtBmmD,aAAa,IA0ONQ,CACHpkD,EACAD,EACA7xB,EACA7K,EACAm/E,EACAC,EACAC,EACA4mB,EACAC,EACAC,GAIR,OAAOjmB,GACHvjD,EACAD,EACA7xB,EACA7K,EACAm/E,EACAC,EACAC,EACA4mB,EACAC,EACAC,EACH,iGC1xBE,MAAMtwD,EAAqBA,KAAMsvB,EAAAA,EAAAA,IAAgBlqE,EAAAA,GAAcC,iBAAmB1U,EAAAA,GAASC,iFCC3F,MAAMu6F,EAAsBp5F,GACxBA,GAAwBA,EAAqBgtB,OAAS,sECL1D,IAiBKkyF,EAAsB,SAAtBA,GAAsB,OAAtBA,EAAsB,0BAAtBA,EAAsB,gCAAtBA,EAAsB,8BAAtBA,EAAsB,8BAAtBA,EAAsB,8BAAtBA,EAAsB,wBAAtBA,CAAsB,0TCjB3B,ICAK1mE,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,UAAjBA,EAAiB,kBAAjBA,EAAiB,cAAjBA,EAAiB,4BAAjBA,EAAiB,gBAAjBA,EAAiB,kBAAjBA,EAAiB,8BAAjBA,CAAiB,MAUjBkB,EAA0B,SAA1BA,GAA0B,OAA1BA,EAA0B,uDAA1BA,EAA0B,+CAA1BA,CAA0B,MAK1BylE,EAAwC,SAAxCA,GAAwC,OAAxCA,EAAwC,kBAAxCA,EAAwC,4BAAxCA,EAAwC,kBAAxCA,CAAwC,MCfxCztE,EAAM,SAANA,GAAM,OAANA,EAAM,+BAANA,EAAM,iCAANA,EAAM,4CAANA,EAAM,kDAANA,EAAAA,EAAM,0CAANA,EAAAA,EAAM,4CAANA,EAAAA,EAAM,kDAANA,EAAAA,EAAM,0DAANA,EAAAA,EAAM,oDAANA,EAAM,cAANA,EAAM,oBAANA,EAAM,0CAANA,CAAM,MAeNw0C,EAAU,SAAVA,GAAU,OAAVA,EAAU,iCAAVA,EAAU,4CAAVA,EAAU,kDAAVA,EAAU,oCAAVA,EAAU,0CAAVA,EAAU,0CAAVA,EAAU,gDAAVA,EAAU,gDAAVA,EAAU,sDAAVA,CAAU,MCfVC,EAA2C,SAA3CA,GAA2C,OAA3CA,EAA2C,sBAA3CA,EAA2C,oBAA3CA,EAA2C,cAA3CA,EAA2C,oBAA3CA,EAA2C,0BAA3CA,EAA2C,sBAA3CA,CAA2C,MCA3CnxE,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,oCAAlBA,EAAkB,wCAAlBA,EAAkB,oCAAlBA,EAAkB,oCAAlBA,EAAkB,gDAAlBA,EAAkB,2DAAlBA,EAAkB,+BAAlBA,EAAkB,iDAAlBA,CAAkB,MCAlBojC,EAA0B,SAA1BA,GAA0B,OAA1BA,EAA0B,8BAA1BA,EAA0B,4CAA1BA,EAA0B,uBAA1BA,EAA0B,2BAA1BA,EAA0B,6BAA1BA,EAA0B,+BAA1BA,EAA0B,4CAA1BA,EAA0B,oCAA1BA,EAA0B,oDAA1BA,EAA0B,0CAA1BA,EAA0B,wEAA1BA,EAA0B,0CAA1BA,EAA0B,wEAA1BA,CAA0B,MCA1BrF,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,uBAAnBA,EAAmB,qBAAnBA,EAAmB,cAAnBA,EAAmB,oBAAnBA,EAAmB,sCAAnBA,EAAmB,oCAAnBA,EAAmB,kBAAnBA,EAAmB,2BAAnBA,EAAmB,YAAnBA,EAAmB,uBAAnBA,EAAmB,mBAAnBA,EAAmB,6BAAnBA,EAAmB,iCAAnBA,EAAmB,mBAAnBA,EAAmB,2BAAnBA,CAAmB,MCAnBqzC,EAAuB,SAAvBA,GAAuB,OAAvBA,EAAuB,kBAAvBA,EAAuB,UAAvBA,EAAuB,gCAAvBA,EAAuB,8CAAvBA,CAAuB,gBCA5B,IAAKzzC,EAAQ,SAARA,GAAQ,OAARA,EAAQ,oCAARA,EAAQ,eAARA,EAAQ,wBAARA,CAAQ,gGCAb,IAAKgC,EAAQ,SAARA,GAAQ,OAARA,EAAQ,sBAARA,CAAQ,MAIb,MAAMD,EAAuB,4OCiC7B,MAAMznB,EAAiB,CAC1BC,QAASC,EAAAA,GAAQ6rB,QACjBntC,QAAS,MAoBN,SAASuhB,IACZ,OAAOC,IAAAA,KAAW,gDAAiD,KAAM,CACrEC,iBAAiB,GAEzB,CAuBO,SAASI,EAAY/nB,GACxB,OAAO0nB,IAAAA,KAAW,yCAA0C1nB,EAAM,CAC9D2nB,iBAAiB,GAEzB,CAWO,SAASK,EAAchoB,GAC1B,OAAO0nB,IAAAA,KAAW,uCAAwC1nB,EAAM,CAC5D2nB,iBAAiB,GAEzB,CAEO,SAASk5D,EAAkB5oF,EAAiB03B,EAAmBC,GAClE,OAAOlI,IAAAA,IAAU,uCAAwC,CACrD1hB,OAAQ,CACJ/N,UACA03B,YACAC,mBAGZ,CAGO,SAAS3H,EAAoBjoB,GAChC,OAAO0nB,IAAAA,KAAW,0EAAuC1nB,EAC7D,CAEA,MACIy5G,mBAtEG,WACH,MAAM1C,GAZuBC,EAYe1vF,GAX5C/tB,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GACOy9G,GAAW,IACd9wG,SAASoiD,EAAAA,EAAAA,QAHgB0uD,MAa7B,OAAOtvF,IAAAA,KAAW,4BAA6B,KAAM,CAAE1hB,OAAQ+wG,GACnE,EAoEIjvF,eA3CG,SAAwB9nB,GAC3B,OAAO0nB,IAAAA,KAAW,oCAAqC1nB,EAC3D,EA0CI4nB,kBA3DG,SAA2B5nB,GAC9B,OAAO0nB,IAAAA,KAAW,oCAAqC1nB,EAAM,CACzD2nB,iBAAiB,EACjB3hB,OAAQshB,GAEhB,EAuDIO,kBApDG,SAA2B7nB,GAC9B,OAAO0nB,IAAAA,KAAW,oCAAqC1nB,EAAM,CACzD2nB,iBAAiB,GAEzB,EAiDIs5D,yBAjCG,SAAkCjhF,GACrC,OAAO0nB,IAAAA,KAAW,kDAAmD1nB,EAAM,CACvE2nB,iBAAiB,GAEzB,6GC9FO,IAAKurB,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAwB,uDAAxBA,EAAwB,iFAAxBA,EAAwB,+DAAxBA,EAAwB,mFAAxBA,EAAwB,gFAAxBA,EAAwB,4DAAxBA,EAAwB,sDAAxBA,EAAwB,oEAAxBA,CAAwB,MAW7B,MAAMH,EAAuB,CAChCouC,WAAaz9E,IAA8B3J,EAAAA,EAAAA,IAAam5C,EAAyBxhB,gBAAiB,CAAEhuB,WACpG29E,uBAAyB39E,IACrB3J,EAAAA,EAAAA,IAAam5C,EAAyBzX,8BAA+B,CAAE/3B,WAC3E69E,gCAAiCA,KAAMxnF,EAAAA,EAAAA,IAAam5C,EAAyBtX,gCAC7EjD,uBAAyB34B,IACrBjG,EAAAA,EAAAA,IAAam5C,EAAyB3tB,0BAA2B,CAC7DvlB,SAER27B,UAAWA,KAAM5hC,EAAAA,EAAAA,IAAam5C,EAAyB5tB,gBACvDyN,cAAgBtN,IAAmB1rB,EAAAA,EAAAA,IAAam5C,EAAyB1tB,gBAAiB,CAAEC,UAC5FuJ,YAAaA,CAACrJ,EAA8BC,KACxC7rB,EAAAA,EAAAA,IAAam5C,EAAyBxtB,aAAc,CAChDC,WACAC,eAERgoB,kBAAoBuP,IAAsBpjD,EAAAA,EAAAA,IAAam5C,EAAyBsL,oBAAqB,CAAErB,wHClBpG,IAAKvK,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,oDAAzBA,EAAyB,oDAAzBA,EAAyB,wEAAzBA,EAAyB,sDAAzBA,EAAyB,oEAAzBA,EAAyB,0DAAzBA,EAAyB,gEAAzBA,EAAyB,iFAAzBA,EAAyB,oEAAzBA,EAAyB,0DAAzBA,EAAyB,0DAAzBA,EAAyB,gFAAzBA,EAAyB,wFAAzBA,EAAyB,4DAAzBA,EAAyB,sEAAzBA,EAAyB,4DAAzBA,EAAyB,0EAAzBA,EAAyB,6DAAzBA,EAAyB,4EAAzBA,EAAyB,wEAAzBA,EAAyB,gEAAzBA,EAAyB,kEAAzBA,EAAyB,4EAAzBA,EAAyB,gFAAzBA,EAAyB,oEAAzBA,EAAyB,oFAAzBA,EAAyB,oEAAzBA,EAAyB,8HAAzBA,EAAyB,gIAAzBA,EAAyB,oEAAzBA,EAAyB,4DAAzBA,EAAyB,wDAAzBA,EAAyB,kDAAzBA,EAAyB,sDAAzBA,EAAyB,+DAAzBA,CAAyB,MAsC9B,MAAMK,EAAwB,CACjCuuC,WAAaz+D,IAAqBhpB,EAAAA,EAAAA,IAAa64C,EAA0B9vB,YAAa,CAAEC,YACxF0O,oBAAsBxO,IAClBlpB,EAAAA,EAAAA,IAAa64C,EAA0B5vB,sBAAuB,CAAEC,aACpEmS,oBAAsBjS,IAClBppB,EAAAA,EAAAA,IAAa64C,EAA0B1vB,sBAAuB,CAAEC,cACpEu+D,YAAaA,KAAM3nF,EAAAA,EAAAA,IAAa64C,EAA0BxvB,cAC1DsS,gBAAkBpS,IAAoBvpB,EAAAA,EAAAA,IAAa64C,EAA0BvvB,kBAAmB,CAAEC,YAClGsS,kBAAoBpS,IAChBzpB,EAAAA,EAAAA,IAAa64C,EAA0BrvB,oBAAqB,CAAEC,WAClE6R,cAAgBjY,IAAuBrjB,EAAAA,EAAAA,IAAa64C,EAA0BnvB,eAAgB,CAAErG,eAChGyK,kBAAoBsD,IAChBpxB,EAAAA,EAAAA,IAAa64C,EAA0BvnB,oBAAqB,CACxDF,kBAERmF,cAAgB9E,IACZzxB,EAAAA,EAAAA,IAAa64C,EAA0BlnB,eAAgB,CACnDF,kBAERxD,cAAgB6D,IACZ9xB,EAAAA,EAAAA,IAAa64C,EAA0BhjC,eAAgB,CACnDic,iBAER2e,uBAAyB3e,IACrB9xB,EAAAA,EAAAA,IAAa64C,EAA0BtJ,0BAA2B,CAC9Dzd,iBAER81D,kBAAmBA,KAAM5nF,EAAAA,EAAAA,IAAa64C,EAA0BjjC,+BAChEmY,eAAgBA,CAACpkB,EAA2BoyE,EAAoB5/C,KAC5Dn8B,EAAAA,EAAAA,IACI64C,EAA0Btb,gBAC1B,CACI5zB,SACAwyB,WAEJ,CAAE4/C,cAEVp/C,mBAAoBA,CAChB/S,EACAC,EACA7O,EACA8O,EACAipB,EACAlvB,KAEA7jB,EAAAA,EAAAA,IAAa64C,EAA0BlvB,qBAAsB,CACzDC,gBACAC,MACA7O,QACA8O,MACAipB,aACAlvB,oBAERgkE,cAAgBltD,IACZ36B,EAAAA,EAAAA,IAAa64C,EAA0B9c,gBAAiB,CACpDpB,YAERmB,oBAAqBA,CAAC/X,EAA2Bg4D,KAC7C/7E,EAAAA,EAAAA,IACI64C,EAA0B9uB,uBAC1B,CACIhG,oBAEJ,CAAEg4D,cAEV7/C,gBAAkBlT,IACdhpB,EAAAA,EAAAA,IAAa64C,EAA0B7uB,kBAAmB,CACtDhB,YAERyY,iBAAmBxd,IACfjkB,EAAAA,EAAAA,IAAa64C,EAA0B5uB,mBAAoB,CACvDhG,kBAER6jE,mBAAoBA,KAAM9nF,EAAAA,EAAAA,IAAa64C,EAA0BluB,sBACjEoc,qBAAsBA,CAAC5iB,EAA2Bd,KAC9CrjB,EAAAA,EAAAA,IAAa64C,EAA0B3uB,wBAAyB,CAAE/F,oBAAmBd,eACzFujB,wBAAyBA,KAAM5mC,EAAAA,EAAAA,IAAa64C,EAA0B/L,2BACtEjG,kBAAmBA,CACf/iB,EACAnlB,EACAyrB,KAEApqB,EAAAA,EAAAA,IAAa64C,EAA0B1uB,oBAAqB,CACxDrG,kBACAnlB,WACAyrB,6CAERqc,yBAA2BpiB,IACvBrkB,EAAAA,EAAAA,IAAa64C,EAA0BvuB,4BAA6B,CAAEjG,0BAC1E2iB,kBAAmBA,CAAC3jB,EAAoBc,EAA2BZ,KAC/DvjB,EAAAA,EAAAA,IAAa64C,EAA0B7L,oBAAqB,CACxD3pB,aACAc,oBACAZ,qBAER0Z,2CAA6C7Y,IACzCpkB,EAAAA,EAAAA,IAAa64C,EAA0BtuB,iDAAkD,CACrFnG,+BAER+Y,kBAAoBzS,IAChB1qB,EAAAA,EAAAA,IAAa64C,EAA0BpuB,oBAAqB,CAAEC,mBAClE4f,4CAA6CA,KACzCtqC,EAAAA,EAAAA,IAAa64C,EAA0BruB,mDAC3CqoB,eAAiBppB,IAA0BzpB,EAAAA,EAAAA,IAAa64C,EAA0BwL,gBAAiB,CAAE56B,WACrG8oB,aAAe6C,IAAsBp1C,EAAAA,EAAAA,IAAa64C,EAA0ByL,cAAe,CAAElP,cAC7FlD,UAAYmD,IAAmBr1C,EAAAA,EAAAA,IAAa64C,EAA0B0L,WAAY,CAAElP,WACpF0yC,WAAa/mF,IAAiBhB,EAAAA,EAAAA,IAAa64C,EAA0B2L,aAAc,CAAExjD,SACrFy0B,aAAe3Q,IACX9kB,EAAAA,EAAAA,IAAa64C,EAA0B1tB,eAAgB,CACnDrG,yHC5JL,IAAK2zB,EAAwB,SAAxBA,GAAwB,OAAxBA,EAAwB,+DAAxBA,EAAwB,mDAAxBA,EAAwB,iEAAxBA,EAAwB,+EAAxBA,EAAwB,+EAAxBA,EAAwB,uEAAxBA,CAAwB,MAS7B,MAAM/pB,EAAiB,CAC1BsE,gBAAkBw1D,IAAsBxoF,EAAAA,EAAAA,IAAay4C,EAAyBlwB,kBAAmB,CAAEigE,YACnG75D,WAAYA,CAACnqB,EAA4BkkB,EAAsBy7B,EAAmBC,KAC9EpkD,EAAAA,EAAAA,IAAay4C,EAAyBjwB,YAAa,CAC/ChkB,UACAkkB,SACAy7B,gBACAC,aAERqkC,uBAAyBC,IACrB1oF,EAAAA,EAAAA,IAAay4C,EAAyB5vB,0BAA2B6/D,GACrEC,uBAAyBnkF,IACrBxE,EAAAA,EAAAA,IAAay4C,EAAyBmwC,0BAA2B,CAAEpkF,YACvEoqB,iBAAmBhG,IAAoB5oB,EAAAA,EAAAA,IAAay4C,EAAyB9vB,mBAAoB,CAAEC,WACnG8f,oBAAsB3pB,IAClB/e,EAAAA,EAAAA,IAAay4C,EAAyB3vB,sBAAuB,CAAE/J,kQCzBhE,MAAMiU,EAAmB30B,GAAmCA,EAAMg6D,OAAO7zD,QAAQgS,aAC3EmZ,EAAoBtxB,GAAmCA,EAAMg6D,OAAOzzD,SACpEirB,EAAexxB,GAAmCA,EAAMg6D,OAAO7zD,QAAQwe,SACvEu3B,EAAmBl8C,GAAmCA,EAAMg6D,OAAO7zD,QACnE0vB,EAAkB71B,GAAmCA,EAAMg6D,OAAO7zD,QAAQsR,YAC1Eme,EAAgB51B,GAAmCA,EAAMg6D,OAAOhhD,KAChE+c,EAAmB/1B,GAAmCA,EAAMg6D,OAAOjtC,KACnEoJ,EAAkBn2B,GAAmCA,EAAMg6D,OAAOjrC,iHCPxE,IAAKguB,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,6CAAzBA,CAAyB,MAI9B,MAAMzC,EAAwB,CACjCvpB,MAAOA,CAACzmB,EAA6BozE,KACjC/7E,EAAAA,EAAAA,IAAao7C,EAA0BpyC,MAAO,CAAEL,gBAAgB,CAAEozE,2HCEnE,IAAKnjC,EAAqB,SAArBA,GAAqB,OAArBA,EAAqB,gEAArBA,EAAqB,wDAArBA,EAAqB,0EAArBA,EAAqB,4EAArBA,EAAqB,sEAArBA,EAAqB,4EAArBA,EAAqB,0DAArBA,EAAqB,4EAArBA,EAAqB,gEAArBA,EAAqB,oDAArBA,EAAqB,kFAArBA,EAAqB,0DAArBA,EAAqB,0DAArBA,EAAqB,kEAArBA,EAAqB,8CAArBA,EAAqB,gDAArBA,EAAqB,kFAArBA,EAAqB,oEAArBA,CAAqB,MAqB1B,MAAMK,EAAoB,CAC7B4vC,kBAAmBA,CAACl+E,EAAeygB,KAC/BprB,EAAAA,EAAAA,IAAa44C,EAAsB3f,oBAAqB,CAAEtuB,QAAOygB,SACrEkK,cAAgBrG,IACZjvB,EAAAA,EAAAA,IAAa44C,EAAsBrpB,gBAAiB,CAAEN,eAC1D65D,qBAAsBA,KAAM9oF,EAAAA,EAAAA,IAAa44C,EAAsBxX,0BAC/DnC,8BAAgChT,IAC5BjsB,EAAAA,EAAAA,IAAa44C,EAAsB5sB,0BAA2B,CAAEC,gBACpEwR,8BAAgCzU,IAC5BhpB,EAAAA,EAAAA,IAAa44C,EAAsBlsB,0BAA2B,CAAE1D,YACpEmQ,kBAAoBvM,IAAuB5sB,EAAAA,EAAAA,IAAa44C,EAAsBjsB,oBAAqB,CAAEC,cACrG6R,2BAA6BrS,IACzBpsB,EAAAA,EAAAA,IAAa44C,EAAsBzsB,uBAAwB,CAAEC,aACjE6U,8BAAgC1U,IAC5BvsB,EAAAA,EAAAA,IAAa44C,EAAsBtsB,0BAA2B,CAAEC,gBACpE2K,eAAiBjS,IAAwBjlB,EAAAA,EAAAA,IAAa44C,EAAsBnsB,iBAAkB,CAAExH,gBAChGmZ,YAAcp9B,IAAiBhB,EAAAA,EAAAA,IAAa44C,EAAsB/rB,cAAe,CAAE7rB,SACnF8+B,0BAA4B/S,IACxB/sB,EAAAA,EAAAA,IAAa44C,EAAsB9rB,6BAA8B,CAAEC,SACvEmM,eAAgBA,KAAMl5B,EAAAA,EAAAA,IAAa44C,EAAsB/e,kBACzDC,UAAWA,CAACiiD,EAAoBn2E,EAAmBm0B,EAAiBC,KAChEh6B,EAAAA,EAAAA,IAAa44C,EAAsB1e,WAAY,CAAEt0B,WAAUm0B,SAAQC,OAAO,CAAE+hD,cAChF5hD,WAAa4hD,IAAuB/7E,EAAAA,EAAAA,IAAa44C,EAAsBve,YAAa,CAAC,EAAG,CAAE0hD,cAC1FziD,eAAiBjmB,IAAuBrT,EAAAA,EAAAA,IAAa44C,EAAsB3rB,iBAAkB,CAAE5Z,gBAC/FsmB,kBAAoBnU,IAChBxlB,EAAAA,EAAAA,IAAa44C,EAAsB1rB,qBAAsB,CACrD1H,mBAERoU,yBAA2BnU,IACvBzlB,EAAAA,EAAAA,IAAa44C,EAAsBzrB,6BAA8B,CAAE1H,4BACvEyI,oBAAsB8I,IAClBh3B,EAAAA,EAAAA,IAAa44C,EAAsBhgB,sBAAuB,CAAE5B,iIC3D7D,MAAMkG,EAA0BtT,IACnC,IAAIc,EAAiB,EAQrB,OAPId,GACAA,EAActb,SAASqnF,IACfA,EAAiB30F,OAAS0lF,EAAAA,GAAwBz1E,SAAW0kF,EAAiBjrE,iBAC9EA,GAAkBirE,EAAiBjrE,eAAiBirE,EAAiB/kE,SACzE,IAGDlG,CAAc,EAGZwyF,EAAwBA,CAACtzF,EAA0CmH,KAC5E,IAAIrG,EAAiB,EAQrB,OAPId,GAAiBmH,GACjBnH,EAActb,SAASqnF,IACfA,EAAiBjrE,gBAAkBirE,EAAiB3pC,aAAej7B,EAAML,MACzEhG,EAAiBirE,EAAiBjrE,eAAiBirE,EAAiB/kE,SACxE,IAGDlG,CAAc,oJClBlB,MAAMq+D,EAAcA,CAACC,EAAmBC,IACpCD,EAAYC,EAyBjBC,EAAyBA,CAC3BC,EACAC,IAEOD,EAAYn7E,QAAO,CAACq7E,EAA6B9lE,KACpD,MAAM+lE,GAA+B9pF,EAAAA,EAAAA,GAAA,GAAQ6pF,GACvCE,EAAeH,EAAgB7lE,GAC/BimE,EAAkB9/E,OAAO2gD,KAAKk/B,GAEpC,OADAD,EAAgC/lE,GA1BbkmE,EAACD,EAA2BD,KACnD,IAAIP,EAAY,EAChB,OAAOQ,EAAgBx7E,QAAO,CAAC07E,EAAwBC,EAAaC,KAChE,MAAMC,EAA6B,IAAIH,GAEjCI,EADkBP,EAAaI,GACHvxC,MACT,IAArBwxC,IACAZ,EAAYc,GAGhB,MAAMviD,EAAqD,CACvDI,qBAAsBohD,EAAYC,EAAWc,IAGjD,OADAD,EAA2B54D,KAAKsW,GACzBsiD,CAA0B,GAClC,GAAoC,EAWiBJ,CAAmBD,EAAiBD,GACjFD,CAA+B,GACvC,CAAC,GAGK1iD,EAA0BA,CACnCluB,EACAguB,KAEA,MAAM,YAAEsR,GAAgBt/B,QAAAA,EAAgB,CAAC,EACnC0wE,EAAkBpxC,EAAYtR,GAC9ByiD,EAAcz/E,OAAO2gD,KAAK++B,GAChC,OAAOF,EAAuBC,EAAaC,EAAgB,EAGlDpsD,EAAyBA,CAAC+sD,EAAyB1mE,EAAoB2mE,KAChF,MAAMC,EAA+BF,EAAkB1mE,EAIvD,OAF4B2mE,EAA2C,GAA/BC,EAAoCA,CAElD,EAGjBC,EAAyBA,CAClCn5D,EACAH,EACAmgC,EACA5pB,EACAgjD,EACAC,KAEA,MA8BM,iBAAEC,EAAgB,UAAEtnD,GA9BaunD,MACnC,MAAMtB,GAAYl6E,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,SAAU,GAC7FojD,GAAez7E,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,SAAU,GAChGqjD,GAAiB17E,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,SAAU,GAClGsjD,GAAgB37E,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,SAAU,GACjGujD,GAAgB57E,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,SAAU,GAEvG,GAAIvW,IAAY9hB,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,OAAQ,GAC3F,MAAO,CAAEkjD,iBAAkB,EAAGtnD,UAAW,GAE7C,GAAInS,IAAY9hB,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,OAAQ,GAAI,CAC/F,MAAMwjD,GAAY3B,EAAYuB,GAAgBvB,EAAa,IAC3D,MAAO,CAAEqB,iBAAkBO,KAAKC,MAAMF,GAAU5nD,UAAW,EAC/D,CAEA,GAAInS,IAAY9hB,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,OAAQ,GAAI,CAC/F,MAAMwjD,GAAY3B,EAAYwB,GAAkBxB,EAAa,IAC7D,MAAO,CAAEqB,iBAAkBO,KAAKC,MAAMF,GAAU5nD,UAAW,EAC/D,CAEA,GAAInS,IAAY9hB,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,QAAS,OAAQ,GAAI,CAC/F,MAAMwjD,GAAY3B,EAAYyB,GAAiBzB,EAAa,IAC5D,MAAO,CAAEqB,iBAAkBO,KAAKC,MAAMF,GAAU5nD,UAAW,EAC/D,CAEA,MAAM4nD,GAAY3B,EAAY0B,GAAiB1B,EAAa,IAC5D,MAAO,CAAEqB,iBAAkBO,KAAKC,MAAMF,GAAU5nD,UAAW,EAAG,EAI1BunD,GAElClyC,GAAQtpC,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAeggC,EAAc5pB,EAAqB,OAAOpE,IAAa,SAAU,GACpGuE,EAAmC,WAAxBH,EAKjB,MAAO,CAAE2jD,cAFLF,KAAKC,MAAOR,EAAmB,IAAOjyC,GAAS9Q,EAAW,GAAK,KAAO8iD,GAA2Bx5D,GAE7EmS,YAAW,sLCxGhC,MAAM/S,EAAmBA,CAAC7M,EAAuCzK,KACpE,MAAM,OAAE+Q,GAAW/Q,QAAAA,EAAgB,CAAC,EAUpC,OATiByK,EAAenV,QAAO,CAAC+8E,EAAiCC,KACrE,MAAMC,EAAgBxhE,EAAOnd,MAAMu9C,GAAqBA,EAAIn5B,MAAQs6D,EAAWt6D,MAC/E,OAAIu6D,GACAA,EAAcr6D,SAAWo6D,EAAWp6D,SAC7B,IAAIm6D,EAAkBE,IAG1BF,CAAgB,GACxB,GACY,EAGNG,EAAkBzhE,GACpBA,EAAOjd,QACTukB,GACGA,EAAML,MAAQshB,EAAAA,GAAOW,cACrB5hB,EAAML,MAAQshB,EAAAA,GAAOY,oBACrB7hB,EAAML,MAAQshB,EAAAA,GAAOM,4BAIpB64C,EAAmB1hE,GACrBA,EAAOjd,QAAQukB,GAAUA,EAAML,IAAI9mB,SAASooC,EAAAA,GAAOC,SAAQ,GAGzDm5C,EAAsB3hE,GACxBA,EAAOjd,QACTukB,GAAUA,EAAML,IAAI9mB,SAASooC,EAAAA,GAAOK,WAAathB,EAAML,MAAQshB,EAAAA,GAAOM,4BACzE,GAyDOurE,EAA0BA,CACnCv9G,EACAoY,KAEA,IAAKA,IAAiBpY,EAAqBgtB,OAAQ,MAAO,CAAC,EAE3D,MAAMwwF,EAAe3yB,EAAgBzyE,EAAa+Q,QAC5Cs0F,EAAkB3yB,EAAmB1yE,EAAa+Q,QAExD,MAAO,CACHu0F,sBAAsB,EACtBC,oBAAoB,EACpBC,oBAAqB59G,EAAqBgM,MAAM6xG,GAAQA,EAAI1tF,aAAeqtF,GAAcptF,MACzF0tF,uBAAwB99G,EAAqBgM,MAAM6xG,GAAQA,EAAI1tF,aAAestF,GAAiBrtF,MAClG,qECzGE,MAAMZ,EAAiBA,CAACvG,EAAiBvG,KAE5C,MAAMtK,EAAesK,EAAS1W,MAAM+rB,GAAqBA,EAAK3H,MAAQnH,IACtE,OAAK7Q,GACMsK,EAAS,EAED,iGCAhB,MAAMqN,EAAkBA,CAC3B3X,EACA2K,EACAioE,EACAnoE,EACAwsB,KAEA,MAAMpf,EAAuB,GACvB4W,EACFmkD,IAA6B9nE,EAAAA,GAAWq2B,oBAClC3Y,EAAAA,GAAcga,cACdha,EAAAA,GAAcmG,QAClB9jB,EAAmB+nE,IAA6B9nE,EAAAA,GAAWC,KAAOyd,EAAAA,GAAcC,OAASgG,EACzFtW,EAAwBtN,IAAqB2d,EAAAA,GAAcC,OAAS,GAAK,EAEzEoqD,EAAgC,CAClC/6D,OAAQ,EACRC,WAAY/X,EAAagY,IACzBC,YAAapN,EACbqN,SAAUvN,EACVwN,wBACAC,uBAAwB,MAkD5B,OA/CI6e,EAAiBtX,MAAQsX,EAAiBmD,uBAAyBnD,EAAiB9X,UAC/E8X,EAAiB67C,iBAClBD,EAAiB96D,WAAakf,EAAiBtX,KAAK5H,WACpD86D,EAAiB36D,SAAW+e,EAAiBtX,KAAKzH,UAGtD26D,EAAiBz6D,uBAAyB,CACtC,CACI+P,eAAgB8O,EAAiBtX,KAAKwI,eACtCjQ,SAAU+e,EAAiBtX,KAAKzH,WAIxC+e,EAAiBlmB,OAAOnb,SAASyiB,IAC7Bw6D,EAAiBz6D,wBAAwBG,KAAK,CAC1C4P,eAAgB9P,EAAM8P,eACtBjQ,SAAUG,EAAMH,UAClB,KAIN+e,EAAiBmD,sBAAsBviB,EAAMU,KAAKs6D,GAGlDpoE,EAAemK,OAAS,GACxBnK,EAAe7U,SAASyiB,IACpB,MAAMosF,EAAS5sF,EAAMjkB,MAChBw9C,IACIA,EAAKr5B,aAAe8P,EAAAA,GAAY+Z,gCAC7BwP,EAAKr5B,aAAe8P,EAAAA,GAAYwX,wBACnC+R,EAAKh5B,yBAEVqsF,GAAUpsF,EAAML,IAAI9mB,SAASooC,EAAAA,GAAOC,OACpCkrE,EAAOvsF,UAAYG,EAAMH,SAEzBL,EAAMU,KAAK,CACPT,OAAQD,EAAMjD,OACdmD,WAAYM,EAAML,IAClBC,YAAapN,EACbqN,SAAUG,EAAMH,SAChBC,wBACAC,uBAAwB,MAEhC,IAIDP,CAAK,snCC1DhB,MAAMo7D,EAAsC,CACxC,CAACl/B,EAAAA,GAAUikB,gBAAiB,OAC5B,CAACjkB,EAAAA,GAAUiE,eAAgB,YAGzBqnD,EAAkB30E,IACpB,MAAM40E,EAAwC,CAAC,EAI/C,OAHA50E,EAAU90B,SAASyiB,IACfinF,EAASjnF,EAAML,KAAOK,CAAK,IAExBinF,CAAQ,EAGNnsB,EAAczmE,GACnBA,IAAa0zB,EAAAA,GAAkBzkB,QACxB4e,EAAAA,GAAS64C,iBAEhB1mE,IAAa0zB,EAAAA,GAAkB1c,MACxB6W,EAAAA,GAAS7W,MAEb6W,EAAAA,GAASC,WAOd64C,EAAuC,CACzCjoD,KAAM,EACNgB,SAAU,MAqBR66E,EAAgCA,CAACp8F,EAA8BgxC,KACjE,GAAIhxC,IAAqBC,EAAAA,GAAWC,KAChC,OAAOD,EAAAA,GAAWC,KAEtBxZ,QAAQmuE,IAAI,CAAE7jB,kBACd,MAAMqrD,EAAwBrrD,EAAc/nD,QAAQs9C,GAAwBA,EAAK9nD,MAAQ2wE,EAAAA,GAAiBxxC,SAC1G,OAAIy+E,EAAsBtyF,OAAS,GAAKsyF,EAAsB,GAAG59G,MAAQ2wE,EAAAA,GAAiBK,eAC/ExvD,EAAAA,GAAWq2B,oBAEfr2B,EAAAA,GAAW4X,KAAK,EAErBykF,EAA0BA,CAACt8F,EAA0BgxC,KACvD,GAAIhxC,IAAqBC,EAAAA,GAAWC,KAChC,OAAOq8F,EAAAA,GAAkB3+E,OAE7Bl3B,QAAQmuE,IAAI,CAAE7jB,kBACd,MAAMqrD,EAAwBrrD,EAAc/nD,QAAQs9C,GAAwBA,EAAK9nD,MAAQ2wE,EAAAA,GAAiBxxC,SAC1G,OAAIy+E,EAAsBtyF,OAAS,GAAKsyF,EAAsB,GAAG59G,MAAQ2wE,EAAAA,GAAiBK,eAC/E8sC,EAAAA,GAAkBhmE,oBAEtBgmE,EAAAA,GAAkBz4E,OAAO,EAE9B+lD,EAAmBC,IACrB,MAAM,KAAEh1D,EAAI,UAAE+K,EAAS,iBAAE7f,EAAgB,WAAEF,EAAU,SAAE1kB,EAAQ,KAAE2kC,EAAI,2BAAElf,GAA+BipE,EAEtG,IAAIE,EAAsC,KAC1C,GAAIl1D,EAAM,CACN,MAAM4/E,EACF10F,IAAqBC,EAAAA,GAAWC,KACgB,GAA1C4U,EAAK2f,YAAYn5C,IAAIsY,OAAO8gC,MAAMG,MAClC/f,EAAK2f,YAAYn5C,IAAIqY,QAAQ+gC,MAAMG,MACvC23C,EAA4B4vB,EAC9Bp8F,EACA8U,EAAK6uB,gBACPh1C,cACFq7E,EAAW,CACP5uF,WACA8tF,WAAY7uD,EAAAA,GAAoBmb,OAChC2zC,cAAe9uD,EAAAA,GAAoBmb,OACnC4zC,eAAgBt0D,EAAKvrB,KACrB8/E,eAAgB+yB,EAA8Bp8F,EAAkB8U,EAAK6uB,gBACrE2lC,eAAgB,IAChBC,oBAAgB7wF,EAChB8wF,UAAW,GAAG10D,EAAKvrB,QAAQijF,IAC3B/C,QAAS,GAAG30D,EAAK3H,OAAOq/D,IACxB9C,aAAc,UACd70C,MAAO6/D,EACPrnF,SAAUvN,EACV6pE,gBAAiB9oE,EAA6BA,EAA6Bf,OAAapnB,EACxFylD,UAAU5yC,EAAAA,EAAAA,GAAIu+E,EAAa,CAAC,4BAA6Bh1D,EAAK3H,IAAK,uBAAwB,GAC3Fy8D,sBAAuB7pD,EACvBlW,QAAQte,EAAAA,EAAAA,GAAIu+E,EAAa,CAAC,4BAA6Bh1D,EAAK3H,UAAMz0B,GAC5DoxF,EAAYxnE,gBACZ5pB,EAEd,CAEA,IAAIwxF,EAA6C,KAC7CrqD,IACAqqD,EAAgBrqD,EAAU/9B,KAAK0rB,IAC3B,MAAMq7E,EACF7oF,IAAqBC,EAAAA,GAAWC,KACiB,GAA3CsN,EAAMinB,YAAYn5C,IAAIsY,OAAO8gC,MAAMG,MACnCrnB,EAAMinB,YAAYn5C,IAAIqY,QAAQ+gC,MAAMG,MACxC23C,EAA4BxsE,EAAiBrR,cA2BnD,MA1BsC,CAClCvT,WACA8tF,WAAY7uD,EAAAA,GAAoBmb,OAChC2zC,cAAe9uD,EAAAA,GAAoBmb,OACnC4zC,eAAgB57D,EAAMjkB,KACtB8/E,eAAgBrpE,EAChBspE,eAAgB,IAChBC,oBAAgB7wF,EAChB8wF,UAAW,GAAGnvD,EAAAA,GAAoBmb,UAAUhoB,EAAMjkB,QAAQijF,IAC1D/C,QAAS,GAAGj8D,EAAML,OAAOq/D,IACzB9C,aACIl8D,EAAML,MAAQshB,EAAAA,GAAOW,cACrB5hB,EAAML,MAAQshB,EAAAA,GAAOY,oBACrB7hB,EAAML,MAAQshB,EAAAA,GAAOM,0BACf,SACA,UACV8F,MAAOg0D,EACPx7E,SAAUG,EAAMH,SAChBs8D,gBAAiBn8D,EAAM+5D,cAAgB/5D,EAAM+5D,cAAgB/5D,EAAMH,cAAW30B,EAC9EylD,UACI5yC,EAAAA,EAAAA,GAAIu+E,EAAa,CAAC,4BAA6Bt8D,EAAML,IAAK,uBAAwB,SAAMz0B,EAC5FkxF,sBAAuBp8D,EAAMuS,WAAQrnC,EACrCmxB,QAAQte,EAAAA,EAAAA,GAAIu+E,EAAa,CAAC,4BAA6Bt8D,EAAML,UAAMz0B,GAC7DoxF,EAAYxnE,gBACZ5pB,EAEM,KAIxB,MAAMszD,EAAkC,GAOxC,OANIg+B,GACAh+B,EAAUt+B,KAAKs8D,GAEfE,GACAl+B,EAAUt+B,QAAQw8D,GAEfl+B,CAAS,EAGPm+B,EAAkBL,IAC3B,MAAM,KAAE/pD,EAAI,2BAAElf,EAA0B,mBAAE8e,GAAuBmqD,EAE3DxkF,EAAY,CACd8kF,UAAW,CACPp9D,MAHU68D,EAAgBC,IAK9BO,YAAa,CACTxgE,OAAQigE,EAAYxnE,iBAAc5pB,GAEtC4xF,cAAevqD,EACfwqD,eAAgB1pE,EAA6B8e,IAEjDp6B,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB0+D,YAAallF,aAAY,EAGpDmlF,EAAuBX,IAChC,MAAM,KAAE/pD,EAAI,2BAAElf,EAA0B,mBAAE8e,GAAuBmqD,EAE3DxkF,EAAY,CACd8kF,UAAW,CACPp9D,MAHU68D,EAAgBC,IAK9BO,YAAa,CACTxgE,OAAQigE,EAAYxnE,iBAAc5pB,GAEtC4xF,cAAevqD,EACfwqD,eAAgB1pE,EAA6B8e,IAEjDp6B,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB4+D,iBAAkBplF,aAAY,EAGzDymF,EAAiBxqD,IAC1B,MAAMyqD,EAAmBxD,EAAkBjnD,SAC3C,GAAIyqD,EAAkB,CAClB,MAAM,KACFl3D,EACAA,MAAM,OAAE5O,IACRqb,EACE0qD,EAAkBn3D,EAClB+/E,EAAoBL,EAAejzE,EAAS1B,WAC5CqsD,EAAmBF,EAAiBl3D,KACpCggF,EAAqBN,EAAexoB,EAAiBnsD,WAE3D,GAAIosD,EAAgB1iF,OAAS2iF,EAAiB3iF,KAC1CkhF,EAAoBuB,GACpB7B,EAAe5oD,OACZ,CACH,IAAIwzE,EAAoB,EACpBC,EAAkB,EACtB,MAAMC,EAAkC,GAClCC,EAAgC,GAClClpB,EAAiBlsE,WAAayhB,EAASzhB,WACvCi1F,EAAoB/oB,EAAiBlsE,WAAayhB,EAASzhB,WACpDksE,EAAiBlsE,WAAayhB,EAASzhB,aAC9Ck1F,EAAkBzzE,EAASzhB,WAAaksE,EAAiBlsE,YAE7DoG,EAAOnb,SAASyiB,IACZ,MAAMk7B,EAAWl7B,EAAML,IACjBgoF,EAAeN,EAAkBnsD,GACjC0sD,EAAgBN,EAAmBpsD,GACzC,GAAIysD,GAAgBC,GAChB,GAAIA,EAAc/nF,SAAW8nF,EAAa9nF,SAAU,CAChD,MAAMgoF,EAAkBD,EAAc/nF,SAAW8nF,EAAa9nF,SACxDioF,GAAYr5G,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GAAQk5G,GAAY,IAAE9nF,SAAUgoF,IAClDJ,EAAiBvnF,KAAK4nF,EAC1B,MAAO,GAAIF,EAAc/nF,SAAW8nF,EAAa9nF,SAAU,CACvD,MAAMkoF,EAAgBJ,EAAa9nF,SAAW+nF,EAAc/nF,SACtDmoF,GAAUv5G,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GAAQk5G,GAAY,IAAE9nF,SAAUkoF,IAChDL,EAAexnF,KAAK8nF,EACxB,OACQJ,GAAiBD,EACzBD,EAAexnF,MAAIzxB,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAC,CAAC,EAAIk5G,GAAY,IAAE9nF,SAAU8nF,EAAa9nF,YACvD+nF,IAAkBD,GACzBF,EAAiBvnF,MAAIzxB,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAC,CAAC,EAAIm5G,GAAa,IAAE/nF,SAAU+nF,EAAc/nF,WACtE,IAGJ,MAAMooF,GAAgCx5G,EAAAA,EAAAA,GAAA,GAAQslC,GACxCm0E,GAA8Bz5G,EAAAA,EAAAA,GAAA,GAAQslC,GAClB,IAAtBwzE,EACAU,EAAgB3gF,UAAOp8B,EAChBq8G,EAAoB,IAC3BU,EAAgB31F,WAAai1F,GAET,IAApBC,EACAU,EAAc5gF,UAAOp8B,EACds8G,EAAkB,IACzBU,EAAc51F,WAAak1F,GAGC,IAA5BC,EAAiBlrF,OACjB0rF,EAAgB51E,eAAYnnC,EACrBu8G,EAAiBlrF,OAAS,IACjC0rF,EAAgB51E,UAAYo1E,GAGF,IAA1BC,EAAenrF,OACf2rF,EAAc71E,eAAYnnC,EACnBw8G,EAAenrF,OAAS,IAC/B2rF,EAAc71E,UAAYq1E,IAG1BA,EAAenrF,OAAS,GAAKirF,EAAkB,IAC/C7qB,EAAeurB,IAEfT,EAAiBlrF,OAAS,GAAKgrF,EAAoB,IACnDtqB,EAAoBgrB,EAE5B,CACJ,MAGItrB,EAAe5oD,EACnB,EAGSR,EAA0BD,IACnC,MAAM,SAAErhB,EAAQ,iBAAEO,EAAgB,SAAE5kB,EAAQ,WAAE0kB,GAAeghB,EAyBvDx7B,EAAY,CACd8kF,UAAW,CACPp9D,MAxBMvN,EAAS3d,KAAKgzB,IACxB,MAAM4/E,EACF10F,IAAqBC,EAAAA,GAAWC,KACgB,GAA1C4U,EAAK2f,YAAYn5C,IAAIsY,OAAO8gC,MAAMG,MAClC/f,EAAK2f,YAAYn5C,IAAIqY,QAAQ+gC,MAAMG,MACvC23C,EAA4BxsE,EAAiBrR,cAcnD,MAbqC,CACjCvT,WACA8tF,WAAY7uD,EAAAA,GAAoBmb,OAChC2zC,cAAe9uD,EAAAA,GAAoBmb,OACnC4zC,eAAgBt0D,EAAKvrB,KACrB8/E,eAAgBrpE,EAChBspE,eAAgB,IAChBE,UAAW,GAAG10D,EAAKvrB,QAAQijF,IAC3B/C,QAAS,GAAG30D,EAAK3H,OAAOq/D,IACxB9C,aAAc,UACd70C,MAAO6/D,EACPrnF,SAAUvN,EAEC,OAQnBva,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB+U,UAAWv7B,aAAY,EAGlD47B,EAAmBA,CAAClP,EAA+By6D,KAC5D,MAAM/rD,GAAWq9C,EAAAA,EAAAA,IAAY0O,GACvBC,EAAkB,IAAID,EAAS5nF,MAAM,KAAK,KAC1CS,EAAY,CACdqnF,qBAAsB,GAAG5qD,EAAAA,GAAmByT,cAC5C0oC,iBAAkBn8C,EAAAA,GAAmByT,OACrCo3C,cAAe,YACfC,gBAAiB76D,EAASz2B,OAC1BuxF,iBAAkB96D,EAASr3B,QAC3BoyF,kBAAmB/6D,EAASt2B,SAC5BsxF,QAAS,MACTC,YAAalrD,EAAAA,GAAmByT,OAChC03C,SAAUT,EACVU,aAAc,GAAGV,KAAYrE,EAAYsE,KACzCzO,UAAWwO,EACXW,eAAgB,EAChBC,aAAcr7D,EAAS/P,eACvBqrE,YAAa,GAAGvrD,EAAAA,GAAmByT,oBAAoBi3C,IACvDtO,UAAWz9C,IAEfn7B,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgBkV,aAAc17B,aAAY,EAGrD+7B,EAAoBksD,IAC7B,MAAMjoF,EAAY,CACdkoF,aAAcD,EAAY5uD,YAC1B8uD,eAAgBF,EAAY3uD,cAC5B8uD,UAAWH,EAAY1rE,SACvB8rE,aAAcJ,EAAYtrE,iBAE9B1c,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgBqV,oBAAqB77B,aAAY,EAG5Ds8B,EAAqBA,CAACkoD,EAA6B8D,KAC5D,MAAM,KAAE7tD,EAAI,2BAAElf,EAA0B,mBAAE8e,GAAuBmqD,EAG3DxkF,EAAY,CACd8kF,UAAW,CACPp9D,MAJU68D,EAAgBC,IAM9BO,YAAa,CACT9pD,KAAMqtD,EACN/jE,OAAQigE,EAAYxnE,iBAAc5pB,GAEtC4xF,cAAevqD,EACfwqD,eAAgB1pE,EAA6B8e,GA9T5B4B,MAHAhB,GAmUrBh7B,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB4V,eAAgBp8B,cAErB,IAA3BkjF,EAAkBjoD,MAA8B,IAAhBqtD,GAChC7B,EAAcjC,GAGa,IAA3BtB,EAAkBjoD,MAA8B,IAAhBqtD,GAChC7B,EAAcjC,GAGa,IAA3BtB,EAAkBjoD,OA1UDgB,EA2UDuoD,EA1UpBtB,EAAkBjnD,UAAWusD,EAAAA,EAAAA,GAAUvsD,IAJlBhB,EAgVLqtD,EA/UhBpF,EAAkBjoD,KAAOA,EAiVL,IAAhBqtD,GAAqB9D,EAAYhqD,iBACjC8B,EAAmBkoD,EAAa,GAChCloD,EAAmBkoD,EAAa,GACpC,EAGS7nD,EAAgBA,CAAC6nD,EAA6B9nD,KACvD,MAAM,KAAEjC,EAAI,2BAAElf,EAA0B,mBAAE8e,GAAuBmqD,EAC3D99B,EAAY69B,EAAgBC,GAC5Br6C,EAAU64C,EAAWtmD,EAAangB,UAClCvc,EAAY,CACd8kF,UAAW,CACPp9D,MAAOg/B,EAAUlqD,KAAKykD,IAAItqD,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GACnBsqD,GAAI,IACPwnC,SAAUt+C,OAGlB46C,YAAa,CACT2D,eAAgBhsD,EAAa/B,cAC7BpW,OAAQigE,EAAYxnE,iBAAc5pB,EAClC6tB,IAAKyb,EAAa7hB,cAClB8tE,QAASjsD,EAAa3hB,oBAE1ByU,KAAMsnF,EAA8BtyB,EAAY9pE,iBAAkB8pE,EAAYh1D,KAAK6uB,gBACnFoqC,SAAUt+C,EACVy+C,gBAAiB,WACjB5D,cAAevqD,EACfwqD,eAAgB1pE,EAA6B8e,IAEjDp6B,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgByH,SAAUjuB,aAAY,EAGjD48B,EAAqBA,CAACppC,EAAsBgxF,EAA6Br6C,KAClF/oC,QAAQmuE,IAAI,uBAAwBiV,GACpC,MAAMxkF,EAAY,CACdwvB,KAAMwnF,EAAwBxyB,EAAY9pE,iBAAkB8pE,EAAYh1D,KAAK6uB,gBAG7EoqC,SAAUt+C,EACVy+C,gBAAiB,WACjBC,uBAAwBr1F,IAE5ByM,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgBC,eAAgBzmB,aAAY,EAGvD+8B,EAAmBA,CAACxgB,EAAkBgS,EAAmBi2D,KAClE,MAAMxkF,EAAY,CACd44E,iBAAkBn8C,EAAAA,GAAmByT,OACrCu4C,SAAUzF,EAAWzmE,GACrBiT,KAAMsnF,EAA8BtyB,EAAY9pE,iBAAkB8pE,EAAYh1D,KAAK6uB,gBACnFuqC,gBAAiB,WACjBE,WAAYv6D,IAEhBtuB,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB8H,kBAAmBtuB,aAAY,EAG1Du9B,EAAiBA,CAACvC,EAAmBD,EAAsBosD,KACpE,MAAMnnF,EAAY,CACd+oF,cAAe/tD,EAAQ/L,WACvB+5D,mBAAoBjuD,EAAW9L,WAC/B4pD,WAAWJ,EAAAA,EAAAA,IAAY0O,KAE3BlnF,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB8W,WAAYt9B,aAAY,EAGnDm8B,EAAuBA,CAAC5f,EAAkBgS,EAAmBi2D,KACtE,MAAMxkF,EAAY,CACdyoF,SAAUzF,EAAWzmE,GACrBiT,KAAMg1D,EAAY9pE,iBAClBouE,WAAYv6D,IAEhBtuB,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgBwV,iBAAkBh8B,aAAY,EAGzD88B,EAAuBA,CAAC1B,EAAkB7M,KACnD,MAAMvuB,EAAY,CACd64E,UAAWz9C,EACX0tD,WAAYv6D,IAEhBtuB,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgBqW,iBAAkB78B,aAAY,EAWzDq1B,EAAmBA,KAC5B,MAAMr1B,EAAY,CACd64E,UAAWhpC,EAAAA,GAA2Bo5C,gBAE1ChpF,EAAAA,EAAAA,IAAW,CAAEC,MAAOsmB,EAAAA,GAAgB2W,aAAcn9B,aAAY,2EC7dlE,MAIMkpF,EAAkBA,CAACj5E,EAA2B8D,IACzCo1E,EAAAA,KACFC,SAASr1E,GAAsB9D,GAC/Bo/B,IAAI,EAAGp/B,GACPnO,MAAMmO,GACNo5E,QACG,IAAIrkC,OACA,oJAEJ/0C,GAINq5E,EAAiBA,CAACC,EAA8BC,IAE9CL,EAAAA,KACKC,SAASG,GACTl6C,IAAI,EAAGk6C,GAIPF,QAAQ,IAAIrkC,OAAO,kCAAmCwkC,GAU7DC,EAAqBC,GAChBP,EAAAA,KAAaC,SAASM,GAO3BC,EAAoBA,CAACt0F,EAAiBqb,EAAiC2D,IAClE80E,EAAAA,KACFC,SAAS14E,GACT2+B,IAAI,EAAGh7B,GACPi7B,IAAI,GAAIj7B,GACRs9D,KAAK,eAAgBt9D,GAAyBhY,IAAUu/E,EAAAA,EAAAA,GAAkBvmF,EAASgH,KAGtFutF,EAAyBA,CAAC75E,EAA+BmE,IACpDi1E,EAAAA,KACFC,SAASl1E,GACTm1E,QAAQ,IAAIrkC,OAAO,0BAA2Bj1C,GAGjDu+F,EAAoBA,CAACp+F,EAAoC8D,KAC3D,MAAMu6F,EAAgB,IAAI/3E,KAC1B+3E,EAAcC,SAASD,EAAc33E,WAAa,GAQlD,OAAOuyD,EAAAA,KACFC,SAASp1E,GACTq7B,IAAIk/D,EAAer+F,GACnBu+F,WATmBC,CAACrO,EAAgBsO,KACrC,MAAMC,GAAaC,EAAAA,EAAAA,GAAOF,GAAiBA,GAAgBlvG,EAAAA,EAAAA,IAAMkvG,EAAe,QAAS,IAAIn4E,MACvFs4E,EAAmB,IAAIt4E,KAE7B,OADAs4E,EAAiBN,SAASM,EAAiBl4E,WAAa,IAhE3C73B,EAiEM6vG,aAhEAp4E,OAASnE,OAAO08E,MAAMhwG,EAAKiwG,WAgEbJ,EAAaE,EAjEjC/vG,KAiEiD,GAKnC,EAG7B8qF,EAAuBH,GAClBP,EAAAA,KAAaC,SAASM,GAGpBI,EAAiBA,CAACz0F,EAAiB00F,KAC5C,MAAM,wBACF35E,EAAuB,sBACvBL,EAAqB,kBACrBE,EAAiB,2BACjBC,EAA0B,qBAC1BI,EAAoB,kBACpBC,EAAiB,uBACjBC,EAAsB,sBACtBC,EAAqB,wBACrBC,EAAuB,mBACvBC,EAAkB,qBAClBkD,EAAoB,mBACpBE,EAAkB,qBAClBC,EAAoB,yBACpBE,EAAwB,uBACxBG,EAAsB,uBACtB2lC,GACA+vC,EAEJ,OAAOZ,EAAAA,KAAaa,MAAM,CACtBjoF,MAAOmnF,EAAgBj5E,EAAmB8D,GAC1CpS,UAAW2nF,EAAe94E,EAAwBT,GAClDlO,SAAUynF,EAAe74E,EAAuBV,GAChD7D,SAvEGi9E,EAAAA,KACFC,WACAzX,MAAMsY,GAAO3lB,IAAO2lB,GAAI5lB,OAAS,IAsElCl4D,iBAAkBm9E,EAAe94E,EAAwBT,GACzD3D,gBAAiBk9E,EAAe74E,EAAuBV,GACvD/N,QAASynF,EAAkBn5E,GAC3BrO,KAAMwnF,EAAkBl5E,GACxBnO,aAnEmBsnF,EAmEY71E,EAlE5Bs1E,EAAAA,KAAaC,SAASM,IAmEzBvnF,UAAWsnF,EAAkB94E,GAC7BzO,QAASynF,EAAkBt0F,EAASqb,EAAyB2D,GAC7DhS,aAAcunF,EAAuBx5E,EAAyB8D,GAC9D7H,eAAgBiiG,EAAkBp+F,EAA4B8D,GAC9DkyB,UAAW2jD,EAAoB7vC,GAC/B7T,QAASgjD,EAAAA,KACTljD,YAAakjD,EAAAA,OA1EMO,KA2ErB,EAGOQ,EAAuB7tF,KACvBA,EAAM8tF,MAAM,4BAAwC,KAAV9tF,kBC/FhD,MAAMuvB,EAA4BA,CAACrH,EAA2B1U,KACjE,MAAM,iBAAEgO,EAAgB,kBAAEa,EAAiB,kBAAEY,GAAsBiF,EACnE,OAAI7F,EACOb,EAEPyB,KAAsB5U,EAAAA,EAAAA,GAAQmF,GAAcyxB,cACrCzxB,EAAayxB,aAEjB,IAAI,EAGFV,EAA+BA,CACxCrc,EACA1U,KAEA,MAAM,iBAAEgO,EAAgB,yBAAE0B,GAA6BgF,EACvD,QAAK7Z,EAAAA,EAAAA,GAAQmT,IAAqB0B,EACvB,CAAC1B,GAAkB,IAEzBnT,EAAAA,EAAAA,GAAQmF,GAAcyxB,cAGpB,CAAC,MAAM,GAFH,CAACzxB,EAAayxB,cAAc,EAEnB,EAoBlBwvE,EAAkCzrG,IAIkB,IAJjB,mBACrC0rG,EAAkB,yBAClBC,EAAwB,SACxBvyE,GACwCp5B,EACxC,MAAM4rG,EAAqBxyE,EAAWssC,EAAAA,GAAoBE,cAAgBF,EAAAA,GAAoBG,eAC9F,GAAI8lC,EAAyB50B,IAAI20B,GAAqB,CAClD,MAAM,YAAEjpF,GAAgBkpF,EAAyB/qG,IAAI8qG,GACrD,OAAOjpF,EAAYs0D,IAAI60B,EAC3B,CAEA,OAAO,CAAK,EAGH/xE,EAA8BrhB,IACvC,MAAM,cAAEgO,EAAa,UAAEqlF,EAAS,QAAErH,GAAYhsF,EAC9C,OAAOgO,GAjCsBslF,EAACC,EAAe/iB,KAC7C,MAAMz2D,EAAY,IAAIpB,KAAK46E,GACrBv5E,EAAU,IAAIrB,KAAK63D,GAEnBgjB,GADc,IAAI76E,MACUw4E,UAClC,OAAOqC,GAAiBz5E,EAAUo3E,WAAaqC,GAAiBx5E,EAAQm3E,SAAS,EA4BzDmC,CAAkBD,EAAWrH,EAAQ,EAsCpDxqE,EAA8B61D,IAKiC,IALhC,iBACxCr3E,EAAgB,gBAChB5C,EAAe,eACfX,EAAc,iBACdI,GAC0Cw6E,EAC1C,MAAM,WAAEoc,EAAU,YAAEjnB,GAAgBxsE,EAC9BmzF,EAtBkC3mB,KACxC,MAAM2mB,EAA2B,IAAIzvD,IAWrC,OAVA8oC,EAAY5kF,SAAS8rG,IACjB,MAAM,WAAE3pF,EAAU,YAAEE,GAAgBypF,EACpC,IAAKP,EAAyB50B,IAAIx0D,GAAa,CAC3C,MAAM4pF,EAA6C,CAAE1pF,YAAa,IAAIi5B,KACtEiwD,EAAyBjvD,IAAIn6B,EAAY4pF,EAC7C,CACA,MAAMA,EAAuBR,EAAyB/qG,IAAI2hB,GAC1D4pF,EAAqB1pF,YAAYk5B,IAAIl5B,GACrCkpF,EAAyBjvD,IAAIn6B,EAAY4pF,EAAqB,IAE3DR,CAAwB,EAUES,CAA4BpnB,GACvD5rD,EAAW/jB,IAAqBC,EAAAA,GAAWC,KAC3C82F,EAAiBp3F,EAAenV,QAAO,CAACC,EAAKusG,KAC/Ch7G,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GACOyO,GAAG,IACN,CAACusG,EAAc9pF,KAAMipF,EAAgC,CACjDC,mBAAoBY,EAAc9pF,IAClCmpF,2BACAvyE,gBAGT,CAAC,GACEW,GAA0CzoC,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GACzC+6G,GAAc,IACjB,CAACz2F,GAAkB61F,EAAgC,CAC/CC,mBAAoB91F,EACpB+1F,2BACAvyE,eAIR,OAAO6yE,IAAexmC,EAAAA,GAAY8mC,SAAWxyE,EAjDVA,IAC5Bv+B,OAAO2gD,KAAKpiB,GAAmBj6B,QAAO,CAAC0sG,EAAQC,KAClDn7G,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GAAYk7G,GAAM,IAAE,CAACC,IAAa,KACnC,CAAC,GA8C6DC,CAAuB3yE,EAAkB,EAGjGG,EAAiDH,GACnDv+B,OAAOC,OAAOs+B,GAAmBl1B,MAAM8nG,IAAwC,IAApBA,IAqDzD7xE,EAAqBuqE,IAOwC,IAPvC,iBAC/BhwF,EAAgB,WAChBF,EAAU,aACV3K,EAAY,iBACZguB,EAAmB9nC,EAAAA,GAASC,IAAG,eAC/BskB,EAAc,kBACdgB,GAC8BovF,EAC9B,MAAMpsE,EAAsB5jB,IAAqBC,EAAAA,GAAWC,KAAO2jB,EAAAA,GAAcjG,OAASiG,EAAAA,GAAcC,QAClG0B,EAAqD,IAAIqhB,IACzD9iB,EAAW/jB,IAAqBC,EAAAA,GAAWC,KAC3Cq3F,GAAsChsG,EAAAA,EAAAA,GACxC4J,EACA,CAAC,cAAeguB,EAAkBS,EAAqB,OAAOhjB,EAAoB,IAAK,SACvF,GAGE42F,GAAmCjsG,EAAAA,EAAAA,GACrC4J,EACA,CAAC,cAAeguB,EAAkBS,EAAqB,QAAS,SAChE,GAGE6zE,EAAmB1zE,EAAW,GAAK,EACnC2zE,EAAmD,CACrDrqF,SAAUvN,EACV63F,4CAA6CJ,EAAsCE,EACnFG,yCAA0CJ,EAAmCC,GAiBjF,OAfAjyE,EAAgB6hB,IAAIlyC,EAAagY,IAAKuqF,GAEtC93F,EAAe7U,SAASyiB,IACpB,MAAM,IAAEL,EAAG,SAAEE,GAAaG,EAEpBqqF,EADa1iG,EAAa+Q,OACMjd,QAAQ2lG,GAAcA,EAAUzhF,MAAQA,IACxEyhF,EAAYiJ,EAAmB,GAE/BC,GADiBvsG,EAAAA,EAAAA,GAAIqjG,EAAW,CAAC,cAAezrE,EAAkB,SAAU,GAClCs0E,EAChDjyE,EAAgB6hB,IAAIl6B,EAAK,CACrBE,WACAsqF,4CAA6CG,EAC7CF,yCAA0CE,GAC5C,IAECtyE,CAAe,EAGbG,EAAwB,SACjCxiB,GAGsB,IAFtBggB,EAA0B6kC,UAAAj+C,OAAA,QAAArxB,IAAAsvE,UAAA,GAAAA,UAAA,GAAG3sE,EAAAA,GAASC,IACtCyoC,EAAiBikC,UAAAj+C,OAAA,EAAAi+C,UAAA,QAAAtvE,EAEjB,MAAM,YAAEi3F,GAAgBxsE,EACxB,IAAI40F,GAAY,EAChB,MAAMryE,EAAiB,IAAImhB,IACvB8oC,EACK1mF,QAAQ4tG,GACL9yE,EACM8yE,EAAWzpF,cAAgBijD,EAAAA,GAAoBE,cAC/CsmC,EAAWzpF,cAAgBijD,EAAAA,GAAoBG,iBAExD1uE,KAAK+0G,IACF,MAAM,WAAE3pF,EAAU,aAAE4iE,GAAiB+mB,EAI/BmB,EAHkCloB,EAAa7mF,QAChD4rC,GAAUA,EAAMz5C,WAAa+nC,IAEkC,GAMpE,OAFI40E,GAHCC,EAKE,CAAC9qF,EAAY8qF,GAA6Br2G,MAAM,KAGnE,OAAOo2G,EAAY,IAAIlxD,IAAQnhB,CACnC,EAEaE,GAAoBqqE,IAKgD,IAL/C,mBAC9B5qE,EAAkB,gBAClBG,EAAe,eACfE,EAAc,kBACdhB,GACgCurE,EAChC,MAAMgI,EAAsB,IAAIzyE,EAAgBh7B,WAC1C0tG,EAAoD,CAAC,EA6B3D,OA3BAD,EAAoBltG,SAAQolG,IAAiC,IAA/BjjF,EAAYirF,GAAchI,EACpD,GAAIzrE,EAAkBxX,IAAewY,EAAeg8C,IAAIx0D,GAAa,CACjE,MAAM,SAAEG,EAAQ,yCAAEuqF,EAAwC,4CAAED,GACxDQ,EACEC,EAAuB1yE,EAAen6B,IAAI2hB,GAC1CmrF,EA9IqBC,EACnCjzE,EACAkzE,EACAH,EACAI,KAEA,OAAQnzE,GACJ,KAAKQ,EAAAA,GAAqByqD,UAKtB,MAAO,CACHmoB,kBALsBF,EAAqDH,EAM3E3P,mBALuBphB,KAAKC,MAC3B8wB,EAAuBG,EAAsD,KAK9EG,gBAAiBN,GAIzB,KAAKvyE,EAAAA,GAAqBwqD,cAAe,CACrC,MAAMqoB,EAAmBH,EAAqDH,EAAwB,IAEtG,MAAO,CACH3P,mBAAoB2P,EACpBK,kBAHsBF,EAAqDG,EAI3EA,kBAER,CAEA,KAAK7yE,EAAAA,GAAqBC,QAAS,CAC/B,MAAM2yE,EACFL,EAAuBG,EAAqDH,EAAuB,EACvG,GAA0B,IAAtBK,EACA,OAAO,KAEX,MAAMC,EAAkBF,EAAkDJ,EAI1E,MAAO,CACHK,oBACAC,kBACAjQ,mBANuBphB,KAAKC,MAC3BoxB,EAAkBF,EAAmD,KAO9E,CACA,QACI,OAAO,KACf,EA+FyCF,CAC7BjzE,EACAsyE,EACAS,EACAR,GAEJ,GAAiC,OAA7BS,GAAqCA,EAAyBI,mBAAqB,EACnFP,EAAiBhrF,GAAc,SAC5B,CACH,MAAM,kBAAEurF,EAAiB,gBAAEC,EAAe,mBAAEjQ,GAAuB4P,EACnEH,EAAiBhrF,GAAc,CAC3Bu7E,qBACAgQ,oBACAE,oBAAqBD,EACrBE,mBAAoBH,EAAoBprF,EACxCs7E,qBAAsB+P,EAAkBrrF,EAEhD,CACJ,MACI6qF,EAAiBhrF,GAAc,IACnC,KAEGld,EAAAA,EAAAA,GAAQkoG,GAAoB,KAAOA,CAAgB,EAGjDr+E,GAAsCxT,GACjBA,EAAc5b,QAAO,CAACgN,EAAOohG,KACvD,MAAM,WAAEpwD,EAAU,KAAEhrD,GAASo7G,EAC7B,OAAIp7G,IAAS0lF,EAAAA,GAAwBz1E,SAAW+6C,IAAeha,EAAAA,GAAOk/D,mBAC3Dl2F,GAAQlM,EAAAA,EAAAA,GAAIstG,EAAqB,CAAC,iBAAkB,UAAW,GAEnEphG,CAAK,GACb,oBC5UP,IAAI84E,GAEG,MAAMC,GAA+BhQ,IACxC,IACIxwE,EAAAA,EAAAA,GAAQwwE,EAAWv5E,UAAUikD,UAC7Bl7C,EAAAA,EAAAA,GAAQwwE,EAAWr5E,SAAS+jD,UAC5Bl7C,EAAAA,EAAAA,GAAQwwE,EAAWn5E,MAAM6jD,UACzBl7C,EAAAA,EAAAA,GAAQwwE,EAAW/uE,iBAAiBy5C,UACpCl7C,EAAAA,EAAAA,GAAQwwE,EAAW9uE,gBAAgBw5C,QAEnC,OAAO,EAGX,MAAMwlC,IAAwBC,EAAAA,GAAAA,GAAQJ,GAAoB/P,GAE1D,OADA+P,GAAqB/P,EACdkQ,CAAoB,EAGlBE,GAAoBA,CAC7BpQ,EACAqQ,EACAC,OAGI9gF,EAAAA,EAAAA,GAAQwwE,EAAW94E,YAAYwjD,UAC/Bl7C,EAAAA,EAAAA,GAAQwwE,EAAWj5E,KAAK2jD,UACxBl7C,EAAAA,EAAAA,GAAQwwE,EAAWl5E,QAAQ4jD,UACzB2lC,IAAoB7gF,EAAAA,EAAAA,GAAQwwE,EAAW/4E,UAAUyjD,SAClD4lC,IAAkBtQ,EAAWh1C,YAC9Bx7B,EAAAA,EAAAA,GAAQwwE,EAAWh5E,QAAQ0jD,oDCtB5B,MAAM49C,GAAgBA,CAACt7E,EAAoB5Z,EAAiBxY,EAAkBuwG,KACjF,MAAM92D,GAAgBtpC,EAAAA,EAAAA,GAAIiiB,EAAO,CAAC,cAAepyB,EAAUwY,EAAS,SAAW,UAAW+3F,EAAa,SAAU,GACjH,OAAO/3F,EAAiB,GAARihC,EAAaA,CAAK,EAGzBy1D,GAAgCA,CACzCqL,EACA/1F,EACAzK,EACA4uB,EACA3oC,EACAuwG,KAEA,IAAIl0F,EAAQk+F,EAwBZ,OAvBA/1F,EAAe7U,SAASyiB,IACpB,GAAIA,EAAO,CACP,MAAMooF,EAAYzgG,EAAa+Q,OAAOnd,MAAMy/C,GAAMA,EAAEr7B,MAAQK,EAAML,MAClE,GAAIyoF,EAAW,CACX,MAAM,cAAEruB,IAAkBZ,EAAAA,GAAAA,IACtBivB,EACApoF,EAAMH,SACNjyB,EACA2oC,EAAW,SAAW,UACtB4nE,GAGAn+E,EAAML,MAAQ81D,EAAAA,GAAW42B,aACxB1kG,EAAagY,MAAQ6P,EAAAA,GAAY+Z,gCAC9B5hC,EAAagY,MAAQ6P,EAAAA,GAAY+Z,+BAIrCt/B,GAASqxF,GAAc8M,EAAW7xE,EAAU3oC,EAAUuwG,GAAen+E,EAAMH,SAAWk6D,EAFtF9vE,GAAS8vE,CAIjB,CACJ,KAEG9vE,CAAK,EAmDHmoB,GAAwBA,CACjCq2E,EACAjzF,EACAa,KAEA,GAAIb,GAA6BizF,EAAuB,CAQpD,OAP2B9vG,OAAO2gD,KAAK9jC,GAA2BvY,QAAO,CAACgN,EAAOyV,KAC7E,MAAMgpF,EAAoBlzF,EAA0BkK,GACpD,OAAIgpF,KAAsBlmG,EAAAA,EAAAA,GAAQkmG,GACvBz+F,EAAQy+F,EAAkBvN,qBAE9BlxF,CAAK,GACb,GACyBoM,CAChC,CACA,OAAOA,CAA+B,EC9G7BsT,GAAmBA,KAC5B,IACI,MAAM45D,EAAkBjiF,eAAeK,QAAQiB,EAAAA,GAAc4gF,kBACvDt1F,EAAWoT,eAAeK,QAAQiB,EAAAA,GAAcC,gBACtD,GAAwB,OAApB0gF,GAAyC,OAAbr1F,EAC5B,OAGJ,OAAAO,EAAAA,EAAAA,IAAAA,EAAAA,EAAAA,GAAA,GACQ80F,GAAmB,CAAElnE,OAAQ/kB,KAAKC,MAAMgsF,KACxCr1F,GAAY,CAAEA,SAAUoJ,KAAKC,MAAMrJ,IAE/C,CAAE,MAAOsI,GACL,MACJ,GAGSmM,GAAoBrV,IAC7B,IACI,MAAMi2F,EAAkBjsF,KAAKkK,UAAUlU,GACvCgU,eAAeC,QAAQqB,EAAAA,GAAc4gF,iBAAkBD,EAC3D,CAAE,MAAO/sF,GACL,GCtBKizB,GAAYA,KACrB,IACI,MAAM85D,EAAkBpe,aAAaxjE,QAAQiB,EAAAA,GAAcosG,cAE3D,GAAwB,OAApBzrB,EACA,OAGJ,OAAOjsF,KAAKC,MAAMgsF,EACtB,CAAE,MAAO/sF,GACL,MACJ,GAGSqwD,GAAav5D,IACtB,IACI,MAAMi2F,EAAkBjsF,KAAKkK,UAAUlU,GACvC63E,aAAa5jE,QAAQqB,EAAAA,GAAcosG,aAAczrB,EACrD,CAAE,MAAO/sF,GACL,GAIKkwB,GAAaA,KACtB,IAC4By+C,aAAaxjE,QAAQiB,EAAAA,GAAcosG,eAEtC7pC,aAAavjE,WAAWgB,EAAAA,GAAcosG,aAC/D,CAAE,MAAOx4G,GACL,GC9BK+tF,GAA6B3rB,IAEhCA,EAAUI,KAAK5sE,OAASwsE,EAAUI,KAAKwC,SACR,KAAhC5C,EAAUI,KAAKwrB,eAAwB5rB,EAAUI,KAAK5sE,MAIlDq4F,GAAgBA,KACzB,MAAMrqB,EACF38C,SAASuxD,uBAAuB,gBAAgB,IAChDvxD,SAASuxD,uBAAuB,uBAAuB,IACvDvxD,SAASuxD,uBAAuB,iCAAiC,GACjE5U,GACAA,EAAIsqB,eAAe,CAAE3P,SAAU,SAAU4P,MAAO,QAASt1B,OAAQ,WACrE,6BCZJ,MAAMw1B,GAAU,IAAIxrC,IAEPnnB,GAAuBA,CAChC4yD,EACAtyE,EACA7K,EACA/Z,KAEA,MAAM,IAAE+xB,EAAM,GAAE,YAAEsnB,GAAgBt/B,QAAAA,EAAgB,CAAC,EAC7CqkE,EAAa,GAAGrsD,KAAO/xB,KAAY4kB,KAAoBsyE,IAC7D,IAAKD,GAAQ9mF,IAAIiuE,GAAa,KAAA7uE,EAAA4nF,EAC1B,MAAM1M,EAA+D,QAAhDl7E,EAAI8pC,IAAcr5C,UAA8B,IAAAuP,EAAAA,EAAsB,GACrF8xG,EACFz8F,IAAqBC,EAAAA,GAAWq2B,oBAC1BzS,EAAAA,GAAc0S,oBACd1S,EAAAA,GAAcC,QAElB0uD,EAAkF,QAA9DD,EAAG1M,EADD7lE,IAAqBC,EAAAA,GAAWC,KAAO2jB,EAAAA,GAAcjG,OAAS6+E,UACF,IAAAlqB,EAAAA,EAAI,GAE3DpsF,OAAO2gD,KAAK0rC,GAEpBhjF,MAAK,CAACijF,EAAUhlE,KACrC,MAAMilE,EAAWF,EAAqBC,GACtC,OAAIH,GAAqBI,EAAS/9C,KAAO29C,GAAqBI,EAAS99C,MACnEy9C,GAAQhrC,IAAImyB,EAAY/rD,IACjB,EAEC,GAEpB,CAEA,OAAO4kE,GAAQ9mF,IAAIiuE,EAAW,ECDrBntC,GAAsBA,CAC/BrsB,EACA7K,EACA+P,EACAnoB,KAEA,MAAM41F,EAAuC,CAAC,EACxCvmD,EAAqC,CACvClmB,OAAQ,GACR0sE,eAAgB,EAChBC,kBAAmB,EACnBC,cAAe,EACf7K,gBAAgB,EAChB8K,uBAAuB,EACvBC,8BAA8B,EAC9BC,kBAAkB,EAClB1jD,sBAAsB,EACtBvvB,mBACAsU,SAAS,GAGb,IAAKnf,EACD,OAAOi3B,EAMX,GAHAA,EAAiBwmD,eAAiBz9E,EAAay5B,yBAC/CxC,EAAiBymD,kBAAoB19E,EAAa+5B,yBAE7CnyC,EACD,OAAOqvC,EAgEX,GA7DArvC,EAAqBgO,SAASmoF,IAC1B,GAA4B,WAAxBA,EAAajrF,OAAqB,CAClC,OAAQirF,EAAahmE,YACjB,KAAK8P,EAAAA,GAAY4Z,qBACjB,KAAK5Z,EAAAA,GAAY6Z,yBACb87C,EAAkBQ,SAAWD,EAC7B,MAEJ,KAAKl2D,EAAAA,GAAY8Z,mBACjB,KAAK9Z,EAAAA,GAAY+Z,+BACjB,KAAK/Z,EAAAA,GAAYwX,qBACbm+C,EAAkBS,MAAQF,EAC1B,MAEJ,KAAKjQ,EAAAA,GAAWoQ,qBAChB,KAAKpQ,EAAAA,GAAWqQ,kBACZlnD,EAAiBlmB,OAAOwH,KAAKwlE,GAC7B9mD,EAAiBwmD,gBAAkBM,EAAa7lE,SAChD,MAEJ,KAAK41D,EAAAA,GAAWsQ,wBAChB,KAAKtQ,EAAAA,GAAWuQ,qBACZpnD,EAAiBlmB,OAAOwH,KAAKwlE,GAC7B9mD,EAAiBymD,mBAAqBK,EAAa7lE,SAAWohB,EAAAA,GAAOQ,0BACrE,MAEJ,KAAKg0C,EAAAA,GAAW7zC,aACZhD,EAAiBlmB,OAAOwH,KAAKwlE,GAC7B9mD,EAAiB6mD,kBAAmB,EACpC,MAEJ,KAAKhQ,EAAAA,GAAW5zC,mBACZjD,EAAiBlmB,OAAOwH,KAAKwlE,GAC7B9mD,EAAiB2mD,uBAAwB,EACzC,MAEJ,KAAK9P,EAAAA,GAAWl0C,0BACZ3C,EAAiBlmB,OAAOwH,KAAKwlE,GAC7B9mD,EAAiB4mD,8BAA+B,EAOpDE,EAAa3mF,WAAawwB,EAAAA,GAActwB,QACxCkmF,EAAkBc,MAAQP,EAElC,KAGAP,EAAkBQ,UAClB/mD,EAAiBtX,KAAO69D,EAAkBQ,SAC1C/mD,EAAiB67C,gBAAiB,GAC3B0K,EAAkBS,MACzBhnD,EAAiBtX,KAAO69D,EAAkBS,MACnCT,EAAkBc,QACzBrnD,EAAiBtX,KAAO69D,EAAkBc,MAC1CrnD,EAAiB9X,SAAU,GAG3B8X,EAAiBtX,OAASsX,EAAiB9X,QAAS,CACpD,MAAMooF,EACFtwE,EAAiBtX,KAAK1H,cAAgBuQ,EAAAA,GAAcC,OAAS3d,EAAAA,GAAWC,KAAOD,EAAAA,GAAW4X,MACxF67D,EACFtnD,EAAiBtX,KAAK1H,cAAgBuQ,EAAAA,GAAcga,cAC9C13B,EAAAA,GAAWq2B,oBACXomE,EAQV,GANAtwE,EAAiBmD,qBACbnD,EAAiBtX,KAAK5H,aAAe/X,EAAagY,KAClDif,EAAiBpsB,mBAAqB0zE,EAE1CtnD,EAAiB0mD,cA/HCa,KACtB,MAAMh8E,GAAQ,IAAImkB,MAAO83D,SAAS,EAAG,EAAG,EAAG,GACrCC,GAAW,IAAI/3D,KAAK63D,GAE1B,OAAOtM,KAAKC,OAAOuM,EAAUl8E,GAAS,OAAyB,CAAC,EA2H3Bm8E,CAAiB1nD,EAAiBtX,KAAKqI,SAEpEiP,EAAiBtX,KAAK5H,aAAe/X,EAAagY,IAAK,CACvD,MAAM4mE,EAAiB7uE,EAAMnc,MAAM+rB,GAASA,EAAK3H,MAAQif,EAAiBtX,MAAM5H,aAEhF,GAAI6mE,EAAgB,CAChB,MAAMnB,EACFxmD,EAAiBwmD,eACjBz9E,EAAay5B,yBACbmlD,EAAenlD,yBACbikD,EACFzmD,EAAiBymD,kBACjB19E,EAAa+5B,wBACb6kD,EAAe7kD,wBAEnB9C,EAAiBwmD,eACbz9E,EAAay5B,yBAA2BgkD,EAClCz9E,EAAay5B,yBACbgkD,EACVxmD,EAAiBymD,kBACb19E,EAAa+5B,wBAA0B2jD,EACjC19E,EAAa+5B,wBACb2jD,CACd,CACJ,CACJ,CAEA,OAAOzmD,CAAgB,iGCnKpB,MAAM4e,EAAqBA,KAAMsvB,EAAAA,EAAAA,IAAgBlqE,EAAAA,GAAcC,iBAAmB1U,EAAAA,GAASC,wCCHlG,IAAe,IAA0B,+FCCzC,KAAgB,iBAAiB,gCAAgC,eAAe,8BAA8B,uBAAuB,sCAAsC,0BAA0B,yCAAyC,yBAAyB,wCAAwC,eAAe,8BAA8B,0BAA0B,yCAAyC,OAAS,wBAAwB,SAAW,0BAA0B,MAAQ,uBAAuB,gBAAgB,+BAA+B,KAAO,sBAAsB,MAAQ,uBAAuB,KAAO,wDCAtnB,KAAgB,QAAU,gCAAgC,SAAW,iCAAiC,QAAU,gCAAgC,QAAU,gCAAgC,MAAQ,8BAA8B,MAAQ,8BAA8B,WAAa,mCAAmC,gBAAgB,sCAAsC,SAAW,iCAAiC,iBAAiB,uCAAuC,yBAAyB,+CAA+C,iCAAiC,uDAAuD,2BAA2B,iDAAiD,OAAS,+BAA+B,eAAe,qCAAqC,gBAAgB,wECAxyB,KAAgB,gBAAgB,qCAAqC,OAAS,8BAA8B,KAAO,4BAA4B,KAAO,4BAA4B,YAAY","sources":["webpack:///../src/common/images/icon-close.svg","webpack:///../src/common/images/icon-error.svg","webpack:///../src/common/images/icon-info.svg","webpack:///../src/common/images/icon-modify-on.svg","webpack:///../src/common/images/icon-pw-hide@2x.svg","webpack:///../src/common/images/icon-pw-show@2x.svg","webpack:///../src/common/images/icon-secure.svg","webpack:///../src/Routes.tsx","webpack:///../src/common/state/fatal-error/reducer.ts","webpack:///../src/common/state/modal/reducer.ts","webpack:///../src/common/state/flex/reducer.ts","webpack:///../src/common/data/location.ts","webpack:///../src/common/state/location/reducer.ts","webpack:///../src/common/state/marketing/reducer.ts","webpack:///../src/common/state/account/actions.ts","webpack:///../src/common/state/account/reducer.ts","webpack:///../src/common/state/content/reducer.ts","webpack:///../src/common/state/checkout/reducer.ts","webpack:///../src/common/store/index.ts","webpack:///../src/common/sagas/error/track-error.ts","webpack:///../src/common/sagas/flex/get-flex-token.ts","webpack:///../src/common/sagas/flex/create-flex-token.ts","webpack:///../src/common/state/tracking/actions.ts","webpack:///../src/common/sagas/tracking/track-event.ts","webpack:///../src/common/sagas/location/location-info.ts","webpack:///../src/common/sagas/location/validate-address.ts","webpack:///../src/common/sagas/location/get-countries.ts","webpack:///../src/common/sagas/flex/create-flex-microform.ts","webpack:///../src/common/sagas/flex/clear-flex-microform-state.ts","webpack:///../src/common/utils/aws-utils.ts","webpack:///../src/common/sagas/marketing/marketo.ts","webpack:///../src/common/sagas/location/international-blocker.ts","webpack:///../src/common/sagas/account/update-account-email-verification.ts","webpack:///../src/common/sagas/content/set-language.ts","webpack:///../src/common/sagas/index.ts","webpack:///../src/products/gtc/data/buy-form.ts","webpack:///../src/products/gtc/state/content/reducer.ts","webpack:///../src/products/gtc/data/label-content.ts","webpack:///../src/products/gtc/state/checkout/reducer.ts","webpack:///../src/products/gtc/state/buy-form/reducer.ts","webpack:///../src/products/gtc/state/user/reducer.ts","webpack:///../src/products/gtc/state/coupon/actions.ts","webpack:///../src/products/gtc/state/coupon/reducer.ts","webpack:///../src/products/gtc/store/store.ts","webpack:///../src/products/gtc/services/index.ts","webpack:///../src/products/gtc/saga/content/load-content.ts","webpack:///../src/products/gtc/saga/user/create-user.ts","webpack:///../src/products/gtc/utils/get-billing-values.ts","webpack:///../src/products/gtc/saga/content/content-helpers.ts","webpack:///../src/products/gtc/utils/get-item-values.ts","webpack:///../src/products/gtc/saga/checkout-form/create-billing-info.ts","webpack:///../src/products/gtc/saga/checkout-form/create-payment.ts","webpack:///../src/products/gtc/saga/checkout-form/submit-payment.ts","webpack:///../src/products/gtc/saga/checkout-form/get-payment-methods.ts","webpack:///../src/products/gtc/saga/number-picker/reserve-phone-number-helpers.ts","webpack:///../src/products/gtc/saga/checkout-form/form-submission.ts","webpack:///../src/products/gtc/saga/user/abandoned-cart.ts","webpack:///../src/products/gtc/saga/user/existing-user.ts","webpack:///../src/products/gtc/saga/user/get-token.ts","webpack:///../src/products/gtc/saga/user/login.ts","webpack:///../src/products/gtc/saga/user/logout.ts","webpack:///../src/products/gtc/saga/saved-state/saved-state.ts","webpack:///../src/products/gtc/saga/checkout-form/calculate-price.ts","webpack:///../src/products/gtc/saga/user/user-logged-in.ts","webpack:///../src/products/gtc/saga/checkout-form/existing-user-form-submission.ts","webpack:///../src/products/gtc/saga/checkout-form/reset-checkout-form-affected-states.ts","webpack:///../src/products/gtc/saga/tracking/track-helpers.ts","webpack:///../src/products/gtc/saga/tracking/track-event.ts","webpack:///../src/products/gtc/saga/checkout-form/calculate-volume-discount.ts","webpack:///../src/products/gtc/saga/checkout-form/get-selected-tier.ts","webpack:///../src/products/gtc/saga/checkout-form/get-volume-discount.ts","webpack:///../src/products/gtc/saga/checkout-form/set-billing-frequency.ts","webpack:///../src/products/gtc/saga/coupon/validate-coupon.ts","webpack:///../src/products/gtc/saga/coupon/get-coupon-details.ts","webpack:///../src/products/gtc/saga/coupon/calculate-coupon-price.ts","webpack:///../src/products/gtc/saga/coupon/observe-validate-coupon.ts","webpack:///../src/products/gtc/saga/coupon/attempt-url-coupon.ts","webpack:///../src/products/gtc/saga/coupon/check-cms-coupon.ts","webpack:///../src/products/gtc/saga/coupon/check-volume-discount-against-reprice-coupon.ts","webpack:///../src/products/gtc/saga/coupon/attempt-cms-coupon.ts","webpack:///../src/products/gtc/saga/number-picker/reserve-phone-number.ts","webpack:///../src/products/gtc/saga/index.ts","webpack:///../src/products/gtresolve/saga/content/load-content.ts","webpack:///../src/products/gtresolve/saga/user/create-user.ts","webpack:///../src/products/gtresolve/utils/get-billing-values.ts","webpack:///../src/products/gtresolve/saga/content/content-helpers.ts","webpack:///../src/products/gtresolve/saga/user/abandoned-cart.ts","webpack:///../src/products/gtresolve/saga/checkout-form/create-billing-info.ts","webpack:///../src/products/gtresolve/saga/checkout-form/submit-payment.ts","webpack:///../src/products/gtresolve/saga/checkout-form/create-and-submit-payment.ts","webpack:///../src/products/gtresolve/saga/checkout-form/form-submission.ts","webpack:///../src/products/gtresolve/saga/user/existing-user.ts","webpack:///../src/products/gtresolve/saga/user/get-token.ts","webpack:///../src/products/gtresolve/saga/user/login.ts","webpack:///../src/products/gtresolve/saga/user/logout.ts","webpack:///../src/products/gtresolve/state/coupon/actions.ts","webpack:///../src/products/gtresolve/saga/saved-state/saved-state.ts","webpack:///../src/products/gtresolve/saga/checkout-form/calculate-price.ts","webpack:///../src/products/gtresolve/saga/checkout-form/create-payment.ts","webpack:///../src/products/gtresolve/saga/checkout-form/get-payment-methods.ts","webpack:///../src/products/gtresolve/saga/user/user-logged-in.ts","webpack:///../src/products/gtresolve/saga/checkout-form/existing-user-form-submission.ts","webpack:///../src/products/gtresolve/state/checkout/reducer.ts","webpack:///../src/products/gtresolve/saga/checkout-form/reset-checkout-form-affected-states.ts","webpack:///../src/products/gtresolve/saga/tracking/track-helpers.ts","webpack:///../src/products/gtresolve/saga/tracking/track-event.ts","webpack:///../src/products/gtresolve/saga/checkout-form/calculate-volume-discount.ts","webpack:///../src/products/gtresolve/saga/checkout-form/get-selected-tier.ts","webpack:///../src/products/gtresolve/data/buy-form.ts","webpack:///../src/products/gtresolve/saga/checkout-form/get-volume-discount.ts","webpack:///../src/products/gtresolve/saga/checkout-form/set-billing-frequency.ts","webpack:///../src/products/gtresolve/saga/coupon/validate-coupon.ts","webpack:///../src/products/gtresolve/saga/coupon/get-coupon-details.ts","webpack:///../src/products/gtresolve/saga/coupon/calculate-coupon-price.ts","webpack:///../src/products/gtresolve/saga/coupon/observe-validate-coupon.ts","webpack:///../src/products/gtresolve/saga/coupon/attempt-url-coupon.ts","webpack:///../src/products/gtresolve/saga/coupon/check-cms-coupon.ts","webpack:///../src/products/gtresolve/saga/coupon/check-volume-discount-against-reprice-coupon.ts","webpack:///../src/products/gtresolve/saga/coupon/attempt-cms-coupon.ts","webpack:///../src/products/gtresolve/saga/index.ts","webpack:///../src/products/lmipro/saga/content/load-content.ts","webpack:///../src/products/lmipro/saga/user/create-user.ts","webpack:///../src/products/lmipro/utils/get-billing-values.ts","webpack:///../src/products/lmipro/saga/content/content-helpers.ts","webpack:///../src/products/lmipro/saga/user/abandoned-cart.ts","webpack:///../src/products/lmipro/saga/checkout-form/create-billing-info.ts","webpack:///../src/products/lmipro/saga/checkout-form/submit-payment.ts","webpack:///../src/products/lmipro/saga/checkout-form/create-and-submit-payment.ts","webpack:///../src/products/lmipro/saga/checkout-form/form-submission.ts","webpack:///../src/products/lmipro/saga/user/existing-user.ts","webpack:///../src/products/lmipro/saga/user/get-token.ts","webpack:///../src/products/lmipro/saga/user/login.ts","webpack:///../src/products/lmipro/saga/user/logout.ts","webpack:///../src/products/lmipro/state/coupon/actions.ts","webpack:///../src/products/lmipro/saga/saved-state/saved-state.ts","webpack:///../src/products/lmipro/saga/checkout-form/calculate-price.ts","webpack:///../src/products/lmipro/saga/checkout-form/create-payment.ts","webpack:///../src/products/lmipro/saga/checkout-form/get-payment-methods.ts","webpack:///../src/products/lmipro/saga/user/user-logged-in.ts","webpack:///../src/products/lmipro/saga/checkout-form/existing-user-form-submission.ts","webpack:///../src/products/lmipro/state/checkout/reducer.ts","webpack:///../src/products/lmipro/saga/checkout-form/reset-checkout-form-affected-states.ts","webpack:///../src/products/lmipro/saga/tracking/track-helpers.ts","webpack:///../src/products/lmipro/saga/tracking/track-event.ts","webpack:///../src/products/lmipro/saga/checkout-form/calculate-volume-discount.ts","webpack:///../src/products/lmipro/saga/checkout-form/get-selected-tier.ts","webpack:///../src/products/lmipro/data/buy-form.ts","webpack:///../src/products/lmipro/saga/checkout-form/get-volume-discount.ts","webpack:///../src/products/lmipro/saga/checkout-form/set-billing-frequency.ts","webpack:///../src/products/lmipro/saga/coupon/validate-coupon.ts","webpack:///../src/products/lmipro/saga/coupon/get-coupon-details.ts","webpack:///../src/products/lmipro/saga/coupon/calculate-coupon-price.ts","webpack:///../src/products/lmipro/saga/coupon/observe-validate-coupon.ts","webpack:///../src/products/lmipro/saga/coupon/attempt-url-coupon.ts","webpack:///../src/products/lmipro/saga/coupon/check-cms-coupon.ts","webpack:///../src/products/lmipro/saga/coupon/check-volume-discount-against-reprice-coupon.ts","webpack:///../src/products/lmipro/saga/coupon/attempt-cms-coupon.ts","webpack:///../src/products/lmipro/saga/index.ts","webpack:///../src/products/lmicentral/saga/content/load-content.ts","webpack:///../src/products/lmicentral/saga/user/create-user.ts","webpack:///../src/products/lmicentral/utils/get-billing-values.ts","webpack:///../src/products/lmicentral/saga/content/content-helpers.ts","webpack:///../src/products/lmicentral/saga/user/abandoned-cart.ts","webpack:///../src/products/lmicentral/saga/checkout-form/create-billing-info.ts","webpack:///../src/products/lmicentral/saga/checkout-form/submit-payment.ts","webpack:///../src/products/lmicentral/saga/checkout-form/create-and-submit-payment.ts","webpack:///../src/products/lmicentral/saga/checkout-form/form-submission.ts","webpack:///../src/products/lmicentral/saga/user/existing-user.ts","webpack:///../src/products/lmicentral/saga/user/get-token.ts","webpack:///../src/products/lmicentral/saga/user/login.ts","webpack:///../src/products/lmicentral/saga/user/logout.ts","webpack:///../src/products/lmicentral/state/coupon/actions.ts","webpack:///../src/products/lmicentral/saga/saved-state/saved-state.ts","webpack:///../src/products/lmicentral/saga/checkout-form/calculate-price.ts","webpack:///../src/products/lmicentral/saga/checkout-form/create-payment.ts","webpack:///../src/products/lmicentral/saga/checkout-form/get-payment-methods.ts","webpack:///../src/products/lmicentral/saga/user/user-logged-in.ts","webpack:///../src/products/lmicentral/saga/checkout-form/existing-user-form-submission.ts","webpack:///../src/products/lmicentral/state/checkout/reducer.ts","webpack:///../src/products/lmicentral/saga/checkout-form/reset-checkout-form-affected-states.ts","webpack:///../src/products/lmicentral/saga/tracking/track-helpers.ts","webpack:///../src/products/lmicentral/saga/tracking/track-event.ts","webpack:///../src/products/lmicentral/saga/checkout-form/calculate-volume-discount.ts","webpack:///../src/products/lmicentral/saga/checkout-form/get-selected-tier.ts","webpack:///../src/products/lmicentral/data/buy-form.ts","webpack:///../src/products/lmicentral/saga/checkout-form/get-volume-discount.ts","webpack:///../src/products/lmicentral/saga/checkout-form/set-billing-frequency.ts","webpack:///../src/products/lmicentral/saga/coupon/validate-coupon.ts","webpack:///../src/products/lmicentral/saga/coupon/get-coupon-details.ts","webpack:///../src/products/lmicentral/saga/coupon/calculate-coupon-price.ts","webpack:///../src/products/lmicentral/saga/coupon/observe-validate-coupon.ts","webpack:///../src/products/lmicentral/saga/coupon/attempt-url-coupon.ts","webpack:///../src/products/lmicentral/saga/coupon/check-cms-coupon.ts","webpack:///../src/products/lmicentral/saga/coupon/check-volume-discount-against-reprice-coupon.ts","webpack:///../src/products/lmicentral/saga/coupon/attempt-cms-coupon.ts","webpack:///../src/products/lmicentral/saga/index.ts","webpack:///../src/products/gtresolve/data/label-content.ts","webpack:///../src/products/gtresolve/state/content/reducer.ts","webpack:///../src/products/gtresolve/state/buy-form/reducer.ts","webpack:///../src/products/gtresolve/state/user/reducer.ts","webpack:///../src/products/gtresolve/state/coupon/reducer.ts","webpack:///../src/products/gtresolve/store/store.ts","webpack:///../src/products/lmipro/state/content/reducer.ts","webpack:///../src/products/lmipro/data/label-content.ts","webpack:///../src/products/lmipro/state/buy-form/reducer.ts","webpack:///../src/products/lmipro/state/user/reducer.ts","webpack:///../src/products/lmipro/state/coupon/reducer.ts","webpack:///../src/products/lmipro/store/store.ts","webpack:///../src/products/buy/state/checkout/reducer.ts","webpack:///../src/products/buy/data/buy-form.ts","webpack:///../src/products/buy/state/buy-form/reducer.ts","webpack:///../src/products/buy/state/user/reducer.ts","webpack:///../src/products/buy/state/coupon/reducer.ts","webpack:///../src/products/buy/data/plan-data.ts","webpack:///../src/products/buy/data/price.ts","webpack:///../src/products/buy/state/plan-data/reducer.ts","webpack:///../src/products/buy/data/label-content.ts","webpack:///../src/products/buy/store/store.ts","webpack:///../src/products/buy/saga/content/content-helpers.ts","webpack:///../src/products/buy/saga/content/load-content.ts","webpack:///../src/products/buy/saga/user/create-user.ts","webpack:///../src/products/buy/utils/get-billing-values.ts","webpack:///../src/products/buy/saga/user/abandoned-cart.ts","webpack:///../src/products/buy/utils/will-price-fail-to-process.ts","webpack:///../src/products/buy/saga/checkout-form/create-billing-info.ts","webpack:///../src/products/buy/saga/checkout-form/submit-payment.ts","webpack:///../src/products/buy/saga/checkout-form/create-and-submit-payment.ts","webpack:///../src/products/buy/saga/checkout-form/form-submission.ts","webpack:///../src/products/buy/saga/user/create-user-ucs.ts","webpack:///../src/products/buy/utils/sanitize-company-name.ts","webpack:///../src/products/buy/utils/get-onepay-locale.ts","webpack:///../src/products/buy/saga/checkout-form/form-submission-ucs.ts","webpack:///../src/products/buy/saga/user/existing-user.ts","webpack:///../src/products/buy/saga/user/get-token.ts","webpack:///../src/products/buy/saga/user/login.ts","webpack:///../src/products/buy/saga/user/logout.ts","webpack:///../src/products/buy/saga/checkout-form/get-latest-invoice.ts","webpack:///../src/products/buy/saga/checkout-form/download-invoice.ts","webpack:///../src/products/buy/saga/saved-state/saved-state.ts","webpack:///../src/products/buy/saga/checkout-form/calculate-price.ts","webpack:///../src/products/buy/saga/checkout-form/create-payment.ts","webpack:///../src/products/buy/saga/checkout-form/get-payment-methods.ts","webpack:///../src/products/buy/saga/user/user-logged-in.ts","webpack:///../src/products/buy/saga/checkout-form/existing-user-form-submission.ts","webpack:///../src/products/buy/saga/checkout-form/existing-user-form-submission-ucs.ts","webpack:///../src/products/buy/saga/checkout-form/reset-checkout-form-affected-states.ts","webpack:///../src/products/buy/saga/tracking/track-helpers.ts","webpack:///../src/products/buy/saga/tracking/track-event.ts","webpack:///../src/products/buy/saga/checkout-form/calculate-volume-discount.ts","webpack:///../src/products/buy/saga/checkout-form/get-selected-tier.ts","webpack:///../src/products/buy/saga/checkout-form/get-volume-discount.ts","webpack:///../src/products/buy/saga/checkout-form/set-billing-frequency.ts","webpack:///../src/products/buy/saga/coupon/get-coupon-details.ts","webpack:///../src/products/buy/saga/coupon/attempt-url-coupon.ts","webpack:///../src/products/buy/saga/index.ts","webpack:///../src/products/lmicentral/data/label-content.ts","webpack:///../src/products/lmicentral/state/content/reducer.ts","webpack:///../src/products/lmicentral/state/buy-form/reducer.ts","webpack:///../src/products/lmicentral/state/user/reducer.ts","webpack:///../src/products/lmicentral/state/coupon/reducer.ts","webpack:///../src/products/lmicentral/store/store.ts","webpack:///../src/app-store.ts","webpack:///../src/products/gtc/store/store-throttle.ts","webpack:///../src/products/gtresolve/store/store-throttle.ts","webpack:///../src/products/lmipro/store/store-throttle.ts","webpack:///../src/products/lmicentral/store/store-throttle.ts","webpack:///../src/products/buy/store/store-throttle.ts","webpack:///../src/Main.tsx","webpack:///../src/common/components/BoxWrapper/box-wrapper.module.css","webpack:///../src/common/components/BoxWrapper/index.tsx","webpack:///../src/common/components/CommonButton/common-button.module.css","webpack:///../src/common/components/CommonButton/index.tsx","webpack:///../src/common/components/ConvertStringToReact/index.tsx","webpack:///../src/common/images/alert-warn.svg","webpack:///../src/common/images/alert-inactive.svg","webpack:///../src/common/components/ErrorMessage/error-message.module.css","webpack:///../src/common/components/ErrorMessage/index.tsx","webpack:///../src/common/components/ErrorView/error-view.module.css","webpack:///../src/common/components/ErrorView/index.tsx","webpack:///../src/common/components/FlexField/flex-field.css","webpack:///../src/common/components/FlexField/flex-field.tsx","webpack:///../src/common/components/InfoView/info-view.module.css","webpack:///../src/common/components/InfoView/index.tsx","webpack:///../src/common/components/InputField/inputField.module.css","webpack:///../src/common/components/InputField/index.tsx","webpack:///../src/common/components/Input/input.module.css","webpack:///../src/common/components/Input/GenericInput.tsx","webpack:///../src/common/components/Input/MaskedInput.tsx","webpack:///../src/common/components/Input/index.tsx","webpack:///../src/common/images/gtm-process-spinner-accelerated-blue-3s.svg","webpack:///../src/common/images/gtm-process-spinner-white-b-2s.svg","webpack:///../src/common/images/gtm-process-spinner-accelerated-disabled-3s.svg","webpack:///../src/common/components/LoadingSpinner/loadingSpinner.module.css","webpack:///../src/common/components/LoadingSpinner/index.tsx","webpack:///../src/common/components/RadioInputFieldWithBorder/radioInputFieldWithBorder.module.css","webpack:///../src/common/components/RadioInputFieldWithBorder/index.tsx","webpack:///../src/common/components/ErrorBoundary/index.tsx","webpack:///../src/common/components/CardSelector/cardselector.module.css","webpack:///../src/common/components/CardSelector/index.tsx","webpack:///../src/common/components/Checkbox/checkbox.module.css","webpack:///../src/common/components/Checkbox/index.tsx","webpack:///../src/common/components/CommonLink/common-link.module.css","webpack:///../src/common/components/CommonLink/index.tsx","webpack:///../src/common/images/icon-collapse.svg","webpack:///../src/common/images/icon-modify-off.svg","webpack:///../src/common/images/icon-welcome@2x.jpg","webpack:///../src/common/constants/input.ts","webpack:///../src/common/components/LicenseSelector/license-selector.module.css","webpack:///../src/common/components/LicenseSelector/index.tsx","webpack:///../src/common/components/RadioInputField/radioInputField.module.css","webpack:///../src/common/components/RadioInputField/index.tsx","webpack:///../src/common/components/Select/index.tsx","webpack:///../src/common/components/ToggleButton/index.tsx","webpack:///../src/common/images/icon-info-tooltip.svg","webpack:///../src/common/components/Tooltip/tooltip.module.css","webpack:///../src/common/components/Tooltip/index.tsx","webpack:///../src/common/images/img-trust-arc.svg","webpack:///../src/common/images/icon-clock.svg","webpack:///../src/common/components/TrustArcLogo/trust-arc-logo.css","webpack:///../src/common/components/TrustArcLogo/index.tsx","webpack:///../src/common/components/FormatCurrency/FormatCurrency.tsx","webpack:///../src/common/components/FormatCurrency/FormatDecimalCurrency.tsx","webpack:///../src/common/images/img-icon-requirement-empty.svg","webpack:///../src/common/images/img-icon-requirement-success.svg","webpack:///../src/common/images/img-icon-requirement-alert.svg","webpack:///../src/common/components/Header/header.module.css","webpack:///../src/common/components/Header/index.tsx","webpack:///../src/common/components/TrustArc/trustarc.module.css","webpack:///../src/common/components/TrustArc/index.tsx","webpack:///../src/common/components/Footer/footer.module.css","webpack:///../src/common/components/Footer/index.tsx","webpack:///../src/common/utils/detoken-year.ts","webpack:///../src/common/components/LoadAnalyticScripts/index.tsx","webpack:///../src/common/components/BoldChat/index.tsx","webpack:///../src/common/components/LmiMaScript/index.tsx","webpack:///../src/common/components/ChatbotScript/index.tsx","webpack:///../src/common/components/GlobalScripts/index.tsx","webpack:///../src/common/components/FormSubmitButton/form-submit-button.module.css","webpack:///../src/common/components/FormSubmitButton/index.tsx","webpack:///../src/common/images/icon-info-warn.svg","webpack:///../src/common/images/feature-check-small.svg","webpack:///../src/common/components/InlineErrorView/index.tsx","webpack:///../src/common/components/CustomDropdown/customdropdown.module.css","webpack:///../src/common/components/CustomDropdown/index.tsx","webpack:///../src/common/images/icon-pw-tip.svg","webpack:///../src/common/images/icon-chevron-down-blue.svg","webpack:///../src/common/images/icon-chevron-up-blue.svg","webpack:///../src/common/components/PasswordStrengthIndicator/passwordStrengthIndicator.module.css","webpack:///../src/common/components/PasswordStrengthIndicator/index.tsx","webpack:///../src/common/connectedComponents/Modal/connector.ts","webpack:///../src/common/connectedComponents/Modal/modal.module.css","webpack:///../src/common/connectedComponents/Modal/index.tsx","webpack:///../src/common/connectedComponents/Flex/connector.ts","webpack:///../src/common/connectedComponents/Flex/index.tsx","webpack:///../src/common/constants/cookie-names.ts","webpack:///../src/common/constants/featureFlags.ts","webpack:///../src/common/constants/flex.ts","webpack:///../src/common/constants/companySize.ts","webpack:///../src/common/constants/countries.ts","webpack:///../src/common/constants/currencies.ts","webpack:///../src/common/constants/path.ts","webpack:///../src/common/utils/get-domain.ts","webpack:///../src/common/constants/plan.ts","webpack:///../src/common/constants/product.ts","webpack:///../src/common/constants/timePeriod.ts","webpack:///../src/common/constants/authOptions.ts","webpack:///../src/common/constants/external-url.ts","webpack:///../src/common/utils/get-external-url.ts","webpack:///../src/common/constants/marketo.ts","webpack:///../src/common/constants/storage.ts","webpack:///../src/common/constants/tracking.ts","webpack:///../src/common/constants/gtm-codes.ts","webpack:///../src/common/constants/directions.ts","webpack:///../src/common/constants/coupon.ts","webpack:///../src/common/constants/lmi-ma-goto-script.ts","webpack:///../src/common/constants/platform.ts","webpack:///../src/common/constants/product-types.ts","webpack:///../src/common/constants/phoneInfo.ts","webpack:///../src/common/constants/chatbotConfig.ts","webpack:///../src/common/constants/languages.ts","webpack:///../src/common/constants/screenSizes.ts","webpack:///../src/common/hooks/useSmoothScrollPolyfill.ts","webpack:///../src/common/hooks/useFlexForm.ts","webpack:///../src/common/hooks/useMetrixScript.ts","webpack:///../src/common/hooks/useClearField.ts","webpack:///../src/common/hooks/useRedirectOnLoad.ts","webpack:///../src/common/hooks/useGTM.ts","webpack:///../src/common/hooks/usePageLoad.ts","webpack:///../src/common/hooks/useBoldChat.ts","webpack:///../src/common/hooks/useTrustArc.ts","webpack:///../src/common/hooks/useQualtrics.ts","webpack:///../src/common/hooks/useChatbot.ts","webpack:///../src/common/utils/lockHtmlElementAttribute.ts","webpack:///../src/common/hooks/useAddressAutoFill.ts","webpack:///../src/common/hooks/useIsMountedRef.ts","webpack:///../src/common/hooks/useLoadScript.ts","webpack:///../src/common/hooks/useScrollToTop.ts","webpack:///../src/common/services/index.ts","webpack:///../src/common/state/checkout/actions.ts","webpack:///../src/common/state/content/actions.ts","webpack:///../src/common/state/fatal-error/actions.ts","webpack:///../src/common/state/fatal-error/state.ts","webpack:///../src/common/state/flex/actions.ts","webpack:///../src/common/state/location/actions.ts","webpack:///../src/common/state/marketing/actions.ts","webpack:///../src/common/state/modal/actions.ts","webpack:///../src/common/state/selectors.ts","webpack:///../src/common/utils/application-insight.ts","webpack:///../src/common/utils/auth-class.ts","webpack:///../src/common/utils/cookie-utils.ts","webpack:///../src/common/utils/getInnerHTMLByClassName.ts","webpack:///../src/common/utils/getAddressFromGooglePlace.ts","webpack:///../src/common/utils/getGUID.ts","webpack:///../src/common/utils/action-types.ts","webpack:///../src/common/utils/formatDate.ts","webpack:///../src/common/utils/tracking.ts","webpack:///../src/common/utils/redux-wrapper.ts","webpack:///../src/common/utils/create-flex-microform.ts","webpack:///../src/common/utils/get-flex-microform.ts","webpack:///../src/common/utils/marketo-object.ts","webpack:///../src/common/utils/add-gtm-iframe.ts","webpack:///../src/common/utils/throttle-redux-middleware.ts","webpack:///../src/common/utils/app-identifier.ts","webpack:///../src/common/utils/process-existing-billing-info.ts","webpack:///../src/common/utils/checkout-inline-error-helper.ts","webpack:///../src/common/utils/modal-utils.ts","webpack:///../src/common/utils/session-storage.ts","webpack:///../src/common/utils/format-confirmation-message.ts","webpack:///../src/common/utils/isValidPostalCode.ts","webpack:///../src/common/utils/path-utils.ts","webpack:///../src/common/utils/price-utils.ts","webpack:///../src/common/utils/save-route-query.ts","webpack:///../src/common/utils/scroll.ts","webpack:///../src/common/utils/silent-auth.ts","webpack:///../src/products/buy/constants/error-strings.ts","webpack:///../src/products/buy/constants/flexible-components.ts","webpack:///../src/products/buy/constants/license-cap.ts","webpack:///../src/products/buy/constants/user-types.ts","webpack:///../src/products/buy/constants/addons.ts","webpack:///../src/products/buy/constants/field-types.ts","webpack:///../src/products/buy/constants/checkout-form-steps.ts","webpack:///../src/products/buy/constants/tracking-components.ts","webpack:///../src/products/buy/constants/checkout-form-fields.ts","webpack:///../src/products/buy/constants/product-price-items.ts","webpack:///../src/products/buy/constants/buy-type.ts","webpack:///../src/products/buy/services/index.ts","webpack:///../src/products/buy/state/buy-form/actions.ts","webpack:///../src/products/buy/state/checkout/actions.ts","webpack:///../src/products/buy/state/coupon/actions.ts","webpack:///../src/products/buy/state/plan-data/actions.ts","webpack:///../src/products/buy/state/selectors.ts","webpack:///../src/products/buy/state/tracking/actions.ts","webpack:///../src/products/buy/state/user/actions.ts","webpack:///../src/products/buy/utils/calculate-volume-discount.ts","webpack:///../src/products/buy/utils/get-current-addons.ts","webpack:///../src/products/buy/utils/get-is-onepay-flow.ts","webpack:///../src/products/buy/utils/get-item-values.ts","webpack:///../src/products/buy/utils/buy-tracking.ts","webpack:///../src/products/buy/utils/validation-schema.ts","webpack:///../src/products/buy/utils/coupon.ts","webpack:///../src/products/buy/utils/validate-address-helpers.ts","webpack:///../src/products/buy/utils/session-storage.ts","webpack:///../src/products/buy/utils/local-storage.ts","webpack:///../src/products/buy/utils/checkout-form-helpers.ts","webpack:///../src/products/buy/utils/calculate-prorated-amount.ts","webpack:///../src/products/buy/utils/get-selected-tier.ts","webpack:///../src/products/buy/utils/get-subscription-info.ts","webpack:///../src/products/buy/utils/get-cart-info.ts","webpack:///../src/products/buy/utils/language-helpers.ts","webpack:///../src/products/buy/utils/upgrade-user.ts","webpack:///../src/products/buy/utils/volume-components-helpers.ts","webpack:///../src/products/gtc/connectedComponents/Tracking/connector.ts","webpack:///../src/products/gtc/connectedComponents/Tracking/index.tsx","webpack:///../src/products/gtc/connectedComponents/FormatCurrency/connector.ts","webpack:///../src/products/gtc/connectedComponents/FormatCurrency/FormatCurrency.tsx","webpack:///../src/products/gtc/connectedComponents/FormatCurrency/FormatDecimalCurrency.tsx","webpack:///../src/products/gtc/connectedComponents/InternationalBlocker/connector.ts","webpack:///../src/products/gtc/connectedComponents/InternationalBlocker/international-blocker.css","webpack:///../src/products/gtc/connectedComponents/InternationalBlocker/index.tsx","webpack:///../src/products/gtc/connectedComponents/CheckoutFormContainer/connector.ts","webpack:///../src/products/gtc/connectedComponents/CheckoutForm/connector.ts","webpack:///../src/products/gtc/constants/error-strings.ts","webpack:///../src/products/gtc/connectedComponents/CheckoutForm/checkout-form.module.css","webpack:///../src/products/gtc/connectedComponents/CheckoutForm/index.tsx","webpack:///../src/products/gtc/connectedComponents/CheckoutFormContainer/index.tsx","webpack:///../src/products/gtc/connectedComponents/Customize/connector.ts","webpack:///../src/common/components/Card/card.module.css","webpack:///../src/common/components/Card/index.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerOptions/NumberPickerOptions.module.css","webpack:///../src/common/components/Badge/badge.module.css","webpack:///../src/common/components/Badge/index.tsx","webpack:///../src/products/gtc/utils/index-of-vanity-phrase.ts","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/FormattedPhoneNumber/FormattedNumber.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/FormattedPhoneNumber/FormattedPhoneNumber.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerSummary/NumberPickerSummary.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerSummary/NumberPickerSummary.tsx","webpack:///../src/common/utils/format-city.ts","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerOptions/NumberPickerOptions.tsx","webpack:///../src/common/components/ModalDrawer/modalDrawer.module.css","webpack:///../src/common/components/ModalDrawer/index.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/Navigation/Navigation.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/Navigation/Navigation.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/SearchFilters/SearchFilters.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/SearchFilters/SearchFilters.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/FooterButtons/FooterButtons.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/FooterButtons/FooterButtons.tsx","webpack:///../src/common/components/Skeleton/skeleton.module.css","webpack:///../src/common/components/Skeleton/index.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/SearchResults/SearchResults.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/SearchResults/SearchResults.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/VanityPhrase/VanityPhrase.module.css","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/components/VanityPhrase/VanityPhrase.tsx","webpack:///../src/products/gtc/components/NumberPicker/NumberPickerModal/NumberPickerModal.tsx","webpack:///../src/common/images/goto-connect-logo.svg","webpack:///../src/common/images/goto-connect-icon.svg","webpack:///../src/common/images/icon-phone.svg","webpack:///../src/products/gtc/connectedComponents/OrderSummary/connector.ts","webpack:///../src/common/images/img-icon-arrow-down.svg","webpack:///../src/products/gtc/components/PasswordValidation/password-validation.module.css","webpack:///../src/products/gtc/components/PasswordValidation/index.tsx","webpack:///../src/products/gtc/components/OrderSummaryAddons/order-summary-addons.css","webpack:///../src/products/gtc/components/OrderSummaryAddons/index.tsx","webpack:///../src/products/gtc/connectedComponents/OrderSummary/order-summary.module.css","webpack:///../src/products/gtc/connectedComponents/OrderSummary/index.tsx","webpack:///../src/products/gtc/connectedComponents/Customize/customize.module.css","webpack:///../src/products/gtc/connectedComponents/Customize/index.tsx","webpack:///../src/products/gtc/hooks/usePhoneNumberSearch.ts","webpack:///../src/products/gtc/connectedComponents/AccountFormInfo/connector.ts","webpack:///../src/products/gtc/connectedComponents/AccountFormInfo/index.tsx","webpack:///../src/products/gtc/connectedComponents/BillingFormInfo/connector.ts","webpack:///../src/products/gtc/connectedComponents/BillingFormInfo/billing-info.module.css","webpack:///../src/products/gtc/connectedComponents/BillingFormInfo/index.tsx","webpack:///../src/products/gtc/connectedComponents/PaymentFormInfo/connector.ts","webpack:///../src/products/gtc/connectedComponents/PaymentFormInfo/payment-info.module.css","webpack:///../src/products/gtc/connectedComponents/PaymentFormInfo/index.tsx","webpack:///../src/products/gtc/connectedComponents/CheckoutFormSubmission/index.tsx","webpack:///../src/products/gtc/connectedComponents/CheckoutFormSubmission/connector.ts","webpack:///../src/products/gtc/constants/license-cap.ts","webpack:///../src/products/gtc/constants/user-types.ts","webpack:///../src/products/gtc/constants/addons.ts","webpack:///../src/products/gtc/constants/field-types.ts","webpack:///../src/products/gtc/constants/checkout-form-steps.ts","webpack:///../src/products/gtc/constants/tracking-components.ts","webpack:///../src/products/gtc/constants/checkout-form-fields.ts","webpack:///../src/products/gtc/constants/product-price-items.ts","webpack:///../src/products/gtc/constants/buy-type.ts","webpack:///../src/products/gtc/hooks/useGTCTracking.ts","webpack:///../src/products/gtc/hooks/useBillingPageTracking.ts","webpack:///../src/products/gtc/hooks/useCheckoutFormPageTracking.ts","webpack:///../src/products/gtc/hooks/useCustomizePageTracking.ts","webpack:///../src/products/gtc/hooks/useNextStepsPageTracking.ts","webpack:///../src/common/utils/stringifyParamsUsingArrayFormatNone.ts","webpack:///../src/products/gtc/services/numbersApi.ts","webpack:///../src/products/gtc/state/buy-form/actions.ts","webpack:///../src/products/gtc/state/checkout/actions.ts","webpack:///../src/products/gtc/state/content/actions.ts","webpack:///../src/products/gtc/state/selectors.ts","webpack:///../src/products/gtc/state/tracking/actions.ts","webpack:///../src/products/gtc/state/user/actions.ts","webpack:///../src/products/gtc/utils/get-current-addons.ts","webpack:///../src/products/gtc/utils/get-current-plan.ts","webpack:///../src/products/gtc/utils/validation-schema.ts","webpack:///../src/products/gtc/utils/local-storage.ts","webpack:///../src/products/gtc/utils/validate-address-helpers.ts","webpack:///../src/products/gtc/utils/gtc-tracking.ts","webpack:///../src/products/gtc/utils/checkout-form-helpers.ts","webpack:///../src/products/gtc/utils/order-summary-helpers.ts","webpack:///../src/products/gtc/utils/get-selected-tier.ts","webpack:///../src/products/gtc/utils/calculate-volume-discount.ts","webpack:///../src/products/gtc/utils/calculate-prorated-amount.ts","webpack:///../src/products/gtc/utils/coupon.ts","webpack:///../src/products/gtc/utils/session-storage.ts","webpack:///../src/products/gtresolve/constants/error-strings.ts","webpack:///../src/products/gtresolve/constants/license-cap.ts","webpack:///../src/products/gtresolve/constants/user-types.ts","webpack:///../src/products/gtresolve/constants/addons.ts","webpack:///../src/products/gtresolve/constants/field-types.ts","webpack:///../src/products/gtresolve/constants/checkout-form-steps.ts","webpack:///../src/products/gtresolve/constants/tracking-components.ts","webpack:///../src/products/gtresolve/constants/checkout-form-fields.ts","webpack:///../src/products/gtresolve/constants/product-price-items.ts","webpack:///../src/products/gtresolve/constants/buy-type.ts","webpack:///../src/products/gtresolve/constants/referrers.ts","webpack:///../src/products/gtresolve/services/index.ts","webpack:///../src/products/gtresolve/state/buy-form/actions.ts","webpack:///../src/products/gtresolve/state/checkout/actions.ts","webpack:///../src/products/gtresolve/state/content/actions.ts","webpack:///../src/products/gtresolve/state/selectors.ts","webpack:///../src/products/gtresolve/state/tracking/actions.ts","webpack:///../src/products/gtresolve/state/user/actions.ts","webpack:///../src/products/gtresolve/utils/calculate-prorated-amount.ts","webpack:///../src/products/gtresolve/utils/calculate-volume-discount.ts","webpack:///../src/products/gtresolve/utils/get-current-addons.ts","webpack:///../src/products/gtresolve/utils/get-current-plan.ts","webpack:///../src/products/gtresolve/utils/get-item-values.ts","webpack:///../src/products/gtresolve/utils/gtresolve-tracking.ts","webpack:///../src/products/gtresolve/utils/validation-schema.ts","webpack:///../src/products/gtresolve/utils/coupon.ts","webpack:///../src/products/gtresolve/utils/validate-address-helpers.ts","webpack:///../src/products/gtresolve/utils/order-summary-helpers.ts","webpack:///../src/products/gtresolve/utils/session-storage.ts","webpack:///../src/products/gtresolve/utils/local-storage.ts","webpack:///../src/products/gtresolve/utils/checkout-form-helpers.ts","webpack:///../src/products/gtresolve/utils/get-selected-tier.ts","webpack:///../src/products/gtresolve/utils/get-subscription-info.ts","webpack:///../src/products/gtresolve/utils/get-cart-info.ts","webpack:///../src/products/gtresolve/utils/language-helpers.ts","webpack:///../src/products/gtresolve/utils/upgrade-user.ts","webpack:///../src/products/lmicentral/constants/error-strings.ts","webpack:///../src/products/lmicentral/constants/license-cap.ts","webpack:///../src/products/lmicentral/constants/user-types.ts","webpack:///../src/products/lmicentral/constants/addons.ts","webpack:///../src/products/lmicentral/constants/field-types.ts","webpack:///../src/products/lmicentral/constants/checkout-form-steps.ts","webpack:///../src/products/lmicentral/constants/tracking-components.ts","webpack:///../src/products/lmicentral/constants/checkout-form-fields.ts","webpack:///../src/products/lmicentral/constants/product-price-items.ts","webpack:///../src/products/lmicentral/constants/buy-type.ts","webpack:///../src/products/lmicentral/constants/referrers.ts","webpack:///../src/products/lmicentral/services/index.ts","webpack:///../src/products/lmicentral/state/buy-form/actions.ts","webpack:///../src/products/lmicentral/state/checkout/actions.ts","webpack:///../src/products/lmicentral/state/content/actions.ts","webpack:///../src/products/lmicentral/state/selectors.ts","webpack:///../src/products/lmicentral/state/tracking/actions.ts","webpack:///../src/products/lmicentral/state/user/actions.ts","webpack:///../src/products/lmicentral/utils/calculate-prorated-amount.ts","webpack:///../src/products/lmicentral/utils/calculate-volume-discount.ts","webpack:///../src/products/lmicentral/utils/get-current-addons.ts","webpack:///../src/products/lmicentral/utils/get-current-plan.ts","webpack:///../src/products/lmicentral/utils/get-item-values.ts","webpack:///../src/products/lmicentral/utils/lmicentral-tracking.ts","webpack:///../src/products/lmicentral/utils/validation-schema.ts","webpack:///../src/products/lmicentral/utils/coupon.ts","webpack:///../src/products/lmicentral/utils/validate-address-helpers.ts","webpack:///../src/products/lmicentral/utils/order-summary-helpers.ts","webpack:///../src/products/lmicentral/utils/session-storage.ts","webpack:///../src/products/lmicentral/utils/local-storage.ts","webpack:///../src/products/lmicentral/utils/checkout-form-helpers.ts","webpack:///../src/products/lmicentral/utils/get-selected-tier.ts","webpack:///../src/products/lmicentral/utils/get-subscription-info.ts","webpack:///../src/products/lmicentral/utils/get-cart-info.ts","webpack:///../src/products/lmicentral/utils/language-helpers.ts","webpack:///../src/products/lmicentral/utils/upgrade-user.ts","webpack:///../src/products/lmipro/constants/error-strings.ts","webpack:///../src/products/lmipro/constants/license-cap.ts","webpack:///../src/products/lmipro/constants/user-types.ts","webpack:///../src/products/lmipro/constants/addons.ts","webpack:///../src/products/lmipro/constants/field-types.ts","webpack:///../src/products/lmipro/constants/checkout-form-steps.ts","webpack:///../src/products/lmipro/constants/tracking-components.ts","webpack:///../src/products/lmipro/constants/checkout-form-fields.ts","webpack:///../src/products/lmipro/constants/product-price-items.ts","webpack:///../src/products/lmipro/constants/buy-type.ts","webpack:///../src/products/lmipro/constants/referrers.ts","webpack:///../src/products/lmipro/services/index.ts","webpack:///../src/products/lmipro/state/buy-form/actions.ts","webpack:///../src/products/lmipro/state/checkout/actions.ts","webpack:///../src/products/lmipro/state/content/actions.ts","webpack:///../src/products/lmipro/state/selectors.ts","webpack:///../src/products/lmipro/state/tracking/actions.ts","webpack:///../src/products/lmipro/state/user/actions.ts","webpack:///../src/products/lmipro/utils/calculate-prorated-amount.ts","webpack:///../src/products/lmipro/utils/calculate-volume-discount.ts","webpack:///../src/products/lmipro/utils/get-current-addons.ts","webpack:///../src/products/lmipro/utils/get-current-plan.ts","webpack:///../src/products/lmipro/utils/get-item-values.ts","webpack:///../src/products/lmipro/utils/lmipro-tracking.ts","webpack:///../src/products/lmipro/utils/validation-schema.ts","webpack:///../src/products/lmipro/utils/coupon.ts","webpack:///../src/products/lmipro/utils/validate-address-helpers.ts","webpack:///../src/products/lmipro/utils/order-summary-helpers.ts","webpack:///../src/products/lmipro/utils/session-storage.ts","webpack:///../src/products/lmipro/utils/local-storage.ts","webpack:///../src/products/lmipro/utils/checkout-form-helpers.ts","webpack:///../src/products/lmipro/utils/get-selected-tier.ts","webpack:///../src/products/lmipro/utils/get-subscription-info.ts","webpack:///../src/products/lmipro/utils/language-helpers.ts","webpack:///../src/common/images/img-icon-credit@2x.png","webpack:///../src/common/components/Select/select.module.css","webpack:///../src/common/components/ToggleButton/toggle-button.module.css","webpack:///../src/products/gtc/connectedComponents/AccountFormInfo/account-info.module.css"],"sourcesContent":["var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconClose = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 0h24v24H0z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"#25282D\",\n strokeLinecap: \"round\",\n strokeWidth: 3,\n d: \"m6.985 6.98 10.111 10.11m0-10.11L6.985 17.09\"\n}))));\nexport { SvgIconClose as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-close.b0648fc7e5efa7acc77b26cfd06e1958.svg\";","var _defs, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconError = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 53,\n height: 46\n}, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"path\", {\n id: \"icon-error_svg__a\",\n d: \"M29.226 2.95 53.24 43.99A2 2 0 0 1 51.514 47H3.487a2 2 0 0 1-1.726-3.01L25.774 2.95a2 2 0 0 1 3.452 0\"\n}))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\",\n transform: \"translate(-1 -1)\"\n}, /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#icon-error_svg__a\",\n fill: \"#FE768D\"\n}), /*#__PURE__*/React.createElement(\"use\", {\n xlinkHref: \"#icon-error_svg__a\",\n fill: \"#EA0850\"\n}), /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#FFF\",\n transform: \"translate(26 19)\"\n}, /*#__PURE__*/React.createElement(\"rect\", {\n width: 3.696,\n height: 15.4,\n rx: 1.848\n}), /*#__PURE__*/React.createElement(\"circle\", {\n cx: 1.848,\n cy: 19.558,\n r: 1.848\n})))));\nexport { SvgIconError as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-error.7b75ea0043a7f9d93b48df4104bd9ee2.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconInfo = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#006AFF\",\n fillRule: \"evenodd\",\n d: \"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0m0 1.143C4.219 1.143 1.143 4.219 1.143 8S4.219 14.857 8 14.857 14.857 11.781 14.857 8 11.781 1.143 8 1.143m.01 4.367a.83.83 0 1 1 .001 0zm-1.419 4.84.024-.167.397-2.247h-.686a.83.83 0 1 1 0-1.663H8c.459 0 .831.373.831.832l-.573 3.338c-.032.22.114.448.335.487a.4.4 0 0 0 .25-.044q.042-.023.076-.045a.5.5 0 0 0 .083-.083l.013-.021a.5.5 0 0 0 .05-.093.412.412 0 0 1 .805.178c-.123.697-.956 1.133-1.86.974-.692-.122-1.223-.56-1.379-1.07a1.018 1.018 0 0 1-.04-.377z\"\n})));\nexport { SvgIconInfo as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-info.002bc19318dd29d6320a9d15c9806f3a.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconModifyOn = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C2A29\",\n d: \"m13.926.868 1.625 1.534c.567.535.597 1.385.09 1.953l-.09.092-10.4 9.822a2.34 2.34 0 0 1-1.1.578l-3.11.69c-.412.09-.824-.15-.92-.54a.7.7 0 0 1 0-.33l.73-2.938a2.14 2.14 0 0 1 .611-1.038L11.76.868a1.596 1.596 0 0 1 2.166 0m-3.389 3.2-8.092 7.645a.7.7 0 0 0-.204.346l-.448 1.803 1.91-.423a.8.8 0 0 0 .366-.193l8.093-7.644zm2.306-2.177L11.62 3.045l1.625 1.534 1.223-1.154z\"\n})));\nexport { SvgIconModifyOn as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-modify-on.52cb5741df8f820d17a9cd83ee18c8c9.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconPwHide2X = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 20\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2c2a29\",\n d: \"M3.56 1 20.5 17.94A.75.75 0 0 1 19.44 19l-2.335-2.333A12.574 12.574 0 0 1 .42 10.066L.194 9.5l.227-.565a12.6 12.6 0 0 1 3.895-5.06L2.5 2.062A.75.75 0 0 1 2.5 1V1a.75.75 0 0 1 1.06 0m1.826 3.946A11.1 11.1 0 0 0 1.81 9.5a11.074 11.074 0 0 0 14.147 6.019l-1.606-1.606a5.002 5.002 0 0 1-6.763-6.766zM12 1.25c5.102 0 9.629 3.073 11.58 7.685l.226.565-.227.565a12.6 12.6 0 0 1-3.894 5.058l-1.072-1.069a11.1 11.1 0 0 0 3.414-4.19l.163-.364-.121-.274A11.073 11.073 0 0 0 8.042 3.482L6.894 2.334A12.5 12.5 0 0 1 12 1.25M9.114 8.674Q9.002 9.07 9 9.5c0 1.66 1.34 3 3 3q.43-.002.825-.114zM12 4.5a5.002 5.002 0 0 1 4.413 7.352l-1.527-1.528q.113-.394.114-.824c0-1.66-1.34-3-3-3q-.43.002-.824.114L9.648 5.087A5 5 0 0 1 12 4.5\"\n})));\nexport { SvgIconPwHide2X as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-pw-hide@2x.55b87b7a8fe396468118eeefb10174eb.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconPwShow2X = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 20\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2c2a29\",\n d: \"M12 1.25c5.208 0 9.817 3.202 11.698 7.975l.108.275-.227.565A12.57 12.57 0 0 1 12 17.75 12.575 12.575 0 0 1 .302 9.775L.194 9.5l.227-.565A12.57 12.57 0 0 1 12 1.25m0 1.5A11.07 11.07 0 0 0 1.81 9.5 11.07 11.07 0 0 0 12 16.25c4.485 0 8.467-2.698 10.19-6.75l-.121-.274A11.07 11.07 0 0 0 12 2.75m0 1.75c2.76 0 5 2.24 5 5s-2.24 5-5 5-5-2.24-5-5 2.24-5 5-5m0 2c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3\"\n})));\nexport { SvgIconPwShow2X as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-pw-show@2x.211970e1506b48af35b4273258c93334.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconSecure = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 23,\n height: 23\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#01A96E\",\n fillRule: \"evenodd\",\n d: \"M11.347 0 22.44 4.843q-.007.66-.016.98Q22.087 19 11.44 23 1.148 19 .487 5.946.469 5.584.44 4.843zm.153 6a2.5 2.5 0 0 0-1.196 4.696l-.934 5.263h4.26l-.934-5.263A2.5 2.5 0 0 0 11.5 6\"\n})));\nexport { SvgIconSecure as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-secure.f65f56d94cfe9f5a3f4a9b2b539b1b71.svg\";","import React, { Suspense, lazy, FunctionComponent } from 'react'\r\nimport { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'\r\nimport { PLATFORM, PRODUCT_PATH } from '@common/constants'\r\nimport { LoadingSpinner } from '@common/components'\r\n\r\nconst isProduction = process.env.ENVIRONMENT === PLATFORM.PROD\r\n\r\n// products\r\nconst Connect = lazy(() => import('@gtc/App'))\r\nconst Resolve = lazy(() => import('@gtresolve/App'))\r\nconst LmiPro = lazy(() => import('@lmipro/App'))\r\nconst LmiCentral = lazy(() => import('@lmicentral/App'))\r\nconst RootView = lazy(() => import('@common/views/RootView'))\r\nconst SetWhoIs = lazy(() => import('@common/views/SetWhoIs'))\r\nconst DevToolsCastleToken = lazy(() => import('@common/views/DevToolsCastleToken'))\r\nconst BuyProductRoutes = lazy(() => import('@buy/ProductRoutes'))\r\n\r\n/**\r\n * This component is responsible for deciding which product the user is trying to access\r\n * each route represents a specific product. Products may have multiple flows within them (buy, trial, upgrade etc)\r\n */\r\nexport const AppRoutes: FunctionComponent = () => {\r\n return (\r\n }>\r\n \r\n \r\n {/* main product routes */}\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n {!isProduction && } />}\r\n\r\n {/* if path not recognized, redirect to root path */}\r\n } />\r\n\r\n {/* root path */}\r\n } />\r\n \r\n \r\n \r\n )\r\n}\r\n","import { FatalErrorState } from './state'\r\nimport { FatalErrorActionTypes } from './actions'\r\nimport type { FatalErrorActions } from './actions'\r\n\r\nexport const initialFatalErrorState: FatalErrorState = {\r\n isFatalError: false,\r\n fatalErrorMessage: '',\r\n fatalErrorBlocker: false,\r\n fatalErrorType: undefined,\r\n}\r\n\r\nexport const fatalErrorReducer = (\r\n previousState: FatalErrorState | undefined,\r\n action: FatalErrorActions\r\n): FatalErrorState => {\r\n const state = previousState || initialFatalErrorState\r\n switch (action.type) {\r\n case FatalErrorActionTypes.SET_FATAL_ERROR: {\r\n return {\r\n isFatalError: action.payload.hasError,\r\n fatalErrorMessage: action.payload.message?.fatalErrorMessage,\r\n fatalErrorBlocker: !!action.payload.blocker,\r\n fatalErrorType: action.payload.message?.fatalErrorType,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { ModalState } from './state'\r\nimport { ModalActionTypes } from './actions'\r\nimport type { ModalActions } from './actions'\r\n\r\nexport const initialModalState: ModalState = {\r\n isModalClosable: true,\r\n isModalOpen: false,\r\n errorMessage: 'ErrorGenericMessage',\r\n}\r\n\r\nexport const modalReducer = (previousState: ModalState | undefined, action: ModalActions): ModalState => {\r\n const state = previousState || initialModalState\r\n switch (action.type) {\r\n case ModalActionTypes.SET_MODAL_OPEN: {\r\n return {\r\n ...state,\r\n isModalOpen: action.payload.isModalOpen,\r\n }\r\n }\r\n case ModalActionTypes.SET_ERROR_MODAL: {\r\n return {\r\n ...state,\r\n isModalOpen: true,\r\n errorMessage: action.payload.errorMessage,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { FlexState } from './state'\r\nimport { FlexActionTypes } from './actions'\r\nimport type { FlexActions } from './actions'\r\n\r\nexport const initialFlexState: FlexState = {\r\n keyInfo: {\r\n flexKey: {\r\n keyId: '',\r\n mid: '',\r\n },\r\n scaToken: {\r\n isScaEnabledForMid: false,\r\n referenceId: '',\r\n tokenString: '',\r\n },\r\n },\r\n isCardValid: false,\r\n isCvvValid: false,\r\n userInteractedWithFlexField: false,\r\n userInteractedWithFlexFieldCvv: false,\r\n error: '',\r\n token: undefined,\r\n mask: '',\r\n cardType: '',\r\n microformCreated: false,\r\n fingerprint: '',\r\n cardinalChallengeCompleteJwt: '',\r\n isCardinalSetupComplete: false,\r\n}\r\n\r\nexport const flexReducer = (previousState: FlexState | undefined, action: FlexActions): FlexState => {\r\n const state = previousState || initialFlexState\r\n switch (action.type) {\r\n case FlexActionTypes.SET_KEY_INFO:\r\n return {\r\n ...state,\r\n keyInfo: action.payload.key,\r\n }\r\n case FlexActionTypes.SET_FINGERPRINT:\r\n return {\r\n ...state,\r\n fingerprint: action.payload.fingerprint,\r\n }\r\n case FlexActionTypes.SET_CARD_VALID:\r\n return {\r\n ...state,\r\n isCardValid: action.payload.valid,\r\n }\r\n case FlexActionTypes.SET_CVV_VALID:\r\n return {\r\n ...state,\r\n isCvvValid: action.payload.valid,\r\n }\r\n case FlexActionTypes.SET_USER_INTERACTED_WITH_FIELD:\r\n return {\r\n ...state,\r\n userInteractedWithFlexField: action.payload.interacted,\r\n }\r\n case FlexActionTypes.SET_USER_INTERACTED_WITH_FIELD_CVV:\r\n return {\r\n ...state,\r\n userInteractedWithFlexFieldCvv: action.payload.interacted,\r\n }\r\n case FlexActionTypes.SET_ERROR:\r\n return {\r\n ...state,\r\n error: action.payload.error,\r\n }\r\n case FlexActionTypes.SET_TOKEN:\r\n return { ...state, token: action.payload.token }\r\n\r\n case FlexActionTypes.SET_MICROFORM_CREATED:\r\n return { ...state, microformCreated: action.payload.isCreated }\r\n\r\n case FlexActionTypes.RESET_FLEX_STATE:\r\n return initialFlexState\r\n\r\n case FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT:\r\n return { ...state, cardinalChallengeCompleteJwt: action.payload.jwt }\r\n\r\n case FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE:\r\n return { ...state, isCardinalSetupComplete: true }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { COUNTRIES, CURRENCY, LANGUAGE, LOCALES } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\n\r\nexport const locationInitialData: LocationState = {\r\n countries: [],\r\n states: [],\r\n validAddress: false,\r\n correctedAddress: {\r\n addressLine1: '',\r\n city: '',\r\n country: '',\r\n phoneNumber: '',\r\n postalCode: '',\r\n state: '',\r\n },\r\n addressErrors: [],\r\n isLocationInfoLoaded: false,\r\n locationInfo: {\r\n country: COUNTRIES.US,\r\n currency: CURRENCY.USD,\r\n locale: LOCALES.EN_US,\r\n language: LANGUAGE.EN,\r\n },\r\n isCountriesLoaded: false,\r\n isUserCountryAllowed: true,\r\n isValidatingAddress: false,\r\n}\r\n","import { locationInitialData } from '@common/data'\r\nimport { LocationState } from './state'\r\nimport { LocationActionTypes } from './actions'\r\nimport type { LocationActions } from './actions'\r\n\r\nexport const initialLocationState: LocationState = {\r\n ...locationInitialData,\r\n}\r\n\r\nexport const locationReducer = (previousState: LocationState | undefined, action: LocationActions): LocationState => {\r\n const state = previousState || initialLocationState\r\n switch (action.type) {\r\n case LocationActionTypes.SET_COUNTRIES: {\r\n return { ...state, countries: action.payload.countries }\r\n }\r\n case LocationActionTypes.SET_STATES: {\r\n return { ...state, states: action.payload.states }\r\n }\r\n case LocationActionTypes.SET_VALID_ADDRESS: {\r\n return {\r\n ...state,\r\n validAddress: action.payload.isValid,\r\n }\r\n }\r\n case LocationActionTypes.SET_CORRECTED_ADDRESS: {\r\n return {\r\n ...state,\r\n correctedAddress: action.payload.address,\r\n }\r\n }\r\n case LocationActionTypes.SET_IS_VALIDADING_ADDRESS: {\r\n return {\r\n ...state,\r\n isValidatingAddress: action.payload.isValidatingAddress,\r\n }\r\n }\r\n case LocationActionTypes.SET_ADDRESS_ERRORS: {\r\n return {\r\n ...state,\r\n addressErrors: action.payload.addressErrors,\r\n }\r\n }\r\n case LocationActionTypes.SET_LOCATION_INFO: {\r\n return {\r\n ...state,\r\n locationInfo: action.payload.locationInfo,\r\n }\r\n }\r\n case LocationActionTypes.SET_IS_LOCATION_INFO_LOADED: {\r\n return {\r\n ...state,\r\n isLocationInfoLoaded: action.payload.isLocationInfoLoaded,\r\n }\r\n }\r\n case LocationActionTypes.SET_FETCHED_COUNTRIES: {\r\n return {\r\n ...state,\r\n isCountriesLoaded: action.payload.isCountriesLoaded,\r\n }\r\n }\r\n case LocationActionTypes.SET_IS_USER_COUNTRY_ALLOWED: {\r\n return {\r\n ...state,\r\n isUserCountryAllowed: action.payload.isUserCountryAllowed,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { MarketingActions, MarketingActionsTypes } from './actions'\r\nimport { MarketingState } from './state'\r\n\r\nexport const initialMarketingState: MarketingState = {\r\n displayOptOut: false,\r\n isUserOptOut: false,\r\n}\r\n\r\nexport const marketingReducer = (\r\n previousState: MarketingState | undefined,\r\n action: MarketingActions\r\n): MarketingState => {\r\n const state = previousState || initialMarketingState\r\n switch (action.type) {\r\n case MarketingActionsTypes.SET_DISPLAY_OPTOUT: {\r\n return { ...state, displayOptOut: action.payload.displayOutOut }\r\n }\r\n case MarketingActionsTypes.SET_IS_USER_OPTOUT: {\r\n return { ...state, isUserOptOut: action.payload.isUserOutOut }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { EmailVerificationType } from '@common/services'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\nimport { BillingDetailedSubscriptionPlan } from '../billing/state'\r\n\r\nexport enum AccountActionTypes {\r\n SET_EXISTING_ACCOUNT_SUBSCRIPTIONS = '[account-actions] set-existing-account-subscriptions',\r\n UPDATE_ACCOUNT_EMAIL_VERIFICATION = '[account-actions] update-email-verification',\r\n SET_LOADING_VERIFY_USER = '[account-actions] set-loading-verify-user',\r\n}\r\n\r\nexport const accountActions = {\r\n setAccountSubscriptions: (subscriptions: BillingDetailedSubscriptionPlan[]) =>\r\n createAction(AccountActionTypes.SET_EXISTING_ACCOUNT_SUBSCRIPTIONS, { subscriptions }),\r\n updateAccountEmailVerification: (emailVerificationInfo: EmailVerificationType) =>\r\n createAction(AccountActionTypes.UPDATE_ACCOUNT_EMAIL_VERIFICATION, { emailVerificationInfo }),\r\n // TODO: Migrate gtc/userActions and gtResolve/userActions into accountActions\r\n}\r\n\r\nexport type AccountActions = ActionUnion\r\n","import { AccountState } from './state'\r\nimport { AccountActionTypes } from './actions'\r\nimport type { AccountActions } from './actions'\r\n\r\nexport const initialAccountState: AccountState = {\r\n accountSubscriptions: [],\r\n}\r\n\r\nexport const accountReducer = (previousState: AccountState | undefined, action: AccountActions): AccountState => {\r\n const state = previousState || initialAccountState\r\n switch (action.type) {\r\n case AccountActionTypes.SET_EXISTING_ACCOUNT_SUBSCRIPTIONS: {\r\n const { subscriptions } = action.payload\r\n return {\r\n ...state,\r\n accountSubscriptions: subscriptions,\r\n }\r\n }\r\n default:\r\n return state\r\n // TODO: Migrate gtc/userReducer and gtResolve/userReducer into accountReducer\r\n }\r\n}\r\n","import { ContentState } from './state'\r\nimport { ContentActionTypes } from './actions'\r\nimport type { ContentActions } from './actions'\r\n\r\nexport const initialContentState: ContentState = {\r\n language: '',\r\n}\r\n\r\nexport const contentReducer = (previousState: ContentState | undefined, action: ContentActions): ContentState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case ContentActionTypes.SET_LANGUAGE: {\r\n const { language } = action.payload\r\n return {\r\n ...state,\r\n language,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { CheckoutState } from './state'\r\nimport { CheckoutActionTypes } from './actions'\r\nimport type { CheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: CheckoutState = {\r\n inlineErrors: {},\r\n}\r\n\r\nexport const checkoutReducer = (previousState: CheckoutState | undefined, action: CheckoutActions): CheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case CheckoutActionTypes.SET_CHECKOUT_INLINE_ERROR: {\r\n const { error } = action.payload\r\n return {\r\n ...state,\r\n inlineErrors: {\r\n ...state.inlineErrors,\r\n [error]: error,\r\n },\r\n }\r\n }\r\n case CheckoutActionTypes.REMOVE_CHECKOUT_INLINE_ERROR: {\r\n const { error } = action.payload\r\n /* eslint-disable @typescript-eslint/no-unused-vars */\r\n const { [error]: value, ...rest } = state.inlineErrors\r\n return {\r\n ...state,\r\n inlineErrors: {\r\n ...rest,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { combineReducers, CombinedState } from 'redux'\r\nimport { fatalErrorReducer, initialFatalErrorState } from '@common/state/fatal-error/reducer'\r\nimport { modalReducer, initialModalState } from '@common/state/modal/reducer'\r\nimport { flexReducer, initialFlexState } from '@common/state/flex/reducer'\r\nimport { locationReducer, initialLocationState } from '@common/state/location/reducer'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { FatalErrorState } from '@common/state/fatal-error/state'\r\nimport { ModalState } from '@common/state/modal/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { initialMarketingState, marketingReducer } from '@common/state/marketing/reducer'\r\nimport { MarketingState } from '@common/state/marketing/state'\r\nimport { accountReducer, initialAccountState } from '@common/state/account/reducer'\r\nimport { contentReducer, initialContentState } from '@common/state/content/reducer'\r\nimport { ContentState } from '@common/state/content/state'\r\nimport { checkoutReducer, initialCheckoutState } from '@common/state/checkout/reducer'\r\nimport { CheckoutState } from '@common/state/checkout/state'\r\n\r\nexport const commonAppReducer = combineReducers({\r\n fatalError: fatalErrorReducer,\r\n modal: modalReducer,\r\n flex: flexReducer,\r\n location: locationReducer,\r\n marketing: marketingReducer,\r\n account: accountReducer,\r\n content: contentReducer,\r\n checkout: checkoutReducer,\r\n})\r\n\r\nexport const commonCombinedState = {\r\n fatalError: initialFatalErrorState,\r\n modal: initialModalState,\r\n flex: initialFlexState,\r\n location: initialLocationState,\r\n marketing: initialMarketingState,\r\n account: initialAccountState,\r\n content: initialContentState,\r\n checkout: initialCheckoutState,\r\n}\r\n\r\nexport type CommonAppState = ReturnType\r\n\r\nexport type BaseAppState = {\r\n common: CommonAppState\r\n}\r\n\r\nexport type CommonAppCombinedState = CombinedState<{\r\n fatalError: FatalErrorState\r\n modal: ModalState\r\n flex: FlexState\r\n location: LocationState\r\n marketing: MarketingState\r\n content: ContentState\r\n checkout: CheckoutState\r\n}>\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { fatalErrorActions, FatalErrorActionTypes } from '@common/state/fatal-error/actions'\r\nimport { FatalErrorData } from '@common/state/tracking/state'\r\nimport { trackFatalError } from '@common/utils'\r\n\r\nexport function* trackErrorSaga(action: ReturnType) {\r\n const { message } = action.payload\r\n if (message && message.trackErrorMessage) {\r\n const errorData: FatalErrorData = {\r\n message: message.trackErrorMessage,\r\n path: `${window.location.hostname}${window.location.pathname}`,\r\n }\r\n yield call(trackFatalError, errorData)\r\n }\r\n}\r\n\r\nfunction* initializeTrackErrorSaga() {\r\n yield takeEvery(FatalErrorActionTypes.SET_FATAL_ERROR, trackErrorSaga)\r\n}\r\n\r\nexport default initializeTrackErrorSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport commonServices from '@common/services'\r\nimport { getGUID } from '@common/utils/getGUID'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* flexFormSaga(action: ReturnType) {\r\n const { data, iterator } = action.payload\r\n try {\r\n const response: GenericResponse = yield call(commonServices.getFlexTokenCall, data)\r\n if (response && response.data) {\r\n // According to the documentation, we should generate a new unique id for the cybersource fingerprint on every page load\r\n // https://confluence.ops.expertcity.com/x/L4UVIg\r\n // https://confluence.ops.expertcity.com/x/7um3Cw\r\n // https://confluence.ops.expertcity.com/x/cxthC\r\n const guid = getGUID()\r\n yield put(flexActions.setFingerPrint(guid))\r\n yield put(flexActions.setKeyInfo(response.data))\r\n }\r\n } catch (e) {\r\n if (iterator < 3) {\r\n yield put(flexActions.getFlexToken(data, iterator + 1))\r\n } else {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'could not get flex token' }))\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeFlexFormSaga() {\r\n yield takeEvery(FlexActionTypes.GET_FLEX_TOKEN, flexFormSaga)\r\n}\r\n\r\nexport default initializeFlexFormSaga\r\n","import { takeEvery, put, call, select } from 'redux-saga/effects'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { Token, Microform, Options, FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\nimport { getFlexMicroform } from '@common/utils'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nfunction tokenGenerator(microform: Microform, options: Options) {\r\n return new Promise((resolve, reject) => {\r\n microform.createToken(options, (err: unknown, token: Token) => {\r\n if (err) {\r\n reject(new Error('cannot create flex token'))\r\n }\r\n resolve(token)\r\n })\r\n })\r\n}\r\n\r\nexport function* createTokenSaga(action: ReturnType) {\r\n const flex: FlexState = yield select(getFlexState)\r\n const { date } = action.payload\r\n try {\r\n if (date && flex.microformCreated) {\r\n const flexMicroformInstance: Microform = yield call(getFlexMicroform)\r\n const options = {\r\n expirationMonth: date.substr(0, 2),\r\n expirationYear: `20${date.substr(3, 5)}`,\r\n }\r\n const tokenBase64: string = yield call(tokenGenerator, flexMicroformInstance, options)\r\n if (tokenBase64) {\r\n const tokenString = atob(tokenBase64.split('.')[1]) // decode base64 string\r\n const token: Token = JSON.parse(tokenString)\r\n if (token) {\r\n yield put(flexActions.setToken(token))\r\n return tokenBase64\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create flex token' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateTokenSaga() {\r\n yield takeEvery(FlexActionTypes.CREATE_TOKEN, createTokenSaga)\r\n}\r\n\r\nexport default initializeCreateTokenSaga\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from './state'\r\n\r\nexport enum TrackingActionTypes {\r\n TRACK = '[tracking] generic-event',\r\n}\r\n\r\nexport const trackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) =>\r\n createAction(TrackingActionTypes.TRACK, { trackingInfo }, { component }),\r\n}\r\n\r\nexport type TrackingActions = ActionUnion\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { trackingActions, TrackingActionTypes } from '@common/state/tracking/actions'\r\nimport { trackEvent } from '@common/utils'\r\n\r\nexport function* trackingSaga(action: ReturnType) {\r\n const { trackingInfo } = action.payload\r\n const trackData = trackingInfo.eventData ? trackingInfo.eventData : {}\r\n yield call(trackEvent, { event: trackingInfo.event, eventData: trackData })\r\n}\r\n\r\nfunction* initializeTrackingSaga() {\r\n yield takeEvery(TrackingActionTypes.TRACK, trackingSaga)\r\n}\r\n\r\nexport default initializeTrackingSaga\r\n","import { call, takeLeading, put } from 'redux-saga/effects'\r\nimport commonservices, { getExternalLocationInfo } from '@common/services'\r\nimport { locationActions, LocationActionTypes } from '@common/state/location/actions'\r\nimport { LOCALES, CURRENCY } from '@common/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { getCountryFromCookie } from '@common/utils/cookie-utils'\r\n\r\nexport function* loadLocationInfo(action: ReturnType) {\r\n try {\r\n const { isExternal } = action.payload\r\n const locationInfoResponse: GenericResponse = isExternal\r\n ? yield call(getExternalLocationInfo)\r\n : yield call(commonservices.getLocationInfo)\r\n if (locationInfoResponse && locationInfoResponse.data) {\r\n const storedCountry = getCountryFromCookie()\r\n const { country, currencyRestricitons, language } = locationInfoResponse.data\r\n const eligibleCurrency = Object.values(CURRENCY).includes(currencyRestricitons[0])\r\n // Call `getLocationInfo` call if the cookie stored country is not as same as the country got from the initial `getLocationInfo` call\r\n if (storedCountry && storedCountry !== country) {\r\n locationActions.getLocationInfo()\r\n } else {\r\n yield put(\r\n locationActions.setLocationInfo({\r\n country,\r\n currency: eligibleCurrency ? currencyRestricitons[0] : currencyRestricitons[1],\r\n locale: `${language}-${country}` as LOCALES,\r\n language,\r\n })\r\n )\r\n yield put(locationActions.setIsLocationInfoLoaded(true))\r\n }\r\n }\r\n } catch (e: any) {\r\n console.error(e.message)\r\n }\r\n}\r\n\r\nfunction* initializeLoadLocationInfoSaga() {\r\n yield takeLeading(LocationActionTypes.GET_LOCATION_INFO, loadLocationInfo)\r\n}\r\n\r\nexport default initializeLoadLocationInfoSaga\r\n","import { call, put, delay, takeLatest } from 'redux-saga/effects'\r\nimport { AddressDataType } from '@common/state/location/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport commonServices from '@common/services'\r\nimport { locationActions, LocationActionTypes } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* validateAddressSaga(action: ReturnType) {\r\n const { values } = action.payload\r\n let isAddressValid = true\r\n\r\n const addressObj: AddressDataType = {\r\n firstName: values.FirstName,\r\n lastName: values.LastName,\r\n email: values.Email,\r\n address: {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n postalCode: values.ZipCode.substr(0, 10),\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n phoneNumber: values.ContactPhone,\r\n },\r\n exportCompliance: true,\r\n validateAddress: true,\r\n }\r\n\r\n try {\r\n yield put(locationActions.setIsValidatingAddress(true))\r\n yield delay(1000)\r\n const validateResponse: GenericResponse = yield call(commonServices.getValidAddress, addressObj)\r\n // only take action if and only if api response returns 'INVALID' or 'EXPORT_FAILED'\r\n if (validateResponse && validateResponse.data) {\r\n switch (validateResponse.data.status) {\r\n case 'VALID':\r\n case 'INVALID': // WAE1-1798: Treat INVALID address as if it were VALID\r\n yield put(locationActions.setValidAddress(true))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n break\r\n case 'VALID_UPDATED':\r\n yield put(locationActions.setValidAddress(true))\r\n yield put(locationActions.setCorrectedAddress(validateResponse.data.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n break\r\n case 'EXPORT_FAILED':\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(validateResponse.data.errors))\r\n isAddressValid = false\r\n break\r\n default:\r\n yield put(locationActions.setValidAddress(true))\r\n break\r\n }\r\n }\r\n } catch (e) {\r\n // fail gracefully if any server issues arise\r\n yield put(locationActions.setValidAddress(true))\r\n yield put(fatalErrorActions.setFatalError(false, { trackErrorMessage: 'validate address failed' }))\r\n } finally {\r\n yield put(locationActions.setIsValidatingAddress(false))\r\n }\r\n\r\n return isAddressValid\r\n}\r\n\r\nfunction* initializeValidateAddressSaga() {\r\n yield takeLatest(LocationActionTypes.VALIDATE_ADDRESS, validateAddressSaga)\r\n}\r\n\r\nexport default initializeValidateAddressSaga\r\n","import { call, put, takeLeading, select } from 'redux-saga/effects'\r\nimport { locationActions, LocationActionTypes } from '@common/state/location/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { Country, LocationState } from '@common/state/location/state'\r\nimport commonServices, { SiteParamType } from '@common/services'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { COUNTRIES, CURRENCY, LANGUAGE, LOCALES, RESTRICTED_COUNTRIES } from '@common/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getCountriesSaga(action: ReturnType) {\r\n try {\r\n yield put(locationActions.setFetchedCountries(false))\r\n const params: SiteParamType = {\r\n productFamily: action.payload.productFamily,\r\n sc_lang: 'en',\r\n }\r\n const response: GenericResponse = yield call(commonServices.getCountries, params)\r\n if (response && response.data) {\r\n let countriesData: Country[] = response.data.countries\r\n\r\n // Get USA country data\r\n const usaCountryData = countriesData.find((country) => country.abbreviation === COUNTRIES.US)\r\n\r\n // Need to show the USA always on the top, so need to separate it and push it after sortng the coutries\r\n // Also need to remove restricted countries\r\n countriesData = countriesData.filter(\r\n (country) =>\r\n !Object.values(RESTRICTED_COUNTRIES).includes(country.abbreviation as RESTRICTED_COUNTRIES) &&\r\n country.abbreviation !== COUNTRIES.US\r\n )\r\n\r\n // Sort countries based off names\r\n const sortedCountryData: Country[] = countriesData.sort((a, b) => (a.name > b.name && 1) || -1)\r\n if (usaCountryData) {\r\n sortedCountryData.unshift(usaCountryData)\r\n }\r\n\r\n yield put(locationActions.setCountries(sortedCountryData))\r\n yield put(locationActions.setFetchedCountries(true))\r\n const locationInfoData: LocationState = yield select(getLocationState)\r\n const isLocationEligible = countriesData.find(\r\n (eligibleCountry) => locationInfoData.locationInfo.country === eligibleCountry.abbreviation\r\n )\r\n if (!isLocationEligible) {\r\n yield put(\r\n locationActions.setLocationInfo({\r\n country: COUNTRIES.US,\r\n currency: CURRENCY.USD,\r\n locale: LOCALES.EN_US,\r\n language: LANGUAGE.EN,\r\n })\r\n )\r\n }\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'country response failure' }))\r\n }\r\n}\r\n\r\nfunction* initializeGetCountriesSaga() {\r\n yield takeLeading(LocationActionTypes.GET_COUNTRIES, getCountriesSaga)\r\n}\r\n\r\nexport default initializeGetCountriesSaga\r\n","import { takeEvery, put, call } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { createFlexMicroform, setFlexMicroform } from '@common/utils'\r\nimport { Microform } from '@common/state/flex/state'\r\n\r\nexport function* createFlexMicroformSaga(action: ReturnType) {\r\n const { keyInfo } = action.payload\r\n\r\n try {\r\n const microformInstance: Microform = yield call(createFlexMicroform, keyInfo)\r\n\r\n if (microformInstance) {\r\n yield call(setFlexMicroform, microformInstance)\r\n yield put(flexActions.setMicroformCreated(true))\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'could not create flex microform' }))\r\n }\r\n}\r\n\r\nfunction* initializeCreateFlexMicroformSaga() {\r\n yield takeEvery(FlexActionTypes.CREATE_MICROFORM, createFlexMicroformSaga)\r\n}\r\n\r\nexport default initializeCreateFlexMicroformSaga\r\n","import { takeEvery, put, call } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { setFlexMicroform } from '@common/utils'\r\n\r\nexport function* clearFlexMicroformSaga() {\r\n try {\r\n yield call(setFlexMicroform, null)\r\n yield put(flexActions.resetFlexState())\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'could not clear flex microform' }))\r\n }\r\n}\r\n\r\nfunction* initializeClearFlexMicroformSaga() {\r\n yield takeEvery(FlexActionTypes.CLEAR_FLEX_MICROFORM_INSTANCE, clearFlexMicroformSaga)\r\n}\r\n\r\nexport default initializeClearFlexMicroformSaga\r\n","import Cookies from 'js-cookie'\r\nimport { MarketoPayload, SyncariPayload } from '@common/state/marketing/state'\r\n\r\n// Replace empty string and undefined with null\r\nexport function sanitizePayload>(payload: T): T {\r\n return Object.entries(payload).reduce((acc, [key, value]) => {\r\n acc[key as keyof T] = value === '' || value === undefined ? null : value\r\n return acc\r\n }, {} as T)\r\n}\r\n\r\nfunction isLMIProduct(payload: any) {\r\n return (\r\n payload.product &&\r\n (payload.product.toLowerCase() === 'pro' ||\r\n payload.product.toLowerCase() === 'logmeinpro' ||\r\n payload.product.toLowerCase() === 'central' ||\r\n payload.product.toLowerCase() === 'logmeincentral')\r\n )\r\n}\r\n\r\nexport function fetchCampaignOverrideCookie() {\r\n return (\r\n Cookies.get('__lt_campaigniD') ||\r\n Cookies.get('__lt_campaignId') ||\r\n Cookies.get('__lt_campaignID') ||\r\n Cookies.get('__lt_campaignid')\r\n )\r\n}\r\n\r\nexport function buildSyncariPayload(payload: any) {\r\n const syncariPayload: SyncariPayload = {\r\n userKey: payload.userKey,\r\n accountKey: payload.accountKey,\r\n email: payload.email,\r\n firstName: payload.firstName,\r\n lastName: payload.lastName,\r\n planKey: payload.planKey,\r\n productTier: payload.productTier,\r\n product: payload.product,\r\n mkto_trk: payload.mkto_trk,\r\n\r\n UnsubscribedTemp: payload.optin === '0' ? 'true' : 'false',\r\n Temp_Country__c: payload.country,\r\n Language__c: payload.language,\r\n Most_Recent_Campaign__c: payload.campaignID,\r\n recentChopId: payload.chop_id,\r\n recentgclid: payload.gclid,\r\n utm_medium: payload.utmmedium,\r\n utm_source: payload.utmsource,\r\n utm_campaign: payload.utmcampaign,\r\n personSourceURL: payload.sourceUrl,\r\n contentStage: payload.contentStage || '',\r\n userreferrer: payload.userreferrer,\r\n form_Id: payload.form_Id || 'purchaseForm',\r\n }\r\n\r\n if (isLMIProduct(payload)) {\r\n syncariPayload.product = 'LMI'\r\n }\r\n\r\n return syncariPayload\r\n}\r\n\r\nexport function preprocessMarketoPayload(payload: MarketoPayload) {\r\n const prepPayload: { [key: string]: any } = { ...payload }\r\n\r\n // Extract and add Marketo attributes if they exist\r\n const marketoAttributesFieldName = 'lmi_ma'\r\n if (prepPayload[marketoAttributesFieldName]) {\r\n const marketoAttributeFields = prepPayload[marketoAttributesFieldName].split('|')\r\n\r\n marketoAttributeFields.forEach((field: any) => {\r\n const [key, value] = field.split('=')\r\n if (key && value) {\r\n const decodedKey = decodeURIComponent(key)\r\n const decodedValue = decodeURIComponent(value)\r\n if (decodedKey === 'campaignID' && prepPayload.campaignID) {\r\n delete prepPayload.campaignID\r\n }\r\n prepPayload[decodedKey] = decodedValue\r\n }\r\n })\r\n delete prepPayload[marketoAttributesFieldName]\r\n }\r\n\r\n // Set blank values for missing optional fields\r\n const blankFieldsIfExcluded = ['userreferrer', 'campaignsource', 'utmsource', 'utmmedium', 'utmcampaign']\r\n blankFieldsIfExcluded.forEach((field) => {\r\n if (!prepPayload[field]) prepPayload[field] = ''\r\n })\r\n\r\n const overrideCampaignID = fetchCampaignOverrideCookie()\r\n if (overrideCampaignID) {\r\n prepPayload.campaignID = overrideCampaignID\r\n }\r\n\r\n return prepPayload\r\n}\r\n","import { takeEvery, call, select } from 'redux-saga/effects'\r\nimport Cookies from 'js-cookie'\r\nimport { postSyncari } from '@common/services'\r\nimport { MarketoPayload } from '@common/state/marketing/state'\r\nimport { MARKETO_PLAN_TYPE, COOKIE_NAMES, LANGUAGE_CODES } from '@common/constants'\r\nimport { buildSyncariPayload, preprocessMarketoPayload } from '@common/utils/aws-utils'\r\nimport { marketingActions, MarketingActionsTypes } from '@common/state/marketing/actions'\r\nimport { getLocationState, getMarketingState } from '@common/state/selectors'\r\nimport { LocationState } from '@common/state/location/state'\r\n\r\nexport function* postToMarketoSaga(action: ReturnType) {\r\n try {\r\n // Determine whether we are sending to the AWS API (applies to legacy flows)\r\n // or just saving to sessionStorage for use after returning from OnePay (applies to unified checkout OnePay flow)\r\n const { saveToLocalStorage } = action.payload\r\n\r\n // eslint-disable-next-line camelcase\r\n const {\r\n phone,\r\n address,\r\n city,\r\n state: userState,\r\n zipcode,\r\n userKey,\r\n accountKey,\r\n ...rest\r\n } = action.payload.marketoUserInfo\r\n // grab is optOut value\r\n\r\n const { isUserOptOut } = yield select(getMarketingState)\r\n const {\r\n locationInfo: { country },\r\n }: LocationState = yield select(getLocationState)\r\n\r\n // grab language from URL if its valid\r\n const urlSplitForLanguage = window.location.pathname.split('/')[1]\r\n const isValidLanguageCode = Object.values(LANGUAGE_CODES).includes(urlSplitForLanguage)\r\n const siteLanguage = isValidLanguageCode ? urlSplitForLanguage : LANGUAGE_CODES.English\r\n\r\n // if no address, the user is trying\r\n const planType = zipcode ? MARKETO_PLAN_TYPE.BUY : MARKETO_PLAN_TYPE.TRIAL\r\n const payload: MarketoPayload = {\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n lmi_ma: Cookies.get(COOKIE_NAMES.LMI_MA) || '',\r\n chop_id: Cookies.get(COOKIE_NAMES.CHOP_ID) || '',\r\n gclid: Cookies.get(COOKIE_NAMES.GCL_ID) || Cookies.get(COOKIE_NAMES.GCL_ID_2) || '',\r\n country,\r\n language: siteLanguage,\r\n phone: phone || '',\r\n planType,\r\n sourceUrl: window.location.href,\r\n address: address || '',\r\n city: city || '',\r\n state: userState || '',\r\n zipcode: zipcode || '',\r\n optin: isUserOptOut ? '0' : '1',\r\n userKey,\r\n accountKey,\r\n ...rest,\r\n }\r\n\r\n const prePayload = preprocessMarketoPayload(payload)\r\n\r\n const syncariPayload = buildSyncariPayload(prePayload)\r\n\r\n if (saveToLocalStorage) {\r\n // For OnePay flow, save to sessionStorage so it can be retrieved and posted to AwS after returning from OnePay\r\n window.sessionStorage.setItem('syncariPayload', JSON.stringify(syncariPayload))\r\n } else {\r\n // For CyberSource flow, post directly to AWS\r\n yield call(postSyncari, syncariPayload)\r\n }\r\n } catch (err: any) {\r\n console.error(err.message)\r\n }\r\n}\r\n\r\n// This gets called after returning from OnePay and landing on the Confirmation page\r\n// See src/products/buy/views/Confirmation/index.tsx\r\nexport function* postSavedMarketoToAWS() {\r\n try {\r\n // Get the Marketo data from sessionStorage\r\n const syncariPayload = JSON.parse(window.sessionStorage.getItem('syncariPayload') || 'null')\r\n\r\n if (syncariPayload) {\r\n // Post it to AWS\r\n yield call(postSyncari, syncariPayload)\r\n\r\n // Remove from sessionStorage so if the user reloads the Confirmation screen, they don't get submitted again\r\n window.sessionStorage.removeItem('syncariPayload')\r\n }\r\n yield call(postSyncari, syncariPayload)\r\n } catch (err: any) {\r\n console.error(err.message)\r\n }\r\n}\r\n\r\nfunction* initializePostToMarketoSaga() {\r\n yield takeEvery(MarketingActionsTypes.POST_MARKETO, postToMarketoSaga)\r\n yield takeEvery(MarketingActionsTypes.POST_MARKETO_SESSION_DATA_TO_AWS, postSavedMarketoToAWS)\r\n}\r\n\r\nexport default initializePostToMarketoSaga\r\n","import { call, put, select, takeEvery } from 'redux-saga/effects'\r\nimport { Country, LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { locationActions, LocationActionTypes } from '@common/state/location/actions'\r\n\r\nexport function* createGetInternationalBlocker() {\r\n const { countries, locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const isUserCountryAllowed: boolean = yield call(() =>\r\n countries.some((country: Country) => country.abbreviation === locationInfo.country)\r\n )\r\n\r\n yield put(locationActions.setIsUserCountryAllowed(isUserCountryAllowed))\r\n}\r\n\r\nfunction* initializeCreateGetInternationalBlocker() {\r\n yield takeEvery(LocationActionTypes.GET_IS_USER_COUNTRY_ALLOWED, createGetInternationalBlocker)\r\n}\r\n\r\nexport default initializeCreateGetInternationalBlocker\r\n","import { call, takeEvery, select } from 'redux-saga/effects'\r\nimport { accountActions, AccountActionTypes } from '@common/state/account/actions'\r\nimport { AccountState } from '@common/state/account/state'\r\nimport { getAccountState } from '@common/state/selectors'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { updateUser } from '@common/services'\r\n\r\nexport function* updateAccountEmailVerifificationSaga(\r\n action: ReturnType\r\n) {\r\n try {\r\n const { emailCode, emailToken, accessToken } = action.payload?.emailVerificationInfo\r\n const { accountSubscriptions }: AccountState = yield select(getAccountState)\r\n\r\n // if an existing user only has non-trial subscription, user's email must be verified\r\n if (emailCode && emailToken && accessToken && !isEmpty(accountSubscriptions)) {\r\n yield call(updateUser, {\r\n emailCode,\r\n emailToken,\r\n accessToken,\r\n })\r\n }\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeUpdateAccountEmailVerificationSaga() {\r\n yield takeEvery(AccountActionTypes.UPDATE_ACCOUNT_EMAIL_VERIFICATION, updateAccountEmailVerifificationSaga)\r\n}\r\n\r\nexport default initializeUpdateAccountEmailVerificationSaga\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { contentActions, ContentActionTypes } from '@common/state/content/actions'\r\nimport { saveSessionState } from '@common/utils'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { STORAGE_CONST } from '@common/constants'\r\n\r\nfunction* setLanguageSaga(action: ReturnType) {\r\n try {\r\n const { language } = action.payload\r\n saveSessionState(STORAGE_CONST.SAVED_LANGUAGE, language)\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeSetLanguageSaga() {\r\n yield takeEvery(ContentActionTypes.SET_LANGUAGE, setLanguageSaga)\r\n}\r\n\r\nexport default initializeSetLanguageSaga\r\n","import initializeTrackErrorSaga from './error/track-error'\r\nimport initializeFlexFormSaga from './flex/get-flex-token'\r\nimport initializeCreateTokenSaga from './flex/create-flex-token'\r\nimport initializeTrackingSaga from './tracking/track-event'\r\nimport initializeLoadLocationInfoSaga from './location/location-info'\r\nimport initializeValidateAddressSaga from './location/validate-address'\r\nimport initializeGetCountriesSaga from './location/get-countries'\r\nimport initializeCreateFlexMicroformSaga from './flex/create-flex-microform'\r\nimport initializeClearFlexMicroformSaga from './flex/clear-flex-microform-state'\r\nimport initializePostToMarketoSaga from './marketing/marketo'\r\nimport initializeCreateGetInternationalBlocker from './location/international-blocker'\r\nimport initializeUpdateAccountEmailVerificationSaga from './account/update-account-email-verification'\r\nimport initializeSetLanguageSaga from './content/set-language'\r\n\r\nexport const commonSagas = {\r\n countriesSaga: initializeGetCountriesSaga,\r\n errorSaga: initializeTrackErrorSaga,\r\n flexFormSaga: initializeFlexFormSaga,\r\n createTokenSaga: initializeCreateTokenSaga,\r\n trackingSaga: initializeTrackingSaga,\r\n locationSaga: initializeLoadLocationInfoSaga,\r\n validateAddressSaga: initializeValidateAddressSaga,\r\n createFlexMicroformSaga: initializeCreateFlexMicroformSaga,\r\n clearFlexMicroformSaga: initializeClearFlexMicroformSaga,\r\n postToMarketoSaga: initializePostToMarketoSaga,\r\n internationalBlockerSaga: initializeCreateGetInternationalBlocker,\r\n updateAccountEmailVerificationSaga: initializeUpdateAccountEmailVerificationSaga,\r\n setLanguage: initializeSetLanguageSaga,\r\n}\r\nexport default commonSagas\r\n","import { COUNTRIES } from '@common/constants'\r\n\r\nimport { CHECKOUTFORM_STEPS } from '@gtc/constants'\r\nimport { ErrorContent } from '@gtc/state/checkout-form-container/state'\r\nimport { BuyFormData, BuyFormState } from '@gtc/state/buy-form/state'\r\n\r\nexport const errorContent: ErrorContent = {\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n errorInvalidCreditCardNumber: '',\r\n emailAddressAlreadyInUse: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorInvalidPostalCode: '',\r\n errorGenericMessage: '',\r\n errorInvalidAddress: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\nexport const initialData: BuyFormData = {\r\n FirstName: '',\r\n LastName: '',\r\n Email: '',\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n}\r\nexport const buyFormStateInitialData: BuyFormState = {\r\n clearEmail: false,\r\n initialData,\r\n steps: {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: { completed: false, error: false },\r\n },\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { labelContentInitialData } from '@gtc/data'\r\nimport { ContentState } from './state'\r\nimport { ContentActionTypes } from './actions'\r\nimport type { ContentActions } from './actions'\r\n\r\nexport const initialContentState: ContentState = {\r\n contentData: {\r\n CurrencyCode: CURRENCY.USD,\r\n ContentLoaded: false,\r\n Locale: 'en-US',\r\n PlanGroupId: '',\r\n DefaultCountry: '',\r\n marketoProductName: '',\r\n marketoSalesBrief: '',\r\n marketoSalesforceCampaignId: '',\r\n submittoMarketo: true,\r\n },\r\n labelContent: labelContentInitialData,\r\n planData: [],\r\n contentLoaded: false,\r\n}\r\n\r\nexport const contentReducer = (previousState: ContentState | undefined, action: ContentActions): ContentState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case ContentActionTypes.GET_LABEL_CONTENT: {\r\n return state\r\n }\r\n case ContentActionTypes.SET_CONTENT: {\r\n const { content, plans, labels } = action.payload\r\n return {\r\n ...state,\r\n contentData: {\r\n ...state.contentData,\r\n ...content,\r\n },\r\n labelContent: { ...labels },\r\n planData: [...plans],\r\n }\r\n }\r\n case ContentActionTypes.SET_CONTENT_LOADED: {\r\n return {\r\n ...state,\r\n contentLoaded: action.payload.loaded,\r\n }\r\n }\r\n case ContentActionTypes.GET_COMPARE_MODAL_CONTENT: {\r\n return state\r\n }\r\n case ContentActionTypes.SET_COUPON_DISCLAIMER: {\r\n return {\r\n ...state,\r\n labelContent: {\r\n ...state.labelContent,\r\n couponDisclaimer: action.payload.couponDisclaimer,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LabelContent } from '@gtc/state/label-content'\r\n\r\nexport const labelContentInitialData: LabelContent = {\r\n quantityLabelLong: '',\r\n quantityLabel: '',\r\n quantityLabelPlural: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n password: '',\r\n useAccountInfo: '',\r\n address: '',\r\n country: '',\r\n city: '',\r\n postalCode: '',\r\n state: '',\r\n phone: '',\r\n checkout: '',\r\n header: '',\r\n customizePlan: '',\r\n errorMessageTitle: '',\r\n orderSummary: '',\r\n monthly: '',\r\n annual: '',\r\n save: '',\r\n user: '',\r\n year: '',\r\n month: '',\r\n subtotal: '',\r\n estimatedTax: '',\r\n tBD: '',\r\n todaysTotal: '',\r\n recurringAnnualCharge: '',\r\n recurringMonthlyCharge: '',\r\n autoRenewalNote: '',\r\n createAnAccount: '',\r\n billingInformation: '',\r\n passwordRequirements: '',\r\n paymentDetails: '',\r\n expirationDate: '',\r\n cVV: '',\r\n cVVHint: '',\r\n completePurchase: '',\r\n pricingNote: '',\r\n continue: '',\r\n changePlan: '',\r\n selectedPlan: '',\r\n signIn: '',\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n estimatedTaxPopupInfo: '',\r\n quantityPopupInfo: '',\r\n cVVPopupInfo: '',\r\n yearAbbr: '',\r\n monthAbbr: '',\r\n questions: '',\r\n myAccount: '',\r\n signOut: '',\r\n pleaseSelect: '',\r\n headerPhone: '',\r\n optOutCheckboxLabel: '',\r\n optOut: '',\r\n cardNumber: '',\r\n errorInvalidCreditCardNumber: '',\r\n accountInformation: '',\r\n notYou: '',\r\n emailAddressAlreadyInUse: '',\r\n additionalUserLicences: '',\r\n howManyMore: '',\r\n existingUserLicencePlural: '',\r\n existingUserLicense: '',\r\n additional: '',\r\n newUserLicense: '',\r\n total: '',\r\n proratedAdjustment: '',\r\n today: '',\r\n modalCloseButtonText: '',\r\n changePlanMethodModalHeader: '',\r\n changePlanModalSubheader: '',\r\n changePaymentMethodModalHeader: '',\r\n changePaymentMethodModalSubheader: '',\r\n edit: '',\r\n newRecurringAnnualTotal: '',\r\n newRecurringMonthlyTotal: '',\r\n previousAnnualTotal: '',\r\n previousMonthlyTotal: '',\r\n billingCycleCredit: '',\r\n getStartedNote: '',\r\n creatingAccountLeftHeader: '',\r\n creatingAccountLeftContent: '',\r\n creatingAccountRightHeader: '',\r\n creatingAccountRightContent: '',\r\n getStartedButtonText: '',\r\n getStartedButtonUrl: '',\r\n savingWithAnnualBilling: '',\r\n errorBlockedPurchase: '',\r\n errorGenericMessage: '',\r\n errorRequiredBIC: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorSummaryMessage: '',\r\n errorTooManyRequests: '',\r\n errorInvalidPostalCode: '',\r\n internalErrorMessage: '',\r\n calculating: '',\r\n newUserLicensePlural: '',\r\n fees: '',\r\n feesPopupText: '',\r\n changeNumberModalHeader: '',\r\n changeNumberModalContent: '',\r\n changePlanUrl: '',\r\n sEOPageTitle: '',\r\n notAvailableModalHeader: '',\r\n notAvailableModalContent: '',\r\n notAvailableModalButtonText: '',\r\n notAvailableModalButtonUrl: '',\r\n showMe: '',\r\n errorInvalidAddress: '',\r\n countryPopupText: '',\r\n paymentMethodErrorMessage: '',\r\n disabledUserError: '',\r\n addonUserSuccessUrl: '',\r\n percentageOffAnnualDiscount: '',\r\n percentageOffVolumeDiscount: '',\r\n totalSavings: '',\r\n volumeDiscountPopupText: '',\r\n percentageOffPromoDiscount: '',\r\n invalidQSCouponMessage: '',\r\n invalidQSCouponUsingCMSCouponMessage: '',\r\n couponValidMessage: '',\r\n dismiss: '',\r\n couponDisclaimer: '',\r\n couponAdjustmentSavings: '',\r\n couponAdjustmentSavingsPopupText: '',\r\n billedMonthlyPrice: '',\r\n billedAnnualPrice: '',\r\n secure: '',\r\n trustArcSupport: '',\r\n numberPickerLocalNumber: '',\r\n numberPickerLocalOption: '',\r\n numberPickerPortNumber: '',\r\n numberPickerYourNumber: '',\r\n numberPickerLocal: '',\r\n numberPickerTollFree: '',\r\n numberPickerTollFreeNumber: '',\r\n numberPickerChooseNumber: '',\r\n numberPickerEditNumber: '',\r\n numberPickerPleaseSelectNumber: '',\r\n numberPickerNoNumberSelected: '',\r\n numberPickerPhone: '',\r\n numberPickerPhoneNumberNoLongerAvailable: '',\r\n numberPickerChooseAvailableNumber: '',\r\n numberPickerNoResults: '',\r\n numberPickerMainNumber: '',\r\n numberPickerMainNumberSubText: '',\r\n numberPickerPortInstructions: '',\r\n numberPickerAreaCode: '',\r\n numberPickerAreaCodeHeader: '',\r\n numberPickerAreaCodeSubHeader: '',\r\n numberPickerBasic: '',\r\n numberPickerCancel: '',\r\n numberPickerClose: '',\r\n numberPickerReset: '',\r\n numberPickerSave: '',\r\n numberPickerSearch: '',\r\n numberPickerVanity: '',\r\n numberPickerVanityPhrase: '',\r\n numberPickerVanityPhraseDescriptionLine1: '',\r\n numberPickerVanityPhraseDescriptionLine2: '',\r\n numberPickerVanityPhraseDescriptionLine3: '',\r\n numberPickerVanityPhrasePlaceholder: '',\r\n numberPickerFailedToOrderPhoneNumberModalHeader: '',\r\n numberPickerFailedToOrderPhoneNumberModalSubHeader: '',\r\n numberPickerFailedToOrderPhoneNumberModalCloseButtonText: '',\r\n allrightsreservedDisclaimerLabel: '',\r\n termsandconditionsLabel: '',\r\n privacypolicyLabel: '',\r\n antiSpamPolicyLabel: '',\r\n trademarkLabel: '',\r\n doNotSellInfoLabel: '',\r\n sitemapLabel: '',\r\n termsandconditionsUrl: '',\r\n privacypolicyUrl: '',\r\n antiSpamPolicyUrl: '',\r\n trademarkUrl: '',\r\n doNotSellInfoUrl: '',\r\n sitemapUrl: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n passwordStrengthTipDrawer: '',\r\n}\r\n","import { TimePeriod } from '@common/constants'\r\nimport { CheckoutState } from './state'\r\nimport { CheckoutActionTypes } from './actions'\r\nimport type { CheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: CheckoutState = {\r\n isLoading: true,\r\n selectedAddons: [],\r\n submitting: false,\r\n organizers: 1,\r\n promoCode: '',\r\n billingFrequency: TimePeriod.Year,\r\n calculatedTax: 0,\r\n calculatedTotal: 0,\r\n calculatedNetTotal: 0,\r\n anniversaryDate: '',\r\n selectedPlanSku: '',\r\n savedStateLoaded: false,\r\n purchaseComplete: false,\r\n addonComplete: false,\r\n totalLoading: false,\r\n selectedTierIndex: 0, // the default selected tier is Tier1, since selectedTierIndex is zero based index.\r\n currentVolumeDiscountPrice: 0,\r\n volumeDiscountLoading: false,\r\n volumeDiscount: {},\r\n calculatedProratedAmount: 0,\r\n isChoosingPhoneNumber: false,\r\n phoneNumber: undefined,\r\n phoneNumberReservationId: '',\r\n phoneNumberVanityPhrase: '',\r\n reservingPhoneNumber: false,\r\n reservingPhoneNumberError: '',\r\n didFailToOrderPhoneNumber: false,\r\n autoLogin: undefined,\r\n}\r\n\r\nexport const checkoutReducer = (previousState: CheckoutState | undefined, action: CheckoutActions): CheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case CheckoutActionTypes.SET_LOADING:\r\n return {\r\n ...state,\r\n isLoading: action.payload.loading,\r\n }\r\n case CheckoutActionTypes.SET_PURCHASE_COMPLETE:\r\n return {\r\n ...state,\r\n purchaseComplete: action.payload.complete,\r\n }\r\n case CheckoutActionTypes.SET_BILLING_FREQUENCY:\r\n return {\r\n ...state,\r\n billingFrequency: action.payload.frequency,\r\n }\r\n case CheckoutActionTypes.CLEAR_ADDONS:\r\n return {\r\n ...state,\r\n selectedAddons: [],\r\n }\r\n case CheckoutActionTypes.SET_SELECTED_PLAN:\r\n return {\r\n ...state,\r\n selectedPlanSku: action.payload.planSku,\r\n }\r\n case CheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n return {\r\n ...state,\r\n selectedAddons: [...addons],\r\n }\r\n }\r\n case CheckoutActionTypes.SET_ORGANIZERS:\r\n return {\r\n ...state,\r\n organizers: action.payload.organizers,\r\n }\r\n case CheckoutActionTypes.SET_CALCULATED_PRICE:\r\n return {\r\n ...state,\r\n productPrices: action.payload.productPrices,\r\n calculatedNetTotal: action.payload.net,\r\n calculatedTotal: action.payload.total,\r\n calculatedTax: action.payload.tax,\r\n anniversaryDate: action.payload.anniversaryDate,\r\n }\r\n case CheckoutActionTypes.SET_SAVED_STATE_LOADED:\r\n return {\r\n ...state,\r\n savedStateLoaded: action.payload.savedStateLoaded,\r\n }\r\n case CheckoutActionTypes.SET_LOADING_TOTAL:\r\n return {\r\n ...state,\r\n totalLoading: action.payload.loading,\r\n }\r\n case CheckoutActionTypes.SET_ADDON_COMPLETE:\r\n return {\r\n ...state,\r\n addonComplete: action.payload.addonComplete,\r\n }\r\n case CheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { selectedTierIndex } = action.payload\r\n return {\r\n ...state,\r\n selectedTierIndex,\r\n }\r\n }\r\n case CheckoutActionTypes.SET_VOLUME_DISCOUNT: {\r\n const { selectedPlanSku, currency, volumeDiscountForSelectedPlanAndCurrency } = action.payload\r\n const selectedPlanSkuVolumeDiscount = state.volumeDiscount[selectedPlanSku] || {}\r\n return {\r\n ...state,\r\n volumeDiscount: {\r\n ...state.volumeDiscount,\r\n [selectedPlanSku]: {\r\n ...selectedPlanSkuVolumeDiscount,\r\n [currency]: volumeDiscountForSelectedPlanAndCurrency,\r\n },\r\n },\r\n }\r\n }\r\n case CheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING: {\r\n const { volumeDiscountLoading } = action.payload\r\n return { ...state, volumeDiscountLoading }\r\n }\r\n case CheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE: {\r\n const { currentVolumeDiscountPrice } = action.payload\r\n return { ...state, currentVolumeDiscountPrice }\r\n }\r\n case CheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON: {\r\n return { ...state, currentVolumeDiscountPrice: 0 }\r\n }\r\n case CheckoutActionTypes.SET_PRORATED_AMOUNT: {\r\n const { proratedAmount } = action.payload\r\n return { ...state, calculatedProratedAmount: proratedAmount }\r\n }\r\n case CheckoutActionTypes.RESET_CHECKOUT_STATE: {\r\n return initialCheckoutState\r\n }\r\n case CheckoutActionTypes.SET_IS_CHOOSING_PHONE_NUMBER: {\r\n const { isChoosingPhoneNumber } = action.payload\r\n return { ...state, isChoosingPhoneNumber }\r\n }\r\n case CheckoutActionTypes.SET_PHONE_NUMBER: {\r\n const { phoneNumber } = action.payload\r\n return { ...state, phoneNumber }\r\n }\r\n case CheckoutActionTypes.SET_PHONE_NUMBER_RESERVATION_ID: {\r\n const { phoneNumberReservationId } = action.payload\r\n return { ...state, phoneNumberReservationId }\r\n }\r\n case CheckoutActionTypes.SET_PHONE_NUMBER_VANITY_PHRASE: {\r\n const { phoneNumberVanityPhrase } = action.payload\r\n return { ...state, phoneNumberVanityPhrase }\r\n }\r\n case CheckoutActionTypes.SET_RESERVING_PHONE_NUMBER: {\r\n const { reservingPhoneNumber } = action.payload\r\n return { ...state, reservingPhoneNumber }\r\n }\r\n case CheckoutActionTypes.SET_RESERVING_PHONE_NUMBER_ERROR: {\r\n const { reservingPhoneNumberError } = action.payload\r\n return { ...state, reservingPhoneNumberError }\r\n }\r\n case CheckoutActionTypes.SET_DID_FAIL_TO_ORDER_PHONE_NUMBER: {\r\n const { didFailToOrderPhoneNumber } = action.payload\r\n return { ...state, didFailToOrderPhoneNumber }\r\n }\r\n case CheckoutActionTypes.SET_AUTO_LOGIN: {\r\n return {\r\n ...state,\r\n autoLogin: action.payload.autoLogin,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { buyFormStateInitialData } from '@gtc/data'\r\nimport { BuyFormState } from './state'\r\nimport { BuyFormActionTypes } from './actions'\r\nimport type { BuyFormActions } from './actions'\r\n\r\nexport const buyFormInitialState: BuyFormState = buyFormStateInitialData\r\n\r\nexport const buyFormReducer = (previousState: BuyFormState | undefined, action: BuyFormActions): BuyFormState => {\r\n const state = previousState || buyFormInitialState\r\n switch (action.type) {\r\n // need to add actions from the form components here\r\n case BuyFormActionTypes.RESET_BUY_FORM: {\r\n return buyFormInitialState\r\n }\r\n case BuyFormActionTypes.UPDATE_INITIAL_FORM_STATE: {\r\n const { data } = action.payload\r\n return {\r\n ...state,\r\n initialData: { ...data },\r\n }\r\n }\r\n case BuyFormActionTypes.SET_CLEAR_EMAIL:\r\n return {\r\n ...state,\r\n clearEmail: action.payload.clear,\r\n }\r\n case BuyFormActionTypes.UPDATE_STEPS:\r\n return {\r\n ...state,\r\n steps: {\r\n ...state.steps,\r\n [action.payload.stepName]: {\r\n completed: action.payload.stepResult,\r\n error: !action.payload.stepResult,\r\n },\r\n },\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { USER_TYPES } from '@gtc/constants'\r\nimport { UserState } from './state'\r\nimport { UserActionTypes } from './actions'\r\nimport type { UserActions } from './actions'\r\n\r\nexport const initialUserState: UserState = {\r\n displayName: '',\r\n loadingExistingInfo: false,\r\n verifyingToken: false,\r\n userType: USER_TYPES.NEW,\r\n loggedIn: {\r\n accessToken: undefined,\r\n isUserLoggedIn: false,\r\n },\r\n verifiedUserShouldLogIn: false,\r\n}\r\n\r\nexport const userReducer = (previousState: UserState | undefined, action: UserActions): UserState => {\r\n const state = previousState || initialUserState\r\n switch (action.type) {\r\n case UserActionTypes.SET_EXISTING_BILLING_INFO: {\r\n const { billingInfo } = action.payload\r\n return {\r\n ...state,\r\n existingBillingInformation: { ...billingInfo },\r\n }\r\n }\r\n case UserActionTypes.SET_EXISTING_USER_INFO: {\r\n const { userInfo } = action.payload\r\n return {\r\n ...state,\r\n existingUserInformation: { ...userInfo },\r\n }\r\n }\r\n case UserActionTypes.SET_EXISTING_ACCOUNT_INFO: {\r\n const { accountInfo } = action.payload\r\n return {\r\n ...state,\r\n existingAccountInformation: { ...accountInfo },\r\n }\r\n }\r\n case UserActionTypes.SET_DISPLAY_NAME: {\r\n return {\r\n ...state,\r\n displayName: action.payload.displayName,\r\n }\r\n }\r\n case UserActionTypes.SET_LOADING_EXISTING_INFO: {\r\n return {\r\n ...state,\r\n loadingExistingInfo: action.payload.loading,\r\n }\r\n }\r\n case UserActionTypes.SET_VERIFYING_TOKEN: {\r\n return {\r\n ...state,\r\n verifyingToken: action.payload.verifying,\r\n }\r\n }\r\n case UserActionTypes.SET_USER_TYPE: {\r\n return {\r\n ...state,\r\n userType: action.payload.type,\r\n }\r\n }\r\n case UserActionTypes.SET_EXISTING_PAYMENT_DETAILS: {\r\n const { info } = action.payload\r\n return {\r\n ...state,\r\n existingPaymentInformation: { ...info },\r\n }\r\n }\r\n case UserActionTypes.SET_ACCESS_TOKEN: {\r\n return {\r\n ...state,\r\n loggedIn: { ...state.loggedIn, accessToken: action.payload.accessToken },\r\n }\r\n }\r\n case UserActionTypes.SET_IS_USER_LOGGEDIN: {\r\n return {\r\n ...state,\r\n loggedIn: {\r\n ...state.loggedIn,\r\n isUserLoggedIn: action.payload.isUserLoggedIn,\r\n },\r\n }\r\n }\r\n case UserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN: {\r\n return {\r\n ...state,\r\n verifiedUserShouldLogIn: action.payload.verifiedUserShouldLogIn,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport {\r\n CalculateCouponPriceActionPayload,\r\n CheckVolumeDiscountAgainstRepriceCouponActionPayload,\r\n ValidateCouponActionPayload,\r\n} from '../coupon-util'\r\nimport { CouponProcessedDataPerSku } from './state'\r\n\r\nexport enum CouponActionTypes {\r\n SET_APPLY_COUPON_ATTEMPT_MADE = '[coupon-actions] check-apply-coupon-attempt-made',\r\n GET_COUPON_DETAILS = '[coupon-actions] get-coupon-details',\r\n CALCULATE_COUPON_PRICE = '[coupon-actions] calculate-coupon-price',\r\n VALIDATE_COUPON = '[coupon-actions] validate-coupon',\r\n SET_COUPON_PROCESSED_DATA = '[coupon-actions] set-coupon-processed-data',\r\n SET_COUPON_SERVER_DATA = '[coupon-actions] set-coupon-server-data',\r\n CHECK_CMS_COUPON = '[coupon-actions] check-cms-coupon',\r\n RESET_COUPON_DATA = '[coupon-actions] reset-coupon-data',\r\n SET_COUPON_VALID_AND_APPLIED = '[coupon-actions] set-coupon-valid-and-applied',\r\n SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER = '[coupon-actions] set-coupon-double-dip-amount-for-new-user',\r\n SET_URL_COUPON_ACTIVE = '[coupon-actions] set-url-coupon-active',\r\n OBSERVE_VALIDATE_CMS_COUPON = '[coupon-actions] observe-validate-cms-coupon',\r\n CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON = '[coupon-actions] check-volume-discount-against-reprice-coupon',\r\n ATTEMPT_FOR_CMS_COUPON = '[coupon-actions] attempt-for-cms-coupon',\r\n SET_URL_COUPON_CODE = '[coupon-actions] set-url-coupon-code',\r\n}\r\n\r\nexport const couponActions = {\r\n getCouponDetails: (couponCode: string) => createAction(CouponActionTypes.GET_COUPON_DETAILS, { couponCode }),\r\n validateCoupon: (couponValidationData: ValidateCouponActionPayload, isAttemptingUrlCoupon: boolean) =>\r\n createAction(CouponActionTypes.VALIDATE_COUPON, { couponValidationData, isAttemptingUrlCoupon }),\r\n calculateCouponPrice: (couponCalculationData: CalculateCouponPriceActionPayload) =>\r\n createAction(CouponActionTypes.CALCULATE_COUPON_PRICE, { couponCalculationData }),\r\n setCouponProcessedData: (couponProcessedDataPerSku: CouponProcessedDataPerSku | null) =>\r\n createAction(CouponActionTypes.SET_COUPON_PROCESSED_DATA, { couponProcessedDataPerSku }),\r\n setCouponServerData: (couponServerData: CouponServerData) =>\r\n createAction(CouponActionTypes.SET_COUPON_SERVER_DATA, { couponServerData }),\r\n checkCMSCoupon: (selectedPlanSku: string) => createAction(CouponActionTypes.CHECK_CMS_COUPON, { selectedPlanSku }),\r\n resetCouponData: () => createAction(CouponActionTypes.RESET_COUPON_DATA),\r\n setCouponValidAndApplied: (isCouponValidAndApplied: boolean) =>\r\n createAction(CouponActionTypes.SET_COUPON_VALID_AND_APPLIED, { isCouponValidAndApplied }),\r\n setCouponDoubleDipAmountForNewUser: (couponDoubleDipAmountForNewUser: number) =>\r\n createAction(CouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER, { couponDoubleDipAmountForNewUser }),\r\n setUrlCouponActive: (isUrlCouponActive: boolean) =>\r\n createAction(CouponActionTypes.SET_URL_COUPON_ACTIVE, { isUrlCouponActive }),\r\n observeValidateCMSCoupon: (couponServerData: CouponServerData) =>\r\n createAction(CouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON, { couponServerData }),\r\n checkVolumeDiscountAgainstRepriceCoupon: (\r\n checkVolumeDiscountData: CheckVolumeDiscountAgainstRepriceCouponActionPayload\r\n ) => createAction(CouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON, { checkVolumeDiscountData }),\r\n attemptForCMSCoupon: () => createAction(CouponActionTypes.ATTEMPT_FOR_CMS_COUPON),\r\n setUrlCouponCode: (couponCode: string) => createAction(CouponActionTypes.SET_URL_COUPON_CODE, { couponCode }),\r\n}\r\n\r\nexport type CouponActions = ActionUnion\r\n","import { CouponActions, CouponActionTypes } from './actions'\r\nimport { CouponState } from './state'\r\n\r\nexport const initialCouponState: CouponState = {\r\n couponServerData: null,\r\n couponProcessedDataPerSku: null,\r\n isUrlCouponActive: false,\r\n isCMSCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n isUrlCouponCodeAvailable: false,\r\n urlCouponCode: '',\r\n}\r\n\r\nexport const couponReducer = (previousState: CouponState | undefined, action: CouponActions) => {\r\n const state = previousState || initialCouponState\r\n switch (action.type) {\r\n case CouponActionTypes.SET_COUPON_SERVER_DATA: {\r\n const { couponServerData } = action.payload\r\n return {\r\n ...state,\r\n couponServerData,\r\n }\r\n }\r\n case CouponActionTypes.SET_COUPON_PROCESSED_DATA: {\r\n const { couponProcessedDataPerSku } = action.payload\r\n return { ...state, couponProcessedDataPerSku }\r\n }\r\n case CouponActionTypes.RESET_COUPON_DATA: {\r\n return {\r\n ...state,\r\n couponProcessedDataPerSku: null,\r\n isCMSCouponActive: false,\r\n isUrlCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n }\r\n }\r\n case CouponActionTypes.SET_COUPON_VALID_AND_APPLIED: {\r\n const { isCouponValidAndApplied } = action.payload\r\n return { ...state, isCouponValidAndApplied }\r\n }\r\n case CouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER: {\r\n const { couponDoubleDipAmountForNewUser } = action.payload\r\n return { ...state, couponDoubleDipAmountForNewUser }\r\n }\r\n case CouponActionTypes.SET_URL_COUPON_ACTIVE: {\r\n const { isUrlCouponActive } = action.payload\r\n return {\r\n ...state,\r\n isUrlCouponActive,\r\n isCMSCouponActive: !isUrlCouponActive,\r\n }\r\n }\r\n case CouponActionTypes.SET_URL_COUPON_CODE: {\r\n const { couponCode } = action.payload\r\n return { ...state, urlCouponCode: couponCode, isUrlCouponCodeAvailable: couponCode.length > 0 }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { combineReducers } from 'redux'\r\nimport { contentReducer } from '@gtc/state/content/reducer'\r\nimport { checkoutReducer } from '@gtc/state/checkout/reducer'\r\nimport { buyFormReducer } from '@gtc/state/buy-form/reducer'\r\nimport { userReducer } from '@gtc/state/user/reducer'\r\nimport { couponReducer } from '@gtc/state/coupon/reducer'\r\n\r\nexport const connectAppReducer = combineReducers({\r\n content: contentReducer,\r\n checkout: checkoutReducer,\r\n form: buyFormReducer,\r\n user: userReducer,\r\n coupon: couponReducer,\r\n})\r\n\r\nexport type ConnectAppState = ReturnType\r\n\r\nexport type ConnectContainerAppState = {\r\n connect: ConnectAppState\r\n}\r\n","import axios from 'axios'\r\nimport { BillingInfoDataType, PaymentDataType, SubmitDataType, CalculatePriceDataType } from '@gtc/state/checkout/state'\r\nimport { UserDataType, AbandonedCartPayload } from '@gtc/state/user/state'\r\nimport { SubmitPaymentResponseData } from '@gtc/state/submit-payment/state'\r\nimport { SC_SITE } from '@common/constants'\r\n\r\nexport interface PaymentMethodDataType {\r\n accessToken?: string\r\n billingAccountKey?: string\r\n}\r\n\r\nexport interface CardHeadersType {\r\n AccessToken: string\r\n BillingAccountKey: string\r\n PaymentMethodKey: string\r\n}\r\n\r\nexport interface LabelDataType {\r\n id: string\r\n plan: string\r\n promoCode: string\r\n accessToken: string\r\n timezone: string\r\n}\r\n\r\nexport const apiQueryParams = {\r\n sc_site: SC_SITE.CONNECT,\r\n}\r\n\r\n/* APP DATA */\r\n\r\n// get buy flow api data\r\nexport function getLabelData(): Promise {\r\n return axios.post('/ecommapi/content/buy/pro', null, { params: apiQueryParams })\r\n}\r\n\r\n// get countries\r\nexport function getCountries() {\r\n return axios.get(`/ecommapi/content/countries?sc_site=${SC_SITE.CONNECT}`)\r\n}\r\n\r\n// get available payment methods\r\nexport function getAvailablePaymentMethods() {\r\n return axios.post('/ecommapi/purchase/GetAvailablePaymentMethods', null, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// create user account\r\nexport function createUserAccount(data: UserDataType) {\r\n return axios.post('/ecommapi/identity/CreateAccount/', data, {\r\n withCredentials: true,\r\n params: apiQueryParams,\r\n })\r\n}\r\n\r\n// create billing information\r\nexport function createBillingInfo(data: BillingInfoDataType) {\r\n return axios.post('/ecommapi/purchase/SetBillingInfo', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// calculate payment\r\nexport function calculatePrice(data: CalculatePriceDataType) {\r\n return axios.post('/ecommapi/purchase/CalculatePrice', data)\r\n}\r\n\r\n// create payment info\r\nexport function savePayment(data: PaymentDataType) {\r\n return axios.post('/ecommapi/purchase/SavePaymentMethodV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment\r\nexport function submitPayment(data: SubmitDataType) {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// cart abandonment\r\nexport function submitAbandonedCart(data: AbandonedCartPayload) {\r\n return axios.post(`${process.env.AWS_ABANDON_ENDPOINT}`, data)\r\n}\r\n\r\nexport default {\r\n getLabelData,\r\n}\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport gtcServices from '@gtc/services'\r\nimport { contentActions, ContentActionTypes } from '@gtc/state/content/actions'\r\n\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nfunction* loadContentSaga() {\r\n try {\r\n const labelServerResponse: GenericResponse = yield call(gtcServices.getLabelData)\r\n if (labelServerResponse && labelServerResponse.data) {\r\n const { labels, plans, ...content } = labelServerResponse.data\r\n const { sEOPageTitle } = labels\r\n yield call(() => {\r\n if (sEOPageTitle) document.title = sEOPageTitle\r\n })\r\n locationActions.getLocationInfo()\r\n yield put(contentActions.setContent(content, labels, plans))\r\n yield put(contentActions.setContentLoaded(true))\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeLoadContentSaga() {\r\n yield takeEvery(ContentActionTypes.GET_LABEL_CONTENT, loadContentSaga)\r\n}\r\n\r\nexport default initializeLoadContentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { userActions, UserActionTypes } from '@gtc/state/user/actions'\r\nimport { createUserAccount } from '@gtc/services'\r\nimport { UserAccountType } from '@gtc/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createUserSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const userCreationResponse: GenericResponse = yield call(createUserAccount, userValues)\r\n if (userCreationResponse.data) {\r\n const userData: UserAccountType = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserSaga() {\r\n yield takeEvery(UserActionTypes.CREATE_NEW_USER, createUserSaga)\r\n}\r\n\r\nexport default initializeCreateUserSaga\r\n","import { BillingInfoDataType } from '@gtc/state/checkout/state'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\n\r\nexport const getBillingValues = (values: BuyFormData) => {\r\n const billingValues: BillingInfoDataType = {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n postalCode: values.ZipCode,\r\n firstName: values.BillingFirstName,\r\n lastName: values.BillingLastName,\r\n email: values.Email,\r\n companyName: '',\r\n phoneNumber: '',\r\n }\r\n return billingValues\r\n}\r\n","import { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { getCheckoutState, getPlanData } from '@gtc/state/selectors'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { select, call, SelectEffect, CallEffect } from 'redux-saga/effects'\r\nimport { getCurrentPlan, getPlanNameSet } from '@gtc/utils/get-current-plan'\r\nimport { getCurrentAddons } from '@gtc/utils/get-current-addons'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { UrlParams, updatePlanUrlParam } from '@common/utils'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport function* getSelectedPlan(planSku?: string): Generator {\r\n const { selectedPlanSku }: CheckoutState = yield select(getCheckoutState)\r\n const planSkuToRetrieve = planSku || selectedPlanSku\r\n const planData: Plan[] = yield select(getPlanData)\r\n const selectedPlan: Plan = getCurrentPlan(planSkuToRetrieve, planData)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport function* getSelectedAddons(): Generator<\r\n SelectEffect | CallEffect | CallEffect,\r\n Addon[],\r\n CheckoutState & Plan & Addon[]\r\n> {\r\n const { selectedAddons }: CheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const myAddons: Addon[] = yield call(getCurrentAddons, selectedAddons, selectedPlan)\r\n return myAddons\r\n}\r\n\r\nexport function* getUpdatedPlanUrlParams() {\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const planData: Plan[] = yield select(getPlanData)\r\n const planNameSet: Set = yield call(getPlanNameSet, planData)\r\n const planUrlParams: UrlParams = yield call(\r\n updatePlanUrlParam,\r\n isEmpty(selectedPlan) ? '' : selectedPlan.name,\r\n planNameSet\r\n )\r\n return planUrlParams\r\n}\r\n","import { SelectedAddon } from '@gtc/state/add-on'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Items } from '@gtc/state/checkout/state'\r\n\r\nexport const getPaymentItems = (\r\n selectedPlan: Plan,\r\n organizers: number,\r\n billingFrequency: string,\r\n selectedAddons: SelectedAddon[],\r\n upgradeFlow?: boolean\r\n) => {\r\n const items: Items[] = [\r\n {\r\n itemId: 0,\r\n productSku: selectedPlan.sKU,\r\n paymentPlan: billingFrequency === 'YEAR' ? 'UpfrontAnnual' : 'UpfrontMonthly',\r\n quantity: organizers,\r\n contractLengthInMonth: billingFrequency === 'YEAR' ? 12 : 1,\r\n subscriptionsToUpgrade: null, // @todo update for upgrade flow\r\n },\r\n ]\r\n\r\n // add addon products to the items object\r\n if (selectedAddons.length > 0) {\r\n selectedAddons.map((addon: SelectedAddon, index: number) => {\r\n return items.push({\r\n itemId: index + 1,\r\n productSku: addon.sKU,\r\n paymentPlan: billingFrequency === 'YEAR' ? 'UpfrontAnnual' : 'UpfrontMonthly',\r\n quantity: addon.quantity + 1,\r\n subscriptionsToUpgrade: null, // @todo update for upgrade flow\r\n contractLengthInMonth: billingFrequency === 'YEAR' ? 12 : 1,\r\n })\r\n })\r\n } else if (!upgradeFlow) {\r\n items.push({\r\n itemId: 1,\r\n productSku: 'G2CPreDID',\r\n paymentPlan: billingFrequency === 'YEAR' ? 'UpfrontAnnual' : 'UpfrontMonthly',\r\n quantity: 1,\r\n subscriptionsToUpgrade: null, // @todo update for upgrade flow\r\n contractLengthInMonth: billingFrequency === 'YEAR' ? 12 : 1,\r\n })\r\n }\r\n\r\n return items\r\n}\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { createBillingInfo } from '@gtc/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createBillingInfoSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.CREATE_BILLING_INFO_SAGA\r\n try {\r\n const { billingValues } = action.payload\r\n const billingResponse: GenericResponse = yield call(createBillingInfo, billingValues)\r\n if (billingResponse.status === 200 || billingResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save billing info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save billing info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreateBillingInfoSaga() {\r\n yield takeEvery(CheckoutActionTypes.CREATE_BILLING_INFO, createBillingInfoSaga)\r\n}\r\n\r\nexport default initializeCreateBillingInfoSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { savePayment } from '@gtc/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createPaymentSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n try {\r\n const { paymentValues } = action.payload\r\n const savePaymentResponse: GenericResponse = yield call(savePayment, paymentValues)\r\n if (savePaymentResponse.status === 200 || savePaymentResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save payment info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreatePaymentSaga() {\r\n yield takeEvery(CheckoutActionTypes.CREATE_PAYMENT, createPaymentSaga)\r\n}\r\n\r\nexport default initializeCreatePaymentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { submitPayment } from '@gtc/services'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* submitPaymentSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.SUBMIT_PAYMENT_SAGA\r\n try {\r\n const { submitValues } = action.payload\r\n const submitCreation: GenericResponse = yield call(submitPayment, submitValues)\r\n if (submitCreation && submitCreation.data) {\r\n return submitCreation.data\r\n }\r\n } catch {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to submit payment' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to submit payment' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeSubmitPaymentSaga() {\r\n yield takeEvery(CheckoutActionTypes.SUBMIT_PAYMENT, submitPaymentSaga)\r\n}\r\n\r\nexport default initializeSubmitPaymentSaga\r\n","import { call, put, takeEvery } from 'redux-saga/effects'\r\nimport { CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { getAvailablePaymentMethods } from '@gtc/services'\r\nimport { PaymentDataReturnType } from '@gtc/state/checkout/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getAvailablePaymentMethodsSaga() {\r\n const componentName = TRACKING_COMPONENTS.GET_AVAILABLE_PAYMENT_METHODS_SAGA\r\n try {\r\n const paymentMethodsCreation: GenericResponse = yield call(getAvailablePaymentMethods)\r\n if (paymentMethodsCreation.data) {\r\n const paymentData: PaymentDataReturnType[] = paymentMethodsCreation.data\r\n return paymentData\r\n }\r\n } catch (e) {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get available payment methods' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get available payment methods' })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeGetAvailablePaymentMethodsSaga() {\r\n yield takeEvery(CheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS, getAvailablePaymentMethodsSaga)\r\n}\r\n\r\nexport default initializeGetAvailablePaymentMethodsSaga\r\n","import {\r\n deleteNumbersReservation,\r\n DeleteNumbersReservationRequest,\r\n DeleteNumbersReservationResponse,\r\n numbersApiUserId,\r\n NumbersOrderRequest,\r\n NumbersOrderResponse,\r\n orderNumbers,\r\n PhoneNumber,\r\n reserveNumbers,\r\n ReserveNumbersRequest,\r\n ReserveNumbersResponse,\r\n} from '@gtc/services/numbersApi'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { LabelContent } from '@gtc/state/label-content'\r\nimport { getCheckoutState, getLabelContent } from '@gtc/state/selectors'\r\nimport { AxiosResponse } from 'axios'\r\nimport { call, put, select } from 'redux-saga/effects'\r\n\r\nexport function* deleteReservation(phoneNumberReservationId: string) {\r\n try {\r\n const requestData: DeleteNumbersReservationRequest = {\r\n reservationIds: [phoneNumberReservationId],\r\n userId: numbersApiUserId,\r\n }\r\n const response: AxiosResponse = yield call(deleteNumbersReservation, requestData)\r\n const responseData = response.data as DeleteNumbersReservationResponse\r\n if (!Array.isArray(responseData)) {\r\n throw new Error('Unknown error deleting phone number reservation')\r\n }\r\n yield put(checkoutActions.setPhoneNumberReservationId(''))\r\n } catch (e) {\r\n // TODO: NumberPicker: Track the error.\r\n }\r\n}\r\n\r\nexport function* reservePhoneNumber(phoneNumber: PhoneNumber, vanityPhrase: string) {\r\n const labelContent: LabelContent = yield select(getLabelContent)\r\n try {\r\n yield put(checkoutActions.setReservingPhoneNumberError(''))\r\n const requestData: ReserveNumbersRequest = {\r\n phoneNumbers: [phoneNumber.e164Number],\r\n userId: numbersApiUserId,\r\n }\r\n const response: AxiosResponse = yield call(reserveNumbers, requestData)\r\n const responseData = response.data as ReserveNumbersResponse\r\n if (!Array.isArray(responseData)) {\r\n throw new Error() // See catch block below\r\n }\r\n const reservationId = responseData[0].id\r\n if (reservationId) {\r\n yield put(checkoutActions.setPhoneNumber(phoneNumber))\r\n yield put(checkoutActions.setPhoneNumberReservationId(reservationId))\r\n yield put(checkoutActions.setPhoneNumberVanityPhrase(vanityPhrase))\r\n } else {\r\n // If the reservation didn't succeed, it's possible that someone else already reserved this number\r\n const errorMessage = labelContent.numberPickerPhoneNumberNoLongerAvailable\r\n yield put(checkoutActions.setReservingPhoneNumberError(errorMessage))\r\n }\r\n } catch (e) {\r\n // TODO: NumberPicker: Track the error\r\n const errorMessage = labelContent.internalErrorMessage\r\n yield put(checkoutActions.setReservingPhoneNumberError(errorMessage))\r\n }\r\n}\r\n\r\nexport function* orderPhoneNumber() {\r\n const { phoneNumber, phoneNumberReservationId }: CheckoutState = yield select(getCheckoutState)\r\n\r\n if (!phoneNumber) return\r\n\r\n const requestData: NumbersOrderRequest = {\r\n phoneNumbersToOrder: [\r\n {\r\n phoneNumber: phoneNumber.e164Number,\r\n reservationId: phoneNumberReservationId,\r\n },\r\n ],\r\n isTollfreeOutbound: true, // isTollfreeOutbound is an old property and should always be true now\r\n userId: numbersApiUserId,\r\n }\r\n\r\n try {\r\n const response: AxiosResponse = yield call(orderNumbers, requestData)\r\n const responseData = response.data as NumbersOrderResponse\r\n if (responseData.errorMessage || !Array.isArray(responseData.numbersOrdered)) {\r\n throw new Error()\r\n }\r\n } catch (e) {\r\n // TODO: NumberPicker: Track the error\r\n\r\n // Release the number so it will be available to choose again from the Admin Panel\r\n yield call(deleteReservation, phoneNumberReservationId)\r\n\r\n // Show a modal\r\n yield put(checkoutActions.setDidFailToOrderPhoneNumber(true))\r\n }\r\n}\r\n","import { call, takeEvery, put, select, delay } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@gtc/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions } from '@common/state/flex/actions'\r\nimport { userActions } from '@gtc/state/user/actions'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { UserDataType, UserState, UserAccountType, AbandonedCartDataType } from '@gtc/state/user/state'\r\nimport {\r\n BillingInfoDataType,\r\n CreditCardDataType,\r\n PaymentDataType,\r\n SubmitDataType,\r\n CheckoutState,\r\n PaymentDataReturnType,\r\n} from '@gtc/state/checkout/state'\r\nimport { createTokenSaga } from '@common/sagas/flex/create-flex-token'\r\nimport { createUserSaga } from '@gtc/saga/user/create-user'\r\nimport { getBillingValues } from '@gtc/utils/get-billing-values'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtc/saga/content/content-helpers'\r\nimport { getPaymentItems } from '@gtc/utils/get-item-values'\r\nimport { getBuyFormState, getCheckoutState, getContentData, getCouponState, getUserState } from '@gtc/state/selectors'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, TRACKING_COMPONENTS, USER_TYPES } from '@gtc/constants'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { ContentData } from '@gtc/state/content-data'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { PRODUCTS, TRACKING_EVENTS } from '@common/constants'\r\nimport { clearState, getActiveCouponServerData } from '@gtc/utils'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { BuyFormState } from '@gtc/state/buy-form/state'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { SubmitPaymentResponseData } from '@gtc/state/submit-payment/state'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\nimport { createPaymentSaga } from './create-payment'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\nimport { orderPhoneNumber } from '../number-picker/reserve-phone-number-helpers'\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n ExpirationDate,\r\n } = action.payload.values\r\n const checkout: CheckoutState = yield select(getCheckoutState)\r\n const { userType, existingUserInformation }: UserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { fingerprint, keyInfo }: FlexState = yield select(getFlexState)\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: ContentData =\r\n yield select(getContentData)\r\n const buyFormState: BuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === USER_TYPES.TRIALER ||\r\n userType === USER_TYPES.EXPIRED ||\r\n userType === USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const selectedAddons: Addon[] = yield call(getSelectedAddons)\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n try {\r\n const billingValues: BillingInfoDataType = getBillingValues(action.payload.values)\r\n const items = getPaymentItems(selectedPlan, checkout.organizers, checkout.billingFrequency, selectedAddons)\r\n\r\n const userValues: UserDataType = {\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n country: billingValues.country,\r\n fingerPrintSessionId: fingerprint,\r\n productName: PRODUCTS.CONNECT,\r\n }\r\n // #region Get flex token\r\n const flexTokenAction = flexActions.createToken(ExpirationDate)\r\n const tokenData: string = yield call(createTokenSaga, flexTokenAction)\r\n if (tokenData) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = true\r\n } else {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create flex token' },\r\n },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n // #endregion\r\n\r\n let userKey = ''\r\n let accountKey = ''\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n const createUserAction = userActions.createNewUser(userValues)\r\n const userData: UserAccountType = yield call(createUserSaga, createUserAction)\r\n if (userData) {\r\n userKey = userData.UserKey\r\n accountKey = userData.BillingId\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(checkoutActions.setAutoLogin(userData.xAutoLoginTicket))\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n } else {\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n }\r\n // #endregion\r\n\r\n // #region Save billing info\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const extraBillingValues = { ...billingValues }\r\n extraBillingValues.taxNumber = '' // should this be changed or made a constant?\r\n extraBillingValues.federalTaxType = null\r\n extraBillingValues.phoneNumber = ContactPhone\r\n\r\n const createBillingInfoAction = checkoutActions.createBillingInfo(extraBillingValues)\r\n const savedBillingData: boolean = yield call(createBillingInfoSaga, createBillingInfoAction)\r\n if (savedBillingData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const flexFormData: CreditCardDataType = {\r\n expirationMonth: ExpirationDate.substr(0, 2),\r\n expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n flexResponse: tokenData,\r\n flexKeyId: keyInfo.flexKey.keyId,\r\n firstName,\r\n lastName,\r\n email,\r\n }\r\n\r\n // API Reference: https://confluence.ops.expertcity.com/x/t1unCw\r\n const paymentValues: PaymentDataType = {\r\n paymentMethodType: 'CC',\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n currency: locationInfo.currency,\r\n cardinalJwt: null,\r\n isScaCompleted: false,\r\n }\r\n const createPaymentAction = checkoutActions.createPayment(paymentValues)\r\n const savedPaymentData: boolean = yield call(createPaymentSaga, createPaymentAction)\r\n if (savedPaymentData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO] = true\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Get payment methods\r\n let paymentMethodKey = ''\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]) {\r\n const getAvailablePaymentData: PaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Process purchase\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: SubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n fingerprintSessionId: fingerprint,\r\n }\r\n\r\n const submitPaymentAction = checkoutActions.submitPayment(submitValues)\r\n const submitData: SubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n gtcTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: AbandonedCartDataType = {\r\n email,\r\n success: true,\r\n }\r\n yield put(userActions.submitAbandonedCart(abandonedCartData))\r\n yield put(userActions.setDisplayName(firstName))\r\n yield put(\r\n gtcTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentName\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n })\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // Order phone number\r\n if (checkout.phoneNumber) {\r\n // Note: The following request fails a lot due to the asyncronous creation of new accounts on the backend.\r\n // It is a known issue. Hopefully the backend team will implement a retry mechanism like was done for trial signups.\r\n // But until then, the best I can do for this story is use a delay or a retry on the frontend.\r\n // So, I'm using a simple delay for now until further discussion can take place.\r\n yield delay(3000)\r\n yield call(orderPhoneNumber)\r\n }\r\n\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(checkoutActions.setPurchaseComplete(true))\r\n }\r\n // #endregion\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'regular form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { userActions, UserActionTypes } from '@gtc/state/user/actions'\r\nimport { submitAbandonedCart } from '@gtc/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { COOKIE_NAMES } from '@common/constants'\r\nimport Cookies from 'js-cookie'\r\nimport { getCheckoutState, getUserState } from '@gtc/state/selectors'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { AbandonedCartPayload, UserState } from '@gtc/state/user/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { sanitizePayload } from '@common/utils/aws-utils'\r\n\r\nexport function* abandonedCartSaga(action: ReturnType) {\r\n const { isTrial, email, success, form } = action.payload.abandonedCartData\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const data: AbandonedCartPayload = {\r\n success: success.toString(),\r\n email,\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n country: locationInfo?.country,\r\n language: locationInfo?.language,\r\n program: null,\r\n firstName: null,\r\n lastName: null,\r\n phone: null,\r\n employees: null,\r\n quantity: null,\r\n numOfEndpoints: null,\r\n addOnCameraShare: null,\r\n // addonEndpointProtection: null,\r\n addonMobile: null,\r\n billing: null,\r\n plan: null,\r\n company: null,\r\n totalPrice: null,\r\n addOnQuantity: null,\r\n }\r\n\r\n // Include billing and plan information if cart is abandoned in buy form (1st abandoned cart call only)\r\n if (!isTrial && !success) {\r\n const { existingBillingInformation, existingUserInformation }: UserState = yield select(getUserState)\r\n const { selectedPlanSku, selectedAddons, organizers, billingFrequency, calculatedNetTotal }: CheckoutState =\r\n yield select(getCheckoutState)\r\n data.plan = selectedPlanSku\r\n data.quantity = organizers.toString()\r\n data.billing = billingFrequency\r\n data.firstName = form?.FirstName || existingUserInformation?.Name?.GivenName\r\n data.lastName = form?.LastName || existingUserInformation?.Name?.FamilyName\r\n data.phone = form?.ContactPhone || existingBillingInformation?.phoneNumber\r\n\r\n if (calculatedNetTotal && calculatedNetTotal > 0) {\r\n data.totalPrice = calculatedNetTotal.toString()\r\n }\r\n\r\n if (selectedAddons && selectedAddons.length) {\r\n const [{ quantity: addOnQuantity }] = selectedAddons\r\n data.addOnQuantity = addOnQuantity.toString()\r\n }\r\n\r\n data.program = 'GTC_Global_EN_TRG_Lead_Promo_Abandoned-Cart'\r\n }\r\n\r\n try {\r\n yield call(submitAbandonedCart, sanitizePayload(data))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to post abandoned email api' }))\r\n }\r\n}\r\n\r\nfunction* initializeAbandonedCartSaga() {\r\n yield takeEvery(UserActionTypes.SUBMIT_ABANDONED_CART, abandonedCartSaga)\r\n}\r\n\r\nexport default initializeAbandonedCartSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { userActions, UserActionTypes } from '@gtc/state/user/actions'\r\nimport commonServices, { EmailType, EmailCheckResponse } from '@common/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { buyFormActions } from '@gtc/state/buy-form/actions'\r\nimport { AbandonedCartDataType } from '@gtc/state/user/state'\r\n\r\nexport function* existingUserSaga(action: ReturnType) {\r\n const data: EmailType = { emailAddress: action.payload.email.toLowerCase() }\r\n const { form } = action.payload\r\n try {\r\n const response: EmailCheckResponse = yield call(commonServices.canUserAuthenticate, data)\r\n if (response && response.data) {\r\n if (response.data.canUserAuthenticate) {\r\n yield put(buyFormActions.setClearEmail(true))\r\n return true\r\n }\r\n yield put(buyFormActions.setClearEmail(false))\r\n const abandonedCartData: AbandonedCartDataType = {\r\n email: data.emailAddress,\r\n success: false,\r\n isTrial: false,\r\n form,\r\n }\r\n yield put(userActions.submitAbandonedCart(abandonedCartData))\r\n return false\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to verify email' }))\r\n return false\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeExistingUserSaga() {\r\n yield takeEvery(UserActionTypes.CHECK_EXISTING_USER, existingUserSaga)\r\n}\r\n\r\nexport default initializeExistingUserSaga\r\n","import { takeLatest, put, call } from 'redux-saga/effects'\r\n\r\nimport { userActions, UserActionTypes } from '@gtc/state/user/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { authInit, saveToken, appInsightsTrackEvent } from '@common/utils'\r\nimport { clearUserSession } from '@common/services'\r\nimport { Token } from '@getgo/auth-client'\r\n\r\nfunction* getAccessToken() {\r\n try {\r\n yield put(userActions.setVerifyingToken(true))\r\n const newAccessToken: Token | undefined = yield call(authInit)\r\n // if new token save it\r\n if (newAccessToken) {\r\n yield put(userActions.setAccessToken(newAccessToken))\r\n yield call(saveToken, newAccessToken)\r\n } else {\r\n try {\r\n yield call(clearUserSession)\r\n } catch (e: any) {\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n }\r\n\r\n yield put(userActions.setIsUserLoggedIn(!!newAccessToken))\r\n // to check if this action ran\r\n yield put(userActions.setVerifyShouldUserLogIn(true))\r\n yield put(userActions.setVerifyingToken(false))\r\n } catch (e: any) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get access token' }))\r\n yield put(userActions.setVerifyingToken(false))\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n}\r\n\r\nfunction* initializeGetAccessToken() {\r\n yield takeLatest(UserActionTypes.GET_ACCESS_TOKEN, getAccessToken)\r\n}\r\n\r\nexport default initializeGetAccessToken\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { UserActionTypes, userActions } from '@gtc/state/user/actions'\r\nimport authClass from '@common/utils/auth-class'\r\nimport { UrlParams } from '@common/utils'\r\nimport { getUpdatedPlanUrlParams } from '../content/content-helpers'\r\n\r\nfunction* userLogin(action: ReturnType) {\r\n try {\r\n const { pathname, search }: UrlParams = yield call(getUpdatedPlanUrlParams)\r\n const sso = action.payload.sso || false\r\n yield call(authClass.login, pathname, search, sso)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogin() {\r\n yield takeEvery(UserActionTypes.USER_LOGIN, userLogin)\r\n}\r\n\r\nexport default initializeLogin\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { UserActionTypes } from '@gtc/state/user/actions'\r\nimport { logout, UrlParams } from '@common/utils'\r\nimport { getUpdatedPlanUrlParams } from '../content/content-helpers'\r\n\r\nfunction* userLogout() {\r\n try {\r\n const { pathname, search }: UrlParams = yield call(getUpdatedPlanUrlParams)\r\n yield call(logout, pathname, search)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogout() {\r\n yield takeEvery(UserActionTypes.USER_LOGOUT, userLogout)\r\n}\r\n\r\nexport default initializeLogout\r\n","import { select, put, takeLeading, call } from 'redux-saga/effects'\r\nimport queryString from 'query-string'\r\nimport { loadSessionState, loadState } from '@gtc/utils'\r\nimport { CheckoutActionTypes, checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { getCheckoutState, getPlanData } from '@gtc/state/selectors'\r\nimport { getSelectedPlan } from '@gtc/saga/content/content-helpers'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { TimePeriod } from '@common/constants'\r\nimport { CheckoutState, SavedSessionState, SavedStoreState } from '@gtc/state/checkout/state'\r\nimport { getCurrentAddons } from '@gtc/utils/get-current-addons'\r\nimport { SelectedAddon } from '@gtc/state/add-on'\r\nimport { couponActions } from '@gtc/state/coupon/actions'\r\n\r\nfunction* loadSavedStateSaga(action: ReturnType) {\r\n try {\r\n const savedState: SavedStoreState | undefined = yield call(loadState)\r\n const savedSessionState: SavedSessionState | undefined = yield call(loadSessionState)\r\n const checkout: CheckoutState = yield select(getCheckoutState)\r\n const planData: Plan[] = yield select(getPlanData)\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const { urlPlan } = action.payload\r\n const {\r\n billingFrequency: queryBillingFrequency,\r\n minUsers,\r\n couponCode: queryCouponCode,\r\n } = queryString.parse(window.location.search)\r\n // grab url param for billing frequecy or saved one\r\n const preselectedBillingFrequency = queryBillingFrequency || savedState?.checkout?.billingFrequency\r\n // if min users was passed via url or saved in the store\r\n const preselectedMinUsers = Number(minUsers) || savedState?.checkout?.organizers\r\n\r\n // grab url param for couponCode first and if not available go for saved one\r\n let preSavedCouponCode = (queryCouponCode as string) || savedSessionState?.coupon?.urlCouponCode\r\n // try to apply coupon code and also save the coupon code in state\r\n preSavedCouponCode = preSavedCouponCode || ''\r\n yield put(couponActions.setUrlCouponCode(preSavedCouponCode))\r\n\r\n // if the value of the preselected frequency is an acceptable value and is not the same\r\n // as what is already saved, update it\r\n if (\r\n (preselectedBillingFrequency === TimePeriod.Month || preselectedBillingFrequency === TimePeriod.Year) &&\r\n preselectedBillingFrequency !== checkout.billingFrequency\r\n ) {\r\n yield put(checkoutActions.setBillingFrequency(preselectedBillingFrequency))\r\n }\r\n\r\n if (preselectedMinUsers) {\r\n yield put(checkoutActions.setOrganizers(preselectedMinUsers))\r\n }\r\n // grab url param for plan or saved in store\r\n if (urlPlan) {\r\n const preselectedPlan = urlPlan\r\n // check if plan name is different\r\n if (urlPlan && urlPlan !== selectedPlan.name) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find(\r\n (pln: Plan) => pln.name.toLocaleLowerCase() === preselectedPlan.toLowerCase()\r\n )\r\n if (foundPlan) {\r\n yield put(checkoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n }\r\n } else if (savedState?.checkout?.selectedPlanSku) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find((pln: Plan) => pln.sKU === savedState?.checkout?.selectedPlanSku)\r\n if (foundPlan) {\r\n yield put(checkoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n } else if (!savedState?.checkout?.selectedPlanSku) {\r\n yield put(checkoutActions.setSelectedPlan(planData[0].sKU))\r\n }\r\n\r\n if (savedState) {\r\n const { selectedAddons } = savedState.checkout\r\n\r\n const plan: Plan = yield call(getSelectedPlan)\r\n // if a plan was selected\r\n if (plan.name) {\r\n // find matching addon in the plan from preselected addon\r\n const foundAddons: SelectedAddon[] = yield call(getCurrentAddons, selectedAddons, plan)\r\n\r\n yield put(checkoutActions.setSelectedAddons(foundAddons))\r\n }\r\n }\r\n yield put(checkoutActions.setSavedStateLoaded(true, 'saved state saga'))\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeLoadSavedStateSaga() {\r\n yield takeLeading(CheckoutActionTypes.GET_SAVED_STATE, loadSavedStateSaga)\r\n}\r\n\r\nexport default initializeLoadSavedStateSaga\r\n","import { call, takeLatest, select, put, delay } from 'redux-saga/effects'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { CalculatePriceDataType, CheckoutState } from '@gtc/state/checkout/state'\r\nimport { calculatePrice } from '@gtc/services'\r\nimport { getBillingValues } from '@gtc/utils/get-billing-values'\r\nimport { getPaymentItems } from '@gtc/utils/get-item-values'\r\nimport { getSelectedPlan, getSelectedAddons } from '@gtc/saga/content/content-helpers'\r\nimport { getCheckoutState, getCouponState, getUserState } from '@gtc/state/selectors'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_COMPONENTS, USER_TYPES } from '@gtc/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { UserState } from '@gtc/state/user/state'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { CalculatePriceAPIData, CalculatePriceAPIReturnType } from '@gtc/state/calculate-price'\r\nimport { isEmpty } from 'lodash-es'\r\nimport {\r\n getActiveCouponServerData,\r\n getCouponDoubleDipAmountForNewUser,\r\n getTotalProratedAmount,\r\n getTotalVolumeDiscount,\r\n} from '@gtc/utils'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { couponActions } from '@gtc/state/coupon/actions'\r\n\r\nexport function* calculatePriceSaga(action: ReturnType) {\r\n const componentName = TRACKING_COMPONENTS.CALCULATE_PRICE_SAGA\r\n try {\r\n yield put(checkoutActions.setTotalLoading(true))\r\n yield delay(1000)\r\n const checkout: CheckoutState = yield select(getCheckoutState)\r\n const { userType, existingBillingInformation }: UserState = yield select(getUserState)\r\n const { values, planSKU } = action.payload\r\n const selectedPlan: Plan = yield call(getSelectedPlan, planSKU)\r\n const selectedAddons: Addon[] = yield call(getSelectedAddons)\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponProcessedDataPerSku } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n if (userType === USER_TYPES.ADDON) {\r\n values.Street1 = existingBillingInformation?.addressLine1 || ''\r\n values.City = existingBillingInformation?.city || ''\r\n values.CountryCode = existingBillingInformation?.country || ''\r\n values.Email = existingBillingInformation?.email || ''\r\n values.FirstName = existingBillingInformation?.firstName || ''\r\n values.LastName = existingBillingInformation?.lastName || ''\r\n values.ZipCode = existingBillingInformation?.postalCode || ''\r\n values.StateCode = existingBillingInformation?.state || ''\r\n }\r\n\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const calculatePriceValues: CalculatePriceDataType = {\r\n address: getBillingValues(values),\r\n currency: locationInfo.currency,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n cart: getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n userType === USER_TYPES.ADDON\r\n ),\r\n }\r\n\r\n const calculatePriceCreation: CalculatePriceAPIReturnType = yield call(calculatePrice, calculatePriceValues)\r\n if (calculatePriceCreation && calculatePriceCreation.data) {\r\n const {\r\n errorMessages,\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate,\r\n }: CalculatePriceAPIData = calculatePriceCreation.data\r\n if (isEmpty(errorMessages)) {\r\n yield put(\r\n checkoutActions.setCalculatedPrice(\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate === null ? '' : (anniversaryDate as string)\r\n )\r\n )\r\n // since the selected plan has an item id of 0 is the product prices array, we need to get the first item from productPrice\r\n // check getPaymentItems function above for more info\r\n const [planProductPrice] = productPrices.filter((productPrice) => productPrice.itemId === 0)\r\n const { volumeDiscount } = planProductPrice\r\n if (volumeDiscount) {\r\n const { amount } = volumeDiscount\r\n const calculatedVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n amount,\r\n checkout.organizers,\r\n false\r\n )\r\n yield put(checkoutActions.setCurrentVolumeDiscountPriceAndPercentage(calculatedVolumeDiscount))\r\n }\r\n // if add-on user, calculate the prorated amount\r\n if (userType === USER_TYPES.ADDON) {\r\n const calculatedProratedAmount = getTotalProratedAmount(\r\n productPrices,\r\n checkout.organizers,\r\n selectedAddons\r\n )\r\n yield put(checkoutActions.setProratedAmount(calculatedProratedAmount))\r\n }\r\n // coupon discount for DID\r\n if (isCouponValid && couponProcessedDataPerSku && userType !== USER_TYPES.ADDON) {\r\n const couponDoubleDipAmountForNewUser: number = yield call(\r\n getCouponDoubleDipAmountForNewUser,\r\n productPrices\r\n )\r\n yield put(couponActions.setCouponDoubleDipAmountForNewUser(couponDoubleDipAmountForNewUser))\r\n }\r\n } else {\r\n yield put(\r\n gtcTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get price data' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(modalActions.setErrorModal('Unable to get price data'))\r\n }\r\n }\r\n yield put(checkoutActions.setTotalLoading(false))\r\n } catch {\r\n yield put(\r\n gtcTrackingActions.track(\r\n { event: TRACKING_EVENTS.ERROR_PURCHASE, eventData: { errorMessage: 'error in calculating price' } },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'error in calculating price' }))\r\n yield put(checkoutActions.setTotalLoading(false))\r\n }\r\n}\r\n\r\nfunction* initializeCalculatePriceSaga() {\r\n yield takeLatest(CheckoutActionTypes.CALCULATE_PRICE, calculatePriceSaga)\r\n}\r\n\r\nexport default initializeCalculatePriceSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { userActions, UserActionTypes } from '@gtc/state/user/actions'\r\nimport commonServices, {\r\n verifyUser,\r\n getBillingSubscriptions,\r\n getBillingInfo,\r\n getExistingPaymentDetails,\r\n} from '@common/services'\r\nimport { getLabelContent, getUserState } from '@gtc/state/selectors'\r\nimport { authClass, processExistingBillingInfo } from '@common/utils'\r\nimport { trackAbandonForm } from '@gtc/utils'\r\nimport { UserState } from '@gtc/state/user/state'\r\nimport {\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n ExistingBillingInfoType,\r\n} from '@common/state/user/state'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { buyFormActions } from '@gtc/state/buy-form/actions'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { USER_TYPES, USER_TYPES_RESPONSE } from '@gtc/constants'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport {\r\n PREFIX,\r\n TimePeriod,\r\n BILLING_TYPES,\r\n PRODUCT_TYPES,\r\n PRODUCT_SKU,\r\n COUNTRIES,\r\n PRODUCT_FAMILY_NAME,\r\n} from '@common/constants'\r\nimport { LabelContent } from '@gtc/state/label-content'\r\nimport { isEmpty, partition } from 'lodash-es'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { accountActions } from '@common/state/account/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nfunction* userLoggedInSaga() {\r\n try {\r\n yield put(userActions.setLoadingExistingInformation(true))\r\n const {\r\n loggedIn: { accessToken },\r\n }: UserState = yield select(getUserState)\r\n const { paymentMethodErrorMessage, disabledUserError }: LabelContent = yield select(getLabelContent)\r\n\r\n // clear previous session on the server\r\n yield call(commonServices.clearUserSession)\r\n // get user info\r\n // eslint-disable-next-line camelcase\r\n const response: GenericResponse = yield call(\r\n verifyUser,\r\n accessToken?.access_token || '',\r\n PRODUCT_FAMILY_NAME.G2C\r\n )\r\n if (response && !isEmpty(response.data)) {\r\n const {\r\n User: { UserName, Name, UserKey },\r\n AccountKey,\r\n isBanned,\r\n hasGroupSubscription,\r\n } = response.data\r\n\r\n // review this url once this starts functioning again\r\n if (hasGroupSubscription) {\r\n trackAbandonForm()\r\n window.location.href = process.env.ADMIN_CONNECT_URL as string\r\n }\r\n\r\n const userInfo: ExistingUserInfoType = {\r\n UserName,\r\n Name,\r\n UserKey,\r\n AccountKey,\r\n }\r\n\r\n const buyFormData: BuyFormData = {\r\n FirstName: Name?.GivenName,\r\n LastName: Name?.FamilyName,\r\n Email: UserName,\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n }\r\n\r\n // return error message if user is banned\r\n if (isBanned === true) {\r\n yield put(userActions.setUserType(USER_TYPES.BANNED))\r\n yield put(userActions.setLoadingExistingInformation(false))\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n { fatalErrorMessage: disabledUserError, trackErrorMessage: disabledUserError },\r\n true\r\n )\r\n )\r\n return\r\n }\r\n\r\n // USER_IDENTITY_NOT_FOUND implies that user has neither boss nor identity account\r\n if (response.data.Code === USER_TYPES_RESPONSE.USER_IDENTITY_NOT_FOUND) {\r\n yield put(userActions.setUserType(USER_TYPES.NEW))\r\n yield put(userActions.userLogout())\r\n return\r\n }\r\n\r\n // set up and display existing user account information\r\n yield put(userActions.setExistingUserInformation(userInfo))\r\n\r\n // USER_BOSS_NOT_FOUND implies that user has an identity account\r\n if (response.data.Code === USER_TYPES_RESPONSE.USER_BOSS_NOT_FOUND) {\r\n yield put(userActions.setUserType(USER_TYPES.IDENTITY_ONLY))\r\n yield put(buyFormActions.updateInitialFormState(buyFormData))\r\n yield put(userActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // #region attempt to set up existing billing info\r\n const billingInfoRequest: GenericResponse = yield call(getBillingInfo)\r\n if (billingInfoRequest && !isEmpty(billingInfoRequest.data)) {\r\n // We get company name same as the email without the `@` in case we don't provide in the first place.\r\n // This is a known behavior for GTC. So, we check for GTR, we check if that's what we got and don't show the value\r\n const { email, companyName } = billingInfoRequest.data\r\n if (email.replace('@', '').replace('_', '') === companyName) {\r\n billingInfoRequest.data.companyName = ''\r\n }\r\n\r\n const processedBillingData = processExistingBillingInfo(billingInfoRequest.data)\r\n const billingInfo: ExistingBillingInfoType = processedBillingData\r\n\r\n if (billingInfo.state === 'XX') {\r\n billingInfo.state = ''\r\n }\r\n\r\n billingInfo.firstName = Name.GivenName\r\n billingInfo.lastName = Name.FamilyName\r\n buyFormData.Street1 = billingInfo.addressLine1\r\n buyFormData.City = billingInfo.city\r\n buyFormData.CountryCode = billingInfo.country\r\n buyFormData.ZipCode = billingInfo.postalCode\r\n buyFormData.StateCode = billingInfo.state\r\n buyFormData.ContactPhone = billingInfo.phoneNumber\r\n\r\n // all five fields must contain values in order to set existing billing information\r\n if (buyFormData.Street1 && buyFormData.City && buyFormData.CountryCode && buyFormData.ZipCode) {\r\n yield put(userActions.setExistingBillingInformation(billingInfo))\r\n }\r\n }\r\n yield put(buyFormActions.updateInitialFormState(buyFormData))\r\n // #endregion\r\n\r\n // #region attempt to set up existing payment info\r\n const paymentInfoRequest: GenericResponse = yield call(getExistingPaymentDetails)\r\n if (paymentInfoRequest && !isEmpty(paymentInfoRequest.data)) {\r\n const currentDate = new Date()\r\n const currentYear = currentDate.getFullYear()\r\n const currentMonth = currentDate.getMonth()\r\n const ccInfo = paymentInfoRequest.data[0].creditCard\r\n if (\r\n ccInfo.expirationYear < currentYear ||\r\n (ccInfo.expirationYear === currentYear && ccInfo.expirationMonth < currentMonth)\r\n ) {\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n {\r\n fatalErrorMessage: paymentMethodErrorMessage,\r\n trackErrorMessage: paymentMethodErrorMessage,\r\n },\r\n true\r\n )\r\n )\r\n }\r\n const paymentInfo: ExistingPaymentInfoType = {\r\n last4Digits: ccInfo.last4Digits,\r\n }\r\n yield put(userActions.setExistingPaymentDetails(paymentInfo))\r\n }\r\n // #endregion\r\n\r\n // if subscription is empty, mark as expired-user\r\n const subscriptionRequest: GenericResponse = yield call(getBillingSubscriptions)\r\n if (isEmpty(subscriptionRequest?.data)) {\r\n yield put(userActions.setUserType(USER_TYPES.EXPIRED))\r\n yield put(userActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // set account subscription state\r\n yield put(accountActions.setAccountSubscriptions(subscriptionRequest.data))\r\n\r\n // partition subscriptions into two arrays - one for GTC and another for GTR\r\n const [connectSubscriptions] = partition(\r\n subscriptionRequest.data,\r\n (plan: BillingDetailedSubscriptionPlan) => {\r\n return plan.productSku.startsWith(PREFIX.G2C)\r\n }\r\n )\r\n\r\n const connectTrialSubscription = connectSubscriptions.find(\r\n (plan: BillingDetailedSubscriptionPlan) => plan.planType === PRODUCT_TYPES.TRIAL\r\n )\r\n\r\n // #region determine buy flow user state\r\n const selectedPlan = connectSubscriptions?.find(\r\n (plan: BillingDetailedSubscriptionPlan) =>\r\n plan.productSku === PRODUCT_SKU.G2C || plan.productSku === PRODUCT_SKU.G2C_JUST_TALK\r\n )\r\n if (selectedPlan) {\r\n const {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n planType,\r\n } = selectedPlan\r\n\r\n const overallQuantity = connectSubscriptions.reduce(\r\n (accumulator: number, subItem: ExistingAccountInfoType) => {\r\n if (subItem.productSku === productSku) {\r\n return accumulator + subItem.quantity\r\n }\r\n return accumulator\r\n },\r\n 0\r\n )\r\n\r\n const accountInfo: ExistingAccountInfoType = {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n quantity: overallQuantity,\r\n planType,\r\n }\r\n\r\n yield put(userActions.setExistingAccountInformation(accountInfo))\r\n yield put(checkoutActions.setSelectedPlan(productSku))\r\n yield put(\r\n checkoutActions.setBillingFrequency(\r\n paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n )\r\n )\r\n // if user already has the selected plan, mark as add-on flow\r\n yield put(userActions.setUserType(USER_TYPES.ADDON))\r\n yield put(checkoutActions.setSelectedAddons([]))\r\n } else if (connectTrialSubscription) {\r\n // otherwise, if user has any G2Connect trial subscription, mark as trialer\r\n yield put(userActions.setUserType(USER_TYPES.TRIALER))\r\n } else {\r\n // otherwise, since user has at least one subscription, mark as cross product\r\n yield put(userActions.setUserType(USER_TYPES.CROSSPRODUCT))\r\n }\r\n // #endregion\r\n\r\n yield put(userActions.setLoadingExistingInformation(false))\r\n }\r\n } catch (e) {\r\n yield put(userActions.setUserType(USER_TYPES.NEW))\r\n yield put(userActions.setLoadingExistingInformation(false))\r\n yield call(authClass().logout)\r\n }\r\n}\r\n\r\nfunction* initializeLoggedInSaga() {\r\n yield takeEvery(UserActionTypes.GET_LOGGED_IN_USER_STATE, userLoggedInSaga)\r\n}\r\n\r\nexport default initializeLoggedInSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@gtc/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { SubmitDataType, CheckoutState, PaymentDataReturnType } from '@gtc/state/checkout/state'\r\nimport { getPaymentItems } from '@gtc/utils/get-item-values'\r\nimport { getCheckoutState, getUserState, getLabelContent, getContentData, getCouponState } from '@gtc/state/selectors'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtc/saga/content/content-helpers'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { ContentData } from '@gtc/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\nimport { AbandonedCartDataType, UserState } from '@gtc/state/user/state'\r\nimport { ExistingBillingInfoType, ExistingUserInfoType } from '@common/state/user/state'\r\nimport { clearState, getActiveCouponServerData } from '@gtc/utils'\r\nimport { LabelContent } from '@gtc/state/label-content'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { userActions } from '@gtc/state/user/actions'\r\nimport { SubmitPaymentResponseData } from '@gtc/state/submit-payment/state'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const { isAddonFlow } = action.payload\r\n const componentName = TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN, steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_BILLING_INFO, steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO, steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO])\r\n )\r\n\r\n const checkout: CheckoutState = yield select(getCheckoutState)\r\n const { addonUserSuccessUrl }: LabelContent = yield select(getLabelContent)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: UserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: ContentData =\r\n yield select(getContentData)\r\n\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const selectedAddons: Addon[] = yield call(getSelectedAddons)\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n try {\r\n const upgradeFlow = isAddonFlow\r\n const items = getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n upgradeFlow\r\n )\r\n\r\n let paymentMethodKey = ''\r\n const getAvailablePaymentData: PaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: SubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n }\r\n\r\n const submitPaymentAction = checkoutActions.submitPayment(submitValues)\r\n const submitData: SubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n gtcTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n }\r\n\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: AbandonedCartDataType = {\r\n email: UserName,\r\n success: true,\r\n }\r\n yield put(userActions.submitAbandonedCart(abandonedCartData))\r\n yield put(gtcTrackingActions.track({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW }, componentName))\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n }\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(checkoutActions.setAddonComplete(true))\r\n window.location.href = addonUserSuccessUrl\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@gtc/state/buy-form/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { initialCheckoutState } from '@gtc/state/checkout/reducer'\r\n\r\nexport function* resetBuyFormAffectedStatesSaga() {\r\n yield put(buyFormActions.resetForm())\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n yield put(\r\n checkoutActions.setCalculatedPrice(\r\n [],\r\n initialCheckoutState.calculatedNetTotal,\r\n initialCheckoutState.calculatedTotal,\r\n initialCheckoutState.calculatedTax,\r\n initialCheckoutState.anniversaryDate\r\n )\r\n )\r\n}\r\n\r\nfunction* initializeResetBuyFormAffectedStatesSaga() {\r\n yield takeEvery(BuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES, resetBuyFormAffectedStatesSaga)\r\n}\r\n\r\nexport default initializeResetBuyFormAffectedStatesSaga\r\n","import { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtc/saga/content/content-helpers'\r\nimport { getCheckoutState, getContentData, getCouponState, getPlanData, getUserState } from '@gtc/state/selectors'\r\nimport { UserState } from '@gtc/state/user/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { select, call } from 'redux-saga/effects'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { USER_TYPES } from '@gtc/constants'\r\nimport { getActiveCouponServerData, getCouponTotalSavings, getSelectedTierIndex } from '@gtc/utils'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CustomizeItemsData } from '@gtc/state/tracking/state'\r\nimport { ContentData } from '@gtc/state/content-data'\r\nimport { PhoneInfo, PHONE_NUMBER_STATUS, PHONE_NUMBER_TYPE } from '@common/constants'\r\n\r\nexport function* getCustomizeItemsData() {\r\n const planData: Plan[] = yield select(getPlanData)\r\n const { CurrencyCode }: ContentData = yield select(getContentData)\r\n const { billingFrequency, organizers }: CheckoutState = yield select(getCheckoutState)\r\n const customizeItemsData: CustomizeItemsData = {\r\n planData,\r\n billingFrequency,\r\n currency: CurrencyCode,\r\n organizers,\r\n }\r\n return customizeItemsData\r\n}\r\n\r\nexport function* getPageViewData() {\r\n const {\r\n loggedIn: { isUserLoggedIn },\r\n }: UserState = yield select(getUserState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { locale, country, language } = locationState.locationInfo\r\n return { locale, country, isUserLoggedIn, language }\r\n}\r\n\r\nexport function* getSessionInfo() {\r\n const {\r\n userType,\r\n loggedIn: { isUserLoggedIn },\r\n }: UserState = yield select(getUserState)\r\n return { isUserLoggedIn, userType, sessionLast: '', sessionNumber: '' }\r\n}\r\n\r\nexport function* getPhoneInfo() {\r\n const { isChoosingPhoneNumber, phoneNumber }: CheckoutState = yield select(getCheckoutState)\r\n\r\n const isLocalNumber = !!phoneNumber && !!phoneNumber.city\r\n const phoneInfo: PhoneInfo = {\r\n phoneNumberStatus: isChoosingPhoneNumber ? PHONE_NUMBER_STATUS.ENTERED : PHONE_NUMBER_STATUS.NOT_ENTERED,\r\n phoneNumberType:\r\n // eslint-disable-next-line no-nested-ternary\r\n phoneNumber ? (isLocalNumber ? PHONE_NUMBER_TYPE.LOCAL : PHONE_NUMBER_TYPE.TOLL_FREE) : undefined,\r\n }\r\n return phoneInfo\r\n}\r\n\r\nexport function* getCartInfo() {\r\n const { billingFrequency, organizers, currentVolumeDiscountPrice, selectedTierIndex }: CheckoutState = yield select(\r\n getCheckoutState\r\n )\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { existingBillingInformation, userType, existingAccountInformation }: UserState = yield select(getUserState)\r\n const { currency } = locationState.locationInfo\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const selectedAddons: Addon[] = yield call(getSelectedAddons)\r\n\r\n let tierIndex = selectedTierIndex\r\n if (userType === USER_TYPES.ADDON && existingAccountInformation && !isEmpty(existingAccountInformation)) {\r\n const existingOrganizers = existingAccountInformation.quantity\r\n const totalOrganizers = organizers + existingOrganizers\r\n tierIndex = yield call(getSelectedTierIndex, totalOrganizers, billingFrequency, selectedPlan, currency)\r\n }\r\n\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { couponProcessedDataPerSku, isCouponValidAndApplied, couponDoubleDipAmountForNewUser } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, selectedPlan)\r\n const totalCouponSavings = getCouponTotalSavings(\r\n isCouponValidAndApplied,\r\n couponProcessedDataPerSku,\r\n couponDoubleDipAmountForNewUser\r\n )\r\n\r\n return {\r\n plan: selectedPlan,\r\n addonList: selectedAddons,\r\n billingFrequency,\r\n organizers,\r\n currency,\r\n isExistingUser: !isEmpty(existingBillingInformation),\r\n tier: `Tier${tierIndex + 1}`,\r\n currentVolumeDiscountPrice,\r\n couponCode: couponServerData?.couponCode || '',\r\n couponProcessedDataPerSku,\r\n totalCouponSavings,\r\n }\r\n}\r\n\r\nexport function* getPurchaseData(transactionID: string) {\r\n const { calculatedNetTotal, calculatedTax, promoCode }: CheckoutState = yield select(getCheckoutState)\r\n const { userType }: UserState = yield select(getUserState)\r\n return { calculatedNetTotal, calculatedTax, promoCode, userType, transactionID }\r\n}\r\n\r\nexport function* getCompleteBuyData() {\r\n const { userType }: UserState = yield select(getUserState)\r\n return userType\r\n}\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { gtcTrackingActions, GTCTrackingActionTypes } from '@gtc/state/tracking/actions'\r\nimport { trackCTAClick, trackEvent, trackGenericEvent, trackGenericFormEvent } from '@common/utils'\r\nimport { PhoneInfo, PRODUCT_FAMILY_KEY, TRACKING_EVENTS } from '@common/constants'\r\nimport {\r\n trackBeginCheckout,\r\n trackCompleteBuy,\r\n trackCustomizeViewItem,\r\n trackFormError,\r\n trackPurchase,\r\n trackPurchaseError,\r\n trackSessionInfo,\r\n trackViewContent,\r\n trackUserInformation,\r\n trackEmailValidation,\r\n} from '@gtc/utils'\r\nimport { CartData, PurchaseData, CustomizeItemsData } from '@gtc/state/tracking/state'\r\nimport { CTAClickData, PageViewContentData, SessionInfo } from '@common/state/tracking/state'\r\nimport {\r\n getCartInfo,\r\n getCompleteBuyData,\r\n getCustomizeItemsData,\r\n getPageViewData,\r\n getPhoneInfo,\r\n getPurchaseData,\r\n getSessionInfo,\r\n} from './track-helpers'\r\n\r\nexport function* gtcTrackingSaga(action: ReturnType) {\r\n const { trackingInfo } = action.payload\r\n const eventName = trackingInfo.event\r\n const trackData = trackingInfo.eventData || {}\r\n\r\n const errorMessage = (trackData.errorMessage as string) || ''\r\n const formErrors = (trackData.formErrors as string[]) || ['']\r\n const formIds = (trackData.formIds as string[]) || ['']\r\n const step = (trackData.step as number) || 0\r\n const ctaClickData: CTAClickData = {\r\n name: (trackData.name as string) || '',\r\n url: (trackData.url as string) || '',\r\n }\r\n const formName = (trackData.formName as string) || ''\r\n const pathName = (trackData.currentLocation as string) || ''\r\n const invoiceNumber = (trackData.invoiceNumber as string) || ''\r\n const userEmail: string = (trackData.userEmail as string) || ''\r\n\r\n switch (eventName) {\r\n case TRACKING_EVENTS.VIEW_ITEM: {\r\n const customizeItemsData: CustomizeItemsData = yield call(getCustomizeItemsData)\r\n trackCustomizeViewItem(customizeItemsData)\r\n break\r\n }\r\n case TRACKING_EVENTS.VIEW_CONTENT: {\r\n const viewContentData: PageViewContentData = yield call(getPageViewData)\r\n trackViewContent(viewContentData, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SESSION_INFORMATION: {\r\n const sessionData: SessionInfo = yield call(getSessionInfo)\r\n trackSessionInfo(sessionData)\r\n break\r\n }\r\n case TRACKING_EVENTS.USER_INFORMATION: {\r\n const cartData: CartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackUserInformation(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.BEGIN_CHECKOUT: {\r\n const cartData: CartData = yield call(getCartInfo)\r\n const phoneInfo: PhoneInfo = yield call(getPhoneInfo)\r\n trackBeginCheckout(cartData, phoneInfo, step)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_BUY_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.G2C, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.PURCHASE: {\r\n const cartData: CartData = yield call(getCartInfo)\r\n const purchaseData: PurchaseData = yield call(getPurchaseData, invoiceNumber)\r\n const phoneInfo: PhoneInfo = yield call(getPhoneInfo)\r\n trackPurchase(cartData, purchaseData, phoneInfo)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_PURCHASE: {\r\n trackPurchaseError(errorMessage)\r\n break\r\n }\r\n case TRACKING_EVENTS.EMAIL_VALIDATION: {\r\n trackEmailValidation(formName, userEmail)\r\n break\r\n }\r\n case TRACKING_EVENTS.COMPLETE_BUY_FLOW: {\r\n const cartData: CartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackCompleteBuy(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_CONTACT_SALES_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.G2C, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.LOAD_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ABANDON_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SUBMIT_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_FORM: {\r\n trackFormError(formIds, formErrors, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.CLICK_CTA: {\r\n trackCTAClick(ctaClickData)\r\n break\r\n }\r\n default: {\r\n yield call(trackEvent, { event: eventName, eventData: trackData })\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGTCTrackingSaga() {\r\n yield takeEvery(GTCTrackingActionTypes.TRACK, gtcTrackingSaga)\r\n}\r\n\r\nexport default initializeGTCTrackingSaga\r\n","import { CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { BillingFrequencyVolumeDiscountRecords, CheckoutState } from '@gtc/state/checkout/state'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { getCheckoutState } from '@gtc/state/selectors'\r\nimport { calculateVolumeDiscount } from '@gtc/utils'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { call } from 'redux-saga-test-plan/matchers'\r\nimport { put, select, takeEvery } from 'redux-saga/effects'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nexport type CalculateVolumeDiscountSagaTriggerActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* calculateVolumeDiscountSaga(action: CalculateVolumeDiscountSagaTriggerActionType) {\r\n yield put(checkoutActions.setVolumeDiscountLoading(true))\r\n const selectedPlanSku = action.type === CheckoutActionTypes.SET_SELECTED_PLAN ? action.payload.planSku : undefined\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency: selectedCurrency = CURRENCY.USD } = locationInfo\r\n const selectedPlan: Plan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { volumeDiscount }: CheckoutState = yield select(getCheckoutState)\r\n if (selectedPlanSku) {\r\n const billingFrequencyVolumeDiscountRecords = get(volumeDiscount, [selectedPlanSku, selectedCurrency])\r\n // skip the calculation if the checkout store already has selected plan volume discount data in the required currency\r\n if (isEmpty(billingFrequencyVolumeDiscountRecords)) {\r\n const volumeDiscountForSelectedPlanAndCurrency: BillingFrequencyVolumeDiscountRecords = yield call(\r\n calculateVolumeDiscount,\r\n selectedPlan,\r\n selectedCurrency\r\n )\r\n yield put(\r\n checkoutActions.setVolumeDiscount(\r\n selectedPlan.sKU,\r\n selectedCurrency,\r\n volumeDiscountForSelectedPlanAndCurrency\r\n )\r\n )\r\n }\r\n }\r\n yield put(checkoutActions.setVolumeDiscountLoading(false))\r\n}\r\n\r\nfunction* initializeCalculateVolumeDiscount() {\r\n yield takeEvery(\r\n [CheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT, CheckoutActionTypes.SET_SELECTED_PLAN],\r\n calculateVolumeDiscountSaga\r\n )\r\n /* note: we need to add currency here, if the user can change currency,\r\n that would automatically trigger this saga to calculate the volume discount\r\n for the selected plan in that currency.\r\n */\r\n}\r\n\r\nexport default initializeCalculateVolumeDiscount\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { getCheckoutState } from '@gtc/state/selectors'\r\nimport { getSelectedTierIndex } from '@gtc/utils'\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* getSelectedTierSaga(action: ReturnType) {\r\n const { organizers } = action.payload\r\n const { billingFrequency }: CheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: Plan = yield call(getSelectedPlan)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const selectedTierIndex: number = yield call(\r\n getSelectedTierIndex,\r\n organizers,\r\n billingFrequency,\r\n selectedPlan,\r\n currency\r\n )\r\n yield put(checkoutActions.setSelectedTierIndex(selectedTierIndex, organizers))\r\n yield put(checkoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency as TimePeriod))\r\n}\r\n\r\nfunction* initializeGetSelectedTier() {\r\n yield takeLatest(CheckoutActionTypes.SET_ORGANIZERS, getSelectedTierSaga)\r\n}\r\n\r\nexport default initializeGetSelectedTier\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { CheckoutState, VolumeDiscountPerTier } from '@gtc/state/checkout/state'\r\nimport { getCheckoutState, getUserState } from '@gtc/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, take, takeLatest } from 'redux-saga/effects'\r\nimport { get, isEmpty } from 'lodash-es'\r\nimport { UserState } from '@gtc/state/user/state'\r\nimport { USER_TYPES } from '@gtc/constants'\r\nimport { initialData } from '@gtc/data/buy-form'\r\nimport { getTotalVolumeDiscount } from '@gtc/utils'\r\n\r\nfunction* getVolumeDiscountSaga(action: ReturnType) {\r\n const { userType }: UserState = yield select(getUserState)\r\n if (userType === USER_TYPES.ADDON) {\r\n const buyFormInitialData = { ...initialData, CountryCode: '' }\r\n yield put(checkoutActions.calculatePrice(buyFormInitialData, 'get volume discount saga'))\r\n } else {\r\n const { organizers, selectedTierIndex, billingFrequency } = action.payload\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const { volumeDiscount, selectedPlanSku }: CheckoutState = yield select(getCheckoutState)\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const isAnnual = billingFrequencyKey === BillingPeriod.ANNUAL\r\n const volumeDiscountPerTier: VolumeDiscountPerTier = get(volumeDiscount, [\r\n selectedPlanSku,\r\n currency,\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n\r\n if (!isEmpty(volumeDiscountPerTier)) {\r\n const { discountPricePerUnit } = volumeDiscountPerTier\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(checkoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n } else {\r\n // since the volume discount is not available, we will wait to listen for next volume\r\n // discount set action being dispatched to store and then get the data\r\n const setVolumeDiscountAction: ReturnType = yield take(\r\n CheckoutActionTypes.SET_VOLUME_DISCOUNT\r\n )\r\n const { volumeDiscountForSelectedPlanAndCurrency } = setVolumeDiscountAction.payload\r\n const volumeDiscountPerTierNow = get(volumeDiscountForSelectedPlanAndCurrency, [\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n const { discountPricePerUnit } = volumeDiscountPerTierNow\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(checkoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGetVolumeDiscountSaga() {\r\n yield takeLatest(CheckoutActionTypes.GET_VOLUME_DISCOUNT, getVolumeDiscountSaga)\r\n}\r\n\r\nexport default initializeGetVolumeDiscountSaga\r\n","import { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { getCheckoutState } from '@gtc/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* setBillingFrequencySaga(action: ReturnType) {\r\n const { frequency: billingFrequency } = action.payload\r\n const { organizers, selectedTierIndex }: CheckoutState = yield select(getCheckoutState)\r\n yield put(checkoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency))\r\n}\r\n\r\nfunction* initializeSetBillingFrequencySaga() {\r\n yield takeLatest(CheckoutActionTypes.SET_BILLING_FREQUENCY, setBillingFrequencySaga)\r\n}\r\n\r\nexport default initializeSetBillingFrequencySaga\r\n","import { CheckCouponProductsValidityParameters, CouponSkuValidity } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { CalculateCouponPriceActionPayload } from '@gtc/state/coupon-util'\r\nimport { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport {\r\n checkCouponGenericValidity,\r\n checkCouponProductsValidity,\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n} from '@gtc/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* validateCouponSaga(action: ReturnType) {\r\n const { couponValidationData, isAttemptingUrlCoupon } = action.payload\r\n const { couponServerData, selectedPlan, selectedAddons, billingFrequency } = couponValidationData\r\n const selectedPlanSku = selectedPlan.sKU\r\n const isCouponGenericValid: boolean = yield call(checkCouponGenericValidity, couponServerData as CouponServerData)\r\n if (isCouponGenericValid) {\r\n const checkProductValidityArguments: CheckCouponProductsValidityParameters = {\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }\r\n const couponSkuValidity: CouponSkuValidity = yield call(\r\n checkCouponProductsValidity,\r\n checkProductValidityArguments\r\n )\r\n const isCouponAppliedToMinimumProductsInCart: boolean = yield call(\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n couponSkuValidity\r\n )\r\n\r\n yield put(couponActions.setCouponValidAndApplied(isCouponAppliedToMinimumProductsInCart))\r\n if (isCouponAppliedToMinimumProductsInCart) {\r\n const calculateCouponPriceActionPayload: CalculateCouponPriceActionPayload = {\r\n ...couponValidationData,\r\n couponSkuValidity,\r\n }\r\n yield put(couponActions.calculateCouponPrice(calculateCouponPriceActionPayload))\r\n yield put(couponActions.setUrlCouponActive(isAttemptingUrlCoupon))\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(couponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(couponActions.resetCouponData())\r\n }\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(couponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(couponActions.resetCouponData())\r\n }\r\n}\r\n\r\nexport default function* initializeValidateCouponSaga() {\r\n yield takeLatest(CouponActionTypes.VALIDATE_COUPON, validateCouponSaga)\r\n}\r\n","import { getCouponInfo } from '@common/services'\r\nimport { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { contentActions } from '@gtc/state/content/actions'\r\nimport { CouponInfoServerResponse } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* getCouponDetailsSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n try {\r\n const couponInfoServerResponse: CouponInfoServerResponse = yield call(getCouponInfo, couponCode)\r\n if (!isEmpty(couponInfoServerResponse.data)) {\r\n const {\r\n data: { couponCode: couponServerResponseData, couponDisclaimer },\r\n } = couponInfoServerResponse\r\n if (couponServerResponseData) {\r\n yield put(couponActions.setCouponServerData(couponServerResponseData))\r\n }\r\n if (couponDisclaimer) {\r\n yield put(contentActions.setCouponDisclaimer(couponDisclaimer))\r\n }\r\n }\r\n } catch (e) {\r\n console.error('unable to get url coupon details')\r\n yield put(couponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeGetCouponDetailsSaga() {\r\n yield takeLatest(CouponActionTypes.GET_COUPON_DETAILS, getCouponDetailsSaga)\r\n}\r\n","import { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { CouponProcessedDataPerSku } from '@gtc/state/coupon/state'\r\nimport { GetProductItemsParameters, ProcessCouponDataParameters, ProductDetails } from '@gtc/state/coupon-util'\r\nimport { getCouponItemPriceMap, getProductItemsMap, processCouponData } from '@gtc/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { TimePeriod, COUPON_DISCOUNT_TYPE } from '@common/constants'\r\n\r\nfunction* calculateCouponPriceSaga(action: ReturnType) {\r\n const { couponCalculationData } = action.payload\r\n const {\r\n couponServerData,\r\n couponSkuValidity,\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n } = couponCalculationData\r\n const { couponDiscountType } = couponServerData\r\n const getProductItemsArguments: GetProductItemsParameters = {\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n }\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const productItemsMap: Map = yield call(getProductItemsMap, getProductItemsArguments)\r\n const couponItemsMap: Map = yield call(\r\n getCouponItemPriceMap,\r\n couponServerData,\r\n selectedCurrency,\r\n isAnnual\r\n )\r\n const processCouponDataArguments: ProcessCouponDataParameters = {\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n }\r\n const couponProcessedDataPerSku: CouponProcessedDataPerSku | null = yield call(\r\n processCouponData,\r\n processCouponDataArguments\r\n )\r\n if (couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE) {\r\n yield put(\r\n couponActions.checkVolumeDiscountAgainstRepriceCoupon({\r\n couponServerData,\r\n couponProcessedDataPerSku,\r\n selectedPlan,\r\n })\r\n )\r\n }\r\n yield put(couponActions.setCouponProcessedData(couponProcessedDataPerSku))\r\n}\r\n\r\nexport default function* initializeCalculateCouponPriceSaga() {\r\n yield takeLatest(CouponActionTypes.CALCULATE_COUPON_PRICE, calculateCouponPriceSaga)\r\n}\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { ValidateCouponActionPayload } from '@gtc/state/coupon-util'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { getCheckoutState, getCouponState } from '@gtc/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { getAvailableCouponServerData } from '@gtc/utils'\r\nimport { LocationActionTypes } from '@common/state/location/actions'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype PartialValidateCouponActionPayload = Omit\r\n\r\ntype ObserveValidateCouponAction =\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType // this covers both organizers and selected tier index\r\n | ReturnType\r\n | ReturnType // this action is used to only trigger the below saga and avoid going to reducer\r\n\r\ntype CouponDataActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* observeValidateCouponSaga(action: ObserveValidateCouponAction) {\r\n try {\r\n const { organizers, selectedTierIndex, selectedPlanSku, selectedAddons, billingFrequency }: CheckoutState =\r\n yield select(getCheckoutState)\r\n\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n\r\n const selectedPlan: Plan = yield call(getSelectedPlan, selectedPlanSku)\r\n const [couponServerDataFromState, isUrlCouponData]: [CouponServerData | null, boolean] = yield call(\r\n getAvailableCouponServerData,\r\n coupon,\r\n selectedPlan\r\n )\r\n\r\n const validateCouponActionPartialPayload: PartialValidateCouponActionPayload = {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlan,\r\n selectedAddons,\r\n billingFrequency: billingFrequency as TimePeriod,\r\n selectedCurrency: currency,\r\n }\r\n\r\n const isCouponDataAction =\r\n action.type === CouponActionTypes.SET_COUPON_SERVER_DATA ||\r\n action.type === CouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON\r\n\r\n if (couponServerDataFromState && !isCouponDataAction) {\r\n const validateCouponActionPayload: ValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData: couponServerDataFromState,\r\n }\r\n switch (action.type) {\r\n case CheckoutActionTypes.SET_SELECTED_PLAN: {\r\n const { planSku } = action.payload\r\n const selectedPlanByAction: Plan = yield call(getSelectedPlan, planSku)\r\n validateCouponActionPayload.selectedPlan = selectedPlanByAction\r\n break\r\n }\r\n case CheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n validateCouponActionPayload.selectedAddons = addons\r\n break\r\n }\r\n case CheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { organizers: payloadOrganizers, selectedTierIndex: payloadTierIndex } = action.payload\r\n validateCouponActionPayload.organizers = payloadOrganizers\r\n validateCouponActionPayload.selectedTierIndex = payloadTierIndex\r\n break\r\n }\r\n case CheckoutActionTypes.SET_BILLING_FREQUENCY: {\r\n const { frequency } = action.payload\r\n validateCouponActionPayload.billingFrequency = frequency\r\n break\r\n }\r\n default: {\r\n break // do nothing\r\n }\r\n }\r\n // if url coupon is available, attempt to validate the url coupon again before checking for CMS coupon\r\n yield put(couponActions.validateCoupon(validateCouponActionPayload, isUrlCouponData))\r\n } else if (isCouponDataAction) {\r\n const { payload } = action as CouponDataActionType\r\n const { couponServerData } = payload\r\n const validateCouponActionPayload: ValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData,\r\n }\r\n // isUrlCoupon should be true or false based on the action type\r\n const isUrlCoupon = action.type === CouponActionTypes.SET_COUPON_SERVER_DATA\r\n yield put(couponActions.validateCoupon(validateCouponActionPayload, isUrlCoupon))\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n}\r\n\r\nexport default function* initializeObserveValidateCouponSaga() {\r\n yield takeLatest(\r\n [\r\n CouponActionTypes.SET_COUPON_SERVER_DATA,\r\n CheckoutActionTypes.SET_SELECTED_PLAN,\r\n CheckoutActionTypes.SET_ORGANIZERS,\r\n CheckoutActionTypes.SET_SELECTED_ADDONS,\r\n CheckoutActionTypes.SET_BILLING_FREQUENCY,\r\n CheckoutActionTypes.SET_SELECTED_TIER_INDEX,\r\n CouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON,\r\n LocationActionTypes.SET_IS_LOCATION_INFO_LOADED,\r\n ],\r\n observeValidateCouponSaga\r\n )\r\n}\r\n","import { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* attempUrlCouponSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n if (couponCode) {\r\n // if url promotion available\r\n yield put(couponActions.getCouponDetails(couponCode as string))\r\n } else {\r\n yield put(couponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeAttempUrlCouponSaga() {\r\n yield takeLatest(CouponActionTypes.SET_URL_COUPON_CODE, attempUrlCouponSaga)\r\n}\r\n","import { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* checkCMSCouponSaga(action: ReturnType) {\r\n // clear out previous coupon processed data\r\n yield put(couponActions.resetCouponData())\r\n const { selectedPlanSku } = action.payload\r\n const selectedPlan: Plan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { activeCoupon } = selectedPlan\r\n if (activeCoupon && !isEmpty(activeCoupon)) {\r\n // apply the cms coupon only if cms coupon is available\r\n yield put(couponActions.observeValidateCMSCoupon(activeCoupon))\r\n }\r\n}\r\n\r\nexport default function* initialCheckCMSCouponSaga() {\r\n yield takeLatest(CouponActionTypes.CHECK_CMS_COUPON, checkCMSCouponSaga)\r\n}\r\n","import { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\nimport { call, select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState, getCouponState } from '@gtc/state/selectors'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { COUPON_DISCOUNT_TYPE } from '@common/constants'\r\nimport { getActiveCouponServerData } from '@gtc/utils'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype CheckVolumeDiscountAction =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* checkVolumeDiscountAgainstRepriceCouponSaga(action: CheckVolumeDiscountAction) {\r\n const coupon: CouponState = yield select(getCouponState)\r\n const { selectedPlanSku }: CheckoutState = yield select(getCheckoutState)\r\n let { couponProcessedDataPerSku } = coupon\r\n let volumeDiscountPrice = 0\r\n let selectedPlan: Plan = yield call(getSelectedPlan, selectedPlanSku)\r\n let couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n\r\n if (action.type === CheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE) {\r\n volumeDiscountPrice = action.payload.currentVolumeDiscountPrice\r\n } else if (action.type === CouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON) {\r\n const { checkVolumeDiscountData } = action.payload\r\n couponServerData = checkVolumeDiscountData.couponServerData\r\n couponProcessedDataPerSku = checkVolumeDiscountData.couponProcessedDataPerSku\r\n selectedPlan = checkVolumeDiscountData.selectedPlan\r\n const { currentVolumeDiscountPrice }: CheckoutState = yield select(getCheckoutState)\r\n volumeDiscountPrice = currentVolumeDiscountPrice\r\n }\r\n\r\n if (\r\n couponServerData &&\r\n !isEmpty(couponServerData) &&\r\n couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE\r\n ) {\r\n const couponDiscountTotalSavings: number = get(\r\n couponProcessedDataPerSku,\r\n [selectedPlan.sKU, 'discountTotalSavings'],\r\n 0\r\n )\r\n if (volumeDiscountPrice < couponDiscountTotalSavings) {\r\n yield put(checkoutActions.adjustCurrentVolumeDiscountForRepriceCoupon())\r\n }\r\n }\r\n}\r\n\r\nexport default function* initializeCheckVolumeDiscountAgainstRepriceCouponSaga() {\r\n yield takeLatest(\r\n [\r\n CouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON,\r\n CheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE,\r\n ],\r\n checkVolumeDiscountAgainstRepriceCouponSaga\r\n )\r\n}\r\n","import { couponActions, CouponActionTypes } from '@gtc/state/coupon/actions'\r\nimport { put, takeLatest, take } from 'redux-saga/effects'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState } from '@gtc/state/selectors'\r\nimport { CheckoutState } from '@gtc/state/checkout/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\n\r\nfunction* attemptCMSCouponSaga() {\r\n // check if there's a coupon available from CMS\r\n let { selectedPlanSku }: CheckoutState = yield select(getCheckoutState)\r\n if (isEmpty(selectedPlanSku)) {\r\n const selectedPlanAction: ReturnType = yield take(\r\n CheckoutActionTypes.SET_SELECTED_PLAN\r\n )\r\n selectedPlanSku = selectedPlanAction.payload.planSku\r\n }\r\n yield put(couponActions.checkCMSCoupon(selectedPlanSku))\r\n}\r\n\r\nexport default function* initializeAttemptCMSCouponSaga() {\r\n yield takeLatest(CouponActionTypes.ATTEMPT_FOR_CMS_COUPON, attemptCMSCouponSaga)\r\n}\r\n","import { checkoutActions, CheckoutActionTypes } from '@gtc/state/checkout/actions'\r\nimport { getCheckoutState } from '@gtc/state/selectors'\r\nimport { call, put, select, takeEvery } from 'redux-saga/effects'\r\nimport { deleteReservation, reservePhoneNumber } from './reserve-phone-number-helpers'\r\n\r\nfunction* reservePhoneNumberSaga(action: ReturnType) {\r\n const { phoneNumberReservationId } = yield select(getCheckoutState)\r\n const { phoneNumber, vanityPhrase } = action.payload\r\n\r\n yield put(checkoutActions.setReservingPhoneNumber(true))\r\n\r\n // release previous selection (if the user changed their mind and chooses a different number)\r\n if (phoneNumberReservationId) {\r\n yield call(deleteReservation, phoneNumberReservationId)\r\n }\r\n\r\n // reserve selected phone number\r\n yield call(reservePhoneNumber, phoneNumber, vanityPhrase)\r\n\r\n yield put(checkoutActions.setReservingPhoneNumber(false))\r\n}\r\n\r\nfunction* initializeReservePhoneNumberSaga() {\r\n yield takeEvery(CheckoutActionTypes.RESERVE_PHONE_NUMBER, reservePhoneNumberSaga)\r\n}\r\n\r\nexport default initializeReservePhoneNumberSaga\r\n","import initializeLoadContentSaga from './content/load-content'\r\nimport initializeSubmitFormSaga from './checkout-form/form-submission'\r\nimport initializeAbandonedCartSaga from './user/abandoned-cart'\r\nimport initializeExistingUserSaga from './user/existing-user'\r\nimport initializeCreateUserSaga from './user/create-user'\r\nimport initializeGetAccessToken from './user/get-token'\r\nimport initializeLogin from './user/login'\r\nimport initializeLogout from './user/logout'\r\nimport initializeLoadSavedStateSaga from './saved-state/saved-state'\r\nimport initializeCalculatePriceSaga from './checkout-form/calculate-price'\r\nimport initializeCreateBillingInfoSaga from './checkout-form/create-billing-info'\r\nimport initializeCreatePaymentSaga from './checkout-form/create-payment'\r\nimport initializeGetPaymentMethodSaga from './checkout-form/get-payment-methods'\r\nimport initializeSubmitPaymentSaga from './checkout-form/submit-payment'\r\nimport initializeUserLoggedInSaga from './user/user-logged-in'\r\nimport initializeExistingUserSubmitFormSaga from './checkout-form/existing-user-form-submission'\r\nimport initializeResetCheckoutFormAffectedStatesSaga from './checkout-form/reset-checkout-form-affected-states'\r\nimport initializeGTCTrackingSaga from './tracking/track-event'\r\nimport initializeCalculateVolumeDiscountSaga from './checkout-form/calculate-volume-discount'\r\nimport initializeGetSelectedTier from './checkout-form/get-selected-tier'\r\nimport initializeGetVolumeDiscountSaga from './checkout-form/get-volume-discount'\r\nimport initializeSetBillingFrequencySaga from './checkout-form/set-billing-frequency'\r\nimport initializeValidateCouponSaga from './coupon/validate-coupon'\r\nimport initializeGetCouponDetailsSaga from './coupon/get-coupon-details'\r\nimport initializeCalculateCouponPriceSaga from './coupon/calculate-coupon-price'\r\nimport initializeObserveValidateCouponSaga from './coupon/observe-validate-coupon'\r\nimport initializeAttempUrlCouponSaga from './coupon/attempt-url-coupon'\r\nimport initialCheckCMSCouponSaga from './coupon/check-cms-coupon'\r\nimport initializeCheckVolumeDiscountAgainstRepriceCouponSaga from './coupon/check-volume-discount-against-reprice-coupon'\r\nimport initializeAttemptCMSCouponSaga from './coupon/attempt-cms-coupon'\r\nimport initializeReservePhoneNumberSaga from './number-picker/reserve-phone-number'\r\n\r\nexport const gtcSagas = {\r\n gtccontentSaga: initializeLoadContentSaga,\r\n gtcsubmitFormSaga: initializeSubmitFormSaga,\r\n gtcabandonedCartSaga: initializeAbandonedCartSaga,\r\n gtcexistingUserSaga: initializeExistingUserSaga,\r\n gtcgetAccessToken: initializeGetAccessToken,\r\n gtcuserLoginSaga: initializeLogin,\r\n gtcuserLogoutSaga: initializeLogout,\r\n gtccreateUserSaga: initializeCreateUserSaga,\r\n gtccalculatePriceSaga: initializeCalculatePriceSaga,\r\n gtccreateBillingInfoSaga: initializeCreateBillingInfoSaga,\r\n gtccreatePaymentSaga: initializeCreatePaymentSaga,\r\n gtcgetPaymentSaga: initializeGetPaymentMethodSaga,\r\n gtcsubmitPaymentSaga: initializeSubmitPaymentSaga,\r\n gtcloadSavedStateSaga: initializeLoadSavedStateSaga,\r\n gtcuserLoggedInSaga: initializeUserLoggedInSaga,\r\n gtcexistingUserSubmitFormSaga: initializeExistingUserSubmitFormSaga,\r\n gtcresetCheckoutFormAffectedStates: initializeResetCheckoutFormAffectedStatesSaga,\r\n gtcTrackingSaga: initializeGTCTrackingSaga,\r\n gtccalculateVolumeDiscountSaga: initializeCalculateVolumeDiscountSaga,\r\n gtcgetVolumeDiscountSaga: initializeGetVolumeDiscountSaga,\r\n gtcgetSelectedTierSaga: initializeGetSelectedTier,\r\n gtcsetBillingFrequencySaga: initializeSetBillingFrequencySaga,\r\n gtcvalidateCouponSaga: initializeValidateCouponSaga,\r\n gtcgetCouponDetailsSaga: initializeGetCouponDetailsSaga,\r\n gtccalculateCouponPriceSaga: initializeCalculateCouponPriceSaga,\r\n gtcobserveValidateCouponSaga: initializeObserveValidateCouponSaga,\r\n gtcattemptUrlCouponSaga: initializeAttempUrlCouponSaga,\r\n gtcheckCMSCouponSaga: initialCheckCMSCouponSaga,\r\n gtccheckVolumeDiscountAgainstRepriceCouponSaga: initializeCheckVolumeDiscountAgainstRepriceCouponSaga,\r\n gtcattemptCMSCouponSaga: initializeAttemptCMSCouponSaga,\r\n gtcreservePhoneNumberSaga: initializeReservePhoneNumberSaga,\r\n}\r\nexport default gtcSagas\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport gtreServices from '@gtresolve/services'\r\nimport { contentActions, ResolveContentActionTypes } from '@gtresolve/state/content/actions'\r\n\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport commonServices from '@common/services'\r\nimport { SC_SITE, PRODUCT_SKU, FEATURE_FLAGS } from '@common/constants'\r\n\r\nfunction* loadContentSaga() {\r\n try {\r\n const labelServerResponse: GenericResponse = yield call(gtreServices.getResolveLabelData)\r\n if (labelServerResponse && labelServerResponse.data) {\r\n const featureFlags: { data: { flags: string[] } } = yield call(\r\n commonServices.getFeatureFlags,\r\n SC_SITE.RESOLVE\r\n )\r\n const useNewResolveSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.RESOLVE_USE_NEW_SKUS)\r\n const { labels, plans, ...content } = labelServerResponse.data\r\n const { sEOPageTitle } = labels\r\n yield call(() => {\r\n if (sEOPageTitle) document.title = sEOPageTitle\r\n })\r\n locationActions.getLocationInfo()\r\n yield put(\r\n contentActions.setContent(\r\n content,\r\n { ...labels },\r\n plans.filter((plan: { sKU: PRODUCT_SKU }) =>\r\n useNewResolveSkus\r\n ? [\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2,\r\n PRODUCT_SKU.GTR_STANDARD_NAMED_V2,\r\n PRODUCT_SKU.GTR_REMOTE_ACCESS,\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS,\r\n ].includes(plan.sKU)\r\n : [PRODUCT_SKU.G2RE_BASIC_NAMED, PRODUCT_SKU.G2RE_STANDARD_NAME].includes(plan.sKU)\r\n ),\r\n plans\r\n )\r\n )\r\n yield put(contentActions.setContentLoaded(true))\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeGTResolveLoadContentSaga() {\r\n yield takeEvery(ResolveContentActionTypes.GET_LABEL_CONTENT, loadContentSaga)\r\n}\r\n\r\nexport default initializeGTResolveLoadContentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport gtreServices from '@gtresolve/services'\r\nimport { ResolveUserAccountType } from '@gtresolve/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createUserSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const userCreationResponse: GenericResponse = yield call(gtreServices.createUserAccount, userValues)\r\n if (userCreationResponse.data) {\r\n const userData: ResolveUserAccountType = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserSaga() {\r\n yield takeEvery(ResolveUserActionTypes.CREATE_NEW_USER, createUserSaga)\r\n}\r\n\r\nexport default initializeCreateUserSaga\r\n","import { ResolveBillingInfoDataType } from '@gtresolve/state/checkout/state'\r\nimport { ResolveBuyFormData } from '@gtresolve/state/buy-form/state'\r\n\r\nexport const getBillingValues = (values: ResolveBuyFormData) => {\r\n const billingValues: ResolveBillingInfoDataType = {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n postalCode: values.ZipCode,\r\n firstName: values.BillingFirstName,\r\n lastName: values.BillingLastName,\r\n email: values.Email,\r\n companyName: values.CompanyName,\r\n phoneNumber: '',\r\n taxNumber: values.TaxNumber,\r\n federalTaxType: values.TaxType,\r\n }\r\n return billingValues\r\n}\r\n","import { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { getCheckoutState, getPlanData } from '@gtresolve/state/selectors'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { select, call, SelectEffect, CallEffect } from 'redux-saga/effects'\r\nimport { getCurrentPlan, getPlanNameSet } from '@gtresolve/utils/get-current-plan'\r\nimport { getCurrentAddons } from '@gtresolve/utils/get-current-addons'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { UrlParams, updatePlanUrlParam } from '@common/utils'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport function* getSelectedPlan(\r\n planSku?: string\r\n): Generator {\r\n const { selectedPlanSku }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const planSkuToRetrieve = planSku || selectedPlanSku\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const selectedPlan: ResolvePlan = getCurrentPlan(planSkuToRetrieve, planData)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport function* getSelectedAddons(): Generator<\r\n SelectEffect | CallEffect | CallEffect,\r\n ResolveAddon[],\r\n ResolveCheckoutState & ResolvePlan & ResolveAddon[]\r\n> {\r\n const { selectedAddons }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const myAddons: ResolveAddon[] = yield call(getCurrentAddons, selectedAddons, selectedPlan)\r\n return myAddons\r\n}\r\n\r\nexport function* getUpdatedPlanUrlParams() {\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const planNameSet: Set = yield call(getPlanNameSet, planData)\r\n const planUrlParams: UrlParams = yield call(\r\n updatePlanUrlParam,\r\n isEmpty(selectedPlan) ? '' : selectedPlan.name,\r\n planNameSet\r\n )\r\n return planUrlParams\r\n}\r\n","import { call, put, select, debounce } from 'redux-saga/effects'\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport { submitAbandonedCart } from '@gtresolve/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { COOKIE_NAMES, LANGUAGE_CODES } from '@common/constants'\r\nimport Cookies from 'js-cookie'\r\nimport { getCheckoutState, getUserState } from '@gtresolve/state/selectors'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { ResolveAbandonedCartPayload, ResolveUserState } from '@gtresolve/state/user/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { sanitizePayload } from '@common/utils/aws-utils'\r\n\r\nexport function* abandonedCartSaga(action: ReturnType) {\r\n const { isTrial, email, success, form } = action.payload.abandonedCartData\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const urlSplitForLanguage = window.location.pathname.split('/')[1]\r\n const isValidLanguageCode = Object.values(LANGUAGE_CODES).includes(urlSplitForLanguage)\r\n const siteLanguage = isValidLanguageCode ? urlSplitForLanguage : LANGUAGE_CODES.English\r\n const data: ResolveAbandonedCartPayload = {\r\n success: success.toString(),\r\n email,\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n country: locationInfo?.country,\r\n language: siteLanguage,\r\n program: null,\r\n firstName: null,\r\n lastName: null,\r\n plan: null,\r\n }\r\n\r\n if (isTrial && !success) {\r\n data.firstName = form?.firstName\r\n data.lastName = form?.lastName\r\n }\r\n\r\n if (!isTrial && !success) {\r\n const { existingUserInformation }: ResolveUserState = yield select(getUserState)\r\n const { selectedPlanSku }: ResolveCheckoutState = yield select(getCheckoutState)\r\n data.plan = selectedPlanSku\r\n data.firstName = form?.firstName || existingUserInformation?.Name?.GivenName\r\n data.lastName = form?.lastName || existingUserInformation?.Name?.FamilyName\r\n data.program = 'GTRe_Global_EN_TRG_Lead_Promo_Abandoned Cart'\r\n }\r\n\r\n try {\r\n // yield delay(1000)\r\n yield call(submitAbandonedCart, sanitizePayload(data))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to post abandoned email api' }))\r\n }\r\n}\r\n\r\nfunction* initializeAbandonedCartSaga() {\r\n yield debounce(1000, ResolveUserActionTypes.SUBMIT_ABANDONED_CART, abandonedCartSaga)\r\n}\r\n\r\nexport default initializeAbandonedCartSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport gtreServices from '@gtresolve/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createBillingInfoSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.CREATE_BILLING_INFO_SAGA\r\n try {\r\n const { billingValues } = action.payload\r\n const billingResponse: GenericResponse = yield call(gtreServices.createBillingInfo, billingValues)\r\n if (billingResponse.status === 200 || billingResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save billing info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save billing info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreateBillingInfoSaga() {\r\n yield takeEvery(ResolveCheckoutActionTypes.CREATE_BILLING_INFO, createBillingInfoSaga)\r\n}\r\n\r\nexport default initializeCreateBillingInfoSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { submitPayment } from '@gtresolve/services'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* submitPaymentSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.SUBMIT_PAYMENT_SAGA\r\n try {\r\n const { submitValues } = action.payload\r\n const submitCreation: GenericResponse = yield call(submitPayment, submitValues)\r\n if (submitCreation && submitCreation.data) {\r\n return submitCreation.data\r\n }\r\n } catch {\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'failed to submit payment',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'failed to submit payment',\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeSubmitPaymentSaga() {\r\n yield takeEvery(ResolveCheckoutActionTypes.SUBMIT_PAYMENT, submitPaymentSaga)\r\n}\r\n\r\nexport default initializeSubmitPaymentSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport commonServices from '@gtresolve/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { ResolveSubmitWithCardAddResponse } from '@gtresolve/state/checkout/state'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\n\r\nexport function* createAndSubmitPaymentSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n try {\r\n const { submitValues } = action.payload\r\n const createAndSubmitPaymentResponse: ResolveSubmitWithCardAddResponse = yield call(\r\n commonServices.submitPaymentWithCardAdd,\r\n submitValues\r\n )\r\n if (createAndSubmitPaymentResponse.status === 200 || createAndSubmitPaymentResponse.status === 204) {\r\n return createAndSubmitPaymentResponse.data\r\n }\r\n } catch {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n trackErrorMessage: 'failed to save payment info',\r\n })\r\n )\r\n }\r\n return undefined\r\n}\r\n\r\nfunction* initializeCreateAndSubmitPaymentSaga() {\r\n yield takeEvery(ResolveCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, createAndSubmitPaymentSaga)\r\n}\r\n\r\nexport default initializeCreateAndSubmitPaymentSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { resolveBuyFormActions, ResolveBuyFormActionTypes } from '@gtresolve/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { resolveUserActions } from '@gtresolve/state/user/actions'\r\nimport { resolveCheckoutActions } from '@gtresolve/state/checkout/actions'\r\nimport {\r\n ResolveUserDataType,\r\n ResolveUserState,\r\n ResolveUserAccountType,\r\n ResolveAbandonedCartDataType,\r\n} from '@gtresolve/state/user/state'\r\nimport {\r\n ResolveBillingInfoDataType,\r\n ResolveCreditCardDataType,\r\n ResolveCheckoutState,\r\n ResolveSubmitWithCardAddDataType,\r\n ResolveSubmitWithCardAddData,\r\n} from '@gtresolve/state/checkout/state'\r\nimport { createTokenSaga } from '@common/sagas/flex/create-flex-token'\r\nimport { createUserSaga } from '@gtresolve/saga/user/create-user'\r\nimport { getBillingValues } from '@gtresolve/utils/get-billing-values'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtresolve/saga/content/content-helpers'\r\nimport { getPaymentItems } from '@gtresolve/utils/get-item-values'\r\nimport {\r\n getBuyFormState,\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getUserState,\r\n getPlanData,\r\n} from '@gtresolve/state/selectors'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, RESOLVE_TRACKING_COMPONENTS, RESOLVE_USER_TYPES } from '@gtresolve/constants'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { ResolveContentData } from '@gtresolve/state/content-data'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { PRODUCTS, TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { clearState, getActiveCouponServerData, getSubscriptionInfo } from '@gtresolve/utils'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolveBuyFormState } from '@gtresolve/state/buy-form/state'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { FatalErrorMessageType, FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { ResolveSubmitPaymentResponseData } from '@gtresolve/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@gtresolve/saga/user/abandoned-cart'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { createAndSubmitPaymentSaga } from './create-and-submit-payment'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n ExpirationDate,\r\n CompanyName,\r\n } = action.payload.values\r\n const checkout: ResolveCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingUserInformation }: ResolveUserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { fingerprint, keyInfo, isCardinalSetupComplete }: FlexState = yield select(getFlexState)\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: ResolveContentData =\r\n yield select(getContentData)\r\n const buyFormState: ResolveBuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === RESOLVE_USER_TYPES.TRIALER ||\r\n userType === RESOLVE_USER_TYPES.EXPIRED ||\r\n userType === RESOLVE_USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const selectedAddons: ResolveAddon[] = yield call(getSelectedAddons)\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n const errorMessage: FatalErrorMessageType = {\r\n trackErrorMessage: 'regular form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n }\r\n\r\n try {\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const billingValues: ResolveBillingInfoDataType = getBillingValues(action.payload.values)\r\n const subscriptionInfo = getSubscriptionInfo(TimePeriod.Month, selectedPlan, planData)\r\n const items = getPaymentItems(selectedPlan, 1, checkout.billingFrequency, selectedAddons, subscriptionInfo)\r\n\r\n const userValues: ResolveUserDataType = {\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n country: billingValues.country,\r\n fingerPrintSessionId: fingerprint,\r\n productName: PRODUCTS.RESOLVE,\r\n }\r\n // #region Get flex token\r\n const flexTokenAction = flexActions.createToken(ExpirationDate)\r\n const tokenData: string = yield call(createTokenSaga, flexTokenAction)\r\n if (tokenData) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = true\r\n } else {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create flex token' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n // if Cardinal script is not set up by now, this indicates setup went wrong. Throw fatal error\r\n if (isScaEnabledForMid && !isCardinalSetupComplete) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = false\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n // #endregion\r\n\r\n // #region trigger Cardinal bin.process. Necessary for PSD2 flow.\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const { token }: FlexState = yield select(getFlexState)\r\n const mask = token?.data?.number\r\n if (isScaEnabledForMid && mask) {\r\n const maskCardBin = mask.slice(0, 6)\r\n const { Status } = yield Cardinal.trigger('bin.process', maskCardBin)\r\n if (Status) {\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n } else {\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n } else {\r\n // Bypass if SCA is not enabled.\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n }\r\n\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n let userKey = ''\r\n let accountKey = ''\r\n\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n const createUserAction = resolveUserActions.createNewUser(userValues)\r\n const userData: ResolveUserAccountType = yield call(createUserSaga, createUserAction)\r\n if (userData) {\r\n userKey = userData.UserKey\r\n accountKey = userData.BillingId\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(resolveCheckoutActions.setAutoLogin(userData.xAutoLoginTicket))\r\n }\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n } else {\r\n // existing user\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n }\r\n // #endregion\r\n\r\n // #region Save billing info\r\n if (\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] &&\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] &&\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n ) {\r\n const extraBillingValues = { ...billingValues }\r\n extraBillingValues.phoneNumber = ContactPhone\r\n\r\n const createBillingInfoAction = resolveCheckoutActions.createBillingInfo(extraBillingValues)\r\n const savedBillingData: boolean = yield call(createBillingInfoSaga, createBillingInfoAction)\r\n if (savedBillingData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n }\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region intialialize BOSS variables\r\n let paymentMethodKey = ''\r\n let paymentKey = ''\r\n const flexFormData: ResolveCreditCardDataType = {\r\n expirationMonth: ExpirationDate.substr(0, 2),\r\n expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n flexResponse: tokenData,\r\n flexKeyId: keyInfo.flexKey.keyId,\r\n firstName,\r\n lastName,\r\n email,\r\n }\r\n // //#endregion\r\n\r\n // #region process purchase - 1st purchase call - create and save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const submitValues: ResolveSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n }\r\n\r\n const createAndSubmitPaymentAction = resolveCheckoutActions.createAndSubmitPayment(submitValues)\r\n const createAndSubmitPaymentData: ResolveSubmitWithCardAddData = yield call(\r\n createAndSubmitPaymentSaga,\r\n createAndSubmitPaymentAction\r\n )\r\n let isChallengeRequired = false\r\n if (createAndSubmitPaymentData) {\r\n isChallengeRequired = (createAndSubmitPaymentData.isScaRequired && isScaEnabledForMid) || false\r\n paymentMethodKey = createAndSubmitPaymentData?.paymentMethodKey\r\n paymentKey = createAndSubmitPaymentData?.paymentKey\r\n }\r\n\r\n const payerAuthEnrollment = createAndSubmitPaymentData?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (createAndSubmitPaymentData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.PURCHASE,\r\n eventData: { invoiceNumber: createAndSubmitPaymentData.invoiceNumber },\r\n },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: ResolveSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: true,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = resolveCheckoutActions.submitPayment(submitValues)\r\n const submitData: ResolveSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n resolveTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: ResolveAbandonedCartDataType = {\r\n email,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = resolveUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(resolveUserActions.setDisplayName(firstName))\r\n yield put(\r\n resolveTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentName\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n CompanyName,\r\n })\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(resolveCheckoutActions.setPurchaseComplete(true))\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(ResolveBuyFormActionTypes.SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport commonServices, { EmailType, EmailCheckResponse } from '@common/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { resolveBuyFormActions } from '@gtresolve/state/buy-form/actions'\r\n\r\nexport function* existingUserSaga(action: ReturnType) {\r\n const data: EmailType = { emailAddress: action.payload.email.toLowerCase() }\r\n try {\r\n const response: EmailCheckResponse = yield call(commonServices.canUserAuthenticate, data)\r\n if (response && response.data) {\r\n if (response.data.canUserAuthenticate) {\r\n yield put(resolveBuyFormActions.setClearEmail(true))\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to verify email' }))\r\n return false\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeExistingUserSaga() {\r\n yield takeEvery(ResolveUserActionTypes.CHECK_EXISTING_USER, existingUserSaga)\r\n}\r\n\r\nexport default initializeExistingUserSaga\r\n","import { takeLatest, put, call } from 'redux-saga/effects'\r\n\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport authClass from '@common/utils/auth-class'\r\nimport { saveToken, appInsightsTrackEvent } from '@common/utils'\r\nimport commonServices from '@common/services'\r\nimport { Token } from '@getgo/auth-client'\r\n\r\nfunction* getAccessToken() {\r\n try {\r\n yield put(resolveUserActions.setVerifyingToken(true))\r\n const newAccessToken: Token | undefined = yield call(authClass.authInit)\r\n // if new token save it\r\n if (newAccessToken) {\r\n yield put(resolveUserActions.setAccessToken(newAccessToken))\r\n yield call(saveToken, newAccessToken)\r\n } else {\r\n try {\r\n yield call(commonServices.clearUserSession)\r\n } catch (e: any) {\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n }\r\n yield put(resolveUserActions.setIsUserLoggedIn(!!newAccessToken))\r\n // to check if this action ran\r\n yield put(resolveUserActions.setVerifyShouldUserLogIn(true))\r\n yield put(resolveUserActions.setVerifyingToken(false))\r\n } catch (e: any) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get access token' }))\r\n yield put(resolveUserActions.setVerifyingToken(false))\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n}\r\n\r\nfunction* initializeGetAccessToken() {\r\n yield takeLatest(ResolveUserActionTypes.GET_ACCESS_TOKEN, getAccessToken)\r\n}\r\n\r\nexport default initializeGetAccessToken\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport authClass from '@common/utils/auth-class'\r\n\r\nfunction* userLogin(action: ReturnType) {\r\n try {\r\n const pathname = action.payload.pathname || window.location.pathname\r\n const search = action.payload.search || window.location.search\r\n const sso = action.payload.sso || false\r\n yield call(authClass.login, pathname, search, sso)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogin() {\r\n yield takeEvery(ResolveUserActionTypes.USER_LOGIN, userLogin)\r\n}\r\n\r\nexport default initializeLogin\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport { logout } from '@common/utils'\r\n\r\nfunction* userLogout() {\r\n try {\r\n const { pathname, search } = window.location\r\n yield call(logout, pathname, search)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogout() {\r\n yield takeEvery(ResolveUserActionTypes.USER_LOGOUT, userLogout)\r\n}\r\n\r\nexport default initializeLogout\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport {\r\n ResolveCalculateCouponPriceActionPayload,\r\n ResolveCheckVolumeDiscountAgainstRepriceCouponActionPayload,\r\n ResolveValidateCouponActionPayload,\r\n} from '../coupon-util'\r\nimport { ResolveCouponProcessedDataPerSku } from './state'\r\n\r\nexport enum ResolveCouponActionTypes {\r\n SET_APPLY_COUPON_ATTEMPT_MADE = '[resolve-coupon-actions] check-apply-coupon-attempt-made',\r\n GET_COUPON_DETAILS = '[resolve-coupon-actions] get-coupon-details',\r\n CALCULATE_COUPON_PRICE = '[resolve-coupon-actions] calculate-coupon-price',\r\n VALIDATE_COUPON = '[resolve-coupon-actions] validate-coupon',\r\n SET_COUPON_PROCESSED_DATA = '[resolve-coupon-actions] set-coupon-processed-data',\r\n SET_COUPON_SERVER_DATA = '[resolve-coupon-actions] set-coupon-server-data',\r\n CHECK_CMS_COUPON = '[resolve-coupon-actions] check-cms-coupon',\r\n RESET_COUPON_DATA = '[resolve-coupon-actions] reset-coupon-data',\r\n SET_COUPON_VALID_AND_APPLIED = '[resolve-coupon-actions] set-coupon-valid-and-applied',\r\n SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER = '[resolve-coupon-actions] set-coupon-double-dip-amount-for-new-user',\r\n SET_URL_COUPON_ACTIVE = '[resolve-coupon-actions] set-url-coupon-active',\r\n OBSERVE_VALIDATE_CMS_COUPON = '[resolve-coupon-actions] observe-validate-cms-coupon',\r\n CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON = '[resolve-coupon-actions] check-volume-discount-against-reprice-coupon',\r\n ATTEMPT_FOR_CMS_COUPON = '[resolve-coupon-actions] attempt-for-cms-coupon',\r\n SET_URL_COUPON_CODE = '[resolve-coupon-actions] set-url-coupon-code',\r\n}\r\n\r\nexport const resolveCouponActions = {\r\n getCouponDetails: (couponCode: string) => createAction(ResolveCouponActionTypes.GET_COUPON_DETAILS, { couponCode }),\r\n validateCoupon: (couponValidationData: ResolveValidateCouponActionPayload, isAttemptingUrlCoupon: boolean) =>\r\n createAction(ResolveCouponActionTypes.VALIDATE_COUPON, { couponValidationData, isAttemptingUrlCoupon }),\r\n calculateCouponPrice: (couponCalculationData: ResolveCalculateCouponPriceActionPayload) =>\r\n createAction(ResolveCouponActionTypes.CALCULATE_COUPON_PRICE, { couponCalculationData }),\r\n setCouponProcessedData: (couponProcessedDataPerSku: ResolveCouponProcessedDataPerSku | null) =>\r\n createAction(ResolveCouponActionTypes.SET_COUPON_PROCESSED_DATA, { couponProcessedDataPerSku }),\r\n setCouponServerData: (couponServerData: CouponServerData) =>\r\n createAction(ResolveCouponActionTypes.SET_COUPON_SERVER_DATA, { couponServerData }),\r\n checkCMSCoupon: (selectedPlanSku: string) =>\r\n createAction(ResolveCouponActionTypes.CHECK_CMS_COUPON, { selectedPlanSku }),\r\n resetCouponData: () => createAction(ResolveCouponActionTypes.RESET_COUPON_DATA),\r\n setCouponValidAndApplied: (isCouponValidAndApplied: boolean) =>\r\n createAction(ResolveCouponActionTypes.SET_COUPON_VALID_AND_APPLIED, { isCouponValidAndApplied }),\r\n setCouponDoubleDipAmountForNewUser: (couponDoubleDipAmountForNewUser: number) =>\r\n createAction(ResolveCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER, {\r\n couponDoubleDipAmountForNewUser,\r\n }),\r\n setUrlCouponActive: (isUrlCouponActive: boolean) =>\r\n createAction(ResolveCouponActionTypes.SET_URL_COUPON_ACTIVE, { isUrlCouponActive }),\r\n observeValidateCMSCoupon: (couponServerData: CouponServerData) =>\r\n createAction(ResolveCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON, { couponServerData }),\r\n checkVolumeDiscountAgainstRepriceCoupon: (\r\n checkVolumeDiscountData: ResolveCheckVolumeDiscountAgainstRepriceCouponActionPayload\r\n ) =>\r\n createAction(ResolveCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON, {\r\n checkVolumeDiscountData,\r\n }),\r\n attemptForCMSCoupon: () => createAction(ResolveCouponActionTypes.ATTEMPT_FOR_CMS_COUPON),\r\n setUrlCouponCode: (couponCode: string) =>\r\n createAction(ResolveCouponActionTypes.SET_URL_COUPON_CODE, { couponCode }),\r\n}\r\n\r\nexport type ResolveCouponActions = ActionUnion\r\n","import { select, put, takeLeading, call } from 'redux-saga/effects'\r\nimport queryString from 'query-string'\r\nimport { loadSessionState, loadState } from '@gtresolve/utils'\r\nimport { ResolveCheckoutActionTypes, resolveCheckoutActions } from '@gtresolve/state/checkout/actions'\r\nimport { getCheckoutState, getPlanData } from '@gtresolve/state/selectors'\r\nimport { getSelectedPlan } from '@gtresolve/saga/content/content-helpers'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { TimePeriod, SC_SITE, FEATURE_FLAGS } from '@common/constants'\r\nimport { ResolveCheckoutState, ResolveSavedSessionState, ResolveSavedStoreState } from '@gtresolve/state/checkout/state'\r\nimport { getCurrentAddons } from '@gtresolve/utils/get-current-addons'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { resolveCouponActions } from '@gtresolve/state/coupon/actions'\r\nimport { contentActions } from '@common/state/content/actions'\r\nimport { ADDONS } from '@gtresolve/constants'\r\nimport commonServices from '@common/services'\r\n\r\nfunction* loadSavedStateSaga(action: ReturnType) {\r\n try {\r\n const savedState: ResolveSavedStoreState | undefined = yield call(loadState)\r\n const savedSessionState: ResolveSavedSessionState | undefined = yield call(loadSessionState)\r\n const checkout: ResolveCheckoutState = yield select(getCheckoutState)\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const { urlPlan } = action.payload\r\n const {\r\n billingFrequency: queryBillingFrequency,\r\n minUsers,\r\n couponCode: queryCouponCode,\r\n } = queryString.parse(window.location.search)\r\n // grab url param for billing frequecy or saved one\r\n const preselectedBillingFrequency = queryBillingFrequency || savedState?.checkout?.billingFrequency\r\n // if min users was passed via url or saved in the store\r\n const preselectedMinUsers = Number(minUsers) || savedState?.checkout?.organizers\r\n const featureFlags: { data: { flags: string[] } } = yield call(commonServices.getFeatureFlags, SC_SITE.RESOLVE)\r\n const useNewResolveSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.RESOLVE_USE_NEW_SKUS)\r\n\r\n // grab url param for couponCode first and if not available go for saved one\r\n let preSavedCouponCode = (queryCouponCode as string) || savedSessionState?.coupon?.urlCouponCode\r\n // try to apply coupon code and also save the coupon code in state\r\n preSavedCouponCode = preSavedCouponCode || ''\r\n yield put(resolveCouponActions.setUrlCouponCode(preSavedCouponCode))\r\n\r\n yield put(contentActions.setLanguage(savedSessionState?.language || ''))\r\n\r\n // if the value of the preselected frequency is an acceptable value and is not the same\r\n // as what is already saved, update it\r\n if (\r\n (preselectedBillingFrequency === TimePeriod.Month || preselectedBillingFrequency === TimePeriod.Year) &&\r\n preselectedBillingFrequency !== checkout.billingFrequency\r\n ) {\r\n yield put(resolveCheckoutActions.setBillingFrequency(preselectedBillingFrequency))\r\n }\r\n\r\n if (preselectedMinUsers) {\r\n yield put(resolveCheckoutActions.setOrganizers(preselectedMinUsers))\r\n }\r\n // grab url param for plan or saved in store\r\n if (urlPlan) {\r\n const preselectedPlan = urlPlan.replace(/-/g, ' ')\r\n // check if plan name is different\r\n if (urlPlan && urlPlan?.toLowerCase() !== selectedPlan.shortName.toLowerCase()) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find(\r\n (pln: ResolvePlan) => pln.shortName.toLocaleLowerCase() === preselectedPlan.toLowerCase()\r\n )\r\n if (foundPlan) {\r\n yield put(resolveCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n }\r\n } else if (savedState?.checkout?.selectedPlanSku) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find((pln: ResolvePlan) => pln.sKU === savedState?.checkout?.selectedPlanSku)\r\n if (foundPlan) {\r\n yield put(resolveCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n } else if (!savedState?.checkout?.selectedPlanSku) {\r\n // if no plan is selected, default to useNewResolveSkus ? v2 plan : first plan\r\n yield put(resolveCheckoutActions.setSelectedPlan(planData?.[useNewResolveSkus ? 1 : 0]?.sKU ?? 0))\r\n }\r\n\r\n if (savedState) {\r\n const { selectedAddons } = savedState.checkout\r\n\r\n const plan: ResolvePlan = yield call(getSelectedPlan)\r\n // if a plan was selected\r\n if (plan.name) {\r\n // find matching addon in the plan from preselected addon\r\n const foundAddons: ResolveAddon[] = yield call(getCurrentAddons, selectedAddons, plan)\r\n yield put(resolveCheckoutActions.setSelectedAddons(foundAddons))\r\n // find and update Agent addon quantity\r\n const agentAddons = foundAddons.find((addon) => addon.sKU.includes(ADDONS.AGENT))\r\n if (agentAddons) {\r\n yield put(resolveCheckoutActions.setAgents(agentAddons.quantity + plan.userAgentsIncludedAmount))\r\n }\r\n // find and update Endpoint addon quantity\r\n const endPointAddons = foundAddons.find(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (endPointAddons) {\r\n yield put(\r\n resolveCheckoutActions.setEndpoints(\r\n endPointAddons.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL + plan.endpointsIncludedAmount\r\n )\r\n )\r\n }\r\n // find and update extra addon selection\r\n const extraAddons = foundAddons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (extraAddons) {\r\n yield put(resolveCheckoutActions.setExtraAddons(extraAddons))\r\n }\r\n }\r\n }\r\n yield put(resolveCheckoutActions.setSavedStateLoaded(true, 'saved state saga'))\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeLoadSavedStateSaga() {\r\n yield takeLeading(ResolveCheckoutActionTypes.GET_SAVED_STATE, loadSavedStateSaga)\r\n}\r\n\r\nexport default initializeLoadSavedStateSaga\r\n","import { call, takeLatest, select, put, delay } from 'redux-saga/effects'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { ResolveCalculatePriceDataType, ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport gtreServices from '@gtresolve/services'\r\nimport { getBillingValues } from '@gtresolve/utils/get-billing-values'\r\nimport { getPaymentItems } from '@gtresolve/utils/get-item-values'\r\nimport { getSelectedPlan, getSelectedAddons } from '@gtresolve/saga/content/content-helpers'\r\nimport { getCheckoutState, getCouponState, getUserState, getPlanData } from '@gtresolve/state/selectors'\r\nimport { getLocationState, getAccountState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { BUY_TYPE, RESOLVE_TRACKING_COMPONENTS, RESOLVE_USER_TYPES } from '@gtresolve/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { ResolveUserState } from '@gtresolve/state/user/state'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveCalculatePriceAPIData, ResolveCalculatePriceAPIReturnType } from '@gtresolve/state/calculate-price'\r\nimport { isEmpty } from 'lodash-es'\r\nimport {\r\n getActiveCouponServerData,\r\n getCouponDoubleDipAmountForNewUser,\r\n getTotalProratedAmount,\r\n getTotalVolumeDiscount,\r\n getSubscriptionInfo,\r\n} from '@gtresolve/utils'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { resolveCouponActions } from '@gtresolve/state/coupon/actions'\r\n\r\nexport function* calculatePriceSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.CALCULATE_PRICE_SAGA\r\n try {\r\n yield put(resolveCheckoutActions.setTotalLoading(true))\r\n yield delay(1000)\r\n const checkout: ResolveCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingBillingInformation }: ResolveUserState = yield select(getUserState)\r\n const { values, planSKU } = action.payload\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan, planSKU)\r\n const selectedAddons: ResolveAddon[] = yield call(getSelectedAddons)\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponProcessedDataPerSku } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n if (userType === RESOLVE_USER_TYPES.ADDON) {\r\n values.Street1 = existingBillingInformation?.addressLine1 || ''\r\n values.City = existingBillingInformation?.city || ''\r\n values.CountryCode = existingBillingInformation?.country || ''\r\n values.Email = existingBillingInformation?.email || ''\r\n values.FirstName = existingBillingInformation?.firstName || ''\r\n values.LastName = existingBillingInformation?.lastName || ''\r\n values.ZipCode = existingBillingInformation?.postalCode || ''\r\n values.StateCode = existingBillingInformation?.state || ''\r\n values.TaxNumber = existingBillingInformation?.taxNumber || ''\r\n values.TaxType = existingBillingInformation?.federalTaxType || ''\r\n }\r\n\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n if (!subscriptionInfo.isReplacementBooking && !selectedAddons.length) {\r\n yield put(resolveCheckoutActions.setTotalLoading(false))\r\n yield put(resolveCheckoutActions.setCalculatedPrice([], 0, 0, 0, 0, ''))\r\n yield put(resolveCheckoutActions.setProratedAmount(0))\r\n return\r\n }\r\n\r\n const calculatePriceValues: ResolveCalculatePriceDataType = {\r\n address: getBillingValues(values),\r\n currency: locationInfo.currency,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n cart: getPaymentItems(selectedPlan, 1, checkout.billingFrequency, selectedAddons, subscriptionInfo),\r\n }\r\n\r\n const calculatePriceCreation: ResolveCalculatePriceAPIReturnType = yield call(\r\n gtreServices.calculatePrice,\r\n calculatePriceValues\r\n )\r\n if (calculatePriceCreation && calculatePriceCreation.data) {\r\n const {\r\n errorMessages,\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate,\r\n creditback,\r\n }: ResolveCalculatePriceAPIData = calculatePriceCreation.data\r\n if (isEmpty(errorMessages)) {\r\n yield put(\r\n resolveCheckoutActions.setCalculatedPrice(\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n creditback,\r\n anniversaryDate === null ? '' : (anniversaryDate as string)\r\n )\r\n )\r\n // since the selected plan has an item id of 0 is the product prices array, we need to get the first item from productPrice\r\n // check getPaymentItems function above for more info\r\n const [planProductPrice] = productPrices.filter((productPrice) => productPrice.itemId === 0)\r\n const { volumeDiscount } = planProductPrice\r\n if (volumeDiscount) {\r\n const { amount } = volumeDiscount\r\n const calculatedVolumeDiscount: number = yield call(getTotalVolumeDiscount, amount, 1, false)\r\n\r\n yield put(\r\n resolveCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(calculatedVolumeDiscount)\r\n )\r\n }\r\n\r\n // if add-on user, calculate the prorated amount\r\n if (userType === RESOLVE_USER_TYPES.ADDON) {\r\n const calculatedProratedAmount = getTotalProratedAmount(productPrices)\r\n yield put(resolveCheckoutActions.setProratedAmount(calculatedProratedAmount))\r\n }\r\n\r\n // coupon discount for DID\r\n if (isCouponValid && couponProcessedDataPerSku && userType !== RESOLVE_USER_TYPES.ADDON) {\r\n const couponDoubleDipAmountForNewUser: number = yield call(\r\n getCouponDoubleDipAmountForNewUser,\r\n productPrices\r\n )\r\n\r\n yield put(resolveCouponActions.setCouponDoubleDipAmountForNewUser(couponDoubleDipAmountForNewUser))\r\n }\r\n } else {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'Sorry we are having trouble applying your credit',\r\n buyType:\r\n subscriptionInfo.isTrial || !subscriptionInfo.plan\r\n ? BUY_TYPE.DIRECT_BUY\r\n : BUY_TYPE.ADDON,\r\n plan: checkout.billingFrequency === TimePeriod.Month ? 'monthly' : 'annual',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(modalActions.setErrorModal('Unable to get price data'))\r\n }\r\n }\r\n yield put(resolveCheckoutActions.setTotalLoading(false))\r\n } catch {\r\n yield put(\r\n resolveTrackingActions.track(\r\n { event: TRACKING_EVENTS.ERROR_PURCHASE, eventData: { errorMessage: 'error in calculating price' } },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'error in calculating price' }))\r\n yield put(resolveCheckoutActions.setTotalLoading(false))\r\n }\r\n}\r\n\r\nfunction* initializeCalculatePriceSaga() {\r\n yield takeLatest(ResolveCheckoutActionTypes.CALCULATE_PRICE, calculatePriceSaga)\r\n}\r\n\r\nexport default initializeCalculatePriceSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { savePayment } from '@gtresolve/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createPaymentSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n try {\r\n const { paymentValues } = action.payload\r\n const savePaymentResponse: GenericResponse = yield call(savePayment, paymentValues)\r\n if (savePaymentResponse.status === 200 || savePaymentResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save payment info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreatePaymentSaga() {\r\n yield takeEvery(ResolveCheckoutActionTypes.CREATE_PAYMENT, createPaymentSaga)\r\n}\r\n\r\nexport default initializeCreatePaymentSaga\r\n","import { call, put, takeEvery } from 'redux-saga/effects'\r\nimport { ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { getAvailablePaymentMethods } from '@gtresolve/services'\r\nimport { ResolvePaymentDataReturnType } from '@gtresolve/state/checkout/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getAvailablePaymentMethodsSaga() {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.GET_AVAILABLE_PAYMENT_METHODS_SAGA\r\n try {\r\n const paymentMethodsCreation: GenericResponse = yield call(getAvailablePaymentMethods)\r\n if (paymentMethodsCreation.data) {\r\n const paymentData: ResolvePaymentDataReturnType[] = paymentMethodsCreation.data\r\n return paymentData\r\n }\r\n } catch (e) {\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get available payment methods' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get available payment methods' })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeGetAvailablePaymentMethodsSaga() {\r\n yield takeEvery(ResolveCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS, getAvailablePaymentMethodsSaga)\r\n}\r\n\r\nexport default initializeGetAvailablePaymentMethodsSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { resolveUserActions, ResolveUserActionTypes } from '@gtresolve/state/user/actions'\r\nimport commonServices, {\r\n verifyUser,\r\n getBillingSubscriptions,\r\n getBillingInfo,\r\n getExistingPaymentDetails,\r\n} from '@common/services'\r\nimport { getLabelContent, getUserState } from '@gtresolve/state/selectors'\r\nimport { logout, processExistingBillingInfo } from '@common/utils'\r\nimport { trackAbandonForm } from '@gtresolve/utils'\r\nimport { ResolveUserState } from '@gtresolve/state/user/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { resolveCheckoutActions } from '@gtresolve/state/checkout/actions'\r\nimport { resolveBuyFormActions } from '@gtresolve/state/buy-form/actions'\r\nimport { ResolveBuyFormData } from '@gtresolve/state/buy-form/state'\r\nimport {\r\n PREFIX,\r\n TimePeriod,\r\n BILLING_TYPES,\r\n PRODUCT_TYPES,\r\n PRODUCT_SKU,\r\n COUNTRIES,\r\n SC_SITE,\r\n PRODUCT_FAMILY_NAME,\r\n} from '@common/constants'\r\nimport { LabelContent } from '@gtresolve/state/label-content'\r\nimport { CHECKOUTFORM_FIELDS, RESOLVE_USER_TYPES, RESOLVE_USER_TYPES_RESPONSE } from '@gtresolve/constants'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { isEmpty, partition } from 'lodash-es'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { accountActions } from '@common/state/account/actions'\r\nimport { getCountryFromCookie, setCountryInCookie } from '@common/utils/cookie-utils'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { FEATURE_FLAGS } from '@common/constants/featureFlags'\r\n\r\nfunction* userLoggedInSaga() {\r\n try {\r\n yield put(resolveUserActions.setLoadingExistingInformation(true))\r\n const {\r\n loggedIn: { accessToken },\r\n }: ResolveUserState = yield select(getUserState)\r\n const { paymentMethodErrorMessage, disabledUserError }: LabelContent = yield select(getLabelContent)\r\n\r\n // clear previous session on the server\r\n yield call(commonServices.clearUserSession)\r\n // get user info\r\n // eslint-disable-next-line camelcase\r\n const response: GenericResponse = yield call(\r\n verifyUser,\r\n accessToken?.access_token || '',\r\n PRODUCT_FAMILY_NAME.G2R\r\n )\r\n if (response && !isEmpty(response.data)) {\r\n const {\r\n User: { UserName, Name, UserKey },\r\n AccountKey,\r\n isBanned,\r\n hasGroupSubscription,\r\n } = response.data\r\n\r\n if (hasGroupSubscription) {\r\n trackAbandonForm()\r\n window.location.href = process.env.ADMIN_RESOLVE_URL as string\r\n }\r\n\r\n const userInfo: ExistingUserInfoType = {\r\n UserName,\r\n Name,\r\n UserKey,\r\n AccountKey,\r\n }\r\n\r\n const buyFormData: ResolveBuyFormData = {\r\n FirstName: Name?.GivenName,\r\n LastName: Name?.FamilyName,\r\n Email: UserName,\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: getCountryFromCookie() || COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n }\r\n const isSameAsAccount = sessionStorage.getItem('useSameForBilling') !== 'false'\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.FIRST_NAME, Name?.GivenName || '')\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.LAST_NAME, Name?.FamilyName || '')\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.COUNTRY_CODE, buyFormData.CountryCode)\r\n if (isSameAsAccount) {\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME, Name?.GivenName || '')\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.BILLING_LAST_NAME, Name?.FamilyName || '')\r\n }\r\n\r\n // return error message if user is banned\r\n if (isBanned === true) {\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.BANNED))\r\n yield put(resolveUserActions.setLoadingExistingInformation(false))\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n { fatalErrorMessage: disabledUserError, trackErrorMessage: disabledUserError },\r\n true\r\n )\r\n )\r\n return\r\n }\r\n\r\n // USER_IDENTITY_NOT_FOUND implies that user has neither boss nor identity account\r\n // This is the state returned when a token has been invalidated, I dont know\r\n // if there is another use case or not\r\n if (response.data.Code === RESOLVE_USER_TYPES_RESPONSE.USER_IDENTITY_NOT_FOUND) {\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.NEW))\r\n yield put(resolveUserActions.userLogout())\r\n return\r\n }\r\n\r\n // set up and display existing user account information\r\n yield put(resolveUserActions.setExistingUserInformation(userInfo))\r\n\r\n // USER_BOSS_NOT_FOUND implies that user has an identity account\r\n if (response.data.Code === RESOLVE_USER_TYPES_RESPONSE.USER_BOSS_NOT_FOUND) {\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.IDENTITY_ONLY))\r\n yield put(resolveBuyFormActions.updateInitialFormState(buyFormData))\r\n yield put(resolveUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // #region attempt to set up existing billing info\r\n const billingInfoRequest: GenericResponse = yield call(getBillingInfo)\r\n if (billingInfoRequest && !isEmpty(billingInfoRequest.data)) {\r\n // We get company name same as the email without the `@` in case we don't provide in the first place.\r\n // This is a known behavior for GTC. So, we check for GTR, we check if that's what we got and don't show the value\r\n const { email, companyName } = billingInfoRequest.data\r\n if (email.replace('@', '').replace('_', '') === companyName) {\r\n billingInfoRequest.data.companyName = ''\r\n }\r\n\r\n const processedBillingData = processExistingBillingInfo(billingInfoRequest.data)\r\n const billingInfo: ExistingBillingInfoType = processedBillingData\r\n const currentCountry = getCountryFromCookie() || COUNTRIES.US\r\n\r\n if (billingInfo.state === 'XX') {\r\n billingInfo.state = ''\r\n yield put(resolveBuyFormActions.setStatesOptional(true))\r\n }\r\n\r\n // If address IS set, but GeoIP is different from existing user country,\r\n // reload such that buy form country matches that of GeoIP cookie\r\n if (billingInfo.addressLine1) {\r\n if (billingInfo.country !== currentCountry) {\r\n setCountryInCookie(billingInfo.country)\r\n window.location.reload()\r\n }\r\n } else {\r\n billingInfo.country = currentCountry\r\n }\r\n\r\n billingInfo.firstName = Name.GivenName\r\n billingInfo.lastName = Name.FamilyName\r\n buyFormData.Street1 = billingInfo.addressLine1\r\n buyFormData.City = billingInfo.city\r\n buyFormData.CountryCode = billingInfo.country\r\n buyFormData.ZipCode = billingInfo.postalCode\r\n buyFormData.StateCode = billingInfo.state\r\n buyFormData.ContactPhone = billingInfo.phoneNumber\r\n buyFormData.TaxNumber = billingInfo.taxNumber || ''\r\n buyFormData.TaxType = billingInfo.federalTaxType || ''\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.FIRST_NAME, Name.GivenName)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.LAST_NAME, Name.FamilyName)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.COUNTRY_CODE, billingInfo.country)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.STREET1, billingInfo.addressLine1)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.CITY, billingInfo.city)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.ZIP_CODE, billingInfo.postalCode)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.CONTACT_PHONE, billingInfo.phoneNumber)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.STATE_CODE, billingInfo.state)\r\n if (isSameAsAccount) {\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME, Name.GivenName)\r\n sessionStorage.setItem(CHECKOUTFORM_FIELDS.BILLING_LAST_NAME, Name.FamilyName)\r\n }\r\n\r\n // all five fields must contain values in order to set existing billing information\r\n if (buyFormData.Street1 && buyFormData.City && buyFormData.CountryCode && buyFormData.ZipCode) {\r\n yield put(resolveUserActions.setExistingBillingInformation(billingInfo))\r\n }\r\n }\r\n yield put(resolveBuyFormActions.updateInitialFormState(buyFormData))\r\n // #endregion\r\n\r\n // #region attempt to set up existing payment info\r\n const paymentInfoRequest: GenericResponse = yield call(getExistingPaymentDetails)\r\n if (paymentInfoRequest && !isEmpty(paymentInfoRequest.data)) {\r\n const currentDate = new Date()\r\n const currentYear = currentDate.getFullYear()\r\n const currentMonth = currentDate.getMonth()\r\n const ccInfo = paymentInfoRequest.data[0].creditCard\r\n if (\r\n ccInfo.expirationYear < currentYear ||\r\n (ccInfo.expirationYear === currentYear && ccInfo.expirationMonth < currentMonth)\r\n ) {\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n {\r\n fatalErrorMessage: paymentMethodErrorMessage,\r\n trackErrorMessage: paymentMethodErrorMessage,\r\n },\r\n true\r\n )\r\n )\r\n }\r\n const paymentInfo: ExistingPaymentInfoType = {\r\n last4Digits: ccInfo.last4Digits,\r\n }\r\n yield put(resolveUserActions.setExistingPaymentDetails(paymentInfo))\r\n }\r\n // #endregion\r\n\r\n // if subscription is empty, mark as expired-user\r\n const subscriptionRequest: GenericResponse = yield call(getBillingSubscriptions)\r\n if (isEmpty(subscriptionRequest?.data)) {\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.EXPIRED))\r\n yield put(resolveUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n const featureFlags: { data: { flags: string[] } } = yield call(\r\n commonServices.getFeatureFlags,\r\n SC_SITE.RESOLVE\r\n )\r\n\r\n const useNewResolveSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.RESOLVE_USE_NEW_SKUS)\r\n\r\n // set account subscription state\r\n yield put(accountActions.setAccountSubscriptions(subscriptionRequest.data))\r\n\r\n // partition subscriptions into two arrays - one for GTC and another for GTR\r\n const [resolveSubscriptions] = partition(\r\n subscriptionRequest.data,\r\n (plan: BillingDetailedSubscriptionPlan) => {\r\n return plan.productSku.startsWith(PREFIX.GTR)\r\n }\r\n )\r\n\r\n const resolveTrialSubscription = resolveSubscriptions.find(\r\n (plan: BillingDetailedSubscriptionPlan) => plan.planType === PRODUCT_TYPES.TRIAL\r\n )\r\n\r\n // #region determine buy flow user state\r\n const selectedPlan = resolveSubscriptions?.find((plan: BillingDetailedSubscriptionPlan) => {\r\n if (useNewResolveSkus) {\r\n return (\r\n plan.productSku === PRODUCT_SKU.G2RE_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.G2RE_STANDARD_NAME ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_ACCESS ||\r\n plan.productSku === PRODUCT_SKU.GTR_STANDARD_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS\r\n )\r\n }\r\n return (\r\n plan.productSku === PRODUCT_SKU.G2RE_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.G2RE_STANDARD_NAME\r\n )\r\n })\r\n if (selectedPlan) {\r\n const {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n planType,\r\n } = selectedPlan ?? {}\r\n\r\n const overallQuantity = resolveSubscriptions.reduce(\r\n (accumulator: number, subItem: ExistingAccountInfoType) => {\r\n if (subItem.productSku === productSku) {\r\n return accumulator + subItem.quantity\r\n }\r\n return accumulator\r\n },\r\n 0\r\n )\r\n\r\n const accountInfo: ExistingAccountInfoType = {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n quantity: overallQuantity,\r\n planType,\r\n }\r\n\r\n yield put(resolveUserActions.setExistingAccountInformation(accountInfo))\r\n yield put(resolveCheckoutActions.setSelectedPlan(productSku))\r\n yield put(\r\n resolveCheckoutActions.setBillingFrequency(\r\n paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n )\r\n )\r\n // if user already has the selected plan, mark as add-on flow\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.ADDON))\r\n yield put(resolveCheckoutActions.setSelectedAddons([]))\r\n } else if (resolveTrialSubscription) {\r\n // otherwise, if user has any GTResolve trial subscription, mark as trialer\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.TRIALER))\r\n } else {\r\n // otherwise, since user has at least one subscription, mark as cross product\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.CROSSPRODUCT))\r\n }\r\n // #endregion\r\n\r\n yield put(resolveUserActions.setLoadingExistingInformation(false))\r\n }\r\n } catch (e) {\r\n yield put(resolveUserActions.setUserType(RESOLVE_USER_TYPES.NEW))\r\n yield put(resolveUserActions.setLoadingExistingInformation(false))\r\n const { pathname, search } = window.location\r\n yield call(logout, pathname, search)\r\n }\r\n}\r\n\r\nfunction* initializeLoggedInSaga() {\r\n yield takeEvery(ResolveUserActionTypes.GET_LOGGED_IN_USER_STATE, userLoggedInSaga)\r\n}\r\n\r\nexport default initializeLoggedInSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { resolveBuyFormActions, ResolveBuyFormActionTypes } from '@gtresolve/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { resolveCheckoutActions } from '@gtresolve/state/checkout/actions'\r\nimport {\r\n ResolveSubmitDataType,\r\n ResolveCheckoutState,\r\n ResolvePaymentDataReturnType,\r\n} from '@gtresolve/state/checkout/state'\r\nimport { getPaymentItems } from '@gtresolve/utils/get-item-values'\r\nimport {\r\n getCheckoutState,\r\n getUserState,\r\n getLabelContent,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n} from '@gtresolve/state/selectors'\r\nimport { getLocationState, getAccountState, getFlexState } from '@common/state/selectors'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtresolve/saga/content/content-helpers'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { ResolveContentData } from '@gtresolve/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { resolveTrackingActions } from '@gtresolve/state/tracking/actions'\r\nimport { ResolveAbandonedCartDataType, ResolveUserState } from '@gtresolve/state/user/state'\r\nimport { ExistingUserInfoType, ExistingBillingInfoType } from '@common/state/user/state'\r\nimport { LabelContent } from '@gtresolve/state/label-content'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { resolveUserActions } from '@gtresolve/state/user/actions'\r\nimport { getActiveCouponServerData, clearState, getSubscriptionInfo } from '@gtresolve/utils'\r\nimport { flexFormSaga } from '@common/sagas/flex/get-flex-token'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { FlexTokenDataType } from '@common/services'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { REFERRER, REFERRER_QUERY_PARAM } from '@gtresolve/constants/referrers'\r\nimport { ResolveSubmitPaymentResponseData } from '@gtresolve/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@gtresolve/saga/user/abandoned-cart'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = RESOLVE_TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]\r\n )\r\n )\r\n\r\n const checkout: ResolveCheckoutState = yield select(getCheckoutState)\r\n const { addonUserSuccessUrl, gotoAdminUrl }: LabelContent = yield select(getLabelContent)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: ResolveUserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: ResolveContentData =\r\n yield select(getContentData)\r\n\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const selectedAddons: ResolveAddon[] = yield call(getSelectedAddons)\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const { CompanyName } = action.payload.values\r\n\r\n try {\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n // #region if CompanyName is provided, update billing info\r\n if (CompanyName && userState.existingBillingInformation) {\r\n const { country, firstName, lastName, email, taxNumber, federalTaxType } =\r\n userState.existingBillingInformation\r\n const billingData = {\r\n addressLine1,\r\n city,\r\n state: stateCode,\r\n country,\r\n postalCode,\r\n firstName,\r\n lastName,\r\n email,\r\n phoneNumber,\r\n taxNumber: taxNumber || '',\r\n federalTaxType: federalTaxType || '',\r\n companyName: CompanyName,\r\n }\r\n\r\n const createBillingInfoAction = resolveCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n }\r\n // #endregion\r\n\r\n const items = getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n subscriptionInfo\r\n )\r\n\r\n // #region attempt to retrieve SCA token to determine Cardinal challenge is required or not\r\n const flexTokenData: FlexTokenDataType = {\r\n currency: locationInfo.currency,\r\n country: locationInfo.country,\r\n targetOrigin: window.location.origin,\r\n skipSca: false,\r\n }\r\n yield call(flexFormSaga, flexActions.getFlexToken(flexTokenData, 0))\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n if (isScaEnabledForMid) {\r\n // wait for Cardinal script is completely loaded before proceeding to next line of code\r\n yield take(FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE)\r\n }\r\n // #endregion\r\n\r\n // #region get available payment menthods\r\n let paymentMethodKey = ''\r\n const getAvailablePaymentData: ResolvePaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n // #endregion\r\n // #region process purchase - 1st purchase call\r\n let paymentKey = ''\r\n let isChallengeRequired = false\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: ResolveSubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n isScaCompleted: false,\r\n isWithCardAddAfterSca: false,\r\n }\r\n const submitPaymentAction = resolveCheckoutActions.submitPayment(submitValues)\r\n const submitData: ResolveSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n\r\n isChallengeRequired = submitData?.scaResult?.isScaRequired || false\r\n paymentKey = submitData?.scaResult?.paymentKey\r\n\r\n const payerAuthEnrollment = submitData?.scaResult?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n resolveTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n resolveTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: ResolveSubmitDataType = {\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: false,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = resolveCheckoutActions.submitPayment(submitValues)\r\n const submitData: ResolveSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n resolveTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n resolveBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: ResolveAbandonedCartDataType = {\r\n email: UserName,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = resolveUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(resolveTrackingActions.track({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW }, componentName))\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n company: CompanyName,\r\n }\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(resolveCheckoutActions.setAddonComplete(true))\r\n\r\n const referrer = new URLSearchParams(window.location.search).get(REFERRER_QUERY_PARAM)\r\n if (referrer === REFERRER.gotoAdmin) {\r\n window.location.href = gotoAdminUrl\r\n } else {\r\n window.location.href = addonUserSuccessUrl\r\n }\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'existing user form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(ResolveBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { TimePeriod } from '@common/constants'\r\nimport { ResolveCheckoutState } from './state'\r\nimport { ResolveCheckoutActionTypes } from './actions'\r\nimport type { ResolveCheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: ResolveCheckoutState = {\r\n isLoading: true,\r\n selectedAddons: [],\r\n submitting: false,\r\n organizers: 1,\r\n promoCode: '',\r\n billingFrequency: TimePeriod.Year,\r\n calculatedTax: 0,\r\n calculatedTotal: 0,\r\n calculatedNetTotal: 0,\r\n calculatedCredit: 0,\r\n anniversaryDate: '',\r\n selectedPlanSku: '',\r\n savedStateLoaded: false,\r\n purchaseComplete: false,\r\n addonComplete: false,\r\n totalLoading: false,\r\n selectedTierIndex: 0, // the default selected tier is Tier1, since selectedTierIndex is zero based index.\r\n currentVolumeDiscountPrice: 0,\r\n volumeDiscountLoading: false,\r\n volumeDiscount: {},\r\n calculatedProratedAmount: 0,\r\n extraAddons: [],\r\n endpoints: 0,\r\n agents: 0,\r\n taxType: '',\r\n autoLogin: undefined,\r\n}\r\n\r\nexport const checkoutReducer = (\r\n previousState: ResolveCheckoutState | undefined,\r\n action: ResolveCheckoutActions\r\n): ResolveCheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case ResolveCheckoutActionTypes.SET_LOADING:\r\n return {\r\n ...state,\r\n isLoading: action.payload.loading,\r\n }\r\n case ResolveCheckoutActionTypes.SET_PURCHASE_COMPLETE:\r\n return {\r\n ...state,\r\n purchaseComplete: action.payload.complete,\r\n }\r\n case ResolveCheckoutActionTypes.SET_BILLING_FREQUENCY:\r\n return {\r\n ...state,\r\n billingFrequency: action.payload.frequency,\r\n }\r\n case ResolveCheckoutActionTypes.CLEAR_ADDONS:\r\n return {\r\n ...state,\r\n selectedAddons: [],\r\n }\r\n case ResolveCheckoutActionTypes.SET_SELECTED_PLAN:\r\n return {\r\n ...state,\r\n selectedPlanSku: action.payload.planSku,\r\n }\r\n case ResolveCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n return {\r\n ...state,\r\n selectedAddons: [...addons],\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_ORGANIZERS:\r\n return {\r\n ...state,\r\n organizers: action.payload.organizers,\r\n }\r\n case ResolveCheckoutActionTypes.SET_CALCULATED_PRICE:\r\n return {\r\n ...state,\r\n productPrices: action.payload.productPrices,\r\n calculatedNetTotal: action.payload.net,\r\n calculatedTotal: action.payload.total,\r\n calculatedTax: action.payload.tax,\r\n calculatedCredit: action.payload.creditback,\r\n anniversaryDate: action.payload.anniversaryDate,\r\n }\r\n case ResolveCheckoutActionTypes.SET_SAVED_STATE_LOADED:\r\n return {\r\n ...state,\r\n savedStateLoaded: action.payload.savedStateLoaded,\r\n }\r\n case ResolveCheckoutActionTypes.SET_LOADING_TOTAL:\r\n return {\r\n ...state,\r\n totalLoading: action.payload.loading,\r\n }\r\n case ResolveCheckoutActionTypes.SET_ADDON_COMPLETE:\r\n return {\r\n ...state,\r\n addonComplete: action.payload.addonComplete,\r\n }\r\n case ResolveCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { selectedTierIndex } = action.payload\r\n return {\r\n ...state,\r\n selectedTierIndex,\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_VOLUME_DISCOUNT: {\r\n const { selectedPlanSku, currency, volumeDiscountForSelectedPlanAndCurrency } = action.payload\r\n const selectedPlanSkuVolumeDiscount = state.volumeDiscount[selectedPlanSku] || {}\r\n return {\r\n ...state,\r\n volumeDiscount: {\r\n ...state.volumeDiscount,\r\n [selectedPlanSku]: {\r\n ...selectedPlanSkuVolumeDiscount,\r\n [currency]: volumeDiscountForSelectedPlanAndCurrency,\r\n },\r\n },\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING: {\r\n const { volumeDiscountLoading } = action.payload\r\n return { ...state, volumeDiscountLoading }\r\n }\r\n case ResolveCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE: {\r\n const { currentVolumeDiscountPrice } = action.payload\r\n return { ...state, currentVolumeDiscountPrice }\r\n }\r\n case ResolveCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON: {\r\n return { ...state, currentVolumeDiscountPrice: 0 }\r\n }\r\n case ResolveCheckoutActionTypes.SET_PRORATED_AMOUNT: {\r\n const { proratedAmount } = action.payload\r\n return { ...state, calculatedProratedAmount: proratedAmount }\r\n }\r\n case ResolveCheckoutActionTypes.RESET_CHECKOUT_STATE: {\r\n return initialCheckoutState\r\n }\r\n case ResolveCheckoutActionTypes.SET_EXTRA_ADDON: {\r\n const { addons = [] } = action.payload\r\n return {\r\n ...state,\r\n extraAddons: addons,\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_ENDPOINTS: {\r\n return {\r\n ...state,\r\n endpoints: action.payload.endpoints,\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_AGENTS: {\r\n return {\r\n ...state,\r\n agents: action.payload.agents,\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_TAX_TYPE: {\r\n return {\r\n ...state,\r\n taxType: action.payload.type,\r\n }\r\n }\r\n case ResolveCheckoutActionTypes.SET_AUTO_LOGIN: {\r\n return {\r\n ...state,\r\n autoLogin: action.payload.autoLogin,\r\n }\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { resolveBuyFormActions, ResolveBuyFormActionTypes } from '@gtresolve/state/buy-form/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { resolveCheckoutActions } from '@gtresolve/state/checkout/actions'\r\nimport { initialCheckoutState } from '@gtresolve/state/checkout/reducer'\r\n\r\nexport function* resetBuyFormAffectedStatesSaga() {\r\n yield put(resolveBuyFormActions.resetForm())\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n yield put(\r\n resolveCheckoutActions.setCalculatedPrice(\r\n [],\r\n initialCheckoutState.calculatedNetTotal,\r\n initialCheckoutState.calculatedTotal,\r\n initialCheckoutState.calculatedTax,\r\n initialCheckoutState.calculatedCredit,\r\n initialCheckoutState.anniversaryDate\r\n )\r\n )\r\n}\r\n\r\nfunction* initializeResetBuyFormAffectedStatesSaga() {\r\n yield takeEvery(ResolveBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES, resetBuyFormAffectedStatesSaga)\r\n}\r\n\r\nexport default initializeResetBuyFormAffectedStatesSaga\r\n","import { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { getSelectedAddons, getSelectedPlan } from '@gtresolve/saga/content/content-helpers'\r\nimport { getCheckoutState, getContentData, getCouponState, getPlanData, getUserState } from '@gtresolve/state/selectors'\r\nimport { ResolveUserState } from '@gtresolve/state/user/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { select, call } from 'redux-saga/effects'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { RESOLVE_USER_TYPES } from '@gtresolve/constants'\r\nimport { getActiveCouponServerData, getCouponTotalSavings, getSelectedTierIndex } from '@gtresolve/utils'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { ResolveCustomizeItemsData } from '@gtresolve/state/tracking/state'\r\nimport { ResolveContentData } from '@gtresolve/state/content-data'\r\n\r\nexport function* getCustomizeItemsData() {\r\n const planData: ResolvePlan[] = yield select(getPlanData)\r\n const { CurrencyCode }: ResolveContentData = yield select(getContentData)\r\n const { billingFrequency, organizers }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const customizeItemsData: ResolveCustomizeItemsData = {\r\n planData,\r\n billingFrequency,\r\n currency: CurrencyCode,\r\n organizers,\r\n }\r\n return customizeItemsData\r\n}\r\n\r\nexport function* getPageViewData() {\r\n const {\r\n loggedIn: { isUserLoggedIn },\r\n }: ResolveUserState = yield select(getUserState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { locale, country, language } = locationState.locationInfo\r\n return { locale, country, isUserLoggedIn, language }\r\n}\r\n\r\nexport function* getSessionInfo() {\r\n const {\r\n userType,\r\n loggedIn: { isUserLoggedIn },\r\n }: ResolveUserState = yield select(getUserState)\r\n return { isUserLoggedIn, userType, sessionLast: '', sessionNumber: '' }\r\n}\r\n\r\nexport function* getCartInfo() {\r\n const { billingFrequency, organizers, currentVolumeDiscountPrice, selectedTierIndex }: ResolveCheckoutState =\r\n yield select(getCheckoutState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { existingBillingInformation, userType, existingAccountInformation }: ResolveUserState = yield select(\r\n getUserState\r\n )\r\n const { currency } = locationState.locationInfo\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const selectedAddons: ResolveAddon[] = yield call(getSelectedAddons)\r\n\r\n let tierIndex = selectedTierIndex\r\n if (userType === RESOLVE_USER_TYPES.ADDON && existingAccountInformation && !isEmpty(existingAccountInformation)) {\r\n const existingOrganizers = existingAccountInformation.quantity\r\n const totalOrganizers = organizers + existingOrganizers\r\n tierIndex = yield call(getSelectedTierIndex, totalOrganizers, billingFrequency, selectedPlan, currency)\r\n }\r\n\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { couponProcessedDataPerSku, isCouponValidAndApplied, couponDoubleDipAmountForNewUser } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, selectedPlan)\r\n const totalCouponSavings = getCouponTotalSavings(\r\n isCouponValidAndApplied,\r\n couponProcessedDataPerSku,\r\n couponDoubleDipAmountForNewUser\r\n )\r\n\r\n return {\r\n plan: selectedPlan,\r\n addonList: selectedAddons,\r\n billingFrequency,\r\n organizers,\r\n currency,\r\n isExistingUser: !isEmpty(existingBillingInformation),\r\n tier: `Tier${tierIndex + 1}`,\r\n currentVolumeDiscountPrice,\r\n couponCode: couponServerData?.couponCode || '',\r\n couponProcessedDataPerSku,\r\n totalCouponSavings,\r\n }\r\n}\r\n\r\nexport function* getPurchaseData(transactionID: string) {\r\n const { calculatedNetTotal, calculatedTax, promoCode }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const { userType }: ResolveUserState = yield select(getUserState)\r\n return { calculatedNetTotal, calculatedTax, promoCode, userType, transactionID }\r\n}\r\n\r\nexport function* getCompleteBuyData() {\r\n const { userType }: ResolveUserState = yield select(getUserState)\r\n return userType\r\n}\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { resolveTrackingActions, ResolveTrackingActionTypes } from '@gtresolve/state/tracking/actions'\r\nimport { trackCTAClick, trackEvent, trackGenericEvent, trackGenericFormEvent } from '@common/utils'\r\nimport { PRODUCT_FAMILY_KEY, TRACKING_EVENTS } from '@common/constants'\r\nimport {\r\n trackBeginCheckout,\r\n trackCompleteBuy,\r\n trackCustomizeViewItem,\r\n trackFormError,\r\n trackPurchase,\r\n trackPurchaseError,\r\n trackSessionInfo,\r\n trackViewContent,\r\n trackUserInformation,\r\n trackEmailValidation,\r\n} from '@gtresolve/utils'\r\nimport { ResolveCartData, ResolvePurchaseData, ResolveCustomizeItemsData } from '@gtresolve/state/tracking/state'\r\nimport { CTAClickData, PageViewContentData, SessionInfo } from '@common/state/tracking/state'\r\nimport {\r\n getCartInfo,\r\n getCompleteBuyData,\r\n getCustomizeItemsData,\r\n getPageViewData,\r\n getPurchaseData,\r\n getSessionInfo,\r\n} from './track-helpers'\r\n\r\nexport function* gtresolveTrackingSaga(action: ReturnType) {\r\n const { trackingInfo } = action.payload\r\n const eventName = trackingInfo.event\r\n const trackData = trackingInfo.eventData || {}\r\n\r\n const errorMessage = (trackData.errorMessage as string) || ''\r\n const formErrors = (trackData.formErrors as string[]) || ['']\r\n const formIds = (trackData.formIds as string[]) || ['']\r\n const step = (trackData.step as number) || 0\r\n const ctaClickData: CTAClickData = {\r\n name: (trackData.name as string) || '',\r\n url: (trackData.url as string) || '',\r\n }\r\n const formName = (trackData.formName as string) || ''\r\n const pathName = (trackData.currentLocation as string) || ''\r\n const invoiceNumber = (trackData.invoiceNumber as string) || ''\r\n const userEmail: string = (trackData.userEmail as string) || ''\r\n const plan: string = (trackData.plan as string) || ''\r\n const buyType: string = (trackData.buyType as string) || ''\r\n\r\n switch (eventName) {\r\n case TRACKING_EVENTS.VIEW_ITEM: {\r\n const customizeItemsData: ResolveCustomizeItemsData = yield call(getCustomizeItemsData)\r\n trackCustomizeViewItem(customizeItemsData)\r\n break\r\n }\r\n case TRACKING_EVENTS.VIEW_CONTENT: {\r\n const viewContentData: PageViewContentData = yield call(getPageViewData)\r\n trackViewContent(viewContentData, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SESSION_INFORMATION: {\r\n const sessionData: SessionInfo = yield call(getSessionInfo)\r\n trackSessionInfo(sessionData)\r\n break\r\n }\r\n case TRACKING_EVENTS.USER_INFORMATION: {\r\n const cartData: ResolveCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackUserInformation(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.BEGIN_CHECKOUT: {\r\n const cartData: ResolveCartData = yield call(getCartInfo)\r\n trackBeginCheckout(cartData, step)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_BUY_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.G2R, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.PURCHASE: {\r\n const cartData: ResolveCartData = yield call(getCartInfo)\r\n const purchaseData: ResolvePurchaseData = yield call(getPurchaseData, invoiceNumber)\r\n trackPurchase(cartData, purchaseData)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_PURCHASE: {\r\n trackPurchaseError(errorMessage, plan, buyType)\r\n break\r\n }\r\n case TRACKING_EVENTS.EMAIL_VALIDATION: {\r\n trackEmailValidation(formName, userEmail)\r\n break\r\n }\r\n case TRACKING_EVENTS.COMPLETE_BUY_FLOW: {\r\n const cartData: ResolveCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackCompleteBuy(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_CONTACT_SALES_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.G2R, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.LOAD_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ABANDON_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SUBMIT_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_FORM: {\r\n trackFormError(formIds, formErrors, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.CLICK_CTA: {\r\n trackCTAClick(ctaClickData)\r\n break\r\n }\r\n default: {\r\n yield call(trackEvent, { event: eventName, eventData: trackData })\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGTResolveTrackingSaga() {\r\n yield takeEvery(ResolveTrackingActionTypes.TRACK, gtresolveTrackingSaga)\r\n}\r\n\r\nexport default initializeGTResolveTrackingSaga\r\n","import { CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { ResolveBillingFrequencyVolumeDiscountRecords, ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { getCheckoutState } from '@gtresolve/state/selectors'\r\nimport { calculateVolumeDiscount } from '@gtresolve/utils'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { call } from 'redux-saga-test-plan/matchers'\r\nimport { put, select, takeEvery } from 'redux-saga/effects'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nexport type CalculateVolumeDiscountSagaTriggerActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* calculateVolumeDiscountSaga(action: CalculateVolumeDiscountSagaTriggerActionType) {\r\n yield put(resolveCheckoutActions.setVolumeDiscountLoading(true))\r\n const selectedPlanSku =\r\n action.type === ResolveCheckoutActionTypes.SET_SELECTED_PLAN ? action.payload.planSku : undefined\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency: selectedCurrency = CURRENCY.USD } = locationInfo\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { volumeDiscount }: ResolveCheckoutState = yield select(getCheckoutState)\r\n if (selectedPlanSku) {\r\n const ResolvebillingFrequencyVolumeDiscountRecords = get(volumeDiscount, [selectedPlanSku, selectedCurrency])\r\n // skip the calculation if the checkout store already has selected plan volume discount data in the required currency\r\n if (isEmpty(ResolvebillingFrequencyVolumeDiscountRecords)) {\r\n const volumeDiscountForSelectedPlanAndCurrency: ResolveBillingFrequencyVolumeDiscountRecords = yield call(\r\n calculateVolumeDiscount,\r\n selectedPlan,\r\n selectedCurrency\r\n )\r\n yield put(\r\n resolveCheckoutActions.setVolumeDiscount(\r\n selectedPlan?.sKU,\r\n selectedCurrency,\r\n volumeDiscountForSelectedPlanAndCurrency\r\n )\r\n )\r\n }\r\n }\r\n yield put(resolveCheckoutActions.setVolumeDiscountLoading(false))\r\n}\r\n\r\nfunction* initializeCalculateVolumeDiscount() {\r\n yield takeEvery(\r\n [ResolveCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT, ResolveCheckoutActionTypes.SET_SELECTED_PLAN],\r\n calculateVolumeDiscountSaga\r\n )\r\n /* note: we need to add currency here, if the user can change currency,\r\n that would automatically trigger this saga to calculate the volume discount\r\n for the selected plan in that currency.\r\n */\r\n}\r\n\r\nexport default initializeCalculateVolumeDiscount\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { getCheckoutState } from '@gtresolve/state/selectors'\r\nimport { getSelectedTierIndex } from '@gtresolve/utils'\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* getSelectedTierSaga(action: ReturnType) {\r\n const { organizers } = action.payload\r\n const { billingFrequency }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const selectedTierIndex: number = yield call(\r\n getSelectedTierIndex,\r\n organizers,\r\n billingFrequency,\r\n selectedPlan,\r\n currency\r\n )\r\n yield put(resolveCheckoutActions.setSelectedTierIndex(selectedTierIndex, organizers))\r\n yield put(resolveCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency as TimePeriod))\r\n}\r\n\r\nfunction* initializeGetSelectedTier() {\r\n yield takeLatest(ResolveCheckoutActionTypes.SET_ORGANIZERS, getSelectedTierSaga)\r\n}\r\n\r\nexport default initializeGetSelectedTier\r\n","import { CHECKOUTFORM_STEPS } from '@gtresolve/constants'\r\nimport { ResolveErrorContent } from '@gtresolve/state/checkout-form-container/state'\r\nimport { ResolveBuyFormData, ResolveBuyFormState } from '@gtresolve/state/buy-form/state'\r\n\r\nexport const errorContent: ResolveErrorContent = {\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n errorInvalidCreditCardNumber: '',\r\n emailAddressAlreadyInUse: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorInvalidPostalCode: '',\r\n errorGenericMessage: '',\r\n errorInvalidAddress: '',\r\n errorRequiredTaxNumber: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\nexport const initialData: ResolveBuyFormData = {\r\n FirstName: '',\r\n LastName: '',\r\n Email: '',\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: '',\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n}\r\nexport const buyFormStateInitialData: ResolveBuyFormState = {\r\n clearEmail: false,\r\n initialData,\r\n steps: {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: { completed: false, error: false },\r\n },\r\n statesOptional: false,\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { ResolveCheckoutState, ResolveVolumeDiscountPerTier } from '@gtresolve/state/checkout/state'\r\nimport { getCheckoutState, getUserState } from '@gtresolve/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, take, takeLatest } from 'redux-saga/effects'\r\nimport { get, isEmpty } from 'lodash-es'\r\nimport { ResolveUserState } from '@gtresolve/state/user/state'\r\nimport { RESOLVE_USER_TYPES } from '@gtresolve/constants'\r\nimport { initialData } from '@gtresolve/data/buy-form'\r\nimport { getTotalVolumeDiscount } from '@gtresolve/utils'\r\n\r\nfunction* getVolumeDiscountSaga(action: ReturnType) {\r\n const { userType }: ResolveUserState = yield select(getUserState)\r\n if (userType === RESOLVE_USER_TYPES.ADDON) {\r\n const buyFormInitialData = { ...initialData, CountryCode: '' }\r\n yield put(resolveCheckoutActions.calculatePrice(buyFormInitialData, 'get volume discount saga'))\r\n } else {\r\n const { organizers, selectedTierIndex, billingFrequency } = action.payload\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const { volumeDiscount, selectedPlanSku }: ResolveCheckoutState = yield select(getCheckoutState)\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const isAnnual = billingFrequencyKey === BillingPeriod.ANNUAL\r\n const volumeDiscountPerTier: ResolveVolumeDiscountPerTier = get(volumeDiscount, [\r\n selectedPlanSku,\r\n currency,\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n\r\n if (!isEmpty(volumeDiscountPerTier)) {\r\n const { discountPricePerUnit } = volumeDiscountPerTier\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(resolveCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n } else {\r\n // since the volume discount is not available, we will wait to listen for next volume\r\n // discount set action being dispatched to store and then get the data\r\n const setVolumeDiscountAction: ReturnType = yield take(\r\n ResolveCheckoutActionTypes.SET_VOLUME_DISCOUNT\r\n )\r\n const { volumeDiscountForSelectedPlanAndCurrency } = setVolumeDiscountAction.payload\r\n const volumeDiscountPerTierNow = get(volumeDiscountForSelectedPlanAndCurrency, [\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n const { discountPricePerUnit } = volumeDiscountPerTierNow\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(resolveCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGetVolumeDiscountSaga() {\r\n yield takeLatest(ResolveCheckoutActionTypes.GET_VOLUME_DISCOUNT, getVolumeDiscountSaga)\r\n}\r\n\r\nexport default initializeGetVolumeDiscountSaga\r\n","import { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { getCheckoutState } from '@gtresolve/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* setBillingFrequencySaga(action: ReturnType) {\r\n const { frequency: billingFrequency } = action.payload\r\n const { organizers, selectedTierIndex }: ResolveCheckoutState = yield select(getCheckoutState)\r\n yield put(resolveCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency))\r\n}\r\n\r\nfunction* initializeSetBillingFrequencySaga() {\r\n yield takeLatest(ResolveCheckoutActionTypes.SET_BILLING_FREQUENCY, setBillingFrequencySaga)\r\n}\r\n\r\nexport default initializeSetBillingFrequencySaga\r\n","import { ResolveCheckCouponProductsValidityParameters, ResolveCouponSkuValidity } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { ResolveCalculateCouponPriceActionPayload } from '@gtresolve/state/coupon-util'\r\nimport { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport {\r\n checkCouponGenericValidity,\r\n checkCouponProductsValidity,\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n} from '@gtresolve/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* validateCouponSaga(action: ReturnType) {\r\n const { couponValidationData, isAttemptingUrlCoupon } = action.payload\r\n const { couponServerData, selectedPlan, selectedAddons, billingFrequency } = couponValidationData\r\n const selectedPlanSku = selectedPlan?.sKU\r\n const isCouponGenericValid: boolean = yield call(checkCouponGenericValidity, couponServerData as CouponServerData)\r\n if (isCouponGenericValid) {\r\n const checkProductValidityArguments: ResolveCheckCouponProductsValidityParameters = {\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }\r\n const couponSkuValidity: ResolveCouponSkuValidity = yield call(\r\n checkCouponProductsValidity,\r\n checkProductValidityArguments\r\n )\r\n const isCouponAppliedToMinimumProductsInCart: boolean = yield call(\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n couponSkuValidity\r\n )\r\n\r\n yield put(resolveCouponActions.setCouponValidAndApplied(isCouponAppliedToMinimumProductsInCart))\r\n if (isCouponAppliedToMinimumProductsInCart) {\r\n const calculateCouponPriceActionPayload: ResolveCalculateCouponPriceActionPayload = {\r\n ...couponValidationData,\r\n couponSkuValidity,\r\n }\r\n yield put(resolveCouponActions.calculateCouponPrice(calculateCouponPriceActionPayload))\r\n yield put(resolveCouponActions.setUrlCouponActive(isAttemptingUrlCoupon))\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(resolveCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(resolveCouponActions.resetCouponData())\r\n }\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(resolveCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(resolveCouponActions.resetCouponData())\r\n }\r\n}\r\n\r\nexport default function* initializeValidateCouponSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.VALIDATE_COUPON, validateCouponSaga)\r\n}\r\n","import { getCouponInfo } from '@common/services'\r\nimport { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { contentActions } from '@gtresolve/state/content/actions'\r\nimport { CouponInfoServerResponse } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* getCouponDetailsSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n try {\r\n const couponInfoServerResponse: CouponInfoServerResponse = yield call(getCouponInfo, couponCode)\r\n if (!isEmpty(couponInfoServerResponse.data)) {\r\n const {\r\n data: { couponCode: couponServerResponseData, couponDisclaimer },\r\n } = couponInfoServerResponse\r\n if (couponServerResponseData) {\r\n yield put(resolveCouponActions.setCouponServerData(couponServerResponseData))\r\n }\r\n if (couponDisclaimer) {\r\n yield put(contentActions.setCouponDisclaimer(couponDisclaimer))\r\n }\r\n }\r\n } catch (e) {\r\n console.error('unable to get url coupon details')\r\n yield put(resolveCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeGetCouponDetailsSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.GET_COUPON_DETAILS, getCouponDetailsSaga)\r\n}\r\n","import { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { ResolveCouponProcessedDataPerSku } from '@gtresolve/state/coupon/state'\r\nimport {\r\n GetResolveProductItemsParameters,\r\n ResolveProcessCouponDataParameters,\r\n ResolveProductDetails,\r\n} from '@gtresolve/state/coupon-util'\r\nimport { getCouponItemPriceMap, getProductItemsMap, processCouponData } from '@gtresolve/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { TimePeriod, COUPON_DISCOUNT_TYPE } from '@common/constants'\r\n\r\nfunction* calculateCouponPriceSaga(action: ReturnType) {\r\n const { couponCalculationData } = action.payload\r\n const {\r\n couponServerData,\r\n couponSkuValidity,\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n } = couponCalculationData\r\n const { couponDiscountType } = couponServerData\r\n const getProductItemsArguments: GetResolveProductItemsParameters = {\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n }\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const productItemsMap: Map = yield call(getProductItemsMap, getProductItemsArguments)\r\n const couponItemsMap: Map = yield call(\r\n getCouponItemPriceMap,\r\n couponServerData,\r\n selectedCurrency,\r\n isAnnual\r\n )\r\n const processCouponDataArguments: ResolveProcessCouponDataParameters = {\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n }\r\n const couponProcessedDataPerSku: ResolveCouponProcessedDataPerSku | null = yield call(\r\n processCouponData,\r\n processCouponDataArguments\r\n )\r\n\r\n if (couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE) {\r\n yield put(\r\n resolveCouponActions.checkVolumeDiscountAgainstRepriceCoupon({\r\n couponServerData,\r\n couponProcessedDataPerSku,\r\n selectedPlan,\r\n })\r\n )\r\n }\r\n yield put(resolveCouponActions.setCouponProcessedData(couponProcessedDataPerSku))\r\n}\r\n\r\nexport default function* initializeCalculateCouponPriceSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.CALCULATE_COUPON_PRICE, calculateCouponPriceSaga)\r\n}\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { LocationActionTypes } from '@common/state/location/actions'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { ResolveValidateCouponActionPayload } from '@gtresolve/state/coupon-util'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { getCheckoutState, getCouponState } from '@gtresolve/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { getAvailableCouponServerData } from '@gtresolve/utils'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype PartialValidateCouponActionPayload = Omit\r\n\r\ntype ObserveValidateCouponAction =\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType // this covers both organizers and selected tier index\r\n | ReturnType\r\n | ReturnType // this action is used to only trigger the below saga and avoid going to reducer\r\n\r\ntype CouponDataActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* observeValidateCouponSaga(action: ObserveValidateCouponAction) {\r\n try {\r\n const {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }: ResolveCheckoutState = yield select(getCheckoutState)\r\n\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const [couponServerDataFromState, isUrlCouponData]: [CouponServerData | null, boolean] = yield call(\r\n getAvailableCouponServerData,\r\n coupon,\r\n selectedPlan\r\n )\r\n\r\n const validateCouponActionPartialPayload: PartialValidateCouponActionPayload = {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlan,\r\n selectedAddons,\r\n billingFrequency: billingFrequency as TimePeriod,\r\n selectedCurrency: currency,\r\n }\r\n\r\n const isCouponDataAction =\r\n action.type === ResolveCouponActionTypes.SET_COUPON_SERVER_DATA ||\r\n action.type === ResolveCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON\r\n\r\n if (couponServerDataFromState && !isCouponDataAction) {\r\n const validateCouponActionPayload: ResolveValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData: couponServerDataFromState,\r\n }\r\n switch (action.type) {\r\n case ResolveCheckoutActionTypes.SET_SELECTED_PLAN: {\r\n const { planSku } = action.payload\r\n const selectedPlanByAction: ResolvePlan = yield call(getSelectedPlan, planSku)\r\n validateCouponActionPayload.selectedPlan = selectedPlanByAction\r\n break\r\n }\r\n case ResolveCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n validateCouponActionPayload.selectedAddons = addons\r\n break\r\n }\r\n case ResolveCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { organizers: payloadOrganizers, selectedTierIndex: payloadTierIndex } = action.payload\r\n validateCouponActionPayload.organizers = payloadOrganizers\r\n validateCouponActionPayload.selectedTierIndex = payloadTierIndex\r\n break\r\n }\r\n case ResolveCheckoutActionTypes.SET_BILLING_FREQUENCY: {\r\n const { frequency } = action.payload\r\n validateCouponActionPayload.billingFrequency = frequency\r\n break\r\n }\r\n default: {\r\n break // do nothing\r\n }\r\n }\r\n // if url coupon is available, attempt to validate the url coupon again before checking for CMS coupon\r\n yield put(resolveCouponActions.validateCoupon(validateCouponActionPayload, isUrlCouponData))\r\n } else if (isCouponDataAction) {\r\n const { payload } = action as CouponDataActionType\r\n const { couponServerData } = payload\r\n const validateCouponActionPayload: ResolveValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData,\r\n }\r\n // isUrlCoupon should be true or false based on the action type\r\n const isUrlCoupon = action.type === ResolveCouponActionTypes.SET_COUPON_SERVER_DATA\r\n yield put(resolveCouponActions.validateCoupon(validateCouponActionPayload, isUrlCoupon))\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n}\r\n\r\nexport default function* initializeObserveValidateCouponSaga() {\r\n yield takeLatest(\r\n [\r\n ResolveCouponActionTypes.SET_COUPON_SERVER_DATA,\r\n ResolveCheckoutActionTypes.SET_SELECTED_PLAN,\r\n ResolveCheckoutActionTypes.SET_ORGANIZERS,\r\n ResolveCheckoutActionTypes.SET_SELECTED_ADDONS,\r\n ResolveCheckoutActionTypes.SET_BILLING_FREQUENCY,\r\n ResolveCheckoutActionTypes.SET_SELECTED_TIER_INDEX,\r\n ResolveCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON,\r\n LocationActionTypes.SET_IS_LOCATION_INFO_LOADED,\r\n ],\r\n observeValidateCouponSaga\r\n )\r\n}\r\n","import { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* attempUrlCouponSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n if (couponCode) {\r\n // if url promotion available\r\n yield put(resolveCouponActions.getCouponDetails(couponCode as string))\r\n } else {\r\n yield put(resolveCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeAttempUrlCouponSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.SET_URL_COUPON_CODE, attempUrlCouponSaga)\r\n}\r\n","import { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* checkCMSCouponSaga(action: ReturnType) {\r\n // clear out previous coupon processed data\r\n yield put(resolveCouponActions.resetCouponData())\r\n const { selectedPlanSku } = action.payload\r\n const selectedPlan: ResolvePlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { activeCoupon } = selectedPlan ?? {} ?? {}\r\n if (activeCoupon && !isEmpty(activeCoupon)) {\r\n // apply the cms coupon only if cms coupon is available\r\n yield put(resolveCouponActions.observeValidateCMSCoupon(activeCoupon))\r\n }\r\n}\r\n\r\nexport default function* initialCheckCMSCouponSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.CHECK_CMS_COUPON, checkCMSCouponSaga)\r\n}\r\n","import { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\nimport { call, select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState, getCouponState } from '@gtresolve/state/selectors'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\nimport { COUPON_DISCOUNT_TYPE } from '@common/constants'\r\nimport { getActiveCouponServerData } from '@gtresolve/utils'\r\nimport { ResolveCouponState } from '@gtresolve/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype CheckVolumeDiscountAction =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* checkVolumeDiscountAgainstRepriceCouponSaga(action: CheckVolumeDiscountAction) {\r\n const coupon: ResolveCouponState = yield select(getCouponState)\r\n const { selectedPlanSku }: ResolveCheckoutState = yield select(getCheckoutState)\r\n let { couponProcessedDataPerSku } = coupon\r\n let volumeDiscountPrice = 0\r\n let selectedPlan: ResolvePlan = yield call(getSelectedPlan, selectedPlanSku)\r\n let couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n\r\n if (action.type === ResolveCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE) {\r\n volumeDiscountPrice = action.payload.currentVolumeDiscountPrice\r\n } else if (action.type === ResolveCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON) {\r\n const { checkVolumeDiscountData } = action.payload\r\n couponServerData = checkVolumeDiscountData.couponServerData\r\n couponProcessedDataPerSku = checkVolumeDiscountData.couponProcessedDataPerSku\r\n selectedPlan = checkVolumeDiscountData.selectedPlan\r\n const { currentVolumeDiscountPrice }: ResolveCheckoutState = yield select(getCheckoutState)\r\n volumeDiscountPrice = currentVolumeDiscountPrice\r\n }\r\n\r\n if (\r\n couponServerData &&\r\n !isEmpty(couponServerData) &&\r\n couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE\r\n ) {\r\n const couponDiscountTotalSavings: number = get(\r\n couponProcessedDataPerSku,\r\n [selectedPlan?.sKU, 'discountTotalSavings'],\r\n 0\r\n )\r\n if (volumeDiscountPrice < couponDiscountTotalSavings) {\r\n yield put(resolveCheckoutActions.adjustCurrentVolumeDiscountForRepriceCoupon())\r\n }\r\n }\r\n}\r\n\r\nexport default function* initializeCheckVolumeDiscountAgainstRepriceCouponSaga() {\r\n yield takeLatest(\r\n [\r\n ResolveCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON,\r\n ResolveCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE,\r\n ],\r\n checkVolumeDiscountAgainstRepriceCouponSaga\r\n )\r\n}\r\n","import { resolveCouponActions, ResolveCouponActionTypes } from '@gtresolve/state/coupon/actions'\r\nimport { put, takeLatest, take } from 'redux-saga/effects'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState } from '@gtresolve/state/selectors'\r\nimport { ResolveCheckoutState } from '@gtresolve/state/checkout/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { resolveCheckoutActions, ResolveCheckoutActionTypes } from '@gtresolve/state/checkout/actions'\r\n\r\nfunction* attemptCMSCouponSaga() {\r\n // check if there's a coupon available from CMS\r\n let { selectedPlanSku }: ResolveCheckoutState = yield select(getCheckoutState)\r\n if (isEmpty(selectedPlanSku)) {\r\n const selectedPlanAction: ReturnType = yield take(\r\n ResolveCheckoutActionTypes.SET_SELECTED_PLAN\r\n )\r\n selectedPlanSku = selectedPlanAction.payload.planSku\r\n }\r\n yield put(resolveCouponActions.checkCMSCoupon(selectedPlanSku))\r\n}\r\n\r\nexport default function* initializeAttemptCMSCouponSaga() {\r\n yield takeLatest(ResolveCouponActionTypes.ATTEMPT_FOR_CMS_COUPON, attemptCMSCouponSaga)\r\n}\r\n","import initializeLoadContentSaga from './content/load-content'\r\nimport initializeSubmitFormSaga from './checkout-form/form-submission'\r\nimport initializeAbandonedCartSaga from './user/abandoned-cart'\r\nimport initializeExistingUserSaga from './user/existing-user'\r\nimport initializeCreateUserSaga from './user/create-user'\r\nimport initializeGetAccessToken from './user/get-token'\r\nimport initializeLogin from './user/login'\r\nimport initializeLogout from './user/logout'\r\nimport initializeLoadSavedStateSaga from './saved-state/saved-state'\r\nimport initializeCalculatePriceSaga from './checkout-form/calculate-price'\r\nimport initializeCreateBillingInfoSaga from './checkout-form/create-billing-info'\r\nimport initializeCreatePaymentSaga from './checkout-form/create-payment'\r\nimport initializeCreateAndSubmitPaymentSaga from './checkout-form/create-and-submit-payment'\r\nimport initializeGetPaymentMethodSaga from './checkout-form/get-payment-methods'\r\nimport initializeSubmitPaymentSaga from './checkout-form/submit-payment'\r\nimport initializeUserLoggedInSaga from './user/user-logged-in'\r\nimport initializeExistingUserSubmitFormSaga from './checkout-form/existing-user-form-submission'\r\nimport initializeResetCheckoutFormAffectedStatesSaga from './checkout-form/reset-checkout-form-affected-states'\r\nimport initializeGTResolveTrackingSaga from './tracking/track-event'\r\nimport initializeCalculateVolumeDiscountSaga from './checkout-form/calculate-volume-discount'\r\nimport initializeGetSelectedTier from './checkout-form/get-selected-tier'\r\nimport initializeGetVolumeDiscountSaga from './checkout-form/get-volume-discount'\r\nimport initializeSetBillingFrequencySaga from './checkout-form/set-billing-frequency'\r\nimport initializeValidateCouponSaga from './coupon/validate-coupon'\r\nimport initializeGetCouponDetailsSaga from './coupon/get-coupon-details'\r\nimport initializeCalculateCouponPriceSaga from './coupon/calculate-coupon-price'\r\nimport initializeObserveValidateCouponSaga from './coupon/observe-validate-coupon'\r\nimport initializeAttempUrlCouponSaga from './coupon/attempt-url-coupon'\r\nimport initialCheckCMSCouponSaga from './coupon/check-cms-coupon'\r\nimport initializeCheckVolumeDiscountAgainstRepriceCouponSaga from './coupon/check-volume-discount-against-reprice-coupon'\r\nimport initializeAttemptCMSCouponSaga from './coupon/attempt-cms-coupon'\r\n\r\nexport const gtResolveSagas = {\r\n gtresolveContentSaga: initializeLoadContentSaga,\r\n gtresolveSubmitFormSaga: initializeSubmitFormSaga,\r\n gtresolveAbandonedCartSaga: initializeAbandonedCartSaga,\r\n gtresolveExistingUserSaga: initializeExistingUserSaga,\r\n gtresolveGetAccessToken: initializeGetAccessToken,\r\n gtresolveUserLoginSaga: initializeLogin,\r\n gtresolveUserLogoutSaga: initializeLogout,\r\n gtresolveCreateUserSaga: initializeCreateUserSaga,\r\n gtresolveCalculatePriceSaga: initializeCalculatePriceSaga,\r\n gtresolveCreateBillingInfoSaga: initializeCreateBillingInfoSaga,\r\n gtresolveCreatePaymentSaga: initializeCreatePaymentSaga,\r\n gtresolveCreateAndSubmitPaymentSaga: initializeCreateAndSubmitPaymentSaga,\r\n gtresolveGetPaymentSaga: initializeGetPaymentMethodSaga,\r\n gtresolveSubmitPaymentSaga: initializeSubmitPaymentSaga,\r\n gtresolveLoadSavedStateSaga: initializeLoadSavedStateSaga,\r\n gtresolveUserLoggedInSaga: initializeUserLoggedInSaga,\r\n gtresolveExistingUserSubmitFormSaga: initializeExistingUserSubmitFormSaga,\r\n gtresolveResetCheckoutFormAffectedStates: initializeResetCheckoutFormAffectedStatesSaga,\r\n gtresolveTrackingSaga: initializeGTResolveTrackingSaga,\r\n gtresolveCalculateVolumeDiscountSaga: initializeCalculateVolumeDiscountSaga,\r\n gtresolveGetVolumeDiscountSaga: initializeGetVolumeDiscountSaga,\r\n gtresolveGetSelectedTierSaga: initializeGetSelectedTier,\r\n gtresolveSetBillingFrequencySaga: initializeSetBillingFrequencySaga,\r\n gtresolveValidateCouponSaga: initializeValidateCouponSaga,\r\n gtresolveGetCouponDetailsSaga: initializeGetCouponDetailsSaga,\r\n gtresolveCalculateCouponPriceSaga: initializeCalculateCouponPriceSaga,\r\n gtresolveObserveValidateCouponSaga: initializeObserveValidateCouponSaga,\r\n gtresolveAttemptUrlCouponSaga: initializeAttempUrlCouponSaga,\r\n gtresolveHeckCMSCouponSaga: initialCheckCMSCouponSaga,\r\n gtresolveCheckVolumeDiscountAgainstRepriceCouponSaga: initializeCheckVolumeDiscountAgainstRepriceCouponSaga,\r\n gtresolveAttemptCMSCouponSaga: initializeAttemptCMSCouponSaga,\r\n}\r\n\r\nexport default gtResolveSagas\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport lmiproServices from '@lmipro/services'\r\nimport { contentActions, LmiProContentActionTypes } from '@lmipro/state/content/actions'\r\n\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { PRODUCT_SKU } from '@common/constants'\r\n\r\nfunction* loadContentSaga() {\r\n try {\r\n const labelServerResponse: GenericResponse = yield call(lmiproServices.getLmiProLabelData)\r\n if (labelServerResponse && labelServerResponse.data) {\r\n const { labels, plans, ...content } = labelServerResponse.data\r\n const { sEOPageTitle } = labels\r\n const plansWithPricing = plans.map((plan: any) => {\r\n if (plan.sKU === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS) {\r\n return {\r\n ...plan,\r\n pricingInfo: {\r\n USD: {\r\n monthly: {\r\n tier1: {\r\n min: 1,\r\n max: 4,\r\n price: 29.0,\r\n },\r\n tier2: {\r\n min: 5,\r\n max: 10,\r\n price: 27.55,\r\n },\r\n tier3: {\r\n min: 11,\r\n max: 25,\r\n price: 26.1,\r\n },\r\n tier4: {\r\n min: 26,\r\n max: 50,\r\n price: 24.65,\r\n },\r\n tier5: {\r\n min: 51,\r\n max: 2147483647,\r\n price: 23.2,\r\n },\r\n },\r\n annual: {\r\n tier1: {\r\n min: 1,\r\n max: 4,\r\n price: 23.0,\r\n },\r\n tier2: {\r\n min: 5,\r\n max: 10,\r\n price: 21.85,\r\n },\r\n tier3: {\r\n min: 11,\r\n max: 25,\r\n price: 20.7,\r\n },\r\n tier4: {\r\n min: 26,\r\n max: 50,\r\n price: 19.55,\r\n },\r\n tier5: {\r\n min: 51,\r\n max: 2147483647,\r\n price: 18.4,\r\n },\r\n },\r\n },\r\n },\r\n }\r\n }\r\n return plan\r\n })\r\n yield call(() => {\r\n if (sEOPageTitle) document.title = sEOPageTitle\r\n })\r\n locationActions.getLocationInfo()\r\n yield put(contentActions.setContent(content, { ...labels }, plansWithPricing, plansWithPricing))\r\n yield put(contentActions.setContentLoaded(true))\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeLmiProLoadContentSaga() {\r\n yield takeEvery(LmiProContentActionTypes.GET_LABEL_CONTENT, loadContentSaga)\r\n}\r\n\r\nexport default initializeLmiProLoadContentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport lmiproServices from '@lmipro/services'\r\nimport { LmiProUserAccountType } from '@lmipro/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createUserSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const userCreationResponse: GenericResponse = yield call(lmiproServices.createUserAccount, userValues)\r\n if (userCreationResponse.data) {\r\n const userData: LmiProUserAccountType = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserSaga() {\r\n yield takeEvery(LmiProUserActionTypes.CREATE_NEW_USER, createUserSaga)\r\n}\r\n\r\nexport default initializeCreateUserSaga\r\n","import { LmiProBillingInfoDataType } from '@lmipro/state/checkout/state'\r\nimport { LmiProBuyFormData } from '@lmipro/state/buy-form/state'\r\n\r\nexport const getBillingValues = (values: LmiProBuyFormData) => {\r\n const billingValues: LmiProBillingInfoDataType = {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n postalCode: values.ZipCode,\r\n firstName: values.BillingFirstName,\r\n lastName: values.BillingLastName,\r\n email: values.Email,\r\n companyName: values.CompanyName,\r\n phoneNumber: '',\r\n taxNumber: values.TaxNumber,\r\n federalTaxType: values.TaxType,\r\n }\r\n return billingValues\r\n}\r\n","import { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { getCheckoutState, getPlanData } from '@lmipro/state/selectors'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { select, call, SelectEffect, CallEffect } from 'redux-saga/effects'\r\nimport { getCurrentPlan, getPlanNameSet } from '@lmipro/utils/get-current-plan'\r\nimport { getCurrentAddons } from '@lmipro/utils/get-current-addons'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { UrlParams, updatePlanUrlParam } from '@common/utils'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport function* getSelectedPlan(\r\n planSku?: string\r\n): Generator {\r\n const { selectedPlanSku }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const planSkuToRetrieve = planSku || selectedPlanSku\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiProPlan = getCurrentPlan(planSkuToRetrieve, planData)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport function* getSelectedAddons(): Generator<\r\n SelectEffect | CallEffect | CallEffect,\r\n LmiProAddon[],\r\n LmiProCheckoutState & LmiProPlan & LmiProAddon[]\r\n> {\r\n const { selectedAddons }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const myAddons: LmiProAddon[] = yield call(getCurrentAddons, selectedAddons, selectedPlan)\r\n return myAddons\r\n}\r\n\r\nexport function* getUpdatedPlanUrlParams() {\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const planNameSet: Set = yield call(getPlanNameSet, planData)\r\n const planUrlParams: UrlParams = yield call(\r\n updatePlanUrlParam,\r\n isEmpty(selectedPlan) ? '' : selectedPlan.name,\r\n planNameSet\r\n )\r\n return planUrlParams\r\n}\r\n","import { call, put, select, debounce } from 'redux-saga/effects'\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport { submitAbandonedCart } from '@lmipro/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { COOKIE_NAMES, LANGUAGE_CODES } from '@common/constants'\r\nimport Cookies from 'js-cookie'\r\nimport { getCheckoutState, getUserState } from '@lmipro/state/selectors'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { LmiProAbandonedCartPayload, LmiProUserState } from '@lmipro/state/user/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { sanitizePayload } from '@common/utils/aws-utils'\r\n\r\nexport function* abandonedCartSaga(action: ReturnType) {\r\n const { isTrial, email, success, form } = action.payload.abandonedCartData\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const urlSplitForLanguage = window.location.pathname.split('/')[1]\r\n const isValidLanguageCode = Object.values(LANGUAGE_CODES).includes(urlSplitForLanguage)\r\n const siteLanguage = isValidLanguageCode ? urlSplitForLanguage : LANGUAGE_CODES.English\r\n const data: LmiProAbandonedCartPayload = {\r\n success: success.toString(),\r\n email,\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n country: locationInfo?.country,\r\n language: siteLanguage,\r\n program: null,\r\n firstName: null,\r\n lastName: null,\r\n plan: null,\r\n }\r\n\r\n if (isTrial && !success) {\r\n data.firstName = form?.firstName\r\n data.lastName = form?.lastName\r\n }\r\n\r\n // Include billing and plan information if cart is abandoned in buy form (1st abandoned cart call only)\r\n if (!isTrial && !success) {\r\n const { existingUserInformation }: LmiProUserState = yield select(getUserState)\r\n const { selectedPlanSku }: LmiProCheckoutState = yield select(getCheckoutState)\r\n data.plan = selectedPlanSku\r\n data.firstName = form?.firstName || existingUserInformation?.Name?.GivenName\r\n data.lastName = form?.lastName || existingUserInformation?.Name?.FamilyName\r\n data.program = 'LMI_Global_EN_TRG_Lead_Promo_Abandoned_Purchase'\r\n }\r\n\r\n try {\r\n // yield delay(1000)\r\n yield call(submitAbandonedCart, sanitizePayload(data))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to post abandoned email api' }))\r\n }\r\n}\r\n\r\nfunction* initializeAbandonedCartSaga() {\r\n yield debounce(1000, LmiProUserActionTypes.SUBMIT_ABANDONED_CART, abandonedCartSaga)\r\n}\r\n\r\nexport default initializeAbandonedCartSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport lmiproServices from '@lmipro/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createBillingInfoSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.CREATE_BILLING_INFO_SAGA\r\n try {\r\n const { billingValues } = action.payload\r\n const billingResponse: GenericResponse = yield call(lmiproServices.createBillingInfo, billingValues)\r\n if (billingResponse.status === 200 || billingResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save billing info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save billing info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreateBillingInfoSaga() {\r\n yield takeEvery(LmiProCheckoutActionTypes.CREATE_BILLING_INFO, createBillingInfoSaga)\r\n}\r\n\r\nexport default initializeCreateBillingInfoSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { submitPayment } from '@lmipro/services'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* submitPaymentSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.SUBMIT_PAYMENT_SAGA\r\n try {\r\n const { submitValues } = action.payload\r\n const submitCreation: GenericResponse = yield call(submitPayment, submitValues)\r\n if (submitCreation && submitCreation.data) {\r\n return submitCreation.data\r\n }\r\n } catch {\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'failed to submit payment',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'failed to submit payment',\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeSubmitPaymentSaga() {\r\n yield takeEvery(LmiProCheckoutActionTypes.SUBMIT_PAYMENT, submitPaymentSaga)\r\n}\r\n\r\nexport default initializeSubmitPaymentSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport commonServices from '@lmipro/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { LmiProSubmitWithCardAddResponse } from '@lmipro/state/checkout/state'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\n\r\nexport function* createAndSubmitPaymentSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n try {\r\n const { submitValues } = action.payload\r\n const createAndSubmitPaymentResponse: LmiProSubmitWithCardAddResponse = yield call(\r\n commonServices.submitPaymentWithCardAdd,\r\n submitValues\r\n )\r\n if (createAndSubmitPaymentResponse.status === 200 || createAndSubmitPaymentResponse.status === 204) {\r\n return createAndSubmitPaymentResponse.data\r\n }\r\n } catch {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n trackErrorMessage: 'failed to save payment info',\r\n })\r\n )\r\n }\r\n return undefined\r\n}\r\n\r\nfunction* initializeCreateAndSubmitPaymentSaga() {\r\n yield takeEvery(LmiProCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, createAndSubmitPaymentSaga)\r\n}\r\n\r\nexport default initializeCreateAndSubmitPaymentSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { lmiproBuyFormActions, LmiProBuyFormActionTypes } from '@lmipro/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { lmiproUserActions } from '@lmipro/state/user/actions'\r\nimport { lmiproCheckoutActions } from '@lmipro/state/checkout/actions'\r\nimport {\r\n LmiProUserDataType,\r\n LmiProUserState,\r\n LmiProUserAccountType,\r\n LmiProAbandonedCartDataType,\r\n} from '@lmipro/state/user/state'\r\nimport {\r\n LmiProBillingInfoDataType,\r\n LmiProCreditCardDataType,\r\n LmiProCheckoutState,\r\n LmiProSubmitWithCardAddDataType,\r\n LmiProSubmitWithCardAddData,\r\n} from '@lmipro/state/checkout/state'\r\nimport { createTokenSaga } from '@common/sagas/flex/create-flex-token'\r\nimport { createUserSaga } from '@lmipro/saga/user/create-user'\r\nimport { getBillingValues } from '@lmipro/utils/get-billing-values'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmipro/saga/content/content-helpers'\r\nimport { getPaymentItems } from '@lmipro/utils/get-item-values'\r\nimport {\r\n getBuyFormState,\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getUserState,\r\n getPlanData,\r\n} from '@lmipro/state/selectors'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, LMIPRO_TRACKING_COMPONENTS, LMIPRO_USER_TYPES } from '@lmipro/constants'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { LmiProContentData } from '@lmipro/state/content-data'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { PRODUCTS, TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { clearState, getActiveCouponServerData, getSubscriptionInfo } from '@lmipro/utils'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProBuyFormState } from '@lmipro/state/buy-form/state'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { FatalErrorMessageType, FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { LmiProSubmitPaymentResponseData } from '@lmipro/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@lmipro/saga/user/abandoned-cart'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { createAndSubmitPaymentSaga } from './create-and-submit-payment'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n ExpirationDate,\r\n CompanyName,\r\n } = action.payload.values\r\n const checkout: LmiProCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingUserInformation }: LmiProUserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { fingerprint, keyInfo, isCardinalSetupComplete }: FlexState = yield select(getFlexState)\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: LmiProContentData =\r\n yield select(getContentData)\r\n const buyFormState: LmiProBuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === LMIPRO_USER_TYPES.TRIALER ||\r\n userType === LMIPRO_USER_TYPES.EXPIRED ||\r\n userType === LMIPRO_USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiProAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n const errorMessage: FatalErrorMessageType = {\r\n trackErrorMessage: 'regular form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n }\r\n\r\n try {\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const billingValues: LmiProBillingInfoDataType = getBillingValues(action.payload.values)\r\n const subscriptionInfo = getSubscriptionInfo(TimePeriod.Month, selectedPlan, planData)\r\n const items = getPaymentItems(selectedPlan, 1, checkout.billingFrequency, selectedAddons, subscriptionInfo)\r\n\r\n const userValues: LmiProUserDataType = {\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n country: billingValues.country,\r\n fingerPrintSessionId: fingerprint,\r\n productName: PRODUCTS.LMIPRO,\r\n }\r\n // #region Get flex token\r\n const flexTokenAction = flexActions.createToken(ExpirationDate)\r\n const tokenData: string = yield call(createTokenSaga, flexTokenAction)\r\n if (tokenData) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = true\r\n } else {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create flex token' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n // if Cardinal script is not set up by now, this indicates setup went wrong. Throw fatal error\r\n if (isScaEnabledForMid && !isCardinalSetupComplete) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = false\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n // #endregion\r\n\r\n // #region trigger Cardinal bin.process. Necessary for PSD2 flow.\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const { token }: FlexState = yield select(getFlexState)\r\n const mask = token?.data?.number\r\n if (isScaEnabledForMid && mask) {\r\n const maskCardBin = mask.slice(0, 6)\r\n const { Status } = yield Cardinal.trigger('bin.process', maskCardBin)\r\n if (Status) {\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n } else {\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n } else {\r\n // Bypass if SCA is not enabled.\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n }\r\n\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n let userKey = ''\r\n let accountKey = ''\r\n\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n const createUserAction = lmiproUserActions.createNewUser(userValues)\r\n const userData: LmiProUserAccountType = yield call(createUserSaga, createUserAction)\r\n if (userData) {\r\n userKey = userData.UserKey\r\n accountKey = userData.BillingId\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(lmiproCheckoutActions.setAutoLogin(userData.xAutoLoginTicket))\r\n }\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n } else {\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n }\r\n // #endregion\r\n\r\n // #region Save billing info\r\n if (\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] &&\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] &&\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n ) {\r\n const extraBillingValues = { ...billingValues }\r\n extraBillingValues.phoneNumber = ContactPhone\r\n\r\n const createBillingInfoAction = lmiproCheckoutActions.createBillingInfo(extraBillingValues)\r\n const savedBillingData: boolean = yield call(createBillingInfoSaga, createBillingInfoAction)\r\n if (savedBillingData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n }\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region intialialize BOSS variables\r\n let paymentMethodKey = ''\r\n let paymentKey = ''\r\n const flexFormData: LmiProCreditCardDataType = {\r\n expirationMonth: ExpirationDate.substr(0, 2),\r\n expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n flexResponse: tokenData,\r\n flexKeyId: keyInfo.flexKey.keyId,\r\n firstName,\r\n lastName,\r\n email,\r\n }\r\n // //#endregion\r\n\r\n // #region process purchase - 1st purchase call - create and save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const submitValues: LmiProSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n }\r\n\r\n const createAndSubmitPaymentAction = lmiproCheckoutActions.createAndSubmitPayment(submitValues)\r\n const createAndSubmitPaymentData: LmiProSubmitWithCardAddData = yield call(\r\n createAndSubmitPaymentSaga,\r\n createAndSubmitPaymentAction\r\n )\r\n let isChallengeRequired = false\r\n if (createAndSubmitPaymentData) {\r\n isChallengeRequired = (createAndSubmitPaymentData.isScaRequired && isScaEnabledForMid) || false\r\n paymentMethodKey = createAndSubmitPaymentData?.paymentMethodKey\r\n paymentKey = createAndSubmitPaymentData?.paymentKey\r\n }\r\n\r\n const payerAuthEnrollment = createAndSubmitPaymentData?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (createAndSubmitPaymentData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.PURCHASE,\r\n eventData: { invoiceNumber: createAndSubmitPaymentData.invoiceNumber },\r\n },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: LmiProSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: true,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = lmiproCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiProSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmiproTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: LmiProAbandonedCartDataType = {\r\n email,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = lmiproUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(lmiproUserActions.setDisplayName(firstName))\r\n yield put(\r\n lmiproTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentName\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n CompanyName,\r\n })\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(lmiproCheckoutActions.setPurchaseComplete(true))\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(LmiProBuyFormActionTypes.SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport commonServices, { EmailType, EmailCheckResponse } from '@common/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { lmiproBuyFormActions } from '@lmipro/state/buy-form/actions'\r\n\r\nexport function* existingUserSaga(action: ReturnType) {\r\n const data: EmailType = { emailAddress: action.payload.email.toLowerCase() }\r\n try {\r\n const response: EmailCheckResponse = yield call(commonServices.canUserAuthenticate, data)\r\n if (response && response.data) {\r\n if (response.data.canUserAuthenticate) {\r\n yield put(lmiproBuyFormActions.setClearEmail(true))\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to verify email' }))\r\n return false\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeExistingUserSaga() {\r\n yield takeEvery(LmiProUserActionTypes.CHECK_EXISTING_USER, existingUserSaga)\r\n}\r\n\r\nexport default initializeExistingUserSaga\r\n","import { takeLatest, put, call } from 'redux-saga/effects'\r\n\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport authClass from '@common/utils/auth-class'\r\nimport { saveToken, appInsightsTrackEvent } from '@common/utils'\r\nimport commonServices from '@common/services'\r\nimport { Token } from '@getgo/auth-client'\r\n\r\nfunction* getAccessToken() {\r\n try {\r\n yield put(lmiproUserActions.setVerifyingToken(true))\r\n const newAccessToken: Token | undefined = yield call(authClass.authInit)\r\n // if new token save it\r\n if (newAccessToken) {\r\n yield put(lmiproUserActions.setAccessToken(newAccessToken))\r\n yield call(saveToken, newAccessToken)\r\n } else {\r\n try {\r\n yield call(commonServices.clearUserSession)\r\n } catch (e: any) {\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n }\r\n yield put(lmiproUserActions.setIsUserLoggedIn(!!newAccessToken))\r\n // to check if this action ran\r\n yield put(lmiproUserActions.setVerifyShouldUserLogIn(true))\r\n yield put(lmiproUserActions.setVerifyingToken(false))\r\n } catch (e: any) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get access token' }))\r\n yield put(lmiproUserActions.setVerifyingToken(false))\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n}\r\n\r\nfunction* initializeGetAccessToken() {\r\n yield takeLatest(LmiProUserActionTypes.GET_ACCESS_TOKEN, getAccessToken)\r\n}\r\n\r\nexport default initializeGetAccessToken\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport authClass from '@common/utils/auth-class'\r\n\r\nfunction* userLogin(action: ReturnType) {\r\n try {\r\n const pathname = action.payload.pathname || window.location.pathname\r\n const search = action.payload.search || window.location.search\r\n const sso = action.payload.sso || false\r\n yield call(authClass.login, pathname, search, sso)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogin() {\r\n yield takeEvery(LmiProUserActionTypes.USER_LOGIN, userLogin)\r\n}\r\n\r\nexport default initializeLogin\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport { logout } from '@common/utils'\r\n\r\nfunction* userLogout() {\r\n try {\r\n const { pathname, search } = window.location\r\n yield call(logout, pathname, search)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogout() {\r\n yield takeEvery(LmiProUserActionTypes.USER_LOGOUT, userLogout)\r\n}\r\n\r\nexport default initializeLogout\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport {\r\n LmiProCalculateCouponPriceActionPayload,\r\n LmiProCheckVolumeDiscountAgainstRepriceCouponActionPayload,\r\n LmiProValidateCouponActionPayload,\r\n} from '../coupon-util'\r\nimport { LmiProCouponProcessedDataPerSku } from './state'\r\n\r\nexport enum LmiProCouponActionTypes {\r\n SET_APPLY_COUPON_ATTEMPT_MADE = '[lmipro-coupon-actions] check-apply-coupon-attempt-made',\r\n GET_COUPON_DETAILS = '[lmipro-coupon-actions] get-coupon-details',\r\n CALCULATE_COUPON_PRICE = '[lmipro-coupon-actions] calculate-coupon-price',\r\n VALIDATE_COUPON = '[lmipro-coupon-actions] validate-coupon',\r\n SET_COUPON_PROCESSED_DATA = '[lmipro-coupon-actions] set-coupon-processed-data',\r\n SET_COUPON_SERVER_DATA = '[lmipro-coupon-actions] set-coupon-server-data',\r\n CHECK_CMS_COUPON = '[lmipro-coupon-actions] check-cms-coupon',\r\n RESET_COUPON_DATA = '[lmipro-coupon-actions] reset-coupon-data',\r\n SET_COUPON_VALID_AND_APPLIED = '[lmipro-coupon-actions] set-coupon-valid-and-applied',\r\n SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER = '[lmipro-coupon-actions] set-coupon-double-dip-amount-for-new-user',\r\n SET_URL_COUPON_ACTIVE = '[lmipro-coupon-actions] set-url-coupon-active',\r\n OBSERVE_VALIDATE_CMS_COUPON = '[lmipro-coupon-actions] observe-validate-cms-coupon',\r\n CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON = '[lmipro-coupon-actions] check-volume-discount-against-reprice-coupon',\r\n ATTEMPT_FOR_CMS_COUPON = '[lmipro-coupon-actions] attempt-for-cms-coupon',\r\n SET_URL_COUPON_CODE = '[lmipro-coupon-actions] set-url-coupon-code',\r\n}\r\n\r\nexport const lmiproCouponActions = {\r\n getCouponDetails: (couponCode: string) => createAction(LmiProCouponActionTypes.GET_COUPON_DETAILS, { couponCode }),\r\n validateCoupon: (couponValidationData: LmiProValidateCouponActionPayload, isAttemptingUrlCoupon: boolean) =>\r\n createAction(LmiProCouponActionTypes.VALIDATE_COUPON, { couponValidationData, isAttemptingUrlCoupon }),\r\n calculateCouponPrice: (couponCalculationData: LmiProCalculateCouponPriceActionPayload) =>\r\n createAction(LmiProCouponActionTypes.CALCULATE_COUPON_PRICE, { couponCalculationData }),\r\n setCouponProcessedData: (couponProcessedDataPerSku: LmiProCouponProcessedDataPerSku | null) =>\r\n createAction(LmiProCouponActionTypes.SET_COUPON_PROCESSED_DATA, { couponProcessedDataPerSku }),\r\n setCouponServerData: (couponServerData: CouponServerData) =>\r\n createAction(LmiProCouponActionTypes.SET_COUPON_SERVER_DATA, { couponServerData }),\r\n checkCMSCoupon: (selectedPlanSku: string) =>\r\n createAction(LmiProCouponActionTypes.CHECK_CMS_COUPON, { selectedPlanSku }),\r\n resetCouponData: () => createAction(LmiProCouponActionTypes.RESET_COUPON_DATA),\r\n setCouponValidAndApplied: (isCouponValidAndApplied: boolean) =>\r\n createAction(LmiProCouponActionTypes.SET_COUPON_VALID_AND_APPLIED, { isCouponValidAndApplied }),\r\n setCouponDoubleDipAmountForNewUser: (couponDoubleDipAmountForNewUser: number) =>\r\n createAction(LmiProCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER, {\r\n couponDoubleDipAmountForNewUser,\r\n }),\r\n setUrlCouponActive: (isUrlCouponActive: boolean) =>\r\n createAction(LmiProCouponActionTypes.SET_URL_COUPON_ACTIVE, { isUrlCouponActive }),\r\n observeValidateCMSCoupon: (couponServerData: CouponServerData) =>\r\n createAction(LmiProCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON, { couponServerData }),\r\n checkVolumeDiscountAgainstRepriceCoupon: (\r\n checkVolumeDiscountData: LmiProCheckVolumeDiscountAgainstRepriceCouponActionPayload\r\n ) =>\r\n createAction(LmiProCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON, {\r\n checkVolumeDiscountData,\r\n }),\r\n attemptForCMSCoupon: () => createAction(LmiProCouponActionTypes.ATTEMPT_FOR_CMS_COUPON),\r\n setUrlCouponCode: (couponCode: string) => createAction(LmiProCouponActionTypes.SET_URL_COUPON_CODE, { couponCode }),\r\n}\r\n\r\nexport type LmiProCouponActions = ActionUnion\r\n","import { select, put, takeLeading, call } from 'redux-saga/effects'\r\nimport queryString from 'query-string'\r\nimport { loadSessionState, loadState } from '@lmipro/utils'\r\nimport { LmiProCheckoutActionTypes, lmiproCheckoutActions } from '@lmipro/state/checkout/actions'\r\nimport { getCheckoutState, getPlanData } from '@lmipro/state/selectors'\r\nimport { getSelectedPlan } from '@lmipro/saga/content/content-helpers'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { TimePeriod, SC_SITE, FEATURE_FLAGS, LMIPRO_REDIRECT_PATHS, PRODUCT_SKU } from '@common/constants'\r\nimport { LmiProCheckoutState, LmiProSavedSessionState, LmiProSavedStoreState } from '@lmipro/state/checkout/state'\r\nimport { getCurrentAddons } from '@lmipro/utils/get-current-addons'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { lmiproCouponActions } from '@lmipro/state/coupon/actions'\r\nimport { contentActions } from '@common/state/content/actions'\r\nimport { ADDONS } from '@lmipro/constants'\r\nimport commonServices from '@common/services'\r\n\r\nfunction* loadSavedStateSaga(action: ReturnType) {\r\n try {\r\n const savedState: LmiProSavedStoreState | undefined = yield call(loadState)\r\n const savedSessionState: LmiProSavedSessionState | undefined = yield call(loadSessionState)\r\n const checkout: LmiProCheckoutState = yield select(getCheckoutState)\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const { urlPlan } = action.payload\r\n const {\r\n billingFrequency: queryBillingFrequency,\r\n minUsers,\r\n couponCode: queryCouponCode,\r\n } = queryString.parse(window.location.search)\r\n // grab url param for billing frequecy or saved one\r\n const preselectedBillingFrequency = queryBillingFrequency || savedState?.checkout?.billingFrequency\r\n // if min users was passed via url or saved in the store\r\n const preselectedMinUsers = Number(minUsers) || savedState?.checkout?.organizers\r\n const featureFlags: { data: { flags: string[] } } = yield call(commonServices.getFeatureFlags, SC_SITE.LOGMEIN)\r\n const useNewLmiProSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.LMIPRO_USE_NEW_SKUS)\r\n\r\n // grab url param for couponCode first and if not available go for saved one\r\n let preSavedCouponCode = (queryCouponCode as string) || savedSessionState?.coupon?.urlCouponCode\r\n // try to apply coupon code and also save the coupon code in state\r\n preSavedCouponCode = preSavedCouponCode || ''\r\n yield put(lmiproCouponActions.setUrlCouponCode(preSavedCouponCode))\r\n\r\n yield put(contentActions.setLanguage(savedSessionState?.language || ''))\r\n\r\n // if the value of the preselected frequency is an acceptable value and is not the same\r\n // as what is already saved, update it\r\n if (\r\n (preselectedBillingFrequency === TimePeriod.Month || preselectedBillingFrequency === TimePeriod.Year) &&\r\n preselectedBillingFrequency !== checkout.billingFrequency\r\n ) {\r\n yield put(lmiproCheckoutActions.setBillingFrequency(preselectedBillingFrequency))\r\n }\r\n\r\n if (preselectedMinUsers) {\r\n yield put(lmiproCheckoutActions.setOrganizers(preselectedMinUsers))\r\n }\r\n // grab url param for plan or saved in store\r\n if (urlPlan) {\r\n const preselectedPlan = urlPlan.replace(/-/g, ' ')\r\n // check if plan name is different\r\n if (urlPlan && urlPlan?.toLowerCase() !== selectedPlan.shortName.toLowerCase()) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find(\r\n (pln: LmiProPlan) => pln.shortName.toLocaleLowerCase() === preselectedPlan.toLowerCase()\r\n )\r\n if (foundPlan) {\r\n yield put(lmiproCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n } else {\r\n // if plan is provided in url but does not exist in plan data list, redirect to error page\r\n window.location.href = `${process.env.LOGMEIN_MARKETING_SITE_URL}${LMIPRO_REDIRECT_PATHS.LMIPRO_REDIRECT_PRO}/404`\r\n return\r\n }\r\n }\r\n } else if (savedState?.checkout?.selectedPlanSku) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find((pln: LmiProPlan) => pln.sKU === savedState?.checkout?.selectedPlanSku)\r\n if (foundPlan) {\r\n yield put(lmiproCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n } else if (!savedState?.checkout?.selectedPlanSku) {\r\n // if no plan is selected, default to popular plan ( Individual plan )\r\n const foundPlan = planData.find((pln: LmiProPlan) => pln.sKU === PRODUCT_SKU.LMIPRO_INDIVIDUAL_NAME)\r\n if (foundPlan) {\r\n yield put(lmiproCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n } else {\r\n // if popular plan doesn't exist in plan data list, default to useNewLmiProSkus ? v2 plan : first plan\r\n yield put(lmiproCheckoutActions.setSelectedPlan(planData?.[useNewLmiProSkus ? 1 : 0]?.sKU ?? 0))\r\n }\r\n }\r\n\r\n if (savedState) {\r\n const { selectedAddons } = savedState.checkout\r\n\r\n const plan: LmiProPlan = yield call(getSelectedPlan)\r\n // if a plan was selected\r\n if (plan.name) {\r\n // find matching addon in the plan from preselected addon\r\n const foundAddons: LmiProAddon[] = yield call(getCurrentAddons, selectedAddons, plan)\r\n yield put(lmiproCheckoutActions.setSelectedAddons(foundAddons))\r\n // find and update Agent addon quantity\r\n const agentAddons = foundAddons.find((addon) => addon.sKU.includes(ADDONS.AGENT))\r\n if (agentAddons) {\r\n yield put(lmiproCheckoutActions.setAgents(agentAddons.quantity + plan.userAgentsIncludedAmount))\r\n }\r\n // find and update Endpoint addon quantity\r\n const endPointAddons = foundAddons.find(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (endPointAddons) {\r\n yield put(\r\n lmiproCheckoutActions.setEndpoints(\r\n endPointAddons.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL + plan.endpointsIncludedAmount\r\n )\r\n )\r\n }\r\n // find and update extra addon selection\r\n const extraAddons = foundAddons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (extraAddons) {\r\n yield put(lmiproCheckoutActions.setExtraAddons(extraAddons))\r\n }\r\n }\r\n }\r\n yield put(lmiproCheckoutActions.setSavedStateLoaded(true, 'saved state saga'))\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeLoadSavedStateSaga() {\r\n yield takeLeading(LmiProCheckoutActionTypes.GET_SAVED_STATE, loadSavedStateSaga)\r\n}\r\n\r\nexport default initializeLoadSavedStateSaga\r\n","import { call, takeLatest, select, put, delay } from 'redux-saga/effects'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { LmiProCalculatePriceDataType, LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport lmiproServices from '@lmipro/services'\r\nimport { getBillingValues } from '@lmipro/utils/get-billing-values'\r\nimport { getPaymentItems } from '@lmipro/utils/get-item-values'\r\nimport { getSelectedPlan, getSelectedAddons } from '@lmipro/saga/content/content-helpers'\r\nimport { getCheckoutState, getCouponState, getUserState, getPlanData } from '@lmipro/state/selectors'\r\nimport { getLocationState, getAccountState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { BUY_TYPE, LMIPRO_TRACKING_COMPONENTS, LMIPRO_USER_TYPES } from '@lmipro/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { BillingPeriod, TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { LmiProUserState } from '@lmipro/state/user/state'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProCalculatePriceAPIData, LmiProCalculatePriceAPIReturnType } from '@lmipro/state/calculate-price'\r\nimport { isEmpty } from 'lodash-es'\r\nimport {\r\n getActiveCouponServerData,\r\n getCouponDoubleDipAmountForNewUser,\r\n getTotalProratedAmount,\r\n getTotalVolumeDiscount,\r\n getSubscriptionInfo,\r\n} from '@lmipro/utils'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { lmiproCouponActions } from '@lmipro/state/coupon/actions'\r\n\r\nexport function* calculatePriceSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.CALCULATE_PRICE_SAGA\r\n try {\r\n yield put(lmiproCheckoutActions.setTotalLoading(true))\r\n yield delay(1000)\r\n const checkout: LmiProCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingBillingInformation }: LmiProUserState = yield select(getUserState)\r\n const { values, planSKU } = action.payload\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan, planSKU)\r\n const selectedAddons: LmiProAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponProcessedDataPerSku } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n if (userType === LMIPRO_USER_TYPES.ADDON) {\r\n values.Street1 = existingBillingInformation?.addressLine1 || ''\r\n values.City = existingBillingInformation?.city || ''\r\n values.CountryCode = existingBillingInformation?.country || ''\r\n values.Email = existingBillingInformation?.email || ''\r\n values.FirstName = existingBillingInformation?.firstName || ''\r\n values.LastName = existingBillingInformation?.lastName || ''\r\n values.ZipCode = existingBillingInformation?.postalCode || ''\r\n values.StateCode = existingBillingInformation?.state || ''\r\n values.TaxNumber = existingBillingInformation?.taxNumber || ''\r\n values.TaxType = existingBillingInformation?.federalTaxType || ''\r\n }\r\n\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n if (!subscriptionInfo.isReplacementBooking && !selectedAddons.length) {\r\n yield put(lmiproCheckoutActions.setTotalLoading(false))\r\n yield put(lmiproCheckoutActions.setCalculatedPrice([], 0, 0, 0, 0, ''))\r\n yield put(lmiproCheckoutActions.setProratedAmount(0))\r\n return\r\n }\r\n\r\n const calculatePriceValues: LmiProCalculatePriceDataType = {\r\n address: getBillingValues(values),\r\n currency: locationInfo.currency,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n cart: getPaymentItems(selectedPlan, 1, checkout.billingFrequency, selectedAddons, subscriptionInfo),\r\n }\r\n const calculatePriceCreation: LmiProCalculatePriceAPIReturnType = yield call(\r\n lmiproServices.calculatePrice,\r\n calculatePriceValues\r\n )\r\n if (calculatePriceCreation && calculatePriceCreation.data) {\r\n const {\r\n errorMessages,\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate,\r\n creditback,\r\n }: LmiProCalculatePriceAPIData = calculatePriceCreation.data\r\n if (isEmpty(errorMessages)) {\r\n yield put(\r\n lmiproCheckoutActions.setCalculatedPrice(\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n creditback,\r\n anniversaryDate === null ? '' : (anniversaryDate as string)\r\n )\r\n )\r\n // since the selected plan has an item id of 0 is the product prices array, we need to get the first item from productPrice\r\n // check getPaymentItems function above for more info\r\n const [planProductPrice] = productPrices.filter((productPrice) => productPrice.itemId === 0)\r\n const { volumeDiscount } = planProductPrice\r\n if (volumeDiscount) {\r\n const { amount } = volumeDiscount\r\n const calculatedVolumeDiscount: number = yield call(getTotalVolumeDiscount, amount, 1, false)\r\n\r\n yield put(\r\n lmiproCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(calculatedVolumeDiscount)\r\n )\r\n }\r\n\r\n // if add-on user, calculate the prorated amount\r\n if (userType === LMIPRO_USER_TYPES.ADDON) {\r\n const calculatedProratedAmount = getTotalProratedAmount(productPrices)\r\n yield put(lmiproCheckoutActions.setProratedAmount(calculatedProratedAmount))\r\n }\r\n\r\n // coupon discount for DID\r\n if (isCouponValid && couponProcessedDataPerSku && userType !== LMIPRO_USER_TYPES.ADDON) {\r\n const couponDoubleDipAmountForNewUser: number = yield call(\r\n getCouponDoubleDipAmountForNewUser,\r\n productPrices\r\n )\r\n\r\n yield put(lmiproCouponActions.setCouponDoubleDipAmountForNewUser(couponDoubleDipAmountForNewUser))\r\n }\r\n } else {\r\n const checkoutBillingFrequencyKey =\r\n checkout.billingFrequency === TimePeriod.AnnualBilledMonthly\r\n ? BillingPeriod.ANNUALBILLEDMONTHLY\r\n : BillingPeriod.ANNUAL\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'Sorry we are having trouble applying your credit',\r\n buyType:\r\n subscriptionInfo.isTrial || !subscriptionInfo.plan\r\n ? BUY_TYPE.DIRECT_BUY\r\n : BUY_TYPE.ADDON,\r\n plan:\r\n checkout.billingFrequency === TimePeriod.Month\r\n ? BillingPeriod.MONTHLY\r\n : checkoutBillingFrequencyKey,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(modalActions.setErrorModal('Unable to get price data'))\r\n }\r\n }\r\n yield put(lmiproCheckoutActions.setTotalLoading(false))\r\n } catch {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n { event: TRACKING_EVENTS.ERROR_PURCHASE, eventData: { errorMessage: 'error in calculating price' } },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'error in calculating price' }))\r\n yield put(lmiproCheckoutActions.setTotalLoading(false))\r\n }\r\n}\r\n\r\nfunction* initializeCalculatePriceSaga() {\r\n yield takeLatest(LmiProCheckoutActionTypes.CALCULATE_PRICE, calculatePriceSaga)\r\n}\r\n\r\nexport default initializeCalculatePriceSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { savePayment } from '@lmipro/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createPaymentSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n try {\r\n const { paymentValues } = action.payload\r\n const savePaymentResponse: GenericResponse = yield call(savePayment, paymentValues)\r\n if (savePaymentResponse.status === 200 || savePaymentResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save payment info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreatePaymentSaga() {\r\n yield takeEvery(LmiProCheckoutActionTypes.CREATE_PAYMENT, createPaymentSaga)\r\n}\r\n\r\nexport default initializeCreatePaymentSaga\r\n","import { call, put, takeEvery } from 'redux-saga/effects'\r\nimport { LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { getAvailablePaymentMethods } from '@lmipro/services'\r\nimport { LmiProPaymentDataReturnType } from '@lmipro/state/checkout/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getAvailablePaymentMethodsSaga() {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.GET_AVAILABLE_PAYMENT_METHODS_SAGA\r\n try {\r\n const paymentMethodsCreation: GenericResponse = yield call(getAvailablePaymentMethods)\r\n if (paymentMethodsCreation.data) {\r\n const paymentData: LmiProPaymentDataReturnType[] = paymentMethodsCreation.data\r\n return paymentData\r\n }\r\n } catch (e) {\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get available payment methods' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get available payment methods' })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeGetAvailablePaymentMethodsSaga() {\r\n yield takeEvery(LmiProCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS, getAvailablePaymentMethodsSaga)\r\n}\r\n\r\nexport default initializeGetAvailablePaymentMethodsSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { lmiproUserActions, LmiProUserActionTypes } from '@lmipro/state/user/actions'\r\nimport commonServices, {\r\n verifyUser,\r\n getBillingSubscriptions,\r\n getBillingInfo,\r\n getExistingPaymentDetails,\r\n} from '@common/services'\r\nimport { getLabelContent, getUserState, getContentState } from '@lmipro/state/selectors'\r\nimport { authClass, processExistingBillingInfo } from '@common/utils'\r\nimport { trackAbandonForm } from '@lmipro/utils'\r\nimport { LmiProUserState } from '@lmipro/state/user/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { lmiproCheckoutActions } from '@lmipro/state/checkout/actions'\r\nimport { lmiproBuyFormActions } from '@lmipro/state/buy-form/actions'\r\nimport { LmiProBuyFormData } from '@lmipro/state/buy-form/state'\r\nimport {\r\n PREFIX,\r\n TimePeriod,\r\n BILLING_TYPES,\r\n PRODUCT_TYPES,\r\n PRODUCT_SKU,\r\n COUNTRIES,\r\n SC_SITE,\r\n PRODUCT_FAMILY_NAME,\r\n} from '@common/constants'\r\nimport { LabelContent } from '@lmipro/state/label-content'\r\nimport { LMIPRO_USER_TYPES, LMIPRO_USER_TYPES_RESPONSE } from '@lmipro/constants'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { isEmpty, partition } from 'lodash-es'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { accountActions } from '@common/state/account/actions'\r\nimport { getCountryFromCookie, setCountryInCookie } from '@common/utils/cookie-utils'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { contentActions } from '@lmipro/state/content/actions'\r\nimport { LmiProContentState } from '@lmipro/state/content/state'\r\nimport { FEATURE_FLAGS } from '@common/constants/featureFlags'\r\n\r\nfunction* userLoggedInSaga() {\r\n try {\r\n yield put(lmiproUserActions.setLoadingExistingInformation(true))\r\n const {\r\n loggedIn: { accessToken },\r\n }: LmiProUserState = yield select(getUserState)\r\n const { paymentMethodErrorMessage, disabledUserError }: LabelContent = yield select(getLabelContent)\r\n\r\n // clear previous session on the server\r\n yield call(commonServices.clearUserSession)\r\n // get user info\r\n // eslint-disable-next-line camelcase\r\n const response: GenericResponse = yield call(\r\n verifyUser,\r\n accessToken?.access_token || '',\r\n PRODUCT_FAMILY_NAME.LMIPRO\r\n )\r\n if (response && !isEmpty(response.data)) {\r\n const {\r\n User: { UserName, Name, UserKey },\r\n AccountKey,\r\n isBanned,\r\n hasGroupSubscription,\r\n } = response.data\r\n\r\n if (hasGroupSubscription) {\r\n trackAbandonForm()\r\n window.location.href = process.env.ADMIN_LMIPRO_URL as string\r\n }\r\n\r\n const userInfo: ExistingUserInfoType = {\r\n UserName,\r\n Name,\r\n UserKey,\r\n AccountKey,\r\n }\r\n\r\n const buyFormData: LmiProBuyFormData = {\r\n FirstName: Name?.GivenName,\r\n LastName: Name?.FamilyName,\r\n Email: UserName,\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: getCountryFromCookie() || COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n }\r\n\r\n // return error message if user is banned\r\n if (isBanned === true) {\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.BANNED))\r\n yield put(lmiproUserActions.setLoadingExistingInformation(false))\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n { fatalErrorMessage: disabledUserError, trackErrorMessage: disabledUserError },\r\n true\r\n )\r\n )\r\n return\r\n }\r\n\r\n // USER_IDENTITY_NOT_FOUND implies that user has neither boss nor identity account\r\n // This is the state returned when a token has been invalidated, I dont know\r\n // if there is another use case or not\r\n if (response.data.Code === LMIPRO_USER_TYPES_RESPONSE.USER_IDENTITY_NOT_FOUND) {\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.NEW))\r\n yield put(lmiproUserActions.userLogout())\r\n return\r\n }\r\n\r\n // set up and display existing user account information\r\n yield put(lmiproUserActions.setExistingUserInformation(userInfo))\r\n\r\n // USER_BOSS_NOT_FOUND implies that user has an identity account\r\n if (response.data.Code === LMIPRO_USER_TYPES_RESPONSE.USER_BOSS_NOT_FOUND) {\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.IDENTITY_ONLY))\r\n yield put(lmiproBuyFormActions.updateInitialFormState(buyFormData))\r\n yield put(lmiproUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // #region attempt to set up existing billing info\r\n const billingInfoRequest: GenericResponse = yield call(getBillingInfo)\r\n if (billingInfoRequest && !isEmpty(billingInfoRequest.data)) {\r\n // We get company name same as the email without the `@` in case we don't provide in the first place.\r\n // This is a known behavior for GTC. So, we check for GTR, we check if that's what we got and don't show the value\r\n const { email, companyName } = billingInfoRequest.data\r\n if (email.replace('@', '').replace('_', '') === companyName) {\r\n billingInfoRequest.data.companyName = ''\r\n }\r\n\r\n const processedBillingData = processExistingBillingInfo(billingInfoRequest.data)\r\n const billingInfo: ExistingBillingInfoType = processedBillingData\r\n const currentCountry = getCountryFromCookie() || COUNTRIES.US\r\n\r\n if (billingInfo.state === 'XX') {\r\n billingInfo.state = ''\r\n yield put(lmiproBuyFormActions.setStatesOptional(true))\r\n }\r\n\r\n // If address IS set, but GeoIP is different from existing user country,\r\n // reload such that buy form country matches that of GeoIP cookie\r\n if (billingInfo.addressLine1) {\r\n if (billingInfo.country !== currentCountry) {\r\n setCountryInCookie(billingInfo.country)\r\n window.location.reload()\r\n }\r\n } else {\r\n billingInfo.country = currentCountry\r\n }\r\n\r\n billingInfo.firstName = Name.GivenName\r\n billingInfo.lastName = Name.FamilyName\r\n buyFormData.Street1 = billingInfo.addressLine1\r\n buyFormData.City = billingInfo.city\r\n buyFormData.CountryCode = billingInfo.country\r\n buyFormData.ZipCode = billingInfo.postalCode\r\n buyFormData.StateCode = billingInfo.state\r\n buyFormData.ContactPhone = billingInfo.phoneNumber\r\n buyFormData.TaxNumber = billingInfo.taxNumber || ''\r\n buyFormData.TaxType = billingInfo.federalTaxType || ''\r\n\r\n // all five fields must contain values in order to set existing billing information\r\n if (buyFormData.Street1 && buyFormData.City && buyFormData.CountryCode && buyFormData.ZipCode) {\r\n yield put(lmiproUserActions.setExistingBillingInformation(billingInfo))\r\n }\r\n }\r\n yield put(lmiproBuyFormActions.updateInitialFormState(buyFormData))\r\n // #endregion\r\n\r\n // #region attempt to set up existing payment info\r\n const paymentInfoRequest: GenericResponse = yield call(getExistingPaymentDetails)\r\n if (paymentInfoRequest && !isEmpty(paymentInfoRequest.data)) {\r\n const currentDate = new Date()\r\n const currentYear = currentDate.getFullYear()\r\n const currentMonth = currentDate.getMonth()\r\n const ccInfo = paymentInfoRequest.data[0].creditCard\r\n if (\r\n ccInfo.expirationYear < currentYear ||\r\n (ccInfo.expirationYear === currentYear && ccInfo.expirationMonth < currentMonth)\r\n ) {\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n {\r\n fatalErrorMessage: paymentMethodErrorMessage,\r\n trackErrorMessage: paymentMethodErrorMessage,\r\n },\r\n true\r\n )\r\n )\r\n }\r\n const paymentInfo: ExistingPaymentInfoType = {\r\n last4Digits: ccInfo.last4Digits,\r\n }\r\n yield put(lmiproUserActions.setExistingPaymentDetails(paymentInfo))\r\n }\r\n // #endregion\r\n\r\n // if subscription is empty, mark as expired-user\r\n const subscriptionRequest: GenericResponse = yield call(getBillingSubscriptions)\r\n if (isEmpty(subscriptionRequest?.data)) {\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.EXPIRED))\r\n yield put(lmiproUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n const featureFlags: { data: { flags: string[] } } = yield call(\r\n commonServices.getFeatureFlags,\r\n SC_SITE.LOGMEIN\r\n )\r\n\r\n const useNewLmiProSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.LMIPRO_USE_NEW_SKUS)\r\n\r\n /* LOGIC CATCH FOR EXISTING USERS\r\n if feature flag is on, and...\r\n\r\n https://jira.ops.expertcity.com/browse/WAE1-2522\r\n If the user is subscribed... | ...they could upgrade to...\r\n Basic v1 | Standard v2\r\n Standard v1 | N/A\r\n Remote Support | Standard v2\r\n Standard v2 | N/A\r\n */\r\n const existingSubscriptionSkus =\r\n subscriptionRequest?.data?.map(({ productSku }: { productSku: PRODUCT_SKU }) => productSku) ?? []\r\n const skuFilter: string[] = []\r\n\r\n if (useNewLmiProSkus) {\r\n if (\r\n !existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAME) &&\r\n !existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n ) {\r\n if (existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_BASIC_NAMED)) {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_BASIC_NAMED)\r\n } else {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2)\r\n }\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n } else if (existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAME)) {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAME)\r\n } else {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n }\r\n }\r\n\r\n const content: LmiProContentState = yield select(getContentState)\r\n\r\n const filterPlans = useNewLmiProSkus\r\n ? (sku: PRODUCT_SKU) => skuFilter.includes(sku)\r\n : (sku: PRODUCT_SKU) =>\r\n [\r\n PRODUCT_SKU.LMIPRO_INDIVIDUAL_NAME,\r\n PRODUCT_SKU.LMIPRO_SMALL_BUSSINESS_NAME,\r\n PRODUCT_SKU.LMIPRO_POWER_USER_NAME,\r\n PRODUCT_SKU.LMIPRO_POWER_USER_25_NAME,\r\n PRODUCT_SKU.LMIPRO_POWER_USER_50_NAME,\r\n ].includes(sku)\r\n\r\n yield put(\r\n contentActions.setContent(\r\n content.contentData,\r\n content.labelContent,\r\n content.allPlanData.filter((plan) => filterPlans(plan.sKU as PRODUCT_SKU)) as [],\r\n content.allPlanData as []\r\n )\r\n )\r\n\r\n // set account subscription state\r\n yield put(accountActions.setAccountSubscriptions(subscriptionRequest.data))\r\n\r\n // partition subscriptions into two arrays - one for GTC and another for GTR\r\n const [lmiproSubscriptions] = partition(\r\n subscriptionRequest.data,\r\n (plan: BillingDetailedSubscriptionPlan) => {\r\n return plan.productSku.startsWith(PREFIX.GTR)\r\n }\r\n )\r\n\r\n const lmiproTrialSubscription = lmiproSubscriptions.find(\r\n (plan: BillingDetailedSubscriptionPlan) => plan.planType === PRODUCT_TYPES.TRIAL\r\n )\r\n\r\n // #region determine buy flow user state\r\n const selectedPlan = lmiproSubscriptions?.find((plan: BillingDetailedSubscriptionPlan) => {\r\n if (useNewLmiProSkus) {\r\n return (\r\n plan.productSku === PRODUCT_SKU.LMIPRO_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAME ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2\r\n )\r\n }\r\n return (\r\n plan.productSku === PRODUCT_SKU.LMIPRO_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAME\r\n )\r\n })\r\n if (selectedPlan) {\r\n const {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n planType,\r\n } = selectedPlan ?? {}\r\n\r\n const overallQuantity = lmiproSubscriptions.reduce(\r\n (accumulator: number, subItem: ExistingAccountInfoType) => {\r\n if (subItem.productSku === productSku) {\r\n return accumulator + subItem.quantity\r\n }\r\n return accumulator\r\n },\r\n 0\r\n )\r\n\r\n const accountInfo: ExistingAccountInfoType = {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n quantity: overallQuantity,\r\n planType,\r\n }\r\n const paymentPlanKey =\r\n paymentPlan === BILLING_TYPES.MONTHLYANNUAL ? TimePeriod.AnnualBilledMonthly : TimePeriod.Month\r\n yield put(lmiproUserActions.setExistingAccountInformation(accountInfo))\r\n yield put(lmiproCheckoutActions.setSelectedPlan(productSku))\r\n yield put(\r\n lmiproCheckoutActions.setBillingFrequency(\r\n paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : paymentPlanKey\r\n )\r\n )\r\n // if user already has the selected plan, mark as add-on flow\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.ADDON))\r\n yield put(lmiproCheckoutActions.setSelectedAddons([]))\r\n } else if (lmiproTrialSubscription) {\r\n // otherwise, if user has any LmiPro trial subscription, mark as trialer\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.TRIALER))\r\n } else {\r\n // otherwise, since user has at least one subscription, mark as cross product\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.CROSSPRODUCT))\r\n }\r\n // #endregion\r\n\r\n yield put(lmiproUserActions.setLoadingExistingInformation(false))\r\n }\r\n } catch (e) {\r\n yield put(lmiproUserActions.setUserType(LMIPRO_USER_TYPES.NEW))\r\n yield put(lmiproUserActions.setLoadingExistingInformation(false))\r\n yield call(authClass().logout)\r\n }\r\n}\r\n\r\nfunction* initializeLoggedInSaga() {\r\n yield takeEvery(LmiProUserActionTypes.GET_LOGGED_IN_USER_STATE, userLoggedInSaga)\r\n}\r\n\r\nexport default initializeLoggedInSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { lmiproBuyFormActions, LmiProBuyFormActionTypes } from '@lmipro/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { lmiproCheckoutActions } from '@lmipro/state/checkout/actions'\r\nimport { LmiProSubmitDataType, LmiProCheckoutState, LmiProPaymentDataReturnType } from '@lmipro/state/checkout/state'\r\nimport { getPaymentItems } from '@lmipro/utils/get-item-values'\r\nimport {\r\n getCheckoutState,\r\n getUserState,\r\n getLabelContent,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n} from '@lmipro/state/selectors'\r\nimport { getLocationState, getAccountState, getFlexState } from '@common/state/selectors'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmipro/saga/content/content-helpers'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { LmiProContentData } from '@lmipro/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmiproTrackingActions } from '@lmipro/state/tracking/actions'\r\nimport { LmiProAbandonedCartDataType, LmiProUserState } from '@lmipro/state/user/state'\r\nimport { ExistingUserInfoType, ExistingBillingInfoType } from '@common/state/user/state'\r\nimport { LabelContent } from '@lmipro/state/label-content'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { lmiproUserActions } from '@lmipro/state/user/actions'\r\nimport { getActiveCouponServerData, clearState, getSubscriptionInfo } from '@lmipro/utils'\r\nimport { flexFormSaga } from '@common/sagas/flex/get-flex-token'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { FlexTokenDataType } from '@common/services'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { REFERRER, REFERRER_QUERY_PARAM } from '@lmipro/constants/referrers'\r\nimport { LmiProSubmitPaymentResponseData } from '@lmipro/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@lmipro/saga/user/abandoned-cart'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = LMIPRO_TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]\r\n )\r\n )\r\n\r\n const checkout: LmiProCheckoutState = yield select(getCheckoutState)\r\n const { addonUserSuccessUrl, gotoAdminUrl }: LabelContent = yield select(getLabelContent)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: LmiProUserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: LmiProContentData =\r\n yield select(getContentData)\r\n\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiProAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const { CompanyName } = action.payload.values\r\n\r\n try {\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n // #region if CompanyName is provided, update billing info\r\n if (CompanyName && userState.existingBillingInformation) {\r\n const { country, firstName, lastName, email, taxNumber, federalTaxType } =\r\n userState.existingBillingInformation\r\n const billingData = {\r\n addressLine1,\r\n city,\r\n state: stateCode,\r\n country,\r\n postalCode,\r\n firstName,\r\n lastName,\r\n email,\r\n phoneNumber,\r\n taxNumber: taxNumber || '',\r\n federalTaxType: federalTaxType || '',\r\n companyName: CompanyName,\r\n }\r\n\r\n const createBillingInfoAction = lmiproCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n }\r\n // #endregion\r\n\r\n const items = getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n subscriptionInfo\r\n )\r\n\r\n // #region attempt to retrieve SCA token to determine Cardinal challenge is required or not\r\n const flexTokenData: FlexTokenDataType = {\r\n currency: locationInfo.currency,\r\n country: locationInfo.country,\r\n targetOrigin: window.location.origin,\r\n skipSca: false,\r\n }\r\n yield call(flexFormSaga, flexActions.getFlexToken(flexTokenData, 0))\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n if (isScaEnabledForMid) {\r\n // wait for Cardinal script is completely loaded before proceeding to next line of code\r\n yield take(FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE)\r\n }\r\n // #endregion\r\n\r\n // #region get available payment menthods\r\n let paymentMethodKey = ''\r\n const getAvailablePaymentData: LmiProPaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n // #endregion\r\n // #region process purchase - 1st purchase call\r\n let paymentKey = ''\r\n let isChallengeRequired = false\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: LmiProSubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n isScaCompleted: false,\r\n isWithCardAddAfterSca: false,\r\n }\r\n const submitPaymentAction = lmiproCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiProSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n\r\n isChallengeRequired = submitData?.scaResult?.isScaRequired || false\r\n paymentKey = submitData?.scaResult?.paymentKey\r\n\r\n const payerAuthEnrollment = submitData?.scaResult?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n lmiproTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmiproTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: LmiProSubmitDataType = {\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: false,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = lmiproCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiProSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmiproTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n lmiproBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: LmiProAbandonedCartDataType = {\r\n email: UserName,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = lmiproUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(lmiproTrackingActions.track({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW }, componentName))\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n company: CompanyName,\r\n }\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(lmiproCheckoutActions.setAddonComplete(true))\r\n\r\n const referrer = new URLSearchParams(window.location.search).get(REFERRER_QUERY_PARAM)\r\n if (referrer === REFERRER.gotoAdmin) {\r\n window.location.href = gotoAdminUrl\r\n } else {\r\n window.location.href = addonUserSuccessUrl\r\n }\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'existing user form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(LmiProBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { TimePeriod } from '@common/constants'\r\nimport { LmiProCheckoutState } from './state'\r\nimport { LmiProCheckoutActionTypes } from './actions'\r\nimport type { LmiProCheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: LmiProCheckoutState = {\r\n isLoading: true,\r\n selectedAddons: [],\r\n submitting: false,\r\n organizers: 1,\r\n promoCode: '',\r\n billingFrequency: TimePeriod.Year,\r\n calculatedTax: 0,\r\n calculatedTotal: 0,\r\n calculatedNetTotal: 0,\r\n calculatedCredit: 0,\r\n anniversaryDate: '',\r\n selectedPlanSku: '',\r\n savedStateLoaded: false,\r\n purchaseComplete: false,\r\n addonComplete: false,\r\n totalLoading: false,\r\n selectedTierIndex: 0, // the default selected tier is Tier1, since selectedTierIndex is zero based index.\r\n currentVolumeDiscountPrice: 0,\r\n volumeDiscountLoading: false,\r\n volumeDiscount: {},\r\n calculatedProratedAmount: 0,\r\n extraAddons: [],\r\n endpoints: 0,\r\n agents: 0,\r\n taxType: '',\r\n autoLogin: undefined,\r\n}\r\n\r\nexport const checkoutReducer = (\r\n previousState: LmiProCheckoutState | undefined,\r\n action: LmiProCheckoutActions\r\n): LmiProCheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case LmiProCheckoutActionTypes.SET_LOADING:\r\n return {\r\n ...state,\r\n isLoading: action.payload.loading,\r\n }\r\n case LmiProCheckoutActionTypes.SET_PURCHASE_COMPLETE:\r\n return {\r\n ...state,\r\n purchaseComplete: action.payload.complete,\r\n }\r\n case LmiProCheckoutActionTypes.SET_BILLING_FREQUENCY:\r\n return {\r\n ...state,\r\n billingFrequency: action.payload.frequency,\r\n }\r\n case LmiProCheckoutActionTypes.CLEAR_ADDONS:\r\n return {\r\n ...state,\r\n selectedAddons: [],\r\n }\r\n case LmiProCheckoutActionTypes.SET_SELECTED_PLAN:\r\n return {\r\n ...state,\r\n selectedPlanSku: action.payload.planSku,\r\n }\r\n case LmiProCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n return {\r\n ...state,\r\n selectedAddons: [...addons],\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_ORGANIZERS:\r\n return {\r\n ...state,\r\n organizers: action.payload.organizers,\r\n }\r\n case LmiProCheckoutActionTypes.SET_CALCULATED_PRICE:\r\n return {\r\n ...state,\r\n productPrices: action.payload.productPrices,\r\n calculatedNetTotal: action.payload.net,\r\n calculatedTotal: action.payload.total,\r\n calculatedTax: action.payload.tax,\r\n calculatedCredit: action.payload.creditback,\r\n anniversaryDate: action.payload.anniversaryDate,\r\n }\r\n case LmiProCheckoutActionTypes.SET_SAVED_STATE_LOADED:\r\n return {\r\n ...state,\r\n savedStateLoaded: action.payload.savedStateLoaded,\r\n }\r\n case LmiProCheckoutActionTypes.SET_LOADING_TOTAL:\r\n return {\r\n ...state,\r\n totalLoading: action.payload.loading,\r\n }\r\n case LmiProCheckoutActionTypes.SET_ADDON_COMPLETE:\r\n return {\r\n ...state,\r\n addonComplete: action.payload.addonComplete,\r\n }\r\n case LmiProCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { selectedTierIndex } = action.payload\r\n return {\r\n ...state,\r\n selectedTierIndex,\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_VOLUME_DISCOUNT: {\r\n const { selectedPlanSku, currency, volumeDiscountForSelectedPlanAndCurrency } = action.payload\r\n const selectedPlanSkuVolumeDiscount = state.volumeDiscount[selectedPlanSku] || {}\r\n return {\r\n ...state,\r\n volumeDiscount: {\r\n ...state.volumeDiscount,\r\n [selectedPlanSku]: {\r\n ...selectedPlanSkuVolumeDiscount,\r\n [currency]: volumeDiscountForSelectedPlanAndCurrency,\r\n },\r\n },\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING: {\r\n const { volumeDiscountLoading } = action.payload\r\n return { ...state, volumeDiscountLoading }\r\n }\r\n case LmiProCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE: {\r\n const { currentVolumeDiscountPrice } = action.payload\r\n return { ...state, currentVolumeDiscountPrice }\r\n }\r\n case LmiProCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON: {\r\n return { ...state, currentVolumeDiscountPrice: 0 }\r\n }\r\n case LmiProCheckoutActionTypes.SET_PRORATED_AMOUNT: {\r\n const { proratedAmount } = action.payload\r\n return { ...state, calculatedProratedAmount: proratedAmount }\r\n }\r\n case LmiProCheckoutActionTypes.RESET_CHECKOUT_STATE: {\r\n return initialCheckoutState\r\n }\r\n case LmiProCheckoutActionTypes.SET_EXTRA_ADDON: {\r\n const { addons = [] } = action.payload\r\n return {\r\n ...state,\r\n extraAddons: addons,\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_ENDPOINTS: {\r\n return {\r\n ...state,\r\n endpoints: action.payload.endpoints,\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_AGENTS: {\r\n return {\r\n ...state,\r\n agents: action.payload.agents,\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_TAX_TYPE: {\r\n return {\r\n ...state,\r\n taxType: action.payload.type,\r\n }\r\n }\r\n case LmiProCheckoutActionTypes.SET_AUTO_LOGIN: {\r\n return {\r\n ...state,\r\n autoLogin: action.payload.autoLogin,\r\n }\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { lmiproBuyFormActions, LmiProBuyFormActionTypes } from '@lmipro/state/buy-form/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { lmiproCheckoutActions } from '@lmipro/state/checkout/actions'\r\nimport { initialCheckoutState } from '@lmipro/state/checkout/reducer'\r\n\r\nexport function* resetBuyFormAffectedStatesSaga() {\r\n yield put(lmiproBuyFormActions.resetForm())\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n yield put(\r\n lmiproCheckoutActions.setCalculatedPrice(\r\n [],\r\n initialCheckoutState.calculatedNetTotal,\r\n initialCheckoutState.calculatedTotal,\r\n initialCheckoutState.calculatedTax,\r\n initialCheckoutState.calculatedCredit,\r\n initialCheckoutState.anniversaryDate\r\n )\r\n )\r\n}\r\n\r\nfunction* initializeResetBuyFormAffectedStatesSaga() {\r\n yield takeEvery(LmiProBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES, resetBuyFormAffectedStatesSaga)\r\n}\r\n\r\nexport default initializeResetBuyFormAffectedStatesSaga\r\n","import { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmipro/saga/content/content-helpers'\r\nimport { getCheckoutState, getContentData, getCouponState, getPlanData, getUserState } from '@lmipro/state/selectors'\r\nimport { LmiProUserState } from '@lmipro/state/user/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { select, call } from 'redux-saga/effects'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LMIPRO_USER_TYPES } from '@lmipro/constants'\r\nimport { getActiveCouponServerData, getCouponTotalSavings, getSelectedTierIndex } from '@lmipro/utils'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { LmiProCustomizeItemsData } from '@lmipro/state/tracking/state'\r\nimport { LmiProContentData } from '@lmipro/state/content-data'\r\n\r\nexport function* getCustomizeItemsData() {\r\n const planData: LmiProPlan[] = yield select(getPlanData)\r\n const { CurrencyCode }: LmiProContentData = yield select(getContentData)\r\n const { billingFrequency, organizers }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const customizeItemsData: LmiProCustomizeItemsData = {\r\n planData,\r\n billingFrequency,\r\n currency: CurrencyCode,\r\n organizers,\r\n }\r\n return customizeItemsData\r\n}\r\n\r\nexport function* getPageViewData() {\r\n const {\r\n loggedIn: { isUserLoggedIn },\r\n }: LmiProUserState = yield select(getUserState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { locale, country, language } = locationState.locationInfo\r\n return { locale, country, isUserLoggedIn, language }\r\n}\r\n\r\nexport function* getSessionInfo() {\r\n const {\r\n userType,\r\n loggedIn: { isUserLoggedIn },\r\n }: LmiProUserState = yield select(getUserState)\r\n return { isUserLoggedIn, userType, sessionLast: '', sessionNumber: '' }\r\n}\r\n\r\nexport function* getCartInfo() {\r\n const { billingFrequency, organizers, currentVolumeDiscountPrice, selectedTierIndex }: LmiProCheckoutState =\r\n yield select(getCheckoutState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { existingBillingInformation, userType, existingAccountInformation }: LmiProUserState = yield select(\r\n getUserState\r\n )\r\n const { currency } = locationState.locationInfo\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiProAddon[] = yield call(getSelectedAddons)\r\n\r\n let tierIndex = selectedTierIndex\r\n if (userType === LMIPRO_USER_TYPES.ADDON && existingAccountInformation && !isEmpty(existingAccountInformation)) {\r\n const existingOrganizers = existingAccountInformation.quantity\r\n const totalOrganizers = organizers + existingOrganizers\r\n tierIndex = yield call(getSelectedTierIndex, totalOrganizers, billingFrequency, selectedPlan, currency)\r\n }\r\n\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { couponProcessedDataPerSku, isCouponValidAndApplied, couponDoubleDipAmountForNewUser } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, selectedPlan)\r\n const totalCouponSavings = getCouponTotalSavings(\r\n isCouponValidAndApplied,\r\n couponProcessedDataPerSku,\r\n couponDoubleDipAmountForNewUser\r\n )\r\n\r\n return {\r\n plan: selectedPlan,\r\n addonList: selectedAddons,\r\n billingFrequency,\r\n organizers,\r\n currency,\r\n isExistingUser: !isEmpty(existingBillingInformation),\r\n tier: `Tier${tierIndex + 1}`,\r\n currentVolumeDiscountPrice,\r\n couponCode: couponServerData?.couponCode || '',\r\n couponProcessedDataPerSku,\r\n totalCouponSavings,\r\n }\r\n}\r\n\r\nexport function* getPurchaseData(transactionID: string) {\r\n const { calculatedNetTotal, calculatedTax, promoCode }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const { userType }: LmiProUserState = yield select(getUserState)\r\n return { calculatedNetTotal, calculatedTax, promoCode, userType, transactionID }\r\n}\r\n\r\nexport function* getCompleteBuyData() {\r\n const { userType }: LmiProUserState = yield select(getUserState)\r\n return userType\r\n}\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { lmiproTrackingActions, LmiProTrackingActionTypes } from '@lmipro/state/tracking/actions'\r\nimport { trackCTAClick, trackEvent, trackGenericEvent, trackGenericFormEvent } from '@common/utils'\r\nimport { PRODUCT_FAMILY_KEY, TRACKING_EVENTS } from '@common/constants'\r\nimport {\r\n trackBeginCheckout,\r\n trackCompleteBuy,\r\n trackCustomizeViewItem,\r\n trackFormError,\r\n trackPurchase,\r\n trackPurchaseError,\r\n trackSessionInfo,\r\n trackViewContent,\r\n trackUserInformation,\r\n trackEmailValidation,\r\n} from '@lmipro/utils'\r\nimport { LmiProCartData, LmiProPurchaseData, LmiProCustomizeItemsData } from '@lmipro/state/tracking/state'\r\nimport { CTAClickData, PageViewContentData, SessionInfo } from '@common/state/tracking/state'\r\nimport {\r\n getCartInfo,\r\n getCompleteBuyData,\r\n getCustomizeItemsData,\r\n getPageViewData,\r\n getPurchaseData,\r\n getSessionInfo,\r\n} from './track-helpers'\r\n\r\nexport function* lmiproTrackingSaga(action: ReturnType) {\r\n const { trackingInfo } = action.payload\r\n const eventName = trackingInfo.event\r\n const trackData = trackingInfo.eventData || {}\r\n const errorMessage = (trackData.errorMessage as string) || ''\r\n const formErrors = (trackData.formErrors as string[]) || ['']\r\n const formIds = (trackData.formIds as string[]) || ['']\r\n const step = (trackData.step as number) || 0\r\n const ctaClickData: CTAClickData = {\r\n name: (trackData.name as string) || '',\r\n url: (trackData.url as string) || '',\r\n }\r\n const formName = (trackData.formName as string) || ''\r\n const pathName = (trackData.currentLocation as string) || ''\r\n const invoiceNumber = (trackData.invoiceNumber as string) || ''\r\n const userEmail: string = (trackData.userEmail as string) || ''\r\n // const plan: string = (trackData.plan as string) || ''\r\n const buyType: string = (trackData.buyType as string) || ''\r\n switch (eventName) {\r\n case TRACKING_EVENTS.VIEW_ITEM: {\r\n const customizeItemsData: LmiProCustomizeItemsData = yield call(getCustomizeItemsData)\r\n trackCustomizeViewItem(customizeItemsData)\r\n break\r\n }\r\n case TRACKING_EVENTS.VIEW_CONTENT: {\r\n const viewContentData: PageViewContentData = yield call(getPageViewData)\r\n trackViewContent(viewContentData, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SESSION_INFORMATION: {\r\n const sessionData: SessionInfo = yield call(getSessionInfo)\r\n trackSessionInfo(sessionData)\r\n break\r\n }\r\n case TRACKING_EVENTS.USER_INFORMATION: {\r\n const cartData: LmiProCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackUserInformation(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.BEGIN_CHECKOUT: {\r\n const cartData: LmiProCartData = yield call(getCartInfo)\r\n trackBeginCheckout(cartData, step)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_BUY_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.LMIPRO, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.PURCHASE: {\r\n const cartData: LmiProCartData = yield call(getCartInfo)\r\n const purchaseData: LmiProPurchaseData = yield call(getPurchaseData, invoiceNumber)\r\n trackPurchase(cartData, purchaseData)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_PURCHASE: {\r\n const cartData: LmiProCartData = yield call(getCartInfo)\r\n trackPurchaseError(errorMessage, cartData, buyType)\r\n break\r\n }\r\n case TRACKING_EVENTS.EMAIL_VALIDATION: {\r\n trackEmailValidation(formName, userEmail)\r\n break\r\n }\r\n case TRACKING_EVENTS.COMPLETE_BUY_FLOW: {\r\n const cartData: LmiProCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackCompleteBuy(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_CONTACT_SALES_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.LMIPRO, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.LOAD_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ABANDON_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SUBMIT_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_FORM: {\r\n trackFormError(formIds, formErrors, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.CLICK_CTA: {\r\n trackCTAClick(ctaClickData)\r\n break\r\n }\r\n default: {\r\n yield call(trackEvent, { event: eventName, eventData: trackData })\r\n }\r\n }\r\n}\r\nfunction* initializeLmiProTrackingSaga() {\r\n yield takeEvery(LmiProTrackingActionTypes.TRACK, lmiproTrackingSaga)\r\n}\r\nexport default initializeLmiProTrackingSaga\r\n","import { CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { LmiProBillingFrequencyVolumeDiscountRecords, LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { getCheckoutState } from '@lmipro/state/selectors'\r\nimport { calculateVolumeDiscount } from '@lmipro/utils'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { call } from 'redux-saga-test-plan/matchers'\r\nimport { put, select, takeEvery } from 'redux-saga/effects'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nexport type CalculateVolumeDiscountSagaTriggerActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* calculateVolumeDiscountSaga(action: CalculateVolumeDiscountSagaTriggerActionType) {\r\n yield put(lmiproCheckoutActions.setVolumeDiscountLoading(true))\r\n const selectedPlanSku =\r\n action.type === LmiProCheckoutActionTypes.SET_SELECTED_PLAN ? action.payload.planSku : undefined\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency: selectedCurrency = CURRENCY.USD } = locationInfo\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { volumeDiscount }: LmiProCheckoutState = yield select(getCheckoutState)\r\n if (selectedPlanSku) {\r\n const LmiProbillingFrequencyVolumeDiscountRecords = get(volumeDiscount, [selectedPlanSku, selectedCurrency])\r\n // skip the calculation if the checkout store already has selected plan volume discount data in the required currency\r\n if (isEmpty(LmiProbillingFrequencyVolumeDiscountRecords)) {\r\n const volumeDiscountForSelectedPlanAndCurrency: LmiProBillingFrequencyVolumeDiscountRecords = yield call(\r\n calculateVolumeDiscount,\r\n selectedPlan,\r\n selectedCurrency\r\n )\r\n yield put(\r\n lmiproCheckoutActions.setVolumeDiscount(\r\n selectedPlan?.sKU,\r\n selectedCurrency,\r\n volumeDiscountForSelectedPlanAndCurrency\r\n )\r\n )\r\n }\r\n }\r\n yield put(lmiproCheckoutActions.setVolumeDiscountLoading(false))\r\n}\r\n\r\nfunction* initializeCalculateVolumeDiscount() {\r\n yield takeEvery(\r\n [LmiProCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT, LmiProCheckoutActionTypes.SET_SELECTED_PLAN],\r\n calculateVolumeDiscountSaga\r\n )\r\n /* note: we need to add currency here, if the user can change currency,\r\n that would automatically trigger this saga to calculate the volume discount\r\n for the selected plan in that currency.\r\n */\r\n}\r\n\r\nexport default initializeCalculateVolumeDiscount\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { getCheckoutState } from '@lmipro/state/selectors'\r\nimport { getSelectedTierIndex } from '@lmipro/utils'\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* getSelectedTierSaga(action: ReturnType) {\r\n const { organizers } = action.payload\r\n const { billingFrequency }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const selectedTierIndex: number = yield call(\r\n getSelectedTierIndex,\r\n organizers,\r\n billingFrequency,\r\n selectedPlan,\r\n currency\r\n )\r\n yield put(lmiproCheckoutActions.setSelectedTierIndex(selectedTierIndex, organizers))\r\n yield put(lmiproCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency as TimePeriod))\r\n}\r\n\r\nfunction* initializeGetSelectedTier() {\r\n yield takeLatest(LmiProCheckoutActionTypes.SET_ORGANIZERS, getSelectedTierSaga)\r\n}\r\n\r\nexport default initializeGetSelectedTier\r\n","import { CHECKOUTFORM_STEPS } from '@lmipro/constants'\r\nimport { LmiProErrorContent } from '@lmipro/state/checkout-form-container/state'\r\nimport { LmiProBuyFormData, LmiProBuyFormState } from '@lmipro/state/buy-form/state'\r\n\r\nexport const errorContent: LmiProErrorContent = {\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n errorInvalidCreditCardNumber: '',\r\n emailAddressAlreadyInUse: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorInvalidPostalCode: '',\r\n errorGenericMessage: '',\r\n errorInvalidAddress: '',\r\n errorRequiredTaxNumber: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\nexport const initialData: LmiProBuyFormData = {\r\n FirstName: '',\r\n LastName: '',\r\n Email: '',\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: '',\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n}\r\nexport const buyFormStateInitialData: LmiProBuyFormState = {\r\n clearEmail: false,\r\n initialData,\r\n steps: {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: { completed: false, error: false },\r\n },\r\n statesOptional: false,\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { LmiProCheckoutState, LmiProVolumeDiscountPerTier } from '@lmipro/state/checkout/state'\r\nimport { getCheckoutState, getUserState } from '@lmipro/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, take, takeLatest } from 'redux-saga/effects'\r\nimport { get, isEmpty } from 'lodash-es'\r\nimport { LmiProUserState } from '@lmipro/state/user/state'\r\nimport { LMIPRO_USER_TYPES } from '@lmipro/constants'\r\nimport { initialData } from '@lmipro/data/buy-form'\r\nimport { getTotalVolumeDiscount } from '@lmipro/utils'\r\n\r\nfunction* getVolumeDiscountSaga(action: ReturnType) {\r\n const { userType }: LmiProUserState = yield select(getUserState)\r\n if (userType === LMIPRO_USER_TYPES.ADDON) {\r\n const buyFormInitialData = { ...initialData, CountryCode: '' }\r\n yield put(lmiproCheckoutActions.calculatePrice(buyFormInitialData, 'get volume discount saga'))\r\n } else {\r\n const { organizers, selectedTierIndex, billingFrequency } = action.payload\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const { volumeDiscount, selectedPlanSku }: LmiProCheckoutState = yield select(getCheckoutState)\r\n const billingFrequencyKeyForMonth =\r\n billingFrequency === TimePeriod.AnnualBilledMonthly\r\n ? BillingPeriod.ANNUALBILLEDMONTHLY\r\n : BillingPeriod.MONTHLY\r\n const billingFrequencyKey =\r\n billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : billingFrequencyKeyForMonth\r\n const isAnnual = billingFrequencyKey === BillingPeriod.ANNUAL\r\n const volumeDiscountPerTier: LmiProVolumeDiscountPerTier = get(volumeDiscount, [\r\n selectedPlanSku,\r\n currency,\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n\r\n if (!isEmpty(volumeDiscountPerTier)) {\r\n const { discountPricePerUnit } = volumeDiscountPerTier\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(lmiproCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n } else {\r\n // since the volume discount is not available, we will wait to listen for next volume\r\n // discount set action being dispatched to store and then get the data\r\n const setVolumeDiscountAction: ReturnType = yield take(\r\n LmiProCheckoutActionTypes.SET_VOLUME_DISCOUNT\r\n )\r\n const { volumeDiscountForSelectedPlanAndCurrency } = setVolumeDiscountAction.payload\r\n const volumeDiscountPerTierNow = get(volumeDiscountForSelectedPlanAndCurrency, [\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n const { discountPricePerUnit } = volumeDiscountPerTierNow\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(lmiproCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGetVolumeDiscountSaga() {\r\n yield takeLatest(LmiProCheckoutActionTypes.GET_VOLUME_DISCOUNT, getVolumeDiscountSaga)\r\n}\r\n\r\nexport default initializeGetVolumeDiscountSaga\r\n","import { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { getCheckoutState } from '@lmipro/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* setBillingFrequencySaga(action: ReturnType) {\r\n const { frequency: billingFrequency } = action.payload\r\n const { organizers, selectedTierIndex }: LmiProCheckoutState = yield select(getCheckoutState)\r\n yield put(lmiproCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency))\r\n}\r\n\r\nfunction* initializeSetBillingFrequencySaga() {\r\n yield takeLatest(LmiProCheckoutActionTypes.SET_BILLING_FREQUENCY, setBillingFrequencySaga)\r\n}\r\n\r\nexport default initializeSetBillingFrequencySaga\r\n","import { LmiProCheckCouponProductsValidityParameters, LmiProCouponSkuValidity } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { LmiProCalculateCouponPriceActionPayload } from '@lmipro/state/coupon-util'\r\nimport { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport {\r\n checkCouponGenericValidity,\r\n checkCouponProductsValidity,\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n} from '@lmipro/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* validateCouponSaga(action: ReturnType) {\r\n const { couponValidationData, isAttemptingUrlCoupon } = action.payload\r\n const { couponServerData, selectedPlan, selectedAddons, billingFrequency } = couponValidationData\r\n const selectedPlanSku = selectedPlan?.sKU\r\n const isCouponGenericValid: boolean = yield call(checkCouponGenericValidity, couponServerData as CouponServerData)\r\n if (isCouponGenericValid) {\r\n const checkProductValidityArguments: LmiProCheckCouponProductsValidityParameters = {\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }\r\n const couponSkuValidity: LmiProCouponSkuValidity = yield call(\r\n checkCouponProductsValidity,\r\n checkProductValidityArguments\r\n )\r\n const isCouponAppliedToMinimumProductsInCart: boolean = yield call(\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n couponSkuValidity\r\n )\r\n\r\n yield put(lmiproCouponActions.setCouponValidAndApplied(isCouponAppliedToMinimumProductsInCart))\r\n if (isCouponAppliedToMinimumProductsInCart) {\r\n const calculateCouponPriceActionPayload: LmiProCalculateCouponPriceActionPayload = {\r\n ...couponValidationData,\r\n couponSkuValidity,\r\n }\r\n yield put(lmiproCouponActions.calculateCouponPrice(calculateCouponPriceActionPayload))\r\n yield put(lmiproCouponActions.setUrlCouponActive(isAttemptingUrlCoupon))\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(lmiproCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(lmiproCouponActions.resetCouponData())\r\n }\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(lmiproCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(lmiproCouponActions.resetCouponData())\r\n }\r\n}\r\n\r\nexport default function* initializeValidateCouponSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.VALIDATE_COUPON, validateCouponSaga)\r\n}\r\n","import { getCouponInfo } from '@common/services'\r\nimport { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { contentActions } from '@lmipro/state/content/actions'\r\nimport { CouponInfoServerResponse } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* getCouponDetailsSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n try {\r\n const couponInfoServerResponse: CouponInfoServerResponse = yield call(getCouponInfo, couponCode)\r\n if (!isEmpty(couponInfoServerResponse.data)) {\r\n const {\r\n data: { couponCode: couponServerResponseData, couponDisclaimer },\r\n } = couponInfoServerResponse\r\n if (couponServerResponseData) {\r\n yield put(lmiproCouponActions.setCouponServerData(couponServerResponseData))\r\n }\r\n if (couponDisclaimer) {\r\n yield put(contentActions.setCouponDisclaimer(couponDisclaimer))\r\n }\r\n }\r\n } catch (e) {\r\n console.error('unable to get url coupon details')\r\n yield put(lmiproCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeGetCouponDetailsSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.GET_COUPON_DETAILS, getCouponDetailsSaga)\r\n}\r\n","import { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { LmiProCouponProcessedDataPerSku } from '@lmipro/state/coupon/state'\r\nimport {\r\n GetLmiProProductItemsParameters,\r\n LmiProProcessCouponDataParameters,\r\n LmiProProductDetails,\r\n} from '@lmipro/state/coupon-util'\r\nimport { getCouponItemPriceMap, getProductItemsMap, processCouponData } from '@lmipro/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { TimePeriod, COUPON_DISCOUNT_TYPE } from '@common/constants'\r\n\r\nfunction* calculateCouponPriceSaga(action: ReturnType) {\r\n const { couponCalculationData } = action.payload\r\n const {\r\n couponServerData,\r\n couponSkuValidity,\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n } = couponCalculationData\r\n const { couponDiscountType } = couponServerData\r\n const getProductItemsArguments: GetLmiProProductItemsParameters = {\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n }\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const productItemsMap: Map = yield call(getProductItemsMap, getProductItemsArguments)\r\n const couponItemsMap: Map = yield call(\r\n getCouponItemPriceMap,\r\n couponServerData,\r\n selectedCurrency,\r\n isAnnual\r\n )\r\n const processCouponDataArguments: LmiProProcessCouponDataParameters = {\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n }\r\n const couponProcessedDataPerSku: LmiProCouponProcessedDataPerSku | null = yield call(\r\n processCouponData,\r\n processCouponDataArguments\r\n )\r\n if (couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE) {\r\n yield put(\r\n lmiproCouponActions.checkVolumeDiscountAgainstRepriceCoupon({\r\n couponServerData,\r\n couponProcessedDataPerSku,\r\n selectedPlan,\r\n })\r\n )\r\n }\r\n yield put(lmiproCouponActions.setCouponProcessedData(couponProcessedDataPerSku))\r\n}\r\n\r\nexport default function* initializeCalculateCouponPriceSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.CALCULATE_COUPON_PRICE, calculateCouponPriceSaga)\r\n}\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { LmiProValidateCouponActionPayload } from '@lmipro/state/coupon-util'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { getCheckoutState, getCouponState } from '@lmipro/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { getAvailableCouponServerData } from '@lmipro/utils'\r\nimport { LocationActionTypes } from '@common/state/location/actions'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype PartialValidateCouponActionPayload = Omit\r\n\r\ntype ObserveValidateCouponAction =\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType // this covers both organizers and selected tier index\r\n | ReturnType\r\n | ReturnType // this action is used to only trigger the below saga and avoid going to reducer\r\n\r\ntype CouponDataActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* observeValidateCouponSaga(action: ObserveValidateCouponAction) {\r\n try {\r\n const {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }: LmiProCheckoutState = yield select(getCheckoutState)\r\n\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const [couponServerDataFromState, isUrlCouponData]: [CouponServerData | null, boolean] = yield call(\r\n getAvailableCouponServerData,\r\n coupon,\r\n selectedPlan\r\n )\r\n\r\n const validateCouponActionPartialPayload: PartialValidateCouponActionPayload = {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlan,\r\n selectedAddons,\r\n billingFrequency: billingFrequency as TimePeriod,\r\n selectedCurrency: currency,\r\n }\r\n\r\n const isCouponDataAction =\r\n action.type === LmiProCouponActionTypes.SET_COUPON_SERVER_DATA ||\r\n action.type === LmiProCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON\r\n\r\n if (couponServerDataFromState && !isCouponDataAction) {\r\n const validateCouponActionPayload: LmiProValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData: couponServerDataFromState,\r\n }\r\n switch (action.type) {\r\n case LmiProCheckoutActionTypes.SET_SELECTED_PLAN: {\r\n const { planSku } = action.payload\r\n const selectedPlanByAction: LmiProPlan = yield call(getSelectedPlan, planSku)\r\n validateCouponActionPayload.selectedPlan = selectedPlanByAction\r\n break\r\n }\r\n case LmiProCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n validateCouponActionPayload.selectedAddons = addons\r\n break\r\n }\r\n case LmiProCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { organizers: payloadOrganizers, selectedTierIndex: payloadTierIndex } = action.payload\r\n validateCouponActionPayload.organizers = payloadOrganizers\r\n validateCouponActionPayload.selectedTierIndex = payloadTierIndex\r\n break\r\n }\r\n case LmiProCheckoutActionTypes.SET_BILLING_FREQUENCY: {\r\n const { frequency } = action.payload\r\n validateCouponActionPayload.billingFrequency = frequency\r\n break\r\n }\r\n default: {\r\n break // do nothing\r\n }\r\n }\r\n // if url coupon is available, attempt to validate the url coupon again before checking for CMS coupon\r\n yield put(lmiproCouponActions.validateCoupon(validateCouponActionPayload, isUrlCouponData))\r\n } else if (isCouponDataAction) {\r\n const { payload } = action as CouponDataActionType\r\n const { couponServerData } = payload\r\n const validateCouponActionPayload: LmiProValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData,\r\n }\r\n // isUrlCoupon should be true or false based on the action type\r\n const isUrlCoupon = action.type === LmiProCouponActionTypes.SET_COUPON_SERVER_DATA\r\n yield put(lmiproCouponActions.validateCoupon(validateCouponActionPayload, isUrlCoupon))\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n}\r\n\r\nexport default function* initializeObserveValidateCouponSaga() {\r\n yield takeLatest(\r\n [\r\n LmiProCouponActionTypes.SET_COUPON_SERVER_DATA,\r\n LmiProCheckoutActionTypes.SET_SELECTED_PLAN,\r\n LmiProCheckoutActionTypes.SET_ORGANIZERS,\r\n LmiProCheckoutActionTypes.SET_SELECTED_ADDONS,\r\n LmiProCheckoutActionTypes.SET_BILLING_FREQUENCY,\r\n LmiProCheckoutActionTypes.SET_SELECTED_TIER_INDEX,\r\n LmiProCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON,\r\n LocationActionTypes.SET_IS_LOCATION_INFO_LOADED,\r\n ],\r\n observeValidateCouponSaga\r\n )\r\n}\r\n","import { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* attempUrlCouponSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n if (couponCode) {\r\n // if url promotion available\r\n yield put(lmiproCouponActions.getCouponDetails(couponCode as string))\r\n } else {\r\n yield put(lmiproCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeAttempUrlCouponSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.SET_URL_COUPON_CODE, attempUrlCouponSaga)\r\n}\r\n","import { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* checkCMSCouponSaga(action: ReturnType) {\r\n // clear out previous coupon processed data\r\n yield put(lmiproCouponActions.resetCouponData())\r\n const { selectedPlanSku } = action.payload\r\n const selectedPlan: LmiProPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { activeCoupon } = selectedPlan ?? {} ?? {}\r\n if (activeCoupon && !isEmpty(activeCoupon)) {\r\n // apply the cms coupon only if cms coupon is available\r\n yield put(lmiproCouponActions.observeValidateCMSCoupon(activeCoupon))\r\n }\r\n}\r\n\r\nexport default function* initialCheckCMSCouponSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.CHECK_CMS_COUPON, checkCMSCouponSaga)\r\n}\r\n","import { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\nimport { call, select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState, getCouponState } from '@lmipro/state/selectors'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\nimport { COUPON_DISCOUNT_TYPE } from '@common/constants'\r\nimport { getActiveCouponServerData } from '@lmipro/utils'\r\nimport { LmiProCouponState } from '@lmipro/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype CheckVolumeDiscountAction =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* checkVolumeDiscountAgainstRepriceCouponSaga(action: CheckVolumeDiscountAction) {\r\n const coupon: LmiProCouponState = yield select(getCouponState)\r\n const { selectedPlanSku }: LmiProCheckoutState = yield select(getCheckoutState)\r\n let { couponProcessedDataPerSku } = coupon\r\n let volumeDiscountPrice = 0\r\n let selectedPlan: LmiProPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n let couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n\r\n if (action.type === LmiProCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE) {\r\n volumeDiscountPrice = action.payload.currentVolumeDiscountPrice\r\n } else if (action.type === LmiProCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON) {\r\n const { checkVolumeDiscountData } = action.payload\r\n couponServerData = checkVolumeDiscountData.couponServerData\r\n couponProcessedDataPerSku = checkVolumeDiscountData.couponProcessedDataPerSku\r\n selectedPlan = checkVolumeDiscountData.selectedPlan\r\n const { currentVolumeDiscountPrice }: LmiProCheckoutState = yield select(getCheckoutState)\r\n volumeDiscountPrice = currentVolumeDiscountPrice\r\n }\r\n\r\n if (\r\n couponServerData &&\r\n !isEmpty(couponServerData) &&\r\n couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE\r\n ) {\r\n const couponDiscountTotalSavings: number = get(\r\n couponProcessedDataPerSku,\r\n [selectedPlan?.sKU, 'discountTotalSavings'],\r\n 0\r\n )\r\n if (volumeDiscountPrice < couponDiscountTotalSavings) {\r\n yield put(lmiproCheckoutActions.adjustCurrentVolumeDiscountForRepriceCoupon())\r\n }\r\n }\r\n}\r\n\r\nexport default function* initializeCheckVolumeDiscountAgainstRepriceCouponSaga() {\r\n yield takeLatest(\r\n [\r\n LmiProCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON,\r\n LmiProCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE,\r\n ],\r\n checkVolumeDiscountAgainstRepriceCouponSaga\r\n )\r\n}\r\n","import { lmiproCouponActions, LmiProCouponActionTypes } from '@lmipro/state/coupon/actions'\r\nimport { put, takeLatest, take } from 'redux-saga/effects'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState } from '@lmipro/state/selectors'\r\nimport { LmiProCheckoutState } from '@lmipro/state/checkout/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { lmiproCheckoutActions, LmiProCheckoutActionTypes } from '@lmipro/state/checkout/actions'\r\n\r\nfunction* attemptCMSCouponSaga() {\r\n // check if there's a coupon available from CMS\r\n let { selectedPlanSku }: LmiProCheckoutState = yield select(getCheckoutState)\r\n if (isEmpty(selectedPlanSku)) {\r\n const selectedPlanAction: ReturnType = yield take(\r\n LmiProCheckoutActionTypes.SET_SELECTED_PLAN\r\n )\r\n selectedPlanSku = selectedPlanAction.payload.planSku\r\n }\r\n yield put(lmiproCouponActions.checkCMSCoupon(selectedPlanSku))\r\n}\r\n\r\nexport default function* initializeAttemptCMSCouponSaga() {\r\n yield takeLatest(LmiProCouponActionTypes.ATTEMPT_FOR_CMS_COUPON, attemptCMSCouponSaga)\r\n}\r\n","import initializeLoadContentSaga from './content/load-content'\r\nimport initializeSubmitFormSaga from './checkout-form/form-submission'\r\nimport initializeAbandonedCartSaga from './user/abandoned-cart'\r\nimport initializeExistingUserSaga from './user/existing-user'\r\nimport initializeCreateUserSaga from './user/create-user'\r\nimport initializeGetAccessToken from './user/get-token'\r\nimport initializeLogin from './user/login'\r\nimport initializeLogout from './user/logout'\r\nimport initializeLoadSavedStateSaga from './saved-state/saved-state'\r\nimport initializeCalculatePriceSaga from './checkout-form/calculate-price'\r\nimport initializeCreateBillingInfoSaga from './checkout-form/create-billing-info'\r\nimport initializeCreatePaymentSaga from './checkout-form/create-payment'\r\nimport initializeCreateAndSubmitPaymentSaga from './checkout-form/create-and-submit-payment'\r\nimport initializeGetPaymentMethodSaga from './checkout-form/get-payment-methods'\r\nimport initializeSubmitPaymentSaga from './checkout-form/submit-payment'\r\nimport initializeUserLoggedInSaga from './user/user-logged-in'\r\nimport initializeExistingUserSubmitFormSaga from './checkout-form/existing-user-form-submission'\r\nimport initializeResetCheckoutFormAffectedStatesSaga from './checkout-form/reset-checkout-form-affected-states'\r\nimport initializeLmiProTrackingSaga from './tracking/track-event'\r\nimport initializeCalculateVolumeDiscountSaga from './checkout-form/calculate-volume-discount'\r\nimport initializeGetSelectedTier from './checkout-form/get-selected-tier'\r\nimport initializeGetVolumeDiscountSaga from './checkout-form/get-volume-discount'\r\nimport initializeSetBillingFrequencySaga from './checkout-form/set-billing-frequency'\r\nimport initializeValidateCouponSaga from './coupon/validate-coupon'\r\nimport initializeGetCouponDetailsSaga from './coupon/get-coupon-details'\r\nimport initializeCalculateCouponPriceSaga from './coupon/calculate-coupon-price'\r\nimport initializeObserveValidateCouponSaga from './coupon/observe-validate-coupon'\r\nimport initializeAttempUrlCouponSaga from './coupon/attempt-url-coupon'\r\nimport initialCheckCMSCouponSaga from './coupon/check-cms-coupon'\r\nimport initializeCheckVolumeDiscountAgainstRepriceCouponSaga from './coupon/check-volume-discount-against-reprice-coupon'\r\nimport initializeAttemptCMSCouponSaga from './coupon/attempt-cms-coupon'\r\n\r\nexport const lmiProSagas = {\r\n lmiproContentSaga: initializeLoadContentSaga,\r\n lmiproSubmitFormSaga: initializeSubmitFormSaga,\r\n lmiproAbandonedCartSaga: initializeAbandonedCartSaga,\r\n lmiproExistingUserSaga: initializeExistingUserSaga,\r\n lmiproGetAccessToken: initializeGetAccessToken,\r\n lmiproUserLoginSaga: initializeLogin,\r\n lmiproUserLogoutSaga: initializeLogout,\r\n lmiproCreateUserSaga: initializeCreateUserSaga,\r\n lmiproCalculatePriceSaga: initializeCalculatePriceSaga,\r\n lmiproCreateBillingInfoSaga: initializeCreateBillingInfoSaga,\r\n lmiproCreatePaymentSaga: initializeCreatePaymentSaga,\r\n lmiproCreateAndSubmitPaymentSaga: initializeCreateAndSubmitPaymentSaga,\r\n lmiproGetPaymentSaga: initializeGetPaymentMethodSaga,\r\n lmiproSubmitPaymentSaga: initializeSubmitPaymentSaga,\r\n lmiproLoadSavedStateSaga: initializeLoadSavedStateSaga,\r\n lmiproUserLoggedInSaga: initializeUserLoggedInSaga,\r\n lmiproExistingUserSubmitFormSaga: initializeExistingUserSubmitFormSaga,\r\n lmiproResetCheckoutFormAffectedStates: initializeResetCheckoutFormAffectedStatesSaga,\r\n lmiproTrackingSaga: initializeLmiProTrackingSaga,\r\n lmiproCalculateVolumeDiscountSaga: initializeCalculateVolumeDiscountSaga,\r\n lmiproGetVolumeDiscountSaga: initializeGetVolumeDiscountSaga,\r\n lmiproGetSelectedTierSaga: initializeGetSelectedTier,\r\n lmiproSetBillingFrequencySaga: initializeSetBillingFrequencySaga,\r\n lmiproValidateCouponSaga: initializeValidateCouponSaga,\r\n lmiproGetCouponDetailsSaga: initializeGetCouponDetailsSaga,\r\n lmiproCalculateCouponPriceSaga: initializeCalculateCouponPriceSaga,\r\n lmiproObserveValidateCouponSaga: initializeObserveValidateCouponSaga,\r\n lmiproAttemptUrlCouponSaga: initializeAttempUrlCouponSaga,\r\n lmiproHeckCMSCouponSaga: initialCheckCMSCouponSaga,\r\n lmiproCheckVolumeDiscountAgainstRepriceCouponSaga: initializeCheckVolumeDiscountAgainstRepriceCouponSaga,\r\n lmiproAttemptCMSCouponSaga: initializeAttemptCMSCouponSaga,\r\n}\r\n\r\nexport default lmiProSagas\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport lmicentralServices from '@lmicentral/services'\r\nimport { contentActions, LmiCentralContentActionTypes } from '@lmicentral/state/content/actions'\r\n\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { PRODUCT_SKU } from '@common/constants'\r\n\r\nfunction* loadContentSaga() {\r\n try {\r\n const labelServerResponse: GenericResponse = yield call(lmicentralServices.getLmiCentralLabelData)\r\n if (labelServerResponse && labelServerResponse.data) {\r\n const { labels, plans, ...content } = labelServerResponse.data\r\n const { sEOPageTitle } = labels\r\n const plansWithPricing = plans.map((plan: any) => {\r\n if (plan.sKU === PRODUCT_SKU.LMICENTRAL_BASIC) {\r\n /* eslint-disable no-param-reassign */\r\n plan.userAgentsIncludedAmount = 1\r\n plan.userAgentsIncludedText = 'Devices Included'\r\n plan.userAgentsTootip =\r\n 'Select the number of devices needed for unattended remote access. Each increment of 25 devices equals one license.'\r\n /* eslint-disable no-param-reassign */\r\n return plan\r\n }\r\n if (plan.sKU === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS) {\r\n return {\r\n ...plan,\r\n pricingInfo: {\r\n USD: {\r\n monthly: {\r\n tier1: {\r\n min: 1,\r\n max: 4,\r\n price: 29.0,\r\n },\r\n tier2: {\r\n min: 5,\r\n max: 10,\r\n price: 27.55,\r\n },\r\n tier3: {\r\n min: 11,\r\n max: 25,\r\n price: 26.1,\r\n },\r\n tier4: {\r\n min: 26,\r\n max: 50,\r\n price: 24.65,\r\n },\r\n tier5: {\r\n min: 51,\r\n max: 2147483647,\r\n price: 23.2,\r\n },\r\n },\r\n annual: {\r\n tier1: {\r\n min: 1,\r\n max: 4,\r\n price: 23.0,\r\n },\r\n tier2: {\r\n min: 5,\r\n max: 10,\r\n price: 21.85,\r\n },\r\n tier3: {\r\n min: 11,\r\n max: 25,\r\n price: 20.7,\r\n },\r\n tier4: {\r\n min: 26,\r\n max: 50,\r\n price: 19.55,\r\n },\r\n tier5: {\r\n min: 51,\r\n max: 2147483647,\r\n price: 18.4,\r\n },\r\n },\r\n },\r\n },\r\n }\r\n }\r\n return plan\r\n })\r\n yield call(() => {\r\n if (sEOPageTitle) document.title = sEOPageTitle\r\n })\r\n locationActions.getLocationInfo()\r\n yield put(contentActions.setContent(content, { ...labels }, plansWithPricing, plansWithPricing))\r\n yield put(contentActions.setContentLoaded(true))\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeLmiCentralLoadContentSaga() {\r\n yield takeEvery(LmiCentralContentActionTypes.GET_LABEL_CONTENT, loadContentSaga)\r\n}\r\n\r\nexport default initializeLmiCentralLoadContentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport lmicentralServices from '@lmicentral/services'\r\nimport { LmiCentralUserAccountType } from '@lmicentral/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createUserSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const userCreationResponse: GenericResponse = yield call(lmicentralServices.createUserAccount, userValues)\r\n if (userCreationResponse.data) {\r\n const userData: LmiCentralUserAccountType = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserSaga() {\r\n yield takeEvery(LmiCentralUserActionTypes.CREATE_NEW_USER, createUserSaga)\r\n}\r\n\r\nexport default initializeCreateUserSaga\r\n","import { LmiCentralBillingInfoDataType } from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralBuyFormData } from '@lmicentral/state/buy-form/state'\r\n\r\nexport const getBillingValues = (values: LmiCentralBuyFormData) => {\r\n const billingValues: LmiCentralBillingInfoDataType = {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n postalCode: values.ZipCode,\r\n firstName: values.BillingFirstName,\r\n lastName: values.BillingLastName,\r\n email: values.Email,\r\n companyName: values.CompanyName,\r\n phoneNumber: '',\r\n taxNumber: values.TaxNumber,\r\n federalTaxType: values.TaxType,\r\n }\r\n return billingValues\r\n}\r\n","import { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { getCheckoutState, getPlanData } from '@lmicentral/state/selectors'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { select, call, SelectEffect, CallEffect } from 'redux-saga/effects'\r\nimport { getCurrentPlan, getPlanNameSet } from '@lmicentral/utils/get-current-plan'\r\nimport { getCurrentAddons } from '@lmicentral/utils/get-current-addons'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { UrlParams, updatePlanUrlParam } from '@common/utils'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport function* getSelectedPlan(\r\n planSku?: string\r\n): Generator {\r\n const { selectedPlanSku }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const planSkuToRetrieve = planSku || selectedPlanSku\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiCentralPlan = getCurrentPlan(planSkuToRetrieve, planData)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport function* getSelectedAddons(): Generator<\r\n SelectEffect | CallEffect | CallEffect,\r\n LmiCentralAddon[],\r\n LmiCentralCheckoutState & LmiCentralPlan & LmiCentralAddon[]\r\n> {\r\n const { selectedAddons }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const myAddons: LmiCentralAddon[] = yield call(getCurrentAddons, selectedAddons, selectedPlan)\r\n return myAddons\r\n}\r\n\r\nexport function* getUpdatedPlanUrlParams() {\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const planNameSet: Set = yield call(getPlanNameSet, planData)\r\n const planUrlParams: UrlParams = yield call(\r\n updatePlanUrlParam,\r\n isEmpty(selectedPlan) ? '' : selectedPlan.name,\r\n planNameSet\r\n )\r\n return planUrlParams\r\n}\r\n","import { call, put, select, debounce } from 'redux-saga/effects'\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport { submitAbandonedCart } from '@lmicentral/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { COOKIE_NAMES, LANGUAGE_CODES } from '@common/constants'\r\nimport Cookies from 'js-cookie'\r\nimport { getCheckoutState, getUserState } from '@lmicentral/state/selectors'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralAbandonedCartPayload, LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { sanitizePayload } from '@common/utils/aws-utils'\r\n\r\nexport function* abandonedCartSaga(action: ReturnType) {\r\n const { isTrial, email, success, form } = action.payload.abandonedCartData\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const urlSplitForLanguage = window.location.pathname.split('/')[1]\r\n const isValidLanguageCode = Object.values(LANGUAGE_CODES).includes(urlSplitForLanguage)\r\n const siteLanguage = isValidLanguageCode ? urlSplitForLanguage : LANGUAGE_CODES.English\r\n const data: LmiCentralAbandonedCartPayload = {\r\n success: success.toString(),\r\n email,\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n country: locationInfo?.country,\r\n language: siteLanguage,\r\n program: null,\r\n firstName: null,\r\n lastName: null,\r\n plan: null,\r\n }\r\n\r\n if (isTrial && !success) {\r\n data.firstName = form?.firstName\r\n data.lastName = form?.lastName\r\n }\r\n\r\n if (!isTrial && !success) {\r\n const { existingUserInformation }: LmiCentralUserState = yield select(getUserState)\r\n const { selectedPlanSku }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n data.plan = selectedPlanSku\r\n data.firstName = form?.firstName || existingUserInformation?.Name?.GivenName\r\n data.lastName = form?.lastName || existingUserInformation?.Name?.FamilyName\r\n data.program = 'LMI_Global_EN_TRG_Lead_Promo_Abandoned_Purchase'\r\n }\r\n\r\n try {\r\n // yield delay(1000)\r\n yield call(submitAbandonedCart, sanitizePayload(data))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to post abandoned email api' }))\r\n }\r\n}\r\n\r\nfunction* initializeAbandonedCartSaga() {\r\n yield debounce(1000, LmiCentralUserActionTypes.SUBMIT_ABANDONED_CART, abandonedCartSaga)\r\n}\r\n\r\nexport default initializeAbandonedCartSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport lmicentralServices from '@lmicentral/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createBillingInfoSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.CREATE_BILLING_INFO_SAGA\r\n try {\r\n const { billingValues } = action.payload\r\n const billingResponse: GenericResponse = yield call(lmicentralServices.createBillingInfo, billingValues)\r\n if (billingResponse.status === 200 || billingResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save billing info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save billing info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreateBillingInfoSaga() {\r\n yield takeEvery(LmiCentralCheckoutActionTypes.CREATE_BILLING_INFO, createBillingInfoSaga)\r\n}\r\n\r\nexport default initializeCreateBillingInfoSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { submitPayment } from '@lmicentral/services'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* submitPaymentSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.SUBMIT_PAYMENT_SAGA\r\n try {\r\n const { submitValues } = action.payload\r\n const submitCreation: GenericResponse = yield call(submitPayment, submitValues)\r\n if (submitCreation && submitCreation.data) {\r\n return submitCreation.data\r\n }\r\n } catch {\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'failed to submit payment',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'failed to submit payment',\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeSubmitPaymentSaga() {\r\n yield takeEvery(LmiCentralCheckoutActionTypes.SUBMIT_PAYMENT, submitPaymentSaga)\r\n}\r\n\r\nexport default initializeSubmitPaymentSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport commonServices from '@lmicentral/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { LmiCentralSubmitWithCardAddResponse } from '@lmicentral/state/checkout/state'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\n\r\nexport function* createAndSubmitPaymentSaga(\r\n action: ReturnType\r\n) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n try {\r\n const { submitValues } = action.payload\r\n const createAndSubmitPaymentResponse: LmiCentralSubmitWithCardAddResponse = yield call(\r\n commonServices.submitPaymentWithCardAdd,\r\n submitValues\r\n )\r\n if (createAndSubmitPaymentResponse.status === 200 || createAndSubmitPaymentResponse.status === 204) {\r\n return createAndSubmitPaymentResponse.data\r\n }\r\n } catch {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n trackErrorMessage: 'failed to save payment info',\r\n })\r\n )\r\n }\r\n return undefined\r\n}\r\n\r\nfunction* initializeCreateAndSubmitPaymentSaga() {\r\n yield takeEvery(LmiCentralCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, createAndSubmitPaymentSaga)\r\n}\r\n\r\nexport default initializeCreateAndSubmitPaymentSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { lmicentralBuyFormActions, LmiCentralBuyFormActionTypes } from '@lmicentral/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { lmicentralUserActions } from '@lmicentral/state/user/actions'\r\nimport { lmicentralCheckoutActions } from '@lmicentral/state/checkout/actions'\r\nimport {\r\n LmiCentralUserDataType,\r\n LmiCentralUserState,\r\n LmiCentralUserAccountType,\r\n LmiCentralAbandonedCartDataType,\r\n} from '@lmicentral/state/user/state'\r\nimport {\r\n LmiCentralBillingInfoDataType,\r\n LmiCentralCreditCardDataType,\r\n LmiCentralCheckoutState,\r\n LmiCentralSubmitWithCardAddDataType,\r\n LmiCentralSubmitWithCardAddData,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { createTokenSaga } from '@common/sagas/flex/create-flex-token'\r\nimport { createUserSaga } from '@lmicentral/saga/user/create-user'\r\nimport { getBillingValues } from '@lmicentral/utils/get-billing-values'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmicentral/saga/content/content-helpers'\r\nimport { getPaymentItems } from '@lmicentral/utils/get-item-values'\r\nimport {\r\n getBuyFormState,\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getUserState,\r\n getPlanData,\r\n} from '@lmicentral/state/selectors'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, LMICENTRAL_TRACKING_COMPONENTS, LMICENTRAL_USER_TYPES } from '@lmicentral/constants'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { LmiCentralContentData } from '@lmicentral/state/content-data'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { PRODUCTS, TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { clearState, getActiveCouponServerData, getSubscriptionInfo } from '@lmicentral/utils'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralBuyFormState } from '@lmicentral/state/buy-form/state'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { FatalErrorMessageType, FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { LmiCentralSubmitPaymentResponseData } from '@lmicentral/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@lmicentral/saga/user/abandoned-cart'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { createAndSubmitPaymentSaga } from './create-and-submit-payment'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n ExpirationDate,\r\n CompanyName,\r\n } = action.payload.values\r\n const checkout: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingUserInformation }: LmiCentralUserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { fingerprint, keyInfo, isCardinalSetupComplete }: FlexState = yield select(getFlexState)\r\n const {\r\n submittoMarketo,\r\n marketoProductName,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n }: LmiCentralContentData = yield select(getContentData)\r\n const buyFormState: LmiCentralBuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === LMICENTRAL_USER_TYPES.TRIALER ||\r\n userType === LMICENTRAL_USER_TYPES.EXPIRED ||\r\n userType === LMICENTRAL_USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiCentralAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n const errorMessage: FatalErrorMessageType = {\r\n trackErrorMessage: 'regular form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n }\r\n\r\n try {\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const billingValues: LmiCentralBillingInfoDataType = getBillingValues(action.payload.values)\r\n const subscriptionInfo = getSubscriptionInfo(TimePeriod.Month, selectedPlan, planData)\r\n const items = getPaymentItems(\r\n selectedPlan,\r\n checkout.agents * 25,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n subscriptionInfo\r\n )\r\n\r\n const userValues: LmiCentralUserDataType = {\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n country: billingValues.country,\r\n fingerPrintSessionId: fingerprint,\r\n productName: PRODUCTS.LMICENTRAL,\r\n }\r\n // #region Get flex token\r\n const flexTokenAction = flexActions.createToken(ExpirationDate)\r\n const tokenData: string = yield call(createTokenSaga, flexTokenAction)\r\n if (tokenData) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = true\r\n } else {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create flex token' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n // if Cardinal script is not set up by now, this indicates setup went wrong. Throw fatal error\r\n if (isScaEnabledForMid && !isCardinalSetupComplete) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = false\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n // #endregion\r\n\r\n // #region trigger Cardinal bin.process. Necessary for PSD2 flow.\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const { token }: FlexState = yield select(getFlexState)\r\n const mask = token?.data?.number\r\n if (isScaEnabledForMid && mask) {\r\n const maskCardBin = mask.slice(0, 6)\r\n const { Status } = yield Cardinal.trigger('bin.process', maskCardBin)\r\n if (Status) {\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n } else {\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n } else {\r\n // Bypass if SCA is not enabled.\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n }\r\n\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n let userKey = ''\r\n let accountKey = ''\r\n\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n const createUserAction = lmicentralUserActions.createNewUser(userValues)\r\n const userData: LmiCentralUserAccountType = yield call(createUserSaga, createUserAction)\r\n if (userData) {\r\n userKey = userData.UserKey\r\n accountKey = userData.BillingId\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(lmicentralCheckoutActions.setAutoLogin(userData.xAutoLoginTicket))\r\n }\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n } else {\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n }\r\n // #endregion\r\n\r\n // #region Save billing info\r\n if (\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] &&\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] &&\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n ) {\r\n const extraBillingValues = { ...billingValues }\r\n extraBillingValues.phoneNumber = ContactPhone\r\n\r\n const createBillingInfoAction = lmicentralCheckoutActions.createBillingInfo(extraBillingValues)\r\n const savedBillingData: boolean = yield call(createBillingInfoSaga, createBillingInfoAction)\r\n if (savedBillingData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n }\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region intialialize BOSS variables\r\n let paymentMethodKey = ''\r\n let paymentKey = ''\r\n const flexFormData: LmiCentralCreditCardDataType = {\r\n expirationMonth: ExpirationDate.substr(0, 2),\r\n expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n flexResponse: tokenData,\r\n flexKeyId: keyInfo.flexKey.keyId,\r\n firstName,\r\n lastName,\r\n email,\r\n }\r\n // //#endregion\r\n\r\n // #region process purchase - 1st purchase call - create and save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const submitValues: LmiCentralSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n }\r\n\r\n const createAndSubmitPaymentAction = lmicentralCheckoutActions.createAndSubmitPayment(submitValues)\r\n const createAndSubmitPaymentData: LmiCentralSubmitWithCardAddData = yield call(\r\n createAndSubmitPaymentSaga,\r\n createAndSubmitPaymentAction\r\n )\r\n let isChallengeRequired = false\r\n if (createAndSubmitPaymentData) {\r\n isChallengeRequired = (createAndSubmitPaymentData.isScaRequired && isScaEnabledForMid) || false\r\n paymentMethodKey = createAndSubmitPaymentData?.paymentMethodKey\r\n paymentKey = createAndSubmitPaymentData?.paymentKey\r\n }\r\n\r\n const payerAuthEnrollment = createAndSubmitPaymentData?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (createAndSubmitPaymentData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.PURCHASE,\r\n eventData: { invoiceNumber: createAndSubmitPaymentData.invoiceNumber },\r\n },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: LmiCentralSubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: true,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = lmicentralCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiCentralSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: LmiCentralAbandonedCartDataType = {\r\n email,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = lmicentralUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(lmicentralUserActions.setDisplayName(firstName))\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentName\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n CompanyName,\r\n })\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(lmicentralCheckoutActions.setPurchaseComplete(true))\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(LmiCentralBuyFormActionTypes.SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport commonServices, { EmailType, EmailCheckResponse } from '@common/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { lmicentralBuyFormActions } from '@lmicentral/state/buy-form/actions'\r\n\r\nexport function* existingUserSaga(action: ReturnType) {\r\n const data: EmailType = { emailAddress: action.payload.email.toLowerCase() }\r\n try {\r\n const response: EmailCheckResponse = yield call(commonServices.canUserAuthenticate, data)\r\n if (response && response.data) {\r\n if (response.data.canUserAuthenticate) {\r\n yield put(lmicentralBuyFormActions.setClearEmail(true))\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to verify email' }))\r\n return false\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeExistingUserSaga() {\r\n yield takeEvery(LmiCentralUserActionTypes.CHECK_EXISTING_USER, existingUserSaga)\r\n}\r\n\r\nexport default initializeExistingUserSaga\r\n","import { takeLatest, put, call } from 'redux-saga/effects'\r\n\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport authClass from '@common/utils/auth-class'\r\nimport { saveToken, appInsightsTrackEvent } from '@common/utils'\r\nimport commonServices from '@common/services'\r\nimport { Token } from '@getgo/auth-client'\r\n\r\nfunction* getAccessToken() {\r\n try {\r\n yield put(lmicentralUserActions.setVerifyingToken(true))\r\n const newAccessToken: Token | undefined = yield call(authClass.authInit)\r\n // if new token save it\r\n if (newAccessToken) {\r\n yield put(lmicentralUserActions.setAccessToken(newAccessToken))\r\n yield call(saveToken, newAccessToken)\r\n } else {\r\n try {\r\n yield call(commonServices.clearUserSession)\r\n } catch (e: any) {\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n }\r\n yield put(lmicentralUserActions.setIsUserLoggedIn(!!newAccessToken))\r\n // to check if this action ran\r\n yield put(lmicentralUserActions.setVerifyShouldUserLogIn(true))\r\n yield put(lmicentralUserActions.setVerifyingToken(false))\r\n } catch (e: any) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get access token' }))\r\n yield put(lmicentralUserActions.setVerifyingToken(false))\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n}\r\n\r\nfunction* initializeGetAccessToken() {\r\n yield takeLatest(LmiCentralUserActionTypes.GET_ACCESS_TOKEN, getAccessToken)\r\n}\r\n\r\nexport default initializeGetAccessToken\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport authClass from '@common/utils/auth-class'\r\n\r\nfunction* userLogin(action: ReturnType) {\r\n try {\r\n const pathname = action.payload.pathname || window.location.pathname\r\n const search = action.payload.search || window.location.search\r\n const sso = action.payload.sso || false\r\n yield call(authClass.login, pathname, search, sso)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogin() {\r\n yield takeEvery(LmiCentralUserActionTypes.USER_LOGIN, userLogin)\r\n}\r\n\r\nexport default initializeLogin\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport { logout } from '@common/utils'\r\n\r\nfunction* userLogout() {\r\n try {\r\n const { pathname, search } = window.location\r\n yield call(logout, pathname, search)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogout() {\r\n yield takeEvery(LmiCentralUserActionTypes.USER_LOGOUT, userLogout)\r\n}\r\n\r\nexport default initializeLogout\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport {\r\n LmiCentralCalculateCouponPriceActionPayload,\r\n LmiCentralCheckVolumeDiscountAgainstRepriceCouponActionPayload,\r\n LmiCentralValidateCouponActionPayload,\r\n} from '../coupon-util'\r\nimport { LmiCentralCouponProcessedDataPerSku } from './state'\r\n\r\nexport enum LmiCentralCouponActionTypes {\r\n SET_APPLY_COUPON_ATTEMPT_MADE = '[lmicentral-coupon-actions] check-apply-coupon-attempt-made',\r\n GET_COUPON_DETAILS = '[lmicentral-coupon-actions] get-coupon-details',\r\n CALCULATE_COUPON_PRICE = '[lmicentral-coupon-actions] calculate-coupon-price',\r\n VALIDATE_COUPON = '[lmicentral-coupon-actions] validate-coupon',\r\n SET_COUPON_PROCESSED_DATA = '[lmicentral-coupon-actions] set-coupon-processed-data',\r\n SET_COUPON_SERVER_DATA = '[lmicentral-coupon-actions] set-coupon-server-data',\r\n CHECK_CMS_COUPON = '[lmicentral-coupon-actions] check-cms-coupon',\r\n RESET_COUPON_DATA = '[lmicentral-coupon-actions] reset-coupon-data',\r\n SET_COUPON_VALID_AND_APPLIED = '[lmicentral-coupon-actions] set-coupon-valid-and-applied',\r\n SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER = '[lmicentral-coupon-actions] set-coupon-double-dip-amount-for-new-user',\r\n SET_URL_COUPON_ACTIVE = '[lmicentral-coupon-actions] set-url-coupon-active',\r\n OBSERVE_VALIDATE_CMS_COUPON = '[lmicentral-coupon-actions] observe-validate-cms-coupon',\r\n CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON = '[lmicentral-coupon-actions] check-volume-discount-against-reprice-coupon',\r\n ATTEMPT_FOR_CMS_COUPON = '[lmicentral-coupon-actions] attempt-for-cms-coupon',\r\n SET_URL_COUPON_CODE = '[lmicentral-coupon-actions] set-url-coupon-code',\r\n}\r\n\r\nexport const lmicentralCouponActions = {\r\n getCouponDetails: (couponCode: string) =>\r\n createAction(LmiCentralCouponActionTypes.GET_COUPON_DETAILS, { couponCode }),\r\n validateCoupon: (couponValidationData: LmiCentralValidateCouponActionPayload, isAttemptingUrlCoupon: boolean) =>\r\n createAction(LmiCentralCouponActionTypes.VALIDATE_COUPON, { couponValidationData, isAttemptingUrlCoupon }),\r\n calculateCouponPrice: (couponCalculationData: LmiCentralCalculateCouponPriceActionPayload) =>\r\n createAction(LmiCentralCouponActionTypes.CALCULATE_COUPON_PRICE, { couponCalculationData }),\r\n setCouponProcessedData: (couponProcessedDataPerSku: LmiCentralCouponProcessedDataPerSku | null) =>\r\n createAction(LmiCentralCouponActionTypes.SET_COUPON_PROCESSED_DATA, { couponProcessedDataPerSku }),\r\n setCouponServerData: (couponServerData: CouponServerData) =>\r\n createAction(LmiCentralCouponActionTypes.SET_COUPON_SERVER_DATA, { couponServerData }),\r\n checkCMSCoupon: (selectedPlanSku: string) =>\r\n createAction(LmiCentralCouponActionTypes.CHECK_CMS_COUPON, { selectedPlanSku }),\r\n resetCouponData: () => createAction(LmiCentralCouponActionTypes.RESET_COUPON_DATA),\r\n setCouponValidAndApplied: (isCouponValidAndApplied: boolean) =>\r\n createAction(LmiCentralCouponActionTypes.SET_COUPON_VALID_AND_APPLIED, { isCouponValidAndApplied }),\r\n setCouponDoubleDipAmountForNewUser: (couponDoubleDipAmountForNewUser: number) =>\r\n createAction(LmiCentralCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER, {\r\n couponDoubleDipAmountForNewUser,\r\n }),\r\n setUrlCouponActive: (isUrlCouponActive: boolean) =>\r\n createAction(LmiCentralCouponActionTypes.SET_URL_COUPON_ACTIVE, { isUrlCouponActive }),\r\n observeValidateCMSCoupon: (couponServerData: CouponServerData) =>\r\n createAction(LmiCentralCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON, { couponServerData }),\r\n checkVolumeDiscountAgainstRepriceCoupon: (\r\n checkVolumeDiscountData: LmiCentralCheckVolumeDiscountAgainstRepriceCouponActionPayload\r\n ) =>\r\n createAction(LmiCentralCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON, {\r\n checkVolumeDiscountData,\r\n }),\r\n attemptForCMSCoupon: () => createAction(LmiCentralCouponActionTypes.ATTEMPT_FOR_CMS_COUPON),\r\n setUrlCouponCode: (couponCode: string) =>\r\n createAction(LmiCentralCouponActionTypes.SET_URL_COUPON_CODE, { couponCode }),\r\n}\r\n\r\nexport type LmiCentralCouponActions = ActionUnion\r\n","import { select, put, takeLeading, call } from 'redux-saga/effects'\r\nimport queryString from 'query-string'\r\nimport { loadSessionState, loadState } from '@lmicentral/utils'\r\nimport { LmiCentralCheckoutActionTypes, lmicentralCheckoutActions } from '@lmicentral/state/checkout/actions'\r\nimport { getCheckoutState, getPlanData } from '@lmicentral/state/selectors'\r\nimport { getSelectedPlan } from '@lmicentral/saga/content/content-helpers'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { TimePeriod, SC_SITE, FEATURE_FLAGS, LMIPRO_REDIRECT_PATHS, PRODUCT_SKU } from '@common/constants'\r\nimport {\r\n LmiCentralCheckoutState,\r\n LmiCentralSavedSessionState,\r\n LmiCentralSavedStoreState,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { getCurrentAddons } from '@lmicentral/utils/get-current-addons'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { lmicentralCouponActions } from '@lmicentral/state/coupon/actions'\r\nimport { contentActions } from '@common/state/content/actions'\r\nimport { ADDONS } from '@lmicentral/constants'\r\nimport commonServices from '@common/services'\r\n\r\nfunction* loadSavedStateSaga(action: ReturnType) {\r\n try {\r\n const savedState: LmiCentralSavedStoreState | undefined = yield call(loadState)\r\n const savedSessionState: LmiCentralSavedSessionState | undefined = yield call(loadSessionState)\r\n const checkout: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const { urlPlan } = action.payload\r\n const {\r\n billingFrequency: queryBillingFrequency,\r\n minUsers,\r\n couponCode: queryCouponCode,\r\n } = queryString.parse(window.location.search)\r\n // grab url param for billing frequecy or saved one\r\n const preselectedBillingFrequency = queryBillingFrequency || savedState?.checkout?.billingFrequency\r\n // if min users was passed via url or saved in the store\r\n const preselectedMinUsers = Number(minUsers) || savedState?.checkout?.organizers\r\n const featureFlags: { data: { flags: string[] } } = yield call(commonServices.getFeatureFlags, SC_SITE.LOGMEIN)\r\n const useNewLmiCentralSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.LMIPRO_USE_NEW_SKUS)\r\n\r\n // grab url param for couponCode first and if not available go for saved one\r\n let preSavedCouponCode = (queryCouponCode as string) || savedSessionState?.coupon?.urlCouponCode\r\n // try to apply coupon code and also save the coupon code in state\r\n preSavedCouponCode = preSavedCouponCode || ''\r\n yield put(lmicentralCouponActions.setUrlCouponCode(preSavedCouponCode))\r\n\r\n yield put(contentActions.setLanguage(savedSessionState?.language || ''))\r\n\r\n // if the value of the preselected frequency is an acceptable value and is not the same\r\n // as what is already saved, update it\r\n if (\r\n (preselectedBillingFrequency === TimePeriod.Month || preselectedBillingFrequency === TimePeriod.Year) &&\r\n preselectedBillingFrequency !== checkout.billingFrequency\r\n ) {\r\n yield put(lmicentralCheckoutActions.setBillingFrequency(preselectedBillingFrequency))\r\n }\r\n\r\n if (preselectedMinUsers) {\r\n yield put(lmicentralCheckoutActions.setOrganizers(preselectedMinUsers))\r\n yield put(lmicentralCheckoutActions.setAgents(preselectedMinUsers))\r\n }\r\n // grab url param for plan or saved in store\r\n if (urlPlan) {\r\n const preselectedPlan = urlPlan.replace(/-/g, ' ')\r\n // check if plan name is different\r\n if (urlPlan && urlPlan?.toLowerCase() !== selectedPlan.shortName.toLowerCase()) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find(\r\n (pln: LmiCentralPlan) =>\r\n pln.shortName.split(' ').join('').toLocaleLowerCase() === preselectedPlan.toLowerCase()\r\n )\r\n if (foundPlan) {\r\n yield put(lmicentralCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n } else {\r\n // if plan is provided in url but does not exist in plan data list, redirect to error page\r\n window.location.href = `${process.env.LOGMEIN_MARKETING_SITE_URL}${LMIPRO_REDIRECT_PATHS.LMIPRO_REDIRECT_CENTRAL}/404`\r\n return\r\n }\r\n }\r\n } else if (savedState?.checkout?.selectedPlanSku) {\r\n // make sure plan exists in the plans data api call\r\n const foundPlan = planData.find((pln: LmiCentralPlan) => pln.sKU === savedState?.checkout?.selectedPlanSku)\r\n if (foundPlan) {\r\n yield put(lmicentralCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n }\r\n } else if (!savedState?.checkout?.selectedPlanSku) {\r\n // if no plan is selected, default to popular plan ( Individual plan )\r\n const foundPlan = planData.find((pln: LmiCentralPlan) => pln.sKU === PRODUCT_SKU.LMICENTRAL_BASIC)\r\n if (foundPlan) {\r\n yield put(lmicentralCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n } else {\r\n // if popular plan doesn't exist in plan data list, default to useNewLmiProSkus ? v2 plan : first plan\r\n yield put(lmicentralCheckoutActions.setSelectedPlan(planData?.[useNewLmiCentralSkus ? 1 : 0]?.sKU ?? 0))\r\n }\r\n }\r\n\r\n if (savedState) {\r\n const { selectedAddons } = savedState.checkout\r\n\r\n const plan: LmiCentralPlan = yield call(getSelectedPlan)\r\n // if a plan was selected\r\n if (plan.name) {\r\n // find matching addon in the plan from preselected addon\r\n const foundAddons: LmiCentralAddon[] = yield call(getCurrentAddons, selectedAddons || plan.addons, plan)\r\n yield put(lmicentralCheckoutActions.setSelectedAddons(foundAddons))\r\n // find and update Agent addon quantity\r\n const agentAddons = foundAddons.find((addon) => addon.sKU.includes(ADDONS.AGENT))\r\n if (agentAddons) {\r\n yield put(lmicentralCheckoutActions.setAgents(agentAddons.quantity + plan.userAgentsIncludedAmount))\r\n }\r\n // find and update Endpoint addon quantity\r\n const endPointAddons = foundAddons.find(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (endPointAddons) {\r\n yield put(\r\n lmicentralCheckoutActions.setEndpoints(\r\n endPointAddons.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL + plan.endpointsIncludedAmount\r\n )\r\n )\r\n }\r\n // find and update extra addon selection\r\n const extraAddons = foundAddons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON ||\r\n addon.sKU === ADDONS.AUTOMATION_ADDON ||\r\n addon.sKU === ADDONS.INSIGHT_ADDON ||\r\n addon.sKU === ADDONS.SECURITY_ADDON\r\n )\r\n if (extraAddons) {\r\n yield put(lmicentralCheckoutActions.setExtraAddons(extraAddons))\r\n }\r\n }\r\n }\r\n yield put(lmicentralCheckoutActions.setSavedStateLoaded(true, 'saved state saga'))\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeLoadSavedStateSaga() {\r\n yield takeLeading(LmiCentralCheckoutActionTypes.GET_SAVED_STATE, loadSavedStateSaga)\r\n}\r\n\r\nexport default initializeLoadSavedStateSaga\r\n","import { call, takeLatest, select, put, delay } from 'redux-saga/effects'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { LmiCentralCalculatePriceDataType, LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport lmicentralServices from '@lmicentral/services'\r\nimport { getBillingValues } from '@lmicentral/utils/get-billing-values'\r\nimport { getPaymentItems } from '@lmicentral/utils/get-item-values'\r\nimport { getSelectedPlan, getSelectedAddons } from '@lmicentral/saga/content/content-helpers'\r\nimport { getCheckoutState, getCouponState, getUserState, getPlanData } from '@lmicentral/state/selectors'\r\nimport { getLocationState, getAccountState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { BUY_TYPE, LMICENTRAL_TRACKING_COMPONENTS, LMICENTRAL_USER_TYPES } from '@lmicentral/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport {\r\n LmiCentralCalculatePriceAPIData,\r\n LmiCentralCalculatePriceAPIReturnType,\r\n} from '@lmicentral/state/calculate-price'\r\nimport { isEmpty } from 'lodash-es'\r\nimport {\r\n getActiveCouponServerData,\r\n getCouponDoubleDipAmountForNewUser,\r\n getTotalProratedAmount,\r\n getTotalVolumeDiscount,\r\n getSubscriptionInfo,\r\n} from '@lmicentral/utils'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { lmicentralCouponActions } from '@lmicentral/state/coupon/actions'\r\n\r\nexport function* calculatePriceSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.CALCULATE_PRICE_SAGA\r\n try {\r\n yield put(lmicentralCheckoutActions.setTotalLoading(true))\r\n yield delay(1000)\r\n const checkout: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingBillingInformation }: LmiCentralUserState = yield select(getUserState)\r\n const { values, planSKU } = action.payload\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan, planSKU)\r\n const selectedAddons: LmiCentralAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponProcessedDataPerSku } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n\r\n if (userType === LMICENTRAL_USER_TYPES.ADDON) {\r\n values.Street1 = existingBillingInformation?.addressLine1 || ''\r\n values.City = existingBillingInformation?.city || ''\r\n values.CountryCode = existingBillingInformation?.country || ''\r\n values.Email = existingBillingInformation?.email || ''\r\n values.FirstName = existingBillingInformation?.firstName || ''\r\n values.LastName = existingBillingInformation?.lastName || ''\r\n values.ZipCode = existingBillingInformation?.postalCode || ''\r\n values.StateCode = existingBillingInformation?.state || ''\r\n values.TaxNumber = existingBillingInformation?.taxNumber || ''\r\n values.TaxType = existingBillingInformation?.federalTaxType || ''\r\n }\r\n\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n if (!subscriptionInfo.isReplacementBooking && !selectedAddons.length) {\r\n yield put(lmicentralCheckoutActions.setTotalLoading(false))\r\n yield put(lmicentralCheckoutActions.setCalculatedPrice([], 0, 0, 0, 0, ''))\r\n yield put(lmicentralCheckoutActions.setProratedAmount(0))\r\n return\r\n }\r\n\r\n const calculatePriceValues: LmiCentralCalculatePriceDataType = {\r\n address: getBillingValues(values),\r\n currency: locationInfo.currency,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n cart: getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers * 25,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n subscriptionInfo\r\n ),\r\n }\r\n\r\n const calculatePriceCreation: LmiCentralCalculatePriceAPIReturnType = yield call(\r\n lmicentralServices.calculatePrice,\r\n calculatePriceValues\r\n )\r\n if (calculatePriceCreation && calculatePriceCreation.data) {\r\n const {\r\n errorMessages,\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate,\r\n creditback,\r\n }: LmiCentralCalculatePriceAPIData = calculatePriceCreation.data\r\n if (isEmpty(errorMessages)) {\r\n yield put(\r\n lmicentralCheckoutActions.setCalculatedPrice(\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n creditback,\r\n anniversaryDate === null ? '' : (anniversaryDate as string)\r\n )\r\n )\r\n // since the selected plan has an item id of 0 is the product prices array, we need to get the first item from productPrice\r\n // check getPaymentItems function above for more info\r\n const [planProductPrice] = productPrices.filter((productPrice) => productPrice.itemId === 0)\r\n const { volumeDiscount } = planProductPrice\r\n if (volumeDiscount) {\r\n const { amount } = volumeDiscount\r\n const calculatedVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n amount,\r\n checkout.organizers,\r\n false\r\n )\r\n\r\n yield put(\r\n lmicentralCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(calculatedVolumeDiscount)\r\n )\r\n }\r\n\r\n // if add-on user, calculate the prorated amount\r\n if (userType === LMICENTRAL_USER_TYPES.ADDON) {\r\n const calculatedProratedAmount = getTotalProratedAmount(productPrices)\r\n yield put(lmicentralCheckoutActions.setProratedAmount(calculatedProratedAmount))\r\n }\r\n\r\n // coupon discount for DID\r\n if (isCouponValid && couponProcessedDataPerSku && userType !== LMICENTRAL_USER_TYPES.ADDON) {\r\n const couponDoubleDipAmountForNewUser: number = yield call(\r\n getCouponDoubleDipAmountForNewUser,\r\n productPrices\r\n )\r\n\r\n yield put(\r\n lmicentralCouponActions.setCouponDoubleDipAmountForNewUser(couponDoubleDipAmountForNewUser)\r\n )\r\n }\r\n } else {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'Sorry we are having trouble applying your credit',\r\n buyType:\r\n subscriptionInfo.isTrial || !subscriptionInfo.plan\r\n ? BUY_TYPE.DIRECT_BUY\r\n : BUY_TYPE.ADDON,\r\n plan: checkout.billingFrequency === TimePeriod.Month ? 'monthly' : 'annual',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(modalActions.setErrorModal('Unable to get price data'))\r\n }\r\n }\r\n yield put(lmicentralCheckoutActions.setTotalLoading(false))\r\n } catch {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n { event: TRACKING_EVENTS.ERROR_PURCHASE, eventData: { errorMessage: 'error in calculating price' } },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'error in calculating price' }))\r\n yield put(lmicentralCheckoutActions.setTotalLoading(false))\r\n }\r\n}\r\n\r\nfunction* initializeCalculatePriceSaga() {\r\n yield takeLatest(LmiCentralCheckoutActionTypes.CALCULATE_PRICE, calculatePriceSaga)\r\n}\r\n\r\nexport default initializeCalculatePriceSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { savePayment } from '@lmicentral/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createPaymentSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n try {\r\n const { paymentValues } = action.payload\r\n const savePaymentResponse: GenericResponse = yield call(savePayment, paymentValues)\r\n if (savePaymentResponse.status === 200 || savePaymentResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save payment info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreatePaymentSaga() {\r\n yield takeEvery(LmiCentralCheckoutActionTypes.CREATE_PAYMENT, createPaymentSaga)\r\n}\r\n\r\nexport default initializeCreatePaymentSaga\r\n","import { call, put, takeEvery } from 'redux-saga/effects'\r\nimport { LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { getAvailablePaymentMethods } from '@lmicentral/services'\r\nimport { LmiCentralPaymentDataReturnType } from '@lmicentral/state/checkout/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getAvailablePaymentMethodsSaga() {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.GET_AVAILABLE_PAYMENT_METHODS_SAGA\r\n try {\r\n const paymentMethodsCreation: GenericResponse = yield call(getAvailablePaymentMethods)\r\n if (paymentMethodsCreation.data) {\r\n const paymentData: LmiCentralPaymentDataReturnType[] = paymentMethodsCreation.data\r\n return paymentData\r\n }\r\n } catch (e) {\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get available payment methods' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get available payment methods' })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeGetAvailablePaymentMethodsSaga() {\r\n yield takeEvery(LmiCentralCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS, getAvailablePaymentMethodsSaga)\r\n}\r\n\r\nexport default initializeGetAvailablePaymentMethodsSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { lmicentralUserActions, LmiCentralUserActionTypes } from '@lmicentral/state/user/actions'\r\nimport commonServices, {\r\n verifyUser,\r\n getBillingSubscriptions,\r\n getBillingInfo,\r\n getExistingPaymentDetails,\r\n} from '@common/services'\r\nimport { getLabelContent, getUserState, getContentState } from '@lmicentral/state/selectors'\r\nimport { authClass, processExistingBillingInfo } from '@common/utils'\r\nimport { trackAbandonForm } from '@lmicentral/utils'\r\nimport { LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { lmicentralCheckoutActions } from '@lmicentral/state/checkout/actions'\r\nimport { lmicentralBuyFormActions } from '@lmicentral/state/buy-form/actions'\r\nimport { LmiCentralBuyFormData } from '@lmicentral/state/buy-form/state'\r\nimport {\r\n PREFIX,\r\n TimePeriod,\r\n BILLING_TYPES,\r\n PRODUCT_TYPES,\r\n PRODUCT_SKU,\r\n COUNTRIES,\r\n SC_SITE,\r\n PRODUCT_FAMILY_NAME,\r\n} from '@common/constants'\r\nimport { LabelContent } from '@lmicentral/state/label-content'\r\nimport { LMICENTRAL_USER_TYPES, LMICENTRAL_USER_TYPES_RESPONSE } from '@lmicentral/constants'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { isEmpty, partition } from 'lodash-es'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { accountActions } from '@common/state/account/actions'\r\nimport { getCountryFromCookie, setCountryInCookie } from '@common/utils/cookie-utils'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { contentActions } from '@lmicentral/state/content/actions'\r\nimport { LmiCentralContentState } from '@lmicentral/state/content/state'\r\nimport { FEATURE_FLAGS } from '@common/constants/featureFlags'\r\n\r\nfunction* userLoggedInSaga() {\r\n try {\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(true))\r\n const {\r\n loggedIn: { accessToken },\r\n }: LmiCentralUserState = yield select(getUserState)\r\n const { paymentMethodErrorMessage, disabledUserError }: LabelContent = yield select(getLabelContent)\r\n\r\n // clear previous session on the server\r\n yield call(commonServices.clearUserSession)\r\n // get user info\r\n // eslint-disable-next-line camelcase\r\n const response: GenericResponse = yield call(\r\n verifyUser,\r\n accessToken?.access_token || '',\r\n PRODUCT_FAMILY_NAME.LMICENTRAL\r\n )\r\n if (response && !isEmpty(response.data)) {\r\n const {\r\n User: { UserName, Name, UserKey },\r\n AccountKey,\r\n isBanned,\r\n hasGroupSubscription,\r\n } = response.data\r\n\r\n if (hasGroupSubscription) {\r\n trackAbandonForm()\r\n window.location.href = process.env.ADMIN_LMICENTRAL_URL as string\r\n }\r\n\r\n const userInfo: ExistingUserInfoType = {\r\n UserName,\r\n Name,\r\n UserKey,\r\n AccountKey,\r\n }\r\n\r\n const buyFormData: LmiCentralBuyFormData = {\r\n FirstName: Name?.GivenName,\r\n LastName: Name?.FamilyName,\r\n Email: UserName,\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: getCountryFromCookie() || COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n }\r\n\r\n // return error message if user is banned\r\n if (isBanned === true) {\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.BANNED))\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(false))\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n { fatalErrorMessage: disabledUserError, trackErrorMessage: disabledUserError },\r\n true\r\n )\r\n )\r\n return\r\n }\r\n\r\n // USER_IDENTITY_NOT_FOUND implies that user has neither boss nor identity account\r\n // This is the state returned when a token has been invalidated, I dont know\r\n // if there is another use case or not\r\n if (response.data.Code === LMICENTRAL_USER_TYPES_RESPONSE.USER_IDENTITY_NOT_FOUND) {\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.NEW))\r\n yield put(lmicentralUserActions.userLogout())\r\n return\r\n }\r\n\r\n // set up and display existing user account information\r\n yield put(lmicentralUserActions.setExistingUserInformation(userInfo))\r\n\r\n // USER_BOSS_NOT_FOUND implies that user has an identity account\r\n if (response.data.Code === LMICENTRAL_USER_TYPES_RESPONSE.USER_BOSS_NOT_FOUND) {\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.IDENTITY_ONLY))\r\n yield put(lmicentralBuyFormActions.updateInitialFormState(buyFormData))\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // #region attempt to set up existing billing info\r\n const billingInfoRequest: GenericResponse = yield call(getBillingInfo)\r\n if (billingInfoRequest && !isEmpty(billingInfoRequest.data)) {\r\n // We get company name same as the email without the `@` in case we don't provide in the first place.\r\n // This is a known behavior for GTC. So, we check for GTR, we check if that's what we got and don't show the value\r\n const { email, companyName } = billingInfoRequest.data\r\n if (email.replace('@', '').replace('_', '') === companyName) {\r\n billingInfoRequest.data.companyName = ''\r\n }\r\n\r\n const processedBillingData = processExistingBillingInfo(billingInfoRequest.data)\r\n const billingInfo: ExistingBillingInfoType = processedBillingData\r\n const currentCountry = getCountryFromCookie() || COUNTRIES.US\r\n\r\n if (billingInfo.state === 'XX') {\r\n billingInfo.state = ''\r\n yield put(lmicentralBuyFormActions.setStatesOptional(true))\r\n }\r\n\r\n // If address IS set, but GeoIP is different from existing user country,\r\n // reload such that buy form country matches that of GeoIP cookie\r\n if (billingInfo.addressLine1) {\r\n if (billingInfo.country !== currentCountry) {\r\n setCountryInCookie(billingInfo.country)\r\n window.location.reload()\r\n }\r\n } else {\r\n billingInfo.country = currentCountry\r\n }\r\n\r\n billingInfo.firstName = Name.GivenName\r\n billingInfo.lastName = Name.FamilyName\r\n buyFormData.Street1 = billingInfo.addressLine1\r\n buyFormData.City = billingInfo.city\r\n buyFormData.CountryCode = billingInfo.country\r\n buyFormData.ZipCode = billingInfo.postalCode\r\n buyFormData.StateCode = billingInfo.state\r\n buyFormData.ContactPhone = billingInfo.phoneNumber\r\n buyFormData.TaxNumber = billingInfo.taxNumber || ''\r\n buyFormData.TaxType = billingInfo.federalTaxType || ''\r\n\r\n // all five fields must contain values in order to set existing billing information\r\n if (buyFormData.Street1 && buyFormData.City && buyFormData.CountryCode && buyFormData.ZipCode) {\r\n yield put(lmicentralUserActions.setExistingBillingInformation(billingInfo))\r\n }\r\n }\r\n yield put(lmicentralBuyFormActions.updateInitialFormState(buyFormData))\r\n // #endregion\r\n\r\n // #region attempt to set up existing payment info\r\n const paymentInfoRequest: GenericResponse = yield call(getExistingPaymentDetails)\r\n if (paymentInfoRequest && !isEmpty(paymentInfoRequest.data)) {\r\n const currentDate = new Date()\r\n const currentYear = currentDate.getFullYear()\r\n const currentMonth = currentDate.getMonth()\r\n const ccInfo = paymentInfoRequest.data[0].creditCard\r\n if (\r\n ccInfo.expirationYear < currentYear ||\r\n (ccInfo.expirationYear === currentYear && ccInfo.expirationMonth < currentMonth)\r\n ) {\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n {\r\n fatalErrorMessage: paymentMethodErrorMessage,\r\n trackErrorMessage: paymentMethodErrorMessage,\r\n },\r\n true\r\n )\r\n )\r\n }\r\n const paymentInfo: ExistingPaymentInfoType = {\r\n last4Digits: ccInfo.last4Digits,\r\n }\r\n yield put(lmicentralUserActions.setExistingPaymentDetails(paymentInfo))\r\n }\r\n // #endregion\r\n\r\n // if subscription is empty, mark as expired-user\r\n const subscriptionRequest: GenericResponse = yield call(getBillingSubscriptions)\r\n if (isEmpty(subscriptionRequest?.data)) {\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.EXPIRED))\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n const featureFlags: { data: { flags: string[] } } = yield call(\r\n commonServices.getFeatureFlags,\r\n SC_SITE.LOGMEIN\r\n )\r\n\r\n const useNewLmiCentralSkus = featureFlags?.data?.flags?.includes(FEATURE_FLAGS.LMIPRO_USE_NEW_SKUS)\r\n\r\n /* LOGIC CATCH FOR EXISTING USERS\r\n if feature flag is on, and...\r\n\r\n https://jira.ops.expertcity.com/browse/WAE1-2522\r\n If the user is subscribed... | ...they could upgrade to...\r\n Basic v1 | Standard v2\r\n Standard v1 | N/A\r\n Remote Support | Standard v2\r\n Standard v2 | N/A\r\n */\r\n const existingSubscriptionSkus =\r\n subscriptionRequest?.data?.map(({ productSku }: { productSku: PRODUCT_SKU }) => productSku) ?? []\r\n const skuFilter: string[] = []\r\n\r\n if (useNewLmiCentralSkus) {\r\n if (\r\n !existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAME) &&\r\n !existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n ) {\r\n if (existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_BASIC_NAMED)) {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_BASIC_NAMED)\r\n } else {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2)\r\n }\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n } else if (existingSubscriptionSkus.includes(PRODUCT_SKU.LMIPRO_STANDARD_NAME)) {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAME)\r\n } else {\r\n skuFilter.push(PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2)\r\n }\r\n }\r\n\r\n const content: LmiCentralContentState = yield select(getContentState)\r\n\r\n const filterPlans = useNewLmiCentralSkus\r\n ? (sku: PRODUCT_SKU) => skuFilter.includes(sku)\r\n : (sku: PRODUCT_SKU) => [PRODUCT_SKU.LMICENTRAL_BASIC].includes(sku)\r\n\r\n yield put(\r\n contentActions.setContent(\r\n content.contentData,\r\n content.labelContent,\r\n content.allPlanData.filter((plan) => filterPlans(plan.sKU as PRODUCT_SKU)) as [],\r\n content.allPlanData as []\r\n )\r\n )\r\n\r\n // set account subscription state\r\n yield put(accountActions.setAccountSubscriptions(subscriptionRequest.data))\r\n\r\n // partition subscriptions into two arrays - one for GTC and another for GTR\r\n const [lmicentralSubscriptions] = partition(\r\n subscriptionRequest.data,\r\n (plan: BillingDetailedSubscriptionPlan) => {\r\n return plan.productSku.startsWith(PREFIX.GTR)\r\n }\r\n )\r\n\r\n const lmicentralTrialSubscription = lmicentralSubscriptions.find(\r\n (plan: BillingDetailedSubscriptionPlan) => plan.planType === PRODUCT_TYPES.TRIAL\r\n )\r\n\r\n // #region determine buy flow user state\r\n const selectedPlan = lmicentralSubscriptions?.find((plan: BillingDetailedSubscriptionPlan) => {\r\n if (useNewLmiCentralSkus) {\r\n return (\r\n plan.productSku === PRODUCT_SKU.LMIPRO_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAME ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2\r\n )\r\n }\r\n return (\r\n plan.productSku === PRODUCT_SKU.LMIPRO_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.LMIPRO_STANDARD_NAME\r\n )\r\n })\r\n if (selectedPlan) {\r\n const {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n planType,\r\n } = selectedPlan ?? {}\r\n\r\n const overallQuantity = lmicentralSubscriptions.reduce(\r\n (accumulator: number, subItem: ExistingAccountInfoType) => {\r\n if (subItem.productSku === productSku) {\r\n return accumulator + subItem.quantity\r\n }\r\n return accumulator\r\n },\r\n 0\r\n )\r\n\r\n const accountInfo: ExistingAccountInfoType = {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n quantity: overallQuantity,\r\n planType,\r\n }\r\n\r\n yield put(lmicentralUserActions.setExistingAccountInformation(accountInfo))\r\n yield put(lmicentralCheckoutActions.setSelectedPlan(productSku))\r\n yield put(\r\n lmicentralCheckoutActions.setBillingFrequency(\r\n paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n )\r\n )\r\n // if user already has the selected plan, mark as add-on flow\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.ADDON))\r\n yield put(lmicentralCheckoutActions.setSelectedAddons([]))\r\n } else if (lmicentralTrialSubscription) {\r\n // otherwise, if user has any LmiPro trial subscription, mark as trialer\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.TRIALER))\r\n } else {\r\n // otherwise, since user has at least one subscription, mark as cross product\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.CROSSPRODUCT))\r\n }\r\n // #endregion\r\n\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(false))\r\n }\r\n } catch (e) {\r\n yield put(lmicentralUserActions.setUserType(LMICENTRAL_USER_TYPES.NEW))\r\n yield put(lmicentralUserActions.setLoadingExistingInformation(false))\r\n yield call(authClass().logout)\r\n }\r\n}\r\n\r\nfunction* initializeLoggedInSaga() {\r\n yield takeEvery(LmiCentralUserActionTypes.GET_LOGGED_IN_USER_STATE, userLoggedInSaga)\r\n}\r\n\r\nexport default initializeLoggedInSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { lmicentralBuyFormActions, LmiCentralBuyFormActionTypes } from '@lmicentral/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { lmicentralCheckoutActions } from '@lmicentral/state/checkout/actions'\r\nimport {\r\n LmiCentralSubmitDataType,\r\n LmiCentralCheckoutState,\r\n LmiCentralPaymentDataReturnType,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { getPaymentItems } from '@lmicentral/utils/get-item-values'\r\nimport {\r\n getCheckoutState,\r\n getUserState,\r\n getLabelContent,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n} from '@lmicentral/state/selectors'\r\nimport { getLocationState, getAccountState, getFlexState } from '@common/state/selectors'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmicentral/saga/content/content-helpers'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { LmiCentralContentData } from '@lmicentral/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { lmicentralTrackingActions } from '@lmicentral/state/tracking/actions'\r\nimport { LmiCentralAbandonedCartDataType, LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport { ExistingUserInfoType, ExistingBillingInfoType } from '@common/state/user/state'\r\nimport { LabelContent } from '@lmicentral/state/label-content'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { lmicentralUserActions } from '@lmicentral/state/user/actions'\r\nimport { getActiveCouponServerData, clearState, getSubscriptionInfo } from '@lmicentral/utils'\r\nimport { flexFormSaga } from '@common/sagas/flex/get-flex-token'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { FlexTokenDataType } from '@common/services'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { REFERRER, REFERRER_QUERY_PARAM } from '@lmicentral/constants/referrers'\r\nimport { LmiCentralSubmitPaymentResponseData } from '@lmicentral/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@lmicentral/saga/user/abandoned-cart'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = LMICENTRAL_TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]\r\n )\r\n )\r\n\r\n const checkout: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const { addonUserSuccessUrl, gotoAdminUrl }: LabelContent = yield select(getLabelContent)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: LmiCentralUserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const {\r\n submittoMarketo,\r\n marketoProductName,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n }: LmiCentralContentData = yield select(getContentData)\r\n\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiCentralAddon[] = yield call(getSelectedAddons)\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const { CompanyName } = action.payload.values\r\n\r\n try {\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n // #region if CompanyName is provided, update billing info\r\n if (CompanyName && userState.existingBillingInformation) {\r\n const { country, firstName, lastName, email, taxNumber, federalTaxType } =\r\n userState.existingBillingInformation\r\n const billingData = {\r\n addressLine1,\r\n city,\r\n state: stateCode,\r\n country,\r\n postalCode,\r\n firstName,\r\n lastName,\r\n email,\r\n phoneNumber,\r\n taxNumber: taxNumber || '',\r\n federalTaxType: federalTaxType || '',\r\n companyName: CompanyName,\r\n }\r\n\r\n const createBillingInfoAction = lmicentralCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n }\r\n // #endregion\r\n\r\n const items = getPaymentItems(\r\n selectedPlan,\r\n checkout.organizers,\r\n checkout.billingFrequency,\r\n selectedAddons,\r\n subscriptionInfo\r\n )\r\n\r\n // #region attempt to retrieve SCA token to determine Cardinal challenge is required or not\r\n const flexTokenData: FlexTokenDataType = {\r\n currency: locationInfo.currency,\r\n country: locationInfo.country,\r\n targetOrigin: window.location.origin,\r\n skipSca: false,\r\n }\r\n yield call(flexFormSaga, flexActions.getFlexToken(flexTokenData, 0))\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n if (isScaEnabledForMid) {\r\n // wait for Cardinal script is completely loaded before proceeding to next line of code\r\n yield take(FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE)\r\n }\r\n // #endregion\r\n\r\n // #region get available payment menthods\r\n let paymentMethodKey = ''\r\n const getAvailablePaymentData: LmiCentralPaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n // #endregion\r\n // #region process purchase - 1st purchase call\r\n let paymentKey = ''\r\n let isChallengeRequired = false\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: LmiCentralSubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n isScaCompleted: false,\r\n isWithCardAddAfterSca: false,\r\n }\r\n const submitPaymentAction = lmicentralCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiCentralSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n\r\n isChallengeRequired = submitData?.scaResult?.isScaRequired || false\r\n paymentKey = submitData?.scaResult?.paymentKey\r\n\r\n const payerAuthEnrollment = submitData?.scaResult?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: LmiCentralSubmitDataType = {\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: false,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = lmicentralCheckoutActions.submitPayment(submitValues)\r\n const submitData: LmiCentralSubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n lmicentralTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n lmicentralBuyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: LmiCentralAbandonedCartDataType = {\r\n email: UserName,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = lmicentralUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(lmicentralTrackingActions.track({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW }, componentName))\r\n if (submittoMarketo) {\r\n const { planKey } = selectedPlan ?? {}\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n company: CompanyName,\r\n }\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(lmicentralCheckoutActions.setAddonComplete(true))\r\n\r\n const referrer = new URLSearchParams(window.location.search).get(REFERRER_QUERY_PARAM)\r\n if (referrer === REFERRER.gotoAdmin) {\r\n window.location.href = gotoAdminUrl\r\n } else {\r\n window.location.href = addonUserSuccessUrl\r\n }\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'existing user form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(LmiCentralBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { TimePeriod } from '@common/constants'\r\nimport { LmiCentralCheckoutState } from './state'\r\nimport { LmiCentralCheckoutActionTypes } from './actions'\r\nimport type { LmiCentralCheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: LmiCentralCheckoutState = {\r\n isLoading: true,\r\n selectedAddons: [],\r\n submitting: false,\r\n organizers: 1,\r\n promoCode: '',\r\n billingFrequency: TimePeriod.Year,\r\n calculatedTax: 0,\r\n calculatedTotal: 0,\r\n calculatedNetTotal: 0,\r\n calculatedCredit: 0,\r\n anniversaryDate: '',\r\n selectedPlanSku: '',\r\n savedStateLoaded: false,\r\n purchaseComplete: false,\r\n addonComplete: false,\r\n totalLoading: false,\r\n selectedTierIndex: 0, // the default selected tier is Tier1, since selectedTierIndex is zero based index.\r\n currentVolumeDiscountPrice: 0,\r\n volumeDiscountLoading: false,\r\n volumeDiscount: {},\r\n calculatedProratedAmount: 0,\r\n extraAddons: [],\r\n endpoints: 0,\r\n agents: 0,\r\n taxType: '',\r\n autoLogin: undefined,\r\n}\r\n\r\nexport const checkoutReducer = (\r\n previousState: LmiCentralCheckoutState | undefined,\r\n action: LmiCentralCheckoutActions\r\n): LmiCentralCheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case LmiCentralCheckoutActionTypes.SET_LOADING:\r\n return {\r\n ...state,\r\n isLoading: action.payload.loading,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_PURCHASE_COMPLETE:\r\n return {\r\n ...state,\r\n purchaseComplete: action.payload.complete,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_BILLING_FREQUENCY:\r\n return {\r\n ...state,\r\n billingFrequency: action.payload.frequency,\r\n }\r\n case LmiCentralCheckoutActionTypes.CLEAR_ADDONS:\r\n return {\r\n ...state,\r\n selectedAddons: [],\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN:\r\n return {\r\n ...state,\r\n selectedPlanSku: action.payload.planSku,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n return {\r\n ...state,\r\n selectedAddons: [...addons],\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_ORGANIZERS:\r\n return {\r\n ...state,\r\n organizers: action.payload.organizers,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_CALCULATED_PRICE:\r\n return {\r\n ...state,\r\n productPrices: action.payload.productPrices,\r\n calculatedNetTotal: action.payload.net,\r\n calculatedTotal: action.payload.total,\r\n calculatedTax: action.payload.tax,\r\n calculatedCredit: action.payload.creditback,\r\n anniversaryDate: action.payload.anniversaryDate,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SAVED_STATE_LOADED:\r\n return {\r\n ...state,\r\n savedStateLoaded: action.payload.savedStateLoaded,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_LOADING_TOTAL:\r\n return {\r\n ...state,\r\n totalLoading: action.payload.loading,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_ADDON_COMPLETE:\r\n return {\r\n ...state,\r\n addonComplete: action.payload.addonComplete,\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { selectedTierIndex } = action.payload\r\n return {\r\n ...state,\r\n selectedTierIndex,\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_VOLUME_DISCOUNT: {\r\n const { selectedPlanSku, currency, volumeDiscountForSelectedPlanAndCurrency } = action.payload\r\n const selectedPlanSkuVolumeDiscount = state.volumeDiscount[selectedPlanSku] || {}\r\n return {\r\n ...state,\r\n volumeDiscount: {\r\n ...state.volumeDiscount,\r\n [selectedPlanSku]: {\r\n ...selectedPlanSkuVolumeDiscount,\r\n [currency]: volumeDiscountForSelectedPlanAndCurrency,\r\n },\r\n },\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING: {\r\n const { volumeDiscountLoading } = action.payload\r\n return { ...state, volumeDiscountLoading }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE: {\r\n const { currentVolumeDiscountPrice } = action.payload\r\n return { ...state, currentVolumeDiscountPrice }\r\n }\r\n case LmiCentralCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON: {\r\n return { ...state, currentVolumeDiscountPrice: 0 }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_PRORATED_AMOUNT: {\r\n const { proratedAmount } = action.payload\r\n return { ...state, calculatedProratedAmount: proratedAmount }\r\n }\r\n case LmiCentralCheckoutActionTypes.RESET_CHECKOUT_STATE: {\r\n return initialCheckoutState\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_EXTRA_ADDON: {\r\n const { addons = [] } = action.payload\r\n return {\r\n ...state,\r\n extraAddons: addons,\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_ENDPOINTS: {\r\n return {\r\n ...state,\r\n endpoints: action.payload.endpoints,\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_AGENTS: {\r\n return {\r\n ...state,\r\n agents: action.payload.agents,\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_TAX_TYPE: {\r\n return {\r\n ...state,\r\n taxType: action.payload.type,\r\n }\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_AUTO_LOGIN: {\r\n return {\r\n ...state,\r\n autoLogin: action.payload.autoLogin,\r\n }\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { lmicentralBuyFormActions, LmiCentralBuyFormActionTypes } from '@lmicentral/state/buy-form/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { lmicentralCheckoutActions } from '@lmicentral/state/checkout/actions'\r\nimport { initialCheckoutState } from '@lmicentral/state/checkout/reducer'\r\n\r\nexport function* resetBuyFormAffectedStatesSaga() {\r\n yield put(lmicentralBuyFormActions.resetForm())\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n yield put(\r\n lmicentralCheckoutActions.setCalculatedPrice(\r\n [],\r\n initialCheckoutState.calculatedNetTotal,\r\n initialCheckoutState.calculatedTotal,\r\n initialCheckoutState.calculatedTax,\r\n initialCheckoutState.calculatedCredit,\r\n initialCheckoutState.anniversaryDate\r\n )\r\n )\r\n}\r\n\r\nfunction* initializeResetBuyFormAffectedStatesSaga() {\r\n yield takeEvery(LmiCentralBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES, resetBuyFormAffectedStatesSaga)\r\n}\r\n\r\nexport default initializeResetBuyFormAffectedStatesSaga\r\n","import { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { getSelectedAddons, getSelectedPlan } from '@lmicentral/saga/content/content-helpers'\r\nimport {\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n getUserState,\r\n} from '@lmicentral/state/selectors'\r\nimport { LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { select, call } from 'redux-saga/effects'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LMICENTRAL_USER_TYPES } from '@lmicentral/constants'\r\nimport { getActiveCouponServerData, getCouponTotalSavings, getSelectedTierIndex } from '@lmicentral/utils'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { LmiCentralCustomizeItemsData } from '@lmicentral/state/tracking/state'\r\nimport { LmiCentralContentData } from '@lmicentral/state/content-data'\r\n\r\nexport function* getCustomizeItemsData() {\r\n const planData: LmiCentralPlan[] = yield select(getPlanData)\r\n const { CurrencyCode }: LmiCentralContentData = yield select(getContentData)\r\n const { billingFrequency, organizers }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const customizeItemsData: LmiCentralCustomizeItemsData = {\r\n planData,\r\n billingFrequency,\r\n currency: CurrencyCode,\r\n organizers,\r\n }\r\n return customizeItemsData\r\n}\r\n\r\nexport function* getPageViewData() {\r\n const {\r\n loggedIn: { isUserLoggedIn },\r\n }: LmiCentralUserState = yield select(getUserState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { locale, country, language } = locationState.locationInfo\r\n return { locale, country, isUserLoggedIn, language }\r\n}\r\n\r\nexport function* getSessionInfo() {\r\n const {\r\n userType,\r\n loggedIn: { isUserLoggedIn },\r\n }: LmiCentralUserState = yield select(getUserState)\r\n return { isUserLoggedIn, userType, sessionLast: '', sessionNumber: '' }\r\n}\r\n\r\nexport function* getCartInfo() {\r\n const { billingFrequency, organizers, currentVolumeDiscountPrice, selectedTierIndex }: LmiCentralCheckoutState =\r\n yield select(getCheckoutState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { existingBillingInformation, userType, existingAccountInformation }: LmiCentralUserState = yield select(\r\n getUserState\r\n )\r\n const { currency } = locationState.locationInfo\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const selectedAddons: LmiCentralAddon[] = yield call(getSelectedAddons)\r\n\r\n let tierIndex = selectedTierIndex\r\n if (\r\n userType === LMICENTRAL_USER_TYPES.ADDON &&\r\n existingAccountInformation &&\r\n !isEmpty(existingAccountInformation)\r\n ) {\r\n const existingOrganizers = existingAccountInformation.quantity\r\n const totalOrganizers = organizers + existingOrganizers\r\n tierIndex = yield call(getSelectedTierIndex, totalOrganizers, billingFrequency, selectedPlan, currency)\r\n }\r\n\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { couponProcessedDataPerSku, isCouponValidAndApplied, couponDoubleDipAmountForNewUser } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, selectedPlan)\r\n const totalCouponSavings = getCouponTotalSavings(\r\n isCouponValidAndApplied,\r\n couponProcessedDataPerSku,\r\n couponDoubleDipAmountForNewUser\r\n )\r\n\r\n return {\r\n plan: selectedPlan,\r\n addonList: selectedAddons,\r\n billingFrequency,\r\n organizers,\r\n currency,\r\n isExistingUser: !isEmpty(existingBillingInformation),\r\n tier: `Tier${tierIndex + 1}`,\r\n currentVolumeDiscountPrice,\r\n couponCode: couponServerData?.couponCode || '',\r\n couponProcessedDataPerSku,\r\n totalCouponSavings,\r\n }\r\n}\r\n\r\nexport function* getPurchaseData(transactionID: string) {\r\n const { calculatedNetTotal, calculatedTax, promoCode }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const { userType }: LmiCentralUserState = yield select(getUserState)\r\n return { calculatedNetTotal, calculatedTax, promoCode, userType, transactionID }\r\n}\r\n\r\nexport function* getCompleteBuyData() {\r\n const { userType }: LmiCentralUserState = yield select(getUserState)\r\n return userType\r\n}\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { lmicentralTrackingActions, LmiCentralTrackingActionTypes } from '@lmicentral/state/tracking/actions'\r\nimport { trackCTAClick, trackEvent, trackGenericEvent, trackGenericFormEvent } from '@common/utils'\r\nimport { PRODUCT_FAMILY_KEY, TRACKING_EVENTS } from '@common/constants'\r\nimport {\r\n trackBeginCheckout,\r\n trackCompleteBuy,\r\n trackCustomizeViewItem,\r\n trackFormError,\r\n trackPurchase,\r\n trackPurchaseError,\r\n trackSessionInfo,\r\n trackViewContent,\r\n trackUserInformation,\r\n trackEmailValidation,\r\n} from '@lmicentral/utils'\r\nimport {\r\n LmiCentralCartData,\r\n LmiCentralPurchaseData,\r\n LmiCentralCustomizeItemsData,\r\n} from '@lmicentral/state/tracking/state'\r\nimport { CTAClickData, PageViewContentData, SessionInfo } from '@common/state/tracking/state'\r\nimport {\r\n getCartInfo,\r\n getCompleteBuyData,\r\n getCustomizeItemsData,\r\n getPageViewData,\r\n getPurchaseData,\r\n getSessionInfo,\r\n} from './track-helpers'\r\n\r\nexport function* lmicentralTrackingSaga(action: ReturnType) {\r\n const { trackingInfo } = action.payload\r\n const eventName = trackingInfo.event\r\n const trackData = trackingInfo.eventData || {}\r\n\r\n const errorMessage = (trackData.errorMessage as string) || ''\r\n const formErrors = (trackData.formErrors as string[]) || ['']\r\n const formIds = (trackData.formIds as string[]) || ['']\r\n const step = (trackData.step as number) || 0\r\n const ctaClickData: CTAClickData = {\r\n name: (trackData.name as string) || '',\r\n url: (trackData.url as string) || '',\r\n }\r\n const formName = (trackData.formName as string) || ''\r\n const pathName = (trackData.currentLocation as string) || ''\r\n const invoiceNumber = (trackData.invoiceNumber as string) || ''\r\n const userEmail: string = (trackData.userEmail as string) || ''\r\n const plan: string = (trackData.plan as string) || ''\r\n const buyType: string = (trackData.buyType as string) || ''\r\n\r\n switch (eventName) {\r\n case TRACKING_EVENTS.VIEW_ITEM: {\r\n const customizeItemsData: LmiCentralCustomizeItemsData = yield call(getCustomizeItemsData)\r\n trackCustomizeViewItem(customizeItemsData)\r\n break\r\n }\r\n case TRACKING_EVENTS.VIEW_CONTENT: {\r\n const viewContentData: PageViewContentData = yield call(getPageViewData)\r\n trackViewContent(viewContentData, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SESSION_INFORMATION: {\r\n const sessionData: SessionInfo = yield call(getSessionInfo)\r\n trackSessionInfo(sessionData)\r\n break\r\n }\r\n case TRACKING_EVENTS.USER_INFORMATION: {\r\n const cartData: LmiCentralCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackUserInformation(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.BEGIN_CHECKOUT: {\r\n const cartData: LmiCentralCartData = yield call(getCartInfo)\r\n trackBeginCheckout(cartData, step)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_BUY_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.LMICENTRAL, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.PURCHASE: {\r\n const cartData: LmiCentralCartData = yield call(getCartInfo)\r\n const purchaseData: LmiCentralPurchaseData = yield call(getPurchaseData, invoiceNumber)\r\n trackPurchase(cartData, purchaseData)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_PURCHASE: {\r\n trackPurchaseError(errorMessage, plan, buyType)\r\n break\r\n }\r\n case TRACKING_EVENTS.EMAIL_VALIDATION: {\r\n trackEmailValidation(formName, userEmail)\r\n break\r\n }\r\n case TRACKING_EVENTS.COMPLETE_BUY_FLOW: {\r\n const cartData: LmiCentralCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackCompleteBuy(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_CONTACT_SALES_FLOW: {\r\n trackGenericEvent(eventName, PRODUCT_FAMILY_KEY.LMICENTRAL, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.LOAD_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ABANDON_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SUBMIT_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_FORM: {\r\n trackFormError(formIds, formErrors, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.CLICK_CTA: {\r\n trackCTAClick(ctaClickData)\r\n break\r\n }\r\n default: {\r\n yield call(trackEvent, { event: eventName, eventData: trackData })\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeLmiCentralTrackingSaga() {\r\n yield takeEvery(LmiCentralTrackingActionTypes.TRACK, lmicentralTrackingSaga)\r\n}\r\n\r\nexport default initializeLmiCentralTrackingSaga\r\n","import { CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport {\r\n LmiCentralBillingFrequencyVolumeDiscountRecords,\r\n LmiCentralCheckoutState,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { getCheckoutState } from '@lmicentral/state/selectors'\r\nimport { calculateVolumeDiscount } from '@lmicentral/utils'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { call } from 'redux-saga-test-plan/matchers'\r\nimport { put, select, takeEvery } from 'redux-saga/effects'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nexport type CalculateVolumeDiscountSagaTriggerActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* calculateVolumeDiscountSaga(action: CalculateVolumeDiscountSagaTriggerActionType) {\r\n yield put(lmicentralCheckoutActions.setVolumeDiscountLoading(true))\r\n const selectedPlanSku =\r\n action.type === LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN ? action.payload.planSku : undefined\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency: selectedCurrency = CURRENCY.USD } = locationInfo\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { volumeDiscount }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n if (selectedPlanSku) {\r\n const LmiCentralbillingFrequencyVolumeDiscountRecords = get(volumeDiscount, [selectedPlanSku, selectedCurrency])\r\n // skip the calculation if the checkout store already has selected plan volume discount data in the required currency\r\n if (isEmpty(LmiCentralbillingFrequencyVolumeDiscountRecords)) {\r\n const volumeDiscountForSelectedPlanAndCurrency: LmiCentralBillingFrequencyVolumeDiscountRecords =\r\n yield call(calculateVolumeDiscount, selectedPlan, selectedCurrency)\r\n yield put(\r\n lmicentralCheckoutActions.setVolumeDiscount(\r\n selectedPlan?.sKU,\r\n selectedCurrency,\r\n volumeDiscountForSelectedPlanAndCurrency\r\n )\r\n )\r\n }\r\n }\r\n yield put(lmicentralCheckoutActions.setVolumeDiscountLoading(false))\r\n}\r\n\r\nfunction* initializeCalculateVolumeDiscount() {\r\n yield takeEvery(\r\n [LmiCentralCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT, LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN],\r\n calculateVolumeDiscountSaga\r\n )\r\n /* note: we need to add currency here, if the user can change currency,\r\n that would automatically trigger this saga to calculate the volume discount\r\n for the selected plan in that currency.\r\n */\r\n}\r\n\r\nexport default initializeCalculateVolumeDiscount\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { getCheckoutState } from '@lmicentral/state/selectors'\r\nimport { getSelectedTierIndex } from '@lmicentral/utils'\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* getSelectedTierSaga(action: ReturnType) {\r\n const { organizers } = action.payload\r\n const { billingFrequency }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const selectedTierIndex: number = yield call(\r\n getSelectedTierIndex,\r\n organizers,\r\n billingFrequency,\r\n selectedPlan,\r\n currency\r\n )\r\n yield put(lmicentralCheckoutActions.setSelectedTierIndex(selectedTierIndex, organizers))\r\n yield put(\r\n lmicentralCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency as TimePeriod)\r\n )\r\n}\r\n\r\nfunction* initializeGetSelectedTier() {\r\n yield takeLatest(LmiCentralCheckoutActionTypes.SET_ORGANIZERS, getSelectedTierSaga)\r\n}\r\n\r\nexport default initializeGetSelectedTier\r\n","import { CHECKOUTFORM_STEPS } from '@lmicentral/constants'\r\nimport { LmiCentralErrorContent } from '@lmicentral/state/checkout-form-container/state'\r\nimport { LmiCentralBuyFormData, LmiCentralBuyFormState } from '@lmicentral/state/buy-form/state'\r\n\r\nexport const errorContent: LmiCentralErrorContent = {\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n errorInvalidCreditCardNumber: '',\r\n emailAddressAlreadyInUse: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorInvalidPostalCode: '',\r\n errorGenericMessage: '',\r\n errorInvalidAddress: '',\r\n errorRequiredTaxNumber: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\nexport const initialData: LmiCentralBuyFormData = {\r\n FirstName: '',\r\n LastName: '',\r\n Email: '',\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: '',\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: '',\r\n BillingLastName: '',\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n}\r\nexport const buyFormStateInitialData: LmiCentralBuyFormState = {\r\n clearEmail: false,\r\n initialData,\r\n steps: {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: { completed: false, error: false },\r\n },\r\n statesOptional: false,\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { LmiCentralCheckoutState, LmiCentralVolumeDiscountPerTier } from '@lmicentral/state/checkout/state'\r\nimport { getCheckoutState, getUserState } from '@lmicentral/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, take, takeLatest } from 'redux-saga/effects'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { LmiCentralUserState } from '@lmicentral/state/user/state'\r\nimport { LMICENTRAL_USER_TYPES } from '@lmicentral/constants'\r\nimport { initialData } from '@lmicentral/data/buy-form'\r\nimport { getTotalVolumeDiscount } from '@lmicentral/utils'\r\n\r\nfunction* getVolumeDiscountSaga(action: ReturnType) {\r\n const { userType }: LmiCentralUserState = yield select(getUserState)\r\n if (userType === LMICENTRAL_USER_TYPES.ADDON) {\r\n const buyFormInitialData = { ...initialData, CountryCode: '' }\r\n yield put(lmicentralCheckoutActions.calculatePrice(buyFormInitialData, 'get volume discount saga'))\r\n } else {\r\n const { organizers, selectedTierIndex, billingFrequency } = action.payload\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const { volumeDiscount, selectedPlanSku }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const isAnnual = billingFrequencyKey === BillingPeriod.ANNUAL\r\n const volumeDiscountPerTier: LmiCentralVolumeDiscountPerTier = get(volumeDiscount, [\r\n selectedPlanSku,\r\n currency,\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n\r\n if (volumeDiscountPerTier && !isEmpty(volumeDiscountPerTier)) {\r\n const { discountPricePerUnit } = volumeDiscountPerTier\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(lmicentralCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n } else {\r\n // since the volume discount is not available, we will wait to listen for next volume\r\n // discount set action being dispatched to store and then get the data\r\n const setVolumeDiscountAction: ReturnType = yield take(\r\n LmiCentralCheckoutActionTypes.SET_VOLUME_DISCOUNT\r\n )\r\n const { volumeDiscountForSelectedPlanAndCurrency } = setVolumeDiscountAction.payload\r\n const volumeDiscountPerTierNow = get(volumeDiscountForSelectedPlanAndCurrency, [\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n if (volumeDiscountPerTierNow) {\r\n const { discountPricePerUnit } = volumeDiscountPerTierNow\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(lmicentralCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGetVolumeDiscountSaga() {\r\n yield takeLatest(LmiCentralCheckoutActionTypes.GET_VOLUME_DISCOUNT, getVolumeDiscountSaga)\r\n}\r\n\r\nexport default initializeGetVolumeDiscountSaga\r\n","import { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { getCheckoutState } from '@lmicentral/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* setBillingFrequencySaga(action: ReturnType) {\r\n const { frequency: billingFrequency } = action.payload\r\n const { organizers, selectedTierIndex }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n yield put(lmicentralCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency))\r\n}\r\n\r\nfunction* initializeSetBillingFrequencySaga() {\r\n yield takeLatest(LmiCentralCheckoutActionTypes.SET_BILLING_FREQUENCY, setBillingFrequencySaga)\r\n}\r\n\r\nexport default initializeSetBillingFrequencySaga\r\n","import {\r\n LmiCentralCheckCouponProductsValidityParameters,\r\n LmiCentralCouponSkuValidity,\r\n} from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { LmiCentralCalculateCouponPriceActionPayload } from '@lmicentral/state/coupon-util'\r\nimport { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport {\r\n checkCouponGenericValidity,\r\n checkCouponProductsValidity,\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n} from '@lmicentral/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* validateCouponSaga(action: ReturnType) {\r\n const { couponValidationData, isAttemptingUrlCoupon } = action.payload\r\n const { couponServerData, selectedPlan, selectedAddons, billingFrequency } = couponValidationData\r\n const selectedPlanSku = selectedPlan?.sKU\r\n const isCouponGenericValid: boolean = yield call(checkCouponGenericValidity, couponServerData as CouponServerData)\r\n if (isCouponGenericValid) {\r\n const checkProductValidityArguments: LmiCentralCheckCouponProductsValidityParameters = {\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }\r\n const couponSkuValidity: LmiCentralCouponSkuValidity = yield call(\r\n checkCouponProductsValidity,\r\n checkProductValidityArguments\r\n )\r\n const isCouponAppliedToMinimumProductsInCart: boolean = yield call(\r\n checkIfCouponAppliedToMinimumSelectedProducts,\r\n couponSkuValidity\r\n )\r\n\r\n yield put(lmicentralCouponActions.setCouponValidAndApplied(isCouponAppliedToMinimumProductsInCart))\r\n if (isCouponAppliedToMinimumProductsInCart) {\r\n const calculateCouponPriceActionPayload: LmiCentralCalculateCouponPriceActionPayload = {\r\n ...couponValidationData,\r\n couponSkuValidity,\r\n }\r\n yield put(lmicentralCouponActions.calculateCouponPrice(calculateCouponPriceActionPayload))\r\n yield put(lmicentralCouponActions.setUrlCouponActive(isAttemptingUrlCoupon))\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(lmicentralCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(lmicentralCouponActions.resetCouponData())\r\n }\r\n } else if (isAttemptingUrlCoupon) {\r\n // look out for cms coupon code if current try is url coupon\r\n yield put(lmicentralCouponActions.checkCMSCoupon(selectedPlanSku))\r\n } else {\r\n // no coupon can be applied in this case\r\n yield put(lmicentralCouponActions.resetCouponData())\r\n }\r\n}\r\n\r\nexport default function* initializeValidateCouponSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.VALIDATE_COUPON, validateCouponSaga)\r\n}\r\n","import { getCouponInfo } from '@common/services'\r\nimport { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { contentActions } from '@lmicentral/state/content/actions'\r\nimport { CouponInfoServerResponse } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* getCouponDetailsSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n try {\r\n const couponInfoServerResponse: CouponInfoServerResponse = yield call(getCouponInfo, couponCode)\r\n if (!isEmpty(couponInfoServerResponse.data)) {\r\n const {\r\n data: { couponCode: couponServerResponseData, couponDisclaimer },\r\n } = couponInfoServerResponse\r\n if (couponServerResponseData) {\r\n yield put(lmicentralCouponActions.setCouponServerData(couponServerResponseData))\r\n }\r\n if (couponDisclaimer) {\r\n yield put(contentActions.setCouponDisclaimer(couponDisclaimer))\r\n }\r\n }\r\n } catch (e) {\r\n console.error('unable to get url coupon details')\r\n yield put(lmicentralCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeGetCouponDetailsSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.GET_COUPON_DETAILS, getCouponDetailsSaga)\r\n}\r\n","import { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { LmiCentralCouponProcessedDataPerSku } from '@lmicentral/state/coupon/state'\r\nimport {\r\n GetLmiCentralProductItemsParameters,\r\n LmiCentralProcessCouponDataParameters,\r\n LmiCentralProductDetails,\r\n} from '@lmicentral/state/coupon-util'\r\nimport { getCouponItemPriceMap, getProductItemsMap, processCouponData } from '@lmicentral/utils'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { TimePeriod, COUPON_DISCOUNT_TYPE } from '@common/constants'\r\n\r\nfunction* calculateCouponPriceSaga(action: ReturnType) {\r\n const { couponCalculationData } = action.payload\r\n const {\r\n couponServerData,\r\n couponSkuValidity,\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n } = couponCalculationData\r\n const { couponDiscountType } = couponServerData\r\n const getProductItemsArguments: GetLmiCentralProductItemsParameters = {\r\n organizers,\r\n billingFrequency,\r\n selectedCurrency,\r\n selectedAddons,\r\n selectedPlan,\r\n selectedTierIndex,\r\n }\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const productItemsMap: Map = yield call(\r\n getProductItemsMap,\r\n getProductItemsArguments\r\n )\r\n const couponItemsMap: Map = yield call(\r\n getCouponItemPriceMap,\r\n couponServerData,\r\n selectedCurrency,\r\n isAnnual\r\n )\r\n const processCouponDataArguments: LmiCentralProcessCouponDataParameters = {\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n }\r\n const couponProcessedDataPerSku: LmiCentralCouponProcessedDataPerSku | null = yield call(\r\n processCouponData,\r\n processCouponDataArguments\r\n )\r\n if (couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE) {\r\n yield put(\r\n lmicentralCouponActions.checkVolumeDiscountAgainstRepriceCoupon({\r\n couponServerData,\r\n couponProcessedDataPerSku,\r\n selectedPlan,\r\n })\r\n )\r\n }\r\n yield put(lmicentralCouponActions.setCouponProcessedData(couponProcessedDataPerSku))\r\n}\r\n\r\nexport default function* initializeCalculateCouponPriceSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.CALCULATE_COUPON_PRICE, calculateCouponPriceSaga)\r\n}\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { LocationActionTypes } from '@common/state/location/actions'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralValidateCouponActionPayload } from '@lmicentral/state/coupon-util'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { getCheckoutState, getCouponState } from '@lmicentral/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { getAvailableCouponServerData } from '@lmicentral/utils'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype PartialValidateCouponActionPayload = Omit\r\n\r\ntype ObserveValidateCouponAction =\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType\r\n | ReturnType // this covers both organizers and selected tier index\r\n | ReturnType\r\n | ReturnType // this action is used to only trigger the below saga and avoid going to reducer\r\n\r\ntype CouponDataActionType =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* observeValidateCouponSaga(action: ObserveValidateCouponAction) {\r\n try {\r\n const {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const [couponServerDataFromState, isUrlCouponData]: [CouponServerData | null, boolean] = yield call(\r\n getAvailableCouponServerData,\r\n coupon,\r\n selectedPlan\r\n )\r\n\r\n const validateCouponActionPartialPayload: PartialValidateCouponActionPayload = {\r\n organizers,\r\n selectedTierIndex,\r\n selectedPlan,\r\n selectedAddons,\r\n billingFrequency: billingFrequency as TimePeriod,\r\n selectedCurrency: currency,\r\n }\r\n\r\n const isCouponDataAction =\r\n action.type === LmiCentralCouponActionTypes.SET_COUPON_SERVER_DATA ||\r\n action.type === LmiCentralCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON\r\n\r\n if (couponServerDataFromState && !isCouponDataAction) {\r\n const validateCouponActionPayload: LmiCentralValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData: couponServerDataFromState,\r\n }\r\n switch (action.type) {\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN: {\r\n const { planSku } = action.payload\r\n const selectedPlanByAction: LmiCentralPlan = yield call(getSelectedPlan, planSku)\r\n validateCouponActionPayload.selectedPlan = selectedPlanByAction\r\n break\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n validateCouponActionPayload.selectedAddons = addons\r\n break\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { organizers: payloadOrganizers, selectedTierIndex: payloadTierIndex } = action.payload\r\n validateCouponActionPayload.organizers = payloadOrganizers\r\n validateCouponActionPayload.selectedTierIndex = payloadTierIndex\r\n break\r\n }\r\n case LmiCentralCheckoutActionTypes.SET_BILLING_FREQUENCY: {\r\n const { frequency } = action.payload\r\n validateCouponActionPayload.billingFrequency = frequency\r\n break\r\n }\r\n default: {\r\n break // do nothing\r\n }\r\n }\r\n // if url coupon is available, attempt to validate the url coupon again before checking for CMS coupon\r\n yield put(lmicentralCouponActions.validateCoupon(validateCouponActionPayload, isUrlCouponData))\r\n } else if (isCouponDataAction) {\r\n const { payload } = action as CouponDataActionType\r\n const { couponServerData } = payload\r\n const validateCouponActionPayload: LmiCentralValidateCouponActionPayload = {\r\n ...validateCouponActionPartialPayload,\r\n couponServerData,\r\n }\r\n // isUrlCoupon should be true or false based on the action type\r\n const isUrlCoupon = action.type === LmiCentralCouponActionTypes.SET_COUPON_SERVER_DATA\r\n yield put(lmicentralCouponActions.validateCoupon(validateCouponActionPayload, isUrlCoupon))\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n}\r\n\r\nexport default function* initializeObserveValidateCouponSaga() {\r\n yield takeLatest(\r\n [\r\n LmiCentralCouponActionTypes.SET_COUPON_SERVER_DATA,\r\n LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN,\r\n LmiCentralCheckoutActionTypes.SET_ORGANIZERS,\r\n LmiCentralCheckoutActionTypes.SET_SELECTED_ADDONS,\r\n LmiCentralCheckoutActionTypes.SET_BILLING_FREQUENCY,\r\n LmiCentralCheckoutActionTypes.SET_SELECTED_TIER_INDEX,\r\n LmiCentralCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON,\r\n LocationActionTypes.SET_IS_LOCATION_INFO_LOADED,\r\n ],\r\n observeValidateCouponSaga\r\n )\r\n}\r\n","import { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* attempUrlCouponSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n if (couponCode) {\r\n // if url promotion available\r\n yield put(lmicentralCouponActions.getCouponDetails(couponCode as string))\r\n } else {\r\n yield put(lmicentralCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeAttempUrlCouponSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.SET_URL_COUPON_CODE, attempUrlCouponSaga)\r\n}\r\n","import { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\nfunction* checkCMSCouponSaga(action: ReturnType) {\r\n // clear out previous coupon processed data\r\n yield put(lmicentralCouponActions.resetCouponData())\r\n const { selectedPlanSku } = action.payload\r\n const selectedPlan: LmiCentralPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n const { activeCoupon } = selectedPlan ?? {} ?? {}\r\n if (activeCoupon && !isEmpty(activeCoupon)) {\r\n // apply the cms coupon only if cms coupon is available\r\n yield put(lmicentralCouponActions.observeValidateCMSCoupon(activeCoupon))\r\n }\r\n}\r\n\r\nexport default function* initialCheckCMSCouponSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.CHECK_CMS_COUPON, checkCMSCouponSaga)\r\n}\r\n","import { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\nimport { call, select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState, getCouponState } from '@lmicentral/state/selectors'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\nimport { COUPON_DISCOUNT_TYPE } from '@common/constants'\r\nimport { getActiveCouponServerData } from '@lmicentral/utils'\r\nimport { LmiCentralCouponState } from '@lmicentral/state/coupon/state'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { getSelectedPlan } from '../content/content-helpers'\r\n\r\ntype CheckVolumeDiscountAction =\r\n | ReturnType\r\n | ReturnType\r\n\r\nfunction* checkVolumeDiscountAgainstRepriceCouponSaga(action: CheckVolumeDiscountAction) {\r\n const coupon: LmiCentralCouponState = yield select(getCouponState)\r\n const { selectedPlanSku }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n let { couponProcessedDataPerSku } = coupon\r\n let volumeDiscountPrice = 0\r\n let selectedPlan: LmiCentralPlan = yield call(getSelectedPlan, selectedPlanSku)\r\n let couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, selectedPlan)\r\n\r\n if (action.type === LmiCentralCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE) {\r\n volumeDiscountPrice = action.payload.currentVolumeDiscountPrice\r\n } else if (action.type === LmiCentralCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON) {\r\n const { checkVolumeDiscountData } = action.payload\r\n couponServerData = checkVolumeDiscountData.couponServerData\r\n couponProcessedDataPerSku = checkVolumeDiscountData.couponProcessedDataPerSku\r\n selectedPlan = checkVolumeDiscountData.selectedPlan\r\n const { currentVolumeDiscountPrice }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n volumeDiscountPrice = currentVolumeDiscountPrice\r\n }\r\n\r\n if (\r\n couponServerData &&\r\n !isEmpty(couponServerData) &&\r\n couponServerData.couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE\r\n ) {\r\n const couponDiscountTotalSavings: number = get(\r\n couponProcessedDataPerSku,\r\n [selectedPlan?.sKU, 'discountTotalSavings'],\r\n 0\r\n )\r\n if (volumeDiscountPrice < couponDiscountTotalSavings) {\r\n yield put(lmicentralCheckoutActions.adjustCurrentVolumeDiscountForRepriceCoupon())\r\n }\r\n }\r\n}\r\n\r\nexport default function* initializeCheckVolumeDiscountAgainstRepriceCouponSaga() {\r\n yield takeLatest(\r\n [\r\n LmiCentralCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON,\r\n LmiCentralCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE,\r\n ],\r\n checkVolumeDiscountAgainstRepriceCouponSaga\r\n )\r\n}\r\n","import { lmicentralCouponActions, LmiCentralCouponActionTypes } from '@lmicentral/state/coupon/actions'\r\nimport { put, takeLatest, take } from 'redux-saga/effects'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { getCheckoutState } from '@lmicentral/state/selectors'\r\nimport { LmiCentralCheckoutState } from '@lmicentral/state/checkout/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { lmicentralCheckoutActions, LmiCentralCheckoutActionTypes } from '@lmicentral/state/checkout/actions'\r\n\r\nfunction* attemptCMSCouponSaga() {\r\n // check if there's a coupon available from CMS\r\n let { selectedPlanSku }: LmiCentralCheckoutState = yield select(getCheckoutState)\r\n if (isEmpty(selectedPlanSku)) {\r\n const selectedPlanAction: ReturnType = yield take(\r\n LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN\r\n )\r\n selectedPlanSku = selectedPlanAction.payload.planSku\r\n }\r\n yield put(lmicentralCouponActions.checkCMSCoupon(selectedPlanSku))\r\n}\r\n\r\nexport default function* initializeAttemptCMSCouponSaga() {\r\n yield takeLatest(LmiCentralCouponActionTypes.ATTEMPT_FOR_CMS_COUPON, attemptCMSCouponSaga)\r\n}\r\n","import initializeLoadContentSaga from './content/load-content'\r\nimport initializeSubmitFormSaga from './checkout-form/form-submission'\r\nimport initializeAbandonedCartSaga from './user/abandoned-cart'\r\nimport initializeExistingUserSaga from './user/existing-user'\r\nimport initializeCreateUserSaga from './user/create-user'\r\nimport initializeGetAccessToken from './user/get-token'\r\nimport initializeLogin from './user/login'\r\nimport initializeLogout from './user/logout'\r\nimport initializeLoadSavedStateSaga from './saved-state/saved-state'\r\nimport initializeCalculatePriceSaga from './checkout-form/calculate-price'\r\nimport initializeCreateBillingInfoSaga from './checkout-form/create-billing-info'\r\nimport initializeCreatePaymentSaga from './checkout-form/create-payment'\r\nimport initializeCreateAndSubmitPaymentSaga from './checkout-form/create-and-submit-payment'\r\nimport initializeGetPaymentMethodSaga from './checkout-form/get-payment-methods'\r\nimport initializeSubmitPaymentSaga from './checkout-form/submit-payment'\r\nimport initializeUserLoggedInSaga from './user/user-logged-in'\r\nimport initializeExistingUserSubmitFormSaga from './checkout-form/existing-user-form-submission'\r\nimport initializeResetCheckoutFormAffectedStatesSaga from './checkout-form/reset-checkout-form-affected-states'\r\nimport initializeLmiCentralTrackingSaga from './tracking/track-event'\r\nimport initializeCalculateVolumeDiscountSaga from './checkout-form/calculate-volume-discount'\r\nimport initializeGetSelectedTier from './checkout-form/get-selected-tier'\r\nimport initializeGetVolumeDiscountSaga from './checkout-form/get-volume-discount'\r\nimport initializeSetBillingFrequencySaga from './checkout-form/set-billing-frequency'\r\nimport initializeValidateCouponSaga from './coupon/validate-coupon'\r\nimport initializeGetCouponDetailsSaga from './coupon/get-coupon-details'\r\nimport initializeCalculateCouponPriceSaga from './coupon/calculate-coupon-price'\r\nimport initializeObserveValidateCouponSaga from './coupon/observe-validate-coupon'\r\nimport initializeAttempUrlCouponSaga from './coupon/attempt-url-coupon'\r\nimport initialCheckCMSCouponSaga from './coupon/check-cms-coupon'\r\nimport initializeCheckVolumeDiscountAgainstRepriceCouponSaga from './coupon/check-volume-discount-against-reprice-coupon'\r\nimport initializeAttemptCMSCouponSaga from './coupon/attempt-cms-coupon'\r\n\r\nexport const lmiCentralSagas = {\r\n lmicentralContentSaga: initializeLoadContentSaga,\r\n lmicentralSubmitFormSaga: initializeSubmitFormSaga,\r\n lmicentralAbandonedCartSaga: initializeAbandonedCartSaga,\r\n lmicentralExistingUserSaga: initializeExistingUserSaga,\r\n lmicentralGetAccessToken: initializeGetAccessToken,\r\n lmicentralUserLoginSaga: initializeLogin,\r\n lmicentralUserLogoutSaga: initializeLogout,\r\n lmicentralCreateUserSaga: initializeCreateUserSaga,\r\n lmicentralCalculatePriceSaga: initializeCalculatePriceSaga,\r\n lmicentralCreateBillingInfoSaga: initializeCreateBillingInfoSaga,\r\n lmicentralCreatePaymentSaga: initializeCreatePaymentSaga,\r\n lmicentralCreateAndSubmitPaymentSaga: initializeCreateAndSubmitPaymentSaga,\r\n lmicentralGetPaymentSaga: initializeGetPaymentMethodSaga,\r\n lmicentralSubmitPaymentSaga: initializeSubmitPaymentSaga,\r\n lmicentralLoadSavedStateSaga: initializeLoadSavedStateSaga,\r\n lmicentralUserLoggedInSaga: initializeUserLoggedInSaga,\r\n lmicentralExistingUserSubmitFormSaga: initializeExistingUserSubmitFormSaga,\r\n lmicentralResetCheckoutFormAffectedStates: initializeResetCheckoutFormAffectedStatesSaga,\r\n lmicentralTrackingSaga: initializeLmiCentralTrackingSaga,\r\n lmicentralCalculateVolumeDiscountSaga: initializeCalculateVolumeDiscountSaga,\r\n lmicentralGetVolumeDiscountSaga: initializeGetVolumeDiscountSaga,\r\n lmicentralGetSelectedTierSaga: initializeGetSelectedTier,\r\n lmicentralSetBillingFrequencySaga: initializeSetBillingFrequencySaga,\r\n lmicentralValidateCouponSaga: initializeValidateCouponSaga,\r\n lmicentralGetCouponDetailsSaga: initializeGetCouponDetailsSaga,\r\n lmicentralCalculateCouponPriceSaga: initializeCalculateCouponPriceSaga,\r\n lmicentralObserveValidateCouponSaga: initializeObserveValidateCouponSaga,\r\n lmicentralAttemptUrlCouponSaga: initializeAttempUrlCouponSaga,\r\n lmicentralHeckCMSCouponSaga: initialCheckCMSCouponSaga,\r\n lmicentralCheckVolumeDiscountAgainstRepriceCouponSaga: initializeCheckVolumeDiscountAgainstRepriceCouponSaga,\r\n lmicentralAttemptCMSCouponSaga: initializeAttemptCMSCouponSaga,\r\n}\r\n\r\nexport default lmiCentralSagas\r\n","import { LabelContent } from '@gtresolve/state/label-content'\r\n\r\nexport const labelContentInitialData: LabelContent = {\r\n addOns: '',\r\n agents: '',\r\n devices: '',\r\n quantityLabelLong: '',\r\n quantityLabel: '',\r\n quantityLabelPlural: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n password: '',\r\n useAccountInfo: '',\r\n address: '',\r\n country: '',\r\n city: '',\r\n postalCode: '',\r\n state: '',\r\n phone: '',\r\n checkout: '',\r\n header: '',\r\n customizePlan: '',\r\n errorMessageTitle: '',\r\n orderSummary: '',\r\n monthly: '',\r\n annual: '',\r\n save: '',\r\n user: '',\r\n year: '',\r\n month: '',\r\n months: '',\r\n subtotal: '',\r\n estimatedTax: '',\r\n tBD: '',\r\n todaysTotal: '',\r\n recurringAnnualCharge: '',\r\n recurringMonthlyCharge: '',\r\n autoRenewalNote: '',\r\n createAnAccount: '',\r\n billingInformation: '',\r\n passwordRequirements: '',\r\n paymentDetails: '',\r\n expirationDate: '',\r\n cVV: '',\r\n cVVHint: '',\r\n completePurchase: '',\r\n pricingNote: '',\r\n continue: '',\r\n changePlan: '',\r\n selectedPlan: '',\r\n signIn: '',\r\n errorCardinalChallenge: '',\r\n errorCardinalSetup: '',\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n estimatedTaxPopupInfo: '',\r\n quantityPopupInfo: '',\r\n yearAbbr: '',\r\n monthAbbr: '',\r\n questions: '',\r\n myAccount: '',\r\n signOut: '',\r\n pleaseSelect: '',\r\n headerPhone: '',\r\n optOutCheckboxLabel: '',\r\n optOut: '',\r\n cardNumber: '',\r\n errorInvalidCreditCardNumber: '',\r\n accountInformation: '',\r\n notYou: '',\r\n emailAddressAlreadyInUse: '',\r\n additionalUserLicences: '',\r\n howManyMore: '',\r\n existingUserLicencePlural: '',\r\n existingUserLicense: '',\r\n additional: '',\r\n newUserLicense: '',\r\n total: '',\r\n proratedAdjustment: '',\r\n today: '',\r\n modalCloseButtonText: '',\r\n changePlanMethodModalHeader: '',\r\n changePlanModalSubheader: '',\r\n changePaymentMethodModalHeader: '',\r\n changePaymentMethodModalSubheader: '',\r\n edit: '',\r\n newRecurringAnnualTotal: '',\r\n newRecurringMonthlyTotal: '',\r\n previousAnnualTotal: '',\r\n previousMonthlyTotal: '',\r\n billingCycleCredit: '',\r\n getStartedNote: '',\r\n creatingAccountLeftHeader: '',\r\n creatingAccountLeftContent: '',\r\n creatingAccountRightHeader: '',\r\n creatingAccountRightContent: '',\r\n getStartedButtonText: '',\r\n getStartedButtonUrl: '',\r\n gotoAdminUrl: '',\r\n savingWithAnnualBilling: '',\r\n errorBlockedPurchase: '',\r\n errorGenericMessage: '',\r\n errorRequiredBIC: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorSummaryMessage: '',\r\n errorTooManyRequests: '',\r\n errorInvalidPostalCode: '',\r\n internalErrorMessage: '',\r\n calculating: '',\r\n newUserLicensePlural: '',\r\n fees: '',\r\n changeNumberModalHeader: '',\r\n changeNumberModalContent: '',\r\n changePlanUrl: '',\r\n sEOPageTitle: '',\r\n showMe: '',\r\n errorInvalidAddress: '',\r\n paymentMethodErrorMessage: '',\r\n disabledUserError: '',\r\n addonUserSuccessUrl: '',\r\n percentageOffAnnualDiscount: '',\r\n percentageOffVolumeDiscount: '',\r\n volumeDiscountPopupText: '',\r\n percentageOffPromoDiscount: '',\r\n equal: '',\r\n bundles: '',\r\n countAbbr: '',\r\n discount: '',\r\n percentageDiscountPopupText: '',\r\n annualPlanNote: '',\r\n monthlyPlanNote: '',\r\n invalidQSCouponMessage: '',\r\n invalidQSCouponUsingCMSCouponMessage: '',\r\n couponValidMessage: '',\r\n dismiss: '',\r\n couponDisclaimer: '',\r\n couponAdjustmentSavings: '',\r\n couponAdjustmentSavingsPopupText: '',\r\n billedMonthlyPrice: '',\r\n billedAnnualPrice: '',\r\n secure: '',\r\n trustArcSupport: '',\r\n per: '',\r\n selectAddons: '',\r\n selectAddonsDescription: '',\r\n organizer: '',\r\n added: '',\r\n existingUsersModalContent: '',\r\n existingUsersModalHeader: '',\r\n existingUsersNewEmailButtonText: '',\r\n allrightsreservedDisclaimerLabel: '',\r\n termsandconditionsLabel: '',\r\n privacypolicyLabel: '',\r\n antiSpamPolicyLabel: '',\r\n trademarkLabel: '',\r\n doNotSellInfoLabel: '',\r\n sitemapLabel: '',\r\n termsandconditionsUrl: '',\r\n privacypolicyUrl: '',\r\n antiSpamPolicyUrl: '',\r\n trademarkUrl: '',\r\n doNotSellInfoUrl: '',\r\n sitemapUrl: '',\r\n taxTooltip: '',\r\n agentsVolumediscountTooltip: '',\r\n endpointsVolumediscountTooltip: '',\r\n mobileVolumediscountTooltip: '',\r\n cameraShareVolumediscountTooltip: '',\r\n endpointProtectionVolumediscountTooltip: '',\r\n proratedadjustmentTooltip: '',\r\n errorRequiredTaxNumber: '',\r\n taxBusiness: '',\r\n taxIndividual: '',\r\n taxNumber: '',\r\n gSTDisclaimer: '',\r\n vATDisclaimer: '',\r\n gSTOption: '',\r\n vATOption: '',\r\n companyName: '',\r\n optional: '',\r\n changeCountryContent: '',\r\n changeCountryHeader: '',\r\n modalCancel: '',\r\n modalReload: '',\r\n taxCodeGST: '',\r\n taxCodeVAT: '',\r\n upgradeClose: '',\r\n upgradeSubscriptionCredit: '',\r\n upgradeSubscriptionCreditTooltip: '',\r\n upgradeSubscriptionCreditNote: '',\r\n upgradeCreditErrorMessage: '',\r\n upgradeCreditErrorAssistance: '',\r\n totalVolumeDiscount: '',\r\n totalVolumeDiscountTooltip: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n passwordStrengthTipDrawer: '',\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { labelContentInitialData } from '@gtresolve/data'\r\nimport { ResolveContentState } from './state'\r\nimport { ResolveContentActionTypes } from './actions'\r\nimport type { ContentActions } from './actions'\r\n\r\nexport const initialContentState: ResolveContentState = {\r\n contentData: {\r\n CurrencyCode: CURRENCY.USD,\r\n ContentLoaded: false,\r\n Locale: 'en-US',\r\n PlanGroupId: '',\r\n DefaultCountry: '',\r\n marketoProductName: '',\r\n marketoSalesBrief: '',\r\n marketoSalesforceCampaignId: '',\r\n submittoMarketo: true,\r\n },\r\n labelContent: labelContentInitialData,\r\n planData: [],\r\n allPlanData: [],\r\n contentLoaded: false,\r\n}\r\n\r\nexport const contentReducer = (\r\n previousState: ResolveContentState | undefined,\r\n action: ContentActions\r\n): ResolveContentState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case ResolveContentActionTypes.GET_LABEL_CONTENT: {\r\n return state\r\n }\r\n case ResolveContentActionTypes.SET_CONTENT: {\r\n const { content, filteredPlans, allPlans, labels } = action.payload\r\n return {\r\n ...state,\r\n contentData: {\r\n ...state.contentData,\r\n ...content,\r\n },\r\n labelContent: { ...labels },\r\n planData: [...filteredPlans],\r\n allPlanData: [...allPlans],\r\n }\r\n }\r\n case ResolveContentActionTypes.SET_CONTENT_LOADED: {\r\n return {\r\n ...state,\r\n contentLoaded: action.payload.loaded,\r\n }\r\n }\r\n case ResolveContentActionTypes.GET_COMPARE_MODAL_CONTENT: {\r\n return state\r\n }\r\n case ResolveContentActionTypes.SET_COUPON_DISCLAIMER: {\r\n return {\r\n ...state,\r\n labelContent: {\r\n ...state.labelContent,\r\n couponDisclaimer: action.payload.couponDisclaimer,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { buyFormStateInitialData } from '@gtresolve/data'\r\nimport { ResolveBuyFormState } from './state'\r\nimport { ResolveBuyFormActionTypes } from './actions'\r\nimport type { BuyFormActions } from './actions'\r\n\r\nexport const buyFormInitialState: ResolveBuyFormState = buyFormStateInitialData\r\n\r\nexport const buyFormReducer = (\r\n previousState: ResolveBuyFormState | undefined,\r\n action: BuyFormActions\r\n): ResolveBuyFormState => {\r\n const state = previousState || buyFormInitialState\r\n switch (action.type) {\r\n // need to add actions from the form components here\r\n case ResolveBuyFormActionTypes.RESET_BUY_FORM: {\r\n return buyFormInitialState\r\n }\r\n case ResolveBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE: {\r\n const { data } = action.payload\r\n return {\r\n ...state,\r\n initialData: { ...data },\r\n }\r\n }\r\n case ResolveBuyFormActionTypes.SET_CLEAR_EMAIL:\r\n return {\r\n ...state,\r\n clearEmail: action.payload.clear,\r\n }\r\n case ResolveBuyFormActionTypes.UPDATE_STEPS:\r\n return {\r\n ...state,\r\n steps: {\r\n ...state.steps,\r\n [action.payload.stepName]: {\r\n completed: action.payload.stepResult,\r\n error: !action.payload.stepResult,\r\n },\r\n },\r\n }\r\n case ResolveBuyFormActionTypes.SET_STATES_OPTIONAL:\r\n return {\r\n ...state,\r\n statesOptional: action.payload.optional,\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { RESOLVE_USER_TYPES } from '@gtresolve/constants'\r\nimport { ResolveUserState } from './state'\r\nimport { ResolveUserActionTypes } from './actions'\r\nimport type { ResolveUserActions } from './actions'\r\n\r\nexport const initialUserState: ResolveUserState = {\r\n displayName: '',\r\n loadingExistingInfo: false,\r\n verifyingToken: false,\r\n userType: RESOLVE_USER_TYPES.NEW,\r\n loggedIn: {\r\n accessToken: undefined,\r\n isUserLoggedIn: false,\r\n },\r\n verifiedUserShouldLogIn: false,\r\n}\r\n\r\nexport const userReducer = (\r\n previousState: ResolveUserState | undefined,\r\n action: ResolveUserActions\r\n): ResolveUserState => {\r\n const state = previousState || initialUserState\r\n switch (action.type) {\r\n case ResolveUserActionTypes.SET_EXISTING_BILLING_INFO: {\r\n const { billingInfo } = action.payload\r\n return {\r\n ...state,\r\n existingBillingInformation: { ...billingInfo },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_EXISTING_USER_INFO: {\r\n const { userInfo } = action.payload\r\n return {\r\n ...state,\r\n existingUserInformation: { ...userInfo },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_EXISTING_ACCOUNT_INFO: {\r\n const { accountInfo } = action.payload\r\n return {\r\n ...state,\r\n existingAccountInformation: { ...accountInfo },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_DISPLAY_NAME: {\r\n return {\r\n ...state,\r\n displayName: action.payload.displayName,\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_LOADING_EXISTING_INFO: {\r\n return {\r\n ...state,\r\n loadingExistingInfo: action.payload.loading,\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_VERIFYING_TOKEN: {\r\n return {\r\n ...state,\r\n verifyingToken: action.payload.verifying,\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_USER_TYPE: {\r\n return {\r\n ...state,\r\n userType: action.payload.type,\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_EXISTING_PAYMENT_DETAILS: {\r\n const { info } = action.payload\r\n return {\r\n ...state,\r\n existingPaymentInformation: { ...info },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_ACCESS_TOKEN: {\r\n return {\r\n ...state,\r\n loggedIn: { ...state.loggedIn, accessToken: action.payload.accessToken },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_IS_USER_LOGGEDIN: {\r\n return {\r\n ...state,\r\n loggedIn: {\r\n ...state.loggedIn,\r\n isUserLoggedIn: action.payload.isUserLoggedIn,\r\n },\r\n }\r\n }\r\n case ResolveUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN: {\r\n return {\r\n ...state,\r\n verifiedUserShouldLogIn: action.payload.verifiedUserShouldLogIn,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { ResolveCouponActions, ResolveCouponActionTypes } from './actions'\r\nimport { ResolveCouponState } from './state'\r\n\r\nexport const initialCouponState: ResolveCouponState = {\r\n couponServerData: null,\r\n couponProcessedDataPerSku: null,\r\n isUrlCouponActive: false,\r\n isCMSCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n isUrlCouponCodeAvailable: false,\r\n urlCouponCode: '',\r\n}\r\n\r\nexport const couponReducer = (previousState: ResolveCouponState | undefined, action: ResolveCouponActions) => {\r\n const state = previousState || initialCouponState\r\n switch (action.type) {\r\n case ResolveCouponActionTypes.SET_COUPON_SERVER_DATA: {\r\n const { couponServerData } = action.payload\r\n return {\r\n ...state,\r\n couponServerData,\r\n }\r\n }\r\n case ResolveCouponActionTypes.SET_COUPON_PROCESSED_DATA: {\r\n const { couponProcessedDataPerSku } = action.payload\r\n return { ...state, couponProcessedDataPerSku }\r\n }\r\n case ResolveCouponActionTypes.RESET_COUPON_DATA: {\r\n return {\r\n ...state,\r\n couponProcessedDataPerSku: null,\r\n isCMSCouponActive: false,\r\n isUrlCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n }\r\n }\r\n case ResolveCouponActionTypes.SET_COUPON_VALID_AND_APPLIED: {\r\n const { isCouponValidAndApplied } = action.payload\r\n return { ...state, isCouponValidAndApplied }\r\n }\r\n case ResolveCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER: {\r\n const { couponDoubleDipAmountForNewUser } = action.payload\r\n return { ...state, couponDoubleDipAmountForNewUser }\r\n }\r\n case ResolveCouponActionTypes.SET_URL_COUPON_ACTIVE: {\r\n const { isUrlCouponActive } = action.payload\r\n return {\r\n ...state,\r\n isUrlCouponActive,\r\n isCMSCouponActive: !isUrlCouponActive,\r\n }\r\n }\r\n case ResolveCouponActionTypes.SET_URL_COUPON_CODE: {\r\n const { couponCode } = action.payload\r\n return { ...state, urlCouponCode: couponCode, isUrlCouponCodeAvailable: couponCode.length > 0 }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { combineReducers } from 'redux'\r\nimport { contentReducer } from '@gtresolve/state/content/reducer'\r\nimport { checkoutReducer } from '@gtresolve/state/checkout/reducer'\r\nimport { buyFormReducer } from '@gtresolve/state/buy-form/reducer'\r\nimport { userReducer } from '@gtresolve/state/user/reducer'\r\nimport { couponReducer } from '@gtresolve/state/coupon/reducer'\r\n\r\nexport const resolveAppReducer = combineReducers({\r\n content: contentReducer,\r\n checkout: checkoutReducer,\r\n form: buyFormReducer,\r\n user: userReducer,\r\n coupon: couponReducer,\r\n})\r\n\r\nexport type ResolveAppState = ReturnType\r\nexport type ResolveContainerAppState = {\r\n resolve: ResolveAppState\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { labelContentInitialData } from '@lmipro/data'\r\nimport { LmiProContentState } from './state'\r\nimport { LmiProContentActionTypes } from './actions'\r\nimport type { ContentActions } from './actions'\r\n\r\nexport const initialContentState: LmiProContentState = {\r\n contentData: {\r\n CurrencyCode: CURRENCY.USD,\r\n ContentLoaded: false,\r\n Locale: 'en-US',\r\n PlanGroupId: '',\r\n DefaultCountry: '',\r\n marketoProductName: '',\r\n marketoSalesBrief: '',\r\n marketoSalesforceCampaignId: '',\r\n submittoMarketo: true,\r\n },\r\n labelContent: labelContentInitialData,\r\n planData: [],\r\n allPlanData: [],\r\n contentLoaded: false,\r\n}\r\n\r\nexport const contentReducer = (\r\n previousState: LmiProContentState | undefined,\r\n action: ContentActions\r\n): LmiProContentState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case LmiProContentActionTypes.GET_LABEL_CONTENT: {\r\n return state\r\n }\r\n case LmiProContentActionTypes.SET_CONTENT: {\r\n const { content, filteredPlans, allPlans, labels } = action.payload\r\n return {\r\n ...state,\r\n contentData: {\r\n ...state.contentData,\r\n ...content,\r\n },\r\n labelContent: { ...labels },\r\n planData: [...filteredPlans],\r\n allPlanData: [...allPlans],\r\n }\r\n }\r\n case LmiProContentActionTypes.SET_CONTENT_LOADED: {\r\n return {\r\n ...state,\r\n contentLoaded: action.payload.loaded,\r\n }\r\n }\r\n case LmiProContentActionTypes.GET_COMPARE_MODAL_CONTENT: {\r\n return state\r\n }\r\n case LmiProContentActionTypes.SET_COUPON_DISCLAIMER: {\r\n return {\r\n ...state,\r\n labelContent: {\r\n ...state.labelContent,\r\n couponDisclaimer: action.payload.couponDisclaimer,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LabelContent } from '@lmipro/state/label-content'\r\n\r\nexport const labelContentInitialData: LabelContent = {\r\n annualContractTotal: '',\r\n annualConractPlanNote: '',\r\n annuallySubText: '',\r\n monthlySubText: '',\r\n monthlyTooltip: '',\r\n addOns: '',\r\n agents: '',\r\n devices: '',\r\n quantityLabelLong: '',\r\n quantityLabel: '',\r\n quantityLabelPlural: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n password: '',\r\n useAccountInfo: '',\r\n address: '',\r\n country: '',\r\n city: '',\r\n postalCode: '',\r\n state: '',\r\n phone: '',\r\n checkout: '',\r\n header: '',\r\n customizePlan: '',\r\n errorMessageTitle: '',\r\n orderSummary: '',\r\n monthly: '',\r\n annual: '',\r\n monthlyAnnual: '',\r\n save: '',\r\n user: '',\r\n year: '',\r\n month: '',\r\n months: '',\r\n subtotal: '',\r\n estimatedTax: '',\r\n tBD: '',\r\n todaysTotal: '',\r\n recurringAnnualCharge: '',\r\n recurringMonthlyCharge: '',\r\n autoRenewalNote: '',\r\n createAnAccount: '',\r\n billingInformation: '',\r\n passwordRequirements: '',\r\n paymentDetails: '',\r\n expirationDate: '',\r\n cVV: '',\r\n cVVHint: '',\r\n completePurchase: '',\r\n pricingNote: '',\r\n continue: '',\r\n changePlan: '',\r\n selectedPlan: '',\r\n signIn: '',\r\n errorCardinalChallenge: '',\r\n errorCardinalSetup: '',\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n estimatedTaxPopupInfo: '',\r\n quantityPopupInfo: '',\r\n yearAbbr: '',\r\n monthAbbr: '',\r\n questions: '',\r\n myAccount: '',\r\n signOut: '',\r\n pleaseSelect: '',\r\n headerPhone: '',\r\n optOutCheckboxLabel: '',\r\n optOut: '',\r\n cardNumber: '',\r\n errorInvalidCreditCardNumber: '',\r\n accountInformation: '',\r\n notYou: '',\r\n emailAddressAlreadyInUse: '',\r\n additionalUserLicences: '',\r\n howManyMore: '',\r\n existingUserLicencePlural: '',\r\n existingUserLicense: '',\r\n additional: '',\r\n newUserLicense: '',\r\n total: '',\r\n proratedAdjustment: '',\r\n today: '',\r\n modalCloseButtonText: '',\r\n changePlanMethodModalHeader: '',\r\n changePlanModalSubheader: '',\r\n changePaymentMethodModalHeader: '',\r\n changePaymentMethodModalSubheader: '',\r\n edit: '',\r\n newRecurringAnnualTotal: '',\r\n newRecurringMonthlyTotal: '',\r\n previousAnnualTotal: '',\r\n previousMonthlyTotal: '',\r\n billingCycleCredit: '',\r\n getStartedNote: '',\r\n creatingAccountLeftHeader: '',\r\n creatingAccountLeftContent: '',\r\n creatingAccountRightHeader: '',\r\n creatingAccountRightContent: '',\r\n getStartedButtonText: '',\r\n getStartedButtonUrl: '',\r\n gotoAdminUrl: '',\r\n savingWithAnnualBilling: '',\r\n errorBlockedPurchase: '',\r\n errorGenericMessage: '',\r\n errorRequiredBIC: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorSummaryMessage: '',\r\n errorTooManyRequests: '',\r\n errorInvalidPostalCode: '',\r\n internalErrorMessage: '',\r\n calculating: '',\r\n newUserLicensePlural: '',\r\n fees: '',\r\n changeNumberModalHeader: '',\r\n changeNumberModalContent: '',\r\n changePlanUrl: '',\r\n sEOPageTitle: '',\r\n showMe: '',\r\n errorInvalidAddress: '',\r\n paymentMethodErrorMessage: '',\r\n disabledUserError: '',\r\n addonUserSuccessUrl: '',\r\n percentageOffAnnualDiscount: '',\r\n percentageOffVolumeDiscount: '',\r\n volumeDiscountPopupText: '',\r\n percentageOffPromoDiscount: '',\r\n equal: '',\r\n bundles: '',\r\n countAbbr: '',\r\n discount: '',\r\n percentageDiscountPopupText: '',\r\n annualPlanNote: '',\r\n monthlyPlanNote: '',\r\n invalidQSCouponMessage: '',\r\n invalidQSCouponUsingCMSCouponMessage: '',\r\n couponValidMessage: '',\r\n dismiss: '',\r\n couponDisclaimer: '',\r\n couponAdjustmentSavings: '',\r\n couponAdjustmentSavingsPopupText: '',\r\n billedMonthlyPrice: '',\r\n billedAnnualPrice: '',\r\n billedMonthlyAnnualPrice: '',\r\n secure: '',\r\n trustArcSupport: '',\r\n per: '',\r\n selectAddons: '',\r\n selectAddonsDescription: '',\r\n organizer: '',\r\n added: '',\r\n existingUsersModalContent: '',\r\n existingUsersModalHeader: '',\r\n existingUsersNewEmailButtonText: '',\r\n allrightsreservedDisclaimerLabel: '',\r\n termsandconditionsLabel: '',\r\n privacypolicyLabel: '',\r\n antiSpamPolicyLabel: '',\r\n trademarkLabel: '',\r\n doNotSellInfoLabel: '',\r\n sitemapLabel: '',\r\n termsandconditionsUrl: '',\r\n privacypolicyUrl: '',\r\n antiSpamPolicyUrl: '',\r\n trademarkUrl: '',\r\n doNotSellInfoUrl: '',\r\n sitemapUrl: '',\r\n taxTooltip: '',\r\n agentsVolumediscountTooltip: '',\r\n endpointsVolumediscountTooltip: '',\r\n mobileVolumediscountTooltip: '',\r\n cameraShareVolumediscountTooltip: '',\r\n endpointProtectionVolumediscountTooltip: '',\r\n proratedadjustmentTooltip: '',\r\n errorRequiredTaxNumber: '',\r\n taxBusiness: '',\r\n taxIndividual: '',\r\n taxNumber: '',\r\n gSTDisclaimer: '',\r\n vATDisclaimer: '',\r\n gSTOption: '',\r\n vATOption: '',\r\n companyName: '',\r\n optional: '',\r\n changeCountryContent: '',\r\n changeCountryHeader: '',\r\n modalCancel: '',\r\n modalReload: '',\r\n taxCodeGST: '',\r\n taxCodeVAT: '',\r\n upgradeClose: '',\r\n upgradeSubscriptionCredit: '',\r\n upgradeSubscriptionCreditTooltip: '',\r\n upgradeSubscriptionCreditNote: '',\r\n upgradeCreditErrorMessage: '',\r\n upgradeCreditErrorAssistance: '',\r\n totalVolumeDiscount: '',\r\n totalVolumeDiscountTooltip: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\n","import { buyFormStateInitialData } from '@lmipro/data'\r\nimport { LmiProBuyFormState } from './state'\r\nimport { LmiProBuyFormActionTypes } from './actions'\r\nimport type { BuyFormActions } from './actions'\r\n\r\nexport const buyFormInitialState: LmiProBuyFormState = buyFormStateInitialData\r\n\r\nexport const buyFormReducer = (\r\n previousState: LmiProBuyFormState | undefined,\r\n action: BuyFormActions\r\n): LmiProBuyFormState => {\r\n const state = previousState || buyFormInitialState\r\n switch (action.type) {\r\n // need to add actions from the form components here\r\n case LmiProBuyFormActionTypes.RESET_BUY_FORM: {\r\n return buyFormInitialState\r\n }\r\n case LmiProBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE: {\r\n const { data } = action.payload\r\n return {\r\n ...state,\r\n initialData: { ...data },\r\n }\r\n }\r\n case LmiProBuyFormActionTypes.SET_CLEAR_EMAIL:\r\n return {\r\n ...state,\r\n clearEmail: action.payload.clear,\r\n }\r\n case LmiProBuyFormActionTypes.UPDATE_STEPS:\r\n return {\r\n ...state,\r\n steps: {\r\n ...state.steps,\r\n [action.payload.stepName]: {\r\n completed: action.payload.stepResult,\r\n error: !action.payload.stepResult,\r\n },\r\n },\r\n }\r\n case LmiProBuyFormActionTypes.SET_STATES_OPTIONAL:\r\n return {\r\n ...state,\r\n statesOptional: action.payload.optional,\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LMIPRO_USER_TYPES } from '@lmipro/constants'\r\nimport { LmiProUserState } from './state'\r\nimport { LmiProUserActionTypes } from './actions'\r\nimport type { LmiProUserActions } from './actions'\r\n\r\nexport const initialUserState: LmiProUserState = {\r\n displayName: '',\r\n loadingExistingInfo: false,\r\n verifyingToken: false,\r\n userType: LMIPRO_USER_TYPES.NEW,\r\n loggedIn: {\r\n accessToken: undefined,\r\n isUserLoggedIn: false,\r\n },\r\n verifiedUserShouldLogIn: false,\r\n}\r\n\r\nexport const userReducer = (previousState: LmiProUserState | undefined, action: LmiProUserActions): LmiProUserState => {\r\n const state = previousState || initialUserState\r\n switch (action.type) {\r\n case LmiProUserActionTypes.SET_EXISTING_BILLING_INFO: {\r\n const { billingInfo } = action.payload\r\n return {\r\n ...state,\r\n existingBillingInformation: { ...billingInfo },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_EXISTING_USER_INFO: {\r\n const { userInfo } = action.payload\r\n return {\r\n ...state,\r\n existingUserInformation: { ...userInfo },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_EXISTING_ACCOUNT_INFO: {\r\n const { accountInfo } = action.payload\r\n return {\r\n ...state,\r\n existingAccountInformation: { ...accountInfo },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_DISPLAY_NAME: {\r\n return {\r\n ...state,\r\n displayName: action.payload.displayName,\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_LOADING_EXISTING_INFO: {\r\n return {\r\n ...state,\r\n loadingExistingInfo: action.payload.loading,\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_VERIFYING_TOKEN: {\r\n return {\r\n ...state,\r\n verifyingToken: action.payload.verifying,\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_USER_TYPE: {\r\n return {\r\n ...state,\r\n userType: action.payload.type,\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_EXISTING_PAYMENT_DETAILS: {\r\n const { info } = action.payload\r\n return {\r\n ...state,\r\n existingPaymentInformation: { ...info },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_ACCESS_TOKEN: {\r\n return {\r\n ...state,\r\n loggedIn: { ...state.loggedIn, accessToken: action.payload.accessToken },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_IS_USER_LOGGEDIN: {\r\n return {\r\n ...state,\r\n loggedIn: {\r\n ...state.loggedIn,\r\n isUserLoggedIn: action.payload.isUserLoggedIn,\r\n },\r\n }\r\n }\r\n case LmiProUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN: {\r\n return {\r\n ...state,\r\n verifiedUserShouldLogIn: action.payload.verifiedUserShouldLogIn,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LmiProCouponActions, LmiProCouponActionTypes } from './actions'\r\nimport { LmiProCouponState } from './state'\r\n\r\nexport const initialCouponState: LmiProCouponState = {\r\n couponServerData: null,\r\n couponProcessedDataPerSku: null,\r\n isUrlCouponActive: false,\r\n isCMSCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n isUrlCouponCodeAvailable: false,\r\n urlCouponCode: '',\r\n}\r\n\r\nexport const couponReducer = (previousState: LmiProCouponState | undefined, action: LmiProCouponActions) => {\r\n const state = previousState || initialCouponState\r\n switch (action.type) {\r\n case LmiProCouponActionTypes.SET_COUPON_SERVER_DATA: {\r\n const { couponServerData } = action.payload\r\n return {\r\n ...state,\r\n couponServerData,\r\n }\r\n }\r\n case LmiProCouponActionTypes.SET_COUPON_PROCESSED_DATA: {\r\n const { couponProcessedDataPerSku } = action.payload\r\n return { ...state, couponProcessedDataPerSku }\r\n }\r\n case LmiProCouponActionTypes.RESET_COUPON_DATA: {\r\n return {\r\n ...state,\r\n couponProcessedDataPerSku: null,\r\n isCMSCouponActive: false,\r\n isUrlCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n }\r\n }\r\n case LmiProCouponActionTypes.SET_COUPON_VALID_AND_APPLIED: {\r\n const { isCouponValidAndApplied } = action.payload\r\n return { ...state, isCouponValidAndApplied }\r\n }\r\n case LmiProCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER: {\r\n const { couponDoubleDipAmountForNewUser } = action.payload\r\n return { ...state, couponDoubleDipAmountForNewUser }\r\n }\r\n case LmiProCouponActionTypes.SET_URL_COUPON_ACTIVE: {\r\n const { isUrlCouponActive } = action.payload\r\n return {\r\n ...state,\r\n isUrlCouponActive,\r\n isCMSCouponActive: !isUrlCouponActive,\r\n }\r\n }\r\n case LmiProCouponActionTypes.SET_URL_COUPON_CODE: {\r\n const { couponCode } = action.payload\r\n return { ...state, urlCouponCode: couponCode, isUrlCouponCodeAvailable: couponCode.length > 0 }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { combineReducers } from 'redux'\r\nimport { contentReducer } from '@lmipro/state/content/reducer'\r\nimport { checkoutReducer } from '@lmipro/state/checkout/reducer'\r\nimport { buyFormReducer } from '@lmipro/state/buy-form/reducer'\r\nimport { userReducer } from '@lmipro/state/user/reducer'\r\nimport { couponReducer } from '@lmipro/state/coupon/reducer'\r\n\r\nexport const lmiProAppReducer = combineReducers({\r\n content: contentReducer,\r\n checkout: checkoutReducer,\r\n form: buyFormReducer,\r\n user: userReducer,\r\n coupon: couponReducer,\r\n})\r\n\r\nexport type LmiProAppState = ReturnType\r\nexport type LmiProContainerAppState = {\r\n lmipro: LmiProAppState\r\n}\r\n","import { BillingPeriod, TimePeriod } from '@common/constants'\r\nimport { BuyCheckoutState } from './state'\r\nimport { BuyCheckoutActionTypes } from './actions'\r\nimport type { BuyCheckoutActions } from './actions'\r\n\r\nexport const initialCheckoutState: BuyCheckoutState = {\r\n isLoading: true,\r\n downloadingInvoice: false,\r\n invoice: null,\r\n selectedAddons: [],\r\n submitting: false,\r\n organizers: 1,\r\n promoCode: '',\r\n billingFrequency: TimePeriod.Year,\r\n calculatedTax: 0,\r\n calculatedTotal: 0,\r\n calculatedNetTotal: 0,\r\n calculatedCredit: 0,\r\n anniversaryDate: '',\r\n selectedPlanSku: '',\r\n savedStateLoaded: false,\r\n purchaseComplete: false,\r\n addonComplete: false,\r\n totalLoading: false,\r\n selectedTierIndex: 0, // the default selected tier is Tier1, since selectedTierIndex is zero based index.\r\n currentVolumeDiscountPrice: 0,\r\n volumeDiscountLoading: false,\r\n volumeDiscount: {},\r\n calculatedProratedAmount: 0,\r\n extraAddons: [],\r\n endpoints: 0,\r\n agents: 0,\r\n taxType: '',\r\n autoLogin: undefined,\r\n baseLine: {\r\n key: '',\r\n // title: '',\r\n // subTotal: 0,\r\n // price: 0,\r\n quantity: 0,\r\n unit: '',\r\n multiplier: 0,\r\n allPrices: {},\r\n skuName: '',\r\n quantityMultiplier: '',\r\n },\r\n additionalLines: [],\r\n addonLines: [],\r\n totalDiscount: 0,\r\n totalVolumeDiscount: 0,\r\n finalTotal: 0,\r\n billingTenure: {\r\n selected: BillingPeriod.ANNUAL,\r\n },\r\n}\r\n\r\nexport const checkoutReducer = (\r\n previousState: BuyCheckoutState | undefined,\r\n action: BuyCheckoutActions\r\n): BuyCheckoutState => {\r\n const state = previousState || initialCheckoutState\r\n switch (action.type) {\r\n case BuyCheckoutActionTypes.SET_LOADING:\r\n return {\r\n ...state,\r\n isLoading: action.payload.loading,\r\n }\r\n case BuyCheckoutActionTypes.SET_INVOICE: {\r\n return {\r\n ...state,\r\n invoice: action.payload.invoice,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_DOWNLOADING_INVOICE: {\r\n return {\r\n ...state,\r\n downloadingInvoice: action.payload.downloadingInvoice,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_PURCHASE_COMPLETE:\r\n return {\r\n ...state,\r\n purchaseComplete: action.payload.complete,\r\n }\r\n case BuyCheckoutActionTypes.SET_BILLING_FREQUENCY:\r\n return {\r\n ...state,\r\n billingFrequency: action.payload.frequency,\r\n }\r\n case BuyCheckoutActionTypes.CLEAR_ADDONS:\r\n return {\r\n ...state,\r\n selectedAddons: [],\r\n }\r\n // case BuyCheckoutActionTypes.SET_SELECTED_PLAN:\r\n // return {\r\n // ...state,\r\n // selectedPlanSku: action.payload.planSku,\r\n // }\r\n case BuyCheckoutActionTypes.SET_SELECTED_ADDONS: {\r\n const { addons } = action.payload\r\n return {\r\n ...state,\r\n selectedAddons: [...addons],\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_ORGANIZERS:\r\n return {\r\n ...state,\r\n organizers: action.payload.organizers,\r\n }\r\n case BuyCheckoutActionTypes.SET_CALCULATED_PRICE:\r\n return {\r\n ...state,\r\n productPrices: action.payload.productPrices,\r\n calculatedNetTotal: action.payload.net,\r\n calculatedTotal: action.payload.total,\r\n calculatedTax: action.payload.tax,\r\n calculatedCredit: action.payload.creditback,\r\n anniversaryDate: action.payload.anniversaryDate,\r\n }\r\n case BuyCheckoutActionTypes.SET_SAVED_STATE_LOADED:\r\n return {\r\n ...state,\r\n savedStateLoaded: action.payload.savedStateLoaded,\r\n }\r\n case BuyCheckoutActionTypes.SET_LOADING_TOTAL:\r\n return {\r\n ...state,\r\n totalLoading: action.payload.loading,\r\n }\r\n case BuyCheckoutActionTypes.SET_ADDON_COMPLETE:\r\n return {\r\n ...state,\r\n addonComplete: action.payload.addonComplete,\r\n }\r\n case BuyCheckoutActionTypes.SET_SELECTED_TIER_INDEX: {\r\n const { selectedTierIndex } = action.payload\r\n return {\r\n ...state,\r\n selectedTierIndex,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_VOLUME_DISCOUNT: {\r\n const { selectedPlanSku, currency, volumeDiscountForSelectedPlanAndCurrency } = action.payload\r\n const selectedPlanSkuVolumeDiscount = state.volumeDiscount[selectedPlanSku] || {}\r\n return {\r\n ...state,\r\n volumeDiscount: {\r\n ...state.volumeDiscount,\r\n [selectedPlanSku]: {\r\n ...selectedPlanSkuVolumeDiscount,\r\n [currency]: volumeDiscountForSelectedPlanAndCurrency,\r\n },\r\n },\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING: {\r\n const { volumeDiscountLoading } = action.payload\r\n return { ...state, volumeDiscountLoading }\r\n }\r\n case BuyCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE: {\r\n const { currentVolumeDiscountPrice } = action.payload\r\n return { ...state, currentVolumeDiscountPrice }\r\n }\r\n case BuyCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON: {\r\n return { ...state, currentVolumeDiscountPrice: 0 }\r\n }\r\n case BuyCheckoutActionTypes.SET_PRORATED_AMOUNT: {\r\n const { proratedAmount } = action.payload\r\n return { ...state, calculatedProratedAmount: proratedAmount }\r\n }\r\n case BuyCheckoutActionTypes.RESET_CHECKOUT_STATE: {\r\n return initialCheckoutState\r\n }\r\n case BuyCheckoutActionTypes.SET_EXTRA_ADDON: {\r\n const { addons = [] } = action.payload\r\n return {\r\n ...state,\r\n extraAddons: addons,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_ENDPOINTS: {\r\n return {\r\n ...state,\r\n endpoints: action.payload.endpoints,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_AGENTS: {\r\n return {\r\n ...state,\r\n agents: action.payload.agents,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_TAX_TYPE: {\r\n return {\r\n ...state,\r\n taxType: action.payload.type,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_AUTO_LOGIN: {\r\n return {\r\n ...state,\r\n autoLogin: action.payload.autoLogin,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_BASE_LINE: {\r\n return {\r\n ...state,\r\n baseLine: action.payload.baseLine,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_ADDITIONAL_LINES: {\r\n return {\r\n ...state,\r\n additionalLines: action.payload.additionalLines,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_ADDON_LINES: {\r\n return {\r\n ...state,\r\n addonLines: action.payload.addonLines,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_TOTAL_DISCOUNT: {\r\n return {\r\n ...state,\r\n totalDiscount: action.payload.totalDiscount,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_TOTAL_VOLUME_DISCOUNT: {\r\n return {\r\n ...state,\r\n totalVolumeDiscount: action.payload.totalVolumeDiscount,\r\n }\r\n }\r\n case BuyCheckoutActionTypes.SET_BILLING_TENURE:\r\n return {\r\n ...state,\r\n billingTenure: action.payload.tenure,\r\n }\r\n case BuyCheckoutActionTypes.SET_FINAL_TOTAL: {\r\n return {\r\n ...state,\r\n finalTotal: action.payload.finalTotal,\r\n }\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { CHECKOUTFORM_FIELDS, CHECKOUTFORM_STEPS } from '@buy/constants'\r\nimport { BuyErrorContent } from '@buy/state/checkout-form-container/state'\r\nimport { BuyFormData, BuyFormState } from '@buy/state/buy-form/state'\r\nimport { getFormSessionValue } from '@common/utils'\r\n\r\nexport const errorContent: BuyErrorContent = {\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n errorInvalidCreditCardNumber: '',\r\n emailAddressAlreadyInUse: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorInvalidPostalCode: '',\r\n errorGenericMessage: '',\r\n errorInvalidAddress: '',\r\n errorRequiredTaxNumber: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\nexport const initialData: BuyFormData = {\r\n FirstName: getFormSessionValue(CHECKOUTFORM_FIELDS.FIRST_NAME),\r\n LastName: getFormSessionValue(CHECKOUTFORM_FIELDS.LAST_NAME),\r\n Email: getFormSessionValue(CHECKOUTFORM_FIELDS.EMAIL),\r\n Street1: getFormSessionValue(CHECKOUTFORM_FIELDS.STREET1),\r\n City: getFormSessionValue(CHECKOUTFORM_FIELDS.CITY),\r\n ZipCode: getFormSessionValue(CHECKOUTFORM_FIELDS.ZIP_CODE),\r\n StateCode: getFormSessionValue(CHECKOUTFORM_FIELDS.STATE_CODE),\r\n CountryCode: '',\r\n ContactPhone: getFormSessionValue(CHECKOUTFORM_FIELDS.CONTACT_PHONE),\r\n Password: '',\r\n BillingFirstName: getFormSessionValue(CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME),\r\n BillingLastName: getFormSessionValue(CHECKOUTFORM_FIELDS.BILLING_LAST_NAME),\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n}\r\nexport const buyFormStateInitialData: BuyFormState = {\r\n clearEmail: false,\r\n initialData,\r\n steps: {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: { completed: false, error: false },\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: { completed: false, error: false },\r\n },\r\n statesOptional: false,\r\n}\r\n","import { buyFormStateInitialData } from '@buy/data'\r\nimport { BuyFormState } from './state'\r\nimport { BuyFormActionTypes } from './actions'\r\nimport type { BuyFormActions } from './actions'\r\n\r\nexport const buyFormInitialState: BuyFormState = buyFormStateInitialData\r\n\r\nexport const buyFormReducer = (previousState: BuyFormState | undefined, action: BuyFormActions): BuyFormState => {\r\n const state = previousState || buyFormInitialState\r\n switch (action.type) {\r\n // need to add actions from the form components here\r\n case BuyFormActionTypes.RESET_BUY_FORM: {\r\n return buyFormInitialState\r\n }\r\n case BuyFormActionTypes.UPDATE_INITIAL_FORM_STATE: {\r\n const { data } = action.payload\r\n return {\r\n ...state,\r\n initialData: { ...data },\r\n }\r\n }\r\n case BuyFormActionTypes.SET_CLEAR_EMAIL:\r\n return {\r\n ...state,\r\n clearEmail: action.payload.clear,\r\n }\r\n case BuyFormActionTypes.UPDATE_STEPS:\r\n return {\r\n ...state,\r\n steps: {\r\n ...state.steps,\r\n [action.payload.stepName]: {\r\n completed: action.payload.stepResult,\r\n error: !action.payload.stepResult,\r\n },\r\n },\r\n }\r\n case BuyFormActionTypes.SET_STATES_OPTIONAL:\r\n return {\r\n ...state,\r\n statesOptional: action.payload.optional,\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { BUY_USER_TYPES } from '@buy/constants'\r\nimport { BuyUserState } from './state'\r\nimport { BuyUserActionTypes } from './actions'\r\nimport type { BuyUserActions } from './actions'\r\n\r\nexport const initialUserState: BuyUserState = {\r\n displayName: '',\r\n loadingExistingInfo: false,\r\n verifyingToken: false,\r\n userType: BUY_USER_TYPES.NEW,\r\n loggedIn: {\r\n accessToken: undefined,\r\n isUserLoggedIn: false,\r\n },\r\n castleToken: '',\r\n verifiedUserShouldLogIn: false,\r\n}\r\n\r\nexport const userReducer = (previousState: BuyUserState | undefined, action: BuyUserActions): BuyUserState => {\r\n const state = previousState || initialUserState\r\n switch (action.type) {\r\n case BuyUserActionTypes.SET_EXISTING_BILLING_INFO: {\r\n const { billingInfo } = action.payload\r\n return {\r\n ...state,\r\n existingBillingInformation: { ...billingInfo },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_EXISTING_USER_INFO: {\r\n const { userInfo } = action.payload\r\n return {\r\n ...state,\r\n existingUserInformation: { ...userInfo },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_EXISTING_ACCOUNT_INFO: {\r\n const { accountInfo } = action.payload\r\n return {\r\n ...state,\r\n existingAccountInformation: { ...accountInfo },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_DISPLAY_NAME: {\r\n return {\r\n ...state,\r\n displayName: action.payload.displayName,\r\n }\r\n }\r\n case BuyUserActionTypes.SET_LOADING_EXISTING_INFO: {\r\n return {\r\n ...state,\r\n loadingExistingInfo: action.payload.loading,\r\n }\r\n }\r\n case BuyUserActionTypes.SET_VERIFYING_TOKEN: {\r\n return {\r\n ...state,\r\n verifyingToken: action.payload.verifying,\r\n }\r\n }\r\n case BuyUserActionTypes.SET_USER_TYPE: {\r\n return {\r\n ...state,\r\n userType: action.payload.type,\r\n }\r\n }\r\n case BuyUserActionTypes.SET_EXISTING_PAYMENT_DETAILS: {\r\n const { info } = action.payload\r\n return {\r\n ...state,\r\n existingPaymentInformation: { ...info },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_CASTLE_TOKEN: {\r\n return {\r\n ...state,\r\n castleToken: action.payload.castleToken,\r\n }\r\n }\r\n case BuyUserActionTypes.SET_ACCESS_TOKEN: {\r\n return {\r\n ...state,\r\n loggedIn: { ...state.loggedIn, accessToken: action.payload.accessToken },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_IS_USER_LOGGEDIN: {\r\n return {\r\n ...state,\r\n loggedIn: {\r\n ...state.loggedIn,\r\n isUserLoggedIn: action.payload.isUserLoggedIn,\r\n },\r\n }\r\n }\r\n case BuyUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN: {\r\n return {\r\n ...state,\r\n verifiedUserShouldLogIn: action.payload.verifiedUserShouldLogIn,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { BuyCouponActions, BuyCouponActionTypes } from './actions'\r\nimport { BuyCouponState } from './state'\r\n\r\nexport const initialCouponState: BuyCouponState = {\r\n couponServerData: null,\r\n couponProcessedDataPerSku: null,\r\n isUrlCouponActive: false,\r\n isCMSCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n isUrlCouponCodeAvailable: false,\r\n urlCouponCode: '',\r\n validCoupons: [],\r\n}\r\n\r\nexport const couponReducer = (previousState: BuyCouponState | undefined, action: BuyCouponActions) => {\r\n const state = previousState || initialCouponState\r\n switch (action.type) {\r\n case BuyCouponActionTypes.SET_COUPON_SERVER_DATA: {\r\n const { couponServerData } = action.payload\r\n return {\r\n ...state,\r\n couponServerData,\r\n }\r\n }\r\n case BuyCouponActionTypes.SET_COUPON_PROCESSED_DATA: {\r\n const { couponProcessedDataPerSku } = action.payload\r\n return { ...state, couponProcessedDataPerSku }\r\n }\r\n case BuyCouponActionTypes.RESET_COUPON_DATA: {\r\n return {\r\n ...state,\r\n couponProcessedDataPerSku: null,\r\n isCMSCouponActive: false,\r\n isUrlCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n }\r\n }\r\n case BuyCouponActionTypes.SET_COUPON_VALID_AND_APPLIED: {\r\n const { isCouponValidAndApplied } = action.payload\r\n return { ...state, isCouponValidAndApplied }\r\n }\r\n case BuyCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER: {\r\n const { couponDoubleDipAmountForNewUser } = action.payload\r\n return { ...state, couponDoubleDipAmountForNewUser }\r\n }\r\n case BuyCouponActionTypes.SET_URL_COUPON_ACTIVE: {\r\n const { isUrlCouponActive } = action.payload\r\n return {\r\n ...state,\r\n isUrlCouponActive,\r\n isCMSCouponActive: !isUrlCouponActive,\r\n }\r\n }\r\n case BuyCouponActionTypes.SET_URL_COUPON_CODE: {\r\n const { couponCode } = action.payload\r\n return { ...state, urlCouponCode: couponCode, isUrlCouponCodeAvailable: couponCode.length > 0 }\r\n }\r\n case BuyCouponActionTypes.SET_VALID_COUPON: {\r\n const { validCoupons } = action.payload\r\n return { ...state, validCoupons }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { BuyPlan } from '@buy/state/plan'\r\nimport { priceInitialData } from './price'\r\n\r\nexport const planInitialData: BuyPlan = {\r\n name: '',\r\n shortName: '',\r\n groupKey: '',\r\n description: '',\r\n addons: [],\r\n pricingInfo: priceInitialData,\r\n paymentPlans: [],\r\n productSku: '',\r\n purchaseOption: '',\r\n sKU: '',\r\n quantityErrorMessage: '',\r\n planKey: '',\r\n activeCoupon: null,\r\n endpointsIncludedText: null,\r\n endpointsIncludedAmount: 0,\r\n userAgentsIncludedText: null,\r\n userAgentsIncludedAmount: 0,\r\n shortDescription: '',\r\n userAgentsTootip: '',\r\n endpointsTooltip: '',\r\n highlightsLabel: '',\r\n highlightSelection: [],\r\n sKUSelectors: [],\r\n billingPeriods: [],\r\n}\r\n","import { BuyPrice } from '@buy/state/price'\r\n\r\nexport const priceInitialData: BuyPrice = {\r\n USD: {\r\n monthly: {\r\n tier1: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier2: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier3: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n },\r\n annual: {\r\n tier1: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier2: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier3: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n },\r\n monthlyAnnual: {\r\n tier1: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier2: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n tier3: {\r\n min: 0,\r\n price: 0,\r\n max: 0,\r\n monthlyUnitPrice: 0,\r\n },\r\n },\r\n },\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { labelContentInitialData } from '@buy/data'\r\nimport { planInitialData } from '@buy/data/plan-data'\r\nimport { BuyPlanDataState } from './state'\r\nimport { BuyPlanActions, BuyPlanActionTypes } from './actions'\r\n\r\nexport const initialContentState: BuyPlanDataState = {\r\n contentData: {\r\n CurrencyCode: CURRENCY.USD,\r\n ContentLoaded: false,\r\n Locale: 'en-US',\r\n PlanGroupId: '',\r\n DefaultCountry: '',\r\n marketoProductName: '',\r\n marketoSalesBrief: '',\r\n marketoSalesforceCampaignId: '',\r\n submittoMarketo: true,\r\n },\r\n labelContent: labelContentInitialData,\r\n plan: planInitialData,\r\n productSettings: {\r\n productPortalUrl: '',\r\n favicon: '',\r\n logo: '',\r\n logoMobile: '',\r\n logoUrl: '',\r\n platformProduct: '',\r\n abandonmentProgram: '',\r\n analyticsContainerID: '',\r\n enablePlanCustomization: false,\r\n enableChatBot: false,\r\n adminUrl: '',\r\n productFamily: '',\r\n qualtricsProductName: '',\r\n },\r\n\r\n contentLoaded: false,\r\n}\r\n\r\nexport const planDataReducer = (\r\n previousState: BuyPlanDataState | undefined,\r\n action: BuyPlanActions\r\n): BuyPlanDataState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case BuyPlanActionTypes.GET_LABEL_CONTENT: {\r\n return state\r\n }\r\n case BuyPlanActionTypes.SET_BUY_PLAN: {\r\n const { content, plan, labels, productSettings } = action.payload\r\n return {\r\n ...state,\r\n contentData: {\r\n ...state.contentData,\r\n ...content,\r\n },\r\n labelContent: { ...labels },\r\n plan,\r\n productSettings: { ...productSettings },\r\n }\r\n }\r\n case BuyPlanActionTypes.SET_CONTENT_LOADED: {\r\n return {\r\n ...state,\r\n contentLoaded: action.payload.loaded,\r\n }\r\n }\r\n case BuyPlanActionTypes.GET_COMPARE_MODAL_CONTENT: {\r\n return state\r\n }\r\n case BuyPlanActionTypes.SET_COUPON_DISCLAIMER: {\r\n return {\r\n ...state,\r\n labelContent: {\r\n ...state.labelContent,\r\n couponDisclaimer: action.payload.couponDisclaimer,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LabelContent } from '@buy/state/label-content'\r\n\r\nexport const labelContentInitialData: LabelContent = {\r\n addOns: '',\r\n agents: '',\r\n devices: '',\r\n quantityLabelLong: '',\r\n quantityLabel: '',\r\n quantityLabelPlural: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n password: '',\r\n useAccountInfo: '',\r\n address: '',\r\n country: '',\r\n city: '',\r\n postalCode: '',\r\n state: '',\r\n phone: '',\r\n checkout: '',\r\n header: '',\r\n customizePlan: '',\r\n errorMessageTitle: '',\r\n orderSummary: '',\r\n monthly: '',\r\n annual: '',\r\n save: '',\r\n user: '',\r\n year: '',\r\n month: '',\r\n months: '',\r\n subtotal: '',\r\n estimatedTax: '',\r\n tBD: '',\r\n todaysTotal: '',\r\n recurringAnnualCharge: '',\r\n recurringMonthlyCharge: '',\r\n autoRenewalNote: '',\r\n createAnAccount: '',\r\n billingInformation: '',\r\n passwordRequirements: '',\r\n paymentDetails: '',\r\n expirationDate: '',\r\n cVV: '',\r\n cVVHint: '',\r\n completePurchase: '',\r\n pricingNote: '',\r\n continue: '',\r\n changePlan: '',\r\n selectedPlan: '',\r\n signIn: '',\r\n errorCardinalChallenge: '',\r\n errorCardinalSetup: '',\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n estimatedTaxPopupInfo: '',\r\n quantityPopupInfo: '',\r\n yearAbbr: '',\r\n monthAbbr: '',\r\n questions: '',\r\n myAccount: '',\r\n signOut: '',\r\n pleaseSelect: '',\r\n headerPhone: '',\r\n optOutCheckboxLabel: '',\r\n optOut: '',\r\n cardNumber: '',\r\n errorInvalidCreditCardNumber: '',\r\n accountInformation: '',\r\n notYou: '',\r\n emailAddressAlreadyInUse: '',\r\n additionalUserLicences: '',\r\n howManyMore: '',\r\n existingUserLicencePlural: '',\r\n existingUserLicense: '',\r\n additional: '',\r\n newUserLicense: '',\r\n total: '',\r\n proratedAdjustment: '',\r\n today: '',\r\n modalCloseButtonText: '',\r\n changePlanMethodModalHeader: '',\r\n changePlanModalSubheader: '',\r\n changePaymentMethodModalHeader: '',\r\n changePaymentMethodModalSubheader: '',\r\n edit: '',\r\n newRecurringAnnualTotal: '',\r\n newRecurringMonthlyTotal: '',\r\n previousAnnualTotal: '',\r\n previousMonthlyTotal: '',\r\n billingCycleCredit: '',\r\n getStartedNote: '',\r\n creatingAccountLeftHeader: '',\r\n creatingAccountLeftContent: '',\r\n creatingAccountRightHeader: '',\r\n creatingAccountRightContent: '',\r\n getStartedButtonText: '',\r\n getStartedButtonUrl: '',\r\n gotoAdminUrl: '',\r\n savingWithAnnualBilling: '',\r\n errorBlockedPurchase: '',\r\n errorGenericMessage: '',\r\n errorRequiredBIC: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorSummaryMessage: '',\r\n errorTooManyRequests: '',\r\n errorInvalidPostalCode: '',\r\n internalErrorMessage: '',\r\n calculating: '',\r\n newUserLicensePlural: '',\r\n fees: '',\r\n changeNumberModalHeader: '',\r\n changeNumberModalContent: '',\r\n changePlanUrl: '',\r\n sEOPageTitle: '',\r\n showMe: '',\r\n errorInvalidAddress: '',\r\n paymentMethodErrorMessage: '',\r\n disabledUserError: '',\r\n addonUserSuccessUrl: '',\r\n percentageOffAnnualDiscount: '',\r\n percentageOffVolumeDiscount: '',\r\n volumeDiscountPopupText: '',\r\n percentageOffPromoDiscount: '',\r\n equal: '',\r\n bundles: '',\r\n countAbbr: '',\r\n discount: '',\r\n percentageDiscountPopupText: '',\r\n annualPlanNote: '',\r\n monthlyPlanNote: '',\r\n invalidQSCouponMessage: '',\r\n invalidQSCouponUsingCMSCouponMessage: '',\r\n couponValidMessage: '',\r\n dismiss: '',\r\n couponDisclaimer: '',\r\n couponAdjustmentSavings: '',\r\n couponAdjustmentSavingsPopupText: '',\r\n billedMonthlyPrice: '',\r\n billedAnnualPrice: '',\r\n secure: '',\r\n trustArcSupport: '',\r\n per: '',\r\n selectAddons: '',\r\n selectAddonsDescription: '',\r\n organizer: '',\r\n added: '',\r\n existingUsersModalContent: '',\r\n existingUsersModalHeader: '',\r\n existingUsersNewEmailButtonText: '',\r\n allrightsreservedDisclaimerLabel: '',\r\n termsandconditionsLabel: '',\r\n privacypolicyLabel: '',\r\n antiSpamPolicyLabel: '',\r\n trademarkLabel: '',\r\n doNotSellInfoLabel: '',\r\n sitemapLabel: '',\r\n termsandconditionsUrl: '',\r\n privacypolicyUrl: '',\r\n antiSpamPolicyUrl: '',\r\n trademarkUrl: '',\r\n doNotSellInfoUrl: '',\r\n sitemapUrl: '',\r\n taxTooltip: '',\r\n agentsVolumediscountTooltip: '',\r\n endpointsVolumediscountTooltip: '',\r\n mobileVolumediscountTooltip: '',\r\n cameraShareVolumediscountTooltip: '',\r\n endpointProtectionVolumediscountTooltip: '',\r\n proratedadjustmentTooltip: '',\r\n errorRequiredTaxNumber: '',\r\n taxBusiness: '',\r\n taxIndividual: '',\r\n taxNumber: '',\r\n gSTDisclaimer: '',\r\n vATDisclaimer: '',\r\n gSTOption: '',\r\n vATOption: '',\r\n companyName: '',\r\n optional: '',\r\n changeCountryContent: '',\r\n changeCountryHeader: '',\r\n modalCancel: '',\r\n modalReload: '',\r\n taxCodeGST: '',\r\n taxCodeVAT: '',\r\n upgradeClose: '',\r\n upgradeSubscriptionCredit: '',\r\n upgradeSubscriptionCreditTooltip: '',\r\n upgradeSubscriptionCreditNote: '',\r\n upgradeCreditErrorMessage: '',\r\n upgradeCreditErrorAssistance: '',\r\n totalVolumeDiscount: '',\r\n totalVolumeDiscountTooltip: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n passwordStrengthTipDrawer: '',\r\n receiptWelcomeMessage: '',\r\n receiptMyAccount: '',\r\n receiptPrint: '',\r\n monthlyTooltip: '',\r\n monthlySubText: '',\r\n annuallySubText: '',\r\n annualConractPlanNote: '',\r\n annualContractTotal: '',\r\n promoDiscountForAnnualSavingsTooltip: '',\r\n checkoutCTAButtonText: '',\r\n loadingSpinnerText: '',\r\n}\r\n","import { combineReducers } from 'redux'\r\nimport { checkoutReducer } from '@buy/state/checkout/reducer'\r\nimport { buyFormReducer } from '@buy/state/buy-form/reducer'\r\nimport { userReducer } from '@buy/state/user/reducer'\r\nimport { couponReducer } from '@buy/state/coupon/reducer'\r\nimport { planDataReducer } from '@buy/state/plan-data/reducer'\r\n\r\nexport const buyAppReducer = combineReducers({\r\n planData: planDataReducer,\r\n checkout: checkoutReducer,\r\n form: buyFormReducer,\r\n user: userReducer,\r\n coupon: couponReducer,\r\n})\r\n\r\nexport type BuyAppState = ReturnType\r\nexport type BuyContainerAppState = {\r\n buy: BuyAppState\r\n}\r\n","import { BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { getCheckoutState, getPlanData } from '@buy/state/selectors'\r\nimport { BuyPlan, PriceInfo } from '@buy/state/plan'\r\nimport { select, call, SelectEffect, CallEffect } from 'redux-saga/effects'\r\nimport { getCurrentAddons } from '@buy/utils/get-current-addons'\r\nimport { BuyAddon } from '@buy/state/add-on'\r\nimport { isEmpty } from 'lodash-es'\r\nimport buyServices from '@buy/services'\r\nimport { PriceInfoPayload } from '@buy/state/user/state'\r\nimport { PriceInfoPeriod } from '@common/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { BuyPrice } from '@buy/state/price'\r\n\r\nexport function* getSelectedAddons(): Generator<\r\n SelectEffect | CallEffect | CallEffect,\r\n BuyAddon[],\r\n BuyCheckoutState & BuyPlan & BuyAddon[]\r\n> {\r\n const { selectedAddons }: BuyCheckoutState = yield select(getCheckoutState)\r\n const selectedPlan: BuyPlan = yield select(getPlanData)\r\n const myAddons: BuyAddon[] = yield call(getCurrentAddons, selectedAddons, selectedPlan)\r\n return myAddons\r\n}\r\n\r\nexport function* getPricingInfo(castleRequestToken: string, plan: BuyPlan, currency: string[]) {\r\n const skuList = new Set()\r\n skuList.add(plan.sKU)\r\n plan.sKUSelectors?.forEach((item) => {\r\n skuList.add(item.sku)\r\n })\r\n plan.addons?.forEach((addon) => {\r\n skuList.add(addon.sKU)\r\n })\r\n\r\n const payload: PriceInfoPayload = { productSKUs: Array.from(skuList).join(','), currency: currency.join(',') }\r\n const priceInfoResponse: GenericResponse = yield call(buyServices.getPricingInfoData, castleRequestToken, payload)\r\n return priceInfoResponse.data\r\n}\r\n\r\nconst remapPricingInfo = (pricingInfo: BuyPrice, quantityMultiplier?: string): BuyPrice => {\r\n const countriesPricingMap = new Map()\r\n Object.keys(pricingInfo).forEach((countryKey: string) => {\r\n const billingTenurePricing = new Map()\r\n Object.keys(pricingInfo[countryKey]).forEach((tenureKey: string) => {\r\n const tiersMap = new Map()\r\n Object.keys(pricingInfo[countryKey][tenureKey]).forEach((tierKey: string) => {\r\n const newPriceItem = { ...pricingInfo[countryKey][tenureKey][tierKey] }\r\n if (tenureKey === 'UpfrontAnnual') {\r\n newPriceItem.price = newPriceItem.monthlyUnitPrice\r\n }\r\n if (!isEmpty(quantityMultiplier)) {\r\n newPriceItem.price *= Number(quantityMultiplier)\r\n newPriceItem.min /= Number(quantityMultiplier)\r\n newPriceItem.max /= Number(quantityMultiplier)\r\n }\r\n tiersMap.set(tierKey, newPriceItem)\r\n })\r\n billingTenurePricing.set(PriceInfoPeriod[tenureKey], Object.fromEntries(tiersMap))\r\n })\r\n countriesPricingMap.set(countryKey, Object.fromEntries(billingTenurePricing))\r\n })\r\n const result = Object.fromEntries(countriesPricingMap) as BuyPrice\r\n return result\r\n}\r\n\r\nexport function mapPricingInfo(plan: BuyPlan, skuPricingInfo: PriceInfo[]) {\r\n const baseSku = skuPricingInfo.find((x) => x.productSKU.toLowerCase() === plan.sKU.toLowerCase())\r\n if (!isEmpty(baseSku)) {\r\n plan.pricingInfo = remapPricingInfo(baseSku.pricingInfo) // eslint-disable-line no-param-reassign\r\n }\r\n\r\n plan.addons?.forEach((addon) => {\r\n const addonSku = skuPricingInfo.find((x) => x.productSKU.toLowerCase() === addon.sKU.toLowerCase())\r\n if (!isEmpty(addonSku)) {\r\n const reMappedAddonSkuPricingInfo = remapPricingInfo(\r\n addonSku.pricingInfo,\r\n addon.sKUSelector?.quantityMultiplier\r\n )\r\n addon.pricingInfo = reMappedAddonSkuPricingInfo // eslint-disable-line no-param-reassign\r\n if (!isEmpty(addon.sKUSelector)) addon.sKUSelector.pricingInfo = { ...reMappedAddonSkuPricingInfo } // eslint-disable-line no-param-reassign\r\n }\r\n })\r\n plan.sKUSelectors?.forEach((item) => {\r\n const skuSelectorSku = skuPricingInfo.find((x) => x.productSKU.toLowerCase() === item.sku.toLowerCase())\r\n if (!isEmpty(skuSelectorSku)) {\r\n item.pricingInfo = remapPricingInfo(skuSelectorSku.pricingInfo, item.quantityMultiplier) // eslint-disable-line no-param-reassign\r\n }\r\n })\r\n return plan\r\n}\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport buyServices from '@buy/services'\r\nimport { getPlanNameFromPath, getProductNameFromPath } from '@common/utils/path-utils'\r\nimport { buyPlanActions, BuyPlanActionTypes } from '@buy/state/plan-data/actions'\r\nimport { CURRENCY, VIEW_PATH } from '@common/constants'\r\nimport { configure as configureCastle } from '@castleio/castle-js'\r\nimport { flexActions } from '@common/state/flex/actions'\r\nimport { getGUID } from '@common/utils/getGUID'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { buyUserActions } from '@buy/state/user/actions'\r\nimport { BuyPlan, PriceInfo } from '@buy/state/plan'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { getPricingInfo, mapPricingInfo } from './content-helpers'\r\n\r\nfunction* loadContentSaga() {\r\n try {\r\n // Create CyberSource fingerprint and put into redux store. This is used during fraud detection.\r\n // According to the documentation, we should generate a new unique id for the cybersource fingerprint on every page load\r\n // https://confluence.ops.expertcity.com/x/L4UVIg\r\n // https://confluence.ops.expertcity.com/x/7um3Cw\r\n // https://confluence.ops.expertcity.com/x/cxthC\r\n const guid = getGUID()\r\n yield put(flexActions.setFingerPrint(guid))\r\n\r\n // Create Castle token and put into redux store. This is used during fraud detection.\r\n const castle = configureCastle({ pk: process.env.CASTLE_PUBLISHABLE_KEY })\r\n const castleToken: string = yield call(castle.createRequestToken)\r\n yield put(buyUserActions.setCastleToken(castleToken))\r\n\r\n const planName = getPlanNameFromPath(window.location.pathname).toLowerCase()\r\n const contentEndpoint = getProductNameFromPath(window.location.pathname, false).toLowerCase()\r\n const labelServerResponse: GenericResponse = yield call(\r\n buyServices.getBuyPlanData,\r\n contentEndpoint,\r\n planName.replaceAll('-', '')\r\n )\r\n if (labelServerResponse && labelServerResponse.data && isEmpty(labelServerResponse.data.error)) {\r\n const { labels, productSettings, plan, ...content } = labelServerResponse.data\r\n const { sEOPageTitle } = labels\r\n yield call(() => {\r\n if (sEOPageTitle) document.title = sEOPageTitle\r\n })\r\n\r\n // Wait for the location info call to finish (it was called on src/products/buy/views/Billing/index.tsx)\r\n locationActions.getLocationInfo()\r\n // yield put(buyPlanActions.setBuyPlan(content, { ...labels }, { ...plan }, { ...productSettings }))\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n // Get pricing info\r\n const currencies = [...Object.keys(CURRENCY), locationInfo.currency]\r\n const priceInfoResponse: PriceInfo[] = yield call(getPricingInfo, castleToken, plan, currencies)\r\n if (priceInfoResponse && priceInfoResponse.length > 0) {\r\n const newPlan: BuyPlan = mapPricingInfo(plan, priceInfoResponse)\r\n yield put(buyPlanActions.setBuyPlan(content, { ...labels }, { ...newPlan }, { ...productSettings }))\r\n }\r\n yield put(buyPlanActions.setContentLoaded(true))\r\n } else {\r\n window.location.assign(VIEW_PATH.PATH_BASE)\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'label data failed to load' }))\r\n }\r\n}\r\n\r\nfunction* initializeBuyLoadContentSaga() {\r\n yield takeEvery(BuyPlanActionTypes.GET_LABEL_CONTENT, loadContentSaga)\r\n}\r\n\r\nexport default initializeBuyLoadContentSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport buyServices from '@buy/services'\r\nimport { BuyUserAccountType } from '@buy/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createUserSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const userCreationResponse: GenericResponse = yield call(buyServices.createUserAccount, userValues)\r\n if (userCreationResponse.data) {\r\n const userData: BuyUserAccountType = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserSaga() {\r\n yield takeEvery(BuyUserActionTypes.CREATE_NEW_USER, createUserSaga)\r\n}\r\n\r\nexport default initializeCreateUserSaga\r\n","import { BuyBillingInfoDataType } from '@buy/state/checkout/state'\r\nimport { BuyFormData } from '@buy/state/buy-form/state'\r\n\r\nexport const getBillingValues = (values: BuyFormData) => {\r\n const billingValues: BuyBillingInfoDataType = {\r\n addressLine1: values.Street1,\r\n city: values.City,\r\n state: values.StateCode,\r\n country: values.CountryCode,\r\n postalCode: values.ZipCode,\r\n firstName: values.BillingFirstName,\r\n lastName: values.BillingLastName,\r\n email: values.Email,\r\n companyName: values.CompanyName,\r\n phoneNumber: '',\r\n taxNumber: values.TaxNumber,\r\n federalTaxType: values.TaxType,\r\n }\r\n return billingValues\r\n}\r\n","import { call, put, select, debounce } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport { submitAbandonedCart } from '@buy/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { COOKIE_NAMES, LANGUAGE_CODES } from '@common/constants'\r\nimport Cookies from 'js-cookie'\r\nimport { getPlanData, getProductSettingsData, getUserState } from '@buy/state/selectors'\r\nimport { BuyAbandonedCartPayload, BuyUserState } from '@buy/state/user/state'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { sanitizePayload } from '@common/utils/aws-utils'\r\nimport { BuyPlan } from '@buy/state/plan'\r\n\r\nexport function* abandonedCartSaga(action: ReturnType) {\r\n const { isTrial, email, success, form } = action.payload.abandonedCartData\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const urlSplitForLanguage = window.location.pathname.split('/')[1]\r\n const isValidLanguageCode = Object.values(LANGUAGE_CODES).includes(urlSplitForLanguage)\r\n const siteLanguage = isValidLanguageCode ? urlSplitForLanguage : LANGUAGE_CODES.English\r\n const data: BuyAbandonedCartPayload = {\r\n success: success.toString(),\r\n email,\r\n mkto_trk: Cookies.get(COOKIE_NAMES.MARKETO_TRK) || '',\r\n country: locationInfo?.country,\r\n language: siteLanguage,\r\n program: null,\r\n firstName: null,\r\n lastName: null,\r\n }\r\n\r\n if (isTrial && !success) {\r\n data.firstName = form?.firstName\r\n data.lastName = form?.lastName\r\n }\r\n\r\n if (!isTrial && !success) {\r\n const { existingUserInformation }: BuyUserState = yield select(getUserState)\r\n const planData: BuyPlan = yield select(getPlanData)\r\n const { abandonmentProgram } = yield select(getProductSettingsData)\r\n data.plan = planData.sKU\r\n data.firstName = form?.firstName || existingUserInformation?.Name?.GivenName\r\n data.lastName = form?.lastName || existingUserInformation?.Name?.FamilyName\r\n data.program = abandonmentProgram\r\n }\r\n\r\n try {\r\n // yield delay(1000)\r\n yield call(submitAbandonedCart, sanitizePayload(data))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to post abandoned email api' }))\r\n }\r\n}\r\n\r\nfunction* initializeAbandonedCartSaga() {\r\n yield debounce(1000, BuyUserActionTypes.SUBMIT_ABANDONED_CART, abandonedCartSaga)\r\n}\r\n\r\nexport default initializeAbandonedCartSaga\r\n","import { PLATFORM } from '@common/constants'\r\n\r\nexport const priceWillFailToProcessErrorMessage =\r\n 'The total is between 1k and 2k which will fail to process in lower environments. ' +\r\n 'If you need to test a price failure scenario in lower environments, then ' +\r\n 'you must add the ?allowtestprice=true parameter to the URL to bypass this check.'\r\n\r\n// In lower environments, prevent form submission if calculated total is between 1k and 2k\r\n// because it will result in a CyberSource error when it tries to process the purchase\r\n// due to that range being a test price range for lower environments on the Cybersource third-party side\r\n// See also src/common/hooks/useFlexForm.ts\r\nexport const willPriceFailToProcess = (price: number, environment: string, queryStringParams: string) => {\r\n const isProduction = environment === PLATFORM.PROD\r\n const urlParams = new URLSearchParams(queryStringParams)\r\n const isCyberSourceTestPrice = price >= 1000 && price <= 2000\r\n const isTestPriceOverrideEnabled = urlParams.get('allowtestprice') === 'true'\r\n const priceWillFail = !isProduction && isCyberSourceTestPrice && !isTestPriceOverrideEnabled\r\n return priceWillFail\r\n}\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport buyServices from '@buy/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createBillingInfoSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CREATE_BILLING_INFO_SAGA\r\n try {\r\n const { billingValues } = action.payload\r\n const billingResponse: GenericResponse = yield call(buyServices.createBillingInfo, billingValues)\r\n if (billingResponse.status === 200 || billingResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save billing info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save billing info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreateBillingInfoSaga() {\r\n yield takeEvery(BuyCheckoutActionTypes.CREATE_BILLING_INFO, createBillingInfoSaga)\r\n}\r\n\r\nexport default initializeCreateBillingInfoSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\n\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { submitPayment } from '@buy/services'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* submitPaymentSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.SUBMIT_PAYMENT_SAGA\r\n try {\r\n const { submitValues } = action.payload\r\n const submitCreation: GenericResponse = yield call(submitPayment, submitValues)\r\n if (submitCreation && submitCreation.data) {\r\n return submitCreation.data\r\n }\r\n } catch {\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'failed to submit payment',\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'failed to submit payment',\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeSubmitPaymentSaga() {\r\n yield takeEvery(BuyCheckoutActionTypes.SUBMIT_PAYMENT, submitPaymentSaga)\r\n}\r\n\r\nexport default initializeSubmitPaymentSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport commonServices from '@buy/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { BuySubmitWithCardAddResponse } from '@buy/state/checkout/state'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\n\r\nexport function* createAndSubmitPaymentSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n try {\r\n const { submitValues } = action.payload\r\n const createAndSubmitPaymentResponse: BuySubmitWithCardAddResponse = yield call(\r\n commonServices.submitPaymentWithCardAdd,\r\n submitValues\r\n )\r\n if (createAndSubmitPaymentResponse.status === 200 || createAndSubmitPaymentResponse.status === 204) {\r\n return createAndSubmitPaymentResponse.data\r\n }\r\n } catch {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: keyInfo?.scaToken?.isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n trackErrorMessage: 'failed to save payment info',\r\n })\r\n )\r\n }\r\n return undefined\r\n}\r\n\r\nfunction* initializeCreateAndSubmitPaymentSaga() {\r\n yield takeEvery(BuyCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, createAndSubmitPaymentSaga)\r\n}\r\n\r\nexport default initializeCreateAndSubmitPaymentSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@buy/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { buyUserActions } from '@buy/state/user/actions'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { BuyUserDataType, BuyUserState, BuyUserAccountType, BuyAbandonedCartDataType } from '@buy/state/user/state'\r\nimport {\r\n BuyBillingInfoDataType,\r\n BuyCreditCardDataType,\r\n BuyCheckoutState,\r\n BuySubmitWithCardAddDataType,\r\n BuySubmitWithCardAddData,\r\n} from '@buy/state/checkout/state'\r\nimport { createTokenSaga } from '@common/sagas/flex/create-flex-token'\r\nimport { createUserSaga } from '@buy/saga/user/create-user'\r\nimport { getBillingValues } from '@buy/utils/get-billing-values'\r\nimport { getCartItems } from '@buy/utils/get-item-values'\r\nimport {\r\n getBuyFormState,\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getUserState,\r\n getPlanData,\r\n getProductSettingsData,\r\n} from '@buy/state/selectors'\r\nimport { ProductSettings } from '@buy/state/product-settings'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, BUY_TRACKING_COMPONENTS, BUY_USER_TYPES } from '@buy/constants'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { TimePeriod, TRACKING_EVENTS } from '@common/constants'\r\nimport { clearState, getSubscriptionInfo } from '@buy/utils'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyFormState } from '@buy/state/buy-form/state'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport authClass, { removeLocalStorageAuthItems, saveToken } from '@common/utils/auth-class'\r\nimport { FatalErrorMessageType, FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { BuySubmitPaymentResponseData } from '@buy/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@buy/saga/user/abandoned-cart'\r\nimport { getProductNameFromPath } from '@common/utils/path-utils'\r\nimport { priceWillFailToProcessErrorMessage, willPriceFailToProcess } from '@buy/utils/will-price-fail-to-process'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { createAndSubmitPaymentSaga } from './create-and-submit-payment'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n ExpirationDate,\r\n CompanyName,\r\n } = action.payload.values\r\n\r\n const pathProduct = getProductNameFromPath(window.location.pathname).toLowerCase()\r\n const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const { productPortalUrl }: ProductSettings = yield select(getProductSettingsData)\r\n const { userType, existingUserInformation }: BuyUserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { fingerprint, keyInfo, isCardinalSetupComplete }: FlexState = yield select(getFlexState)\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: BuyContentData =\r\n yield select(getContentData)\r\n const buyFormState: BuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === BUY_USER_TYPES.TRIALER ||\r\n userType === BUY_USER_TYPES.EXPIRED ||\r\n userType === BUY_USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const selectedPlan = plan\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponServerData } = coupon\r\n // const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, plan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n const errorMessage: FatalErrorMessageType = {\r\n trackErrorMessage: 'regular form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n }\r\n\r\n try {\r\n if (willPriceFailToProcess(checkout.calculatedTotal, process.env.ENVIRONMENT!, window.location.search)) {\r\n console.error(priceWillFailToProcessErrorMessage)\r\n throw new Error()\r\n }\r\n\r\n const billingValues: BuyBillingInfoDataType = getBillingValues(action.payload.values)\r\n const subscriptionInfo = getSubscriptionInfo(TimePeriod.Month, selectedPlan, plan)\r\n const items = getCartItems(\r\n checkout.baseLine,\r\n checkout.additionalLines,\r\n checkout.addonLines,\r\n subscriptionInfo,\r\n checkout.billingTenure.selected\r\n )\r\n const userValues: BuyUserDataType = {\r\n email,\r\n password,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n country: billingValues.country,\r\n fingerPrintSessionId: fingerprint,\r\n // TODO: load based on product\r\n // productName: PRODUCTS.RESOLVE,\r\n productName: pathProduct,\r\n }\r\n // #region Get flex token\r\n const flexTokenAction = flexActions.createToken(ExpirationDate)\r\n const tokenData: string = yield call(createTokenSaga, flexTokenAction)\r\n if (tokenData) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = true\r\n } else {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create flex token' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n // if Cardinal script is not set up by now, this indicates setup went wrong. Throw fatal error\r\n if (isScaEnabledForMid && !isCardinalSetupComplete) {\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] = false\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN,\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]\r\n )\r\n )\r\n // #endregion\r\n\r\n // #region trigger Cardinal bin.process. Necessary for PSD2 flow.\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const { token }: FlexState = yield select(getFlexState)\r\n const mask = token?.data?.number\r\n if (isScaEnabledForMid && mask) {\r\n const maskCardBin = mask.slice(0, 6)\r\n const { Status } = yield Cardinal.trigger('bin.process', maskCardBin)\r\n if (Status) {\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n } else {\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n fatalErrorType: FATAL_ERROR_TYPE.CARDINAL_SETUP,\r\n })\r\n )\r\n }\r\n } else {\r\n // Bypass if SCA is not enabled.\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS] = true\r\n }\r\n\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n let userKey = ''\r\n let accountKey = ''\r\n\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n const createUserAction = buyUserActions.createNewUser(userValues)\r\n const userData: BuyUserAccountType = yield call(createUserSaga, createUserAction)\r\n if (userData) {\r\n userKey = userData.UserKey\r\n accountKey = userData.BillingId\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(buyCheckoutActions.setAutoLogin(userData.xAutoLoginTicket))\r\n\r\n // If xAutoLoginTicket exists, perform silent authentication using hidden iframe\r\n // (xAutoLoginTicket is null in the case of an existing user performing a cross-product purchase)\r\n if (userData.xAutoLoginTicket) {\r\n const silentAuthTicket = userData.xAutoLoginTicket\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const token: Token = yield call(\r\n authClass.login,\r\n window.location.pathname,\r\n window.location.search,\r\n false,\r\n silentAuthTicket\r\n )\r\n\r\n if (token) {\r\n // Put token in redux store and in localStorage\r\n yield put(buyUserActions.setAccessToken(token))\r\n yield call(saveToken, token)\r\n }\r\n }\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n } else {\r\n // existing user\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n }\r\n // #endregion\r\n\r\n // #region Save billing info\r\n if (\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] &&\r\n steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN] &&\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]\r\n ) {\r\n const extraBillingValues = { ...billingValues }\r\n extraBillingValues.phoneNumber = ContactPhone\r\n\r\n const createBillingInfoAction = buyCheckoutActions.createBillingInfo(extraBillingValues)\r\n const savedBillingData: boolean = yield call(createBillingInfoSaga, createBillingInfoAction)\r\n if (savedBillingData) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region intialialize BOSS variables\r\n let paymentMethodKey = ''\r\n let paymentKey = ''\r\n const flexFormData: BuyCreditCardDataType = {\r\n expirationMonth: ExpirationDate.substr(0, 2),\r\n expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n flexResponse: tokenData,\r\n flexKeyId: keyInfo.flexKey.keyId,\r\n firstName,\r\n lastName,\r\n email,\r\n }\r\n // //#endregion\r\n\r\n // #region process purchase - 1st purchase call - create and save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] && steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]) {\r\n const submitValues: BuySubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n }\r\n\r\n const createAndSubmitPaymentAction = buyCheckoutActions.createAndSubmitPayment(submitValues)\r\n const createAndSubmitPaymentData: BuySubmitWithCardAddData = yield call(\r\n createAndSubmitPaymentSaga,\r\n createAndSubmitPaymentAction\r\n )\r\n let isChallengeRequired = false\r\n if (createAndSubmitPaymentData) {\r\n isChallengeRequired = (createAndSubmitPaymentData.isScaRequired && isScaEnabledForMid) || false\r\n paymentMethodKey = createAndSubmitPaymentData?.paymentMethodKey\r\n paymentKey = createAndSubmitPaymentData?.paymentKey\r\n }\r\n\r\n const payerAuthEnrollment = createAndSubmitPaymentData?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (createAndSubmitPaymentData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.PURCHASE,\r\n eventData: { invoiceNumber: createAndSubmitPaymentData.invoiceNumber },\r\n },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: BuySubmitWithCardAddDataType = {\r\n country: locationInfo.country,\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n flexFormData,\r\n fingerprintSessionId: fingerprint,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: true,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = buyCheckoutActions.submitPayment(submitValues)\r\n const submitData: BuySubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: BuyAbandonedCartDataType = {\r\n email,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = buyUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(buyUserActions.setDisplayName(firstName))\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentName\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = plan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n CompanyName,\r\n })\r\n // TODO: load based on product\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(buyCheckoutActions.setPurchaseComplete(true))\r\n\r\n // Clear localStorage items related to auth before redirecting to product portal\r\n removeLocalStorageAuthItems()\r\n\r\n // Redirect to product portal\r\n window.location.href = productPortalUrl || 'about:blank?errorMessage=missing_product_portal_url'\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport buyServices from '@buy/services'\r\nimport { CreateAccountResponse, BuyUserState } from '@buy/state/user/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { getUserState } from '@buy/state/selectors'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { getFlexState } from '@common/state/selectors'\r\n\r\nexport function* createUserUcsSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CREATE_USER_SAGA\r\n try {\r\n const { userValues } = action.payload\r\n const { castleToken }: BuyUserState = yield select(getUserState)\r\n const { fingerprint }: FlexState = yield select(getFlexState)\r\n const userCreationResponse: GenericResponse = yield call(\r\n buyServices.createUserAccountUcs as any,\r\n userValues,\r\n castleToken,\r\n fingerprint\r\n )\r\n if (userCreationResponse.data) {\r\n const userData: CreateAccountResponse = userCreationResponse.data\r\n return userData\r\n }\r\n } catch (e) {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to create user account' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to create user account' }))\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeCreateUserUcsSaga() {\r\n yield takeEvery(BuyUserActionTypes.CREATE_NEW_USER_UCS, createUserUcsSaga)\r\n}\r\n\r\nexport default initializeCreateUserUcsSaga\r\n","export const sanitizeCompanyName = (companyName: string) => {\r\n const rx = new RegExp(\"[^\\\\p{L}0-9 !,#()&.?/'\\\\-+]\", 'gu')\r\n const companyNameSanitized = companyName.replace(/@/g, '').replace(/_/g, '').replace(rx, '')\r\n return companyNameSanitized\r\n}\r\n","// These were the locales supported by OnePay as of October 28, 2024\r\nconst onePayLocales = ['de_DE', 'en_US', 'es_ES', 'fr_FR', 'it_IT', 'ja_JP', 'ko_KR', 'pt_BR', 'zh_CN']\r\n\r\n// These are the locales supported by GotoAdmin\r\nexport const gotoAdminLocales = [...onePayLocales, 'en_GB']\r\n\r\nexport const getOnePayLocaleFromContentLanguage = (contentLanguage: string) => {\r\n // Find the onepay locale that starts with the two-letter content language, or fallback to 'en_US'\r\n return onePayLocales.find((onePayLocale) => onePayLocale.startsWith(contentLanguage)) || 'en_US'\r\n}\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@buy/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { buyUserActions } from '@buy/state/user/actions'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport {\r\n CreateAccountRequest,\r\n BuyUserState,\r\n CreateAccountResponse,\r\n CreateCartRequest,\r\n CreateCartResponse,\r\n SetupTransactionResponse,\r\n SetupTransactionRequest,\r\n SetupTransactionRequestProduct,\r\n CreateV3CartRequestCartItem,\r\n ApplyPromoCodeRequest,\r\n} from '@buy/state/user/state'\r\nimport { BuyBillingInfoDataType, BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { createUserUcsSaga } from '@buy/saga/user/create-user-ucs'\r\nimport { getBillingValues } from '@buy/utils/get-billing-values'\r\nimport { getCartItems } from '@buy/utils/get-item-values'\r\nimport {\r\n getBuyFormState,\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getUserState,\r\n getPlanData,\r\n} from '@buy/state/selectors'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\nimport { CHECKOUTFORM_STEPS, BUY_TRACKING_COMPONENTS, BUY_USER_TYPES } from '@buy/constants'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { makeMarketoObject } from '@common/utils'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { TimePeriod, TimePeriodBillingPeriodFromBOSSMapper, TRACKING_EVENTS, VIEW_PATH } from '@common/constants'\r\nimport { getSubscriptionInfo } from '@buy/utils'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyFormState } from '@buy/state/buy-form/state'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport authClass, { getTokenFromLocalStorage, saveToken } from '@common/utils/auth-class'\r\nimport { FatalErrorMessageType, FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { applyPromoCode, createCartV3, deleteCart, setupTransaction } from '@buy/services'\r\nimport { AxiosResponse } from 'axios'\r\nimport { sanitizeCompanyName } from '@buy/utils/sanitize-company-name'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { getContentLanguage } from '@buy/utils/language-helpers'\r\nimport { getOnePayLocaleFromContentLanguage, gotoAdminLocales } from '@buy/utils/get-onepay-locale'\r\nimport { priceWillFailToProcessErrorMessage, willPriceFailToProcess } from '@buy/utils/will-price-fail-to-process'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n // #region constants\r\n const componentNameConfirmation = BUY_TRACKING_COMPONENTS.CONFIRMATION_PAGE\r\n\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: false,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: false,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: false,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n const {\r\n FirstName: firstName,\r\n LastName: lastName,\r\n Email: email,\r\n Street1,\r\n ZipCode,\r\n City,\r\n StateCode,\r\n Password: password,\r\n ContactPhone,\r\n // ExpirationDate,\r\n CompanyName,\r\n } = action.payload.values\r\n\r\n const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingUserInformation }: BuyUserState = yield select(getUserState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: BuyContentData =\r\n yield select(getContentData)\r\n const buyFormState: BuyFormState = yield select(getBuyFormState)\r\n const userAccountAlreadyCreated =\r\n buyFormState.steps.createUserAccount.completed ||\r\n userType === BUY_USER_TYPES.TRIALER ||\r\n userType === BUY_USER_TYPES.EXPIRED ||\r\n userType === BUY_USER_TYPES.CROSSPRODUCT\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = userAccountAlreadyCreated\r\n\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const selectedPlan = plan\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponServerData } = coupon\r\n // const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, plan)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n const errorMessage: FatalErrorMessageType = {\r\n trackErrorMessage: 'regular form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n }\r\n let accountKey = ''\r\n let transactionSessionId = ''\r\n // #endregion constants\r\n\r\n try {\r\n if (willPriceFailToProcess(checkout.calculatedTotal, process.env.ENVIRONMENT!, window.location.search)) {\r\n console.error(priceWillFailToProcessErrorMessage)\r\n throw new Error()\r\n }\r\n\r\n const billingValues: BuyBillingInfoDataType = getBillingValues(action.payload.values)\r\n const subscriptionInfo = getSubscriptionInfo(TimePeriod.Month, selectedPlan, plan)\r\n const items = getCartItems(\r\n checkout.baseLine,\r\n checkout.additionalLines,\r\n checkout.addonLines,\r\n subscriptionInfo,\r\n checkout.billingTenure.selected\r\n )\r\n const productFamilyWithSpace = marketoProductName.replace('GoTo', 'GoTo ')\r\n const contentLanguage = getContentLanguage()\r\n\r\n // If they didn't specify a company name, use the sanitized email as company name\r\n const companyNameSanitized = sanitizeCompanyName((CompanyName || '').trim() || email)\r\n\r\n let userKey = ''\r\n\r\n // #region Create user account\r\n if (!userAccountAlreadyCreated) {\r\n // If the password is empty, then it is because this user is an existing user.\r\n // In that case, we can't send an empty password for an existing to UCS Create Account API, so\r\n // we need to populate it with something fake. The UCS create account endpoint will\r\n // ignore this fake password since the user already exists but it will update the address.\r\n // TODO: WAE1-4010: For existing users, change this to use UCS Update Billing instead of UCS Create Account\r\n const thePassword = password || 'FAKE_PASSWORD_FOR_EXISTING_USER'\r\n const locale = `${contentLanguage}_${billingValues.country.toUpperCase()}`\r\n const userValues: CreateAccountRequest = {\r\n requestId: email, // Don't use fingerprint here because it's not unique to the user\r\n user: {\r\n email,\r\n password: thePassword,\r\n firstName,\r\n lastName,\r\n phoneNumber: ContactPhone,\r\n locale: gotoAdminLocales.includes(locale) ? locale : null, // null will default it to en-US in GotoAdmin BE.\r\n timeZone: null,\r\n },\r\n country: billingValues.country,\r\n productFamily: productFamilyWithSpace, // to determine the email theme being triggered to the customer\r\n billingAddress: {\r\n firstName,\r\n lastName,\r\n addressLine1: billingValues.addressLine1,\r\n addressLine2: billingValues.addressLine1,\r\n city: billingValues.city,\r\n state: billingValues.state || null,\r\n postalCode: billingValues.postalCode || null,\r\n country: billingValues.country,\r\n phoneNumber: ContactPhone,\r\n ccEmails: null,\r\n companyName: companyNameSanitized,\r\n email,\r\n },\r\n companyName: companyNameSanitized,\r\n currency: locationInfo.currency,\r\n // ipAddress can be null because UCS gets it from the network if it's not in the payload\r\n ipAddress: null,\r\n invitationEmailExpiry: null,\r\n taxNumber: billingValues.taxNumber || '',\r\n // federalTaxType: billingValues.federalTaxType || '', // TODO: WAE1-4010: Figure this out. The API doesn't have this field: https://confluence.ops.expertcity.com/display/COM/Create+Account\r\n emailVerificationToken: null,\r\n }\r\n const createUserAction = buyUserActions.createNewUserUCS(userValues)\r\n const userData: CreateAccountResponse = yield call(createUserUcsSaga, createUserAction)\r\n\r\n if (userData) {\r\n userKey = userData.userKey\r\n accountKey = userData.accountKey\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT] = true\r\n yield put(buyCheckoutActions.setAutoLogin(userData.autoLoginTicket))\r\n\r\n // If autoLoginTicket exists, perform silent authentication using hidden iframe\r\n // (autoLoginTicket is null in the case of an existing user performing a cross-product purchase)\r\n if (userData.autoLoginTicket) {\r\n const silentAuthTicket = userData.autoLoginTicket\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n const token: Token = yield call(\r\n authClass.login,\r\n window.location.pathname,\r\n window.location.search,\r\n false,\r\n silentAuthTicket\r\n )\r\n\r\n if (token) {\r\n // Put token in redux store and in localStorage\r\n yield put(buyUserActions.setAccessToken(token))\r\n yield call(saveToken, token)\r\n }\r\n }\r\n }\r\n } else {\r\n // existing user\r\n userKey = existingUserInformation?.UserKey || ''\r\n accountKey = existingUserInformation?.AccountKey || ''\r\n\r\n // #region Update billing info\r\n const billingData: BuyBillingInfoDataType = {\r\n addressLine1: billingValues.addressLine1,\r\n city: billingValues.city,\r\n state: billingValues.state || null,\r\n country: billingValues.country,\r\n postalCode: billingValues.postalCode || null,\r\n firstName,\r\n lastName,\r\n email: billingValues.email,\r\n phoneNumber: ContactPhone,\r\n taxNumber: billingValues.taxNumber || '',\r\n federalTaxType: billingValues.federalTaxType || '',\r\n companyName: companyNameSanitized,\r\n }\r\n\r\n const createBillingInfoAction = buyCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n // #endregion\r\n }\r\n // #endregion\r\n\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n\r\n // #region Save billing info\r\n const token = getTokenFromLocalStorage()!\r\n const promoCode = isCouponValid ? couponServerData?.couponCode : ''\r\n\r\n // Create Cart\r\n const cartItems = items.map((item) => {\r\n const cartItem: CreateV3CartRequestCartItem = {\r\n paymentPlan: TimePeriodBillingPeriodFromBOSSMapper[checkout.billingFrequency],\r\n productFamilyKey: productFamilyWithSpace,\r\n productSku: item.productSku,\r\n quantity: item.quantity,\r\n }\r\n return cartItem\r\n })\r\n const cartRequestData: CreateCartRequest = {\r\n currency: locationInfo.currency,\r\n cartItems,\r\n promoCode,\r\n }\r\n\r\n // TODO: WAE1-4010: Remove this\r\n // const tempObj = {\r\n // // country: locationInfo.country,\r\n // // currency: locationInfo.currency,\r\n // expirationMonth: ExpirationDate.substr(0, 2),\r\n // expirationYear: `20${ExpirationDate.substr(3, 5)}`,\r\n // products: items,\r\n // grossAmount: checkout.calculatedTotal,\r\n // couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n // anniversaryDate: checkout.anniversaryDate,\r\n // }\r\n // console.log(tempObj)\r\n const deleteCartResponse: AxiosResponse = yield call(deleteCart as any, token.access_token, accountKey) // Delete any existing cart and then proceed to create a fresh one\r\n if (!(deleteCartResponse.status === 404 || deleteCartResponse.status === 200))\r\n // 404 - Commerce cart not found, so you're got to create a new cart\r\n throw new Error('Error while invoking DELETE v2/cart') // throw an exception if any other errors in the API\r\n\r\n // TODO: WAE1-4010: Move this part to its own saga with error handling\r\n const createCartResponse: AxiosResponse = yield call(\r\n createCartV3 as any,\r\n token.access_token,\r\n accountKey,\r\n cartRequestData\r\n )\r\n const createCartResponseData = createCartResponse.data\r\n\r\n // Apply promoCode (if any) to the cart\r\n if (promoCode) {\r\n const applyPromoCodeRequestData: ApplyPromoCodeRequest = {\r\n promoCode,\r\n }\r\n const applyPromoCodeResponse: AxiosResponse = yield call(\r\n applyPromoCode as any,\r\n token.access_token,\r\n accountKey,\r\n applyPromoCodeRequestData\r\n )\r\n if (applyPromoCodeResponse.status !== 200) {\r\n // TODO: WAE1-4010: Errror handling?\r\n }\r\n }\r\n\r\n // Setup Transaction\r\n const totalAfterTax = createCartResponseData.cartTotal + checkout.calculatedTax\r\n const transactionProducts = createCartResponseData.cartItems.map((cartItem) => {\r\n const product: SetupTransactionRequestProduct = {\r\n amount: totalAfterTax,\r\n flowName: null,\r\n frequency: cartItem.frequency,\r\n productFamily: cartItem.productFamilyKey,\r\n productSku: cartItem.productSku,\r\n publisherId: null,\r\n quantity: cartItem.quantity,\r\n subscriptionEndDate: null,\r\n transactionType: 'CUSTOMER_ACTION',\r\n }\r\n return product\r\n })\r\n\r\n const successRedirectUrl =\r\n window.location.origin +\r\n window.location.pathname.replace(VIEW_PATH.PATH_CHECKOUT, VIEW_PATH.PATH_CONFIRMATION)\r\n\r\n const setupTransactionRequestData: SetupTransactionRequest = {\r\n quoteId: createCartResponseData.key,\r\n intent: 'PaymentOrPaymentMethodChange',\r\n currencyCode: locationInfo.currency,\r\n targetOrigin: process.env.ONEPAY_SITE_URL!,\r\n amount: checkout.calculatedTotal,\r\n cancelRedirectUrl: window.location.href,\r\n products: transactionProducts,\r\n successRedirectUrl,\r\n taxAmount: checkout.calculatedTax,\r\n }\r\n\r\n // TODO: WAE1-4010: Move this part to its own saga with error handling\r\n const setupTransactionResponse: AxiosResponse = yield call(\r\n setupTransaction as any,\r\n token.access_token,\r\n accountKey,\r\n setupTransactionRequestData\r\n )\r\n const setupTransactionResponseData = setupTransactionResponse.data\r\n\r\n // Save userData.accountKey to sessionStorage so we can retrieve it after coming back from OnePay\r\n // See where it is retrieved in src/products/buy/saga/checkout-form/get-latest-invoice.ts\r\n window.sessionStorage.setItem('accountKey', accountKey)\r\n\r\n // Save setupTransactionResponseData.sessionId to sessionStorage so we can retrieve it after coming back from OnePay\r\n // See where it is retrieved in src/products/buy/saga/checkout-form/get-latest-invoice.ts\r\n transactionSessionId = setupTransactionResponseData.sessionId\r\n window.sessionStorage.setItem('transactionSessionId', transactionSessionId)\r\n\r\n if (steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]) {\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO] = true\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SAVE_BILLING_INFO,\r\n steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - create and save payment method\r\n if (steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: null } },\r\n componentNameConfirmation,\r\n true // true to save to sessionStorage instead of dataLayer for later use on confirmation page which will then push it to the dataLayer\r\n )\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n yield put(buyUserActions.setDisplayName(firstName))\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData: { userEmail: email } },\r\n componentNameConfirmation,\r\n true // true to save to sessionStorage instead of dataLayer for later use on confirmation page which will then push it to the dataLayer\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = plan ?? {}\r\n const marketoData: MarketoUserInfo = makeMarketoObject({\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n planKey,\r\n Street1,\r\n City,\r\n StateCode,\r\n ZipCode,\r\n ContactPhone,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n CompanyName,\r\n })\r\n\r\n // Save marketoData to sessionStorage so we can post it to AWS after coming back from OnePay\r\n // See where it is retrieved from session and posted to AWS in src/products/buy/views/Confirmation/index.tsx\r\n const saveMarketoToSessionStorage = true\r\n yield put(marketingActions.postToMarketo(marketoData, saveMarketoToSessionStorage))\r\n }\r\n\r\n // Redirect to OnePay\r\n const onePayTheme = 'light' // other option is 'dark'\r\n const onePayLocale = getOnePayLocaleFromContentLanguage(contentLanguage)\r\n const onePayUrl = `${process.env.ONEPAY_SITE_URL}/${accountKey}/${transactionSessionId}/pay?locale=${onePayLocale}&theme=${onePayTheme}`\r\n window.location.href = onePayUrl\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n } catch (e) {\r\n console.error(e)\r\n yield put(fatalErrorActions.setFatalError(true, errorMessage))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.SUBMIT_BUY_FORM_UCS, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport commonServices, { EmailType, EmailCheckResponse } from '@common/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { buyFormActions } from '@buy/state/buy-form/actions'\r\n\r\nexport function* existingUserSaga(action: ReturnType) {\r\n const data: EmailType = { emailAddress: action.payload.email.toLowerCase() }\r\n try {\r\n const response: EmailCheckResponse = yield call(commonServices.canUserAuthenticate, data)\r\n if (response && response.data) {\r\n if (response.data.canUserAuthenticate) {\r\n yield put(buyFormActions.setClearEmail(true))\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to verify email' }))\r\n return false\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeExistingUserSaga() {\r\n yield takeEvery(BuyUserActionTypes.CHECK_EXISTING_USER, existingUserSaga)\r\n}\r\n\r\nexport default initializeExistingUserSaga\r\n","import { takeLatest, put, call } from 'redux-saga/effects'\r\n\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport authClass from '@common/utils/auth-class'\r\nimport { saveToken, appInsightsTrackEvent } from '@common/utils'\r\nimport commonServices from '@common/services'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { endSilentAuthFromIFrame } from '@common/utils/silent-auth'\r\n\r\nfunction* getAccessToken() {\r\n try {\r\n yield put(buyUserActions.setVerifyingToken(true))\r\n const newAccessToken: Token | undefined = yield call(authClass.authInit)\r\n // if new token save it\r\n if (newAccessToken) {\r\n // TODO: WAE1-4010: Come back and see if this could be moved elsewhere\r\n // If IsSilentAuth exists in sessionStorage, then the user just completed\r\n // a purchase (as opposed to just clicking Sign In) and silent auth in\r\n // the hidden iframe should have taken place. Which means this code\r\n // is actually being loaded inside the iframe so we need to trigger an\r\n // event in the parent frame to tell it to continue\r\n const isInHiddenSilentAuthIFrame = !!window.sessionStorage.getItem('IsSilentAuth')\r\n if (isInHiddenSilentAuthIFrame) {\r\n endSilentAuthFromIFrame(newAccessToken)\r\n return\r\n }\r\n\r\n yield put(buyUserActions.setAccessToken(newAccessToken))\r\n yield call(saveToken, newAccessToken)\r\n } else {\r\n try {\r\n yield call(commonServices.clearUserSession)\r\n } catch (e: any) {\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n }\r\n yield put(buyUserActions.setIsUserLoggedIn(!!newAccessToken))\r\n // to check if this action ran\r\n yield put(buyUserActions.setVerifyShouldUserLogIn(true))\r\n yield put(buyUserActions.setVerifyingToken(false))\r\n } catch (e: any) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get access token' }))\r\n yield put(buyUserActions.setVerifyingToken(false))\r\n appInsightsTrackEvent(e, { errormessage: e.message })\r\n }\r\n}\r\n\r\nfunction* initializeGetAccessToken() {\r\n yield takeLatest(BuyUserActionTypes.GET_ACCESS_TOKEN, getAccessToken)\r\n}\r\n\r\nexport default initializeGetAccessToken\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport authClass from '@common/utils/auth-class'\r\n\r\nfunction* userLogin(action: ReturnType) {\r\n try {\r\n const pathname = action.payload.pathname || window.location.pathname\r\n const search = action.payload.search || window.location.search\r\n const sso = action.payload.sso || false\r\n yield call(authClass.login, pathname, search, sso)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogin() {\r\n yield takeEvery(BuyUserActionTypes.USER_LOGIN, userLogin)\r\n}\r\n\r\nexport default initializeLogin\r\n","import { call, takeEvery } from 'redux-saga/effects'\r\n\r\nimport { BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport { logout } from '@common/utils'\r\n\r\nfunction* userLogout() {\r\n try {\r\n const { pathname, search } = window.location\r\n yield call(logout, pathname, search)\r\n } catch (e) {\r\n // no error\r\n }\r\n}\r\n\r\nfunction* initializeLogout() {\r\n yield takeEvery(BuyUserActionTypes.USER_LOGOUT, userLogout)\r\n}\r\n\r\nexport default initializeLogout\r\n","import { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { getTokenFromLocalStorage } from '@common/utils'\r\nimport { getInvoiceHistory } from '@buy/services'\r\nimport { AxiosResponse } from 'axios'\r\nimport { InvoiceHistoryResponse, InvoiceHistoryResponseData } from '@buy/state/user/state'\r\n\r\nexport function* getLatestInvoice() {\r\n // Get token from local storage where it was saved set after silent auth before redirecting to OnePay\r\n // See where it was set in src/common/utils/auth-class.ts\r\n const token = getTokenFromLocalStorage()\r\n const userToken = token?.access_token\r\n if (!userToken) {\r\n console.error('Missing token')\r\n return\r\n }\r\n\r\n // Retrieve accountKey from sessionStorage where it was saved before redirecting to OnePay\r\n // See where it was set in src/products/buy/saga/checkout-form/form-submission.ts\r\n const accountKey = window.sessionStorage.getItem('accountKey')\r\n if (!accountKey) {\r\n console.error('Missing accountKey')\r\n return\r\n }\r\n\r\n // Retrieve transactionSessionId from sessionStorage where it was saved before redirecting to OnePay\r\n // See where it was set in src/products/buy/saga/checkout-form/form-submission.ts\r\n const transactionSessionId = window.sessionStorage.getItem('transactionSessionId')\r\n if (!transactionSessionId) {\r\n console.error('Missing transactionSessionId')\r\n return\r\n }\r\n\r\n try {\r\n // Get invoice history\r\n const responseInvoiceHistory: AxiosResponse = yield call(\r\n getInvoiceHistory,\r\n userToken,\r\n accountKey\r\n )\r\n const invoiceHistory = responseInvoiceHistory.data as InvoiceHistoryResponse[]\r\n\r\n // Handle error if no invoices in history\r\n if (!invoiceHistory || invoiceHistory.length === 0) {\r\n console.error('No invoices found')\r\n return\r\n }\r\n\r\n // Get Invoice\r\n // The account's latest invoice will be the first entry in the array\r\n // per documentation: https://confluence.ops.expertcity.com/display/COM/Get+invoice+history\r\n const invoice = invoiceHistory[0]\r\n\r\n // Put the invoice metadata into redux store\r\n yield put(buyCheckoutActions.setInvoice(invoice))\r\n } catch (ex) {\r\n console.error('Error downloading invoice', ex)\r\n }\r\n}\r\n\r\nfunction* initializeGetLatestInvoiceSaga() {\r\n yield takeLatest(BuyCheckoutActionTypes.GET_LATEST_INVOICE, getLatestInvoice)\r\n}\r\n\r\nexport default initializeGetLatestInvoiceSaga\r\n","import { call, put, select, take, takeLatest } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { getTokenFromLocalStorage } from '@common/utils'\r\nimport { fetchInvoiceAsBlob } from '@buy/services'\r\nimport { AxiosResponse } from 'axios'\r\nimport { BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { getCheckoutState } from '@buy/state/selectors'\r\n\r\nexport function* downloadInvoiceSaga() {\r\n // Show loading indicator\r\n yield put(buyCheckoutActions.setDownloadingInvoice(true))\r\n\r\n // Get checkout state so we can check if invoice metadata has been downloaded yet\r\n let checkoutState: BuyCheckoutState = yield select(getCheckoutState)\r\n\r\n // If invoice metadata hasn't finished being downloaded yet, then wait for it to finish\r\n if (checkoutState.invoice == null) {\r\n // Wait for SET_INVOICE to be called after the invoice metadata finishes being\r\n // downloaded since it was already triggered on the page load of the confirmation page.\r\n // See getLatestInvoice() on src/products/buy/views/Confirmation/index.tsx\r\n yield take(BuyCheckoutActionTypes.SET_INVOICE)\r\n\r\n // Get checkout state again so we can retrieve the newly set invoice metadata\r\n checkoutState = yield select(getCheckoutState)\r\n }\r\n\r\n const { invoice } = checkoutState\r\n\r\n // if invoice metadata still isn't populated by this time, something is wrong\r\n if (invoice == null) {\r\n console.error('No invoice loaded')\r\n }\r\n\r\n // Get token from local storage.\r\n // See where it gets set after silent auth in src/common/utils/auth-class.ts\r\n const token = getTokenFromLocalStorage()\r\n const userToken = token?.access_token\r\n if (!userToken) {\r\n console.error('Missing token')\r\n return\r\n }\r\n\r\n // Retrieve accountKey from sessionStorage.\r\n // See where it gets set before redirecting to OnePay in src/products/buy/saga/checkout-form/form-submission.ts\r\n const accountKey = window.sessionStorage.getItem('accountKey')\r\n if (!accountKey) {\r\n console.error('Missing accountKey')\r\n return\r\n }\r\n\r\n const invoiceId = invoice!.invoiceID\r\n\r\n try {\r\n // Fetch the invoice pdf blob contents\r\n const fetchResponse: AxiosResponse = yield call(fetchInvoiceAsBlob, userToken, accountKey, invoiceId)\r\n const blob = fetchResponse.data\r\n\r\n // Get filename ready\r\n const header = fetchResponse.headers['content-disposition']\r\n let filename = 'invoice'\r\n if (header) {\r\n filename = header.split('filename=')?.[1]\r\n filename = filename.replace(/['\"]+/g, '')\r\n filename = filename.split('.')?.[0]\r\n }\r\n\r\n // Prompt to download PDF\r\n const a = document.createElement('a')\r\n a.href = URL.createObjectURL(blob)\r\n a.download = filename\r\n a.click()\r\n a.remove()\r\n } catch (ex) {\r\n console.error('Error downloading invoice', ex)\r\n } finally {\r\n // Hide loading indicator\r\n yield put(buyCheckoutActions.setDownloadingInvoice(false))\r\n }\r\n}\r\n\r\nfunction* initializeDownloadInvoiceSaga() {\r\n yield takeLatest(BuyCheckoutActionTypes.DOWNLOAD_INVOICE, downloadInvoiceSaga)\r\n}\r\n\r\nexport default initializeDownloadInvoiceSaga\r\n","import { select, put, takeLeading, call } from 'redux-saga/effects'\r\nimport queryString from 'query-string'\r\nimport { loadSessionState, loadState } from '@buy/utils'\r\nimport { BuyCheckoutActionTypes, buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { getPlanData } from '@buy/state/selectors'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuySavedSessionState, BuySavedStoreState } from '@buy/state/checkout/state'\r\nimport { getCurrentAddons } from '@buy/utils/get-current-addons'\r\nimport { BuyAddon } from '@buy/state/add-on'\r\nimport { buyCouponActions } from '@buy/state/coupon/actions'\r\nimport { contentActions } from '@common/state/content/actions'\r\nimport { ADDONS } from '@buy/constants'\r\n\r\nfunction* loadSavedStateSaga() {\r\n try {\r\n const savedState: BuySavedStoreState | undefined = yield call(loadState)\r\n const savedSessionState: BuySavedSessionState | undefined = yield call(loadSessionState)\r\n // const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const {\r\n // billingFrequency: queryBillingFrequency,\r\n minUsers,\r\n couponCode: queryCouponCode,\r\n } = queryString.parse(window.location.search)\r\n // grab url param for billing frequecy or saved one\r\n\r\n // const preselectedBillingFrequency = queryBillingFrequency || savedState?.checkout?.billingFrequency\r\n // if min users was passed via url or saved in the store\r\n const preselectedMinUsers = Number(minUsers) || savedState?.checkout?.organizers\r\n // TODO: load based on product\r\n // grab url param for couponCode first and if not available go for saved one\r\n let preSavedCouponCode = (queryCouponCode as string) || savedSessionState?.coupon?.urlCouponCode\r\n // try to apply coupon code and also save the coupon code in state\r\n preSavedCouponCode = preSavedCouponCode || ''\r\n yield put(buyCouponActions.setUrlCouponCode(preSavedCouponCode))\r\n yield put(contentActions.setLanguage(savedSessionState?.language || ''))\r\n\r\n // if the value of the preselected frequency is an acceptable value and is not the same\r\n // as what is already saved, update it\r\n\r\n // Something no longer used\r\n // if (\r\n // (preselectedBillingFrequency === TimePeriod.Month || preselectedBillingFrequency === TimePeriod.Year) &&\r\n // preselectedBillingFrequency !== checkout.billingFrequency\r\n // ) {\r\n // yield put(buyCheckoutActions.setBillingFrequency(preselectedBillingFrequency))\r\n // }\r\n\r\n if (preselectedMinUsers) {\r\n yield put(buyCheckoutActions.setOrganizers(preselectedMinUsers))\r\n }\r\n // grab url param for plan or saved in store\r\n // if (urlPlan) {\r\n // const preselectedPlan = urlPlan.replace(/-/g, ' ')\r\n // // check if plan name is different\r\n // if (\r\n // urlPlan &&\r\n // urlPlan?.toLowerCase() !== (plan.shortName?.toLowerCase() || plan.name?.toLowerCase())\r\n // ) {\r\n // // make sure plan exists in the plans data api call\r\n // // const foundPlan = plan.find(\r\n // // (pln: BuyPlan) =>\r\n // // (pln.shortName?.toLocaleLowerCase() || pln.name?.toLocaleLowerCase()) ===\r\n // // preselectedPlan.toLowerCase()\r\n // // )\r\n // const foundPlan =\r\n // plan.shortName?.toLocaleLowerCase() ||\r\n // plan.name?.toLocaleLowerCase() === preselectedPlan.toLowerCase()\r\n // ? plan\r\n // : null\r\n // if (foundPlan) {\r\n // yield put(buyCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n // }\r\n // }\r\n // } else\r\n // if (savedState?.checkout?.selectedPlanSku) {\r\n // // make sure plan exists in the plans data api call\r\n // // const foundPlan = plan.find((pln: BuyPlan) => pln.sKU === savedState?.checkout?.selectedPlanSku)\r\n // const foundPlan = plan.sKU === savedState?.checkout?.selectedPlanSku ? plan : null\r\n // if (foundPlan) {\r\n // yield put(buyCheckoutActions.setSelectedPlan(foundPlan.sKU))\r\n // }\r\n // }\r\n // else if (!savedState?.checkout?.selectedPlanSku) {\r\n // // if no plan is selected, default to useNewBuySkus ? v2 plan : first plan\r\n // yield put(buyCheckoutActions.setSelectedPlan(plan?.[1]?.sKU ?? 0))\r\n // }\r\n\r\n if (savedState) {\r\n const { selectedAddons } = savedState.checkout\r\n\r\n // const plan: BuyPlan = yield select(getPlanData)\r\n // if a plan was selected\r\n if (plan.name) {\r\n // find matching addon in the plan from preselected addon\r\n const foundAddons: BuyAddon[] = yield call(getCurrentAddons, selectedAddons, plan)\r\n yield put(buyCheckoutActions.setSelectedAddons(foundAddons))\r\n // find and update Agent addon quantity\r\n const agentAddons = foundAddons.find((addon) => addon.sKU.includes(ADDONS.AGENT))\r\n if (agentAddons) {\r\n yield put(buyCheckoutActions.setAgents(agentAddons.quantity + plan.userAgentsIncludedAmount))\r\n }\r\n // find and update Endpoint addon quantity\r\n const endPointAddons = foundAddons.find(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (endPointAddons) {\r\n yield put(\r\n buyCheckoutActions.setEndpoints(\r\n endPointAddons.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL + plan.endpointsIncludedAmount\r\n )\r\n )\r\n }\r\n // find and update extra addon selection\r\n const extraAddons = foundAddons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n if (extraAddons) {\r\n yield put(buyCheckoutActions.setExtraAddons(extraAddons))\r\n }\r\n }\r\n }\r\n yield put(buyCheckoutActions.setSavedStateLoaded(true, 'saved state saga'))\r\n } catch (e) {\r\n // fail silently\r\n }\r\n}\r\n\r\nfunction* initializeLoadSavedStateSaga() {\r\n yield takeLeading(BuyCheckoutActionTypes.GET_SAVED_STATE, loadSavedStateSaga)\r\n}\r\n\r\nexport default initializeLoadSavedStateSaga\r\n","import { call, takeLatest, select, put, delay } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { BuyCalculatePriceDataType, BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport buyServices from '@buy/services'\r\nimport { getBillingValues } from '@buy/utils/get-billing-values'\r\nimport { getCartItems } from '@buy/utils/get-item-values'\r\nimport { getSelectedAddons } from '@buy/saga/content/content-helpers'\r\nimport { getCheckoutState, getCouponState, getUserState, getPlanData } from '@buy/state/selectors'\r\nimport { getLocationState, getAccountState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { BUY_TYPE, BUY_TRACKING_COMPONENTS, BUY_USER_TYPES } from '@buy/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { BuyUserState } from '@buy/state/user/state'\r\nimport { BuyAddon } from '@buy/state/add-on'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyCalculatePriceAPIData, BuyCalculatePriceAPIReturnType } from '@buy/state/calculate-price'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { getTotalProratedAmount, getTotalVolumeDiscount, getSubscriptionInfo } from '@buy/utils'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\n\r\nexport function* calculatePriceSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CALCULATE_PRICE_SAGA\r\n try {\r\n yield put(buyCheckoutActions.setTotalLoading(true))\r\n yield delay(1000)\r\n const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const { userType, existingBillingInformation }: BuyUserState = yield select(getUserState)\r\n const { values } = action.payload\r\n const planData: BuyPlan = yield select(getPlanData)\r\n const selectedPlan = planData\r\n const selectedAddons: BuyAddon[] = yield call(getSelectedAddons)\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied } = coupon\r\n const isCouponValid = isCouponValidAndApplied && coupon.couponServerData && !isEmpty(coupon.couponServerData)\r\n\r\n if (userType === BUY_USER_TYPES.ADDON) {\r\n values.Street1 = existingBillingInformation?.addressLine1 || ''\r\n values.City = existingBillingInformation?.city || ''\r\n values.CountryCode = existingBillingInformation?.country || ''\r\n values.Email = existingBillingInformation?.email || ''\r\n values.FirstName = existingBillingInformation?.firstName || ''\r\n values.LastName = existingBillingInformation?.lastName || ''\r\n values.ZipCode = existingBillingInformation?.postalCode || ''\r\n values.StateCode = existingBillingInformation?.state || ''\r\n values.TaxNumber = existingBillingInformation?.taxNumber || ''\r\n values.TaxType = existingBillingInformation?.federalTaxType || ''\r\n }\r\n\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n if (!subscriptionInfo.isReplacementBooking && !selectedAddons.length) {\r\n yield put(buyCheckoutActions.setTotalLoading(false))\r\n yield put(buyCheckoutActions.setCalculatedPrice([], 0, 0, 0, 0, ''))\r\n yield put(buyCheckoutActions.setProratedAmount(0))\r\n return\r\n }\r\n const calculatePriceValues: BuyCalculatePriceDataType = {\r\n address: getBillingValues(values),\r\n currency: locationInfo.currency,\r\n couponCode: isCouponValid ? coupon.couponServerData?.couponCode : '',\r\n cart: getCartItems(\r\n checkout.baseLine,\r\n checkout.additionalLines,\r\n checkout.addonLines,\r\n subscriptionInfo,\r\n checkout.billingTenure.selected\r\n ),\r\n // getPaymentItems(selectedPlan, 1, checkout.billingFrequency, selectedAddons, subscriptionInfo),\r\n }\r\n\r\n const calculatePriceCreation: BuyCalculatePriceAPIReturnType = yield call(\r\n buyServices.calculatePrice,\r\n calculatePriceValues\r\n )\r\n if (calculatePriceCreation && calculatePriceCreation.data) {\r\n const {\r\n errorMessages,\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n anniversaryDate,\r\n creditback,\r\n }: BuyCalculatePriceAPIData = calculatePriceCreation.data\r\n if (isEmpty(errorMessages)) {\r\n yield put(\r\n buyCheckoutActions.setCalculatedPrice(\r\n productPrices,\r\n netAmount,\r\n grossAmount,\r\n taxAmount,\r\n creditback,\r\n anniversaryDate === null ? '' : (anniversaryDate as string)\r\n )\r\n )\r\n // since the selected plan has an item id of 0 is the product prices array, we need to get the first item from productPrice\r\n // check getPaymentItems function above for more info\r\n const [planProductPrice] = productPrices.filter((productPrice) => productPrice.itemId === 0)\r\n const { volumeDiscount } = planProductPrice\r\n if (volumeDiscount) {\r\n const { amount } = volumeDiscount\r\n const calculatedVolumeDiscount: number = yield call(getTotalVolumeDiscount, amount, 1, false)\r\n\r\n yield put(buyCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(calculatedVolumeDiscount))\r\n }\r\n\r\n // if add-on user, calculate the prorated amount\r\n if (userType === BUY_USER_TYPES.ADDON) {\r\n const calculatedProratedAmount = getTotalProratedAmount(productPrices)\r\n yield put(buyCheckoutActions.setProratedAmount(calculatedProratedAmount))\r\n }\r\n } else {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: {\r\n errorMessage: 'Sorry we are having trouble applying your credit',\r\n buyType:\r\n subscriptionInfo.isTrial || !subscriptionInfo.plan\r\n ? BUY_TYPE.DIRECT_BUY\r\n : BUY_TYPE.ADDON,\r\n plan: checkout.billingTenure.selected,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(modalActions.setErrorModal('Unable to get price data'))\r\n }\r\n }\r\n yield put(buyCheckoutActions.setTotalLoading(false))\r\n } catch {\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.ERROR_PURCHASE, eventData: { errorMessage: 'error in calculating price' } },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'error in calculating price' }))\r\n yield put(buyCheckoutActions.setTotalLoading(false))\r\n }\r\n}\r\n\r\nfunction* initializeCalculatePriceSaga() {\r\n yield takeLatest(BuyCheckoutActionTypes.CALCULATE_PRICE, calculatePriceSaga)\r\n}\r\n\r\nexport default initializeCalculatePriceSaga\r\n","import { call, takeEvery, put } from 'redux-saga/effects'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { savePayment } from '@buy/services'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* createPaymentSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.CREATE_PAYMENT_SAGA\r\n try {\r\n const { paymentValues } = action.payload\r\n const savePaymentResponse: GenericResponse = yield call(savePayment, paymentValues)\r\n if (savePaymentResponse.status === 200 || savePaymentResponse.status === 204) {\r\n return true\r\n }\r\n } catch {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to save payment info' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to save payment info' }))\r\n }\r\n return false\r\n}\r\n\r\nfunction* initializeCreatePaymentSaga() {\r\n yield takeEvery(BuyCheckoutActionTypes.CREATE_PAYMENT, createPaymentSaga)\r\n}\r\n\r\nexport default initializeCreatePaymentSaga\r\n","import { call, put, takeEvery } from 'redux-saga/effects'\r\nimport { BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { getAvailablePaymentMethods } from '@buy/services'\r\nimport { BuyPaymentDataReturnType } from '@buy/state/checkout/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\n\r\nexport function* getAvailablePaymentMethodsSaga() {\r\n const componentName = BUY_TRACKING_COMPONENTS.GET_AVAILABLE_PAYMENT_METHODS_SAGA\r\n try {\r\n const paymentMethodsCreation: GenericResponse = yield call(getAvailablePaymentMethods)\r\n if (paymentMethodsCreation.data) {\r\n const paymentData: BuyPaymentDataReturnType[] = paymentMethodsCreation.data\r\n return paymentData\r\n }\r\n } catch (e) {\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.ERROR_PURCHASE,\r\n eventData: { errorMessage: 'failed to get available payment methods' },\r\n },\r\n componentName\r\n )\r\n )\r\n yield put(\r\n fatalErrorActions.setFatalError(true, { trackErrorMessage: 'failed to get available payment methods' })\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction* initializeGetAvailablePaymentMethodsSaga() {\r\n yield takeEvery(BuyCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS, getAvailablePaymentMethodsSaga)\r\n}\r\n\r\nexport default initializeGetAvailablePaymentMethodsSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyUserActions, BuyUserActionTypes } from '@buy/state/user/actions'\r\nimport commonServices, {\r\n verifyUser,\r\n getBillingSubscriptions,\r\n getBillingInfo,\r\n getExistingPaymentDetails,\r\n getIdentityUserMe,\r\n GetIdentityUserMeResponseData,\r\n} from '@common/services'\r\nimport { getContentData, getLabelContent, getProductSettingsData, getUserState } from '@buy/state/selectors'\r\nimport { authClass, processExistingBillingInfo } from '@common/utils'\r\nimport { trackAbandonForm } from '@buy/utils'\r\nimport { BuyUserState } from '@buy/state/user/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { buyFormActions } from '@buy/state/buy-form/actions'\r\nimport { BuyFormData } from '@buy/state/buy-form/state'\r\nimport { TimePeriod, BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, COUNTRIES } from '@common/constants'\r\nimport { LabelContent } from '@buy/state/label-content'\r\nimport { BUY_USER_TYPES, BUY_USER_TYPES_RESPONSE, CHECKOUTFORM_FIELDS } from '@buy/constants'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { isEmpty, partition } from 'lodash-es'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { accountActions } from '@common/state/account/actions'\r\nimport { getCountryFromCookie, setCountryInCookie } from '@common/utils/cookie-utils'\r\nimport { GenericResponse } from '@common/state/generic-response/generic-response'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { ProductSettings } from '@buy/state/product-settings'\r\nimport { AxiosResponse } from 'axios'\r\n\r\nfunction* userLoggedInSaga() {\r\n try {\r\n const productSettings: ProductSettings = yield select(getProductSettingsData)\r\n yield put(buyUserActions.setLoadingExistingInformation(true))\r\n const {\r\n loggedIn: { accessToken },\r\n }: BuyUserState = yield select(getUserState)\r\n const { paymentMethodErrorMessage, disabledUserError }: LabelContent = yield select(getLabelContent)\r\n const { marketoProductName }: BuyContentData = yield select(getContentData)\r\n\r\n // clear previous session on the server\r\n yield call(commonServices.clearUserSession)\r\n // get user info\r\n // eslint-disable-next-line camelcase\r\n const response: GenericResponse = yield call(verifyUser, accessToken?.access_token || '', marketoProductName)\r\n if (response && !isEmpty(response.data)) {\r\n const {\r\n User: { UserName, Name, UserKey },\r\n AccountKey,\r\n isBanned,\r\n hasGroupSubscription,\r\n } = response.data\r\n\r\n if (hasGroupSubscription) {\r\n trackAbandonForm()\r\n window.location.href = productSettings.adminUrl\r\n }\r\n\r\n const userInfo: ExistingUserInfoType = {\r\n UserName,\r\n Name,\r\n UserKey,\r\n AccountKey,\r\n }\r\n\r\n const isSameAsAccount = sessionStorage.getItem('useSameForBilling') !== 'false'\r\n const buyFormData: BuyFormData = {\r\n FirstName: Name?.GivenName,\r\n LastName: Name?.FamilyName,\r\n Email: UserName,\r\n Street1: '',\r\n City: '',\r\n ZipCode: '',\r\n StateCode: '',\r\n CountryCode: getCountryFromCookie() || COUNTRIES.US,\r\n ContactPhone: '',\r\n Password: '',\r\n BillingFirstName: !isSameAsAccount\r\n ? sessionStorage.getItem(CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME)\r\n : Name?.GivenName,\r\n BillingLastName: !isSameAsAccount\r\n ? sessionStorage.getItem(CHECKOUTFORM_FIELDS.BILLING_LAST_NAME)\r\n : Name?.FamilyName,\r\n ExpirationDate: '',\r\n TaxNumber: '',\r\n TaxType: '',\r\n CompanyName: '',\r\n }\r\n\r\n // return error message if user is banned\r\n if (isBanned === true) {\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.BANNED))\r\n yield put(buyUserActions.setLoadingExistingInformation(false))\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n { fatalErrorMessage: disabledUserError, trackErrorMessage: disabledUserError },\r\n true\r\n )\r\n )\r\n return\r\n }\r\n\r\n // USER_IDENTITY_NOT_FOUND implies that user has neither boss nor identity account\r\n // This is the state returned when a token has been invalidated, I dont know\r\n // if there is another use case or not\r\n if (response.data.Code === BUY_USER_TYPES_RESPONSE.USER_IDENTITY_NOT_FOUND) {\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.NEW))\r\n yield put(buyUserActions.userLogout())\r\n return\r\n }\r\n\r\n // If ecommapi did not send back the CIP Account Key, then get it from the Identity endpoint\r\n try {\r\n const cipAccountKeyFromEcommApi =\r\n response.data.User?.SCIMSchemasExtensionGetGo1?.accounts?.[0]?.value ?? null\r\n if (!cipAccountKeyFromEcommApi) {\r\n const identityUserMeResponse: AxiosResponse = yield call(\r\n getIdentityUserMe,\r\n accessToken?.access_token || ''\r\n )\r\n\r\n // Try to get the CIP AccountKey from the first account listed. If it isn't there, fallback to null\r\n const cipAccountKeyFromIdentity =\r\n identityUserMeResponse.data['urn:scim:schemas:extension:getgo:1.0']?.accounts?.[0]?.value ??\r\n null\r\n\r\n if (cipAccountKeyFromIdentity) {\r\n userInfo.AccountKey = cipAccountKeyFromIdentity\r\n }\r\n }\r\n } catch (e) {\r\n console.error('Error determining Account Key', e)\r\n }\r\n\r\n // set up and display existing user account information\r\n yield put(buyUserActions.setExistingUserInformation(userInfo))\r\n\r\n // USER_BOSS_NOT_FOUND implies that user has an identity account\r\n if (response.data.Code === BUY_USER_TYPES_RESPONSE.USER_BOSS_NOT_FOUND) {\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.IDENTITY_ONLY))\r\n yield put(buyFormActions.updateInitialFormState(buyFormData))\r\n yield put(buyUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // #region attempt to set up existing billing info\r\n const billingInfoRequest: GenericResponse = yield call(getBillingInfo)\r\n if (billingInfoRequest && !isEmpty(billingInfoRequest.data)) {\r\n // We get company name same as the email without the `@` in case we don't provide in the first place.\r\n // This is a known behavior for GTC. So, we check for GTR, we check if that's what we got and don't show the value\r\n const { email, companyName } = billingInfoRequest.data\r\n if (email.replace('@', '').replace('_', '') === companyName) {\r\n billingInfoRequest.data.companyName = ''\r\n }\r\n\r\n const processedBillingData = processExistingBillingInfo(billingInfoRequest.data)\r\n const billingInfo: ExistingBillingInfoType = processedBillingData\r\n const currentCountry = getCountryFromCookie() || COUNTRIES.US\r\n\r\n if (billingInfo.state === 'XX') {\r\n billingInfo.state = ''\r\n yield put(buyFormActions.setStatesOptional(true))\r\n }\r\n\r\n // If address IS set, but GeoIP is different from existing user country,\r\n // reload such that buy form country matches that of GeoIP cookie\r\n if (billingInfo.addressLine1) {\r\n if (billingInfo.country !== currentCountry) {\r\n setCountryInCookie(billingInfo.country)\r\n window.location.reload()\r\n }\r\n } else {\r\n billingInfo.country = currentCountry\r\n }\r\n\r\n billingInfo.firstName = Name?.GivenName\r\n billingInfo.lastName = Name?.FamilyName\r\n buyFormData.Street1 = billingInfo.addressLine1\r\n buyFormData.City = billingInfo.city\r\n buyFormData.CountryCode = billingInfo.country\r\n buyFormData.ZipCode = billingInfo.postalCode\r\n buyFormData.StateCode = billingInfo.state\r\n buyFormData.ContactPhone = billingInfo.phoneNumber\r\n buyFormData.TaxNumber = billingInfo.taxNumber || ''\r\n buyFormData.TaxType = billingInfo.federalTaxType || ''\r\n\r\n // all five fields must contain values in order to set existing billing information\r\n if (buyFormData.Street1 && buyFormData.City && buyFormData.CountryCode && buyFormData.ZipCode) {\r\n yield put(buyUserActions.setExistingBillingInformation(billingInfo))\r\n }\r\n }\r\n yield put(buyFormActions.updateInitialFormState(buyFormData))\r\n // #endregion\r\n\r\n // #region attempt to set up existing payment info\r\n const paymentInfoRequest: GenericResponse = yield call(getExistingPaymentDetails)\r\n if (paymentInfoRequest && !isEmpty(paymentInfoRequest.data)) {\r\n const currentDate = new Date()\r\n const currentYear = currentDate.getFullYear()\r\n const currentMonth = currentDate.getMonth()\r\n const ccInfo = paymentInfoRequest.data[0].creditCard\r\n if (\r\n ccInfo.expirationYear < currentYear ||\r\n (ccInfo.expirationYear === currentYear && ccInfo.expirationMonth < currentMonth)\r\n ) {\r\n yield put(\r\n fatalErrorActions.setFatalError(\r\n true,\r\n {\r\n fatalErrorMessage: paymentMethodErrorMessage,\r\n trackErrorMessage: paymentMethodErrorMessage,\r\n },\r\n true\r\n )\r\n )\r\n }\r\n const paymentInfo: ExistingPaymentInfoType = {\r\n last4Digits: ccInfo.last4Digits,\r\n }\r\n yield put(buyUserActions.setExistingPaymentDetails(paymentInfo))\r\n }\r\n // #endregion\r\n\r\n // if subscription is empty, mark as expired-user\r\n const subscriptionRequest: GenericResponse = yield call(getBillingSubscriptions)\r\n if (isEmpty(subscriptionRequest?.data)) {\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.EXPIRED))\r\n yield put(buyUserActions.setLoadingExistingInformation(false))\r\n return\r\n }\r\n\r\n // set account subscription state\r\n yield put(accountActions.setAccountSubscriptions(subscriptionRequest.data))\r\n\r\n // partition subscriptions into two arrays - one for GTC and another for GTR\r\n const [buySubscriptions] = partition(subscriptionRequest.data, (plan: BillingDetailedSubscriptionPlan) => {\r\n // TODO: load based on product\r\n const productGroupNameTrimmed = plan.productGroupName.replaceAll(' ', '')\r\n return productSettings.productFamily === productGroupNameTrimmed\r\n })\r\n const buyTrialSubscription = buySubscriptions.find(\r\n (plan: BillingDetailedSubscriptionPlan) => plan.planType === PRODUCT_TYPES.TRIAL\r\n )\r\n\r\n // #region determine buy flow user state\r\n const selectedPlan = buySubscriptions?.find((plan: BillingDetailedSubscriptionPlan) => {\r\n return (\r\n plan.productSku === PRODUCT_SKU.G2RE_BASIC_NAMED ||\r\n plan.productSku === PRODUCT_SKU.G2RE_STANDARD_NAME ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_ACCESS ||\r\n plan.productSku === PRODUCT_SKU.GTR_STANDARD_NAMED_V2 ||\r\n plan.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS\r\n )\r\n })\r\n if (selectedPlan) {\r\n const {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n planType,\r\n } = selectedPlan ?? {}\r\n\r\n const overallQuantity = buySubscriptions.reduce(\r\n (accumulator: number, subItem: ExistingAccountInfoType) => {\r\n if (subItem.productSku === productSku) {\r\n return accumulator + subItem.quantity\r\n }\r\n return accumulator\r\n },\r\n 0\r\n )\r\n\r\n const accountInfo: ExistingAccountInfoType = {\r\n productName,\r\n paymentPlan,\r\n startDate,\r\n endDate,\r\n currency,\r\n renewalPrice,\r\n autorenew,\r\n productSku,\r\n subscriptionId,\r\n status,\r\n quantity: overallQuantity,\r\n planType,\r\n }\r\n\r\n yield put(buyUserActions.setExistingAccountInformation(accountInfo))\r\n // yield put(buyCheckoutActions.setSelectedPlan(productSku))\r\n yield put(\r\n buyCheckoutActions.setBillingFrequency(\r\n paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n )\r\n )\r\n // if user already has the selected plan, mark as add-on flow\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.ADDON))\r\n yield put(buyCheckoutActions.setSelectedAddons([]))\r\n } else if (buyTrialSubscription) {\r\n // otherwise, if user has any GTResolve trial subscription, mark as trialer\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.TRIALER))\r\n } else {\r\n // otherwise, since user has at least one subscription, mark as cross product\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.CROSSPRODUCT))\r\n }\r\n // #endregion\r\n\r\n yield put(buyUserActions.setLoadingExistingInformation(false))\r\n }\r\n } catch (e) {\r\n yield put(buyUserActions.setUserType(BUY_USER_TYPES.NEW))\r\n yield put(buyUserActions.setLoadingExistingInformation(false))\r\n yield call(authClass().logout)\r\n }\r\n}\r\n\r\nfunction* initializeLoggedInSaga() {\r\n yield takeEvery(BuyUserActionTypes.GET_LOGGED_IN_USER_STATE, userLoggedInSaga)\r\n}\r\n\r\nexport default initializeLoggedInSaga\r\n","import { call, takeEvery, put, select, take } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@buy/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { BuySubmitDataType, BuyCheckoutState, BuyPaymentDataReturnType } from '@buy/state/checkout/state'\r\nimport { getCartItems } from '@buy/utils/get-item-values'\r\nimport {\r\n getCheckoutState,\r\n getUserState,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n getProductSettingsData,\r\n} from '@buy/state/selectors'\r\nimport { ProductSettings } from '@buy/state/product-settings'\r\nimport { getLocationState, getAccountState, getFlexState } from '@common/state/selectors'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport { BuyAbandonedCartDataType, BuyUserState } from '@buy/state/user/state'\r\nimport { ExistingUserInfoType, ExistingBillingInfoType } from '@common/state/user/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { buyUserActions } from '@buy/state/user/actions'\r\nimport { clearState, getSubscriptionInfo } from '@buy/utils'\r\nimport { flexFormSaga } from '@common/sagas/flex/get-flex-token'\r\nimport { FlexState } from '@common/state/flex/state'\r\nimport { flexActions, FlexActionTypes } from '@common/state/flex/actions'\r\nimport { FlexTokenDataType } from '@common/services'\r\nimport { FATAL_ERROR_TYPE } from '@common/state/fatal-error/state'\r\nimport { BuySubmitPaymentResponseData } from '@buy/state/submit-payment/state'\r\nimport { abandonedCartSaga } from '@buy/saga/user/abandoned-cart'\r\nimport { submitPaymentSaga } from './submit-payment'\r\nimport { getAvailablePaymentMethodsSaga } from './get-payment-methods'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\ndeclare const Cardinal: any\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN, steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_BILLING_INFO, steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO, steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO])\r\n )\r\n const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const { productPortalUrl }: ProductSettings = yield select(getProductSettingsData)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: BuyUserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: BuyContentData =\r\n yield select(getContentData)\r\n\r\n const planData: BuyPlan = yield select(getPlanData)\r\n const selectedPlan: BuyPlan = planData\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponServerData } = coupon\r\n // const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, planData)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const { CompanyName } = action.payload.values\r\n\r\n try {\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n // #region if CompanyName is provided, update billing info\r\n if (CompanyName && userState.existingBillingInformation) {\r\n const { country, firstName, lastName, email, taxNumber, federalTaxType } =\r\n userState.existingBillingInformation\r\n const billingData = {\r\n addressLine1,\r\n city,\r\n state: stateCode,\r\n country,\r\n postalCode,\r\n firstName,\r\n lastName,\r\n email,\r\n phoneNumber,\r\n taxNumber: taxNumber || '',\r\n federalTaxType: federalTaxType || '',\r\n companyName: CompanyName,\r\n }\r\n\r\n const createBillingInfoAction = buyCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n }\r\n // #endregion\r\n\r\n const items = getCartItems(\r\n checkout.baseLine,\r\n checkout.additionalLines,\r\n checkout.addonLines,\r\n subscriptionInfo,\r\n checkout.billingTenure.selected\r\n )\r\n\r\n // #region attempt to retrieve SCA token to determine Cardinal challenge is required or not\r\n const flexTokenData: FlexTokenDataType = {\r\n currency: locationInfo.currency,\r\n country: locationInfo.country,\r\n targetOrigin: window.location.origin,\r\n skipSca: false,\r\n }\r\n yield call(flexFormSaga, flexActions.getFlexToken(flexTokenData, 0))\r\n const { keyInfo }: FlexState = yield select(getFlexState)\r\n const isScaEnabledForMid = keyInfo?.scaToken?.isScaEnabledForMid\r\n if (isScaEnabledForMid) {\r\n // wait for Cardinal script is completely loaded before proceeding to next line of code\r\n yield take(FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE)\r\n }\r\n // #endregion\r\n\r\n // #region get available payment menthods\r\n let paymentMethodKey = ''\r\n const getAvailablePaymentData: BuyPaymentDataReturnType[] = yield call(getAvailablePaymentMethodsSaga)\r\n if (getAvailablePaymentData && getAvailablePaymentData[0]) {\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n paymentMethodKey = getAvailablePaymentData[0].paymentMethodKey\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n // #endregion\r\n // #region process purchase - 1st purchase call\r\n let paymentKey = ''\r\n let isChallengeRequired = false\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n const submitValues: BuySubmitDataType = {\r\n currency: locationInfo.currency,\r\n paymentMethodKey,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n cardinalJwt: keyInfo?.scaToken?.tokenString,\r\n isScaCompleted: false,\r\n isWithCardAddAfterSca: false,\r\n }\r\n const submitPaymentAction = buyCheckoutActions.submitPayment(submitValues)\r\n const submitData: BuySubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n\r\n isChallengeRequired = submitData?.scaResult?.isScaRequired || false\r\n paymentKey = submitData?.scaResult?.paymentKey\r\n\r\n const payerAuthEnrollment = submitData?.scaResult?.payerAuthEnrollment\r\n if (isChallengeRequired && payerAuthEnrollment) {\r\n // if Cardinal challenge is required, prompt challenge modal\r\n const { acsUrl, paReq, authenticationTransactionId } = payerAuthEnrollment\r\n Cardinal.continue(\r\n 'cca',\r\n {\r\n AcsUrl: acsUrl,\r\n Payload: paReq,\r\n },\r\n {\r\n OrderDetails: {\r\n TransactionId: authenticationTransactionId,\r\n },\r\n }\r\n )\r\n yield put(\r\n buyTrackingActions.track(\r\n {\r\n event: TRACKING_EVENTS.CARDINAL_SECURITY_MODAL,\r\n eventData: {\r\n securityModalAction: TRACKING_EVENTS.CARDINAL_INITIATED,\r\n },\r\n },\r\n componentName\r\n )\r\n )\r\n\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE] = true\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE,\r\n steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]\r\n )\r\n )\r\n } else {\r\n // otherwise if challenge is NOT required, payment process is complete. Proceed to post-submit_payment steps\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.SUBMIT_PAYMENT,\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]\r\n )\r\n )\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region process purchase - 2nd purchase call\r\n if (steps[CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]) {\r\n // wait for cardinal challenge to be defeated\r\n yield take(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT)\r\n const { cardinalChallengeCompleteJwt }: FlexState = yield select(getFlexState)\r\n\r\n const submitValues: BuySubmitDataType = {\r\n currency: locationInfo.currency,\r\n products: items,\r\n grossAmount: checkout.calculatedTotal,\r\n couponCode: isCouponValid ? couponServerData?.couponCode : '',\r\n anniversaryDate: checkout.anniversaryDate,\r\n referenceId: keyInfo?.scaToken?.referenceId,\r\n isScaCompleted: true,\r\n isWithCardAddAfterSca: false,\r\n cardinalJwt: cardinalChallengeCompleteJwt,\r\n paymentKey,\r\n paymentMethodKey,\r\n }\r\n\r\n const submitPaymentAction = buyCheckoutActions.submitPayment(submitValues)\r\n const submitData: BuySubmitPaymentResponseData = yield call(submitPaymentSaga, submitPaymentAction)\r\n if (submitData) {\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: submitData.invoiceNumber } },\r\n componentName\r\n )\r\n )\r\n }\r\n\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n const abandonedCartData: BuyAbandonedCartDataType = {\r\n email: UserName,\r\n success: true,\r\n }\r\n\r\n // Use \"call\" instead of \"put\" to 1) avoid the debounce and 2) wait for the promise to finish before proceeding\r\n const abandonCartAction = buyUserActions.submitAbandonedCart(abandonedCartData)\r\n yield call(abandonedCartSaga, abandonCartAction)\r\n\r\n yield put(buyTrackingActions.track({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW }, componentName))\r\n if (submittoMarketo) {\r\n const { planKey } = planData ?? {}\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n company: CompanyName,\r\n // TODO: Add unified varaible\r\n }\r\n yield put(marketingActions.postToMarketo(marketoData))\r\n }\r\n // delete saved state\r\n yield call(clearState)\r\n yield put(buyCheckoutActions.setAddonComplete(true))\r\n\r\n // Redirect to product portal\r\n window.location.href = productPortalUrl || 'about:blank?errorMessage=missing_product_portal_url'\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'existing user form submission failed',\r\n fatalErrorType: isScaEnabledForMid ? FATAL_ERROR_TYPE.CARDINAL_PAYMENT : undefined,\r\n })\r\n )\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { call, takeEvery, put, select } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@buy/state/buy-form/actions'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { BuyBillingInfoDataType, BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { getCartItems } from '@buy/utils/get-item-values'\r\nimport { getCheckoutState, getUserState, getContentData, getCouponState, getPlanData } from '@buy/state/selectors'\r\nimport { getLocationState, getAccountState } from '@common/state/selectors'\r\nimport { MarketoUserInfo } from '@common/state/marketing/state'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { CHECKOUTFORM_STEPS, BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { TimePeriodBillingPeriodFromBOSSMapper, TRACKING_EVENTS, VIEW_PATH } from '@common/constants'\r\nimport { buyTrackingActions } from '@buy/state/tracking/actions'\r\nimport {\r\n ApplyPromoCodeRequest,\r\n BuyUserState,\r\n CreateCartRequest,\r\n CreateV3CartRequestCartItem,\r\n CreateCartResponse,\r\n SetupTransactionRequest,\r\n SetupTransactionRequestProduct,\r\n SetupTransactionResponse,\r\n} from '@buy/state/user/state'\r\nimport { ExistingUserInfoType, ExistingBillingInfoType } from '@common/state/user/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { getSubscriptionInfo } from '@buy/utils'\r\nimport { getTokenFromLocalStorage } from '@common/utils'\r\nimport { AxiosResponse } from 'axios'\r\nimport { applyPromoCode, createCartV3, deleteCart, setupTransaction } from '@buy/services'\r\nimport { getContentLanguage } from '@buy/utils/language-helpers'\r\nimport { getOnePayLocaleFromContentLanguage } from '@buy/utils/get-onepay-locale'\r\nimport { createBillingInfoSaga } from './create-billing-info'\r\n\r\nfunction* submitFormSaga(action: ReturnType) {\r\n const componentName = BUY_TRACKING_COMPONENTS.EXISTING_USER_FORM_SUBMISSION_SAGA\r\n const steps: Record = {\r\n [CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_TRIGGER_BIN_PROCESS]: true,\r\n [CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_BILLING_INFO]: true,\r\n [CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO]: true,\r\n [CHECKOUTFORM_STEPS.CARDINAL_SEND_CHALLENGE]: false,\r\n [CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]: false,\r\n [CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]: false,\r\n }\r\n // update the redux store to ensure consistency\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN, steps[CHECKOUTFORM_STEPS.CREATE_FLEX_TOKEN])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT,\r\n steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n )\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_BILLING_INFO, steps[CHECKOUTFORM_STEPS.SAVE_BILLING_INFO])\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO, steps[CHECKOUTFORM_STEPS.SAVE_PAYMENT_INFO])\r\n )\r\n\r\n const checkout: BuyCheckoutState = yield select(getCheckoutState)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n\r\n const userState: BuyUserState = yield select(getUserState)\r\n const {\r\n addressLine1 = '',\r\n city = '',\r\n postalCode = '',\r\n state: stateCode = '',\r\n phoneNumber = '',\r\n } = userState.existingBillingInformation as ExistingBillingInfoType\r\n\r\n const {\r\n UserName,\r\n Name: { FamilyName, GivenName },\r\n UserKey,\r\n AccountKey,\r\n } = userState.existingUserInformation as ExistingUserInfoType\r\n\r\n const { submittoMarketo, marketoProductName, marketoSalesBrief, marketoSalesforceCampaignId }: BuyContentData =\r\n yield select(getContentData)\r\n\r\n const planData: BuyPlan = yield select(getPlanData)\r\n const selectedPlan: BuyPlan = planData\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { isCouponValidAndApplied, couponServerData } = coupon\r\n // const couponServerData: CouponServerData | null = yield call(getActiveCouponServerData, coupon, planData)\r\n const isCouponValid = isCouponValidAndApplied && couponServerData && !isEmpty(couponServerData)\r\n const { CompanyName } = action.payload.values\r\n let transactionSessionId = ''\r\n\r\n try {\r\n const { accountSubscriptions } = yield select(getAccountState)\r\n const productFamilyWithSpace = marketoProductName.replace('GoTo', 'GoTo ')\r\n const contentLanguage = getContentLanguage()\r\n\r\n const subscriptionInfo = getSubscriptionInfo(\r\n checkout.billingFrequency,\r\n selectedPlan,\r\n planData,\r\n accountSubscriptions\r\n )\r\n\r\n // #region if CompanyName is provided, update billing info\r\n if (CompanyName && userState.existingBillingInformation) {\r\n const { country, firstName, lastName, email, taxNumber, federalTaxType } =\r\n userState.existingBillingInformation\r\n const billingData: BuyBillingInfoDataType = {\r\n addressLine1,\r\n city,\r\n state: stateCode || null,\r\n country,\r\n postalCode: postalCode || null,\r\n firstName,\r\n lastName,\r\n email,\r\n phoneNumber,\r\n taxNumber: taxNumber || '',\r\n federalTaxType: federalTaxType || '',\r\n companyName: CompanyName,\r\n }\r\n\r\n const createBillingInfoAction = buyCheckoutActions.createBillingInfo(billingData)\r\n yield call(createBillingInfoSaga, createBillingInfoAction)\r\n }\r\n // #endregion\r\n\r\n const items = getCartItems(\r\n checkout.baseLine,\r\n checkout.additionalLines,\r\n checkout.addonLines,\r\n subscriptionInfo,\r\n checkout.billingTenure.selected\r\n )\r\n\r\n // #region get available payment menthods\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS] = true\r\n yield put(\r\n buyFormActions.updateSteps(\r\n CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS,\r\n steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]\r\n )\r\n )\r\n // #endregion\r\n // #region process purchase - 1st purchase call\r\n if (steps[CHECKOUTFORM_STEPS.GET_AVAILABLE_PAYMENT_METHODS]) {\r\n // #region Cart and Transaction\r\n const promoCode = isCouponValid ? couponServerData?.couponCode : ''\r\n const token = getTokenFromLocalStorage()!\r\n\r\n // Create Cart\r\n const cartItems = items.map((item) => {\r\n const cartItem: CreateV3CartRequestCartItem = {\r\n paymentPlan: TimePeriodBillingPeriodFromBOSSMapper[checkout.billingFrequency],\r\n productFamilyKey: productFamilyWithSpace,\r\n productSku: item.productSku,\r\n quantity: item.quantity,\r\n }\r\n return cartItem\r\n })\r\n const cartRequestData: CreateCartRequest = {\r\n currency: locationInfo.currency,\r\n cartItems,\r\n promoCode,\r\n }\r\n const deleteCartResponse: AxiosResponse = yield call(\r\n deleteCart as any,\r\n token.access_token,\r\n AccountKey\r\n ) // Delete any existing cart and then proceed to create a fresh one\r\n if (!(deleteCartResponse.status === 404 || deleteCartResponse.status === 200))\r\n // 404 - Commerce cart not found, so you're got to create a new cart\r\n throw new Error('Error while invoking DELETE v2/cart') // throw an exception if any other errors in the API\r\n\r\n const createCartResponse: AxiosResponse = yield call(\r\n createCartV3 as any,\r\n token.access_token,\r\n AccountKey,\r\n cartRequestData\r\n )\r\n const createCartResponseData = createCartResponse.data\r\n\r\n // Apply promoCode (if any) to the cart\r\n if (promoCode) {\r\n const applyPromoCodeRequestData: ApplyPromoCodeRequest = {\r\n promoCode,\r\n }\r\n const applyPromoCodeResponse: AxiosResponse = yield call(\r\n applyPromoCode as any,\r\n token.access_token,\r\n AccountKey,\r\n applyPromoCodeRequestData\r\n )\r\n if (applyPromoCodeResponse.status !== 200) {\r\n // TODO: WAE1-4010: Errror handling?\r\n }\r\n }\r\n\r\n // Setup Transaction\r\n const totalAfterTax = createCartResponseData.cartTotal + checkout.calculatedTax\r\n const transactionProducts = createCartResponseData.cartItems.map((cartItem) => {\r\n const product: SetupTransactionRequestProduct = {\r\n amount: totalAfterTax,\r\n flowName: null,\r\n frequency: cartItem.frequency,\r\n productFamily: cartItem.productFamilyKey,\r\n productSku: cartItem.productSku,\r\n publisherId: null,\r\n quantity: cartItem.quantity,\r\n subscriptionEndDate: null,\r\n transactionType: 'CUSTOMER_ACTION',\r\n }\r\n return product\r\n })\r\n\r\n const successRedirectUrl =\r\n window.location.origin +\r\n window.location.pathname.replace(VIEW_PATH.PATH_CHECKOUT, VIEW_PATH.PATH_CONFIRMATION)\r\n\r\n const setupTransactionRequestData: SetupTransactionRequest = {\r\n quoteId: createCartResponseData.key,\r\n intent: 'PaymentOrPaymentMethodChange',\r\n currencyCode: locationInfo.currency,\r\n targetOrigin: process.env.ONEPAY_SITE_URL!,\r\n amount: checkout.calculatedTotal,\r\n cancelRedirectUrl: window.location.href,\r\n products: transactionProducts,\r\n successRedirectUrl,\r\n taxAmount: checkout.calculatedTax,\r\n }\r\n\r\n const setupTransactionResponse: AxiosResponse = yield call(\r\n setupTransaction as any,\r\n token.access_token,\r\n AccountKey,\r\n setupTransactionRequestData\r\n )\r\n const setupTransactionResponseData = setupTransactionResponse.data\r\n\r\n // Save userData.accountKey to sessionStorage so we can retrieve it after coming back from OnePay\r\n // See where it is retrieved in src/products/buy/saga/checkout-form/get-latest-invoice.ts\r\n window.sessionStorage.setItem('accountKey', AccountKey)\r\n\r\n // Save setupTransactionResponseData.sessionId to sessionStorage so we can retrieve it after coming back from OnePay\r\n // See where it is retrieved in src/products/buy/saga/checkout-form/get-latest-invoice.ts\r\n transactionSessionId = setupTransactionResponseData.sessionId\r\n window.sessionStorage.setItem('transactionSessionId', transactionSessionId)\r\n\r\n // Save wasExistingUserCheckout:'true' to sessionStorage so we can retrieve it after coming back from OnePay\r\n // See where it is retrieved in src/products/buy/views/Confirmation/connector.tsx\r\n window.sessionStorage.setItem('wasExistingUserCheckout', 'true')\r\n // #endregion Cart and Transaction\r\n\r\n // Proceed to post-submit_payment steps\r\n steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT] = true\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.PURCHASE, eventData: { invoiceNumber: null } },\r\n componentName,\r\n true // true to save to sessionStorage instead of dataLayer for later use on confirmation page which will then push it to the dataLayer\r\n )\r\n )\r\n yield put(\r\n buyFormActions.updateSteps(CHECKOUTFORM_STEPS.SUBMIT_PAYMENT, steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT])\r\n )\r\n }\r\n // #endregion\r\n\r\n // #region Set purchase complete\r\n if (steps[CHECKOUTFORM_STEPS.SUBMIT_PAYMENT]) {\r\n yield put(\r\n buyTrackingActions.track(\r\n { event: TRACKING_EVENTS.COMPLETE_BUY_FLOW },\r\n componentName,\r\n true // true to save to sessionStorage instead of dataLayer for later use on confirmation page which will then push it to the dataLayer\r\n )\r\n )\r\n if (submittoMarketo) {\r\n const { planKey } = planData ?? {}\r\n const marketoData: MarketoUserInfo = {\r\n userKey: UserKey,\r\n accountKey: AccountKey,\r\n firstName: GivenName,\r\n lastName: FamilyName,\r\n email: UserName,\r\n planKey,\r\n address: addressLine1,\r\n city,\r\n state: stateCode,\r\n zipcode: postalCode,\r\n phone: phoneNumber,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n company: CompanyName,\r\n }\r\n\r\n // Save marketoData to sessionStorage so we can post it to AWS after coming back from OnePay\r\n // See where it is retrieved from session and posted to AWS in src/products/buy/views/Confirmation/index.tsx\r\n const saveMarketoToSessionStorage = true\r\n yield put(marketingActions.postToMarketo(marketoData, saveMarketoToSessionStorage))\r\n }\r\n\r\n // Redirect to OnePay\r\n const onePayTheme = 'light' // other option is 'dark'\r\n const onePayLocale = getOnePayLocaleFromContentLanguage(contentLanguage)\r\n const onePayUrl = `${process.env.ONEPAY_SITE_URL}/${AccountKey}/${transactionSessionId}/pay?locale=${onePayLocale}&theme=${onePayTheme}`\r\n window.location.href = onePayUrl\r\n return\r\n }\r\n // #endregion\r\n\r\n // Trigger form submission error if any of the steps are missed\r\n yield put(\r\n fatalErrorActions.setFatalError(true, {\r\n trackErrorMessage: 'existing user form submission failed',\r\n fatalErrorType: undefined,\r\n })\r\n )\r\n } catch (e) {\r\n yield put(fatalErrorActions.setFatalError(true, { trackErrorMessage: 'existing user form submission failed' }))\r\n }\r\n}\r\n\r\nfunction* initializeSubmitFormSaga() {\r\n yield takeEvery(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM_UCS, submitFormSaga)\r\n}\r\n\r\nexport default initializeSubmitFormSaga\r\n","import { takeEvery, put } from 'redux-saga/effects'\r\nimport { buyFormActions, BuyFormActionTypes } from '@buy/state/buy-form/actions'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { locationInitialData } from '@common/data'\r\nimport { buyCheckoutActions } from '@buy/state/checkout/actions'\r\nimport { initialCheckoutState } from '@buy/state/checkout/reducer'\r\n\r\nexport function* resetBuyFormAffectedStatesSaga() {\r\n yield put(buyFormActions.resetForm())\r\n yield put(locationActions.setValidAddress(false))\r\n yield put(locationActions.setCorrectedAddress(locationInitialData.correctedAddress))\r\n yield put(locationActions.setAddressErrors(locationInitialData.addressErrors))\r\n yield put(\r\n buyCheckoutActions.setCalculatedPrice(\r\n [],\r\n initialCheckoutState.calculatedNetTotal,\r\n initialCheckoutState.calculatedTotal,\r\n initialCheckoutState.calculatedTax,\r\n initialCheckoutState.calculatedCredit,\r\n initialCheckoutState.anniversaryDate\r\n )\r\n )\r\n}\r\n\r\nfunction* initializeResetBuyFormAffectedStatesSaga() {\r\n yield takeEvery(BuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES, resetBuyFormAffectedStatesSaga)\r\n}\r\n\r\nexport default initializeResetBuyFormAffectedStatesSaga\r\n","import { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport {\r\n getCheckoutState,\r\n getContentData,\r\n getCouponState,\r\n getPlanData,\r\n getProductSettingsPlatformProduct,\r\n getUserState,\r\n} from '@buy/state/selectors'\r\nimport { BuyUserState } from '@buy/state/user/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { select } from 'redux-saga/effects'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyCouponState } from '@buy/state/coupon/state'\r\nimport { BuyCustomizeItemsData } from '@buy/state/tracking/state'\r\nimport { BuyContentData } from '@buy/state/content-data'\r\nimport { BillingPeriodKeyMapper, BillingPeriodTimePeriodMapper } from '@common/constants'\r\nimport { getPriceTier } from '@buy/utils/volume-components-helpers'\r\n\r\nexport function* getCustomizeItemsData() {\r\n const planData: BuyPlan = yield select(getPlanData)\r\n const { CurrencyCode, marketoProductName }: BuyContentData = yield select(getContentData)\r\n const { billingTenure, organizers, baseLine, additionalLines, addonLines }: BuyCheckoutState = yield select(\r\n getCheckoutState\r\n )\r\n const customizeItemsData: BuyCustomizeItemsData = {\r\n planData,\r\n billingFrequency: BillingPeriodTimePeriodMapper[billingTenure.selected],\r\n currency: CurrencyCode,\r\n organizers,\r\n productFamilyName: marketoProductName,\r\n baseLine,\r\n additionalLines,\r\n addonLines,\r\n }\r\n return customizeItemsData\r\n}\r\n\r\nexport function* getPageViewData() {\r\n const {\r\n loggedIn: { isUserLoggedIn },\r\n }: BuyUserState = yield select(getUserState)\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { locale, country, language } = locationState.locationInfo\r\n return { locale, country, isUserLoggedIn, language }\r\n}\r\n\r\nexport function* getSessionInfo() {\r\n const {\r\n userType,\r\n loggedIn: { isUserLoggedIn },\r\n }: BuyUserState = yield select(getUserState)\r\n return { isUserLoggedIn, userType, sessionLast: '', sessionNumber: '' }\r\n}\r\n\r\nexport function* getCartInfo() {\r\n const { billingTenure, baseLine, additionalLines, addonLines, totalDiscount }: BuyCheckoutState = yield select(\r\n getCheckoutState\r\n )\r\n const { marketoProductName }: BuyContentData = yield select(getContentData)\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const billingPeriodKeys = plan.billingPeriods.map((item) => {\r\n return BillingPeriodKeyMapper[item.key]\r\n })\r\n const locationState: LocationState = yield select(getLocationState)\r\n const { existingBillingInformation }: BuyUserState = yield select(getUserState)\r\n const { currency } = locationState.locationInfo\r\n const tierIndex = getPriceTier(baseLine.multiplier, baseLine.allPrices[currency])\r\n\r\n const coupon: BuyCouponState = yield select(getCouponState)\r\n const { validCoupons, couponServerData } = coupon\r\n const totalCouponSavings = validCoupons.reduce((sum, currentValue) => {\r\n if (!currentValue.isReprice) return sum + currentValue.discount\r\n return sum\r\n }, 0)\r\n\r\n return {\r\n plan,\r\n currency,\r\n isExistingUser: !isEmpty(existingBillingInformation),\r\n tier: `Tier${tierIndex + 1}`,\r\n couponCode: couponServerData?.couponCode || '',\r\n validCoupons: couponServerData?.isCouponValid ? validCoupons : [],\r\n totalCouponSavings,\r\n billingPeriod: billingTenure.selected,\r\n addonLines,\r\n additionalLines,\r\n baseLine,\r\n billingPeriodKeys,\r\n totalDiscount,\r\n productFamilyName: marketoProductName,\r\n }\r\n}\r\n\r\nexport function* getPurchaseData(transactionID: string) {\r\n const { calculatedNetTotal, calculatedTax, promoCode }: BuyCheckoutState = yield select(getCheckoutState)\r\n const { userType }: BuyUserState = yield select(getUserState)\r\n return { calculatedNetTotal, calculatedTax, promoCode, userType, transactionID }\r\n}\r\n\r\nexport function* getCompleteBuyData() {\r\n const { userType }: BuyUserState = yield select(getUserState)\r\n return userType\r\n}\r\n\r\nexport function* getPlatformProduct() {\r\n const platformProduct: string = yield select(getProductSettingsPlatformProduct)\r\n return platformProduct\r\n}\r\n","import { takeEvery, call } from 'redux-saga/effects'\r\nimport { buyTrackingActions, BuyTrackingActionTypes } from '@buy/state/tracking/actions'\r\nimport { trackCTAClick, trackEvent, trackGenericEvent, trackGenericFormEvent } from '@common/utils'\r\nimport { TRACKING_EVENTS } from '@common/constants'\r\nimport {\r\n trackBeginCheckout,\r\n trackCompleteBuy,\r\n trackCustomizeViewItem,\r\n trackFormError,\r\n trackPurchase,\r\n trackPurchaseError,\r\n trackSessionInfo,\r\n trackViewContent,\r\n trackUserInformation,\r\n trackEmailValidation,\r\n} from '@buy/utils'\r\nimport { BuyCartData, BuyPurchaseData, BuyCustomizeItemsData } from '@buy/state/tracking/state'\r\nimport { CTAClickData, PageViewContentData, SessionInfo } from '@common/state/tracking/state'\r\nimport {\r\n getCartInfo,\r\n getCompleteBuyData,\r\n getCustomizeItemsData,\r\n getPageViewData,\r\n getPlatformProduct,\r\n getPurchaseData,\r\n getSessionInfo,\r\n} from './track-helpers'\r\n\r\nexport function* buyTrackingSaga(action: ReturnType) {\r\n const { trackingInfo, saveToSessionStorage } = action.payload\r\n const eventName = trackingInfo.event\r\n const trackData = trackingInfo.eventData || {}\r\n\r\n const errorMessage = (trackData.errorMessage as string) || ''\r\n const formErrors = (trackData.formErrors as string[]) || ['']\r\n const formIds = (trackData.formIds as string[]) || ['']\r\n const step = (trackData.step as number) || 0\r\n const ctaClickData: CTAClickData = {\r\n name: (trackData.name as string) || '',\r\n url: (trackData.url as string) || '',\r\n }\r\n const formName = (trackData.formName as string) || ''\r\n const pathName = (trackData.currentLocation as string) || ''\r\n const invoiceNumber = (trackData.invoiceNumber as string) || ''\r\n const userEmail: string = (trackData.userEmail as string) || ''\r\n const plan: string = (trackData.plan as string) || ''\r\n const buyType: string = (trackData.buyType as string) || ''\r\n const platformProduct: string = yield call(getPlatformProduct)\r\n\r\n switch (eventName) {\r\n case TRACKING_EVENTS.VIEW_ITEM: {\r\n const customizeItemsData: BuyCustomizeItemsData = yield call(getCustomizeItemsData)\r\n trackCustomizeViewItem(customizeItemsData)\r\n break\r\n }\r\n case TRACKING_EVENTS.VIEW_CONTENT: {\r\n const viewContentData: PageViewContentData = yield call(getPageViewData)\r\n trackViewContent(viewContentData, platformProduct, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SESSION_INFORMATION: {\r\n const sessionData: SessionInfo = yield call(getSessionInfo)\r\n trackSessionInfo(sessionData)\r\n break\r\n }\r\n case TRACKING_EVENTS.USER_INFORMATION: {\r\n const cartData: BuyCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackUserInformation(completeBuyData, userEmail, cartData)\r\n break\r\n }\r\n case TRACKING_EVENTS.BEGIN_CHECKOUT: {\r\n const cartData: BuyCartData = yield call(getCartInfo)\r\n trackBeginCheckout(cartData, step, platformProduct)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_BUY_FLOW: {\r\n trackGenericEvent(eventName, platformProduct, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.PURCHASE: {\r\n const cartData: BuyCartData = yield call(getCartInfo)\r\n const purchaseData: BuyPurchaseData = yield call(getPurchaseData, invoiceNumber)\r\n trackPurchase(cartData, purchaseData, saveToSessionStorage)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_PURCHASE: {\r\n trackPurchaseError(errorMessage, plan, buyType)\r\n break\r\n }\r\n case TRACKING_EVENTS.EMAIL_VALIDATION: {\r\n trackEmailValidation(formName, userEmail)\r\n break\r\n }\r\n case TRACKING_EVENTS.COMPLETE_BUY_FLOW: {\r\n const cartData: BuyCartData = yield call(getCartInfo)\r\n const completeBuyData: string = yield call(getCompleteBuyData)\r\n trackCompleteBuy(completeBuyData, userEmail, cartData, platformProduct, saveToSessionStorage)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_CONTACT_SALES_FLOW: {\r\n trackGenericEvent(eventName, platformProduct, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.LOAD_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.START_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ABANDON_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.SUBMIT_FORM: {\r\n trackGenericFormEvent(eventName, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.ERROR_FORM: {\r\n trackFormError(formIds, formErrors, pathName)\r\n break\r\n }\r\n case TRACKING_EVENTS.CLICK_CTA: {\r\n trackCTAClick(ctaClickData)\r\n break\r\n }\r\n default: {\r\n yield call(trackEvent, { event: eventName, eventData: trackData })\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeBuyTrackingSaga() {\r\n yield takeEvery(BuyTrackingActionTypes.TRACK, buyTrackingSaga)\r\n}\r\n\r\nexport default initializeBuyTrackingSaga\r\n","import { CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { BuyBillingFrequencyVolumeDiscountRecords, BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { getCheckoutState, getPlanData } from '@buy/state/selectors'\r\nimport { calculateVolumeDiscount } from '@buy/utils'\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { call } from 'redux-saga-test-plan/matchers'\r\nimport { put, select, takeEvery } from 'redux-saga/effects'\r\nimport { getLocationState } from '@common/state/selectors'\r\n\r\nexport type CalculateVolumeDiscountSagaTriggerActionType = ReturnType\r\n// | ReturnType\r\n\r\nfunction* calculateVolumeDiscountSaga() {\r\n yield put(buyCheckoutActions.setVolumeDiscountLoading(true))\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency: selectedCurrency = CURRENCY.USD } = locationInfo\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const planSku = plan.sKU\r\n const { volumeDiscount }: BuyCheckoutState = yield select(getCheckoutState)\r\n if (planSku) {\r\n const buyBillingFrequencyVolumeDiscountRecords = get(volumeDiscount, [planSku, selectedCurrency])\r\n // skip the calculation if the checkout store already has selected plan volume discount data in the required currency\r\n if (isEmpty(buyBillingFrequencyVolumeDiscountRecords)) {\r\n const volumeDiscountForSelectedPlanAndCurrency: BuyBillingFrequencyVolumeDiscountRecords = yield call(\r\n calculateVolumeDiscount,\r\n plan,\r\n selectedCurrency\r\n )\r\n yield put(\r\n buyCheckoutActions.setVolumeDiscount(\r\n planSku,\r\n selectedCurrency,\r\n volumeDiscountForSelectedPlanAndCurrency\r\n )\r\n )\r\n }\r\n }\r\n yield put(buyCheckoutActions.setVolumeDiscountLoading(false))\r\n}\r\n\r\nfunction* initializeCalculateVolumeDiscount() {\r\n yield takeEvery(BuyCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT, calculateVolumeDiscountSaga)\r\n /* note: we need to add currency here, if the user can change currency,\r\n that would automatically trigger this saga to calculate the volume discount\r\n for the selected plan in that currency.\r\n */\r\n}\r\n\r\nexport default initializeCalculateVolumeDiscount\r\n","import { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { getCheckoutState, getPlanData } from '@buy/state/selectors'\r\nimport { getSelectedTierIndex } from '@buy/utils'\r\nimport { call, put, select, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* getSelectedTierSaga(action: ReturnType) {\r\n const { organizers } = action.payload\r\n const { billingFrequency }: BuyCheckoutState = yield select(getCheckoutState)\r\n const plan: BuyPlan = yield select(getPlanData)\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const selectedTierIndex: number = yield call(getSelectedTierIndex, organizers, billingFrequency, plan, currency)\r\n yield put(buyCheckoutActions.setSelectedTierIndex(selectedTierIndex, organizers))\r\n yield put(buyCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency as TimePeriod))\r\n}\r\n\r\nfunction* initializeGetSelectedTier() {\r\n yield takeLatest(BuyCheckoutActionTypes.SET_ORGANIZERS, getSelectedTierSaga)\r\n}\r\n\r\nexport default initializeGetSelectedTier\r\n","import { BillingPeriod, CURRENCY } from '@common/constants'\r\nimport { LocationState } from '@common/state/location/state'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { BuyCheckoutState, BuyVolumeDiscountPerTier } from '@buy/state/checkout/state'\r\nimport { getCheckoutState, getUserState } from '@buy/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { call, put, take, takeLatest } from 'redux-saga/effects'\r\nimport { get, isEmpty } from 'lodash-es'\r\nimport { BuyUserState } from '@buy/state/user/state'\r\nimport { BUY_USER_TYPES } from '@buy/constants'\r\nimport { initialData } from '@buy/data/buy-form'\r\nimport { getTotalVolumeDiscount } from '@buy/utils'\r\n\r\nfunction* getVolumeDiscountSaga(action: ReturnType) {\r\n const { userType }: BuyUserState = yield select(getUserState)\r\n if (userType === BUY_USER_TYPES.ADDON) {\r\n const buyFormInitialData = { ...initialData, CountryCode: '' }\r\n yield put(buyCheckoutActions.calculatePrice(buyFormInitialData, 'get volume discount saga'))\r\n } else {\r\n const { organizers, selectedTierIndex } = action.payload\r\n const { locationInfo }: LocationState = yield select(getLocationState)\r\n const { currency = CURRENCY.USD } = locationInfo\r\n const { volumeDiscount, selectedPlanSku, billingTenure }: BuyCheckoutState = yield select(getCheckoutState)\r\n const billingFrequencyKey = billingTenure.selected\r\n const isAnnual = billingFrequencyKey === BillingPeriod.ANNUAL\r\n const volumeDiscountPerTier: BuyVolumeDiscountPerTier = get(volumeDiscount, [\r\n selectedPlanSku,\r\n currency,\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n\r\n if (!isEmpty(volumeDiscountPerTier)) {\r\n const { discountPricePerUnit } = volumeDiscountPerTier\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(buyCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n } else {\r\n // since the volume discount is not available, we will wait to listen for next volume\r\n // discount set action being dispatched to store and then get the data\r\n const setVolumeDiscountAction: ReturnType = yield take(\r\n BuyCheckoutActionTypes.SET_VOLUME_DISCOUNT\r\n )\r\n const { volumeDiscountForSelectedPlanAndCurrency } = setVolumeDiscountAction.payload\r\n const volumeDiscountPerTierNow = get(volumeDiscountForSelectedPlanAndCurrency, [\r\n billingFrequencyKey,\r\n selectedTierIndex,\r\n ])\r\n const { discountPricePerUnit } = volumeDiscountPerTierNow\r\n const totalVolumeDiscount: number = yield call(\r\n getTotalVolumeDiscount,\r\n discountPricePerUnit,\r\n organizers,\r\n isAnnual\r\n )\r\n yield put(buyCheckoutActions.setCurrentVolumeDiscountPriceAndPercentage(totalVolumeDiscount))\r\n }\r\n }\r\n}\r\n\r\nfunction* initializeGetVolumeDiscountSaga() {\r\n yield takeLatest(BuyCheckoutActionTypes.GET_VOLUME_DISCOUNT, getVolumeDiscountSaga)\r\n}\r\n\r\nexport default initializeGetVolumeDiscountSaga\r\n","import { buyCheckoutActions, BuyCheckoutActionTypes } from '@buy/state/checkout/actions'\r\nimport { BuyCheckoutState } from '@buy/state/checkout/state'\r\nimport { getCheckoutState } from '@buy/state/selectors'\r\nimport { select } from 'redux-saga-test-plan/matchers'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* setBillingFrequencySaga(action: ReturnType) {\r\n const { frequency: billingFrequency } = action.payload\r\n const { organizers, selectedTierIndex }: BuyCheckoutState = yield select(getCheckoutState)\r\n yield put(buyCheckoutActions.getVolumeDiscount(organizers, selectedTierIndex, billingFrequency))\r\n}\r\n\r\nfunction* initializeSetBillingFrequencySaga() {\r\n yield takeLatest(BuyCheckoutActionTypes.SET_BILLING_FREQUENCY, setBillingFrequencySaga)\r\n}\r\n\r\nexport default initializeSetBillingFrequencySaga\r\n","import { getCouponInfo } from '@common/services'\r\nimport { buyCouponActions, BuyCouponActionTypes } from '@buy/state/coupon/actions'\r\nimport { CouponInfoServerResponse } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { call, put, takeLatest } from 'redux-saga/effects'\r\nimport { buyPlanActions } from '@buy/state/plan-data/actions'\r\n\r\nfunction* getCouponDetailsSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n try {\r\n const couponInfoServerResponse: CouponInfoServerResponse = yield call(getCouponInfo, couponCode)\r\n if (!isEmpty(couponInfoServerResponse.data)) {\r\n const {\r\n data: { couponCode: couponServerResponseData, couponDisclaimer },\r\n } = couponInfoServerResponse\r\n if (couponServerResponseData) {\r\n yield put(buyCouponActions.setCouponServerData(couponServerResponseData))\r\n }\r\n if (couponDisclaimer) {\r\n yield put(buyPlanActions.setCouponDisclaimer(couponDisclaimer))\r\n }\r\n }\r\n } catch (e) {\r\n console.error('unable to get url coupon details')\r\n // yield put(buyCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeGetCouponDetailsSaga() {\r\n yield takeLatest(BuyCouponActionTypes.GET_COUPON_DETAILS, getCouponDetailsSaga)\r\n}\r\n","import { buyCouponActions, BuyCouponActionTypes } from '@buy/state/coupon/actions'\r\nimport { put, takeLatest } from 'redux-saga/effects'\r\n\r\nfunction* attempUrlCouponSaga(action: ReturnType) {\r\n const { couponCode } = action.payload\r\n if (couponCode) {\r\n // if url promotion available\r\n yield put(buyCouponActions.getCouponDetails(couponCode as string))\r\n } else {\r\n // yield put(buyCouponActions.attemptForCMSCoupon())\r\n }\r\n}\r\n\r\nexport default function* initializeAttempUrlCouponSaga() {\r\n yield takeLatest(BuyCouponActionTypes.SET_URL_COUPON_CODE, attempUrlCouponSaga)\r\n}\r\n","import initializeLoadContentSaga from './content/load-content'\r\nimport initializeSubmitFormSaga from './checkout-form/form-submission'\r\nimport initializeSubmitFormUcsSaga from './checkout-form/form-submission-ucs'\r\nimport initializeAbandonedCartSaga from './user/abandoned-cart'\r\nimport initializeExistingUserSaga from './user/existing-user'\r\nimport initializeCreateUserSaga from './user/create-user'\r\nimport initializeCreateUserUcsSaga from './user/create-user-ucs'\r\nimport initializeGetAccessToken from './user/get-token'\r\nimport initializeLogin from './user/login'\r\nimport initializeLogout from './user/logout'\r\nimport initializeGetLatestInvoiceSaga from './checkout-form/get-latest-invoice'\r\nimport initializeDownloadInvoiceSaga from './checkout-form/download-invoice'\r\nimport initializeLoadSavedStateSaga from './saved-state/saved-state'\r\nimport initializeCalculatePriceSaga from './checkout-form/calculate-price'\r\nimport initializeCreateBillingInfoSaga from './checkout-form/create-billing-info'\r\nimport initializeCreatePaymentSaga from './checkout-form/create-payment'\r\nimport initializeCreateAndSubmitPaymentSaga from './checkout-form/create-and-submit-payment'\r\nimport initializeGetPaymentMethodSaga from './checkout-form/get-payment-methods'\r\nimport initializeSubmitPaymentSaga from './checkout-form/submit-payment'\r\nimport initializeUserLoggedInSaga from './user/user-logged-in'\r\nimport initializeExistingUserSubmitFormSaga from './checkout-form/existing-user-form-submission'\r\nimport initializeExistingUserSubmitFormUcsSaga from './checkout-form/existing-user-form-submission-ucs'\r\nimport initializeResetCheckoutFormAffectedStatesSaga from './checkout-form/reset-checkout-form-affected-states'\r\nimport initializeBuyTrackingSaga from './tracking/track-event'\r\nimport initializeCalculateVolumeDiscountSaga from './checkout-form/calculate-volume-discount'\r\nimport initializeGetSelectedTier from './checkout-form/get-selected-tier'\r\nimport initializeGetVolumeDiscountSaga from './checkout-form/get-volume-discount'\r\nimport initializeSetBillingFrequencySaga from './checkout-form/set-billing-frequency'\r\nimport initializeGetCouponDetailsSaga from './coupon/get-coupon-details'\r\nimport initializeAttempUrlCouponSaga from './coupon/attempt-url-coupon'\r\n\r\nexport const buySagas = {\r\n buyContentSaga: initializeLoadContentSaga,\r\n buySubmitFormSaga: initializeSubmitFormSaga,\r\n buySubmitFormUcsSaga: initializeSubmitFormUcsSaga,\r\n buyAbandonedCartSaga: initializeAbandonedCartSaga,\r\n buyExistingUserSaga: initializeExistingUserSaga,\r\n buyGetAccessToken: initializeGetAccessToken,\r\n buyUserLoginSaga: initializeLogin,\r\n buyUserLogoutSaga: initializeLogout,\r\n buyGetLatestInvoiceSaga: initializeGetLatestInvoiceSaga,\r\n buyDownloadInvoiceSaga: initializeDownloadInvoiceSaga,\r\n buyCreateUserSaga: initializeCreateUserSaga,\r\n buyCreateUserUcsSaga: initializeCreateUserUcsSaga,\r\n buyCalculatePriceSaga: initializeCalculatePriceSaga,\r\n buyCreateBillingInfoSaga: initializeCreateBillingInfoSaga,\r\n buyCreatePaymentSaga: initializeCreatePaymentSaga,\r\n buyCreateAndSubmitPaymentSaga: initializeCreateAndSubmitPaymentSaga,\r\n buyGetPaymentSaga: initializeGetPaymentMethodSaga,\r\n buySubmitPaymentSaga: initializeSubmitPaymentSaga,\r\n buyLoadSavedStateSaga: initializeLoadSavedStateSaga,\r\n buyUserLoggedInSaga: initializeUserLoggedInSaga,\r\n buyExistingUserSubmitFormSaga: initializeExistingUserSubmitFormSaga,\r\n buyExistingUserSubmitFormUcsSaga: initializeExistingUserSubmitFormUcsSaga,\r\n buyResetCheckoutFormAffectedStates: initializeResetCheckoutFormAffectedStatesSaga,\r\n buyTrackingSaga: initializeBuyTrackingSaga,\r\n buyCalculateVolumeDiscountSaga: initializeCalculateVolumeDiscountSaga,\r\n buyGetVolumeDiscountSaga: initializeGetVolumeDiscountSaga,\r\n buyGetSelectedTierSaga: initializeGetSelectedTier,\r\n buySetBillingFrequencySaga: initializeSetBillingFrequencySaga,\r\n buyGetCouponDetailsSaga: initializeGetCouponDetailsSaga,\r\n buyAttemptUrlCouponSaga: initializeAttempUrlCouponSaga,\r\n}\r\n\r\nexport default buySagas\r\n","import { LabelContent } from '@lmicentral/state/label-content'\r\n\r\nexport const labelContentInitialData: LabelContent = {\r\n addOns: '',\r\n agents: '',\r\n devices: '',\r\n quantityLabelLong: '',\r\n quantityLabel: '',\r\n quantityLabelPlural: '',\r\n email: '',\r\n firstName: '',\r\n lastName: '',\r\n password: '',\r\n useAccountInfo: '',\r\n address: '',\r\n country: '',\r\n city: '',\r\n postalCode: '',\r\n state: '',\r\n phone: '',\r\n checkout: '',\r\n header: '',\r\n customizePlan: '',\r\n errorMessageTitle: '',\r\n orderSummary: '',\r\n monthly: '',\r\n annual: '',\r\n save: '',\r\n user: '',\r\n year: '',\r\n month: '',\r\n months: '',\r\n subtotal: '',\r\n estimatedTax: '',\r\n tBD: '',\r\n todaysTotal: '',\r\n recurringAnnualCharge: '',\r\n recurringMonthlyCharge: '',\r\n autoRenewalNote: '',\r\n createAnAccount: '',\r\n billingInformation: '',\r\n passwordRequirements: '',\r\n paymentDetails: '',\r\n expirationDate: '',\r\n cVV: '',\r\n cVVHint: '',\r\n completePurchase: '',\r\n pricingNote: '',\r\n continue: '',\r\n changePlan: '',\r\n selectedPlan: '',\r\n signIn: '',\r\n errorCardinalChallenge: '',\r\n errorCardinalSetup: '',\r\n errorInvalidCharacter: '',\r\n errorInvalidCVV: '',\r\n errorInvalidEmail: '',\r\n errorInvalidExpirationDate: '',\r\n errorInvalidPassword: '',\r\n errorInvalidPhoneNumber: '',\r\n errorInvalidTaxNumber: '',\r\n errorRequiredAddress: '',\r\n errorRequiredCity: '',\r\n errorRequiredFirstName: '',\r\n errorRequiredLastName: '',\r\n errorRequiredPostalCode: '',\r\n errorRequiredState: '',\r\n estimatedTaxPopupInfo: '',\r\n quantityPopupInfo: '',\r\n yearAbbr: '',\r\n monthAbbr: '',\r\n questions: '',\r\n myAccount: '',\r\n signOut: '',\r\n pleaseSelect: '',\r\n headerPhone: '',\r\n optOutCheckboxLabel: '',\r\n optOut: '',\r\n cardNumber: '',\r\n errorInvalidCreditCardNumber: '',\r\n accountInformation: '',\r\n notYou: '',\r\n emailAddressAlreadyInUse: '',\r\n additionalUserLicences: '',\r\n howManyMore: '',\r\n existingUserLicencePlural: '',\r\n existingUserLicense: '',\r\n additional: '',\r\n newUserLicense: '',\r\n total: '',\r\n proratedAdjustment: '',\r\n today: '',\r\n modalCloseButtonText: '',\r\n changePlanMethodModalHeader: '',\r\n changePlanModalSubheader: '',\r\n changePaymentMethodModalHeader: '',\r\n changePaymentMethodModalSubheader: '',\r\n edit: '',\r\n newRecurringAnnualTotal: '',\r\n newRecurringMonthlyTotal: '',\r\n previousAnnualTotal: '',\r\n previousMonthlyTotal: '',\r\n billingCycleCredit: '',\r\n getStartedNote: '',\r\n creatingAccountLeftHeader: '',\r\n creatingAccountLeftContent: '',\r\n creatingAccountRightHeader: '',\r\n creatingAccountRightContent: '',\r\n getStartedButtonText: '',\r\n getStartedButtonUrl: '',\r\n gotoAdminUrl: '',\r\n savingWithAnnualBilling: '',\r\n errorBlockedPurchase: '',\r\n errorGenericMessage: '',\r\n errorRequiredBIC: '',\r\n errorRequiredCVV: '',\r\n errorRequiredCountry: '',\r\n errorRequiredCreditCardNumber: '',\r\n errorRequiredEmail: '',\r\n errorRequiredExpDate: '',\r\n errorRequiredPassword: '',\r\n errorRequiredPhoneNumber: '',\r\n errorSummaryMessage: '',\r\n errorTooManyRequests: '',\r\n errorInvalidPostalCode: '',\r\n internalErrorMessage: '',\r\n calculating: '',\r\n newUserLicensePlural: '',\r\n fees: '',\r\n changeNumberModalHeader: '',\r\n changeNumberModalContent: '',\r\n changePlanUrl: '',\r\n sEOPageTitle: '',\r\n showMe: '',\r\n errorInvalidAddress: '',\r\n paymentMethodErrorMessage: '',\r\n disabledUserError: '',\r\n addonUserSuccessUrl: '',\r\n percentageOffAnnualDiscount: '',\r\n percentageOffVolumeDiscount: '',\r\n volumeDiscountPopupText: '',\r\n percentageOffPromoDiscount: '',\r\n equal: '',\r\n bundles: '',\r\n countAbbr: '',\r\n discount: '',\r\n percentageDiscountPopupText: '',\r\n annualPlanNote: '',\r\n monthlyPlanNote: '',\r\n invalidQSCouponMessage: '',\r\n invalidQSCouponUsingCMSCouponMessage: '',\r\n couponValidMessage: '',\r\n dismiss: '',\r\n couponDisclaimer: '',\r\n couponAdjustmentSavings: '',\r\n couponAdjustmentSavingsPopupText: '',\r\n billedMonthlyPrice: '',\r\n billedAnnualPrice: '',\r\n secure: '',\r\n trustArcSupport: '',\r\n per: '',\r\n selectAddons: '',\r\n selectAddonsDescription: '',\r\n organizer: '',\r\n added: '',\r\n existingUsersModalContent: '',\r\n existingUsersModalHeader: '',\r\n existingUsersNewEmailButtonText: '',\r\n allrightsreservedDisclaimerLabel: '',\r\n termsandconditionsLabel: '',\r\n privacypolicyLabel: '',\r\n antiSpamPolicyLabel: '',\r\n trademarkLabel: '',\r\n doNotSellInfoLabel: '',\r\n sitemapLabel: '',\r\n termsandconditionsUrl: '',\r\n privacypolicyUrl: '',\r\n antiSpamPolicyUrl: '',\r\n trademarkUrl: '',\r\n doNotSellInfoUrl: '',\r\n sitemapUrl: '',\r\n taxTooltip: '',\r\n agentsVolumediscountTooltip: '',\r\n endpointsVolumediscountTooltip: '',\r\n mobileVolumediscountTooltip: '',\r\n cameraShareVolumediscountTooltip: '',\r\n endpointProtectionVolumediscountTooltip: '',\r\n proratedadjustmentTooltip: '',\r\n errorRequiredTaxNumber: '',\r\n taxBusiness: '',\r\n taxIndividual: '',\r\n taxNumber: '',\r\n gSTDisclaimer: '',\r\n vATDisclaimer: '',\r\n gSTOption: '',\r\n vATOption: '',\r\n companyName: '',\r\n optional: '',\r\n changeCountryContent: '',\r\n changeCountryHeader: '',\r\n modalCancel: '',\r\n modalReload: '',\r\n taxCodeGST: '',\r\n taxCodeVAT: '',\r\n upgradeClose: '',\r\n upgradeSubscriptionCredit: '',\r\n upgradeSubscriptionCreditTooltip: '',\r\n upgradeSubscriptionCreditNote: '',\r\n upgradeCreditErrorMessage: '',\r\n upgradeCreditErrorAssistance: '',\r\n totalVolumeDiscount: '',\r\n totalVolumeDiscountTooltip: '',\r\n passwordStrength: '',\r\n passwordStrengthLevel1: '',\r\n passwordStrengthLevel2: '',\r\n passwordStrengthLevel3: '',\r\n passwordStrengthLevel4: '',\r\n passwordStrengthTipDrawer: '',\r\n passwordStrengthTip1: '',\r\n passwordStrengthTip2: '',\r\n passwordStrengthTip3: '',\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { labelContentInitialData } from '@lmicentral/data'\r\nimport { LmiCentralContentState } from './state'\r\nimport { LmiCentralContentActionTypes } from './actions'\r\nimport type { ContentActions } from './actions'\r\n\r\nexport const initialContentState: LmiCentralContentState = {\r\n contentData: {\r\n CurrencyCode: CURRENCY.USD,\r\n ContentLoaded: false,\r\n Locale: 'en-US',\r\n PlanGroupId: '',\r\n DefaultCountry: '',\r\n marketoProductName: '',\r\n marketoSalesBrief: '',\r\n marketoSalesforceCampaignId: '',\r\n submittoMarketo: true,\r\n },\r\n labelContent: labelContentInitialData,\r\n planData: [],\r\n allPlanData: [],\r\n contentLoaded: false,\r\n}\r\n\r\nexport const contentReducer = (\r\n previousState: LmiCentralContentState | undefined,\r\n action: ContentActions\r\n): LmiCentralContentState => {\r\n const state = previousState || initialContentState\r\n switch (action.type) {\r\n case LmiCentralContentActionTypes.GET_LABEL_CONTENT: {\r\n return state\r\n }\r\n case LmiCentralContentActionTypes.SET_CONTENT: {\r\n const { content, filteredPlans, allPlans, labels } = action.payload\r\n return {\r\n ...state,\r\n contentData: {\r\n ...state.contentData,\r\n ...content,\r\n },\r\n labelContent: { ...labels },\r\n planData: [...filteredPlans],\r\n allPlanData: [...allPlans],\r\n }\r\n }\r\n case LmiCentralContentActionTypes.SET_CONTENT_LOADED: {\r\n return {\r\n ...state,\r\n contentLoaded: action.payload.loaded,\r\n }\r\n }\r\n case LmiCentralContentActionTypes.GET_COMPARE_MODAL_CONTENT: {\r\n return state\r\n }\r\n case LmiCentralContentActionTypes.SET_COUPON_DISCLAIMER: {\r\n return {\r\n ...state,\r\n labelContent: {\r\n ...state.labelContent,\r\n couponDisclaimer: action.payload.couponDisclaimer,\r\n },\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { buyFormStateInitialData } from '@lmicentral/data'\r\nimport { LmiCentralBuyFormState } from './state'\r\nimport { LmiCentralBuyFormActionTypes } from './actions'\r\nimport type { BuyFormActions } from './actions'\r\n\r\nexport const buyFormInitialState: LmiCentralBuyFormState = buyFormStateInitialData\r\n\r\nexport const buyFormReducer = (\r\n previousState: LmiCentralBuyFormState | undefined,\r\n action: BuyFormActions\r\n): LmiCentralBuyFormState => {\r\n const state = previousState || buyFormInitialState\r\n switch (action.type) {\r\n // need to add actions from the form components here\r\n case LmiCentralBuyFormActionTypes.RESET_BUY_FORM: {\r\n return buyFormInitialState\r\n }\r\n case LmiCentralBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE: {\r\n const { data } = action.payload\r\n return {\r\n ...state,\r\n initialData: { ...data },\r\n }\r\n }\r\n case LmiCentralBuyFormActionTypes.SET_CLEAR_EMAIL:\r\n return {\r\n ...state,\r\n clearEmail: action.payload.clear,\r\n }\r\n case LmiCentralBuyFormActionTypes.UPDATE_STEPS:\r\n return {\r\n ...state,\r\n steps: {\r\n ...state.steps,\r\n [action.payload.stepName]: {\r\n completed: action.payload.stepResult,\r\n error: !action.payload.stepResult,\r\n },\r\n },\r\n }\r\n case LmiCentralBuyFormActionTypes.SET_STATES_OPTIONAL:\r\n return {\r\n ...state,\r\n statesOptional: action.payload.optional,\r\n }\r\n\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LMICENTRAL_USER_TYPES } from '@lmicentral/constants'\r\nimport { LmiCentralUserState } from './state'\r\nimport { LmiCentralUserActionTypes } from './actions'\r\nimport type { LmiCentralUserActions } from './actions'\r\n\r\nexport const initialUserState: LmiCentralUserState = {\r\n displayName: '',\r\n loadingExistingInfo: false,\r\n verifyingToken: false,\r\n userType: LMICENTRAL_USER_TYPES.NEW,\r\n loggedIn: {\r\n accessToken: undefined,\r\n isUserLoggedIn: false,\r\n },\r\n verifiedUserShouldLogIn: false,\r\n}\r\n\r\nexport const userReducer = (\r\n previousState: LmiCentralUserState | undefined,\r\n action: LmiCentralUserActions\r\n): LmiCentralUserState => {\r\n const state = previousState || initialUserState\r\n switch (action.type) {\r\n case LmiCentralUserActionTypes.SET_EXISTING_BILLING_INFO: {\r\n const { billingInfo } = action.payload\r\n return {\r\n ...state,\r\n existingBillingInformation: { ...billingInfo },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_EXISTING_USER_INFO: {\r\n const { userInfo } = action.payload\r\n return {\r\n ...state,\r\n existingUserInformation: { ...userInfo },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_EXISTING_ACCOUNT_INFO: {\r\n const { accountInfo } = action.payload\r\n return {\r\n ...state,\r\n existingAccountInformation: { ...accountInfo },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_DISPLAY_NAME: {\r\n return {\r\n ...state,\r\n displayName: action.payload.displayName,\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_LOADING_EXISTING_INFO: {\r\n return {\r\n ...state,\r\n loadingExistingInfo: action.payload.loading,\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_VERIFYING_TOKEN: {\r\n return {\r\n ...state,\r\n verifyingToken: action.payload.verifying,\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_USER_TYPE: {\r\n return {\r\n ...state,\r\n userType: action.payload.type,\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_EXISTING_PAYMENT_DETAILS: {\r\n const { info } = action.payload\r\n return {\r\n ...state,\r\n existingPaymentInformation: { ...info },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_ACCESS_TOKEN: {\r\n return {\r\n ...state,\r\n loggedIn: { ...state.loggedIn, accessToken: action.payload.accessToken },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_IS_USER_LOGGEDIN: {\r\n return {\r\n ...state,\r\n loggedIn: {\r\n ...state.loggedIn,\r\n isUserLoggedIn: action.payload.isUserLoggedIn,\r\n },\r\n }\r\n }\r\n case LmiCentralUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN: {\r\n return {\r\n ...state,\r\n verifiedUserShouldLogIn: action.payload.verifiedUserShouldLogIn,\r\n }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { LmiCentralCouponActions, LmiCentralCouponActionTypes } from './actions'\r\nimport { LmiCentralCouponState } from './state'\r\n\r\nexport const initialCouponState: LmiCentralCouponState = {\r\n couponServerData: null,\r\n couponProcessedDataPerSku: null,\r\n isUrlCouponActive: false,\r\n isCMSCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n isUrlCouponCodeAvailable: false,\r\n urlCouponCode: '',\r\n}\r\n\r\nexport const couponReducer = (previousState: LmiCentralCouponState | undefined, action: LmiCentralCouponActions) => {\r\n const state = previousState || initialCouponState\r\n switch (action.type) {\r\n case LmiCentralCouponActionTypes.SET_COUPON_SERVER_DATA: {\r\n const { couponServerData } = action.payload\r\n return {\r\n ...state,\r\n couponServerData,\r\n }\r\n }\r\n case LmiCentralCouponActionTypes.SET_COUPON_PROCESSED_DATA: {\r\n const { couponProcessedDataPerSku } = action.payload\r\n return { ...state, couponProcessedDataPerSku }\r\n }\r\n case LmiCentralCouponActionTypes.RESET_COUPON_DATA: {\r\n return {\r\n ...state,\r\n couponProcessedDataPerSku: null,\r\n isCMSCouponActive: false,\r\n isUrlCouponActive: false,\r\n isCouponValidAndApplied: false,\r\n couponDoubleDipAmountForNewUser: 0,\r\n }\r\n }\r\n case LmiCentralCouponActionTypes.SET_COUPON_VALID_AND_APPLIED: {\r\n const { isCouponValidAndApplied } = action.payload\r\n return { ...state, isCouponValidAndApplied }\r\n }\r\n case LmiCentralCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER: {\r\n const { couponDoubleDipAmountForNewUser } = action.payload\r\n return { ...state, couponDoubleDipAmountForNewUser }\r\n }\r\n case LmiCentralCouponActionTypes.SET_URL_COUPON_ACTIVE: {\r\n const { isUrlCouponActive } = action.payload\r\n return {\r\n ...state,\r\n isUrlCouponActive,\r\n isCMSCouponActive: !isUrlCouponActive,\r\n }\r\n }\r\n case LmiCentralCouponActionTypes.SET_URL_COUPON_CODE: {\r\n const { couponCode } = action.payload\r\n return { ...state, urlCouponCode: couponCode, isUrlCouponCodeAvailable: couponCode.length > 0 }\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import { combineReducers } from 'redux'\r\nimport { contentReducer } from '@lmicentral/state/content/reducer'\r\nimport { checkoutReducer } from '@lmicentral/state/checkout/reducer'\r\nimport { buyFormReducer } from '@lmicentral/state/buy-form/reducer'\r\nimport { userReducer } from '@lmicentral/state/user/reducer'\r\nimport { couponReducer } from '@lmicentral/state/coupon/reducer'\r\n\r\nexport const lmiCentralAppReducer = combineReducers({\r\n content: contentReducer,\r\n checkout: checkoutReducer,\r\n form: buyFormReducer,\r\n user: userReducer,\r\n coupon: couponReducer,\r\n})\r\n\r\nexport type LmiCentralAppState = ReturnType\r\nexport type LmiCentralContainerAppState = {\r\n lmicentral: LmiCentralAppState\r\n}\r\n","import { createStore, combineReducers, applyMiddleware, StoreEnhancer } from 'redux'\r\nimport createSagaMiddleware from 'redux-saga'\r\nimport { composeWithDevTools } from 'redux-devtools-extension'\r\nimport { commonAppReducer } from '@common/store'\r\nimport commonSagas from '@common/sagas'\r\nimport { createThrottleMiddleware } from '@common/utils'\r\nimport { connectAppReducer, gtcThrottle } from '@gtc/store'\r\nimport gtcsagas from '@gtc/saga'\r\nimport gtResolveSagas from '@gtresolve/saga'\r\nimport lmiProSagas from '@lmipro/saga'\r\nimport lmiCentralSagas from '@lmicentral/saga'\r\nimport { resolveAppReducer, gtResolveThrottle } from '@gtresolve/store'\r\nimport { lmiProAppReducer, lmiProThrottle } from '@lmipro/store'\r\nimport { PLATFORM } from '@common/constants'\r\nimport { buyAppReducer, buyThrottle } from '@buy/store'\r\nimport buySagas from '@buy/saga'\r\nimport { lmiCentralAppReducer, lmiCentralThrottle } from '@lmicentral/store'\r\n\r\nconst createReducer = () => {\r\n return combineReducers({\r\n common: commonAppReducer,\r\n connect: connectAppReducer,\r\n resolve: resolveAppReducer,\r\n lmipro: lmiProAppReducer,\r\n lmicentral: lmiCentralAppReducer,\r\n buy: buyAppReducer,\r\n })\r\n}\r\n\r\nconst sagaMiddleware = createSagaMiddleware({\r\n onError: (error, { sagaStack }) => {\r\n console.error(sagaStack)\r\n console.error(error.message)\r\n },\r\n})\r\n\r\nconst throttleMiddleware = createThrottleMiddleware([\r\n gtcThrottle,\r\n gtResolveThrottle,\r\n lmiProThrottle,\r\n lmiCentralThrottle,\r\n buyThrottle,\r\n])\r\n\r\nconst middlewares = [sagaMiddleware, throttleMiddleware]\r\n\r\nconst composeEnhancers = composeWithDevTools({\r\n // Specify custom devTools options\r\n trace: true,\r\n})\r\nconst enhancer: StoreEnhancer =\r\n process.env.ENVIRONMENT === PLATFORM.DEV\r\n ? composeEnhancers(applyMiddleware(...middlewares))\r\n : applyMiddleware(...middlewares)\r\n\r\nconst appReducer = createReducer()\r\n\r\nexport const appStore = createStore(appReducer, undefined, enhancer)\r\n\r\nconst appSagas = { ...gtcsagas, ...gtResolveSagas, ...lmiProSagas, ...lmiCentralSagas, ...commonSagas, ...buySagas }\r\n\r\nconst runSagas = () => {\r\n Object.values(appSagas).forEach((saga) => {\r\n sagaMiddleware.run(saga)\r\n })\r\n}\r\nrunSagas()\r\n\r\nexport type AppState = ReturnType\r\n","import { isConnectApp } from '@common/utils'\r\nimport { saveSessionState, saveState } from '@gtc/utils'\r\nimport { AppState } from 'app-store'\r\nimport { MiddlewareAPI } from 'redux'\r\n\r\nexport const gtcThrottle = (store: MiddlewareAPI) => {\r\n if (isConnectApp()) {\r\n const appState: AppState = store.getState()\r\n const gtcStore = appState.connect\r\n const {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n savedStateLoaded,\r\n purchaseComplete,\r\n addonComplete,\r\n } = gtcStore.checkout\r\n const { urlCouponCode } = gtcStore.coupon\r\n if (savedStateLoaded && !purchaseComplete && !addonComplete) {\r\n saveState({\r\n checkout: {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n },\r\n })\r\n if (urlCouponCode) {\r\n saveSessionState({\r\n coupon: {\r\n urlCouponCode,\r\n },\r\n })\r\n }\r\n }\r\n }\r\n}\r\n","import { isResolveApp, saveSessionState as saveCommonSessionState } from '@common/utils'\r\nimport { saveSessionState, saveState } from '@gtresolve/utils'\r\nimport { AppState } from 'app-store'\r\nimport { MiddlewareAPI } from 'redux'\r\nimport { STORAGE_CONST } from '@common/constants'\r\n\r\nexport const gtResolveThrottle = (store: MiddlewareAPI) => {\r\n if (isResolveApp()) {\r\n const appState: AppState = store.getState()\r\n const gtResolveStore = appState.resolve\r\n const commonStore = appState.common\r\n const {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n savedStateLoaded,\r\n purchaseComplete,\r\n addonComplete,\r\n } = gtResolveStore.checkout\r\n const { urlCouponCode } = gtResolveStore.coupon\r\n const { language } = commonStore.content\r\n if (savedStateLoaded && !purchaseComplete && !addonComplete) {\r\n saveState({\r\n checkout: {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n },\r\n })\r\n if (urlCouponCode) {\r\n saveSessionState({\r\n coupon: {\r\n urlCouponCode,\r\n },\r\n })\r\n }\r\n if (language) {\r\n saveCommonSessionState(STORAGE_CONST.SAVED_LANGUAGE, language)\r\n }\r\n }\r\n }\r\n}\r\n","import { isLmiProApp, saveSessionState as saveCommonSessionState } from '@common/utils'\r\nimport { saveSessionState, saveState } from '@lmipro/utils'\r\nimport { AppState } from 'app-store'\r\nimport { MiddlewareAPI } from 'redux'\r\nimport { STORAGE_CONST } from '@common/constants'\r\n\r\nexport const lmiProThrottle = (store: MiddlewareAPI) => {\r\n if (isLmiProApp()) {\r\n const appState: AppState = store.getState()\r\n const lmiProStore = appState.lmipro\r\n const commonStore = appState.common\r\n const {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n savedStateLoaded,\r\n purchaseComplete,\r\n addonComplete,\r\n } = lmiProStore.checkout\r\n const { urlCouponCode } = lmiProStore.coupon\r\n const { language } = commonStore.content\r\n if (savedStateLoaded && !purchaseComplete && !addonComplete) {\r\n saveState({\r\n checkout: {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n },\r\n })\r\n if (urlCouponCode) {\r\n saveSessionState({\r\n coupon: {\r\n urlCouponCode,\r\n },\r\n })\r\n }\r\n if (language) {\r\n saveCommonSessionState(STORAGE_CONST.SAVED_LANGUAGE, language)\r\n }\r\n }\r\n }\r\n}\r\n","import { isLmiCentralApp, saveSessionState as saveCommonSessionState } from '@common/utils'\r\nimport { saveSessionState, saveState } from '@lmicentral/utils'\r\nimport { AppState } from 'app-store'\r\nimport { MiddlewareAPI } from 'redux'\r\nimport { STORAGE_CONST } from '@common/constants'\r\n\r\nexport const lmiCentralThrottle = (store: MiddlewareAPI) => {\r\n if (isLmiCentralApp()) {\r\n const appState: AppState = store.getState()\r\n const lmiCentralStore = appState.lmicentral\r\n const commonStore = appState.common\r\n const {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n savedStateLoaded,\r\n purchaseComplete,\r\n addonComplete,\r\n } = lmiCentralStore.checkout\r\n const { urlCouponCode } = lmiCentralStore.coupon\r\n const { language } = commonStore.content\r\n if (savedStateLoaded && !purchaseComplete && !addonComplete) {\r\n saveState({\r\n checkout: {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n },\r\n })\r\n if (urlCouponCode) {\r\n saveSessionState({\r\n coupon: {\r\n urlCouponCode,\r\n },\r\n })\r\n }\r\n if (language) {\r\n saveCommonSessionState(STORAGE_CONST.SAVED_LANGUAGE, language)\r\n }\r\n }\r\n }\r\n}\r\n","import { isBuyApp, saveSessionState as saveCommonSessionState } from '@common/utils'\r\nimport { saveSessionState, saveState } from '@buy/utils'\r\nimport { AppState } from 'app-store'\r\nimport { MiddlewareAPI } from 'redux'\r\nimport { STORAGE_CONST } from '@common/constants'\r\n\r\nexport const buyThrottle = (store: MiddlewareAPI) => {\r\n // TODO : load isBuyApp based on product config\r\n if (isBuyApp()) {\r\n const appState: AppState = store.getState()\r\n const gtBuyStore = appState.buy\r\n const commonStore = appState.common\r\n const {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n savedStateLoaded,\r\n purchaseComplete,\r\n addonComplete,\r\n } = gtBuyStore.checkout\r\n const { urlCouponCode } = gtBuyStore.coupon\r\n const { language } = commonStore.content\r\n if (savedStateLoaded && !purchaseComplete && !addonComplete) {\r\n saveState({\r\n checkout: {\r\n organizers,\r\n billingFrequency,\r\n selectedPlanSku,\r\n selectedAddons,\r\n },\r\n })\r\n if (urlCouponCode) {\r\n saveSessionState({\r\n coupon: {\r\n urlCouponCode,\r\n },\r\n })\r\n }\r\n if (language) {\r\n saveCommonSessionState(STORAGE_CONST.SAVED_LANGUAGE, language)\r\n }\r\n }\r\n }\r\n}\r\n","import React from 'react'\r\nimport { render } from 'react-dom'\r\nimport { Provider } from 'react-redux'\r\nimport { ErrorBoundary } from '@common/components'\r\nimport { initializeApplicationInsights } from '@common/utils/application-insight'\r\nimport { AppInsightsContext } from '@microsoft/applicationinsights-react-js'\r\nimport { AppRoutes } from './Routes'\r\nimport { appStore } from './app-store'\r\n\r\nconst reactPlugin = initializeApplicationInsights()\r\n\r\nconst App = () => (\r\n // we will have to change/move this code and make it part of products/g2c and have separate webpack build process\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n)\r\n\r\n/**\r\n * Inject overall application store state and routes\r\n *\r\n * @todo update in the future to route different sites\r\n */\r\nrender(, document.getElementById('app'))\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"box-wrapper-module__wrapper\"};","import React, { FunctionComponent } from 'react'\r\n\r\n// Import Local Styles\r\nimport styles from './box-wrapper.module.css'\r\n\r\nexport interface BoxWrapperProps {\r\n modifier?: string\r\n}\r\n\r\nexport const BoxWrapper: FunctionComponent = ({ children, modifier, ...props }) => {\r\n return (\r\n
\r\n {children}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"button\":\"common-button-module__button\",\"button--arrow\":\"common-button-module__button--arrow\",\"button--alternate-color\":\"common-button-module__button--alternate-color\",\"button--large\":\"common-button-module__button--large\",\"button--medium\":\"common-button-module__button--medium\",\"button--small\":\"common-button-module__button--small\",\"button--default\":\"common-button-module__button--default\",\"button--default-primary\":\"common-button-module__button--default-primary\",\"button--default-secondary\":\"common-button-module__button--default-secondary\",\"button--legacy\":\"common-button-module__button--legacy\",\"button--legacy-primary\":\"common-button-module__button--legacy-primary\",\"button--legacy-secondary\":\"common-button-module__button--legacy-secondary\",\"button--default-tertiary\":\"common-button-module__button--default-tertiary\",\"button--default-quaternary\":\"common-button-module__button--default-quaternary\",\"button--lmipro-primary\":\"common-button-module__button--lmipro-primary\",\"button--lmipro-tertiary\":\"common-button-module__button--lmipro-tertiary\",\"button--default-primary-animated\":\"common-button-module__button--default-primary-animated\",\"button--default-secondary-animated\":\"common-button-module__button--default-secondary-animated\"};","import React, { FunctionComponent, ButtonHTMLAttributes } from 'react'\r\nimport classNames from 'classnames'\r\nimport { Theme } from '@common/constants/theme-types'\r\n\r\nimport styles from './common-button.module.css'\r\n\r\ntype Purpose = 'primary' | 'secondary' | 'tertiary' | 'quaternary' | 'primary-animated' | 'secondary-animated'\r\n\r\nexport interface ButtonProps extends ButtonHTMLAttributes {\r\n modifier?: string\r\n purpose?: Purpose\r\n arrow?: boolean\r\n theme?: Theme\r\n size?: 'small' | 'medium' | 'large' | undefined\r\n qaTag?: string\r\n 'aria-labelledby'?: string | undefined\r\n}\r\n\r\nexport const CommonButton: FunctionComponent = ({\r\n modifier = '',\r\n purpose = 'primary',\r\n arrow,\r\n theme = 'default',\r\n size,\r\n children,\r\n disabled,\r\n qaTag = 'common-button',\r\n ...props\r\n}) => {\r\n const classList = classNames({\r\n [styles.button]: true,\r\n [styles['button--arrow']]: arrow,\r\n [styles[`button--${theme}`]]: true,\r\n [styles[`button--${theme}-${purpose}`]]: true,\r\n [styles[`button--${size}`]]: size,\r\n [modifier]: modifier,\r\n [styles.disabled]: disabled,\r\n })\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport parse from 'html-react-parser'\r\nimport sanitizeHTML from 'sanitize-html'\r\n\r\nexport interface ConvertStringToReactProps {\r\n htmlString: string\r\n}\r\n\r\nexport const ConvertStringToReact: FunctionComponent = ({ htmlString }) => {\r\n const sanitizeHtmlString = sanitizeHTML(htmlString, {\r\n allowedSchemes: ['http', 'https', 'mailto', 'tel'],\r\n })\r\n return <>{parse(sanitizeHtmlString)}\r\n}\r\n","var _defs, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgAlertWarn = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 20,\n height: 20\n}, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"filter\", {\n id: \"alert-warn_svg__a\"\n}, /*#__PURE__*/React.createElement(\"feColorMatrix\", {\n in: \"SourceGraphic\",\n values: \"0 0 0 0 0.850980 0 0 0 0 0.678431 0 0 0 0 0.000000 0 0 0 1.000000 0\"\n})))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 0h20v20H0z\"\n}), /*#__PURE__*/React.createElement(\"g\", {\n filter: \"url(#alert-warn_svg__a)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#165C7D\",\n d: \"M9.89 12.067a.703.703 0 0 0 .702-.701v-4.91a.702.702 0 0 0-1.402 0v4.91c0 .386.315.701.7.701m0 1.455a1.014 1.014 0 1 1 0 2.026 1.014 1.014 0 0 1 0-2.025\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#165C7D\",\n d: \"M17.472 17.085c-.06.102-.196.277-.424.277l-14.097-.02c-.228 0-.365-.173-.428-.274a.83.83 0 0 1-.031-.8l6.89-13.553c.102-.2.266-.326.45-.326h.002c.183 0 .348.119.453.319l7.203 13.567a.84.84 0 0 1-.018.81m1.255-1.469-7.206-13.56C11.171 1.391 10.54 1 9.831 1h-.018c-.711.007-1.343.41-1.686 1.084L1.24 15.63a2.24 2.24 0 0 0 .084 2.167c.361.589.967.947 1.623.947l14.097.021h.004c.663 0 1.27-.362 1.627-.958a2.25 2.25 0 0 0 .052-2.191\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M17.472 17.085c-.06.102-.196.277-.424.277l-14.097-.02c-.228 0-.365-.173-.428-.274a.83.83 0 0 1-.031-.8l6.89-13.553c.102-.2.266-.326.45-.326h.002c.183 0 .348.119.453.319l7.203 13.567a.84.84 0 0 1-.018.81m1.255-1.469-7.206-13.56C11.171 1.391 10.54 1 9.831 1h-.018c-.711.007-1.343.41-1.686 1.084L1.24 15.63a2.24 2.24 0 0 0 .084 2.167c.361.589.967.947 1.623.947l14.097.021h.004c.663 0 1.27-.362 1.627-.958a2.25 2.25 0 0 0 .052-2.191\"\n})))));\nexport { SvgAlertWarn as ReactComponent };\nexport default __webpack_public_path__ + \"img/alert-warn.670099a9869ac583ec5e68b02fdd3634.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgAlertInactive = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 20,\n height: 20\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#E02D52\",\n fillRule: \"evenodd\",\n d: \"M10 2.068c.28 0 .562.14.722.417l8.196 14.197a.834.834 0 0 1-.721 1.25H1.803a.834.834 0 0 1-.721-1.25L9.278 2.485A.83.83 0 0 1 10 2.068m0 2.5L3.247 16.265h13.506zm0 10.849a.834.834 0 1 1 .002-1.668.834.834 0 0 1-.002 1.668m.833-3.334a.836.836 0 0 1-.833.834.836.836 0 0 1-.833-.834V8.75c0-.458.375-.833.833-.833s.833.375.833.833z\"\n})));\nexport { SvgAlertInactive as ReactComponent };\nexport default __webpack_public_path__ + \"img/alert-inactive.a14d4320945e0e7b6e87233720a2c1d8.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"error-message\":\"error-message-module__error-message\",\"warning\":\"error-message-module__warning\"};","// Import Dependencies\r\nimport React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport warningImg from '@common/images/alert-warn.svg'\r\nimport errorImg from '@common/images/alert-inactive.svg'\r\n// Import Local Styles\r\nimport styles from './error-message.module.css'\r\nimport { ConvertStringToReact } from '../ConvertStringToReact'\r\n\r\nexport interface ErrorMessageProps {\r\n errorMessage?: string\r\n warning?: boolean\r\n}\r\n\r\nexport const ErrorMessage: FunctionComponent = ({ errorMessage, warning = false, children }) => {\r\n const classList = classNames({\r\n [styles['error-message']]: true,\r\n [styles.warning]: warning,\r\n })\r\n return (\r\n
\r\n \"Alert\"\r\n {errorMessage ? : children}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"error-view-module__wrapper\",\"msgBlock\":\"error-view-module__msgBlock\",\"errorImg\":\"error-view-module__errorImg\",\"errorMsg\":\"error-view-module__errorMsg\"};","import React, { FunctionComponent } from 'react'\r\n\r\n// Import Components\r\nimport errorIcon from '@common/images/icon-error.svg'\r\nimport { BoxWrapper } from '../BoxWrapper'\r\n\r\nimport styles from './error-view.module.css'\r\n\r\nexport const ErrorView: FunctionComponent = ({ children }) => {\r\n return (\r\n
\r\n \r\n \"error\r\n

{children}

\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default ErrorView\r\n","// extracted by mini-css-extract-plugin\nexport default {\"flex-field\":\"flex-field__flex-field\",\"ff-label\":\"flex-field__ff-label\",\"ff-label--focus\":\"flex-field__ff-label--focus\",\"ff-label--has-value\":\"flex-field__ff-label--has-value\",\"flex-field--error\":\"flex-field__flex-field--error\",\"flex-field--valid\":\"flex-field__flex-field--valid\",\"ff-error-message\":\"flex-field__ff-error-message\"};","import { ValidationResponse } from '@common/state/flex/state'\r\nimport React, { FunctionComponent, useEffect, useState } from 'react'\r\nimport { getFlexMicroform } from '@common/utils'\r\nimport classNames from 'classnames'\r\nimport styles from './flex-field.css'\r\n\r\ninterface FlexFieldProps {\r\n id: string\r\n flexFieldType: string\r\n wrapperClass: string\r\n labelCopy: string\r\n valid: boolean\r\n hasError: boolean\r\n errorCopyEmpty: string\r\n errorCopyNotEmpty: string\r\n microformCreated: boolean\r\n onChange: (valid: boolean) => void\r\n onBlur: () => void\r\n shouldRefresh: boolean\r\n}\r\n\r\nexport const FlexField: FunctionComponent = (props) => {\r\n const [needToRefresh, setNeedToRefresh] = useState(props.shouldRefresh)\r\n const [isFieldFocused, setIsFieldFocused] = useState(false)\r\n const [hasValue, setHasValue] = useState(false)\r\n const [hasMicroformAttachedEvents, setHasMicroformAttachedEvents] = useState(false)\r\n\r\n const displayErrorUI = !isFieldFocused && props.hasError\r\n\r\n // update the internal state to props.shouldRefresh\r\n useEffect(() => {\r\n setNeedToRefresh(props.shouldRefresh)\r\n }, [props.shouldRefresh])\r\n\r\n // Refresh the flex field\r\n useEffect(() => {\r\n if (needToRefresh && hasMicroformAttachedEvents) {\r\n setHasValue(false)\r\n setHasMicroformAttachedEvents(false)\r\n setNeedToRefresh(false)\r\n }\r\n }, [hasMicroformAttachedEvents, needToRefresh])\r\n\r\n // Create flex field and attach events\r\n useEffect(() => {\r\n const microformInstance = getFlexMicroform()\r\n if (props.microformCreated && microformInstance && !hasMicroformAttachedEvents) {\r\n const field = microformInstance.createField(props.flexFieldType)\r\n field.load(`#${props.id}`)\r\n\r\n field.on('change', (resp?: ValidationResponse) => {\r\n setHasValue(!resp?.empty)\r\n props.onChange(!!resp?.valid)\r\n })\r\n\r\n field.on('focus', () => {\r\n setIsFieldFocused(true)\r\n })\r\n\r\n field.on('blur', () => {\r\n setIsFieldFocused(false)\r\n if (props.onBlur) {\r\n props.onBlur()\r\n }\r\n })\r\n\r\n setHasMicroformAttachedEvents(true)\r\n }\r\n }, [hasMicroformAttachedEvents, props, needToRefresh])\r\n\r\n const classList = classNames({\r\n [styles['ff-label']]: true,\r\n [styles['ff-label--focus']]: isFieldFocused,\r\n [styles['ff-label--has-value']]: hasValue,\r\n [styles['ff-label--error']]: displayErrorUI,\r\n })\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n {props.labelCopy}\r\n
\r\n \r\n
\r\n {displayErrorUI && (\r\n
\r\n {hasValue ? props.errorCopyNotEmpty : props.errorCopyEmpty}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"info-view-module__wrapper\",\"msgBlock\":\"info-view-module__msgBlock\",\"img\":\"info-view-module__img\",\"msg\":\"info-view-module__msg\"};","import React, { FunctionComponent } from 'react'\r\nimport icon from '@common/images/icon-info.svg'\r\nimport { BoxWrapper } from '../BoxWrapper'\r\nimport styles from './info-view.module.css'\r\n\r\nexport const InfoView: FunctionComponent = ({ children }) => {\r\n return (\r\n
\r\n \r\n \"info\r\n
{children}
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default InfoView\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"inputField-module__wrapper\",\"wrapper--compact\":\"inputField-module__wrapper--compact\",\"label\":\"inputField-module__label\",\"wrapper--focused\":\"inputField-module__wrapper--focused\",\"error-message\":\"inputField-module__error-message\",\"hint\":\"inputField-module__hint\",\"warning\":\"inputField-module__warning\",\"warning-message\":\"inputField-module__warning-message\"};","import React, { useState, FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\nimport { debounce } from 'lodash-es'\r\n\r\nimport { useIsMountedRef } from '@common/hooks/useIsMountedRef'\r\nimport { Input, InputProps } from '../Input'\r\n\r\nimport styles from './inputField.module.css'\r\n\r\nexport interface InputFieldProps extends InputProps {\r\n label?: string\r\n hint?: string\r\n wrapperClass?: string\r\n focus?: boolean\r\n modifier?: string\r\n}\r\n\r\nexport const InputField: FunctionComponent = ({\r\n wrapperClass = '',\r\n modifier = '',\r\n focus,\r\n ...props\r\n}) => {\r\n const { id, label, error, hint, warning, value, style } = props\r\n const [isFocus, setIsFocus] = useState(!!focus)\r\n const debounceTime = 250\r\n\r\n const isMountedRef = useIsMountedRef()\r\n\r\n const getDebouncedOnFocus = (e: React.FocusEvent) =>\r\n debounce(() => {\r\n if (isMountedRef.current) {\r\n if (props.onFocus) {\r\n props.onFocus(e)\r\n }\r\n }\r\n }, debounceTime)\r\n\r\n const getDebouncedOnBlur = (e: React.FocusEvent) =>\r\n debounce(() => {\r\n if (isMountedRef.current) {\r\n if (props.onBlur) {\r\n props.onBlur(e)\r\n }\r\n }\r\n }, debounceTime)\r\n\r\n const getDebouncedOnChange = (e: React.ChangeEvent) =>\r\n debounce(() => {\r\n if (isMountedRef.current) {\r\n if (props.onChange) {\r\n props.onChange(e)\r\n }\r\n }\r\n }, debounceTime)\r\n\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [wrapperClass]: !!wrapperClass,\r\n [modifier]: !!modifier,\r\n [styles['wrapper--compact']]: true, // If we need other sizes in the future, we can introduce a prop for it then\r\n [styles['wrapper--focused']]: value || isFocus,\r\n })\r\n\r\n return (\r\n
\r\n \r\n {\r\n e.persist()\r\n setIsFocus(false)\r\n const debounceOnBlur = getDebouncedOnBlur(e)\r\n debounceOnBlur()\r\n }}\r\n onFocus={(e) => {\r\n e.persist()\r\n setIsFocus(true)\r\n const debounceOnFocus = getDebouncedOnFocus(e)\r\n debounceOnFocus()\r\n }}\r\n onChange={(e) => {\r\n e.persist()\r\n const debounceOnChange = getDebouncedOnChange(e)\r\n debounceOnChange()\r\n }}\r\n />\r\n {error && (\r\n
\r\n {error}\r\n
\r\n )}\r\n {hint && isFocus &&
{hint}
}\r\n {warning &&
{warning}
}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"input\":\"input-module__input\",\"error\":\"input-module__error\",\"warning\":\"input-module__warning\",\"valid\":\"input-module__valid\"};","import React, { FunctionComponent, useState, useEffect, InputHTMLAttributes } from 'react'\r\nimport classNames from 'classnames'\r\n\r\n// Import Local Styles\r\nimport styles from './input.module.css'\r\n\r\nexport interface GenericInputProps extends InputHTMLAttributes {\r\n error?: string\r\n warning?: boolean\r\n valid?: boolean\r\n inputRef?: React.RefObject | null\r\n checkValid?: (value: string) => boolean\r\n}\r\n\r\nexport const GenericInput: FunctionComponent = (props) => {\r\n const autoComplete = props.autoComplete ? props.autoComplete : 'on'\r\n const { warning, error, onChange, valid, inputRef, value, maxLength = 50, checkValid, ...rest } = props\r\n\r\n const [inputValue, setInputValue] = useState(value || '')\r\n\r\n const classList = classNames({\r\n [styles.input]: true,\r\n [styles.error]: error,\r\n [styles.valid]: valid,\r\n [styles.warning]: warning,\r\n })\r\n\r\n useEffect(() => {\r\n setInputValue(value || '')\r\n }, [value, props.type])\r\n\r\n const setValue = (event: React.ChangeEvent) => {\r\n setInputValue(event.target.value)\r\n if (onChange) {\r\n onChange(event)\r\n }\r\n }\r\n\r\n return (\r\n {\r\n if (checkValid) {\r\n if (checkValid(e.target.value)) {\r\n setValue(e)\r\n }\r\n } else {\r\n setValue(e)\r\n }\r\n }}\r\n ref={inputRef}\r\n value={inputValue}\r\n maxLength={maxLength}\r\n />\r\n )\r\n}\r\n","import React, { FunctionComponent, useState, useEffect } from 'react'\r\nimport InputMask, { ReactInputMask } from 'react-input-mask'\r\nimport classNames from 'classnames'\r\n\r\nimport { GenericInputProps } from './GenericInput'\r\n\r\n// Import Local Styles\r\nimport styles from './input.module.css'\r\n\r\nexport interface MaskedInputProps extends GenericInputProps {\r\n mask?: string | Array\r\n maskChar?: string\r\n alwaysShowMask?: boolean\r\n beforeMaskedStateChange?: (nextState: Record) => void\r\n maskedInputRef?: React.RefObject | null\r\n}\r\n\r\nexport const MaskedInput: FunctionComponent = (props) => {\r\n const { mask, warning, error, onChange, valid, value, maskedInputRef, ...rest } = props\r\n\r\n const [inputValue, setInputValue] = useState(value || '')\r\n\r\n const classList = classNames({\r\n [styles.input]: true,\r\n [styles.error]: error,\r\n [styles.valid]: valid,\r\n [styles.warning]: warning,\r\n })\r\n\r\n useEffect(() => {\r\n setInputValue(value || '')\r\n }, [value])\r\n\r\n return (\r\n {\r\n setInputValue(e.target.value)\r\n if (onChange) {\r\n onChange(e)\r\n }\r\n }}\r\n ref={maskedInputRef}\r\n value={inputValue}\r\n />\r\n )\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\n\r\nimport { GenericInput } from './GenericInput'\r\nimport { MaskedInputProps, MaskedInput } from './MaskedInput'\r\n\r\nexport interface InputProps extends MaskedInputProps {\r\n ismasked?: boolean\r\n}\r\n\r\nexport const Input: FunctionComponent = ({ ismasked, ...rest }) => {\r\n return ismasked ? : \r\n}\r\n","var _style, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgGtmProcessSpinnerAcceleratedBlue3S = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g81\",\n shapeRendering: \"geometricPrecision\",\n textRendering: \"geometricPrecision\",\n viewBox: \"-5 -2 94 94\"\n}, props), _style || (_style = /*#__PURE__*/React.createElement(\"style\", null, \"@keyframes e9ic250nk5g83_tr__tr{0%{transform:translate(41px,45px) rotate(0deg)}60%{transform:translate(41px,45px) rotate(90deg);animation-timing-function:cubic-bezier(.42,0,.58,1)}to{transform:translate(41px,45px) rotate(360deg)}}\")), /*#__PURE__*/React.createElement(\"g\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g82\",\n style: {\n animation: \"e9ic250nk5g83_tr__tr 2000ms linear infinite normal forwards\"\n },\n transform: \"translate(41 45)\"\n}, _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g83\",\n transform: \"translate(-41 -45)\"\n}, /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g84\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(41.5 7.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g85\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(7.5 26.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g86\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(74.5 26.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g87\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(41.5 82.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g88\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(7.5 63.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-blue-3s_svg__e9ic250nk5g89\",\n r: 7.5,\n fill: \"#479FFE\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(74.5 63.5)\"\n})))));\nexport { SvgGtmProcessSpinnerAcceleratedBlue3S as ReactComponent };\nexport default __webpack_public_path__ + \"img/gtm-process-spinner-accelerated-blue-3s.f15c20bd0517aa13996a51d11eae6bf9.svg\";","var _style, _circle, _circle2, _circle3, _circle4, _circle5, _circle6;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgGtmProcessSpinnerWhiteB2S = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n id: \"gtm-process-spinner-white-b-2s_svg__el_vSCgDoIx3\",\n viewBox: \"-6 -2 94 94\"\n}, props), _style || (_style = /*#__PURE__*/React.createElement(\"style\", null, \"@-webkit-keyframes kf_el_ruD27vUZMd_an_E--iARsyv{0%{-webkit-transform:translate(41px,45px) rotate(0deg) translate(-41px,-45px);transform:translate(41px,45px) rotate(0deg) translate(-41px,-45px)}to{-webkit-transform:translate(41px,45px) rotate(360deg) translate(-41px,-45px);transform:translate(41px,45px) rotate(360deg) translate(-41px,-45px)}}@keyframes kf_el_ruD27vUZMd_an_E--iARsyv{0%{-webkit-transform:translate(41px,45px) rotate(0deg) translate(-41px,-45px);transform:translate(41px,45px) rotate(0deg) translate(-41px,-45px)}to{-webkit-transform:translate(41px,45px) rotate(360deg) translate(-41px,-45px);transform:translate(41px,45px) rotate(360deg) translate(-41px,-45px)}}#gtm-process-spinner-white-b-2s_svg__el_vSCgDoIx3 *{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:cubic-bezier(0,0,1,1);animation-timing-function:cubic-bezier(0,0,1,1)}\")), /*#__PURE__*/React.createElement(\"g\", {\n style: {\n WebkitAnimationFillMode: \"backwards\",\n animationFillMode: \"backwards\",\n WebkitTransform: \"translate(41px,45px) rotate(0deg) translate(-41px,-45px)\",\n transform: \"translate(41px,45px) rotate(0deg) translate(-41px,-45px)\",\n WebkitAnimationName: \"kf_el_ruD27vUZMd_an_E--iARsyv\",\n animationName: \"kf_el_ruD27vUZMd_an_E--iARsyv\",\n WebkitAnimationTimingFunction: \"cubic-bezier(0,0,1,1)\",\n animationTimingFunction: \"cubic-bezier(0,0,1,1)\"\n }\n}, /*#__PURE__*/React.createElement(\"g\", {\n fillRule: \"evenodd\",\n \"data-animator-group\": \"true\",\n \"data-animator-type\": 1,\n style: {\n fill: \"#fff\"\n }\n}, _circle || (_circle = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_WBPP0OMhmm\",\n cx: 41.5,\n cy: 7.5,\n r: 9\n})), _circle2 || (_circle2 = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_h2vVpLS4lU\",\n cx: 7.5,\n cy: 26.5,\n r: 9\n})), _circle3 || (_circle3 = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_NsV30AeZ3I\",\n cx: 74.5,\n cy: 26.5,\n r: 9\n})), _circle4 || (_circle4 = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_cCOrJEkOra\",\n cx: 41.5,\n cy: 82.5,\n r: 9\n})), _circle5 || (_circle5 = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_iXBEf2lGU4\",\n cx: 7.5,\n cy: 63.5,\n r: 9\n})), _circle6 || (_circle6 = /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-white-b-2s_svg__el_qf7Sncj3Sg\",\n cx: 74.5,\n cy: 63.5,\n r: 9\n})))));\nexport { SvgGtmProcessSpinnerWhiteB2S as ReactComponent };\nexport default __webpack_public_path__ + \"img/gtm-process-spinner-white-b-2s.e1eb4cf4074bdf14cb97a4315c80cc5b.svg\";","var _style, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgGtmProcessSpinnerAcceleratedDisabled3S = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g81\",\n shapeRendering: \"geometricPrecision\",\n textRendering: \"geometricPrecision\",\n viewBox: \"-5 -2 94 94\"\n}, props), _style || (_style = /*#__PURE__*/React.createElement(\"style\", null, \"@keyframes e9ic250nk5g83_tr__tr{0%{transform:translate(41px,45px) rotate(0deg)}60%{transform:translate(41px,45px) rotate(90deg);animation-timing-function:cubic-bezier(.42,0,.58,1)}to{transform:translate(41px,45px) rotate(360deg)}}\")), /*#__PURE__*/React.createElement(\"g\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g82\",\n style: {\n animation: \"e9ic250nk5g83_tr__tr 2000ms linear infinite normal forwards\"\n },\n transform: \"translate(41 45)\"\n}, _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g83\",\n transform: \"translate(-41 -45)\"\n}, /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g84\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(41.5 7.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g85\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(7.5 26.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g86\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(74.5 26.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g87\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(41.5 82.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g88\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(7.5 63.5)\"\n}), /*#__PURE__*/React.createElement(\"circle\", {\n id: \"gtm-process-spinner-accelerated-disabled-3s_svg__e9ic250nk5g89\",\n r: 7.5,\n fill: \"rgba(22,92,125,.4)\",\n fillRule: \"evenodd\",\n stroke: \"none\",\n strokeWidth: 1,\n transform: \"translate(74.5 63.5)\"\n})))));\nexport { SvgGtmProcessSpinnerAcceleratedDisabled3S as ReactComponent };\nexport default __webpack_public_path__ + \"img/gtm-process-spinner-accelerated-disabled-3s.8d0c07a1c956803b769b8da3744aa4ac.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"loadingSpinner-module__wrapper\",\"loading\":\"loadingSpinner-module__loading\",\"spin\":\"loadingSpinner-module__spin\",\"copy\":\"loadingSpinner-module__copy\",\"small\":\"loadingSpinner-module__small\"};","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport reserving from '@common/images/gtm-process-spinner-accelerated-blue-3s.svg'\r\nimport reservingWhite from '@common/images/gtm-process-spinner-white-b-2s.svg'\r\nimport reservingdisabled from '@common/images/gtm-process-spinner-accelerated-disabled-3s.svg'\r\nimport styles from './loadingSpinner.module.css'\r\n\r\nexport interface LoadingSpinnerProps {\r\n modifier?: string\r\n wrapperModifier?: string\r\n text?: string\r\n disabled?: boolean\r\n inline?: boolean\r\n white?: boolean\r\n}\r\nexport const LoadingSpinner: FunctionComponent = (props) => {\r\n const { modifier = '', wrapperModifier = '', text, disabled, inline, white = false } = props\r\n\r\n const imgClassList = classNames({\r\n [styles.loading]: true,\r\n [styles.small]: inline,\r\n [modifier]: modifier,\r\n })\r\n\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [wrapperModifier]: wrapperModifier,\r\n })\r\n\r\n if (disabled) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n if (inline) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n \r\n {text && {text}}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"radioInputFieldWithBorder-module__wrapper\"};","/* eslint-disable react/require-default-props */\r\nimport React, { ChangeEvent } from 'react'\r\nimport classNames from 'classnames'\r\nimport styles from './radioInputFieldWithBorder.module.css'\r\n\r\ninterface RadioInputFieldWithBorderProps {\r\n id?: string\r\n modifier?: string\r\n qaTag?: string\r\n label?: string | React.ReactNode\r\n name?: string\r\n defaultChecked?: boolean\r\n value?: string\r\n labelModifier?: string\r\n onChange?: (e: ChangeEvent) => void\r\n}\r\n\r\nexport const RadioInputFieldWithBorder: React.FC = ({\r\n id = '',\r\n label = '',\r\n labelModifier = '',\r\n qaTag = '',\r\n modifier = '',\r\n name = '',\r\n defaultChecked,\r\n value = '',\r\n onChange,\r\n}) => {\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [modifier]: modifier,\r\n })\r\n\r\n return (\r\n
\r\n \r\n {/* Put the label after the input so that the css selector for highlighting the label after the focused checkbox will work */}\r\n \r\n
\r\n )\r\n}\r\n","// Import Dependencies\r\nimport React from 'react'\r\nimport { ErrorView } from '@common/components'\r\n\r\ntype ErrorBoundaryProps = Record\r\n\r\ntype ErrorBoundaryState = {\r\n hasError: boolean\r\n}\r\n\r\nexport class ErrorBoundary extends React.Component {\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props)\r\n this.state = {\r\n hasError: false,\r\n }\r\n }\r\n\r\n componentDidCatch() {\r\n // Display loading spinner\r\n // there is no alternative hook for this at the time being, but we need to monitor and convert this component to function component later\r\n this.setState({ hasError: true })\r\n }\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.state.hasError ? (\r\n \r\n Something went wrong! Please try again. If you're still experiencing problems please call us at\r\n 1 866 890 8931.\r\n \r\n ) : (\r\n this.props.children\r\n )}\r\n \r\n )\r\n }\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"selector\":\"cardselector-module__selector\",\"selector--wrap\":\"cardselector-module__selector--wrap\",\"selector--small\":\"cardselector-module__selector--small\",\"selector--stacked\":\"cardselector-module__selector--stacked\"};","import React, { FunctionComponent } from 'react'\r\n\r\n// Import Local Styles\r\nimport styles from './cardselector.module.css'\r\n\r\nexport interface CardSelectorProps {\r\n small?: boolean\r\n stacked?: boolean\r\n wrap?: boolean\r\n}\r\n\r\nexport const CardSelector: FunctionComponent = ({ small, wrap, stacked, children }) => {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"checkbox-module__wrapper\",\"checkbox\":\"checkbox-module__checkbox\",\"label\":\"checkbox-module__label\",\"centered\":\"checkbox-module__centered\",\"label--checked\":\"checkbox-module__label--checked\"};","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\n// Import Local Styles\r\nimport styles from './checkbox.module.css'\r\n\r\nexport interface CheckboxProps extends React.HTMLAttributes {\r\n checked?: boolean\r\n modifier?: string\r\n centered?: boolean\r\n label?: string\r\n qaTag?: string\r\n onchange?: React.ChangeEventHandler\r\n disabled?: boolean\r\n}\r\n\r\nexport const Checkbox: FunctionComponent = (props) => {\r\n const { onchange, label, id, checked, modifier = '', centered, qaTag = '', disabled } = props\r\n\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [modifier]: modifier,\r\n })\r\n\r\n const labelClassList = classNames({\r\n [styles.label]: true,\r\n [styles['label--checked']]: checked,\r\n [styles.centered]: centered,\r\n })\r\n\r\n return (\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"link\":\"common-link-module__link\",\"link--arrow\":\"common-link-module__link--arrow\",\"button\":\"common-link-module__button\"};","import React, { AnchorHTMLAttributes, FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport styles from './common-link.module.css'\r\n\r\nexport interface CommonLinkProps extends AnchorHTMLAttributes {\r\n modifier?: string\r\n arrow?: boolean\r\n}\r\n\r\nexport const CommonLink: FunctionComponent = ({ arrow, modifier = '', children, ...props }) => {\r\n const classList = classNames({\r\n [styles.link]: true,\r\n [styles['link--arrow']]: arrow,\r\n [modifier]: modifier,\r\n })\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconCollapse = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 25,\n height: 25\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 0h25v25H0z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C2A29\",\n d: \"M7.415 16.4a.945.945 0 0 1-1.123-.214 1.13 1.13 0 0 1 0-1.515L11.7 8.856a1.076 1.076 0 0 1 1.6 0l5.408 5.815c.296.318.375.8.2 1.208-.231.536-.823.77-1.323.522l-4.135-2.059c-.603-.3-1.298-.3-1.9 0l-4.135 2.059z\"\n}))));\nexport { SvgIconCollapse as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-collapse.e8cc1b6cd03eb90c4b6c49d5b00f73a3.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconModifyOff = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C2A29\",\n d: \"m13.926.868 1.625 1.534c.567.535.597 1.385.09 1.953l-.09.092-10.4 9.822a2.34 2.34 0 0 1-1.1.578l-3.11.69c-.412.09-.824-.15-.92-.54a.7.7 0 0 1 0-.33l.73-2.938a2.14 2.14 0 0 1 .611-1.038L11.76.868a1.596 1.596 0 0 1 2.166 0m-3.38 1.163L9.462 3.053l3.762 3.552 1.083-1.022-3.76-3.552z\"\n})));\nexport { SvgIconModifyOff as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-modify-off.9557f189edcaf1b7185ecec3449ceda2.svg\";","export default __webpack_public_path__ + \"img/icon-welcome@2x.1d2b23b19adccdee1d32e890ab56b602.jpg\";","// allowed keys for numeric only inputs\r\nexport const ALLOWED_NUMERIC_EXTRA_CHARACTERS = ['Tab', 'Backspace', 'Enter', '0', 'ArrowUp', 'ArrowDown']\r\n","// extracted by mini-css-extract-plugin\nexport default {\"selector\":\"license-selector-module__selector\",\"button\":\"license-selector-module__button\",\"button__dark\":\"license-selector-module__button__dark\",\"disabled\":\"license-selector-module__disabled\",\"input-wrapper\":\"license-selector-module__input-wrapper\",\"error-message\":\"license-selector-module__error-message\",\"label\":\"license-selector-module__label\",\"icon\":\"license-selector-module__icon\",\"input\":\"license-selector-module__input\"};","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport { ALLOWED_NUMERIC_EXTRA_CHARACTERS } from '@common/constants/input'\r\n// import components\r\nimport { ErrorMessage } from '../ErrorMessage'\r\n\r\n// Import Local Styles\r\nimport styles from './license-selector.module.css'\r\n\r\nexport interface LicenseSelectorProps {\r\n theme: 'dark' | 'light'\r\n organizers: number\r\n setOrganizers: (organizers: number) => void\r\n error: string\r\n min: number\r\n max: number\r\n qaTag?: string\r\n name?: string\r\n}\r\n\r\nexport const LicenseSelector: FunctionComponent = (props) => {\r\n const { organizers, setOrganizers, min, max, qaTag, theme = 'light', name = '' } = props\r\n const minusClassList = classNames({\r\n [styles.button]: true,\r\n [styles.disabled]: organizers === min,\r\n [styles.button__dark]: theme === 'dark',\r\n })\r\n const plusClassList = classNames({\r\n [styles.button]: true,\r\n [styles.disabled]: organizers === max,\r\n [styles.button__dark]: theme === 'dark',\r\n })\r\n let qatSubtract\r\n let qatAdd\r\n let qatInput\r\n if (qaTag) {\r\n qatSubtract = `${qaTag}-subtract-${organizers === min ? 'disable' : 'enable'}`\r\n qatAdd = `${qaTag}-add-${organizers === max ? 'disable' : 'enable'}`\r\n qatInput = `${qaTag}-input`\r\n }\r\n\r\n // make sure value is within allowed values before setting itqr\r\n const updateOrganizers = (value: string | number) => {\r\n let targetValue = typeof value === 'string' ? Number(value.trim()) : value\r\n\r\n if (targetValue < min) {\r\n targetValue = min\r\n } else if (targetValue > max) {\r\n targetValue = max\r\n }\r\n\r\n setOrganizers(targetValue)\r\n }\r\n\r\n // for users using the plus/minus buttons\r\n const onClickButton = (event: React.MouseEvent, direction: string) => {\r\n event.preventDefault()\r\n updateOrganizers(direction === 'plus' ? organizers + 1 : organizers - 1)\r\n }\r\n\r\n // final validation and input sync up when they blur out\r\n const updateNumberSelector = (event: React.FocusEvent | React.ChangeEvent) => {\r\n const targetElement = event.target as HTMLInputElement\r\n updateOrganizers(targetElement.value)\r\n }\r\n\r\n // restrict characters the user can enter in the input field\r\n const validateKey = (e: React.KeyboardEvent) => {\r\n const { key } = e\r\n if (!Number(key) && !ALLOWED_NUMERIC_EXTRA_CHARACTERS.find((keyVal) => keyVal === key)) {\r\n e.preventDefault()\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {organizers >= max && }\r\n
\r\n {\r\n onClickButton(event, 'minus')\r\n }}\r\n >\r\n \r\n \r\n
\r\n updateNumberSelector(e)}\r\n onKeyDown={(e) => validateKey(e)}\r\n onChange={(e) => updateNumberSelector(e)}\r\n type=\"number\"\r\n className={styles.input}\r\n value={organizers}\r\n min={min}\r\n max={max}\r\n data-qat={qatInput}\r\n aria-label=\"License number\"\r\n />\r\n
\r\n {\r\n onClickButton(event, 'plus')\r\n }}\r\n >\r\n +\r\n \r\n
\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"radios\":\"radioInputField-module__radios\",\"wrapper\":\"radioInputField-module__wrapper\",\"error-message\":\"radioInputField-module__error-message\"};","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport styles from './radioInputField.module.css'\r\n\r\nexport interface RadioInputFieldProps {\r\n error?: string\r\n modifier?: string\r\n}\r\n\r\nexport const RadioInputField: FunctionComponent = ({ error, modifier = '', children }) => {\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [modifier]: !!modifier,\r\n })\r\n return (\r\n
\r\n
{children}
\r\n {error &&
{error}
}\r\n
\r\n )\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\n\r\n// Import Local Styles\r\nimport styles from './select.module.css'\r\n\r\nexport interface SelectProps {\r\n error?: string\r\n hint?: string\r\n wrapperClass?: string\r\n valid?: boolean\r\n label: string | Element | React.ReactNode\r\n selected?: boolean\r\n qaTag?: string\r\n modifier?: string\r\n customArrow?: boolean\r\n name?: string\r\n disabled?: boolean\r\n onChange?: (event: React.ChangeEvent) => void\r\n onBlur?: (event: React.FocusEvent) => void\r\n value?: string | number\r\n children?: React.ReactNode\r\n style?: any\r\n}\r\n\r\nexport const Select: FunctionComponent = ({\r\n name,\r\n label,\r\n error,\r\n hint,\r\n children,\r\n disabled = false,\r\n value,\r\n selected,\r\n wrapperClass = '',\r\n qaTag = '',\r\n valid,\r\n onChange,\r\n onBlur,\r\n modifier = '',\r\n customArrow,\r\n style,\r\n}) => {\r\n const onChangeFn = (ev: React.ChangeEvent) => {\r\n ev.preventDefault()\r\n if (onChange) onChange(ev)\r\n }\r\n\r\n const onBlurFn = (ev: React.FocusEvent) => {\r\n ev.preventDefault()\r\n if (onBlur) onBlur(ev)\r\n }\r\n\r\n const outerWrapperClassList = classNames({\r\n [wrapperClass]: wrapperClass,\r\n [modifier]: !!modifier,\r\n })\r\n\r\n const innerWrapperClassList = classNames({\r\n [styles['select-wrapper']]: true,\r\n [styles.selected]: selected,\r\n [styles.error]: error,\r\n [styles.valid]: valid,\r\n [styles.disabled]: disabled,\r\n })\r\n\r\n const arrowStyles = classNames({\r\n [styles['select-arrow']]: !customArrow,\r\n [styles['select-arrow--custom']]: !!customArrow,\r\n })\r\n\r\n return (\r\n
\r\n {label && (\r\n \r\n )}\r\n
\r\n {children && (\r\n onBlurFn(ev)}\r\n onChange={(ev) => onChangeFn(ev)}\r\n value={value}\r\n >\r\n {children}\r\n \r\n )}\r\n \r\n
\r\n {error && (\r\n
\r\n {error}\r\n
\r\n )}\r\n {hint &&
{hint}
}\r\n
\r\n )\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\nimport { Tooltip } from '@common/components'\r\nimport { ConnectedFormatCurrency } from '@gtc/connectedComponents'\r\nimport styles from './toggle-button.module.css'\r\n\r\nexport interface ToggleButtonProps {\r\n content: Record\r\n onChangeFn: (event: React.ChangeEvent) => void\r\n isOn: boolean\r\n modifier?: string | undefined\r\n id: string\r\n disabled?: boolean\r\n isLarge?: boolean\r\n widget?: boolean\r\n theme?: 'lmipro' | 'default'\r\n monthlyTooltip?: string | undefined\r\n}\r\n\r\nexport const ToggleButton: FunctionComponent = ({\r\n content,\r\n onChangeFn,\r\n modifier = '',\r\n isOn = true,\r\n id,\r\n disabled,\r\n isLarge,\r\n widget,\r\n theme = 'default',\r\n monthlyTooltip,\r\n}) => {\r\n const handleChange = (ev: React.ChangeEvent) => {\r\n if (onChangeFn && !disabled) onChangeFn(ev)\r\n }\r\n\r\n const labelClasses = classNames({\r\n [styles.wrapper]: true,\r\n [styles[`isOn--${theme}`]]: isOn,\r\n [styles['wrapper--large']]: isLarge,\r\n [modifier]: modifier,\r\n [styles.disabled]: disabled,\r\n [styles.widget]: widget,\r\n })\r\n\r\n return (\r\n \r\n )\r\n}\r\n","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconInfoTooltip = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 48,\n height: 48\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 0h48v48H0z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#165C7D\",\n d: \"M24 .832c12.79 0 23.158 10.369 23.158 23.158S36.789 47.148 24 47.148.842 36.78.842 23.99 11.211.832 24 .832m0 2.948c-11.145 0-20.21 9.065-20.21 20.21S12.854 44.2 24 44.2c11.145 0 20.21-9.065 20.21-20.21S35.145 3.78 24 3.78m.027 13.904a2.106 2.106 0 1 1 .001-4.211 2.106 2.106 0 0 1-.001 4.211m-3.595 12.257.06-.42 1.005-5.693H19.76a2.105 2.105 0 1 1 0-4.211H24c1.162 0 2.105.943 2.105 2.105l-1.452 8.455c-.08.56.288 1.135.848 1.234.226.04.44-.015.632-.11.071-.038.139-.076.196-.116.075-.063.15-.13.208-.21l.034-.053c.065-.105.11-.174.126-.235.141-.52.644-.864 1.185-.769.573.101.956.649.855 1.221-.312 1.764-2.421 2.87-4.712 2.465-1.753-.31-3.098-1.416-3.492-2.711a2.6 2.6 0 0 1-.101-.952\"\n}))));\nexport { SvgIconInfoTooltip as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-info-tooltip.70097b482f274d9228a9906569bd095e.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"trigger\":\"tooltip-module__trigger\",\"trigger--inline\":\"tooltip-module__trigger--inline\",\"wrapper\":\"tooltip-module__wrapper\",\"wrapper--right\":\"tooltip-module__wrapper--right\",\"wrapper--left\":\"tooltip-module__wrapper--left\",\"wrapper--visible\":\"tooltip-module__wrapper--visible\",\"content\":\"tooltip-module__content\",\"icon\":\"tooltip-module__icon\"};","import React, { useState, FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\nimport { ConvertStringToReact } from '@common/components'\r\nimport { DIRECTIONS } from '@common/constants'\r\n\r\nimport info from '@common/images/icon-info-tooltip.svg'\r\n// Import Local Styles\r\nimport styles from './tooltip.module.css'\r\n\r\nexport interface ToolTipProps {\r\n content: string\r\n direction?: DIRECTIONS\r\n additionalClass?: string\r\n contentClass?: string\r\n}\r\n\r\nexport const Tooltip: FunctionComponent = ({\r\n children,\r\n content,\r\n direction = '',\r\n additionalClass = '',\r\n contentClass = '',\r\n}) => {\r\n const [isVisible, setIsVisible] = useState(false)\r\n\r\n const classList = classNames({\r\n [styles.wrapper]: true,\r\n [styles['wrapper--visible']]: isVisible,\r\n [styles['wrapper--right']]: direction === DIRECTIONS.RIGHT,\r\n [styles['wrapper--left']]: direction === DIRECTIONS.LEFT,\r\n [contentClass]: !!contentClass,\r\n })\r\n\r\n const containerClassList = classNames({\r\n [styles.trigger]: true,\r\n [additionalClass]: !!additionalClass,\r\n })\r\n\r\n return (\r\n setIsVisible(true)}\r\n onMouseLeave={() => setIsVisible(false)}\r\n >\r\n \"info\"\r\n {children}\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n )\r\n}\r\n","var _defs, _path, _path2, _path3, _path4, _path5;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgImgTrustArc = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n id: \"img-trust-arc_svg__Layer_1\",\n width: 141.7,\n height: 45,\n \"data-name\": \"Layer 1\"\n}, props), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"style\", null, \".img-trust-arc_svg__cls-4{fill:#231f20}.img-trust-arc_svg__cls-5{fill:#004676}\"))), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M26.21 44.83A16.41 16.41 0 0 1 10.15 32.1V32l-1.4-.07a9 9 0 0 1-8.55-9V.17h135.85a5.48 5.48 0 0 1 5.47 5.47v33.71a5.49 5.49 0 0 1-5.47 5.48Z\",\n style: {\n fill: \"#fff\"\n }\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M136.05.35a5.31 5.31 0 0 1 5.3 5.29v33.71a5.32 5.32 0 0 1-5.3 5.3H26.15a16.21 16.21 0 0 1-15.83-12.59l-.06-.25H10l-1.27-.06a8.82 8.82 0 0 1-8.38-8.83V.35zm0-.35H0v22.92a9.17 9.17 0 0 0 8.71 9.16l1.27.06A16.67 16.67 0 0 0 26.18 45h109.87a5.65 5.65 0 0 0 5.65-5.65V5.64A5.65 5.65 0 0 0 136.05 0\",\n style: {\n fill: \"#929497\"\n }\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M4.72 4.72v18.17a5.38 5.38 0 0 0 5.12 5.37 16.15 16.15 0 0 1 13.31-16.19 16.1 16.1 0 0 1 18.69 13.08 16.2 16.2 0 0 1 .24 3.11 5.37 5.37 0 0 0 5.1-5.37V4.72Z\",\n style: {\n fill: \"#5fc323\"\n }\n}), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20.78 28a5.2 5.2 0 1 1 10.4 0zm-7.18 0a12.36 12.36 0 0 0 12.32 12.28 12.23 12.23 0 0 0 8.74-3.64l-2.51-2.5A8.79 8.79 0 1 1 34.7 28h3.54a12.32 12.32 0 0 0-24.64 0\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M54.73 27.26a3.3 3.3 0 0 1-1.35-.26 3 3 0 0 1-1.07-.78A3.6 3.6 0 0 1 51.6 25a5.2 5.2 0 0 1-.26-1.7 5 5 0 0 1 .26-1.68 3.8 3.8 0 0 1 .73-1.27 3.1 3.1 0 0 1 1.09-.8 3.4 3.4 0 0 1 1.37-.28 2.6 2.6 0 0 1 1.25.29 3.4 3.4 0 0 1 .88.67l-.53.64a2.4 2.4 0 0 0-.7-.53 2.1 2.1 0 0 0-.89-.2 2.15 2.15 0 0 0-1 .22 2 2 0 0 0-.77.63 2.9 2.9 0 0 0-.5 1 5.17 5.17 0 0 0 0 2.63 3.4 3.4 0 0 0 .48 1 2.11 2.11 0 0 0 1.76.86 2 2 0 0 0 1-.23 3.1 3.1 0 0 0 .81-.64l.54.61a3.5 3.5 0 0 1-1 .83 2.9 2.9 0 0 1-1.39.21M60.79 27.26a2.9 2.9 0 0 1-1.08-.21 2.8 2.8 0 0 1-.88-.59 2.9 2.9 0 0 1-.58-.94 3.7 3.7 0 0 1-.25-1.27 3.6 3.6 0 0 1 .25-1.25 3 3 0 0 1 .58-1 2.6 2.6 0 0 1 .83-.6 2.3 2.3 0 0 1 1-.2 2.3 2.3 0 0 1 1 .19 1.86 1.86 0 0 1 .73.54 2.5 2.5 0 0 1 .44.85A4.2 4.2 0 0 1 63 23.9v.55h-4a2.3 2.3 0 0 0 .58 1.47 1.77 1.77 0 0 0 1.34.53 2.5 2.5 0 0 0 .77-.12 2.8 2.8 0 0 0 .67-.33l.34.64a4.7 4.7 0 0 1-.84.42 3 3 0 0 1-1.07.2M59 23.77h3.08a2.1 2.1 0 0 0-.37-1.33 1.29 1.29 0 0 0-1-.45 1.55 1.55 0 0 0-1.09.46 2.2 2.2 0 0 0-.37.57 2.5 2.5 0 0 0-.25.75M64.33 27.11v-5.75h.81l.08 1a2.5 2.5 0 0 1 .72-.86 1.44 1.44 0 0 1 .91-.32 1.9 1.9 0 0 1 .62.11l-.19.86-.28-.07a1.17 1.17 0 0 0-1.06.27 2.2 2.2 0 0 0-.69 1V27ZM70.26 27.26a1.75 1.75 0 0 1-.78-.15 1.23 1.23 0 0 1-.51-.39 1.5 1.5 0 0 1-.28-.6 4 4 0 0 1-.08-.78v-3.19h-.85v-.73l.9-.06.12-1.61h.81v1.61h1.55v.79h-1.55v3.2a1.4 1.4 0 0 0 .2.82.77.77 0 0 0 .69.29h.33l.32-.11.19.73a5 5 0 0 1-.51.15 2.5 2.5 0 0 1-.55.03M72.94 20.17a.64.64 0 0 1-.47-.17.56.56 0 0 1-.2-.45.57.57 0 0 1 .2-.46.75.75 0 0 1 1 0 .6.6 0 0 1 .2.46.6.6 0 0 1-.2.45.65.65 0 0 1-.53.17m-.49 6.94v-5.75h1v5.75ZM75.53 27.11v-5h-.79v-.73l.79-.06v-.91a2.2 2.2 0 0 1 .4-1.4 1.55 1.55 0 0 1 1.28-.51 3 3 0 0 1 .51.05 2.6 2.6 0 0 1 .45.14l-.22.75a1.44 1.44 0 0 0-.65-.15c-.53 0-.8.38-.8 1.12v.91h1.22v.79H76.5v5ZM79.32 20.17a.65.65 0 0 1-.48-.17.6.6 0 0 1-.2-.45.6.6 0 0 1 .2-.46.76.76 0 0 1 1 0 .58.58 0 0 1 .19.46.55.55 0 0 1-.19.45.65.65 0 0 1-.52.17m-.5 6.94v-5.75h1v5.75ZM84.06 27.26a2.73 2.73 0 0 1-1.94-.8 2.9 2.9 0 0 1-.58-.94 3.7 3.7 0 0 1-.21-1.27 3.6 3.6 0 0 1 .19-1.25 3 3 0 0 1 .58-1 2.7 2.7 0 0 1 .83-.6 2.5 2.5 0 0 1 1-.2 2.3 2.3 0 0 1 1 .19 1.86 1.86 0 0 1 .73.54 2.5 2.5 0 0 1 .44.85 4.2 4.2 0 0 1 .15 1.12v.55h-4a2.3 2.3 0 0 0 .58 1.47 1.77 1.77 0 0 0 1.34.53 2.5 2.5 0 0 0 .77-.12 2.8 2.8 0 0 0 .67-.33l.34.64a4.7 4.7 0 0 1-.84.42 3 3 0 0 1-1.05.2m-1.81-3.49h3.08a2.07 2.07 0 0 0-.33-1.33 1.29 1.29 0 0 0-1-.44 1.55 1.55 0 0 0-1.09.46 2.2 2.2 0 0 0-.37.57 2.3 2.3 0 0 0-.29.74M89.57 27.26a2.11 2.11 0 0 1-1.73-.79 3.4 3.4 0 0 1-.65-2.22A3.5 3.5 0 0 1 87.4 23a2.8 2.8 0 0 1 .6-1 2.4 2.4 0 0 1 .79-.6 2.14 2.14 0 0 1 1-.21 2 2 0 0 1 .86.17 3.7 3.7 0 0 1 .75.49v-3.17h1v8.43h-.81l-.08-.67a3.4 3.4 0 0 1-.79.57 1.86 1.86 0 0 1-1.15.25m.21-.82a1.54 1.54 0 0 0 .76-.2 2.5 2.5 0 0 0 .71-.59v-3a2.4 2.4 0 0 0-.7-.47 1.9 1.9 0 0 0-.7-.14 1.44 1.44 0 0 0-.64.16 1.65 1.65 0 0 0-.53.45 2.1 2.1 0 0 0-.35.7 3.32 3.32 0 0 0 .28 2.52 1.36 1.36 0 0 0 1.17.57M96.64 27.11v-7.76h2.21a6 6 0 0 1 1.19.11 2.6 2.6 0 0 1 .92.39 1.8 1.8 0 0 1 .59.7 2.4 2.4 0 0 1 .22 1.08 2.5 2.5 0 0 1-.21 1.07 1.85 1.85 0 0 1-.59.74 2.5 2.5 0 0 1-.9.45 4.2 4.2 0 0 1-1.17.11h-1.28v3.07Zm1-3.88h1.16a2.4 2.4 0 0 0 1.51-.39 1.43 1.43 0 0 0 .49-1.21 1.3 1.3 0 0 0-.51-1.17 3 3 0 0 0-1.53-.32h-1.14ZM103.25 27.11v-5.75h.8l.09 1a2.7 2.7 0 0 1 .72-.86 1.47 1.47 0 0 1 .92-.32 1.8 1.8 0 0 1 .61.11l-.19.86-.26-.07h-.3a1.3 1.3 0 0 0-.76.3 2.4 2.4 0 0 0-.69 1v3.69ZM107.85 20.17a.65.65 0 0 1-.48-.17.55.55 0 0 1-.19-.45.58.58 0 0 1 .19-.46.76.76 0 0 1 1 0 .6.6 0 0 1 .2.46.6.6 0 0 1-.2.45.66.66 0 0 1-.52.17m-.49 6.94v-5.75h1v5.75ZM111.51 27.11l-2.07-5.75h1l1.09 3.27c.08.28.17.57.26.85l.27.84c.08-.28.17-.56.26-.84s.17-.57.26-.85l1.09-3.27h1l-2 5.75ZM116.89 27.26a1.76 1.76 0 0 1-1.2-.43 1.53 1.53 0 0 1-.48-1.21 1.6 1.6 0 0 1 .84-1.45 7 7 0 0 1 2.69-.7 2.5 2.5 0 0 0-.06-.54 1.3 1.3 0 0 0-.18-.46 1.08 1.08 0 0 0-1-.45 2.3 2.3 0 0 0-.93.19 4.6 4.6 0 0 0-.78.43l-.38-.68a6 6 0 0 1 1-.5 3.3 3.3 0 0 1 1.28-.24 1.79 1.79 0 0 1 1.53.64 2.9 2.9 0 0 1 .47 1.72v3.53h-.81l-.08-.68a5.2 5.2 0 0 1-.8.57 2.1 2.1 0 0 1-1.11.26m.28-.79a1.7 1.7 0 0 0 .79-.19 4.3 4.3 0 0 0 .78-.57v-1.6a10 10 0 0 0-1.22.22 3.2 3.2 0 0 0-.79.31 1.24 1.24 0 0 0-.44.41 1 1 0 0 0-.13.5.8.8 0 0 0 .29.71 1.22 1.22 0 0 0 .72.21M123.81 27.26a2.8 2.8 0 0 1-1.07-.21 2.3 2.3 0 0 1-.86-.58 2.8 2.8 0 0 1-.57-.95 3.7 3.7 0 0 1-.2-1.27 3.5 3.5 0 0 1 .22-1.29 2.8 2.8 0 0 1 .61-.95 2.5 2.5 0 0 1 .88-.59 2.6 2.6 0 0 1 1.06-.2 2 2 0 0 1 1 .2 2.8 2.8 0 0 1 .71.47l-.5.64a2.4 2.4 0 0 0-.53-.37 1.5 1.5 0 0 0-.62-.14 1.8 1.8 0 0 0-.72.16 1.7 1.7 0 0 0-.57.46 2.1 2.1 0 0 0-.37.7 3.1 3.1 0 0 0 0 1.81 2.3 2.3 0 0 0 .36.69 1.56 1.56 0 0 0 .57.45 1.6 1.6 0 0 0 .72.16 1.7 1.7 0 0 0 .74-.17 2.8 2.8 0 0 0 .61-.41l.42.65a2.8 2.8 0 0 1-.86.54 2.5 2.5 0 0 1-1.03.2M127.1 29.59a2.3 2.3 0 0 1-.37 0 1.6 1.6 0 0 1-.31-.09l.19-.77.21.05h.23a1 1 0 0 0 .81-.35 2.6 2.6 0 0 0 .49-.88l.13-.42-2.31-5.77h1l1.17 3.18.28.8c.1.28.19.56.28.83h.1c.08-.26.17-.54.25-.82s.15-.55.23-.81l1-3.18h1l-2.17 6.23a5.5 5.5 0 0 1-.34.79 2.8 2.8 0 0 1-.45.63 2.1 2.1 0 0 1-.59.43 1.75 1.75 0 0 1-.83.15\",\n className: \"img-trust-arc_svg__cls-4\"\n})), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M51.38 40.85v-6.19h1.77a4.2 4.2 0 0 1 1 .1 2 2 0 0 1 .73.3 1.5 1.5 0 0 1 .47.56 2.2 2.2 0 0 1 0 1.71 1.5 1.5 0 0 1-.46.59 2.3 2.3 0 0 1-.73.36 3.6 3.6 0 0 1-.92.12h-1v2.45Zm.79-3.1h.92a2 2 0 0 0 1.2-.3 1.16 1.16 0 0 0 .4-1 1 1 0 0 0-.41-.93 2.5 2.5 0 0 0-1.23-.26h-.88ZM58 41a2 2 0 0 1-1.48-.63 2.2 2.2 0 0 1-.46-.75 2.87 2.87 0 0 1 0-2 2.3 2.3 0 0 1 .46-.76 2 2 0 0 1 .68-.47 2.14 2.14 0 0 1 1.61 0 2.1 2.1 0 0 1 .67.47 2.5 2.5 0 0 1 .47.76 3 3 0 0 1 0 2 2.1 2.1 0 0 1-.47.75 2.1 2.1 0 0 1-.67.47A2.05 2.05 0 0 1 58 41m0-.64a1.1 1.1 0 0 0 .54-.13 1.2 1.2 0 0 0 .42-.36 1.4 1.4 0 0 0 .27-.55 2.8 2.8 0 0 0 .09-.71 3 3 0 0 0-.09-.73 2 2 0 0 0-.27-.56 1.3 1.3 0 0 0-.42-.36 1.1 1.1 0 0 0-.54-.13 1.1 1.1 0 0 0-.53.13 1.1 1.1 0 0 0-.42.36 2 2 0 0 0-.27.56 2.6 2.6 0 0 0-.1.73 2.4 2.4 0 0 0 .1.71 1.4 1.4 0 0 0 .27.55 1 1 0 0 0 .42.36 1.1 1.1 0 0 0 .53.09ZM61.84 40.85l-1.27-4.59h.79l.64 2.65c0 .22.1.44.14.65s.09.41.13.63l.15-.64a3 3 0 0 1 .16-.64l.71-2.65H64l.72 2.65c.06.22.11.44.17.65s.1.41.15.63a3.2 3.2 0 0 1 .14-.63c0-.2.09-.43.14-.65l.68-2.65h.74l-1.23 4.59h-.91l-.66-2.46c-.06-.22-.11-.44-.16-.65s-.1-.44-.15-.67l-.15.67c0 .22-.11.44-.17.66l-.64 2.45ZM69.52 41a2.3 2.3 0 0 1-.86-.16 2.1 2.1 0 0 1-.7-.48 2 2 0 0 1-.47-.75 2.94 2.94 0 0 1 0-2 2.3 2.3 0 0 1 .46-.76 1.9 1.9 0 0 1 .65-.47 1.93 1.93 0 0 1 1.54 0 1.5 1.5 0 0 1 .58.44 1.9 1.9 0 0 1 .35.68 2.6 2.6 0 0 1 .13.88v.24a.7.7 0 0 1 0 .21h-3.1a1.84 1.84 0 0 0 .47 1.17 1.4 1.4 0 0 0 1.07.43 1.8 1.8 0 0 0 .61-.1 2.6 2.6 0 0 0 .53-.26l.28.51a4 4 0 0 1-.67.33 2.6 2.6 0 0 1-.87.09m-1.44-2.77h2.45a1.6 1.6 0 0 0-.3-1.06 1 1 0 0 0-.83-.37 1.3 1.3 0 0 0-.47.1 1.1 1.1 0 0 0-.4.28 1.6 1.6 0 0 0-.3.44 1.9 1.9 0 0 0-.15.57ZM72.15 40.85v-4.59h.64l.07.83a2.3 2.3 0 0 1 .57-.68 1.21 1.21 0 0 1 1.23-.16l-.15.67-.21-.05h-.24a1 1 0 0 0-.61.23 2 2 0 0 0-.55.83v2.94ZM77 41a2.4 2.4 0 0 1-.87-.16 2 2 0 0 1-.69-.48 2 2 0 0 1-.47-.75 2.8 2.8 0 0 1-.17-1 3.1 3.1 0 0 1 .17-1 2.5 2.5 0 0 1 .47-.76 1.9 1.9 0 0 1 .65-.47 1.8 1.8 0 0 1 .76-.17 2.1 2.1 0 0 1 .78.15 1.6 1.6 0 0 1 .58.44 1.9 1.9 0 0 1 .35.68 3.3 3.3 0 0 1 .12.88v.24a.7.7 0 0 1 0 .21h-3.1a1.8 1.8 0 0 0 .42 1.1 1.4 1.4 0 0 0 1.07.43 1.8 1.8 0 0 0 .61-.1 3.3 3.3 0 0 0 .53-.26l.27.51a4 4 0 0 1-.67.33A2.3 2.3 0 0 1 77 41m-1.45-2.77H78a1.6 1.6 0 0 0-.29-1.06 1 1 0 0 0-.84-.37 1.2 1.2 0 0 0-.46.1 1.1 1.1 0 0 0-.4.28 1.6 1.6 0 0 0-.3.44 2.2 2.2 0 0 0-.16.57ZM81.19 41a1.71 1.71 0 0 1-1.38-.62 2.73 2.73 0 0 1-.51-1.77 2.8 2.8 0 0 1 .16-1 2.4 2.4 0 0 1 .44-.76 1.9 1.9 0 0 1 .63-.48 1.8 1.8 0 0 1 .76-.17 1.6 1.6 0 0 1 .68.14 4 4 0 0 1 .6.39v-2.6h.78v6.72h-.64l-.06-.54a2.8 2.8 0 0 1-.63.46 1.6 1.6 0 0 1-.83.23m.17-.65a1.2 1.2 0 0 0 .61-.16 2.3 2.3 0 0 0 .56-.47v-2.4A1.8 1.8 0 0 0 82 37a1.5 1.5 0 0 0-.55-.11 1.06 1.06 0 0 0-.52.13 1 1 0 0 0-.41.36 1.6 1.6 0 0 0-.29.55 2.67 2.67 0 0 0 .23 2 1.06 1.06 0 0 0 .93.42ZM88.4 41a1.6 1.6 0 0 1-.67-.15 2.8 2.8 0 0 1-.64-.43l-.07.47h-.62v-6.76h.77v2.7a4 4 0 0 1 .68-.46 1.7 1.7 0 0 1 .76-.18 1.9 1.9 0 0 1 .78.17 1.44 1.44 0 0 1 .57.47 2.2 2.2 0 0 1 .35.73 3.83 3.83 0 0 1 0 2 2.6 2.6 0 0 1-.44.78 1.9 1.9 0 0 1-.63.49 1.8 1.8 0 0 1-.84.17m-.14-.65a1.1 1.1 0 0 0 .53-.13 1 1 0 0 0 .41-.36 1.7 1.7 0 0 0 .28-.57 3.2 3.2 0 0 0 .09-.76 4 4 0 0 0-.06-.69 1.6 1.6 0 0 0-.21-.53 1.3 1.3 0 0 0-.38-.35 1.3 1.3 0 0 0-.55-.12 2 2 0 0 0-1.23.62v2.41a2.1 2.1 0 0 0 .6.37 1.5 1.5 0 0 0 .52.07ZM91.43 42.82h-.29a.7.7 0 0 1-.24-.07l.15-.61h.34a.85.85 0 0 0 .61-.24 1.9 1.9 0 0 0 .39-.7l.11-.34-1.84-4.6h.8l.93 2.54.22.64c.08.22.16.44.22.65.07-.2.14-.42.2-.65s.13-.44.19-.64l.78-2.54h.75l-1.72 5a5 5 0 0 1-.28.64 2.2 2.2 0 0 1-.35.5 2 2 0 0 1-.47.34 1.4 1.4 0 0 1-.5.08\",\n className: \"img-trust-arc_svg__cls-5\"\n})), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M70.57 6.84v8.49h-2.34V6.84H65V4.68h8.83v2.16ZM81.46 15.33l-2.28-3.41h-1.84v3.41H75V4.68h4.87c2.52 0 4 1.32 4 3.51a3.3 3.3 0 0 1-2.28 3.3l2.61 3.81Zm.05-7c0-1-.7-1.52-1.84-1.52h-2.33v3h2.37c1.14 0 1.8-.61 1.8-1.51ZM90.13 15.5c-2.86 0-4.6-1.6-4.6-4.74V4.68h2.34v6c0 1.74.87 2.63 2.3 2.63s2.29-.86 2.29-2.55V4.68h2.35v6c0 3.23-1.81 4.82-4.68 4.82M100.68 15.48a6.8 6.8 0 0 1-4.52-1.7l1.39-1.66a4.86 4.86 0 0 0 3.17 1.29c1 0 1.54-.38 1.54-1 0-.6-.36-.9-2.14-1.36-2.12-.54-3.53-1.14-3.53-3.25 0-1.93 1.55-3.21 3.72-3.21a6.18 6.18 0 0 1 4 1.36l-1.21 1.76a5.1 5.1 0 0 0-2.78-1c-.89 0-1.36.4-1.36.92 0 .7.45.93 2.29 1.4 2.16.57 3.38 1.34 3.38 3.2-.04 2.07-1.63 3.25-3.95 3.25M110.54 6.84v8.49h-2.34V6.84H105V4.68h8.83v2.16ZM121.09 12.06h-5.68a1.88 1.88 0 0 0 2 1.59 2.66 2.66 0 0 0 2-.83l1.3 1.18a4.31 4.31 0 0 1-7.6-2.69A4.07 4.07 0 0 1 117 7.07h.12c2.73 0 4 2.11 4 4.43a5 5 0 0 1-.03.56m-4-3.18a1.81 1.81 0 0 0-1.76 1.73h3.48a1.74 1.74 0 0 0-1.67-1.73Z\"\n})), _path5 || (_path5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M99.19 35.72h-2v-1h5.13v1h-2v5.06h-1.13Zm4.21 5.06v-3.35a1.7 1.7 0 0 1 .82-.18 3 3 0 0 1 .67.08l.27-.9a2.8 2.8 0 0 0-1-.14 2.85 2.85 0 0 0-1.84.63v3.86Zm5.46-4.34v3.37a2.3 2.3 0 0 1-.86.19c-.88 0-1.07-.4-1.07-1.12v-2.44h-1.06v2.73c0 1.07.61 1.75 2 1.75a4.7 4.7 0 0 0 2.11-.47v-4Zm2 3.8a2.5 2.5 0 0 0 1.71.64c1 0 1.68-.58 1.68-1.32 0-1.41-2.14-1.34-2.14-2 0-.27.27-.39.56-.39a1.7 1.7 0 0 1 1.08.38l.4-.82a2.08 2.08 0 0 0-1.47-.5c-1 0-1.69.48-1.69 1.3 0 1.41 2.14 1.33 2.14 2 0 .26-.26.4-.57.4a1.85 1.85 0 0 1-1.2-.48Zm4.3-1.07a1.61 1.61 0 0 0 1.55 1.66 1.3 1.3 0 0 0 .28 0h.34v-1h-.2a.8.8 0 0 1-.87-.7v-1.75h1v-.93h-1v-1.27h-1.07Zm9.8 1.61v-3.35a1.7 1.7 0 0 1 .82-.18 3 3 0 0 1 .67.08l.27-.9a2.8 2.8 0 0 0-1-.14 2.85 2.85 0 0 0-1.84.63v3.86Zm4.23-4.43a2.25 2.25 0 0 0 0 4.5 2.4 2.4 0 0 0 1.76-.7l-.41-.76a2 2 0 0 1-1.26.55 1.31 1.31 0 0 1-1.34-1.28v-.07a1.28 1.28 0 0 1 1.23-1.33h.08a1.66 1.66 0 0 1 1.11.46l.48-.73a2.15 2.15 0 0 0-1.65-.64m-7.57 2.86h-2l-.62 1.54h-1.11l2.1-6h1.12l2.1 6h-1.12Zm-.31-.88-.69-2-.69 2Z\",\n className: \"img-trust-arc_svg__cls-5\"\n})), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M51.39 31.76h79.51\",\n style: {\n fill: \"none\",\n stroke: \"#231f20\",\n strokeMiterlimit: 10,\n strokeWidth: \".5px\"\n }\n}));\nexport { SvgImgTrustArc as ReactComponent };\nexport default __webpack_public_path__ + \"img/img-trust-arc.68d957cd91dda1db2b2c68b11d55b4ad.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconClock = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 14,\n height: 14\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#01A96E\",\n fillRule: \"evenodd\",\n d: \"M7 0a7 7 0 1 1 0 14A7 7 0 0 1 7 0m.583 2.2H6.417v5.361l.009.104c.024.135.096.259.204.347l3.111 2.55.74-.902-2.898-2.375z\"\n})));\nexport { SvgIconClock as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-clock.5115ce9e05fe368e756d77211563af6f.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"logo\":\"trust-arc-logo__logo\",\"wrapper\":\"trust-arc-logo__wrapper\",\"support\":\"trust-arc-logo__support\",\"clock-icon\":\"trust-arc-logo__clock-icon\"};","import React, { FunctionComponent } from 'react'\r\n\r\nimport Trust from '@common/images/img-trust-arc.svg'\r\nimport ClockIcon from '@common/images/icon-clock.svg'\r\n\r\nimport classNames from 'classnames'\r\nimport styles from './trust-arc-logo.css'\r\n\r\nexport interface TrustArcLogoProps {\r\n modifier?: string\r\n label?: string\r\n}\r\n\r\nexport const TrustArcLogo: FunctionComponent = ({ modifier = '', label }) => {\r\n const wrapperClassList = classNames({\r\n [styles.wrapper]: true,\r\n [modifier]: !!modifier,\r\n })\r\n return (\r\n
\r\n \r\n \"TRUSTe\"\r\n \r\n {label && (\r\n
\r\n \"clock\"\r\n {label}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport { formatCurrency } from '@common/utils/price-utils'\r\n\r\nexport interface FormatCurrencyProps {\r\n Locale: string\r\n CurrencyCode: string\r\n value: number\r\n decimals?: boolean\r\n}\r\n\r\nexport const FormatCurrency: FunctionComponent = ({\r\n Locale,\r\n CurrencyCode,\r\n value,\r\n decimals = true,\r\n}) => {\r\n const formattedValue = formatCurrency(value, Locale, CurrencyCode, decimals)\r\n return <>{formattedValue}\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport { formatCurrency } from '@common/utils/price-utils'\r\n\r\nexport interface FormatDecimalCurrencyProps {\r\n Locale: string\r\n CurrencyCode: string\r\n price: number\r\n}\r\nexport const FormatDecimalCurrency: FunctionComponent = ({\r\n price,\r\n Locale,\r\n CurrencyCode,\r\n}) => {\r\n const value = formatCurrency(price, Locale, CurrencyCode, true)\r\n const punc = value.toString().includes('.') ? '.' : ','\r\n const [wholeNumber, decimal = '00'] = value.split(punc)\r\n return (\r\n <>\r\n {wholeNumber}\r\n \r\n {punc}\r\n {decimal}\r\n \r\n \r\n )\r\n}\r\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgImgIconRequirementEmpty = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#959595\",\n d: \"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0m0 2a6 6 0 1 0 0 12A6 6 0 0 0 8 2\"\n})));\nexport { SvgImgIconRequirementEmpty as ReactComponent };\nexport default __webpack_public_path__ + \"img/img-icon-requirement-empty.c1dcd933ba4e28a34c0f1180e8647986.svg\";","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgImgIconRequirementSuccess = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#15D8A0\",\n fillRule: \"evenodd\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0m0 2a6 6 0 1 0 0 12A6 6 0 0 0 8 2\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M5.692 7.566a1 1 0 1 0-1.384 1.443l2.097 2.013a1 1 0 0 0 1.462-.083l3.902-4.7a1 1 0 1 0-1.538-1.278L7.015 8.835z\"\n}))));\nexport { SvgImgIconRequirementSuccess as ReactComponent };\nexport default __webpack_public_path__ + \"img/img-icon-requirement-success.664f6ee2b08af7d301f14b9e93e0765e.svg\";","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgImgIconRequirementAlert = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#FE768D\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0m0 2a6 6 0 1 0 0 12A6 6 0 0 0 8 2\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m9.375 7.961 1.855 1.854a1 1 0 1 1-1.415 1.415L7.961 9.375 6.107 11.23a1 1 0 1 1-1.414-1.415l1.854-1.854-1.854-1.854a1 1 0 0 1 1.414-1.414l1.854 1.854 1.854-1.854a1 1 0 0 1 1.415 1.414z\"\n}))));\nexport { SvgImgIconRequirementAlert as ReactComponent };\nexport default __webpack_public_path__ + \"img/img-icon-requirement-alert.dfd1d6920814bba10a0f93f2ddef9059.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"header-module__header\",\"wrapper\":\"header-module__wrapper\",\"logo-link\":\"header-module__logo-link\",\"logo\":\"header-module__logo\",\"support-copy\":\"header-module__support-copy\",\"account\":\"header-module__account\",\"loginOut\":\"header-module__loginOut\"};","import React, { FunctionComponent } from 'react'\r\nimport { useMediaQuery } from 'react-responsive'\r\n\r\nimport { HeaderLabels } from '@gtc/state/header-labels'\r\nimport { screenSize } from '@common/constants/screenSizes'\r\nimport { ConvertStringToReact } from '../ConvertStringToReact'\r\n\r\n// Import Local Styles\r\nimport styles from './header.module.css'\r\n\r\nexport interface HeaderProps {\r\n logo: string\r\n mobileLogo: string\r\n content: HeaderLabels\r\n isUserLoggedIn?: boolean\r\n logoUrl: string\r\n onLogin?: () => void\r\n onLogout?: () => void\r\n showSignIn?: boolean\r\n}\r\n\r\nexport const Header: FunctionComponent = ({\r\n logo,\r\n mobileLogo,\r\n content,\r\n isUserLoggedIn,\r\n logoUrl,\r\n onLogin,\r\n onLogout,\r\n showSignIn = true,\r\n}) => {\r\n const isInMobileView = useMediaQuery({\r\n query: screenSize.mobile,\r\n })\r\n\r\n // setting the default logo based on whether the screen size is desktop or mobile\r\n const headerLogo = isInMobileView ? mobileLogo : logo\r\n\r\n return (\r\n
\r\n
\r\n \r\n \"goto\r\n \r\n {content.questions && (\r\n
\r\n \r\n {' '}\r\n \r\n \r\n
\r\n )}\r\n {showSignIn && (\r\n
\r\n {isUserLoggedIn ? (\r\n
\r\n \r\n
\r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"trustarc\":\"trustarc-module__trustarc\"};","import { useTrustArc } from '@common/hooks'\r\nimport React, { FunctionComponent, useEffect, useState } from 'react'\r\nimport styles from './trustarc.module.css'\r\n\r\nexport interface TrustArcProps {\r\n language?: string\r\n}\r\n\r\nexport const TrustArc: FunctionComponent = ({ language = '' }) => {\r\n const [selectedLang, setSelectedLang] = useState(language)\r\n\r\n useEffect(() => {\r\n if (language !== selectedLang) {\r\n setSelectedLang(language)\r\n window.location.reload()\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [language])\r\n\r\n useTrustArc(language)\r\n\r\n return
\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"footer\":\"footer-module__footer\",\"footerLink\":\"footer-module__footerLink\",\"footer--dark\":\"footer-module__footer--dark\",\"footer--light-primary\":\"footer-module__footer--light-primary\",\"language-selector-icon\":\"footer-module__language-selector-icon\",\"language-selector-wrapper\":\"footer-module__language-selector-wrapper\",\"language-selector-select\":\"footer-module__language-selector-select\",\"language-selector-active--dark\":\"footer-module__language-selector-active--dark\",\"language-selector-icon--dark\":\"footer-module__language-selector-icon--dark\",\"language-selector-active\":\"footer-module__language-selector-active\",\"language-selector-options-wrapper\":\"footer-module__language-selector-options-wrapper\",\"language-selector-options-wrapper--dark\":\"footer-module__language-selector-options-wrapper--dark\",\"language-selector-option\":\"footer-module__language-selector-option\"};","import React, { useEffect, useState, FunctionComponent } from 'react'\r\nimport { ResolveFooterLabels } from '@gtresolve/state/footer-labels'\r\nimport { CommonLink, CustomDropdown } from '@common/components'\r\nimport classNames from 'classnames'\r\nimport { LANGUAGE_CODES } from '@common/constants/languages'\r\n\r\nimport { detokenizeYear } from '@common/utils/detoken-year'\r\nimport { TrustArc } from '../TrustArc'\r\n// Import Local Styles\r\nimport styles from './footer.module.css'\r\n\r\nexport interface FooterProps {\r\n content: ResolveFooterLabels\r\n theme?: 'dark' | 'light'\r\n showLanguageSelector?: boolean\r\n languageCode?: string\r\n setLanguage?: (lang: string) => void\r\n purpose?: 'primary' | 'secondary'\r\n modifier?: string\r\n}\r\n\r\nexport const Footer: FunctionComponent = ({\r\n content,\r\n theme = 'light',\r\n languageCode,\r\n setLanguage,\r\n purpose = 'primary',\r\n modifier = '',\r\n}) => {\r\n const [launchTrustArc, setlaunchTrustArc] = useState(false)\r\n const [languageOptions, setLanguageOptions] = useState>([])\r\n const [language, setLanguageState] = useState('')\r\n\r\n useEffect(() => {\r\n setlaunchTrustArc(true)\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (languageCode && setLanguage) {\r\n const languageCodes: string[] = Object.values(LANGUAGE_CODES)\r\n const languages: string[] = Object.keys(LANGUAGE_CODES)\r\n\r\n // If user has selected a language, we need to show that language to be top of list\r\n const codeIndex = languageCodes.indexOf(languageCode)\r\n languages.unshift(languages[codeIndex])\r\n languages.splice(codeIndex + 1, 1)\r\n\r\n setLanguageOptions(languages)\r\n setLanguageState(languages[0])\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [languageCode])\r\n\r\n const footerStyle = classNames({\r\n [styles.footer]: true,\r\n [styles['footer--dark']]: theme === 'dark',\r\n [styles[`footer--${theme}-primary`]]: purpose === 'primary',\r\n [modifier]: true,\r\n })\r\n\r\n const footerClasslist = classNames({\r\n [styles.footerLink]: true,\r\n })\r\n\r\n const languageIconClasslist = classNames({\r\n [styles['language-selector-icon']]: true,\r\n [styles['language-selector-icon--dark']]: theme === 'dark',\r\n })\r\n\r\n const languageSelectorClasslist = classNames({\r\n [styles['language-selector-active']]: true,\r\n [styles['language-selector-active--dark']]: theme === 'dark',\r\n })\r\n\r\n const languageOptionsContainerClasslist = classNames({\r\n [styles['language-selector-options-wrapper']]: true,\r\n [styles['language-selector-options-wrapper--dark']]: theme === 'dark',\r\n })\r\n\r\n return (\r\n <>\r\n
\r\n
    \r\n
  • {detokenizeYear(content.allrightsreservedDisclaimerLabel)}
  • \r\n
  • \r\n \r\n {content.termsandconditionsLabel}\r\n \r\n
  • \r\n
  • \r\n \r\n {content.privacypolicyLabel}\r\n \r\n
  • \r\n
  • \r\n \r\n {content.antiSpamPolicyLabel}\r\n \r\n
  • \r\n
  • \r\n \r\n {content.trademarkLabel}\r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n {content.doNotSellInfoLabel && (\r\n
  • \r\n \r\n {content.doNotSellInfoLabel}\r\n \r\n
  • \r\n )}\r\n
  • \r\n \r\n {content.sitemapLabel}\r\n \r\n
  • \r\n {language && (\r\n
  • \r\n ) => {\r\n if (setLanguage)\r\n setLanguage(LANGUAGE_CODES[(event.target as HTMLElement).innerText])\r\n }}\r\n value={language}\r\n additionalClass={styles['language-selector-select']}\r\n options={languageOptions}\r\n optionsContainerClass={languageOptionsContainerClasslist}\r\n optionsClass={styles['language-selector-option']}\r\n customizeTheme=\"secondary\"\r\n selectorClass={languageSelectorClasslist}\r\n iconClass={languageIconClasslist}\r\n showAtTop\r\n />\r\n
  • \r\n )}\r\n
\r\n
\r\n\r\n {/* Keep TrustArc outside of
so it won't inherit styles from footer.module.css */}\r\n {launchTrustArc ? : null}\r\n \r\n )\r\n}\r\n","export function detokenizeYear(input: string): string {\r\n if (!input) return ''\r\n\r\n const year = new Date().getFullYear()\r\n return input.replace('#YEAR-TOKEN#', year.toString())\r\n}\r\n","import { useGTM } from '@common/hooks'\r\nimport React, { FunctionComponent } from 'react'\r\n\r\nexport interface LoadAnalyticScripts {\r\n gtmProductKey: string\r\n}\r\n\r\nexport const LoadAnalyticScripts: FunctionComponent = (props) => {\r\n useGTM(props.gtmProductKey)\r\n return <>\r\n}\r\n","/* eslint-disable react/jsx-no-target-blank */\r\nimport React, { FunctionComponent } from 'react'\r\nimport { useBoldChat } from '@common/hooks'\r\n\r\nexport interface BoldchatOptions {\r\n URL: string\r\n}\r\n\r\nexport interface BoldchatProps {\r\n options: BoldchatOptions\r\n}\r\n\r\nexport const BoldChat: FunctionComponent = () => {\r\n // const { URL } = options\r\n\r\n useBoldChat()\r\n\r\n return <>{/* */}\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport { useLoadScript } from '@common/hooks'\r\n\r\nexport interface LmiMaScriptProps {\r\n url: string\r\n}\r\n\r\nexport const LmiMaScript: FunctionComponent = ({ url }) => {\r\n useLoadScript(url)\r\n return <>\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport { useChatbot } from '@common/hooks'\r\n\r\nexport interface ChatbotScriptProps {\r\n enableChatBot: boolean\r\n}\r\n\r\nexport const ChatbotScript: FunctionComponent = ({ enableChatBot }) => {\r\n useChatbot(enableChatBot)\r\n return <>\r\n}\r\n","import React, { FunctionComponent } from 'react'\r\nimport { useSmoothScrollPolyfill } from '@common/hooks'\r\nimport { LoadAnalyticScripts } from '../LoadAnalyticScripts'\r\nimport { BoldChat, BoldchatOptions } from '../BoldChat'\r\nimport { LmiMaScript } from '../LmiMaScript'\r\nimport { ChatbotScript } from '../ChatbotScript'\r\n\r\nexport interface GlobalScriptsProps {\r\n analyticsProductKey?: string\r\n boldchatOptions?: BoldchatOptions\r\n shouldLoadTrustArc?: boolean\r\n lmiMaScriptUrl?: string\r\n enableChatBot?: boolean\r\n}\r\n\r\nexport const GlobalScripts: FunctionComponent = (props) => {\r\n // add all global scripts via hooks to this component\r\n const { analyticsProductKey = '', boldchatOptions, lmiMaScriptUrl = '', enableChatBot = false } = props\r\n useSmoothScrollPolyfill()\r\n return (\r\n <>\r\n {!!analyticsProductKey && }\r\n {!!boldchatOptions && }\r\n {!!lmiMaScriptUrl && }\r\n {enableChatBot && }\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"submit\":\"form-submit-button-module__submit\",\"submit--submitting\":\"form-submit-button-module__submit--submitting\"};","import React, { FunctionComponent, ButtonHTMLAttributes } from 'react'\r\nimport classNames from 'classnames'\r\nimport { Theme } from '@common/constants/theme-types'\r\nimport { CommonButton } from '../CommonButton'\r\nimport { LoadingSpinner } from '../LoadingSpinner'\r\nimport styles from './form-submit-button.module.css'\r\n\r\ntype Purpose = 'primary' | 'secondary'\r\n\r\nexport interface FormSubmitButtonProps extends ButtonHTMLAttributes {\r\n purpose?: Purpose\r\n modifier?: string\r\n theme?: Theme\r\n text: string\r\n isSubmitting: boolean\r\n qaTag?: string\r\n}\r\n\r\nexport const FormSubmitButton: FunctionComponent = ({\r\n purpose = 'primary',\r\n modifier = '',\r\n theme = 'default',\r\n text,\r\n isSubmitting,\r\n ...rest\r\n}) => {\r\n const submitClasslist = classNames({\r\n [styles.submit]: true,\r\n [styles['submit--submitting']]: isSubmitting,\r\n [modifier]: modifier,\r\n })\r\n\r\n return (\r\n \r\n {isSubmitting ? : text}\r\n \r\n )\r\n}\r\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconInfoWarn = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#D9AD00\",\n fillRule: \"evenodd\",\n d: \"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0m0 1.143C4.219 1.143 1.143 4.219 1.143 8S4.219 14.857 8 14.857 14.857 11.781 14.857 8 11.781 1.143 8 1.143m.01 4.367a.83.83 0 1 1 .001 0zm-1.419 4.84.024-.167.397-2.247h-.686a.83.83 0 1 1 0-1.663H8c.459 0 .831.373.831.832l-.573 3.338c-.032.22.114.448.335.487a.4.4 0 0 0 .25-.044q.042-.023.076-.045a.5.5 0 0 0 .083-.083l.013-.021a.5.5 0 0 0 .05-.093.412.412 0 0 1 .805.178c-.123.697-.956 1.133-1.86.974-.692-.122-1.223-.56-1.379-1.07a1.018 1.018 0 0 1-.04-.377z\"\n})));\nexport { SvgIconInfoWarn as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-info-warn.d0a7333135c32431ca644032b7bf5960.svg\";","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgFeatureCheckSmall = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 22,\n height: 22\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"none\",\n fillRule: \"evenodd\",\n stroke: \"#5FD889\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.429,\n transform: \"translate(1 1)\"\n}, /*#__PURE__*/React.createElement(\"circle\", {\n cx: 10,\n cy: 10,\n r: 10,\n fill: \"#5FD889\",\n fillOpacity: 0.1\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m4.804 10.775 2.966 2.966 6.945-6.944\"\n}))));\nexport { SvgFeatureCheckSmall as ReactComponent };\nexport default __webpack_public_path__ + \"img/feature-check-small.ac6ab37a83268e738ed4fc5425c864d3.svg\";","import React, { FunctionComponent, useEffect } from 'react'\r\nimport { FieldProps } from 'formik'\r\nimport { setCheckoutInlineError } from '@common/utils'\r\n\r\nexport interface InlineErrorProps {\r\n fieldData: FieldProps\r\n inlineErrors: { [key: string]: string } | Record\r\n setErrorCall: (val: string) => void\r\n removeErrorCall: (val: string) => void\r\n ignoreInlineError?: boolean\r\n children: React.ReactNode\r\n}\r\n\r\nexport const InlineErrorView: FunctionComponent = ({\r\n fieldData,\r\n inlineErrors,\r\n setErrorCall,\r\n removeErrorCall,\r\n ignoreInlineError,\r\n children,\r\n}) => {\r\n const { field, form, meta } = fieldData\r\n useEffect(() => {\r\n setCheckoutInlineError(fieldData, inlineErrors, setErrorCall, removeErrorCall, ignoreInlineError)\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [field, form, meta])\r\n\r\n return <>{children}\r\n}\r\n\r\nexport default InlineErrorView\r\n","// extracted by mini-css-extract-plugin\nexport default {\"selector\":\"customdropdown-module__selector\",\"selector--primary\":\"customdropdown-module__selector--primary\",\"selector--secondary\":\"customdropdown-module__selector--secondary\",\"selector--secondary-top\":\"customdropdown-module__selector--secondary-top\",\"selector--secondary-top-active\":\"customdropdown-module__selector--secondary-top-active\",\"disabled\":\"customdropdown-module__disabled\",\"error\":\"customdropdown-module__error\",\"error-message\":\"customdropdown-module__error-message\",\"hint\":\"customdropdown-module__hint\",\"valid\":\"customdropdown-module__valid\",\"hide\":\"customdropdown-module__hide\"};","import React, { FunctionComponent, useState, useRef, useEffect } from 'react'\r\nimport classNames from 'classnames'\r\n\r\nimport styles from './customdropdown.module.css'\r\n\r\nexport interface CustomProps {\r\n error?: string\r\n hint?: string\r\n valid?: boolean\r\n label?: string | Element | React.ReactNode\r\n qaTag?: string\r\n modifier?: string\r\n labelClass?: string\r\n additionalClass?: string\r\n selectorClass?: string\r\n options?: Array\r\n optionsContainerClass?: string\r\n optionsClass?: string\r\n name?: string\r\n disabled?: boolean\r\n onChange?: (event: React.MouseEvent) => void\r\n value?: string | number\r\n customizeTheme?: string\r\n showAtTop?: boolean\r\n iconClass?: string\r\n}\r\n\r\nexport const CustomDropdown: FunctionComponent = ({\r\n label,\r\n error,\r\n options,\r\n hint,\r\n disabled = false,\r\n value,\r\n qaTag = '',\r\n valid,\r\n onChange,\r\n showAtTop = false,\r\n modifier = '',\r\n labelClass = '',\r\n selectorClass = '',\r\n additionalClass = '',\r\n customizeTheme = 'primary',\r\n optionsContainerClass = '',\r\n optionsClass = '',\r\n iconClass = '',\r\n name,\r\n}) => {\r\n const [showCustomizeOptions, setShowCustomizeOptions] = useState(false)\r\n const dropdownRef = useRef(null)\r\n const [dropdownStyleHeight, setDropdownStyleHeight] = useState(0)\r\n\r\n useEffect(() => {\r\n if (showCustomizeOptions && dropdownRef.current) {\r\n setDropdownStyleHeight(dropdownRef.current.offsetHeight)\r\n }\r\n }, [showCustomizeOptions])\r\n\r\n // onBlur function to close the customized select dropdown\r\n const handleCustomizeBlur = (event: React.FocusEvent) => {\r\n event.stopPropagation()\r\n const customizedElem = document.getElementById(name ? `customDropdown-${name}` : 'customDropdown')\r\n // Need timeout here to get the correct activeElement\r\n setTimeout(() => {\r\n if (customizedElem && !customizedElem.contains(document.activeElement)) {\r\n setShowCustomizeOptions(false)\r\n }\r\n }, 300)\r\n }\r\n\r\n const handleCustomize = (event: React.MouseEvent) => {\r\n event.preventDefault()\r\n if (onChange) onChange(event)\r\n }\r\n\r\n const outerWrapperClassList = classNames({\r\n [modifier]: true,\r\n })\r\n\r\n const labelClassList = classNames({\r\n [labelClass]: true,\r\n })\r\n\r\n const innerWrapperClassList = classNames({\r\n [styles.error]: error,\r\n [styles.valid]: valid,\r\n [styles.disabled]: disabled,\r\n [additionalClass]: true,\r\n [`${additionalClass}--active`]: additionalClass && showCustomizeOptions,\r\n })\r\n\r\n const customizeSelectorStyles = classNames({\r\n [styles.selector]: true,\r\n [styles[`selector--${customizeTheme}`]]: true,\r\n [styles[`selector--${customizeTheme}-top`]]: showAtTop,\r\n [styles[`selector--${customizeTheme}-top-active`]]: showAtTop && showCustomizeOptions,\r\n [selectorClass]: true,\r\n })\r\n\r\n return (\r\n
\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n \r\n {showAtTop && showCustomizeOptions && options && (\r\n \r\n {options.map((option) => (\r\n \r\n ) => {\r\n handleCustomize(event)\r\n setShowCustomizeOptions(false)\r\n }}\r\n role=\"option\"\r\n aria-selected={option === value}\r\n >\r\n {option}\r\n \r\n \r\n ))}\r\n \r\n )}\r\n setShowCustomizeOptions(!showCustomizeOptions)}\r\n className={customizeSelectorStyles}\r\n aria-label={`${name} ${value}`}\r\n aria-haspopup=\"listbox\"\r\n >\r\n {iconClass && }\r\n {value}\r\n \r\n {!showAtTop && showCustomizeOptions && options && (\r\n
    \r\n {options.map((option) => (\r\n \r\n ) => {\r\n handleCustomize(event)\r\n setShowCustomizeOptions(false)\r\n }}\r\n role=\"option\"\r\n aria-selected={option === value}\r\n >\r\n {option}\r\n \r\n \r\n ))}\r\n
\r\n )}\r\n
\r\n {error && (\r\n
\r\n {error}\r\n
\r\n )}\r\n {hint &&
{hint}
}\r\n
\r\n )\r\n}\r\n","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconPwTip = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 14,\n height: 14,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C72DE\",\n fillRule: \"evenodd\",\n d: \"M11.138 5.47 6 10.608 3.529 8.137l.942-.943L6 8.723l4.195-4.196z\",\n clipRule: \"evenodd\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C72DE\",\n fillRule: \"evenodd\",\n d: \"M3.505 11.984a8 8 0 0 0 .267.198l.003.002.13.09.001.001a9 9 0 0 0 .28.182 8.1 8.1 0 0 0 2.683 1.063l.003.001.128.025.129-.025h.002a8.1 8.1 0 0 0 4.156-2.234l.063-.064a8.12 8.12 0 0 0 2.317-5.691 8.1 8.1 0 0 0-1.14-4.158l-.008-.014q-.217.046-.441.08h-.006q-.526.077-1.072.078a7.3 7.3 0 0 1-3.666-.98L7.329.533A7 7 0 0 1 7 .332q-.16.105-.328.202l-.006.003A7.3 7.3 0 0 1 3 1.518q-.546 0-1.072-.078-.227-.033-.447-.08l-.008.014a8.1 8.1 0 0 0-.904 2.203 8.2 8.2 0 0 0-.236 1.955 8.12 8.12 0 0 0 3.172 6.452M7 1.874a8.64 8.64 0 0 1-4.772.943 6.8 6.8 0 0 0-.561 2.715 6.79 6.79 0 0 0 2.877 5.563A6.8 6.8 0 0 0 7 12.185a6.77 6.77 0 0 0 3.396-1.894 6.8 6.8 0 0 0 1.937-4.76c0-.966-.2-1.883-.561-2.714A8.635 8.635 0 0 1 7 1.874\",\n clipRule: \"evenodd\"\n})));\nexport { SvgIconPwTip as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-pw-tip.2786efee06c4378f8d038bb48df2ae2a.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconChevronDownBlue = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C72DE\",\n fillRule: \"evenodd\",\n d: \"m3.529 6.197.942-.943L8 8.783l3.529-3.53.942.944L8 10.668z\",\n clipRule: \"evenodd\"\n})));\nexport { SvgIconChevronDownBlue as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-chevron-down-blue.64b9eaada4ab7a0f5192799f80ea1b5b.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconChevronUpBlue = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#2C72DE\",\n fillRule: \"evenodd\",\n d: \"m12.471 9.803-.942.943L8 7.218l-3.529 3.528-.942-.943L8 5.332z\",\n clipRule: \"evenodd\"\n})));\nexport { SvgIconChevronUpBlue as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-chevron-up-blue.04fe6eb8bac3a878339a781f24049d40.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"subhead\":\"passwordStrengthIndicator-module__subhead\",\"subhead--error\":\"passwordStrengthIndicator-module__subhead--error\",\"strength\":\"passwordStrengthIndicator-module__strength\",\"strength-bar-strength\":\"passwordStrengthIndicator-module__strength-bar-strength\",\"strength-bar-label\":\"passwordStrengthIndicator-module__strength-bar-label\",\"strength-bar\":\"passwordStrengthIndicator-module__strength-bar\",\"strength--weak\":\"passwordStrengthIndicator-module__strength--weak\",\"strength--fair\":\"passwordStrengthIndicator-module__strength--fair\",\"strength--good\":\"passwordStrengthIndicator-module__strength--good\",\"strength--strong\":\"passwordStrengthIndicator-module__strength--strong\",\"tip-drawer\":\"passwordStrengthIndicator-module__tip-drawer\",\"tip-drawer-header\":\"passwordStrengthIndicator-module__tip-drawer-header\",\"tip-drawer-body\":\"passwordStrengthIndicator-module__tip-drawer-body\",\"tip-drawer--open\":\"passwordStrengthIndicator-module__tip-drawer--open\"};","import React, { FC, useState, useEffect } from 'react'\r\nimport classNames from 'classnames'\r\nimport zxcvbn from 'zxcvbn'\r\n\r\nimport { ReactComponent as TipIcon } from '../../images/icon-pw-tip.svg?react'\r\nimport { ReactComponent as ChevronDown } from '../../images/icon-chevron-down-blue.svg?react'\r\nimport { ReactComponent as ChevronUp } from '../../images/icon-chevron-up-blue.svg?react'\r\n\r\nimport styles from './passwordStrengthIndicator.module.css'\r\n\r\ninterface PasswordStrengthIndicatorProps {\r\n id: string\r\n value: string | number | readonly string[]\r\n touched: boolean\r\n error?: string\r\n genericPasswordLabel: string\r\n passwordStrength: string\r\n passwordStrengthLevel1: string\r\n passwordStrengthLevel2: string\r\n passwordStrengthLevel3: string\r\n passwordStrengthLevel4: string\r\n passwordStrengthTip1: string\r\n passwordStrengthTip2: string\r\n passwordStrengthTip3: string\r\n passwordStrengthTipDrawer: string\r\n isSubmittingRef: React.RefObject\r\n isFocused: boolean\r\n}\r\n\r\nexport const PasswordStrengthIndicator: FC = ({\r\n id,\r\n value = '',\r\n touched,\r\n error,\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n genericPasswordLabel,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n isSubmittingRef,\r\n isFocused,\r\n}) => {\r\n const [showTips, setShowTips] = useState(false)\r\n const [pwStrength, setPWStrength] = useState(0)\r\n\r\n const displayGenericError = touched && error\r\n\r\n const parsedValue = String(value)\r\n\r\n const isSubmitting = isSubmittingRef?.current\r\n\r\n useEffect(() => {\r\n const { score } = zxcvbn(parsedValue)\r\n if (score === 0 && parsedValue.length > 0) {\r\n setPWStrength(1)\r\n } else {\r\n setPWStrength(score)\r\n }\r\n }, [parsedValue])\r\n\r\n useEffect(() => {\r\n if ((error && !isFocused) || (error && isSubmitting)) {\r\n setShowTips(true)\r\n }\r\n }, [error, setShowTips, isFocused, isSubmitting])\r\n\r\n const strengthClasslist = classNames({\r\n [styles.strength]: true,\r\n [styles['strength--weak']]: pwStrength === 1,\r\n [styles['strength--fair']]: pwStrength === 2,\r\n [styles['strength--good']]: pwStrength === 3,\r\n [styles['strength--strong']]: pwStrength === 4,\r\n })\r\n\r\n const subheadClasslist = classNames({\r\n [styles.subhead]: true,\r\n [styles['subhead--error']]: displayGenericError,\r\n })\r\n\r\n const tiphClasslist = classNames({\r\n [styles['tip-drawer']]: true,\r\n [styles['tip-drawer--open']]: showTips,\r\n })\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n {displayGenericError && {genericPasswordLabel}}\r\n
\r\n setShowTips(!showTips)}\r\n onKeyDown={() => setShowTips(!showTips)}\r\n role=\"presentation\"\r\n >\r\n {passwordStrengthTipDrawer} {showTips ? : }\r\n
\r\n
\r\n
    \r\n
  • {passwordStrengthTip1}
  • \r\n
  • {passwordStrengthTip2}
  • \r\n
  • {passwordStrengthTip3}
  • \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import { BaseAppState } from '@common/store'\r\nimport { ModalState } from '@common/state/modal/state'\r\nimport { getModalState } from '@common/state/selectors'\r\nimport { modalActions } from '@common/state/modal/actions'\r\n\r\nexport const mapModalState = (state: BaseAppState): ModalState => {\r\n const { isModalClosable, isModalOpen, errorMessage } = getModalState(state)\r\n return {\r\n isModalClosable,\r\n isModalOpen,\r\n errorMessage,\r\n }\r\n}\r\n\r\nexport const mapModalActions = {\r\n setModalOpen: (isModalOpen: boolean) => modalActions.setModalOpen(isModalOpen),\r\n}\r\n\r\nexport type ModalActionsType = typeof mapModalActions\r\n","// extracted by mini-css-extract-plugin\nexport default {\"modal\":\"modal-module__modal\",\"close\":\"modal-module__close\",\"blocker\":\"modal-module__blocker\"};","/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\r\n/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n// Import Dependencies\r\nimport React, { FunctionComponent, useEffect, useState } from 'react'\r\nimport { ModalState } from '@common/state/modal/state'\r\nimport Close from '@common/images/icon-close.svg'\r\n// Import Stylesheet\r\nimport { GoToComponentProps, connectRedux, trapFocus } from '@common/utils'\r\nimport { ModalActionsType, mapModalState, mapModalActions } from '@common/connectedComponents/Modal/connector'\r\nimport { useScrollToTop } from '@common/hooks'\r\nimport styles from './modal.module.css'\r\n\r\ntype ModalProps = GoToComponentProps<\r\n ModalState,\r\n ModalActionsType,\r\n {\r\n isOpen?: boolean\r\n closeable: boolean\r\n onClose?: () => void\r\n children?: React.ReactNode\r\n }\r\n>\r\n\r\nconst Modal: FunctionComponent = ({ props, children }) => {\r\n const { isOpen, closeable, onClose } = props\r\n const [isModalOpen, setModalIsOpen] = useState(isOpen)\r\n const [isModalClosable, setModalCloseable] = useState(false)\r\n\r\n useScrollToTop()\r\n\r\n useEffect(() => {\r\n setModalIsOpen(isOpen)\r\n setModalCloseable(closeable)\r\n\r\n // Set focus trap upon modal opens\r\n if (isOpen) {\r\n setTimeout(() => trapFocus('#connectedModal', true), 0)\r\n }\r\n }, [isOpen, closeable])\r\n\r\n const onModalClose = () => {\r\n if (onClose && isModalClosable) onClose()\r\n }\r\n\r\n // if modal is set to be open\r\n if (isModalOpen) {\r\n return (\r\n onModalClose()}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Escape' || e.key === 'Esc') {\r\n onModalClose()\r\n }\r\n }}\r\n role=\"button\"\r\n tabIndex={0}\r\n id=\"connectedModal\"\r\n >\r\n
e.stopPropagation()}>\r\n {children}\r\n {isModalClosable && (\r\n \r\n )}\r\n
\r\n
\r\n )\r\n }\r\n return null\r\n}\r\n\r\nexport const ConnectedModal = connectRedux(Modal, mapModalState, mapModalActions)\r\n","import { BaseAppState } from '@common/store'\r\nimport { FlexTokenDataType } from '@common/services'\r\nimport { flexActions } from '@common/state/flex/actions'\r\nimport { FlexState, FlexConnectorState, KeyInfo } from '@common/state/flex/state'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { getFlexState, getLocationState } from '@common/state/selectors'\r\n\r\nexport const mapFlexFormState = (state: BaseAppState): FlexConnectorState => {\r\n const flexState: FlexState = getFlexState(state)\r\n const { locationInfo, isLocationInfoLoaded } = getLocationState(state)\r\n const { currency, country } = locationInfo\r\n return {\r\n flexState,\r\n currency,\r\n country,\r\n isLocationInfoLoaded,\r\n }\r\n}\r\n\r\nexport const mapFlexFormActions = {\r\n setFatalError: (hasError: boolean) => fatalErrorActions.setFatalError(hasError),\r\n getFlexToken: (data: FlexTokenDataType, iterator: number) => flexActions.getFlexToken(data, iterator),\r\n setMicroformCreated: (isCreated: boolean) => flexActions.setMicroformCreated(isCreated),\r\n setCardValid: (valid: boolean) => flexActions.setCardValid(valid),\r\n setCvvValid: (valid: boolean) => flexActions.setCvvValid(valid),\r\n setUserInteractedWithFlexField: (interacted: boolean) => flexActions.setUserInteractedWithFlexField(interacted),\r\n setUserInteractedWithFlexFieldCvv: (interacted: boolean) =>\r\n flexActions.setUserInteractedWithFlexFieldCvv(interacted),\r\n createFlexMicroform: (keyInfo: KeyInfo) => flexActions.createFlexMicroform(keyInfo),\r\n clearMicroformInstance: () => flexActions.clearFlexMicroformInstance(),\r\n}\r\n\r\nexport type FlexFormActionsType = typeof mapFlexFormActions\r\n","// Import Dependencies\r\nimport React, { FunctionComponent, useEffect, useState } from 'react'\r\nimport { GoToComponentProps, connectRedux, getFlexMicroform, setFlexMicroform } from '@common/utils'\r\nimport { FlexConnectorState } from '@common/state/flex/state'\r\nimport { FlexFormActionsType, mapFlexFormState, mapFlexFormActions } from '@common/connectedComponents/Flex/connector'\r\nimport { FLEX_KEY } from '@common/constants/flex'\r\nimport { useFlexForm, useMetrixScript } from '@common/hooks'\r\nimport { FlexTokenDataType } from '@common/services'\r\n\r\ntype FlexFormProps = GoToComponentProps<\r\n FlexConnectorState,\r\n FlexFormActionsType,\r\n {\r\n shouldRefresh: boolean\r\n }\r\n>\r\n\r\n/** Make sure to extract out unnecessary dependencies out of the HOC.\r\n *\r\n */\r\n\r\nconst FlexForm: FunctionComponent = ({\r\n state: { flexState, currency, country, isLocationInfoLoaded },\r\n actions,\r\n props,\r\n}) => {\r\n const [gettingKey, setGettingKey] = useState(false)\r\n const [needToRefresh, setNeedToRefresh] = useState(props.shouldRefresh)\r\n // load the flex script\r\n const flexScriptLoaded = useFlexForm()\r\n\r\n // Establish device fingerprint session for decisionmaker\r\n // See documentation at https://confluence.ops.expertcity.com/x/L4UVIg\r\n const sessionId = `${flexState.fingerprint}`\r\n const orgId = FLEX_KEY\r\n const { mid } = flexState.keyInfo.flexKey\r\n useMetrixScript(!!flexState.microformCreated, orgId, sessionId, mid)\r\n\r\n // update the internal state to props.shouldRefresh\r\n useEffect(() => {\r\n setNeedToRefresh(props.shouldRefresh)\r\n }, [props.shouldRefresh])\r\n\r\n // Refresh the flex component and microform\r\n useEffect(() => {\r\n if (needToRefresh && flexState.microformCreated) {\r\n setFlexMicroform(null)\r\n actions.setMicroformCreated(false)\r\n actions.setCardValid(false)\r\n actions.setCvvValid(false)\r\n actions.setUserInteractedWithFlexField(false)\r\n actions.setUserInteractedWithFlexFieldCvv(false)\r\n setNeedToRefresh(false)\r\n }\r\n }, [actions, flexState.microformCreated, needToRefresh])\r\n\r\n // get the flex key\r\n useEffect(() => {\r\n const getFlexKey = () => {\r\n const data: FlexTokenDataType = {\r\n currency,\r\n country,\r\n targetOrigin: window.location.origin,\r\n skipSca: false,\r\n }\r\n actions.getFlexToken(data, 1)\r\n }\r\n\r\n if (flexState.keyInfo.flexKey.keyId === '' && !gettingKey && currency && isLocationInfoLoaded) {\r\n getFlexKey()\r\n setGettingKey(true)\r\n }\r\n }, [actions, isLocationInfoLoaded, country, currency, flexState.keyInfo.flexKey.keyId, gettingKey])\r\n\r\n // create the microform\r\n useEffect(() => {\r\n if (flexScriptLoaded && !flexState.microformCreated && flexState.keyInfo.flexKey.keyId) {\r\n actions.createFlexMicroform(flexState.keyInfo)\r\n }\r\n }, [actions, flexScriptLoaded, flexState.keyInfo, flexState.microformCreated])\r\n\r\n // destroy the flex frame when the component unmounts\r\n useEffect(() => {\r\n return () => {\r\n const microformInstance = getFlexMicroform()\r\n if (flexState.microformCreated && microformInstance) {\r\n microformInstance.teardown()\r\n actions.clearMicroformInstance()\r\n }\r\n }\r\n }, [actions, flexState.microformCreated])\r\n\r\n return <>\r\n}\r\n\r\nexport const ConnectedFlexForm = connectRedux(FlexForm, mapFlexFormState, mapFlexFormActions)\r\n","export enum COOKIE_NAMES {\r\n LMI_MA = '__lmi_ma',\r\n MARKETO_TRK = '_mkto_trk',\r\n CHOP_ID = 'chop_id',\r\n GCL_ID = 'gclid_cookie',\r\n GCL_ID_2 = 'gclid',\r\n GTC_EMAIL = 'gtc-email',\r\n GEO_IP = 'visitor_geoip_country',\r\n}\r\n","export enum FEATURE_FLAGS {\r\n RESOLVE_TRIAL_ALLOWVERIFICATIONBYPASS = 'Resolve-Trial-AllowVerificationBypass',\r\n RESOLVE_FREE_WITH_TRIAL = 'Resolve-Free-With-Trial',\r\n RESOLVE_USE_NEW_SKUS = 'Resolve-SKUs-V2',\r\n RESOLVE_USE_CUSTOM_AGENTS_DEVICES = 'Resolve-V2-AgentsAndDevices',\r\n RESOLVE_USE_REMOTESUPPORT_AGENTS = 'Resolve-V2-RemoteSupport-AgentQuantity',\r\n\r\n // TODO: WAE1-3569: Either remove or update these flag names to be LMI specific\r\n LMIPRO_TRIAL_ALLOWVERIFICATIONBYPASS = 'Resolve-Trial-AllowVerificationBypass',\r\n LMIPRO_FREE_WITH_TRIAL = 'Resolve-Free-With-Trial',\r\n LMIPRO_USE_NEW_SKUS = 'Resolve-SKUs-V2',\r\n LMIPRO_USE_CUSTOM_AGENTS_DEVICES = 'Resolve-V2-AgentsAndDevices',\r\n LMIPRO_USE_REMOTESUPPORT_AGENTS = 'Resolve-V2-RemoteSupport-AgentQuantity',\r\n\r\n BUY_TRIAL_ALLOWVERIFICATIONBYPASS = 'Resolve-Trial-AllowVerificationBypass',\r\n BUY_FREE_WITH_TRIAL = 'Resolve-Free-With-Trial',\r\n BUY_USE_NEW_SKUS = 'Resolve-SKUs-V2',\r\n BUY_USE_CUSTOM_AGENTS_DEVICES = 'Resolve-V2-AgentsAndDevices',\r\n BUY_USE_REMOTESUPPORT_AGENTS = 'Resolve-V2-RemoteSupport-AgentQuantity',\r\n}\r\n","export const FLEX_KEY = process.env.FLEX_KEY || ''\r\n","// export enum COMPANY_SIZE {\r\n// tier1,\r\n// tier2,\r\n// tier3,\r\n// tier4,\r\n// tier5,\r\n// tier6,\r\n// }\r\n\r\nexport enum COMPANY_TIERS {\r\n ECOM = 'Ecomm',\r\n CONTACT = 'Contact',\r\n UNAVAILABLE = 'Unavailable',\r\n}\r\n\r\nexport enum COMPANY_LABEL_TIERS {\r\n tier1 = 'tier1',\r\n tier2 = 'tier2',\r\n tier3 = 'tier3',\r\n tier4 = 'tier4',\r\n tier5 = 'tier5',\r\n tier6 = 'tier6',\r\n}\r\n","export enum COUNTRIES {\r\n US = 'US',\r\n CA = 'CA',\r\n}\r\n\r\nexport enum RESTRICTED_COUNTRIES {\r\n CU = 'CU',\r\n IR = 'IR',\r\n KP = 'KP',\r\n SD = 'SD',\r\n SY = 'SY',\r\n}\r\n\r\ntype TaxCountries = {\r\n [key: string]: string\r\n}\r\n\r\nexport const TAX_COUNTRIES: TaxCountries = {\r\n CH: 'CHE',\r\n GR: 'EL',\r\n}\r\n","import { constantsType } from '@common/state/constants-state'\r\n\r\nexport enum CURRENCY {\r\n USD = 'USD',\r\n EUR = 'EUR',\r\n GBP = 'GBP',\r\n AUD = 'AUD',\r\n CAD = 'CAD',\r\n MXN = 'MXN',\r\n}\r\n\r\nexport enum LOCALES {\r\n EN_US = 'en-US',\r\n}\r\n\r\nexport enum LANGUAGE {\r\n EN = 'en',\r\n}\r\n\r\nexport const CURRENCY_SYMBOLS: constantsType = {\r\n USD: '$',\r\n EUR: '€',\r\n GBP: '£',\r\n AUD: 'AU$',\r\n CAD: 'C$',\r\n MXN: 'MX$',\r\n}\r\n","import { getDomain } from '@common/utils/get-domain'\r\nimport { LANGUAGE_CODES } from './languages'\r\n\r\n// Get language tag from the url if there's one\r\nconst urlSplitForLang = window.location.pathname.slice(1, 3)\r\nconst hasLang = Object.values(LANGUAGE_CODES).includes(urlSplitForLang)\r\nconst urlLang = hasLang ? `/${urlSplitForLang}` : ''\r\n\r\nexport enum VIEW_PATH {\r\n PATH_SUCCESS = '/success',\r\n PATH_ERROR = '/fatal-error',\r\n PATH_CUSTOMIZE = '/customize',\r\n PATH_CHECKOUT = '/checkout',\r\n PATH_CONFIRMATION = '/confirmation',\r\n PATH_TRIAL = '/trial',\r\n PATH_FREE = '/free',\r\n PATH_BASE = '/',\r\n}\r\n\r\nexport enum GTC_VIEW_PATH {\r\n PATH_NEXT_STEPS = '/next-steps',\r\n}\r\n\r\nexport const PRODUCT_PATH = {\r\n CONNECT: '/connect',\r\n RESOLVE: `${urlLang}/resolve`,\r\n LOGMEINPRO: `${urlLang}/logmeinpro`,\r\n BUY: `/buy`,\r\n LOGMEINCENTRAL: `${urlLang}/logmeincentral`,\r\n}\r\n\r\nexport enum GTRESOLVE_VIEW_PATH {\r\n PATH_FREE_TIER = '/free',\r\n PATH_STANDARD_TIER = '/trial',\r\n}\r\n\r\nexport const GTC_VIEW_PATHS = {\r\n CONNECT_CUSTOMIZE: `${PRODUCT_PATH.CONNECT}${VIEW_PATH.PATH_CUSTOMIZE}`,\r\n CONNECT_CHECKOUT: `${PRODUCT_PATH.CONNECT}${VIEW_PATH.PATH_CHECKOUT}`,\r\n CONNECT_TRIAL: `${PRODUCT_PATH.CONNECT}${VIEW_PATH.PATH_TRIAL}`,\r\n CONNECT_ERROR: `${PRODUCT_PATH.CONNECT}${VIEW_PATH.PATH_ERROR}`,\r\n CONNECT_NEXT_STEPS: `${PRODUCT_PATH.CONNECT}${GTC_VIEW_PATH.PATH_NEXT_STEPS}`,\r\n}\r\n\r\nexport const GTRESOLVE_VIEW_PATHS = {\r\n RESOLVE_CUSTOMIZE: `${PRODUCT_PATH.RESOLVE}${VIEW_PATH.PATH_CUSTOMIZE}`,\r\n RESOLVE_CHECKOUT: `${PRODUCT_PATH.RESOLVE}${VIEW_PATH.PATH_CHECKOUT}`,\r\n RESOLVE_FREE_TIER: `${PRODUCT_PATH.RESOLVE}${GTRESOLVE_VIEW_PATH.PATH_FREE_TIER}`,\r\n RESOLVE_STANDARD_TIER: `${PRODUCT_PATH.RESOLVE}${GTRESOLVE_VIEW_PATH.PATH_STANDARD_TIER}`,\r\n RESOLVE_ERROR: `${PRODUCT_PATH.RESOLVE}${VIEW_PATH.PATH_ERROR}`,\r\n}\r\n// TODO: Changes needs to made based on unified config\r\nexport const BUY_VIEW_PATHS = {\r\n BUY_ROOT: PRODUCT_PATH.BUY,\r\n BUY_CUSTOMIZE: `${PRODUCT_PATH.BUY}${VIEW_PATH.PATH_CUSTOMIZE}`,\r\n BUY_CHECKOUT: `${PRODUCT_PATH.BUY}${VIEW_PATH.PATH_CHECKOUT}`,\r\n BUY_FREE_TIER: `${PRODUCT_PATH.BUY}${GTRESOLVE_VIEW_PATH.PATH_FREE_TIER}`,\r\n BUY_STANDARD_TIER: `${PRODUCT_PATH.BUY}${GTRESOLVE_VIEW_PATH.PATH_STANDARD_TIER}`,\r\n BUY_ERROR: `${PRODUCT_PATH.BUY}${VIEW_PATH.PATH_ERROR}`,\r\n}\r\n\r\nexport enum BUY_VIEW_PATH {\r\n PATH_FREE_TIER = '/free',\r\n PATH_STANDARD_TIER = '/trial',\r\n}\r\n\r\nexport const LMIPRO_VIEW_PATHS = {\r\n LMIPRO_CUSTOMIZE: `${PRODUCT_PATH.LOGMEINPRO}${VIEW_PATH.PATH_CUSTOMIZE}`,\r\n LMIPRO_CHECKOUT: `${PRODUCT_PATH.LOGMEINPRO}${VIEW_PATH.PATH_CHECKOUT}`,\r\n}\r\n\r\nexport const LMIPRO_REDIRECT_PATHS = {\r\n LMIPRO_REDIRECT_PRO: `/pro`,\r\n LMIPRO_REDIRECT_CENTRAL: `/central`,\r\n}\r\n\r\nexport const LMICENTRAL_VIEW_PATHS = {\r\n LMICENTRAL_CUSTOMIZE: `${PRODUCT_PATH.LOGMEINCENTRAL}${VIEW_PATH.PATH_CUSTOMIZE}`,\r\n LMICENTRAL_CHECKOUT: `${PRODUCT_PATH.LOGMEINCENTRAL}${VIEW_PATH.PATH_CHECKOUT}`,\r\n}\r\n\r\nexport const DOMAIN_NAME = getDomain()\r\n\r\nexport const APP_PATHS = {\r\n ...GTC_VIEW_PATHS,\r\n ...GTRESOLVE_VIEW_PATHS,\r\n ...LMIPRO_VIEW_PATHS,\r\n ...LMICENTRAL_VIEW_PATHS,\r\n ...BUY_VIEW_PATHS,\r\n}\r\n","export function getDomain() {\r\n const hostName = window.location.hostname.toLowerCase()\r\n if (hostName.includes('localhost')) {\r\n return hostName\r\n }\r\n const urlParts = hostName.split('.')\r\n // return the parent domain\r\n return `.${urlParts.slice(-2).join('.')}`\r\n}\r\n","export enum PlanNames {\r\n GoToMeeting = 'GoToMeeting',\r\n GoToWebinar = 'GoToWebinar',\r\n GoToTraining = 'GoToTraining',\r\n}\r\n","export enum PRODUCT_FAMILY_KEY {\r\n G2M = 'G2M',\r\n G2W = 'G2W',\r\n G2T = 'G2T',\r\n G2C = 'G2C',\r\n G2R = 'G2RV',\r\n LMIPRO = 'lmip',\r\n LMICENTRAL = 'lmic',\r\n LMIRESCUE = 'lmir',\r\n}\r\n\r\nexport enum PRODUCT_FAMILY_NAME {\r\n G2C = 'GoToConnect',\r\n G2R = 'GoToResolve',\r\n LMIPRO = 'Pro',\r\n LMICENTRAL = 'Central',\r\n LMIRESCUE = 'Rescue',\r\n}\r\n\r\nexport enum PRODUCT_SKU {\r\n G2C_JUST_TALK = 'G2CJustTalk',\r\n G2C = 'G2C',\r\n G2RE_BASIC_NAMED = 'GTRBasicNamed',\r\n G2RE_STANDARD_NAME = 'GTRStandardNamed',\r\n GTR_REMOTE_SUPPORT_NAMED_V2 = 'GTRRemoteSupportNamed-v2',\r\n GTR_STANDARD_NAMED_V2 = 'GTRStandardNamed-v2',\r\n GTR_REMOTE_ACCESS = 'GTRRemoteAccess',\r\n GTR_REMOTE_SUPPORT_PLUS = 'GTRRemoteSupportPlusNamed',\r\n // TODO: WAE1-3569: Update these names to use LMI specific values\r\n LMIPRO_BASIC_NAMED = 'GTRBasicNamed',\r\n LMIPRO_STANDARD_NAME = 'GTRStandardNamed',\r\n LMIPRO_REMOTE_SUPPORT_NAMED_V2 = 'GTRRemoteSupportNamed-v2',\r\n LMIPRO_STANDARD_NAMED_V2 = 'GTRStandardNamed-v2',\r\n LMIPRO_REMOTE_ACCESS = 'GTRRemoteAccess',\r\n LMIPRO_REMOTE_SUPPORT_PLUS = 'GTRRemoteSupportPlusNamed',\r\n LMIPRO_INDIVIDUAL_NAME = 'Pro2',\r\n LMIPRO_SMALL_BUSSINESS_NAME = 'Pro5',\r\n LMIPRO_POWER_USER_NAME = 'Pro10',\r\n LMIPRO_POWER_USER_25_NAME = 'Pro25',\r\n LMIPRO_POWER_USER_50_NAME = 'Pro50',\r\n // ESC-1164 :: LMI Central\r\n LMICENTRAL_BASIC = 'CentBase',\r\n LMICENTRAL_BASIC_NAMED = 'GTRBasicNamed',\r\n LMICENTRAL_STANDARD_NAME = 'GTRStandardNamed',\r\n LMICENTRAL_REMOTE_SUPPORT_NAMED_V2 = 'GTRRemoteSupportNamed-v2',\r\n LMICENTRAL_STANDARD_NAMED_V2 = 'GTRStandardNamed-v2',\r\n LMICENTRAL_REMOTE_ACCESS = 'GTRRemoteAccess',\r\n LMICENTRAL_REMOTE_SUPPORT_PLUS = 'GTRRemoteSupportPlusNamed',\r\n}\r\n\r\nexport enum PRODUCTS {\r\n CONNECT = 'connect',\r\n RESOLVE = 'resolve',\r\n LMIPRO = 'logmeinpro', // TODO: WAE1-3569: Update this value if needed\r\n LMICENTRAL = 'logmeincentral',\r\n LMIRESCUE = 'logmeinrescue',\r\n}\r\n\r\nexport enum SC_SITE {\r\n RESOLVE = 'gotoresolve',\r\n CONNECT = 'gotoconnect',\r\n LOGMEIN = 'logmein',\r\n BUY = 'buy',\r\n}\r\n\r\nexport enum PREFIX {\r\n G2C = 'G2C',\r\n GTR = 'GTR',\r\n}\r\n","export enum TimePeriod {\r\n Month = 'MONTH',\r\n Year = 'YEAR',\r\n AnnualBilledMonthly = 'ANNUALBILLEDMONTHLY',\r\n}\r\n\r\nexport enum BillingPeriod {\r\n ANNUAL = 'annual',\r\n MONTHLY = 'monthly',\r\n ANNUALBILLEDMONTHLY = 'monthlyAnnual',\r\n}\r\n\r\nexport enum BillingPeriodFromBOSS {\r\n ANNUAL = 'UpfrontAnnual',\r\n MONTHLY = 'UpfrontMonthly',\r\n ANNUALCONTRACT = 'MonthlyAnnual',\r\n}\r\n\r\nexport enum BillingPeriodKey {\r\n ANNUAL = 'AnnualBilling',\r\n MONTHLY = 'MonthlyBilling',\r\n ANNUALCONTRACT = 'MonthlyBillingWithAnnualContract',\r\n}\r\n\r\nexport const BillingPeriodKeyMapper: Record = {\r\n AnnualBilling: BillingPeriod.ANNUAL,\r\n MonthlyBilling: BillingPeriod.MONTHLY,\r\n MonthlyBillingWithAnnualContract: BillingPeriod.ANNUALBILLEDMONTHLY,\r\n}\r\n\r\nexport const BillingPeriodTimePeriodMapper: Record = {\r\n [BillingPeriod.ANNUAL]: TimePeriod.Year,\r\n [BillingPeriod.MONTHLY]: TimePeriod.Month,\r\n [BillingPeriod.ANNUALBILLEDMONTHLY]: TimePeriod.AnnualBilledMonthly,\r\n}\r\n\r\nexport const TimePeriodBillingPeriodMapper: Record = {\r\n [TimePeriod.Year]: BillingPeriod.ANNUAL,\r\n [TimePeriod.Month]: BillingPeriod.MONTHLY,\r\n [TimePeriod.AnnualBilledMonthly]: BillingPeriod.ANNUALBILLEDMONTHLY,\r\n}\r\n\r\nexport const TimePeriodBillingPeriodFromBOSSMapper: Record = {\r\n [TimePeriod.Year]: BillingPeriodFromBOSS.ANNUAL,\r\n [TimePeriod.Month]: BillingPeriodFromBOSS.MONTHLY,\r\n [TimePeriod.AnnualBilledMonthly]: BillingPeriodFromBOSS.ANNUALCONTRACT,\r\n}\r\n\r\nexport const PriceInfoPeriod: Record = {\r\n UpfrontAnnual: 'annual',\r\n UpfrontMonthly: 'monthly',\r\n MonthlyAnnual: 'monthlyAnnual',\r\n}\r\n","export const authOptions = {\r\n client_id: process.env.AUTH_CLIENT_ID || '',\r\n url: process.env.AUTH_CLIENT_URL || '',\r\n redirect_url: window.location.origin,\r\n scope: 'identity:',\r\n theme: 'goto',\r\n}\r\n","import { getExternalUrl } from '@common/utils/get-external-url'\r\n\r\nconst backupDevUrl = getExternalUrl()\r\nexport const ENVIRONMENT_URL = backupDevUrl\r\n","export const getExternalUrl = () => {\r\n const hostName = window.location.hostname.toLowerCase()\r\n if (hostName.includes('buydevcm')) {\r\n return 'https://buydevcm.goto.com'\r\n }\r\n if (hostName.includes('buydevcd')) {\r\n return 'https://buydevcd.goto.com'\r\n }\r\n return ''\r\n}\r\n","export enum MARKETO_PLAN_TYPE {\r\n BUY = 'buy',\r\n TRIAL = 'trial',\r\n}\r\n","export enum STORAGE_CONST {\r\n SAVED_ROUTE = 'gtc-saved-route',\r\n SAVED_QUERY = 'gtc-saved-query',\r\n GTC_STORE = 'gtc-store',\r\n GTC_COUPON_STORE = 'gtc-coupon-store',\r\n GTR_STORE = 'gtr-store',\r\n BUY_STORE = 'buy-store',\r\n GTR_COUPON_STORE = 'gtr-coupon-store',\r\n LMIPRO_STORE = 'lmipro-store',\r\n LMIPRO_COUPON_STORE = 'lmipro-coupon-store',\r\n SAVED_LANGUAGE = 'saved-language',\r\n BUY_CHECKOUT_STORE = 'buy-flexible-store',\r\n LMICENTRAL_STORE = 'lmicentral-store',\r\n LMICENTRAL_COUPON_STORE = 'lmicentral-coupon-store',\r\n STORED_GA_EVENT_PREFIX = 'stored-ga-event-',\r\n}\r\n","export enum TRACKING_EVENTS {\r\n VIEW_CONTENT = 'view_content',\r\n SESSION_INFORMATION = 'session_information',\r\n USER_INFORMATION = 'user_information',\r\n VIEW_PROMOTION = 'view_promotion',\r\n SELECT_PROMOTION = 'select_promotion',\r\n VIEW_ITEM = 'view_item',\r\n ADD_TO_CART = 'add_to_cart',\r\n REMOVE_FROM_CART = 'remove_from_cart',\r\n BEGIN_CHECKOUT = 'begin_checkout',\r\n PURCHASE = 'purchase',\r\n ERROR_PURCHASE = 'error_purchase',\r\n LOAD_FORM = 'load_form',\r\n START_FORM = 'start_form',\r\n ABANDON_FORM = 'abandon_form',\r\n SUBMIT_FORM = 'submit_form',\r\n ERROR_FORM = 'error_form',\r\n ERROR_ACCOUNT = 'error_account',\r\n SUBMIT_CHATBOT = 'submit_chatbot',\r\n LOGIN = 'login',\r\n START_BUY_FLOW = 'start_buy_flow',\r\n COMPLETE_BUY_FLOW = 'complete_buy_flow',\r\n START_CONTACT_SALES_FLOW = 'start_contact_sales_flow',\r\n COMPLETE_CONTACT_SALES_FLOW = 'complete_contact_sales_flow',\r\n CLICK_CTA = 'click_cta',\r\n FATAL_ERROR = 'fatal_error',\r\n EMAIL_VALIDATION = 'email_validation',\r\n CARDINAL_SECURITY_MODAL = 'checkout_security_modal',\r\n CARDINAL_LOADED = 'security_modal_loaded',\r\n CARDINAL_INITIATED = 'security_modal_challenge',\r\n CARDINAL_SUCCESS = 'security_modal_success',\r\n CARDINAL_FAIL = 'security_modal_fail',\r\n}\r\n","export const ANALYTICS_CONTAINER_ID = {\r\n G2C: process.env.GOTO_ANALYTICS_CONTAINER_ID,\r\n G2R: process.env.RESOLVE_ANALYTICS_CONTAINER_ID,\r\n LMIPRO: process.env.LMIPRO_ANALYTICS_CONTAINER_ID,\r\n LMICENTRAL: process.env.LMICENTRAL_ANALYTICS_CONTAINER_ID,\r\n}\r\n","export enum DIRECTIONS {\r\n RIGHT = 'right',\r\n LEFT = 'left',\r\n}\r\n","import { BillingPeriod, TimePeriod } from './timePeriod'\r\n\r\nexport enum COUPON_TYPE {\r\n FLEXIBLE = 'Flexible',\r\n FIX = 'Fix',\r\n}\r\nexport enum COUPON_DISCOUNT_TYPE {\r\n REPRICE = 'Reprice',\r\n AMOUNTOFF = 'AmountOff',\r\n PERCENTAGEOFF = 'PercentageOff',\r\n}\r\n\r\nexport enum COUPON_ACTION {\r\n NEW_PURCHASE = 'NewPurchase',\r\n}\r\n\r\nexport enum COUPON_PAYMENT_PLAN {\r\n UPFRONTMONTHLY = 'UpfrontMonthly',\r\n UPFRONTANNUAL = 'UpfrontAnnual',\r\n MONTHLYANNUAL = 'MonthlyAnnual',\r\n}\r\n\r\nexport const BillingPeriodCouponPaymentPlanMapper: Record = {\r\n [BillingPeriod.ANNUAL]: COUPON_PAYMENT_PLAN.UPFRONTANNUAL,\r\n [BillingPeriod.MONTHLY]: COUPON_PAYMENT_PLAN.UPFRONTMONTHLY,\r\n [BillingPeriod.ANNUALBILLEDMONTHLY]: COUPON_PAYMENT_PLAN.MONTHLYANNUAL,\r\n}\r\n\r\nexport const TimePeriodCouponPaymentPlanMapper: Record = {\r\n [TimePeriod.Year]: COUPON_PAYMENT_PLAN.UPFRONTANNUAL,\r\n [TimePeriod.Month]: COUPON_PAYMENT_PLAN.UPFRONTMONTHLY,\r\n [TimePeriod.AnnualBilledMonthly]: COUPON_PAYMENT_PLAN.MONTHLYANNUAL,\r\n}\r\n","export const LMI_MA_SCRIPT = {\r\n URL: process.env.MARKETING_ATTRIBUTION_SCRIPT_URL,\r\n}\r\n","export enum PLATFORM {\r\n DEV = 'dev',\r\n PROD = 'prod',\r\n}\r\n","import { BillingPeriod } from './timePeriod'\r\n\r\nexport enum PRODUCT_TYPES {\r\n TRIAL = 'Trial',\r\n PAID = 'Paid',\r\n}\r\n\r\nexport enum BILLING_TYPES {\r\n ANNUAL = 'UpfrontAnnual',\r\n MONTHLY = 'UpfrontMonthly',\r\n MONTHLYANNUAL = 'MonthlyAnnual',\r\n}\r\n\r\nexport const BillingPeriodBillingTypesMapper: Record = {\r\n [BillingPeriod.ANNUAL]: BILLING_TYPES.ANNUAL,\r\n [BillingPeriod.MONTHLY]: BILLING_TYPES.MONTHLY,\r\n [BillingPeriod.ANNUALBILLEDMONTHLY]: BILLING_TYPES.MONTHLYANNUAL,\r\n}\r\n","export interface PhoneInfo {\r\n phoneNumberStatus?: PHONE_NUMBER_STATUS\r\n phoneNumberType?: PHONE_NUMBER_TYPE\r\n}\r\n\r\nexport enum PHONE_NUMBER_STATUS {\r\n ENTERED = 'entered',\r\n NOT_ENTERED = 'not entered',\r\n}\r\n\r\nexport enum PHONE_NUMBER_TYPE {\r\n LOCAL = 'local',\r\n TOLL_FREE = 'toll-free',\r\n}\r\n","export const CHATBOT_CONFIG = {\r\n companyKey: process.env.KHOROS_CONFIG_COMPANY_KEY,\r\n appId: process.env.KHOROS_CONFIG_APP_ID,\r\n widgetId: process.env.KHOROS_CONFIG_WIDGET_ID,\r\n}\r\n","type languages = {\r\n [key: string]: string\r\n}\r\nexport const LANGUAGE_CODES: languages = {\r\n English: 'en',\r\n Español: 'es',\r\n Deutsch: 'de',\r\n Français: 'fr',\r\n Italiano: 'it',\r\n Nederlands: 'nl',\r\n Português: 'pt',\r\n}\r\n","export const screenSize = {\r\n mobile: '(max-width: 576px)',\r\n tablet: '(max-width: 768px)',\r\n}\r\n","import { useEffect } from 'react'\r\nimport smoothscrollPolyfill from 'smoothscroll-polyfill'\r\n\r\nexport const useSmoothScrollPolyfill = () => {\r\n useEffect(() => {\r\n // polyfill the scroll* (intoView, By, & To) api for the DOM\r\n smoothscrollPolyfill.polyfill()\r\n }, [])\r\n}\r\n","import { PLATFORM } from '@common/constants'\r\nimport { useLoadScript } from './useLoadScript'\r\n\r\nexport const useFlexForm = () => {\r\n const flexScriptUrl =\r\n process.env.ENVIRONMENT !== PLATFORM.PROD\r\n ? 'https://testflex.cybersource.com/cybersource/assets/microform/0.11/flex-microform.min.js'\r\n : 'https://flex.cybersource.com/cybersource/assets/microform/0.11/flex-microform.min.js'\r\n\r\n return useLoadScript(flexScriptUrl)\r\n}\r\n","import { useLoadScript } from './useLoadScript'\r\n\r\n// See documentation for device fingerprinting / decisionmaker\r\n// https://confluence.ops.expertcity.com/x/L4UVIg\r\n// https://confluence.ops.expertcity.com/x/7um3Cw\r\n// https://confluence.ops.expertcity.com/x/cxthC\r\n\r\nexport const useMetrixScript = (shouldLoadScript: boolean, orgId: string, sessionId: string, merchantId: string) => {\r\n return useLoadScript(\r\n `https://cdn-east.purchase.goto.com/fp/tags.js?org_id=${orgId}&session_id=${merchantId}${sessionId}`,\r\n shouldLoadScript\r\n )\r\n}\r\n","import { FormikProps } from 'formik'\r\nimport { useEffect } from 'react'\r\n\r\nexport const useClearField = (\r\n shouldClearField: boolean,\r\n formikRef: React.RefObject>,\r\n fieldName: string\r\n) => {\r\n // clear email\r\n useEffect(() => {\r\n if (shouldClearField && formikRef.current) {\r\n formikRef.current.setFieldValue(fieldName, '')\r\n formikRef.current.setFieldTouched(fieldName, false)\r\n }\r\n }, [shouldClearField, fieldName, formikRef])\r\n}\r\n","import { useEffect, useState } from 'react'\r\nimport { useNavigate, useLocation } from 'react-router-dom'\r\nimport { APP_PATHS, STORAGE_CONST } from '@common/constants'\r\nimport { useDispatch } from 'react-redux'\r\nimport { buyUserActions } from '@buy/state/user/actions'\r\n\r\nexport const useRedirectOnLoad = () => {\r\n const navigate = useNavigate()\r\n const location = useLocation()\r\n const [didRedirect, setDidRedirect] = useState(undefined)\r\n\r\n const dispatch = useDispatch()\r\n\r\n useEffect(() => {\r\n try {\r\n // If silent auth iframe is returning from the auth server with a code\r\n const isInHiddenSilentAuthIFrame = !!window.sessionStorage.getItem('IsSilentAuth')\r\n if (isInHiddenSilentAuthIFrame) {\r\n // We aren't really redirecting here, but this gets the caller\r\n // to not render the actual page inside the iframe\r\n // See src/common/views/RootView/index.tsx\r\n setDidRedirect(true)\r\n\r\n // The code in src/products/buy/saga/user/get-token.ts will end silent auth from the iframe\r\n // and pass control back to the parent frame\r\n dispatch(buyUserActions.getAccessToken())\r\n\r\n // Don't continue any more code in the iframe\r\n return\r\n }\r\n\r\n const { pathname, search, hash } = location\r\n // check if there is a saved route\r\n const searchParams = new URLSearchParams(search)\r\n const savedRoute = localStorage.getItem(STORAGE_CONST.SAVED_ROUTE) || pathname\r\n const savedQuery = localStorage.getItem(STORAGE_CONST.SAVED_QUERY)\r\n\r\n if (savedQuery) {\r\n new URLSearchParams(savedQuery).forEach((val, key) => {\r\n searchParams.set(key, val)\r\n })\r\n }\r\n\r\n const combinedQuery = searchParams.toString() ? `?${searchParams.toString()}` : ''\r\n // check to make sure the route is valid\r\n const isRouteDefined = Object.values(APP_PATHS).find((path) => savedRoute.includes(path))\r\n // Once we get the saved Route and Query values, delete the stored Route and Query so that after user don't have to get redirected to the stored page even if it's valid path\r\n localStorage.removeItem(STORAGE_CONST.SAVED_ROUTE)\r\n localStorage.removeItem(STORAGE_CONST.SAVED_QUERY)\r\n // if the route is valid and is different than the current one or the current search value\r\n if (isRouteDefined && (savedRoute !== pathname || combinedQuery !== search)) {\r\n // redirect to that route\r\n setDidRedirect(true)\r\n navigate({ pathname: savedRoute, search: combinedQuery, hash })\r\n } else {\r\n setDidRedirect(false)\r\n }\r\n } catch (e: any) {\r\n console.error(e.message)\r\n }\r\n }, [navigate, location, dispatch])\r\n\r\n return {\r\n didRedirect,\r\n }\r\n}\r\n","import { addGTMIframe } from '@common/utils'\r\nimport { useEffect } from 'react'\r\n\r\nexport const useGTM = (gtmProductCode: string) => {\r\n useEffect(() => {\r\n const script = document.createElement('script')\r\n script.innerHTML = `\r\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\r\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\r\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\r\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\r\n })(window,document,'script','dataLayer','GTM-${gtmProductCode}');\r\n `\r\n document.head.prepend(script)\r\n const gtmIframe = addGTMIframe(gtmProductCode)\r\n return () => {\r\n document.head.removeChild(script)\r\n document.body.removeChild(gtmIframe)\r\n }\r\n }, [gtmProductCode])\r\n}\r\n","import { isEmpty } from 'lodash-es'\r\nimport { useEffect, useState } from 'react'\r\n\r\nexport const usePageLoad = (onPageLoad: () => void, shouldExecute = true) => {\r\n const [pageLoaded, setPageLoaded] = useState(false)\r\n useEffect(() => {\r\n if (!pageLoaded && shouldExecute) {\r\n onPageLoad()\r\n setPageLoaded(true)\r\n }\r\n }, [onPageLoad, pageLoaded, shouldExecute])\r\n}\r\n\r\nexport const usePageLoadV2 = (onPageLoad: () => void, dependencies: Array) => {\r\n const [pageLoaded, setPageLoaded] = useState(false)\r\n const areBothPopulated = (value: Array) => {\r\n if (isEmpty(value)) return false\r\n\r\n let result = true\r\n value.forEach((item) => {\r\n if (isEmpty(item)) result = false\r\n })\r\n return result\r\n }\r\n useEffect(() => {\r\n if (!pageLoaded && areBothPopulated(dependencies)) {\r\n onPageLoad()\r\n setPageLoaded(true)\r\n }\r\n }, [onPageLoad, pageLoaded, dependencies])\r\n}\r\n","/* eslint-disable no-underscore-dangle */\r\n// import { useEffect, useState } from 'react'\r\n// import { useLoadScript } from '@common/hooks'\r\n\r\n// BoldChat Customer Monitor HTML v5.00 (Website=GoTo.com - Nano,ChatButton=C&C/GoTo.com/GTC/NA,ChatInvitation=C&C - GoTo.com - AI)\r\nexport const useBoldChat = (/* URL: string */) => {\r\n // only load the boldchat script if the pageViewer doesn't exist on the window object\r\n /* const [shouldLoad, setShouldLoad] = useState(true)\r\n\r\n useEffect(() => {\r\n setShouldLoad(false)\r\n }, [])\r\n\r\n useLoadScript(`${URL}.js`, shouldLoad)\r\n */\r\n return undefined\r\n}\r\n","import { useLoadScript } from './useLoadScript'\r\n\r\nexport const useTrustArc = (language?: string) => {\r\n return useLoadScript(\r\n '//consent.trustarc.com/notice?domain=goto.com>m=1&c=teconsent&js=nj¬iceType=bb&text=true&pcookie',\r\n true,\r\n language\r\n )\r\n}\r\n","import { useEffect } from 'react'\r\n\r\nlet surveyDelay: boolean | undefined\r\nexport const useQualtrics = (showSurvey: boolean, Q_ZID: string, cb?: (args?: any) => any) => {\r\n useEffect(() => {\r\n const script = document.createElement('script')\r\n script.innerHTML = `(function(){var g=function(e,h,f,g){\r\n this.get=function(a){for(var a=a+\"=\",c=document.cookie.split(\";\"),b=0,e=c.length;b=e/100?0:100),a=[h,e,0],this.set(f,a.join(\":\"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case \"v\":return!1;case \"r\":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(\":\")),!c}return!0};\r\n this.go=function(){if(this.check()){var a=document.createElement(\"script\");a.type=\"text/javascript\";a.src=g;document.body&&document.body.appendChild(a)}};\r\n this.start=function(){var t=this;\"complete\"!==document.readyState?window.addEventListener?window.addEventListener(\"load\",function(){t.go()},!1):window.attachEvent&&window.attachEvent(\"onload\",function(){t.go()}):t.go()};};\r\n try{(new g(100,\"r\",\"QSI_S_${Q_ZID}\",\"https://${Q_ZID.replace(\r\n /_/g,\r\n ''\r\n ).toLowerCase()}-logmeinvoc.siteintercept.qualtrics.com/SIE/?Q_ZID=${Q_ZID}\")).start()}catch(i){}})();`\r\n if (showSurvey && !surveyDelay) {\r\n setTimeout(() => surveyDelay && document.head.prepend(script), 5000)\r\n window.addEventListener(\r\n 'qsi_js_loaded',\r\n () => {\r\n if ((window as any).QSI) {\r\n cb?.()\r\n ;(window as any).QSI.util.observe(window, 'message', (e: any) => {\r\n if (e.data && typeof e.data === 'string') {\r\n const parts = e.data.split('|')\r\n if (parts[0] === 'QualtricsEOS') {\r\n console.log(e)\r\n }\r\n }\r\n })\r\n } else {\r\n throw new Error('Error loading qualtrics API')\r\n }\r\n },\r\n false\r\n )\r\n }\r\n surveyDelay = showSurvey\r\n }, [showSurvey, Q_ZID, cb])\r\n}\r\n","import { CHATBOT_CONFIG } from '@common/constants'\r\nimport { useLoadScript } from './useLoadScript'\r\n\r\nexport const useChatbot = (enableChatBot: boolean) => {\r\n ;(window as any).KHOROS_CONFIG = CHATBOT_CONFIG\r\n\r\n return useLoadScript(`https://js.qualified.com/qualified.js?token=hUipxtRKEHpLVXaK`, enableChatBot)\r\n}\r\n","// Google Places automatically changes the autocomplete attribute of the input field from \"new-password\" to \"off\" which\r\n// doesn't work to prevent Chrome's address auto-fill dropdown from showing up\r\n// This function monitors an element for changes to a given attribute and sets it back to the original value.\r\n// See: https://stackoverflow.com/a/41425087\r\nexport const lockHtmlElementAttribute = (\r\n input: any,\r\n attributeName: string,\r\n unlockAfterFirstMutationAttempt: boolean\r\n) => {\r\n const originalAttributeValue = input[attributeName]\r\n\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n if (mutation.type === 'attributes' && mutation.attributeName === attributeName) {\r\n observer.disconnect()\r\n input.setAttribute(attributeName, originalAttributeValue)\r\n if (!unlockAfterFirstMutationAttempt) {\r\n observer.observe(input, { attributes: true })\r\n }\r\n }\r\n })\r\n })\r\n\r\n observer.observe(input, { attributes: true })\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { useEffect, useState } from 'react'\r\nimport { useLoadScript } from '@common/hooks/useLoadScript'\r\nimport { lockHtmlElementAttribute } from '@common/utils/lockHtmlElementAttribute'\r\nimport { GooglePlace, GooglePlacesConstructorOptions } from '@common/state/addressAutoFill/state'\r\n\r\n// Example Google Places form: // https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform\r\n// https://developers.google.com/maps/documentation/javascript/places-autocomplete\r\n// https://developers.google.com/maps/documentation/javascript/reference/places-widget\r\nconst googlePlacesApiKey = process.env.GOOGLE_PLACES_API_KEY || ''\r\nconst GOOGLE_MAPS_URL = `https://maps.googleapis.com/maps/api/js`\r\n\r\ninterface IProps {\r\n language?: string\r\n streetFieldRef: any\r\n countries: string[]\r\n onChangePlace?: (googlePlace: GooglePlace) => void\r\n shouldLoad?: boolean\r\n}\r\n\r\nexport const useAddressAutoFill = ({\r\n language,\r\n streetFieldRef,\r\n countries,\r\n onChangePlace,\r\n shouldLoad = true,\r\n}: IProps) => {\r\n // See list of supported languages here: https://developers.google.com/maps/faq#languagesupport\r\n // \"By default the API will attempt to load the most appropriate language\r\n // based on the users location or browser settings. Some APIs allow you\r\n // to explicitly set a language when you make a request.\" - https://developers.google.com/maps/faq#languagesupport\r\n const googlePlacesUrl = `${GOOGLE_MAPS_URL}?language=${language}&key=${googlePlacesApiKey}&libraries=places&callback=initGoogleMaps`\r\n const [alreadyLoaded, setAlreadyLoaded] = useState(false)\r\n const shouldLoadScript = shouldLoad && !alreadyLoaded\r\n\r\n useLoadScript(googlePlacesUrl, shouldLoadScript)\r\n\r\n useEffect(() => {\r\n if (!shouldLoadScript) return\r\n\r\n // Callback for Google Maps script. This method name is used in the googlePlacesUrl above\r\n window.initGoogleMaps = () => {\r\n // Initialize Google Maps auto-complete\r\n // https://developers.google.com/maps/documentation/places/web-service/autocomplete?hl=en_US#input\r\n const options: GooglePlacesConstructorOptions = {\r\n type: ['address'], // https://developers.google.com/maps/documentation/places/web-service/autocomplete?hl=en_US#types\r\n fields: ['adr_address', 'address_components'], // https://developers.google.com/maps/documentation/places/web-service/place-data-fields?hl=en_US\r\n componentRestrictions: {\r\n country: countries,\r\n },\r\n }\r\n const input = streetFieldRef.current\r\n\r\n // Prevent Google Places from changing the autocomplete attribute\r\n // from \"new-password\" to \"off\" because \"off\" doesn't work in Chrome\r\n // See: https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion#preventing_autofilling_with_autocompletenew-password\r\n lockHtmlElementAttribute(input, 'autocomplete', true)\r\n\r\n const autoComplete = new window.google.maps.places.Autocomplete(input, options)\r\n\r\n autoComplete.addListener('place_changed', () => {\r\n const place = autoComplete.getPlace()\r\n if (onChangePlace) {\r\n onChangePlace(place)\r\n }\r\n })\r\n }\r\n setAlreadyLoaded(true)\r\n }, [countries, streetFieldRef, onChangePlace, shouldLoadScript])\r\n}\r\n\r\nexport default {\r\n useAddressAutoFill,\r\n}\r\n","import { useRef, useEffect } from 'react'\r\n\r\nexport const useIsMountedRef = () => {\r\n const isMountedRef = useRef(false)\r\n useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n return isMountedRef\r\n}\r\n","import { useEffect, useRef, useState } from 'react'\r\n\r\nexport const useLoadScript = (source: string, shouldLoadScript = true, language?: string) => {\r\n const [scriptLoad, setScriptLoad] = useState(false)\r\n const isMountedRef = useRef(false)\r\n\r\n const qualifiedChatBotScriptContent = `(function(w,q){w['QualifiedObject']=q;w[q]=w[q]||function(){(w[q].q=w[q].q||[]).push(arguments)};})(window,'qualified')`\r\n\r\n const onScriptLoad = () => {\r\n if (isMountedRef.current) {\r\n setScriptLoad(true)\r\n }\r\n }\r\n const onScriptError = () => {\r\n if (isMountedRef.current) {\r\n setScriptLoad(false)\r\n isMountedRef.current = false\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (shouldLoadScript && !isMountedRef.current) {\r\n const script = document.createElement('script')\r\n script.type = 'text/javascript'\r\n script.async = true\r\n script.src = `${source}${/trustarc\\.com/i.test(source) ? `&language=${language || 'en'}` : ''}`\r\n\r\n script.addEventListener('load', onScriptLoad)\r\n script.addEventListener('error', onScriptError)\r\n\r\n if (/qualified\\.com/i.test(source)) {\r\n const scriptTagQualifiedFunction = document.createElement('script')\r\n scriptTagQualifiedFunction.textContent = qualifiedChatBotScriptContent\r\n document.head.appendChild(scriptTagQualifiedFunction)\r\n document.head.appendChild(script)\r\n } else {\r\n document.body.appendChild(script)\r\n }\r\n\r\n isMountedRef.current = true\r\n return () => {\r\n if (isMountedRef.current) {\r\n isMountedRef.current = false\r\n script.removeEventListener('load', onScriptLoad)\r\n script.removeEventListener('error', onScriptError)\r\n document.body.removeChild(script)\r\n }\r\n }\r\n }\r\n setScriptLoad(true)\r\n\r\n return undefined\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [source, shouldLoadScript])\r\n return scriptLoad\r\n}\r\n","import { scrollToTop } from '@common/utils/scroll'\r\nimport { useEffect } from 'react'\r\n\r\nexport const useScrollToTop = () => {\r\n useEffect(() => {\r\n scrollToTop()\r\n }, [])\r\n}\r\n","import axios from 'axios'\r\nimport { AddressDataType } from '@common/state/location/state'\r\nimport { CURRENCY, ENVIRONMENT_URL, SC_SITE } from '@common/constants'\r\nimport { MarketoPayload } from '@common/state/marketing/state'\r\nimport { ReCAPTCHAValidationResponseData } from '@common/state/reCAPTCHA/state'\r\nimport { memoize } from 'lodash-es'\r\nimport { BUY_USER_TYPES_RESPONSE } from '@buy/constants'\r\n\r\nexport interface EmailType {\r\n emailAddress: string\r\n}\r\n\r\nexport interface EmailCheckResponse {\r\n status: number\r\n data: {\r\n canUserAuthenticate: boolean\r\n }\r\n}\r\n\r\n/* eslint-disable camelcase */\r\nexport interface SiteParamType {\r\n productFamily: string\r\n sc_lang?: string\r\n}\r\n\r\n// API Reference: https://confluence.ops.expertcity.com/x/qFunCw\r\nexport interface FlexTokenDataType {\r\n targetOrigin: string\r\n currency: string\r\n country: string\r\n skipFlexToken?: boolean\r\n skipSca?: boolean\r\n}\r\n\r\n/* eslint-disable camelcase */\r\nexport interface SiteType {\r\n sc_site: string\r\n}\r\n\r\nexport function getFlexTokenCall(data: FlexTokenDataType): Promise {\r\n return axios.post('/ecommapi/purchase/FlexKeyV3', data)\r\n}\r\n\r\nexport function getExternalLocationInfo() {\r\n return axios.get(`${ENVIRONMENT_URL}/ecommapi/utility/GetLocationInfo`)\r\n}\r\n\r\nexport interface LocationInfoResponseData {\r\n country: string\r\n currency: CURRENCY\r\n currencyRestricitons: CURRENCY[]\r\n language: string\r\n}\r\nexport function getLocationInfo(): Promise {\r\n return axios.get('/ecommapi/utility/GetLocationInfo')\r\n}\r\n\r\n// get countries\r\nexport function getCountries(params?: SiteParamType): Promise {\r\n return axios.get('/ecommapi/content/countries', { params })\r\n}\r\n\r\n// validate address\r\nexport function getValidAddress(address: AddressDataType): Promise {\r\n const addressHeaders = {\r\n headers: {\r\n Tenant: 'Connect',\r\n 'Content-Type': 'application/json; charset=UTF-8',\r\n },\r\n }\r\n return axios.post('/ecommapi/avs/validateaddress', address, addressHeaders)\r\n}\r\n\r\nexport interface VerificationTokenDataType {\r\n email: string\r\n theme?: string\r\n}\r\n\r\n// marketo\r\n// 11/05/2024 not being used after AWS migration, it will be removed if we are no longer need\r\nexport function postMarketo(payload: MarketoPayload, params?: SiteType) {\r\n return axios.post('/ecommapi/form/SendAsync', payload, {\r\n withCredentials: false,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n params,\r\n })\r\n}\r\n\r\n// Syncari\r\nexport function postSyncari(payload: any) {\r\n return axios.post(`${process.env.AWS_SYNCARI_ENDPOINT}`, payload, {\r\n withCredentials: false,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n })\r\n}\r\n\r\n// coupon\r\nexport function getCouponDetail(couponCode: string) {\r\n return axios.get(`${ENVIRONMENT_URL}/ecommapi/purchase/coupondetail/${couponCode}`)\r\n}\r\n\r\nexport function getCouponInfo(couponCode: string) {\r\n return axios.get(`${ENVIRONMENT_URL}/ecommapi/content/couponinfo/${couponCode}`)\r\n}\r\n\r\n// verify user is logged in correctly\r\nexport interface ValidateUserResponse {\r\n Success?: boolean\r\n Code: BUY_USER_TYPES_RESPONSE | null\r\n Message: string | null\r\n User: {\r\n DisplayName: string\r\n UserName: string\r\n UserKey: string\r\n Name: {\r\n GivenName: string\r\n FamilyName: string\r\n }\r\n }\r\n AccountKey: string\r\n isBanned: boolean\r\n hasGroupSubscription: boolean\r\n}\r\nexport function verifyUser(token: string, productGroup: string) {\r\n const data = {\r\n token,\r\n productGroup,\r\n }\r\n return axios.post('/ecommapi/identity/ValidateUser', data)\r\n}\r\n\r\nexport function getBillingSubscriptions() {\r\n return axios.get('/ecommapi/purchase/BillingDetailedSubscriptions', {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\nexport function getBillingInfo() {\r\n return axios.get('/ecommapi/purchase/BillingInfo', {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// get existing payment info\r\nexport function getExistingPaymentDetails() {\r\n return axios.post('/ecommapi/purchase/GetStoredPaymentMethods', {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// clear user session\r\nexport function clearUserSession(): Promise {\r\n return axios.post('/ecommapi/identity/ClearSession/')\r\n}\r\n\r\nexport interface EmailVerificationType {\r\n accessToken: string | undefined\r\n emailCode?: string\r\n emailToken?: string\r\n}\r\n\r\n// update user email verification status\r\nexport function updateUser(payload: EmailVerificationType) {\r\n return axios.post('/ecommapi/identity/updateuser', payload)\r\n}\r\n\r\n// check if user already has an account\r\nexport function canUserAuthenticate(data: EmailType): Promise {\r\n return axios.post(`${process.env.AUTH_CLIENT_URL}/canUserAuthenticate`, data)\r\n}\r\n\r\n// API Reference\r\n// https://confluence.ops.expertcity.com/spaces/SOA/pages/65145556/SCIM+Identity+Service#SCIMIdentityService-UserSchema\r\nexport interface GetIdentityUserMeResponseData {\r\n 'urn:scim:schemas:extension:getgo:1.0': {\r\n accounts: IdentityUser[]\r\n }\r\n}\r\nexport interface IdentityUser {\r\n value: string // This contains the AccountKey\r\n}\r\nexport function getIdentityUserMe(userToken: string) {\r\n // API Reference https://confluence.ops.expertcity.com/spaces/SOA/pages/65145556/SCIM+Identity+Service#SCIMIdentityService-UserSchema\r\n return axios.get(`${process.env.AUTH_CLIENT_URL}/identity/v1/Users/me`, {\r\n headers: {\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n })\r\n}\r\n\r\nexport interface FeatureFlagsResponseData {\r\n flags: string[]\r\n}\r\nconst getFeatureFlags = memoize((siteType: SC_SITE): Promise => {\r\n return axios.get('/ecommapi/content/featureflags', {\r\n params: { sc_site: siteType },\r\n })\r\n})\r\n\r\nexport function validateReCAPTCHA(token: string) {\r\n return axios.post('/ecommapi/recaptcha/index', { token })\r\n}\r\n\r\nexport default {\r\n getLocationInfo,\r\n clearUserSession,\r\n getCountries,\r\n getFlexTokenCall,\r\n canUserAuthenticate,\r\n getValidAddress,\r\n getFeatureFlags,\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum CheckoutActionTypes {\r\n SET_CHECKOUT_INLINE_ERROR = '[checkout-actions] set-inline-error',\r\n REMOVE_CHECKOUT_INLINE_ERROR = '[checkout-actions] remove-inline-error',\r\n}\r\n\r\nexport const checkoutActions = {\r\n setCheckoutFormInlineError: (error: string) =>\r\n createAction(CheckoutActionTypes.SET_CHECKOUT_INLINE_ERROR, { error }),\r\n removeCheckoutFormInlineError: (error: string) =>\r\n createAction(CheckoutActionTypes.REMOVE_CHECKOUT_INLINE_ERROR, { error }),\r\n}\r\n\r\nexport type CheckoutActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum ContentActionTypes {\r\n SET_LANGUAGE = '[common-content-actions] set-language',\r\n}\r\n\r\nexport const contentActions = {\r\n setLanguage: (language: string) => createAction(ContentActionTypes.SET_LANGUAGE, { language }),\r\n}\r\n\r\nexport type ContentActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { FatalErrorMessageType } from './state'\r\n\r\nexport enum FatalErrorActionTypes {\r\n SET_FATAL_ERROR = '[fatal-errors] set-fatal-error',\r\n}\r\n\r\nexport const fatalErrorActions = {\r\n setFatalError: (hasError: boolean, message?: FatalErrorMessageType, blocker?: boolean) =>\r\n createAction(FatalErrorActionTypes.SET_FATAL_ERROR, {\r\n hasError,\r\n message,\r\n blocker,\r\n }),\r\n}\r\n\r\nexport type FatalErrorActions = ActionUnion\r\n","export interface FatalErrorState {\r\n isFatalError: boolean\r\n fatalErrorMessage?: string\r\n fatalErrorBlocker: boolean\r\n fatalErrorType?: FATAL_ERROR_TYPE\r\n}\r\n\r\nexport interface FatalErrorMessageType {\r\n fatalErrorMessage?: string\r\n trackErrorMessage?: string\r\n fatalErrorType?: FATAL_ERROR_TYPE\r\n}\r\n\r\nexport enum FATAL_ERROR_TYPE {\r\n CARDINAL_SETUP = 'cardinal-setup',\r\n CARDINAL_CHALLENGE = 'cardinal-challenge',\r\n CARDINAL_PAYMENT = 'cardinal-payment',\r\n}\r\n","import { FlexTokenDataType } from '@common/services'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\nimport { Token, KeyInfo } from './state'\r\n\r\nexport enum FlexActionTypes {\r\n SET_KEY_INFO = '[flexform-actions] set-key-info',\r\n SET_CARD_VALID = '[flexform-actions] set-card-valid',\r\n SET_CVV_VALID = '[flexform-actions] set-cvv-valid',\r\n GET_FLEX_TOKEN = '[flexform-actions] get-flex-token',\r\n SET_USER_INTERACTED_WITH_FIELD = '[flexform-actions] set-user-interacted-with-field',\r\n SET_USER_INTERACTED_WITH_FIELD_CVV = '[flexform-actions] set-user-interacted-with-field-cvv',\r\n SET_ERROR = '[flexform-actions] set-error',\r\n SET_TOKEN = '[flexform-actions] set-token',\r\n CREATE_TOKEN = '[flexform-actions] create-token',\r\n SET_FINGERPRINT = '[flexform-actions] set-fingerprint',\r\n CREATE_MICROFORM = '[flexform-actions] create-microform',\r\n SET_MICROFORM_CREATED = '[flexform-actions] set-microform-created',\r\n RESET_FLEX_STATE = '[flexform-actions] reset-flex-state',\r\n CLEAR_FLEX_MICROFORM_INSTANCE = '[flexform-actions] clear-flex-microform-instance',\r\n SET_CHALLENGE_COMPLETE_JWT = '[flexform-actions] set-challenge-complete-jwt',\r\n SET_CARDINAL_SETUP_COMPLETE = '[flexform-actions] set-cardinal-setup-complete',\r\n}\r\n\r\nexport const flexActions = {\r\n setKeyInfo: (key: KeyInfo) => createAction(FlexActionTypes.SET_KEY_INFO, { key }),\r\n setFingerPrint: (fingerprint: string) => createAction(FlexActionTypes.SET_FINGERPRINT, { fingerprint }),\r\n setCardValid: (valid: boolean) => createAction(FlexActionTypes.SET_CARD_VALID, { valid }),\r\n setCvvValid: (valid: boolean) => createAction(FlexActionTypes.SET_CVV_VALID, { valid }),\r\n setUserInteractedWithFlexField: (interacted: boolean) =>\r\n createAction(FlexActionTypes.SET_USER_INTERACTED_WITH_FIELD, {\r\n interacted,\r\n }),\r\n setUserInteractedWithFlexFieldCvv: (interacted: boolean) =>\r\n createAction(FlexActionTypes.SET_USER_INTERACTED_WITH_FIELD_CVV, {\r\n interacted,\r\n }),\r\n setError: (error: string) => createAction(FlexActionTypes.SET_ERROR, { error }),\r\n getFlexToken: (data: FlexTokenDataType, iterator: number) =>\r\n createAction(FlexActionTypes.GET_FLEX_TOKEN, { data, iterator }),\r\n createToken: (date: string) => createAction(FlexActionTypes.CREATE_TOKEN, { date }),\r\n setToken: (token: Token) => createAction(FlexActionTypes.SET_TOKEN, { token }),\r\n createFlexMicroform: (keyInfo: KeyInfo) =>\r\n createAction(FlexActionTypes.CREATE_MICROFORM, {\r\n keyInfo,\r\n }),\r\n setMicroformCreated: (isCreated?: boolean) => createAction(FlexActionTypes.SET_MICROFORM_CREATED, { isCreated }),\r\n resetFlexState: () => createAction(FlexActionTypes.RESET_FLEX_STATE),\r\n clearFlexMicroformInstance: () => createAction(FlexActionTypes.CLEAR_FLEX_MICROFORM_INSTANCE),\r\n setChallengeCompleteJwt: (jwt: string) => createAction(FlexActionTypes.SET_CHALLENGE_COMPLETE_JWT, { jwt }),\r\n setCardinalSetupComplete: () => createAction(FlexActionTypes.SET_CARDINAL_SETUP_COMPLETE),\r\n}\r\n\r\nexport type FlexActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Country, State, Address, LocationInfoState, LocationFormData, AddressError } from './state'\r\n\r\nexport enum LocationActionTypes {\r\n SET_COUNTRIES = '[location-actions] set-countries',\r\n SET_FETCHED_COUNTRIES = '[location-actions] set-fetched-countries',\r\n SET_STATES = '[location-actions] set-states',\r\n SET_COUNTRY_HAS_STATES = '[location-actions] set-country-has-states',\r\n GET_COUNTRIES = '[location-actions] get-countries',\r\n VALIDATE_ADDRESS = '[location-actions] validate-address',\r\n SET_VALID_ADDRESS = '[location-actions] set-valid-address',\r\n SET_IS_VALIDADING_ADDRESS = '[location-actions] set-is-validating-address',\r\n SET_CORRECTED_ADDRESS = '[location-actions] set-corrected-address',\r\n SET_ADDRESS_ERRORS = '[location-actions] set-address-errors',\r\n GET_LOCATION_INFO = '[location-info] get-location-info',\r\n SET_LOCATION_INFO = '[location-info] set-location-info',\r\n SET_IS_LOCATION_INFO_LOADED = '[location-info] set-is-location-info-loaded',\r\n SET_IS_USER_COUNTRY_ALLOWED = '[location-info] set-is-user-country-allowed',\r\n GET_IS_USER_COUNTRY_ALLOWED = '[location-info] get-is-user-country-allowed',\r\n}\r\n\r\nexport const locationActions = {\r\n setCountries: (countries: Country[]) =>\r\n createAction(LocationActionTypes.SET_COUNTRIES, {\r\n countries,\r\n }),\r\n setFetchedCountries: (isCountriesLoaded: boolean) =>\r\n createAction(LocationActionTypes.SET_FETCHED_COUNTRIES, {\r\n isCountriesLoaded,\r\n }),\r\n setStates: (states: State[]) =>\r\n createAction(LocationActionTypes.SET_STATES, {\r\n states,\r\n }),\r\n setCountryHasStates: (countryHasStates: boolean) =>\r\n createAction(LocationActionTypes.SET_COUNTRY_HAS_STATES, {\r\n countryHasStates,\r\n }),\r\n getCountries: (productFamily: string) => createAction(LocationActionTypes.GET_COUNTRIES, { productFamily }),\r\n validateAddress: (values: LocationFormData) =>\r\n createAction(LocationActionTypes.VALIDATE_ADDRESS, {\r\n values,\r\n }),\r\n setValidAddress: (isValid: boolean) =>\r\n createAction(LocationActionTypes.SET_VALID_ADDRESS, {\r\n isValid,\r\n }),\r\n setIsValidatingAddress: (isValidatingAddress: boolean) =>\r\n createAction(LocationActionTypes.SET_IS_VALIDADING_ADDRESS, {\r\n isValidatingAddress,\r\n }),\r\n setCorrectedAddress: (address: Address) =>\r\n createAction(LocationActionTypes.SET_CORRECTED_ADDRESS, {\r\n address,\r\n }),\r\n setAddressErrors: (addressErrors: AddressError[]) =>\r\n createAction(LocationActionTypes.SET_ADDRESS_ERRORS, {\r\n addressErrors,\r\n }),\r\n getLocationInfo: (isExternal = false) =>\r\n createAction(LocationActionTypes.GET_LOCATION_INFO, {\r\n isExternal,\r\n }),\r\n setLocationInfo: (locationInfo: LocationInfoState) =>\r\n createAction(LocationActionTypes.SET_LOCATION_INFO, {\r\n locationInfo,\r\n }),\r\n setIsLocationInfoLoaded: (isLocationInfoLoaded: boolean) =>\r\n createAction(LocationActionTypes.SET_IS_LOCATION_INFO_LOADED, {\r\n isLocationInfoLoaded,\r\n }),\r\n setIsUserCountryAllowed: (isUserCountryAllowed: boolean, component?: string) =>\r\n createAction(LocationActionTypes.SET_IS_USER_COUNTRY_ALLOWED, { isUserCountryAllowed }, { component }),\r\n getIsUserCountryAllowed: () => createAction(LocationActionTypes.GET_IS_USER_COUNTRY_ALLOWED),\r\n}\r\n\r\nexport type LocationActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { MarketoUserInfo } from './state'\r\n\r\nexport enum MarketingActionsTypes {\r\n SET_DISPLAY_OPTOUT = '[marketing] set-display_optout',\r\n SET_IS_USER_OPTOUT = '[marketing] set-is-user-optout',\r\n POST_MARKETO = '[marketing] post-to-marketo',\r\n POST_MARKETO_SESSION_DATA_TO_AWS = '[marketing] post-marketo-session-data-to-aws',\r\n}\r\n\r\nexport const marketingActions = {\r\n setDisplayOptOut: (displayOutOut: boolean) =>\r\n createAction(MarketingActionsTypes.SET_DISPLAY_OPTOUT, { displayOutOut }),\r\n setIsUserOptOut: (isUserOutOut: boolean) =>\r\n createAction(MarketingActionsTypes.SET_IS_USER_OPTOUT, { isUserOutOut }),\r\n postToMarketo: (marketoUserInfo: MarketoUserInfo, saveToLocalStorage = false) =>\r\n createAction(MarketingActionsTypes.POST_MARKETO, { marketoUserInfo, saveToLocalStorage }),\r\n postMarketoSessionDataToAWS: () => createAction(MarketingActionsTypes.POST_MARKETO_SESSION_DATA_TO_AWS),\r\n}\r\n\r\nexport type MarketingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum ModalActionTypes {\r\n SET_MODAL_OPEN = '[modal-actions] set-modal-open',\r\n SET_ERROR_MODAL = '[modal-actions] set-error-modal',\r\n}\r\n\r\nexport const modalActions = {\r\n setModalOpen: (isModalOpen?: boolean) =>\r\n createAction(ModalActionTypes.SET_MODAL_OPEN, {\r\n isModalOpen,\r\n }),\r\n setErrorModal: (errorMessage: string) =>\r\n createAction(ModalActionTypes.SET_ERROR_MODAL, {\r\n errorMessage,\r\n }),\r\n}\r\n\r\nexport type ModalActions = ActionUnion\r\n","import { BaseAppState } from '@common/store'\r\n\r\nexport const getFatalError = (state: BaseAppState) => state.common.fatalError\r\nexport const getModalState = (state: BaseAppState) => state.common.modal\r\nexport const getFlexState = (state: BaseAppState) => state.common.flex\r\nexport const getLocationState = (state: BaseAppState) => state.common.location\r\nexport const getMarketingState = (state: BaseAppState) => state.common.marketing\r\nexport const getAccountState = (state: BaseAppState) => state.common.account\r\nexport const getContentState = (state: BaseAppState) => state.common.content\r\nexport const getCheckoutState = (state: BaseAppState) => state.common.checkout\r\n","// AppInsights.js\r\nimport { ApplicationInsights, ICustomProperties, IEventTelemetry } from '@microsoft/applicationinsights-web'\r\nimport { ReactPlugin } from '@microsoft/applicationinsights-react-js'\r\nimport { createBrowserHistory } from 'history'\r\n\r\nlet appInsights: ApplicationInsights\r\n\r\nconst appInsightsTrackEvent = (e: IEventTelemetry, customProperties: ICustomProperties) => {\r\n appInsights.trackEvent(e, customProperties)\r\n}\r\n\r\nconst initializeApplicationInsights = () => {\r\n const browserHistory = createBrowserHistory()\r\n const reactPlugin = new ReactPlugin()\r\n\r\n appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: process.env.GTC_AZURE_INSIGHT_INSTRUMENTATION_KEY,\r\n extensions: [reactPlugin],\r\n extensionConfig: {\r\n [reactPlugin.identifier]: { history: browserHistory },\r\n },\r\n },\r\n })\r\n appInsights.loadAppInsights()\r\n\r\n // This script to mask the auth_token in the url before it gets sent to azure ai through the js sdk.\r\n appInsights.addTelemetryInitializer((envelope) => {\r\n const telemetryItem = Object.values(envelope).find((obj) => obj.uri) || {}\r\n\r\n if (telemetryItem.uri && telemetryItem.uri.includes('access_token')) {\r\n const newURL = telemetryItem.uri.replace(/access_token=.*/, 'access_token=[masked]')\r\n\r\n Object.keys(telemetryItem).forEach((key) => {\r\n if (typeof telemetryItem[key] === 'string' && telemetryItem[key].includes('access_token')) {\r\n telemetryItem[key] = telemetryItem[key].replace(telemetryItem.uri, newURL)\r\n }\r\n })\r\n }\r\n })\r\n appInsights.trackPageView()\r\n\r\n return reactPlugin\r\n}\r\nexport { initializeApplicationInsights, appInsightsTrackEvent }\r\n","import Auth, { Token } from '@getgo/auth-client'\r\nimport { authOptions, STORAGE_CONST } from '@common/constants'\r\nimport { getSessionState } from '@common/utils'\r\nimport { saveRouteAndQuery } from './save-route-query'\r\nimport { startSilentAuth } from './silent-auth'\r\n\r\nlet auth: Auth | undefined\r\nlet initPromise: Promise | undefined\r\n\r\nexport const authClass = () => {\r\n if (!auth) {\r\n auth = new Auth(authOptions)\r\n }\r\n return auth\r\n}\r\n\r\nexport const logout = (pathname: string, search: string) => {\r\n const storedLanguage = getSessionState(STORAGE_CONST.SAVED_LANGUAGE)\r\n const pathnameSplit = pathname.split('/')\r\n\r\n const pathToStore = pathnameSplit.includes(storedLanguage)\r\n ? `/${pathnameSplit.splice(pathnameSplit.indexOf(storedLanguage) + 1).join('/')}`\r\n : pathname\r\n\r\n // delete saved token\r\n localStorage.removeItem('state')\r\n localStorage.removeItem('code_verifier')\r\n localStorage.removeItem('userToken')\r\n // save user route before leaving to log out\r\n saveRouteAndQuery(pathToStore, search)\r\n authClass().logout()\r\n}\r\n\r\nexport const saveToken = (token: Token) => {\r\n const accessTokenString = JSON.stringify(token)\r\n localStorage.setItem('userToken', accessTokenString)\r\n}\r\n\r\nexport const getTokenFromLocalStorage = () => {\r\n try {\r\n return JSON.parse(localStorage.getItem('userToken') || '') as Token\r\n } catch (ex) {\r\n return null as Token | null\r\n }\r\n}\r\n\r\nexport const removeLocalStorageAuthItems = () => {\r\n window.localStorage.removeItem('state')\r\n window.localStorage.removeItem('code_verifier')\r\n window.localStorage.removeItem('userToken')\r\n window.localStorage.removeItem('code')\r\n}\r\n\r\nexport const login = (pathname: string, search: string, sso?: boolean, silentAuthTicket?: string) => {\r\n if (!auth) {\r\n throw new Error('Attempting login before auth init')\r\n }\r\n if (sso) {\r\n return auth.loginWithSSO()\r\n }\r\n\r\n const storedLanguage = getSessionState(STORAGE_CONST.SAVED_LANGUAGE)\r\n const pathnameSplit = pathname.split('/')\r\n\r\n const pathToStore = pathnameSplit.includes(storedLanguage)\r\n ? `/${pathnameSplit.splice(pathnameSplit.indexOf(storedLanguage) + 1).join('/')}`\r\n : pathname\r\n\r\n // save user route before leaving to log out\r\n saveRouteAndQuery(pathToStore, search)\r\n\r\n // If 'state' parmeter is not found in the URL (first pass through init()), then set the initial 'state' and 'code_verifier' values in auth.options, and also store them in local storage\r\n const { options } = auth as any\r\n options.state = auth.randomString(32)\r\n options.code_verifier = auth.randomString(64)\r\n options.minLoa = 2 // may specify optional Minimum Level of Assurance (default: 2, 3 - triggers MFA challenge)\r\n localStorage.setItem('state', options.state)\r\n localStorage.setItem('code_verifier', options.code_verifier)\r\n\r\n if (silentAuthTicket) {\r\n return new Promise((resolve) => {\r\n // If silentAuthTicket was passed in, then specify the onLoginRedirect callback so\r\n // we can manually render a hidden iframe instead of the the default behavior of redirecting\r\n options.onLoginRedirect = (url: string) => {\r\n // Pass the promise' resolve parameter into this utility function which\r\n // will resolve the promise once silent auth is finished\r\n startSilentAuth(resolve, url, silentAuthTicket)\r\n }\r\n\r\n auth!.loginWithPKCE()\r\n })\r\n }\r\n\r\n // no valid token, or 'state' value in URL, start the login process.\r\n return auth.loginWithPKCE()\r\n}\r\n\r\nexport const authInit = () => {\r\n if (initPromise) {\r\n return initPromise\r\n }\r\n // check for preexisting tokens\r\n const savedToken = localStorage.getItem('userToken')\r\n const parsedSavedToken = savedToken ? JSON.parse(savedToken) : ''\r\n const urlSearchParams = new URLSearchParams(window.location.search)\r\n const urlParams = (Object as any).fromEntries(urlSearchParams.entries())\r\n\r\n // this will check if saved token is valid or grab one from the hash if it exists\r\n // init() wrapped in promise because could return Promise || undefined. Bad design.\r\n initPromise = new Promise((resolve, reject) => {\r\n const token = authClass().init(parsedSavedToken)\r\n if (token instanceof Promise) {\r\n token.then(resolve, reject)\r\n } else {\r\n resolve(token)\r\n }\r\n }).then((token) => {\r\n // if no token exists, check for a 'state' parameter in the url hash, which is returned from the Authorization server with a 'code' parameter upon successful authorization in the redirect response .\r\n const stateFromLocation = urlParams.state\r\n const customizeUrl = window.location.pathname.replace(/(.*customize\\/?).*/i, '$1')\r\n const urlPlan = window.location.pathname.replace(customizeUrl, '')\r\n\r\n // /standard and /remote-support for new users\r\n // redirect logged in users to customize\r\n if (token && urlPlan.length) {\r\n window.location.href = customizeUrl\r\n }\r\n\r\n // if there is a token we're logged in\r\n // OR\r\n // if no token and no state we're not trying to log in\r\n if (token || (!token && !stateFromLocation)) {\r\n return Promise.resolve(token)\r\n }\r\n // #########\r\n // verify params following a PKCE login redirect\r\n // #########\r\n\r\n // If 'state' is found, compare it to the state from session storage.\r\n // throw an error if the 'state' parameter does not match the state in session storage\r\n if (localStorage.getItem('state') !== stateFromLocation) {\r\n console.log('Probable session hijacking attack!')\r\n throw new Error('Probable session hijacking attack!')\r\n }\r\n // get the 'code' parameter from the URL - throw an error if it is not found\r\n const authorizationCode = urlParams.code\r\n if (!authorizationCode) {\r\n console.log('Authorization failed')\r\n throw new Error('Authorization failed')\r\n }\r\n const initialCodeVerifier = localStorage.getItem('code_verifier')\r\n const config = {\r\n state: stateFromLocation,\r\n code: authorizationCode,\r\n code_verifier: initialCodeVerifier,\r\n } as any\r\n // make the call for a token to the Authorization server and store the returned token in session storage to be used for subsequent API requests.\r\n return authClass()\r\n .requestPKCEToken(config)\r\n .then(\r\n (newToken) => {\r\n authClass().storeTokenObject(newToken)\r\n saveToken(newToken)\r\n return Promise.resolve(newToken)\r\n },\r\n () => {\r\n console.log('Authorization failed.')\r\n throw new Error('Authorization failed.')\r\n }\r\n )\r\n .finally(() => {\r\n // remove any residual params from URL without refreshing page\r\n urlSearchParams.delete('code')\r\n urlSearchParams.delete('state')\r\n\r\n const searchParam = urlSearchParams.toString() ? `?${urlSearchParams.toString()}` : ''\r\n\r\n window.history.replaceState({}, document.title, window.location.href.replace(/\\?.*$/, searchParam))\r\n })\r\n })\r\n\r\n return initPromise\r\n}\r\n\r\nexport default {\r\n authInit,\r\n login,\r\n}\r\n","import Cookies from 'js-cookie'\r\nimport { COOKIE_NAMES } from '@common/constants'\r\n\r\nexport const getCountryFromCookie = () => Cookies.get(COOKIE_NAMES.GEO_IP)\r\n\r\nexport const setCountryInCookie = (country: string) => Cookies.set(COOKIE_NAMES.GEO_IP, country)\r\n","export const getInnerHTMLByClassName = (htmlDocument: Document, className: string, index: number) => {\r\n const elements = htmlDocument.getElementsByClassName(className)\r\n return elements.length ? elements[index].innerHTML : ''\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { GooglePlace } from '@common/state/addressAutoFill/state'\r\nimport { Address } from '@common/state/location/state'\r\nimport { getInnerHTMLByClassName } from './getInnerHTMLByClassName'\r\n\r\nexport const getAddressFromGooglePlace = (place: GooglePlace): Address => {\r\n const addressComponents = place.address_components || []\r\n const addAddress = place.adr_address || ''\r\n const htmlDocument = new DOMParser().parseFromString(addAddress, 'text/html')\r\n\r\n // Refer to: https://developers.google.com/maps/documentation/javascript/places-autocomplete#get-place-information\r\n // And: https://developers.google.com/maps/documentation/javascript/place-data-fields?hl=en_US\r\n const address: Address = {\r\n addressLine1: getInnerHTMLByClassName(htmlDocument, 'street-address', 0),\r\n city: getInnerHTMLByClassName(htmlDocument, 'locality', 0),\r\n state: getInnerHTMLByClassName(htmlDocument, 'region', 0),\r\n postalCode: getInnerHTMLByClassName(htmlDocument, 'postal-code', 0),\r\n country: addressComponents.find((c) => c.types.indexOf('country') > -1)?.short_name || '',\r\n phoneNumber: '',\r\n }\r\n\r\n return address\r\n}\r\n","import uniqid from 'uniqid'\r\n\r\nexport const getGUID = () => {\r\n const uid = uniqid(uniqid.process())\r\n return uid\r\n}\r\n","/* eslint-disable import/export */\r\nimport { ActionCreatorsMapObject } from 'redux'\r\n\r\nexport interface Action {\r\n type: T\r\n}\r\n\r\nexport interface ActionWithPayload extends Action {\r\n payload: P\r\n}\r\nexport interface ActionWithPayloadMeta extends ActionWithPayload {\r\n meta: M\r\n}\r\n\r\nexport function createAction(type: T): Action\r\nexport function createAction(type: T, payload: P): ActionWithPayload\r\nexport function createAction(type: T, payload: P, meta: M): ActionWithPayloadMeta\r\n\r\n/* export function createAction(type: T, payload?: P) {\r\n return payload === undefined ? { type } : { type, payload }\r\n} */\r\n\r\nexport function createAction(type: T, payload?: P, meta?: M) {\r\n if (payload === undefined && meta === undefined) {\r\n return { type }\r\n }\r\n if (payload === undefined) {\r\n return { type, meta }\r\n }\r\n if (meta === undefined) {\r\n return { type, payload }\r\n }\r\n return { type, payload, meta }\r\n}\r\n\r\nexport type ActionsObject = ActionCreatorsMapObject>\r\n\r\nexport type ActionUnion = ReturnType\r\n","export function formatDate(date: Date, type: string, locale: string) {\r\n const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'long', day: 'numeric' }\r\n let datestamp = date\r\n\r\n if (type !== 'UTC') {\r\n const year = Number(date.toString().substring(0, 4))\r\n\r\n const month = Number(date.toString().substring(5, 7))\r\n\r\n const day = Number(date.toString().substring(8, 10))\r\n\r\n datestamp = new Date(Date.UTC(year, month, day))\r\n }\r\n\r\n const formattedDate = new Intl.DateTimeFormat(locale, options).format(datestamp)\r\n\r\n return formattedDate\r\n}\r\n","import { PRODUCT_FAMILY_KEY, STORAGE_CONST, TRACKING_EVENTS, VIEW_PATH } from '@common/constants'\r\nimport { CTAClickData, FatalErrorData, TrackingState } from '@common/state/tracking/state'\r\n\r\nexport const trackEvent = (trackData: TrackingState, saveToSessionStorage = false) => {\r\n if (saveToSessionStorage) {\r\n window.sessionStorage.setItem(\r\n `${STORAGE_CONST.STORED_GA_EVENT_PREFIX}${trackData.event}`,\r\n JSON.stringify(trackData)\r\n )\r\n return\r\n }\r\n\r\n if (!window.dataLayer) {\r\n window.dataLayer = []\r\n }\r\n const { event, ...trackInfo } = trackData\r\n window.dataLayer.push({ event, ...trackInfo?.eventData })\r\n}\r\n\r\nexport const getFormName = (pathName: string) => {\r\n if (pathName) {\r\n if (pathName.includes(VIEW_PATH.PATH_CHECKOUT) || pathName.includes(VIEW_PATH.PATH_CUSTOMIZE)) {\r\n return 'buy-form'\r\n }\r\n }\r\n return undefined\r\n}\r\n\r\nexport const trackGenericEvent = (\r\n eventName: TRACKING_EVENTS,\r\n productKey: PRODUCT_FAMILY_KEY | string,\r\n pathName: string\r\n) => {\r\n const eventData = {\r\n page_type: pathName,\r\n platform_product: productKey,\r\n }\r\n trackEvent({ event: eventName, eventData })\r\n}\r\n\r\nexport const trackGenericFormEvent = (eventName: TRACKING_EVENTS, pathName: string) => {\r\n const eventData = {\r\n page_type: pathName,\r\n form_name: getFormName(pathName),\r\n }\r\n trackEvent({ event: eventName, eventData })\r\n}\r\n\r\nexport const trackCTAClick = (ctaClickData: CTAClickData) => {\r\n const eventData = {\r\n cta_name: ctaClickData.name,\r\n cta_url: ctaClickData.url,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.CLICK_CTA, eventData })\r\n}\r\n\r\nexport const trackFatalError = (errorData: FatalErrorData) => {\r\n const eventData = {\r\n error_message: errorData.message,\r\n path: errorData.path,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.FATAL_ERROR, eventData })\r\n}\r\n\r\nexport const trackAccountError = (message: string) => {\r\n const eventData = {\r\n error_account: {\r\n account_error_message: message,\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_ACCOUNT, eventData })\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\r\n/* eslint-disable @typescript-eslint/ban-types */\r\nimport { FunctionComponent, PropsWithChildren } from 'react'\r\nimport { connect } from 'react-redux'\r\nimport { ActionsObject } from './action-types'\r\n\r\nexport interface GoToComponentProps {\r\n /**\r\n * The data managed by redux.\r\n *\r\n * Typically, we use the same interface describing a slice of the redux store\r\n * but you may use any interface that can be derived from the redux data\r\n */\r\n state: TState\r\n\r\n /**\r\n * The action creators object which will be passed directly to the\r\n * react-redux connect function (https://react-redux.js.org/api/connect#object-shorthand-form)\r\n */\r\n actions: TActions\r\n\r\n /**\r\n * The presentationl properties of the connected react component\r\n */\r\n props: TProps\r\n}\r\n\r\nexport const connectRedux = (\r\n component: React.FunctionComponent>,\r\n selector: (state: TAppState) => TState,\r\n actions?: TActions\r\n): FunctionComponent =>\r\n connect(\r\n selector,\r\n actions,\r\n (stateProps, dispatchProps, ownProps: PropsWithChildren) => {\r\n const { children, ...otherOwnProps } = ownProps\r\n return {\r\n children,\r\n props: otherOwnProps,\r\n actions: dispatchProps,\r\n state: stateProps,\r\n }\r\n }\r\n // @ts-ignore\r\n )(component)\r\n","import { Microform, KeyInfo } from '@common/state/flex/state'\r\nimport { FlexConfig } from '../../../typings/window-globals'\r\n\r\nexport const createFlexMicroform = (keyInfo: KeyInfo): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const flex = new window.Flex(keyInfo.flexKey.keyId)\r\n try {\r\n const microformInstance = flex.microform({\r\n styles: {\r\n input: {\r\n 'font-size': '16px',\r\n 'font-family': 'ProximaNova, sans-serif',\r\n 'font-weight': '400',\r\n color: '#000',\r\n },\r\n ':focus': { color: '#000' },\r\n valid: { color: '#000' },\r\n invalid: { color: '#E60502' },\r\n },\r\n } as FlexConfig)\r\n resolve(microformInstance)\r\n } catch (_ex) {\r\n reject(new Error('error in creating microform instance'))\r\n }\r\n })\r\n}\r\n","import { Microform } from '@common/state/flex/state'\r\n\r\nlet microform: Microform | null = null\r\n\r\nexport const getFlexMicroform = () => {\r\n return microform\r\n}\r\n\r\nexport const setFlexMicroform = (microformInstance: Microform | null) => {\r\n microform = microformInstance\r\n}\r\n","import { MarketoLabelUserFields, MarketoUserInfo } from '@common/state/marketing/state'\r\n\r\nexport const makeMarketoObject = (values: MarketoLabelUserFields) => {\r\n const {\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n phone,\r\n planKey,\r\n marketoSalesBrief,\r\n marketoSalesforceCampaignId,\r\n marketoProductName,\r\n } = values\r\n\r\n const marketoObject: MarketoUserInfo = {\r\n userKey,\r\n accountKey,\r\n firstName,\r\n lastName,\r\n email,\r\n phone,\r\n planKey,\r\n salesBrief: marketoSalesBrief,\r\n campaignID: marketoSalesforceCampaignId,\r\n product: marketoProductName,\r\n }\r\n\r\n if (values.Street1) marketoObject.address = values.Street1\r\n if (values.City) marketoObject.city = values.City\r\n if (values.StateCode) marketoObject.state = values.StateCode\r\n if (values.ZipCode) marketoObject.zipcode = values.ZipCode\r\n if (values.ContactPhone) marketoObject.phone = values.ContactPhone\r\n // if (values.companySize) marketoObject.employees = values.companySize // TODO: Will be removed in a future change\r\n if (values.CompanyName) marketoObject.company = values.CompanyName\r\n\r\n return marketoObject\r\n}\r\n","export const addGTMIframe = (gtmProductCode: string) => {\r\n const noscript = document.createElement('noscript')\r\n noscript.innerHTML = `\r\n \r\n `\r\n document.body.prepend(noscript)\r\n return noscript\r\n}\r\n","import { throttle } from 'lodash-es'\r\nimport { MiddlewareAPI, Dispatch, Action } from 'redux'\r\n\r\nexport const createThrottleMiddleware = (throttlefns: ((store: MiddlewareAPI) => void)[]) => {\r\n const throttleMiddleware = (store: MiddlewareAPI) => (next: Dispatch) => (action: Action) => {\r\n const resultState = next(action)\r\n const throttledfn = throttle(() => {\r\n throttlefns.forEach((throttlefn) => {\r\n throttlefn(store)\r\n })\r\n }, 1000)\r\n throttledfn()\r\n return resultState\r\n }\r\n return throttleMiddleware\r\n}\r\n","import { PRODUCT_PATH } from '@common/constants'\r\n\r\nexport const isConnectApp = () => {\r\n return window.location.pathname.toLocaleLowerCase().includes(PRODUCT_PATH.CONNECT)\r\n}\r\n\r\nexport const isResolveApp = () => {\r\n return window.location.pathname.toLocaleLowerCase().includes(PRODUCT_PATH.RESOLVE)\r\n}\r\n\r\nexport const isLmiProApp = () => {\r\n return window.location.pathname.toLocaleLowerCase().includes(PRODUCT_PATH.LOGMEINPRO)\r\n}\r\n\r\nexport const isLmiCentralApp = () => {\r\n return window.location.pathname.toLocaleLowerCase().includes(PRODUCT_PATH.LOGMEINCENTRAL)\r\n}\r\n\r\nexport const isBuyApp = () => {\r\n return window.location.pathname.toLocaleLowerCase().includes(PRODUCT_PATH.BUY)\r\n}\r\n","import { ExistingBillingInfoType } from '@common/state/user/state'\r\n\r\nexport const processExistingBillingInfo = (data: ExistingBillingInfoType) => {\r\n const processedBillingData: ExistingBillingInfoType = {\r\n accountType: data.accountType || '',\r\n addressLine1: data.addressLine1 || '',\r\n addressLine2: data.addressLine2 || '',\r\n anniversaryDate: data.anniversaryDate || '',\r\n city: data.city || '',\r\n companyName: data.companyName || '',\r\n country: data.country || '',\r\n email: data.email || '',\r\n federalTaxType: data.federalTaxType || '',\r\n firstName: data.firstName || '',\r\n hasInAppSubscription: !!data.hasInAppSubscription,\r\n lastName: data.lastName || '',\r\n paymentAccountKey: data.paymentAccountKey || '',\r\n phoneNumber: data.phoneNumber || '',\r\n postalCode: data.postalCode || '',\r\n state: data.state || '',\r\n status: data.status || '',\r\n taxNumber: data.taxNumber || '',\r\n }\r\n return processedBillingData\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const setCheckoutInlineError = (\r\n fieldData: FieldProps,\r\n inlineErrors: { [key: string]: string } | Record,\r\n setCall: (val: string) => void,\r\n removeCall: (val: string) => void,\r\n ignoreInlineError?: boolean\r\n) => {\r\n const { field, meta } = fieldData\r\n if (ignoreInlineError) {\r\n if (inlineErrors && inlineErrors[field.name]) {\r\n removeCall(field.name)\r\n } else {\r\n return\r\n }\r\n }\r\n\r\n if (meta.error && ((inlineErrors && !inlineErrors[field.name]) || !inlineErrors)) {\r\n setCall(field.name)\r\n }\r\n\r\n if (!meta.error && inlineErrors && inlineErrors[field.name]) {\r\n removeCall(field.name)\r\n }\r\n}\r\n","export const trapFocus = (parentElem: string, setDefaultFocus?: boolean) => {\r\n const modal = document.querySelector(parentElem) // select the parent element by it's id\r\n\r\n if (!modal) return\r\n\r\n if (setDefaultFocus && modal) {\r\n modal.focus()\r\n }\r\n\r\n // add all the elements inside modal which you want to make focusable\r\n const focusableElements = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\r\n\r\n const firstFocusableElement = modal.querySelectorAll(focusableElements)[0] // get first element to be focused inside modal\r\n const focusableContent = modal.querySelectorAll(focusableElements)\r\n const lastFocusableElement = focusableContent[focusableContent.length - 1] // get last element to be focused inside modal\r\n\r\n document.addEventListener('keydown', (e) => {\r\n const isTabPressed = e.key === 'Tab' || e.keyCode === 9\r\n\r\n if (!isTabPressed) {\r\n return\r\n }\r\n\r\n if (e.shiftKey) {\r\n // if shift key pressed for shift + tab combination\r\n if (document.activeElement === firstFocusableElement) {\r\n lastFocusableElement.focus() // add focus for the last focusable element\r\n e.preventDefault()\r\n }\r\n } else if (document.activeElement === lastFocusableElement) {\r\n // if tab key is pressed\r\n // if focused has reached to last focusable element then focus first focusable element after pressing tab\r\n firstFocusableElement.focus() // add focus for the first focusable element\r\n e.preventDefault()\r\n }\r\n })\r\n}\r\n","import { CHECKOUTFORM_FIELDS } from '@buy/constants'\r\nimport { isEmpty, isNull } from 'lodash-es'\r\n\r\nexport const saveSessionState = (key: string, value: string | number | Record) => {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value))\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const getSessionState = (key: string) => {\r\n const sessionItem = sessionStorage.getItem(key)\r\n if (sessionItem) {\r\n return JSON.parse(sessionItem)\r\n }\r\n return ''\r\n}\r\n\r\nexport const setFormSessionValues = (formValues: Record) => {\r\n Object.keys(formValues).forEach((key) => {\r\n sessionStorage?.setItem(key, formValues[key] || '')\r\n })\r\n}\r\n\r\nexport const getFormSessionValue = (formKey: CHECKOUTFORM_FIELDS): string => {\r\n const sessionFormValue = sessionStorage?.getItem(formKey)\r\n return isNull(sessionFormValue) || isEmpty(sessionFormValue) ? '' : sessionFormValue\r\n}\r\n","export const formatConfirmationMessage = (\r\n messageTemplate: string | undefined | null,\r\n displayName: string | undefined | null,\r\n myAccountText: string | undefined | null,\r\n myAccountUrl: string | undefined | null\r\n) => {\r\n return (messageTemplate || '')\r\n .replace('{FullName}', displayName || '')\r\n .replace(\r\n '{MyAccount}',\r\n `${myAccountText || ''}`\r\n )\r\n}\r\n","const defaultExpression = '^[A-Za-z0-9- ]+$'\r\n\r\nconst regexExpressions: Record = {\r\n US: ['^\\\\d{5}$', '^\\\\d{5}-\\\\d{4}$', '^\\\\d{9}$'],\r\n CA: ['^[a-zA-Z]\\\\d[a-zA-Z]\\\\s?\\\\d[a-zA-Z]\\\\d$'],\r\n}\r\n\r\nexport const isValidPostalCode = (country = '', postalCode = '') => {\r\n const countryUpperCase = country.toUpperCase()\r\n const countryExpressions = regexExpressions[countryUpperCase] || [defaultExpression]\r\n\r\n for (let i = 0; i < countryExpressions.length; i += 1) {\r\n const regExp = new RegExp(countryExpressions[i])\r\n if (regExp.test(postalCode)) {\r\n return true\r\n }\r\n }\r\n\r\n return false\r\n}\r\n","import { isEmpty, nth } from 'lodash-es'\r\n\r\nexport interface UrlParams {\r\n pathname: string\r\n search: string\r\n}\r\nexport const updatePlanUrlParam = (planName: string, planNameSet: Set): UrlParams => {\r\n const { pathname, search } = window.location\r\n if (isEmpty(planName)) {\r\n return { pathname, search }\r\n }\r\n const currentLocationList = pathname.split('/')\r\n const possiblePlanNameIndex = currentLocationList.findIndex((cpath) => planNameSet.has(cpath.toLowerCase()))\r\n if (possiblePlanNameIndex > -1) {\r\n currentLocationList[possiblePlanNameIndex] = planName.toLowerCase()\r\n }\r\n const updatedPathname = currentLocationList.join('/')\r\n\r\n return { pathname: updatedPathname, search }\r\n}\r\n\r\nexport const getResolveSuccessUrl = (successUrl: string, autoLogin: string | undefined) => {\r\n // if successUrl doesn't include gotoresolve.com, no further processing is required\r\n const target = 'gotoresolve.com'\r\n if (!successUrl.includes(target)) {\r\n return successUrl\r\n }\r\n let resolveSuccessUrl = successUrl\r\n if (autoLogin) {\r\n resolveSuccessUrl = `${resolveSuccessUrl}${resolveSuccessUrl.includes('?') ? '&' : '?'}ticket=${autoLogin}`\r\n }\r\n\r\n return resolveSuccessUrl\r\n}\r\n\r\nexport const getLmiProSuccessUrl = (successUrl: string, autoLogin: string | undefined) => {\r\n let lmiproSuccessUrl = successUrl\r\n\r\n // TODO: WAE1-3569: Update redirect url as needed for LogMeIn Pro\r\n // See getResolveSuccessUrl() for example if needed\r\n\r\n if (autoLogin) {\r\n lmiproSuccessUrl = `${lmiproSuccessUrl}${lmiproSuccessUrl.includes('?') ? '&' : '?'}ticket=${autoLogin}`\r\n }\r\n\r\n return lmiproSuccessUrl\r\n}\r\n\r\nexport function getProductNameFromPath(pathName: string, isLegacyFlow?: boolean) {\r\n const pathParts = pathName.split('/')\r\n let productName = nth(pathParts, pathParts.length - 3)\r\n if (isLegacyFlow) productName = pathParts[0].length === 2 ? pathParts[1] : pathParts[0]\r\n return productName || ''\r\n}\r\n\r\nexport function getPlanNameFromPath(pathName: string) {\r\n const pathParts = pathName.split('/')\r\n const planName = nth(pathParts, pathParts.length - 2)\r\n return planName || ''\r\n}\r\n","import { CURRENCY_SYMBOLS, CURRENCY } from '@common/constants'\r\n\r\nexport const percentage = (price1: number, price2: number) => {\r\n return Math.floor(((price1 - price2) / price1) * 100)\r\n}\r\n\r\nexport const formatCurrency = (value: number, locale: string, currency: string, decimals?: boolean) => {\r\n const localValue = Number(value)\r\n const options = {\r\n style: 'currency',\r\n currency,\r\n minimumFractionDigits: decimals ? 2 : 0,\r\n maximumFractionDigits: decimals ? 2 : 0,\r\n }\r\n\r\n const countryCode = locale.substring(3)\r\n\r\n // EUR format should be X XXX XXX,XX €\r\n if (currency === CURRENCY.EUR) {\r\n // Need to get price format with country code with `en` to get Euro price format with Euro symbol at front\r\n let formatted = new Intl.NumberFormat(`en-${countryCode}`, options).format(localValue)\r\n\r\n // For few Euro currency countries, we get different formats. But we need to show the same format for all Euro currency countries\r\n // We remove all the `.` and `,` in the format and join with spaces. Following condidition flows adds the `,` appropriately\r\n formatted = formatted.split(/[.,]/).join(' ')\r\n\r\n // If we don't € at the end in the format, we need to make sure to add it\r\n if (formatted.slice(-1) !== CURRENCY_SYMBOLS[currency]) {\r\n // This case is to remove € from the starting position\r\n formatted =\r\n formatted.substring(1, formatted.length - 3) && decimals\r\n ? `${formatted.substring(0, formatted.length - 3)},${formatted.substring(\r\n formatted.length - 2,\r\n formatted.length\r\n )}`\r\n : formatted\r\n return `${formatted.substring(1, formatted.length)} ${CURRENCY_SYMBOLS[currency]}`\r\n }\r\n\r\n formatted =\r\n formatted.substring(0, formatted.length - 5) && decimals\r\n ? `${formatted.substring(0, formatted.length - 5)},${formatted.substring(\r\n formatted.length - 4,\r\n formatted.length\r\n )}`\r\n : formatted\r\n return formatted\r\n }\r\n\r\n const formatted = new Intl.NumberFormat(`en-${countryCode}`, {\r\n ...options,\r\n currencyDisplay: 'narrowSymbol',\r\n }).format(localValue)\r\n\r\n // AUD format should be AU$X,XXX,XXX.XX\r\n // CAD format should be C$XXX XXX.XX\r\n if (currency === CURRENCY.AUD || currency === CURRENCY.CAD || currency === CURRENCY.MXN) {\r\n return `${CURRENCY_SYMBOLS[currency]}${formatted.split('$')[1]}`\r\n }\r\n\r\n return formatted\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\n\r\nexport const saveRouteAndQuery = (pathname: string, search: string) => {\r\n localStorage.setItem(STORAGE_CONST.SAVED_ROUTE, pathname)\r\n localStorage.setItem(STORAGE_CONST.SAVED_QUERY, search)\r\n}\r\n","export const scrollToTop = (element?: HTMLElement | null) => {\r\n // If element isn't passed in, use window\r\n const theElement = (element || window) as HTMLElement | Window\r\n theElement.scroll({ top: 0, left: 0, behavior: 'smooth' })\r\n}\r\n","import { Token } from '@getgo/auth-client'\r\n\r\nexport enum SILENT_AUTH_EVENTS {\r\n FINISHED_SILENT_AUTH,\r\n}\r\n\r\ninterface FinishedSilentAuthMessagePayload {\r\n name: SILENT_AUTH_EVENTS\r\n data: {\r\n success: boolean\r\n token: Token\r\n }\r\n}\r\n\r\ninterface FinishedSilentAuthMessageEvent extends MessageEvent {\r\n data: FinishedSilentAuthMessagePayload\r\n}\r\n\r\n// This method is called in the parent frame\r\nexport const startSilentAuth = (resolve: (value: unknown) => void, url: string, silentAuthTicket: string) => {\r\n // First, set a session storage item to let the hidden iframe know we are using silent auth\r\n // (See where this is retreived at src/products/buy/saga/user/get-token.ts)\r\n window.sessionStorage.setItem('IsSilentAuth', 'true')\r\n\r\n // Then, add an event listener to wait for a message from the hidden iframe once it loads\r\n // (See where that message is sent below in endSilentAuth())\r\n window.addEventListener('message', (event: FinishedSilentAuthMessageEvent) => {\r\n if (event.origin === window.origin) {\r\n if (event.data.name === SILENT_AUTH_EVENTS.FINISHED_SILENT_AUTH && event.data.data.success === true) {\r\n const { token } = event.data.data\r\n window.sessionStorage.removeItem('IsSilentAuth')\r\n\r\n // The token gets sent back to /src/products/buy/saga/checkout-form/form-submission.ts\r\n // Search for \"authClass.login\" in that file\r\n resolve(token)\r\n }\r\n }\r\n })\r\n\r\n // Finally, create the hidden iframe\r\n // It will first load the auth site and then will be redirected back to\r\n // this frontend where the following file will pick up the\r\n // next step in the process: src/products/buy/saga/user/get-token.ts\r\n const iframeUrl = `${url}&ticket=${silentAuthTicket}`\r\n const iframe = document.createElement('iframe')\r\n iframe.src = iframeUrl\r\n iframe.width = '0'\r\n iframe.height = '0'\r\n iframe.style.display = 'none'\r\n document.body.appendChild(iframe)\r\n}\r\n\r\n// This method is called from the hidden iframe\r\nexport const endSilentAuthFromIFrame = (token: Token) => {\r\n const event: FinishedSilentAuthMessagePayload = {\r\n name: SILENT_AUTH_EVENTS.FINISHED_SILENT_AUTH,\r\n data: { success: true, token },\r\n }\r\n // Pass control back to the parent frame\r\n // See window.addEventListener in this same file\r\n window.top!.postMessage(event)\r\n}\r\n","export enum BUY_TRIAL_ERROR_CODES {\r\n INVALID_CODE = 'invalid.token.code',\r\n TOKEN_EXPIRED = 'token.expired',\r\n}\r\n\r\nexport enum BUY_TRIAL_ERROR_STATE {\r\n TIMEOUT = 'timeout',\r\n ALREADY_USER = 'already.user',\r\n EXPIRED_CODE = 'expired.code',\r\n WRONG_CODE = 'wrong.code',\r\n NO_PROVISIONING = 'failed.provisioning',\r\n USER_BANNED = 'banned',\r\n GENERIC_ERROR = 'generic.error',\r\n DECISION_MAKER_FAIL = 'decision.maker.fail',\r\n NO_ERROR = 'none',\r\n}\r\n\r\nexport enum BUY_TRIAL_ERROR_IDS {\r\n USER_BANNED = 'USER_BANNED',\r\n EXISTING_TRIAL = 'EXISTING_TRIAL',\r\n EXISTING_USER = 'EXISTING_USER',\r\n GENERIC_ERROR = 'GENERIC_ERROR',\r\n ADDRESS_ERROR = 'ADDRESS_ERROR',\r\n CARD_ERROR = 'CARD_ERROR',\r\n}\r\n\r\nexport enum RESOLVE_TRIAL_START_ERROR_CODES {\r\n EXPIRED_TRIAL = 'restart.trialsubscription',\r\n}\r\n","export enum FLEXIBLE_VOLUME_COMPONENT_TYPE {\r\n DROPDOWN = 'Dropdown',\r\n PLUSMINUS = 'PlusMinus',\r\n}\r\n","export enum LICENSECAP {\r\n MIN = 1,\r\n MAX = 20,\r\n}\r\n\r\nexport enum NUMBERSCAP {\r\n MIN = 0,\r\n MAX = 20,\r\n}\r\n","export enum BUY_USER_TYPES {\r\n NEW = 'NEW',\r\n TRIALER = 'TRIALER',\r\n ADDON = 'ADDON',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n BANNED = 'BANNED',\r\n EXPIRED = 'EXPIRED',\r\n IDENTITY_ONLY = 'IDENTITY_ONLY',\r\n}\r\n\r\nexport enum BUY_USER_TYPES_RESPONSE {\r\n USER_IDENTITY_NOT_FOUND = 'ValidateUserIdentityNotFound',\r\n USER_BOSS_NOT_FOUND = 'ValidateUserBossNotFound',\r\n}\r\n\r\nexport enum BUY_PARTIAL_NON_VALIDATION_USER_TYPES {\r\n TRIALER = 'TRIALER',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n EXPIRED = 'EXPIRED',\r\n}\r\n","export enum ADDONS {\r\n ADDITIONAL_NUMBERS = 'G2CPreDID',\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n MAX_AGENTS_ADDONS = 51,\r\n MAX_DEVICE_ADDONS = 1500,\r\n MAX_ENDPOINTS_ADDONS = 1025,\r\n ENDPOINTS_ADDONS_INTERVAL = 25,\r\n DEVICE_ADDONS_INTERVAL = 25,\r\n AGENT = 'Agent',\r\n ENDPOINT = 'Endpoint',\r\n ADDON_PRICE_REPLACE = 'ADDON_PRICE_REPLACE',\r\n}\r\n\r\nexport enum ADDON_SKUS {\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n BASIC_AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n BASIC_ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n STANDARD_AGENT_ADDON = 'GTRStandardAddAgentNamed',\r\n STANDARD_ENDPOINT_ADDON = 'GTRStandardAddEndpointNamed',\r\n}\r\n","export enum CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES {\r\n FIRSTNAME = 'FirstName',\r\n LASTNAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n COUNTRYCODE = 'CountryCode',\r\n STATECODE = 'StateCode',\r\n}\r\n","export enum CHECKOUTFORM_STEPS {\r\n CREATE_FLEX_TOKEN = 'createFlexToken',\r\n CREATE_USER_ACCOUNT = 'createUserAccount',\r\n SAVE_BILLING_INFO = 'saveBillingInfo',\r\n SAVE_PAYMENT_INFO = 'savePaymentInfo',\r\n CARDINAL_SEND_CHALLENGE = 'sendCardinalChallenge',\r\n GET_AVAILABLE_PAYMENT_METHODS = 'getAvailablepaymentMethods',\r\n SUBMIT_PAYMENT = 'submitPayment',\r\n CARDINAL_TRIGGER_BIN_PROCESS = 'triggerBinProcess',\r\n}\r\n","export enum BUY_TRACKING_COMPONENTS {\r\n CHECKOUT_PAGE = 'checkout-form',\r\n FORM_SUBMISSION_SAGA = 'form-submission-saga',\r\n BILLING_PAGE = 'billing',\r\n CUSTOMIZE_PAGE = 'customize',\r\n NEXT_STEPS_PAGE = 'next-steps',\r\n CONFIRMATION_PAGE = 'confirmation',\r\n FATAL_ERROR_PAGE = 'fatal-error',\r\n CALCULATE_PRICE_SAGA = 'calculate-price-saga',\r\n CREATE_USER_SAGA = 'create-user-saga',\r\n CREATE_BILLING_INFO_SAGA = 'create-billing-info-saga',\r\n CREATE_PAYMENT_SAGA = 'create-payment-saga',\r\n GET_AVAILABLE_PAYMENT_METHODS_SAGA = 'get-available-payment-methods-saga',\r\n SUBMIT_PAYMENT_SAGA = 'submit-payment-saga',\r\n EXISTING_USER_FORM_SUBMISSION_SAGA = 'existing-user-form-submission-saga',\r\n}\r\n","export enum CHECKOUTFORM_FIELDS {\r\n FIRST_NAME = 'FirstName',\r\n LAST_NAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n BILLING_FIRST_NAME = 'BillingFirstName',\r\n BILLING_LAST_NAME = 'BillingLastName',\r\n STREET1 = 'Street1',\r\n COUNTRY_CODE = 'CountryCode',\r\n CITY = 'City',\r\n STATE_CODE = 'StateCode',\r\n ZIP_CODE = 'ZipCode',\r\n CONTACT_PHONE = 'ContactPhone',\r\n EXPIRATION_DATE = 'ExpirationDate',\r\n TAX_ID = 'TaxNumber',\r\n COMPANY_NAME = 'CompanyName',\r\n}\r\n","export enum PRODUCT_PRICE_ITEM_TYPE {\r\n product = 'Product',\r\n fee = 'Fee',\r\n volumeDiscount = 'VolumeDiscount',\r\n amountOffAutoDiscount = 'AmountOffAutoDiscount',\r\n}\r\n","export enum BUY_TYPE {\r\n TRIAL_CONVERSION = 'trial conversion',\r\n ADDON = 'add-on',\r\n DIRECT_BUY = 'direct buy',\r\n}\r\n","import axios from 'axios'\r\nimport {\r\n BuyBillingInfoDataType,\r\n BuyPaymentDataType,\r\n BuySubmitDataType,\r\n BuyCalculatePriceDataType,\r\n BuySubmitWithCardAddDataType,\r\n} from '@buy/state/checkout/state'\r\nimport {\r\n BuyUserDataType,\r\n CreateAccountRequest,\r\n BuyAbandonedCartPayload,\r\n CreateAccountResponse,\r\n CreateCartRequest,\r\n CreateCartResponse,\r\n SetupTransactionRequest,\r\n SetupTransactionResponse,\r\n InvoiceHistoryResponse,\r\n ApplyPromoCodeRequest,\r\n PriceInfoPayload,\r\n} from '@buy/state/user/state'\r\nimport { getContentLanguage } from '@buy/utils/language-helpers'\r\nimport { PlanResponseData } from '@buy/state/plan-response.data'\r\n\r\nexport interface BuyPaymentMethodDataType {\r\n accessToken?: string\r\n billingAccountKey?: string\r\n}\r\n\r\nexport interface BuyCardHeadersType {\r\n AccessToken: string\r\n BillingAccountKey: string\r\n PaymentMethodKey: string\r\n}\r\n\r\nexport interface BuyLabelDataType {\r\n id: string\r\n plan: string\r\n promoCode: string\r\n accessToken: string\r\n timezone: string\r\n}\r\n\r\nexport interface apiQueryParamsType {\r\n /* eslint-disable camelcase */\r\n sc_site: string\r\n sc_lang?: string\r\n}\r\n\r\nexport const apiQueryParams = {\r\n // TODO: load based on product\r\n sc_lang: 'en',\r\n}\r\n\r\nexport const setLanguageParam = (queryParams: apiQueryParamsType) => {\r\n return {\r\n ...queryParams,\r\n sc_lang: getContentLanguage(),\r\n }\r\n}\r\n\r\n/* APP DATA */\r\n\r\n// get buy flow api data\r\nexport function getBuyPlanData(contentEndpoint: string, plan: string) {\r\n const params = {\r\n sc_lang: getContentLanguage(),\r\n plan,\r\n }\r\n return axios.get(`/ecommapi/content/purchase/${contentEndpoint}`, { params })\r\n}\r\n// get available payment methods\r\nexport function getAvailablePaymentMethods() {\r\n return axios.post('/ecommapi/purchase/GetAvailablePaymentMethods', null, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// create user account\r\nexport function createUserAccount(data: BuyUserDataType): Promise {\r\n return axios.post('/ecommapi/identity/CreateAccount/', data, {\r\n withCredentials: true,\r\n params: { ...apiQueryParams },\r\n })\r\n}\r\n\r\n// create user account UCS\r\nexport async function createUserAccountUcs(\r\n data: CreateAccountRequest,\r\n castleRequestToken: string,\r\n fingerPrintSessionId: string\r\n) {\r\n // https://confluence.ops.expertcity.com/display/COM/Create+Account\r\n const response = await axios.post(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/accounts`,\r\n data,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n castle_request_token: castleRequestToken,\r\n fingerPrintSessionId,\r\n },\r\n }\r\n )\r\n return response\r\n}\r\n\r\nexport function createCartV3(userToken: string, accountKey: string, data: CreateCartRequest) {\r\n // https://confluence.ops.expertcity.com/display/COM/PUT+Cart\r\n return axios.put(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v3/cart/${accountKey}`,\r\n data,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n }\r\n )\r\n}\r\n\r\nexport function createCart(userToken: string, accountKey: string, data: CreateCartRequest) {\r\n // https://confluence.ops.expertcity.com/display/COM/PUT+Cart\r\n return axios.put(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/cart/${accountKey}`,\r\n data,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n }\r\n )\r\n}\r\n\r\nexport function deleteCart(userToken: string, accountKey: string) {\r\n // https://confluence.ops.expertcity.com/spaces/COM/pages/318572738/DELETE+CART\r\n return axios.delete(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/cart/${accountKey}`,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n validateStatus: () => true,\r\n }\r\n )\r\n}\r\n\r\nexport function applyPromoCode(userToken: string, accountKey: string, data: ApplyPromoCodeRequest) {\r\n // https://confluence.ops.expertcity.com/spaces/COM/pages/371599795/POST+validate+Apply+PromoCode\r\n return axios.post(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/cart/${accountKey}/promocode`,\r\n data,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n }\r\n )\r\n}\r\n\r\nexport function setupTransaction(userToken: string, accountKey: string, data: SetupTransactionRequest) {\r\n // https://confluence.ops.expertcity.com/display/COM/Setup+Transactions+-+COPAS\r\n return axios.post(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/transaction/${accountKey}/setup`,\r\n data,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n }\r\n )\r\n}\r\n\r\nexport function getInvoiceHistory(userToken: string, accountKey: string) {\r\n // https://confluence.ops.expertcity.com/display/COM/Get+invoice+history\r\n return axios.get(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/billing/${accountKey}/invoices`,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n }\r\n )\r\n}\r\n\r\nexport function fetchInvoiceAsBlob(userToken: string, accountKey: string, invoiceId: string) {\r\n // https://confluence.ops.expertcity.com/display/COM/Download+invoice\r\n return axios.get(\r\n `${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/billing/${accountKey}/invoice/${invoiceId}`,\r\n {\r\n headers: {\r\n tenant: process.env.LOGGING_TENANT,\r\n Authorization: `Bearer ${userToken}`,\r\n },\r\n responseType: 'blob',\r\n }\r\n )\r\n}\r\n\r\n// create billing information\r\nexport function createBillingInfo(data: BuyBillingInfoDataType): Promise {\r\n return axios.post('/ecommapi/purchase/SetBillingInfo', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// calculate payment\r\nexport function calculatePrice(data: BuyCalculatePriceDataType): Promise {\r\n return axios.post('/ecommapi/purchase/CalculatePrice', data)\r\n}\r\n\r\n// create payment info\r\nexport function savePayment(data: BuyPaymentDataType) {\r\n return axios.post('/ecommapi/purchase/SavePaymentMethodV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment with card add\r\n// api reference: https://confluence.ops.expertcity.com/display/MMM/API+-+Public+-+Process+Purchase+With+Card+Add+V3\r\nexport function submitPaymentWithCardAdd(data: BuySubmitWithCardAddDataType): Promise {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseWithCardAddV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment\r\nexport function submitPayment(data: BuySubmitDataType | BuySubmitWithCardAddDataType) {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\nexport function validateTaxNumber(country: string, taxNumber: string, federalTaxType?: string) {\r\n return axios.get('/ecommapi/purchase/ValidateTaxNumber', {\r\n params: {\r\n country,\r\n taxNumber,\r\n federalTaxType,\r\n },\r\n })\r\n}\r\n\r\n// cart abandonment\r\nexport function submitAbandonedCart(data: BuyAbandonedCartPayload) {\r\n return axios.post(`${process.env.AWS_ABANDON_ENDPOINT}`, data)\r\n}\r\n\r\nexport function getPricingInfoData(castleRequestToken: string, data: PriceInfoPayload) {\r\n const headers = {\r\n castle_request_token: castleRequestToken,\r\n tenant: process.env.LOGGING_TENANT,\r\n }\r\n const params = {\r\n ...data,\r\n }\r\n return axios.get(`${process.env.UCS_SERVICE_ENDPOINT}/unifiedcommerceservice/rest/v2/priceInfo`, {\r\n headers,\r\n params,\r\n })\r\n}\r\n\r\nexport default {\r\n getBuyPlanData,\r\n calculatePrice,\r\n createUserAccount,\r\n createUserAccountUcs,\r\n createBillingInfo,\r\n submitPaymentWithCardAdd,\r\n getPricingInfoData,\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CHECKOUTFORM_STEPS } from '@buy/constants'\r\nimport { BuyFormData } from './state'\r\n\r\nexport enum BuyFormActionTypes {\r\n SUBMIT_BUY_FORM = '[buy-buy-form-actions] submit-exp',\r\n SUBMIT_BUY_FORM_UCS = '[buy-buy-form-actions] submit-exp-ucs',\r\n RESET_BUY_FORM_AFFECTED_STATES = '[buy-buy-form-actions] reset-affected-states',\r\n RESET_BUY_FORM = '[buy-buy-form-actions] reset-checkout-form',\r\n EXISTING_USER_SUBMIT_BUY_FORM = '[buy-buy-form-actions] existing-user-submit-exp',\r\n EXISTING_USER_SUBMIT_BUY_FORM_UCS = '[buy-buy-form-actions] existing-user-submit-exp-ucs',\r\n UPDATE_INITIAL_FORM_STATE = '[buy-buy-form-actions] update-initial-form-state',\r\n SET_CLEAR_EMAIL = '[buy-buy-form-actions] set-clear-email',\r\n UPDATE_STEPS = '[buy-buy-form-actions] update-steps',\r\n SET_STATES_OPTIONAL = '[buy-buy-form-actions] set-states-optional',\r\n}\r\n\r\nexport const buyFormActions = {\r\n submitForm: (values: BuyFormData) => createAction(BuyFormActionTypes.SUBMIT_BUY_FORM, { values }),\r\n submitFormUcs: (values: BuyFormData) => createAction(BuyFormActionTypes.SUBMIT_BUY_FORM_UCS, { values }),\r\n existingUserSubmitForm: (values: BuyFormData) =>\r\n createAction(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, { values }),\r\n existingUserSubmitFormUcs: (values: BuyFormData) =>\r\n createAction(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM_UCS, { values }),\r\n resetCheckoutFormAffectedStates: () => createAction(BuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES),\r\n updateInitialFormState: (data: BuyFormData) =>\r\n createAction(BuyFormActionTypes.UPDATE_INITIAL_FORM_STATE, {\r\n data,\r\n }),\r\n resetForm: () => createAction(BuyFormActionTypes.RESET_BUY_FORM),\r\n setClearEmail: (clear: boolean) => createAction(BuyFormActionTypes.SET_CLEAR_EMAIL, { clear }),\r\n updateSteps: (stepName: CHECKOUTFORM_STEPS, stepResult: boolean) =>\r\n createAction(BuyFormActionTypes.UPDATE_STEPS, {\r\n stepName,\r\n stepResult,\r\n }),\r\n setStatesOptional: (optional: boolean) => createAction(BuyFormActionTypes.SET_STATES_OPTIONAL, { optional }),\r\n}\r\n\r\nexport type BuyFormActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { BuySelectedAddon, BuyAddon } from '@buy/state/add-on'\r\nimport { BuyFormData } from '@buy/state/buy-form/state'\r\nimport { BuyProductPriceItem } from '@buy/state/calculate-price'\r\nimport { BillingTenureValue } from '@buy/components/BillingPeriodSwitch'\r\nimport {\r\n BuyBillingInfoDataType,\r\n BuyPaymentDataType,\r\n BuySubmitDataType,\r\n BuyBillingFrequencyVolumeDiscountRecords,\r\n BuySubmitWithCardAddDataType,\r\n} from './state'\r\nimport { InvoiceHistoryResponse } from '../user/state'\r\nimport { OrderSummaryLine } from '../order-summary/order-summary'\r\n\r\nexport enum BuyCheckoutActionTypes {\r\n SET_LOADING = '[buy-checkout-actions] set-loading',\r\n SET_PLAN_ID = '[buy-checkout-actions] set-plan-id',\r\n SET_BILLING_FREQUENCY = '[buy-checkout-actions] set-billing-frequency',\r\n CLEAR_ADDONS = '[buy-checkout-actions] clear-addons',\r\n SET_SELECTED_ADDONS = '[buy-checkout-actions] set-selected-addons',\r\n SET_ORGANIZERS = '[buy-checkout-actions] set-organizers',\r\n SET_EXISTING_USER_MODAL_OPEN = '[buy-checkout-actions] set-existing-user-modal',\r\n CREATE_BILLING_INFO = '[buy-checkout-actions] create-billing-info',\r\n CREATE_PAYMENT = '[buy-checkout-actions] create-payment',\r\n SUBMIT_PAYMENT = '[buy-checkout-actions] submit-payment',\r\n CREATE_AND_SUBMIT_PAYMENT = '[buy-checkout-actions] create-and-submit-payment',\r\n GET_AVAILABLE_PAYMENT_METHODS = '[buy-checkout-actions] get-available-payment-methods',\r\n CALCULATE_PRICE = '[buy-checkout-actions] calculate-price',\r\n SET_CALCULATED_PRICE = '[buy-checkout-actions] set-calculated-price',\r\n GET_SAVED_STATE = '[buy-checkout-actions] get-saved-state',\r\n SET_SAVED_STATE_LOADED = '[buy-checkout-actions] set-saved-state-loaded',\r\n RESET_CHECKOUT_STATE = '[buy-checkout-actions] reset-state',\r\n SET_EXISTING_ORGANIZERS = '[buy-checkout-actions] set-existing-organizers',\r\n SET_PURCHASE_COMPLETE = '[buy-checkout-actions] set-purchase-complete',\r\n SET_LOADING_TOTAL = '[buy-checkout-actions] set-loading-total',\r\n SET_ADDON_COMPLETE = '[buy-checkout-actions] set-addon-complete',\r\n SET_SELECTED_TIER_INDEX = '[buy-checkout-actions] set-selected-tier-index',\r\n CALCULATE_VOLUME_DISCOUNT = '[buy-checkout-actions] calculate-volume-discount',\r\n SET_VOLUME_DISCOUNT = '[buy-checkout-actions] set-volume-discount',\r\n SET_VOLUME_DISCOUNT_LOADING = '[buy-checkout-actions] set-volume-discount-loading',\r\n GET_VOLUME_DISCOUNT = '[buy-checkout-actions] get-volume-discount',\r\n SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE = '[buy-checkout-actions] set-current-volume-discount-price-and-percentage',\r\n ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON = '[buy-checkout-actions] adjust-current-volume-discount-for-reprice-coupon',\r\n SET_PRORATED_AMOUNT = '[buy-checkout-actions] set-prorated-amount',\r\n SET_EXTRA_ADDON = '[buy-checkout-actions] set-extra-addon',\r\n SET_ENDPOINTS = '[buy-checkout-actions] set-endpoints',\r\n SET_AGENTS = '[buy-checkout-actions] set-agents',\r\n SET_TAX_TYPE = '[buy-checkout-actions] set-tax-type',\r\n SET_AUTO_LOGIN = '[resolve-checkout-form-actions] set-auto-login',\r\n GET_LATEST_INVOICE = '[resolve-checkout-form-actions] get-latest-invoice',\r\n SET_INVOICE = '[resolve-checkout-form-actions] set-invoice',\r\n DOWNLOAD_INVOICE = '[resolve-checkout-form-actions] download-invoice',\r\n SET_DOWNLOADING_INVOICE = '[resolve-checkout-form-actions] set-downloading-invoice',\r\n SET_BASE_LINE = '[buy-checkout-actions] set-base-line',\r\n SET_ADDITIONAL_LINES = '[buy-checkout-actions] set-additional-lines',\r\n SET_ADDON_LINES = '[buy-checkout-actions] set-addon-lines',\r\n SET_TOTAL_DISCOUNT = '[buy-checkout-actions] set-total-discount',\r\n SET_TOTAL_VOLUME_DISCOUNT = '[buy-checkout-actions] set-total-volume-discount',\r\n SET_BILLING_TENURE = '[buy-checkout-actions] set-billing-tenure',\r\n SET_FINAL_TOTAL = '[buy-checkout-actions] set-final-total',\r\n}\r\n\r\nexport const buyCheckoutActions = {\r\n setLoading: (loading: boolean) => createAction(BuyCheckoutActionTypes.SET_LOADING, { loading }),\r\n getLatestInvoice: () => createAction(BuyCheckoutActionTypes.GET_LATEST_INVOICE),\r\n setInvoice: (invoice: InvoiceHistoryResponse) => createAction(BuyCheckoutActionTypes.SET_INVOICE, { invoice }),\r\n downloadInvoice: () => createAction(BuyCheckoutActionTypes.DOWNLOAD_INVOICE),\r\n setDownloadingInvoice: (downloadingInvoice: boolean) =>\r\n createAction(BuyCheckoutActionTypes.SET_DOWNLOADING_INVOICE, { downloadingInvoice }),\r\n setPurchaseComplete: (complete: boolean) =>\r\n createAction(BuyCheckoutActionTypes.SET_PURCHASE_COMPLETE, { complete }),\r\n setBillingFrequency: (frequency: TimePeriod) =>\r\n createAction(BuyCheckoutActionTypes.SET_BILLING_FREQUENCY, { frequency }),\r\n clearAddons: () => createAction(BuyCheckoutActionTypes.CLEAR_ADDONS),\r\n setSelectedAddons: (addons: BuySelectedAddon[]) =>\r\n createAction(BuyCheckoutActionTypes.SET_SELECTED_ADDONS, { addons }),\r\n setOrganizers: (organizers: number) => createAction(BuyCheckoutActionTypes.SET_ORGANIZERS, { organizers }),\r\n createBillingInfo: (billingValues: BuyBillingInfoDataType) =>\r\n createAction(BuyCheckoutActionTypes.CREATE_BILLING_INFO, {\r\n billingValues,\r\n }),\r\n createPayment: (paymentValues: BuyPaymentDataType) =>\r\n createAction(BuyCheckoutActionTypes.CREATE_PAYMENT, {\r\n paymentValues,\r\n }),\r\n submitPayment: (submitValues: BuySubmitDataType | BuySubmitWithCardAddDataType) =>\r\n createAction(BuyCheckoutActionTypes.SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n createAndSubmitPayment: (submitValues: BuySubmitWithCardAddDataType) =>\r\n createAction(BuyCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n getPaymentMethods: () => createAction(BuyCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS),\r\n calculatePrice: (values: BuyFormData, component?: string, planSKU?: string) =>\r\n createAction(\r\n BuyCheckoutActionTypes.CALCULATE_PRICE,\r\n {\r\n values,\r\n planSKU,\r\n },\r\n { component }\r\n ),\r\n setCalculatedPrice: (\r\n productPrices: BuyProductPriceItem[],\r\n net: number,\r\n total: number,\r\n tax: number,\r\n creditback: number,\r\n anniversaryDate: string\r\n ) =>\r\n createAction(BuyCheckoutActionTypes.SET_CALCULATED_PRICE, {\r\n productPrices,\r\n net,\r\n total,\r\n tax,\r\n creditback,\r\n anniversaryDate,\r\n }),\r\n getSavedState: (urlPlan: string) =>\r\n createAction(BuyCheckoutActionTypes.GET_SAVED_STATE, {\r\n urlPlan,\r\n }),\r\n setSavedStateLoaded: (savedStateLoaded: boolean, component: string) =>\r\n createAction(\r\n BuyCheckoutActionTypes.SET_SAVED_STATE_LOADED,\r\n {\r\n savedStateLoaded,\r\n },\r\n { component }\r\n ),\r\n setTotalLoading: (loading: boolean) =>\r\n createAction(BuyCheckoutActionTypes.SET_LOADING_TOTAL, {\r\n loading,\r\n }),\r\n setAddonComplete: (addonComplete: boolean) =>\r\n createAction(BuyCheckoutActionTypes.SET_ADDON_COMPLETE, {\r\n addonComplete,\r\n }),\r\n resetCheckoutState: () => createAction(BuyCheckoutActionTypes.RESET_CHECKOUT_STATE),\r\n setSelectedTierIndex: (selectedTierIndex: number, organizers: number) =>\r\n createAction(BuyCheckoutActionTypes.SET_SELECTED_TIER_INDEX, { selectedTierIndex, organizers }),\r\n calculateVolumeDiscount: () => createAction(BuyCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT),\r\n setVolumeDiscount: (\r\n selectedPlanSku: string,\r\n currency: CURRENCY,\r\n volumeDiscountForSelectedPlanAndCurrency: BuyBillingFrequencyVolumeDiscountRecords\r\n ) =>\r\n createAction(BuyCheckoutActionTypes.SET_VOLUME_DISCOUNT, {\r\n selectedPlanSku,\r\n currency,\r\n volumeDiscountForSelectedPlanAndCurrency,\r\n }),\r\n setVolumeDiscountLoading: (volumeDiscountLoading: boolean) =>\r\n createAction(BuyCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING, { volumeDiscountLoading }),\r\n getVolumeDiscount: (organizers: number, selectedTierIndex: number, billingFrequency: TimePeriod) =>\r\n createAction(BuyCheckoutActionTypes.GET_VOLUME_DISCOUNT, {\r\n organizers,\r\n selectedTierIndex,\r\n billingFrequency,\r\n }),\r\n setCurrentVolumeDiscountPriceAndPercentage: (currentVolumeDiscountPrice: number) =>\r\n createAction(BuyCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE, {\r\n currentVolumeDiscountPrice,\r\n }),\r\n setProratedAmount: (proratedAmount: number) =>\r\n createAction(BuyCheckoutActionTypes.SET_PRORATED_AMOUNT, { proratedAmount }),\r\n adjustCurrentVolumeDiscountForRepriceCoupon: () =>\r\n createAction(BuyCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON),\r\n setExtraAddons: (addons: BuyAddon[]) => createAction(BuyCheckoutActionTypes.SET_EXTRA_ADDON, { addons }),\r\n setEndpoints: (endpoints: number) => createAction(BuyCheckoutActionTypes.SET_ENDPOINTS, { endpoints }),\r\n setAgents: (agents: number) => createAction(BuyCheckoutActionTypes.SET_AGENTS, { agents }),\r\n setTaxType: (type: string) => createAction(BuyCheckoutActionTypes.SET_TAX_TYPE, { type }),\r\n setAutoLogin: (autoLogin?: string) =>\r\n createAction(BuyCheckoutActionTypes.SET_AUTO_LOGIN, {\r\n autoLogin,\r\n }),\r\n setBaseLine: (baseLine: OrderSummaryLine) => createAction(BuyCheckoutActionTypes.SET_BASE_LINE, { baseLine }),\r\n setAdditionalLines: (additionalLines: Array) =>\r\n createAction(BuyCheckoutActionTypes.SET_ADDITIONAL_LINES, { additionalLines }),\r\n setAddonLines: (addonLines: Array) =>\r\n createAction(BuyCheckoutActionTypes.SET_ADDON_LINES, { addonLines }),\r\n setTotalDiscount: (totalDiscount: number) =>\r\n createAction(BuyCheckoutActionTypes.SET_TOTAL_DISCOUNT, { totalDiscount }),\r\n setTotalVolumeDiscount: (totalVolumeDiscount: number) =>\r\n createAction(BuyCheckoutActionTypes.SET_TOTAL_VOLUME_DISCOUNT, { totalVolumeDiscount }),\r\n setBillingTenure: (tenure: BillingTenureValue) =>\r\n createAction(BuyCheckoutActionTypes.SET_BILLING_TENURE, { tenure }),\r\n setFinalTotal: (finalTotal: number) => createAction(BuyCheckoutActionTypes.SET_FINAL_TOTAL, { finalTotal }),\r\n}\r\n\r\nexport type BuyCheckoutActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CouponServerData } from '@common/state/coupon/state'\r\nimport { ValidCoupon } from '@buy/utils'\r\nimport {\r\n BuyCalculateCouponPriceActionPayload,\r\n BuyCheckVolumeDiscountAgainstRepriceCouponActionPayload,\r\n BuyValidateCouponActionPayload,\r\n} from '../coupon-util'\r\nimport { BuyCouponProcessedDataPerSku } from './state'\r\n\r\nexport enum BuyCouponActionTypes {\r\n SET_APPLY_COUPON_ATTEMPT_MADE = '[buy-coupon-actions] check-apply-coupon-attempt-made',\r\n GET_COUPON_DETAILS = '[buy-coupon-actions] get-coupon-details',\r\n CALCULATE_COUPON_PRICE = '[buy-coupon-actions] calculate-coupon-price',\r\n VALIDATE_COUPON = '[buy-coupon-actions] validate-coupon',\r\n SET_COUPON_PROCESSED_DATA = '[buy-coupon-actions] set-coupon-processed-data',\r\n SET_COUPON_SERVER_DATA = '[buy-coupon-actions] set-coupon-server-data',\r\n CHECK_CMS_COUPON = '[buy-coupon-actions] check-cms-coupon',\r\n RESET_COUPON_DATA = '[buy-coupon-actions] reset-coupon-data',\r\n SET_COUPON_VALID_AND_APPLIED = '[buy-coupon-actions] set-coupon-valid-and-applied',\r\n SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER = '[buy-coupon-actions] set-coupon-double-dip-amount-for-new-user',\r\n SET_URL_COUPON_ACTIVE = '[buy-coupon-actions] set-url-coupon-active',\r\n OBSERVE_VALIDATE_CMS_COUPON = '[buy-coupon-actions] observe-validate-cms-coupon',\r\n CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON = '[buy-coupon-actions] check-volume-discount-against-reprice-coupon',\r\n ATTEMPT_FOR_CMS_COUPON = '[buy-coupon-actions] attempt-for-cms-coupon',\r\n SET_URL_COUPON_CODE = '[buy-coupon-actions] set-url-coupon-code',\r\n SET_VALID_COUPON = '[buy-coupon-actions] set-valid-coupon',\r\n}\r\n\r\nexport const buyCouponActions = {\r\n getCouponDetails: (couponCode: string) => createAction(BuyCouponActionTypes.GET_COUPON_DETAILS, { couponCode }),\r\n validateCoupon: (couponValidationData: BuyValidateCouponActionPayload, isAttemptingUrlCoupon: boolean) =>\r\n createAction(BuyCouponActionTypes.VALIDATE_COUPON, { couponValidationData, isAttemptingUrlCoupon }),\r\n calculateCouponPrice: (couponCalculationData: BuyCalculateCouponPriceActionPayload) =>\r\n createAction(BuyCouponActionTypes.CALCULATE_COUPON_PRICE, { couponCalculationData }),\r\n setCouponProcessedData: (couponProcessedDataPerSku: BuyCouponProcessedDataPerSku | null) =>\r\n createAction(BuyCouponActionTypes.SET_COUPON_PROCESSED_DATA, { couponProcessedDataPerSku }),\r\n setCouponServerData: (couponServerData: CouponServerData) =>\r\n createAction(BuyCouponActionTypes.SET_COUPON_SERVER_DATA, { couponServerData }),\r\n checkCMSCoupon: (selectedPlanSku: string) =>\r\n createAction(BuyCouponActionTypes.CHECK_CMS_COUPON, { selectedPlanSku }),\r\n resetCouponData: () => createAction(BuyCouponActionTypes.RESET_COUPON_DATA),\r\n setCouponValidAndApplied: (isCouponValidAndApplied: boolean) =>\r\n createAction(BuyCouponActionTypes.SET_COUPON_VALID_AND_APPLIED, { isCouponValidAndApplied }),\r\n setCouponDoubleDipAmountForNewUser: (couponDoubleDipAmountForNewUser: number) =>\r\n createAction(BuyCouponActionTypes.SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER, {\r\n couponDoubleDipAmountForNewUser,\r\n }),\r\n setUrlCouponActive: (isUrlCouponActive: boolean) =>\r\n createAction(BuyCouponActionTypes.SET_URL_COUPON_ACTIVE, { isUrlCouponActive }),\r\n observeValidateCMSCoupon: (couponServerData: CouponServerData) =>\r\n createAction(BuyCouponActionTypes.OBSERVE_VALIDATE_CMS_COUPON, { couponServerData }),\r\n checkVolumeDiscountAgainstRepriceCoupon: (\r\n checkVolumeDiscountData: BuyCheckVolumeDiscountAgainstRepriceCouponActionPayload\r\n ) =>\r\n createAction(BuyCouponActionTypes.CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON, {\r\n checkVolumeDiscountData,\r\n }),\r\n attemptForCMSCoupon: () => createAction(BuyCouponActionTypes.ATTEMPT_FOR_CMS_COUPON),\r\n setUrlCouponCode: (couponCode: string) => createAction(BuyCouponActionTypes.SET_URL_COUPON_CODE, { couponCode }),\r\n setValidCoupons: (validCoupons: ValidCoupon[]) =>\r\n createAction(BuyCouponActionTypes.SET_VALID_COUPON, { validCoupons }),\r\n}\r\n\r\nexport type BuyCouponActions = ActionUnion\r\n","import { BuyContentData } from '@buy/state/content-data'\r\nimport { LabelContent } from '@buy/state/label-content'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\nimport { BuyPlan } from '../plan'\r\nimport { ProductSettings } from '../product-settings'\r\n\r\nexport enum BuyPlanActionTypes {\r\n GET_LABEL_CONTENT = '[buy-plan-actions] get-label-content',\r\n SET_BUY_PLAN = '[buy-plan-actions] set-buy-plan',\r\n SET_CONTENT_LOADED = '[buy-plan-actions] set-content-loaded',\r\n GET_COMPARE_MODAL_CONTENT = '[buy-plan-actions] get-compare-modal-content',\r\n SET_COMPARE_MODAL_CONTENT = '[buy-plan-actions] set-compare-modal-content',\r\n SET_COUPON_DISCLAIMER = '[buy-plan-actions] set-coupon-disclaimer',\r\n}\r\n\r\nexport const buyPlanActions = {\r\n getLabelContent: (upgrade?: boolean) => createAction(BuyPlanActionTypes.GET_LABEL_CONTENT, { upgrade }),\r\n setBuyPlan: (content: BuyContentData, labels: LabelContent, plan: BuyPlan, productSettings: ProductSettings) =>\r\n createAction(BuyPlanActionTypes.SET_BUY_PLAN, {\r\n content,\r\n labels,\r\n plan,\r\n productSettings,\r\n }),\r\n getCompareModalContent: (PlanGroupdId: string) =>\r\n createAction(BuyPlanActionTypes.GET_COMPARE_MODAL_CONTENT, PlanGroupdId),\r\n setCompareModalContent: (content: []) => createAction(BuyPlanActionTypes.SET_COMPARE_MODAL_CONTENT, { content }),\r\n setContentLoaded: (loaded: boolean) => createAction(BuyPlanActionTypes.SET_CONTENT_LOADED, { loaded }),\r\n setCouponDisclaimer: (couponDisclaimer: string) =>\r\n createAction(BuyPlanActionTypes.SET_COUPON_DISCLAIMER, { couponDisclaimer }),\r\n}\r\n\r\n// where do the get functions go\r\n\r\nexport type BuyPlanActions = ActionUnion\r\n","import { BuyContainerAppState } from '@buy/store'\r\n// we need to complete this file, as we copy reducers from connect\r\n\r\nexport const getLabelContent = (state: BuyContainerAppState) => state.buy.planData.labelContent\r\nexport const getCheckoutState = (state: BuyContainerAppState) => state.buy.checkout\r\nexport const getPlanData = (state: BuyContainerAppState) => state.buy.planData.plan\r\nexport const getContentState = (state: BuyContainerAppState) => state.buy.planData\r\nexport const getContentData = (state: BuyContainerAppState) => state.buy.planData.contentData\r\nexport const getProductSettingsData = (state: BuyContainerAppState) => state.buy.planData.productSettings\r\nexport const getUserState = (state: BuyContainerAppState) => state.buy.user\r\nexport const getBuyFormState = (state: BuyContainerAppState) => state.buy.form\r\nexport const getCouponState = (state: BuyContainerAppState) => state.buy.coupon\r\nexport const getProductSettingsPlatformProduct = (state: BuyContainerAppState) =>\r\n state.buy.planData.productSettings.platformProduct\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from '@common/state/tracking/state'\r\n\r\n// TODO : Should be changed based on product config\r\nexport enum BuyTrackingActionTypes {\r\n // TRACK = '[resolve-tracking] resolve-track-event',\r\n TRACK = '[buy-tracking] buy-track-event',\r\n}\r\n\r\nexport const buyTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string, saveToSessionStorage = false) =>\r\n createAction(BuyTrackingActionTypes.TRACK, { trackingInfo, saveToSessionStorage }, { component }),\r\n}\r\n\r\nexport type ResolveTrackingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { BuyFormData } from '@buy/state/buy-form/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { BuyAbandonedCartDataType, BuyUserDataType, CreateAccountRequest } from './state'\r\n\r\nexport enum BuyUserActionTypes {\r\n CHECK_EXISTING_USER = '[buy-user-actions] check-existing-user',\r\n CREATE_NEW_USER = '[buy-user-actions] create-new-user',\r\n CREATE_NEW_USER_UCS = '[buy-user-actions] create-new-user-ucs',\r\n GET_LOGGED_IN_USER_STATE = '[buy-user-actions] get-user-logged-in-state',\r\n SET_EXISTING_BILLING_INFO = '[buy-user-actions] set-existing-billing-info',\r\n SET_EXISTING_USER_INFO = '[buy-user-actions] set-existing-user-info',\r\n SET_EXISTING_ACCOUNT_INFO = '[buy-user-actions] set-existing-account-info',\r\n SET_DISPLAY_NAME = '[buy-user-actions] set-display-name',\r\n SET_LOADING_EXISTING_INFO = '[buy-user-actions] set-loading-existing-info',\r\n SET_VERIFYING_TOKEN = '[buy-user-actions] set-verifying-token',\r\n SET_USER_TYPE = '[buy-user-actions] set-user-type',\r\n SET_EXISTING_PAYMENT_DETAILS = '[buy-user-actions] set-existing-payment-details',\r\n SET_ACCESS_TOKEN = '[buy-user-actions] set-access-token',\r\n GET_ACCESS_TOKEN = '[buy-user-actions] get-access-token',\r\n SET_CASTLE_TOKEN = '[buy-user-actions] set-castle-token',\r\n SET_IS_USER_LOGGEDIN = '[buy-user-actions] set-is-user-loggedin',\r\n USER_LOGIN = '[buy-user-actions] user-login',\r\n USER_LOGOUT = '[buy-user-actions] user-logout',\r\n SET_VERIFY_USER_SHOULD_LOGIN = '[buy-user-actions] get-verify-user-should-login',\r\n SUBMIT_ABANDONED_CART = '[buy-user-actions] submit-abandoned-cart',\r\n}\r\n\r\nexport const buyUserActions = {\r\n checkExistingUser: (email: string, form?: BuyFormData) =>\r\n createAction(BuyUserActionTypes.CHECK_EXISTING_USER, { email, form }),\r\n createNewUser: (userValues: BuyUserDataType) => createAction(BuyUserActionTypes.CREATE_NEW_USER, { userValues }),\r\n createNewUserUCS: (userValues: CreateAccountRequest) =>\r\n createAction(BuyUserActionTypes.CREATE_NEW_USER_UCS, { userValues }),\r\n getLoggedInUserState: () => createAction(BuyUserActionTypes.GET_LOGGED_IN_USER_STATE),\r\n setExistingBillingInformation: (billingInfo: ExistingBillingInfoType) =>\r\n createAction(BuyUserActionTypes.SET_EXISTING_BILLING_INFO, { billingInfo }),\r\n setLoadingExistingInformation: (loading: boolean) =>\r\n createAction(BuyUserActionTypes.SET_LOADING_EXISTING_INFO, { loading }),\r\n setVerifyingToken: (verifying: boolean) => createAction(BuyUserActionTypes.SET_VERIFYING_TOKEN, { verifying }),\r\n setExistingUserInformation: (userInfo: ExistingUserInfoType) =>\r\n createAction(BuyUserActionTypes.SET_EXISTING_USER_INFO, { userInfo }),\r\n setExistingAccountInformation: (accountInfo: ExistingAccountInfoType) =>\r\n createAction(BuyUserActionTypes.SET_EXISTING_ACCOUNT_INFO, { accountInfo }),\r\n setDisplayName: (displayName: string) => createAction(BuyUserActionTypes.SET_DISPLAY_NAME, { displayName }),\r\n setUserType: (type: string) => createAction(BuyUserActionTypes.SET_USER_TYPE, { type }),\r\n setExistingPaymentDetails: (info: ExistingPaymentInfoType) =>\r\n createAction(BuyUserActionTypes.SET_EXISTING_PAYMENT_DETAILS, { info }),\r\n getAccessToken: () => createAction(BuyUserActionTypes.GET_ACCESS_TOKEN),\r\n userLogin: (component?: string, pathname?: string, search?: string, sso?: boolean) =>\r\n createAction(BuyUserActionTypes.USER_LOGIN, { pathname, search, sso }, { component }),\r\n userLogout: (component?: string) => createAction(BuyUserActionTypes.USER_LOGOUT, {}, { component }),\r\n setAccessToken: (accessToken: Token) => createAction(BuyUserActionTypes.SET_ACCESS_TOKEN, { accessToken }),\r\n setCastleToken: (castleToken: string) => createAction(BuyUserActionTypes.SET_CASTLE_TOKEN, { castleToken }),\r\n setIsUserLoggedIn: (isUserLoggedIn: boolean) =>\r\n createAction(BuyUserActionTypes.SET_IS_USER_LOGGEDIN, {\r\n isUserLoggedIn,\r\n }),\r\n setVerifyShouldUserLogIn: (verifiedUserShouldLogIn: boolean) =>\r\n createAction(BuyUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN, { verifiedUserShouldLogIn }),\r\n submitAbandonedCart: (abandonedCartData: BuyAbandonedCartDataType) =>\r\n createAction(BuyUserActionTypes.SUBMIT_ABANDONED_CART, { abandonedCartData }),\r\n}\r\n\r\nexport type BuyUserActions = ActionUnion\r\n","import { get } from 'lodash-es'\r\nimport { CURRENCY } from '@common/constants'\r\nimport { BuyBillingFrequencyVolumeDiscountRecords, BuyVolumeDiscountPerTier } from '@buy/state/checkout/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyPrice, BuyPricing, BuyTiers } from '@buy/state/price'\r\nimport { BuyAddon } from '@buy/state/add-on'\r\n\r\nexport const getDiscount = (basePrice: number, newPrice: number): number => {\r\n return basePrice - newPrice\r\n}\r\n\r\nexport const getDiscountPercentage = (basePrice: number, newPrice: number): number => {\r\n return Math.floor(((basePrice - newPrice) / basePrice) * 100)\r\n}\r\n\r\nconst processPricingTier = (pricingTierKeys: string[], pricingTiers: BuyTiers): BuyVolumeDiscountPerTier[] => {\r\n let basePrice = 0\r\n return pricingTierKeys.reduce((pricingTierAccumulator, pricingTier, pricingTierIndex) => {\r\n const pricingTierAccumulatorCopy = [...pricingTierAccumulator]\r\n const pricingTierData = pricingTiers[pricingTier as keyof BuyTiers]\r\n const tierPrice = pricingTierData.price\r\n if (pricingTierIndex === 0) {\r\n basePrice = tierPrice\r\n }\r\n\r\n const volumeDiscountPerTier: BuyVolumeDiscountPerTier = {\r\n discountPricePerUnit: getDiscount(basePrice, tierPrice),\r\n }\r\n pricingTierAccumulatorCopy.push(volumeDiscountPerTier)\r\n return pricingTierAccumulatorCopy\r\n }, [] as BuyVolumeDiscountPerTier[])\r\n}\r\n\r\nconst processCurrencyPricing = (\r\n pricingKeys: string[],\r\n currencyPricing: BuyPricing\r\n): BuyBillingFrequencyVolumeDiscountRecords => {\r\n return pricingKeys.reduce((billingFrequencyAccumulator, billingFrequency) => {\r\n const billingFrequencyAccumulatorCopy = { ...billingFrequencyAccumulator }\r\n const pricingTiers = currencyPricing[billingFrequency as keyof BuyPricing]\r\n const pricingTierKeys = Object.keys(pricingTiers)\r\n billingFrequencyAccumulatorCopy[billingFrequency] = processPricingTier(pricingTierKeys, pricingTiers)\r\n return billingFrequencyAccumulatorCopy\r\n }, {} as BuyBillingFrequencyVolumeDiscountRecords)\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n selectedPlan: BuyPlan,\r\n selectedCurrency: CURRENCY\r\n): BuyBillingFrequencyVolumeDiscountRecords => {\r\n const { pricingInfo } = selectedPlan ?? {}\r\n const currencyPricing = pricingInfo[selectedCurrency as keyof BuyPrice] as BuyPricing\r\n const pricingKeys = Object.keys(currencyPricing)\r\n return processCurrencyPricing(pricingKeys, currencyPricing)\r\n}\r\n\r\nexport const getTotalVolumeDiscount = (discountPerUser: number, organizers: number, annualize: boolean) => {\r\n const volumeDiscountTimesOrganizer = discountPerUser * organizers\r\n\r\n const totalVolumeDiscount = annualize ? volumeDiscountTimesOrganizer * 12 : volumeDiscountTimesOrganizer\r\n\r\n return totalVolumeDiscount\r\n}\r\n\r\nexport const getAddonVolumeDiscount = (\r\n addon: BuyAddon,\r\n quantity: number,\r\n currencyCode: string,\r\n billingFrequencyKey: string,\r\n _currentTier: string,\r\n subscribedAddonQuantity?: number\r\n) => {\r\n const discountPercentagesForQuantity = () => {\r\n const basePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'price'], 0)\r\n const tierTwoPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'price'], 0)\r\n const tierThreePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'price'], 0)\r\n const tierFourPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'price'], 0)\r\n const tierFivePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier5', 'price'], 0)\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'max'], 0))\r\n return { actualPercentage: 0, tierIndex: 1 }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'max'], 0)) {\r\n const percent = ((basePrice - tierTwoPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 2 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'max'], 0)) {\r\n const percent = ((basePrice - tierThreePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 3 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'max'], 0)) {\r\n const percent = ((basePrice - tierFourPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 4 }\r\n }\r\n\r\n const percent = ((basePrice - tierFivePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 5 }\r\n }\r\n\r\n // WAE-401 :: While showing the percentage value in line item, we need to round it off to the `floor`. But for the discount amount, need to `round` it to closest\r\n const { actualPercentage, tierIndex } = discountPercentagesForQuantity()\r\n\r\n const price = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, `tier${tierIndex}`, 'price'], 0)\r\n const isAnnual = billingFrequencyKey === 'annual'\r\n\r\n const discountPrice =\r\n Math.floor((actualPercentage / 100) * price * (isAnnual ? 12 : 1)) * (subscribedAddonQuantity || quantity)\r\n\r\n return { discountPrice, tierIndex }\r\n}\r\n","import { BuyAddon, BuySelectedAddon } from '@buy/state/add-on'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { ADDONS } from '@buy/constants'\r\n\r\nexport const getCurrentAddons = (selectedAddons: BuySelectedAddon[], selectedPlan: BuyPlan): BuyAddon[] => {\r\n const { addons } = selectedPlan ?? {}\r\n const myAddons = selectedAddons.reduce((mySelectedAddons: BuyAddon[], localAddon: BuySelectedAddon) => {\r\n const matchingAddon = addons.find((add: BuyAddon) => add.sKU === localAddon.sKU)\r\n if (matchingAddon) {\r\n matchingAddon.quantity = localAddon.quantity\r\n return [...mySelectedAddons, matchingAddon]\r\n }\r\n\r\n return mySelectedAddons\r\n }, [])\r\n return myAddons\r\n}\r\n\r\nexport const getExtraAddons = (addons: BuyAddon[]) => {\r\n return addons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n}\r\n\r\nexport const getCurrentAgent = (addons: BuyAddon[]) => {\r\n return addons.filter((addon) => addon.sKU.includes(ADDONS.AGENT))[0]\r\n}\r\n\r\nexport const getCurrentEndpoint = (addons: BuyAddon[]) => {\r\n return addons.filter(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )[0]\r\n}\r\n\r\n// export const getUserSubscribedAccumulatedAddon = (subscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n// const userSubscribedAddonsQuantity = subscriptions.reduce((prev, curr) => {\r\n// /* eslint-disable no-param-reassign */\r\n// prev += curr.quantity\r\n// return prev\r\n// }, 0)\r\n\r\n// const userSubscribedAccumulatedAddon = { ...subscriptions[subscriptions.length - 1] }\r\n// userSubscribedAccumulatedAddon.quantity = userSubscribedAddonsQuantity\r\n\r\n// return userSubscribedAccumulatedAddon\r\n// }\r\n\r\n// export const getAccumulatedUserSubscriptions = (\r\n// subscriptions: BillingDetailedSubscriptionPlan[],\r\n// planData: BuyPlan\r\n// ) => {\r\n// // const selectedPlan: BuyPlan = planData.filter((plan: BuyPlan) => {\r\n// // return !!subscriptions.find((sub: BillingDetailedSubscriptionPlan) => plan.sKU === sub.productSku)\r\n// // })\r\n// // const hasMatchingSubscriptions = subscriptions.some(\r\n// // (sub: BillingDetailedSubscriptionPlan) => planData.sKU === sub.productSku)\r\n\r\n// // // if user does not have any GoToResolve subscriptions, exit\r\n// // if (isEmpty(hasMatchingSubscriptions)) {\r\n// // return subscriptions\r\n// // }\r\n// if (isEmpty(subscriptions.filter((sub: BillingDetailedSubscriptionPlan) => planData.sKU === sub.productSku))) {\r\n// return subscriptions\r\n// }\r\n\r\n// const currentAgent = getCurrentAgent(planData.addons)\r\n// const currentEndpoint = getCurrentEndpoint(planData.addons)\r\n// const accumulatedSubscriptions = []\r\n\r\n// const userSubscribedAgents = subscriptions.filter(\r\n// (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentAgent.sKU\r\n// )\r\n// const userSubscribedEndpoints = subscriptions.filter(\r\n// (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentEndpoint.sKU\r\n// )\r\n\r\n// if (userSubscribedAgents.length) {\r\n// const userSubscribedAgent = getUserSubscribedAccumulatedAddon(userSubscribedAgents)\r\n// accumulatedSubscriptions.push(userSubscribedAgent)\r\n// }\r\n\r\n// if (userSubscribedEndpoints.length) {\r\n// const userSubscribedEndpoint = getUserSubscribedAccumulatedAddon(userSubscribedEndpoints)\r\n// accumulatedSubscriptions.push(userSubscribedEndpoint)\r\n// }\r\n\r\n// accumulatedSubscriptions.push(\r\n// ...subscriptions.filter((sub) => sub.productSku !== currentAgent.sKU && sub.productSku !== currentEndpoint.sKU)\r\n// )\r\n\r\n// return accumulatedSubscriptions\r\n// }\r\n\r\n// export const getUserSubscribedAddons = (\r\n// accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n// selectedPlan: BuyPlan\r\n// ) => {\r\n// if (!selectedPlan || !accountSubscriptions.length) return {}\r\n\r\n// const currentAgent = getCurrentAgent(selectedPlan.addons)\r\n// const currentEndpoint = getCurrentEndpoint(selectedPlan.addons)\r\n\r\n// return {\r\n// disablePlanSelection: false,\r\n// disableExtraAddons: false,\r\n// userSubscribedAgent: accountSubscriptions.find((sub) => sub.productSku === currentAgent.sKU),\r\n// userSubscribedEndpoint: accountSubscriptions.find((sub) => sub.productSku === currentEndpoint.sKU),\r\n// }\r\n// }\r\n\r\n// export const getIncludedAddons = (accountSubscriptions: BillingDetailedSubscriptionPlan[], selectedPlan: BuyPlan) => {\r\n// if (!selectedPlan) return { includedEndpoints: 0, includedAgents: 0 }\r\n// const { userSubscribedAgent, userSubscribedEndpoint } =\r\n// accountSubscriptions && getUserSubscribedAddons(accountSubscriptions, selectedPlan)\r\n\r\n// const includedAgents = userSubscribedAgent\r\n// ? selectedPlan.userAgentsIncludedAmount + userSubscribedAgent.quantity\r\n// : selectedPlan.userAgentsIncludedAmount\r\n\r\n// const includedEndpoints = userSubscribedEndpoint\r\n// ? selectedPlan.endpointsIncludedAmount + ADDONS.ENDPOINTS_ADDONS_INTERVAL * userSubscribedEndpoint.quantity\r\n// : selectedPlan.endpointsIncludedAmount\r\n\r\n// return { includedEndpoints, includedAgents }\r\n// }\r\n","export const getIsOnePayFlow = () => {\r\n const urlParams = new URLSearchParams(window.location.search)\r\n return urlParams.get('checkoutmethod') === 'onepay'\r\n}\r\n","import { BuySelectedAddon } from '@buy/state/add-on'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyItems } from '@buy/state/checkout/state'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { PRODUCT_SKU, BILLING_TYPES, BillingPeriod, BillingPeriodBillingTypesMapper } from '@common/constants'\r\nimport { ADDONS } from '@buy/constants'\r\nimport { OrderSummaryLine } from '@buy/state/order-summary/order-summary'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { SubscriptionInfo } from './get-subscription-info'\r\n\r\nexport const getPaymentItems = (\r\n selectedPlan: BuyPlan,\r\n organizers: number,\r\n selectedBillingFrequency: string,\r\n selectedAddons: BuySelectedAddon[],\r\n subscriptionInfo: SubscriptionInfo\r\n) => {\r\n const items: BuyItems[] = []\r\n const billingFrequency = selectedBillingFrequency === 'YEAR' ? BILLING_TYPES.ANNUAL : BILLING_TYPES.MONTHLY\r\n const contractLengthInMonth = billingFrequency === BILLING_TYPES.ANNUAL ? 12 : 1\r\n\r\n const planSubscription: BuyItems = {\r\n itemId: 0,\r\n productSku: selectedPlan.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: organizers,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }\r\n\r\n if (subscriptionInfo.plan && subscriptionInfo.isReplacementBooking && !subscriptionInfo.isTrial) {\r\n if (!subscriptionInfo.canUpgradePlan) {\r\n planSubscription.productSku = subscriptionInfo.plan.productSku\r\n planSubscription.quantity = subscriptionInfo.plan.quantity\r\n }\r\n\r\n planSubscription.subscriptionsToUpgrade = [\r\n {\r\n subscriptionId: subscriptionInfo.plan.subscriptionId,\r\n quantity: subscriptionInfo.plan.quantity,\r\n },\r\n ]\r\n\r\n subscriptionInfo.addons.forEach((addon: BillingDetailedSubscriptionPlan) => {\r\n planSubscription.subscriptionsToUpgrade?.push({\r\n subscriptionId: addon.subscriptionId,\r\n quantity: addon.quantity,\r\n })\r\n })\r\n }\r\n\r\n if (subscriptionInfo.isReplacementBooking) items.push(planSubscription)\r\n\r\n // add addon products to the items object\r\n if (selectedAddons.length > 0) {\r\n selectedAddons.forEach((addon: BuySelectedAddon) => {\r\n const v2plan = items.find(\r\n (item) =>\r\n (item.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n item.productSku === PRODUCT_SKU.GTR_REMOTE_ACCESS) &&\r\n !item.subscriptionsToUpgrade\r\n )\r\n if (v2plan && addon.sKU.includes(ADDONS.AGENT)) {\r\n v2plan.quantity += addon.quantity\r\n } else {\r\n items.push({\r\n itemId: items.length,\r\n productSku: addon.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: addon.quantity,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n })\r\n }\r\n })\r\n }\r\n\r\n return items\r\n}\r\n\r\nexport const getCartItems = (\r\n baseLine: OrderSummaryLine,\r\n additionalLines: OrderSummaryLine[],\r\n addonLines: OrderSummaryLine[],\r\n subscriptionInfo: SubscriptionInfo,\r\n selectedBillingFrequency: BillingPeriod\r\n) => {\r\n const contractLengthInMonth =\r\n BillingPeriodBillingTypesMapper[selectedBillingFrequency] === BILLING_TYPES.ANNUAL ? 12 : 1\r\n const items: BuyItems[] = []\r\n const planSubscription: BuyItems = {\r\n itemId: 0,\r\n productSku: baseLine.key,\r\n paymentPlan: BillingPeriodBillingTypesMapper[selectedBillingFrequency],\r\n quantity: !isEmpty(baseLine.quantityMultiplier)\r\n ? Number(baseLine.quantityMultiplier) * baseLine.multiplier\r\n : baseLine.multiplier,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }\r\n\r\n if (subscriptionInfo.plan && subscriptionInfo.isReplacementBooking && !subscriptionInfo.isTrial) {\r\n if (!subscriptionInfo.canUpgradePlan) {\r\n planSubscription.productSku = subscriptionInfo.plan.productSku\r\n planSubscription.quantity = subscriptionInfo.plan.quantity\r\n }\r\n\r\n planSubscription.subscriptionsToUpgrade = [\r\n {\r\n subscriptionId: subscriptionInfo.plan.subscriptionId,\r\n quantity: subscriptionInfo.plan.quantity,\r\n },\r\n ]\r\n\r\n subscriptionInfo.addons.forEach((addon: BillingDetailedSubscriptionPlan) => {\r\n planSubscription.subscriptionsToUpgrade?.push({\r\n subscriptionId: addon.subscriptionId,\r\n quantity: addon.quantity,\r\n })\r\n })\r\n }\r\n\r\n if (subscriptionInfo.isReplacementBooking) items.push(planSubscription)\r\n\r\n const updatedAdditionalLines = additionalLines.map((item) => {\r\n const newItem = { ...item }\r\n newItem.quantity = newItem.multiplier\r\n return newItem\r\n })\r\n const otherLines = [...updatedAdditionalLines, ...addonLines]\r\n const otherItems: BuyItems[] = otherLines.map((item, index) => ({\r\n itemId: index + 1,\r\n productSku: item.key,\r\n paymentPlan: BillingPeriodBillingTypesMapper[selectedBillingFrequency],\r\n quantity: !isEmpty(item.quantityMultiplier) ? Number(item.quantityMultiplier) * item.quantity : item.quantity,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }))\r\n return [...items, ...otherItems]\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { trackEvent, getFormName } from '@common/utils'\r\nimport {\r\n BillingPeriod,\r\n BillingPeriodTimePeriodMapper,\r\n CURRENCY,\r\n PRODUCT_FAMILY_KEY,\r\n TimePeriod,\r\n TimePeriodBillingPeriodMapper,\r\n TRACKING_EVENTS,\r\n VIEW_PATH,\r\n} from '@common/constants'\r\nimport { BuyCartData, BuyPurchaseData, BuyCustomizeItemsData } from '@buy/state/tracking/state'\r\nimport { PageViewContentData, SessionInfo, TrackECommerceData } from '@common/state/tracking/state'\r\nimport { BUY_TYPE, BUY_USER_TYPES, BUY_TRACKING_COMPONENTS } from '@buy/constants'\r\nimport { cloneDeep, isEmpty } from 'lodash-es'\r\nimport { OrderSummaryLine } from '@buy/state/order-summary/order-summary'\r\nimport { calculateVolumeDiscount, getPrice, getPriceTier } from './volume-components-helpers'\r\nimport { ValidCoupon } from './coupon'\r\nimport { getIsOnePayFlow } from './get-is-onepay-flow'\r\n\r\nconst contentType: Record = {\r\n [VIEW_PATH.PATH_CUSTOMIZE]: 'plan',\r\n [VIEW_PATH.PATH_CHECKOUT]: 'buy-form',\r\n}\r\n\r\nconst enum CartAction {\r\n ADD = 'add',\r\n REMOVE = 'remove',\r\n NONE = 'none',\r\n}\r\n\r\nexport const getBuyType = (userType: string) => {\r\n if (userType === BUY_USER_TYPES.TRIALER) {\r\n return BUY_TYPE.TRIAL_CONVERSION\r\n }\r\n if (userType === BUY_USER_TYPES.ADDON) {\r\n return BUY_TYPE.ADDON\r\n }\r\n return BUY_TYPE.DIRECT_BUY\r\n}\r\n\r\ninterface PreviousTrackData {\r\n step: number\r\n cartData: BuyCartData | null\r\n}\r\nconst previousTrackData: PreviousTrackData = {\r\n step: 0, // default value\r\n cartData: null,\r\n}\r\nconst setPreviousStep = (step: number) => {\r\n previousTrackData.step = step\r\n}\r\nconst setPreviousCart = (cartData: BuyCartData) => {\r\n previousTrackData.cartData = cloneDeep(cartData)\r\n}\r\n\r\ninterface SkuCartData {\r\n currency: CURRENCY\r\n line: OrderSummaryLine\r\n billingFrequency: TimePeriod\r\n billingPeriod: BillingPeriod\r\n billingPeriodKeys: string[]\r\n isAddon: boolean\r\n productFamilyName: string\r\n couponCode: string\r\n validCoupons: ValidCoupon[]\r\n mainCartLine: OrderSummaryLine | undefined\r\n}\r\n\r\nconst processSkuData = (data: SkuCartData) => {\r\n const {\r\n currency,\r\n line,\r\n billingFrequency,\r\n billingPeriod,\r\n billingPeriodKeys,\r\n isAddon,\r\n productFamilyName,\r\n mainCartLine,\r\n } = data\r\n const actualQuantity = !isEmpty(mainCartLine) ? mainCartLine.quantity : line.quantity\r\n const actualMultiplier = !isEmpty(mainCartLine) ? mainCartLine.multiplier : line.multiplier\r\n const skuPrice = getPrice(1, line.allPrices[billingPeriod])\r\n const volumeDiscount = calculateVolumeDiscount(\r\n line,\r\n !isAddon ? actualMultiplier : actualQuantity,\r\n billingPeriodKeys,\r\n billingPeriod === BillingPeriod.ANNUAL\r\n )\r\n const priceTier = getPriceTier(!isAddon ? actualMultiplier : actualQuantity, line.allPrices[billingPeriod])\r\n return {\r\n currency,\r\n item_brand: productFamilyName,\r\n item_category: productFamilyName,\r\n item_category2: line.skuName,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${isAddon ? `${productFamilyName} ` : ''}${line.skuName}_${billingFrequency.toLowerCase()}`,\r\n item_id: `${line.key}_${billingFrequency.toLowerCase()}`,\r\n item_variant: isAddon ? 'Add-on' : 'Product',\r\n price: skuPrice * (billingPeriod === BillingPeriod.ANNUAL ? 12 : 1),\r\n quantity: !isAddon ? line.multiplier : line.quantity,\r\n volume_discount: volumeDiscount ? volumeDiscount / (!isAddon ? line.multiplier : line.quantity) : undefined,\r\n discount: data.validCoupons.find((item) => item.sku === line.key)?.discount,\r\n product_discount_tier: priceTier === 0 ? undefined : `Tier${priceTier}`,\r\n coupon: data.couponCode,\r\n }\r\n}\r\n\r\nconst processCartData = (productData: BuyCartData, mainCartData?: BuyCartData) => {\r\n const { baseLine, addonLines, additionalLines, billingPeriod, currency, billingPeriodKeys } = productData\r\n\r\n let planInfo: TrackECommerceData | null = null\r\n let cartItems: TrackECommerceData[] = []\r\n const billingFrequency = BillingPeriodTimePeriodMapper[billingPeriod]\r\n\r\n if (!isEmpty(baseLine)) {\r\n planInfo = processSkuData({\r\n currency,\r\n line: baseLine,\r\n billingFrequency,\r\n billingPeriod,\r\n billingPeriodKeys,\r\n isAddon: false,\r\n productFamilyName: productData.productFamilyName,\r\n couponCode: productData.couponCode,\r\n validCoupons: productData.validCoupons,\r\n mainCartLine: mainCartData?.baseLine,\r\n })\r\n cartItems = [...cartItems, planInfo]\r\n }\r\n\r\n let additionalLinesInfoList: TrackECommerceData[] | null = null\r\n if (!isEmpty(additionalLines)) {\r\n additionalLinesInfoList = additionalLines.map((line) => {\r\n const addonInfo: TrackECommerceData = processSkuData({\r\n currency,\r\n line,\r\n billingFrequency,\r\n billingPeriod,\r\n billingPeriodKeys,\r\n isAddon: false,\r\n productFamilyName: productData.productFamilyName,\r\n couponCode: productData.couponCode,\r\n validCoupons: productData.validCoupons,\r\n mainCartLine: mainCartData?.additionalLines.find((item) => line.key === item.key),\r\n })\r\n return addonInfo\r\n })\r\n cartItems = [...cartItems, ...additionalLinesInfoList]\r\n }\r\n\r\n let addonInfoList: TrackECommerceData[] | null = null\r\n if (!isEmpty(addonLines)) {\r\n addonInfoList = addonLines.map((line) => {\r\n const addonInfo: TrackECommerceData = processSkuData({\r\n currency,\r\n line,\r\n billingFrequency,\r\n billingPeriod,\r\n billingPeriodKeys,\r\n isAddon: true,\r\n productFamilyName: productData.productFamilyName,\r\n couponCode: productData.couponCode,\r\n validCoupons: productData.validCoupons,\r\n mainCartLine: mainCartData?.addonLines.find((item) => line.key === item.key),\r\n })\r\n return addonInfo\r\n })\r\n cartItems = [...cartItems, ...addonInfoList]\r\n }\r\n return cartItems\r\n}\r\n\r\nexport const trackAddToCart = (productData: BuyCartData, platformProduct: string, mainCartData?: BuyCartData) => {\r\n const { tier, totalDiscount } = productData\r\n const cartItems = processCartData(productData, mainCartData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: totalDiscount,\r\n platform_product: platformProduct,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ADD_TO_CART, eventData })\r\n}\r\n\r\nexport const trackRemoveFromCart = (productData: BuyCartData, mainCartData?: BuyCartData) => {\r\n const { tier, totalDiscount } = productData\r\n const cartItems = processCartData(productData, mainCartData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: totalDiscount,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.REMOVE_FROM_CART, eventData })\r\n}\r\n\r\nconst compareOrderLines = (newLine: OrderSummaryLine, oldLine: OrderSummaryLine) => {\r\n if (newLine.quantity > oldLine.quantity) {\r\n const resultLine: OrderSummaryLine = {\r\n ...newLine,\r\n quantity: newLine.quantity - oldLine.quantity,\r\n multiplier: newLine.multiplier - oldLine.multiplier,\r\n }\r\n return { resultLine, action: CartAction.ADD }\r\n }\r\n if (newLine.quantity < oldLine.quantity) {\r\n const resultLine: OrderSummaryLine = {\r\n ...newLine,\r\n quantity: oldLine.quantity - newLine.quantity,\r\n multiplier: oldLine.multiplier - newLine.multiplier,\r\n }\r\n return { resultLine, action: CartAction.REMOVE }\r\n }\r\n return { resultLine: newLine, action: CartAction.NONE }\r\n}\r\n\r\nconst getLinesByAction = (previousLines: OrderSummaryLine[], newLines: OrderSummaryLine[]) => {\r\n // Retrieve the skus in old and new cart data\r\n const oldDataSkus = previousLines.map((item) => item.skuName)\r\n const newDataSkus = newLines.map((item) => item.skuName)\r\n\r\n // Check for skus that were newly added or completely removed\r\n const skusToRemove = oldDataSkus.filter((item) => !newDataSkus.includes(item))\r\n const skusToAdd = newDataSkus.filter((item) => !oldDataSkus.includes(item))\r\n // These skus are present in both the new cart data and old data , so we need to check for the difference in quantity\r\n const skusNeededToBeCompared = oldDataSkus.filter((item) => newDataSkus.includes(item))\r\n\r\n let linesToRemove = previousLines.filter((item) => skusToRemove.includes(item.skuName))\r\n let linesToAdd = newLines.filter((item) => skusToAdd.includes(item.skuName))\r\n\r\n const comparedSkuLines = skusNeededToBeCompared.map((item2) => {\r\n return compareOrderLines(\r\n newLines.find((item) => item.skuName === item2)!,\r\n previousLines.find((item) => item.skuName === item2)!\r\n )\r\n })\r\n comparedSkuLines.forEach((item) => {\r\n if (item.action === CartAction.ADD) linesToAdd = [...linesToAdd, item.resultLine]\r\n else if (item.action === CartAction.REMOVE) linesToRemove = [...linesToRemove, item.resultLine]\r\n })\r\n return {\r\n removedLines: linesToRemove,\r\n addedLines: linesToAdd,\r\n }\r\n}\r\n\r\nexport const checkCartData = (cartData: BuyCartData, platformProduct: string) => {\r\n const previousCartData = previousTrackData.cartData\r\n if (previousCartData) {\r\n const { plan } = cartData\r\n const currentCartPlan = plan\r\n const previousCartPlan = previousCartData.plan\r\n\r\n if (currentCartPlan.name !== previousCartPlan.name) {\r\n trackRemoveFromCart(previousCartData)\r\n trackAddToCart(cartData, platformProduct)\r\n } else {\r\n // Check if theres a change in the base plan quantity\r\n const baseLineChanges = compareOrderLines(cartData.baseLine!, previousCartData.baseLine!)\r\n // Check if theres a change in the additional products quantity\r\n const additionalLinesDifference = getLinesByAction(\r\n previousCartData.additionalLines,\r\n cartData.additionalLines\r\n )\r\n // Check if theres a change in the addons quantity\r\n const addonLinesDifference = getLinesByAction(previousCartData.addonLines, cartData.addonLines)\r\n\r\n const addedCart: BuyCartData = {\r\n ...cartData,\r\n additionalLines: additionalLinesDifference.addedLines,\r\n addonLines: addonLinesDifference.addedLines,\r\n baseLine: undefined,\r\n }\r\n const removededCart: BuyCartData = {\r\n ...cartData,\r\n additionalLines: additionalLinesDifference.removedLines,\r\n addonLines: addonLinesDifference.removedLines,\r\n baseLine: undefined,\r\n }\r\n if (baseLineChanges.action === CartAction.ADD) {\r\n addedCart.baseLine = baseLineChanges.resultLine\r\n } else if (baseLineChanges.action === CartAction.REMOVE) {\r\n removededCart.baseLine = baseLineChanges.resultLine\r\n }\r\n if (!isEmpty(addedCart.baseLine) || !isEmpty(addedCart.additionalLines) || !isEmpty(addedCart.addonLines))\r\n trackAddToCart(addedCart, platformProduct, cartData)\r\n if (\r\n !isEmpty(removededCart.baseLine) ||\r\n !isEmpty(removededCart.additionalLines) ||\r\n !isEmpty(removededCart.addonLines)\r\n )\r\n trackRemoveFromCart(removededCart, cartData)\r\n }\r\n } else {\r\n // just for double check, because there will always be previous cartData\r\n // if you are in checkCartData function because of the order in which events are fired\r\n trackAddToCart(cartData, platformProduct)\r\n }\r\n}\r\n\r\nexport const trackCustomizeViewItem = (customizeItemsData: BuyCustomizeItemsData) => {\r\n const { planData, billingFrequency, currency, organizers, productFamilyName, baseLine } = customizeItemsData\r\n\r\n // See \"view_item\" column in spreadsheet attached to WAE1-174\r\n const skuPrice = getPrice(1, baseLine!.allPrices[TimePeriodBillingPeriodMapper[billingFrequency]])\r\n\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const planInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: productFamilyName, // product_name\r\n item_category: productFamilyName, // product_name\r\n item_category2: planData.name, // product_id\r\n item_category3: billingFrequency, // product_period\r\n item_category4: '1', // product_duration\r\n item_name: `${planData.name}_${billingFrequencyLowerCase}`, // Product / add-on name with period\r\n item_id: `${planData.sKU}_${billingFrequencyLowerCase}`, // Product / add-on unique identifier, sku with period\r\n item_variant: 'Product', // Specify if it's a \"Product\" or an \"Add-on\"\r\n price: skuPrice * (billingFrequency === TimePeriod.Year ? 12 : 1), // product_price\r\n quantity: organizers, // product_quantity\r\n }\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: [planInfo],\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_ITEM, eventData })\r\n}\r\n\r\nexport const trackViewContent = (userData: PageViewContentData, platformProduct: string, pageName: string) => {\r\n const formName = getFormName(pageName)\r\n const contentTypeName = `/${pageName.split('/')[2]}`\r\n const eventData = {\r\n platform_environment: `${platformProduct}-${process.env.ENVIRONMENT}`,\r\n platform_product: platformProduct,\r\n platform_type: 'marketing',\r\n platform_locale: userData.locale,\r\n platform_country: userData.country,\r\n platform_language: userData.language,\r\n section: 'web',\r\n // TODO: load based on product\r\n sub_section: 'resolve',\r\n template: pageName,\r\n content_type: `${pageName}-${contentType[contentTypeName]}`,\r\n page_type: pageName,\r\n content_number: 1,\r\n login_status: userData.isUserLoggedIn,\r\n funnel_name: `${platformProduct}:marketing:${pageName}`,\r\n form_name: formName,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_CONTENT, eventData })\r\n}\r\n\r\nexport const trackSessionInfo = (sessionInfo: SessionInfo) => {\r\n const eventData = {\r\n session_last: sessionInfo.sessionLast,\r\n session_number: sessionInfo.sessionNumber,\r\n user_type: sessionInfo.userType,\r\n is_logged_in: sessionInfo.isUserLoggedIn,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.SESSION_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackBeginCheckout = (productData: BuyCartData, currentStep: number, platformProduct: string) => {\r\n const isOnePayFlow = getIsOnePayFlow()\r\n const { tier, totalDiscount } = productData\r\n const cartItems = processCartData(productData)\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n step: currentStep,\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: totalDiscount,\r\n platform_product: platformProduct,\r\n }\r\n\r\n trackEvent({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData })\r\n\r\n // if user navigates directly to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 0 && currentStep === 2) {\r\n checkCartData(productData, platformProduct)\r\n }\r\n // if user navigates from customize page (step 1) to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 1 && currentStep === 2) {\r\n checkCartData(productData, platformProduct)\r\n }\r\n // if user starts off in customize page, do not set previouse cart data yet, as it remains undefined\r\n if (previousTrackData.step !== 0) {\r\n setPreviousCart(productData)\r\n }\r\n setPreviousStep(currentStep)\r\n\r\n if (currentStep === 2 && productData.isExistingUser) {\r\n trackBeginCheckout(productData, 3, platformProduct)\r\n if (!isOnePayFlow) {\r\n // For existing users returning to the onepay flow the \"begin_checkout step 4\" event gets\r\n // tracked upon clicking the \"Proceed to Purchase\" button instead of here.\r\n // See: src/products/buy/connectedComponents/CheckoutForm/index-onepay.tsx\r\n trackBeginCheckout(productData, 4, platformProduct)\r\n }\r\n }\r\n}\r\n\r\nexport const trackPurchase = (\r\n productData: BuyCartData,\r\n purchaseData: BuyPurchaseData,\r\n saveToSessionStorage = false\r\n) => {\r\n const { tier, totalDiscount } = productData\r\n const cartItems = processCartData(productData)\r\n const buyType = getBuyType(purchaseData.userType)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems.map((item) => ({\r\n ...item,\r\n buy_type: buyType,\r\n })),\r\n },\r\n actionField: {\r\n transaction_id: purchaseData.transactionID,\r\n coupon: productData.couponCode || undefined,\r\n tax: purchaseData.calculatedTax,\r\n revenue: purchaseData.calculatedNetTotal,\r\n },\r\n plan: BillingPeriodTimePeriodMapper[productData.billingPeriod],\r\n buy_type: buyType,\r\n conversion_type: 'purchase',\r\n discount_tier: tier,\r\n discount_total: totalDiscount,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.PURCHASE, eventData }, saveToSessionStorage)\r\n}\r\n\r\nexport const trackPurchaseError = (errorMessage: string, plan: string, buyType: string) => {\r\n const eventData = {\r\n plan, // 'annual' or 'monthly'\r\n buy_type: buyType, // 'add-on' or 'direct buy'\r\n conversion_type: 'purchase', // static value, case-sensitive\r\n error_purchase_message: errorMessage,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_PURCHASE, eventData })\r\n}\r\n\r\nexport const trackCompleteBuy = (\r\n userType: string,\r\n userEmail: string,\r\n productData: BuyCartData,\r\n platformProduct: string,\r\n saveToSessionStorage = false\r\n) => {\r\n const eventData = {\r\n platform_product: platformProduct,\r\n buy_type: getBuyType(userType),\r\n plan: BillingPeriodTimePeriodMapper[productData.billingPeriod],\r\n conversion_type: 'purchase',\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData }, saveToSessionStorage)\r\n}\r\n\r\nexport const trackFormError = (formIds: string[], formErrors: string[], pageName: string) => {\r\n const eventData = {\r\n form_error_id: formIds.toString(),\r\n form_error_message: formErrors.toString(),\r\n form_name: getFormName(pageName),\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_FORM, eventData })\r\n}\r\n\r\nexport const trackUserInformation = (userType: string, userEmail: string, productData: BuyCartData) => {\r\n const eventData = {\r\n buy_type: getBuyType(userType),\r\n plan: BillingPeriodTimePeriodMapper[productData.billingPeriod],\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.USER_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackEmailValidation = (formName: string, userEmail: string) => {\r\n const eventData = {\r\n form_name: formName,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.EMAIL_VALIDATION, eventData })\r\n}\r\n\r\nexport const trackLogin = (userEmail: string) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.G2R, // TODO need to fix/possibly fixed in other branch\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.LOGIN, eventData })\r\n}\r\n\r\nexport const trackAbandonForm = () => {\r\n const eventData = {\r\n form_name: BUY_TRACKING_COMPONENTS.CHECKOUT_PAGE,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ABANDON_FORM, eventData })\r\n}\r\n","import { BuyErrorContent } from '@buy/state/checkout-form-container/state'\r\nimport * as Yup from 'yup'\r\nimport zxcvbn from 'zxcvbn'\r\nimport { isValidPostalCode } from '@common/utils/isValidPostalCode'\r\n\r\nconst emailValidation = (errorInvalidEmail: string, errorRequiredEmail?: string) => {\r\n return Yup.string()\r\n .required(errorRequiredEmail || errorInvalidEmail)\r\n .min(2, errorInvalidEmail)\r\n .email(errorInvalidEmail)\r\n .matches(\r\n new RegExp(\r\n \"^((?!(.+\\\\.\\\\.+))(?!(.+\\\\.@+))(?!(^\\\\.))([a-zA-Z_0-9-+!#\\\\$\\\\.\\\\*\\\\^']{1,63}))@((?:[a-zA-Z_0-9-]+\\\\.)*[a-zA-Z_0-9][a-zA-Z_0-9-]*)\\\\.([a-z]{2,})$\"\r\n ),\r\n errorInvalidEmail\r\n )\r\n}\r\n\r\nconst nameValidation = (requiredErrorMessage: string, invalidCharacterErrorMessage: string) => {\r\n return (\r\n Yup.string()\r\n .required(requiredErrorMessage)\r\n .min(2, requiredErrorMessage)\r\n // a to z, latin characters from dec 192 t0 214, 216 to 246 and 248 to 255,\r\n // https://blog.robertelder.org/character-ranges-class-negation-regular-expressions/\r\n // eslint-disable-next-line\r\n .matches(new RegExp(/^[\\p{L}0-9 !,()&.?‘'\\-+\\/]*$/gu), invalidCharacterErrorMessage)\r\n )\r\n}\r\n\r\nexport const passwordValidation = () => {\r\n return Yup.string()\r\n .required()\r\n .test((pw) => zxcvbn(pw).score >= 3)\r\n}\r\n\r\nconst addressValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst countryValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst zipcodeValidation = (country: string, errorRequiredPostalCode: string, errorInvalidPostalCode: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPostalCode)\r\n .min(3, errorInvalidPostalCode)\r\n .max(12, errorInvalidPostalCode)\r\n .test('ZipCodeRegEx', errorInvalidPostalCode, (value) => isValidPostalCode(country, value as string))\r\n}\r\n\r\nconst contactPhoneValidation = (errorInvalidCharacter: string, errorRequiredPhoneNumber: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPhoneNumber)\r\n .matches(new RegExp('^(?=(?:\\\\D*\\\\d){6}).*$'), errorInvalidCharacter)\r\n}\r\n\r\nconst taxNumberValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nexport const CheckoutSchema = (country: string, errorContent: BuyErrorContent) => {\r\n const {\r\n errorInvalidPhoneNumber,\r\n errorInvalidCharacter,\r\n errorInvalidEmail,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorRequiredCountry,\r\n errorRequiredEmail,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorRequiredTaxNumber,\r\n } = errorContent\r\n\r\n return Yup.object().shape({\r\n Email: emailValidation(errorInvalidEmail, errorRequiredEmail),\r\n FirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n LastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Password: passwordValidation(),\r\n BillingFirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n BillingLastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Street1: addressValidation(errorRequiredAddress),\r\n City: addressValidation(errorRequiredCity),\r\n CountryCode: countryValidation(errorRequiredCountry),\r\n StateCode: addressValidation(errorRequiredState),\r\n ZipCode: zipcodeValidation(country, errorRequiredPostalCode, errorInvalidPostalCode),\r\n ContactPhone: contactPhoneValidation(errorInvalidPhoneNumber, errorRequiredPhoneNumber),\r\n TaxNumber: taxNumberValidation(errorRequiredTaxNumber),\r\n TaxType: Yup.string(),\r\n CompanyName: Yup.string(),\r\n })\r\n}\r\n\r\nexport const checkAlphaNumerical = (value: string) => {\r\n return !!value.match(/^[A-Za-zÀ-ÖØ-öø-ÿ0-9]+$/) || value === ''\r\n}\r\n","import {\r\n BillingPeriod,\r\n CURRENCY,\r\n TimePeriod,\r\n COUPON_DISCOUNT_TYPE,\r\n COUPON_PAYMENT_PLAN,\r\n COUPON_TYPE,\r\n TimePeriodCouponPaymentPlanMapper,\r\n BillingPeriodCouponPaymentPlanMapper,\r\n} from '@common/constants'\r\n\r\nimport { CouponItem, CouponServerData } from '@common/state/coupon/state'\r\n\r\nimport {\r\n BuyCheckCouponProductsValidityParameters,\r\n BuyCouponProcessedDataPerSku,\r\n BuyCouponSkuValidity,\r\n BuyCouponState,\r\n} from '@buy/state/coupon/state'\r\n\r\nimport {\r\n BuyCouponCalculation,\r\n GetBuyProductItemsParameters,\r\n BuyProcessCouponDataParameters,\r\n BuyProductDetails,\r\n} from '@buy/state/coupon-util'\r\n\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { ADDONS, PRODUCT_PRICE_ITEM_TYPE } from '@buy/constants'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyProductPriceItem } from '@buy/state/calculate-price'\r\nimport { OrderSummaryLine } from '@buy/state/order-summary/order-summary'\r\nimport { getPrice } from './volume-components-helpers'\r\n\r\ninterface CouponCurrency {\r\n [currency: string]: number\r\n}\r\n\r\nexport interface CouponPaymentPlan {\r\n [paymentPlan: string]: CouponCurrency\r\n}\r\n\r\nexport interface CouponPriceSku {\r\n [sku: string]: CouponPaymentPlan\r\n}\r\n\r\nexport interface ValidCoupon {\r\n sku: string\r\n percent: number\r\n discount: number\r\n isReprice: boolean\r\n}\r\n\r\nexport const getActiveCouponServerData = (coupon: BuyCouponState, selectedPlan: BuyPlan) => {\r\n const { couponServerData, isUrlCouponActive, isCMSCouponActive } = coupon\r\n if (isUrlCouponActive) {\r\n return couponServerData\r\n }\r\n if (isCMSCouponActive && !isEmpty(selectedPlan?.activeCoupon)) {\r\n return selectedPlan.activeCoupon\r\n }\r\n return null\r\n}\r\n\r\nexport const getAvailableCouponServerData = (\r\n coupon: BuyCouponState,\r\n selectedPlan: BuyPlan\r\n): [CouponServerData | null, boolean] => {\r\n const { couponServerData, isUrlCouponCodeAvailable } = coupon\r\n if (!isEmpty(couponServerData) && isUrlCouponCodeAvailable) {\r\n return [couponServerData, true]\r\n }\r\n if (!isEmpty(selectedPlan?.activeCoupon)) {\r\n return [selectedPlan.activeCoupon, false]\r\n }\r\n return [null, false]\r\n}\r\n\r\nexport const isCouponDateValid = (start: string, end: string): boolean => {\r\n const startDate = new Date(start)\r\n const endDate = new Date(end)\r\n const currentDate = new Date()\r\n const currentDatems = currentDate.getTime()\r\n return currentDatems >= startDate.getTime() && currentDatems <= endDate.getTime()\r\n}\r\n\r\ninterface IsProductSkuAndPaymentPlanValidParameters {\r\n selectedProductSku: string\r\n couponValidationItemsMap: Map\r\n billingFrequency: TimePeriod\r\n}\r\ninterface CouponValidationItem {\r\n paymentPlan: Set\r\n}\r\n\r\nconst isProductSkuAndPaymentPlanValid = ({\r\n selectedProductSku,\r\n couponValidationItemsMap,\r\n billingFrequency,\r\n}: IsProductSkuAndPaymentPlanValidParameters): boolean => {\r\n const toCheckPaymentPlan = TimePeriodCouponPaymentPlanMapper[billingFrequency]\r\n if (couponValidationItemsMap.has(selectedProductSku)) {\r\n const { paymentPlan } = couponValidationItemsMap.get(selectedProductSku) as CouponValidationItem\r\n return paymentPlan.has(toCheckPaymentPlan)\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport const checkCouponGenericValidity = (couponServerData: CouponServerData): boolean => {\r\n const { isCouponValid, validFrom, validTo } = couponServerData\r\n return isCouponValid && isCouponDateValid(validFrom, validTo)\r\n}\r\n\r\nexport const processFixTypeCouponValidity = (couponSkuValidity: BuyCouponSkuValidity): BuyCouponSkuValidity => {\r\n const fixCouponSkuValidity = { ...couponSkuValidity }\r\n const isAnyCouponSkuInvalid = Object.keys(couponSkuValidity).some(\r\n (couponSku) => couponSkuValidity[couponSku] === false\r\n )\r\n if (isAnyCouponSkuInvalid) {\r\n Object.keys(fixCouponSkuValidity).forEach((couponSku) => {\r\n fixCouponSkuValidity[couponSku] = false\r\n })\r\n }\r\n return fixCouponSkuValidity\r\n}\r\n\r\n// temporary code for default coupon Sku validity\r\nexport const falsyCouponSkuValidity = (couponSkuValidity: BuyCouponSkuValidity): BuyCouponSkuValidity => {\r\n return Object.keys(couponSkuValidity).reduce((skuAcc, currentSku) => {\r\n return { ...skuAcc, [currentSku]: false }\r\n }, {} as BuyCouponSkuValidity)\r\n}\r\n\r\nexport const getCouponValidationItemsMap = (couponItems: CouponItem[]): Map => {\r\n const couponValidationItemsMap = new Map()\r\n couponItems.forEach((couponItem) => {\r\n const { productSku, paymentPlan } = couponItem\r\n if (!couponValidationItemsMap.has(productSku)) {\r\n const couponValidationItem: CouponValidationItem = { paymentPlan: new Set() }\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n }\r\n const couponValidationItem = couponValidationItemsMap.get(productSku) as CouponValidationItem\r\n couponValidationItem.paymentPlan.add(paymentPlan)\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n })\r\n return couponValidationItemsMap\r\n}\r\n\r\nexport const checkCouponProductsValidity = ({\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n}: BuyCheckCouponProductsValidityParameters): BuyCouponSkuValidity => {\r\n const { couponType, couponItems } = couponServerData\r\n const couponValidationItemsMap = getCouponValidationItemsMap(couponItems)\r\n const addonsValidity = selectedAddons.reduce((acc, selectedAddon) => {\r\n return {\r\n ...acc,\r\n [selectedAddon.sKU]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedAddon.sKU,\r\n couponValidationItemsMap,\r\n billingFrequency,\r\n }),\r\n }\r\n }, {})\r\n const couponSkuValidity: BuyCouponSkuValidity = {\r\n ...addonsValidity,\r\n [selectedPlanSku]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedPlanSku,\r\n couponValidationItemsMap,\r\n billingFrequency,\r\n }),\r\n }\r\n // need to add the fixed coupon processing here later\r\n return couponType === COUPON_TYPE.FLEXIBLE ? couponSkuValidity : falsyCouponSkuValidity(couponSkuValidity)\r\n}\r\n\r\nexport const checkIfCouponAppliedToMinimumSelectedProducts = (couponSkuValidity: BuyCouponSkuValidity): boolean => {\r\n return Object.values(couponSkuValidity).some((productValidity) => productValidity === true)\r\n}\r\n\r\nexport const calculateCouponDiscount = (\r\n couponDiscountType: COUPON_DISCOUNT_TYPE,\r\n productUnitPriceForCurrentTierWithBillingFrequency: number,\r\n couponDiscountAmount: number,\r\n productUnitPriceForBaseTierWithBillingFrequency: number\r\n): BuyCouponCalculation | null => {\r\n switch (couponDiscountType) {\r\n case COUPON_DISCOUNT_TYPE.AMOUNTOFF: {\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponDiscountAmount / productUnitPriceForCurrentTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n discountPercentage,\r\n couponAmountOff: couponDiscountAmount,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.PERCENTAGEOFF: {\r\n const couponAmountOff = (productUnitPriceForCurrentTierWithBillingFrequency * couponDiscountAmount) / 100\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponAmountOff\r\n return {\r\n discountPercentage: couponDiscountAmount,\r\n discountUnitPrice,\r\n couponAmountOff,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.REPRICE: {\r\n const discountUnitPrice =\r\n couponDiscountAmount < productUnitPriceForCurrentTierWithBillingFrequency ? couponDiscountAmount : 0\r\n if (discountUnitPrice === 0) {\r\n return null\r\n }\r\n const couponAmountOff = productUnitPriceForBaseTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponAmountOff / productUnitPriceForBaseTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n couponAmountOff,\r\n discountPercentage,\r\n }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport const getProductItemsMap = ({\r\n billingFrequency,\r\n organizers,\r\n selectedPlan,\r\n selectedCurrency = CURRENCY.USD,\r\n selectedAddons,\r\n selectedTierIndex,\r\n}: GetBuyProductItemsParameters): Map => {\r\n // Need to rework\r\n\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const productItemsMap: Map = new Map()\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const selectedPlanUnitPriceForCurrentTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'price'],\r\n 0\r\n )\r\n\r\n const selectedPlanUnitPriceForBaseTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'price'],\r\n 0\r\n )\r\n\r\n const annualMultiplier = isAnnual ? 12 : 1\r\n const selectedPlanProductDetails: BuyProductDetails = {\r\n quantity: organizers,\r\n unitPriceForCurrentTierWithBillingFrequency: selectedPlanUnitPriceForCurrentTier * annualMultiplier,\r\n unitPriceForBaseTierWithBillingFrequency: selectedPlanUnitPriceForBaseTier * annualMultiplier,\r\n }\r\n productItemsMap.set(selectedPlan.sKU, selectedPlanProductDetails)\r\n\r\n selectedAddons.forEach((addon) => {\r\n const { sKU, quantity } = addon\r\n const planAddons = selectedPlan.addons\r\n const filteredPlanAddons = planAddons.filter((planAddon) => planAddon.sKU === sKU)\r\n const planAddon = filteredPlanAddons[0]\r\n const planAddonPrice = get(planAddon, ['pricingInfo', selectedCurrency, 'price'], 0) as number\r\n const completePlanAddonPrice: number = planAddonPrice * annualMultiplier\r\n productItemsMap.set(sKU, {\r\n quantity,\r\n unitPriceForCurrentTierWithBillingFrequency: completePlanAddonPrice,\r\n unitPriceForBaseTierWithBillingFrequency: completePlanAddonPrice,\r\n })\r\n })\r\n return productItemsMap\r\n}\r\n\r\nexport const getCouponItemPriceMap = (\r\n couponServerData: CouponServerData,\r\n selectedCurrency: CURRENCY = CURRENCY.USD,\r\n billingPeriod: COUPON_PAYMENT_PLAN\r\n): Map => {\r\n const { couponItems } = couponServerData\r\n let isInvalid = false\r\n const couponItemsMap = new Map(\r\n couponItems\r\n .filter((couponItem) => couponItem.paymentPlan === billingPeriod)\r\n .map((couponItem) => {\r\n const { productSku, priceChanges } = couponItem\r\n const selectedCurrencyPriceChangeList = priceChanges.filter(\r\n (price) => price.currency === selectedCurrency\r\n )\r\n const selectedCurrencyPriceChange = selectedCurrencyPriceChangeList[0]\r\n if (!selectedCurrencyPriceChange) {\r\n isInvalid = true\r\n } else {\r\n isInvalid = false\r\n }\r\n return [productSku, selectedCurrencyPriceChange?.value]\r\n })\r\n )\r\n return isInvalid ? new Map() : couponItemsMap\r\n}\r\n\r\nexport const processCouponData = ({\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n}: BuyProcessCouponDataParameters): BuyCouponProcessedDataPerSku | null => {\r\n const productItemsEntries = [...productItemsMap.entries()]\r\n const couponDataPerSku: BuyCouponProcessedDataPerSku = {}\r\n\r\n productItemsEntries.forEach(([productSku, productDetail]) => {\r\n if (couponSkuValidity[productSku] && couponItemsMap.has(productSku)) {\r\n const { quantity, unitPriceForBaseTierWithBillingFrequency, unitPriceForCurrentTierWithBillingFrequency } =\r\n productDetail\r\n const couponDiscountAmount = couponItemsMap.get(productSku) as number\r\n const calculatedCouponDiscount = calculateCouponDiscount(\r\n couponDiscountType,\r\n unitPriceForCurrentTierWithBillingFrequency,\r\n couponDiscountAmount,\r\n unitPriceForBaseTierWithBillingFrequency\r\n )\r\n if (calculatedCouponDiscount === null || calculatedCouponDiscount.discountUnitPrice <= 0) {\r\n couponDataPerSku[productSku] = null\r\n } else {\r\n const { discountUnitPrice, couponAmountOff, discountPercentage } = calculatedCouponDiscount\r\n couponDataPerSku[productSku] = {\r\n discountPercentage,\r\n discountUnitPrice,\r\n discountUnitSavings: couponAmountOff,\r\n discountTotalPrice: discountUnitPrice * quantity,\r\n discountTotalSavings: couponAmountOff * quantity,\r\n }\r\n }\r\n } else {\r\n couponDataPerSku[productSku] = null\r\n }\r\n })\r\n return isEmpty(couponDataPerSku) ? null : couponDataPerSku\r\n}\r\n\r\nexport const getCouponDoubleDipAmountForNewUser = (productPrices: BuyProductPriceItem[]): number => {\r\n const couponDoubleDipAmount = productPrices.reduce((total, currentProductPrice) => {\r\n const { productSKU, type } = currentProductPrice\r\n if (type === PRODUCT_PRICE_ITEM_TYPE.product && productSKU === ADDONS.ADDITIONAL_NUMBERS) {\r\n return total + get(currentProductPrice, ['couponDiscount', 'amount'], 0)\r\n }\r\n return total\r\n }, 0)\r\n return couponDoubleDipAmount\r\n}\r\n\r\nexport const calculateCouponPrice = (type: string, originalPrice: number, value: number, isAnnual: boolean) => {\r\n if (type === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n return originalPrice * ((100 - value) / 100)\r\n }\r\n if (type === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n const localValue = isAnnual ? value / 12 : value\r\n const amountOff = originalPrice - localValue\r\n if (amountOff > 0) {\r\n return amountOff\r\n }\r\n return originalPrice\r\n }\r\n return isAnnual ? value / 12 : value\r\n}\r\n\r\nexport interface BuyCouponPrices {\r\n couponAnnualPrice: number\r\n couponMonthlyPrice: number\r\n}\r\n\r\nexport const getCouponPrices = (\r\n plan: BuyPlan,\r\n bossMonthlyPrice: number,\r\n bossAnnualPrice: number,\r\n couponState: BuyCouponState\r\n): BuyCouponPrices => {\r\n let couponMonthlyPrice = bossMonthlyPrice\r\n let couponAnnualPrice = bossAnnualPrice\r\n const couponData = getActiveCouponServerData(couponState, plan)\r\n const activeCoupon = couponData || plan.activeCoupon\r\n if (activeCoupon && activeCoupon.isCouponValid && activeCoupon.couponType !== COUPON_TYPE.FIX) {\r\n const thisPlansCoupons: CouponItem[] = activeCoupon.couponItems.filter(\r\n (planCoupon: CouponItem) => planCoupon.productSku === plan.sKU\r\n )\r\n thisPlansCoupons.forEach((thisCoupon) => {\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY) {\r\n couponMonthlyPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossMonthlyPrice,\r\n thisCoupon.priceChanges[0].value,\r\n false\r\n )\r\n }\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL) {\r\n couponAnnualPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossAnnualPrice,\r\n thisCoupon.priceChanges[0].value,\r\n true\r\n )\r\n }\r\n })\r\n }\r\n return { couponAnnualPrice, couponMonthlyPrice }\r\n}\r\n\r\nconst reMapCouponItemPricingData = (couponItems: CouponItem[]) => {\r\n const newCouponDataMap = new Map()\r\n couponItems.forEach((item) => {\r\n const currencyMap = new Map()\r\n item.priceChanges.forEach((item2) => {\r\n currencyMap.set(item2.currency, item2.value)\r\n })\r\n newCouponDataMap.set(item.paymentPlan, Object.fromEntries(currencyMap))\r\n })\r\n return Object.fromEntries(newCouponDataMap) as CouponPaymentPlan\r\n}\r\n\r\nconst getCouponSkuPrices = (sku: string, couponItems: CouponItem[]) => {\r\n const filteredCouponItems = couponItems.filter((item) => item.productSku === sku)\r\n const couponPrices = reMapCouponItemPricingData(filteredCouponItems || [])\r\n return couponPrices\r\n}\r\n\r\nconst getSkuPrice = (line: OrderSummaryLine, billingFrequency: BillingPeriod, isAddon?: boolean) => {\r\n if (!isAddon) {\r\n const price =\r\n getPrice(1, line.allPrices[billingFrequency]) * (billingFrequency === BillingPeriod.ANNUAL ? 12 : 1)\r\n return price\r\n }\r\n\r\n const price =\r\n getPrice(line.multiplier, line.allPrices[billingFrequency]) *\r\n (line.quantity || 0) *\r\n (billingFrequency === BillingPeriod.ANNUAL ? 12 : 1)\r\n return price\r\n}\r\n\r\nconst getCouponValue = (prices: CouponPaymentPlan, billingFrequency: BillingPeriod, currency: string) => {\r\n if (\r\n prices[BillingPeriodCouponPaymentPlanMapper[billingFrequency]] &&\r\n prices[BillingPeriodCouponPaymentPlanMapper[billingFrequency]][currency]\r\n )\r\n return prices[BillingPeriodCouponPaymentPlanMapper[billingFrequency]][currency]\r\n return 0\r\n}\r\n\r\nexport const processCouponCalculations = (\r\n line: OrderSummaryLine,\r\n discountType: COUPON_DISCOUNT_TYPE,\r\n billingFrequency: BillingPeriod,\r\n couponItems: CouponItem[],\r\n currency: string,\r\n isAddon?: boolean\r\n) => {\r\n const price = getCouponSkuPrices(line.key, couponItems)\r\n const skuPrice = getSkuPrice(line, billingFrequency, isAddon)\r\n const value = getCouponValue(price, billingFrequency, currency)\r\n\r\n const coupon: ValidCoupon = {\r\n sku: line.key,\r\n percent: value,\r\n discount: value,\r\n isReprice: false,\r\n }\r\n if (discountType === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n const discount = (value / 100) * skuPrice\r\n return { ...coupon, discount }\r\n }\r\n if (discountType === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n return { ...coupon, percent: 0 }\r\n }\r\n return coupon\r\n}\r\n","import { BuyFormData } from '@buy/state/buy-form/state'\r\nimport { isEmpty, isEqual } from 'lodash-es'\r\n\r\nlet previousFormValues: BuyFormData\r\n\r\nexport const isValidationAddressEligible = (formValues: BuyFormData, dontForceCompare?: boolean): boolean => {\r\n if (\r\n isEmpty(formValues.FirstName.trim()) ||\r\n isEmpty(formValues.LastName.trim()) ||\r\n isEmpty(formValues.Email.trim()) ||\r\n isEmpty(formValues.BillingFirstName.trim()) ||\r\n isEmpty(formValues.BillingLastName.trim())\r\n ) {\r\n return false\r\n }\r\n\r\n const hasFormValuesChanged = dontForceCompare ? true : !isEqual(previousFormValues, formValues)\r\n previousFormValues = formValues\r\n return hasFormValuesChanged\r\n}\r\n\r\nexport const isAddressComplete = (\r\n formValues: BuyFormData,\r\n isStatesOptional?: boolean,\r\n isTaxRequired?: boolean\r\n): boolean => {\r\n if (\r\n isEmpty(formValues.CountryCode.trim()) ||\r\n isEmpty(formValues.City.trim()) ||\r\n isEmpty(formValues.Street1.trim()) ||\r\n (!isStatesOptional && isEmpty(formValues.StateCode.trim())) ||\r\n (isTaxRequired && !formValues.TaxNumber) ||\r\n isEmpty(formValues.ZipCode.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { BuySavedSessionState } from '@buy/state/checkout/state'\r\nimport { OrderSummaryLine } from '@buy/state/order-summary/order-summary'\r\nimport { get, isEmpty, isNull, set } from 'lodash-es'\r\n\r\nexport const loadSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n if (serializedState === null && language === null) {\r\n return undefined\r\n }\r\n\r\n return {\r\n ...(serializedState && { coupon: JSON.parse(serializedState) }),\r\n ...(language && { language: JSON.parse(language) }),\r\n } as BuySavedSessionState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveSessionState = (state: BuySavedSessionState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n sessionStorage.setItem(STORAGE_CONST.GTC_COUPON_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearSessionState = () => {\r\n try {\r\n const coupon = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n\r\n if (coupon) sessionStorage.removeItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n if (language) sessionStorage.removeItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nconst getStore = () => {\r\n const buySessionStore = sessionStorage.getItem(STORAGE_CONST.BUY_CHECKOUT_STORE)\r\n const parsedStore: BuyFlexibleStoreState = !isNull(buySessionStore) ? JSON.parse(buySessionStore) : {}\r\n return parsedStore\r\n}\r\n\r\nexport const setCheckoutSessionState = (\r\n data: OrderSummaryLine | OrderSummaryLine[] | string | undefined,\r\n key: string,\r\n product: string,\r\n plan: string\r\n) => {\r\n const parsedStore = getStore()\r\n set(parsedStore, `${product}.${plan}.${key}`, data)\r\n sessionStorage.setItem(STORAGE_CONST.BUY_CHECKOUT_STORE, JSON.stringify(parsedStore))\r\n}\r\n\r\nexport const createOrUpdateCheckoutSessionState = (\r\n data: Record | string[],\r\n key: string,\r\n product: string,\r\n plan: string\r\n) => {\r\n const parsedStore = getStore()\r\n const existingData = get(parsedStore, `${product}.${plan}.${key}`)\r\n if (!isEmpty(existingData)) {\r\n const newData = { ...existingData, ...data }\r\n set(parsedStore, `${product}.${plan}.${key}`, newData)\r\n } else set(parsedStore, `${product}.${plan}.${key}`, data)\r\n sessionStorage.setItem(STORAGE_CONST.BUY_CHECKOUT_STORE, JSON.stringify(parsedStore))\r\n}\r\n\r\nexport const getCheckoutSessionState = (product: string, plan: string) => {\r\n const parsedStore = getStore()\r\n if (isEmpty(get(parsedStore, `${product}.${plan}`))) return undefined\r\n return parsedStore[product]![plan]!\r\n}\r\n\r\nexport const clearCheckoutSessionState = (product: string, plan?: string, lineType?: string) => {\r\n const parsedStore = getStore()\r\n if (isEmpty(plan)) {\r\n set(parsedStore, `${product}`, undefined)\r\n } else if (isEmpty(lineType)) {\r\n set(parsedStore, `${product}.${plan}`, undefined)\r\n } else {\r\n set(parsedStore, `${product}.${plan}.${lineType}`, undefined)\r\n }\r\n sessionStorage.setItem(STORAGE_CONST.BUY_CHECKOUT_STORE, JSON.stringify(parsedStore))\r\n}\r\n\r\nexport const SessionKeys = {\r\n baseLine: 'baseLine',\r\n additonalLines: 'additonalLines',\r\n addonLines: 'addonLines',\r\n volumeFields: 'volumeFields',\r\n addonFields: 'addonFields',\r\n billingTenure: 'billingTenure',\r\n}\r\n\r\ninterface BuyFlexibleStoreState {\r\n [key: string]: Record | undefined\r\n}\r\n\r\nexport interface SessionFieldData {\r\n baseLine: OrderSummaryLine | undefined\r\n additonalLines: OrderSummaryLine[] | undefined\r\n addonLines: OrderSummaryLine[] | undefined\r\n volumeFields: Record\r\n addonFields: Record\r\n billingTenure: string\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { BuySavedStoreState } from '@buy/state/checkout/state'\r\n\r\nexport const loadState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.BUY_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as BuySavedStoreState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveState = (state: BuySavedStoreState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n localStorage.setItem(STORAGE_CONST.BUY_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.BUY_STORE)\r\n\r\n if (serializedState) localStorage.removeItem(STORAGE_CONST.BUY_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const manuallyValidateFieldData = (fieldData: FieldProps) => {\r\n return (\r\n (!fieldData.meta.error && fieldData.meta.touched) ||\r\n (fieldData.meta.initialValue !== '' && !fieldData.meta.error)\r\n )\r\n}\r\n\r\nexport const scrollToError = () => {\r\n const top =\r\n document.getElementsByClassName('input__error')[0] ||\r\n document.getElementsByClassName('input-module__error')[0] ||\r\n document.getElementsByClassName('flex-field__flex-field--error')[0]\r\n if (top) {\r\n top.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\r\n }\r\n}\r\n","import { PRODUCT_PRICE_ITEM_TYPE } from '@buy/constants'\r\nimport { BuyAddon } from '@buy/state/add-on'\r\nimport { BuyProductPriceItem } from '@buy/state/calculate-price'\r\n\r\nexport const getTotalProratedAmount = (productPrices: BuyProductPriceItem[]): number => {\r\n let proratedAmount = 0\r\n if (productPrices) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product && productPriceItem.proratedAmount) {\r\n proratedAmount += productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n\r\nexport const getAddonProrateAmount = (productPrices?: BuyProductPriceItem[], addon?: BuyAddon) => {\r\n let proratedAmount = 0\r\n if (productPrices && addon) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.proratedAmount && productPriceItem.productSKU === addon.sKU) {\r\n proratedAmount = productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n","import { CURRENCY, TimePeriod, TimePeriodBillingPeriodMapper } from '@common/constants'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuyPrice, BuyPricing, BuyTiers } from '@buy/state/price'\r\n\r\nconst tierMap = new Map()\r\n\r\nexport const getSelectedTierIndex = (\r\n currentOrganizers: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n currency: CURRENCY\r\n) => {\r\n const { sKU = '', pricingInfo } = selectedPlan ?? {}\r\n const identifier = `${sKU}-${currency}-${billingFrequency}-${currentOrganizers}`\r\n if (!tierMap.get(identifier)) {\r\n const currencyPricing = (pricingInfo?.[currency as keyof BuyPrice] as BuyPricing) ?? []\r\n const billingFrequencyKey = TimePeriodBillingPeriodMapper[billingFrequency]\r\n const billingFrequencyTier = currencyPricing[billingFrequencyKey as keyof BuyPricing] ?? []\r\n\r\n const billingFrequencyTierKeys = Object.keys(billingFrequencyTier)\r\n\r\n billingFrequencyTierKeys.some((tierName, index) => {\r\n const tierData = billingFrequencyTier[tierName as keyof BuyTiers]\r\n if (currentOrganizers >= tierData.min && currentOrganizers <= tierData.max) {\r\n tierMap.set(identifier, index)\r\n return true\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return tierMap.get(identifier) as number\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@buy/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\n\r\ninterface PlanSubscriptions {\r\n basic?: BillingDetailedSubscriptionPlan\r\n standard?: BillingDetailedSubscriptionPlan\r\n trial?: BillingDetailedSubscriptionPlan\r\n}\r\n\r\n// get the remaining days + 1 so that today is included\r\nconst getRemainingDays = (end: string) => {\r\n const today = new Date().setHours(0, 0, 0, 0)\r\n const lastday = +new Date(end)\r\n\r\n return Math.floor((lastday - today) / (1000 * 60 * 60 * 24)) + 1\r\n}\r\n\r\nexport interface SubscriptionInfo {\r\n plan?: BillingDetailedSubscriptionPlan\r\n addons: BillingDetailedSubscriptionPlan[]\r\n includedAgents: number\r\n includedEndpoints: number\r\n remainingDays: number\r\n canUpgradePlan: boolean\r\n canUpgradeCameraShare: boolean\r\n canUpgradeEndpointProtection: boolean\r\n canUpgradeMobile: boolean\r\n isReplacementBooking: boolean\r\n billingFrequency: TimePeriod\r\n isTrial: boolean\r\n}\r\n\r\nexport const getSubscriptionInfo = (\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n plan: BuyPlan,\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n const planSubscriptions: PlanSubscriptions = {}\r\n const subscriptionInfo: SubscriptionInfo = {\r\n addons: [],\r\n includedAgents: 0,\r\n includedEndpoints: 0,\r\n remainingDays: 0,\r\n canUpgradePlan: true,\r\n canUpgradeCameraShare: true,\r\n canUpgradeEndpointProtection: true,\r\n canUpgradeMobile: true,\r\n isReplacementBooking: true,\r\n billingFrequency,\r\n isTrial: false,\r\n }\r\n\r\n if (!selectedPlan) {\r\n return subscriptionInfo\r\n }\r\n\r\n subscriptionInfo.includedAgents = selectedPlan.userAgentsIncludedAmount\r\n subscriptionInfo.includedEndpoints = selectedPlan.endpointsIncludedAmount\r\n\r\n if (!accountSubscriptions) {\r\n return subscriptionInfo\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.G2RE_STANDARD_NAME:\r\n case PRODUCT_SKU.GTR_STANDARD_NAMED_V2:\r\n planSubscriptions.standard = subscription\r\n break\r\n\r\n case PRODUCT_SKU.G2RE_BASIC_NAMED:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.GTR_REMOTE_ACCESS:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS:\r\n planSubscriptions.basic = subscription\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedAgents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedEndpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeMobile = false\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeCameraShare = false\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeEndpointProtection = false\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n planSubscriptions.trial = subscription\r\n }\r\n }\r\n })\r\n\r\n if (planSubscriptions.standard) {\r\n subscriptionInfo.plan = planSubscriptions.standard\r\n subscriptionInfo.canUpgradePlan = false\r\n } else if (planSubscriptions.basic) {\r\n subscriptionInfo.plan = planSubscriptions.basic\r\n } else if (planSubscriptions.trial) {\r\n subscriptionInfo.plan = planSubscriptions.trial\r\n subscriptionInfo.isTrial = true\r\n }\r\n\r\n if (subscriptionInfo.plan && !subscriptionInfo.isTrial) {\r\n const subscriptionBilling =\r\n subscriptionInfo.plan.paymentPlan === BILLING_TYPES.MONTHLY ? TimePeriod.Month : TimePeriod.Year\r\n\r\n subscriptionInfo.isReplacementBooking =\r\n subscriptionInfo.plan.productSku !== selectedPlan.sKU ||\r\n subscriptionInfo.billingFrequency !== subscriptionBilling\r\n\r\n subscriptionInfo.remainingDays = getRemainingDays(subscriptionInfo.plan.endDate)\r\n\r\n if (subscriptionInfo.plan.productSku !== selectedPlan.sKU) {\r\n // const subscribedPlan = plans.find((plan) => plan.sKU === subscriptionInfo.plan?.productSku)\r\n const subscribedPlan = plan.sKU === subscriptionInfo.plan?.productSku ? plan : null\r\n if (subscribedPlan) {\r\n const includedAgents =\r\n subscriptionInfo.includedAgents -\r\n selectedPlan.userAgentsIncludedAmount +\r\n subscribedPlan.userAgentsIncludedAmount\r\n const includedEndpoints =\r\n subscriptionInfo.includedEndpoints -\r\n selectedPlan.endpointsIncludedAmount +\r\n subscribedPlan.endpointsIncludedAmount\r\n\r\n subscriptionInfo.includedAgents =\r\n selectedPlan.userAgentsIncludedAmount > includedAgents\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents\r\n subscriptionInfo.includedEndpoints =\r\n selectedPlan.endpointsIncludedAmount > includedEndpoints\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints\r\n }\r\n }\r\n }\r\n\r\n return subscriptionInfo\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@buy/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { BuySelectedAddon, BuyAddon } from '@buy/state/add-on'\r\n\r\nconst createAgentAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.G2RE_STANDARD_NAME || type === PRODUCT_SKU.GTR_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_AGENT_ADDON\r\n : ADDON_SKUS.BASIC_AGENT_ADDON,\r\n\r\n quantity,\r\n})\r\n\r\nconst createEndpointAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.G2RE_STANDARD_NAME || type === PRODUCT_SKU.GTR_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_ENDPOINT_ADDON\r\n : ADDON_SKUS.BASIC_ENDPOINT_ADDON,\r\n\r\n quantity: quantity / ADDONS.ENDPOINTS_ADDONS_INTERVAL,\r\n})\r\n\r\nconst createMobileAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.MOBILE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createCameraAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.CAMERA_SHARE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createEndpointProtectionAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.ENDPOINT_PROTECTION_ADDON,\r\n quantity,\r\n})\r\n\r\nconst getReplacementBookingAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - includedAgents\r\n const endpointQuantity = endpoints - includedEndpoints\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (endpointQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpointQuantity))\r\n }\r\n\r\n if (mobileAddon || subscribedMobileAddon) {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n\r\n if (cameraAddon || subscribedCameraAddon) {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n\r\n if (endpointProtectionAddon || subscribedEndpointProtectionAddon) {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n subscribedAgents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - subscribedAgents - includedAgents\r\n const endpiontQuantity = endpoints - subscribedEndpoints - includedEndpoints\r\n\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpiontQuantity))\r\n }\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (mobileAddon) {\r\n if (subscribedMobileAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createMobileAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n }\r\n\r\n if (cameraAddon) {\r\n if (subscribedCameraAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createCameraAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n }\r\n\r\n if (endpointProtectionAddon) {\r\n if (subscribedEndpointProtectionAddon) {\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointProtectionAddon(endpiontQuantity))\r\n }\r\n } else {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getExtraAddons = (\r\n selectedPlan: BuyPlan,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const extraMobileAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.MOBILE_ADDON)\r\n const extraCameraAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.CAMERA_SHARE_ADDON)\r\n const extraEndpointProtectionAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON)\r\n const extraAddons = []\r\n\r\n if (subscribedMobileAddon && extraMobileAddon) {\r\n extraAddons.push(extraMobileAddon)\r\n } else if (mobileAddon) {\r\n extraAddons.push(mobileAddon)\r\n }\r\n\r\n if (subscribedCameraAddon && extraCameraAddon) {\r\n extraAddons.push(extraCameraAddon)\r\n } else if (cameraAddon) {\r\n extraAddons.push(cameraAddon)\r\n }\r\n\r\n if (subscribedEndpointProtectionAddon && extraEndpointProtectionAddon) {\r\n extraAddons.push(extraEndpointProtectionAddon)\r\n } else if (endpointProtectionAddon) {\r\n extraAddons.push(endpointProtectionAddon)\r\n }\r\n\r\n return extraAddons\r\n}\r\n\r\nconst subscribedStandardPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount + subscribedAgents,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount + subscribedEndpoints,\r\n addons: [] as BuySelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: false,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) {\r\n cart.addons = getAddons(\r\n PRODUCT_SKU.GTR_STANDARD_NAMED_V2,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n PRODUCT_SKU.GTR_STANDARD_NAMED_V2,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst subscribedBasicPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n basicPlan: BuyPlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const includedAgents = basicPlan.userAgentsIncludedAmount + subscribedAgents\r\n const includedEndpoints = basicPlan.endpointsIncludedAmount + subscribedEndpoints\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents:\r\n includedAgents < selectedPlan.userAgentsIncludedAmount\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents,\r\n\r\n includedEndpoints:\r\n includedEndpoints < selectedPlan.endpointsIncludedAmount\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints,\r\n\r\n addons: [] as BuySelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (\r\n (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) &&\r\n subscribedPlan.productSku === selectedPlan.sKU\r\n ) {\r\n cart.addons = getAddons(\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\nconst trialPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n ),\r\n extraAddons: getExtraAddons(selectedPlan, mobileAddon, cameraAddon, endpointProtectionAddon),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: true,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst newPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: BuyPlan,\r\n mobileAddon?: BuyAddon,\r\n cameraAddon?: BuyAddon,\r\n endpointProtectionAddon?: BuyAddon,\r\n urlPlan?: string\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n ),\r\n extraAddons: getExtraAddons(selectedPlan, mobileAddon, cameraAddon, endpointProtectionAddon),\r\n billingFrequency,\r\n canUpgradePlan: urlPlan?.toLowerCase() !== 'standard',\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: false,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nexport const getCartInfo = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n plan: BuyPlan,\r\n selectedPlan: BuyPlan,\r\n selectedExtraAddons: BuyAddon[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[],\r\n urlPlan?: string\r\n) => {\r\n // TODO: Changes needs to made based on unified config\r\n const mobileAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.MOBILE_ADDON)\r\n const cameraAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.CAMERA_SHARE_ADDON)\r\n const endpointProtectionAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.ENDPOINT_PROTECTION_ADDON)\r\n const subscribedInfo = {\r\n agents: 0,\r\n endpoints: 0,\r\n plan: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n mobileAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n cameraAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n endpointProtectionAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n hasTrial: false,\r\n }\r\n\r\n if (!accountSubscriptions?.length) {\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n urlPlan\r\n )\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.G2RE_STANDARD_NAME:\r\n case PRODUCT_SKU.GTR_STANDARD_NAMED_V2:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case PRODUCT_SKU.G2RE_BASIC_NAMED:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.GTR_REMOTE_ACCESS:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n subscribedInfo.agents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n subscribedInfo.endpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscribedInfo.mobileAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscribedInfo.cameraAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscribedInfo.endpointProtectionAddon = subscription\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n subscribedInfo.hasTrial = true\r\n }\r\n }\r\n })\r\n\r\n if (subscribedInfo.plan) {\r\n if (\r\n [PRODUCT_SKU.GTR_STANDARD_NAMED_V2, PRODUCT_SKU.G2RE_STANDARD_NAME].includes(\r\n subscribedInfo.plan.productSku as PRODUCT_SKU\r\n )\r\n ) {\r\n return subscribedStandardPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon\r\n )\r\n }\r\n if (\r\n [\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2,\r\n PRODUCT_SKU.GTR_REMOTE_ACCESS,\r\n PRODUCT_SKU.G2RE_BASIC_NAMED,\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS,\r\n ].includes(subscribedInfo.plan.productSku as PRODUCT_SKU)\r\n ) {\r\n // const basicPlan = plans.find((p) => p.sKU === subscribedInfo.plan?.productSku)\r\n const basicPlan = plan.sKU === subscribedInfo.plan?.productSku ? plan : null\r\n\r\n if (basicPlan) {\r\n // if(plan)\r\n return subscribedBasicPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n basicPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon\r\n )\r\n }\r\n }\r\n } else if (subscribedInfo.hasTrial) {\r\n return trialPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n )\r\n }\r\n\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n )\r\n}\r\n","import { LANGUAGE, STORAGE_CONST } from '@common/constants'\r\nimport { getSessionState } from '@common/utils'\r\n\r\nexport const getContentLanguage = () => getSessionState(STORAGE_CONST.SAVED_LANGUAGE) || LANGUAGE.EN\r\n","import { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { BuyPlan } from '@buy/state/plan'\r\nimport { PRODUCT_TYPES } from '@common/constants'\r\n\r\nexport const getUpgradingStatus = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n return accountSubscriptions && accountSubscriptions.length > 0\r\n}\r\n\r\nexport const getSubscriptionId = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n if (accountSubscriptions) {\r\n return accountSubscriptions.find((sub) => sub.planType === PRODUCT_TYPES.PAID && sub.status === 'Active')\r\n ?.subscriptionId\r\n }\r\n return undefined\r\n}\r\n\r\nexport const getSubscriptionMatch = (\r\n subscriptionId: number | undefined,\r\n selectedPlan: BuyPlan,\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n if (accountSubscriptions && subscriptionId) {\r\n return !!accountSubscriptions.find(\r\n (sub) => sub.subscriptionId === subscriptionId && sub.productSku === selectedPlan.sKU\r\n )\r\n }\r\n return false\r\n}\r\n","import { VolumeSelectorProperties } from '@buy/components/VolumeComponentWrapper'\r\nimport { FLEXIBLE_VOLUME_COMPONENT_TYPE } from '@buy/constants/flexible-components'\r\nimport { OrderSummaryLine } from '@buy/state/order-summary/order-summary'\r\nimport { BuyPrice, BuyPricing } from '@buy/state/price'\r\nimport { BillingPeriod, BillingPeriodCouponPaymentPlanMapper } from '@common/constants'\r\nimport { CouponItem } from '@common/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport const remapPricingObject = (pricingInfo: BuyPrice, currencyCode: string, repriceCouponItems?: CouponItem[]) => {\r\n const finalPricingMap = new Map()\r\n const rePriceCouponDiscounts: Record = {}\r\n if (pricingInfo[currencyCode]) {\r\n Object.keys(pricingInfo[currencyCode]).forEach((key) => {\r\n const tempPricingMap = new Map()\r\n Object.values(pricingInfo[currencyCode][key as keyof BuyPricing]).forEach((item, index) => {\r\n let itemPrice = item.price\r\n if (!isEmpty(repriceCouponItems) && index === 0) {\r\n const rePriceValue = repriceCouponItems\r\n ?.find(\r\n (item2) => item2.paymentPlan === BillingPeriodCouponPaymentPlanMapper[key as BillingPeriod]\r\n )\r\n ?.priceChanges.find((item3) => item3.currency === currencyCode)\r\n if (!isEmpty(rePriceValue)) {\r\n itemPrice = rePriceValue?.value ?? 0\r\n rePriceCouponDiscounts[key] = Math.abs(item.price - rePriceValue?.value)\r\n }\r\n }\r\n tempPricingMap.set(item.max, itemPrice)\r\n })\r\n finalPricingMap.set(key, Object.fromEntries(tempPricingMap))\r\n })\r\n }\r\n return {\r\n allPrices: Object.fromEntries(finalPricingMap),\r\n rePriceDiscounts: rePriceCouponDiscounts,\r\n }\r\n}\r\n\r\nexport const getPrice = (quantity: number, prices: Record) => {\r\n if (!isEmpty(prices)) {\r\n const matchedKey = Object.keys(prices).find((item) => quantity <= Number(item))\r\n return matchedKey ? prices[matchedKey] : 0\r\n }\r\n return 0\r\n}\r\n\r\nexport const getPriceTier = (quantity: number, prices: Record) => {\r\n if (!isEmpty(prices)) {\r\n const matchedKey = Object.keys(prices).findIndex((item) => quantity <= Number(item))\r\n return matchedKey ? matchedKey + 1 : 0\r\n }\r\n return 0\r\n}\r\n\r\nexport const getComponentType = (volumeSelector: VolumeSelectorProperties) => {\r\n if (!volumeSelector.quantityPerUnit && isEmpty(volumeSelector.customListValues))\r\n return FLEXIBLE_VOLUME_COMPONENT_TYPE.PLUSMINUS\r\n if (!isEmpty(volumeSelector.customListValues) || volumeSelector.quantityPerUnit)\r\n return FLEXIBLE_VOLUME_COMPONENT_TYPE.DROPDOWN\r\n return null\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n line: OrderSummaryLine,\r\n multiplier: number,\r\n billingPeriodKeys: string[],\r\n isAnnual: boolean\r\n) => {\r\n const months = isAnnual ? 12 : 1\r\n const leftToggleBillingPeriod = billingPeriodKeys.find((item) => item !== BillingPeriod.ANNUAL)!\r\n\r\n const pricingInfo = line.allPrices[isAnnual ? BillingPeriod.ANNUAL : leftToggleBillingPeriod]\r\n const baseVolumePrice = getPrice(1, pricingInfo) * multiplier * months\r\n const currentVolumePrice = getPrice(multiplier, pricingInfo) * multiplier * months\r\n return baseVolumePrice - currentVolumePrice\r\n}\r\n","import { TrackingState } from '@common/state/tracking/state'\r\nimport { gtcTrackingActions } from '@gtc/state/tracking/actions'\r\n\r\nexport const mapGTCTrackingState = () => {\r\n return {}\r\n}\r\n\r\nexport const mapGTCTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) => gtcTrackingActions.track(trackingInfo, component),\r\n}\r\n\r\nexport type GTCTrackingActionsType = typeof mapGTCTrackingActions\r\n\r\nexport interface GTCTrackingContextType {\r\n track: typeof mapGTCTrackingActions.track\r\n}\r\n","import React, { createContext, FunctionComponent } from 'react'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport {\r\n mapGTCTrackingActions,\r\n mapGTCTrackingState,\r\n GTCTrackingContextType,\r\n GTCTrackingActionsType,\r\n} from '@gtc/connectedComponents/Tracking/connector'\r\n\r\ntype GTCTrackingProps = GoToComponentProps, GTCTrackingActionsType>\r\n\r\nexport const GTCTrackingContext = createContext(null)\r\nexport const GTCTrackingProvider: FunctionComponent = ({ children, actions }) => {\r\n const trackingContextValue: GTCTrackingContextType = {\r\n track: actions.track,\r\n }\r\n return {children}\r\n}\r\n\r\nexport const ConnectedGTCTrackingProvider = connectRedux(\r\n GTCTrackingProvider,\r\n mapGTCTrackingState,\r\n mapGTCTrackingActions\r\n)\r\n","import { AppState } from 'app-store'\r\nimport { getContentData } from '@gtc/state/selectors'\r\nimport { FormatCurrencyState } from './state'\r\n\r\nexport const mapFormatCurrencyState = (state: AppState): FormatCurrencyState => {\r\n const { Locale, CurrencyCode } = getContentData(state)\r\n return {\r\n Locale,\r\n CurrencyCode,\r\n }\r\n}\r\n\r\nexport const mapFormatCurrencyActions = {}\r\n\r\nexport type FormatCurrencyActionsType = typeof mapFormatCurrencyActions\r\n","import React, { FunctionComponent } from 'react'\r\nimport { GoToComponentProps, connectRedux } from '@common/utils'\r\nimport { FormatCurrencyState } from '@gtc/connectedComponents/FormatCurrency/state'\r\nimport {\r\n FormatCurrencyActionsType,\r\n mapFormatCurrencyState,\r\n mapFormatCurrencyActions,\r\n} from '@gtc/connectedComponents/FormatCurrency/connector'\r\nimport { FormatCurrency } from '@common/components'\r\n\r\ntype FormatCurrencyProps = GoToComponentProps<\r\n FormatCurrencyState,\r\n FormatCurrencyActionsType,\r\n {\r\n value: number\r\n }\r\n>\r\n\r\nexport const FormatCurrencyGTC: FunctionComponent = ({ state, props }) => {\r\n return \r\n}\r\n\r\nexport const ConnectedFormatCurrency = connectRedux(FormatCurrencyGTC, mapFormatCurrencyState, mapFormatCurrencyActions)\r\n","import React, { FunctionComponent } from 'react'\r\nimport { GoToComponentProps, connectRedux } from '@common/utils'\r\nimport { FormatCurrencyState } from '@gtc/connectedComponents/FormatCurrency/state'\r\nimport {\r\n FormatCurrencyActionsType,\r\n mapFormatCurrencyState,\r\n mapFormatCurrencyActions,\r\n} from '@gtc/connectedComponents/FormatCurrency/connector'\r\nimport { FormatDecimalCurrency } from '@common/components'\r\n\r\ntype FormatDecimalCurrencyProps = GoToComponentProps<\r\n FormatCurrencyState,\r\n FormatCurrencyActionsType,\r\n {\r\n price: number\r\n }\r\n>\r\n\r\nconst FormatDecimalCurrencyGTC: FunctionComponent = ({ state, props }) => {\r\n return \r\n}\r\n\r\nexport const ConnectedFormatDecimalCurrency = connectRedux(\r\n FormatDecimalCurrencyGTC,\r\n mapFormatCurrencyState,\r\n mapFormatCurrencyActions\r\n)\r\n","import { locationActions } from '@common/state/location/actions'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { AppState } from 'app-store'\r\nimport { SC_SITE } from '@common/constants'\r\nimport { InternationalBlockerViewState } from './state'\r\n\r\nexport const mapInternationalBlockerState = (state: AppState): InternationalBlockerViewState => {\r\n const { isLocationInfoLoaded, isCountriesLoaded, isUserCountryAllowed } = getLocationState(state)\r\n\r\n return { isLocationInfoLoaded, isCountriesLoaded, isUserCountryAllowed }\r\n}\r\n\r\nexport const mapInternationalBlockerActions = {\r\n getCountries: () => locationActions.getCountries(SC_SITE.CONNECT),\r\n getLocationInfo: () => locationActions.getLocationInfo(),\r\n getIsUserCountryAllowed: () => locationActions.getIsUserCountryAllowed(),\r\n setIsUserCountryAllowed: (isUserCountryAllowed: boolean) =>\r\n locationActions.setIsUserCountryAllowed(isUserCountryAllowed, 'modal'),\r\n}\r\n\r\nexport type InternationalBlockerType = typeof mapInternationalBlockerActions\r\n","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"international-blocker__header\",\"body\":\"international-blocker__body\"};","import React, { FunctionComponent, useEffect } from 'react'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport {\r\n mapInternationalBlockerActions,\r\n mapInternationalBlockerState,\r\n InternationalBlockerType,\r\n} from '@gtc/connectedComponents/InternationalBlocker/connector'\r\nimport { ConnectedModal } from '@common/connectedComponents'\r\nimport { CommonButton, ConvertStringToReact } from '@common/components'\r\nimport { InternationalBlockerLabels } from '@gtc/state/international-blocker-labels'\r\n\r\nimport { InternationalBlockerViewState } from '@gtc/connectedComponents/InternationalBlocker/state'\r\n\r\nimport styles from './international-blocker.css'\r\n\r\ntype InternationalBlockerProps = GoToComponentProps<\r\n InternationalBlockerViewState,\r\n InternationalBlockerType,\r\n {\r\n labels: InternationalBlockerLabels\r\n isClosable: boolean\r\n }\r\n>\r\n\r\nconst InternationalBlocker: FunctionComponent = ({ state, actions, props }) => {\r\n const { isLocationInfoLoaded, isCountriesLoaded, isUserCountryAllowed } = state\r\n\r\n const {\r\n notAvailableModalHeader,\r\n notAvailableModalContent,\r\n notAvailableModalButtonText,\r\n notAvailableModalButtonUrl,\r\n } = props.labels\r\n\r\n useEffect(() => {\r\n if (!isLocationInfoLoaded) {\r\n actions.getLocationInfo()\r\n }\r\n if (!isCountriesLoaded) {\r\n actions.getCountries()\r\n }\r\n\r\n if (isLocationInfoLoaded && isCountriesLoaded) {\r\n actions.getIsUserCountryAllowed()\r\n }\r\n }, [isLocationInfoLoaded, isCountriesLoaded, actions])\r\n\r\n return (\r\n actions.setIsUserCountryAllowed(true)}\r\n >\r\n

{notAvailableModalHeader}

\r\n
\r\n

\r\n \r\n

\r\n
\r\n \r\n {notAvailableModalButtonText}\r\n \r\n \r\n )\r\n}\r\n\r\nconst ConnectedInternationalBlocker = connectRedux(\r\n InternationalBlocker,\r\n mapInternationalBlockerState,\r\n mapInternationalBlockerActions\r\n)\r\n\r\nexport { ConnectedInternationalBlocker }\r\n","import { AppState } from 'app-store'\r\nimport { buyFormActions } from '@gtc/state/buy-form/actions'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { getBuyFormState, getLabelContent } from '@gtc/state/selectors'\r\nimport { CheckoutFormContainerState } from '../../state/checkout-form-container/state'\r\n\r\nexport const mapCheckoutFormContainerState = (state: AppState): CheckoutFormContainerState => {\r\n const {\r\n errorInvalidCharacter,\r\n errorInvalidCVV,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorInvalidPassword,\r\n errorInvalidPhoneNumber,\r\n errorInvalidTaxNumber,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorInvalidCreditCardNumber,\r\n emailAddressAlreadyInUse,\r\n errorRequiredCVV,\r\n errorRequiredCountry,\r\n errorRequiredCreditCardNumber,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPassword,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorGenericMessage,\r\n errorInvalidAddress,\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n } = getLabelContent(state)\r\n const { initialData } = getBuyFormState(state)\r\n\r\n return {\r\n errorContent: {\r\n errorInvalidCharacter,\r\n errorInvalidCVV,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorInvalidPassword,\r\n errorInvalidPhoneNumber,\r\n errorInvalidTaxNumber,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorInvalidCreditCardNumber,\r\n emailAddressAlreadyInUse,\r\n errorRequiredCVV,\r\n errorRequiredCountry,\r\n errorRequiredCreditCardNumber,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPassword,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorGenericMessage,\r\n errorInvalidAddress,\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n },\r\n initialData,\r\n }\r\n}\r\n\r\nexport const mapCheckoutFormContainerActions = {\r\n updateInitialFormState: (data: BuyFormData) => buyFormActions.updateInitialFormState(data),\r\n}\r\nexport type CheckoutFormContainerActionsType = typeof mapCheckoutFormContainerActions\r\n","import { AppState } from 'app-store'\r\nimport { locationActions } from '@common/state/location/actions'\r\nimport { flexActions } from '@common/state/flex/actions'\r\nimport { buyFormActions } from '@gtc/state/buy-form/actions'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport {\r\n getFatalError,\r\n getFlexState,\r\n getMarketingState,\r\n getCheckoutState as getCommonCheckoutState,\r\n} from '@common/state/selectors'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { getCurrentPlan } from '@gtc/utils/get-current-plan'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { marketingActions } from '@common/state/marketing/actions'\r\nimport { getLabelContent, getCheckoutState, getUserState, getBuyFormState, getPlanData } from '@gtc/state/selectors'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { checkoutActions as commonCheckoutActions } from '@common/state/checkout/actions'\r\nimport { CheckoutFormState } from './state'\r\n\r\nexport const mapCheckoutFormState = (state: AppState): CheckoutFormState => {\r\n const {\r\n signIn,\r\n changePaymentMethodModalHeader,\r\n changePaymentMethodModalSubheader,\r\n modalCloseButtonText,\r\n showMe,\r\n numberPickerFailedToOrderPhoneNumberModalHeader,\r\n numberPickerFailedToOrderPhoneNumberModalSubHeader,\r\n numberPickerFailedToOrderPhoneNumberModalCloseButtonText,\r\n } = getLabelContent(state)\r\n\r\n const { selectedPlanSku, billingFrequency, didFailToOrderPhoneNumber } = getCheckoutState(state)\r\n const planData: Plan[] = getPlanData(state)\r\n const selectedPlan = getCurrentPlan(selectedPlanSku, planData)\r\n const { userInteractedWithFlexField, isCardValid, isCvvValid } = getFlexState(state)\r\n const {\r\n userType,\r\n existingPaymentInformation,\r\n loggedIn: { isUserLoggedIn },\r\n } = getUserState(state)\r\n const { clearEmail } = getBuyFormState(state)\r\n const { isFatalError } = getFatalError(state)\r\n const { isUserOptOut } = getMarketingState(state)\r\n const { inlineErrors } = getCommonCheckoutState(state)\r\n\r\n return {\r\n content: {\r\n signIn,\r\n changePaymentMethodModalHeader,\r\n changePaymentMethodModalSubheader,\r\n modalCloseButtonText,\r\n showMe,\r\n numberPickerFailedToOrderPhoneNumberModalHeader,\r\n numberPickerFailedToOrderPhoneNumberModalSubHeader,\r\n numberPickerFailedToOrderPhoneNumberModalCloseButtonText,\r\n },\r\n clearEmail,\r\n userInteractedWithFlexField,\r\n selectedPlan,\r\n isUserLoggedIn,\r\n isFatalError,\r\n userType,\r\n existingPaymentInformation,\r\n isUserOptOut,\r\n billingFrequency,\r\n didFailToOrderPhoneNumber,\r\n inlineErrors,\r\n isCardValid,\r\n isCvvValid,\r\n }\r\n}\r\n\r\nexport const mapCheckoutFormActions = {\r\n setUserInteractedWithFlexFieldCvv: (interacted: boolean) =>\r\n flexActions.setUserInteractedWithFlexFieldCvv(interacted),\r\n setUserInteractedWithFlexField: (interacted: boolean) => flexActions.setUserInteractedWithFlexField(interacted),\r\n submitForm: (values: BuyFormData) => buyFormActions.submitForm(values),\r\n existingUserSubmitForm: (isAddonFlow: boolean) => buyFormActions.existingUserSubmitForm(isAddonFlow),\r\n validateAddress: (values: BuyFormData) => locationActions.validateAddress(values),\r\n calculatePrice: (values: BuyFormData) => checkoutActions.calculatePrice(values),\r\n setFatalError: (isFatalError: boolean) => fatalErrorActions.setFatalError(isFatalError),\r\n setIsUserOptOut: (isUserOutOut: boolean) => marketingActions.setIsUserOptOut(isUserOutOut),\r\n setCheckoutFormInlineError: (value: string) => commonCheckoutActions.setCheckoutFormInlineError(value),\r\n removeCheckoutFormInlineError: (value: string) => commonCheckoutActions.removeCheckoutFormInlineError(value),\r\n}\r\n\r\nexport type CheckoutFormActionsType = typeof mapCheckoutFormActions\r\n","export enum TRIAL_ERROR_CODES {\r\n INVALID_CODE = 'invalid.token.code',\r\n TOKEN_EXPIRED = 'token.expired',\r\n}\r\n\r\nexport enum TRIAL_ERROR_STATE {\r\n TIMEOUT = 'timeout',\r\n ALREADY_USER = 'already.user',\r\n EXPIRED_CODE = 'expired.code',\r\n WRONG_CODE = 'wrong.code',\r\n NO_PROVISIONING = 'failed.provisioning',\r\n USER_BANNED = 'banned',\r\n GENERIC_ERROR = 'generic.error',\r\n DECISION_MAKER_FAIL = 'decision.maker.fail',\r\n NO_ERROR = 'none',\r\n}\r\n\r\nexport enum TRIAL_ERROR_IDS {\r\n FATAL_ERROR = 'FATAL_ERROR',\r\n ADRESS_ERROR = 'ADRESS_ERROR',\r\n CARD_ERROR = 'CARD_ERROR',\r\n USER_BANNED = 'USER_BANNED',\r\n EXISTING_TRIAL = 'EXISTING_TRIAL',\r\n EXISTING_USER = 'EXISTING_USER',\r\n GENERIC_ERROR = 'GENERIC_ERROR',\r\n}\r\n\r\nexport enum TRIAL_START_ERROR_CODES {\r\n EXPIRED_TRIAL = 'restart.trialsubscription',\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"submit-blocker\":\"checkout-form-module__submit-blocker\"};","import React, { FunctionComponent, useState, useEffect, useCallback } from 'react'\r\nimport { Form, FormikProps } from 'formik'\r\nimport { CommonButton, ConvertStringToReact, LoadingSpinner } from '@common/components'\r\nimport { useNavigate } from 'react-router-dom'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { getSessionState, saveSessionState, connectRedux, GoToComponentProps, scrollToTop } from '@common/utils'\r\nimport {\r\n mapCheckoutFormState,\r\n mapCheckoutFormActions,\r\n CheckoutFormActionsType,\r\n} from '@gtc/connectedComponents/CheckoutForm/connector'\r\nimport { isAddressComplete, isValidationAddressEligible } from '@gtc/utils'\r\nimport {\r\n ConnectedAccountFormInfo,\r\n AccountFormInfoComponentProps,\r\n ConnectedBillingFormInfo,\r\n BillingFormInfoComponentProps,\r\n ConnectedPaymentFormInfo,\r\n PaymentFormInfoComponentProps,\r\n ConnectedCheckoutFormSubmission,\r\n CheckoutFormSubmissionComponentProps,\r\n} from '@gtc/connectedComponents'\r\nimport { CheckoutFormState } from '@gtc/connectedComponents/CheckoutForm/state'\r\nimport { ConnectedModal } from '@common/connectedComponents/Modal'\r\nimport {\r\n CHECKOUTFORM_FIELDS,\r\n CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES,\r\n PARTIAL_NON_VALIDATION_USER_TYPES,\r\n USER_TYPES,\r\n} from '@gtc/constants'\r\nimport { TRIAL_ERROR_IDS } from '@gtc/constants/error-strings'\r\nimport { useCheckoutFormPageTracking } from '@gtc/hooks'\r\nimport { ErrorContent } from '@gtc/state/checkout-form-container/state'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker'\r\nimport { GTC_VIEW_PATHS } from '@common/constants'\r\nimport checkoutStyles from './checkout-form.module.css'\r\n\r\ntype CheckoutFormProps = GoToComponentProps<\r\n CheckoutFormState,\r\n CheckoutFormActionsType,\r\n {\r\n isTabletOrMobileView?: boolean\r\n isMobileView?: boolean\r\n initialData: BuyFormData\r\n errorContent: ErrorContent\r\n formikRef: React.RefObject>\r\n setHasAddressValidationErrors: React.Dispatch>\r\n setGeneralFieldErrors: React.Dispatch>\r\n setHasCardValidationErrors: React.Dispatch>\r\n hasAddressValidationErrors: boolean\r\n generalFieldErrors: boolean\r\n hasCardValidationErrors: boolean\r\n contentNumberPicker: NumberPickerContent\r\n isSubmittingRef: React.RefObject\r\n }\r\n>\r\n\r\nconst CheckoutForm: FunctionComponent = ({ state, actions, props }) => {\r\n const {\r\n userInteractedWithFlexField,\r\n isUserOptOut: initialIsOptOut,\r\n didFailToOrderPhoneNumber,\r\n inlineErrors,\r\n } = state\r\n const {\r\n formikRef,\r\n setHasAddressValidationErrors,\r\n setGeneralFieldErrors,\r\n setHasCardValidationErrors,\r\n hasCardValidationErrors,\r\n generalFieldErrors,\r\n hasAddressValidationErrors,\r\n isSubmittingRef,\r\n } = props\r\n\r\n const { setCheckoutFormInlineError, removeCheckoutFormInlineError } = actions\r\n\r\n const navigate = useNavigate()\r\n const [isSubmitting, setIsSubmitting] = useState(false)\r\n const [useSameForBilling, setUseSameForBilling] = useState(true)\r\n const [isOptOut, setIsOptOut] = useState(initialIsOptOut)\r\n const [isFormReset, setIsFormReset] = useState(false)\r\n const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false)\r\n\r\n const hasExistingPaymentInformation = !isEmpty(state.existingPaymentInformation)\r\n const isAddonFlow =\r\n state.isUserLoggedIn &&\r\n (state.userType === USER_TYPES.ADDON ||\r\n (state.userType === USER_TYPES.EXPIRED && hasExistingPaymentInformation))\r\n const isCrossProductFlow =\r\n (state.isUserLoggedIn && state.userType === USER_TYPES.CROSSPRODUCT && hasExistingPaymentInformation) ||\r\n (state.isUserLoggedIn && state.userType === USER_TYPES.TRIALER && hasExistingPaymentInformation)\r\n const isTrialUser =\r\n state.userType === USER_TYPES.IDENTITY_ONLY ||\r\n (state.userType === USER_TYPES.TRIALER && !hasExistingPaymentInformation) ||\r\n (state.userType === USER_TYPES.CROSSPRODUCT && !hasExistingPaymentInformation)\r\n const isExpiredTrialUser = state.userType === USER_TYPES.EXPIRED\r\n\r\n const resetFieldTouched = useCallback(() => {\r\n if (formikRef.current) {\r\n Object.keys(formikRef.current.values).forEach((fieldKey) => {\r\n formikRef.current?.setFieldTouched(fieldKey, false)\r\n })\r\n }\r\n }, [formikRef])\r\n\r\n const canValidateAddress = (values: BuyFormData) => {\r\n // for later: need to send a new FormData object with billing first name and billing last name instead of FN & LN\r\n if (isValidationAddressEligible(values) && isAddressComplete(values)) {\r\n actions.validateAddress(values)\r\n actions.calculatePrice(values)\r\n }\r\n }\r\n\r\n const resetFatalError = () => {\r\n if (isFormReset && state.isFatalError) {\r\n actions.setFatalError(false)\r\n setIsFormReset(false)\r\n }\r\n }\r\n\r\n // tracking\r\n const { trackFormError, trackBillingInfoStep, trackPaymentStep, trackSubmitForm } = useCheckoutFormPageTracking({\r\n planName: state.selectedPlan.name,\r\n formikRef,\r\n })\r\n\r\n const submitForm = (formValues: BuyFormData) => {\r\n try {\r\n const qualtricsDataGtc = getSessionState('qualtrics_data_gtc')\r\n saveSessionState('qualtrics_data_gtc', {\r\n ...(!qualtricsDataGtc ? {} : qualtricsDataGtc),\r\n userEmail: formValues.Email,\r\n })\r\n } catch (err) {\r\n console.error(err)\r\n }\r\n setIsSubmitting(true)\r\n actions.setIsUserOptOut(isOptOut)\r\n if (!userInteractedWithFlexField) {\r\n actions.setUserInteractedWithFlexField(true)\r\n }\r\n actions.submitForm(formValues)\r\n trackSubmitForm()\r\n }\r\n\r\n const onFormErrors = (formIds: string[], formErrors: string[]) => {\r\n scrollToTop()\r\n setGeneralFieldErrors(true)\r\n trackFormError(formIds, formErrors)\r\n }\r\n\r\n const preSubmit = () => {\r\n if (hasAddressValidationErrors || hasCardValidationErrors) {\r\n scrollToTop()\r\n if (hasCardValidationErrors) {\r\n trackFormError([TRIAL_ERROR_IDS.CARD_ERROR], ['invalid credit card'])\r\n }\r\n if (hasAddressValidationErrors) {\r\n trackFormError([TRIAL_ERROR_IDS.ADRESS_ERROR], ['invalid billing address'])\r\n }\r\n } else if (isAddonFlow || isCrossProductFlow) {\r\n setIsSubmitting(true)\r\n trackSubmitForm()\r\n actions.existingUserSubmitForm(isAddonFlow)\r\n // set globally if the user is optout of marketing material\r\n actions.setIsUserOptOut(isOptOut)\r\n } else if (formikRef.current) {\r\n formikRef.current.validateForm().then((errors) => {\r\n const errorList = Object.keys(errors)\r\n if (!state.isCardValid) {\r\n actions.setUserInteractedWithFlexField(true)\r\n }\r\n if (!state.isCvvValid) {\r\n actions.setUserInteractedWithFlexFieldCvv(true)\r\n }\r\n if (errors.Password && formikRef?.current) {\r\n formikRef.current.touched.Password = true\r\n }\r\n if (errorList.length > 0) {\r\n if (isTrialUser || isExpiredTrialUser) {\r\n const trialUserValidErrors = Object.entries(errors).filter(\r\n (errorField) => errorField[0] !== CHECKOUTFORM_FIELDS.PASSWORD\r\n )\r\n if (Object.keys(trialUserValidErrors).length > 0) {\r\n const trialUserValidErrorValues = trialUserValidErrors.map(\r\n (fieldErrorTuple) => fieldErrorTuple[1]\r\n )\r\n const trialUserValidErrorKeys = trialUserValidErrors.map(\r\n (fieldErrorTuple) => fieldErrorTuple[0]\r\n )\r\n onFormErrors(trialUserValidErrorKeys, trialUserValidErrorValues as string[])\r\n } else if (formikRef.current) submitForm(formikRef.current.values)\r\n } else {\r\n onFormErrors(Object.keys(errors), Object.values(errors) as string[])\r\n }\r\n } else if (formikRef.current) {\r\n submitForm(formikRef.current.values)\r\n }\r\n })\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (!Object.keys(inlineErrors).length) {\r\n setGeneralFieldErrors(false)\r\n }\r\n }, [inlineErrors, setGeneralFieldErrors])\r\n\r\n useEffect(() => {\r\n if (state.userType === USER_TYPES.ADDON && formikRef.current) {\r\n actions.calculatePrice(formikRef.current.values)\r\n }\r\n }, [state.userType, actions, formikRef])\r\n\r\n // show form errors by scrolling to top\r\n useEffect(() => {\r\n const errorsInForm = generalFieldErrors || hasAddressValidationErrors\r\n if (errorsInForm) {\r\n scrollToTop()\r\n setIsSubmitting(false)\r\n }\r\n }, [hasAddressValidationErrors, generalFieldErrors])\r\n\r\n // reset the form and reset the states affected by checkout form\r\n useEffect(() => {\r\n if (state.isFatalError && formikRef.current) {\r\n scrollToTop()\r\n formikRef.current.setSubmitting(false)\r\n setIsSubmitting(false)\r\n resetFieldTouched()\r\n formikRef.current.setFieldValue(CHECKOUTFORM_FIELDS.EXPIRATION_DATE, '')\r\n setHasAddressValidationErrors(false)\r\n setHasCardValidationErrors(false)\r\n setGeneralFieldErrors(false)\r\n setIsFormReset(true)\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [actions, formikRef, isFormReset, resetFieldTouched, state.isFatalError])\r\n\r\n // validate the non empty entries after populating\r\n useEffect(() => {\r\n if (state.userType !== USER_TYPES.ADDON) {\r\n Object.entries(props.initialData).forEach(([formField, formValue]) => {\r\n // ignore empty fields and the country field\r\n if (formValue !== '' && formField !== CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES.COUNTRYCODE) {\r\n // if the user is a trialer, crossproduct, expired, banned\r\n // then dont validate the identity and address fields\r\n if (\r\n !(\r\n Object.values(PARTIAL_NON_VALIDATION_USER_TYPES).includes(\r\n state.userType as PARTIAL_NON_VALIDATION_USER_TYPES\r\n ) &&\r\n Object.values(CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES).includes(\r\n formField as CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES\r\n )\r\n )\r\n ) {\r\n if (formikRef.current) {\r\n formikRef.current.validateField(formField)\r\n }\r\n }\r\n }\r\n })\r\n }\r\n }, [formikRef, props.initialData, state.userType])\r\n\r\n // if the billing frequency changes, recalculate the cost\r\n useEffect(() => {\r\n if (formikRef.current && isAddressComplete(formikRef.current.values)) {\r\n actions.calculatePrice(formikRef.current.values)\r\n }\r\n }, [actions, formikRef, state.billingFrequency])\r\n\r\n // for trial and expired trial user, set billing FN and LN to avoid validation error\r\n useEffect(() => {\r\n if ((isTrialUser || isExpiredTrialUser) && useSameForBilling && formikRef.current) {\r\n formikRef.current.setFieldValue(CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME, props.initialData.FirstName)\r\n formikRef.current.setFieldValue(CHECKOUTFORM_FIELDS.BILLING_LAST_NAME, props.initialData.LastName)\r\n }\r\n }, [isTrialUser, useSameForBilling, props.initialData, isExpiredTrialUser, formikRef])\r\n\r\n // after submitting, if the purchase succeeds but the number order fails, then a modal shows up, so hide the loading spinner\r\n useEffect(() => {\r\n if (didFailToOrderPhoneNumber) {\r\n setIsSubmitting(false)\r\n }\r\n }, [didFailToOrderPhoneNumber])\r\n\r\n const accountInfoProps: AccountFormInfoComponentProps = {\r\n useSameForBilling,\r\n resetFatalError,\r\n canValidateAddress,\r\n formikRef,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n isSubmittingRef,\r\n }\r\n\r\n const billingInfoProps: BillingFormInfoComponentProps = {\r\n useSameForBilling,\r\n resetFatalError,\r\n canValidateAddress,\r\n setUseSameForBilling,\r\n trackBillingInfoStep,\r\n setHasAddressValidationErrors,\r\n formikRef,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n }\r\n\r\n const paymentInfoProps: PaymentFormInfoComponentProps = {\r\n resetFatalError,\r\n hasExistingPaymentInformation,\r\n setIsPaymentModalOpen,\r\n trackPaymentStep,\r\n setHasCardValidationErrors,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n }\r\n\r\n const checkoutSubmissionProps: CheckoutFormSubmissionComponentProps = {\r\n isSubmitting,\r\n preSubmit,\r\n isTabletOrMobileView: props.isTabletOrMobileView,\r\n setIsOptOut,\r\n isOptOut,\r\n contentNumberPicker: props.contentNumberPicker,\r\n inlineErrors,\r\n }\r\n\r\n const handleDidFailToOrderPhoneNumberModalClose = () => {\r\n navigate(GTC_VIEW_PATHS.CONNECT_NEXT_STEPS)\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n {!state.isUserLoggedIn && }\r\n \r\n \r\n \r\n \r\n\r\n setIsPaymentModalOpen(false)}>\r\n
\r\n

{state.content.changePaymentMethodModalHeader}

\r\n
\r\n \r\n
\r\n setIsPaymentModalOpen(false)}>\r\n {state.content.modalCloseButtonText}\r\n \r\n
\r\n
\r\n\r\n handleDidFailToOrderPhoneNumberModalClose()}\r\n >\r\n
\r\n

{state.content.numberPickerFailedToOrderPhoneNumberModalHeader}

\r\n

{state.content.numberPickerFailedToOrderPhoneNumberModalSubHeader}

\r\n handleDidFailToOrderPhoneNumberModalClose()}\r\n >\r\n {state.content.numberPickerFailedToOrderPhoneNumberModalCloseButtonText}\r\n \r\n
\r\n \r\n\r\n {isSubmitting && }\r\n \r\n )\r\n}\r\n\r\nexport const ConnectedCheckoutForm = connectRedux(CheckoutForm, mapCheckoutFormState, mapCheckoutFormActions)\r\n","import { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport {\r\n CheckoutFormContainerActionsType,\r\n mapCheckoutFormContainerActions,\r\n mapCheckoutFormContainerState,\r\n} from '@gtc/connectedComponents/CheckoutFormContainer/connector'\r\nimport { CheckoutFormContainerState } from '@gtc/state/checkout-form-container/state'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { CheckoutSchema } from '@gtc/utils'\r\nimport { Formik, FormikProps } from 'formik'\r\nimport React, { FunctionComponent, useEffect, useRef } from 'react'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker'\r\nimport { ConnectedCheckoutForm } from '../CheckoutForm'\r\n\r\ntype CheckoutFormContainerProps = GoToComponentProps<\r\n CheckoutFormContainerState,\r\n CheckoutFormContainerActionsType,\r\n {\r\n isTabletOrMobileView?: boolean\r\n isMobileView?: boolean\r\n setHasAddressValidationErrors: React.Dispatch>\r\n setGeneralFieldErrors: React.Dispatch>\r\n setHasCardValidationErrors: React.Dispatch>\r\n hasAddressValidationErrors: boolean\r\n generalFieldErrors: boolean\r\n hasCardValidationErrors: boolean\r\n contentNumberPicker: NumberPickerContent\r\n }\r\n>\r\n\r\nexport const CheckoutFormContainer: FunctionComponent = ({ state, props, actions }) => {\r\n const formikRef = useRef>(null)\r\n const isSubmittingRef = useRef(false)\r\n // save form data when component unmounts\r\n useEffect(() => {\r\n const getFormValues = () => {\r\n return formikRef.current?.values\r\n }\r\n return () => {\r\n const formValues = getFormValues()\r\n if (formValues) {\r\n actions.updateInitialFormState(formValues)\r\n }\r\n }\r\n }, [actions])\r\n return (\r\n CheckoutSchema(state.initialData.CountryCode, state.errorContent)}\r\n validateOnChange={false}\r\n validateOnBlur={false}\r\n onSubmit={(_values, formikBag) => {\r\n formikBag.setSubmitting(false)\r\n }}\r\n innerRef={formikRef}\r\n >\r\n {(formikProps) => {\r\n if (formikProps.isSubmitting) {\r\n isSubmittingRef.current = true\r\n }\r\n\r\n if (isSubmittingRef.current && !formikProps.isSubmitting) {\r\n isSubmittingRef.current = false\r\n }\r\n return (\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n\r\nexport const ConnectCheckoutFormContainer = connectRedux(\r\n CheckoutFormContainer,\r\n mapCheckoutFormContainerState,\r\n mapCheckoutFormContainerActions\r\n)\r\n","import { AppState } from 'app-store'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { SelectedAddon } from '@gtc/state/add-on'\r\nimport { getFatalError } from '@common/state/selectors'\r\nimport { PhoneNumber } from '@gtc/services/numbersApi'\r\nimport { getCurrentPlan } from '@gtc/utils/get-current-plan'\r\nimport {\r\n getUserState,\r\n getLabelContent,\r\n getCheckoutState,\r\n getPlanData,\r\n getBuyFormState,\r\n getCouponState,\r\n getContentData,\r\n} from '@gtc/state/selectors'\r\n\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { getActiveCouponServerData } from '@gtc/utils'\r\nimport { fatalErrorActions } from '@common/state/fatal-error/actions'\r\nimport { CustomizeState } from './state'\r\n\r\nexport const mapCustomizeState = (state: AppState): CustomizeState => {\r\n const {\r\n selectedPlan,\r\n changePlan,\r\n quantityLabelLong,\r\n quantityLabelPlural,\r\n quantityLabel,\r\n internalErrorMessage,\r\n continue: contentContinue,\r\n quantityPopupInfo,\r\n additionalUserLicences,\r\n howManyMore,\r\n existingUserLicencePlural,\r\n existingUserLicense,\r\n additional,\r\n changePlanMethodModalHeader,\r\n changePlanModalSubheader,\r\n modalCloseButtonText,\r\n edit,\r\n changeNumberModalHeader,\r\n changeNumberModalContent,\r\n changePlanUrl,\r\n couponDisclaimer,\r\n monthly,\r\n annual,\r\n user,\r\n year,\r\n month,\r\n billedMonthlyPrice,\r\n billedAnnualPrice,\r\n numberPickerMainNumber: mainNumber,\r\n numberPickerMainNumberSubText: mainNumberSubText,\r\n } = getLabelContent(state)\r\n const {\r\n organizers,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n selectedTierIndex,\r\n isChoosingPhoneNumber,\r\n phoneNumber,\r\n phoneNumberVanityPhrase,\r\n reservingPhoneNumber,\r\n reservingPhoneNumberError,\r\n } = getCheckoutState(state)\r\n const { initialData } = getBuyFormState(state)\r\n const planData = getPlanData(state)\r\n const currSelectedPlan = getCurrentPlan(selectedPlanSku, planData)\r\n const { Locale, CurrencyCode } = getContentData(state)\r\n const coupon = getCouponState(state)\r\n const { isCouponValidAndApplied, urlCouponCode } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, currSelectedPlan)\r\n const {\r\n userType,\r\n existingAccountInformation,\r\n loggedIn: { isUserLoggedIn },\r\n } = getUserState(state)\r\n const { fatalErrorBlocker } = getFatalError(state)\r\n\r\n return {\r\n content: {\r\n selectedPlan,\r\n changePlan,\r\n quantityLabelLong,\r\n quantityLabelPlural,\r\n quantityLabel,\r\n internalErrorMessage,\r\n continue: contentContinue,\r\n quantityPopupInfo,\r\n additionalUserLicences,\r\n howManyMore,\r\n existingUserLicencePlural,\r\n existingUserLicense,\r\n additional,\r\n changePlanMethodModalHeader,\r\n changePlanModalSubheader,\r\n modalCloseButtonText,\r\n edit,\r\n changeNumberModalHeader,\r\n changeNumberModalContent,\r\n changePlanUrl,\r\n couponDisclaimer,\r\n monthly,\r\n annual,\r\n user,\r\n year,\r\n month,\r\n billedMonthlyPrice,\r\n billedAnnualPrice,\r\n mainNumber,\r\n mainNumberSubText,\r\n },\r\n organizers,\r\n planData,\r\n selectedPlan: currSelectedPlan,\r\n isUserLoggedIn,\r\n selectedAddons,\r\n userType,\r\n fatalErrorBlocker,\r\n existingAccountInformation,\r\n initialData,\r\n billingFrequency,\r\n isCouponValidAndApplied,\r\n urlCouponCode,\r\n couponServerData,\r\n locale: Locale,\r\n selectedTierIndex,\r\n CurrencyCode,\r\n coupon,\r\n isChoosingPhoneNumber,\r\n phoneNumber,\r\n phoneNumberVanityPhrase,\r\n reservingPhoneNumber,\r\n reservingPhoneNumberError,\r\n }\r\n}\r\n\r\nexport const mapCustomizeActions = {\r\n setOrganizers: (organizer: number) => checkoutActions.setOrganizers(organizer),\r\n setSelectedAddons: (addons: SelectedAddon[]) => checkoutActions.setSelectedAddons(addons),\r\n calculatePrice: (values: BuyFormData, planSKU?: string) =>\r\n checkoutActions.calculatePrice(values, 'customize', planSKU),\r\n setSelectedPlan: (planSku: string) => checkoutActions.setSelectedPlan(planSku),\r\n setIsChoosingPhoneNumber: (isChoosingPhoneNumber: boolean) =>\r\n checkoutActions.setIsChoosingPhoneNumber(isChoosingPhoneNumber),\r\n reservePhoneNumber: (phoneNumber: PhoneNumber, vanityPhrase: string) =>\r\n checkoutActions.reservePhoneNumber(phoneNumber, vanityPhrase),\r\n setFatalError: (hasError: boolean) => fatalErrorActions.setFatalError(hasError),\r\n setReservingPhoneNumberError: (message: string) => checkoutActions.setReservingPhoneNumberError(message),\r\n}\r\n\r\nexport type CustomizeActionsType = typeof mapCustomizeActions\r\n","// extracted by mini-css-extract-plugin\nexport default {\"card\":\"card-module__card\",\"card--selected\":\"card-module__card--selected\",\"circle\":\"card-module__circle\",\"spacer\":\"card-module__spacer\",\"icon\":\"card-module__icon\",\"split\":\"card-module__split\",\"split-wrapper\":\"card-module__split-wrapper\",\"split-line\":\"card-module__split-line\",\"price\":\"card-module__price\",\"subtext\":\"card-module__subtext\",\"saving\":\"card-module__saving\",\"callout\":\"card-module__callout\",\"split-title\":\"card-module__split-title\",\"split-price\":\"card-module__split-price\",\"split-subtext\":\"card-module__split-subtext\",\"split-subtext--custom\":\"card-module__split-subtext--custom\",\"price-wrapper\":\"card-module__price-wrapper\",\"card--resolve-selected\":\"card-module__card--resolve-selected\",\"card--plan\":\"card-module__card--plan\"};","import { get } from 'lodash-es'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport React, { FunctionComponent } from 'react'\r\nimport classNames from 'classnames'\r\nimport { getCouponPrices } from '@gtc/utils'\r\nimport { CouponState } from '@gtc/state/coupon/state'\r\nimport { FormatCurrency, FormatDecimalCurrency } from '@common/components'\r\n\r\n// Import Local Styles\r\nimport styles from './card.module.css'\r\n\r\nexport interface CardProps {\r\n onClick: () => void\r\n selected: boolean\r\n plan: Plan\r\n cardLabels: CardLabels\r\n organizers?: number\r\n selectedTierIndex: number\r\n currencyCode: string\r\n coupon: CouponState\r\n logo: string\r\n hideCheckCircle: boolean\r\n locale: string\r\n title: string\r\n modifier?: string\r\n splitSubtext?: string\r\n}\r\n\r\nexport interface CardLabels {\r\n monthly: string\r\n annual: string\r\n user: string\r\n year: string\r\n month: string\r\n newLicenseCopy: string\r\n billedMonthlyPrice: string\r\n billedAnnualPrice: string\r\n organizer?: string\r\n per?: string\r\n}\r\n\r\nexport const Card: FunctionComponent = (props) => {\r\n const {\r\n selected,\r\n cardLabels,\r\n organizers,\r\n plan,\r\n selectedTierIndex,\r\n currencyCode,\r\n coupon,\r\n logo,\r\n hideCheckCircle,\r\n locale,\r\n title,\r\n modifier = '',\r\n splitSubtext,\r\n } = props\r\n const tierLevel = `tier${selectedTierIndex + 1}`\r\n const baseTierMonthlyPrice: number = get(plan, ['pricingInfo', currencyCode, 'monthly', tierLevel, 'price'], 0)\r\n const baseTierAnnualPrice: number = get(plan, ['pricingInfo', currencyCode, 'annual', tierLevel, 'price'], 0)\r\n\r\n const { couponMonthlyPrice, couponAnnualPrice } = getCouponPrices(\r\n plan,\r\n baseTierMonthlyPrice,\r\n baseTierAnnualPrice,\r\n coupon\r\n )\r\n\r\n const buttonClassList = classNames({\r\n [styles.card]: true,\r\n [`${styles['card--selected']}`]: selected,\r\n [modifier]: !!modifier,\r\n })\r\n\r\n const subtextClassList = classNames({\r\n [styles['split-subtext']]: true,\r\n [styles['split-subtext--custom']]: !!splitSubtext,\r\n })\r\n\r\n return (\r\n {\r\n props.onClick()\r\n }}\r\n >\r\n {!hideCheckCircle && (\r\n
\r\n \r\n
\r\n )}\r\n\r\n
\r\n \"daisy-logo\"\r\n
\r\n

{title}

\r\n \r\n {!!organizers && organizers} {cardLabels.newLicenseCopy}\r\n \r\n
\r\n
\r\n
{cardLabels.monthly}
\r\n
\r\n \r\n
\r\n {organizers && (\r\n
\r\n /{cardLabels.organizer ? cardLabels.organizer : cardLabels.user} /{cardLabels.month}\r\n
\r\n )}\r\n
\r\n {!!splitSubtext && {splitSubtext} }\r\n {cardLabels.billedMonthlyPrice.split('{')[0]}\r\n {organizers && (\r\n \r\n )}\r\n {cardLabels.billedMonthlyPrice.split('}')[1]}\r\n
\r\n
\r\n \r\n
\r\n
{cardLabels.annual}
\r\n
\r\n \r\n
\r\n {organizers && (\r\n
\r\n /{cardLabels.organizer ? cardLabels.organizer : cardLabels.user} /{cardLabels.month}\r\n
\r\n )}\r\n
\r\n {!!splitSubtext && {splitSubtext} }\r\n {cardLabels.billedAnnualPrice.split('{')[0]}\r\n {organizers && (\r\n \r\n )}\r\n {cardLabels.billedAnnualPrice.split('}')[1]}\r\n
\r\n
\r\n
\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"NumberPickerOptions-module__wrapper\",\"optionsWrapper\":\"NumberPickerOptions-module__optionsWrapper\",\"optionsWrapperDesktop\":\"NumberPickerOptions-module__optionsWrapperDesktop\",\"optionContainer\":\"NumberPickerOptions-module__optionContainer\",\"firstRadioInputFieldWithBorderLabelModifier\":\"NumberPickerOptions-module__firstRadioInputFieldWithBorderLabelModifier\",\"optionsWrapperMobile\":\"NumberPickerOptions-module__optionsWrapperMobile\",\"yourNumber\":\"NumberPickerOptions-module__yourNumber\",\"editButton\":\"NumberPickerOptions-module__editButton\"};","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"badge-module__wrapper\"};","/* eslint-disable react/require-default-props */\r\nimport React from 'react'\r\nimport styles from './badge.module.css'\r\n\r\ninterface IProps {\r\n id?: string\r\n qaTag?: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport const Badge: React.FC = ({ id = '', qaTag = '', children }) => (\r\n
\r\n {children}\r\n
\r\n)\r\n","const mapLetterToPhoneDialerNumber: Record = {\r\n A: 2,\r\n B: 2,\r\n C: 2,\r\n D: 3,\r\n E: 3,\r\n F: 3,\r\n G: 4,\r\n H: 4,\r\n I: 4,\r\n J: 5,\r\n K: 5,\r\n L: 5,\r\n M: 6,\r\n N: 6,\r\n O: 6,\r\n P: 7,\r\n Q: 7,\r\n R: 7,\r\n S: 7,\r\n T: 8,\r\n U: 8,\r\n V: 8,\r\n W: 9,\r\n X: 9,\r\n Y: 9,\r\n Z: 9,\r\n}\r\n\r\nexport const lettersToPhoneDialerNumbers = (characters: string) => {\r\n let phoneDialerNumbers = ''\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < characters.length; i++) {\r\n const character = characters[i].toUpperCase()\r\n const isNumber = /[0-9]/.test(character)\r\n const theDigit = !isNumber ? mapLetterToPhoneDialerNumber[character] : characters[i]\r\n phoneDialerNumbers += theDigit\r\n }\r\n\r\n return phoneDialerNumbers\r\n}\r\n\r\nexport const indexOfVanityPhrase = (haystack: string, needle: string) => {\r\n const needleAsNumbers = lettersToPhoneDialerNumbers(needle)\r\n return haystack.indexOf(needleAsNumbers)\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"highlight\":\"FormattedNumber-module__highlight\",\"spaceBefore\":\"FormattedNumber-module__spaceBefore\"};","/* eslint-disable react/require-default-props */\r\nimport { indexOfVanityPhrase } from '@gtc/utils/index-of-vanity-phrase'\r\nimport React from 'react'\r\nimport classNames from 'classnames'\r\nimport styles from './FormattedNumber.module.css'\r\n\r\ninterface IProps {\r\n phoneNumber: string\r\n vanityPhrase?: string\r\n modifier?: string\r\n showVanityLetters?: boolean\r\n qaTag?: string\r\n}\r\n\r\nexport const FormattedPhoneNumber = (props: IProps) => {\r\n const { phoneNumber, vanityPhrase = '', modifier = '', showVanityLetters = false, qaTag = '' } = props\r\n const indexOfPhrase = indexOfVanityPhrase(phoneNumber, vanityPhrase)\r\n const vanityPhraseArray = vanityPhrase.toUpperCase().split('')\r\n\r\n return (\r\n \r\n {phoneNumber.split('').map((digit, index) => {\r\n const shouldHighlightCharacter =\r\n indexOfPhrase > -1 && index >= indexOfPhrase && index < indexOfPhrase + vanityPhrase.length\r\n const shouldInsertSpaceBeforeCharacter = index === 2 || index === 5 || index === 8\r\n const character =\r\n shouldHighlightCharacter && showVanityLetters\r\n ? vanityPhraseArray[index - indexOfPhrase] // show the vanity phrase letter\r\n : digit // else show the original digit\r\n\r\n const className = classNames({\r\n [styles.highlight]: shouldHighlightCharacter,\r\n [styles.spaceBefore]: shouldInsertSpaceBeforeCharacter,\r\n })\r\n\r\n return (\r\n \r\n {character}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"NumberPickerSummary-module__wrapper\",\"numberArea\":\"NumberPickerSummary-module__numberArea\",\"noNumber\":\"NumberPickerSummary-module__noNumber\",\"noNumberError\":\"NumberPickerSummary-module__noNumberError\",\"selectedNumber\":\"NumberPickerSummary-module__selectedNumber\",\"locationArea\":\"NumberPickerSummary-module__locationArea\"};","/* eslint-disable react/require-default-props */\r\nimport React from 'react'\r\nimport { PhoneNumber } from '@gtc/services/numbersApi'\r\nimport { Badge } from '@common/components/Badge'\r\nimport { formatCity } from '@common/utils/format-city'\r\nimport IconError from '@common/images/icon-error.svg'\r\nimport { NumberPickerContent } from '../NumberPicker.types'\r\nimport { FormattedPhoneNumber } from '../NumberPickerModal/components/FormattedPhoneNumber/FormattedPhoneNumber'\r\nimport styles from './NumberPickerSummary.module.css'\r\n\r\ninterface IProps {\r\n number?: PhoneNumber\r\n content: NumberPickerContent\r\n qaTag?: string\r\n vanityPhrase: string\r\n showMissingPhoneNumberError?: boolean\r\n showBadge?: boolean\r\n}\r\n\r\nexport const NumberPickerSummary = React.memo((props: IProps) => {\r\n const {\r\n number,\r\n content,\r\n qaTag = 'numberpickersummary',\r\n vanityPhrase = '',\r\n showBadge = true,\r\n showMissingPhoneNumberError = false,\r\n } = props\r\n const isLocalNumber = number && !!number.city\r\n\r\n return (\r\n
\r\n {!number && !showMissingPhoneNumberError && (\r\n
\r\n {content.noNumberSelected}\r\n
\r\n )}\r\n {!number && showMissingPhoneNumberError && (\r\n
\r\n \"error\"\r\n {content.noNumberSelected}\r\n
\r\n )}\r\n {number && (\r\n <>\r\n
\r\n \r\n {showBadge && (\r\n \r\n {isLocalNumber ? content.local : content.tollFree}\r\n \r\n )}\r\n
\r\n {(isLocalNumber || vanityPhrase) && (\r\n
\r\n {vanityPhrase && (\r\n \r\n )}\r\n {vanityPhrase && (number.city || number.region) && <>{' - '}}\r\n {number.city && (\r\n <>\r\n {formatCity(number.city)},{' '}\r\n \r\n )}\r\n {number.region && {number.region}}\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n )\r\n})\r\n","// The city names retrieved from the numbers api come back upper case\r\n// See format-city.test.ts for examples of what this changes the formatting to\r\nexport const formatCity = (city: string | undefined | null) => {\r\n if (!city) {\r\n return ''\r\n }\r\n\r\n const words = city.split(' ')\r\n\r\n // eslint-disable-next-line no-plusplus\r\n for (let i = 0; i < words.length; i++) {\r\n if (words[i].trim() !== '') {\r\n words[i] = words[i][0].toUpperCase() + (words[i].length > 1 ? words[i].substr(1).toLowerCase() : '')\r\n }\r\n }\r\n\r\n const formattedCity = words.join(' ')\r\n\r\n return formattedCity\r\n}\r\n","/* eslint-disable react/require-default-props */\r\nimport React, { ChangeEvent, useState } from 'react'\r\nimport classNames from 'classnames'\r\nimport { RadioInputFieldWithBorder } from '@common/components/RadioInputFieldWithBorder'\r\nimport Pencil from '@common/images/icon-modify-on.svg'\r\nimport { PhoneNumber } from '@gtc/services/numbersApi'\r\nimport InfoView from '@common/components/InfoView'\r\nimport styles from './NumberPickerOptions.module.css'\r\nimport { NumberPickerContent } from '../NumberPicker.types'\r\nimport { NumberPickerSummary } from '../NumberPickerSummary/NumberPickerSummary'\r\n\r\ninterface NumberPickerOptionsProp {\r\n content: NumberPickerContent\r\n isMobileView: boolean\r\n handleOptionChange: (useNewNumber: boolean) => void\r\n handleEdit: () => void\r\n number?: PhoneNumber\r\n isChoosingPhoneNumber?: boolean\r\n showMissingPhoneNumberError?: boolean\r\n vanityPhrase: string\r\n}\r\n\r\nexport const NumberPickerOptions: React.FC = (props) => {\r\n const {\r\n content,\r\n isMobileView,\r\n isChoosingPhoneNumber = true,\r\n showMissingPhoneNumberError = false,\r\n vanityPhrase,\r\n } = props\r\n\r\n const [useNewNumber, setUseNewNumber] = useState(isChoosingPhoneNumber)\r\n\r\n const handleEditClicked = () => {\r\n props.handleEdit()\r\n }\r\n\r\n const handleOptionChanged = (e: ChangeEvent) => {\r\n const option = e.target.value === 'newnumber'\r\n setUseNewNumber(option)\r\n props.handleOptionChange(option)\r\n }\r\n\r\n const optionsWrapperClassName = classNames(\r\n { [styles.optionsWrapper]: true },\r\n { [styles.optionsWrapperDesktop]: !isMobileView },\r\n { [styles.optionsWrapperMobile]: isMobileView }\r\n )\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {useNewNumber ? (\r\n
\r\n
{content.yourNumber}
\r\n \r\n \r\n \"pencil\"\r\n {props.number ? content.editNumber : content.chooseNumber}\r\n \r\n
\r\n ) : (\r\n \r\n
{content.portInstructions}
\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"modalDrawer-module__wrapper\",\"blocker\":\"modalDrawer-module__blocker\",\"modal\":\"modalDrawer-module__modal\",\"closeButtonContainer\":\"modalDrawer-module__closeButtonContainer\",\"closeButton\":\"modalDrawer-module__closeButton\",\"modalContentContainer\":\"modalDrawer-module__modalContentContainer\",\"modalBody\":\"modalDrawer-module__modalBody\",\"modalHeader\":\"modalDrawer-module__modalHeader\",\"modalFooter\":\"modalDrawer-module__modalFooter\",\"disabled\":\"modalDrawer-module__disabled\"};","/* eslint-disable react/require-default-props */\r\n/* eslint-disable jsx-a11y/no-static-element-interactions */\r\n/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\r\n/* eslint-disable jsx-a11y/control-has-associated-label */\r\n/* eslint-disable jsx-a11y/click-events-have-key-events */\r\n// Generated with util/create-component.js\r\nimport React, { useEffect } from 'react'\r\nimport Close from '@common/images/icon-close.svg'\r\nimport { LoadingSpinner } from '../LoadingSpinner'\r\nimport styles from './modalDrawer.module.css'\r\n\r\ninterface IProps {\r\n children: React.ReactNode\r\n id: string\r\n handleDismiss?: () => void\r\n headerText: string\r\n closeText: string\r\n actionButtons?: React.ReactNode\r\n qaTag?: string\r\n showLoadingSpinner?: boolean\r\n allowEscToDismiss?: boolean\r\n scrollingDivRef?: React.RefObject // other code needs this ref to be able to tell the div to scroll to top if there's an error\r\n}\r\n\r\nexport const ModalDrawer: React.FC = (props: IProps) => {\r\n const { qaTag = '', allowEscToDismiss = true, handleDismiss } = props\r\n\r\n // Escape key dismisses dialog if allowEscToDismiss is true\r\n useEffect(() => {\r\n const listenForEscapeKey = (ev: globalThis.KeyboardEvent) => {\r\n if (ev.key === 'Escape' || ev.key === 'Esc') {\r\n if (handleDismiss && allowEscToDismiss) {\r\n handleDismiss()\r\n }\r\n }\r\n }\r\n document.addEventListener('keydown', listenForEscapeKey)\r\n return () => document.removeEventListener('keydown', listenForEscapeKey)\r\n }, [handleDismiss, allowEscToDismiss])\r\n\r\n // While the modal is visible, prevent the page behind it from scrolling, otherwise\r\n // we get double scrollbars whenever the modal and the page behind it both have scrollable content\r\n useEffect(() => {\r\n const originalOverflowY = document.body.style.overflowY\r\n document.body.style.overflowY = 'hidden'\r\n return () => {\r\n document.body.style.overflowY = originalOverflowY\r\n }\r\n }, [])\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n \r\n {props.closeText}\r\n \r\n
\r\n
\r\n
\r\n {props.headerText}\r\n
\r\n
\r\n {props.children}\r\n
\r\n {props.actionButtons && (\r\n
\r\n {props.actionButtons}\r\n
\r\n )}\r\n
\r\n {props.showLoadingSpinner && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"Navigation-module__wrapper\",\"subnav\":\"Navigation-module__subnav\",\"subnavButton\":\"Navigation-module__subnavButton\",\"disabled\":\"Navigation-module__disabled\",\"numberTypeContainer\":\"Navigation-module__numberTypeContainer\",\"numberTypeRadioButton\":\"Navigation-module__numberTypeRadioButton\"};","import React from 'react'\r\nimport classNames from 'classnames'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker/NumberPicker.types'\r\nimport { PLATFORM } from '@common/constants'\r\nimport styles from './Navigation.module.css'\r\n\r\ninterface IProps {\r\n isLocalNumber: boolean\r\n isBasicNumber: boolean\r\n content: NumberPickerContent\r\n handleClickLocal: () => void\r\n handleClickTollFree: () => void\r\n handleClickBasic: () => void\r\n handleClickVanity: () => void\r\n}\r\n\r\nexport const Navigation = ({ isLocalNumber, isBasicNumber, content, ...props }: IProps) => {\r\n // TODO: NumberPicker: Remove this check in a future numberpicker story when Vanity Search is ready\r\n const enableVanityPhrase =\r\n process.env.ENVIRONMENT !== PLATFORM.PROD &&\r\n (window.localStorage.getItem('NumberPickerVanityPhrase') === 'true' ||\r\n window.location.search.includes('NumberPickerVanityPhrase=true'))\r\n\r\n return (\r\n
\r\n
\r\n \r\n {content.localNumber}\r\n \r\n \r\n {content.tollFreeNumber}\r\n \r\n
\r\n\r\n {enableVanityPhrase && (\r\n
\r\n <>\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"SearchFilters-module__wrapper\",\"areaCode\":\"SearchFilters-module__areaCode\",\"areaCodeHeader\":\"SearchFilters-module__areaCodeHeader\",\"areaCodeSubHeader\":\"SearchFilters-module__areaCodeSubHeader\"};","/* eslint-disable react/require-default-props */\r\nimport React, { useState, ChangeEvent } from 'react'\r\nimport { InputField } from '@common/components/InputField'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker/NumberPicker.types'\r\nimport styles from './SearchFilters.module.css'\r\n\r\ninterface IProps {\r\n content: NumberPickerContent\r\n defaultAreaCode?: string\r\n handleChangeAreaCode: (areaCode: string) => void\r\n}\r\n\r\nexport const SearchFilters = ({ content, handleChangeAreaCode, defaultAreaCode = '' }: IProps) => {\r\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\r\n\r\n const handleAreaCodeChange = (event: ChangeEvent) => {\r\n const areaCodeTrimmed = event.target.value.trim()\r\n setAreaCode(areaCodeTrimmed)\r\n handleChangeAreaCode(areaCodeTrimmed)\r\n }\r\n\r\n return (\r\n
\r\n {/*\r\n The original story called for dropdowns for Country, Region and Area Code here,\r\n but for the first release it was decided to only go with an Area Code input instead\r\n */}\r\n

{content.areaCodeHeader}

\r\n
{content.areaCodeSubHeader}
\r\n \r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"flexSpacer\":\"FooterButtons-module__flexSpacer\",\"resetButton\":\"FooterButtons-module__resetButton\",\"cancelButton\":\"FooterButtons-module__cancelButton\"};","import React from 'react'\r\nimport { CommonButton } from '@common/components/CommonButton'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker/NumberPicker.types'\r\nimport styles from './FooterButtons.module.css'\r\n\r\ninterface IProps {\r\n clickedSearch: boolean\r\n content: NumberPickerContent\r\n isResetVisible: boolean\r\n isSearchDisabled: boolean\r\n isSaveDisabled: boolean\r\n handleSave: () => void\r\n handleReset: () => void\r\n handleDismiss: () => void\r\n handleSearch: () => void\r\n}\r\n\r\nexport const FooterButtons = ({\r\n clickedSearch,\r\n content,\r\n isResetVisible,\r\n isSearchDisabled,\r\n isSaveDisabled,\r\n handleSave,\r\n handleReset,\r\n handleDismiss,\r\n handleSearch,\r\n}: IProps) => (\r\n <>\r\n {isResetVisible && (\r\n \r\n {content.reset}\r\n \r\n )}\r\n
\r\n \r\n {content.cancel}\r\n \r\n\r\n {clickedSearch ? (\r\n \r\n {content.save}\r\n \r\n ) : (\r\n \r\n {content.search}\r\n \r\n )}\r\n \r\n)\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"skeleton-module__wrapper\",\"shine\":\"skeleton-module__shine\",\"size-xxsmall\":\"skeleton-module__size-xxsmall\",\"size-xsmall\":\"skeleton-module__size-xsmall\",\"size-small\":\"skeleton-module__size-small\",\"size-medium\":\"skeleton-module__size-medium\",\"size-large\":\"skeleton-module__size-large\",\"size-xlarge\":\"skeleton-module__size-xlarge\",\"size-xxlarge\":\"skeleton-module__size-xxlarge\",\"size-xxxlarge\":\"skeleton-module__size-xxxlarge\"};","/* eslint-disable react/require-default-props */\r\nimport React from 'react'\r\nimport classNames from 'classnames'\r\nimport styles from './skeleton.module.css'\r\n\r\ninterface IProps {\r\n id: string\r\n size?: 'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | 'xxxlarge'\r\n}\r\n\r\nexport const Skeleton: React.FC = ({ id = '', size = 'medium' }) => {\r\n const className = classNames({\r\n [styles.wrapper]: true,\r\n [styles[`size-${size}`]]: true,\r\n })\r\n return
\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"SearchResults-module__wrapper\",\"searchResultsHeading\":\"SearchResults-module__searchResultsHeading\",\"containerLoading\":\"SearchResults-module__containerLoading\",\"containerResults\":\"SearchResults-module__containerResults\",\"errorSaving\":\"SearchResults-module__errorSaving\",\"errorSearching\":\"SearchResults-module__errorSearching\",\"noResultsWrapper\":\"SearchResults-module__noResultsWrapper\"};","/* eslint-disable react/require-default-props */\r\nimport React, { ChangeEvent } from 'react'\r\nimport { RadioInputFieldWithBorder } from '@common/components/RadioInputFieldWithBorder'\r\nimport { PhoneNumber } from '@gtc/services/numbersApi'\r\nimport { Skeleton } from '@common/components/Skeleton'\r\nimport { ErrorView } from '@common/components/ErrorView'\r\nimport { NumberPickerContent, NumberPickerSummary } from '@gtc/components/NumberPicker'\r\nimport styles from './SearchResults.module.css'\r\n\r\ninterface IProps {\r\n handleSelectNumber: (number: PhoneNumber) => void\r\n numberList: PhoneNumber[]\r\n defaultSelectedNumber?: PhoneNumber\r\n loading: boolean\r\n content: NumberPickerContent\r\n isLocalNumber: boolean\r\n errorMessage?: string\r\n vanityPhrase: string\r\n}\r\n\r\nexport const SearchResults = (props: IProps) => {\r\n const {\r\n numberList,\r\n handleSelectNumber,\r\n defaultSelectedNumber,\r\n loading,\r\n content,\r\n isLocalNumber,\r\n errorMessage,\r\n vanityPhrase,\r\n } = props\r\n\r\n const handleOptionChanged = (e: ChangeEvent) => {\r\n const selectedNumber = numberList.find((number) => number.e164Number === e.target.value) as PhoneNumber\r\n handleSelectNumber(selectedNumber)\r\n }\r\n\r\n return (\r\n
\r\n {errorMessage && numberList.length > 0 && (\r\n
\r\n {errorMessage}\r\n
\r\n )}\r\n\r\n

{content.chooseAvailableNumber}

\r\n\r\n {errorMessage && numberList.length === 0 && (\r\n
\r\n {errorMessage}\r\n
\r\n )}\r\n\r\n {!errorMessage && loading && (\r\n
\r\n {[...Array(10).fill('')].map((_value: string, index: number) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n )}\r\n\r\n {!errorMessage && !loading && numberList.length === 0 && (\r\n
\r\n {content.noResults}\r\n
\r\n )}\r\n\r\n {!loading && numberList.length > 0 && (\r\n
\r\n {numberList.map((number, index) => (\r\n
\r\n \r\n }\r\n value={number.e164Number}\r\n onChange={handleOptionChanged}\r\n />\r\n
\r\n ))}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"VanityPhrase-module__wrapper\",\"phraseInputField\":\"VanityPhrase-module__phraseInputField\"};","/* eslint-disable react/require-default-props */\r\nimport React from 'react'\r\nimport { InputField } from '@common/components/InputField'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker'\r\nimport styles from './VanityPhrase.module.css'\r\n\r\ninterface IProps {\r\n vanityPhrase?: string\r\n content: NumberPickerContent\r\n handleChangeVanityPhrase: (vanityPhrase: string) => void\r\n}\r\n\r\nexport const VanityPhrase = (props: IProps) => {\r\n const { content, vanityPhrase, handleChangeVanityPhrase } = props\r\n\r\n return (\r\n
\r\n

{content.vanityPhrase}

\r\n handleChangeVanityPhrase(e.target.value.toUpperCase())}\r\n value={vanityPhrase}\r\n modifier={styles.phraseInputField}\r\n />\r\n
    \r\n
  • {content.vanityPhraseDescriptionLine1}
  • \r\n
  • {content.vanityPhraseDescriptionLine2}
  • \r\n
  • {content.vanityPhraseDescriptionLine3}
  • \r\n
\r\n
\r\n )\r\n}\r\n","import React, { useEffect, useRef, useState } from 'react'\r\nimport { ModalDrawer } from '@common/components/ModalDrawer'\r\nimport { NumbersRequest, PhoneNumber } from '@gtc/services/numbersApi'\r\nimport { scrollToTop } from '@common/utils/scroll'\r\nimport { Navigation } from './components/Navigation/Navigation'\r\nimport { SearchFilters } from './components/SearchFilters/SearchFilters'\r\nimport { NumberPickerContent } from '../NumberPicker.types'\r\nimport { FooterButtons } from './components/FooterButtons/FooterButtons'\r\nimport { SearchResults } from './components/SearchResults/SearchResults'\r\nimport { VanityPhrase } from './components/VanityPhrase/VanityPhrase'\r\n\r\nconst searchQuantity = 20\r\nconst displayQuantity = 10\r\nconst tollFreeWildcard = '8**'\r\n\r\nexport interface NumberPickerModalProps {\r\n loading: boolean\r\n numberList: PhoneNumber[]\r\n content: NumberPickerContent\r\n handleDismiss: () => void\r\n handleSearchNumbers: (params: NumbersRequest) => void\r\n handleChangeNumber: (number: PhoneNumber, vanityPhrase: string) => void\r\n handleResetError?: () => void\r\n defaultSelectedNumber?: PhoneNumber\r\n defaultAreaCode?: string\r\n errorMessage?: string\r\n reservingPhoneNumber?: boolean\r\n isFirstTimeChoosing?: boolean\r\n}\r\n\r\nexport const NumberPickerModal: React.FC = (props) => {\r\n // props\r\n const {\r\n handleSearchNumbers,\r\n handleChangeNumber,\r\n handleResetError,\r\n numberList,\r\n loading,\r\n defaultSelectedNumber,\r\n defaultAreaCode = '',\r\n content,\r\n errorMessage = '',\r\n reservingPhoneNumber = false,\r\n isFirstTimeChoosing = true,\r\n } = props\r\n\r\n // state\r\n const [areaCode, setAreaCode] = useState(defaultAreaCode)\r\n const [vanityPhrase, setVanityPhrase] = useState('')\r\n const [isLocalNumber, setIsLocalNumber] = useState(true)\r\n const [isBasicNumber, setIsBasicNumber] = useState(true)\r\n const [clickedSearch, setClickedSearch] = useState(false)\r\n const [number, setNumber] = useState(defaultSelectedNumber)\r\n\r\n // refs\r\n const scrollingDivRef = useRef(null)\r\n\r\n // consts\r\n const isTollFreeNumber = !isLocalNumber\r\n const isVanityNumber = !isBasicNumber\r\n\r\n // side effects\r\n useEffect(() => {\r\n // Whenever the errorMessage gets set, tell the modal's\r\n // scrollable div to scroll to the top\r\n if (errorMessage) {\r\n scrollToTop(scrollingDivRef.current)\r\n }\r\n }, [errorMessage])\r\n\r\n const resetError = () => {\r\n if (handleResetError) {\r\n handleResetError()\r\n }\r\n }\r\n\r\n const handleDismiss = () => {\r\n props.handleDismiss()\r\n }\r\n\r\n const handleClickLocal = () => {\r\n resetError()\r\n setIsLocalNumber(true)\r\n setVanityPhrase('')\r\n setIsBasicNumber(true)\r\n setClickedSearch(false)\r\n }\r\n\r\n const handleClickTollFree = () => {\r\n resetError()\r\n setIsLocalNumber(false)\r\n setIsBasicNumber(true)\r\n setVanityPhrase('')\r\n setClickedSearch(true)\r\n handleSearchNumbers({\r\n tollFreeWildcard,\r\n quantity: searchQuantity,\r\n })\r\n }\r\n\r\n const handleClickBasic = () => {\r\n setIsBasicNumber(true)\r\n setVanityPhrase('')\r\n if (isTollFreeNumber) {\r\n setClickedSearch(true)\r\n handleSearchNumbers({\r\n tollFreeWildcard,\r\n quantity: searchQuantity,\r\n })\r\n }\r\n }\r\n\r\n const handleClickVanity = () => {\r\n setClickedSearch(false)\r\n setIsBasicNumber(false)\r\n setAreaCode('')\r\n }\r\n\r\n const handleChangeAreaCode = (value: string) => {\r\n setAreaCode(value)\r\n }\r\n\r\n const handleSearch = () => {\r\n setClickedSearch(true)\r\n handleSearchNumbers({\r\n areaCode: isLocalNumber ? areaCode : undefined,\r\n quantity: searchQuantity,\r\n localVanity: isLocalNumber ? vanityPhrase : undefined,\r\n tollFreeVanity: isTollFreeNumber ? vanityPhrase : undefined,\r\n })\r\n }\r\n\r\n const handleReset = () => {\r\n resetError()\r\n setVanityPhrase('')\r\n setClickedSearch(false)\r\n }\r\n\r\n const handleSelectNumber = (newNumber: PhoneNumber) => {\r\n resetError()\r\n setNumber(newNumber)\r\n }\r\n\r\n const handleChangeVanityPhrase = (value: string) => {\r\n setVanityPhrase(value)\r\n }\r\n\r\n const handleSave = () => {\r\n if (handleChangeNumber) {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n handleChangeNumber(number!, vanityPhrase!)\r\n }\r\n }\r\n\r\n const headerText = isFirstTimeChoosing ? content.chooseNumber : content.editNumber\r\n const isResetVisible = clickedSearch && (isLocalNumber || !isBasicNumber)\r\n const isSearchDisabled =\r\n // The Numbers API requires 3 characters for area code. (Note: The input field mask only allows up to 3 characters)\r\n (isLocalNumber && isBasicNumber && areaCode.length < 3) ||\r\n // The Numbers API requires 3 to 7 characters for local vanity phrase. (Note: The input field mask only allows up to 7 characters)\r\n (isLocalNumber && isVanityNumber && vanityPhrase.length < 3) ||\r\n // The Numbers API requires 4 to 7 characters for toll-free vanity phrase. (Note: The input field mask only allows up to 7 characters)\r\n (isTollFreeNumber && isVanityNumber && vanityPhrase.length < 4)\r\n const isSaveDisabled = !!errorMessage || !number || reservingPhoneNumber\r\n\r\n // The search results have a 5 minute cache on the server. So to avoid showing numbers that have already\r\n // been reserved by users of GoToAdmin's NumberPicker, we query for [queryQuantity], reverse that list, and\r\n // only display [displayQuantity] of the reversed list to our users. See WAE1-\r\n const displayNumberList = [...numberList].reverse().slice(0, displayQuantity)\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n {isLocalNumber && isBasicNumber && !clickedSearch && (\r\n \r\n )}\r\n {clickedSearch && (\r\n \r\n )}\r\n {!isBasicNumber && !clickedSearch && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","var _g, _defs;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgGotoConnectLogo = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 239,\n height: 64,\n fill: \"none\"\n}, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n clipPath: \"url(#goto-connect-logo_svg__a)\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#07CB73\",\n d: \"M134.309 16.433q-2.804-2.742-2.801-6.762t2.801-6.762q2.796-2.742 6.918-2.742a9.3 9.3 0 0 1 5.336 1.559 9.06 9.06 0 0 1 3.301 3.796l-3.487 1.348a5.8 5.8 0 0 0-2.054-2.335 5.44 5.44 0 0 0-3.105-.913 5.52 5.52 0 0 0-4.134 1.744 5.98 5.98 0 0 0-1.687 4.305 5.97 5.97 0 0 0 1.687 4.305 5.53 5.53 0 0 0 4.134 1.744 5.45 5.45 0 0 0 3.105-.911 5.83 5.83 0 0 0 2.046-2.34l3.486 1.348a9.04 9.04 0 0 1-3.301 3.797 9.28 9.28 0 0 1-5.336 1.558q-4.11.007-6.909-2.74M153.146 17.145a6.76 6.76 0 0 1-2.086-5.045 6.78 6.78 0 0 1 2.086-5.045q2.088-2.031 5.204-2.034 3.114 0 5.203 2.034a6.76 6.76 0 0 1 2.088 5.045 6.75 6.75 0 0 1-2.088 5.045q-2.084 2.033-5.203 2.033t-5.204-2.033m1.614-5.045c-.034 1.014.336 2 1.029 2.742a3.55 3.55 0 0 0 2.562 1.097 3.54 3.54 0 0 0 2.561-1.097 3.83 3.83 0 0 0 1.032-2.742 3.8 3.8 0 0 0-1.032-2.721 3.55 3.55 0 0 0-2.564-1.082 3.55 3.55 0 0 0-2.559 1.097 3.8 3.8 0 0 0-1.029 2.706M175.787 5.022q2.272 0 3.657 1.584t1.388 4.041v8.268h-3.566v-7.633a2.94 2.94 0 0 0-.844-2.166 2.87 2.87 0 0 0-2.109-.844 3.25 3.25 0 0 0-2.32.844 2.83 2.83 0 0 0-.899 2.166v7.633h-3.571V5.285h3.567v3.487a5.4 5.4 0 0 1 1.782-2.742 4.54 4.54 0 0 1 2.915-1.008M191.569 5.022q2.272 0 3.658 1.584 1.385 1.584 1.387 4.041v8.268h-3.568v-7.633a2.94 2.94 0 0 0-.844-2.166 2.88 2.88 0 0 0-2.109-.844 3.26 3.26 0 0 0-2.32.844 2.85 2.85 0 0 0-.897 2.166v7.633h-3.583V5.285h3.567v3.487a5.4 5.4 0 0 1 1.782-2.742 4.53 4.53 0 0 1 2.927-1.008M205.541 5.021q3.434 0 5.507 2.47t1.518 5.876h-10.512a3.756 3.756 0 0 0 3.725 2.742q2.32 0 3.375-1.898l2.932 1.32a6.97 6.97 0 0 1-2.591 2.656 7.34 7.34 0 0 1-3.817.991q-3.115 0-5.203-2.033a6.77 6.77 0 0 1-2.086-5.045 6.8 6.8 0 0 1 2.06-5.045q2.055-2.031 5.092-2.034m0 3.065a3.45 3.45 0 0 0-2.126.7 3.63 3.63 0 0 0-1.308 1.86H209a3.66 3.66 0 0 0-1.293-1.86 3.5 3.5 0 0 0-2.166-.7M216.018 17.146a6.77 6.77 0 0 1-2.09-5.046 6.77 6.77 0 0 1 2.086-5.045q2.085-2.03 5.203-2.033a7.05 7.05 0 0 1 3.935 1.137 6.93 6.93 0 0 1 2.616 3.195l-3.276 1.135a3.46 3.46 0 0 0-3.275-2.191 3.37 3.37 0 0 0-2.563 1.096 3.8 3.8 0 0 0-1.029 2.706c-.033 1.015.337 2 1.029 2.742a3.38 3.38 0 0 0 2.563 1.097 3.45 3.45 0 0 0 1.955-.582 3.6 3.6 0 0 0 1.32-1.637l3.276 1.135a6.92 6.92 0 0 1-2.616 3.197 7.05 7.05 0 0 1-3.935 1.135q-3.111-.009-5.199-2.042M231.289 8.437h-2.742V5.286h2.742v-4.02l3.564-1.11v5.13h3.539v3.15h-3.539v5.409q0 1.927 1.928 1.927h1.611v3.143h-1.611q-2.799 0-4.147-1.308-1.348-1.307-1.345-3.975z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FFE900\",\n d: \"M128.669 35.815.48 49.288l1.547 14.713 128.188-13.474z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M62.608 8.226A14.793 14.793 0 1 0 77.4 23.01 14.775 14.775 0 0 0 62.608 8.226m0 23.01a8.225 8.225 0 1 1 8.226-8.225 8.226 8.226 0 0 1-8.226 8.217zM110.212 8.226a14.792 14.792 0 0 0-14.51 17.68 14.794 14.794 0 0 0 29.303-2.887 14.763 14.763 0 0 0-14.793-14.793m0 23.01a8.223 8.223 0 0 1-8.068-9.83 8.226 8.226 0 0 1 16.293 1.605 8.226 8.226 0 0 1-8.225 8.217z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M101.206 7.363V.79H71.621v6.574h11.505v29.653h6.575V7.363zM22.636 15.582v6.575h9.086c-2.098 5.509-6.097 9.069-10.731 9.069a12.329 12.329 0 1 1 8.744-21.037l4.668-4.67a18.902 18.902 0 0 0-32.27 13.347 18.72 18.72 0 0 0 5.518 13.35 18.9 18.9 0 0 0 13.344 5.588c6.44 0 12.233-4.146 15.648-10.729v9.939h6.574V15.582z\"\n}))), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"clipPath\", {\n id: \"goto-connect-logo_svg__a\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M.48 0h237.912v64H.48z\"\n})))));\nexport { SvgGotoConnectLogo as ReactComponent };\nexport default __webpack_public_path__ + \"img/goto-connect-logo.361d0d9c46461505dccbf4e0f767d91b.svg\";","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgGotoConnectIcon = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 40,\n height: 40,\n fill: \"none\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#07CB73\",\n fillRule: \"evenodd\",\n d: \"M38 35 3.5 38.5 2 28.304 36.579 25z\",\n clipRule: \"evenodd\"\n})), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M34 20.245V28h-4.717v-5.211S27.044 28 18.809 28c-5.517 0-8.595-2.79-9.954-4.555a14.3 14.3 0 0 1-2.358-4.76 13.9 13.9 0 0 1-.12-6.893 13.75 13.75 0 0 1 4.797-7.796 13.7 13.7 0 0 1 3.838-2.175c2.2-.816 4.57-1.029 6.875-.616a13.05 13.05 0 0 1 6.676 3.283l.64.575-3.358 3.446-.36-.328a8.77 8.77 0 0 0-4.952-2.224 8.7 8.7 0 0 0-5.29 1.137 9.02 9.02 0 0 0-3.667 4.077 9.33 9.33 0 0 0-.682 5.504 8.8 8.8 0 0 0 1.556 3.675 8.5 8.5 0 0 0 3.001 2.562c1.44.82 3.798.862 5.437.615 5.437-.861 6.476-6.196 6.476-6.196h-7.595V12.49H34z\"\n})));\nexport { SvgGotoConnectIcon as ReactComponent };\nexport default __webpack_public_path__ + \"img/goto-connect-icon.68eea480cae23f9822156e26e6c22ac2.svg\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgIconPhone = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 19,\n height: 19\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#53565A\",\n fillRule: \"evenodd\",\n d: \"M14.359 0c.185 0 .373.053.54.162.987.649 2.15 1.623 2.832 2.305q.46.463.851.968c.444.572.548 1.351.244 2.009a27.4 27.4 0 0 1-5.496 7.865 27.4 27.4 0 0 1-7.899 5.518A1.9 1.9 0 0 1 4.64 19a1.98 1.98 0 0 1-1.216-.42q-.496-.387-.955-.842a20.4 20.4 0 0 1-2.306-2.84.983.983 0 0 1 .257-1.345l3.62-2.536a.98.98 0 0 1 .949-.098l1.266.543a.98.98 0 0 0 1.08-.208l3.918-3.918a.98.98 0 0 0 .208-1.081l-.54-1.262a.98.98 0 0 1 .097-.949L13.553.42A.98.98 0 0 1 14.36 0m.237 2.353-1.658 2.37.325.758a2.93 2.93 0 0 1-.624 3.243l-3.916 3.918a2.92 2.92 0 0 1-2.082.863c-.4 0-.79-.08-1.159-.239l-.765-.327-2.365 1.657c.51.675 1.09 1.337 1.504 1.753.239.24.499.469.752.696a25.4 25.4 0 0 0 7.334-5.124 25.3 25.3 0 0 0 5.09-7.282 8 8 0 0 0-.69-.784 19 19 0 0 0-1.746-1.502\"\n})));\nexport { SvgIconPhone as ReactComponent };\nexport default __webpack_public_path__ + \"img/icon-phone.5b110e9f4fafa3434ed82d2b3c80e2a5.svg\";","import { get } from 'lodash-es'\r\n\r\nimport { AppState } from 'app-store'\r\nimport { BillingPeriod, TimePeriod } from '@common/constants'\r\nimport {\r\n getUserState,\r\n getLabelContent,\r\n getCheckoutState,\r\n getContentData,\r\n getPlanData,\r\n getCouponState,\r\n} from '@gtc/state/selectors'\r\nimport { getCurrentPlan } from '@gtc/utils/get-current-plan'\r\nimport { getCurrentAddons } from '@gtc/utils/get-current-addons'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { getActiveCouponServerData } from '@gtc/utils'\r\nimport { OrderSummaryState } from './state'\r\n\r\nexport const mapOrderSummaryState = (state: AppState): OrderSummaryState => {\r\n const {\r\n monthly,\r\n annual,\r\n save,\r\n orderSummary,\r\n user,\r\n year,\r\n month,\r\n quantityLabelPlural,\r\n quantityLabel,\r\n subtotal,\r\n estimatedTax,\r\n tBD,\r\n recurringMonthlyCharge,\r\n autoRenewalNote,\r\n recurringAnnualCharge,\r\n quantityPopupInfo,\r\n estimatedTaxPopupInfo,\r\n newUserLicense,\r\n total,\r\n proratedAdjustment,\r\n today,\r\n newRecurringAnnualTotal,\r\n newRecurringMonthlyTotal,\r\n previousAnnualTotal,\r\n previousMonthlyTotal,\r\n billingCycleCredit,\r\n calculating,\r\n newUserLicensePlural,\r\n fees,\r\n feesPopupText,\r\n percentageOffAnnualDiscount,\r\n percentageOffVolumeDiscount,\r\n totalSavings,\r\n volumeDiscountPopupText,\r\n percentageOffPromoDiscount,\r\n couponAdjustmentSavingsPopupText,\r\n couponAdjustmentSavings,\r\n trustArcSupport,\r\n } = getLabelContent(state)\r\n\r\n const { Locale, CurrencyCode } = getContentData(state)\r\n\r\n const {\r\n organizers,\r\n selectedAddons,\r\n billingFrequency,\r\n selectedPlanSku,\r\n calculatedTotal,\r\n calculatedTax,\r\n productPrices,\r\n anniversaryDate,\r\n calculatedNetTotal,\r\n totalLoading,\r\n currentVolumeDiscountPrice,\r\n selectedTierIndex,\r\n calculatedProratedAmount,\r\n isChoosingPhoneNumber,\r\n phoneNumber,\r\n phoneNumberVanityPhrase,\r\n } = getCheckoutState(state)\r\n const planData: Plan[] = getPlanData(state)\r\n const selectedPlan = getCurrentPlan(selectedPlanSku, planData)\r\n const coupon = getCouponState(state)\r\n const { couponProcessedDataPerSku, isCouponValidAndApplied, couponDoubleDipAmountForNewUser } = coupon\r\n const couponServerData = getActiveCouponServerData(coupon, selectedPlan)\r\n const couponDiscountType = couponServerData ? couponServerData.couponDiscountType : null\r\n\r\n const currSelectedAddons = getCurrentAddons(selectedAddons, selectedPlan)\r\n const currentTier = `tier${selectedTierIndex + 1}`\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const baseTierAnnualPrice: number = get(selectedPlan, ['pricingInfo', CurrencyCode, 'annual', 'tier1', 'price'], 0)\r\n const baseTierMonthlyPrice: number = get(\r\n selectedPlan,\r\n ['pricingInfo', CurrencyCode, 'monthly', 'tier1', 'price'],\r\n 0\r\n )\r\n const currentTierPrice: number = get(\r\n selectedPlan,\r\n ['pricingInfo', CurrencyCode, billingFrequencyKey, currentTier, 'price'],\r\n 0\r\n )\r\n // TODO: property to be added for monthly annual contract\r\n const baseTierMonthlyAnnualContractPrice: number = get(\r\n selectedPlan,\r\n ['pricingInfo', CurrencyCode, '', 'tier1', 'price'],\r\n 0\r\n )\r\n\r\n const {\r\n userType,\r\n existingBillingInformation,\r\n existingAccountInformation,\r\n loggedIn: { isUserLoggedIn },\r\n } = getUserState(state)\r\n\r\n return {\r\n content: {\r\n monthly,\r\n annual,\r\n save,\r\n orderSummary,\r\n user,\r\n year,\r\n month,\r\n quantityLabelPlural,\r\n quantityLabel,\r\n subtotal,\r\n estimatedTax,\r\n tBD,\r\n recurringMonthlyCharge,\r\n autoRenewalNote,\r\n recurringAnnualCharge,\r\n quantityPopupInfo,\r\n estimatedTaxPopupInfo,\r\n newUserLicense,\r\n total,\r\n proratedAdjustment,\r\n today,\r\n newRecurringAnnualTotal,\r\n newRecurringMonthlyTotal,\r\n previousAnnualTotal,\r\n previousMonthlyTotal,\r\n billingCycleCredit,\r\n calculating,\r\n newUserLicensePlural,\r\n fees,\r\n feesPopupText,\r\n percentageOffAnnualDiscount,\r\n percentageOffVolumeDiscount,\r\n totalSavings,\r\n volumeDiscountPopupText,\r\n percentageOffPromoDiscount,\r\n couponAdjustmentSavingsPopupText,\r\n couponAdjustmentSavings,\r\n trustArcSupport,\r\n },\r\n Locale,\r\n CurrencyCode,\r\n organizers,\r\n selectedAddons: currSelectedAddons,\r\n billingFrequency,\r\n selectedPlan,\r\n calculatedTax,\r\n calculatedTotal,\r\n isUserLoggedIn,\r\n productPrices,\r\n anniversaryDate,\r\n calculatedNetTotal,\r\n calculatedProratedAmount,\r\n userType,\r\n userEmail: existingBillingInformation?.email,\r\n existingAccountInformation,\r\n totalLoading,\r\n currentVolumeDiscountPrice,\r\n baseTierAnnualPrice,\r\n baseTierMonthlyPrice,\r\n currentTierPrice,\r\n couponProcessedDataPerSku,\r\n isCouponValidAndApplied,\r\n couponDiscountType,\r\n couponDoubleDipAmountForNewUser,\r\n isChoosingPhoneNumber,\r\n phoneNumber,\r\n phoneNumberVanityPhrase,\r\n baseTierMonthlyAnnualContractPrice,\r\n }\r\n}\r\n\r\nexport const mapOrderSummaryActions = {\r\n setBillingFrequency: (frequency: TimePeriod) => checkoutActions.setBillingFrequency(frequency),\r\n}\r\n\r\nexport type OrderSummaryActionsType = typeof mapOrderSummaryActions\r\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgImgIconArrowDown = props => /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 10,\n height: 6,\n fill: \"none\",\n strokeLinecap: \"round\"\n}, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"#165C7D\",\n d: \"m1 1 4 4 4-4\"\n})));\nexport { SvgImgIconArrowDown as ReactComponent };\nexport default __webpack_public_path__ + \"img/img-icon-arrow-down.7b8576e539c9c282b8eeb214b0983ba4.svg\";","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"password-validation-module__wrapper\",\"wrapper--compact\":\"password-validation-module__wrapper--compact\",\"requirements\":\"password-validation-module__requirements\",\"subhead\":\"password-validation-module__subhead\",\"label\":\"password-validation-module__label\",\"label--focused\":\"password-validation-module__label--focused\",\"password-wrapper\":\"password-validation-module__password-wrapper\",\"password-wrapper--focused\":\"password-validation-module__password-wrapper--focused\",\"password-wrapper--error\":\"password-validation-module__password-wrapper--error\",\"password-wrapper--disabled\":\"password-validation-module__password-wrapper--disabled\",\"password-wrapper--valid\":\"password-validation-module__password-wrapper--valid\",\"eye\":\"password-validation-module__eye\",\"subhead--error\":\"password-validation-module__subhead--error\"};","import React, { FunctionComponent, useState } from 'react'\r\nimport classNames from 'classnames'\r\nimport { Input, InputProps, PasswordStrengthIndicator } from '@common/components'\r\n\r\nimport Eye from '@common/images/icon-pw-show@2x.svg'\r\nimport EyeClosed from '@common/images/icon-pw-hide@2x.svg'\r\n\r\nimport styles from './password-validation.module.css'\r\n\r\nexport interface PasswordValidationProps extends InputProps {\r\n label: string\r\n touched: boolean\r\n genericPasswordLabel: string\r\n modifier?: string\r\n passwordStrength: string\r\n passwordStrengthLevel1: string\r\n passwordStrengthLevel2: string\r\n passwordStrengthLevel3: string\r\n passwordStrengthLevel4: string\r\n passwordStrengthTip1: string\r\n passwordStrengthTip2: string\r\n passwordStrengthTip3: string\r\n passwordStrengthTipDrawer: string\r\n isSubmittingRef: React.RefObject\r\n}\r\n\r\nexport const PasswordValidation: FunctionComponent = ({\r\n touched,\r\n genericPasswordLabel,\r\n modifier = '',\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n isSubmittingRef,\r\n ...props\r\n}) => {\r\n const { id, label, error, value = '', disabled, valid } = props\r\n\r\n const [showPW, setShowPW] = useState(false)\r\n const [isPWFocused, setIsPWFocused] = useState(false)\r\n\r\n const setFocusState = (e: React.FocusEvent) => {\r\n setIsPWFocused(true)\r\n if (props.onFocus) props.onFocus(e)\r\n }\r\n\r\n const setBlurState = (e: React.FocusEvent) => {\r\n setIsPWFocused(false)\r\n if (props.onBlur) props.onBlur(e)\r\n }\r\n\r\n const classList = classNames({\r\n [styles.wrapper]: true,\r\n [modifier]: !!modifier,\r\n })\r\n\r\n const InputWrapperClassList = classNames({\r\n [styles['password-wrapper']]: true,\r\n [styles['password-wrapper--focused']]: isPWFocused,\r\n [styles['password-wrapper--error']]: error,\r\n [styles['password-wrapper--disabled']]: disabled,\r\n [styles['password-wrapper--valid']]: valid,\r\n })\r\n\r\n const labelClasslist = classNames({\r\n [styles.label]: true,\r\n [styles['label--focused']]: isPWFocused || valid || value,\r\n })\r\n\r\n return (\r\n
\r\n \r\n
\r\n setBlurState(e)}\r\n onFocus={(e) => setFocusState(e)}\r\n type={showPW ? 'text' : 'password'}\r\n />\r\n \r\n
\r\n\r\n \r\n
\r\n )\r\n}\r\n","// extracted by mini-css-extract-plugin\nexport default {\"section\":\"order-summary-addons__section\",\"row\":\"order-summary-addons__row\",\"item\":\"order-summary-addons__item\",\"small\":\"order-summary-addons__small\",\"teal\":\"order-summary-addons__teal\"};","import React, { FunctionComponent, memo } from 'react'\r\n\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { getAddonPrice } from '@gtc/utils'\r\nimport { ConnectedFormatCurrency } from '@gtc/connectedComponents'\r\n\r\n// Import Local Styles\r\nimport { CouponProcessedDataPerSku } from '@gtc/state/coupon/state'\r\nimport { isEmpty } from 'lodash-es'\r\nimport styles from './order-summary-addons.css'\r\n\r\nexport interface OrderSummaryAddonsProps {\r\n selectedAddons: Addon[]\r\n planAddons: Addon[]\r\n isAnnual: boolean\r\n currency: string\r\n content: {\r\n year: string\r\n month: string\r\n percentageOffPromoDiscount: string\r\n }\r\n couponProcessedDataPerSku: CouponProcessedDataPerSku | null\r\n isCouponValidAndApplied: boolean\r\n isPercentageCoupon: boolean\r\n}\r\n\r\nexport const OrderSummaryAddons: FunctionComponent = ({\r\n selectedAddons,\r\n planAddons,\r\n isAnnual,\r\n currency,\r\n content,\r\n couponProcessedDataPerSku,\r\n isCouponValidAndApplied,\r\n isPercentageCoupon,\r\n}) => {\r\n return (\r\n <>\r\n {selectedAddons.map((selected: Addon) => {\r\n const addon: Addon | undefined = planAddons.find((x) => x.name === selected.name)\r\n if (!addon) return null\r\n const addonCouponData = couponProcessedDataPerSku ? couponProcessedDataPerSku[addon.sKU] : null\r\n const isCouponAppliedtoAddon =\r\n isCouponValidAndApplied && couponProcessedDataPerSku && addonCouponData && !isEmpty(addonCouponData)\r\n const addonCouponDiscountPercentage = addonCouponData?.discountPercentage || 0\r\n const addonCouponDiscountAmount = addonCouponData?.discountTotalSavings || 0\r\n const discountLineClasses = `${styles.small} ${styles.teal}`\r\n const addonPrice = getAddonPrice(addon, isAnnual, currency)\r\n return (\r\n
\r\n
\r\n \r\n {addon.name}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n /{addon.quantityLabelShort}\r\n /{isAnnual ? content.year : content.month}\r\n \r\n
\r\n
\r\n \r\n {selected.quantity}{' '}\r\n {selected.quantity > 1 ? addon.quantityLabelShortPlural : addon.quantityLabelShort}\r\n \r\n
\r\n {isCouponAppliedtoAddon && (\r\n
\r\n \r\n \r\n {isPercentageCoupon ? (\r\n `${addonCouponDiscountPercentage}%`\r\n ) : (\r\n \r\n )}\r\n  \r\n \r\n {content.percentageOffPromoDiscount}\r\n \r\n \r\n -\r\n \r\n \r\n
\r\n )}\r\n
\r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport const MemoOrderSummaryAddon = memo(OrderSummaryAddons)\r\n","// extracted by mini-css-extract-plugin\nexport default {\"header\":\"order-summary-module__header\",\"wrapper\":\"order-summary-module__wrapper\",\"section\":\"order-summary-module__section\",\"row\":\"order-summary-module__row\",\"item\":\"order-summary-module__item\",\"small\":\"order-summary-module__small\",\"totalSavings\":\"order-summary-module__totalSavings\",\"teal\":\"order-summary-module__teal\",\"light\":\"order-summary-module__light\",\"total\":\"order-summary-module__total\",\"totalPadding\":\"order-summary-module__totalPadding\",\"togglePadding\":\"order-summary-module__togglePadding\",\"row--subtotal\":\"order-summary-module__row--subtotal\",\"row--total\":\"order-summary-module__row--total\",\"phoneSummary\":\"order-summary-module__phoneSummary\"};","// import dependencies\r\nimport React, { FunctionComponent, useMemo, useEffect, useState } from 'react'\r\n\r\nimport { ToggleButton, Tooltip, TrustArcLogo } from '@common/components'\r\nimport { TimePeriod, COUPON_DISCOUNT_TYPE, BillingPeriodKey } from '@common/constants'\r\nimport { getSessionState, saveSessionState, connectRedux, GoToComponentProps, formatDate } from '@common/utils'\r\nimport Phone from '@common/images/icon-phone.svg'\r\n\r\nimport { ConnectedFormatCurrency } from '@gtc/connectedComponents'\r\nimport { USER_TYPES } from '@gtc/constants'\r\nimport {\r\n mapOrderSummaryState,\r\n mapOrderSummaryActions,\r\n OrderSummaryActionsType,\r\n} from '@gtc/connectedComponents/OrderSummary/connector'\r\nimport { OrderSummaryState } from '@gtc/connectedComponents/OrderSummary/state'\r\nimport { calculateTotalPriceWithAddons, getCouponTotalSavings, getFeesFromProductPrice } from '@gtc/utils'\r\nimport { MemoOrderSummaryAddon } from '@gtc/components'\r\n\r\nimport { isEmpty } from 'lodash-es'\r\nimport toggleStyles from '@common/components/ToggleButton/toggle-button.module.css'\r\nimport { NumberPickerContent, NumberPickerSummary } from '@gtc/components/NumberPicker'\r\nimport classNames from 'classnames'\r\nimport styles from './order-summary.module.css'\r\n\r\ntype OrderSummaryProps = GoToComponentProps<\r\n OrderSummaryState,\r\n OrderSummaryActionsType,\r\n {\r\n isTabletOrMobileView?: boolean\r\n isMobileView?: boolean\r\n contentNumberPicker: NumberPickerContent\r\n }\r\n>\r\n\r\nconst OrderSummary: FunctionComponent = ({ state, actions, props }) => {\r\n const {\r\n billingFrequency,\r\n selectedPlan,\r\n organizers,\r\n selectedAddons,\r\n content,\r\n CurrencyCode,\r\n currentVolumeDiscountPrice,\r\n baseTierAnnualPrice,\r\n baseTierMonthlyPrice,\r\n currentTierPrice,\r\n calculatedProratedAmount,\r\n productPrices,\r\n couponProcessedDataPerSku,\r\n isCouponValidAndApplied,\r\n couponCode,\r\n couponDiscountType,\r\n couponDoubleDipAmountForNewUser,\r\n isChoosingPhoneNumber,\r\n phoneNumber,\r\n phoneNumberVanityPhrase,\r\n userEmail,\r\n } = state\r\n\r\n // coupon discounts\r\n const planCouponData = couponProcessedDataPerSku ? couponProcessedDataPerSku[selectedPlan.sKU] : null\r\n const isCouponAppliedtoPlan = isCouponValidAndApplied && !isEmpty(planCouponData)\r\n const planCouponDiscountPercentage = planCouponData?.discountPercentage || 0\r\n const planCouponDiscountAmount = planCouponData?.discountTotalSavings || 0\r\n const isPercentageCoupon = couponDiscountType === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF\r\n const totalCouponDiscountSavings = getCouponTotalSavings(\r\n isCouponValidAndApplied,\r\n couponProcessedDataPerSku,\r\n couponDoubleDipAmountForNewUser\r\n )\r\n const isRepriceCouponAndApplied = couponDiscountType === COUPON_DISCOUNT_TYPE.REPRICE && isCouponAppliedtoPlan\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n\r\n const [isAnnualOnly, setIsAnnualOnly] = useState(false)\r\n const [toggleContent, setToggleContent] = useState({})\r\n\r\n // tier 1 (base tier) price to calculate discounts off\r\n const calculatedBasePrice = isAnnual ? baseTierMonthlyPrice * 12 : baseTierMonthlyPrice\r\n const basePriceTotal = calculatedBasePrice * organizers\r\n\r\n // coupon processed current Tier price\r\n const couponProcessedMonthlyCurrentTierPrice = isRepriceCouponAndApplied ? baseTierMonthlyPrice : currentTierPrice\r\n const couponProcessedAnnualCurrentTierPrice = isRepriceCouponAndApplied ? baseTierAnnualPrice : currentTierPrice\r\n\r\n // current selected tier to calculate total off\r\n const calculatedMonthlyPrice = organizers * couponProcessedMonthlyCurrentTierPrice\r\n const calculatedAnnualPrice = organizers * couponProcessedAnnualCurrentTierPrice * 12\r\n const calculatedTotalPriceForPlan = isAnnual ? calculatedAnnualPrice : calculatedMonthlyPrice\r\n\r\n // annual discount off the selected tier\r\n const annualDiscountAmount = (baseTierMonthlyPrice - baseTierAnnualPrice) * organizers * 12\r\n\r\n // annual only price (no discount)\r\n const basePriceTotalAnnualOnly = basePriceTotal - annualDiscountAmount\r\n\r\n // total price of plan plus addons (volume discount is already accounted in the plan)\r\n const currentTotalPrice = useMemo(\r\n () =>\r\n calculateTotalPriceWithAddons(\r\n calculatedTotalPriceForPlan,\r\n selectedAddons,\r\n selectedPlan,\r\n isAnnual,\r\n CurrencyCode\r\n ),\r\n [calculatedTotalPriceForPlan, isAnnual, selectedAddons, selectedPlan, CurrencyCode]\r\n )\r\n\r\n // total savings (add the prorated discount only if its negative, otherwise its not a saving anymore)\r\n const saving =\r\n (isAnnual ? annualDiscountAmount : 0) +\r\n currentVolumeDiscountPrice +\r\n (calculatedProratedAmount < 0 ? Math.abs(calculatedProratedAmount) : 0) +\r\n totalCouponDiscountSavings\r\n\r\n const subtotalWithCouponDiscounts = currentTotalPrice - totalCouponDiscountSavings\r\n const subtotal = state.calculatedNetTotal ? state.calculatedNetTotal : subtotalWithCouponDiscounts\r\n const total = state.calculatedTotal ? state.calculatedTotal : subtotal\r\n // use the BOSS calculate price API to get the fees\r\n const fees = getFeesFromProductPrice(productPrices)\r\n\r\n // labels and state display\r\n const isAddonFlow = state.isUserLoggedIn && state.userType === USER_TYPES.ADDON\r\n const displayProrated =\r\n isAddonFlow && calculatedProratedAmount !== 0 && state.anniversaryDate && state.anniversaryDate.length > 1\r\n\r\n const isPlural = organizers > 1\r\n\r\n const setToggleContentState = (obj: Record) => {\r\n setToggleContent((prevState) => {\r\n return {\r\n ...prevState,\r\n ...obj,\r\n }\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n if (\r\n selectedPlan.billingPeriods.length === 1 &&\r\n selectedPlan.billingPeriods.find((item) => item.key === BillingPeriodKey.ANNUAL)\r\n ) {\r\n setIsAnnualOnly(true)\r\n } else {\r\n setIsAnnualOnly(false)\r\n }\r\n selectedPlan.billingPeriods.forEach((item) => {\r\n if (item.key === BillingPeriodKey.ANNUAL) {\r\n setToggleContentState({ label2: item.name })\r\n } else {\r\n setToggleContentState({ label1: item.name })\r\n }\r\n })\r\n setToggleContentState({ callout: content.save, discountAmount: annualDiscountAmount })\r\n }, [selectedPlan, annualDiscountAmount, content.save])\r\n\r\n const addonsContent = {\r\n year: content.year,\r\n month: content.month,\r\n percentageOffPromoDiscount: content.percentageOffPromoDiscount,\r\n }\r\n\r\n const returningLicenseTotal = state.existingAccountInformation?.quantity\r\n ? state.existingAccountInformation.quantity + organizers\r\n : organizers\r\n const returningLicenceCopy = ` ${\r\n isPlural ? content.newUserLicensePlural : content.newUserLicense\r\n } (${returningLicenseTotal} ${content.total})`\r\n const newLicenseCopy = ` ${isPlural ? content.quantityLabelPlural : content.quantityLabel}`\r\n\r\n const anniversaryDate = displayProrated ? formatDate(new Date(state.anniversaryDate), 'UTC', state.Locale) : ''\r\n const proratedTooltip = `${content.billingCycleCredit} ${anniversaryDate} - ${content.today}`\r\n const discountLineClasses = `${styles.small} ${styles.teal}`\r\n\r\n useEffect(() => {\r\n const qualtricsDataGtc = getSessionState('qualtrics_data_gtc')\r\n saveSessionState('qualtrics_data_gtc', {\r\n ...(!qualtricsDataGtc ? {} : qualtricsDataGtc),\r\n // id: '', // added on GTM side\r\n sku: selectedPlan.sKU,\r\n purchase_term: isAnnual ? 'annual' : 'monthly',\r\n purchase_type: isAddonFlow ? 'addon' : 'new',\r\n order_total: calculatedTotalPriceForPlan,\r\n // referral_channel: '', // added on GTM side\r\n promo_code_applied: couponCode ?? '',\r\n userEmail,\r\n })\r\n }, [selectedPlan.sKU, isAnnual, isAddonFlow, calculatedTotalPriceForPlan, couponCode, userEmail])\r\n\r\n return (\r\n
\r\n
\r\n

{content.orderSummary}

\r\n {!isAnnualOnly && (\r\n actions.setBillingFrequency(isAnnual ? TimePeriod.Month : TimePeriod.Year)}\r\n disabled={isAddonFlow}\r\n isOn={isAnnual}\r\n modifier={`${toggleStyles['wrapper--order-summary']} ${styles.togglePadding}`}\r\n id={`toggle-${Math.random()}`}\r\n isLarge\r\n />\r\n )}\r\n\r\n {isChoosingPhoneNumber && (\r\n
\r\n
\r\n {props.contentNumberPicker.phone}\r\n
\r\n
\r\n \r\n
\r\n
\r\n )}\r\n
\r\n
\r\n \r\n {`${state.selectedPlan.groupName} ${state.selectedPlan.name}`}\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n /{content.user}\r\n /{isAnnual ? content.year : content.month}\r\n \r\n
\r\n
\r\n \r\n {organizers}\r\n {isAddonFlow && state.existingAccountInformation ? returningLicenceCopy : newLicenseCopy}\r\n \r\n
\r\n
\r\n {!isAnnualOnly && isAnnual && (\r\n
\r\n
\r\n \r\n {content.percentageOffAnnualDiscount}\r\n \r\n \r\n -\r\n \r\n
\r\n
\r\n )}\r\n {currentVolumeDiscountPrice > 0 && (\r\n
\r\n
\r\n \r\n {content.percentageOffVolumeDiscount}\r\n \r\n \r\n \r\n -\r\n \r\n
\r\n
\r\n )}\r\n {isCouponAppliedtoPlan && (\r\n
\r\n
\r\n \r\n \r\n {isPercentageCoupon ? (\r\n `${planCouponDiscountPercentage}%`\r\n ) : (\r\n \r\n )}\r\n  \r\n \r\n {content.percentageOffPromoDiscount}\r\n \r\n \r\n -\r\n \r\n \r\n
\r\n
\r\n )}\r\n {couponDoubleDipAmountForNewUser > 0 && (\r\n
\r\n
\r\n \r\n {content.couponAdjustmentSavings}\r\n \r\n \r\n \r\n -\r\n \r\n \r\n
\r\n
\r\n )}\r\n {displayProrated && (\r\n
\r\n
\r\n \r\n {content.proratedAdjustment}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n )}\r\n\r\n \r\n\r\n
\r\n
\r\n \r\n {content.fees} \r\n \r\n \r\n {state.totalLoading ? (\r\n '--'\r\n ) : (\r\n <>{state.calculatedTax ? : content.tBD}\r\n )}\r\n \r\n
\r\n
\r\n {content.subtotal}\r\n \r\n {state.totalLoading ? '--' : }\r\n \r\n
\r\n
\r\n \r\n {content.estimatedTax} \r\n \r\n\r\n \r\n {state.totalLoading ? (\r\n '--'\r\n ) : (\r\n <>\r\n {state.calculatedTax ? (\r\n \r\n ) : (\r\n content.tBD\r\n )}\r\n \r\n )}\r\n \r\n
\r\n
\r\n \r\n {content.total} {CurrencyCode}\r\n \r\n \r\n {state.totalLoading ? (\r\n `${content.calculating}...`\r\n ) : (\r\n \r\n )}\r\n \r\n
\r\n {!isAnnualOnly && saving > 0 && (\r\n
\r\n {content.totalSavings}\r\n \r\n \r\n \r\n
\r\n )}\r\n
\r\n
\r\n {!props.isTabletOrMobileView && }\r\n
\r\n )\r\n}\r\n\r\nexport const ConnectedOrderSummary = connectRedux(OrderSummary, mapOrderSummaryState, mapOrderSummaryActions)\r\n\r\nexport default ConnectedOrderSummary\r\n","// extracted by mini-css-extract-plugin\nexport default {\"subtitle\":\"customize-module__subtitle\",\"flex-header\":\"customize-module__flex-header\",\"includes\":\"customize-module__includes\",\"light\":\"customize-module__light\",\"compare\":\"customize-module__compare\",\"proceed\":\"customize-module__proceed\",\"label\":\"customize-module__label\",\"flex\":\"customize-module__flex\",\"flexNoMargin\":\"customize-module__flexNoMargin\",\"numberPickerOptions\":\"customize-module__numberPickerOptions\",\"disclaimer\":\"customize-module__disclaimer\",\"license\":\"customize-module__license\",\"logo\":\"customize-module__logo\"};","import React, { FunctionComponent, useState, useEffect, useMemo, useCallback } from 'react'\r\n\r\n// import components\r\nimport {\r\n Tooltip,\r\n BoxWrapper,\r\n CommonButton,\r\n LicenseSelector,\r\n ConvertStringToReact,\r\n TrustArcLogo,\r\n CardSelector,\r\n} from '@common/components'\r\nimport { connectRedux, formatDate, GoToComponentProps } from '@common/utils'\r\nimport { ConnectedModal } from '@common/connectedComponents/Modal'\r\nimport Pencil from '@common/images/icon-modify-on.svg'\r\n\r\nimport { Addon, SelectedAddon } from '@gtc/state/add-on'\r\nimport {\r\n CustomizeActionsType,\r\n mapCustomizeActions,\r\n mapCustomizeState,\r\n} from '@gtc/connectedComponents/Customize/connector'\r\nimport { isAddressComplete } from '@gtc/utils'\r\nimport { CustomizeState } from '@gtc/connectedComponents/Customize/state'\r\nimport { LICENSECAP, NUMBERSCAP, USER_TYPES, ADDONS } from '@gtc/constants'\r\nimport { useCustomizePageTracking } from '@gtc/hooks'\r\nimport { Card, CardLabels } from '@common/components/Card'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { NumberPickerContent, NumberPickerModal, NumberPickerOptions } from '@gtc/components/NumberPicker'\r\nimport logo from '@common/images/goto-connect-logo.svg'\r\nimport icon from '@common/images/goto-connect-icon.svg'\r\nimport { usePhoneNumberSearch } from '@gtc/hooks/usePhoneNumberSearch'\r\nimport { DIRECTIONS } from '@common/constants'\r\nimport { ConnectedOrderSummary } from '../OrderSummary'\r\nimport styles from './customize.module.css'\r\n\r\ntype CustomizeProps = GoToComponentProps<\r\n CustomizeState,\r\n CustomizeActionsType,\r\n {\r\n nextSteps: () => void\r\n isTabletOrMobileView?: boolean\r\n isMobileView?: boolean\r\n isNumberPickerFeatureEnabled: boolean\r\n contentNumberPicker: NumberPickerContent\r\n showMissingPhoneNumberError: boolean\r\n setShowMissingPhoneNumberError: (showMissingPhoneNumberError: boolean) => void\r\n }\r\n>\r\n\r\nconst Customize: FunctionComponent = ({ state, actions, props }) => {\r\n const {\r\n isNumberPickerFeatureEnabled,\r\n contentNumberPicker,\r\n showMissingPhoneNumberError,\r\n setShowMissingPhoneNumberError,\r\n } = props\r\n const { phoneNumber, phoneNumberVanityPhrase, reservingPhoneNumber, reservingPhoneNumberError } = state\r\n const { setIsChoosingPhoneNumber, reservePhoneNumber } = actions\r\n\r\n const [additionalPhoneNumbers, setAdditionalPhoneNumbers] = useState(NUMBERSCAP.MIN)\r\n const [initStateLoaded, setInitStateLoaded] = useState(false)\r\n const [isPlanModalOpen, setIsPlanModalOpen] = useState(false)\r\n const [isEditPhoneModalOpen, setEditPhoneModalOpen] = useState(false)\r\n const [showCards, setShowCards] = useState(false)\r\n const [alreadyTrackedChangePlan, setAlreadyTrackedChangePlan] = useState(false)\r\n const [isNumberPickerModalOpen, setIsNumberPickerModalOpen] = useState(false)\r\n const {\r\n phoneNumberList,\r\n phoneNumberListLoading,\r\n phoneNumberListError,\r\n setPhoneNumberListError,\r\n handlePhoneNumberSearch,\r\n } = usePhoneNumberSearch({ content: { internalErrorMessage: state.content.internalErrorMessage } })\r\n\r\n const planAdditonalPhoneNumbersAddon = useMemo(\r\n () => state.selectedPlan.addons.find((addon: Addon) => addon.sKU === ADDONS.ADDITIONAL_NUMBERS),\r\n [state.selectedPlan]\r\n )\r\n\r\n const addedAdditonalPhoneNumbersAddon = useMemo(\r\n () => state.selectedAddons.find((addon: SelectedAddon) => addon.sKU === ADDONS.ADDITIONAL_NUMBERS),\r\n [state.selectedAddons]\r\n )\r\n\r\n const {\r\n monthly,\r\n annual,\r\n user,\r\n year,\r\n month,\r\n quantityLabel,\r\n quantityLabelPlural,\r\n billedMonthlyPrice,\r\n billedAnnualPrice,\r\n } = state.content\r\n\r\n const newLicenseCopy = ` ${state.organizers > 1 ? quantityLabelPlural : quantityLabel}`\r\n\r\n const cardLabels: CardLabels = {\r\n monthly,\r\n annual,\r\n user,\r\n year,\r\n month,\r\n newLicenseCopy,\r\n billedMonthlyPrice,\r\n billedAnnualPrice,\r\n }\r\n\r\n useEffect(() => {\r\n if (state.isUserLoggedIn && state.selectedAddons.length > 0 && state.userType === USER_TYPES.ADDON) {\r\n actions.setSelectedAddons([])\r\n }\r\n }, [actions, state.isUserLoggedIn, state.selectedAddons, state.userType])\r\n\r\n useEffect(() => {\r\n const selectAddon = (addon: Addon) => {\r\n const localAddons = [{ sKU: addon.sKU, quantity: additionalPhoneNumbers }]\r\n actions.setSelectedAddons(localAddons)\r\n }\r\n\r\n if (additionalPhoneNumbers > 0) {\r\n if (\r\n planAdditonalPhoneNumbersAddon &&\r\n addedAdditonalPhoneNumbersAddon?.quantity !== additionalPhoneNumbers\r\n ) {\r\n selectAddon(planAdditonalPhoneNumbersAddon)\r\n }\r\n } else if (additionalPhoneNumbers === 0) {\r\n actions.setSelectedAddons([])\r\n }\r\n }, [actions, additionalPhoneNumbers, planAdditonalPhoneNumbersAddon, addedAdditonalPhoneNumbersAddon])\r\n\r\n useEffect(() => {\r\n if (state.selectedAddons.length > 0 && !initStateLoaded) {\r\n setAdditionalPhoneNumbers(addedAdditonalPhoneNumbersAddon?.quantity || NUMBERSCAP.MIN)\r\n setInitStateLoaded(true)\r\n }\r\n }, [addedAdditonalPhoneNumbersAddon?.quantity, initStateLoaded, state.selectedAddons.length])\r\n\r\n const recalculatePrice = useCallback(\r\n (initialData: BuyFormData, organizers: number, additionalNumbers: NUMBERSCAP, planSKU?: string) => {\r\n if (isAddressComplete(initialData) && organizers <= LICENSECAP.MAX && additionalNumbers <= NUMBERSCAP.MAX) {\r\n actions.calculatePrice(initialData, planSKU)\r\n }\r\n },\r\n [actions]\r\n )\r\n\r\n useEffect(() => {\r\n recalculatePrice(state.initialData, state.organizers, additionalPhoneNumbers)\r\n }, [state.initialData, state.organizers, additionalPhoneNumbers, recalculatePrice, state.billingFrequency])\r\n\r\n const isAddonFlow = state.isUserLoggedIn && state.userType === USER_TYPES.ADDON\r\n\r\n const fullPlanName = state.selectedPlan.name\r\n\r\n // tracking\r\n const { trackCustomizeViewClick } = useCustomizePageTracking({\r\n planName: state.selectedPlan.name,\r\n })\r\n\r\n const orderedPlans = [...state.planData]\r\n orderedPlans.reverse()\r\n\r\n const handleChangePlanClick = () => {\r\n // Only track first click of \"Change Plan\", according to WAE1-174\r\n if (!alreadyTrackedChangePlan) {\r\n trackCustomizeViewClick()\r\n setAlreadyTrackedChangePlan(true)\r\n }\r\n setShowCards(!showCards)\r\n }\r\n\r\n useEffect(() => {\r\n // Once the user saves the phone number successfully, close the number picker modal drawer\r\n setIsNumberPickerModalOpen(false)\r\n }, [phoneNumber])\r\n\r\n const resetFatalPhoneNumberError = () => {\r\n actions.setFatalError(false)\r\n setShowMissingPhoneNumberError(false)\r\n }\r\n\r\n const resetErrorsInNumberPickerModal = () => {\r\n actions.setReservingPhoneNumberError('')\r\n setPhoneNumberListError('')\r\n }\r\n\r\n const handleChoosePhoneNumber = () => {\r\n resetFatalPhoneNumberError()\r\n setIsNumberPickerModalOpen(true)\r\n }\r\n\r\n const handleOptionChange = (isChoosingPhoneNumber: boolean) => {\r\n resetFatalPhoneNumberError()\r\n setIsChoosingPhoneNumber(isChoosingPhoneNumber)\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n
\r\n
\r\n \"logo\"\r\n

{fullPlanName}

\r\n
\r\n {state.selectedPlan.description}\r\n
\r\n {isAddonFlow ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n {showCards && (\r\n \r\n {orderedPlans.map((plan) => (\r\n {\r\n actions.setSelectedPlan(plan.sKU)\r\n recalculatePrice(\r\n state.initialData,\r\n state.organizers,\r\n additionalPhoneNumbers,\r\n plan.sKU\r\n )\r\n }}\r\n logo={icon}\r\n locale={state.locale}\r\n hideCheckCircle\r\n title={plan.name}\r\n />\r\n ))}\r\n \r\n )}\r\n
\r\n \r\n

{state.content.quantityLabelLong}

\r\n
{state.content.quantityPopupInfo}
\r\n {isAddonFlow && (\r\n

\r\n {state.content.additionalUserLicences}: {state.content.howManyMore}\r\n

\r\n )}\r\n
\r\n \r\n \r\n {state.isUserLoggedIn && state.existingAccountInformation\r\n ? `${state.existingAccountInformation.quantity} ${\r\n state.existingAccountInformation.quantity > 1\r\n ? state.content.existingUserLicencePlural\r\n : state.content.existingUserLicense\r\n } + ${state.organizers} ${state.content.additional}`\r\n : `${\r\n state.organizers > 1 ? state.content.quantityLabelPlural : state.content.quantityLabel\r\n }`}\r\n \r\n
\r\n
\r\n {isNumberPickerFeatureEnabled && (\r\n \r\n

{state.content.mainNumber}

\r\n
{state.content.mainNumberSubText}
\r\n
\r\n \r\n
\r\n
\r\n )}\r\n {state.selectedPlan.addons && state.userType !== USER_TYPES.ADDON && (\r\n <>\r\n {state.selectedPlan.addons.map((planAddon: Addon) => {\r\n return (\r\n \r\n
\r\n

{isNumberPickerFeatureEnabled ? planAddon.name : planAddon.title}

\r\n {isAddonFlow && (\r\n \r\n )}\r\n
\r\n {!isNumberPickerFeatureEnabled && (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n {isNumberPickerFeatureEnabled ? (\r\n
\r\n \r\n {planAddon.additionalNumbersSubText}\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n \r\n {planAddon.additionalDescription}\r\n \r\n \r\n
\r\n )}\r\n
\r\n {\r\n setAdditionalPhoneNumbers(organizerNumber)\r\n }}\r\n theme=\"dark\"\r\n min={NUMBERSCAP.MIN}\r\n max={NUMBERSCAP.MAX}\r\n error={planAddon.quantityErrorMessage}\r\n qaTag=\"additional-phone-number\"\r\n />\r\n \r\n {additionalPhoneNumbers !== NUMBERSCAP.MIN + 1\r\n ? planAddon.quantityLabelShortPlural\r\n : planAddon.quantityLabelShort}\r\n \r\n
\r\n
\r\n )\r\n })}\r\n \r\n )}\r\n setIsPlanModalOpen(false)}>\r\n
\r\n

{state.content.changePlanMethodModalHeader}

\r\n \r\n setIsPlanModalOpen(false)}>\r\n {state.content.modalCloseButtonText}\r\n \r\n
\r\n
\r\n setEditPhoneModalOpen(false)}>\r\n
\r\n

{state.content.changeNumberModalHeader}

\r\n

\r\n \r\n

\r\n setEditPhoneModalOpen(false)}>\r\n {state.content.modalCloseButtonText}\r\n \r\n
\r\n
\r\n {props.isTabletOrMobileView && (\r\n \r\n )}\r\n props.nextSteps()}\r\n disabled={state.fatalErrorBlocker}\r\n data-qat=\"continue-to-checkout\"\r\n >\r\n {state.content.continue}\r\n \r\n {props.isTabletOrMobileView && }\r\n {state.isCouponValidAndApplied && state.couponServerData?.validTo && (\r\n
\r\n \r\n
\r\n )}\r\n {isNumberPickerModalOpen && (\r\n setIsNumberPickerModalOpen(false)}\r\n handleSearchNumbers={handlePhoneNumberSearch}\r\n handleChangeNumber={reservePhoneNumber}\r\n handleResetError={resetErrorsInNumberPickerModal}\r\n isFirstTimeChoosing={!phoneNumber}\r\n defaultSelectedNumber={undefined} // Don't pass in a default here, this fixes WAE1-1233\r\n numberList={phoneNumberList}\r\n loading={phoneNumberListLoading}\r\n reservingPhoneNumber={reservingPhoneNumber}\r\n />\r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport const ConnectedCustomize = connectRedux(Customize, mapCustomizeState, mapCustomizeActions)\r\n","import { useState } from 'react'\r\nimport { NumbersRequest, NumbersResponse, PhoneNumber, searchNumbers } from '@gtc/services/numbersApi'\r\n\r\ninterface IProps {\r\n content: {\r\n internalErrorMessage: string\r\n }\r\n}\r\n\r\nexport const usePhoneNumberSearch = (props: IProps) => {\r\n // props\r\n const { internalErrorMessage } = props.content\r\n\r\n // state\r\n const [phoneNumberList, setPhoneNumberList] = useState([] as PhoneNumber[])\r\n const [phoneNumberListLoading, setPhoneNumberListLoading] = useState(false)\r\n const [phoneNumberListError, setPhoneNumberListError] = useState('')\r\n\r\n const handlePhoneNumberSearch = async (params: NumbersRequest) => {\r\n setPhoneNumberListLoading(true)\r\n setPhoneNumberListError('')\r\n try {\r\n const response = await searchNumbers(params)\r\n const { phoneNumberDetails } = response.data as NumbersResponse\r\n if (!phoneNumberDetails) {\r\n throw new Error('Unknown error')\r\n }\r\n setPhoneNumberList(phoneNumberDetails)\r\n } catch (ex) {\r\n setPhoneNumberList([])\r\n setPhoneNumberListError(internalErrorMessage)\r\n } finally {\r\n setPhoneNumberListLoading(false)\r\n }\r\n }\r\n\r\n return {\r\n phoneNumberList,\r\n phoneNumberListLoading,\r\n phoneNumberListError,\r\n setPhoneNumberListError,\r\n handlePhoneNumberSearch,\r\n }\r\n}\r\n","import { AppState } from 'app-store'\r\nimport { getBuyFormState, getLabelContent } from '@gtc/state/selectors'\r\nimport { userActions } from '@gtc/state/user/actions'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { AccountFormInfoState } from './state'\r\n\r\nexport const mapAccountFormInfoState = (state: AppState): AccountFormInfoState => {\r\n const {\r\n createAnAccount,\r\n signIn,\r\n firstName,\r\n lastName,\r\n email,\r\n password,\r\n passwordRequirements,\r\n errorInvalidPassword,\r\n errorRequiredPassword,\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n } = getLabelContent(state)\r\n const { clearEmail, steps } = getBuyFormState(state)\r\n return {\r\n content: { createAnAccount, signIn, firstName, lastName, email, password, passwordRequirements },\r\n errorContent: {\r\n errorInvalidPassword,\r\n errorRequiredPassword,\r\n passwordStrength,\r\n passwordStrengthLevel1,\r\n passwordStrengthLevel2,\r\n passwordStrengthLevel3,\r\n passwordStrengthLevel4,\r\n passwordStrengthTipDrawer,\r\n passwordStrengthTip1,\r\n passwordStrengthTip2,\r\n passwordStrengthTip3,\r\n },\r\n clearEmail,\r\n steps,\r\n }\r\n}\r\n\r\nexport const mapAccountFormInfoActions = {\r\n checkExistingUser: (email: string, form?: BuyFormData) => userActions.checkExistingUser(email, form),\r\n userLogIn: () => userActions.userLogin(),\r\n}\r\n\r\nexport type AccountFormInfoActionsType = typeof mapAccountFormInfoActions\r\n","import { BoxWrapper, ConvertStringToReact, InputField, InlineErrorView } from '@common/components'\r\nimport { useClearField } from '@common/hooks'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport { CHECKOUTFORM_FIELDS, CHECKOUTFORM_STEPS } from '@gtc/constants'\r\nimport {\r\n AccountFormInfoActionsType,\r\n mapAccountFormInfoActions,\r\n mapAccountFormInfoState,\r\n} from '@gtc/connectedComponents/AccountFormInfo/connector'\r\nimport { AccountFormInfoState } from '@gtc/connectedComponents/AccountFormInfo/state'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { manuallyValidateFieldData } from '@gtc/utils'\r\nimport { Field, FieldProps, FormikProps } from 'formik'\r\nimport React, { FunctionComponent } from 'react'\r\nimport { PasswordValidation } from '@gtc/components/PasswordValidation'\r\nimport passwordValidationStyles from '@gtc/components/PasswordValidation/password-validation.module.css'\r\nimport accountStyles from './account-info.module.css'\r\n\r\nexport interface AccountFormInfoComponentProps {\r\n useSameForBilling: boolean\r\n resetFatalError: () => void\r\n canValidateAddress: (values: BuyFormData) => void\r\n formikRef: React.RefObject>\r\n setCheckoutFormInlineError: (value: string) => void\r\n removeCheckoutFormInlineError: (value: string) => void\r\n inlineErrors: { [key: string]: string } | Record\r\n isSubmittingRef: React.RefObject\r\n}\r\n\r\ntype AccountFormInfoProps = GoToComponentProps<\r\n AccountFormInfoState,\r\n AccountFormInfoActionsType,\r\n AccountFormInfoComponentProps\r\n>\r\nexport const AccountFormInfo: FunctionComponent = ({ state, actions, props }) => {\r\n const {\r\n useSameForBilling,\r\n resetFatalError,\r\n canValidateAddress,\r\n formikRef,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n isSubmittingRef,\r\n } = props\r\n const { content, errorContent, clearEmail, steps } = state\r\n const createUserAccountStep = steps[CHECKOUTFORM_STEPS.CREATE_USER_ACCOUNT]\r\n const userAccountCreated = createUserAccountStep.completed && !createUserAccountStep.error\r\n\r\n const userLogIn = () => actions.userLogIn()\r\n const existingUserCheck = (email: string, form: BuyFormData) => {\r\n actions.checkExistingUser(email, form)\r\n }\r\n\r\n // clear email\r\n useClearField(clearEmail, formikRef, CHECKOUTFORM_FIELDS.EMAIL)\r\n\r\n return (\r\n \r\n
\r\n

\r\n {' '}\r\n \r\n {content.signIn}\r\n \r\n

\r\n
\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n resetFatalError()\r\n canValidateAddress(form.values)\r\n }}\r\n onChange={async (e) => {\r\n field.onChange(e)\r\n if (useSameForBilling) {\r\n await form.setFieldValue(\r\n CHECKOUTFORM_FIELDS.BILLING_FIRST_NAME,\r\n e.target.value\r\n )\r\n }\r\n }}\r\n valid={manuallyValidateFieldData({ form, field, meta })}\r\n disabled={userAccountCreated}\r\n />\r\n \r\n )\r\n }}\r\n \r\n\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n resetFatalError()\r\n canValidateAddress(form.values)\r\n }}\r\n onChange={async (e) => {\r\n field.onChange(e)\r\n if (useSameForBilling) {\r\n await form.setFieldValue(\r\n CHECKOUTFORM_FIELDS.BILLING_LAST_NAME,\r\n e.target.value\r\n )\r\n }\r\n }}\r\n valid={manuallyValidateFieldData({ form, field, meta })}\r\n disabled={userAccountCreated}\r\n />\r\n \r\n )\r\n }}\r\n \r\n\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n if (!meta.error && e.target.value.length > 0) {\r\n existingUserCheck(e.target.value, form.values)\r\n canValidateAddress(form.values)\r\n }\r\n\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n form.validateField(field.name)\r\n }}\r\n valid={manuallyValidateFieldData({ form, field, meta })}\r\n disabled={userAccountCreated}\r\n />\r\n \r\n )\r\n }}\r\n \r\n\r\n \r\n {({ form, field, meta }: FieldProps) => (\r\n \r\n 0\r\n ? errorContent.errorInvalidPassword\r\n : errorContent.errorRequiredPassword\r\n }\r\n onBlur={(e) => {\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n value={field.value}\r\n valid={manuallyValidateFieldData({ form, field, meta })}\r\n touched={meta.touched}\r\n disabled={userAccountCreated}\r\n modifier={passwordValidationStyles['wrapper--compact']}\r\n passwordStrength={errorContent.passwordStrength}\r\n passwordStrengthLevel1={errorContent.passwordStrengthLevel1}\r\n passwordStrengthLevel2={errorContent.passwordStrengthLevel2}\r\n passwordStrengthLevel3={errorContent.passwordStrengthLevel3}\r\n passwordStrengthLevel4={errorContent.passwordStrengthLevel4}\r\n passwordStrengthTipDrawer={errorContent.passwordStrengthTipDrawer}\r\n passwordStrengthTip1={errorContent.passwordStrengthTip1}\r\n passwordStrengthTip2={errorContent.passwordStrengthTip2}\r\n passwordStrengthTip3={errorContent.passwordStrengthTip3}\r\n isSubmittingRef={isSubmittingRef}\r\n />\r\n \r\n )}\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport const ConnectedAccountFormInfo = connectRedux(\r\n AccountFormInfo,\r\n mapAccountFormInfoState,\r\n mapAccountFormInfoActions\r\n)\r\n","import { locationActions } from '@common/state/location/actions'\r\nimport { getLocationState } from '@common/state/selectors'\r\nimport { AppState } from 'app-store'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { checkoutActions } from '@gtc/state/checkout/actions'\r\nimport { getContentData, getLabelContent, getUserState } from '@gtc/state/selectors'\r\nimport { SC_SITE } from '@common/constants'\r\nimport { BillingFormInfoState } from './state'\r\n\r\nexport const mapBillingFormInfoState = (state: AppState): BillingFormInfoState => {\r\n const {\r\n billingInformation,\r\n useAccountInfo,\r\n firstName,\r\n lastName,\r\n address,\r\n country,\r\n countryPopupText,\r\n city,\r\n state: addressState,\r\n pleaseSelect,\r\n postalCode,\r\n phone,\r\n } = getLabelContent(state)\r\n const location = getLocationState(state)\r\n\r\n const {\r\n existingBillingInformation,\r\n loggedIn: { isUserLoggedIn },\r\n } = getUserState(state)\r\n const { DefaultCountry } = getContentData(state)\r\n return {\r\n content: {\r\n billingInformation,\r\n useAccountInfo,\r\n firstName,\r\n lastName,\r\n address,\r\n country,\r\n countryPopupText,\r\n city,\r\n state: addressState,\r\n pleaseSelect,\r\n postalCode,\r\n phone,\r\n },\r\n location,\r\n isUserLoggedIn,\r\n existingBillingInformation,\r\n DefaultCountry,\r\n }\r\n}\r\n\r\nexport const mapBillingFormInfoActions = {\r\n getCountries: () => locationActions.getCountries(SC_SITE.CONNECT),\r\n calculatePrice: (values: BuyFormData) => checkoutActions.calculatePrice(values),\r\n}\r\nexport type BillingFormInfoActionsType = typeof mapBillingFormInfoActions\r\n","// extracted by mini-css-extract-plugin\nexport default {\"grid\":\"billing-info-module__grid\",\"cc-first-name\":\"billing-info-module__cc-first-name\",\"cc-last-name\":\"billing-info-module__cc-last-name\",\"address\":\"billing-info-module__address\",\"city\":\"billing-info-module__city\",\"state\":\"billing-info-module__state\",\"zipcode\":\"billing-info-module__zipcode\",\"country\":\"billing-info-module__country\",\"phone\":\"billing-info-module__phone\",\"checkbox-wrapper\":\"billing-info-module__checkbox-wrapper\",\"existing-address\":\"billing-info-module__existing-address\",\"country-wrapper\":\"billing-info-module__country-wrapper\",\"tooltip-holder\":\"billing-info-module__tooltip-holder\"};","import { BoxWrapper, Checkbox, InputField, Select, Tooltip, InlineErrorView } from '@common/components'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\n\r\nimport { Field, FieldProps, FormikProps } from 'formik'\r\nimport React, { FunctionComponent, useCallback, useEffect, useRef, useState } from 'react'\r\nimport { isEmpty } from 'lodash-es'\r\nimport { manuallyValidateFieldData } from '@gtc/utils'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport { BillingFormInfoState } from '@gtc/connectedComponents/BillingFormInfo/state'\r\nimport {\r\n BillingFormInfoActionsType,\r\n mapBillingFormInfoActions,\r\n mapBillingFormInfoState,\r\n} from '@gtc/connectedComponents/BillingFormInfo/connector'\r\nimport { COUNTRIES, DIRECTIONS, LANGUAGE } from '@common/constants'\r\nimport { Address } from '@common/state/location/state'\r\nimport { CHECKOUTFORM_FIELDS } from '@gtc/constants'\r\nimport selectStyles from '@common/components/Select/select.module.css'\r\nimport { useAddressAutoFill } from '@common/hooks/useAddressAutoFill'\r\nimport { GooglePlace } from '@common/state/addressAutoFill/state'\r\nimport { getAddressFromGooglePlace } from '@common/utils/getAddressFromGooglePlace'\r\nimport billingStyles from './billing-info.module.css'\r\n\r\nexport interface BillingFormInfoComponentProps {\r\n useSameForBilling: boolean\r\n resetFatalError: () => void\r\n canValidateAddress: (values: BuyFormData) => void\r\n setUseSameForBilling: (useSame: boolean) => void\r\n trackBillingInfoStep: () => void\r\n setHasAddressValidationErrors: (value: React.SetStateAction) => void\r\n formikRef: React.RefObject>\r\n setCheckoutFormInlineError: (value: string) => void\r\n removeCheckoutFormInlineError: (value: string) => void\r\n inlineErrors: { [key: string]: string } | Record\r\n}\r\ntype BillingFormInfoProps = GoToComponentProps<\r\n BillingFormInfoState,\r\n BillingFormInfoActionsType,\r\n BillingFormInfoComponentProps\r\n>\r\n\r\nexport const BillingFormInfo: FunctionComponent = ({ state, actions, props }) => {\r\n const { content, existingBillingInformation, isUserLoggedIn, location } = state\r\n\r\n // Do not set allowAddressAutofill back to true until bug WAE1-1721 is solved.\r\n // (See comment replies on that ticket for root cause of the bug.)\r\n const allowAddressAutofill = false\r\n\r\n const {\r\n useSameForBilling,\r\n resetFatalError,\r\n canValidateAddress,\r\n setUseSameForBilling,\r\n trackBillingInfoStep,\r\n setHasAddressValidationErrors,\r\n formikRef,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n } = props\r\n const [countryCode, setCountryCode] = useState(state.DefaultCountry)\r\n const streetFieldRef = useRef(null)\r\n // Note: Google Places API only allows searching in up to 5 countries at a time\r\n const autoFillCountries = [COUNTRIES.US.toLowerCase()]\r\n const autoFillLanguage = LANGUAGE.EN\r\n\r\n const selectCountry = (e: React.ChangeEvent) => {\r\n setCountryCode(e.target.value)\r\n }\r\n const selectedCountry = state.location.countries.find((country) => {\r\n return country.abbreviation === COUNTRIES.US\r\n })\r\n\r\n const setAddressErrors = useCallback(\r\n (errorMessage: string) => {\r\n if (formikRef.current) {\r\n formikRef.current.setFieldError('Street1', errorMessage)\r\n formikRef.current.setFieldError('City', errorMessage)\r\n formikRef.current.setFieldError('StateCode', errorMessage)\r\n formikRef.current.setFieldError('ZipCode', errorMessage)\r\n }\r\n },\r\n [formikRef]\r\n )\r\n\r\n const setAddressValues = useCallback(\r\n (address: Address) => {\r\n if (formikRef.current) {\r\n formikRef.current.setFieldValue('Street1', address.addressLine1)\r\n formikRef.current.setFieldValue('City', address.city)\r\n formikRef.current.setFieldValue('StateCode', address.state)\r\n formikRef.current.setFieldValue('ZipCode', address.postalCode)\r\n }\r\n },\r\n [formikRef]\r\n )\r\n\r\n const getFormValuesWithUpdatedAddress = useCallback(\r\n (correctedAddress: Address) => {\r\n if (formikRef.current) {\r\n const currentFormValues = formikRef.current.values\r\n const { addressLine1: Street1, city: City, state: StateCode, postalCode: ZipCode } = correctedAddress\r\n const updatedAddressValues = { ...currentFormValues, Street1, City, StateCode, ZipCode }\r\n return updatedAddressValues\r\n }\r\n return null\r\n },\r\n [formikRef]\r\n )\r\n\r\n // effects\r\n // get list of countries\r\n useEffect(() => {\r\n if (!location.isCountriesLoaded) {\r\n actions.getCountries()\r\n }\r\n }, [actions, location.isCountriesLoaded])\r\n\r\n // show & reset address errors\r\n useEffect(() => {\r\n if (!location.validAddress && location.addressErrors.length !== 0) {\r\n setHasAddressValidationErrors(true)\r\n setAddressErrors(' ') // use a space to get the fields to outline in red but not show a message under them since there will be an error displayed at the top of the form\r\n } else if (location.validAddress && location.addressErrors.length === 0) {\r\n setHasAddressValidationErrors(false)\r\n setAddressErrors('')\r\n }\r\n }, [location, setAddressErrors, setHasAddressValidationErrors])\r\n\r\n // update with corrected address\r\n useEffect(() => {\r\n if (location.validAddress && location.correctedAddress.city && formikRef.current) {\r\n setAddressValues(location.correctedAddress)\r\n // we need to do this because, formik setFieldValue is async in nature and doesn't return a promise\r\n // so we can't assume we have updated values within formikRef\r\n const updatedFormValues = getFormValuesWithUpdatedAddress(location.correctedAddress)\r\n if (updatedFormValues) {\r\n actions.calculatePrice(updatedFormValues)\r\n }\r\n }\r\n }, [\r\n actions,\r\n location.validAddress,\r\n location.correctedAddress,\r\n formikRef,\r\n setAddressValues,\r\n getFormValuesWithUpdatedAddress,\r\n ])\r\n\r\n const handleAutoFillAddress = (place: GooglePlace) => {\r\n const addr = getAddressFromGooglePlace(place)\r\n setAddressValues(addr)\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n canValidateAddress(formikRef.current!.values)\r\n }\r\n\r\n useAddressAutoFill({\r\n language: autoFillLanguage,\r\n streetFieldRef,\r\n countries: autoFillCountries,\r\n onChangePlace: handleAutoFillAddress,\r\n shouldLoad: allowAddressAutofill,\r\n })\r\n\r\n return (\r\n \r\n
\r\n

{content.billingInformation}

\r\n {!isUserLoggedIn || isEmpty(existingBillingInformation) ? (\r\n <>\r\n
\r\n setUseSameForBilling(!useSameForBilling)}\r\n label={content.useAccountInfo}\r\n qaTag=\"checkout-form-same-for-billing\"\r\n />\r\n
\r\n
\r\n <>\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-first-name\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-last-name\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n \r\n
\r\n \r\n {({ form, field }: FieldProps) => {\r\n return (\r\n {\r\n selectCountry(e)\r\n field.onChange(e)\r\n }}\r\n onBlur={() => {\r\n canValidateAddress(form.values)\r\n }}\r\n value={field.value}\r\n selected={!!countryCode}\r\n wrapperClass={billingStyles.country}\r\n modifier={selectStyles['select-wrapper--compact']}\r\n >\r\n {location.countries.length === 0 ? (\r\n \r\n ) : (\r\n location.countries.map((country) => (\r\n \r\n {country.name}\r\n \r\n ))\r\n )}\r\n \r\n )\r\n }}\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n trackBillingInfoStep()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-address\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n \r\n {({ field, form, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-city\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n <>\r\n {selectedCountry && selectedCountry.states ? (\r\n {\r\n field.onChange(e)\r\n }}\r\n onBlur={async (e) => {\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n valid={manuallyValidateFieldData({ form, field, meta })}\r\n wrapperClass={billingStyles.state}\r\n modifier={selectStyles['select-wrapper--compact']}\r\n >\r\n \r\n {selectedCountry.states.map((countryState) => (\r\n \r\n {countryState.name}\r\n \r\n ))}\r\n \r\n ) : (\r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n />\r\n )}\r\n \r\n \r\n )\r\n }}\r\n \r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n canValidateAddress(form.values)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-postal-code\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n data-qat=\"billing-contact-number\"\r\n />\r\n \r\n )\r\n }}\r\n \r\n
\r\n \r\n ) : (\r\n existingBillingInformation && (\r\n
\r\n
\r\n {existingBillingInformation.firstName} {existingBillingInformation.lastName}\r\n
\r\n
{existingBillingInformation.addressLine1}
\r\n
\r\n {existingBillingInformation.city} {existingBillingInformation.state}{' '}\r\n {existingBillingInformation.postalCode}\r\n
\r\n
{existingBillingInformation.phoneNumber}
\r\n
\r\n )\r\n )}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport const ConnectedBillingFormInfo = connectRedux(\r\n BillingFormInfo,\r\n mapBillingFormInfoState,\r\n mapBillingFormInfoActions\r\n)\r\n","import { getFatalError, getFlexState } from '@common/state/selectors'\r\nimport { AppState } from 'app-store'\r\nimport { flexActions } from '@common/state/flex/actions'\r\nimport { getLabelContent, getUserState } from '@gtc/state/selectors'\r\nimport { PaymentFormInfoState } from './state'\r\n\r\nexport const mapPaymentFormInfoState = (state: AppState): PaymentFormInfoState => {\r\n const {\r\n paymentDetails,\r\n edit,\r\n cardNumber,\r\n expirationDate,\r\n cVVHint,\r\n cVV,\r\n cVVPopupInfo,\r\n errorInvalidCreditCardNumber,\r\n errorRequiredCreditCardNumber,\r\n errorInvalidCVV,\r\n errorRequiredCVV,\r\n secure,\r\n } = getLabelContent(state)\r\n const { isFatalError } = getFatalError(state)\r\n const { existingPaymentInformation } = getUserState(state)\r\n const { isCardValid, isCvvValid, userInteractedWithFlexField, userInteractedWithFlexFieldCvv, microformCreated } =\r\n getFlexState(state)\r\n\r\n return {\r\n content: { paymentDetails, edit, cardNumber, expirationDate, cVVHint, cVV, cVVPopupInfo, secure },\r\n errorContent: {\r\n errorInvalidCreditCardNumber,\r\n errorRequiredCreditCardNumber,\r\n errorInvalidCVV,\r\n errorRequiredCVV,\r\n },\r\n isFatalError,\r\n existingPaymentInformation,\r\n isCardValid,\r\n isCvvValid,\r\n userInteractedWithFlexField,\r\n userInteractedWithFlexFieldCvv,\r\n microformCreated: !!microformCreated,\r\n }\r\n}\r\n\r\nexport const mapPaymentFormInfoActions = {\r\n setCardValid: (valid: boolean) => flexActions.setCardValid(valid),\r\n setCvvValid: (valid: boolean) => flexActions.setCvvValid(valid),\r\n setUserInteractedWithFlexField: (interacted: boolean) => flexActions.setUserInteractedWithFlexField(interacted),\r\n setUserInteractedWithFlexFieldCvv: (interacted: boolean) =>\r\n flexActions.setUserInteractedWithFlexFieldCvv(interacted),\r\n}\r\n\r\nexport type PaymentFormInfoActionsType = typeof mapPaymentFormInfoActions\r\n","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"payment-info-module__wrapper\",\"cc-grid\":\"payment-info-module__cc-grid\",\"cc-grid--hidden\":\"payment-info-module__cc-grid--hidden\",\"heading\":\"payment-info-module__heading\",\"cc\":\"payment-info-module__cc\",\"exp-date\":\"payment-info-module__exp-date\",\"cvv\":\"payment-info-module__cvv\",\"cvv-wrapper\":\"payment-info-module__cvv-wrapper\",\"tooltip-holder\":\"payment-info-module__tooltip-holder\",\"cc-wrapper\":\"payment-info-module__cc-wrapper\",\"credit-card\":\"payment-info-module__credit-card\",\"credit-card--error\":\"payment-info-module__credit-card--error\",\"credit-card--focus\":\"payment-info-module__credit-card--focus\",\"credit-card--valid\":\"payment-info-module__credit-card--valid\",\"cc-img\":\"payment-info-module__cc-img\",\"error\":\"payment-info-module__error\",\"optional\":\"payment-info-module__optional\",\"terms\":\"payment-info-module__terms\",\"submit\":\"payment-info-module__submit\",\"optout-button\":\"payment-info-module__optout-button\",\"optout-checkbox\":\"payment-info-module__optout-checkbox\",\"payment-details\":\"payment-info-module__payment-details\",\"secure-badge\":\"payment-info-module__secure-badge\",\"secure-icon\":\"payment-info-module__secure-icon\"};","import { BoxWrapper, InputField, Tooltip, InlineErrorView } from '@common/components'\r\nimport { FieldProps, Field } from 'formik'\r\nimport React, { FunctionComponent, useEffect } from 'react'\r\nimport PencilIcon from '@common/images/icon-modify-on.svg'\r\nimport CreditIcon from '@common/images/img-icon-credit@2x.png'\r\nimport SecureIcon from '@common/images/icon-secure.svg'\r\nimport { ConnectedFlexForm } from '@common/connectedComponents'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport { PaymentFormInfoState } from '@gtc/connectedComponents/PaymentFormInfo/state'\r\nimport {\r\n mapPaymentFormInfoActions,\r\n mapPaymentFormInfoState,\r\n PaymentFormInfoActionsType,\r\n} from '@gtc/connectedComponents/PaymentFormInfo/connector'\r\nimport { CHECKOUTFORM_FIELDS } from '@gtc/constants'\r\nimport { FlexField } from '@common/components/FlexField/flex-field'\r\nimport { DIRECTIONS } from '@common/constants'\r\nimport paymentStyles from './payment-info.module.css'\r\n\r\nexport interface PaymentFormInfoComponentProps {\r\n resetFatalError: () => void\r\n hasExistingPaymentInformation: boolean\r\n setIsPaymentModalOpen: (value: React.SetStateAction) => void\r\n trackPaymentStep: () => void\r\n setHasCardValidationErrors: (value: React.SetStateAction) => void\r\n setCheckoutFormInlineError: (value: string) => void\r\n removeCheckoutFormInlineError: (value: string) => void\r\n inlineErrors: { [key: string]: string } | Record\r\n}\r\ntype PaymentFormInfoProps = GoToComponentProps<\r\n PaymentFormInfoState,\r\n PaymentFormInfoActionsType,\r\n PaymentFormInfoComponentProps\r\n>\r\n\r\nexport const PaymentFormInfo: FunctionComponent = ({ state, actions, props }) => {\r\n const {\r\n content,\r\n errorContent,\r\n isFatalError,\r\n existingPaymentInformation,\r\n isCardValid,\r\n isCvvValid,\r\n userInteractedWithFlexField,\r\n userInteractedWithFlexFieldCvv,\r\n microformCreated,\r\n } = state\r\n const {\r\n resetFatalError,\r\n setIsPaymentModalOpen,\r\n hasExistingPaymentInformation,\r\n trackPaymentStep,\r\n setHasCardValidationErrors,\r\n setCheckoutFormInlineError,\r\n removeCheckoutFormInlineError,\r\n inlineErrors,\r\n } = props\r\n\r\n // effects\r\n // if credit card is invalid display error message\r\n useEffect(() => {\r\n if (!isCardValid && userInteractedWithFlexField) {\r\n setHasCardValidationErrors(true)\r\n if ((inlineErrors && !inlineErrors.cardCC) || !inlineErrors) {\r\n setCheckoutFormInlineError('cardCC')\r\n }\r\n }\r\n if (isCardValid && userInteractedWithFlexField) {\r\n setHasCardValidationErrors(false)\r\n if (inlineErrors && inlineErrors.cardCC) {\r\n removeCheckoutFormInlineError('cardCC')\r\n }\r\n }\r\n\r\n if (!isCvvValid && userInteractedWithFlexFieldCvv) {\r\n setHasCardValidationErrors(true)\r\n if ((inlineErrors && !inlineErrors.cardCvv) || !inlineErrors) {\r\n setCheckoutFormInlineError('cardCvv')\r\n }\r\n }\r\n\r\n if (isCvvValid && userInteractedWithFlexFieldCvv) {\r\n setHasCardValidationErrors(false)\r\n if (inlineErrors && inlineErrors.cardCvv) {\r\n removeCheckoutFormInlineError('cardCvv')\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n isCardValid,\r\n setHasCardValidationErrors,\r\n userInteractedWithFlexField,\r\n userInteractedWithFlexFieldCvv,\r\n isCvvValid,\r\n inlineErrors,\r\n ])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n
\r\n

{content.paymentDetails}

\r\n
\r\n \"secure\"\r\n {content.secure}\r\n
\r\n
\r\n {hasExistingPaymentInformation && (\r\n \r\n )}\r\n
\r\n
\r\n \r\n
\r\n
\r\n {!hasExistingPaymentInformation && }\r\n\r\n {/* Credit Card Number */}\r\n {!hasExistingPaymentInformation ? (\r\n
\r\n {\r\n actions.setCardValid(valid)\r\n actions.setUserInteractedWithFlexField(false)\r\n }}\r\n onBlur={() => {\r\n actions.setUserInteractedWithFlexField(true)\r\n trackPaymentStep()\r\n resetFatalError()\r\n }}\r\n shouldRefresh={isFatalError}\r\n />\r\n
\r\n ) : (\r\n // Show a disabled field if isAddonFlow\r\n \r\n )}\r\n\r\n {/* Expiration Date */}\r\n \r\n {({ form, field, meta }: FieldProps) => {\r\n return (\r\n \r\n {\r\n await form.setFieldValue(field.name, e.target.value.trim())\r\n field.onBlur(e)\r\n form.validateField(field.name)\r\n resetFatalError()\r\n }}\r\n onChange={(e) => {\r\n field.onChange(e)\r\n }}\r\n valid={!meta.error && meta.touched}\r\n />\r\n \r\n )\r\n }}\r\n \r\n\r\n {/* CVV Code */}\r\n
\r\n {!hasExistingPaymentInformation ? (\r\n {\r\n actions.setCvvValid(valid)\r\n actions.setUserInteractedWithFlexFieldCvv(false)\r\n }}\r\n onBlur={() => {\r\n actions.setUserInteractedWithFlexFieldCvv(true)\r\n resetFatalError()\r\n }}\r\n shouldRefresh={isFatalError}\r\n />\r\n ) : (\r\n // Show a disabled field if isAddonFlow\r\n \r\n )}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport const ConnectedPaymentFormInfo = connectRedux(\r\n PaymentFormInfo,\r\n mapPaymentFormInfoState,\r\n mapPaymentFormInfoActions\r\n)\r\n","import { Checkbox, ConvertStringToReact, FormSubmitButton, TrustArcLogo } from '@common/components'\r\nimport { connectRedux, GoToComponentProps } from '@common/utils'\r\nimport { NumberPickerContent } from '@gtc/components/NumberPicker'\r\nimport { ConnectedOrderSummary } from '@gtc/connectedComponents'\r\nimport {\r\n CheckoutFormSubmissionActionsType,\r\n mapCheckoutFormSubmissionActions,\r\n mapCheckoutFormSubmissionState,\r\n} from '@gtc/connectedComponents/CheckoutFormSubmission/connector'\r\nimport { CheckoutFormSubmissionState } from '@gtc/connectedComponents/CheckoutFormSubmission/state'\r\n\r\nimport React, { FunctionComponent, useState } from 'react'\r\nimport paymentStyles from '../PaymentFormInfo/payment-info.module.css'\r\n\r\nexport interface CheckoutFormSubmissionComponentProps {\r\n isSubmitting: boolean\r\n preSubmit: () => void\r\n isTabletOrMobileView?: boolean | undefined\r\n setIsOptOut: (value: React.SetStateAction) => void\r\n isOptOut: boolean\r\n contentNumberPicker: NumberPickerContent\r\n inlineErrors: { [key: string]: string } | Record\r\n}\r\ntype CheckoutFormSubmissionProps = GoToComponentProps<\r\n CheckoutFormSubmissionState,\r\n CheckoutFormSubmissionActionsType,\r\n CheckoutFormSubmissionComponentProps\r\n>\r\n\r\nexport const CheckoutFormSubmission: FunctionComponent = ({ state, props }) => {\r\n const { content, isFatalError, fatalErrorBlocker, totalLoading, displayOptOut: initialDisplayOptOut } = state\r\n const { isSubmitting, preSubmit, isTabletOrMobileView, setIsOptOut, isOptOut, contentNumberPicker, inlineErrors } =\r\n props\r\n const [displayOptOut, setDisplayOptOut] = useState(initialDisplayOptOut)\r\n return (\r\n <>\r\n {!isTabletOrMobileView ? (\r\n <>\r\n {\r\n preSubmit()\r\n }}\r\n text={content.completePurchase}\r\n />\r\n
\r\n {' '}\r\n setDisplayOptOut(!displayOptOut)}\r\n type=\"button\"\r\n >\r\n {content.optOut}\r\n \r\n {displayOptOut && (\r\n setIsOptOut(!isOptOut)}\r\n modifier={paymentStyles['optout-checkbox']}\r\n qaTag=\"checkout-form-optout\"\r\n />\r\n )}\r\n
\r\n \r\n ) : (\r\n <>\r\n \r\n {\r\n preSubmit()\r\n }}\r\n text={content.completePurchase}\r\n />\r\n
\r\n {' '}\r\n setDisplayOptOut(!displayOptOut)}\r\n type=\"button\"\r\n >\r\n {content.optOut}\r\n \r\n {displayOptOut && (\r\n setIsOptOut(!isOptOut)}\r\n modifier={paymentStyles['optout-checkbox']}\r\n qaTag=\"checkout-form-optout\"\r\n />\r\n )}\r\n
\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const ConnectedCheckoutFormSubmission = connectRedux(\r\n CheckoutFormSubmission,\r\n mapCheckoutFormSubmissionState,\r\n mapCheckoutFormSubmissionActions\r\n)\r\n","import { getFatalError, getMarketingState } from '@common/state/selectors'\r\nimport { AppState } from 'app-store'\r\nimport { getCheckoutState, getLabelContent } from '@gtc/state/selectors'\r\nimport { CheckoutFormSubmissionState } from './state'\r\n\r\nexport const mapCheckoutFormSubmissionState = (state: AppState): CheckoutFormSubmissionState => {\r\n const { completePurchase, pricingNote, optOut, optOutCheckboxLabel } = getLabelContent(state)\r\n const { isFatalError, fatalErrorBlocker } = getFatalError(state)\r\n const { totalLoading } = getCheckoutState(state)\r\n const { displayOptOut } = getMarketingState(state)\r\n return {\r\n content: { completePurchase, pricingNote, optOut, optOutCheckboxLabel },\r\n isFatalError,\r\n fatalErrorBlocker,\r\n totalLoading,\r\n displayOptOut,\r\n }\r\n}\r\n\r\nexport const mapCheckoutFormSubmissionActions = {}\r\n\r\nexport type CheckoutFormSubmissionActionsType = typeof mapCheckoutFormSubmissionActions\r\n","export enum LICENSECAP {\r\n MIN = 1,\r\n MAX = 20,\r\n}\r\n\r\nexport enum NUMBERSCAP {\r\n MIN = 0,\r\n MAX = 20,\r\n}\r\n","export enum USER_TYPES {\r\n NEW = 'NEW',\r\n TRIALER = 'TRIALER',\r\n ADDON = 'ADDON',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n BANNED = 'BANNED',\r\n EXPIRED = 'EXPIRED',\r\n IDENTITY_ONLY = 'IDENTITY_ONLY',\r\n}\r\n\r\nexport enum USER_TYPES_RESPONSE {\r\n USER_IDENTITY_NOT_FOUND = 'ValidateUserIdentityNotFound',\r\n USER_BOSS_NOT_FOUND = 'ValidateUserBossNotFound',\r\n}\r\n\r\nexport enum PARTIAL_NON_VALIDATION_USER_TYPES {\r\n TRIALER = 'TRIALER',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n EXPIRED = 'EXPIRED',\r\n}\r\n","export enum ADDONS {\r\n ADDITIONAL_NUMBERS = 'G2CPreDID',\r\n}\r\n","export enum CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES {\r\n FIRSTNAME = 'FirstName',\r\n LASTNAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n COUNTRYCODE = 'CountryCode',\r\n STATECODE = 'StateCode',\r\n}\r\n","export enum CHECKOUTFORM_STEPS {\r\n CREATE_FLEX_TOKEN = 'createFlexToken',\r\n CREATE_USER_ACCOUNT = 'createUserAccount',\r\n SAVE_BILLING_INFO = 'saveBillingInfo',\r\n SAVE_PAYMENT_INFO = 'savePaymentInfo',\r\n GET_AVAILABLE_PAYMENT_METHODS = 'getAvailablepaymentMethods',\r\n SUBMIT_PAYMENT = 'submitPayment',\r\n}\r\n","export enum TRACKING_COMPONENTS {\r\n CHECKOUT_PAGE = 'checkout-form',\r\n FORM_SUBMISSION_SAGA = 'form-submission-saga',\r\n BILLING_PAGE = 'billing',\r\n CUSTOMIZE_PAGE = 'customize',\r\n NEXT_STEPS_PAGE = 'next-steps',\r\n CONFIRMATION_PAGE = 'confirmation',\r\n FATAL_ERROR_PAGE = 'fatal-error',\r\n CALCULATE_PRICE_SAGA = 'calculate-price-saga',\r\n CREATE_USER_SAGA = 'create-user-saga',\r\n CREATE_BILLING_INFO_SAGA = 'create-billing-info-saga',\r\n CREATE_PAYMENT_SAGA = 'create-payment-saga',\r\n GET_AVAILABLE_PAYMENT_METHODS_SAGA = 'get-available-payment-methods-saga',\r\n SUBMIT_PAYMENT_SAGA = 'submit-payment-saga',\r\n EXISTING_USER_FORM_SUBMISSION_SAGA = 'existing-user-form-submission-saga',\r\n}\r\n","export enum CHECKOUTFORM_FIELDS {\r\n FIRST_NAME = 'FirstName',\r\n LAST_NAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n BILLING_FIRST_NAME = 'BillingFirstName',\r\n BILLING_LAST_NAME = 'BillingLastName',\r\n STREET1 = 'Street1',\r\n COUNTRY_CODE = 'CountryCode',\r\n CITY = 'City',\r\n STATE_CODE = 'StateCode',\r\n ZIP_CODE = 'ZipCode',\r\n CONTACT_PHONE = 'ContactPhone',\r\n EXPIRATION_DATE = 'ExpirationDate',\r\n}\r\n","export enum PRODUCT_PRICE_ITEM_TYPE {\r\n product = 'Product',\r\n fee = 'Fee',\r\n volumeDiscount = 'VolumeDiscount',\r\n amountOffAutoDiscount = 'AmountOffAutoDiscount',\r\n}\r\n","export enum BUY_TYPE {\r\n TRIAL_CONVERSION = 'trial conversion',\r\n ADDON = 'add-on',\r\n DIRECT_BUY = 'direct buy',\r\n}\r\n","import { TrackingState } from '@common/state/tracking/state'\r\nimport { GTCTrackingContext } from '@gtc/connectedComponents/Tracking'\r\nimport { useContext, useMemo } from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nexport const useGTCTracking = () => {\r\n const location = useLocation()\r\n const trackingContext = useContext(GTCTrackingContext)\r\n if (!trackingContext) {\r\n throw new Error(\r\n 'useGTCTrackingContext must only be used within GTCTrackingProvider component and its children.'\r\n )\r\n }\r\n\r\n const currentLocation = location.pathname\r\n const trackingWrapper = useMemo(\r\n () => ({\r\n track: (trackingInfo: TrackingState, component: string) => {\r\n const trackingData = {\r\n ...trackingInfo,\r\n eventData: { ...trackingInfo.eventData, currentLocation },\r\n }\r\n trackingContext.track(trackingData, component)\r\n },\r\n }),\r\n [currentLocation, trackingContext]\r\n )\r\n return trackingWrapper\r\n}\r\n","import { TRACKING_EVENTS } from '@common/constants'\r\nimport { usePageLoad } from '@common/hooks'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { useGTCTracking } from './useGTCTracking'\r\n\r\nexport interface BillingPageTrackingParams {\r\n contentLoaded?: boolean\r\n isUserLoggedIn?: boolean\r\n}\r\nexport const useBillingPageTracking = (params: BillingPageTrackingParams) => {\r\n const { track } = useGTCTracking()\r\n const componentName = TRACKING_COMPONENTS.BILLING_PAGE\r\n const trackCTAClick = (name: string, url: string) => {\r\n track({ event: TRACKING_EVENTS.CLICK_CTA, eventData: { name, url } }, componentName)\r\n }\r\n usePageLoad(() => {\r\n track({ event: TRACKING_EVENTS.SESSION_INFORMATION }, componentName)\r\n }, params.contentLoaded && params.isUserLoggedIn)\r\n\r\n return { trackCTAClick }\r\n}\r\n","import { TRACKING_EVENTS, GTC_VIEW_PATHS } from '@common/constants'\r\nimport { usePageLoad } from '@common/hooks'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { FormikProps } from 'formik'\r\nimport { useState, useEffect } from 'react'\r\nimport { useGTCTracking } from './useGTCTracking'\r\n\r\nexport interface CheckoutFormPageTrackingParams {\r\n planName: string\r\n formikRef: React.RefObject>\r\n}\r\n\r\nexport const useCheckoutFormPageTracking = (params: CheckoutFormPageTrackingParams) => {\r\n const [hasTrackedStartForm, setHasTrackedStartForm] = useState(false)\r\n const componentName = TRACKING_COMPONENTS.CHECKOUT_PAGE\r\n const { track } = useGTCTracking()\r\n const trackFormError = (formIds: string[], formErrors: string[]) => {\r\n track({ event: TRACKING_EVENTS.ERROR_FORM, eventData: { formIds, formErrors } }, componentName)\r\n }\r\n const trackBillingInfoStep = () => {\r\n track({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData: { step: 3 } }, componentName)\r\n }\r\n const trackPaymentStep = () => {\r\n track({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData: { step: 4 } }, componentName)\r\n }\r\n const trackSubmitForm = () => {\r\n track({ event: TRACKING_EVENTS.SUBMIT_FORM }, componentName)\r\n }\r\n usePageLoad(() => {\r\n track({ event: TRACKING_EVENTS.VIEW_CONTENT }, componentName)\r\n track({ event: TRACKING_EVENTS.LOAD_FORM }, componentName)\r\n track({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData: { step: 2 } }, componentName)\r\n }, !!params.planName)\r\n\r\n useEffect(() => {\r\n if (params.formikRef.current) {\r\n const fieldTouched = Object.keys(params.formikRef.current.touched).length > 0\r\n if (fieldTouched && !hasTrackedStartForm) {\r\n setHasTrackedStartForm(true)\r\n track({ event: TRACKING_EVENTS.START_FORM }, componentName)\r\n }\r\n return () => {\r\n if (\r\n fieldTouched &&\r\n hasTrackedStartForm &&\r\n window.location.pathname !== GTC_VIEW_PATHS.CONNECT_CHECKOUT\r\n ) {\r\n track({ event: TRACKING_EVENTS.ABANDON_FORM }, componentName)\r\n }\r\n }\r\n }\r\n return undefined\r\n }, [componentName, hasTrackedStartForm, params.formikRef, track])\r\n return { trackFormError, trackBillingInfoStep, trackPaymentStep, trackSubmitForm }\r\n}\r\n","import { TRACKING_EVENTS } from '@common/constants'\r\nimport { usePageLoad } from '@common/hooks'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { useGTCTracking } from './useGTCTracking'\r\n\r\nexport interface CustomizePageTrackingParams {\r\n planName: string\r\n}\r\n\r\nexport const useCustomizePageTracking = (params: CustomizePageTrackingParams) => {\r\n const componentName = TRACKING_COMPONENTS.CUSTOMIZE_PAGE\r\n const { track } = useGTCTracking()\r\n const trackCustomizeViewClick = () => {\r\n track({ event: TRACKING_EVENTS.VIEW_ITEM }, componentName)\r\n }\r\n usePageLoad(() => {\r\n track({ event: TRACKING_EVENTS.VIEW_CONTENT }, componentName)\r\n track({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData: { step: 1 } }, componentName)\r\n track({ event: TRACKING_EVENTS.START_BUY_FLOW }, componentName)\r\n }, !!params.planName)\r\n return { trackCustomizeViewClick }\r\n}\r\n","import { TRACKING_EVENTS } from '@common/constants'\r\nimport { usePageLoad } from '@common/hooks'\r\nimport { TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { useGTCTracking } from './useGTCTracking'\r\n\r\nexport interface NextStepsPageTrackingParams {\r\n isLabelsLoaded: boolean\r\n}\r\n\r\nexport const useNextStepsPageTracking = (params: NextStepsPageTrackingParams) => {\r\n const { track } = useGTCTracking()\r\n const componentName = TRACKING_COMPONENTS.NEXT_STEPS_PAGE\r\n usePageLoad(() => {\r\n track({ event: TRACKING_EVENTS.VIEW_CONTENT }, componentName)\r\n }, params.isLabelsLoaded)\r\n}\r\n","import { stringify } from 'query-string'\r\n\r\n/**\r\n * Normally the paramsSerializer that axios uses by default would format an array in a querystring parameter with brackets, like this:\r\n * ?reservationIds[]=RSRV-40143&reservationIds[]=RSRV-40144\r\n * But the numebrs api wants a string array in a querystring to be without brackets, like this:\r\n * ?reservationIds=RSRV-40143&reservationIds=RSRV-40144\r\n */\r\nexport const stringifyParamsUsingArrayFormatNone = (parameters: Record) =>\r\n stringify(parameters, { arrayFormat: 'none' })\r\n","import axios from 'axios'\r\nimport { stringifyParamsUsingArrayFormatNone } from '@common/utils/stringifyParamsUsingArrayFormatNone'\r\nimport { getGUID } from '@common/utils/getGUID'\r\n\r\nexport const numbersApiUserId = getGUID()\r\n\r\n// search numbers\r\nexport interface PhoneNumber {\r\n e164Number: string\r\n city?: string\r\n region?: string\r\n}\r\nexport interface NumbersRequest {\r\n areaCode?: string\r\n localVanity?: string\r\n tollFreeVanity?: string\r\n tollFreeWildcard?: string\r\n numberPattern?: string\r\n quantity?: number\r\n}\r\nexport interface NumbersResponse {\r\n phoneNumberDetails: PhoneNumber[]\r\n}\r\nexport function searchNumbers(params: NumbersRequest) {\r\n // See ecomm api: https://confluence.ops.expertcity.com/x/iD-ICg\r\n // and numbers api: https://developer-internal.goto.com/apis/numbers-external/v1#tag/Number-search/paths/~1numbers/get\r\n return axios.get('/ecommapi/connectproduct/numberssearch', { params })\r\n}\r\n\r\n// reserve phone numbers\r\nexport interface ReserveNumbersRequest {\r\n phoneNumbers: string[]\r\n userId: string\r\n}\r\nexport interface ReserveNumbersResponse {\r\n [index: number]: {\r\n id: string\r\n createdByUserId: string\r\n creationTime: string\r\n expirationTime: string\r\n phoneNumber: string\r\n phoneNumberType: 'TOLL_FREE' | 'LOCAL'\r\n city: string\r\n state: string\r\n error: string\r\n }\r\n}\r\nexport function reserveNumbers(data: ReserveNumbersRequest) {\r\n // See ecomm api: https://confluence.ops.expertcity.com/x/iD-ICg\r\n // and numbers api: https://developer-internal.goto.com/apis/numbers-external/v1#tag/Number-reservation/paths/~1reservations/post\r\n return axios.post('/ecommapi/connectproduct/reservenumbers', data)\r\n}\r\n\r\n// delete phone number reservation\r\nexport interface DeleteNumbersReservationRequest {\r\n reservationIds: string[]\r\n userId: string\r\n}\r\nexport interface DeleteNumbersReservationResponse {\r\n [index: number]: {\r\n reservationId: string\r\n deleted: boolean\r\n error: string\r\n }\r\n}\r\nexport function deleteNumbersReservation(params: DeleteNumbersReservationRequest) {\r\n // See ecomm api: https://confluence.ops.expertcity.com/x/iD-ICg\r\n // and numbers api: https://developer-internal.goto.com/apis/numbers-external/v1#tag/Number-reservation/paths/~1reservations/delete\r\n return axios.delete('/ecommapi/connectproduct/deletenumbersreservation', {\r\n params,\r\n // See stringifyParamsUsingArrayFormatNone.ts for the reason this is needed here\r\n paramsSerializer: stringifyParamsUsingArrayFormatNone,\r\n })\r\n}\r\n\r\nexport interface NumbersOrderRequest {\r\n phoneNumbersToOrder: {\r\n reservationId: string\r\n phoneNumber: string\r\n }[]\r\n userId: string\r\n isTollfreeOutbound: boolean\r\n}\r\nexport interface NumbersOrderResponse {\r\n id: string\r\n numbersOrdered: string[]\r\n orderDate: string\r\n orderedByUserId: string\r\n errorMessage: string\r\n}\r\nexport function orderNumbers(data: NumbersOrderRequest) {\r\n // See ecomm api: https://confluence.ops.expertcity.com/x/iD-ICg\r\n // and numbers api: https://developer-internal.goto.com/apis/numbers-external/v1#tag/Number-order/paths/~1accounts~1{accountKey}~1numbers/post\r\n return axios.post('/ecommapi/connectproduct/numbersorder', data)\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CHECKOUTFORM_STEPS } from '@gtc/constants'\r\nimport { BuyFormData } from './state'\r\n\r\nexport enum BuyFormActionTypes {\r\n SUBMIT_BUY_FORM = '[buy-form-actions] submit-exp',\r\n RESET_BUY_FORM_AFFECTED_STATES = '[buy-form-actions] reset-affected-states',\r\n RESET_BUY_FORM = '[buy-form-actions] reset-checkout-form',\r\n EXISTING_USER_SUBMIT_BUY_FORM = '[buy-form-actions] existing-user-submit-exp',\r\n UPDATE_INITIAL_FORM_STATE = '[buy-form-actions] update-initial-form-state',\r\n SET_CLEAR_EMAIL = '[buy-form-actions] set-clear-email',\r\n UPDATE_STEPS = '[buy-form-actions] update-steps',\r\n}\r\n\r\nexport const buyFormActions = {\r\n submitForm: (values: BuyFormData) => createAction(BuyFormActionTypes.SUBMIT_BUY_FORM, { values }),\r\n existingUserSubmitForm: (isAddonFlow: boolean) =>\r\n createAction(BuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, { isAddonFlow }),\r\n resetCheckoutFormAffectedStates: () => createAction(BuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES),\r\n updateInitialFormState: (data: BuyFormData) =>\r\n createAction(BuyFormActionTypes.UPDATE_INITIAL_FORM_STATE, {\r\n data,\r\n }),\r\n resetForm: () => createAction(BuyFormActionTypes.RESET_BUY_FORM),\r\n setClearEmail: (clear: boolean) => createAction(BuyFormActionTypes.SET_CLEAR_EMAIL, { clear }),\r\n updateSteps: (stepName: CHECKOUTFORM_STEPS, stepResult: boolean) =>\r\n createAction(BuyFormActionTypes.UPDATE_STEPS, {\r\n stepName,\r\n stepResult,\r\n }),\r\n}\r\n\r\nexport type BuyFormActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { PhoneNumber } from '@gtc/services/numbersApi'\r\nimport { SelectedAddon } from '../add-on'\r\nimport {\r\n BillingInfoDataType,\r\n PaymentDataType,\r\n SubmitDataType,\r\n PlanAddonPriceItem,\r\n BillingFrequencyVolumeDiscountRecords,\r\n} from './state'\r\nimport { BuyFormData } from '../buy-form/state'\r\n\r\nexport enum CheckoutActionTypes {\r\n SET_LOADING = '[checkout-actions] set-loading',\r\n SET_PLAN_ID = '[checkout-actions] set-plan-id',\r\n SET_BILLING_FREQUENCY = '[checkout-actions] set-billing-frequency',\r\n CLEAR_ADDONS = '[checkout-actions] clear-addons',\r\n SET_SELECTED_ADDONS = '[checkout-actions] set-selected-addons',\r\n SET_ORGANIZERS = '[checkout-actions] set-organizers',\r\n SET_SELECTED_PLAN = '[checkout-actions] set-selected-plan',\r\n SET_EXISTING_USER_MODAL_OPEN = '[checkout-actions] set-existing-user-modal',\r\n CREATE_BILLING_INFO = '[checkout-actions] create-billing-info',\r\n CREATE_PAYMENT = '[checkout-actions] create-payment',\r\n SUBMIT_PAYMENT = '[checkout-actions] submit-payment',\r\n GET_AVAILABLE_PAYMENT_METHODS = '[checkout-actions] get-available-payment-methods',\r\n CALCULATE_PRICE = '[checkout-actions] calculate-price',\r\n SET_CALCULATED_PRICE = '[checkout-actions] set-calculated-price',\r\n GET_SAVED_STATE = '[checkout-actions] get-saved-state',\r\n SET_SAVED_STATE_LOADED = '[checkout-actions] set-saved-state-loaded',\r\n RESET_CHECKOUT_STATE = '[checkout-actions] reset-state',\r\n SET_EXISTING_ORGANIZERS = '[checkout-actions] set-existing-organizers',\r\n SET_PURCHASE_COMPLETE = '[checkout-actions] set-purchase-complete',\r\n SET_LOADING_TOTAL = '[checkout-actions] set-loading-total',\r\n SET_ADDON_COMPLETE = '[checkout-actions] set-addon-complete',\r\n SET_SELECTED_TIER_INDEX = '[checkout-actions] set-selected-tier-index',\r\n CALCULATE_VOLUME_DISCOUNT = '[checkout-actions] calculate-volume-discount',\r\n SET_VOLUME_DISCOUNT = '[checkout-actions] set-volume-discount',\r\n SET_VOLUME_DISCOUNT_LOADING = '[checkout-actions] set-volume-discount-loading',\r\n GET_VOLUME_DISCOUNT = '[checkout-actions] get-volume-discount',\r\n SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE = '[checkout-actions] set-current-volume-discount-price-and-percentage',\r\n ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON = '[checkout-actions] adjust-current-volume-discount-for-reprice-coupon',\r\n SET_PRORATED_AMOUNT = '[checkout-actions] set-prorated-amount',\r\n SET_IS_CHOOSING_PHONE_NUMBER = '[checkout-actions] set-is-choosing-phone-number',\r\n RESERVE_PHONE_NUMBER = '[checkout-actions] reserve-phone-number',\r\n SET_PHONE_NUMBER_RESERVATION_ID = '[checkout-actions] set-phone-number-reservation-id',\r\n SET_PHONE_NUMBER_VANITY_PHRASE = '[checkout-actions] set-phone-number-vanity-phrase',\r\n SET_PHONE_NUMBER = '[checkout-actions] set-phone-number',\r\n SET_RESERVING_PHONE_NUMBER = '[checkout-actions] set-reserving-phone-number',\r\n SET_RESERVING_PHONE_NUMBER_ERROR = '[checkout-actions] set-reserving-phone-number-error',\r\n SET_DID_FAIL_TO_ORDER_PHONE_NUMBER = '[checkout-actions] set-did-fail-to-order-phone-number',\r\n SET_AUTO_LOGIN = '[checkout-form-actions] set-auto-login',\r\n}\r\n\r\nexport const checkoutActions = {\r\n setLoading: (loading: boolean) => createAction(CheckoutActionTypes.SET_LOADING, { loading }),\r\n setPurchaseComplete: (complete: boolean) => createAction(CheckoutActionTypes.SET_PURCHASE_COMPLETE, { complete }),\r\n setBillingFrequency: (frequency: TimePeriod) =>\r\n createAction(CheckoutActionTypes.SET_BILLING_FREQUENCY, { frequency }),\r\n clearAddons: () => createAction(CheckoutActionTypes.CLEAR_ADDONS),\r\n setSelectedPlan: (planSku: string) => createAction(CheckoutActionTypes.SET_SELECTED_PLAN, { planSku }),\r\n setSelectedAddons: (addons: SelectedAddon[]) => createAction(CheckoutActionTypes.SET_SELECTED_ADDONS, { addons }),\r\n setOrganizers: (organizers: number) => createAction(CheckoutActionTypes.SET_ORGANIZERS, { organizers }),\r\n createBillingInfo: (billingValues: BillingInfoDataType) =>\r\n createAction(CheckoutActionTypes.CREATE_BILLING_INFO, {\r\n billingValues,\r\n }),\r\n createPayment: (paymentValues: PaymentDataType) =>\r\n createAction(CheckoutActionTypes.CREATE_PAYMENT, {\r\n paymentValues,\r\n }),\r\n submitPayment: (submitValues: SubmitDataType) =>\r\n createAction(CheckoutActionTypes.SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n getPaymentMethods: () => createAction(CheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS),\r\n calculatePrice: (values: BuyFormData, component?: string, planSKU?: string) =>\r\n createAction(\r\n CheckoutActionTypes.CALCULATE_PRICE,\r\n {\r\n values,\r\n planSKU,\r\n },\r\n { component }\r\n ),\r\n setCalculatedPrice: (\r\n productPrices: PlanAddonPriceItem[],\r\n net: number,\r\n total: number,\r\n tax: number,\r\n anniversaryDate: string\r\n ) =>\r\n createAction(CheckoutActionTypes.SET_CALCULATED_PRICE, {\r\n productPrices,\r\n net,\r\n total,\r\n tax,\r\n anniversaryDate,\r\n }),\r\n getSavedState: (urlPlan: string) =>\r\n createAction(CheckoutActionTypes.GET_SAVED_STATE, {\r\n urlPlan,\r\n }),\r\n setSavedStateLoaded: (savedStateLoaded: boolean, component: string) =>\r\n createAction(\r\n CheckoutActionTypes.SET_SAVED_STATE_LOADED,\r\n {\r\n savedStateLoaded,\r\n },\r\n { component }\r\n ),\r\n setTotalLoading: (loading: boolean) =>\r\n createAction(CheckoutActionTypes.SET_LOADING_TOTAL, {\r\n loading,\r\n }),\r\n setAddonComplete: (addonComplete: boolean) =>\r\n createAction(CheckoutActionTypes.SET_ADDON_COMPLETE, {\r\n addonComplete,\r\n }),\r\n resetCheckoutState: () => createAction(CheckoutActionTypes.RESET_CHECKOUT_STATE),\r\n setSelectedTierIndex: (selectedTierIndex: number, organizers: number) =>\r\n createAction(CheckoutActionTypes.SET_SELECTED_TIER_INDEX, { selectedTierIndex, organizers }),\r\n calculateVolumeDiscount: () => createAction(CheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT),\r\n setVolumeDiscount: (\r\n selectedPlanSku: string,\r\n currency: CURRENCY,\r\n volumeDiscountForSelectedPlanAndCurrency: BillingFrequencyVolumeDiscountRecords\r\n ) =>\r\n createAction(CheckoutActionTypes.SET_VOLUME_DISCOUNT, {\r\n selectedPlanSku,\r\n currency,\r\n volumeDiscountForSelectedPlanAndCurrency,\r\n }),\r\n setVolumeDiscountLoading: (volumeDiscountLoading: boolean) =>\r\n createAction(CheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING, { volumeDiscountLoading }),\r\n getVolumeDiscount: (organizers: number, selectedTierIndex: number, billingFrequency: TimePeriod) =>\r\n createAction(CheckoutActionTypes.GET_VOLUME_DISCOUNT, {\r\n organizers,\r\n selectedTierIndex,\r\n billingFrequency,\r\n }),\r\n setCurrentVolumeDiscountPriceAndPercentage: (currentVolumeDiscountPrice: number) =>\r\n createAction(CheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE, {\r\n currentVolumeDiscountPrice,\r\n }),\r\n setProratedAmount: (proratedAmount: number) =>\r\n createAction(CheckoutActionTypes.SET_PRORATED_AMOUNT, { proratedAmount }),\r\n adjustCurrentVolumeDiscountForRepriceCoupon: () =>\r\n createAction(CheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON),\r\n setIsChoosingPhoneNumber: (isChoosingPhoneNumber: boolean) =>\r\n createAction(CheckoutActionTypes.SET_IS_CHOOSING_PHONE_NUMBER, { isChoosingPhoneNumber }),\r\n reservePhoneNumber: (phoneNumber: PhoneNumber, vanityPhrase: string) =>\r\n createAction(CheckoutActionTypes.RESERVE_PHONE_NUMBER, { phoneNumber, vanityPhrase }),\r\n setPhoneNumberReservationId: (phoneNumberReservationId: string) =>\r\n createAction(CheckoutActionTypes.SET_PHONE_NUMBER_RESERVATION_ID, { phoneNumberReservationId }),\r\n setPhoneNumberVanityPhrase: (phoneNumberVanityPhrase: string) =>\r\n createAction(CheckoutActionTypes.SET_PHONE_NUMBER_VANITY_PHRASE, { phoneNumberVanityPhrase }),\r\n setPhoneNumber: (phoneNumber: PhoneNumber) => createAction(CheckoutActionTypes.SET_PHONE_NUMBER, { phoneNumber }),\r\n setReservingPhoneNumber: (reservingPhoneNumber: boolean) =>\r\n createAction(CheckoutActionTypes.SET_RESERVING_PHONE_NUMBER, { reservingPhoneNumber }),\r\n setReservingPhoneNumberError: (reservingPhoneNumberError: string) =>\r\n createAction(CheckoutActionTypes.SET_RESERVING_PHONE_NUMBER_ERROR, { reservingPhoneNumberError }),\r\n setDidFailToOrderPhoneNumber: (didFailToOrderPhoneNumber: boolean) =>\r\n createAction(CheckoutActionTypes.SET_DID_FAIL_TO_ORDER_PHONE_NUMBER, { didFailToOrderPhoneNumber }),\r\n setAutoLogin: (autoLogin?: string) =>\r\n createAction(CheckoutActionTypes.SET_AUTO_LOGIN, {\r\n autoLogin,\r\n }),\r\n}\r\n\r\nexport type CheckoutActions = ActionUnion\r\n","import { ContentData } from '@gtc/state/content-data'\r\nimport { LabelContent } from '@gtc/state/label-content'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum ContentActionTypes {\r\n GET_LABEL_CONTENT = '[content-actions] get-label-content',\r\n SET_CONTENT = '[content-actions] set-content',\r\n SET_CONTENT_LOADED = '[content-actions] set-content-loaded',\r\n GET_COMPARE_MODAL_CONTENT = '[content-actions] get-compare-modal-content',\r\n SET_COMPARE_MODAL_CONTENT = '[content-actions] set-compare-modal-content',\r\n SET_COUPON_DISCLAIMER = '[content-actions] set-coupon-disclaimer',\r\n}\r\n\r\nexport const contentActions = {\r\n getLabelContent: (upgrade?: boolean) => createAction(ContentActionTypes.GET_LABEL_CONTENT, { upgrade }),\r\n setContent: (content: ContentData, labels: LabelContent, plans: []) =>\r\n createAction(ContentActionTypes.SET_CONTENT, {\r\n content,\r\n labels,\r\n plans,\r\n }),\r\n getCompareModalContent: (PlanGroupdId: string) =>\r\n createAction(ContentActionTypes.GET_COMPARE_MODAL_CONTENT, PlanGroupdId),\r\n setCompareModalContent: (content: []) => createAction(ContentActionTypes.SET_COMPARE_MODAL_CONTENT, { content }),\r\n setContentLoaded: (loaded: boolean) => createAction(ContentActionTypes.SET_CONTENT_LOADED, { loaded }),\r\n setCouponDisclaimer: (couponDisclaimer: string) =>\r\n createAction(ContentActionTypes.SET_COUPON_DISCLAIMER, { couponDisclaimer }),\r\n}\r\n\r\n// where do the get functions go\r\n\r\nexport type ContentActions = ActionUnion\r\n","import { ConnectContainerAppState } from '@gtc/store'\r\n\r\nexport const getLabelContent = (state: ConnectContainerAppState) => state.connect.content.labelContent\r\nexport const getCheckoutState = (state: ConnectContainerAppState) => state.connect.checkout\r\nexport const getPlanData = (state: ConnectContainerAppState) => state.connect.content.planData\r\nexport const getContentState = (state: ConnectContainerAppState) => state.connect.content\r\nexport const getContentData = (state: ConnectContainerAppState) => state.connect.content.contentData\r\nexport const getUserState = (state: ConnectContainerAppState) => state.connect.user\r\nexport const getBuyFormState = (state: ConnectContainerAppState) => state.connect.form\r\nexport const getCouponState = (state: ConnectContainerAppState) => state.connect.coupon\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from '@common/state/tracking/state'\r\n\r\nexport enum GTCTrackingActionTypes {\r\n TRACK = '[gtc-tracking] gtc-track-event',\r\n}\r\n\r\nexport const gtcTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) =>\r\n createAction(GTCTrackingActionTypes.TRACK, { trackingInfo }, { component }),\r\n}\r\n\r\nexport type GTCTrackingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\n\r\nimport { AbandonedCartDataType, UserDataType } from './state'\r\n\r\nexport enum UserActionTypes {\r\n CHECK_EXISTING_USER = '[user-actions] check-existing-user',\r\n CREATE_NEW_USER = '[user-actions] create-new-user',\r\n GET_LOGGED_IN_USER_STATE = '[user-actions] get-user-logged-in-state',\r\n SET_EXISTING_BILLING_INFO = '[user-actions] set-existing-billing-info',\r\n SET_EXISTING_USER_INFO = '[user-actions] set-existing-user-info',\r\n SET_EXISTING_ACCOUNT_INFO = '[user-actions] set-existing-account-info',\r\n SET_DISPLAY_NAME = '[user-actions] set-display-name',\r\n SET_LOADING_EXISTING_INFO = '[user-actions] set-loading-existing-info',\r\n SET_VERIFYING_TOKEN = '[user-actions] set-verifying-token',\r\n SET_USER_TYPE = '[user-actions] set-user-type',\r\n SET_EXISTING_PAYMENT_DETAILS = '[user-actions] set-existing-payment-details',\r\n SET_ACCESS_TOKEN = '[user-actions] set-access-token',\r\n GET_ACCESS_TOKEN = '[user-actions] get-access-token',\r\n SET_IS_USER_LOGGEDIN = '[user-actions] set-is-user-loggedin',\r\n USER_LOGIN = '[user-actions] user-login',\r\n USER_LOGOUT = '[user-actions] user-logout',\r\n SET_VERIFY_USER_SHOULD_LOGIN = '[user-actions] get-verify-user-should-login',\r\n SUBMIT_ABANDONED_CART = '[user-actions] submit-abandoned-cart',\r\n}\r\n\r\nexport const userActions = {\r\n checkExistingUser: (email: string, form?: BuyFormData) =>\r\n createAction(UserActionTypes.CHECK_EXISTING_USER, { email, form }),\r\n createNewUser: (userValues: UserDataType) => createAction(UserActionTypes.CREATE_NEW_USER, { userValues }),\r\n getLoggedInUserState: () => createAction(UserActionTypes.GET_LOGGED_IN_USER_STATE),\r\n setExistingBillingInformation: (billingInfo: ExistingBillingInfoType) =>\r\n createAction(UserActionTypes.SET_EXISTING_BILLING_INFO, { billingInfo }),\r\n setLoadingExistingInformation: (loading: boolean) =>\r\n createAction(UserActionTypes.SET_LOADING_EXISTING_INFO, { loading }),\r\n\r\n setVerifyingToken: (verifying: boolean) => createAction(UserActionTypes.SET_VERIFYING_TOKEN, { verifying }),\r\n setExistingUserInformation: (userInfo: ExistingUserInfoType) =>\r\n createAction(UserActionTypes.SET_EXISTING_USER_INFO, { userInfo }),\r\n setExistingAccountInformation: (accountInfo: ExistingAccountInfoType) =>\r\n createAction(UserActionTypes.SET_EXISTING_ACCOUNT_INFO, { accountInfo }),\r\n setDisplayName: (displayName: string) => createAction(UserActionTypes.SET_DISPLAY_NAME, { displayName }),\r\n setUserType: (type: string) => createAction(UserActionTypes.SET_USER_TYPE, { type }),\r\n setExistingPaymentDetails: (info: ExistingPaymentInfoType) =>\r\n createAction(UserActionTypes.SET_EXISTING_PAYMENT_DETAILS, { info }),\r\n getAccessToken: () => createAction(UserActionTypes.GET_ACCESS_TOKEN),\r\n userLogin: (component?: string, sso?: boolean) => createAction(UserActionTypes.USER_LOGIN, { sso }, { component }),\r\n userLogout: (component?: string) => createAction(UserActionTypes.USER_LOGOUT, {}, { component }),\r\n setAccessToken: (accessToken: Token) => createAction(UserActionTypes.SET_ACCESS_TOKEN, { accessToken }),\r\n setIsUserLoggedIn: (isUserLoggedIn: boolean) =>\r\n createAction(UserActionTypes.SET_IS_USER_LOGGEDIN, {\r\n isUserLoggedIn,\r\n }),\r\n setVerifyShouldUserLogIn: (verifiedUserShouldLogIn: boolean) =>\r\n createAction(UserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN, { verifiedUserShouldLogIn }),\r\n submitAbandonedCart: (abandonedCartData: AbandonedCartDataType) =>\r\n createAction(UserActionTypes.SUBMIT_ABANDONED_CART, { abandonedCartData }),\r\n}\r\n\r\nexport type UserActions = ActionUnion\r\n","import { Addon, SelectedAddon } from '@gtc/state/add-on'\r\nimport { Plan } from '@gtc/state/plan'\r\n\r\nexport const getCurrentAddons = (selectedAddons: SelectedAddon[], selectedPlan: Plan): Addon[] => {\r\n const { addons } = selectedPlan\r\n const myAddons = selectedAddons.reduce((mySelectedAddons: Addon[], localAddon: SelectedAddon) => {\r\n const matchingAddon = addons.find((add: Addon) => add.sKU === localAddon.sKU)\r\n if (matchingAddon) {\r\n matchingAddon.quantity = localAddon.quantity\r\n return [...mySelectedAddons, matchingAddon]\r\n }\r\n\r\n return mySelectedAddons\r\n }, [])\r\n return myAddons\r\n}\r\n","import { Plan } from '@gtc/state/plan'\r\n\r\nexport const getCurrentPlan = (planSku: string, planData: Plan[]) => {\r\n const selectedPlan = planData.find((plan: Plan) => plan.sKU === planSku)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport const getPlanNameSet = (planData: Plan[]) =>\r\n planData.reduce((accSet, plan) => {\r\n accSet.add(plan.name.toLowerCase())\r\n return accSet\r\n }, new Set())\r\n","import { ErrorContent } from '@gtc/state/checkout-form-container/state'\r\nimport * as Yup from 'yup'\r\nimport zxcvbn from 'zxcvbn'\r\nimport { isDate } from 'date-fns/isDate'\r\nimport { parse } from 'date-fns/parse'\r\nimport { isValidPostalCode } from '@common/utils/isValidPostalCode'\r\n\r\nconst isValidDate = (date: string | Date) => {\r\n return date instanceof Date && !Number.isNaN(date.getTime())\r\n}\r\n\r\nconst emailValidation = (errorInvalidEmail: string, errorRequiredEmail?: string) => {\r\n return Yup.string()\r\n .required(errorRequiredEmail || errorInvalidEmail)\r\n .min(2, errorInvalidEmail)\r\n .email(errorInvalidEmail)\r\n .matches(\r\n new RegExp(\r\n \"^((?!(.+\\\\.\\\\.+))(?!(.+\\\\.@+))(?!(^\\\\.))([a-zA-Z_0-9-+!#\\\\$\\\\.\\\\*\\\\^']{1,63}))@((?:[a-zA-Z_0-9-]+\\\\.)*[a-zA-Z_0-9][a-zA-Z_0-9-]*)\\\\.([a-z]{2,})$\"\r\n ),\r\n errorInvalidEmail\r\n )\r\n}\r\n\r\nconst nameValidation = (requiredErrorMessage: string, invalidCharacterErrorMessage: string) => {\r\n return (\r\n Yup.string()\r\n .required(requiredErrorMessage)\r\n .min(2, requiredErrorMessage)\r\n // a to z, latin characters from dec 192 t0 214, 216 to 246 and 248 to 255,\r\n // https://blog.robertelder.org/character-ranges-class-negation-regular-expressions/\r\n .matches(new RegExp(/^[A-Za-zÀ-ÖØ-öø-ÿ- .']+$/), invalidCharacterErrorMessage)\r\n )\r\n}\r\nexport const passwordValidation = () => {\r\n return Yup.string()\r\n .required()\r\n .test((pw) => zxcvbn(pw).score >= 3)\r\n}\r\n\r\nconst addressValidation = (errorRequiredMessage: string, errorInvalidMessage: string) => {\r\n return Yup.string()\r\n .required(errorRequiredMessage)\r\n .matches(new RegExp('^[A-Za-z0-9- #,.\\\\/]+$'), errorInvalidMessage)\r\n}\r\n\r\n// const companySizeValidation = (errorRequiredMessage: string) => {\r\n// return Yup.string().required(errorRequiredMessage)\r\n// }\r\n\r\nconst countryValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst zipcodeValidation = (country: string, errorRequiredPostalCode: string, errorInvalidPostalCode: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPostalCode)\r\n .min(3, errorInvalidPostalCode)\r\n .max(12, errorInvalidPostalCode)\r\n .test('ZipCodeRegEx', errorInvalidPostalCode, (value) => isValidPostalCode(country, value as string))\r\n}\r\n\r\nconst contactPhoneValidation = (errorInvalidCharacter: string, errorRequiredPhoneNumber: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPhoneNumber)\r\n .matches(new RegExp('^(?=(?:\\\\D*\\\\d){6}).*$'), errorInvalidCharacter)\r\n}\r\n\r\nconst expDateValidation = (errorInvalidExpirationDate: string, errorRequiredExpDate: string) => {\r\n const lastMonthDate = new Date()\r\n lastMonthDate.setMonth(lastMonthDate.getMonth() - 1)\r\n\r\n const parseDateString = (_value: string, originalValue: string) => {\r\n const parsedDate = isDate(originalValue) ? originalValue : parse(originalValue, 'MM/yy', new Date())\r\n const expiredMonthDate = new Date()\r\n expiredMonthDate.setMonth(expiredMonthDate.getMonth() - 2)\r\n return isValidDate(parsedDate) ? parsedDate : expiredMonthDate\r\n }\r\n return Yup.date()\r\n .required(errorRequiredExpDate)\r\n .min(lastMonthDate, errorInvalidExpirationDate)\r\n .transform(parseDateString)\r\n}\r\n\r\nexport const CheckoutSchema = (country: string, errorContent: ErrorContent) => {\r\n const {\r\n errorInvalidPhoneNumber,\r\n errorInvalidCharacter,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorRequiredCountry,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n } = errorContent\r\n\r\n return Yup.object().shape({\r\n Email: emailValidation(errorInvalidEmail, errorRequiredEmail),\r\n FirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n LastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Password: passwordValidation(),\r\n BillingFirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n BillingLastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Street1: addressValidation(errorRequiredAddress, errorInvalidCharacter),\r\n City: addressValidation(errorRequiredCity, errorInvalidCharacter),\r\n CountryCode: countryValidation(errorRequiredCountry),\r\n StateCode: addressValidation(errorRequiredState, errorInvalidCharacter),\r\n ZipCode: zipcodeValidation(country, errorRequiredPostalCode, errorInvalidPostalCode),\r\n ContactPhone: contactPhoneValidation(errorInvalidPhoneNumber, errorRequiredPhoneNumber),\r\n ExpirationDate: expDateValidation(errorInvalidExpirationDate, errorRequiredExpDate),\r\n })\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { SavedStoreState } from '@gtc/state/checkout/state'\r\n\r\nexport const loadState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.GTC_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as SavedStoreState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveState = (state: SavedStoreState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n localStorage.setItem(STORAGE_CONST.GTC_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.GTC_STORE)\r\n\r\n if (serializedState) localStorage.removeItem(STORAGE_CONST.GTC_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { BuyFormData } from '@gtc/state/buy-form/state'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport const isValidationAddressEligible = (formValues: BuyFormData): boolean => {\r\n if (\r\n isEmpty(formValues.FirstName.trim()) ||\r\n isEmpty(formValues.LastName.trim()) ||\r\n isEmpty(formValues.Email.trim()) ||\r\n isEmpty(formValues.BillingFirstName.trim()) ||\r\n isEmpty(formValues.BillingLastName.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nexport const isAddressComplete = (formValues: BuyFormData): boolean => {\r\n if (\r\n isEmpty(formValues.CountryCode.trim()) ||\r\n isEmpty(formValues.City.trim()) ||\r\n isEmpty(formValues.Street1.trim()) ||\r\n isEmpty(formValues.StateCode.trim()) ||\r\n isEmpty(formValues.ZipCode.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { trackEvent, getFormName } from '@common/utils'\r\nimport {\r\n CURRENCY,\r\n PhoneInfo,\r\n PRODUCT_FAMILY_KEY,\r\n PRODUCT_FAMILY_NAME,\r\n TimePeriod,\r\n TRACKING_EVENTS,\r\n VIEW_PATH,\r\n} from '@common/constants'\r\nimport { CartData, PurchaseData, CustomizeItemsData } from '@gtc/state/tracking/state'\r\nimport { PageViewContentData, SessionInfo, TrackECommerceData } from '@common/state/tracking/state'\r\nimport { BUY_TYPE, USER_TYPES, TRACKING_COMPONENTS } from '@gtc/constants'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { CouponProcessedDataPerSku } from '@gtc/state/coupon/state'\r\nimport { get, cloneDeep } from 'lodash-es'\r\n\r\nconst contentType: Record = {\r\n [VIEW_PATH.PATH_CUSTOMIZE]: 'plan',\r\n [VIEW_PATH.PATH_CHECKOUT]: 'buy-form',\r\n}\r\n\r\nconst morphAddonData = (addonList: Addon[]) => {\r\n const addonMap: Record = {}\r\n addonList.forEach((addon) => {\r\n addonMap[addon.sKU] = addon\r\n })\r\n return addonMap\r\n}\r\n\r\nexport const getBuyType = (userType: string) => {\r\n if (userType === USER_TYPES.TRIALER) {\r\n return BUY_TYPE.TRIAL_CONVERSION\r\n }\r\n if (userType === USER_TYPES.ADDON) {\r\n return BUY_TYPE.ADDON\r\n }\r\n return BUY_TYPE.DIRECT_BUY\r\n}\r\n\r\ninterface PreviousTrackData {\r\n step: number\r\n cartData: CartData | null\r\n}\r\nconst previousTrackData: PreviousTrackData = {\r\n step: 0, // default value\r\n cartData: null,\r\n}\r\nconst setPreviousStep = (step: number) => {\r\n previousTrackData.step = step\r\n}\r\nconst setPreviousCart = (cartData: CartData) => {\r\n previousTrackData.cartData = cloneDeep(cartData)\r\n}\r\n\r\ninterface ProcessCartData {\r\n plan?: Plan\r\n addonList?: Addon[]\r\n billingFrequency: TimePeriod\r\n organizers: number\r\n currency: CURRENCY\r\n tier: string\r\n currentVolumeDiscountPrice: number\r\n couponCode: string\r\n couponProcessedDataPerSku: CouponProcessedDataPerSku | null\r\n totalCouponSavings: number\r\n}\r\n\r\nconst processCartData = (productData: ProcessCartData) => {\r\n const { plan, addonList, billingFrequency, organizers, currency, tier, currentVolumeDiscountPrice } = productData\r\n\r\n let planInfo: TrackECommerceData | null = null\r\n if (plan) {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n planInfo = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2C,\r\n item_category: PRODUCT_FAMILY_NAME.G2C,\r\n item_category2: plan.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant: 'Product',\r\n price: planPrice,\r\n quantity: organizers,\r\n volume_discount: currentVolumeDiscountPrice ? currentVolumeDiscountPrice / organizers : undefined,\r\n discount: get(productData, ['couponProcessedDataPerSku', plan.sKU, 'discountUnitSavings'], 0),\r\n product_discount_tier: tier,\r\n coupon: get(productData, ['couponProcessedDataPerSku', plan.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n }\r\n\r\n let addonInfoList: TrackECommerceData[] | null = null\r\n if (addonList) {\r\n addonInfoList = addonList.map((addon) => {\r\n const addonPrice =\r\n billingFrequency === TimePeriod.Year ? addon.pricingInfo.USD.price * 12 : addon.pricingInfo.USD.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const addonInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2C,\r\n item_category: PRODUCT_FAMILY_NAME.G2C,\r\n item_category2: addon.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${addon.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${addon.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant: 'Add-on',\r\n price: addonPrice,\r\n quantity: addon.quantity,\r\n volume_discount: undefined,\r\n discount:\r\n get(productData, ['couponProcessedDataPerSku', addon.sKU, 'discountUnitSavings'], 0) || undefined,\r\n product_discount_tier: undefined,\r\n coupon: get(productData, ['couponProcessedDataPerSku', addon.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n return addonInfo\r\n })\r\n }\r\n\r\n const cartItems: TrackECommerceData[] = []\r\n if (planInfo) {\r\n cartItems.push(planInfo)\r\n }\r\n if (addonInfoList) {\r\n cartItems.push(...addonInfoList)\r\n }\r\n return cartItems\r\n}\r\n\r\nexport const trackAddToCart = (productData: ProcessCartData, phoneInfo: PhoneInfo) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n phone_number_status: phoneInfo.phoneNumberStatus,\r\n phone_number_type: phoneInfo.phoneNumberType,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ADD_TO_CART, eventData })\r\n}\r\n\r\nexport const trackRemoveFromCart = (productData: ProcessCartData, phoneInfo: PhoneInfo) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n phone_number_status: phoneInfo.phoneNumberStatus,\r\n phone_number_type: phoneInfo.phoneNumberType,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.REMOVE_FROM_CART, eventData })\r\n}\r\n\r\nexport const checkCartData = (cartData: CartData, phoneInfo: PhoneInfo) => {\r\n const previousCartData = previousTrackData.cartData\r\n if (previousCartData) {\r\n const {\r\n plan,\r\n plan: { addons },\r\n } = cartData\r\n const currentCartPlan = plan\r\n const currentCartAddons = morphAddonData(cartData.addonList)\r\n const previousCartPlan = previousCartData.plan\r\n const previousCartAddons = morphAddonData(previousCartData.addonList)\r\n\r\n if (currentCartPlan.name !== previousCartPlan.name) {\r\n trackRemoveFromCart(previousCartData, phoneInfo)\r\n trackAddToCart(cartData, phoneInfo)\r\n } else {\r\n let removedOrganizers = 0\r\n let addedOrganizers = 0\r\n const removedAddonList: Addon[] = []\r\n const addedAddonList: Addon[] = []\r\n if (previousCartData.organizers > cartData.organizers) {\r\n removedOrganizers = previousCartData.organizers - cartData.organizers\r\n } else if (previousCartData.organizers < cartData.organizers) {\r\n addedOrganizers = cartData.organizers - previousCartData.organizers\r\n }\r\n addons.forEach((addon: Addon) => {\r\n const addonSku = addon.sKU\r\n const currentAddon = currentCartAddons[addonSku]\r\n const previousAddon = previousCartAddons[addonSku]\r\n if (currentAddon && previousAddon) {\r\n if (previousAddon.quantity > currentAddon.quantity) {\r\n const removedQuantity = previousAddon.quantity - currentAddon.quantity\r\n const removedAddon = { ...currentAddon, quantity: removedQuantity }\r\n removedAddonList.push(removedAddon)\r\n } else if (previousAddon.quantity < currentAddon.quantity) {\r\n const addedQuantity = currentAddon.quantity - previousAddon.quantity\r\n const addedAddon = { ...currentAddon, quantity: addedQuantity }\r\n addedAddonList.push(addedAddon)\r\n }\r\n } else if (!previousAddon && currentAddon) {\r\n addedAddonList.push({ ...currentAddon, quantity: currentAddon.quantity })\r\n } else if (previousAddon && !currentAddon) {\r\n removedAddonList.push({ ...previousAddon, quantity: previousAddon.quantity })\r\n }\r\n })\r\n\r\n const removedCartData: ProcessCartData = { ...cartData }\r\n const addedCartData: ProcessCartData = { ...cartData }\r\n if (removedOrganizers === 0) {\r\n removedCartData.plan = undefined\r\n } else if (removedOrganizers > 0) {\r\n removedCartData.organizers = removedOrganizers\r\n }\r\n if (addedOrganizers === 0) {\r\n addedCartData.plan = undefined\r\n } else if (addedOrganizers > 0) {\r\n addedCartData.organizers = addedOrganizers\r\n }\r\n\r\n if (removedAddonList.length === 0) {\r\n removedCartData.addonList = undefined\r\n } else if (removedAddonList.length > 0) {\r\n removedCartData.addonList = removedAddonList\r\n }\r\n\r\n if (addedAddonList.length === 0) {\r\n addedCartData.addonList = undefined\r\n } else if (addedAddonList.length > 0) {\r\n addedCartData.addonList = addedAddonList\r\n }\r\n\r\n if (addedAddonList.length > 0 || addedOrganizers > 0) {\r\n trackAddToCart(addedCartData, phoneInfo)\r\n }\r\n if (removedAddonList.length > 0 || removedOrganizers > 0) {\r\n trackRemoveFromCart(removedCartData, phoneInfo)\r\n }\r\n }\r\n } else {\r\n // just for double check, because there will always be previous cartData\r\n // if you are in checkCartData function because of the order in which events are fired\r\n trackAddToCart(cartData, phoneInfo)\r\n }\r\n}\r\n\r\nexport const trackCustomizeViewItem = (customizeItemsData: CustomizeItemsData) => {\r\n const { planData, billingFrequency, currency, organizers } = customizeItemsData\r\n\r\n // See \"view_item\" column in spreadsheet attached to WAE1-174\r\n const items = planData.map((plan) => {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const planInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2C, // product_name\r\n item_category: PRODUCT_FAMILY_NAME.G2C, // product_name\r\n item_category2: plan.name, // product_id\r\n item_category3: billingFrequency, // product_period\r\n item_category4: '1', // product_duration\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`, // Product / add-on name with period\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`, // Product / add-on unique identifier, sku with period\r\n item_variant: 'Product', // Specify if it's a \"Product\" or an \"Add-on\"\r\n price: planPrice, // product_price\r\n quantity: organizers, // product_quantity\r\n }\r\n return planInfo\r\n })\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items,\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_ITEM, eventData })\r\n}\r\n\r\nexport const trackViewContent = (userData: PageViewContentData, pageName: string) => {\r\n const formName = getFormName(pageName)\r\n const contentTypeName = `/${pageName.split('/')[2]}`\r\n const eventData = {\r\n platform_environment: `${PRODUCT_FAMILY_KEY.G2C}-${process.env.ENVIRONMENT}`,\r\n platform_product: PRODUCT_FAMILY_KEY.G2C,\r\n platform_type: 'marketing',\r\n platform_locale: userData.locale,\r\n platform_country: userData.country,\r\n platform_language: userData.language,\r\n section: 'web',\r\n sub_section: 'connect',\r\n template: pageName,\r\n content_type: `${pageName}-${contentType[contentTypeName]}`,\r\n page_type: pageName,\r\n content_number: 1,\r\n login_status: userData.isUserLoggedIn,\r\n funnel_name: `${PRODUCT_FAMILY_KEY.G2C}:marketing:${pageName}`,\r\n form_name: formName,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_CONTENT, eventData })\r\n}\r\n\r\nexport const trackSessionInfo = (sessionInfo: SessionInfo) => {\r\n const eventData = {\r\n session_last: sessionInfo.sessionLast,\r\n session_number: sessionInfo.sessionNumber,\r\n user_type: sessionInfo.userType,\r\n is_logged_in: sessionInfo.isUserLoggedIn,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.SESSION_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackBeginCheckout = (productData: CartData, phoneInfo: PhoneInfo, currentStep: number) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n step: currentStep,\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n phone_number_status: phoneInfo.phoneNumberStatus,\r\n phone_number_type: phoneInfo.phoneNumberType,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData })\r\n\r\n // if user navigates directly to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 0 && currentStep === 2) {\r\n checkCartData(productData, phoneInfo)\r\n }\r\n // if user navigates from customize page (step 1) to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 1 && currentStep === 2) {\r\n checkCartData(productData, phoneInfo)\r\n }\r\n // if user starts off in customize page, do not set previouse cart data yet, as it remains undefined\r\n if (previousTrackData.step !== 0) {\r\n setPreviousCart(productData)\r\n }\r\n\r\n setPreviousStep(currentStep)\r\n\r\n if (currentStep === 2 && productData.isExistingUser) {\r\n trackBeginCheckout(productData, phoneInfo, 3)\r\n trackBeginCheckout(productData, phoneInfo, 4)\r\n }\r\n}\r\n\r\nexport const trackPurchase = (productData: CartData, purchaseData: PurchaseData, phoneInfo: PhoneInfo) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n transaction_id: purchaseData.transactionID,\r\n coupon: productData.couponCode || undefined,\r\n tax: purchaseData.calculatedTax,\r\n revenue: purchaseData.calculatedNetTotal,\r\n },\r\n plan: productData.billingFrequency,\r\n buy_type: getBuyType(purchaseData.userType),\r\n conversion_type: 'purchase',\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n phone_number_status: phoneInfo.phoneNumberStatus,\r\n phone_number_type: phoneInfo.phoneNumberType,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.PURCHASE, eventData })\r\n}\r\n\r\nexport const trackPurchaseError = (errorMessage: string) => {\r\n const eventData = {\r\n error_purchase_message: errorMessage,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_PURCHASE, eventData })\r\n}\r\n\r\nexport const trackCompleteBuy = (userType: string, userEmail: string, productData: CartData) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.G2C,\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n conversion_type: 'purchase',\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData })\r\n}\r\n\r\nexport const trackFormError = (formIds: string[], formErrors: string[], pageName: string) => {\r\n const eventData = {\r\n form_error_id: formIds.toString(),\r\n form_error_message: formErrors.toString(),\r\n form_name: getFormName(pageName),\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_FORM, eventData })\r\n}\r\n\r\nexport const trackUserInformation = (userType: string, userEmail: string, productData: CartData) => {\r\n const eventData = {\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.USER_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackEmailValidation = (formName: string, userEmail: string) => {\r\n const eventData = {\r\n form_name: formName,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.EMAIL_VALIDATION, eventData })\r\n}\r\n\r\nexport const trackLogin = (userEmail: string) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.G2C,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.LOGIN, eventData })\r\n}\r\n\r\nexport const trackAbandonForm = () => {\r\n const eventData = {\r\n form_name: TRACKING_COMPONENTS.CHECKOUT_PAGE,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ABANDON_FORM, eventData })\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const manuallyValidateFieldData = (fieldData: FieldProps) => {\r\n return (\r\n (!fieldData.meta.error && fieldData.meta.touched) ||\r\n (fieldData.meta.initialValue !== '' && !fieldData.meta.error)\r\n )\r\n}\r\n\r\nexport const scrollToError = () => {\r\n const top =\r\n document.getElementsByClassName('input__error')[0] ||\r\n document.getElementsByClassName('input-module__error')[0] ||\r\n document.getElementsByClassName('flex-field__flex-field--error')[0]\r\n if (top) {\r\n top.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\r\n }\r\n}\r\n","import { get, isEmpty } from 'lodash-es'\r\nimport { formatDate } from '@common/utils'\r\nimport { Addon, SelectedAddon } from '@gtc/state/add-on'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { PlanAddonPriceItem } from '@gtc/state/checkout/state'\r\nimport { PRODUCT_PRICE_ITEM_TYPE } from '@gtc/constants'\r\nimport { CouponProcessedDataPerSku } from '@gtc/state/coupon/state'\r\n\r\nexport const getAddonPrice = (addon: Addon, annual: boolean, currency: string) => {\r\n let price: number = get(addon, ['pricingInfo', currency, 'price'], 0)\r\n if (annual) {\r\n price *= 12\r\n }\r\n return price\r\n}\r\n\r\nexport const calculateTotalPriceWithAddons = (\r\n calculatedPrice: number,\r\n selectedAddons: SelectedAddon[],\r\n selectedPlan: Plan,\r\n isAnnual: boolean,\r\n currency: string\r\n) => {\r\n let total = calculatedPrice\r\n selectedAddons.forEach((addon: SelectedAddon) => {\r\n const currAddon = selectedPlan.addons.find((x) => x.sKU === addon.sKU)\r\n if (currAddon) {\r\n total += getAddonPrice(currAddon, isAnnual, currency) * addon.quantity\r\n }\r\n })\r\n return total\r\n}\r\n\r\nexport const formattedEndDate = (isAnnual: boolean, locale: string) => {\r\n const date = new Date()\r\n if (isAnnual) {\r\n date.setFullYear(date.getFullYear() + 1)\r\n } else {\r\n date.setMonth(date.getMonth() + 1)\r\n }\r\n\r\n const formattedExpDate = formatDate(date, 'UTC', locale)\r\n\r\n return formattedExpDate\r\n}\r\n\r\nexport const getFeesFromProductPrice = (productPrices: PlanAddonPriceItem[] | undefined): number => {\r\n let feeAmount = 0\r\n if (productPrices && !isEmpty(productPrices)) {\r\n const [feePriceItem] = productPrices.filter(\r\n (productPriceItem) => productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.fee\r\n )\r\n feeAmount = feePriceItem && !isEmpty(feePriceItem) ? feePriceItem.listPrice : 0\r\n }\r\n return feeAmount\r\n}\r\n// renewal billing amount is the sum of ((unitprice-proratedamount) of plan * organizers + (unirprice-proratedamount) of addon * number of selected addons)\r\nexport const getRenewalAmountForAddonUser = (\r\n productPrices: PlanAddonPriceItem[] | undefined,\r\n organizers: number,\r\n selectedAddons: Addon[]\r\n): number => {\r\n let renewalAmount = 0\r\n const selectedAddonQuantityMap = new Map(selectedAddons.map((addon) => [addon.sKU, addon.quantity]))\r\n if (productPrices && !isEmpty(productPrices)) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product) {\r\n if (productPriceItem.itemId === 0) {\r\n renewalAmount += (productPriceItem.unitPrice - productPriceItem.proratedAmount) * organizers\r\n } else {\r\n const { productSKU } = productPriceItem\r\n renewalAmount +=\r\n (productPriceItem.unitPrice - productPriceItem.proratedAmount) *\r\n (selectedAddonQuantityMap.get(productSKU) || 0)\r\n }\r\n }\r\n })\r\n }\r\n return renewalAmount\r\n}\r\n\r\nexport const getCouponTotalSavings = (\r\n isCouponAppliedToPlan: boolean,\r\n couponProcessedDataPerSku: CouponProcessedDataPerSku | null,\r\n couponDoubleDipAmountForNewUser: number\r\n): number => {\r\n if (couponProcessedDataPerSku && isCouponAppliedToPlan) {\r\n const totalCouponSavings = Object.keys(couponProcessedDataPerSku).reduce((total, productSku) => {\r\n const productCouponData = couponProcessedDataPerSku[productSku]\r\n if (productCouponData && !isEmpty(productCouponData)) {\r\n return total + productCouponData.discountTotalSavings\r\n }\r\n return total\r\n }, 0)\r\n return totalCouponSavings + couponDoubleDipAmountForNewUser\r\n }\r\n return couponDoubleDipAmountForNewUser\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Price, Pricing, Tiers } from '@gtc/state/price'\r\n\r\nconst tierMap = new Map()\r\n\r\nexport const getSelectedTierIndex = (\r\n currentOrganizers: number,\r\n billingFrequency: string,\r\n selectedPlan: Plan,\r\n currency: CURRENCY\r\n) => {\r\n const { sKU, pricingInfo } = selectedPlan\r\n const identifier = `${sKU}-${currency}-${billingFrequency}-${currentOrganizers}`\r\n if (!tierMap.get(identifier)) {\r\n const currencyPricing = pricingInfo[currency as keyof Price] as Pricing\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const billingFrequencyTier = currencyPricing[billingFrequencyKey as keyof Pricing]\r\n\r\n const billingFrequencyTierKeys = Object.keys(billingFrequencyTier)\r\n\r\n billingFrequencyTierKeys.some((tierName, index) => {\r\n const tierData = billingFrequencyTier[tierName as keyof Tiers]\r\n if (currentOrganizers >= tierData.min && currentOrganizers <= tierData.max) {\r\n tierMap.set(identifier, index)\r\n return true\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return tierMap.get(identifier) as number\r\n}\r\n","import { CURRENCY } from '@common/constants'\r\nimport { BillingFrequencyVolumeDiscountRecords, VolumeDiscountPerTier } from '@gtc/state/checkout/state'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { Price, Pricing, Tiers } from '@gtc/state/price'\r\n\r\nexport const getDiscount = (basePrice: number, newPrice: number): number => {\r\n return basePrice - newPrice\r\n}\r\n\r\nexport const getDiscountPercentage = (basePrice: number, newPrice: number): number => {\r\n return Math.floor(((basePrice - newPrice) / basePrice) * 100)\r\n}\r\n\r\nconst processPricingTier = (pricingTierKeys: string[], pricingTiers: Tiers): VolumeDiscountPerTier[] => {\r\n let basePrice = 0\r\n return pricingTierKeys.reduce((pricingTierAccumulator, pricingTier, pricingTierIndex) => {\r\n const pricingTierAccumulatorCopy = [...pricingTierAccumulator]\r\n const pricingTierData = pricingTiers[pricingTier as keyof Tiers]\r\n const tierPrice = pricingTierData.price\r\n if (pricingTierIndex === 0) {\r\n basePrice = tierPrice\r\n }\r\n\r\n const volumeDiscountPerTier: VolumeDiscountPerTier = {\r\n discountPricePerUnit: getDiscount(basePrice, tierPrice),\r\n }\r\n pricingTierAccumulatorCopy.push(volumeDiscountPerTier)\r\n return pricingTierAccumulatorCopy\r\n }, [] as VolumeDiscountPerTier[])\r\n}\r\n\r\nconst processCurrencyPricing = (\r\n pricingKeys: string[],\r\n currencyPricing: Pricing\r\n): BillingFrequencyVolumeDiscountRecords => {\r\n return pricingKeys.reduce((billingFrequencyAccumulator, billingFrequency) => {\r\n const billingFrequencyAccumulatorCopy = { ...billingFrequencyAccumulator }\r\n const pricingTiers = currencyPricing[billingFrequency as keyof Pricing]\r\n const pricingTierKeys = Object.keys(pricingTiers)\r\n billingFrequencyAccumulatorCopy[billingFrequency] = processPricingTier(pricingTierKeys, pricingTiers)\r\n return billingFrequencyAccumulatorCopy\r\n }, {} as BillingFrequencyVolumeDiscountRecords)\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n selectedPlan: Plan,\r\n selectedCurrency: CURRENCY\r\n): BillingFrequencyVolumeDiscountRecords => {\r\n const { pricingInfo } = selectedPlan\r\n const currencyPricing = pricingInfo[selectedCurrency as keyof Price] as Pricing\r\n const pricingKeys = Object.keys(currencyPricing)\r\n return processCurrencyPricing(pricingKeys, currencyPricing)\r\n}\r\n\r\nexport const getTotalVolumeDiscount = (discountPerUser: number, organizers: number, annualize: boolean) => {\r\n const volumeDiscountTimesOrganizer = discountPerUser * organizers\r\n\r\n const totalVolumeDiscount = annualize ? volumeDiscountTimesOrganizer * 12 : volumeDiscountTimesOrganizer\r\n\r\n return totalVolumeDiscount\r\n}\r\n","import { PRODUCT_PRICE_ITEM_TYPE } from '@gtc/constants'\r\nimport { Addon } from '@gtc/state/add-on'\r\nimport { ProductPriceItem } from '@gtc/state/calculate-price'\r\n\r\nexport const getTotalProratedAmount = (\r\n productPrices: ProductPriceItem[],\r\n organizers: number,\r\n selectedAddons: Addon[]\r\n): number => {\r\n let proratedAmount = 0\r\n const selectedAddonQuantityMap = new Map(selectedAddons.map((addon) => [addon.sKU, addon.quantity]))\r\n if (productPrices) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product) {\r\n if (productPriceItem.itemId === 0) {\r\n proratedAmount += productPriceItem.proratedAmount * organizers\r\n } else {\r\n const { productSKU } = productPriceItem\r\n proratedAmount += productPriceItem.proratedAmount * (selectedAddonQuantityMap.get(productSKU) || 0)\r\n }\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n","import {\r\n BillingPeriod,\r\n CURRENCY,\r\n TimePeriod,\r\n COUPON_DISCOUNT_TYPE,\r\n COUPON_PAYMENT_PLAN,\r\n COUPON_TYPE,\r\n} from '@common/constants'\r\n\r\nimport { CouponItem, CouponServerData } from '@common/state/coupon/state'\r\n\r\nimport {\r\n CheckCouponProductsValidityParameters,\r\n CouponProcessedDataPerSku,\r\n CouponSkuValidity,\r\n CouponState,\r\n} from '@gtc/state/coupon/state'\r\n\r\nimport {\r\n CouponCalculation,\r\n GetProductItemsParameters,\r\n ProcessCouponDataParameters,\r\n ProductDetails,\r\n} from '@gtc/state/coupon-util'\r\n\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { ADDONS, PRODUCT_PRICE_ITEM_TYPE } from '@gtc/constants'\r\nimport { Plan } from '@gtc/state/plan'\r\nimport { ProductPriceItem } from '@gtc/state/calculate-price'\r\n\r\nexport const getActiveCouponServerData = (coupon: CouponState, selectedPlan: Plan) => {\r\n const { couponServerData, isUrlCouponActive, isCMSCouponActive } = coupon\r\n if (isUrlCouponActive) {\r\n return couponServerData\r\n }\r\n if (isCMSCouponActive) {\r\n return selectedPlan.activeCoupon\r\n }\r\n return null\r\n}\r\n\r\nexport const getAvailableCouponServerData = (\r\n coupon: CouponState,\r\n selectedPlan: Plan\r\n): [CouponServerData | null, boolean] => {\r\n const { couponServerData, isUrlCouponCodeAvailable } = coupon\r\n if (!isEmpty(couponServerData) && isUrlCouponCodeAvailable) {\r\n return [couponServerData, true]\r\n }\r\n if (!isEmpty(selectedPlan?.activeCoupon)) {\r\n return [selectedPlan.activeCoupon, false]\r\n }\r\n return [null, false]\r\n}\r\n\r\nexport const isCouponDateValid = (start: string, end: string): boolean => {\r\n const startDate = new Date(start)\r\n const endDate = new Date(end)\r\n const currentDate = new Date()\r\n const currentDatems = currentDate.getTime()\r\n return currentDatems >= startDate.getTime() && currentDatems <= endDate.getTime()\r\n}\r\n\r\ninterface IsProductSkuAndPaymentPlanValidParameters {\r\n selectedProductSku: string\r\n couponValidationItemsMap: Map\r\n isAnnual: boolean\r\n}\r\ninterface CouponValidationItem {\r\n paymentPlan: Set\r\n}\r\n\r\nconst isProductSkuAndPaymentPlanValid = ({\r\n selectedProductSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n}: IsProductSkuAndPaymentPlanValidParameters): boolean => {\r\n const toCheckPaymentPlan = isAnnual ? COUPON_PAYMENT_PLAN.UPFRONTANNUAL : COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n if (couponValidationItemsMap.has(selectedProductSku)) {\r\n const { paymentPlan } = couponValidationItemsMap.get(selectedProductSku) as CouponValidationItem\r\n return paymentPlan.has(toCheckPaymentPlan)\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport const checkCouponGenericValidity = (couponServerData: CouponServerData): boolean => {\r\n const { isCouponValid, validFrom, validTo } = couponServerData\r\n return isCouponValid && isCouponDateValid(validFrom, validTo)\r\n}\r\n\r\nexport const processFixTypeCouponValidity = (couponSkuValidity: CouponSkuValidity): CouponSkuValidity => {\r\n const fixCouponSkuValidity = { ...couponSkuValidity }\r\n const isAnyCouponSkuInvalid = Object.keys(couponSkuValidity).some(\r\n (couponSku) => couponSkuValidity[couponSku] === false\r\n )\r\n if (isAnyCouponSkuInvalid) {\r\n Object.keys(fixCouponSkuValidity).forEach((couponSku) => {\r\n fixCouponSkuValidity[couponSku] = false\r\n })\r\n }\r\n return fixCouponSkuValidity\r\n}\r\n\r\n// temporary code for default coupon Sku validity\r\nexport const falsyCouponSkuValidity = (couponSkuValidity: CouponSkuValidity): CouponSkuValidity => {\r\n return Object.keys(couponSkuValidity).reduce((skuAcc, currentSku) => {\r\n return { ...skuAcc, [currentSku]: false }\r\n }, {} as CouponSkuValidity)\r\n}\r\n\r\nexport const getCouponValidationItemsMap = (couponItems: CouponItem[]): Map => {\r\n const couponValidationItemsMap = new Map()\r\n couponItems.forEach((couponItem) => {\r\n const { productSku, paymentPlan } = couponItem\r\n if (!couponValidationItemsMap.has(productSku)) {\r\n const couponValidationItem: CouponValidationItem = { paymentPlan: new Set() }\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n }\r\n const couponValidationItem = couponValidationItemsMap.get(productSku) as CouponValidationItem\r\n couponValidationItem.paymentPlan.add(paymentPlan)\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n })\r\n return couponValidationItemsMap\r\n}\r\n\r\nexport const checkCouponProductsValidity = ({\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n}: CheckCouponProductsValidityParameters): CouponSkuValidity => {\r\n const { couponType, couponItems } = couponServerData\r\n const couponValidationItemsMap = getCouponValidationItemsMap(couponItems)\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const addonsValidity = selectedAddons.reduce((acc, selectedAddon) => {\r\n return {\r\n ...acc,\r\n [selectedAddon.sKU]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedAddon.sKU,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n }, {})\r\n const couponSkuValidity: CouponSkuValidity = {\r\n ...addonsValidity,\r\n [selectedPlanSku]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedPlanSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n // need to add the fixed coupon processing here later\r\n return couponType === COUPON_TYPE.FLEXIBLE ? couponSkuValidity : falsyCouponSkuValidity(couponSkuValidity)\r\n}\r\n\r\nexport const checkIfCouponAppliedToMinimumSelectedProducts = (couponSkuValidity: CouponSkuValidity): boolean => {\r\n return Object.values(couponSkuValidity).some((productValidity) => productValidity === true)\r\n}\r\n\r\nexport const calculateCouponDiscount = (\r\n couponDiscountType: COUPON_DISCOUNT_TYPE,\r\n productUnitPriceForCurrentTierWithBillingFrequency: number,\r\n couponDiscountAmount: number,\r\n productUnitPriceForBaseTierWithBillingFrequency: number\r\n): CouponCalculation | null => {\r\n switch (couponDiscountType) {\r\n case COUPON_DISCOUNT_TYPE.AMOUNTOFF: {\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponDiscountAmount / productUnitPriceForCurrentTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n discountPercentage,\r\n couponAmountOff: couponDiscountAmount,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.PERCENTAGEOFF: {\r\n const couponAmountOff = (productUnitPriceForCurrentTierWithBillingFrequency * couponDiscountAmount) / 100\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponAmountOff\r\n return {\r\n discountPercentage: couponDiscountAmount,\r\n discountUnitPrice,\r\n couponAmountOff,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.REPRICE: {\r\n const discountUnitPrice =\r\n couponDiscountAmount < productUnitPriceForCurrentTierWithBillingFrequency ? couponDiscountAmount : 0\r\n if (discountUnitPrice === 0) {\r\n return null\r\n }\r\n const couponAmountOff = productUnitPriceForBaseTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponAmountOff / productUnitPriceForBaseTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n couponAmountOff,\r\n discountPercentage,\r\n }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport const getProductItemsMap = ({\r\n billingFrequency,\r\n organizers,\r\n selectedPlan,\r\n selectedCurrency = CURRENCY.USD,\r\n selectedAddons,\r\n selectedTierIndex,\r\n}: GetProductItemsParameters): Map => {\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const productItemsMap: Map = new Map()\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const selectedPlanUnitPriceForCurrentTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'price'],\r\n 0\r\n )\r\n\r\n const selectedPlanUnitPriceForBaseTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'price'],\r\n 0\r\n )\r\n\r\n const annualMultiplier = isAnnual ? 12 : 1\r\n const selectedPlanProductDetails: ProductDetails = {\r\n quantity: organizers,\r\n unitPriceForCurrentTierWithBillingFrequency: selectedPlanUnitPriceForCurrentTier * annualMultiplier,\r\n unitPriceForBaseTierWithBillingFrequency: selectedPlanUnitPriceForBaseTier * annualMultiplier,\r\n }\r\n productItemsMap.set(selectedPlan.sKU, selectedPlanProductDetails)\r\n\r\n selectedAddons.forEach((addon) => {\r\n const { sKU, quantity } = addon\r\n const planAddons = selectedPlan.addons\r\n const filteredPlanAddons = planAddons.filter((planAddon) => planAddon.sKU === sKU)\r\n const planAddon = filteredPlanAddons[0]\r\n const planAddonPrice = get(planAddon, ['pricingInfo', selectedCurrency, 'price'], 0)\r\n const completePlanAddonPrice = planAddonPrice * annualMultiplier\r\n productItemsMap.set(sKU, {\r\n quantity,\r\n unitPriceForCurrentTierWithBillingFrequency: completePlanAddonPrice,\r\n unitPriceForBaseTierWithBillingFrequency: completePlanAddonPrice,\r\n })\r\n })\r\n return productItemsMap\r\n}\r\n\r\nexport const getCouponItemPriceMap = (\r\n couponServerData: CouponServerData,\r\n selectedCurrency: CURRENCY = CURRENCY.USD,\r\n isAnnual: boolean\r\n): Map => {\r\n const { couponItems } = couponServerData\r\n let isInvalid = false\r\n const couponItemsMap = new Map(\r\n couponItems\r\n .filter((couponItem) =>\r\n isAnnual\r\n ? couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL\r\n : couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n )\r\n .map((couponItem) => {\r\n const { productSku, priceChanges } = couponItem\r\n const selectedCurrencyPriceChangeList = priceChanges.filter(\r\n (price) => price.currency === selectedCurrency\r\n )\r\n const selectedCurrencyPriceChange = selectedCurrencyPriceChangeList[0]\r\n if (!selectedCurrencyPriceChange) {\r\n isInvalid = true\r\n } else {\r\n isInvalid = false\r\n }\r\n return [productSku, selectedCurrencyPriceChange?.value]\r\n })\r\n )\r\n return isInvalid ? new Map() : couponItemsMap\r\n}\r\n\r\nexport const processCouponData = ({\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n}: ProcessCouponDataParameters): CouponProcessedDataPerSku | null => {\r\n const productItemsEntries = [...productItemsMap.entries()]\r\n const couponDataPerSku: CouponProcessedDataPerSku = {}\r\n\r\n productItemsEntries.forEach(([productSku, productDetail]) => {\r\n if (couponSkuValidity[productSku] && couponItemsMap.has(productSku)) {\r\n const { quantity, unitPriceForBaseTierWithBillingFrequency, unitPriceForCurrentTierWithBillingFrequency } =\r\n productDetail\r\n const couponDiscountAmount = couponItemsMap.get(productSku) as number\r\n const calculatedCouponDiscount = calculateCouponDiscount(\r\n couponDiscountType,\r\n unitPriceForCurrentTierWithBillingFrequency,\r\n couponDiscountAmount,\r\n unitPriceForBaseTierWithBillingFrequency\r\n )\r\n if (calculatedCouponDiscount === null || calculatedCouponDiscount.discountUnitPrice <= 0) {\r\n couponDataPerSku[productSku] = null\r\n } else {\r\n const { discountUnitPrice, couponAmountOff, discountPercentage } = calculatedCouponDiscount\r\n couponDataPerSku[productSku] = {\r\n discountPercentage,\r\n discountUnitPrice,\r\n discountUnitSavings: couponAmountOff,\r\n discountTotalPrice: discountUnitPrice * quantity,\r\n discountTotalSavings: couponAmountOff * quantity,\r\n }\r\n }\r\n } else {\r\n couponDataPerSku[productSku] = null\r\n }\r\n })\r\n return isEmpty(couponDataPerSku) ? null : couponDataPerSku\r\n}\r\n\r\nexport const getCouponDoubleDipAmountForNewUser = (productPrices: ProductPriceItem[]): number => {\r\n const couponDoubleDipAmount = productPrices.reduce((total, currentProductPrice) => {\r\n const { productSKU, type } = currentProductPrice\r\n if (type === PRODUCT_PRICE_ITEM_TYPE.product && productSKU === ADDONS.ADDITIONAL_NUMBERS) {\r\n return total + get(currentProductPrice, ['couponDiscount', 'amount'], 0)\r\n }\r\n return total\r\n }, 0)\r\n return couponDoubleDipAmount\r\n}\r\n\r\nexport const calculateCouponPrice = (type: string, originalPrice: number, value: number, isAnnual: boolean) => {\r\n if (type === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n return originalPrice * ((100 - value) / 100)\r\n }\r\n if (type === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n const localValue = isAnnual ? value / 12 : value\r\n const amountOff = originalPrice - localValue\r\n if (amountOff > 0) {\r\n return amountOff\r\n }\r\n return originalPrice\r\n }\r\n return isAnnual ? value / 12 : value\r\n}\r\n\r\nexport interface CouponPrices {\r\n couponAnnualPrice: number\r\n couponMonthlyPrice: number\r\n}\r\n\r\nexport const getCouponPrices = (\r\n plan: Plan,\r\n bossMonthlyPrice: number,\r\n bossAnnualPrice: number,\r\n couponState: CouponState\r\n): CouponPrices => {\r\n let couponMonthlyPrice = bossMonthlyPrice\r\n let couponAnnualPrice = bossAnnualPrice\r\n const couponData = getActiveCouponServerData(couponState, plan)\r\n const activeCoupon = couponData || plan.activeCoupon\r\n if (activeCoupon && activeCoupon.isCouponValid && activeCoupon.couponType !== COUPON_TYPE.FIX) {\r\n const thisPlansCoupons: CouponItem[] = activeCoupon.couponItems.filter(\r\n (planCoupon: CouponItem) => planCoupon.productSku === plan.sKU\r\n )\r\n thisPlansCoupons.forEach((thisCoupon) => {\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY) {\r\n couponMonthlyPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossMonthlyPrice,\r\n thisCoupon.priceChanges[0].value,\r\n false\r\n )\r\n }\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL) {\r\n couponAnnualPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossAnnualPrice,\r\n thisCoupon.priceChanges[0].value,\r\n true\r\n )\r\n }\r\n })\r\n }\r\n return { couponAnnualPrice, couponMonthlyPrice }\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { SavedSessionState } from '@gtc/state/checkout/state'\r\n\r\nexport const loadSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as SavedSessionState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveSessionState = (state: SavedSessionState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n sessionStorage.setItem(STORAGE_CONST.GTC_COUPON_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n\r\n if (serializedState) sessionStorage.removeItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","export enum RESOLVE_TRIAL_ERROR_CODES {\r\n INVALID_CODE = 'invalid.token.code',\r\n TOKEN_EXPIRED = 'token.expired',\r\n}\r\n\r\nexport enum RESOLVE_TRIAL_ERROR_STATE {\r\n TIMEOUT = 'timeout',\r\n ALREADY_USER = 'already.user',\r\n EXPIRED_CODE = 'expired.code',\r\n WRONG_CODE = 'wrong.code',\r\n NO_PROVISIONING = 'failed.provisioning',\r\n USER_BANNED = 'banned',\r\n GENERIC_ERROR = 'generic.error',\r\n DECISION_MAKER_FAIL = 'decision.maker.fail',\r\n NO_ERROR = 'none',\r\n}\r\n\r\nexport enum RESOLVE_TRIAL_ERROR_IDS {\r\n USER_BANNED = 'USER_BANNED',\r\n EXISTING_TRIAL = 'EXISTING_TRIAL',\r\n EXISTING_USER = 'EXISTING_USER',\r\n GENERIC_ERROR = 'GENERIC_ERROR',\r\n ADDRESS_ERROR = 'ADDRESS_ERROR',\r\n CARD_ERROR = 'CARD_ERROR',\r\n}\r\n\r\nexport enum RESOLVE_TRIAL_START_ERROR_CODES {\r\n EXPIRED_TRIAL = 'restart.trialsubscription',\r\n}\r\n","export enum LICENSECAP {\r\n MIN = 1,\r\n MAX = 20,\r\n}\r\n\r\nexport enum NUMBERSCAP {\r\n MIN = 0,\r\n MAX = 20,\r\n}\r\n","export enum RESOLVE_USER_TYPES {\r\n NEW = 'NEW',\r\n TRIALER = 'TRIALER',\r\n ADDON = 'ADDON',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n BANNED = 'BANNED',\r\n EXPIRED = 'EXPIRED',\r\n IDENTITY_ONLY = 'IDENTITY_ONLY',\r\n}\r\n\r\nexport enum RESOLVE_USER_TYPES_RESPONSE {\r\n USER_IDENTITY_NOT_FOUND = 'ValidateUserIdentityNotFound',\r\n USER_BOSS_NOT_FOUND = 'ValidateUserBossNotFound',\r\n}\r\n\r\nexport enum RESOLVE_PARTIAL_NON_VALIDATION_USER_TYPES {\r\n TRIALER = 'TRIALER',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n EXPIRED = 'EXPIRED',\r\n}\r\n","export enum ADDONS {\r\n ADDITIONAL_NUMBERS = 'G2CPreDID',\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n MAX_AGENTS_ADDONS = 51,\r\n MAX_DEVICE_ADDONS = 1500,\r\n MAX_ENDPOINTS_ADDONS = 1025,\r\n ENDPOINTS_ADDONS_INTERVAL = 25,\r\n DEVICE_ADDONS_INTERVAL = 25,\r\n AGENT = 'Agent',\r\n ENDPOINT = 'Endpoint',\r\n ADDON_PRICE_REPLACE = 'ADDON_PRICE_REPLACE',\r\n}\r\n\r\nexport enum ADDON_SKUS {\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n BASIC_AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n BASIC_ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n STANDARD_AGENT_ADDON = 'GTRStandardAddAgentNamed',\r\n STANDARD_ENDPOINT_ADDON = 'GTRStandardAddEndpointNamed',\r\n}\r\n","export enum CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES {\r\n FIRSTNAME = 'FirstName',\r\n LASTNAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n COUNTRYCODE = 'CountryCode',\r\n STATECODE = 'StateCode',\r\n}\r\n","export enum CHECKOUTFORM_STEPS {\r\n CREATE_FLEX_TOKEN = 'createFlexToken',\r\n CREATE_USER_ACCOUNT = 'createUserAccount',\r\n SAVE_BILLING_INFO = 'saveBillingInfo',\r\n SAVE_PAYMENT_INFO = 'savePaymentInfo',\r\n CARDINAL_SEND_CHALLENGE = 'sendCardinalChallenge',\r\n GET_AVAILABLE_PAYMENT_METHODS = 'getAvailablepaymentMethods',\r\n SUBMIT_PAYMENT = 'submitPayment',\r\n CARDINAL_TRIGGER_BIN_PROCESS = 'triggerBinProcess',\r\n}\r\n","export enum RESOLVE_TRACKING_COMPONENTS {\r\n CHECKOUT_PAGE = 'checkout-form',\r\n FORM_SUBMISSION_SAGA = 'form-submission-saga',\r\n BILLING_PAGE = 'billing',\r\n CUSTOMIZE_PAGE = 'customize',\r\n NEXT_STEPS_PAGE = 'next-steps',\r\n FATAL_ERROR_PAGE = 'fatal-error',\r\n CALCULATE_PRICE_SAGA = 'calculate-price-saga',\r\n CREATE_USER_SAGA = 'create-user-saga',\r\n CREATE_BILLING_INFO_SAGA = 'create-billing-info-saga',\r\n CREATE_PAYMENT_SAGA = 'create-payment-saga',\r\n GET_AVAILABLE_PAYMENT_METHODS_SAGA = 'get-available-payment-methods-saga',\r\n SUBMIT_PAYMENT_SAGA = 'submit-payment-saga',\r\n EXISTING_USER_FORM_SUBMISSION_SAGA = 'existing-user-form-submission-saga',\r\n}\r\n","export enum CHECKOUTFORM_FIELDS {\r\n FIRST_NAME = 'FirstName',\r\n LAST_NAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n BILLING_FIRST_NAME = 'BillingFirstName',\r\n BILLING_LAST_NAME = 'BillingLastName',\r\n STREET1 = 'Street1',\r\n COUNTRY_CODE = 'CountryCode',\r\n CITY = 'City',\r\n STATE_CODE = 'StateCode',\r\n ZIP_CODE = 'ZipCode',\r\n CONTACT_PHONE = 'ContactPhone',\r\n EXPIRATION_DATE = 'ExpirationDate',\r\n TAX_ID = 'TaxNumber',\r\n COMPANY_NAME = 'CompanyName',\r\n}\r\n","export enum PRODUCT_PRICE_ITEM_TYPE {\r\n product = 'Product',\r\n fee = 'Fee',\r\n volumeDiscount = 'VolumeDiscount',\r\n amountOffAutoDiscount = 'AmountOffAutoDiscount',\r\n}\r\n","export enum BUY_TYPE {\r\n TRIAL_CONVERSION = 'trial conversion',\r\n ADDON = 'add-on',\r\n DIRECT_BUY = 'direct buy',\r\n}\r\n","export enum REFERRER {\r\n gotoAdmin = 'gotoadmin',\r\n}\r\n\r\nexport const REFERRER_QUERY_PARAM = 'referrer'\r\n","import axios from 'axios'\r\nimport { SC_SITE } from '@common/constants'\r\nimport {\r\n ResolveBillingInfoDataType,\r\n ResolvePaymentDataType,\r\n ResolveSubmitDataType,\r\n ResolveCalculatePriceDataType,\r\n ResolveSubmitWithCardAddDataType,\r\n} from '@gtresolve/state/checkout/state'\r\nimport { ResolveUserDataType, ResolveAbandonedCartPayload } from '@gtresolve/state/user/state'\r\nimport { getContentLanguage } from '@gtresolve/utils/language-helpers'\r\n\r\nexport interface ResolvePaymentMethodDataType {\r\n accessToken?: string\r\n billingAccountKey?: string\r\n}\r\n\r\nexport interface ResolveCardHeadersType {\r\n AccessToken: string\r\n BillingAccountKey: string\r\n PaymentMethodKey: string\r\n}\r\n\r\nexport interface ResolveLabelDataType {\r\n id: string\r\n plan: string\r\n promoCode: string\r\n accessToken: string\r\n timezone: string\r\n}\r\n\r\nexport interface apiQueryParamsType {\r\n /* eslint-disable camelcase */\r\n sc_site: string\r\n sc_lang?: string\r\n}\r\n\r\nexport const apiQueryParams = {\r\n sc_site: SC_SITE.RESOLVE,\r\n sc_lang: 'en',\r\n}\r\n\r\nexport const setLanguageParam = (queryParams: apiQueryParamsType) => {\r\n return {\r\n ...queryParams,\r\n sc_lang: getContentLanguage(),\r\n }\r\n}\r\n\r\n/* APP DATA */\r\n\r\n// get buy flow api data\r\n\r\nexport function getResolveLabelData(): Promise {\r\n const updatedQueryParams = setLanguageParam(apiQueryParams)\r\n return axios.post('/ecommapi/content/buy/gtr', null, { params: updatedQueryParams })\r\n}\r\n\r\n// get available payment methods\r\nexport function getAvailablePaymentMethods() {\r\n return axios.post('/ecommapi/purchase/GetAvailablePaymentMethods', null, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// create user account\r\nexport function createUserAccount(data: ResolveUserDataType): Promise {\r\n return axios.post('/ecommapi/identity/CreateAccount/', data, {\r\n withCredentials: true,\r\n params: apiQueryParams,\r\n })\r\n}\r\n\r\n// create billing information\r\nexport function createBillingInfo(data: ResolveBillingInfoDataType): Promise {\r\n return axios.post('/ecommapi/purchase/SetBillingInfo', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// calculate payment\r\nexport function calculatePrice(data: ResolveCalculatePriceDataType): Promise {\r\n return axios.post('/ecommapi/purchase/CalculatePrice', data)\r\n}\r\n\r\n// create payment info\r\nexport function savePayment(data: ResolvePaymentDataType) {\r\n return axios.post('/ecommapi/purchase/SavePaymentMethodV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment with card add\r\n// api reference: https://confluence.ops.expertcity.com/display/MMM/API+-+Public+-+Process+Purchase+With+Card+Add+V3\r\nexport function submitPaymentWithCardAdd(data: ResolveSubmitWithCardAddDataType): Promise {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseWithCardAddV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment\r\nexport function submitPayment(data: ResolveSubmitDataType | ResolveSubmitWithCardAddDataType) {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\nexport function validateTaxNumber(country: string, taxNumber: string, federalTaxType?: string) {\r\n return axios.get('/ecommapi/purchase/ValidateTaxNumber', {\r\n params: {\r\n country,\r\n taxNumber,\r\n federalTaxType,\r\n },\r\n })\r\n}\r\n\r\n// cart abandonment\r\nexport function submitAbandonedCart(data: ResolveAbandonedCartPayload) {\r\n return axios.post(`${process.env.AWS_ABANDON_ENDPOINT}`, data)\r\n}\r\n\r\nexport default {\r\n getResolveLabelData,\r\n calculatePrice,\r\n createUserAccount,\r\n createBillingInfo,\r\n submitPaymentWithCardAdd,\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CHECKOUTFORM_STEPS } from '@gtresolve/constants'\r\nimport { ResolveBuyFormData } from './state'\r\n\r\nexport enum ResolveBuyFormActionTypes {\r\n SUBMIT_BUY_FORM = '[resolve-buy-form-actions] submit-exp',\r\n RESET_BUY_FORM_AFFECTED_STATES = '[resolve-buy-form-actions] reset-affected-states',\r\n RESET_BUY_FORM = '[resolve-buy-form-actions] reset-checkout-form',\r\n EXISTING_USER_SUBMIT_BUY_FORM = '[resolve-buy-form-actions] existing-user-submit-exp',\r\n UPDATE_INITIAL_FORM_STATE = '[resolve-buy-form-actions] update-initial-form-state',\r\n SET_CLEAR_EMAIL = '[resolve-buy-form-actions] set-clear-email',\r\n UPDATE_STEPS = '[resolve-buy-form-actions] update-steps',\r\n SET_STATES_OPTIONAL = '[resolve-buy-form-actions] set-states-optional',\r\n}\r\n\r\nexport const resolveBuyFormActions = {\r\n submitForm: (values: ResolveBuyFormData) => createAction(ResolveBuyFormActionTypes.SUBMIT_BUY_FORM, { values }),\r\n existingUserSubmitForm: (values: ResolveBuyFormData) =>\r\n createAction(ResolveBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, { values }),\r\n resetCheckoutFormAffectedStates: () => createAction(ResolveBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES),\r\n updateInitialFormState: (data: ResolveBuyFormData) =>\r\n createAction(ResolveBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE, {\r\n data,\r\n }),\r\n resetForm: () => createAction(ResolveBuyFormActionTypes.RESET_BUY_FORM),\r\n setClearEmail: (clear: boolean) => createAction(ResolveBuyFormActionTypes.SET_CLEAR_EMAIL, { clear }),\r\n updateSteps: (stepName: CHECKOUTFORM_STEPS, stepResult: boolean) =>\r\n createAction(ResolveBuyFormActionTypes.UPDATE_STEPS, {\r\n stepName,\r\n stepResult,\r\n }),\r\n setStatesOptional: (optional: boolean) => createAction(ResolveBuyFormActionTypes.SET_STATES_OPTIONAL, { optional }),\r\n}\r\n\r\nexport type BuyFormActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { ResolveSelectedAddon, ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolveBuyFormData } from '@gtresolve/state/buy-form/state'\r\nimport { ResolveProductPriceItem } from '@gtresolve/state/calculate-price'\r\nimport {\r\n ResolveBillingInfoDataType,\r\n ResolvePaymentDataType,\r\n ResolveSubmitDataType,\r\n ResolveBillingFrequencyVolumeDiscountRecords,\r\n ResolveSubmitWithCardAddDataType,\r\n} from './state'\r\n\r\nexport enum ResolveCheckoutActionTypes {\r\n SET_LOADING = '[resolve-checkout-actions] set-loading',\r\n SET_PLAN_ID = '[resolve-checkout-actions] set-plan-id',\r\n SET_BILLING_FREQUENCY = '[resolve-checkout-actions] set-billing-frequency',\r\n CLEAR_ADDONS = '[resolve-checkout-actions] clear-addons',\r\n SET_SELECTED_ADDONS = '[resolve-checkout-actions] set-selected-addons',\r\n SET_ORGANIZERS = '[resolve-checkout-actions] set-organizers',\r\n SET_SELECTED_PLAN = '[resolve-checkout-actions] set-selected-plan',\r\n SET_EXISTING_USER_MODAL_OPEN = '[resolve-checkout-actions] set-existing-user-modal',\r\n CREATE_BILLING_INFO = '[resolve-checkout-actions] create-billing-info',\r\n CREATE_PAYMENT = '[resolve-checkout-actions] create-payment',\r\n SUBMIT_PAYMENT = '[resolve-checkout-actions] submit-payment',\r\n CREATE_AND_SUBMIT_PAYMENT = '[resolve-checkout-actions] create-and-submit-payment',\r\n GET_AVAILABLE_PAYMENT_METHODS = '[resolve-checkout-actions] get-available-payment-methods',\r\n CALCULATE_PRICE = '[resolve-checkout-actions] calculate-price',\r\n SET_CALCULATED_PRICE = '[resolve-checkout-actions] set-calculated-price',\r\n GET_SAVED_STATE = '[resolve-checkout-actions] get-saved-state',\r\n SET_SAVED_STATE_LOADED = '[resolve-checkout-actions] set-saved-state-loaded',\r\n RESET_CHECKOUT_STATE = '[resolve-checkout-actions] reset-state',\r\n SET_EXISTING_ORGANIZERS = '[resolve-checkout-actions] set-existing-organizers',\r\n SET_PURCHASE_COMPLETE = '[resolve-checkout-actions] set-purchase-complete',\r\n SET_LOADING_TOTAL = '[resolve-checkout-actions] set-loading-total',\r\n SET_ADDON_COMPLETE = '[resolve-checkout-actions] set-addon-complete',\r\n SET_SELECTED_TIER_INDEX = '[resolve-checkout-actions] set-selected-tier-index',\r\n CALCULATE_VOLUME_DISCOUNT = '[resolve-checkout-actions] calculate-volume-discount',\r\n SET_VOLUME_DISCOUNT = '[resolve-checkout-actions] set-volume-discount',\r\n SET_VOLUME_DISCOUNT_LOADING = '[resolve-checkout-actions] set-volume-discount-loading',\r\n GET_VOLUME_DISCOUNT = '[resolve-checkout-actions] get-volume-discount',\r\n SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE = '[resolve-checkout-actions] set-current-volume-discount-price-and-percentage',\r\n ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON = '[resolve-checkout-actions] adjust-current-volume-discount-for-reprice-coupon',\r\n SET_PRORATED_AMOUNT = '[resolve-checkout-actions] set-prorated-amount',\r\n SET_EXTRA_ADDON = '[resolve-checkout-actions] set-extra-addon',\r\n SET_ENDPOINTS = '[resolve-checkout-actions] set-endpoints',\r\n SET_AGENTS = '[resolve-checkout-actions] set-agents',\r\n SET_TAX_TYPE = '[resolve-checkout-actions] set-tax-type',\r\n SET_AUTO_LOGIN = '[resolve-checkout-form-actions] set-auto-login',\r\n}\r\n\r\nexport const resolveCheckoutActions = {\r\n setLoading: (loading: boolean) => createAction(ResolveCheckoutActionTypes.SET_LOADING, { loading }),\r\n setPurchaseComplete: (complete: boolean) =>\r\n createAction(ResolveCheckoutActionTypes.SET_PURCHASE_COMPLETE, { complete }),\r\n setBillingFrequency: (frequency: TimePeriod) =>\r\n createAction(ResolveCheckoutActionTypes.SET_BILLING_FREQUENCY, { frequency }),\r\n clearAddons: () => createAction(ResolveCheckoutActionTypes.CLEAR_ADDONS),\r\n setSelectedPlan: (planSku: string) => createAction(ResolveCheckoutActionTypes.SET_SELECTED_PLAN, { planSku }),\r\n setSelectedAddons: (addons: ResolveSelectedAddon[]) =>\r\n createAction(ResolveCheckoutActionTypes.SET_SELECTED_ADDONS, { addons }),\r\n setOrganizers: (organizers: number) => createAction(ResolveCheckoutActionTypes.SET_ORGANIZERS, { organizers }),\r\n createBillingInfo: (billingValues: ResolveBillingInfoDataType) =>\r\n createAction(ResolveCheckoutActionTypes.CREATE_BILLING_INFO, {\r\n billingValues,\r\n }),\r\n createPayment: (paymentValues: ResolvePaymentDataType) =>\r\n createAction(ResolveCheckoutActionTypes.CREATE_PAYMENT, {\r\n paymentValues,\r\n }),\r\n submitPayment: (submitValues: ResolveSubmitDataType | ResolveSubmitWithCardAddDataType) =>\r\n createAction(ResolveCheckoutActionTypes.SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n createAndSubmitPayment: (submitValues: ResolveSubmitWithCardAddDataType) =>\r\n createAction(ResolveCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n getPaymentMethods: () => createAction(ResolveCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS),\r\n calculatePrice: (values: ResolveBuyFormData, component?: string, planSKU?: string) =>\r\n createAction(\r\n ResolveCheckoutActionTypes.CALCULATE_PRICE,\r\n {\r\n values,\r\n planSKU,\r\n },\r\n { component }\r\n ),\r\n setCalculatedPrice: (\r\n productPrices: ResolveProductPriceItem[],\r\n net: number,\r\n total: number,\r\n tax: number,\r\n creditback: number,\r\n anniversaryDate: string\r\n ) =>\r\n createAction(ResolveCheckoutActionTypes.SET_CALCULATED_PRICE, {\r\n productPrices,\r\n net,\r\n total,\r\n tax,\r\n creditback,\r\n anniversaryDate,\r\n }),\r\n getSavedState: (urlPlan: string) =>\r\n createAction(ResolveCheckoutActionTypes.GET_SAVED_STATE, {\r\n urlPlan,\r\n }),\r\n setSavedStateLoaded: (savedStateLoaded: boolean, component: string) =>\r\n createAction(\r\n ResolveCheckoutActionTypes.SET_SAVED_STATE_LOADED,\r\n {\r\n savedStateLoaded,\r\n },\r\n { component }\r\n ),\r\n setTotalLoading: (loading: boolean) =>\r\n createAction(ResolveCheckoutActionTypes.SET_LOADING_TOTAL, {\r\n loading,\r\n }),\r\n setAddonComplete: (addonComplete: boolean) =>\r\n createAction(ResolveCheckoutActionTypes.SET_ADDON_COMPLETE, {\r\n addonComplete,\r\n }),\r\n resetCheckoutState: () => createAction(ResolveCheckoutActionTypes.RESET_CHECKOUT_STATE),\r\n setSelectedTierIndex: (selectedTierIndex: number, organizers: number) =>\r\n createAction(ResolveCheckoutActionTypes.SET_SELECTED_TIER_INDEX, { selectedTierIndex, organizers }),\r\n calculateVolumeDiscount: () => createAction(ResolveCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT),\r\n setVolumeDiscount: (\r\n selectedPlanSku: string,\r\n currency: CURRENCY,\r\n volumeDiscountForSelectedPlanAndCurrency: ResolveBillingFrequencyVolumeDiscountRecords\r\n ) =>\r\n createAction(ResolveCheckoutActionTypes.SET_VOLUME_DISCOUNT, {\r\n selectedPlanSku,\r\n currency,\r\n volumeDiscountForSelectedPlanAndCurrency,\r\n }),\r\n setVolumeDiscountLoading: (volumeDiscountLoading: boolean) =>\r\n createAction(ResolveCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING, { volumeDiscountLoading }),\r\n getVolumeDiscount: (organizers: number, selectedTierIndex: number, billingFrequency: TimePeriod) =>\r\n createAction(ResolveCheckoutActionTypes.GET_VOLUME_DISCOUNT, {\r\n organizers,\r\n selectedTierIndex,\r\n billingFrequency,\r\n }),\r\n setCurrentVolumeDiscountPriceAndPercentage: (currentVolumeDiscountPrice: number) =>\r\n createAction(ResolveCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE, {\r\n currentVolumeDiscountPrice,\r\n }),\r\n setProratedAmount: (proratedAmount: number) =>\r\n createAction(ResolveCheckoutActionTypes.SET_PRORATED_AMOUNT, { proratedAmount }),\r\n adjustCurrentVolumeDiscountForRepriceCoupon: () =>\r\n createAction(ResolveCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON),\r\n setExtraAddons: (addons: ResolveAddon[]) => createAction(ResolveCheckoutActionTypes.SET_EXTRA_ADDON, { addons }),\r\n setEndpoints: (endpoints: number) => createAction(ResolveCheckoutActionTypes.SET_ENDPOINTS, { endpoints }),\r\n setAgents: (agents: number) => createAction(ResolveCheckoutActionTypes.SET_AGENTS, { agents }),\r\n setTaxType: (type: string) => createAction(ResolveCheckoutActionTypes.SET_TAX_TYPE, { type }),\r\n setAutoLogin: (autoLogin?: string) =>\r\n createAction(ResolveCheckoutActionTypes.SET_AUTO_LOGIN, {\r\n autoLogin,\r\n }),\r\n}\r\n\r\nexport type ResolveCheckoutActions = ActionUnion\r\n","import { ResolveContentData } from '@gtresolve/state/content-data'\r\nimport { LabelContent } from '@gtresolve/state/label-content'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum ResolveContentActionTypes {\r\n GET_LABEL_CONTENT = '[resolve-content-actions] get-label-content',\r\n SET_CONTENT = '[resolve-content-actions] set-content',\r\n SET_CONTENT_LOADED = '[resolve-content-actions] set-content-loaded',\r\n GET_COMPARE_MODAL_CONTENT = '[resolve-content-actions] get-compare-modal-content',\r\n SET_COMPARE_MODAL_CONTENT = '[resolve-content-actions] set-compare-modal-content',\r\n SET_COUPON_DISCLAIMER = '[resolve-content-actions] set-coupon-disclaimer',\r\n}\r\n\r\nexport const contentActions = {\r\n getLabelContent: (upgrade?: boolean) => createAction(ResolveContentActionTypes.GET_LABEL_CONTENT, { upgrade }),\r\n setContent: (content: ResolveContentData, labels: LabelContent, filteredPlans: [], allPlans: []) =>\r\n createAction(ResolveContentActionTypes.SET_CONTENT, {\r\n content,\r\n labels,\r\n filteredPlans,\r\n allPlans,\r\n }),\r\n getCompareModalContent: (PlanGroupdId: string) =>\r\n createAction(ResolveContentActionTypes.GET_COMPARE_MODAL_CONTENT, PlanGroupdId),\r\n setCompareModalContent: (content: []) =>\r\n createAction(ResolveContentActionTypes.SET_COMPARE_MODAL_CONTENT, { content }),\r\n setContentLoaded: (loaded: boolean) => createAction(ResolveContentActionTypes.SET_CONTENT_LOADED, { loaded }),\r\n setCouponDisclaimer: (couponDisclaimer: string) =>\r\n createAction(ResolveContentActionTypes.SET_COUPON_DISCLAIMER, { couponDisclaimer }),\r\n}\r\n\r\n// where do the get functions go\r\n\r\nexport type ContentActions = ActionUnion\r\n","import { ResolveContainerAppState } from '@gtresolve/store'\r\n// we need to complete this file, as we copy reducers from connect\r\n\r\nexport const getLabelContent = (state: ResolveContainerAppState) => state.resolve.content.labelContent\r\nexport const getCheckoutState = (state: ResolveContainerAppState) => state.resolve.checkout\r\nexport const getPlanData = (state: ResolveContainerAppState) => state.resolve.content.planData\r\nexport const getContentState = (state: ResolveContainerAppState) => state.resolve.content\r\nexport const getContentData = (state: ResolveContainerAppState) => state.resolve.content.contentData\r\nexport const getUserState = (state: ResolveContainerAppState) => state.resolve.user\r\nexport const getBuyFormState = (state: ResolveContainerAppState) => state.resolve.form\r\nexport const getCouponState = (state: ResolveContainerAppState) => state.resolve.coupon\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from '@common/state/tracking/state'\r\n\r\nexport enum ResolveTrackingActionTypes {\r\n TRACK = '[resolve-tracking] resolve-track-event',\r\n}\r\n\r\nexport const resolveTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) =>\r\n createAction(ResolveTrackingActionTypes.TRACK, { trackingInfo }, { component }),\r\n}\r\n\r\nexport type ResolveTrackingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { ResolveBuyFormData } from '@gtresolve/state/buy-form/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { ResolveAbandonedCartDataType, ResolveUserDataType } from './state'\r\n\r\nexport enum ResolveUserActionTypes {\r\n CHECK_EXISTING_USER = '[resolve-user-actions] check-existing-user',\r\n CREATE_NEW_USER = '[resolve-user-actions] create-new-user',\r\n GET_LOGGED_IN_USER_STATE = '[resolve-user-actions] get-user-logged-in-state',\r\n SET_EXISTING_BILLING_INFO = '[resolve-user-actions] set-existing-billing-info',\r\n SET_EXISTING_USER_INFO = '[resolve-user-actions] set-existing-user-info',\r\n SET_EXISTING_ACCOUNT_INFO = '[resolve-user-actions] set-existing-account-info',\r\n SET_DISPLAY_NAME = '[resolve-user-actions] set-display-name',\r\n SET_LOADING_EXISTING_INFO = '[resolve-user-actions] set-loading-existing-info',\r\n SET_VERIFYING_TOKEN = '[resolve-user-actions] set-verifying-token',\r\n SET_USER_TYPE = '[resolve-user-actions] set-user-type',\r\n SET_EXISTING_PAYMENT_DETAILS = '[resolve-user-actions] set-existing-payment-details',\r\n SET_ACCESS_TOKEN = '[resolve-user-actions] set-access-token',\r\n GET_ACCESS_TOKEN = '[resolve-user-actions] get-access-token',\r\n SET_IS_USER_LOGGEDIN = '[resolve-user-actions] set-is-user-loggedin',\r\n USER_LOGIN = '[resolve-user-actions] user-login',\r\n USER_LOGOUT = '[resolve-user-actions] user-logout',\r\n SET_VERIFY_USER_SHOULD_LOGIN = '[resolve-user-actions] get-verify-user-should-login',\r\n SUBMIT_ABANDONED_CART = '[resolve-user-actions] submit-abandoned-cart',\r\n}\r\n\r\nexport const resolveUserActions = {\r\n checkExistingUser: (email: string, form?: ResolveBuyFormData) =>\r\n createAction(ResolveUserActionTypes.CHECK_EXISTING_USER, { email, form }),\r\n createNewUser: (userValues: ResolveUserDataType) =>\r\n createAction(ResolveUserActionTypes.CREATE_NEW_USER, { userValues }),\r\n getLoggedInUserState: () => createAction(ResolveUserActionTypes.GET_LOGGED_IN_USER_STATE),\r\n setExistingBillingInformation: (billingInfo: ExistingBillingInfoType) =>\r\n createAction(ResolveUserActionTypes.SET_EXISTING_BILLING_INFO, { billingInfo }),\r\n setLoadingExistingInformation: (loading: boolean) =>\r\n createAction(ResolveUserActionTypes.SET_LOADING_EXISTING_INFO, { loading }),\r\n setVerifyingToken: (verifying: boolean) => createAction(ResolveUserActionTypes.SET_VERIFYING_TOKEN, { verifying }),\r\n setExistingUserInformation: (userInfo: ExistingUserInfoType) =>\r\n createAction(ResolveUserActionTypes.SET_EXISTING_USER_INFO, { userInfo }),\r\n setExistingAccountInformation: (accountInfo: ExistingAccountInfoType) =>\r\n createAction(ResolveUserActionTypes.SET_EXISTING_ACCOUNT_INFO, { accountInfo }),\r\n setDisplayName: (displayName: string) => createAction(ResolveUserActionTypes.SET_DISPLAY_NAME, { displayName }),\r\n setUserType: (type: string) => createAction(ResolveUserActionTypes.SET_USER_TYPE, { type }),\r\n setExistingPaymentDetails: (info: ExistingPaymentInfoType) =>\r\n createAction(ResolveUserActionTypes.SET_EXISTING_PAYMENT_DETAILS, { info }),\r\n getAccessToken: () => createAction(ResolveUserActionTypes.GET_ACCESS_TOKEN),\r\n userLogin: (component?: string, pathname?: string, search?: string, sso?: boolean) =>\r\n createAction(ResolveUserActionTypes.USER_LOGIN, { pathname, search, sso }, { component }),\r\n userLogout: (component?: string) => createAction(ResolveUserActionTypes.USER_LOGOUT, {}, { component }),\r\n setAccessToken: (accessToken: Token) => createAction(ResolveUserActionTypes.SET_ACCESS_TOKEN, { accessToken }),\r\n setIsUserLoggedIn: (isUserLoggedIn: boolean) =>\r\n createAction(ResolveUserActionTypes.SET_IS_USER_LOGGEDIN, {\r\n isUserLoggedIn,\r\n }),\r\n setVerifyShouldUserLogIn: (verifiedUserShouldLogIn: boolean) =>\r\n createAction(ResolveUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN, { verifiedUserShouldLogIn }),\r\n submitAbandonedCart: (abandonedCartData: ResolveAbandonedCartDataType) =>\r\n createAction(ResolveUserActionTypes.SUBMIT_ABANDONED_CART, { abandonedCartData }),\r\n}\r\n\r\nexport type ResolveUserActions = ActionUnion\r\n","import { PRODUCT_PRICE_ITEM_TYPE } from '@gtresolve/constants'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolveProductPriceItem } from '@gtresolve/state/calculate-price'\r\n\r\nexport const getTotalProratedAmount = (productPrices: ResolveProductPriceItem[]): number => {\r\n let proratedAmount = 0\r\n if (productPrices) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product && productPriceItem.proratedAmount) {\r\n proratedAmount += productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n\r\nexport const getAddonProrateAmount = (productPrices?: ResolveProductPriceItem[], addon?: ResolveAddon) => {\r\n let proratedAmount = 0\r\n if (productPrices && addon) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.proratedAmount && productPriceItem.productSKU === addon.sKU) {\r\n proratedAmount = productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n","import { get } from 'lodash-es'\r\nimport { CURRENCY } from '@common/constants'\r\nimport {\r\n ResolveBillingFrequencyVolumeDiscountRecords,\r\n ResolveVolumeDiscountPerTier,\r\n} from '@gtresolve/state/checkout/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolvePrice, ResolvePricing, ResolveTiers } from '@gtresolve/state/price'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\n\r\nexport const getDiscount = (basePrice: number, newPrice: number): number => {\r\n return basePrice - newPrice\r\n}\r\n\r\nexport const getDiscountPercentage = (basePrice: number, newPrice: number): number => {\r\n return Math.floor(((basePrice - newPrice) / basePrice) * 100)\r\n}\r\n\r\nconst processPricingTier = (pricingTierKeys: string[], pricingTiers: ResolveTiers): ResolveVolumeDiscountPerTier[] => {\r\n let basePrice = 0\r\n return pricingTierKeys.reduce((pricingTierAccumulator, pricingTier, pricingTierIndex) => {\r\n const pricingTierAccumulatorCopy = [...pricingTierAccumulator]\r\n const pricingTierData = pricingTiers[pricingTier as keyof ResolveTiers]\r\n const tierPrice = pricingTierData.price\r\n if (pricingTierIndex === 0) {\r\n basePrice = tierPrice\r\n }\r\n\r\n const volumeDiscountPerTier: ResolveVolumeDiscountPerTier = {\r\n discountPricePerUnit: getDiscount(basePrice, tierPrice),\r\n }\r\n pricingTierAccumulatorCopy.push(volumeDiscountPerTier)\r\n return pricingTierAccumulatorCopy\r\n }, [] as ResolveVolumeDiscountPerTier[])\r\n}\r\n\r\nconst processCurrencyPricing = (\r\n pricingKeys: string[],\r\n currencyPricing: ResolvePricing\r\n): ResolveBillingFrequencyVolumeDiscountRecords => {\r\n return pricingKeys.reduce((billingFrequencyAccumulator, billingFrequency) => {\r\n const billingFrequencyAccumulatorCopy = { ...billingFrequencyAccumulator }\r\n const pricingTiers = currencyPricing[billingFrequency as keyof ResolvePricing]\r\n const pricingTierKeys = Object.keys(pricingTiers)\r\n billingFrequencyAccumulatorCopy[billingFrequency] = processPricingTier(pricingTierKeys, pricingTiers)\r\n return billingFrequencyAccumulatorCopy\r\n }, {} as ResolveBillingFrequencyVolumeDiscountRecords)\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n selectedPlan: ResolvePlan,\r\n selectedCurrency: CURRENCY\r\n): ResolveBillingFrequencyVolumeDiscountRecords => {\r\n const { pricingInfo } = selectedPlan ?? {}\r\n const currencyPricing = pricingInfo[selectedCurrency as keyof ResolvePrice] as ResolvePricing\r\n const pricingKeys = Object.keys(currencyPricing)\r\n return processCurrencyPricing(pricingKeys, currencyPricing)\r\n}\r\n\r\nexport const getTotalVolumeDiscount = (discountPerUser: number, organizers: number, annualize: boolean) => {\r\n const volumeDiscountTimesOrganizer = discountPerUser * organizers\r\n\r\n const totalVolumeDiscount = annualize ? volumeDiscountTimesOrganizer * 12 : volumeDiscountTimesOrganizer\r\n\r\n return totalVolumeDiscount\r\n}\r\n\r\nexport const getAddonVolumeDiscount = (\r\n addon: ResolveAddon,\r\n quantity: number,\r\n currencyCode: string,\r\n billingFrequencyKey: string,\r\n _currentTier: string,\r\n subscribedAddonQuantity?: number\r\n) => {\r\n const discountPercentagesForQuantity = () => {\r\n const basePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'price'], 0)\r\n const tierTwoPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'price'], 0)\r\n const tierThreePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'price'], 0)\r\n const tierFourPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'price'], 0)\r\n const tierFivePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier5', 'price'], 0)\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'max'], 0))\r\n return { actualPercentage: 0, tierIndex: 1 }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'max'], 0)) {\r\n const percent = ((basePrice - tierTwoPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 2 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'max'], 0)) {\r\n const percent = ((basePrice - tierThreePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 3 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'max'], 0)) {\r\n const percent = ((basePrice - tierFourPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 4 }\r\n }\r\n\r\n const percent = ((basePrice - tierFivePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 5 }\r\n }\r\n\r\n // WAE-401 :: While showing the percentage value in line item, we need to round it off to the `floor`. But for the discount amount, need to `round` it to closest\r\n const { actualPercentage, tierIndex } = discountPercentagesForQuantity()\r\n\r\n const price = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, `tier${tierIndex}`, 'price'], 0)\r\n const isAnnual = billingFrequencyKey === 'annual'\r\n\r\n const discountPrice =\r\n Math.floor((actualPercentage / 100) * price * (isAnnual ? 12 : 1)) * (subscribedAddonQuantity || quantity)\r\n\r\n return { discountPrice, tierIndex }\r\n}\r\n","import { ResolveAddon, ResolveSelectedAddon } from '@gtresolve/state/add-on'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ADDONS } from '@gtresolve/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport const getCurrentAddons = (selectedAddons: ResolveSelectedAddon[], selectedPlan: ResolvePlan): ResolveAddon[] => {\r\n const { addons } = selectedPlan ?? {}\r\n const myAddons = selectedAddons.reduce((mySelectedAddons: ResolveAddon[], localAddon: ResolveSelectedAddon) => {\r\n const matchingAddon = addons.find((add: ResolveAddon) => add.sKU === localAddon.sKU)\r\n if (matchingAddon) {\r\n matchingAddon.quantity = localAddon.quantity\r\n return [...mySelectedAddons, matchingAddon]\r\n }\r\n\r\n return mySelectedAddons\r\n }, [])\r\n return myAddons\r\n}\r\n\r\nexport const getExtraAddons = (addons: ResolveAddon[]) => {\r\n return addons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n}\r\n\r\nexport const getCurrentAgent = (addons: ResolveAddon[]) => {\r\n return addons.filter((addon) => addon.sKU.includes(ADDONS.AGENT))[0]\r\n}\r\n\r\nexport const getCurrentEndpoint = (addons: ResolveAddon[]) => {\r\n return addons.filter(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )[0]\r\n}\r\n\r\nexport const getUserSubscribedAccumulatedAddon = (subscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n const userSubscribedAddonsQuantity = subscriptions.reduce((prev, curr) => {\r\n /* eslint-disable no-param-reassign */\r\n prev += curr.quantity\r\n return prev\r\n }, 0)\r\n\r\n const userSubscribedAccumulatedAddon = { ...subscriptions[subscriptions.length - 1] }\r\n userSubscribedAccumulatedAddon.quantity = userSubscribedAddonsQuantity\r\n\r\n return userSubscribedAccumulatedAddon\r\n}\r\n\r\nexport const getAccumulatedUserSubscriptions = (\r\n subscriptions: BillingDetailedSubscriptionPlan[],\r\n planData: ResolvePlan[]\r\n) => {\r\n const selectedPlan: ResolvePlan[] = planData.filter((plan: ResolvePlan) => {\r\n return !!subscriptions.find((sub: BillingDetailedSubscriptionPlan) => plan.sKU === sub.productSku)\r\n })\r\n\r\n // if user does not have any GoToResolve subscriptions, exit\r\n if (isEmpty(selectedPlan)) {\r\n return subscriptions\r\n }\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan[0].addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan[0].addons)\r\n const accumulatedSubscriptions = []\r\n\r\n const userSubscribedAgents = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentAgent.sKU\r\n )\r\n const userSubscribedEndpoints = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentEndpoint.sKU\r\n )\r\n\r\n if (userSubscribedAgents.length) {\r\n const userSubscribedAgent = getUserSubscribedAccumulatedAddon(userSubscribedAgents)\r\n accumulatedSubscriptions.push(userSubscribedAgent)\r\n }\r\n\r\n if (userSubscribedEndpoints.length) {\r\n const userSubscribedEndpoint = getUserSubscribedAccumulatedAddon(userSubscribedEndpoints)\r\n accumulatedSubscriptions.push(userSubscribedEndpoint)\r\n }\r\n\r\n accumulatedSubscriptions.push(\r\n ...subscriptions.filter((sub) => sub.productSku !== currentAgent.sKU && sub.productSku !== currentEndpoint.sKU)\r\n )\r\n\r\n return accumulatedSubscriptions\r\n}\r\n\r\nexport const getUserSubscribedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: ResolvePlan\r\n) => {\r\n if (!selectedPlan || !accountSubscriptions.length) return {}\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan.addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan.addons)\r\n\r\n return {\r\n disablePlanSelection: false,\r\n disableExtraAddons: false,\r\n userSubscribedAgent: accountSubscriptions.find((sub) => sub.productSku === currentAgent.sKU),\r\n userSubscribedEndpoint: accountSubscriptions.find((sub) => sub.productSku === currentEndpoint.sKU),\r\n }\r\n}\r\n\r\nexport const getIncludedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: ResolvePlan\r\n) => {\r\n if (!selectedPlan) return { includedEndpoints: 0, includedAgents: 0 }\r\n const { userSubscribedAgent, userSubscribedEndpoint } =\r\n accountSubscriptions && getUserSubscribedAddons(accountSubscriptions, selectedPlan)\r\n\r\n const includedAgents = userSubscribedAgent\r\n ? selectedPlan.userAgentsIncludedAmount + userSubscribedAgent.quantity\r\n : selectedPlan.userAgentsIncludedAmount\r\n\r\n const includedEndpoints = userSubscribedEndpoint\r\n ? selectedPlan.endpointsIncludedAmount + ADDONS.ENDPOINTS_ADDONS_INTERVAL * userSubscribedEndpoint.quantity\r\n : selectedPlan.endpointsIncludedAmount\r\n\r\n return { includedEndpoints, includedAgents }\r\n}\r\n","import { ResolvePlan } from '@gtresolve/state/plan'\r\n\r\nexport const getCurrentPlan = (planSku: string, planData: ResolvePlan[]) => {\r\n const selectedPlan = planData.find((plan: ResolvePlan) => plan.sKU === planSku)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport const getPlanNameSet = (planData: ResolvePlan[]) =>\r\n planData.reduce((accSet, plan) => {\r\n accSet.add(plan.name.toLowerCase())\r\n return accSet\r\n }, new Set())\r\n","import { ResolveSelectedAddon } from '@gtresolve/state/add-on'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveItems } from '@gtresolve/state/checkout/state'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { PRODUCT_SKU, BILLING_TYPES } from '@common/constants'\r\nimport { ADDONS } from '@gtresolve/constants'\r\nimport { SubscriptionInfo } from './get-subscription-info'\r\n\r\nexport const getPaymentItems = (\r\n selectedPlan: ResolvePlan,\r\n organizers: number,\r\n selectedBillingFrequency: string,\r\n selectedAddons: ResolveSelectedAddon[],\r\n subscriptionInfo: SubscriptionInfo\r\n) => {\r\n const items: ResolveItems[] = []\r\n const billingFrequency = selectedBillingFrequency === 'YEAR' ? BILLING_TYPES.ANNUAL : BILLING_TYPES.MONTHLY\r\n const contractLengthInMonth = billingFrequency === BILLING_TYPES.ANNUAL ? 12 : 1\r\n\r\n const planSubscription: ResolveItems = {\r\n itemId: 0,\r\n productSku: selectedPlan.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: organizers,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }\r\n\r\n if (subscriptionInfo.plan && subscriptionInfo.isReplacementBooking && !subscriptionInfo.isTrial) {\r\n if (!subscriptionInfo.canUpgradePlan) {\r\n planSubscription.productSku = subscriptionInfo.plan.productSku\r\n planSubscription.quantity = subscriptionInfo.plan.quantity\r\n }\r\n\r\n planSubscription.subscriptionsToUpgrade = [\r\n {\r\n subscriptionId: subscriptionInfo.plan.subscriptionId,\r\n quantity: subscriptionInfo.plan.quantity,\r\n },\r\n ]\r\n\r\n subscriptionInfo.addons.forEach((addon: BillingDetailedSubscriptionPlan) => {\r\n planSubscription.subscriptionsToUpgrade?.push({\r\n subscriptionId: addon.subscriptionId,\r\n quantity: addon.quantity,\r\n })\r\n })\r\n }\r\n\r\n if (subscriptionInfo.isReplacementBooking) items.push(planSubscription)\r\n\r\n // add addon products to the items object\r\n if (selectedAddons.length > 0) {\r\n selectedAddons.forEach((addon: ResolveSelectedAddon) => {\r\n const v2plan = items.find(\r\n (item) =>\r\n (item.productSku === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n item.productSku === PRODUCT_SKU.GTR_REMOTE_ACCESS) &&\r\n !item.subscriptionsToUpgrade\r\n )\r\n if (v2plan && addon.sKU.includes(ADDONS.AGENT)) {\r\n v2plan.quantity += addon.quantity\r\n } else {\r\n items.push({\r\n itemId: items.length,\r\n productSku: addon.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: addon.quantity,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n })\r\n }\r\n })\r\n }\r\n\r\n return items\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { trackEvent, getFormName } from '@common/utils'\r\nimport {\r\n CURRENCY,\r\n PRODUCT_FAMILY_KEY,\r\n PRODUCT_FAMILY_NAME,\r\n TimePeriod,\r\n TRACKING_EVENTS,\r\n VIEW_PATH,\r\n} from '@common/constants'\r\nimport { ResolveCartData, ResolvePurchaseData, ResolveCustomizeItemsData } from '@gtresolve/state/tracking/state'\r\nimport { PageViewContentData, SessionInfo, TrackECommerceData } from '@common/state/tracking/state'\r\nimport { BUY_TYPE, ADDONS, RESOLVE_USER_TYPES, RESOLVE_TRACKING_COMPONENTS } from '@gtresolve/constants'\r\nimport { ResolveAddon } from '@gtresolve/state/add-on'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveCouponProcessedDataPerSku } from '@gtresolve/state/coupon/state'\r\nimport { get, cloneDeep } from 'lodash-es'\r\n\r\nconst contentType: Record = {\r\n [VIEW_PATH.PATH_CUSTOMIZE]: 'plan',\r\n [VIEW_PATH.PATH_CHECKOUT]: 'buy-form',\r\n}\r\n\r\nconst morphAddonData = (addonList: ResolveAddon[]) => {\r\n const addonMap: Record = {}\r\n addonList.forEach((addon) => {\r\n addonMap[addon.sKU] = addon\r\n })\r\n return addonMap\r\n}\r\n\r\nexport const getBuyType = (userType: string) => {\r\n if (userType === RESOLVE_USER_TYPES.TRIALER) {\r\n return BUY_TYPE.TRIAL_CONVERSION\r\n }\r\n if (userType === RESOLVE_USER_TYPES.ADDON) {\r\n return BUY_TYPE.ADDON\r\n }\r\n return BUY_TYPE.DIRECT_BUY\r\n}\r\n\r\ninterface PreviousTrackData {\r\n step: number\r\n cartData: ResolveCartData | null\r\n}\r\nconst previousTrackData: PreviousTrackData = {\r\n step: 0, // default value\r\n cartData: null,\r\n}\r\nconst setPreviousStep = (step: number) => {\r\n previousTrackData.step = step\r\n}\r\nconst setPreviousCart = (cartData: ResolveCartData) => {\r\n previousTrackData.cartData = cloneDeep(cartData)\r\n}\r\n\r\ninterface ProcessCartData {\r\n plan?: ResolvePlan\r\n addonList?: ResolveAddon[]\r\n billingFrequency: TimePeriod\r\n organizers: number\r\n currency: CURRENCY\r\n tier: string\r\n currentVolumeDiscountPrice: number\r\n couponCode: string\r\n couponProcessedDataPerSku: ResolveCouponProcessedDataPerSku | null\r\n totalCouponSavings: number\r\n}\r\n\r\nconst processCartData = (productData: ProcessCartData) => {\r\n const { plan, addonList, billingFrequency, organizers, currency, tier, currentVolumeDiscountPrice } = productData\r\n\r\n let planInfo: TrackECommerceData | null = null\r\n if (plan) {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n planInfo = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2R,\r\n item_category: PRODUCT_FAMILY_NAME.G2R,\r\n item_category2: plan.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant: 'Product',\r\n price: planPrice,\r\n quantity: organizers,\r\n volume_discount: currentVolumeDiscountPrice ? currentVolumeDiscountPrice / organizers : undefined,\r\n discount: get(productData, ['couponProcessedDataPerSku', plan.sKU, 'discountUnitSavings'], 0),\r\n product_discount_tier: tier,\r\n coupon: get(productData, ['couponProcessedDataPerSku', plan.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n }\r\n\r\n let addonInfoList: TrackECommerceData[] | null = null\r\n if (addonList) {\r\n addonInfoList = addonList.map((addon) => {\r\n const addonPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? addon.pricingInfo.USD.annual.tier1.price * 12\r\n : addon.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const addonInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2R,\r\n item_category: PRODUCT_FAMILY_NAME.G2R,\r\n item_category2: addon.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${PRODUCT_FAMILY_NAME.G2R} ${addon.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${addon.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant:\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n ? 'Add-on'\r\n : 'Product',\r\n price: addonPrice,\r\n quantity: addon.quantity,\r\n volume_discount: addon.discountPrice ? addon.discountPrice / addon.quantity : undefined,\r\n discount:\r\n get(productData, ['couponProcessedDataPerSku', addon.sKU, 'discountUnitSavings'], 0) || undefined,\r\n product_discount_tier: addon.tier || undefined,\r\n coupon: get(productData, ['couponProcessedDataPerSku', addon.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n return addonInfo\r\n })\r\n }\r\n\r\n const cartItems: TrackECommerceData[] = []\r\n if (planInfo) {\r\n cartItems.push(planInfo)\r\n }\r\n if (addonInfoList) {\r\n cartItems.push(...addonInfoList)\r\n }\r\n return cartItems\r\n}\r\n\r\nexport const trackAddToCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ADD_TO_CART, eventData })\r\n}\r\n\r\nexport const trackRemoveFromCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.REMOVE_FROM_CART, eventData })\r\n}\r\n\r\nexport const checkCartData = (cartData: ResolveCartData) => {\r\n const previousCartData = previousTrackData.cartData\r\n if (previousCartData) {\r\n const {\r\n plan,\r\n plan: { addons },\r\n } = cartData\r\n const currentCartPlan = plan\r\n const currentCartAddons = morphAddonData(cartData.addonList)\r\n const previousCartPlan = previousCartData.plan\r\n const previousCartAddons = morphAddonData(previousCartData.addonList)\r\n\r\n if (currentCartPlan.name !== previousCartPlan.name) {\r\n trackRemoveFromCart(previousCartData)\r\n trackAddToCart(cartData)\r\n } else {\r\n let removedOrganizers = 0\r\n let addedOrganizers = 0\r\n const removedAddonList: ResolveAddon[] = []\r\n const addedAddonList: ResolveAddon[] = []\r\n if (previousCartData.organizers > cartData.organizers) {\r\n removedOrganizers = previousCartData.organizers - cartData.organizers\r\n } else if (previousCartData.organizers < cartData.organizers) {\r\n addedOrganizers = cartData.organizers - previousCartData.organizers\r\n }\r\n addons.forEach((addon: ResolveAddon) => {\r\n const addonSku = addon.sKU\r\n const currentAddon = currentCartAddons[addonSku]\r\n const previousAddon = previousCartAddons[addonSku]\r\n if (currentAddon && previousAddon) {\r\n if (previousAddon.quantity > currentAddon.quantity) {\r\n const removedQuantity = previousAddon.quantity - currentAddon.quantity\r\n const removedAddon = { ...currentAddon, quantity: removedQuantity }\r\n removedAddonList.push(removedAddon)\r\n } else if (previousAddon.quantity < currentAddon.quantity) {\r\n const addedQuantity = currentAddon.quantity - previousAddon.quantity\r\n const addedAddon = { ...currentAddon, quantity: addedQuantity }\r\n addedAddonList.push(addedAddon)\r\n }\r\n } else if (!previousAddon && currentAddon) {\r\n addedAddonList.push({ ...currentAddon, quantity: currentAddon.quantity })\r\n } else if (previousAddon && !currentAddon) {\r\n removedAddonList.push({ ...previousAddon, quantity: previousAddon.quantity })\r\n }\r\n })\r\n\r\n const removedCartData: ProcessCartData = { ...cartData }\r\n const addedCartData: ProcessCartData = { ...cartData }\r\n if (removedOrganizers === 0) {\r\n removedCartData.plan = undefined\r\n } else if (removedOrganizers > 0) {\r\n removedCartData.organizers = removedOrganizers\r\n }\r\n if (addedOrganizers === 0) {\r\n addedCartData.plan = undefined\r\n } else if (addedOrganizers > 0) {\r\n addedCartData.organizers = addedOrganizers\r\n }\r\n\r\n if (removedAddonList.length === 0) {\r\n removedCartData.addonList = undefined\r\n } else if (removedAddonList.length > 0) {\r\n removedCartData.addonList = removedAddonList\r\n }\r\n\r\n if (addedAddonList.length === 0) {\r\n addedCartData.addonList = undefined\r\n } else if (addedAddonList.length > 0) {\r\n addedCartData.addonList = addedAddonList\r\n }\r\n\r\n if (addedAddonList.length > 0 || addedOrganizers > 0) {\r\n trackAddToCart(addedCartData)\r\n }\r\n if (removedAddonList.length > 0 || removedOrganizers > 0) {\r\n trackRemoveFromCart(removedCartData)\r\n }\r\n }\r\n } else {\r\n // just for double check, because there will always be previous cartData\r\n // if you are in checkCartData function because of the order in which events are fired\r\n trackAddToCart(cartData)\r\n }\r\n}\r\n\r\nexport const trackCustomizeViewItem = (customizeItemsData: ResolveCustomizeItemsData) => {\r\n const { planData, billingFrequency, currency, organizers } = customizeItemsData\r\n\r\n // See \"view_item\" column in spreadsheet attached to WAE1-174\r\n const items = planData.map((plan) => {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const planInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.G2R, // product_name\r\n item_category: PRODUCT_FAMILY_NAME.G2R, // product_name\r\n item_category2: plan.name, // product_id\r\n item_category3: billingFrequency, // product_period\r\n item_category4: '1', // product_duration\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`, // Product / add-on name with period\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`, // Product / add-on unique identifier, sku with period\r\n item_variant: 'Product', // Specify if it's a \"Product\" or an \"Add-on\"\r\n price: planPrice, // product_price\r\n quantity: organizers, // product_quantity\r\n }\r\n return planInfo\r\n })\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items,\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_ITEM, eventData })\r\n}\r\n\r\nexport const trackViewContent = (userData: PageViewContentData, pageName: string) => {\r\n const formName = getFormName(pageName)\r\n const contentTypeName = `/${pageName.split('/')[2]}`\r\n const eventData = {\r\n platform_environment: `${PRODUCT_FAMILY_KEY.G2R}-${process.env.ENVIRONMENT}`,\r\n platform_product: PRODUCT_FAMILY_KEY.G2R,\r\n platform_type: 'marketing',\r\n platform_locale: userData.locale,\r\n platform_country: userData.country,\r\n platform_language: userData.language,\r\n section: 'web',\r\n sub_section: 'resolve',\r\n template: pageName,\r\n content_type: `${pageName}-${contentType[contentTypeName]}`,\r\n page_type: pageName,\r\n content_number: 1,\r\n login_status: userData.isUserLoggedIn,\r\n funnel_name: `${PRODUCT_FAMILY_KEY.G2R}:marketing:${pageName}`,\r\n form_name: formName,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_CONTENT, eventData })\r\n}\r\n\r\nexport const trackSessionInfo = (sessionInfo: SessionInfo) => {\r\n const eventData = {\r\n session_last: sessionInfo.sessionLast,\r\n session_number: sessionInfo.sessionNumber,\r\n user_type: sessionInfo.userType,\r\n is_logged_in: sessionInfo.isUserLoggedIn,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.SESSION_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackBeginCheckout = (productData: ResolveCartData, currentStep: number) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n step: currentStep,\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData })\r\n // if user navigates directly to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 0 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user navigates from customize page (step 1) to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 1 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user starts off in customize page, do not set previouse cart data yet, as it remains undefined\r\n if (previousTrackData.step !== 0) {\r\n setPreviousCart(productData)\r\n }\r\n setPreviousStep(currentStep)\r\n\r\n if (currentStep === 2 && productData.isExistingUser) {\r\n trackBeginCheckout(productData, 3)\r\n trackBeginCheckout(productData, 4)\r\n }\r\n}\r\n\r\nexport const trackPurchase = (productData: ResolveCartData, purchaseData: ResolvePurchaseData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const buyType = getBuyType(purchaseData.userType)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems.map((item) => ({\r\n ...item,\r\n buy_type: buyType,\r\n })),\r\n },\r\n actionField: {\r\n transaction_id: purchaseData.transactionID,\r\n coupon: productData.couponCode || undefined,\r\n tax: purchaseData.calculatedTax,\r\n revenue: purchaseData.calculatedNetTotal,\r\n },\r\n plan: productData.billingFrequency,\r\n buy_type: buyType,\r\n conversion_type: 'purchase',\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.PURCHASE, eventData })\r\n}\r\n\r\nexport const trackPurchaseError = (errorMessage: string, plan: string, buyType: string) => {\r\n const eventData = {\r\n plan, // 'annual' or 'monthly'\r\n buy_type: buyType, // 'add-on' or 'direct buy'\r\n conversion_type: 'purchase', // static value, case-sensitive\r\n error_purchase_message: errorMessage,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_PURCHASE, eventData })\r\n}\r\n\r\nexport const trackCompleteBuy = (userType: string, userEmail: string, productData: ResolveCartData) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.G2R,\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n conversion_type: 'purchase',\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData })\r\n}\r\n\r\nexport const trackFormError = (formIds: string[], formErrors: string[], pageName: string) => {\r\n const eventData = {\r\n form_error_id: formIds.toString(),\r\n form_error_message: formErrors.toString(),\r\n form_name: getFormName(pageName),\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_FORM, eventData })\r\n}\r\n\r\nexport const trackUserInformation = (userType: string, userEmail: string, productData: ResolveCartData) => {\r\n const eventData = {\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.USER_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackEmailValidation = (formName: string, userEmail: string) => {\r\n const eventData = {\r\n form_name: formName,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.EMAIL_VALIDATION, eventData })\r\n}\r\n\r\nexport const trackLogin = (userEmail: string) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.G2R,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.LOGIN, eventData })\r\n}\r\n\r\nexport const trackAbandonForm = () => {\r\n const eventData = {\r\n form_name: RESOLVE_TRACKING_COMPONENTS.CHECKOUT_PAGE,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ABANDON_FORM, eventData })\r\n}\r\n","import { ResolveErrorContent } from '@gtresolve/state/checkout-form-container/state'\r\nimport * as Yup from 'yup'\r\nimport zxcvbn from 'zxcvbn'\r\nimport { isDate } from 'date-fns/isDate'\r\nimport { parse } from 'date-fns/parse'\r\nimport { isValidPostalCode } from '@common/utils/isValidPostalCode'\r\n\r\nconst isValidDate = (date: string | Date) => {\r\n return date instanceof Date && !Number.isNaN(date.getTime())\r\n}\r\n\r\nconst emailValidation = (errorInvalidEmail: string, errorRequiredEmail?: string) => {\r\n return Yup.string()\r\n .required(errorRequiredEmail || errorInvalidEmail)\r\n .min(2, errorInvalidEmail)\r\n .email(errorInvalidEmail)\r\n .matches(\r\n new RegExp(\r\n \"^((?!(.+\\\\.\\\\.+))(?!(.+\\\\.@+))(?!(^\\\\.))([a-zA-Z_0-9-+!#\\\\$\\\\.\\\\*\\\\^']{1,63}))@((?:[a-zA-Z_0-9-]+\\\\.)*[a-zA-Z_0-9][a-zA-Z_0-9-]*)\\\\.([a-z]{2,})$\"\r\n ),\r\n errorInvalidEmail\r\n )\r\n}\r\n\r\nconst nameValidation = (requiredErrorMessage: string, invalidCharacterErrorMessage: string) => {\r\n return (\r\n Yup.string()\r\n .required(requiredErrorMessage)\r\n .min(2, requiredErrorMessage)\r\n // a to z, latin characters from dec 192 t0 214, 216 to 246 and 248 to 255,\r\n // https://blog.robertelder.org/character-ranges-class-negation-regular-expressions/\r\n // eslint-disable-next-line\r\n .matches(new RegExp(/^[\\p{L}0-9 !,()&.?‘'\\-+\\/]*$/gu), invalidCharacterErrorMessage)\r\n )\r\n}\r\n\r\nexport const passwordValidation = () => {\r\n return Yup.string()\r\n .required()\r\n .test((pw) => zxcvbn(pw).score >= 3)\r\n}\r\n\r\nconst addressValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst countryValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst zipcodeValidation = (country: string, errorRequiredPostalCode: string, errorInvalidPostalCode: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPostalCode)\r\n .min(3, errorInvalidPostalCode)\r\n .max(12, errorInvalidPostalCode)\r\n .test('ZipCodeRegEx', errorInvalidPostalCode, (value) => isValidPostalCode(country, value as string))\r\n}\r\n\r\nconst contactPhoneValidation = (errorInvalidCharacter: string, errorRequiredPhoneNumber: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPhoneNumber)\r\n .matches(new RegExp('^(?=(?:\\\\D*\\\\d){6}).*$'), errorInvalidCharacter)\r\n}\r\n\r\nconst expDateValidation = (errorInvalidExpirationDate: string, errorRequiredExpDate: string) => {\r\n const lastMonthDate = new Date()\r\n lastMonthDate.setMonth(lastMonthDate.getMonth() - 1)\r\n\r\n const parseDateString = (_value: string, originalValue: string) => {\r\n const parsedDate = isDate(originalValue) ? originalValue : parse(originalValue, 'MM/yy', new Date())\r\n const expiredMonthDate = new Date()\r\n expiredMonthDate.setMonth(expiredMonthDate.getMonth() - 2)\r\n return isValidDate(parsedDate) ? parsedDate : expiredMonthDate\r\n }\r\n return Yup.date()\r\n .required(errorRequiredExpDate)\r\n .min(lastMonthDate, errorInvalidExpirationDate)\r\n .transform(parseDateString)\r\n}\r\n\r\nconst taxNumberValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nexport const CheckoutSchema = (country: string, errorContent: ResolveErrorContent) => {\r\n const {\r\n errorInvalidPhoneNumber,\r\n errorInvalidCharacter,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorRequiredCountry,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorRequiredTaxNumber,\r\n } = errorContent\r\n\r\n return Yup.object().shape({\r\n Email: emailValidation(errorInvalidEmail, errorRequiredEmail),\r\n FirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n LastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Password: passwordValidation(),\r\n BillingFirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n BillingLastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Street1: addressValidation(errorRequiredAddress),\r\n City: addressValidation(errorRequiredCity),\r\n CountryCode: countryValidation(errorRequiredCountry),\r\n StateCode: addressValidation(errorRequiredState),\r\n ZipCode: zipcodeValidation(country, errorRequiredPostalCode, errorInvalidPostalCode),\r\n ContactPhone: contactPhoneValidation(errorInvalidPhoneNumber, errorRequiredPhoneNumber),\r\n ExpirationDate: expDateValidation(errorInvalidExpirationDate, errorRequiredExpDate),\r\n TaxNumber: taxNumberValidation(errorRequiredTaxNumber),\r\n TaxType: Yup.string(),\r\n CompanyName: Yup.string(),\r\n })\r\n}\r\n\r\nexport const checkAlphaNumerical = (value: string) => {\r\n return !!value.match(/^[A-Za-zÀ-ÖØ-öø-ÿ0-9]+$/) || value === ''\r\n}\r\n","import {\r\n BillingPeriod,\r\n CURRENCY,\r\n TimePeriod,\r\n COUPON_DISCOUNT_TYPE,\r\n COUPON_PAYMENT_PLAN,\r\n COUPON_TYPE,\r\n} from '@common/constants'\r\n\r\nimport { CouponItem, CouponServerData } from '@common/state/coupon/state'\r\n\r\nimport {\r\n ResolveCheckCouponProductsValidityParameters,\r\n ResolveCouponProcessedDataPerSku,\r\n ResolveCouponSkuValidity,\r\n ResolveCouponState,\r\n} from '@gtresolve/state/coupon/state'\r\n\r\nimport {\r\n ResolveCouponCalculation,\r\n GetResolveProductItemsParameters,\r\n ResolveProcessCouponDataParameters,\r\n ResolveProductDetails,\r\n} from '@gtresolve/state/coupon-util'\r\n\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { ADDONS, PRODUCT_PRICE_ITEM_TYPE } from '@gtresolve/constants'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveProductPriceItem } from '@gtresolve/state/calculate-price'\r\n\r\nexport const getActiveCouponServerData = (coupon: ResolveCouponState, selectedPlan: ResolvePlan) => {\r\n const { couponServerData, isUrlCouponActive, isCMSCouponActive } = coupon\r\n if (isUrlCouponActive) {\r\n return couponServerData\r\n }\r\n if (isCMSCouponActive && !isEmpty(selectedPlan?.activeCoupon)) {\r\n return selectedPlan.activeCoupon\r\n }\r\n return null\r\n}\r\n\r\nexport const getAvailableCouponServerData = (\r\n coupon: ResolveCouponState,\r\n selectedPlan: ResolvePlan\r\n): [CouponServerData | null, boolean] => {\r\n const { couponServerData, isUrlCouponCodeAvailable } = coupon\r\n if (!isEmpty(couponServerData) && isUrlCouponCodeAvailable) {\r\n return [couponServerData, true]\r\n }\r\n if (!isEmpty(selectedPlan?.activeCoupon)) {\r\n return [selectedPlan.activeCoupon, false]\r\n }\r\n return [null, false]\r\n}\r\n\r\nexport const isCouponDateValid = (start: string, end: string): boolean => {\r\n const startDate = new Date(start)\r\n const endDate = new Date(end)\r\n const currentDate = new Date()\r\n const currentDatems = currentDate.getTime()\r\n return currentDatems >= startDate.getTime() && currentDatems <= endDate.getTime()\r\n}\r\n\r\ninterface IsProductSkuAndPaymentPlanValidParameters {\r\n selectedProductSku: string\r\n couponValidationItemsMap: Map\r\n isAnnual: boolean\r\n}\r\ninterface CouponValidationItem {\r\n paymentPlan: Set\r\n}\r\n\r\nconst isProductSkuAndPaymentPlanValid = ({\r\n selectedProductSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n}: IsProductSkuAndPaymentPlanValidParameters): boolean => {\r\n const toCheckPaymentPlan = isAnnual ? COUPON_PAYMENT_PLAN.UPFRONTANNUAL : COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n if (couponValidationItemsMap.has(selectedProductSku)) {\r\n const { paymentPlan } = couponValidationItemsMap.get(selectedProductSku) as CouponValidationItem\r\n return paymentPlan.has(toCheckPaymentPlan)\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport const checkCouponGenericValidity = (couponServerData: CouponServerData): boolean => {\r\n const { isCouponValid, validFrom, validTo } = couponServerData\r\n return isCouponValid && isCouponDateValid(validFrom, validTo)\r\n}\r\n\r\nexport const processFixTypeCouponValidity = (couponSkuValidity: ResolveCouponSkuValidity): ResolveCouponSkuValidity => {\r\n const fixCouponSkuValidity = { ...couponSkuValidity }\r\n const isAnyCouponSkuInvalid = Object.keys(couponSkuValidity).some(\r\n (couponSku) => couponSkuValidity[couponSku] === false\r\n )\r\n if (isAnyCouponSkuInvalid) {\r\n Object.keys(fixCouponSkuValidity).forEach((couponSku) => {\r\n fixCouponSkuValidity[couponSku] = false\r\n })\r\n }\r\n return fixCouponSkuValidity\r\n}\r\n\r\n// temporary code for default coupon Sku validity\r\nexport const falsyCouponSkuValidity = (couponSkuValidity: ResolveCouponSkuValidity): ResolveCouponSkuValidity => {\r\n return Object.keys(couponSkuValidity).reduce((skuAcc, currentSku) => {\r\n return { ...skuAcc, [currentSku]: false }\r\n }, {} as ResolveCouponSkuValidity)\r\n}\r\n\r\nexport const getCouponValidationItemsMap = (couponItems: CouponItem[]): Map => {\r\n const couponValidationItemsMap = new Map()\r\n couponItems.forEach((couponItem) => {\r\n const { productSku, paymentPlan } = couponItem\r\n if (!couponValidationItemsMap.has(productSku)) {\r\n const couponValidationItem: CouponValidationItem = { paymentPlan: new Set() }\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n }\r\n const couponValidationItem = couponValidationItemsMap.get(productSku) as CouponValidationItem\r\n couponValidationItem.paymentPlan.add(paymentPlan)\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n })\r\n return couponValidationItemsMap\r\n}\r\n\r\nexport const checkCouponProductsValidity = ({\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n}: ResolveCheckCouponProductsValidityParameters): ResolveCouponSkuValidity => {\r\n const { couponType, couponItems } = couponServerData\r\n const couponValidationItemsMap = getCouponValidationItemsMap(couponItems)\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const addonsValidity = selectedAddons.reduce((acc, selectedAddon) => {\r\n return {\r\n ...acc,\r\n [selectedAddon.sKU]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedAddon.sKU,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n }, {})\r\n const couponSkuValidity: ResolveCouponSkuValidity = {\r\n ...addonsValidity,\r\n [selectedPlanSku]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedPlanSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n // need to add the fixed coupon processing here later\r\n return couponType === COUPON_TYPE.FLEXIBLE ? couponSkuValidity : falsyCouponSkuValidity(couponSkuValidity)\r\n}\r\n\r\nexport const checkIfCouponAppliedToMinimumSelectedProducts = (couponSkuValidity: ResolveCouponSkuValidity): boolean => {\r\n return Object.values(couponSkuValidity).some((productValidity) => productValidity === true)\r\n}\r\n\r\nexport const calculateCouponDiscount = (\r\n couponDiscountType: COUPON_DISCOUNT_TYPE,\r\n productUnitPriceForCurrentTierWithBillingFrequency: number,\r\n couponDiscountAmount: number,\r\n productUnitPriceForBaseTierWithBillingFrequency: number\r\n): ResolveCouponCalculation | null => {\r\n switch (couponDiscountType) {\r\n case COUPON_DISCOUNT_TYPE.AMOUNTOFF: {\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponDiscountAmount / productUnitPriceForCurrentTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n discountPercentage,\r\n couponAmountOff: couponDiscountAmount,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.PERCENTAGEOFF: {\r\n const couponAmountOff = (productUnitPriceForCurrentTierWithBillingFrequency * couponDiscountAmount) / 100\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponAmountOff\r\n return {\r\n discountPercentage: couponDiscountAmount,\r\n discountUnitPrice,\r\n couponAmountOff,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.REPRICE: {\r\n const discountUnitPrice =\r\n couponDiscountAmount < productUnitPriceForCurrentTierWithBillingFrequency ? couponDiscountAmount : 0\r\n if (discountUnitPrice === 0) {\r\n return null\r\n }\r\n const couponAmountOff = productUnitPriceForBaseTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponAmountOff / productUnitPriceForBaseTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n couponAmountOff,\r\n discountPercentage,\r\n }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport const getProductItemsMap = ({\r\n billingFrequency,\r\n organizers,\r\n selectedPlan,\r\n selectedCurrency = CURRENCY.USD,\r\n selectedAddons,\r\n selectedTierIndex,\r\n}: GetResolveProductItemsParameters): Map => {\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const productItemsMap: Map = new Map()\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const selectedPlanUnitPriceForCurrentTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'price'],\r\n 0\r\n )\r\n\r\n const selectedPlanUnitPriceForBaseTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'price'],\r\n 0\r\n )\r\n\r\n const annualMultiplier = isAnnual ? 12 : 1\r\n const selectedPlanProductDetails: ResolveProductDetails = {\r\n quantity: organizers,\r\n unitPriceForCurrentTierWithBillingFrequency: selectedPlanUnitPriceForCurrentTier * annualMultiplier,\r\n unitPriceForBaseTierWithBillingFrequency: selectedPlanUnitPriceForBaseTier * annualMultiplier,\r\n }\r\n productItemsMap.set(selectedPlan.sKU, selectedPlanProductDetails)\r\n\r\n selectedAddons.forEach((addon) => {\r\n const { sKU, quantity } = addon\r\n const planAddons = selectedPlan.addons\r\n const filteredPlanAddons = planAddons.filter((planAddon) => planAddon.sKU === sKU)\r\n const planAddon = filteredPlanAddons[0]\r\n const planAddonPrice = get(planAddon, ['pricingInfo', selectedCurrency, 'price'], 0)\r\n const completePlanAddonPrice = planAddonPrice * annualMultiplier\r\n productItemsMap.set(sKU, {\r\n quantity,\r\n unitPriceForCurrentTierWithBillingFrequency: completePlanAddonPrice,\r\n unitPriceForBaseTierWithBillingFrequency: completePlanAddonPrice,\r\n })\r\n })\r\n return productItemsMap\r\n}\r\n\r\nexport const getCouponItemPriceMap = (\r\n couponServerData: CouponServerData,\r\n selectedCurrency: CURRENCY = CURRENCY.USD,\r\n isAnnual: boolean\r\n): Map => {\r\n const { couponItems } = couponServerData\r\n let isInvalid = false\r\n const couponItemsMap = new Map(\r\n couponItems\r\n .filter((couponItem) =>\r\n isAnnual\r\n ? couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL\r\n : couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n )\r\n .map((couponItem) => {\r\n const { productSku, priceChanges } = couponItem\r\n const selectedCurrencyPriceChangeList = priceChanges.filter(\r\n (price) => price.currency === selectedCurrency\r\n )\r\n const selectedCurrencyPriceChange = selectedCurrencyPriceChangeList[0]\r\n if (!selectedCurrencyPriceChange) {\r\n isInvalid = true\r\n } else {\r\n isInvalid = false\r\n }\r\n return [productSku, selectedCurrencyPriceChange?.value]\r\n })\r\n )\r\n return isInvalid ? new Map() : couponItemsMap\r\n}\r\n\r\nexport const processCouponData = ({\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n}: ResolveProcessCouponDataParameters): ResolveCouponProcessedDataPerSku | null => {\r\n const productItemsEntries = [...productItemsMap.entries()]\r\n const couponDataPerSku: ResolveCouponProcessedDataPerSku = {}\r\n\r\n productItemsEntries.forEach(([productSku, productDetail]) => {\r\n if (couponSkuValidity[productSku] && couponItemsMap.has(productSku)) {\r\n const { quantity, unitPriceForBaseTierWithBillingFrequency, unitPriceForCurrentTierWithBillingFrequency } =\r\n productDetail\r\n const couponDiscountAmount = couponItemsMap.get(productSku) as number\r\n const calculatedCouponDiscount = calculateCouponDiscount(\r\n couponDiscountType,\r\n unitPriceForCurrentTierWithBillingFrequency,\r\n couponDiscountAmount,\r\n unitPriceForBaseTierWithBillingFrequency\r\n )\r\n if (calculatedCouponDiscount === null || calculatedCouponDiscount.discountUnitPrice <= 0) {\r\n couponDataPerSku[productSku] = null\r\n } else {\r\n const { discountUnitPrice, couponAmountOff, discountPercentage } = calculatedCouponDiscount\r\n couponDataPerSku[productSku] = {\r\n discountPercentage,\r\n discountUnitPrice,\r\n discountUnitSavings: couponAmountOff,\r\n discountTotalPrice: discountUnitPrice * quantity,\r\n discountTotalSavings: couponAmountOff * quantity,\r\n }\r\n }\r\n } else {\r\n couponDataPerSku[productSku] = null\r\n }\r\n })\r\n return isEmpty(couponDataPerSku) ? null : couponDataPerSku\r\n}\r\n\r\nexport const getCouponDoubleDipAmountForNewUser = (productPrices: ResolveProductPriceItem[]): number => {\r\n const couponDoubleDipAmount = productPrices.reduce((total, currentProductPrice) => {\r\n const { productSKU, type } = currentProductPrice\r\n if (type === PRODUCT_PRICE_ITEM_TYPE.product && productSKU === ADDONS.ADDITIONAL_NUMBERS) {\r\n return total + get(currentProductPrice, ['couponDiscount', 'amount'], 0)\r\n }\r\n return total\r\n }, 0)\r\n return couponDoubleDipAmount\r\n}\r\n\r\nexport const calculateCouponPrice = (type: string, originalPrice: number, value: number, isAnnual: boolean) => {\r\n if (type === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n return originalPrice * ((100 - value) / 100)\r\n }\r\n if (type === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n const localValue = isAnnual ? value / 12 : value\r\n const amountOff = originalPrice - localValue\r\n if (amountOff > 0) {\r\n return amountOff\r\n }\r\n return originalPrice\r\n }\r\n return isAnnual ? value / 12 : value\r\n}\r\n\r\nexport interface ResolveCouponPrices {\r\n couponAnnualPrice: number\r\n couponMonthlyPrice: number\r\n}\r\n\r\nexport const getCouponPrices = (\r\n plan: ResolvePlan,\r\n bossMonthlyPrice: number,\r\n bossAnnualPrice: number,\r\n couponState: ResolveCouponState\r\n): ResolveCouponPrices => {\r\n let couponMonthlyPrice = bossMonthlyPrice\r\n let couponAnnualPrice = bossAnnualPrice\r\n const couponData = getActiveCouponServerData(couponState, plan)\r\n const activeCoupon = couponData || plan.activeCoupon\r\n if (activeCoupon && activeCoupon.isCouponValid && activeCoupon.couponType !== COUPON_TYPE.FIX) {\r\n const thisPlansCoupons: CouponItem[] = activeCoupon.couponItems.filter(\r\n (planCoupon: CouponItem) => planCoupon.productSku === plan.sKU\r\n )\r\n thisPlansCoupons.forEach((thisCoupon) => {\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY) {\r\n couponMonthlyPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossMonthlyPrice,\r\n thisCoupon.priceChanges[0].value,\r\n false\r\n )\r\n }\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL) {\r\n couponAnnualPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossAnnualPrice,\r\n thisCoupon.priceChanges[0].value,\r\n true\r\n )\r\n }\r\n })\r\n }\r\n return { couponAnnualPrice, couponMonthlyPrice }\r\n}\r\n","import { ResolveBuyFormData } from '@gtresolve/state/buy-form/state'\r\nimport { isEmpty, isEqual } from 'lodash-es'\r\n\r\nlet previousFormValues: ResolveBuyFormData\r\n\r\nexport const isValidationAddressEligible = (formValues: ResolveBuyFormData): boolean => {\r\n if (\r\n isEmpty(formValues.FirstName.trim()) ||\r\n isEmpty(formValues.LastName.trim()) ||\r\n isEmpty(formValues.Email.trim()) ||\r\n isEmpty(formValues.BillingFirstName.trim()) ||\r\n isEmpty(formValues.BillingLastName.trim())\r\n ) {\r\n return false\r\n }\r\n\r\n const hasFormValuesChanged = !isEqual(previousFormValues, formValues)\r\n previousFormValues = formValues\r\n return hasFormValuesChanged\r\n}\r\n\r\nexport const isAddressComplete = (\r\n formValues: ResolveBuyFormData,\r\n isStatesOptional?: boolean,\r\n isTaxRequired?: boolean\r\n): boolean => {\r\n if (\r\n isEmpty(formValues.CountryCode.trim()) ||\r\n isEmpty(formValues.City.trim()) ||\r\n isEmpty(formValues.Street1.trim()) ||\r\n (!isStatesOptional && isEmpty(formValues.StateCode.trim())) ||\r\n (isTaxRequired && !formValues.TaxNumber) ||\r\n isEmpty(formValues.ZipCode.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n","import { get, isEmpty } from 'lodash-es'\r\nimport { formatDate } from '@common/utils'\r\nimport { ResolveAddon, ResolveSelectedAddon } from '@gtresolve/state/add-on'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { PRODUCT_PRICE_ITEM_TYPE, ADDON_SKUS } from '@gtresolve/constants'\r\nimport { PRODUCT_SKU } from '@common/constants'\r\nimport { ResolveCouponProcessedDataPerSku } from '@gtresolve/state/coupon/state'\r\nimport { getAddonVolumeDiscount } from '@gtresolve/utils/calculate-volume-discount'\r\nimport { ResolveProductPriceItem } from '@gtresolve/state/calculate-price'\r\n\r\nexport const getAddonPrice = (addon: ResolveAddon, annual: boolean, currency: string, currentTier: string) => {\r\n const price: number = get(addon, ['pricingInfo', currency, annual ? 'annual' : 'monthly', currentTier, 'price'], 0)\r\n return annual ? price * 12 : price\r\n}\r\n\r\nexport const calculateTotalPriceWithAddons = (\r\n calculatedPrice: number,\r\n selectedAddons: (ResolveSelectedAddon | null)[],\r\n selectedPlan: ResolvePlan,\r\n isAnnual: boolean,\r\n currency: string,\r\n currentTier: string\r\n) => {\r\n let total = calculatedPrice\r\n selectedAddons.forEach((addon) => {\r\n if (addon) {\r\n const currAddon = selectedPlan.addons.find((x) => x.sKU === addon.sKU)\r\n if (currAddon) {\r\n const { discountPrice } = getAddonVolumeDiscount(\r\n currAddon,\r\n addon.quantity,\r\n currency,\r\n isAnnual ? 'annual' : 'monthly',\r\n currentTier\r\n )\r\n if (\r\n addon.sKU === ADDON_SKUS.AGENT_ADDON &&\r\n (selectedPlan.sKU === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n selectedPlan.sKU === PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 ||\r\n selectedPlan.sKU === PRODUCT_SKU.GTR_REMOTE_ACCESS)\r\n ) {\r\n total -= discountPrice\r\n } else {\r\n total += getAddonPrice(currAddon, isAnnual, currency, currentTier) * addon.quantity - discountPrice\r\n }\r\n }\r\n }\r\n })\r\n return total\r\n}\r\n\r\nexport const formattedEndDate = (isAnnual: boolean, locale: string) => {\r\n const date = new Date()\r\n if (isAnnual) {\r\n date.setFullYear(date.getFullYear() + 1)\r\n } else {\r\n date.setMonth(date.getMonth() + 1)\r\n }\r\n\r\n const formattedExpDate = formatDate(date, 'UTC', locale)\r\n\r\n return formattedExpDate\r\n}\r\n\r\nexport const getFeesFromProductPrice = (productPrices: ResolveProductPriceItem[] | undefined): number => {\r\n let feeAmount = 0\r\n if (productPrices && !isEmpty(productPrices)) {\r\n const [feePriceItem] = productPrices.filter(\r\n (productPriceItem) => productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.fee\r\n )\r\n feeAmount = feePriceItem && !isEmpty(feePriceItem) ? feePriceItem.listPrice : 0\r\n }\r\n return feeAmount\r\n}\r\n// renewal billing amount is the sum of ((unitprice-proratedamount) of plan * organizers + (unirprice-proratedamount) of addon * number of selected addons)\r\nexport const getRenewalAmountForAddonUser = (\r\n productPrices: ResolveProductPriceItem[] | undefined,\r\n organizers: number,\r\n selectedAddons: ResolveAddon[]\r\n): number => {\r\n let renewalAmount = 0\r\n const selectedAddonQuantityMap = new Map(selectedAddons.map((addon) => [addon.sKU, addon.quantity]))\r\n if (productPrices && !isEmpty(productPrices)) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product) {\r\n if (productPriceItem.itemId === 0) {\r\n renewalAmount += (productPriceItem.unitPrice - productPriceItem.proratedAmount) * organizers\r\n } else {\r\n const { productSKU } = productPriceItem\r\n renewalAmount +=\r\n (productPriceItem.unitPrice - productPriceItem.proratedAmount) *\r\n (selectedAddonQuantityMap.get(productSKU) || 0)\r\n }\r\n }\r\n })\r\n }\r\n return renewalAmount\r\n}\r\n\r\nexport const getCouponTotalSavings = (\r\n isCouponAppliedToPlan: boolean,\r\n couponProcessedDataPerSku: ResolveCouponProcessedDataPerSku | null,\r\n couponDoubleDipAmountForNewUser: number\r\n): number => {\r\n if (couponProcessedDataPerSku && isCouponAppliedToPlan) {\r\n const totalCouponSavings = Object.keys(couponProcessedDataPerSku).reduce((total, productSku) => {\r\n const productCouponData = couponProcessedDataPerSku[productSku]\r\n if (productCouponData && !isEmpty(productCouponData)) {\r\n return total + productCouponData.discountTotalSavings\r\n }\r\n return total\r\n }, 0)\r\n return totalCouponSavings + couponDoubleDipAmountForNewUser\r\n }\r\n return couponDoubleDipAmountForNewUser\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { ResolveSavedSessionState } from '@gtresolve/state/checkout/state'\r\n\r\nexport const loadSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n if (serializedState === null && language === null) {\r\n return undefined\r\n }\r\n\r\n return {\r\n ...(serializedState && { coupon: JSON.parse(serializedState) }),\r\n ...(language && { language: JSON.parse(language) }),\r\n } as ResolveSavedSessionState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveSessionState = (state: ResolveSavedSessionState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n sessionStorage.setItem(STORAGE_CONST.GTC_COUPON_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearSessionState = () => {\r\n try {\r\n const coupon = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n\r\n if (coupon) sessionStorage.removeItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n if (language) sessionStorage.removeItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { ResolveSavedStoreState } from '@gtresolve/state/checkout/state'\r\n\r\nexport const loadState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.GTR_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as ResolveSavedStoreState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveState = (state: ResolveSavedStoreState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n localStorage.setItem(STORAGE_CONST.GTR_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.GTR_STORE)\r\n\r\n if (serializedState) localStorage.removeItem(STORAGE_CONST.GTR_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const manuallyValidateFieldData = (fieldData: FieldProps) => {\r\n return (\r\n (!fieldData.meta.error && fieldData.meta.touched) ||\r\n (fieldData.meta.initialValue !== '' && !fieldData.meta.error)\r\n )\r\n}\r\n\r\nexport const scrollToError = () => {\r\n const top =\r\n document.getElementsByClassName('input__error')[0] ||\r\n document.getElementsByClassName('input-module__error')[0] ||\r\n document.getElementsByClassName('flex-field__flex-field--error')[0]\r\n if (top) {\r\n top.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\r\n }\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolvePrice, ResolvePricing, ResolveTiers } from '@gtresolve/state/price'\r\n\r\nconst tierMap = new Map()\r\n\r\nexport const getSelectedTierIndex = (\r\n currentOrganizers: number,\r\n billingFrequency: string,\r\n selectedPlan: ResolvePlan,\r\n currency: CURRENCY\r\n) => {\r\n const { sKU = '', pricingInfo } = selectedPlan ?? {}\r\n const identifier = `${sKU}-${currency}-${billingFrequency}-${currentOrganizers}`\r\n if (!tierMap.get(identifier)) {\r\n const currencyPricing = (pricingInfo?.[currency as keyof ResolvePrice] as ResolvePricing) ?? []\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const billingFrequencyTier = currencyPricing[billingFrequencyKey as keyof ResolvePricing] ?? []\r\n\r\n const billingFrequencyTierKeys = Object.keys(billingFrequencyTier)\r\n\r\n billingFrequencyTierKeys.some((tierName, index) => {\r\n const tierData = billingFrequencyTier[tierName as keyof ResolveTiers]\r\n if (currentOrganizers >= tierData.min && currentOrganizers <= tierData.max) {\r\n tierMap.set(identifier, index)\r\n return true\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return tierMap.get(identifier) as number\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@gtresolve/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\n\r\ninterface PlanSubscriptions {\r\n basic?: BillingDetailedSubscriptionPlan\r\n standard?: BillingDetailedSubscriptionPlan\r\n trial?: BillingDetailedSubscriptionPlan\r\n}\r\n\r\n// get the remaining days + 1 so that today is included\r\nconst getRemainingDays = (end: string) => {\r\n const today = new Date().setHours(0, 0, 0, 0)\r\n const lastday = +new Date(end)\r\n\r\n return Math.floor((lastday - today) / (1000 * 60 * 60 * 24)) + 1\r\n}\r\n\r\nexport interface SubscriptionInfo {\r\n plan?: BillingDetailedSubscriptionPlan\r\n addons: BillingDetailedSubscriptionPlan[]\r\n includedAgents: number\r\n includedEndpoints: number\r\n remainingDays: number\r\n canUpgradePlan: boolean\r\n canUpgradeCameraShare: boolean\r\n canUpgradeEndpointProtection: boolean\r\n canUpgradeMobile: boolean\r\n isReplacementBooking: boolean\r\n billingFrequency: TimePeriod\r\n isTrial: boolean\r\n}\r\n\r\nexport const getSubscriptionInfo = (\r\n billingFrequency: TimePeriod,\r\n selectedPlan: ResolvePlan,\r\n plans: ResolvePlan[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n const planSubscriptions: PlanSubscriptions = {}\r\n const subscriptionInfo: SubscriptionInfo = {\r\n addons: [],\r\n includedAgents: 0,\r\n includedEndpoints: 0,\r\n remainingDays: 0,\r\n canUpgradePlan: true,\r\n canUpgradeCameraShare: true,\r\n canUpgradeEndpointProtection: true,\r\n canUpgradeMobile: true,\r\n isReplacementBooking: true,\r\n billingFrequency,\r\n isTrial: false,\r\n }\r\n\r\n if (!selectedPlan) {\r\n return subscriptionInfo\r\n }\r\n\r\n subscriptionInfo.includedAgents = selectedPlan.userAgentsIncludedAmount\r\n subscriptionInfo.includedEndpoints = selectedPlan.endpointsIncludedAmount\r\n\r\n if (!accountSubscriptions) {\r\n return subscriptionInfo\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.G2RE_STANDARD_NAME:\r\n case PRODUCT_SKU.GTR_STANDARD_NAMED_V2:\r\n planSubscriptions.standard = subscription\r\n break\r\n\r\n case PRODUCT_SKU.G2RE_BASIC_NAMED:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.GTR_REMOTE_ACCESS:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS:\r\n planSubscriptions.basic = subscription\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedAgents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedEndpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeMobile = false\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeCameraShare = false\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeEndpointProtection = false\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n planSubscriptions.trial = subscription\r\n }\r\n }\r\n })\r\n\r\n if (planSubscriptions.standard) {\r\n subscriptionInfo.plan = planSubscriptions.standard\r\n subscriptionInfo.canUpgradePlan = false\r\n } else if (planSubscriptions.basic) {\r\n subscriptionInfo.plan = planSubscriptions.basic\r\n } else if (planSubscriptions.trial) {\r\n subscriptionInfo.plan = planSubscriptions.trial\r\n subscriptionInfo.isTrial = true\r\n }\r\n\r\n if (subscriptionInfo.plan && !subscriptionInfo.isTrial) {\r\n const subscriptionBilling =\r\n subscriptionInfo.plan.paymentPlan === BILLING_TYPES.MONTHLY ? TimePeriod.Month : TimePeriod.Year\r\n\r\n subscriptionInfo.isReplacementBooking =\r\n subscriptionInfo.plan.productSku !== selectedPlan.sKU ||\r\n subscriptionInfo.billingFrequency !== subscriptionBilling\r\n\r\n subscriptionInfo.remainingDays = getRemainingDays(subscriptionInfo.plan.endDate)\r\n\r\n if (subscriptionInfo.plan.productSku !== selectedPlan.sKU) {\r\n const subscribedPlan = plans.find((plan) => plan.sKU === subscriptionInfo.plan?.productSku)\r\n\r\n if (subscribedPlan) {\r\n const includedAgents =\r\n subscriptionInfo.includedAgents -\r\n selectedPlan.userAgentsIncludedAmount +\r\n subscribedPlan.userAgentsIncludedAmount\r\n const includedEndpoints =\r\n subscriptionInfo.includedEndpoints -\r\n selectedPlan.endpointsIncludedAmount +\r\n subscribedPlan.endpointsIncludedAmount\r\n\r\n subscriptionInfo.includedAgents =\r\n selectedPlan.userAgentsIncludedAmount > includedAgents\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents\r\n subscriptionInfo.includedEndpoints =\r\n selectedPlan.endpointsIncludedAmount > includedEndpoints\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints\r\n }\r\n }\r\n }\r\n\r\n return subscriptionInfo\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@gtresolve/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod, FEATURE_FLAGS } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { ResolveSelectedAddon, ResolveAddon } from '@gtresolve/state/add-on'\r\n\r\nconst createAgentAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.G2RE_STANDARD_NAME || type === PRODUCT_SKU.GTR_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_AGENT_ADDON\r\n : ADDON_SKUS.BASIC_AGENT_ADDON,\r\n\r\n quantity,\r\n})\r\n\r\nconst createEndpointAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.G2RE_STANDARD_NAME || type === PRODUCT_SKU.GTR_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_ENDPOINT_ADDON\r\n : ADDON_SKUS.BASIC_ENDPOINT_ADDON,\r\n\r\n quantity: quantity / ADDONS.ENDPOINTS_ADDONS_INTERVAL,\r\n})\r\n\r\nconst createMobileAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.MOBILE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createCameraAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.CAMERA_SHARE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createEndpointProtectionAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.ENDPOINT_PROTECTION_ADDON,\r\n quantity,\r\n})\r\n\r\nconst getReplacementBookingAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - includedAgents\r\n const endpointQuantity = endpoints - includedEndpoints\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (endpointQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpointQuantity))\r\n }\r\n\r\n if (mobileAddon || subscribedMobileAddon) {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n\r\n if (cameraAddon || subscribedCameraAddon) {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n\r\n if (endpointProtectionAddon || subscribedEndpointProtectionAddon) {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n subscribedAgents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - subscribedAgents - includedAgents\r\n const endpiontQuantity = endpoints - subscribedEndpoints - includedEndpoints\r\n\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpiontQuantity))\r\n }\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (mobileAddon) {\r\n if (subscribedMobileAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createMobileAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n }\r\n\r\n if (cameraAddon) {\r\n if (subscribedCameraAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createCameraAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n }\r\n\r\n if (endpointProtectionAddon) {\r\n if (subscribedEndpointProtectionAddon) {\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointProtectionAddon(endpiontQuantity))\r\n }\r\n } else {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getExtraAddons = (\r\n selectedPlan: ResolvePlan,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const extraMobileAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.MOBILE_ADDON)\r\n const extraCameraAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.CAMERA_SHARE_ADDON)\r\n const extraEndpointProtectionAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON)\r\n const extraAddons = []\r\n\r\n if (subscribedMobileAddon && extraMobileAddon) {\r\n extraAddons.push(extraMobileAddon)\r\n } else if (mobileAddon) {\r\n extraAddons.push(mobileAddon)\r\n }\r\n\r\n if (subscribedCameraAddon && extraCameraAddon) {\r\n extraAddons.push(extraCameraAddon)\r\n } else if (cameraAddon) {\r\n extraAddons.push(cameraAddon)\r\n }\r\n\r\n if (subscribedEndpointProtectionAddon && extraEndpointProtectionAddon) {\r\n extraAddons.push(extraEndpointProtectionAddon)\r\n } else if (endpointProtectionAddon) {\r\n extraAddons.push(endpointProtectionAddon)\r\n }\r\n\r\n return extraAddons\r\n}\r\n\r\nconst subscribedStandardPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: ResolvePlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n useResolveNewSkus?: boolean\r\n) => {\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount + subscribedAgents,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount + subscribedEndpoints,\r\n addons: [] as ResolveSelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: false,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) {\r\n cart.addons = getAddons(\r\n useResolveNewSkus ? PRODUCT_SKU.GTR_STANDARD_NAMED_V2 : PRODUCT_SKU.G2RE_STANDARD_NAME,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n useResolveNewSkus ? PRODUCT_SKU.GTR_STANDARD_NAMED_V2 : PRODUCT_SKU.G2RE_STANDARD_NAME,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst subscribedBasicPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: ResolvePlan,\r\n basicPlan: ResolvePlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n useResolveNewSkus?: boolean\r\n) => {\r\n const includedAgents = basicPlan.userAgentsIncludedAmount + subscribedAgents\r\n const includedEndpoints = basicPlan.endpointsIncludedAmount + subscribedEndpoints\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents:\r\n includedAgents < selectedPlan.userAgentsIncludedAmount\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents,\r\n\r\n includedEndpoints:\r\n includedEndpoints < selectedPlan.endpointsIncludedAmount\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints,\r\n\r\n addons: [] as ResolveSelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (\r\n (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) &&\r\n subscribedPlan.productSku === selectedPlan.sKU\r\n ) {\r\n cart.addons = getAddons(\r\n useResolveNewSkus ? PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2 : PRODUCT_SKU.G2RE_BASIC_NAMED,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\nconst trialPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: ResolvePlan,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n ),\r\n extraAddons: getExtraAddons(selectedPlan, mobileAddon, cameraAddon, endpointProtectionAddon),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: true,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst newPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: ResolvePlan,\r\n mobileAddon?: ResolveAddon,\r\n cameraAddon?: ResolveAddon,\r\n endpointProtectionAddon?: ResolveAddon,\r\n urlPlan?: string\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n ),\r\n extraAddons: getExtraAddons(selectedPlan, mobileAddon, cameraAddon, endpointProtectionAddon),\r\n billingFrequency,\r\n canUpgradePlan: urlPlan?.toLowerCase() !== 'standard',\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: false,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nexport const getCartInfo = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n plans: ResolvePlan[],\r\n selectedPlan: ResolvePlan,\r\n selectedExtraAddons: ResolveAddon[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[],\r\n featureFlags?: string[],\r\n urlPlan?: string\r\n) => {\r\n const useResolveNewSkus = featureFlags?.includes(FEATURE_FLAGS.RESOLVE_USE_NEW_SKUS)\r\n const mobileAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.MOBILE_ADDON)\r\n const cameraAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.CAMERA_SHARE_ADDON)\r\n const endpointProtectionAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.ENDPOINT_PROTECTION_ADDON)\r\n const subscribedInfo = {\r\n agents: 0,\r\n endpoints: 0,\r\n plan: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n mobileAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n cameraAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n endpointProtectionAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n hasTrial: false,\r\n }\r\n\r\n if (!accountSubscriptions?.length) {\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n useResolveNewSkus ? urlPlan : ''\r\n )\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.G2RE_STANDARD_NAME:\r\n case PRODUCT_SKU.GTR_STANDARD_NAMED_V2:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case PRODUCT_SKU.G2RE_BASIC_NAMED:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.GTR_REMOTE_ACCESS:\r\n case PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n subscribedInfo.agents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n subscribedInfo.endpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscribedInfo.mobileAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscribedInfo.cameraAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscribedInfo.endpointProtectionAddon = subscription\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n subscribedInfo.hasTrial = true\r\n }\r\n }\r\n })\r\n\r\n if (subscribedInfo.plan) {\r\n if (\r\n [PRODUCT_SKU.GTR_STANDARD_NAMED_V2, PRODUCT_SKU.G2RE_STANDARD_NAME].includes(\r\n subscribedInfo.plan.productSku as PRODUCT_SKU\r\n )\r\n ) {\r\n return subscribedStandardPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon,\r\n useResolveNewSkus\r\n )\r\n }\r\n if (\r\n [\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_NAMED_V2,\r\n PRODUCT_SKU.GTR_REMOTE_ACCESS,\r\n PRODUCT_SKU.G2RE_BASIC_NAMED,\r\n PRODUCT_SKU.GTR_REMOTE_SUPPORT_PLUS,\r\n ].includes(subscribedInfo.plan.productSku as PRODUCT_SKU)\r\n ) {\r\n const basicPlan = plans.find(\r\n (p) => p.sKU === (useResolveNewSkus ? subscribedInfo.plan?.productSku : PRODUCT_SKU.G2RE_BASIC_NAMED)\r\n )\r\n\r\n if (basicPlan) {\r\n return subscribedBasicPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n basicPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon,\r\n useResolveNewSkus\r\n )\r\n }\r\n }\r\n } else if (subscribedInfo.hasTrial) {\r\n return trialPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n )\r\n }\r\n\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon\r\n )\r\n}\r\n","import { LANGUAGE, STORAGE_CONST } from '@common/constants'\r\nimport { getSessionState } from '@common/utils'\r\n\r\nexport const getContentLanguage = () => getSessionState(STORAGE_CONST.SAVED_LANGUAGE) || LANGUAGE.EN\r\n","import { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { ResolvePlan } from '@gtresolve/state/plan'\r\nimport { PRODUCT_TYPES } from '@common/constants'\r\n\r\nexport const getUpgradingStatus = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n return accountSubscriptions && accountSubscriptions.length > 0\r\n}\r\n\r\nexport const getSubscriptionId = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n if (accountSubscriptions) {\r\n return accountSubscriptions.find((sub) => sub.planType === PRODUCT_TYPES.PAID && sub.status === 'Active')\r\n ?.subscriptionId\r\n }\r\n return undefined\r\n}\r\n\r\nexport const getSubscriptionMatch = (\r\n subscriptionId: number | undefined,\r\n selectedPlan: ResolvePlan,\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n if (accountSubscriptions && subscriptionId) {\r\n return !!accountSubscriptions.find(\r\n (sub) => sub.subscriptionId === subscriptionId && sub.productSku === selectedPlan.sKU\r\n )\r\n }\r\n return false\r\n}\r\n","export enum LMICENTRAL_TRIAL_ERROR_CODES {\r\n INVALID_CODE = 'invalid.token.code',\r\n TOKEN_EXPIRED = 'token.expired',\r\n}\r\n\r\nexport enum LMICENTRAL_TRIAL_ERROR_STATE {\r\n TIMEOUT = 'timeout',\r\n ALREADY_USER = 'already.user',\r\n EXPIRED_CODE = 'expired.code',\r\n WRONG_CODE = 'wrong.code',\r\n NO_PROVISIONING = 'failed.provisioning',\r\n USER_BANNED = 'banned',\r\n GENERIC_ERROR = 'generic.error',\r\n DECISION_MAKER_FAIL = 'decision.maker.fail',\r\n NO_ERROR = 'none',\r\n}\r\n\r\nexport enum LMICENTRAL_TRIAL_ERROR_IDS {\r\n USER_BANNED = 'USER_BANNED',\r\n EXISTING_TRIAL = 'EXISTING_TRIAL',\r\n EXISTING_USER = 'EXISTING_USER',\r\n GENERIC_ERROR = 'GENERIC_ERROR',\r\n ADDRESS_ERROR = 'ADDRESS_ERROR',\r\n CARD_ERROR = 'CARD_ERROR',\r\n}\r\n\r\nexport enum LMICENTRAL_TRIAL_START_ERROR_CODES {\r\n EXPIRED_TRIAL = 'restart.trialsubscription',\r\n}\r\n","export enum LICENSECAP {\r\n MIN = 1,\r\n MAX = 20,\r\n}\r\n\r\nexport enum NUMBERSCAP {\r\n MIN = 0,\r\n MAX = 20,\r\n}\r\n","export enum LMICENTRAL_USER_TYPES {\r\n NEW = 'NEW',\r\n TRIALER = 'TRIALER',\r\n ADDON = 'ADDON',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n BANNED = 'BANNED',\r\n EXPIRED = 'EXPIRED',\r\n IDENTITY_ONLY = 'IDENTITY_ONLY',\r\n}\r\n\r\nexport enum LMICENTRAL_USER_TYPES_RESPONSE {\r\n USER_IDENTITY_NOT_FOUND = 'ValidateUserIdentityNotFound',\r\n USER_BOSS_NOT_FOUND = 'ValidateUserBossNotFound',\r\n}\r\n\r\nexport enum LMICENTRAL_PARTIAL_NON_VALIDATION_USER_TYPES {\r\n TRIALER = 'TRIALER',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n EXPIRED = 'EXPIRED',\r\n}\r\n","export enum ADDONS {\r\n ADDITIONAL_NUMBERS = 'G2CPreDID',\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n MAX_AGENTS_ADDONS = 51,\r\n MAX_DEVICE_ADDONS = 1500,\r\n MAX_ENDPOINTS_ADDONS = 1025,\r\n ENDPOINTS_ADDONS_INTERVAL = 25,\r\n DEVICE_ADDONS_INTERVAL = 25,\r\n LMICENTRAL_MAX_DEVICES_ADDONS = 251,\r\n LMICENTRAL_MAX_AGENTS_ADDONS = 10,\r\n AGENT = 'Agent',\r\n ENDPOINT = 'Endpoint',\r\n ADDON_PRICE_REPLACE = 'ADDON_PRICE_REPLACE',\r\n AUTOMATION_ADDON = 'CentAut',\r\n INSIGHT_ADDON = 'CentIns',\r\n SECURITY_ADDON = 'CentSec',\r\n}\r\n\r\nexport enum ADDON_SKUS {\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n BASIC_AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n BASIC_ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n STANDARD_AGENT_ADDON = 'GTRStandardAddAgentNamed',\r\n STANDARD_ENDPOINT_ADDON = 'GTRStandardAddEndpointNamed',\r\n AUTOMATION_ADDON = 'CentAut',\r\n INSIGHT_ADDON = 'CentIns',\r\n SECURITY_ADDON = 'CentSec',\r\n}\r\n","export enum CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES {\r\n FIRSTNAME = 'FirstName',\r\n LASTNAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n COUNTRYCODE = 'CountryCode',\r\n STATECODE = 'StateCode',\r\n}\r\n","export enum CHECKOUTFORM_STEPS {\r\n CREATE_FLEX_TOKEN = 'createFlexToken',\r\n CREATE_USER_ACCOUNT = 'createUserAccount',\r\n SAVE_BILLING_INFO = 'saveBillingInfo',\r\n SAVE_PAYMENT_INFO = 'savePaymentInfo',\r\n CARDINAL_SEND_CHALLENGE = 'sendCardinalChallenge',\r\n GET_AVAILABLE_PAYMENT_METHODS = 'getAvailablepaymentMethods',\r\n SUBMIT_PAYMENT = 'submitPayment',\r\n CARDINAL_TRIGGER_BIN_PROCESS = 'triggerBinProcess',\r\n}\r\n","export enum LMICENTRAL_TRACKING_COMPONENTS {\r\n CHECKOUT_PAGE = 'checkout-form',\r\n FORM_SUBMISSION_SAGA = 'form-submission-saga',\r\n BILLING_PAGE = 'billing',\r\n CUSTOMIZE_PAGE = 'customize',\r\n NEXT_STEPS_PAGE = 'next-steps',\r\n FATAL_ERROR_PAGE = 'fatal-error',\r\n CALCULATE_PRICE_SAGA = 'calculate-price-saga',\r\n CREATE_USER_SAGA = 'create-user-saga',\r\n CREATE_BILLING_INFO_SAGA = 'create-billing-info-saga',\r\n CREATE_PAYMENT_SAGA = 'create-payment-saga',\r\n GET_AVAILABLE_PAYMENT_METHODS_SAGA = 'get-available-payment-methods-saga',\r\n SUBMIT_PAYMENT_SAGA = 'submit-payment-saga',\r\n EXISTING_USER_FORM_SUBMISSION_SAGA = 'existing-user-form-submission-saga',\r\n}\r\n","export enum CHECKOUTFORM_FIELDS {\r\n FIRST_NAME = 'FirstName',\r\n LAST_NAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n BILLING_FIRST_NAME = 'BillingFirstName',\r\n BILLING_LAST_NAME = 'BillingLastName',\r\n STREET1 = 'Street1',\r\n COUNTRY_CODE = 'CountryCode',\r\n CITY = 'City',\r\n STATE_CODE = 'StateCode',\r\n ZIP_CODE = 'ZipCode',\r\n CONTACT_PHONE = 'ContactPhone',\r\n EXPIRATION_DATE = 'ExpirationDate',\r\n TAX_ID = 'TaxNumber',\r\n COMPANY_NAME = 'CompanyName',\r\n}\r\n","export enum PRODUCT_PRICE_ITEM_TYPE {\r\n product = 'Product',\r\n fee = 'Fee',\r\n volumeDiscount = 'VolumeDiscount',\r\n amountOffAutoDiscount = 'AmountOffAutoDiscount',\r\n}\r\n","export enum BUY_TYPE {\r\n TRIAL_CONVERSION = 'trial conversion',\r\n ADDON = 'add-on',\r\n DIRECT_BUY = 'direct buy',\r\n}\r\n","export enum REFERRER {\r\n gotoAdmin = 'gotoadmin',\r\n}\r\n\r\nexport const REFERRER_QUERY_PARAM = 'referrer'\r\n","import axios from 'axios'\r\nimport { SC_SITE } from '@common/constants'\r\nimport {\r\n LmiCentralBillingInfoDataType,\r\n LmiCentralPaymentDataType,\r\n LmiCentralSubmitDataType,\r\n LmiCentralCalculatePriceDataType,\r\n LmiCentralSubmitWithCardAddDataType,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralUserDataType, LmiCentralAbandonedCartPayload } from '@lmicentral/state/user/state'\r\nimport { getContentLanguage } from '@lmicentral/utils/language-helpers'\r\n\r\nexport interface LmiCentralPaymentMethodDataType {\r\n accessToken?: string\r\n billingAccountKey?: string\r\n}\r\n\r\nexport interface LmiCentralCardHeadersType {\r\n AccessToken: string\r\n BillingAccountKey: string\r\n PaymentMethodKey: string\r\n}\r\n\r\nexport interface LmiCentralLabelDataType {\r\n id: string\r\n plan: string\r\n promoCode: string\r\n accessToken: string\r\n timezone: string\r\n}\r\n\r\nexport interface apiQueryParamsType {\r\n /* eslint-disable camelcase */\r\n sc_site: string\r\n sc_lang?: string\r\n}\r\n\r\nexport const apiQueryParams = {\r\n sc_site: SC_SITE.LOGMEIN,\r\n sc_lang: 'en',\r\n}\r\n\r\nexport const setLanguageParam = (queryParams: apiQueryParamsType) => {\r\n return {\r\n ...queryParams,\r\n sc_lang: getContentLanguage(),\r\n }\r\n}\r\n\r\n/* APP DATA */\r\n\r\n// get buy flow api data\r\n\r\nexport function getLmiCentralLabelData(): Promise {\r\n const updatedQueryParams = setLanguageParam(apiQueryParams)\r\n return axios.post('/ecommapi/content/buy/central', null, { params: updatedQueryParams })\r\n}\r\n\r\n// get available payment methods\r\nexport function getAvailablePaymentMethods() {\r\n return axios.post('/ecommapi/purchase/GetAvailablePaymentMethods', null, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// create user account\r\nexport function createUserAccount(data: LmiCentralUserDataType): Promise {\r\n return axios.post('/ecommapi/identity/CreateAccount/', data, {\r\n withCredentials: true,\r\n params: apiQueryParams,\r\n })\r\n}\r\n\r\n// create billing information\r\nexport function createBillingInfo(data: LmiCentralBillingInfoDataType): Promise {\r\n return axios.post('/ecommapi/purchase/SetBillingInfo', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// calculate payment\r\nexport function calculatePrice(data: LmiCentralCalculatePriceDataType): Promise {\r\n return axios.post('/ecommapi/purchase/CalculatePrice', data)\r\n}\r\n\r\n// create payment info\r\nexport function savePayment(data: LmiCentralPaymentDataType) {\r\n return axios.post('/ecommapi/purchase/SavePaymentMethodV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment with card add\r\n// api reference: https://confluence.ops.expertcity.com/display/MMM/API+-+Public+-+Process+Purchase+With+Card+Add+V3\r\nexport function submitPaymentWithCardAdd(data: LmiCentralSubmitWithCardAddDataType): Promise {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseWithCardAddV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment\r\nexport function submitPayment(data: LmiCentralSubmitDataType | LmiCentralSubmitWithCardAddDataType) {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\nexport function validateTaxNumber(country: string, taxNumber: string, federalTaxType?: string) {\r\n return axios.get('/ecommapi/purchase/ValidateTaxNumber', {\r\n params: {\r\n country,\r\n taxNumber,\r\n federalTaxType,\r\n },\r\n })\r\n}\r\n\r\n// cart abandonment\r\nexport function submitAbandonedCart(data: LmiCentralAbandonedCartPayload) {\r\n return axios.post(`${process.env.AWS_ABANDON_ENDPOINT}`, data)\r\n}\r\n\r\nexport default {\r\n getLmiCentralLabelData,\r\n calculatePrice,\r\n createUserAccount,\r\n createBillingInfo,\r\n submitPaymentWithCardAdd,\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CHECKOUTFORM_STEPS } from '@lmicentral/constants'\r\nimport { LmiCentralBuyFormData } from './state'\r\n\r\nexport enum LmiCentralBuyFormActionTypes {\r\n SUBMIT_BUY_FORM = '[lmicentral-buy-form-actions] submit-exp',\r\n RESET_BUY_FORM_AFFECTED_STATES = '[lmicentral-buy-form-actions] reset-affected-states',\r\n RESET_BUY_FORM = '[lmicentral-buy-form-actions] reset-checkout-form',\r\n EXISTING_USER_SUBMIT_BUY_FORM = '[lmicentral-buy-form-actions] existing-user-submit-exp',\r\n UPDATE_INITIAL_FORM_STATE = '[lmicentral-buy-form-actions] update-initial-form-state',\r\n SET_CLEAR_EMAIL = '[lmicentral-buy-form-actions] set-clear-email',\r\n UPDATE_STEPS = '[lmicentral-buy-form-actions] update-steps',\r\n SET_STATES_OPTIONAL = '[lmicentral-buy-form-actions] set-states-optional',\r\n}\r\n\r\nexport const lmicentralBuyFormActions = {\r\n submitForm: (values: LmiCentralBuyFormData) =>\r\n createAction(LmiCentralBuyFormActionTypes.SUBMIT_BUY_FORM, { values }),\r\n existingUserSubmitForm: (values: LmiCentralBuyFormData) =>\r\n createAction(LmiCentralBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, { values }),\r\n resetCheckoutFormAffectedStates: () => createAction(LmiCentralBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES),\r\n updateInitialFormState: (data: LmiCentralBuyFormData) =>\r\n createAction(LmiCentralBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE, {\r\n data,\r\n }),\r\n resetForm: () => createAction(LmiCentralBuyFormActionTypes.RESET_BUY_FORM),\r\n setClearEmail: (clear: boolean) => createAction(LmiCentralBuyFormActionTypes.SET_CLEAR_EMAIL, { clear }),\r\n updateSteps: (stepName: CHECKOUTFORM_STEPS, stepResult: boolean) =>\r\n createAction(LmiCentralBuyFormActionTypes.UPDATE_STEPS, {\r\n stepName,\r\n stepResult,\r\n }),\r\n setStatesOptional: (optional: boolean) =>\r\n createAction(LmiCentralBuyFormActionTypes.SET_STATES_OPTIONAL, { optional }),\r\n}\r\n\r\nexport type BuyFormActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LmiCentralSelectedAddon, LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralBuyFormData } from '@lmicentral/state/buy-form/state'\r\nimport { LmiCentralProductPriceItem } from '@lmicentral/state/calculate-price'\r\nimport {\r\n LmiCentralBillingInfoDataType,\r\n LmiCentralPaymentDataType,\r\n LmiCentralSubmitDataType,\r\n LmiCentralBillingFrequencyVolumeDiscountRecords,\r\n LmiCentralSubmitWithCardAddDataType,\r\n} from './state'\r\n\r\nexport enum LmiCentralCheckoutActionTypes {\r\n SET_LOADING = '[lmicentral-checkout-actions] set-loading',\r\n SET_PLAN_ID = '[lmicentral-checkout-actions] set-plan-id',\r\n SET_BILLING_FREQUENCY = '[lmicentral-checkout-actions] set-billing-frequency',\r\n CLEAR_ADDONS = '[lmicentral-checkout-actions] clear-addons',\r\n SET_SELECTED_ADDONS = '[lmicentral-checkout-actions] set-selected-addons',\r\n SET_ORGANIZERS = '[lmicentral-checkout-actions] set-organizers',\r\n SET_SELECTED_PLAN = '[lmicentral-checkout-actions] set-selected-plan',\r\n SET_EXISTING_USER_MODAL_OPEN = '[lmicentral-checkout-actions] set-existing-user-modal',\r\n CREATE_BILLING_INFO = '[lmicentral-checkout-actions] create-billing-info',\r\n CREATE_PAYMENT = '[lmicentral-checkout-actions] create-payment',\r\n SUBMIT_PAYMENT = '[lmicentral-checkout-actions] submit-payment',\r\n CREATE_AND_SUBMIT_PAYMENT = '[lmicentral-checkout-actions] create-and-submit-payment',\r\n GET_AVAILABLE_PAYMENT_METHODS = '[lmicentral-checkout-actions] get-available-payment-methods',\r\n CALCULATE_PRICE = '[lmicentral-checkout-actions] calculate-price',\r\n SET_CALCULATED_PRICE = '[lmicentral-checkout-actions] set-calculated-price',\r\n GET_SAVED_STATE = '[lmicentral-checkout-actions] get-saved-state',\r\n SET_SAVED_STATE_LOADED = '[lmicentral-checkout-actions] set-saved-state-loaded',\r\n RESET_CHECKOUT_STATE = '[lmicentral-checkout-actions] reset-state',\r\n SET_EXISTING_ORGANIZERS = '[lmicentral-checkout-actions] set-existing-organizers',\r\n SET_PURCHASE_COMPLETE = '[lmicentral-checkout-actions] set-purchase-complete',\r\n SET_LOADING_TOTAL = '[lmicentral-checkout-actions] set-loading-total',\r\n SET_ADDON_COMPLETE = '[lmicentral-checkout-actions] set-addon-complete',\r\n SET_SELECTED_TIER_INDEX = '[lmicentral-checkout-actions] set-selected-tier-index',\r\n CALCULATE_VOLUME_DISCOUNT = '[lmicentral-checkout-actions] calculate-volume-discount',\r\n SET_VOLUME_DISCOUNT = '[lmicentral-checkout-actions] set-volume-discount',\r\n SET_VOLUME_DISCOUNT_LOADING = '[lmicentral-checkout-actions] set-volume-discount-loading',\r\n GET_VOLUME_DISCOUNT = '[lmicentral-checkout-actions] get-volume-discount',\r\n SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE = '[lmicentral-checkout-actions] set-current-volume-discount-price-and-percentage',\r\n ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON = '[lmicentral-checkout-actions] adjust-current-volume-discount-for-reprice-coupon',\r\n SET_PRORATED_AMOUNT = '[lmicentral-checkout-actions] set-prorated-amount',\r\n SET_EXTRA_ADDON = '[lmicentral-checkout-actions] set-extra-addon',\r\n SET_ENDPOINTS = '[lmicentral-checkout-actions] set-endpoints',\r\n SET_AGENTS = '[lmicentral-checkout-actions] set-agents',\r\n SET_TAX_TYPE = '[lmicentral-checkout-actions] set-tax-type',\r\n SET_AUTO_LOGIN = '[lmicentral-checkout-form-actions] set-auto-login',\r\n}\r\n\r\nexport const lmicentralCheckoutActions = {\r\n setLoading: (loading: boolean) => createAction(LmiCentralCheckoutActionTypes.SET_LOADING, { loading }),\r\n setPurchaseComplete: (complete: boolean) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_PURCHASE_COMPLETE, { complete }),\r\n setBillingFrequency: (frequency: TimePeriod) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_BILLING_FREQUENCY, { frequency }),\r\n clearAddons: () => createAction(LmiCentralCheckoutActionTypes.CLEAR_ADDONS),\r\n setSelectedPlan: (planSku: string) => createAction(LmiCentralCheckoutActionTypes.SET_SELECTED_PLAN, { planSku }),\r\n setSelectedAddons: (addons: LmiCentralSelectedAddon[]) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_SELECTED_ADDONS, { addons }),\r\n setOrganizers: (organizers: number) => createAction(LmiCentralCheckoutActionTypes.SET_ORGANIZERS, { organizers }),\r\n createBillingInfo: (billingValues: LmiCentralBillingInfoDataType) =>\r\n createAction(LmiCentralCheckoutActionTypes.CREATE_BILLING_INFO, {\r\n billingValues,\r\n }),\r\n createPayment: (paymentValues: LmiCentralPaymentDataType) =>\r\n createAction(LmiCentralCheckoutActionTypes.CREATE_PAYMENT, {\r\n paymentValues,\r\n }),\r\n submitPayment: (submitValues: LmiCentralSubmitDataType | LmiCentralSubmitWithCardAddDataType) =>\r\n createAction(LmiCentralCheckoutActionTypes.SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n createAndSubmitPayment: (submitValues: LmiCentralSubmitWithCardAddDataType) =>\r\n createAction(LmiCentralCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n getPaymentMethods: () => createAction(LmiCentralCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS),\r\n calculatePrice: (values: LmiCentralBuyFormData, component?: string, planSKU?: string) =>\r\n createAction(\r\n LmiCentralCheckoutActionTypes.CALCULATE_PRICE,\r\n {\r\n values,\r\n planSKU,\r\n },\r\n { component }\r\n ),\r\n setCalculatedPrice: (\r\n productPrices: LmiCentralProductPriceItem[],\r\n net: number,\r\n total: number,\r\n tax: number,\r\n creditback: number,\r\n anniversaryDate: string\r\n ) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_CALCULATED_PRICE, {\r\n productPrices,\r\n net,\r\n total,\r\n tax,\r\n creditback,\r\n anniversaryDate,\r\n }),\r\n getSavedState: (urlPlan: string) =>\r\n createAction(LmiCentralCheckoutActionTypes.GET_SAVED_STATE, {\r\n urlPlan,\r\n }),\r\n setSavedStateLoaded: (savedStateLoaded: boolean, component: string) =>\r\n createAction(\r\n LmiCentralCheckoutActionTypes.SET_SAVED_STATE_LOADED,\r\n {\r\n savedStateLoaded,\r\n },\r\n { component }\r\n ),\r\n setTotalLoading: (loading: boolean) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_LOADING_TOTAL, {\r\n loading,\r\n }),\r\n setAddonComplete: (addonComplete: boolean) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_ADDON_COMPLETE, {\r\n addonComplete,\r\n }),\r\n resetCheckoutState: () => createAction(LmiCentralCheckoutActionTypes.RESET_CHECKOUT_STATE),\r\n setSelectedTierIndex: (selectedTierIndex: number, organizers: number) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_SELECTED_TIER_INDEX, { selectedTierIndex, organizers }),\r\n calculateVolumeDiscount: () => createAction(LmiCentralCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT),\r\n setVolumeDiscount: (\r\n selectedPlanSku: string,\r\n currency: CURRENCY,\r\n volumeDiscountForSelectedPlanAndCurrency: LmiCentralBillingFrequencyVolumeDiscountRecords\r\n ) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_VOLUME_DISCOUNT, {\r\n selectedPlanSku,\r\n currency,\r\n volumeDiscountForSelectedPlanAndCurrency,\r\n }),\r\n setVolumeDiscountLoading: (volumeDiscountLoading: boolean) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING, { volumeDiscountLoading }),\r\n getVolumeDiscount: (organizers: number, selectedTierIndex: number, billingFrequency: TimePeriod) =>\r\n createAction(LmiCentralCheckoutActionTypes.GET_VOLUME_DISCOUNT, {\r\n organizers,\r\n selectedTierIndex,\r\n billingFrequency,\r\n }),\r\n setCurrentVolumeDiscountPriceAndPercentage: (currentVolumeDiscountPrice: number) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE, {\r\n currentVolumeDiscountPrice,\r\n }),\r\n setProratedAmount: (proratedAmount: number) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_PRORATED_AMOUNT, { proratedAmount }),\r\n adjustCurrentVolumeDiscountForRepriceCoupon: () =>\r\n createAction(LmiCentralCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON),\r\n setExtraAddons: (addons: LmiCentralAddon[]) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_EXTRA_ADDON, { addons }),\r\n setEndpoints: (endpoints: number) => createAction(LmiCentralCheckoutActionTypes.SET_ENDPOINTS, { endpoints }),\r\n setAgents: (agents: number) => createAction(LmiCentralCheckoutActionTypes.SET_AGENTS, { agents }),\r\n setTaxType: (type: string) => createAction(LmiCentralCheckoutActionTypes.SET_TAX_TYPE, { type }),\r\n setAutoLogin: (autoLogin?: string) =>\r\n createAction(LmiCentralCheckoutActionTypes.SET_AUTO_LOGIN, {\r\n autoLogin,\r\n }),\r\n}\r\n\r\nexport type LmiCentralCheckoutActions = ActionUnion\r\n","import { LmiCentralContentData } from '@lmicentral/state/content-data'\r\nimport { LabelContent } from '@lmicentral/state/label-content'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum LmiCentralContentActionTypes {\r\n GET_LABEL_CONTENT = '[lmicentral-content-actions] get-label-content',\r\n SET_CONTENT = '[lmicentral-content-actions] set-content',\r\n SET_CONTENT_LOADED = '[lmicentral-content-actions] set-content-loaded',\r\n GET_COMPARE_MODAL_CONTENT = '[lmicentral-content-actions] get-compare-modal-content',\r\n SET_COMPARE_MODAL_CONTENT = '[lmicentral-content-actions] set-compare-modal-content',\r\n SET_COUPON_DISCLAIMER = '[lmicentral-content-actions] set-coupon-disclaimer',\r\n}\r\n\r\nexport const contentActions = {\r\n getLabelContent: (upgrade?: boolean) => createAction(LmiCentralContentActionTypes.GET_LABEL_CONTENT, { upgrade }),\r\n setContent: (content: LmiCentralContentData, labels: LabelContent, filteredPlans: [], allPlans: []) =>\r\n createAction(LmiCentralContentActionTypes.SET_CONTENT, {\r\n content,\r\n labels,\r\n filteredPlans,\r\n allPlans,\r\n }),\r\n getCompareModalContent: (PlanGroupdId: string) =>\r\n createAction(LmiCentralContentActionTypes.GET_COMPARE_MODAL_CONTENT, PlanGroupdId),\r\n setCompareModalContent: (content: []) =>\r\n createAction(LmiCentralContentActionTypes.SET_COMPARE_MODAL_CONTENT, { content }),\r\n setContentLoaded: (loaded: boolean) => createAction(LmiCentralContentActionTypes.SET_CONTENT_LOADED, { loaded }),\r\n setCouponDisclaimer: (couponDisclaimer: string) =>\r\n createAction(LmiCentralContentActionTypes.SET_COUPON_DISCLAIMER, { couponDisclaimer }),\r\n}\r\n\r\n// where do the get functions go\r\n\r\nexport type ContentActions = ActionUnion\r\n","import { LmiCentralContainerAppState } from '@lmicentral/store'\r\n// we need to complete this file, as we copy reducers from connect\r\n\r\nexport const getLabelContent = (state: LmiCentralContainerAppState) => state.lmicentral.content.labelContent\r\nexport const getCheckoutState = (state: LmiCentralContainerAppState) => state.lmicentral.checkout\r\nexport const getPlanData = (state: LmiCentralContainerAppState) => state.lmicentral.content.planData\r\nexport const getContentState = (state: LmiCentralContainerAppState) => state.lmicentral.content\r\nexport const getContentData = (state: LmiCentralContainerAppState) => state.lmicentral.content.contentData\r\nexport const getUserState = (state: LmiCentralContainerAppState) => state.lmicentral.user\r\nexport const getBuyFormState = (state: LmiCentralContainerAppState) => state.lmicentral.form\r\nexport const getCouponState = (state: LmiCentralContainerAppState) => state.lmicentral.coupon\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from '@common/state/tracking/state'\r\n\r\nexport enum LmiCentralTrackingActionTypes {\r\n TRACK = '[lmicentral-tracking] lmicentral-track-event',\r\n}\r\n\r\nexport const lmicentralTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) =>\r\n createAction(LmiCentralTrackingActionTypes.TRACK, { trackingInfo }, { component }),\r\n}\r\n\r\nexport type LmiCentralTrackingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { LmiCentralBuyFormData } from '@lmicentral/state/buy-form/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { LmiCentralAbandonedCartDataType, LmiCentralUserDataType } from './state'\r\n\r\nexport enum LmiCentralUserActionTypes {\r\n CHECK_EXISTING_USER = '[lmicentral-user-actions] check-existing-user',\r\n CREATE_NEW_USER = '[lmicentral-user-actions] create-new-user',\r\n GET_LOGGED_IN_USER_STATE = '[lmicentral-user-actions] get-user-logged-in-state',\r\n SET_EXISTING_BILLING_INFO = '[lmicentral-user-actions] set-existing-billing-info',\r\n SET_EXISTING_USER_INFO = '[lmicentral-user-actions] set-existing-user-info',\r\n SET_EXISTING_ACCOUNT_INFO = '[lmicentral-user-actions] set-existing-account-info',\r\n SET_DISPLAY_NAME = '[lmicentral-user-actions] set-display-name',\r\n SET_LOADING_EXISTING_INFO = '[lmicentral-user-actions] set-loading-existing-info',\r\n SET_VERIFYING_TOKEN = '[lmicentral-user-actions] set-verifying-token',\r\n SET_USER_TYPE = '[lmicentral-user-actions] set-user-type',\r\n SET_EXISTING_PAYMENT_DETAILS = '[lmicentral-user-actions] set-existing-payment-details',\r\n SET_ACCESS_TOKEN = '[lmicentral-user-actions] set-access-token',\r\n GET_ACCESS_TOKEN = '[lmicentral-user-actions] get-access-token',\r\n SET_IS_USER_LOGGEDIN = '[lmicentral-user-actions] set-is-user-loggedin',\r\n USER_LOGIN = '[lmicentral-user-actions] user-login',\r\n USER_LOGOUT = '[lmicentral-user-actions] user-logout',\r\n SET_VERIFY_USER_SHOULD_LOGIN = '[lmicentral-user-actions] get-verify-user-should-login',\r\n SUBMIT_ABANDONED_CART = '[lmicentral-user-actions] submit-abandoned-cart',\r\n}\r\n\r\nexport const lmicentralUserActions = {\r\n checkExistingUser: (email: string, form?: LmiCentralBuyFormData) =>\r\n createAction(LmiCentralUserActionTypes.CHECK_EXISTING_USER, { email, form }),\r\n createNewUser: (userValues: LmiCentralUserDataType) =>\r\n createAction(LmiCentralUserActionTypes.CREATE_NEW_USER, { userValues }),\r\n getLoggedInUserState: () => createAction(LmiCentralUserActionTypes.GET_LOGGED_IN_USER_STATE),\r\n setExistingBillingInformation: (billingInfo: ExistingBillingInfoType) =>\r\n createAction(LmiCentralUserActionTypes.SET_EXISTING_BILLING_INFO, { billingInfo }),\r\n setLoadingExistingInformation: (loading: boolean) =>\r\n createAction(LmiCentralUserActionTypes.SET_LOADING_EXISTING_INFO, { loading }),\r\n setVerifyingToken: (verifying: boolean) =>\r\n createAction(LmiCentralUserActionTypes.SET_VERIFYING_TOKEN, { verifying }),\r\n setExistingUserInformation: (userInfo: ExistingUserInfoType) =>\r\n createAction(LmiCentralUserActionTypes.SET_EXISTING_USER_INFO, { userInfo }),\r\n setExistingAccountInformation: (accountInfo: ExistingAccountInfoType) =>\r\n createAction(LmiCentralUserActionTypes.SET_EXISTING_ACCOUNT_INFO, { accountInfo }),\r\n setDisplayName: (displayName: string) => createAction(LmiCentralUserActionTypes.SET_DISPLAY_NAME, { displayName }),\r\n setUserType: (type: string) => createAction(LmiCentralUserActionTypes.SET_USER_TYPE, { type }),\r\n setExistingPaymentDetails: (info: ExistingPaymentInfoType) =>\r\n createAction(LmiCentralUserActionTypes.SET_EXISTING_PAYMENT_DETAILS, { info }),\r\n getAccessToken: () => createAction(LmiCentralUserActionTypes.GET_ACCESS_TOKEN),\r\n userLogin: (component?: string, pathname?: string, search?: string, sso?: boolean) =>\r\n createAction(LmiCentralUserActionTypes.USER_LOGIN, { pathname, search, sso }, { component }),\r\n userLogout: (component?: string) => createAction(LmiCentralUserActionTypes.USER_LOGOUT, {}, { component }),\r\n setAccessToken: (accessToken: Token) => createAction(LmiCentralUserActionTypes.SET_ACCESS_TOKEN, { accessToken }),\r\n setIsUserLoggedIn: (isUserLoggedIn: boolean) =>\r\n createAction(LmiCentralUserActionTypes.SET_IS_USER_LOGGEDIN, {\r\n isUserLoggedIn,\r\n }),\r\n setVerifyShouldUserLogIn: (verifiedUserShouldLogIn: boolean) =>\r\n createAction(LmiCentralUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN, { verifiedUserShouldLogIn }),\r\n submitAbandonedCart: (abandonedCartData: LmiCentralAbandonedCartDataType) =>\r\n createAction(LmiCentralUserActionTypes.SUBMIT_ABANDONED_CART, { abandonedCartData }),\r\n}\r\n\r\nexport type LmiCentralUserActions = ActionUnion\r\n","import { PRODUCT_PRICE_ITEM_TYPE } from '@lmicentral/constants'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralProductPriceItem } from '@lmicentral/state/calculate-price'\r\n\r\nexport const getTotalProratedAmount = (productPrices: LmiCentralProductPriceItem[]): number => {\r\n let proratedAmount = 0\r\n if (productPrices) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product && productPriceItem.proratedAmount) {\r\n proratedAmount += productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n\r\nexport const getAddonProrateAmount = (productPrices?: LmiCentralProductPriceItem[], addon?: LmiCentralAddon) => {\r\n let proratedAmount = 0\r\n if (productPrices && addon) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.proratedAmount && productPriceItem.productSKU === addon.sKU) {\r\n proratedAmount = productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n","import { get } from 'lodash-es'\r\nimport { CURRENCY } from '@common/constants'\r\nimport {\r\n LmiCentralBillingFrequencyVolumeDiscountRecords,\r\n LmiCentralVolumeDiscountPerTier,\r\n} from '@lmicentral/state/checkout/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralPrice, LmiCentralPricing, LmiCentralTiers } from '@lmicentral/state/price'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\n\r\nexport const getDiscount = (basePrice: number, newPrice: number): number => {\r\n return basePrice - newPrice\r\n}\r\n\r\nexport const getDiscountPercentage = (basePrice: number, newPrice: number): number => {\r\n return Math.floor(((basePrice - newPrice) / basePrice) * 100)\r\n}\r\n\r\nconst processPricingTier = (\r\n pricingTierKeys: string[],\r\n pricingTiers: LmiCentralTiers\r\n): LmiCentralVolumeDiscountPerTier[] => {\r\n let basePrice = 0\r\n return pricingTierKeys.reduce((pricingTierAccumulator, pricingTier, pricingTierIndex) => {\r\n const pricingTierAccumulatorCopy = [...pricingTierAccumulator]\r\n const pricingTierData = pricingTiers[pricingTier as keyof LmiCentralTiers]\r\n const tierPrice = pricingTierData.price\r\n if (pricingTierIndex === 0) {\r\n basePrice = tierPrice\r\n }\r\n\r\n const volumeDiscountPerTier: LmiCentralVolumeDiscountPerTier = {\r\n discountPricePerUnit: getDiscount(basePrice, tierPrice),\r\n }\r\n pricingTierAccumulatorCopy.push(volumeDiscountPerTier)\r\n return pricingTierAccumulatorCopy\r\n }, [] as LmiCentralVolumeDiscountPerTier[])\r\n}\r\n\r\nconst processCurrencyPricing = (\r\n pricingKeys: string[],\r\n currencyPricing: LmiCentralPricing\r\n): LmiCentralBillingFrequencyVolumeDiscountRecords => {\r\n return pricingKeys.reduce((billingFrequencyAccumulator, billingFrequency) => {\r\n const billingFrequencyAccumulatorCopy = { ...billingFrequencyAccumulator }\r\n const pricingTiers = currencyPricing[billingFrequency as keyof LmiCentralPricing]\r\n const pricingTierKeys = Object.keys(pricingTiers)\r\n billingFrequencyAccumulatorCopy[billingFrequency] = processPricingTier(pricingTierKeys, pricingTiers)\r\n return billingFrequencyAccumulatorCopy\r\n }, {} as LmiCentralBillingFrequencyVolumeDiscountRecords)\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n selectedPlan: LmiCentralPlan,\r\n selectedCurrency: CURRENCY\r\n): LmiCentralBillingFrequencyVolumeDiscountRecords => {\r\n const { pricingInfo } = selectedPlan ?? {}\r\n const currencyPricing = pricingInfo[selectedCurrency as keyof LmiCentralPrice] as LmiCentralPricing\r\n const pricingKeys = Object.keys(currencyPricing)\r\n return processCurrencyPricing(pricingKeys, currencyPricing)\r\n}\r\n\r\nexport const getTotalVolumeDiscount = (discountPerUser: number, organizers: number, annualize: boolean) => {\r\n const volumeDiscountTimesOrganizer = discountPerUser * organizers\r\n\r\n const totalVolumeDiscount = annualize ? volumeDiscountTimesOrganizer * 12 : volumeDiscountTimesOrganizer\r\n // Currently we are seeing that Volume Discount not applied per the `CalculatePrice` API call\r\n return 0 && totalVolumeDiscount\r\n}\r\n\r\nexport const getAddonVolumeDiscount = (\r\n addon: LmiCentralAddon,\r\n _quantity: number,\r\n currencyCode: string,\r\n billingFrequencyKey: string,\r\n _currentTier: string\r\n) => {\r\n const discountPercentagesForQuantity = () => {\r\n const basePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'price'], 0)\r\n const tierPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, _currentTier, 'price'], 0)\r\n\r\n const percent = ((basePrice - tierPrice) / basePrice) * 100\r\n const trierIndex =\r\n _currentTier.length > 5\r\n ? _currentTier[_currentTier.length - 2] + _currentTier[_currentTier.length - 1]\r\n : _currentTier[_currentTier.length - 1]\r\n return { actualPercentage: Math.floor(percent), tierIndex: Number(trierIndex) }\r\n }\r\n\r\n // WAE-401 :: While showing the percentage value in line item, we need to round it off to the `floor`. But for the discount amount, need to `round` it to closest\r\n const { tierIndex } = discountPercentagesForQuantity()\r\n\r\n // const price =\r\n // get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, `tier${tierIndex}`, 'price'], 0) *\r\n // get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, `tier${tierIndex}`, 'min'], 0)\r\n\r\n // const discountPrice = Math.floor((actualPercentage / 100) * price)\r\n\r\n // Currently we are seeing that Volume Discount not applied per the `CalculatePrice` API call\r\n return { discountPrice: 0, tierIndex }\r\n}\r\n","import { LmiCentralAddon, LmiCentralSelectedAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { ADDONS } from '@lmicentral/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport const getCurrentAddons = (\r\n selectedAddons: LmiCentralSelectedAddon[],\r\n selectedPlan: LmiCentralPlan\r\n): LmiCentralAddon[] => {\r\n const { addons } = selectedPlan ?? {}\r\n const myAddons = selectedAddons.reduce(\r\n (mySelectedAddons: LmiCentralAddon[], localAddon: LmiCentralSelectedAddon) => {\r\n const matchingAddon = addons.find((add: LmiCentralAddon) => add.sKU === localAddon.sKU)\r\n if (matchingAddon) {\r\n matchingAddon.quantity = localAddon.quantity\r\n return [...mySelectedAddons, matchingAddon]\r\n }\r\n\r\n return mySelectedAddons\r\n },\r\n []\r\n )\r\n return myAddons\r\n}\r\n\r\nexport const getExtraAddons = (addons: LmiCentralAddon[]) => {\r\n return addons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON ||\r\n addon.sKU === ADDONS.AUTOMATION_ADDON ||\r\n addon.sKU === ADDONS.INSIGHT_ADDON ||\r\n addon.sKU === ADDONS.SECURITY_ADDON\r\n )\r\n}\r\n\r\nexport const getCurrentAgent = (addons: LmiCentralAddon[]) => {\r\n return addons.filter((addon) => addon.sKU.includes(ADDONS.AGENT))[0]\r\n}\r\n\r\nexport const getCurrentEndpoint = (addons: LmiCentralAddon[]) => {\r\n return addons.filter(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )[0]\r\n}\r\n\r\nexport const getUserSubscribedAccumulatedAddon = (subscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n const userSubscribedAddonsQuantity = subscriptions.reduce((prev, curr) => {\r\n /* eslint-disable no-param-reassign */\r\n prev += curr.quantity\r\n return prev\r\n }, 0)\r\n\r\n const userSubscribedAccumulatedAddon = { ...subscriptions[subscriptions.length - 1] }\r\n userSubscribedAccumulatedAddon.quantity = userSubscribedAddonsQuantity\r\n\r\n return userSubscribedAccumulatedAddon\r\n}\r\n\r\nexport const getAccumulatedUserSubscriptions = (\r\n subscriptions: BillingDetailedSubscriptionPlan[],\r\n planData: LmiCentralPlan[]\r\n) => {\r\n const selectedPlan: LmiCentralPlan[] = planData.filter((plan: LmiCentralPlan) => {\r\n return !!subscriptions.find((sub: BillingDetailedSubscriptionPlan) => plan.sKU === sub.productSku)\r\n })\r\n\r\n // if user does not have any GoToLmiCentral subscriptions, exit\r\n if (isEmpty(selectedPlan)) {\r\n return subscriptions\r\n }\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan[0].addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan[0].addons)\r\n const accumulatedSubscriptions = []\r\n\r\n const userSubscribedAgents = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentAgent.sKU\r\n )\r\n const userSubscribedEndpoints = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentEndpoint.sKU\r\n )\r\n\r\n if (userSubscribedAgents.length) {\r\n const userSubscribedAgent = getUserSubscribedAccumulatedAddon(userSubscribedAgents)\r\n accumulatedSubscriptions.push(userSubscribedAgent)\r\n }\r\n\r\n if (userSubscribedEndpoints.length) {\r\n const userSubscribedEndpoint = getUserSubscribedAccumulatedAddon(userSubscribedEndpoints)\r\n accumulatedSubscriptions.push(userSubscribedEndpoint)\r\n }\r\n\r\n accumulatedSubscriptions.push(\r\n ...subscriptions.filter((sub) => sub.productSku !== currentAgent.sKU && sub.productSku !== currentEndpoint.sKU)\r\n )\r\n\r\n return accumulatedSubscriptions\r\n}\r\n\r\nexport const getUserSubscribedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: LmiCentralPlan\r\n) => {\r\n if (!selectedPlan || !accountSubscriptions.length) return {}\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan.addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan.addons)\r\n\r\n return {\r\n disablePlanSelection: false,\r\n disableExtraAddons: false,\r\n userSubscribedAgent: accountSubscriptions.find((sub) => sub.productSku === currentAgent?.sKU),\r\n userSubscribedEndpoint: accountSubscriptions.find((sub) => sub.productSku === currentEndpoint?.sKU),\r\n }\r\n}\r\n\r\nexport const getIncludedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: LmiCentralPlan\r\n) => {\r\n if (!selectedPlan) return { includedEndpoints: 0, includedAgents: 0 }\r\n const { userSubscribedAgent, userSubscribedEndpoint } =\r\n accountSubscriptions && getUserSubscribedAddons(accountSubscriptions, selectedPlan)\r\n\r\n const includedAgents = userSubscribedAgent\r\n ? selectedPlan.userAgentsIncludedAmount + userSubscribedAgent.quantity\r\n : selectedPlan.userAgentsIncludedAmount\r\n\r\n const includedEndpoints = userSubscribedEndpoint\r\n ? selectedPlan.endpointsIncludedAmount + ADDONS.ENDPOINTS_ADDONS_INTERVAL * userSubscribedEndpoint.quantity\r\n : selectedPlan.endpointsIncludedAmount\r\n\r\n return { includedEndpoints, includedAgents }\r\n}\r\n","import { LmiCentralPlan } from '@lmicentral/state/plan'\r\n\r\nexport const getCurrentPlan = (planSku: string, planData: LmiCentralPlan[]) => {\r\n // TODO: WAE1-3631: Refactor to choose most popular plan.\r\n const selectedPlan = planData.find((plan: LmiCentralPlan) => plan.sKU === planSku)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport const getPlanNameSet = (planData: LmiCentralPlan[]) =>\r\n planData.reduce((accSet, plan) => {\r\n accSet.add(plan.name.toLowerCase())\r\n return accSet\r\n }, new Set())\r\n","import { LmiCentralSelectedAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralItems } from '@lmicentral/state/checkout/state'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { PRODUCT_SKU, BILLING_TYPES } from '@common/constants'\r\nimport { ADDONS } from '@lmicentral/constants'\r\nimport { SubscriptionInfo } from './get-subscription-info'\r\n\r\nexport const getPaymentItems = (\r\n selectedPlan: LmiCentralPlan,\r\n organizers: number,\r\n selectedBillingFrequency: string,\r\n selectedAddons: LmiCentralSelectedAddon[],\r\n subscriptionInfo: SubscriptionInfo\r\n) => {\r\n const items: LmiCentralItems[] = []\r\n const billingFrequency = selectedBillingFrequency === 'YEAR' ? BILLING_TYPES.ANNUAL : BILLING_TYPES.MONTHLY\r\n const contractLengthInMonth = billingFrequency === BILLING_TYPES.ANNUAL ? 12 : 1\r\n\r\n const planSubscription: LmiCentralItems = {\r\n itemId: 0,\r\n productSku: selectedPlan.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: organizers,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }\r\n\r\n if (subscriptionInfo.plan && subscriptionInfo.isReplacementBooking && !subscriptionInfo.isTrial) {\r\n if (!subscriptionInfo.canUpgradePlan) {\r\n planSubscription.productSku = subscriptionInfo.plan.productSku\r\n planSubscription.quantity = subscriptionInfo.plan.quantity\r\n }\r\n\r\n planSubscription.subscriptionsToUpgrade = [\r\n {\r\n subscriptionId: subscriptionInfo.plan.subscriptionId,\r\n quantity: subscriptionInfo.plan.quantity,\r\n },\r\n ]\r\n\r\n subscriptionInfo.addons.forEach((addon: BillingDetailedSubscriptionPlan) => {\r\n planSubscription.subscriptionsToUpgrade?.push({\r\n subscriptionId: addon.subscriptionId,\r\n quantity: addon.quantity,\r\n })\r\n })\r\n }\r\n\r\n if (subscriptionInfo.isReplacementBooking) items.push(planSubscription)\r\n\r\n // add addon products to the items object\r\n if (selectedAddons.length > 0) {\r\n selectedAddons.forEach((addon: LmiCentralSelectedAddon) => {\r\n const v2plan = items.find(\r\n (item) =>\r\n (item.productSku === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 ||\r\n item.productSku === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS) &&\r\n !item.subscriptionsToUpgrade\r\n )\r\n if (v2plan && addon.sKU.includes(ADDONS.AGENT)) {\r\n v2plan.quantity += addon.quantity\r\n } else {\r\n items.push({\r\n itemId: items.length,\r\n productSku: addon.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: addon.quantity * 25,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n })\r\n }\r\n })\r\n }\r\n\r\n return items\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { trackEvent, getFormName } from '@common/utils'\r\nimport {\r\n CURRENCY,\r\n PRODUCT_FAMILY_KEY,\r\n PRODUCT_FAMILY_NAME,\r\n TimePeriod,\r\n TRACKING_EVENTS,\r\n VIEW_PATH,\r\n} from '@common/constants'\r\nimport {\r\n LmiCentralCartData,\r\n LmiCentralPurchaseData,\r\n LmiCentralCustomizeItemsData,\r\n} from '@lmicentral/state/tracking/state'\r\nimport { PageViewContentData, SessionInfo, TrackECommerceData } from '@common/state/tracking/state'\r\nimport { BUY_TYPE, ADDONS, LMICENTRAL_USER_TYPES, LMICENTRAL_TRACKING_COMPONENTS } from '@lmicentral/constants'\r\nimport { LmiCentralAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralCouponProcessedDataPerSku } from '@lmicentral/state/coupon/state'\r\nimport { get, cloneDeep } from 'lodash-es'\r\n\r\nconst contentType: Record = {\r\n [VIEW_PATH.PATH_CUSTOMIZE]: 'plan',\r\n [VIEW_PATH.PATH_CHECKOUT]: 'buy-form',\r\n}\r\n\r\nconst morphAddonData = (addonList: LmiCentralAddon[]) => {\r\n const addonMap: Record = {}\r\n addonList.forEach((addon) => {\r\n addonMap[addon.sKU] = addon\r\n })\r\n return addonMap\r\n}\r\n\r\nexport const getBuyType = (userType: string) => {\r\n if (userType === LMICENTRAL_USER_TYPES.TRIALER) {\r\n return BUY_TYPE.TRIAL_CONVERSION\r\n }\r\n if (userType === LMICENTRAL_USER_TYPES.ADDON) {\r\n return BUY_TYPE.ADDON\r\n }\r\n return BUY_TYPE.DIRECT_BUY\r\n}\r\n\r\ninterface PreviousTrackData {\r\n step: number\r\n cartData: LmiCentralCartData | null\r\n}\r\nconst previousTrackData: PreviousTrackData = {\r\n step: 0, // default value\r\n cartData: null,\r\n}\r\nconst setPreviousStep = (step: number) => {\r\n previousTrackData.step = step\r\n}\r\nconst setPreviousCart = (cartData: LmiCentralCartData) => {\r\n previousTrackData.cartData = cloneDeep(cartData)\r\n}\r\n\r\ninterface ProcessCartData {\r\n plan?: LmiCentralPlan\r\n addonList?: LmiCentralAddon[]\r\n billingFrequency: TimePeriod\r\n organizers: number\r\n currency: CURRENCY\r\n tier: string\r\n currentVolumeDiscountPrice: number\r\n couponCode: string\r\n couponProcessedDataPerSku: LmiCentralCouponProcessedDataPerSku | null\r\n totalCouponSavings: number\r\n}\r\n\r\nconst processCartData = (productData: ProcessCartData) => {\r\n const { plan, addonList, billingFrequency, organizers, currency, tier, currentVolumeDiscountPrice } = productData\r\n\r\n let planInfo: TrackECommerceData | null = null\r\n if (plan) {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n planInfo = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMICENTRAL,\r\n item_category: PRODUCT_FAMILY_NAME.LMICENTRAL,\r\n item_category2: plan.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant: 'Product',\r\n price: planPrice,\r\n quantity: organizers,\r\n volume_discount: currentVolumeDiscountPrice ? currentVolumeDiscountPrice / organizers : undefined,\r\n discount: get(productData, ['couponProcessedDataPerSku', plan.sKU, 'discountUnitSavings'], 0),\r\n product_discount_tier: tier,\r\n coupon: get(productData, ['couponProcessedDataPerSku', plan.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n }\r\n\r\n let addonInfoList: TrackECommerceData[] | null = null\r\n if (addonList) {\r\n addonInfoList = addonList.map((addon) => {\r\n const addonPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? addon.pricingInfo.USD.annual.tier1.price * 12\r\n : addon.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const addonInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMICENTRAL,\r\n item_category: PRODUCT_FAMILY_NAME.LMICENTRAL,\r\n item_category2: addon.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${PRODUCT_FAMILY_NAME.LMICENTRAL} ${addon.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${addon.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant:\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON ||\r\n addon.sKU === ADDONS.AUTOMATION_ADDON ||\r\n addon.sKU === ADDONS.INSIGHT_ADDON ||\r\n addon.sKU === ADDONS.SECURITY_ADDON\r\n ? 'Add-on'\r\n : 'Product',\r\n price: addonPrice,\r\n quantity: addon.quantity,\r\n volume_discount: addon.discountPrice ? addon.discountPrice / addon.quantity : undefined,\r\n discount:\r\n get(productData, ['couponProcessedDataPerSku', addon.sKU, 'discountUnitSavings'], 0) || undefined,\r\n product_discount_tier: addon.tier || undefined,\r\n coupon: get(productData, ['couponProcessedDataPerSku', addon.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n return addonInfo\r\n })\r\n }\r\n\r\n const cartItems: TrackECommerceData[] = []\r\n if (planInfo) {\r\n cartItems.push(planInfo)\r\n }\r\n if (addonInfoList) {\r\n cartItems.push(...addonInfoList)\r\n }\r\n return cartItems\r\n}\r\n\r\nexport const trackAddToCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ADD_TO_CART, eventData })\r\n}\r\n\r\nexport const trackRemoveFromCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.REMOVE_FROM_CART, eventData })\r\n}\r\n\r\nexport const checkCartData = (cartData: LmiCentralCartData) => {\r\n const previousCartData = previousTrackData.cartData\r\n if (previousCartData) {\r\n const {\r\n plan,\r\n plan: { addons },\r\n } = cartData\r\n const currentCartPlan = plan\r\n const currentCartAddons = morphAddonData(cartData.addonList)\r\n const previousCartPlan = previousCartData.plan\r\n const previousCartAddons = morphAddonData(previousCartData.addonList)\r\n\r\n if (currentCartPlan.name !== previousCartPlan.name) {\r\n trackRemoveFromCart(previousCartData)\r\n trackAddToCart(cartData)\r\n } else {\r\n let removedOrganizers = 0\r\n let addedOrganizers = 0\r\n const removedAddonList: LmiCentralAddon[] = []\r\n const addedAddonList: LmiCentralAddon[] = []\r\n if (previousCartData.organizers > cartData.organizers) {\r\n removedOrganizers = previousCartData.organizers - cartData.organizers\r\n } else if (previousCartData.organizers < cartData.organizers) {\r\n addedOrganizers = cartData.organizers - previousCartData.organizers\r\n }\r\n addons.forEach((addon: LmiCentralAddon) => {\r\n const addonSku = addon.sKU\r\n const currentAddon = currentCartAddons[addonSku]\r\n const previousAddon = previousCartAddons[addonSku]\r\n if (currentAddon && previousAddon) {\r\n if (previousAddon.quantity > currentAddon.quantity) {\r\n const removedQuantity = previousAddon.quantity - currentAddon.quantity\r\n const removedAddon = { ...currentAddon, quantity: removedQuantity }\r\n removedAddonList.push(removedAddon)\r\n } else if (previousAddon.quantity < currentAddon.quantity) {\r\n const addedQuantity = currentAddon.quantity - previousAddon.quantity\r\n const addedAddon = { ...currentAddon, quantity: addedQuantity }\r\n addedAddonList.push(addedAddon)\r\n }\r\n } else if (!previousAddon && currentAddon) {\r\n addedAddonList.push({ ...currentAddon, quantity: currentAddon.quantity })\r\n } else if (previousAddon && !currentAddon) {\r\n removedAddonList.push({ ...previousAddon, quantity: previousAddon.quantity })\r\n }\r\n })\r\n\r\n const removedCartData: ProcessCartData = { ...cartData }\r\n const addedCartData: ProcessCartData = { ...cartData }\r\n if (removedOrganizers === 0) {\r\n removedCartData.plan = undefined\r\n } else if (removedOrganizers > 0) {\r\n removedCartData.organizers = removedOrganizers\r\n }\r\n if (addedOrganizers === 0) {\r\n addedCartData.plan = undefined\r\n } else if (addedOrganizers > 0) {\r\n addedCartData.organizers = addedOrganizers\r\n }\r\n\r\n if (removedAddonList.length === 0) {\r\n removedCartData.addonList = undefined\r\n } else if (removedAddonList.length > 0) {\r\n removedCartData.addonList = removedAddonList\r\n }\r\n\r\n if (addedAddonList.length === 0) {\r\n addedCartData.addonList = undefined\r\n } else if (addedAddonList.length > 0) {\r\n addedCartData.addonList = addedAddonList\r\n }\r\n\r\n if (addedAddonList.length > 0 || addedOrganizers > 0) {\r\n trackAddToCart(addedCartData)\r\n }\r\n if (removedAddonList.length > 0 || removedOrganizers > 0) {\r\n trackRemoveFromCart(removedCartData)\r\n }\r\n }\r\n } else {\r\n // just for double check, because there will always be previous cartData\r\n // if you are in checkCartData function because of the order in which events are fired\r\n trackAddToCart(cartData)\r\n }\r\n}\r\n\r\nexport const trackCustomizeViewItem = (customizeItemsData: LmiCentralCustomizeItemsData) => {\r\n const { planData, billingFrequency, currency, organizers } = customizeItemsData\r\n\r\n // See \"view_item\" column in spreadsheet attached to WAE1-174\r\n const items = planData.map((plan) => {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const planInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMICENTRAL, // product_name\r\n item_category: PRODUCT_FAMILY_NAME.LMICENTRAL, // product_name\r\n item_category2: plan.name, // product_id\r\n item_category3: billingFrequency, // product_period\r\n item_category4: '1', // product_duration\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`, // Product / add-on name with period\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`, // Product / add-on unique identifier, sku with period\r\n item_variant: 'Product', // Specify if it's a \"Product\" or an \"Add-on\"\r\n price: planPrice, // product_price\r\n quantity: organizers, // product_quantity\r\n }\r\n return planInfo\r\n })\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items,\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_ITEM, eventData })\r\n}\r\n\r\nexport const trackViewContent = (userData: PageViewContentData, pageName: string) => {\r\n const formName = getFormName(pageName)\r\n const contentTypeName = `/${pageName.split('/')[2]}`\r\n const eventData = {\r\n platform_environment: `${PRODUCT_FAMILY_KEY.LMICENTRAL}-${process.env.ENVIRONMENT}`,\r\n platform_product: PRODUCT_FAMILY_KEY.LMICENTRAL,\r\n platform_type: 'marketing',\r\n platform_locale: userData.locale,\r\n platform_country: userData.country,\r\n platform_language: userData.language,\r\n section: 'web',\r\n sub_section: PRODUCT_FAMILY_KEY.LMICENTRAL,\r\n template: pageName,\r\n content_type: `${pageName}-${contentType[contentTypeName]}`,\r\n page_type: pageName,\r\n content_number: 1,\r\n login_status: userData.isUserLoggedIn,\r\n funnel_name: `${PRODUCT_FAMILY_KEY.LMICENTRAL}:marketing:${pageName}`,\r\n form_name: formName,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_CONTENT, eventData })\r\n}\r\n\r\nexport const trackSessionInfo = (sessionInfo: SessionInfo) => {\r\n const eventData = {\r\n session_last: sessionInfo.sessionLast,\r\n session_number: sessionInfo.sessionNumber,\r\n user_type: sessionInfo.userType,\r\n is_logged_in: sessionInfo.isUserLoggedIn,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.SESSION_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackBeginCheckout = (productData: LmiCentralCartData, currentStep: number) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n step: currentStep,\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData })\r\n // if user navigates directly to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 0 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user navigates from customize page (step 1) to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 1 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user starts off in customize page, do not set previouse cart data yet, as it remains undefined\r\n if (previousTrackData.step !== 0) {\r\n setPreviousCart(productData)\r\n }\r\n setPreviousStep(currentStep)\r\n\r\n if (currentStep === 2 && productData.isExistingUser) {\r\n trackBeginCheckout(productData, 3)\r\n trackBeginCheckout(productData, 4)\r\n }\r\n}\r\n\r\nexport const trackPurchase = (productData: LmiCentralCartData, purchaseData: LmiCentralPurchaseData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const buyType = getBuyType(purchaseData.userType)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems.map((item) => ({\r\n ...item,\r\n buy_type: buyType,\r\n })),\r\n },\r\n actionField: {\r\n transaction_id: purchaseData.transactionID,\r\n coupon: productData.couponCode || undefined,\r\n tax: purchaseData.calculatedTax,\r\n revenue: purchaseData.calculatedNetTotal,\r\n },\r\n plan: productData.billingFrequency,\r\n buy_type: buyType,\r\n conversion_type: 'purchase',\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.PURCHASE, eventData })\r\n}\r\n\r\nexport const trackPurchaseError = (errorMessage: string, plan: string, buyType: string) => {\r\n const eventData = {\r\n plan, // 'annual' or 'monthly'\r\n buy_type: buyType, // 'add-on' or 'direct buy'\r\n conversion_type: 'purchase', // static value, case-sensitive\r\n error_purchase_message: errorMessage,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_PURCHASE, eventData })\r\n}\r\n\r\nexport const trackCompleteBuy = (userType: string, userEmail: string, productData: LmiCentralCartData) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.LMICENTRAL,\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n conversion_type: 'purchase',\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData })\r\n}\r\n\r\nexport const trackFormError = (formIds: string[], formErrors: string[], pageName: string) => {\r\n const eventData = {\r\n form_error_id: formIds.toString(),\r\n form_error_message: formErrors.toString(),\r\n form_name: getFormName(pageName),\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_FORM, eventData })\r\n}\r\n\r\nexport const trackUserInformation = (userType: string, userEmail: string, productData: LmiCentralCartData) => {\r\n const eventData = {\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.USER_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackEmailValidation = (formName: string, userEmail: string) => {\r\n const eventData = {\r\n form_name: formName,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.EMAIL_VALIDATION, eventData })\r\n}\r\n\r\nexport const trackLogin = (userEmail: string) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.LMICENTRAL,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.LOGIN, eventData })\r\n}\r\n\r\nexport const trackAbandonForm = () => {\r\n const eventData = {\r\n form_name: LMICENTRAL_TRACKING_COMPONENTS.CHECKOUT_PAGE,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ABANDON_FORM, eventData })\r\n}\r\n","import { LmiCentralErrorContent } from '@lmicentral/state/checkout-form-container/state'\r\nimport * as Yup from 'yup'\r\nimport zxcvbn from 'zxcvbn'\r\nimport { parse } from 'date-fns/parse'\r\nimport { isDate } from 'date-fns/isDate'\r\nimport { isValidPostalCode } from '@common/utils/isValidPostalCode'\r\n\r\nconst isValidDate = (date: string | Date) => {\r\n return date instanceof Date && !Number.isNaN(date.getTime())\r\n}\r\n\r\nconst emailValidation = (errorInvalidEmail: string, errorRequiredEmail?: string) => {\r\n return Yup.string()\r\n .required(errorRequiredEmail || errorInvalidEmail)\r\n .min(2, errorInvalidEmail)\r\n .email(errorInvalidEmail)\r\n .matches(\r\n new RegExp(\r\n \"^((?!(.+\\\\.\\\\.+))(?!(.+\\\\.@+))(?!(^\\\\.))([a-zA-Z_0-9-+!#\\\\$\\\\.\\\\*\\\\^']{1,63}))@((?:[a-zA-Z_0-9-]+\\\\.)*[a-zA-Z_0-9][a-zA-Z_0-9-]*)\\\\.([a-z]{2,})$\"\r\n ),\r\n errorInvalidEmail\r\n )\r\n}\r\n\r\nconst nameValidation = (requiredErrorMessage: string, invalidCharacterErrorMessage: string) => {\r\n return (\r\n Yup.string()\r\n .required(requiredErrorMessage)\r\n .min(2, requiredErrorMessage)\r\n // a to z, latin characters from dec 192 t0 214, 216 to 246 and 248 to 255,\r\n // https://blog.robertelder.org/character-ranges-class-negation-regular-expressions/\r\n // eslint-disable-next-line\r\n .matches(new RegExp(/^[\\p{L}0-9 !,()&.?‘'\\-+\\/]*$/gu), invalidCharacterErrorMessage)\r\n )\r\n}\r\n\r\nexport const passwordValidation = () => {\r\n return Yup.string()\r\n .required()\r\n .test((pw) => zxcvbn(pw).score >= 3)\r\n}\r\n\r\nconst addressValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst countryValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst zipcodeValidation = (country: string, errorRequiredPostalCode: string, errorInvalidPostalCode: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPostalCode)\r\n .min(3, errorInvalidPostalCode)\r\n .max(12, errorInvalidPostalCode)\r\n .test('ZipCodeRegEx', errorInvalidPostalCode, (value) => isValidPostalCode(country, value as string))\r\n}\r\n\r\nconst contactPhoneValidation = (errorInvalidCharacter: string, errorRequiredPhoneNumber: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPhoneNumber)\r\n .matches(new RegExp('^(?=(?:\\\\D*\\\\d){6}).*$'), errorInvalidCharacter)\r\n}\r\n\r\nconst expDateValidation = (errorInvalidExpirationDate: string, errorRequiredExpDate: string) => {\r\n const lastMonthDate = new Date()\r\n lastMonthDate.setMonth(lastMonthDate.getMonth() - 1)\r\n\r\n const parseDateString = (_value: string, originalValue: string) => {\r\n const parsedDate = isDate(originalValue) ? originalValue : parse(originalValue, 'MM/yy', new Date())\r\n const expiredMonthDate = new Date()\r\n expiredMonthDate.setMonth(expiredMonthDate.getMonth() - 2)\r\n return isValidDate(parsedDate) ? parsedDate : expiredMonthDate\r\n }\r\n return Yup.date()\r\n .required(errorRequiredExpDate)\r\n .min(lastMonthDate, errorInvalidExpirationDate)\r\n .transform(parseDateString)\r\n}\r\n\r\nconst taxNumberValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nexport const CheckoutSchema = (country: string, errorContent: LmiCentralErrorContent) => {\r\n const {\r\n errorInvalidPhoneNumber,\r\n errorInvalidCharacter,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorRequiredCountry,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorRequiredTaxNumber,\r\n } = errorContent\r\n\r\n return Yup.object().shape({\r\n Email: emailValidation(errorInvalidEmail, errorRequiredEmail),\r\n FirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n LastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Password: passwordValidation(),\r\n BillingFirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n BillingLastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Street1: addressValidation(errorRequiredAddress),\r\n City: addressValidation(errorRequiredCity),\r\n CountryCode: countryValidation(errorRequiredCountry),\r\n StateCode: addressValidation(errorRequiredState),\r\n ZipCode: zipcodeValidation(country, errorRequiredPostalCode, errorInvalidPostalCode),\r\n ContactPhone: contactPhoneValidation(errorInvalidPhoneNumber, errorRequiredPhoneNumber),\r\n ExpirationDate: expDateValidation(errorInvalidExpirationDate, errorRequiredExpDate),\r\n TaxNumber: taxNumberValidation(errorRequiredTaxNumber),\r\n TaxType: Yup.string(),\r\n CompanyName: Yup.string(),\r\n })\r\n}\r\n\r\nexport const checkAlphaNumerical = (value: string) => {\r\n return !!value.match(/^[A-Za-zÀ-ÖØ-öø-ÿ0-9]+$/) || value === ''\r\n}\r\n","import {\r\n BillingPeriod,\r\n CURRENCY,\r\n TimePeriod,\r\n COUPON_DISCOUNT_TYPE,\r\n COUPON_PAYMENT_PLAN,\r\n COUPON_TYPE,\r\n} from '@common/constants'\r\n\r\nimport { CouponItem, CouponServerData } from '@common/state/coupon/state'\r\n\r\nimport {\r\n LmiCentralCheckCouponProductsValidityParameters,\r\n LmiCentralCouponProcessedDataPerSku,\r\n LmiCentralCouponSkuValidity,\r\n LmiCentralCouponState,\r\n} from '@lmicentral/state/coupon/state'\r\n\r\nimport {\r\n LmiCentralCouponCalculation,\r\n GetLmiCentralProductItemsParameters,\r\n LmiCentralProcessCouponDataParameters,\r\n LmiCentralProductDetails,\r\n} from '@lmicentral/state/coupon-util'\r\n\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { ADDONS, PRODUCT_PRICE_ITEM_TYPE } from '@lmicentral/constants'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralProductPriceItem } from '@lmicentral/state/calculate-price'\r\n\r\nexport const getActiveCouponServerData = (coupon: LmiCentralCouponState, selectedPlan: LmiCentralPlan) => {\r\n const { couponServerData, isUrlCouponActive, isCMSCouponActive } = coupon\r\n if (isUrlCouponActive) {\r\n return couponServerData\r\n }\r\n if (isCMSCouponActive && !isEmpty(selectedPlan?.activeCoupon)) {\r\n return selectedPlan.activeCoupon\r\n }\r\n return null\r\n}\r\n\r\nexport const getAvailableCouponServerData = (\r\n coupon: LmiCentralCouponState,\r\n selectedPlan: LmiCentralPlan\r\n): [CouponServerData | null, boolean] => {\r\n const { couponServerData, isUrlCouponCodeAvailable } = coupon\r\n if (!isEmpty(couponServerData) && isUrlCouponCodeAvailable) {\r\n return [couponServerData, true]\r\n }\r\n if (!isEmpty(selectedPlan?.activeCoupon)) {\r\n return [selectedPlan.activeCoupon, false]\r\n }\r\n return [null, false]\r\n}\r\n\r\nexport const isCouponDateValid = (start: string, end: string): boolean => {\r\n const startDate = new Date(start)\r\n const endDate = new Date(end)\r\n const currentDate = new Date()\r\n const currentDatems = currentDate.getTime()\r\n return currentDatems >= startDate.getTime() && currentDatems <= endDate.getTime()\r\n}\r\n\r\ninterface IsProductSkuAndPaymentPlanValidParameters {\r\n selectedProductSku: string\r\n couponValidationItemsMap: Map\r\n isAnnual: boolean\r\n}\r\ninterface CouponValidationItem {\r\n paymentPlan: Set\r\n}\r\n\r\nconst isProductSkuAndPaymentPlanValid = ({\r\n selectedProductSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n}: IsProductSkuAndPaymentPlanValidParameters): boolean => {\r\n const toCheckPaymentPlan = isAnnual ? COUPON_PAYMENT_PLAN.UPFRONTANNUAL : COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n if (couponValidationItemsMap.has(selectedProductSku)) {\r\n const { paymentPlan } = couponValidationItemsMap.get(selectedProductSku) as CouponValidationItem\r\n return paymentPlan.has(toCheckPaymentPlan)\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport const checkCouponGenericValidity = (couponServerData: CouponServerData): boolean => {\r\n const { isCouponValid, validFrom, validTo } = couponServerData\r\n return isCouponValid && isCouponDateValid(validFrom, validTo)\r\n}\r\n\r\nexport const processFixTypeCouponValidity = (\r\n couponSkuValidity: LmiCentralCouponSkuValidity\r\n): LmiCentralCouponSkuValidity => {\r\n const fixCouponSkuValidity = { ...couponSkuValidity }\r\n const isAnyCouponSkuInvalid = Object.keys(couponSkuValidity).some(\r\n (couponSku) => couponSkuValidity[couponSku] === false\r\n )\r\n if (isAnyCouponSkuInvalid) {\r\n Object.keys(fixCouponSkuValidity).forEach((couponSku) => {\r\n fixCouponSkuValidity[couponSku] = false\r\n })\r\n }\r\n return fixCouponSkuValidity\r\n}\r\n\r\n// temporary code for default coupon Sku validity\r\nexport const falsyCouponSkuValidity = (couponSkuValidity: LmiCentralCouponSkuValidity): LmiCentralCouponSkuValidity => {\r\n return Object.keys(couponSkuValidity).reduce((skuAcc, currentSku) => {\r\n return { ...skuAcc, [currentSku]: false }\r\n }, {} as LmiCentralCouponSkuValidity)\r\n}\r\n\r\nexport const getCouponValidationItemsMap = (couponItems: CouponItem[]): Map => {\r\n const couponValidationItemsMap = new Map()\r\n couponItems.forEach((couponItem) => {\r\n const { productSku, paymentPlan } = couponItem\r\n if (!couponValidationItemsMap.has(productSku)) {\r\n const couponValidationItem: CouponValidationItem = { paymentPlan: new Set() }\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n }\r\n const couponValidationItem = couponValidationItemsMap.get(productSku) as CouponValidationItem\r\n couponValidationItem.paymentPlan.add(paymentPlan)\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n })\r\n return couponValidationItemsMap\r\n}\r\n\r\nexport const checkCouponProductsValidity = ({\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n}: LmiCentralCheckCouponProductsValidityParameters): LmiCentralCouponSkuValidity => {\r\n const { couponType, couponItems } = couponServerData\r\n const couponValidationItemsMap = getCouponValidationItemsMap(couponItems)\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const addonsValidity = selectedAddons.reduce((acc, selectedAddon) => {\r\n return {\r\n ...acc,\r\n [selectedAddon.sKU]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedAddon.sKU,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n }, {})\r\n const couponSkuValidity: LmiCentralCouponSkuValidity = {\r\n ...addonsValidity,\r\n [selectedPlanSku]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedPlanSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n // need to add the fixed coupon processing here later\r\n return couponType === COUPON_TYPE.FLEXIBLE ? couponSkuValidity : falsyCouponSkuValidity(couponSkuValidity)\r\n}\r\n\r\nexport const checkIfCouponAppliedToMinimumSelectedProducts = (\r\n couponSkuValidity: LmiCentralCouponSkuValidity\r\n): boolean => {\r\n return Object.values(couponSkuValidity).some((productValidity) => productValidity === true)\r\n}\r\n\r\nexport const calculateCouponDiscount = (\r\n couponDiscountType: COUPON_DISCOUNT_TYPE,\r\n productUnitPriceForCurrentTierWithBillingFrequency: number,\r\n couponDiscountAmount: number,\r\n productUnitPriceForBaseTierWithBillingFrequency: number\r\n): LmiCentralCouponCalculation | null => {\r\n switch (couponDiscountType) {\r\n case COUPON_DISCOUNT_TYPE.AMOUNTOFF: {\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponDiscountAmount / productUnitPriceForCurrentTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n discountPercentage,\r\n couponAmountOff: couponDiscountAmount,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.PERCENTAGEOFF: {\r\n const couponAmountOff = (productUnitPriceForCurrentTierWithBillingFrequency * couponDiscountAmount) / 100\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponAmountOff\r\n return {\r\n discountPercentage: couponDiscountAmount,\r\n discountUnitPrice,\r\n couponAmountOff,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.REPRICE: {\r\n const discountUnitPrice =\r\n couponDiscountAmount < productUnitPriceForCurrentTierWithBillingFrequency ? couponDiscountAmount : 0\r\n if (discountUnitPrice === 0) {\r\n return null\r\n }\r\n const couponAmountOff = productUnitPriceForBaseTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponAmountOff / productUnitPriceForBaseTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n couponAmountOff,\r\n discountPercentage,\r\n }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport const getProductItemsMap = ({\r\n billingFrequency,\r\n organizers,\r\n selectedPlan,\r\n selectedCurrency = CURRENCY.USD,\r\n selectedAddons,\r\n selectedTierIndex,\r\n}: GetLmiCentralProductItemsParameters): Map => {\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const productItemsMap: Map = new Map()\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const selectedPlanUnitPriceForCurrentTier =\r\n get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'price'],\r\n 0\r\n ) *\r\n get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'min'],\r\n 0\r\n )\r\n\r\n const selectedPlanUnitPriceForBaseTier =\r\n get(selectedPlan, ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'price'], 0) *\r\n get(selectedPlan, ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'min'], 0)\r\n\r\n const annualMultiplier = isAnnual ? 12 : 1\r\n const selectedPlanProductDetails: LmiCentralProductDetails = {\r\n quantity: organizers,\r\n unitPriceForCurrentTierWithBillingFrequency: selectedPlanUnitPriceForCurrentTier * annualMultiplier,\r\n unitPriceForBaseTierWithBillingFrequency: selectedPlanUnitPriceForBaseTier * annualMultiplier,\r\n }\r\n productItemsMap.set(selectedPlan.sKU, selectedPlanProductDetails)\r\n\r\n selectedAddons.forEach((addon) => {\r\n const { sKU, quantity } = addon\r\n const planAddons = selectedPlan.addons\r\n const filteredPlanAddons = planAddons.filter((planAddon) => planAddon.sKU === sKU)\r\n const planAddon = filteredPlanAddons[0]\r\n const planAddonPrice =\r\n get(planAddon, ['pricingInfo', selectedCurrency, 'price'], 0) *\r\n get(planAddon, ['pricingInfo', selectedCurrency, 'min'], 0)\r\n const completePlanAddonPrice = planAddonPrice * annualMultiplier\r\n productItemsMap.set(sKU, {\r\n quantity,\r\n unitPriceForCurrentTierWithBillingFrequency: completePlanAddonPrice,\r\n unitPriceForBaseTierWithBillingFrequency: completePlanAddonPrice,\r\n })\r\n })\r\n return productItemsMap\r\n}\r\n\r\nexport const getCouponItemPriceMap = (\r\n couponServerData: CouponServerData,\r\n selectedCurrency: CURRENCY = CURRENCY.USD,\r\n isAnnual: boolean\r\n): Map => {\r\n const { couponItems } = couponServerData\r\n const couponItemsMap = new Map(\r\n couponItems\r\n .filter((couponItem) =>\r\n isAnnual\r\n ? couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL\r\n : couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n )\r\n .map((couponItem) => {\r\n const { productSku, priceChanges } = couponItem\r\n const selectedCurrencyPriceChangeList = priceChanges.filter(\r\n (price) => price.currency === selectedCurrency\r\n )\r\n const selectedCurrencyPriceChange = selectedCurrencyPriceChangeList[0]\r\n return [productSku, selectedCurrencyPriceChange.value]\r\n })\r\n )\r\n return couponItemsMap\r\n}\r\n\r\nexport const processCouponData = ({\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n}: LmiCentralProcessCouponDataParameters): LmiCentralCouponProcessedDataPerSku | null => {\r\n const productItemsEntries = [...productItemsMap.entries()]\r\n const couponDataPerSku: LmiCentralCouponProcessedDataPerSku = {}\r\n\r\n productItemsEntries.forEach(([productSku, productDetail]) => {\r\n if (couponSkuValidity[productSku] && couponItemsMap.has(productSku)) {\r\n const { unitPriceForBaseTierWithBillingFrequency, unitPriceForCurrentTierWithBillingFrequency } =\r\n productDetail\r\n const couponDiscountAmount = couponItemsMap.get(productSku) as number\r\n const calculatedCouponDiscount = calculateCouponDiscount(\r\n couponDiscountType,\r\n unitPriceForCurrentTierWithBillingFrequency,\r\n couponDiscountAmount,\r\n unitPriceForBaseTierWithBillingFrequency\r\n )\r\n if (calculatedCouponDiscount === null || calculatedCouponDiscount.discountUnitPrice <= 0) {\r\n couponDataPerSku[productSku] = null\r\n } else {\r\n const { discountUnitPrice, couponAmountOff, discountPercentage } = calculatedCouponDiscount\r\n couponDataPerSku[productSku] = {\r\n discountPercentage,\r\n discountUnitPrice,\r\n discountUnitSavings: couponAmountOff,\r\n discountTotalPrice: discountUnitPrice,\r\n discountTotalSavings: couponAmountOff,\r\n }\r\n }\r\n } else {\r\n couponDataPerSku[productSku] = null\r\n }\r\n })\r\n return isEmpty(couponDataPerSku) ? null : couponDataPerSku\r\n}\r\n\r\nexport const getCouponDoubleDipAmountForNewUser = (productPrices: LmiCentralProductPriceItem[]): number => {\r\n const couponDoubleDipAmount = productPrices.reduce((total, currentProductPrice) => {\r\n const { productSKU, type } = currentProductPrice\r\n if (type === PRODUCT_PRICE_ITEM_TYPE.product && productSKU === ADDONS.ADDITIONAL_NUMBERS) {\r\n return total + get(currentProductPrice, ['couponDiscount', 'amount'], 0)\r\n }\r\n return total\r\n }, 0)\r\n return couponDoubleDipAmount\r\n}\r\n\r\nexport const calculateCouponPrice = (type: string, originalPrice: number, value: number, isAnnual: boolean) => {\r\n if (type === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n return originalPrice * ((100 - value) / 100)\r\n }\r\n if (type === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n const localValue = isAnnual ? value / 12 : value\r\n const amountOff = originalPrice - localValue\r\n if (amountOff > 0) {\r\n return amountOff\r\n }\r\n return originalPrice\r\n }\r\n return isAnnual ? value / 12 : value\r\n}\r\n\r\nexport interface LmiCentralCouponPrices {\r\n couponAnnualPrice: number\r\n couponMonthlyPrice: number\r\n}\r\n\r\nexport const getCouponPrices = (\r\n plan: LmiCentralPlan,\r\n bossMonthlyPrice: number,\r\n bossAnnualPrice: number,\r\n couponState: LmiCentralCouponState\r\n): LmiCentralCouponPrices => {\r\n let couponMonthlyPrice = bossMonthlyPrice\r\n let couponAnnualPrice = bossAnnualPrice\r\n const couponData = getActiveCouponServerData(couponState, plan)\r\n const activeCoupon = couponData || plan.activeCoupon\r\n if (activeCoupon && activeCoupon.isCouponValid && activeCoupon.couponType !== COUPON_TYPE.FIX) {\r\n const thisPlansCoupons: CouponItem[] = activeCoupon.couponItems.filter(\r\n (planCoupon: CouponItem) => planCoupon.productSku === plan.sKU\r\n )\r\n thisPlansCoupons.forEach((thisCoupon) => {\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY) {\r\n couponMonthlyPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossMonthlyPrice,\r\n thisCoupon.priceChanges[0].value,\r\n false\r\n )\r\n }\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL) {\r\n couponAnnualPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossAnnualPrice,\r\n thisCoupon.priceChanges[0].value,\r\n true\r\n )\r\n }\r\n })\r\n }\r\n return { couponAnnualPrice, couponMonthlyPrice }\r\n}\r\n","import { LmiCentralBuyFormData } from '@lmicentral/state/buy-form/state'\r\nimport { isEmpty, isEqual } from 'lodash-es'\r\n\r\nlet previousFormValues: LmiCentralBuyFormData\r\n\r\nexport const isValidationAddressEligible = (formValues: LmiCentralBuyFormData): boolean => {\r\n if (\r\n isEmpty(formValues.FirstName.trim()) ||\r\n isEmpty(formValues.LastName.trim()) ||\r\n isEmpty(formValues.Email.trim()) ||\r\n isEmpty(formValues.BillingFirstName.trim()) ||\r\n isEmpty(formValues.BillingLastName.trim())\r\n ) {\r\n return false\r\n }\r\n\r\n const hasFormValuesChanged = !isEqual(previousFormValues, formValues)\r\n previousFormValues = formValues\r\n return hasFormValuesChanged\r\n}\r\n\r\nexport const isAddressComplete = (\r\n formValues: LmiCentralBuyFormData,\r\n isStatesOptional?: boolean,\r\n isTaxRequired?: boolean\r\n): boolean => {\r\n if (\r\n isEmpty(formValues.CountryCode.trim()) ||\r\n isEmpty(formValues.City.trim()) ||\r\n isEmpty(formValues.Street1.trim()) ||\r\n (!isStatesOptional && isEmpty(formValues.StateCode.trim())) ||\r\n (isTaxRequired && !formValues.TaxNumber) ||\r\n isEmpty(formValues.ZipCode.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n","import { isEmpty, get } from 'lodash-es'\r\nimport { formatDate } from '@common/utils'\r\nimport { LmiCentralAddon, LmiCentralSelectedAddon } from '@lmicentral/state/add-on'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { PRODUCT_PRICE_ITEM_TYPE } from '@lmicentral/constants'\r\nimport { LmiCentralCouponProcessedDataPerSku } from '@lmicentral/state/coupon/state'\r\nimport { getAddonVolumeDiscount } from '@lmicentral/utils/calculate-volume-discount'\r\nimport { LmiCentralProductPriceItem } from '@lmicentral/state/calculate-price'\r\n\r\nexport const getAddonPrice = (addon: LmiCentralAddon, annual: boolean, currency: string, currentTier: string) => {\r\n const price: number =\r\n get(addon, ['pricingInfo', currency, annual ? 'annual' : 'monthly', currentTier, 'price'], 0) *\r\n get(addon, ['pricingInfo', currency, annual ? 'annual' : 'monthly', currentTier, 'min'], 0)\r\n\r\n return annual ? price * 12 : price\r\n}\r\n\r\nexport const calculateTotalPriceWithAddons = (\r\n calculatedPrice: number,\r\n selectedAddons: (LmiCentralSelectedAddon | null)[],\r\n selectedPlan: LmiCentralPlan,\r\n isAnnual: boolean,\r\n currency: string,\r\n currentTier: string\r\n) => {\r\n let total = calculatedPrice\r\n selectedAddons.forEach((addon) => {\r\n if (addon) {\r\n const currAddon = selectedPlan.addons.find((x) => x.sKU === addon.sKU)\r\n\r\n if (currAddon) {\r\n const { discountPrice } = getAddonVolumeDiscount(\r\n currAddon,\r\n addon.quantity * 25,\r\n currency,\r\n isAnnual ? 'annual' : 'monthly',\r\n currentTier\r\n )\r\n total += getAddonPrice(currAddon, isAnnual, currency, currentTier)\r\n if (addon.quantity > 5) {\r\n total -= discountPrice\r\n }\r\n }\r\n }\r\n })\r\n return total\r\n}\r\n\r\nexport const formattedEndDate = (isAnnual: boolean, locale: string) => {\r\n const date = new Date()\r\n if (isAnnual) {\r\n date.setFullYear(date.getFullYear() + 1)\r\n } else {\r\n date.setMonth(date.getMonth() + 1)\r\n }\r\n\r\n const formattedExpDate = formatDate(date, 'UTC', locale)\r\n\r\n return formattedExpDate\r\n}\r\n\r\nexport const getFeesFromProductPrice = (productPrices: LmiCentralProductPriceItem[] | undefined): number => {\r\n let feeAmount = 0\r\n if (productPrices && !isEmpty(productPrices)) {\r\n const [feePriceItem] = productPrices.filter(\r\n (productPriceItem) => productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.fee\r\n )\r\n feeAmount = feePriceItem && !isEmpty(feePriceItem) ? feePriceItem.listPrice : 0\r\n }\r\n return feeAmount\r\n}\r\n// renewal billing amount is the sum of ((unitprice-proratedamount) of plan * organizers + (unirprice-proratedamount) of addon * number of selected addons)\r\nexport const getRenewalAmountForAddonUser = (\r\n productPrices: LmiCentralProductPriceItem[] | undefined,\r\n organizers: number,\r\n selectedAddons: LmiCentralAddon[]\r\n): number => {\r\n let renewalAmount = 0\r\n const selectedAddonQuantityMap = new Map(selectedAddons.map((addon) => [addon.sKU, addon.quantity]))\r\n if (productPrices && !isEmpty(productPrices)) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product) {\r\n if (productPriceItem.itemId === 0) {\r\n renewalAmount += (productPriceItem.unitPrice - productPriceItem.proratedAmount) * organizers\r\n } else {\r\n const { productSKU } = productPriceItem\r\n renewalAmount +=\r\n (productPriceItem.unitPrice - productPriceItem.proratedAmount) *\r\n (selectedAddonQuantityMap.get(productSKU) || 0)\r\n }\r\n }\r\n })\r\n }\r\n return renewalAmount\r\n}\r\n\r\nexport const getCouponTotalSavings = (\r\n isCouponAppliedToPlan: boolean,\r\n couponProcessedDataPerSku: LmiCentralCouponProcessedDataPerSku | null,\r\n couponDoubleDipAmountForNewUser: number\r\n): number => {\r\n if (couponProcessedDataPerSku && isCouponAppliedToPlan) {\r\n const totalCouponSavings = Object.keys(couponProcessedDataPerSku).reduce((total, productSku) => {\r\n const productCouponData = couponProcessedDataPerSku[productSku]\r\n if (productCouponData && !isEmpty(productCouponData)) {\r\n return total + productCouponData.discountTotalSavings\r\n }\r\n return total\r\n }, 0)\r\n return totalCouponSavings + couponDoubleDipAmountForNewUser\r\n }\r\n return couponDoubleDipAmountForNewUser\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { LmiCentralSavedSessionState } from '@lmicentral/state/checkout/state'\r\n\r\nexport const loadSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n if (serializedState === null && language === null) {\r\n return undefined\r\n }\r\n\r\n return {\r\n ...(serializedState && { coupon: JSON.parse(serializedState) }),\r\n ...(language && { language: JSON.parse(language) }),\r\n } as LmiCentralSavedSessionState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveSessionState = (state: LmiCentralSavedSessionState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n sessionStorage.setItem(STORAGE_CONST.GTC_COUPON_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearSessionState = () => {\r\n try {\r\n const coupon = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n\r\n if (coupon) sessionStorage.removeItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n if (language) sessionStorage.removeItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { LmiCentralSavedStoreState } from '@lmicentral/state/checkout/state'\r\n\r\nexport const loadState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.LMICENTRAL_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as LmiCentralSavedStoreState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveState = (state: LmiCentralSavedStoreState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n localStorage.setItem(STORAGE_CONST.LMICENTRAL_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.LMICENTRAL_STORE)\r\n\r\n if (serializedState) localStorage.removeItem(STORAGE_CONST.LMICENTRAL_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const manuallyValidateFieldData = (fieldData: FieldProps) => {\r\n return (\r\n (!fieldData.meta.error && fieldData.meta.touched) ||\r\n (fieldData.meta.initialValue !== '' && !fieldData.meta.error)\r\n )\r\n}\r\n\r\nexport const scrollToError = () => {\r\n const top =\r\n document.getElementsByClassName('input__error')[0] ||\r\n document.getElementsByClassName('input-module__error')[0] ||\r\n document.getElementsByClassName('flex-field__flex-field--error')[0]\r\n if (top) {\r\n top.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\r\n }\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralPrice, LmiCentralPricing, LmiCentralTiers } from '@lmicentral/state/price'\r\n\r\nconst tierMap = new Map()\r\n\r\nexport const getSelectedTierIndex = (\r\n currentOrganizers: number,\r\n billingFrequency: string,\r\n selectedPlan: LmiCentralPlan,\r\n currency: CURRENCY\r\n) => {\r\n const { sKU = '', pricingInfo } = selectedPlan ?? {}\r\n const identifier = `${sKU}-${currency}-${billingFrequency}-${currentOrganizers}`\r\n if (!tierMap.get(identifier)) {\r\n const currencyPricing = (pricingInfo?.[currency as keyof LmiCentralPrice] as LmiCentralPricing) ?? []\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const billingFrequencyTier = currencyPricing[billingFrequencyKey as keyof LmiCentralPricing] ?? []\r\n\r\n const billingFrequencyTierKeys = Object.keys(billingFrequencyTier)\r\n\r\n billingFrequencyTierKeys.some((tierName, index) => {\r\n const tierData = billingFrequencyTier[tierName as keyof LmiCentralTiers]\r\n if (currentOrganizers * 25 >= tierData.min && currentOrganizers * 25 <= tierData.max) {\r\n tierMap.set(identifier, index)\r\n return true\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return tierMap.get(identifier) as number\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@lmicentral/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\n\r\ninterface PlanSubscriptions {\r\n basic?: BillingDetailedSubscriptionPlan\r\n standard?: BillingDetailedSubscriptionPlan\r\n trial?: BillingDetailedSubscriptionPlan\r\n}\r\n\r\n// get the remaining days + 1 so that today is included\r\nconst getRemainingDays = (end: string) => {\r\n const today = new Date().setHours(0, 0, 0, 0)\r\n const lastday = +new Date(end)\r\n\r\n return Math.floor((lastday - today) / (1000 * 60 * 60 * 24)) + 1\r\n}\r\n\r\nexport interface SubscriptionInfo {\r\n plan?: BillingDetailedSubscriptionPlan\r\n addons: BillingDetailedSubscriptionPlan[]\r\n includedAgents: number\r\n includedEndpoints: number\r\n remainingDays: number\r\n canUpgradePlan: boolean\r\n canUpgradeCameraShare: boolean\r\n canUpgradeEndpointProtection: boolean\r\n canUpgradeMobile: boolean\r\n isReplacementBooking: boolean\r\n billingFrequency: TimePeriod\r\n isTrial: boolean\r\n}\r\n\r\nexport const getSubscriptionInfo = (\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiCentralPlan,\r\n plans: LmiCentralPlan[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n const planSubscriptions: PlanSubscriptions = {}\r\n const subscriptionInfo: SubscriptionInfo = {\r\n addons: [],\r\n includedAgents: 0,\r\n includedEndpoints: 0,\r\n remainingDays: 0,\r\n canUpgradePlan: true,\r\n canUpgradeCameraShare: true,\r\n canUpgradeEndpointProtection: true,\r\n canUpgradeMobile: true,\r\n isReplacementBooking: true,\r\n billingFrequency,\r\n isTrial: false,\r\n }\r\n\r\n if (!selectedPlan) {\r\n return subscriptionInfo\r\n }\r\n\r\n subscriptionInfo.includedAgents = selectedPlan.userAgentsIncludedAmount\r\n subscriptionInfo.includedEndpoints = selectedPlan.endpointsIncludedAmount\r\n\r\n if (!accountSubscriptions) {\r\n return subscriptionInfo\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAME:\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2:\r\n planSubscriptions.standard = subscription\r\n break\r\n\r\n case PRODUCT_SKU.LMIPRO_BASIC_NAMED:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_ACCESS:\r\n planSubscriptions.basic = subscription\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedAgents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedEndpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeMobile = false\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeCameraShare = false\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeEndpointProtection = false\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n planSubscriptions.trial = subscription\r\n }\r\n }\r\n })\r\n\r\n if (planSubscriptions.standard) {\r\n subscriptionInfo.plan = planSubscriptions.standard\r\n subscriptionInfo.canUpgradePlan = false\r\n } else if (planSubscriptions.basic) {\r\n subscriptionInfo.plan = planSubscriptions.basic\r\n } else if (planSubscriptions.trial) {\r\n subscriptionInfo.plan = planSubscriptions.trial\r\n subscriptionInfo.isTrial = true\r\n }\r\n\r\n if (subscriptionInfo.plan && !subscriptionInfo.isTrial) {\r\n const subscriptionBilling =\r\n subscriptionInfo.plan.paymentPlan === BILLING_TYPES.MONTHLY ? TimePeriod.Month : TimePeriod.Year\r\n\r\n subscriptionInfo.isReplacementBooking =\r\n subscriptionInfo.plan.productSku !== selectedPlan.sKU ||\r\n subscriptionInfo.billingFrequency !== subscriptionBilling\r\n\r\n subscriptionInfo.remainingDays = getRemainingDays(subscriptionInfo.plan.endDate)\r\n\r\n if (subscriptionInfo.plan.productSku !== selectedPlan.sKU) {\r\n const subscribedPlan = plans.find((plan) => plan.sKU === subscriptionInfo.plan?.productSku)\r\n\r\n if (subscribedPlan) {\r\n const includedAgents =\r\n subscriptionInfo.includedAgents -\r\n selectedPlan.userAgentsIncludedAmount +\r\n subscribedPlan.userAgentsIncludedAmount\r\n const includedEndpoints =\r\n subscriptionInfo.includedEndpoints -\r\n selectedPlan.endpointsIncludedAmount +\r\n subscribedPlan.endpointsIncludedAmount\r\n\r\n subscriptionInfo.includedAgents =\r\n selectedPlan.userAgentsIncludedAmount > includedAgents\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents\r\n subscriptionInfo.includedEndpoints =\r\n selectedPlan.endpointsIncludedAmount > includedEndpoints\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints\r\n }\r\n }\r\n }\r\n\r\n return subscriptionInfo\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@lmicentral/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod, FEATURE_FLAGS } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { LmiCentralSelectedAddon, LmiCentralAddon } from '@lmicentral/state/add-on'\r\n\r\nconst createAgentAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.LMICENTRAL_STANDARD_NAME || type === PRODUCT_SKU.LMICENTRAL_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_AGENT_ADDON\r\n : ADDON_SKUS.BASIC_AGENT_ADDON,\r\n\r\n quantity,\r\n})\r\n\r\nconst createEndpointAddon = (type: PRODUCT_SKU, quantity: number) => ({\r\n sKU:\r\n type === PRODUCT_SKU.LMICENTRAL_STANDARD_NAME || type === PRODUCT_SKU.LMICENTRAL_STANDARD_NAMED_V2\r\n ? ADDON_SKUS.STANDARD_ENDPOINT_ADDON\r\n : ADDON_SKUS.BASIC_ENDPOINT_ADDON,\r\n\r\n quantity: quantity / ADDONS.ENDPOINTS_ADDONS_INTERVAL,\r\n})\r\n\r\nconst createMobileAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.MOBILE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createCameraAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.CAMERA_SHARE_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createEndpointProtectionAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.ENDPOINT_PROTECTION_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createAutomationAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.AUTOMATION_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createInsightAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.INSIGHT_ADDON,\r\n quantity,\r\n})\r\n\r\nconst createSecurityAddon = (quantity: number) => ({\r\n sKU: ADDON_SKUS.SECURITY_ADDON,\r\n quantity,\r\n})\r\n\r\nconst getReplacementBookingAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedAutomationAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedInsightAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedSecurityAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - includedAgents\r\n const endpointQuantity = endpoints - includedEndpoints\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (endpointQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpointQuantity))\r\n }\r\n\r\n if (mobileAddon || subscribedMobileAddon) {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n\r\n if (cameraAddon || subscribedCameraAddon) {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n\r\n if (endpointProtectionAddon || subscribedEndpointProtectionAddon) {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n\r\n if (automationAddon || subscribedAutomationAddon) {\r\n addons.push(createAutomationAddon(agents))\r\n }\r\n\r\n if (insightAddon || subscribedInsightAddon) {\r\n addons.push(createInsightAddon(agents))\r\n }\r\n\r\n if (securityAddon || subscribedSecurityAddon) {\r\n addons.push(createSecurityAddon(agents))\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getAddons = (\r\n type: PRODUCT_SKU,\r\n agents: number,\r\n subscribedAgents: number,\r\n includedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n includedEndpoints: number,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n subscribedAutomationAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedInsightAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedSecurityAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const addons = []\r\n const agentQuantity = agents - subscribedAgents - includedAgents\r\n const endpiontQuantity = endpoints - subscribedEndpoints - includedEndpoints\r\n\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointAddon(type, endpiontQuantity))\r\n }\r\n\r\n if (agentQuantity > 0) {\r\n addons.push(createAgentAddon(type, agentQuantity))\r\n }\r\n\r\n if (mobileAddon) {\r\n if (subscribedMobileAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createMobileAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createMobileAddon(agents))\r\n }\r\n }\r\n\r\n if (automationAddon) {\r\n if (subscribedAutomationAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createAutomationAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createAutomationAddon(agents))\r\n }\r\n }\r\n\r\n if (insightAddon) {\r\n if (subscribedInsightAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createInsightAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createInsightAddon(agents))\r\n }\r\n }\r\n\r\n if (securityAddon) {\r\n if (subscribedSecurityAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createSecurityAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createSecurityAddon(agents))\r\n }\r\n }\r\n\r\n if (cameraAddon) {\r\n if (subscribedCameraAddon) {\r\n if (agentQuantity > 0) {\r\n addons.push(createCameraAddon(agentQuantity))\r\n }\r\n } else {\r\n addons.push(createCameraAddon(agents))\r\n }\r\n }\r\n\r\n if (endpointProtectionAddon) {\r\n if (subscribedEndpointProtectionAddon) {\r\n if (endpiontQuantity > 0) {\r\n addons.push(createEndpointProtectionAddon(endpiontQuantity))\r\n }\r\n } else {\r\n addons.push(createEndpointProtectionAddon(endpoints))\r\n }\r\n }\r\n\r\n return addons\r\n}\r\n\r\nconst getExtraAddons = (\r\n selectedPlan: LmiCentralPlan,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedAutomationAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedInsightAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedSecurityAddon?: BillingDetailedSubscriptionPlan\r\n) => {\r\n const extraMobileAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.MOBILE_ADDON)\r\n const extraCameraAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.CAMERA_SHARE_ADDON)\r\n const extraEndpointProtectionAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON)\r\n const extraAutomationAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.AUTOMATION_ADDON)\r\n const extraInsightAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.INSIGHT_ADDON)\r\n const extraSecurityAddon = selectedPlan.addons.find((a) => a.sKU === ADDONS.SECURITY_ADDON)\r\n\r\n const extraAddons = []\r\n\r\n if (subscribedMobileAddon && extraMobileAddon) {\r\n extraAddons.push(extraMobileAddon)\r\n } else if (mobileAddon) {\r\n extraAddons.push(mobileAddon)\r\n }\r\n\r\n if (subscribedCameraAddon && extraCameraAddon) {\r\n extraAddons.push(extraCameraAddon)\r\n } else if (cameraAddon) {\r\n extraAddons.push(cameraAddon)\r\n }\r\n\r\n if (subscribedEndpointProtectionAddon && extraEndpointProtectionAddon) {\r\n extraAddons.push(extraEndpointProtectionAddon)\r\n } else if (endpointProtectionAddon) {\r\n extraAddons.push(endpointProtectionAddon)\r\n }\r\n\r\n if (subscribedAutomationAddon && extraAutomationAddon) {\r\n extraAddons.push(extraAutomationAddon)\r\n } else if (automationAddon) {\r\n extraAddons.push(automationAddon)\r\n }\r\n\r\n if (subscribedInsightAddon && extraInsightAddon) {\r\n extraAddons.push(extraInsightAddon)\r\n } else if (insightAddon) {\r\n extraAddons.push(insightAddon)\r\n }\r\n\r\n if (subscribedSecurityAddon && extraSecurityAddon) {\r\n extraAddons.push(extraSecurityAddon)\r\n } else if (securityAddon) {\r\n extraAddons.push(securityAddon)\r\n }\r\n\r\n return extraAddons\r\n}\r\n\r\nconst subscribedStandardPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiCentralPlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n subscribedAutomationAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedInsightAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedSecurityAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n useLmiCentralNewSkus?: boolean\r\n) => {\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount + subscribedAgents,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount + subscribedEndpoints,\r\n addons: [] as LmiCentralSelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon,\r\n subscribedAutomationAddon,\r\n subscribedInsightAddon,\r\n subscribedSecurityAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: false,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeAutomationAddon: !subscribedAutomationAddon,\r\n canUpgradeInsightAddon: !subscribedInsightAddon,\r\n canUpgradeSecurityAddon: !subscribedSecurityAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) {\r\n cart.addons = getAddons(\r\n useLmiCentralNewSkus ? PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2 : PRODUCT_SKU.LMIPRO_STANDARD_NAME,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n endpointProtectionAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon,\r\n subscribedAutomationAddon,\r\n subscribedInsightAddon,\r\n subscribedSecurityAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n useLmiCentralNewSkus ? PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2 : PRODUCT_SKU.LMIPRO_STANDARD_NAME,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon,\r\n subscribedAutomationAddon,\r\n subscribedInsightAddon,\r\n subscribedSecurityAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst subscribedBasicPlanCart = (\r\n agents: number,\r\n subscribedAgents: number,\r\n endpoints: number,\r\n subscribedEndpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiCentralPlan,\r\n basicPlan: LmiCentralPlan,\r\n subscribedPlan: BillingDetailedSubscriptionPlan,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n subscribedMobileAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedCameraAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedEndpointProtectionAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedAutomationAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedInsightAddon?: BillingDetailedSubscriptionPlan,\r\n subscribedSecurityAddon?: BillingDetailedSubscriptionPlan,\r\n useLmiCentralNewSkus?: boolean\r\n) => {\r\n const includedAgents = basicPlan.userAgentsIncludedAmount + subscribedAgents\r\n const includedEndpoints = basicPlan.endpointsIncludedAmount + subscribedEndpoints\r\n const subscribedBillFrequency =\r\n subscribedPlan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n\r\n const cart = {\r\n includedAgents:\r\n includedAgents < selectedPlan.userAgentsIncludedAmount\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents,\r\n\r\n includedEndpoints:\r\n includedEndpoints < selectedPlan.endpointsIncludedAmount\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints,\r\n\r\n addons: [] as LmiCentralSelectedAddon[],\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon,\r\n subscribedAutomationAddon,\r\n subscribedInsightAddon,\r\n subscribedSecurityAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: !subscribedMobileAddon,\r\n canUpgradeCameraAddon: !subscribedCameraAddon,\r\n canUpgradeEndpointProtectionAddon: !subscribedEndpointProtectionAddon,\r\n canUpgradeAutomationAddon: !subscribedAutomationAddon,\r\n canUpgradeInsightAddon: !subscribedInsightAddon,\r\n canUpgradeSecurityAddon: !subscribedSecurityAddon,\r\n canUpgradeBillingFrequency: false,\r\n isReplacementBooking: false,\r\n isUpgrading: true,\r\n }\r\n\r\n if (\r\n (!cart.canUpgradeBillingFrequency || subscribedBillFrequency === billingFrequency) &&\r\n subscribedPlan.productSku === selectedPlan.sKU\r\n ) {\r\n cart.addons = getAddons(\r\n useLmiCentralNewSkus ? PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 : PRODUCT_SKU.LMIPRO_BASIC_NAMED,\r\n agents,\r\n subscribedAgents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n subscribedEndpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon,\r\n subscribedAutomationAddon,\r\n subscribedInsightAddon,\r\n subscribedSecurityAddon\r\n )\r\n } else {\r\n cart.isReplacementBooking = true\r\n cart.addons = getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedMobileAddon,\r\n subscribedCameraAddon,\r\n subscribedEndpointProtectionAddon\r\n )\r\n }\r\n\r\n return cart\r\n}\r\nconst trialPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiCentralPlan,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n ),\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: true,\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeAutomationAddon: true,\r\n canUpgradeInsightAddon: true,\r\n canUpgradeSecurityAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: true,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nconst newPlanCart = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiCentralPlan,\r\n mobileAddon?: LmiCentralAddon,\r\n cameraAddon?: LmiCentralAddon,\r\n endpointProtectionAddon?: LmiCentralAddon,\r\n automationAddon?: LmiCentralAddon,\r\n insightAddon?: LmiCentralAddon,\r\n securityAddon?: LmiCentralAddon,\r\n urlPlan?: string\r\n) => {\r\n const cart = {\r\n includedAgents: selectedPlan.userAgentsIncludedAmount,\r\n includedEndpoints: selectedPlan.endpointsIncludedAmount,\r\n addons: getReplacementBookingAddons(\r\n selectedPlan.sKU as PRODUCT_SKU,\r\n agents,\r\n selectedPlan.userAgentsIncludedAmount,\r\n endpoints,\r\n selectedPlan.endpointsIncludedAmount,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n ),\r\n extraAddons: getExtraAddons(\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n ),\r\n billingFrequency,\r\n canUpgradePlan: urlPlan?.toLowerCase() !== 'standard',\r\n canUpgradeMobileAddon: true,\r\n canUpgradeCameraAddon: true,\r\n canUpgradeEndpointProtectionAddon: true,\r\n canUpgradeAutomationAddon: true,\r\n canUpgradeInsightAddon: true,\r\n canUpgradeSecurityAddon: true,\r\n canUpgradeBillingFrequency: true,\r\n isReplacementBooking: true,\r\n isUpgrading: false,\r\n }\r\n\r\n return cart\r\n}\r\n\r\nexport const getCartInfo = (\r\n agents: number,\r\n endpoints: number,\r\n billingFrequency: TimePeriod,\r\n plans: LmiCentralPlan[],\r\n selectedPlan: LmiCentralPlan,\r\n selectedExtraAddons: LmiCentralAddon[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[],\r\n featureFlags?: string[],\r\n urlPlan?: string\r\n) => {\r\n const useLmiCentralNewSkus = featureFlags?.includes(FEATURE_FLAGS.LMIPRO_USE_NEW_SKUS)\r\n const mobileAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.MOBILE_ADDON)\r\n const cameraAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.CAMERA_SHARE_ADDON)\r\n const endpointProtectionAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.ENDPOINT_PROTECTION_ADDON)\r\n const automationAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.AUTOMATION_ADDON)\r\n const insightAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.INSIGHT_ADDON)\r\n const securityAddon = selectedExtraAddons.find((a) => a.sKU === ADDON_SKUS.SECURITY_ADDON)\r\n\r\n const subscribedInfo = {\r\n agents: 0,\r\n endpoints: 0,\r\n plan: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n mobileAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n cameraAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n endpointProtectionAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n automationAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n insightAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n securityAddon: undefined as BillingDetailedSubscriptionPlan | undefined,\r\n hasTrial: false,\r\n }\r\n\r\n if (!accountSubscriptions?.length) {\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n useLmiCentralNewSkus ? urlPlan : ''\r\n )\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAME:\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case PRODUCT_SKU.LMIPRO_BASIC_NAMED:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_ACCESS:\r\n subscribedInfo.plan = subscription\r\n break\r\n\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n subscribedInfo.agents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n subscribedInfo.endpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscribedInfo.mobileAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscribedInfo.cameraAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscribedInfo.endpointProtectionAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.AUTOMATION_ADDON:\r\n subscribedInfo.automationAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.INSIGHT_ADDON:\r\n subscribedInfo.insightAddon = subscription\r\n break\r\n\r\n case ADDON_SKUS.SECURITY_ADDON:\r\n subscribedInfo.securityAddon = subscription\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n subscribedInfo.hasTrial = true\r\n }\r\n }\r\n })\r\n\r\n if (subscribedInfo.plan) {\r\n if (\r\n [PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2, PRODUCT_SKU.LMIPRO_STANDARD_NAME].includes(\r\n subscribedInfo.plan.productSku as PRODUCT_SKU\r\n )\r\n ) {\r\n return subscribedStandardPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon,\r\n subscribedInfo.automationAddon,\r\n subscribedInfo.insightAddon,\r\n subscribedInfo.securityAddon,\r\n useLmiCentralNewSkus\r\n )\r\n }\r\n if (\r\n [\r\n PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2,\r\n PRODUCT_SKU.LMIPRO_REMOTE_ACCESS,\r\n PRODUCT_SKU.LMIPRO_BASIC_NAMED,\r\n ].includes(subscribedInfo.plan.productSku as PRODUCT_SKU)\r\n ) {\r\n const basicPlan = plans.find(\r\n (p) =>\r\n p.sKU === (useLmiCentralNewSkus ? subscribedInfo.plan?.productSku : PRODUCT_SKU.LMIPRO_BASIC_NAMED)\r\n )\r\n\r\n if (basicPlan) {\r\n return subscribedBasicPlanCart(\r\n agents,\r\n subscribedInfo.agents,\r\n endpoints,\r\n subscribedInfo.endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n basicPlan,\r\n subscribedInfo.plan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon,\r\n subscribedInfo.mobileAddon,\r\n subscribedInfo.cameraAddon,\r\n subscribedInfo.endpointProtectionAddon,\r\n subscribedInfo.automationAddon,\r\n subscribedInfo.insightAddon,\r\n subscribedInfo.securityAddon,\r\n useLmiCentralNewSkus\r\n )\r\n }\r\n }\r\n } else if (subscribedInfo.hasTrial) {\r\n return trialPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n )\r\n }\r\n\r\n return newPlanCart(\r\n agents,\r\n endpoints,\r\n billingFrequency,\r\n selectedPlan,\r\n mobileAddon,\r\n cameraAddon,\r\n endpointProtectionAddon,\r\n automationAddon,\r\n insightAddon,\r\n securityAddon\r\n )\r\n}\r\n","import { LANGUAGE, STORAGE_CONST } from '@common/constants'\r\nimport { getSessionState } from '@common/utils'\r\n\r\nexport const getContentLanguage = () => getSessionState(STORAGE_CONST.SAVED_LANGUAGE) || LANGUAGE.EN\r\n","import { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { LmiCentralPlan } from '@lmicentral/state/plan'\r\nimport { PRODUCT_TYPES } from '@common/constants'\r\n\r\nexport const getUpgradingStatus = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n return accountSubscriptions && accountSubscriptions.length > 0\r\n}\r\n\r\nexport const getSubscriptionId = (accountSubscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n if (accountSubscriptions) {\r\n return accountSubscriptions.find((sub) => sub.planType === PRODUCT_TYPES.PAID && sub.status === 'Active')\r\n ?.subscriptionId\r\n }\r\n return undefined\r\n}\r\n\r\nexport const getSubscriptionMatch = (\r\n subscriptionId: number | undefined,\r\n selectedPlan: LmiCentralPlan,\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n if (accountSubscriptions && subscriptionId) {\r\n return !!accountSubscriptions.find(\r\n (sub) => sub.subscriptionId === subscriptionId && sub.productSku === selectedPlan.sKU\r\n )\r\n }\r\n return false\r\n}\r\n","export enum LMIPRO_TRIAL_ERROR_CODES {\r\n INVALID_CODE = 'invalid.token.code',\r\n TOKEN_EXPIRED = 'token.expired',\r\n}\r\n\r\nexport enum LMIPRO_TRIAL_ERROR_STATE {\r\n TIMEOUT = 'timeout',\r\n ALREADY_USER = 'already.user',\r\n EXPIRED_CODE = 'expired.code',\r\n WRONG_CODE = 'wrong.code',\r\n NO_PROVISIONING = 'failed.provisioning',\r\n USER_BANNED = 'banned',\r\n GENERIC_ERROR = 'generic.error',\r\n DECISION_MAKER_FAIL = 'decision.maker.fail',\r\n NO_ERROR = 'none',\r\n}\r\n\r\nexport enum LMIPRO_TRIAL_ERROR_IDS {\r\n USER_BANNED = 'USER_BANNED',\r\n EXISTING_TRIAL = 'EXISTING_TRIAL',\r\n EXISTING_USER = 'EXISTING_USER',\r\n GENERIC_ERROR = 'GENERIC_ERROR',\r\n ADDRESS_ERROR = 'ADDRESS_ERROR',\r\n CARD_ERROR = 'CARD_ERROR',\r\n}\r\n\r\nexport enum LMIPRO_TRIAL_START_ERROR_CODES {\r\n EXPIRED_TRIAL = 'restart.trialsubscription',\r\n}\r\n","export enum LICENSECAP {\r\n MIN = 1,\r\n MAX = 20,\r\n}\r\n\r\nexport enum NUMBERSCAP {\r\n MIN = 0,\r\n MAX = 20,\r\n}\r\n","export enum LMIPRO_USER_TYPES {\r\n NEW = 'NEW',\r\n TRIALER = 'TRIALER',\r\n ADDON = 'ADDON',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n BANNED = 'BANNED',\r\n EXPIRED = 'EXPIRED',\r\n IDENTITY_ONLY = 'IDENTITY_ONLY',\r\n}\r\n\r\nexport enum LMIPRO_USER_TYPES_RESPONSE {\r\n USER_IDENTITY_NOT_FOUND = 'ValidateUserIdentityNotFound',\r\n USER_BOSS_NOT_FOUND = 'ValidateUserBossNotFound',\r\n}\r\n\r\nexport enum LMIPRO_PARTIAL_NON_VALIDATION_USER_TYPES {\r\n TRIALER = 'TRIALER',\r\n CROSSPRODUCT = 'CROSSPRODUCT',\r\n EXPIRED = 'EXPIRED',\r\n}\r\n","export enum ADDONS {\r\n ADDITIONAL_NUMBERS = 'G2CPreDID',\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n MAX_AGENTS_ADDONS = 51,\r\n MAX_DEVICE_ADDONS = 1500,\r\n MAX_ENDPOINTS_ADDONS = 1025,\r\n ENDPOINTS_ADDONS_INTERVAL = 25,\r\n DEVICE_ADDONS_INTERVAL = 25,\r\n AGENT = 'Agent',\r\n ENDPOINT = 'Endpoint',\r\n ADDON_PRICE_REPLACE = 'ADDON_PRICE_REPLACE',\r\n}\r\n\r\nexport enum ADDON_SKUS {\r\n MOBILE_ADDON = 'GTRMobileAddNamed',\r\n CAMERA_SHARE_ADDON = 'GTRCameraShareAddNamed',\r\n ENDPOINT_PROTECTION_ADDON = 'GTREndpointProtection',\r\n AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n BASIC_AGENT_ADDON = 'GTRBasicAddAgentNamed',\r\n BASIC_ENDPOINT_ADDON = 'GTRBasicAddEndpointNamed',\r\n STANDARD_AGENT_ADDON = 'GTRStandardAddAgentNamed',\r\n STANDARD_ENDPOINT_ADDON = 'GTRStandardAddEndpointNamed',\r\n}\r\n","export enum CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES {\r\n FIRSTNAME = 'FirstName',\r\n LASTNAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n COUNTRYCODE = 'CountryCode',\r\n STATECODE = 'StateCode',\r\n}\r\n","export enum CHECKOUTFORM_STEPS {\r\n CREATE_FLEX_TOKEN = 'createFlexToken',\r\n CREATE_USER_ACCOUNT = 'createUserAccount',\r\n SAVE_BILLING_INFO = 'saveBillingInfo',\r\n SAVE_PAYMENT_INFO = 'savePaymentInfo',\r\n CARDINAL_SEND_CHALLENGE = 'sendCardinalChallenge',\r\n GET_AVAILABLE_PAYMENT_METHODS = 'getAvailablepaymentMethods',\r\n SUBMIT_PAYMENT = 'submitPayment',\r\n CARDINAL_TRIGGER_BIN_PROCESS = 'triggerBinProcess',\r\n}\r\n","export enum LMIPRO_TRACKING_COMPONENTS {\r\n CHECKOUT_PAGE = 'checkout-form',\r\n FORM_SUBMISSION_SAGA = 'form-submission-saga',\r\n BILLING_PAGE = 'billing',\r\n CUSTOMIZE_PAGE = 'customize',\r\n NEXT_STEPS_PAGE = 'next-steps',\r\n FATAL_ERROR_PAGE = 'fatal-error',\r\n CALCULATE_PRICE_SAGA = 'calculate-price-saga',\r\n CREATE_USER_SAGA = 'create-user-saga',\r\n CREATE_BILLING_INFO_SAGA = 'create-billing-info-saga',\r\n CREATE_PAYMENT_SAGA = 'create-payment-saga',\r\n GET_AVAILABLE_PAYMENT_METHODS_SAGA = 'get-available-payment-methods-saga',\r\n SUBMIT_PAYMENT_SAGA = 'submit-payment-saga',\r\n EXISTING_USER_FORM_SUBMISSION_SAGA = 'existing-user-form-submission-saga',\r\n}\r\n","export enum CHECKOUTFORM_FIELDS {\r\n FIRST_NAME = 'FirstName',\r\n LAST_NAME = 'LastName',\r\n EMAIL = 'Email',\r\n PASSWORD = 'Password',\r\n BILLING_FIRST_NAME = 'BillingFirstName',\r\n BILLING_LAST_NAME = 'BillingLastName',\r\n STREET1 = 'Street1',\r\n COUNTRY_CODE = 'CountryCode',\r\n CITY = 'City',\r\n STATE_CODE = 'StateCode',\r\n ZIP_CODE = 'ZipCode',\r\n CONTACT_PHONE = 'ContactPhone',\r\n EXPIRATION_DATE = 'ExpirationDate',\r\n TAX_ID = 'TaxNumber',\r\n COMPANY_NAME = 'CompanyName',\r\n}\r\n","export enum PRODUCT_PRICE_ITEM_TYPE {\r\n product = 'Product',\r\n fee = 'Fee',\r\n volumeDiscount = 'VolumeDiscount',\r\n amountOffAutoDiscount = 'AmountOffAutoDiscount',\r\n}\r\n","export enum BUY_TYPE {\r\n TRIAL_CONVERSION = 'trial conversion',\r\n ADDON = 'add-on',\r\n DIRECT_BUY = 'direct buy',\r\n}\r\n","export enum REFERRER {\r\n gotoAdmin = 'gotoadmin',\r\n}\r\n\r\nexport const REFERRER_QUERY_PARAM = 'referrer'\r\n","import axios from 'axios'\r\nimport { SC_SITE } from '@common/constants'\r\nimport {\r\n LmiProBillingInfoDataType,\r\n LmiProPaymentDataType,\r\n LmiProSubmitDataType,\r\n LmiProCalculatePriceDataType,\r\n LmiProSubmitWithCardAddDataType,\r\n} from '@lmipro/state/checkout/state'\r\nimport { LmiProUserDataType, LmiProAbandonedCartPayload } from '@lmipro/state/user/state'\r\nimport { getContentLanguage } from '@lmipro/utils/language-helpers'\r\n\r\nexport interface LmiProPaymentMethodDataType {\r\n accessToken?: string\r\n billingAccountKey?: string\r\n}\r\n\r\nexport interface LmiProCardHeadersType {\r\n AccessToken: string\r\n BillingAccountKey: string\r\n PaymentMethodKey: string\r\n}\r\n\r\nexport interface LmiProLabelDataType {\r\n id: string\r\n plan: string\r\n promoCode: string\r\n accessToken: string\r\n timezone: string\r\n}\r\n\r\nexport interface apiQueryParamsType {\r\n /* eslint-disable camelcase */\r\n sc_site: string\r\n sc_lang?: string\r\n}\r\n\r\nexport const apiQueryParams = {\r\n sc_site: SC_SITE.LOGMEIN,\r\n sc_lang: 'en',\r\n}\r\n\r\nexport const setLanguageParam = (queryParams: apiQueryParamsType) => {\r\n return {\r\n ...queryParams,\r\n sc_lang: getContentLanguage(),\r\n }\r\n}\r\n\r\n/* APP DATA */\r\n\r\n// get buy flow api data\r\n\r\nexport function getLmiProLabelData(): Promise {\r\n const updatedQueryParams = setLanguageParam(apiQueryParams)\r\n return axios.post('/ecommapi/content/buy/pro', null, { params: updatedQueryParams })\r\n}\r\n\r\n// get available payment methods\r\nexport function getAvailablePaymentMethods() {\r\n return axios.post('/ecommapi/purchase/GetAvailablePaymentMethods', null, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// create user account\r\nexport function createUserAccount(data: LmiProUserDataType): Promise {\r\n return axios.post('/ecommapi/identity/CreateAccount/', data, {\r\n withCredentials: true,\r\n params: apiQueryParams,\r\n })\r\n}\r\n\r\n// create billing information\r\nexport function createBillingInfo(data: LmiProBillingInfoDataType): Promise {\r\n return axios.post('/ecommapi/purchase/SetBillingInfo', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// calculate payment\r\nexport function calculatePrice(data: LmiProCalculatePriceDataType): Promise {\r\n return axios.post('/ecommapi/purchase/CalculatePrice', data)\r\n}\r\n\r\n// create payment info\r\nexport function savePayment(data: LmiProPaymentDataType) {\r\n return axios.post('/ecommapi/purchase/SavePaymentMethodV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment with card add\r\n// api reference: https://confluence.ops.expertcity.com/display/MMM/API+-+Public+-+Process+Purchase+With+Card+Add+V3\r\nexport function submitPaymentWithCardAdd(data: LmiProSubmitWithCardAddDataType): Promise {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseWithCardAddV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\n// submit payment\r\nexport function submitPayment(data: LmiProSubmitDataType | LmiProSubmitWithCardAddDataType) {\r\n return axios.post('/ecommapi/purchase/ProcessPurchaseV3', data, {\r\n withCredentials: true,\r\n })\r\n}\r\n\r\nexport function validateTaxNumber(country: string, taxNumber: string, federalTaxType?: string) {\r\n return axios.get('/ecommapi/purchase/ValidateTaxNumber', {\r\n params: {\r\n country,\r\n taxNumber,\r\n federalTaxType,\r\n },\r\n })\r\n}\r\n\r\n// cart abandonment\r\nexport function submitAbandonedCart(data: LmiProAbandonedCartPayload) {\r\n return axios.post(`${process.env.AWS_ABANDON_ENDPOINT}`, data)\r\n}\r\n\r\nexport default {\r\n getLmiProLabelData,\r\n calculatePrice,\r\n createUserAccount,\r\n createBillingInfo,\r\n submitPaymentWithCardAdd,\r\n}\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CHECKOUTFORM_STEPS } from '@lmipro/constants'\r\nimport { LmiProBuyFormData } from './state'\r\n\r\nexport enum LmiProBuyFormActionTypes {\r\n SUBMIT_BUY_FORM = '[lmipro-buy-form-actions] submit-exp',\r\n RESET_BUY_FORM_AFFECTED_STATES = '[lmipro-buy-form-actions] reset-affected-states',\r\n RESET_BUY_FORM = '[lmipro-buy-form-actions] reset-checkout-form',\r\n EXISTING_USER_SUBMIT_BUY_FORM = '[lmipro-buy-form-actions] existing-user-submit-exp',\r\n UPDATE_INITIAL_FORM_STATE = '[lmipro-buy-form-actions] update-initial-form-state',\r\n SET_CLEAR_EMAIL = '[lmipro-buy-form-actions] set-clear-email',\r\n UPDATE_STEPS = '[lmipro-buy-form-actions] update-steps',\r\n SET_STATES_OPTIONAL = '[lmipro-buy-form-actions] set-states-optional',\r\n}\r\n\r\nexport const lmiproBuyFormActions = {\r\n submitForm: (values: LmiProBuyFormData) => createAction(LmiProBuyFormActionTypes.SUBMIT_BUY_FORM, { values }),\r\n existingUserSubmitForm: (values: LmiProBuyFormData) =>\r\n createAction(LmiProBuyFormActionTypes.EXISTING_USER_SUBMIT_BUY_FORM, { values }),\r\n resetCheckoutFormAffectedStates: () => createAction(LmiProBuyFormActionTypes.RESET_BUY_FORM_AFFECTED_STATES),\r\n updateInitialFormState: (data: LmiProBuyFormData) =>\r\n createAction(LmiProBuyFormActionTypes.UPDATE_INITIAL_FORM_STATE, {\r\n data,\r\n }),\r\n resetForm: () => createAction(LmiProBuyFormActionTypes.RESET_BUY_FORM),\r\n setClearEmail: (clear: boolean) => createAction(LmiProBuyFormActionTypes.SET_CLEAR_EMAIL, { clear }),\r\n updateSteps: (stepName: CHECKOUTFORM_STEPS, stepResult: boolean) =>\r\n createAction(LmiProBuyFormActionTypes.UPDATE_STEPS, {\r\n stepName,\r\n stepResult,\r\n }),\r\n setStatesOptional: (optional: boolean) => createAction(LmiProBuyFormActionTypes.SET_STATES_OPTIONAL, { optional }),\r\n}\r\n\r\nexport type BuyFormActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LmiProSelectedAddon, LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProBuyFormData } from '@lmipro/state/buy-form/state'\r\nimport { LmiProProductPriceItem } from '@lmipro/state/calculate-price'\r\nimport {\r\n LmiProBillingInfoDataType,\r\n LmiProPaymentDataType,\r\n LmiProSubmitDataType,\r\n LmiProBillingFrequencyVolumeDiscountRecords,\r\n LmiProSubmitWithCardAddDataType,\r\n} from './state'\r\n\r\nexport enum LmiProCheckoutActionTypes {\r\n SET_LOADING = '[lmipro-checkout-actions] set-loading',\r\n SET_PLAN_ID = '[lmipro-checkout-actions] set-plan-id',\r\n SET_BILLING_FREQUENCY = '[lmipro-checkout-actions] set-billing-frequency',\r\n CLEAR_ADDONS = '[lmipro-checkout-actions] clear-addons',\r\n SET_SELECTED_ADDONS = '[lmipro-checkout-actions] set-selected-addons',\r\n SET_ORGANIZERS = '[lmipro-checkout-actions] set-organizers',\r\n SET_SELECTED_PLAN = '[lmipro-checkout-actions] set-selected-plan',\r\n SET_EXISTING_USER_MODAL_OPEN = '[lmipro-checkout-actions] set-existing-user-modal',\r\n CREATE_BILLING_INFO = '[lmipro-checkout-actions] create-billing-info',\r\n CREATE_PAYMENT = '[lmipro-checkout-actions] create-payment',\r\n SUBMIT_PAYMENT = '[lmipro-checkout-actions] submit-payment',\r\n CREATE_AND_SUBMIT_PAYMENT = '[lmipro-checkout-actions] create-and-submit-payment',\r\n GET_AVAILABLE_PAYMENT_METHODS = '[lmipro-checkout-actions] get-available-payment-methods',\r\n CALCULATE_PRICE = '[lmipro-checkout-actions] calculate-price',\r\n SET_CALCULATED_PRICE = '[lmipro-checkout-actions] set-calculated-price',\r\n GET_SAVED_STATE = '[lmipro-checkout-actions] get-saved-state',\r\n SET_SAVED_STATE_LOADED = '[lmipro-checkout-actions] set-saved-state-loaded',\r\n RESET_CHECKOUT_STATE = '[lmipro-checkout-actions] reset-state',\r\n SET_EXISTING_ORGANIZERS = '[lmipro-checkout-actions] set-existing-organizers',\r\n SET_PURCHASE_COMPLETE = '[lmipro-checkout-actions] set-purchase-complete',\r\n SET_LOADING_TOTAL = '[lmipro-checkout-actions] set-loading-total',\r\n SET_ADDON_COMPLETE = '[lmipro-checkout-actions] set-addon-complete',\r\n SET_SELECTED_TIER_INDEX = '[lmipro-checkout-actions] set-selected-tier-index',\r\n CALCULATE_VOLUME_DISCOUNT = '[lmipro-checkout-actions] calculate-volume-discount',\r\n SET_VOLUME_DISCOUNT = '[lmipro-checkout-actions] set-volume-discount',\r\n SET_VOLUME_DISCOUNT_LOADING = '[lmipro-checkout-actions] set-volume-discount-loading',\r\n GET_VOLUME_DISCOUNT = '[lmipro-checkout-actions] get-volume-discount',\r\n SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE = '[lmipro-checkout-actions] set-current-volume-discount-price-and-percentage',\r\n ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON = '[lmipro-checkout-actions] adjust-current-volume-discount-for-reprice-coupon',\r\n SET_PRORATED_AMOUNT = '[lmipro-checkout-actions] set-prorated-amount',\r\n SET_EXTRA_ADDON = '[lmipro-checkout-actions] set-extra-addon',\r\n SET_ENDPOINTS = '[lmipro-checkout-actions] set-endpoints',\r\n SET_AGENTS = '[lmipro-checkout-actions] set-agents',\r\n SET_TAX_TYPE = '[lmipro-checkout-actions] set-tax-type',\r\n SET_AUTO_LOGIN = '[lmipro-checkout-form-actions] set-auto-login',\r\n}\r\n\r\nexport const lmiproCheckoutActions = {\r\n setLoading: (loading: boolean) => createAction(LmiProCheckoutActionTypes.SET_LOADING, { loading }),\r\n setPurchaseComplete: (complete: boolean) =>\r\n createAction(LmiProCheckoutActionTypes.SET_PURCHASE_COMPLETE, { complete }),\r\n setBillingFrequency: (frequency: TimePeriod) =>\r\n createAction(LmiProCheckoutActionTypes.SET_BILLING_FREQUENCY, { frequency }),\r\n clearAddons: () => createAction(LmiProCheckoutActionTypes.CLEAR_ADDONS),\r\n setSelectedPlan: (planSku: string) => createAction(LmiProCheckoutActionTypes.SET_SELECTED_PLAN, { planSku }),\r\n setSelectedAddons: (addons: LmiProSelectedAddon[]) =>\r\n createAction(LmiProCheckoutActionTypes.SET_SELECTED_ADDONS, { addons }),\r\n setOrganizers: (organizers: number) => createAction(LmiProCheckoutActionTypes.SET_ORGANIZERS, { organizers }),\r\n createBillingInfo: (billingValues: LmiProBillingInfoDataType) =>\r\n createAction(LmiProCheckoutActionTypes.CREATE_BILLING_INFO, {\r\n billingValues,\r\n }),\r\n createPayment: (paymentValues: LmiProPaymentDataType) =>\r\n createAction(LmiProCheckoutActionTypes.CREATE_PAYMENT, {\r\n paymentValues,\r\n }),\r\n submitPayment: (submitValues: LmiProSubmitDataType | LmiProSubmitWithCardAddDataType) =>\r\n createAction(LmiProCheckoutActionTypes.SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n createAndSubmitPayment: (submitValues: LmiProSubmitWithCardAddDataType) =>\r\n createAction(LmiProCheckoutActionTypes.CREATE_AND_SUBMIT_PAYMENT, {\r\n submitValues,\r\n }),\r\n getPaymentMethods: () => createAction(LmiProCheckoutActionTypes.GET_AVAILABLE_PAYMENT_METHODS),\r\n calculatePrice: (values: LmiProBuyFormData, component?: string, planSKU?: string) =>\r\n createAction(\r\n LmiProCheckoutActionTypes.CALCULATE_PRICE,\r\n {\r\n values,\r\n planSKU,\r\n },\r\n { component }\r\n ),\r\n setCalculatedPrice: (\r\n productPrices: LmiProProductPriceItem[],\r\n net: number,\r\n total: number,\r\n tax: number,\r\n creditback: number,\r\n anniversaryDate: string\r\n ) =>\r\n createAction(LmiProCheckoutActionTypes.SET_CALCULATED_PRICE, {\r\n productPrices,\r\n net,\r\n total,\r\n tax,\r\n creditback,\r\n anniversaryDate,\r\n }),\r\n getSavedState: (urlPlan: string) =>\r\n createAction(LmiProCheckoutActionTypes.GET_SAVED_STATE, {\r\n urlPlan,\r\n }),\r\n setSavedStateLoaded: (savedStateLoaded: boolean, component: string) =>\r\n createAction(\r\n LmiProCheckoutActionTypes.SET_SAVED_STATE_LOADED,\r\n {\r\n savedStateLoaded,\r\n },\r\n { component }\r\n ),\r\n setTotalLoading: (loading: boolean) =>\r\n createAction(LmiProCheckoutActionTypes.SET_LOADING_TOTAL, {\r\n loading,\r\n }),\r\n setAddonComplete: (addonComplete: boolean) =>\r\n createAction(LmiProCheckoutActionTypes.SET_ADDON_COMPLETE, {\r\n addonComplete,\r\n }),\r\n resetCheckoutState: () => createAction(LmiProCheckoutActionTypes.RESET_CHECKOUT_STATE),\r\n setSelectedTierIndex: (selectedTierIndex: number, organizers: number) =>\r\n createAction(LmiProCheckoutActionTypes.SET_SELECTED_TIER_INDEX, { selectedTierIndex, organizers }),\r\n calculateVolumeDiscount: () => createAction(LmiProCheckoutActionTypes.CALCULATE_VOLUME_DISCOUNT),\r\n setVolumeDiscount: (\r\n selectedPlanSku: string,\r\n currency: CURRENCY,\r\n volumeDiscountForSelectedPlanAndCurrency: LmiProBillingFrequencyVolumeDiscountRecords\r\n ) =>\r\n createAction(LmiProCheckoutActionTypes.SET_VOLUME_DISCOUNT, {\r\n selectedPlanSku,\r\n currency,\r\n volumeDiscountForSelectedPlanAndCurrency,\r\n }),\r\n setVolumeDiscountLoading: (volumeDiscountLoading: boolean) =>\r\n createAction(LmiProCheckoutActionTypes.SET_VOLUME_DISCOUNT_LOADING, { volumeDiscountLoading }),\r\n getVolumeDiscount: (organizers: number, selectedTierIndex: number, billingFrequency: TimePeriod) =>\r\n createAction(LmiProCheckoutActionTypes.GET_VOLUME_DISCOUNT, {\r\n organizers,\r\n selectedTierIndex,\r\n billingFrequency,\r\n }),\r\n setCurrentVolumeDiscountPriceAndPercentage: (currentVolumeDiscountPrice: number) =>\r\n createAction(LmiProCheckoutActionTypes.SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE, {\r\n currentVolumeDiscountPrice,\r\n }),\r\n setProratedAmount: (proratedAmount: number) =>\r\n createAction(LmiProCheckoutActionTypes.SET_PRORATED_AMOUNT, { proratedAmount }),\r\n adjustCurrentVolumeDiscountForRepriceCoupon: () =>\r\n createAction(LmiProCheckoutActionTypes.ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON),\r\n setExtraAddons: (addons: LmiProAddon[]) => createAction(LmiProCheckoutActionTypes.SET_EXTRA_ADDON, { addons }),\r\n setEndpoints: (endpoints: number) => createAction(LmiProCheckoutActionTypes.SET_ENDPOINTS, { endpoints }),\r\n setAgents: (agents: number) => createAction(LmiProCheckoutActionTypes.SET_AGENTS, { agents }),\r\n setTaxType: (type: string) => createAction(LmiProCheckoutActionTypes.SET_TAX_TYPE, { type }),\r\n setAutoLogin: (autoLogin?: string) =>\r\n createAction(LmiProCheckoutActionTypes.SET_AUTO_LOGIN, {\r\n autoLogin,\r\n }),\r\n}\r\n\r\nexport type LmiProCheckoutActions = ActionUnion\r\n","import { LmiProContentData } from '@lmipro/state/content-data'\r\nimport { LabelContent } from '@lmipro/state/label-content'\r\nimport { ActionUnion, createAction } from '@common/utils'\r\n\r\nexport enum LmiProContentActionTypes {\r\n GET_LABEL_CONTENT = '[lmipro-content-actions] get-label-content',\r\n SET_CONTENT = '[lmipro-content-actions] set-content',\r\n SET_CONTENT_LOADED = '[lmipro-content-actions] set-content-loaded',\r\n GET_COMPARE_MODAL_CONTENT = '[lmipro-content-actions] get-compare-modal-content',\r\n SET_COMPARE_MODAL_CONTENT = '[lmipro-content-actions] set-compare-modal-content',\r\n SET_COUPON_DISCLAIMER = '[lmipro-content-actions] set-coupon-disclaimer',\r\n}\r\n\r\nexport const contentActions = {\r\n getLabelContent: (upgrade?: boolean) => createAction(LmiProContentActionTypes.GET_LABEL_CONTENT, { upgrade }),\r\n setContent: (content: LmiProContentData, labels: LabelContent, filteredPlans: [], allPlans: []) =>\r\n createAction(LmiProContentActionTypes.SET_CONTENT, {\r\n content,\r\n labels,\r\n filteredPlans,\r\n allPlans,\r\n }),\r\n getCompareModalContent: (PlanGroupdId: string) =>\r\n createAction(LmiProContentActionTypes.GET_COMPARE_MODAL_CONTENT, PlanGroupdId),\r\n setCompareModalContent: (content: []) =>\r\n createAction(LmiProContentActionTypes.SET_COMPARE_MODAL_CONTENT, { content }),\r\n setContentLoaded: (loaded: boolean) => createAction(LmiProContentActionTypes.SET_CONTENT_LOADED, { loaded }),\r\n setCouponDisclaimer: (couponDisclaimer: string) =>\r\n createAction(LmiProContentActionTypes.SET_COUPON_DISCLAIMER, { couponDisclaimer }),\r\n}\r\n\r\n// where do the get functions go\r\n\r\nexport type ContentActions = ActionUnion\r\n","import { LmiProContainerAppState } from '@lmipro/store'\r\n// we need to complete this file, as we copy reducers from connect\r\n\r\nexport const getLabelContent = (state: LmiProContainerAppState) => state.lmipro.content.labelContent\r\nexport const getCheckoutState = (state: LmiProContainerAppState) => state.lmipro.checkout\r\nexport const getPlanData = (state: LmiProContainerAppState) => state.lmipro.content.planData\r\nexport const getContentState = (state: LmiProContainerAppState) => state.lmipro.content\r\nexport const getContentData = (state: LmiProContainerAppState) => state.lmipro.content.contentData\r\nexport const getUserState = (state: LmiProContainerAppState) => state.lmipro.user\r\nexport const getBuyFormState = (state: LmiProContainerAppState) => state.lmipro.form\r\nexport const getCouponState = (state: LmiProContainerAppState) => state.lmipro.coupon\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { TrackingState } from '@common/state/tracking/state'\r\n\r\nexport enum LmiProTrackingActionTypes {\r\n TRACK = '[lmipro-tracking] lmipro-track-event',\r\n}\r\n\r\nexport const lmiproTrackingActions = {\r\n track: (trackingInfo: TrackingState, component: string) =>\r\n createAction(LmiProTrackingActionTypes.TRACK, { trackingInfo }, { component }),\r\n}\r\n\r\nexport type LmiProTrackingActions = ActionUnion\r\n","import { ActionUnion, createAction } from '@common/utils'\r\nimport { Token } from '@getgo/auth-client'\r\nimport { LmiProBuyFormData } from '@lmipro/state/buy-form/state'\r\nimport {\r\n ExistingBillingInfoType,\r\n ExistingUserInfoType,\r\n ExistingAccountInfoType,\r\n ExistingPaymentInfoType,\r\n} from '@common/state/user/state'\r\nimport { LmiProAbandonedCartDataType, LmiProUserDataType } from './state'\r\n\r\nexport enum LmiProUserActionTypes {\r\n CHECK_EXISTING_USER = '[lmipro-user-actions] check-existing-user',\r\n CREATE_NEW_USER = '[lmipro-user-actions] create-new-user',\r\n GET_LOGGED_IN_USER_STATE = '[lmipro-user-actions] get-user-logged-in-state',\r\n SET_EXISTING_BILLING_INFO = '[lmipro-user-actions] set-existing-billing-info',\r\n SET_EXISTING_USER_INFO = '[lmipro-user-actions] set-existing-user-info',\r\n SET_EXISTING_ACCOUNT_INFO = '[lmipro-user-actions] set-existing-account-info',\r\n SET_DISPLAY_NAME = '[lmipro-user-actions] set-display-name',\r\n SET_LOADING_EXISTING_INFO = '[lmipro-user-actions] set-loading-existing-info',\r\n SET_VERIFYING_TOKEN = '[lmipro-user-actions] set-verifying-token',\r\n SET_USER_TYPE = '[lmipro-user-actions] set-user-type',\r\n SET_EXISTING_PAYMENT_DETAILS = '[lmipro-user-actions] set-existing-payment-details',\r\n SET_ACCESS_TOKEN = '[lmipro-user-actions] set-access-token',\r\n GET_ACCESS_TOKEN = '[lmipro-user-actions] get-access-token',\r\n SET_IS_USER_LOGGEDIN = '[lmipro-user-actions] set-is-user-loggedin',\r\n USER_LOGIN = '[lmipro-user-actions] user-login',\r\n USER_LOGOUT = '[lmipro-user-actions] user-logout',\r\n SET_VERIFY_USER_SHOULD_LOGIN = '[lmipro-user-actions] get-verify-user-should-login',\r\n SUBMIT_ABANDONED_CART = '[lmipro-user-actions] submit-abandoned-cart',\r\n}\r\n\r\nexport const lmiproUserActions = {\r\n checkExistingUser: (email: string, form?: LmiProBuyFormData) =>\r\n createAction(LmiProUserActionTypes.CHECK_EXISTING_USER, { email, form }),\r\n createNewUser: (userValues: LmiProUserDataType) =>\r\n createAction(LmiProUserActionTypes.CREATE_NEW_USER, { userValues }),\r\n getLoggedInUserState: () => createAction(LmiProUserActionTypes.GET_LOGGED_IN_USER_STATE),\r\n setExistingBillingInformation: (billingInfo: ExistingBillingInfoType) =>\r\n createAction(LmiProUserActionTypes.SET_EXISTING_BILLING_INFO, { billingInfo }),\r\n setLoadingExistingInformation: (loading: boolean) =>\r\n createAction(LmiProUserActionTypes.SET_LOADING_EXISTING_INFO, { loading }),\r\n setVerifyingToken: (verifying: boolean) => createAction(LmiProUserActionTypes.SET_VERIFYING_TOKEN, { verifying }),\r\n setExistingUserInformation: (userInfo: ExistingUserInfoType) =>\r\n createAction(LmiProUserActionTypes.SET_EXISTING_USER_INFO, { userInfo }),\r\n setExistingAccountInformation: (accountInfo: ExistingAccountInfoType) =>\r\n createAction(LmiProUserActionTypes.SET_EXISTING_ACCOUNT_INFO, { accountInfo }),\r\n setDisplayName: (displayName: string) => createAction(LmiProUserActionTypes.SET_DISPLAY_NAME, { displayName }),\r\n setUserType: (type: string) => createAction(LmiProUserActionTypes.SET_USER_TYPE, { type }),\r\n setExistingPaymentDetails: (info: ExistingPaymentInfoType) =>\r\n createAction(LmiProUserActionTypes.SET_EXISTING_PAYMENT_DETAILS, { info }),\r\n getAccessToken: () => createAction(LmiProUserActionTypes.GET_ACCESS_TOKEN),\r\n userLogin: (component?: string, pathname?: string, search?: string, sso?: boolean) =>\r\n createAction(LmiProUserActionTypes.USER_LOGIN, { pathname, search, sso }, { component }),\r\n userLogout: (component?: string) => createAction(LmiProUserActionTypes.USER_LOGOUT, {}, { component }),\r\n setAccessToken: (accessToken: Token) => createAction(LmiProUserActionTypes.SET_ACCESS_TOKEN, { accessToken }),\r\n setIsUserLoggedIn: (isUserLoggedIn: boolean) =>\r\n createAction(LmiProUserActionTypes.SET_IS_USER_LOGGEDIN, {\r\n isUserLoggedIn,\r\n }),\r\n setVerifyShouldUserLogIn: (verifiedUserShouldLogIn: boolean) =>\r\n createAction(LmiProUserActionTypes.SET_VERIFY_USER_SHOULD_LOGIN, { verifiedUserShouldLogIn }),\r\n submitAbandonedCart: (abandonedCartData: LmiProAbandonedCartDataType) =>\r\n createAction(LmiProUserActionTypes.SUBMIT_ABANDONED_CART, { abandonedCartData }),\r\n}\r\n\r\nexport type LmiProUserActions = ActionUnion\r\n","import { PRODUCT_PRICE_ITEM_TYPE } from '@lmipro/constants'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProProductPriceItem } from '@lmipro/state/calculate-price'\r\n\r\nexport const getTotalProratedAmount = (productPrices: LmiProProductPriceItem[]): number => {\r\n let proratedAmount = 0\r\n if (productPrices) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product && productPriceItem.proratedAmount) {\r\n proratedAmount += productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n\r\nexport const getAddonProrateAmount = (productPrices?: LmiProProductPriceItem[], addon?: LmiProAddon) => {\r\n let proratedAmount = 0\r\n if (productPrices && addon) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.proratedAmount && productPriceItem.productSKU === addon.sKU) {\r\n proratedAmount = productPriceItem.proratedAmount * productPriceItem.quantity\r\n }\r\n })\r\n }\r\n return proratedAmount\r\n}\r\n","import { get } from 'lodash-es'\r\nimport { CURRENCY } from '@common/constants'\r\nimport { LmiProBillingFrequencyVolumeDiscountRecords, LmiProVolumeDiscountPerTier } from '@lmipro/state/checkout/state'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProPrice, LmiProPricing, LmiProTiers } from '@lmipro/state/price'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\n\r\nexport const getDiscount = (basePrice: number, newPrice: number): number => {\r\n return basePrice - newPrice\r\n}\r\n\r\nexport const getDiscountPercentage = (basePrice: number, newPrice: number): number => {\r\n return Math.floor(((basePrice - newPrice) / basePrice) * 100)\r\n}\r\n\r\nconst processPricingTier = (pricingTierKeys: string[], pricingTiers: LmiProTiers): LmiProVolumeDiscountPerTier[] => {\r\n let basePrice = 0\r\n return pricingTierKeys.reduce((pricingTierAccumulator, pricingTier, pricingTierIndex) => {\r\n const pricingTierAccumulatorCopy = [...pricingTierAccumulator]\r\n const pricingTierData = pricingTiers[pricingTier as keyof LmiProTiers]\r\n const tierPrice = pricingTierData.price\r\n if (pricingTierIndex === 0) {\r\n basePrice = tierPrice\r\n }\r\n\r\n const volumeDiscountPerTier: LmiProVolumeDiscountPerTier = {\r\n discountPricePerUnit: getDiscount(basePrice, tierPrice),\r\n }\r\n pricingTierAccumulatorCopy.push(volumeDiscountPerTier)\r\n return pricingTierAccumulatorCopy\r\n }, [] as LmiProVolumeDiscountPerTier[])\r\n}\r\n\r\nconst processCurrencyPricing = (\r\n pricingKeys: string[],\r\n currencyPricing: LmiProPricing\r\n): LmiProBillingFrequencyVolumeDiscountRecords => {\r\n return pricingKeys.reduce((billingFrequencyAccumulator, billingFrequency) => {\r\n const billingFrequencyAccumulatorCopy = { ...billingFrequencyAccumulator }\r\n const pricingTiers = currencyPricing[billingFrequency as keyof LmiProPricing]\r\n const pricingTierKeys = Object.keys(pricingTiers)\r\n billingFrequencyAccumulatorCopy[billingFrequency] = processPricingTier(pricingTierKeys, pricingTiers)\r\n return billingFrequencyAccumulatorCopy\r\n }, {} as LmiProBillingFrequencyVolumeDiscountRecords)\r\n}\r\n\r\nexport const calculateVolumeDiscount = (\r\n selectedPlan: LmiProPlan,\r\n selectedCurrency: CURRENCY\r\n): LmiProBillingFrequencyVolumeDiscountRecords => {\r\n const { pricingInfo } = selectedPlan ?? {}\r\n const currencyPricing = pricingInfo[selectedCurrency as keyof LmiProPrice] as LmiProPricing\r\n const pricingKeys = Object.keys(currencyPricing)\r\n return processCurrencyPricing(pricingKeys, currencyPricing)\r\n}\r\n\r\nexport const getTotalVolumeDiscount = (discountPerUser: number, organizers: number, annualize: boolean) => {\r\n const volumeDiscountTimesOrganizer = discountPerUser * organizers\r\n\r\n const totalVolumeDiscount = annualize ? volumeDiscountTimesOrganizer * 12 : volumeDiscountTimesOrganizer\r\n\r\n return totalVolumeDiscount\r\n}\r\n\r\nexport const getAddonVolumeDiscount = (\r\n addon: LmiProAddon,\r\n quantity: number,\r\n currencyCode: string,\r\n billingFrequencyKey: string,\r\n _currentTier: string,\r\n subscribedAddonQuantity?: number\r\n) => {\r\n const discountPercentagesForQuantity = () => {\r\n const basePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'price'], 0)\r\n const tierTwoPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'price'], 0)\r\n const tierThreePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'price'], 0)\r\n const tierFourPrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'price'], 0)\r\n const tierFivePrice = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier5', 'price'], 0)\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier1', 'max'], 0))\r\n return { actualPercentage: 0, tierIndex: 1 }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier2', 'max'], 0)) {\r\n const percent = ((basePrice - tierTwoPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 2 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier3', 'max'], 0)) {\r\n const percent = ((basePrice - tierThreePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 3 }\r\n }\r\n\r\n if (quantity <= get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, 'tier4', 'max'], 0)) {\r\n const percent = ((basePrice - tierFourPrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 4 }\r\n }\r\n\r\n const percent = ((basePrice - tierFivePrice) / basePrice) * 100\r\n return { actualPercentage: Math.floor(percent), tierIndex: 5 }\r\n }\r\n\r\n // WAE-401 :: While showing the percentage value in line item, we need to round it off to the `floor`. But for the discount amount, need to `round` it to closest\r\n const { actualPercentage, tierIndex } = discountPercentagesForQuantity()\r\n\r\n const price = get(addon, ['pricingInfo', currencyCode, billingFrequencyKey, `tier${tierIndex}`, 'price'], 0)\r\n const isAnnual = billingFrequencyKey === 'annual'\r\n\r\n const discountPrice =\r\n Math.floor((actualPercentage / 100) * price * (isAnnual ? 12 : 1)) * (subscribedAddonQuantity || quantity)\r\n\r\n return { discountPrice, tierIndex }\r\n}\r\n","import { LmiProAddon, LmiProSelectedAddon } from '@lmipro/state/add-on'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { ADDONS } from '@lmipro/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { isEmpty } from 'lodash-es'\r\n\r\nexport const getCurrentAddons = (selectedAddons: LmiProSelectedAddon[], selectedPlan: LmiProPlan): LmiProAddon[] => {\r\n const { addons } = selectedPlan ?? {}\r\n const myAddons = selectedAddons.reduce((mySelectedAddons: LmiProAddon[], localAddon: LmiProSelectedAddon) => {\r\n const matchingAddon = addons.find((add: LmiProAddon) => add.sKU === localAddon.sKU)\r\n if (matchingAddon) {\r\n matchingAddon.quantity = localAddon.quantity\r\n return [...mySelectedAddons, matchingAddon]\r\n }\r\n\r\n return mySelectedAddons\r\n }, [])\r\n return myAddons\r\n}\r\n\r\nexport const getExtraAddons = (addons: LmiProAddon[]) => {\r\n return addons.filter(\r\n (addon) =>\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )\r\n}\r\n\r\nexport const getCurrentAgent = (addons: LmiProAddon[]) => {\r\n return addons.filter((addon) => addon.sKU.includes(ADDONS.AGENT))[0]\r\n}\r\n\r\nexport const getCurrentEndpoint = (addons: LmiProAddon[]) => {\r\n return addons.filter(\r\n (addon) => addon.sKU.includes(ADDONS.ENDPOINT) && addon.sKU !== ADDONS.ENDPOINT_PROTECTION_ADDON\r\n )[0]\r\n}\r\n\r\nexport const getUserSubscribedAccumulatedAddon = (subscriptions: BillingDetailedSubscriptionPlan[]) => {\r\n const userSubscribedAddonsQuantity = subscriptions.reduce((prev, curr) => {\r\n /* eslint-disable no-param-reassign */\r\n prev += curr.quantity\r\n return prev\r\n }, 0)\r\n\r\n const userSubscribedAccumulatedAddon = { ...subscriptions[subscriptions.length - 1] }\r\n userSubscribedAccumulatedAddon.quantity = userSubscribedAddonsQuantity\r\n\r\n return userSubscribedAccumulatedAddon\r\n}\r\n\r\nexport const getAccumulatedUserSubscriptions = (\r\n subscriptions: BillingDetailedSubscriptionPlan[],\r\n planData: LmiProPlan[]\r\n) => {\r\n const selectedPlan: LmiProPlan[] = planData.filter((plan: LmiProPlan) => {\r\n return !!subscriptions.find((sub: BillingDetailedSubscriptionPlan) => plan.sKU === sub.productSku)\r\n })\r\n\r\n // if user does not have any GoToLmiPro subscriptions, exit\r\n if (isEmpty(selectedPlan)) {\r\n return subscriptions\r\n }\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan[0].addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan[0].addons)\r\n const accumulatedSubscriptions = []\r\n\r\n const userSubscribedAgents = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentAgent.sKU\r\n )\r\n const userSubscribedEndpoints = subscriptions.filter(\r\n (sub: BillingDetailedSubscriptionPlan) => sub.productSku === currentEndpoint.sKU\r\n )\r\n\r\n if (userSubscribedAgents.length) {\r\n const userSubscribedAgent = getUserSubscribedAccumulatedAddon(userSubscribedAgents)\r\n accumulatedSubscriptions.push(userSubscribedAgent)\r\n }\r\n\r\n if (userSubscribedEndpoints.length) {\r\n const userSubscribedEndpoint = getUserSubscribedAccumulatedAddon(userSubscribedEndpoints)\r\n accumulatedSubscriptions.push(userSubscribedEndpoint)\r\n }\r\n\r\n accumulatedSubscriptions.push(\r\n ...subscriptions.filter((sub) => sub.productSku !== currentAgent.sKU && sub.productSku !== currentEndpoint.sKU)\r\n )\r\n\r\n return accumulatedSubscriptions\r\n}\r\n\r\nexport const getUserSubscribedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: LmiProPlan\r\n) => {\r\n if (!selectedPlan || !accountSubscriptions.length) return {}\r\n\r\n const currentAgent = getCurrentAgent(selectedPlan.addons)\r\n const currentEndpoint = getCurrentEndpoint(selectedPlan.addons)\r\n\r\n return {\r\n disablePlanSelection: false,\r\n disableExtraAddons: false,\r\n userSubscribedAgent: accountSubscriptions.find((sub) => sub.productSku === currentAgent?.sKU),\r\n userSubscribedEndpoint: accountSubscriptions.find((sub) => sub.productSku === currentEndpoint?.sKU),\r\n }\r\n}\r\n\r\nexport const getIncludedAddons = (\r\n accountSubscriptions: BillingDetailedSubscriptionPlan[],\r\n selectedPlan: LmiProPlan\r\n) => {\r\n if (!selectedPlan) return { includedEndpoints: 0, includedAgents: 0 }\r\n const { userSubscribedAgent, userSubscribedEndpoint } =\r\n accountSubscriptions && getUserSubscribedAddons(accountSubscriptions, selectedPlan)\r\n\r\n const includedAgents = userSubscribedAgent\r\n ? selectedPlan.userAgentsIncludedAmount + userSubscribedAgent.quantity\r\n : selectedPlan.userAgentsIncludedAmount\r\n\r\n const includedEndpoints = userSubscribedEndpoint\r\n ? selectedPlan.endpointsIncludedAmount + ADDONS.ENDPOINTS_ADDONS_INTERVAL * userSubscribedEndpoint.quantity\r\n : selectedPlan.endpointsIncludedAmount\r\n\r\n return { includedEndpoints, includedAgents }\r\n}\r\n","import { LmiProPlan } from '@lmipro/state/plan'\r\n\r\nexport const getCurrentPlan = (planSku: string, planData: LmiProPlan[]) => {\r\n // TODO: WAE1-3631: Refactor to choose most popular plan.\r\n const selectedPlan = planData.find((plan: LmiProPlan) => plan.sKU === planSku)\r\n if (!selectedPlan) {\r\n return planData[0]\r\n }\r\n return selectedPlan\r\n}\r\n\r\nexport const getPlanNameSet = (planData: LmiProPlan[]) =>\r\n planData.reduce((accSet, plan) => {\r\n accSet.add(plan.name.toLowerCase())\r\n return accSet\r\n }, new Set())\r\n","import { LmiProSelectedAddon } from '@lmipro/state/add-on'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProItems } from '@lmipro/state/checkout/state'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { PRODUCT_SKU, BILLING_TYPES, TimePeriod } from '@common/constants'\r\nimport { ADDONS } from '@lmipro/constants'\r\nimport { SubscriptionInfo } from './get-subscription-info'\r\n\r\nexport const getPaymentItems = (\r\n selectedPlan: LmiProPlan,\r\n organizers: number,\r\n selectedBillingFrequency: string,\r\n selectedAddons: LmiProSelectedAddon[],\r\n subscriptionInfo: SubscriptionInfo\r\n) => {\r\n const items: LmiProItems[] = []\r\n const billingFrequencyKey =\r\n selectedBillingFrequency === TimePeriod.AnnualBilledMonthly\r\n ? BILLING_TYPES.MONTHLYANNUAL\r\n : BILLING_TYPES.MONTHLY\r\n const billingFrequency = selectedBillingFrequency === TimePeriod.Year ? BILLING_TYPES.ANNUAL : billingFrequencyKey\r\n const contractLengthInMonth = billingFrequency === BILLING_TYPES.ANNUAL ? 12 : 1\r\n\r\n const planSubscription: LmiProItems = {\r\n itemId: 0,\r\n productSku: selectedPlan.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: organizers,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n }\r\n\r\n if (subscriptionInfo.plan && subscriptionInfo.isReplacementBooking && !subscriptionInfo.isTrial) {\r\n if (!subscriptionInfo.canUpgradePlan) {\r\n planSubscription.productSku = subscriptionInfo.plan.productSku\r\n planSubscription.quantity = subscriptionInfo.plan.quantity\r\n }\r\n\r\n planSubscription.subscriptionsToUpgrade = [\r\n {\r\n subscriptionId: subscriptionInfo.plan.subscriptionId,\r\n quantity: subscriptionInfo.plan.quantity,\r\n },\r\n ]\r\n\r\n subscriptionInfo.addons.forEach((addon: BillingDetailedSubscriptionPlan) => {\r\n planSubscription.subscriptionsToUpgrade?.push({\r\n subscriptionId: addon.subscriptionId,\r\n quantity: addon.quantity,\r\n })\r\n })\r\n }\r\n\r\n if (subscriptionInfo.isReplacementBooking) items.push(planSubscription)\r\n\r\n // add addon products to the items object\r\n if (selectedAddons.length > 0) {\r\n selectedAddons.forEach((addon: LmiProSelectedAddon) => {\r\n const v2plan = items.find(\r\n (item) =>\r\n (item.productSku === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 ||\r\n item.productSku === PRODUCT_SKU.LMIPRO_REMOTE_ACCESS) &&\r\n !item.subscriptionsToUpgrade\r\n )\r\n if (v2plan && addon.sKU.includes(ADDONS.AGENT)) {\r\n v2plan.quantity += addon.quantity\r\n } else {\r\n items.push({\r\n itemId: items.length,\r\n productSku: addon.sKU,\r\n paymentPlan: billingFrequency,\r\n quantity: addon.quantity,\r\n contractLengthInMonth,\r\n subscriptionsToUpgrade: null,\r\n })\r\n }\r\n })\r\n }\r\n\r\n return items\r\n}\r\n","/* eslint-disable camelcase */\r\nimport { trackEvent, getFormName } from '@common/utils'\r\nimport {\r\n BillingPeriod as BillingPeriodEnum,\r\n BillingPeriodKey,\r\n CURRENCY,\r\n PRODUCT_FAMILY_KEY,\r\n PRODUCT_FAMILY_NAME,\r\n TimePeriod,\r\n TRACKING_EVENTS,\r\n VIEW_PATH,\r\n} from '@common/constants'\r\nimport { LmiProCartData, LmiProPurchaseData, LmiProCustomizeItemsData } from '@lmipro/state/tracking/state'\r\nimport { PageViewContentData, SessionInfo, TrackECommerceData } from '@common/state/tracking/state'\r\nimport { BUY_TYPE, ADDONS, LMIPRO_USER_TYPES, LMIPRO_TRACKING_COMPONENTS } from '@lmipro/constants'\r\nimport { LmiProAddon } from '@lmipro/state/add-on'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProCouponProcessedDataPerSku } from '@lmipro/state/coupon/state'\r\nimport { get, cloneDeep } from 'lodash-es'\r\nimport { BillingPeriod } from '@lmipro/state/label-content'\r\n\r\nconst contentType: Record = {\r\n [VIEW_PATH.PATH_CUSTOMIZE]: 'plan',\r\n [VIEW_PATH.PATH_CHECKOUT]: 'buy-form',\r\n}\r\n\r\nconst morphAddonData = (addonList: LmiProAddon[]) => {\r\n const addonMap: Record = {}\r\n addonList.forEach((addon) => {\r\n addonMap[addon.sKU] = addon\r\n })\r\n return addonMap\r\n}\r\n\r\nexport const getBuyType = (userType: string) => {\r\n if (userType === LMIPRO_USER_TYPES.TRIALER) {\r\n return BUY_TYPE.TRIAL_CONVERSION\r\n }\r\n if (userType === LMIPRO_USER_TYPES.ADDON) {\r\n return BUY_TYPE.ADDON\r\n }\r\n return BUY_TYPE.DIRECT_BUY\r\n}\r\n\r\ninterface PreviousTrackData {\r\n step: number\r\n cartData: LmiProCartData | null\r\n}\r\nconst previousTrackData: PreviousTrackData = {\r\n step: 0, // default value\r\n cartData: null,\r\n}\r\nconst setPreviousStep = (step: number) => {\r\n previousTrackData.step = step\r\n}\r\nconst setPreviousCart = (cartData: LmiProCartData) => {\r\n previousTrackData.cartData = cloneDeep(cartData)\r\n}\r\n\r\ninterface ProcessCartData {\r\n plan?: LmiProPlan\r\n addonList?: LmiProAddon[]\r\n billingFrequency: TimePeriod\r\n organizers: number\r\n currency: CURRENCY\r\n tier: string\r\n currentVolumeDiscountPrice: number\r\n couponCode: string\r\n couponProcessedDataPerSku: LmiProCouponProcessedDataPerSku | null\r\n totalCouponSavings: number\r\n}\r\nconst getBillingFrequencyForTracker = (billingFrequency: TimePeriod, billingPeriod: BillingPeriod[]) => {\r\n if (billingFrequency === TimePeriod.Year) {\r\n return TimePeriod.Year\r\n }\r\n console.log({ billingPeriod })\r\n const filteredBillingPeriod = billingPeriod.filter((item: BillingPeriod) => item.key !== BillingPeriodKey.ANNUAL)\r\n if (filteredBillingPeriod.length > 0 && filteredBillingPeriod[0].key === BillingPeriodKey.ANNUALCONTRACT) {\r\n return TimePeriod.AnnualBilledMonthly\r\n }\r\n return TimePeriod.Month\r\n}\r\nconst getBillingFrequencyPlan = (billingFrequency: string, billingPeriod: BillingPeriod[]) => {\r\n if (billingFrequency === TimePeriod.Year) {\r\n return BillingPeriodEnum.ANNUAL\r\n }\r\n console.log({ billingPeriod })\r\n const filteredBillingPeriod = billingPeriod.filter((item: BillingPeriod) => item.key !== BillingPeriodKey.ANNUAL)\r\n if (filteredBillingPeriod.length > 0 && filteredBillingPeriod[0].key === BillingPeriodKey.ANNUALCONTRACT) {\r\n return BillingPeriodEnum.ANNUALBILLEDMONTHLY\r\n }\r\n return BillingPeriodEnum.MONTHLY\r\n}\r\nconst processCartData = (productData: ProcessCartData) => {\r\n const { plan, addonList, billingFrequency, organizers, currency, tier, currentVolumeDiscountPrice } = productData\r\n\r\n let planInfo: TrackECommerceData | null = null\r\n if (plan) {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = getBillingFrequencyForTracker(\r\n billingFrequency,\r\n plan.billingPeriods\r\n ).toLowerCase()\r\n planInfo = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMIPRO,\r\n item_category: PRODUCT_FAMILY_NAME.LMIPRO,\r\n item_category2: plan.name,\r\n item_category3: getBillingFrequencyForTracker(billingFrequency, plan.billingPeriods),\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant: 'Product',\r\n price: planPrice,\r\n quantity: organizers,\r\n volume_discount: currentVolumeDiscountPrice ? currentVolumeDiscountPrice / organizers : undefined,\r\n discount: get(productData, ['couponProcessedDataPerSku', plan.sKU, 'discountUnitSavings'], 0),\r\n product_discount_tier: tier,\r\n coupon: get(productData, ['couponProcessedDataPerSku', plan.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n }\r\n\r\n let addonInfoList: TrackECommerceData[] | null = null\r\n if (addonList) {\r\n addonInfoList = addonList.map((addon) => {\r\n const addonPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? addon.pricingInfo.USD.annual.tier1.price * 12\r\n : addon.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const addonInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMIPRO,\r\n item_category: PRODUCT_FAMILY_NAME.LMIPRO,\r\n item_category2: addon.name,\r\n item_category3: billingFrequency,\r\n item_category4: '1',\r\n item_category5: undefined,\r\n item_name: `${PRODUCT_FAMILY_NAME.LMIPRO} ${addon.name}_${billingFrequencyLowerCase}`,\r\n item_id: `${addon.sKU}_${billingFrequencyLowerCase}`,\r\n item_variant:\r\n addon.sKU === ADDONS.MOBILE_ADDON ||\r\n addon.sKU === ADDONS.CAMERA_SHARE_ADDON ||\r\n addon.sKU === ADDONS.ENDPOINT_PROTECTION_ADDON\r\n ? 'Add-on'\r\n : 'Product',\r\n price: addonPrice,\r\n quantity: addon.quantity,\r\n volume_discount: addon.discountPrice ? addon.discountPrice / addon.quantity : undefined,\r\n discount:\r\n get(productData, ['couponProcessedDataPerSku', addon.sKU, 'discountUnitSavings'], 0) || undefined,\r\n product_discount_tier: addon.tier || undefined,\r\n coupon: get(productData, ['couponProcessedDataPerSku', addon.sKU], undefined)\r\n ? productData.couponCode\r\n : undefined,\r\n }\r\n return addonInfo\r\n })\r\n }\r\n\r\n const cartItems: TrackECommerceData[] = []\r\n if (planInfo) {\r\n cartItems.push(planInfo)\r\n }\r\n if (addonInfoList) {\r\n cartItems.push(...addonInfoList)\r\n }\r\n return cartItems\r\n}\r\n\r\nexport const trackAddToCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ADD_TO_CART, eventData })\r\n}\r\n\r\nexport const trackRemoveFromCart = (productData: ProcessCartData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.REMOVE_FROM_CART, eventData })\r\n}\r\n\r\nexport const checkCartData = (cartData: LmiProCartData) => {\r\n const previousCartData = previousTrackData.cartData\r\n if (previousCartData) {\r\n const {\r\n plan,\r\n plan: { addons },\r\n } = cartData\r\n const currentCartPlan = plan\r\n const currentCartAddons = morphAddonData(cartData.addonList)\r\n const previousCartPlan = previousCartData.plan\r\n const previousCartAddons = morphAddonData(previousCartData.addonList)\r\n\r\n if (currentCartPlan.name !== previousCartPlan.name) {\r\n trackRemoveFromCart(previousCartData)\r\n trackAddToCart(cartData)\r\n } else {\r\n let removedOrganizers = 0\r\n let addedOrganizers = 0\r\n const removedAddonList: LmiProAddon[] = []\r\n const addedAddonList: LmiProAddon[] = []\r\n if (previousCartData.organizers > cartData.organizers) {\r\n removedOrganizers = previousCartData.organizers - cartData.organizers\r\n } else if (previousCartData.organizers < cartData.organizers) {\r\n addedOrganizers = cartData.organizers - previousCartData.organizers\r\n }\r\n addons.forEach((addon: LmiProAddon) => {\r\n const addonSku = addon.sKU\r\n const currentAddon = currentCartAddons[addonSku]\r\n const previousAddon = previousCartAddons[addonSku]\r\n if (currentAddon && previousAddon) {\r\n if (previousAddon.quantity > currentAddon.quantity) {\r\n const removedQuantity = previousAddon.quantity - currentAddon.quantity\r\n const removedAddon = { ...currentAddon, quantity: removedQuantity }\r\n removedAddonList.push(removedAddon)\r\n } else if (previousAddon.quantity < currentAddon.quantity) {\r\n const addedQuantity = currentAddon.quantity - previousAddon.quantity\r\n const addedAddon = { ...currentAddon, quantity: addedQuantity }\r\n addedAddonList.push(addedAddon)\r\n }\r\n } else if (!previousAddon && currentAddon) {\r\n addedAddonList.push({ ...currentAddon, quantity: currentAddon.quantity })\r\n } else if (previousAddon && !currentAddon) {\r\n removedAddonList.push({ ...previousAddon, quantity: previousAddon.quantity })\r\n }\r\n })\r\n\r\n const removedCartData: ProcessCartData = { ...cartData }\r\n const addedCartData: ProcessCartData = { ...cartData }\r\n if (removedOrganizers === 0) {\r\n removedCartData.plan = undefined\r\n } else if (removedOrganizers > 0) {\r\n removedCartData.organizers = removedOrganizers\r\n }\r\n if (addedOrganizers === 0) {\r\n addedCartData.plan = undefined\r\n } else if (addedOrganizers > 0) {\r\n addedCartData.organizers = addedOrganizers\r\n }\r\n\r\n if (removedAddonList.length === 0) {\r\n removedCartData.addonList = undefined\r\n } else if (removedAddonList.length > 0) {\r\n removedCartData.addonList = removedAddonList\r\n }\r\n\r\n if (addedAddonList.length === 0) {\r\n addedCartData.addonList = undefined\r\n } else if (addedAddonList.length > 0) {\r\n addedCartData.addonList = addedAddonList\r\n }\r\n\r\n if (addedAddonList.length > 0 || addedOrganizers > 0) {\r\n trackAddToCart(addedCartData)\r\n }\r\n if (removedAddonList.length > 0 || removedOrganizers > 0) {\r\n trackRemoveFromCart(removedCartData)\r\n }\r\n }\r\n } else {\r\n // just for double check, because there will always be previous cartData\r\n // if you are in checkCartData function because of the order in which events are fired\r\n trackAddToCart(cartData)\r\n }\r\n}\r\n\r\nexport const trackCustomizeViewItem = (customizeItemsData: LmiProCustomizeItemsData) => {\r\n const { planData, billingFrequency, currency, organizers } = customizeItemsData\r\n\r\n // See \"view_item\" column in spreadsheet attached to WAE1-174\r\n const items = planData.map((plan) => {\r\n const planPrice =\r\n billingFrequency === TimePeriod.Year\r\n ? plan.pricingInfo.USD.annual.tier1.price * 12\r\n : plan.pricingInfo.USD.monthly.tier1.price\r\n const billingFrequencyLowerCase = billingFrequency.toLowerCase()\r\n const planInfo: TrackECommerceData = {\r\n currency,\r\n item_brand: PRODUCT_FAMILY_NAME.LMIPRO, // product_name\r\n item_category: PRODUCT_FAMILY_NAME.LMIPRO, // product_name\r\n item_category2: plan.name, // product_id\r\n item_category3: billingFrequency, // product_period\r\n item_category4: '1', // product_duration\r\n item_name: `${plan.name}_${billingFrequencyLowerCase}`, // Product / add-on name with period\r\n item_id: `${plan.sKU}_${billingFrequencyLowerCase}`, // Product / add-on unique identifier, sku with period\r\n item_variant: 'Product', // Specify if it's a \"Product\" or an \"Add-on\"\r\n price: planPrice, // product_price\r\n quantity: organizers, // product_quantity\r\n }\r\n return planInfo\r\n })\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items,\r\n },\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_ITEM, eventData })\r\n}\r\n\r\nexport const trackViewContent = (userData: PageViewContentData, pageName: string) => {\r\n const formName = getFormName(pageName)\r\n const contentTypeName = `/${pageName.split('/')[2]}`\r\n const eventData = {\r\n platform_environment: `${PRODUCT_FAMILY_KEY.LMIPRO}-${process.env.ENVIRONMENT}`,\r\n platform_product: PRODUCT_FAMILY_KEY.LMIPRO,\r\n platform_type: 'marketing',\r\n platform_locale: userData.locale,\r\n platform_country: userData.country,\r\n platform_language: userData.language,\r\n section: 'web',\r\n sub_section: PRODUCT_FAMILY_KEY.LMIPRO,\r\n template: pageName,\r\n content_type: `${pageName}-${contentType[contentTypeName]}`,\r\n page_type: pageName,\r\n content_number: 1,\r\n login_status: userData.isUserLoggedIn,\r\n funnel_name: `${PRODUCT_FAMILY_KEY.LMIPRO}:marketing:${pageName}`,\r\n form_name: formName,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.VIEW_CONTENT, eventData })\r\n}\r\n\r\nexport const trackSessionInfo = (sessionInfo: SessionInfo) => {\r\n const eventData = {\r\n session_last: sessionInfo.sessionLast,\r\n session_number: sessionInfo.sessionNumber,\r\n user_type: sessionInfo.userType,\r\n is_logged_in: sessionInfo.isUserLoggedIn,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.SESSION_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackBeginCheckout = (productData: LmiProCartData, currentStep: number) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems,\r\n },\r\n actionField: {\r\n step: currentStep,\r\n coupon: productData.couponCode || undefined,\r\n },\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.BEGIN_CHECKOUT, eventData })\r\n // if user navigates directly to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 0 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user navigates from customize page (step 1) to checkout page (step 2), check cart data\r\n if (previousTrackData.step === 1 && currentStep === 2) {\r\n checkCartData(productData)\r\n }\r\n // if user starts off in customize page, do not set previouse cart data yet, as it remains undefined\r\n if (previousTrackData.step !== 0) {\r\n setPreviousCart(productData)\r\n }\r\n setPreviousStep(currentStep)\r\n\r\n if (currentStep === 2 && productData.isExistingUser) {\r\n trackBeginCheckout(productData, 3)\r\n trackBeginCheckout(productData, 4)\r\n }\r\n}\r\n\r\nexport const trackPurchase = (productData: LmiProCartData, purchaseData: LmiProPurchaseData) => {\r\n const { tier, currentVolumeDiscountPrice, totalCouponSavings } = productData\r\n const cartItems = processCartData(productData)\r\n const buyType = getBuyType(purchaseData.userType)\r\n const eventData = {\r\n ecommerce: {\r\n items: cartItems.map((item) => ({\r\n ...item,\r\n buy_type: buyType,\r\n })),\r\n },\r\n actionField: {\r\n transaction_id: purchaseData.transactionID,\r\n coupon: productData.couponCode || undefined,\r\n tax: purchaseData.calculatedTax,\r\n revenue: purchaseData.calculatedNetTotal,\r\n },\r\n plan: getBillingFrequencyForTracker(productData.billingFrequency, productData.plan.billingPeriods),\r\n buy_type: buyType,\r\n conversion_type: 'purchase',\r\n discount_tier: tier,\r\n discount_total: currentVolumeDiscountPrice + totalCouponSavings,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.PURCHASE, eventData })\r\n}\r\n\r\nexport const trackPurchaseError = (errorMessage: string, productData: LmiProCartData, buyType: string) => {\r\n console.log('Product Data Testing', productData)\r\n const eventData = {\r\n plan: getBillingFrequencyPlan(productData.billingFrequency, productData.plan.billingPeriods), // 'annual' or 'monthly'\r\n // eslint-disable-next-line\r\n\r\n buy_type: buyType, // 'add-on' or 'direct buy'\r\n conversion_type: 'purchase', // static value, case-sensitive\r\n error_purchase_message: errorMessage,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_PURCHASE, eventData })\r\n}\r\n\r\nexport const trackCompleteBuy = (userType: string, userEmail: string, productData: LmiProCartData) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.LMIPRO,\r\n buy_type: getBuyType(userType),\r\n plan: getBillingFrequencyForTracker(productData.billingFrequency, productData.plan.billingPeriods),\r\n conversion_type: 'purchase',\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.COMPLETE_BUY_FLOW, eventData })\r\n}\r\n\r\nexport const trackFormError = (formIds: string[], formErrors: string[], pageName: string) => {\r\n const eventData = {\r\n form_error_id: formIds.toString(),\r\n form_error_message: formErrors.toString(),\r\n form_name: getFormName(pageName),\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ERROR_FORM, eventData })\r\n}\r\n\r\nexport const trackUserInformation = (userType: string, userEmail: string, productData: LmiProCartData) => {\r\n const eventData = {\r\n buy_type: getBuyType(userType),\r\n plan: productData.billingFrequency,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.USER_INFORMATION, eventData })\r\n}\r\n\r\nexport const trackEmailValidation = (formName: string, userEmail: string) => {\r\n const eventData = {\r\n form_name: formName,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.EMAIL_VALIDATION, eventData })\r\n}\r\n\r\nexport const trackLogin = (userEmail: string) => {\r\n const eventData = {\r\n platform_product: PRODUCT_FAMILY_KEY.LMIPRO,\r\n user_email: userEmail,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.LOGIN, eventData })\r\n}\r\n\r\nexport const trackAbandonForm = () => {\r\n const eventData = {\r\n form_name: LMIPRO_TRACKING_COMPONENTS.CHECKOUT_PAGE,\r\n }\r\n trackEvent({ event: TRACKING_EVENTS.ABANDON_FORM, eventData })\r\n}\r\n","import { LmiProErrorContent } from '@lmipro/state/checkout-form-container/state'\r\nimport * as Yup from 'yup'\r\nimport zxcvbn from 'zxcvbn'\r\nimport { parse } from 'date-fns/parse'\r\nimport { isDate } from 'date-fns/isDate'\r\nimport { isValidPostalCode } from '@common/utils/isValidPostalCode'\r\n\r\nconst isValidDate = (date: string | Date) => {\r\n return date instanceof Date && !Number.isNaN(date.getTime())\r\n}\r\n\r\nconst emailValidation = (errorInvalidEmail: string, errorRequiredEmail?: string) => {\r\n return Yup.string()\r\n .required(errorRequiredEmail || errorInvalidEmail)\r\n .min(2, errorInvalidEmail)\r\n .email(errorInvalidEmail)\r\n .matches(\r\n new RegExp(\r\n \"^((?!(.+\\\\.\\\\.+))(?!(.+\\\\.@+))(?!(^\\\\.))([a-zA-Z_0-9-+!#\\\\$\\\\.\\\\*\\\\^']{1,63}))@((?:[a-zA-Z_0-9-]+\\\\.)*[a-zA-Z_0-9][a-zA-Z_0-9-]*)\\\\.([a-z]{2,})$\"\r\n ),\r\n errorInvalidEmail\r\n )\r\n}\r\n\r\nconst nameValidation = (requiredErrorMessage: string, invalidCharacterErrorMessage: string) => {\r\n return (\r\n Yup.string()\r\n .required(requiredErrorMessage)\r\n .min(2, requiredErrorMessage)\r\n // a to z, latin characters from dec 192 t0 214, 216 to 246 and 248 to 255,\r\n // https://blog.robertelder.org/character-ranges-class-negation-regular-expressions/\r\n // eslint-disable-next-line\r\n .matches(new RegExp(/^[\\p{L}0-9 !,()&.?‘'\\-+\\/]*$/gu), invalidCharacterErrorMessage)\r\n )\r\n}\r\n\r\nexport const passwordValidation = () => {\r\n return Yup.string()\r\n .required()\r\n .test((pw) => zxcvbn(pw).score >= 3)\r\n}\r\n\r\nconst addressValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst countryValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nconst zipcodeValidation = (country: string, errorRequiredPostalCode: string, errorInvalidPostalCode: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPostalCode)\r\n .min(3, errorInvalidPostalCode)\r\n .max(12, errorInvalidPostalCode)\r\n .test('ZipCodeRegEx', errorInvalidPostalCode, (value) => isValidPostalCode(country, value as string))\r\n}\r\n\r\nconst contactPhoneValidation = (errorInvalidCharacter: string, errorRequiredPhoneNumber: string) => {\r\n return Yup.string()\r\n .required(errorRequiredPhoneNumber)\r\n .matches(new RegExp('^(?=(?:\\\\D*\\\\d){6}).*$'), errorInvalidCharacter)\r\n}\r\n\r\nconst expDateValidation = (errorInvalidExpirationDate: string, errorRequiredExpDate: string) => {\r\n const lastMonthDate = new Date()\r\n lastMonthDate.setMonth(lastMonthDate.getMonth() - 1)\r\n\r\n const parseDateString = (_value: string, originalValue: string) => {\r\n const parsedDate = isDate(originalValue) ? originalValue : parse(originalValue, 'MM/yy', new Date())\r\n const expiredMonthDate = new Date()\r\n expiredMonthDate.setMonth(expiredMonthDate.getMonth() - 2)\r\n return isValidDate(parsedDate) ? parsedDate : expiredMonthDate\r\n }\r\n return Yup.date()\r\n .required(errorRequiredExpDate)\r\n .min(lastMonthDate, errorInvalidExpirationDate)\r\n .transform(parseDateString)\r\n}\r\n\r\nconst taxNumberValidation = (errorRequiredMessage: string) => {\r\n return Yup.string().required(errorRequiredMessage)\r\n}\r\n\r\nexport const CheckoutSchema = (country: string, errorContent: LmiProErrorContent) => {\r\n const {\r\n errorInvalidPhoneNumber,\r\n errorInvalidCharacter,\r\n errorInvalidEmail,\r\n errorInvalidExpirationDate,\r\n errorRequiredAddress,\r\n errorRequiredCity,\r\n errorRequiredFirstName,\r\n errorRequiredLastName,\r\n errorRequiredPostalCode,\r\n errorRequiredState,\r\n errorRequiredCountry,\r\n errorRequiredEmail,\r\n errorRequiredExpDate,\r\n errorRequiredPhoneNumber,\r\n errorInvalidPostalCode,\r\n errorRequiredTaxNumber,\r\n } = errorContent\r\n\r\n return Yup.object().shape({\r\n Email: emailValidation(errorInvalidEmail, errorRequiredEmail),\r\n FirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n LastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Password: passwordValidation(),\r\n BillingFirstName: nameValidation(errorRequiredFirstName, errorInvalidCharacter),\r\n BillingLastName: nameValidation(errorRequiredLastName, errorInvalidCharacter),\r\n Street1: addressValidation(errorRequiredAddress),\r\n City: addressValidation(errorRequiredCity),\r\n CountryCode: countryValidation(errorRequiredCountry),\r\n StateCode: addressValidation(errorRequiredState),\r\n ZipCode: zipcodeValidation(country, errorRequiredPostalCode, errorInvalidPostalCode),\r\n ContactPhone: contactPhoneValidation(errorInvalidPhoneNumber, errorRequiredPhoneNumber),\r\n ExpirationDate: expDateValidation(errorInvalidExpirationDate, errorRequiredExpDate),\r\n TaxNumber: taxNumberValidation(errorRequiredTaxNumber),\r\n TaxType: Yup.string(),\r\n CompanyName: Yup.string(),\r\n })\r\n}\r\n\r\nexport const checkAlphaNumerical = (value: string) => {\r\n return !!value.match(/^[A-Za-zÀ-ÖØ-öø-ÿ0-9]+$/) || value === ''\r\n}\r\n","import {\r\n BillingPeriod,\r\n CURRENCY,\r\n TimePeriod,\r\n COUPON_DISCOUNT_TYPE,\r\n COUPON_PAYMENT_PLAN,\r\n COUPON_TYPE,\r\n} from '@common/constants'\r\n\r\nimport { CouponItem, CouponServerData } from '@common/state/coupon/state'\r\n\r\nimport {\r\n LmiProCheckCouponProductsValidityParameters,\r\n LmiProCouponProcessedDataPerSku,\r\n LmiProCouponSkuValidity,\r\n LmiProCouponState,\r\n} from '@lmipro/state/coupon/state'\r\n\r\nimport {\r\n LmiProCouponCalculation,\r\n GetLmiProProductItemsParameters,\r\n LmiProProcessCouponDataParameters,\r\n LmiProProductDetails,\r\n} from '@lmipro/state/coupon-util'\r\n\r\nimport { isEmpty, get } from 'lodash-es'\r\nimport { ADDONS, PRODUCT_PRICE_ITEM_TYPE } from '@lmipro/constants'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProProductPriceItem } from '@lmipro/state/calculate-price'\r\n\r\nexport const getActiveCouponServerData = (coupon: LmiProCouponState, selectedPlan: LmiProPlan) => {\r\n const { couponServerData, isUrlCouponActive, isCMSCouponActive } = coupon\r\n if (isUrlCouponActive) {\r\n return couponServerData\r\n }\r\n if (isCMSCouponActive && !isEmpty(selectedPlan?.activeCoupon)) {\r\n return selectedPlan.activeCoupon\r\n }\r\n return null\r\n}\r\n\r\nexport const getAvailableCouponServerData = (\r\n coupon: LmiProCouponState,\r\n selectedPlan: LmiProPlan\r\n): [CouponServerData | null, boolean] => {\r\n const { couponServerData, isUrlCouponCodeAvailable } = coupon\r\n if (!isEmpty(couponServerData) && isUrlCouponCodeAvailable) {\r\n return [couponServerData, true]\r\n }\r\n if (!isEmpty(selectedPlan?.activeCoupon)) {\r\n return [selectedPlan.activeCoupon, false]\r\n }\r\n return [null, false]\r\n}\r\n\r\nexport const isCouponDateValid = (start: string, end: string): boolean => {\r\n const startDate = new Date(start)\r\n const endDate = new Date(end)\r\n const currentDate = new Date()\r\n const currentDatems = currentDate.getTime()\r\n return currentDatems >= startDate.getTime() && currentDatems <= endDate.getTime()\r\n}\r\n\r\ninterface IsProductSkuAndPaymentPlanValidParameters {\r\n selectedProductSku: string\r\n couponValidationItemsMap: Map\r\n isAnnual: boolean\r\n}\r\ninterface CouponValidationItem {\r\n paymentPlan: Set\r\n}\r\n\r\nconst isProductSkuAndPaymentPlanValid = ({\r\n selectedProductSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n}: IsProductSkuAndPaymentPlanValidParameters): boolean => {\r\n const toCheckPaymentPlan = isAnnual ? COUPON_PAYMENT_PLAN.UPFRONTANNUAL : COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n if (couponValidationItemsMap.has(selectedProductSku)) {\r\n const { paymentPlan } = couponValidationItemsMap.get(selectedProductSku) as CouponValidationItem\r\n return paymentPlan.has(toCheckPaymentPlan)\r\n }\r\n\r\n return false\r\n}\r\n\r\nexport const checkCouponGenericValidity = (couponServerData: CouponServerData): boolean => {\r\n const { isCouponValid, validFrom, validTo } = couponServerData\r\n return isCouponValid && isCouponDateValid(validFrom, validTo)\r\n}\r\n\r\nexport const processFixTypeCouponValidity = (couponSkuValidity: LmiProCouponSkuValidity): LmiProCouponSkuValidity => {\r\n const fixCouponSkuValidity = { ...couponSkuValidity }\r\n const isAnyCouponSkuInvalid = Object.keys(couponSkuValidity).some(\r\n (couponSku) => couponSkuValidity[couponSku] === false\r\n )\r\n if (isAnyCouponSkuInvalid) {\r\n Object.keys(fixCouponSkuValidity).forEach((couponSku) => {\r\n fixCouponSkuValidity[couponSku] = false\r\n })\r\n }\r\n return fixCouponSkuValidity\r\n}\r\n\r\n// temporary code for default coupon Sku validity\r\nexport const falsyCouponSkuValidity = (couponSkuValidity: LmiProCouponSkuValidity): LmiProCouponSkuValidity => {\r\n return Object.keys(couponSkuValidity).reduce((skuAcc, currentSku) => {\r\n return { ...skuAcc, [currentSku]: false }\r\n }, {} as LmiProCouponSkuValidity)\r\n}\r\n\r\nexport const getCouponValidationItemsMap = (couponItems: CouponItem[]): Map => {\r\n const couponValidationItemsMap = new Map()\r\n couponItems.forEach((couponItem) => {\r\n const { productSku, paymentPlan } = couponItem\r\n if (!couponValidationItemsMap.has(productSku)) {\r\n const couponValidationItem: CouponValidationItem = { paymentPlan: new Set() }\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n }\r\n const couponValidationItem = couponValidationItemsMap.get(productSku) as CouponValidationItem\r\n couponValidationItem.paymentPlan.add(paymentPlan)\r\n couponValidationItemsMap.set(productSku, couponValidationItem)\r\n })\r\n return couponValidationItemsMap\r\n}\r\n\r\nexport const checkCouponProductsValidity = ({\r\n couponServerData,\r\n selectedPlanSku,\r\n selectedAddons,\r\n billingFrequency,\r\n}: LmiProCheckCouponProductsValidityParameters): LmiProCouponSkuValidity => {\r\n const { couponType, couponItems } = couponServerData\r\n const couponValidationItemsMap = getCouponValidationItemsMap(couponItems)\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const addonsValidity = selectedAddons.reduce((acc, selectedAddon) => {\r\n return {\r\n ...acc,\r\n [selectedAddon.sKU]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedAddon.sKU,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n }, {})\r\n const couponSkuValidity: LmiProCouponSkuValidity = {\r\n ...addonsValidity,\r\n [selectedPlanSku]: isProductSkuAndPaymentPlanValid({\r\n selectedProductSku: selectedPlanSku,\r\n couponValidationItemsMap,\r\n isAnnual,\r\n }),\r\n }\r\n // need to add the fixed coupon processing here later\r\n return couponType === COUPON_TYPE.FLEXIBLE ? couponSkuValidity : falsyCouponSkuValidity(couponSkuValidity)\r\n}\r\n\r\nexport const checkIfCouponAppliedToMinimumSelectedProducts = (couponSkuValidity: LmiProCouponSkuValidity): boolean => {\r\n return Object.values(couponSkuValidity).some((productValidity) => productValidity === true)\r\n}\r\n\r\nexport const calculateCouponDiscount = (\r\n couponDiscountType: COUPON_DISCOUNT_TYPE,\r\n productUnitPriceForCurrentTierWithBillingFrequency: number,\r\n couponDiscountAmount: number,\r\n productUnitPriceForBaseTierWithBillingFrequency: number\r\n): LmiProCouponCalculation | null => {\r\n switch (couponDiscountType) {\r\n case COUPON_DISCOUNT_TYPE.AMOUNTOFF: {\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponDiscountAmount / productUnitPriceForCurrentTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n discountPercentage,\r\n couponAmountOff: couponDiscountAmount,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.PERCENTAGEOFF: {\r\n const couponAmountOff = (productUnitPriceForCurrentTierWithBillingFrequency * couponDiscountAmount) / 100\r\n const discountUnitPrice = productUnitPriceForCurrentTierWithBillingFrequency - couponAmountOff\r\n return {\r\n discountPercentage: couponDiscountAmount,\r\n discountUnitPrice,\r\n couponAmountOff,\r\n }\r\n }\r\n\r\n case COUPON_DISCOUNT_TYPE.REPRICE: {\r\n const discountUnitPrice =\r\n couponDiscountAmount < productUnitPriceForCurrentTierWithBillingFrequency ? couponDiscountAmount : 0\r\n if (discountUnitPrice === 0) {\r\n return null\r\n }\r\n const couponAmountOff = productUnitPriceForBaseTierWithBillingFrequency - couponDiscountAmount\r\n const discountPercentage = Math.floor(\r\n (couponAmountOff / productUnitPriceForBaseTierWithBillingFrequency) * 100\r\n )\r\n return {\r\n discountUnitPrice,\r\n couponAmountOff,\r\n discountPercentage,\r\n }\r\n }\r\n default:\r\n return null\r\n }\r\n}\r\n\r\nexport const getProductItemsMap = ({\r\n billingFrequency,\r\n organizers,\r\n selectedPlan,\r\n selectedCurrency = CURRENCY.USD,\r\n selectedAddons,\r\n selectedTierIndex,\r\n}: GetLmiProProductItemsParameters): Map => {\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : BillingPeriod.MONTHLY\r\n const productItemsMap: Map = new Map()\r\n const isAnnual = billingFrequency === TimePeriod.Year\r\n const selectedPlanUnitPriceForCurrentTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier${selectedTierIndex + 1}`, 'price'],\r\n 0\r\n )\r\n\r\n const selectedPlanUnitPriceForBaseTier = get(\r\n selectedPlan,\r\n ['pricingInfo', selectedCurrency, billingFrequencyKey, `tier1`, 'price'],\r\n 0\r\n )\r\n\r\n const annualMultiplier = isAnnual ? 12 : 1\r\n const selectedPlanProductDetails: LmiProProductDetails = {\r\n quantity: organizers,\r\n unitPriceForCurrentTierWithBillingFrequency: selectedPlanUnitPriceForCurrentTier * annualMultiplier,\r\n unitPriceForBaseTierWithBillingFrequency: selectedPlanUnitPriceForBaseTier * annualMultiplier,\r\n }\r\n productItemsMap.set(selectedPlan.sKU, selectedPlanProductDetails)\r\n\r\n selectedAddons.forEach((addon) => {\r\n const { sKU, quantity } = addon\r\n const planAddons = selectedPlan.addons\r\n const filteredPlanAddons = planAddons.filter((planAddon) => planAddon.sKU === sKU)\r\n const planAddon = filteredPlanAddons[0]\r\n const planAddonPrice = get(planAddon, ['pricingInfo', selectedCurrency, 'price'], 0)\r\n const completePlanAddonPrice = planAddonPrice * annualMultiplier\r\n productItemsMap.set(sKU, {\r\n quantity,\r\n unitPriceForCurrentTierWithBillingFrequency: completePlanAddonPrice,\r\n unitPriceForBaseTierWithBillingFrequency: completePlanAddonPrice,\r\n })\r\n })\r\n return productItemsMap\r\n}\r\n\r\nexport const getCouponItemPriceMap = (\r\n couponServerData: CouponServerData,\r\n selectedCurrency: CURRENCY = CURRENCY.USD,\r\n isAnnual: boolean\r\n): Map => {\r\n const { couponItems } = couponServerData\r\n let isInvalid = false\r\n const couponItemsMap = new Map(\r\n couponItems\r\n .filter((couponItem) =>\r\n isAnnual\r\n ? couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL\r\n : couponItem.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY\r\n )\r\n .map((couponItem) => {\r\n const { productSku, priceChanges } = couponItem\r\n const selectedCurrencyPriceChangeList = priceChanges.filter(\r\n (price) => price.currency === selectedCurrency\r\n )\r\n const selectedCurrencyPriceChange = selectedCurrencyPriceChangeList[0]\r\n if (!selectedCurrencyPriceChange) {\r\n isInvalid = true\r\n } else {\r\n isInvalid = false\r\n }\r\n return [productSku, selectedCurrencyPriceChange?.value]\r\n })\r\n )\r\n return isInvalid ? new Map() : couponItemsMap\r\n}\r\n\r\nexport const processCouponData = ({\r\n couponDiscountType,\r\n productItemsMap,\r\n couponItemsMap,\r\n couponSkuValidity,\r\n}: LmiProProcessCouponDataParameters): LmiProCouponProcessedDataPerSku | null => {\r\n const productItemsEntries = [...productItemsMap.entries()]\r\n const couponDataPerSku: LmiProCouponProcessedDataPerSku = {}\r\n\r\n productItemsEntries.forEach(([productSku, productDetail]) => {\r\n if (couponSkuValidity[productSku] && couponItemsMap.has(productSku)) {\r\n const { quantity, unitPriceForBaseTierWithBillingFrequency, unitPriceForCurrentTierWithBillingFrequency } =\r\n productDetail\r\n const couponDiscountAmount = couponItemsMap.get(productSku) as number\r\n const calculatedCouponDiscount = calculateCouponDiscount(\r\n couponDiscountType,\r\n unitPriceForCurrentTierWithBillingFrequency,\r\n couponDiscountAmount,\r\n unitPriceForBaseTierWithBillingFrequency\r\n )\r\n if (calculatedCouponDiscount === null || calculatedCouponDiscount.discountUnitPrice <= 0) {\r\n couponDataPerSku[productSku] = null\r\n } else {\r\n const { discountUnitPrice, couponAmountOff, discountPercentage } = calculatedCouponDiscount\r\n couponDataPerSku[productSku] = {\r\n discountPercentage,\r\n discountUnitPrice,\r\n discountUnitSavings: couponAmountOff,\r\n discountTotalPrice: discountUnitPrice * quantity,\r\n discountTotalSavings: couponAmountOff * quantity,\r\n }\r\n }\r\n } else {\r\n couponDataPerSku[productSku] = null\r\n }\r\n })\r\n return isEmpty(couponDataPerSku) ? null : couponDataPerSku\r\n}\r\n\r\nexport const getCouponDoubleDipAmountForNewUser = (productPrices: LmiProProductPriceItem[]): number => {\r\n const couponDoubleDipAmount = productPrices.reduce((total, currentProductPrice) => {\r\n const { productSKU, type } = currentProductPrice\r\n if (type === PRODUCT_PRICE_ITEM_TYPE.product && productSKU === ADDONS.ADDITIONAL_NUMBERS) {\r\n return total + get(currentProductPrice, ['couponDiscount', 'amount'], 0)\r\n }\r\n return total\r\n }, 0)\r\n return couponDoubleDipAmount\r\n}\r\n\r\nexport const calculateCouponPrice = (type: string, originalPrice: number, value: number, isAnnual: boolean) => {\r\n if (type === COUPON_DISCOUNT_TYPE.PERCENTAGEOFF) {\r\n return originalPrice * ((100 - value) / 100)\r\n }\r\n if (type === COUPON_DISCOUNT_TYPE.AMOUNTOFF) {\r\n const localValue = isAnnual ? value / 12 : value\r\n const amountOff = originalPrice - localValue\r\n if (amountOff > 0) {\r\n return amountOff\r\n }\r\n return originalPrice\r\n }\r\n return isAnnual ? value / 12 : value\r\n}\r\n\r\nexport interface LmiProCouponPrices {\r\n couponAnnualPrice: number\r\n couponMonthlyPrice: number\r\n}\r\n\r\nexport const getCouponPrices = (\r\n plan: LmiProPlan,\r\n bossMonthlyPrice: number,\r\n bossAnnualPrice: number,\r\n couponState: LmiProCouponState\r\n): LmiProCouponPrices => {\r\n let couponMonthlyPrice = bossMonthlyPrice\r\n let couponAnnualPrice = bossAnnualPrice\r\n const couponData = getActiveCouponServerData(couponState, plan)\r\n const activeCoupon = couponData || plan.activeCoupon\r\n if (activeCoupon && activeCoupon.isCouponValid && activeCoupon.couponType !== COUPON_TYPE.FIX) {\r\n const thisPlansCoupons: CouponItem[] = activeCoupon.couponItems.filter(\r\n (planCoupon: CouponItem) => planCoupon.productSku === plan.sKU\r\n )\r\n thisPlansCoupons.forEach((thisCoupon) => {\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTMONTHLY) {\r\n couponMonthlyPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossMonthlyPrice,\r\n thisCoupon.priceChanges[0].value,\r\n false\r\n )\r\n }\r\n if (thisCoupon && thisCoupon.paymentPlan === COUPON_PAYMENT_PLAN.UPFRONTANNUAL) {\r\n couponAnnualPrice = calculateCouponPrice(\r\n activeCoupon.couponDiscountType,\r\n bossAnnualPrice,\r\n thisCoupon.priceChanges[0].value,\r\n true\r\n )\r\n }\r\n })\r\n }\r\n return { couponAnnualPrice, couponMonthlyPrice }\r\n}\r\n","import { LmiProBuyFormData } from '@lmipro/state/buy-form/state'\r\nimport { isEmpty, isEqual } from 'lodash-es'\r\n\r\nlet previousFormValues: LmiProBuyFormData\r\n\r\nexport const isValidationAddressEligible = (formValues: LmiProBuyFormData): boolean => {\r\n if (\r\n isEmpty(formValues.FirstName.trim()) ||\r\n isEmpty(formValues.LastName.trim()) ||\r\n isEmpty(formValues.Email.trim()) ||\r\n isEmpty(formValues.BillingFirstName.trim()) ||\r\n isEmpty(formValues.BillingLastName.trim())\r\n ) {\r\n return false\r\n }\r\n\r\n const hasFormValuesChanged = !isEqual(previousFormValues, formValues)\r\n previousFormValues = formValues\r\n return hasFormValuesChanged\r\n}\r\n\r\nexport const isAddressComplete = (\r\n formValues: LmiProBuyFormData,\r\n isStatesOptional?: boolean,\r\n isTaxRequired?: boolean\r\n): boolean => {\r\n if (\r\n isEmpty(formValues.CountryCode.trim()) ||\r\n isEmpty(formValues.City.trim()) ||\r\n isEmpty(formValues.Street1.trim()) ||\r\n (!isStatesOptional && isEmpty(formValues.StateCode.trim())) ||\r\n (isTaxRequired && !formValues.TaxNumber) ||\r\n isEmpty(formValues.ZipCode.trim())\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n","import { get, isEmpty } from 'lodash-es'\r\nimport { formatDate } from '@common/utils'\r\nimport { LmiProAddon, LmiProSelectedAddon } from '@lmipro/state/add-on'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { PRODUCT_PRICE_ITEM_TYPE, ADDON_SKUS } from '@lmipro/constants'\r\nimport { PRODUCT_SKU } from '@common/constants'\r\nimport { LmiProCouponProcessedDataPerSku } from '@lmipro/state/coupon/state'\r\nimport { getAddonVolumeDiscount } from '@lmipro/utils/calculate-volume-discount'\r\nimport { LmiProProductPriceItem } from '@lmipro/state/calculate-price'\r\n\r\nexport const getAddonPrice = (addon: LmiProAddon, annual: boolean, currency: string, currentTier: string) => {\r\n const price: number = get(addon, ['pricingInfo', currency, annual ? 'annual' : 'monthly', currentTier, 'price'], 0)\r\n return annual ? price * 12 : price\r\n}\r\n\r\nexport const calculateTotalPriceWithAddons = (\r\n calculatedPrice: number,\r\n selectedAddons: (LmiProSelectedAddon | null)[],\r\n selectedPlan: LmiProPlan,\r\n isAnnual: boolean,\r\n currency: string,\r\n currentTier: string\r\n) => {\r\n let total = calculatedPrice\r\n selectedAddons.forEach((addon) => {\r\n if (addon) {\r\n const currAddon = selectedPlan.addons.find((x) => x.sKU === addon.sKU)\r\n if (currAddon) {\r\n const { discountPrice } = getAddonVolumeDiscount(\r\n currAddon,\r\n addon.quantity,\r\n currency,\r\n isAnnual ? 'annual' : 'monthly',\r\n currentTier\r\n )\r\n if (\r\n addon.sKU === ADDON_SKUS.AGENT_ADDON &&\r\n (selectedPlan.sKU === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2 ||\r\n selectedPlan.sKU === PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2)\r\n ) {\r\n total -= discountPrice\r\n } else {\r\n total += getAddonPrice(currAddon, isAnnual, currency, currentTier) * addon.quantity - discountPrice\r\n }\r\n }\r\n }\r\n })\r\n return total\r\n}\r\n\r\nexport const formattedEndDate = (isAnnual: boolean, locale: string) => {\r\n const date = new Date()\r\n if (isAnnual) {\r\n date.setFullYear(date.getFullYear() + 1)\r\n } else {\r\n date.setMonth(date.getMonth() + 1)\r\n }\r\n\r\n const formattedExpDate = formatDate(date, 'UTC', locale)\r\n\r\n return formattedExpDate\r\n}\r\n\r\nexport const getFeesFromProductPrice = (productPrices: LmiProProductPriceItem[] | undefined): number => {\r\n let feeAmount = 0\r\n if (productPrices && !isEmpty(productPrices)) {\r\n const [feePriceItem] = productPrices.filter(\r\n (productPriceItem) => productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.fee\r\n )\r\n feeAmount = feePriceItem && !isEmpty(feePriceItem) ? feePriceItem.listPrice : 0\r\n }\r\n return feeAmount\r\n}\r\n// renewal billing amount is the sum of ((unitprice-proratedamount) of plan * organizers + (unirprice-proratedamount) of addon * number of selected addons)\r\nexport const getRenewalAmountForAddonUser = (\r\n productPrices: LmiProProductPriceItem[] | undefined,\r\n organizers: number,\r\n selectedAddons: LmiProAddon[]\r\n): number => {\r\n let renewalAmount = 0\r\n const selectedAddonQuantityMap = new Map(selectedAddons.map((addon) => [addon.sKU, addon.quantity]))\r\n if (productPrices && !isEmpty(productPrices)) {\r\n productPrices.forEach((productPriceItem) => {\r\n if (productPriceItem.type === PRODUCT_PRICE_ITEM_TYPE.product) {\r\n if (productPriceItem.itemId === 0) {\r\n renewalAmount += (productPriceItem.unitPrice - productPriceItem.proratedAmount) * organizers\r\n } else {\r\n const { productSKU } = productPriceItem\r\n renewalAmount +=\r\n (productPriceItem.unitPrice - productPriceItem.proratedAmount) *\r\n (selectedAddonQuantityMap.get(productSKU) || 0)\r\n }\r\n }\r\n })\r\n }\r\n return renewalAmount\r\n}\r\n\r\nexport const getCouponTotalSavings = (\r\n isCouponAppliedToPlan: boolean,\r\n couponProcessedDataPerSku: LmiProCouponProcessedDataPerSku | null,\r\n couponDoubleDipAmountForNewUser: number\r\n): number => {\r\n if (couponProcessedDataPerSku && isCouponAppliedToPlan) {\r\n const totalCouponSavings = Object.keys(couponProcessedDataPerSku).reduce((total, productSku) => {\r\n const productCouponData = couponProcessedDataPerSku[productSku]\r\n if (productCouponData && !isEmpty(productCouponData)) {\r\n return total + productCouponData.discountTotalSavings\r\n }\r\n return total\r\n }, 0)\r\n return totalCouponSavings + couponDoubleDipAmountForNewUser\r\n }\r\n return couponDoubleDipAmountForNewUser\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { LmiProSavedSessionState } from '@lmipro/state/checkout/state'\r\n\r\nexport const loadSessionState = () => {\r\n try {\r\n const serializedState = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n if (serializedState === null && language === null) {\r\n return undefined\r\n }\r\n\r\n return {\r\n ...(serializedState && { coupon: JSON.parse(serializedState) }),\r\n ...(language && { language: JSON.parse(language) }),\r\n } as LmiProSavedSessionState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveSessionState = (state: LmiProSavedSessionState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n sessionStorage.setItem(STORAGE_CONST.GTC_COUPON_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearSessionState = () => {\r\n try {\r\n const coupon = sessionStorage.getItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n const language = sessionStorage.getItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n\r\n if (coupon) sessionStorage.removeItem(STORAGE_CONST.GTC_COUPON_STORE)\r\n if (language) sessionStorage.removeItem(STORAGE_CONST.SAVED_LANGUAGE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { STORAGE_CONST } from '@common/constants'\r\nimport { LmiProSavedStoreState } from '@lmipro/state/checkout/state'\r\n\r\nexport const loadState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.LMIPRO_STORE)\r\n\r\n if (serializedState === null) {\r\n return undefined\r\n }\r\n\r\n return JSON.parse(serializedState) as LmiProSavedStoreState\r\n } catch (err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport const saveState = (state: LmiProSavedStoreState) => {\r\n try {\r\n const serializedState = JSON.stringify(state)\r\n localStorage.setItem(STORAGE_CONST.LMIPRO_STORE, serializedState)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n\r\nexport const clearState = () => {\r\n try {\r\n const serializedState = localStorage.getItem(STORAGE_CONST.LMIPRO_STORE)\r\n\r\n if (serializedState) localStorage.removeItem(STORAGE_CONST.LMIPRO_STORE)\r\n } catch (err) {\r\n // fail silently\r\n }\r\n}\r\n","import { FieldProps } from 'formik'\r\n\r\nexport const manuallyValidateFieldData = (fieldData: FieldProps) => {\r\n return (\r\n (!fieldData.meta.error && fieldData.meta.touched) ||\r\n (fieldData.meta.initialValue !== '' && !fieldData.meta.error)\r\n )\r\n}\r\n\r\nexport const scrollToError = () => {\r\n const top =\r\n document.getElementsByClassName('input__error')[0] ||\r\n document.getElementsByClassName('input-module__error')[0] ||\r\n document.getElementsByClassName('flex-field__flex-field--error')[0]\r\n if (top) {\r\n top.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })\r\n }\r\n}\r\n","import { BillingPeriod, CURRENCY, TimePeriod } from '@common/constants'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\nimport { LmiProPrice, LmiProPricing, LmiProTiers } from '@lmipro/state/price'\r\n\r\nconst tierMap = new Map()\r\n\r\nexport const getSelectedTierIndex = (\r\n currentOrganizers: number,\r\n billingFrequency: string,\r\n selectedPlan: LmiProPlan,\r\n currency: CURRENCY\r\n) => {\r\n const { sKU = '', pricingInfo } = selectedPlan ?? {}\r\n const identifier = `${sKU}-${currency}-${billingFrequency}-${currentOrganizers}`\r\n if (!tierMap.get(identifier)) {\r\n const currencyPricing = (pricingInfo?.[currency as keyof LmiProPrice] as LmiProPricing) ?? []\r\n const bFrequencyKey =\r\n billingFrequency === TimePeriod.AnnualBilledMonthly\r\n ? BillingPeriod.ANNUALBILLEDMONTHLY\r\n : BillingPeriod.MONTHLY\r\n const billingFrequencyKey = billingFrequency === TimePeriod.Year ? BillingPeriod.ANNUAL : bFrequencyKey\r\n const billingFrequencyTier = currencyPricing[billingFrequencyKey as keyof LmiProPricing] ?? []\r\n\r\n const billingFrequencyTierKeys = Object.keys(billingFrequencyTier)\r\n\r\n billingFrequencyTierKeys.some((tierName, index) => {\r\n const tierData = billingFrequencyTier[tierName as keyof LmiProTiers]\r\n if (currentOrganizers >= tierData.min && currentOrganizers <= tierData.max) {\r\n tierMap.set(identifier, index)\r\n return true\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return tierMap.get(identifier) as number\r\n}\r\n","import { ADDON_SKUS, ADDONS } from '@lmipro/constants'\r\nimport { BILLING_TYPES, PRODUCT_TYPES, PRODUCT_SKU, TimePeriod } from '@common/constants'\r\nimport { BillingDetailedSubscriptionPlan } from '@common/state/billing/state'\r\nimport { LmiProPlan } from '@lmipro/state/plan'\r\n\r\ninterface PlanSubscriptions {\r\n basic?: BillingDetailedSubscriptionPlan\r\n standard?: BillingDetailedSubscriptionPlan\r\n trial?: BillingDetailedSubscriptionPlan\r\n}\r\n\r\n// get the remaining days + 1 so that today is included\r\nconst getRemainingDays = (end: string) => {\r\n const today = new Date().setHours(0, 0, 0, 0)\r\n const lastday = +new Date(end)\r\n\r\n return Math.floor((lastday - today) / (1000 * 60 * 60 * 24)) + 1\r\n}\r\n\r\nexport interface SubscriptionInfo {\r\n plan?: BillingDetailedSubscriptionPlan\r\n addons: BillingDetailedSubscriptionPlan[]\r\n includedAgents: number\r\n includedEndpoints: number\r\n remainingDays: number\r\n canUpgradePlan: boolean\r\n canUpgradeCameraShare: boolean\r\n canUpgradeEndpointProtection: boolean\r\n canUpgradeMobile: boolean\r\n isReplacementBooking: boolean\r\n billingFrequency: TimePeriod\r\n isTrial: boolean\r\n}\r\n\r\nexport const getSubscriptionInfo = (\r\n billingFrequency: TimePeriod,\r\n selectedPlan: LmiProPlan,\r\n plans: LmiProPlan[],\r\n accountSubscriptions?: BillingDetailedSubscriptionPlan[]\r\n) => {\r\n const planSubscriptions: PlanSubscriptions = {}\r\n const subscriptionInfo: SubscriptionInfo = {\r\n addons: [],\r\n includedAgents: 0,\r\n includedEndpoints: 0,\r\n remainingDays: 0,\r\n canUpgradePlan: true,\r\n canUpgradeCameraShare: true,\r\n canUpgradeEndpointProtection: true,\r\n canUpgradeMobile: true,\r\n isReplacementBooking: true,\r\n billingFrequency,\r\n isTrial: false,\r\n }\r\n\r\n if (!selectedPlan) {\r\n return subscriptionInfo\r\n }\r\n\r\n subscriptionInfo.includedAgents = selectedPlan.userAgentsIncludedAmount\r\n subscriptionInfo.includedEndpoints = selectedPlan.endpointsIncludedAmount\r\n\r\n if (!accountSubscriptions) {\r\n return subscriptionInfo\r\n }\r\n\r\n accountSubscriptions.forEach((subscription) => {\r\n if (subscription.status === 'Active') {\r\n switch (subscription.productSku) {\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAME:\r\n case PRODUCT_SKU.LMIPRO_STANDARD_NAMED_V2:\r\n planSubscriptions.standard = subscription\r\n break\r\n\r\n case PRODUCT_SKU.LMIPRO_BASIC_NAMED:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_SUPPORT_NAMED_V2:\r\n case PRODUCT_SKU.LMIPRO_REMOTE_ACCESS:\r\n planSubscriptions.basic = subscription\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_AGENT_ADDON:\r\n case ADDON_SKUS.BASIC_AGENT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedAgents += subscription.quantity\r\n break\r\n\r\n case ADDON_SKUS.STANDARD_ENDPOINT_ADDON:\r\n case ADDON_SKUS.BASIC_ENDPOINT_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.includedEndpoints += subscription.quantity * ADDONS.ENDPOINTS_ADDONS_INTERVAL\r\n break\r\n\r\n case ADDON_SKUS.MOBILE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeMobile = false\r\n break\r\n\r\n case ADDON_SKUS.CAMERA_SHARE_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeCameraShare = false\r\n break\r\n\r\n case ADDON_SKUS.ENDPOINT_PROTECTION_ADDON:\r\n subscriptionInfo.addons.push(subscription)\r\n subscriptionInfo.canUpgradeEndpointProtection = false\r\n break\r\n\r\n default:\r\n break\r\n }\r\n\r\n if (subscription.planType === PRODUCT_TYPES.TRIAL) {\r\n planSubscriptions.trial = subscription\r\n }\r\n }\r\n })\r\n\r\n if (planSubscriptions.standard) {\r\n subscriptionInfo.plan = planSubscriptions.standard\r\n subscriptionInfo.canUpgradePlan = false\r\n } else if (planSubscriptions.basic) {\r\n subscriptionInfo.plan = planSubscriptions.basic\r\n } else if (planSubscriptions.trial) {\r\n subscriptionInfo.plan = planSubscriptions.trial\r\n subscriptionInfo.isTrial = true\r\n }\r\n\r\n if (subscriptionInfo.plan && !subscriptionInfo.isTrial) {\r\n const subscriptionBillingKey =\r\n subscriptionInfo.plan.paymentPlan === BILLING_TYPES.ANNUAL ? TimePeriod.Year : TimePeriod.Month\r\n const subscriptionBilling =\r\n subscriptionInfo.plan.paymentPlan === BILLING_TYPES.MONTHLYANNUAL\r\n ? TimePeriod.AnnualBilledMonthly\r\n : subscriptionBillingKey\r\n\r\n subscriptionInfo.isReplacementBooking =\r\n subscriptionInfo.plan.productSku !== selectedPlan.sKU ||\r\n subscriptionInfo.billingFrequency !== subscriptionBilling\r\n\r\n subscriptionInfo.remainingDays = getRemainingDays(subscriptionInfo.plan.endDate)\r\n\r\n if (subscriptionInfo.plan.productSku !== selectedPlan.sKU) {\r\n const subscribedPlan = plans.find((plan) => plan.sKU === subscriptionInfo.plan?.productSku)\r\n\r\n if (subscribedPlan) {\r\n const includedAgents =\r\n subscriptionInfo.includedAgents -\r\n selectedPlan.userAgentsIncludedAmount +\r\n subscribedPlan.userAgentsIncludedAmount\r\n const includedEndpoints =\r\n subscriptionInfo.includedEndpoints -\r\n selectedPlan.endpointsIncludedAmount +\r\n subscribedPlan.endpointsIncludedAmount\r\n\r\n subscriptionInfo.includedAgents =\r\n selectedPlan.userAgentsIncludedAmount > includedAgents\r\n ? selectedPlan.userAgentsIncludedAmount\r\n : includedAgents\r\n subscriptionInfo.includedEndpoints =\r\n selectedPlan.endpointsIncludedAmount > includedEndpoints\r\n ? selectedPlan.endpointsIncludedAmount\r\n : includedEndpoints\r\n }\r\n }\r\n }\r\n\r\n return subscriptionInfo\r\n}\r\n","import { LANGUAGE, STORAGE_CONST } from '@common/constants'\r\nimport { getSessionState } from '@common/utils'\r\n\r\nexport const getContentLanguage = () => getSessionState(STORAGE_CONST.SAVED_LANGUAGE) || LANGUAGE.EN\r\n","export default __webpack_public_path__ + \"img/img-icon-credit@2x.131980309a36a5f4ca734f70f1e7ce20.png\";","// extracted by mini-css-extract-plugin\nexport default {\"select-wrapper\":\"select-module__select-wrapper\",\"select-arrow\":\"select-module__select-arrow\",\"select-arrow--custom\":\"select-module__select-arrow--custom\",\"select-wrapper--compact\":\"select-module__select-wrapper--compact\",\"select-wrapper--custom\":\"select-module__select-wrapper--custom\",\"select-label\":\"select-module__select-label\",\"select-wrapper--focused\":\"select-module__select-wrapper--focused\",\"select\":\"select-module__select\",\"disabled\":\"select-module__disabled\",\"error\":\"select-module__error\",\"error-message\":\"select-module__error-message\",\"hint\":\"select-module__hint\",\"valid\":\"select-module__valid\",\"hide\":\"select-module__hide\"};","// extracted by mini-css-extract-plugin\nexport default {\"wrapper\":\"toggle-button-module__wrapper\",\"offLabel\":\"toggle-button-module__offLabel\",\"onLabel\":\"toggle-button-module__onLabel\",\"callout\":\"toggle-button-module__callout\",\"input\":\"toggle-button-module__input\",\"check\":\"toggle-button-module__check\",\"subCallout\":\"toggle-button-module__subCallout\",\"isOn--default\":\"toggle-button-module__isOn--default\",\"disabled\":\"toggle-button-module__disabled\",\"wrapper--large\":\"toggle-button-module__wrapper--large\",\"wrapper--order-summary\":\"toggle-button-module__wrapper--order-summary\",\"wrapper--resolve-order-summary\":\"toggle-button-module__wrapper--resolve-order-summary\",\"wrapper--annual-contract\":\"toggle-button-module__wrapper--annual-contract\",\"widget\":\"toggle-button-module__widget\",\"isOn--lmipro\":\"toggle-button-module__isOn--lmipro\",\"isOn--resolve\":\"toggle-button-module__isOn--resolve\"};","// extracted by mini-css-extract-plugin\nexport default {\"existing-info\":\"account-info-module__existing-info\",\"signin\":\"account-info-module__signin\",\"flex\":\"account-info-module__flex\",\"grid\":\"account-info-module__grid\",\"error-box\":\"account-info-module__error-box\"};"],"names":["isProduction","process","PLATFORM","PROD","Connect","lazy","Resolve","LmiPro","LmiCentral","RootView","SetWhoIs","DevToolsCastleToken","BuyProductRoutes","AppRoutes","React","Suspense","fallback","LoadingSpinner","BrowserRouter","Routes","Route","path","PRODUCT_PATH","CONNECT","element","RESOLVE","LOGMEINPRO","LOGMEINCENTRAL","BUY","Navigate","to","initialFatalErrorState","isFatalError","fatalErrorMessage","fatalErrorBlocker","fatalErrorType","undefined","initialModalState","isModalClosable","isModalOpen","errorMessage","initialFlexState","keyInfo","flexKey","keyId","mid","scaToken","isScaEnabledForMid","referenceId","tokenString","isCardValid","isCvvValid","userInteractedWithFlexField","userInteractedWithFlexFieldCvv","error","token","mask","cardType","microformCreated","fingerprint","cardinalChallengeCompleteJwt","isCardinalSetupComplete","locationInitialData","countries","states","validAddress","correctedAddress","addressLine1","city","country","phoneNumber","postalCode","state","addressErrors","isLocationInfoLoaded","locationInfo","COUNTRIES","US","currency","CURRENCY","USD","locale","LOCALES","EN_US","language","LANGUAGE","EN","isCountriesLoaded","isUserCountryAllowed","isValidatingAddress","initialLocationState","_objectSpread","initialMarketingState","displayOptOut","isUserOptOut","AccountActionTypes","accountActions","setAccountSubscriptions","subscriptions","createAction","SET_EXISTING_ACCOUNT_SUBSCRIPTIONS","updateAccountEmailVerification","emailVerificationInfo","UPDATE_ACCOUNT_EMAIL_VERIFICATION","initialAccountState","accountSubscriptions","initialContentState","initialCheckoutState","inlineErrors","commonAppReducer","combineReducers","fatalError","fatalErrorReducer","previousState","action","type","FatalErrorActionTypes","SET_FATAL_ERROR","payload","hasError","message","blocker","modal","modalReducer","ModalActionTypes","SET_MODAL_OPEN","SET_ERROR_MODAL","flex","flexReducer","FlexActionTypes","SET_KEY_INFO","key","SET_FINGERPRINT","SET_CARD_VALID","valid","SET_CVV_VALID","SET_USER_INTERACTED_WITH_FIELD","interacted","SET_USER_INTERACTED_WITH_FIELD_CVV","SET_ERROR","SET_TOKEN","SET_MICROFORM_CREATED","isCreated","RESET_FLEX_STATE","SET_CHALLENGE_COMPLETE_JWT","jwt","SET_CARDINAL_SETUP_COMPLETE","location","locationReducer","LocationActionTypes","SET_COUNTRIES","SET_STATES","SET_VALID_ADDRESS","isValid","SET_CORRECTED_ADDRESS","address","SET_IS_VALIDADING_ADDRESS","SET_ADDRESS_ERRORS","SET_LOCATION_INFO","SET_IS_LOCATION_INFO_LOADED","SET_FETCHED_COUNTRIES","SET_IS_USER_COUNTRY_ALLOWED","marketing","marketingReducer","MarketingActionsTypes","SET_DISPLAY_OPTOUT","displayOutOut","SET_IS_USER_OPTOUT","isUserOutOut","account","accountReducer","content","contentReducer","ContentActionTypes","SET_LANGUAGE","checkout","checkoutReducer","CheckoutActionTypes","SET_CHECKOUT_INLINE_ERROR","REMOVE_CHECKOUT_INLINE_ERROR","_state$inlineErrors","value","rest","_objectWithoutProperties","map","_toPropertyKey","trackErrorSaga","trackErrorMessage","errorData","window","hostname","pathname","call","trackFatalError","takeEvery","flexFormSaga","data","iterator","response","commonServices","guid","getGUID","put","flexActions","setFingerPrint","setKeyInfo","e","getFlexToken","fatalErrorActions","setFatalError","GET_FLEX_TOKEN","tokenGenerator","microform","options","Promise","resolve","reject","createToken","err","Error","createTokenSaga","select","getFlexState","date","flexMicroformInstance","getFlexMicroform","expirationMonth","substr","expirationYear","tokenBase64","atob","split","JSON","parse","setToken","CREATE_TOKEN","TrackingActionTypes","trackingSaga","trackingInfo","trackData","eventData","trackEvent","event","TRACK","loadLocationInfo","isExternal","locationInfoResponse","getExternalLocationInfo","commonservices","storedCountry","getCountryFromCookie","currencyRestricitons","eligibleCurrency","Object","values","includes","locationActions","getLocationInfo","setLocationInfo","setIsLocationInfoLoaded","console","takeLeading","GET_LOCATION_INFO","validateAddressSaga","isAddressValid","addressObj","firstName","FirstName","lastName","LastName","email","Email","Street1","City","ZipCode","StateCode","CountryCode","ContactPhone","exportCompliance","validateAddress","setIsValidatingAddress","delay","validateResponse","status","setValidAddress","setAddressErrors","setCorrectedAddress","errors","takeLatest","VALIDATE_ADDRESS","getCountriesSaga","setFetchedCountries","params","productFamily","sc_lang","countriesData","usaCountryData","find","abbreviation","filter","RESTRICTED_COUNTRIES","sortedCountryData","sort","a","b","name","unshift","setCountries","locationInfoData","getLocationState","eligibleCountry","GET_COUNTRIES","createFlexMicroformSaga","microformInstance","createFlexMicroform","setFlexMicroform","setMicroformCreated","CREATE_MICROFORM","clearFlexMicroformSaga","resetFlexState","CLEAR_FLEX_MICROFORM_INSTANCE","sanitizePayload","entries","reduce","acc","_ref","preprocessMarketoPayload","prepPayload","marketoAttributesFieldName","forEach","field","decodedKey","decodeURIComponent","decodedValue","campaignID","overrideCampaignID","Cookies","get","postToMarketoSaga","saveToLocalStorage","_action$payload$marke","marketoUserInfo","phone","userState","zipcode","userKey","accountKey","_excluded","getMarketingState","urlSplitForLanguage","siteLanguage","LANGUAGE_CODES","English","planType","MARKETO_PLAN_TYPE","TRIAL","mkto_trk","COOKIE_NAMES","MARKETO_TRK","lmi_ma","LMI_MA","chop_id","CHOP_ID","gclid","GCL_ID","GCL_ID_2","sourceUrl","href","optin","syncariPayload","planKey","productTier","product","UnsubscribedTemp","Temp_Country__c","Language__c","Most_Recent_Campaign__c","recentChopId","recentgclid","utm_medium","utmmedium","utm_source","utmsource","utm_campaign","utmcampaign","personSourceURL","contentStage","userreferrer","form_Id","toLowerCase","isLMIProduct","buildSyncariPayload","sessionStorage","setItem","stringify","postSyncari","postSavedMarketoToAWS","getItem","removeItem","POST_MARKETO","POST_MARKETO_SESSION_DATA_TO_AWS","createGetInternationalBlocker","some","setIsUserCountryAllowed","GET_IS_USER_COUNTRY_ALLOWED","updateAccountEmailVerifificationSaga","emailCode","emailToken","accessToken","getAccountState","isEmpty","updateUser","setLanguageSaga","saveSessionState","STORAGE_CONST","SAVED_LANGUAGE","countriesSaga","initializeGetCountriesSaga","errorSaga","initializeTrackErrorSaga","initializeFlexFormSaga","initializeCreateTokenSaga","initializeTrackingSaga","locationSaga","initializeLoadLocationInfoSaga","initializeValidateAddressSaga","initializeCreateFlexMicroformSaga","initializeClearFlexMicroformSaga","initializePostToMarketoSaga","internationalBlockerSaga","initializeCreateGetInternationalBlocker","updateAccountEmailVerificationSaga","setLanguage","initialData","Password","BillingFirstName","BillingLastName","ExpirationDate","buyFormStateInitialData","clearEmail","steps","CHECKOUTFORM_STEPS","CREATE_FLEX_TOKEN","completed","CREATE_USER_ACCOUNT","SAVE_BILLING_INFO","SAVE_PAYMENT_INFO","GET_AVAILABLE_PAYMENT_METHODS","SUBMIT_PAYMENT","contentData","CurrencyCode","ContentLoaded","Locale","PlanGroupId","DefaultCountry","marketoProductName","marketoSalesBrief","marketoSalesforceCampaignId","submittoMarketo","labelContent","quantityLabelLong","quantityLabel","quantityLabelPlural","password","useAccountInfo","header","customizePlan","errorMessageTitle","orderSummary","monthly","annual","save","user","year","month","subtotal","estimatedTax","tBD","todaysTotal","recurringAnnualCharge","recurringMonthlyCharge","autoRenewalNote","createAnAccount","billingInformation","passwordRequirements","paymentDetails","expirationDate","cVV","cVVHint","completePurchase","pricingNote","continue","changePlan","selectedPlan","signIn","errorInvalidCharacter","errorInvalidCVV","errorInvalidEmail","errorInvalidExpirationDate","errorInvalidPassword","errorInvalidPhoneNumber","errorInvalidTaxNumber","errorRequiredAddress","errorRequiredCity","errorRequiredFirstName","errorRequiredLastName","errorRequiredPostalCode","errorRequiredState","estimatedTaxPopupInfo","quantityPopupInfo","cVVPopupInfo","yearAbbr","monthAbbr","questions","myAccount","signOut","pleaseSelect","headerPhone","optOutCheckboxLabel","optOut","cardNumber","errorInvalidCreditCardNumber","accountInformation","notYou","emailAddressAlreadyInUse","additionalUserLicences","howManyMore","existingUserLicencePlural","existingUserLicense","additional","newUserLicense","total","proratedAdjustment","today","modalCloseButtonText","changePlanMethodModalHeader","changePlanModalSubheader","changePaymentMethodModalHeader","changePaymentMethodModalSubheader","edit","newRecurringAnnualTotal","newRecurringMonthlyTotal","previousAnnualTotal","previousMonthlyTotal","billingCycleCredit","getStartedNote","creatingAccountLeftHeader","creatingAccountLeftContent","creatingAccountRightHeader","creatingAccountRightContent","getStartedButtonText","getStartedButtonUrl","savingWithAnnualBilling","errorBlockedPurchase","errorGenericMessage","errorRequiredBIC","errorRequiredCVV","errorRequiredCountry","errorRequiredCreditCardNumber","errorRequiredEmail","errorRequiredExpDate","errorRequiredPassword","errorRequiredPhoneNumber","errorSummaryMessage","errorTooManyRequests","errorInvalidPostalCode","internalErrorMessage","calculating","newUserLicensePlural","fees","feesPopupText","changeNumberModalHeader","changeNumberModalContent","changePlanUrl","sEOPageTitle","notAvailableModalHeader","notAvailableModalContent","notAvailableModalButtonText","notAvailableModalButtonUrl","showMe","errorInvalidAddress","countryPopupText","paymentMethodErrorMessage","disabledUserError","addonUserSuccessUrl","percentageOffAnnualDiscount","percentageOffVolumeDiscount","totalSavings","volumeDiscountPopupText","percentageOffPromoDiscount","invalidQSCouponMessage","invalidQSCouponUsingCMSCouponMessage","couponValidMessage","dismiss","couponDisclaimer","couponAdjustmentSavings","couponAdjustmentSavingsPopupText","billedMonthlyPrice","billedAnnualPrice","secure","trustArcSupport","numberPickerLocalNumber","numberPickerLocalOption","numberPickerPortNumber","numberPickerYourNumber","numberPickerLocal","numberPickerTollFree","numberPickerTollFreeNumber","numberPickerChooseNumber","numberPickerEditNumber","numberPickerPleaseSelectNumber","numberPickerNoNumberSelected","numberPickerPhone","numberPickerPhoneNumberNoLongerAvailable","numberPickerChooseAvailableNumber","numberPickerNoResults","numberPickerMainNumber","numberPickerMainNumberSubText","numberPickerPortInstructions","numberPickerAreaCode","numberPickerAreaCodeHeader","numberPickerAreaCodeSubHeader","numberPickerBasic","numberPickerCancel","numberPickerClose","numberPickerReset","numberPickerSave","numberPickerSearch","numberPickerVanity","numberPickerVanityPhrase","numberPickerVanityPhraseDescriptionLine1","numberPickerVanityPhraseDescriptionLine2","numberPickerVanityPhraseDescriptionLine3","numberPickerVanityPhrasePlaceholder","numberPickerFailedToOrderPhoneNumberModalHeader","numberPickerFailedToOrderPhoneNumberModalSubHeader","numberPickerFailedToOrderPhoneNumberModalCloseButtonText","allrightsreservedDisclaimerLabel","termsandconditionsLabel","privacypolicyLabel","antiSpamPolicyLabel","trademarkLabel","doNotSellInfoLabel","sitemapLabel","termsandconditionsUrl","privacypolicyUrl","antiSpamPolicyUrl","trademarkUrl","doNotSellInfoUrl","sitemapUrl","passwordStrength","passwordStrengthLevel1","passwordStrengthLevel2","passwordStrengthLevel3","passwordStrengthLevel4","passwordStrengthTip1","passwordStrengthTip2","passwordStrengthTip3","passwordStrengthTipDrawer","planData","contentLoaded","isLoading","selectedAddons","submitting","organizers","promoCode","billingFrequency","TimePeriod","Year","calculatedTax","calculatedTotal","calculatedNetTotal","anniversaryDate","selectedPlanSku","savedStateLoaded","purchaseComplete","addonComplete","totalLoading","selectedTierIndex","currentVolumeDiscountPrice","volumeDiscountLoading","volumeDiscount","calculatedProratedAmount","isChoosingPhoneNumber","phoneNumberReservationId","phoneNumberVanityPhrase","reservingPhoneNumber","reservingPhoneNumberError","didFailToOrderPhoneNumber","autoLogin","buyFormInitialState","initialUserState","displayName","loadingExistingInfo","verifyingToken","userType","USER_TYPES","NEW","loggedIn","isUserLoggedIn","verifiedUserShouldLogIn","CouponActionTypes","couponActions","getCouponDetails","couponCode","GET_COUPON_DETAILS","validateCoupon","couponValidationData","isAttemptingUrlCoupon","VALIDATE_COUPON","calculateCouponPrice","couponCalculationData","CALCULATE_COUPON_PRICE","setCouponProcessedData","couponProcessedDataPerSku","SET_COUPON_PROCESSED_DATA","setCouponServerData","couponServerData","SET_COUPON_SERVER_DATA","checkCMSCoupon","CHECK_CMS_COUPON","resetCouponData","RESET_COUPON_DATA","setCouponValidAndApplied","isCouponValidAndApplied","SET_COUPON_VALID_AND_APPLIED","setCouponDoubleDipAmountForNewUser","couponDoubleDipAmountForNewUser","SET_COUPON_DOUBLE_DIP_AMOUNT_FOR_NEW_USER","setUrlCouponActive","isUrlCouponActive","SET_URL_COUPON_ACTIVE","observeValidateCMSCoupon","OBSERVE_VALIDATE_CMS_COUPON","checkVolumeDiscountAgainstRepriceCoupon","checkVolumeDiscountData","CHECK_VOLUME_DISCOUNT_AGAINST_REPRICE_COUPON","attemptForCMSCoupon","ATTEMPT_FOR_CMS_COUPON","setUrlCouponCode","SET_URL_COUPON_CODE","initialCouponState","isCMSCouponActive","isUrlCouponCodeAvailable","urlCouponCode","connectAppReducer","GET_LABEL_CONTENT","SET_CONTENT","plans","labels","SET_CONTENT_LOADED","loaded","GET_COMPARE_MODAL_CONTENT","SET_COUPON_DISCLAIMER","SET_LOADING","loading","SET_PURCHASE_COMPLETE","complete","SET_BILLING_FREQUENCY","frequency","CLEAR_ADDONS","SET_SELECTED_PLAN","planSku","SET_SELECTED_ADDONS","addons","SET_ORGANIZERS","SET_CALCULATED_PRICE","productPrices","net","tax","SET_SAVED_STATE_LOADED","SET_LOADING_TOTAL","SET_ADDON_COMPLETE","SET_SELECTED_TIER_INDEX","SET_VOLUME_DISCOUNT","volumeDiscountForSelectedPlanAndCurrency","selectedPlanSkuVolumeDiscount","SET_VOLUME_DISCOUNT_LOADING","SET_CURRENT_VOLUME_DISCOUNT_PRICE_AND_PERCENTAGE","ADJUST_CURRENT_VOLUME_DISCOUNT_FOR_REPRICE_COUPON","SET_PRORATED_AMOUNT","proratedAmount","RESET_CHECKOUT_STATE","SET_IS_CHOOSING_PHONE_NUMBER","SET_PHONE_NUMBER","SET_PHONE_NUMBER_RESERVATION_ID","SET_PHONE_NUMBER_VANITY_PHRASE","SET_RESERVING_PHONE_NUMBER","SET_RESERVING_PHONE_NUMBER_ERROR","SET_DID_FAIL_TO_ORDER_PHONE_NUMBER","SET_AUTO_LOGIN","form","buyFormReducer","BuyFormActionTypes","RESET_BUY_FORM","UPDATE_INITIAL_FORM_STATE","SET_CLEAR_EMAIL","clear","UPDATE_STEPS","stepName","stepResult","userReducer","UserActionTypes","SET_EXISTING_BILLING_INFO","billingInfo","existingBillingInformation","SET_EXISTING_USER_INFO","userInfo","existingUserInformation","SET_EXISTING_ACCOUNT_INFO","accountInfo","existingAccountInformation","SET_DISPLAY_NAME","SET_LOADING_EXISTING_INFO","SET_VERIFYING_TOKEN","verifying","SET_USER_TYPE","SET_EXISTING_PAYMENT_DETAILS","info","existingPaymentInformation","SET_ACCESS_TOKEN","SET_IS_USER_LOGGEDIN","SET_VERIFY_USER_SHOULD_LOGIN","coupon","couponReducer","length","apiQueryParams","sc_site","SC_SITE","getAvailablePaymentMethods","axios","withCredentials","createUserAccount","createBillingInfo","calculatePrice","savePayment","submitPayment","submitAbandonedCart","getLabelData","loadContentSaga","labelServerResponse","gtcServices","_labelServerResponse$","document","title","contentActions","setContent","setContentLoaded","createUserSaga","componentName","TRACKING_COMPONENTS","CREATE_USER_SAGA","userValues","userCreationResponse","gtcTrackingActions","track","TRACKING_EVENTS","ERROR_PURCHASE","CREATE_NEW_USER","getBillingValues","companyName","getSelectedPlan","getCheckoutState","planSkuToRetrieve","getPlanData","getCurrentPlan","getSelectedAddons","getCurrentAddons","getUpdatedPlanUrlParams","planNameSet","getPlanNameSet","updatePlanUrlParam","getPaymentItems","upgradeFlow","items","itemId","productSku","sKU","paymentPlan","quantity","contractLengthInMonth","subscriptionsToUpgrade","addon","index","push","createBillingInfoSaga","CREATE_BILLING_INFO_SAGA","billingValues","billingResponse","CREATE_BILLING_INFO","createPaymentSaga","CREATE_PAYMENT_SAGA","paymentValues","savePaymentResponse","CREATE_PAYMENT","submitPaymentSaga","SUBMIT_PAYMENT_SAGA","submitValues","submitCreation","getAvailablePaymentMethodsSaga","GET_AVAILABLE_PAYMENT_METHODS_SAGA","paymentMethodsCreation","deleteReservation","requestData","reservationIds","userId","numbersApiUserId","responseData","deleteNumbersReservation","Array","isArray","checkoutActions","setPhoneNumberReservationId","reservePhoneNumber","vanityPhrase","getLabelContent","setReservingPhoneNumberError","phoneNumbers","e164Number","reserveNumbers","reservationId","id","setPhoneNumber","setPhoneNumberVanityPhrase","orderPhoneNumber","phoneNumbersToOrder","isTollfreeOutbound","orderNumbers","numbersOrdered","setDidFailToOrderPhoneNumber","submitFormSaga","FORM_SUBMISSION_SAGA","getUserState","getContentData","userAccountAlreadyCreated","getBuyFormState","TRIALER","EXPIRED","CROSSPRODUCT","getCouponState","getActiveCouponServerData","isCouponValid","fingerPrintSessionId","productName","PRODUCTS","flexTokenAction","tokenData","buyFormActions","updateSteps","UserKey","AccountKey","createUserAction","userActions","createNewUser","userData","BillingId","setAutoLogin","xAutoLoginTicket","extraBillingValues","taxNumber","federalTaxType","createBillingInfoAction","paymentMethodType","flexFormData","flexResponse","flexKeyId","fingerprintSessionId","cardinalJwt","isScaCompleted","createPaymentAction","createPayment","paymentMethodKey","getAvailablePaymentData","products","grossAmount","submitPaymentAction","submitData","PURCHASE","invoiceNumber","abandonedCartData","success","setDisplayName","COMPLETE_BUY_FLOW","userEmail","marketoData","makeMarketoObject","marketingActions","postToMarketo","clearState","setPurchaseComplete","SUBMIT_BUY_FORM","abandonedCartSaga","isTrial","toString","program","employees","numOfEndpoints","addOnCameraShare","addonMobile","billing","plan","company","totalPrice","addOnQuantity","Name","GivenName","FamilyName","SUBMIT_ABANDONED_CART","existingUserSaga","emailAddress","canUserAuthenticate","setClearEmail","CHECK_EXISTING_USER","getAccessToken","setVerifyingToken","newAccessToken","authInit","setAccessToken","saveToken","clearUserSession","appInsightsTrackEvent","errormessage","setIsUserLoggedIn","setVerifyShouldUserLogIn","GET_ACCESS_TOKEN","userLogin","search","sso","authClass","USER_LOGIN","userLogout","logout","USER_LOGOUT","loadSavedStateSaga","savedState","loadState","savedSessionState","loadSessionState","urlPlan","queryBillingFrequency","minUsers","queryCouponCode","queryString","preselectedBillingFrequency","preselectedMinUsers","Number","preSavedCouponCode","Month","setBillingFrequency","setOrganizers","preselectedPlan","foundPlan","pln","toLocaleLowerCase","setSelectedPlan","foundAddons","setSelectedAddons","setSavedStateLoaded","GET_SAVED_STATE","calculatePriceSaga","CALCULATE_PRICE_SAGA","setTotalLoading","planSKU","ADDON","calculatePriceValues","cart","calculatePriceCreation","errorMessages","netAmount","taxAmount","setCalculatedPrice","planProductPrice","productPrice","amount","calculatedVolumeDiscount","getTotalVolumeDiscount","setCurrentVolumeDiscountPriceAndPercentage","getTotalProratedAmount","setProratedAmount","getCouponDoubleDipAmountForNewUser","modalActions","setErrorModal","CALCULATE_PRICE","userLoggedInSaga","setLoadingExistingInformation","verifyUser","access_token","PRODUCT_FAMILY_NAME","G2C","User","UserName","isBanned","hasGroupSubscription","trackAbandonForm","buyFormData","setUserType","BANNED","Code","USER_TYPES_RESPONSE","USER_IDENTITY_NOT_FOUND","setExistingUserInformation","USER_BOSS_NOT_FOUND","IDENTITY_ONLY","updateInitialFormState","billingInfoRequest","getBillingInfo","replace","processExistingBillingInfo","setExistingBillingInformation","paymentInfoRequest","getExistingPaymentDetails","currentDate","Date","currentYear","getFullYear","currentMonth","getMonth","ccInfo","creditCard","paymentInfo","last4Digits","setExistingPaymentDetails","subscriptionRequest","getBillingSubscriptions","connectSubscriptions","partition","startsWith","PREFIX","connectTrialSubscription","PRODUCT_TYPES","PRODUCT_SKU","G2C_JUST_TALK","startDate","endDate","renewalPrice","autorenew","subscriptionId","overallQuantity","accumulator","subItem","setExistingAccountInformation","BILLING_TYPES","ANNUAL","GET_LOGGED_IN_USER_STATE","isAddonFlow","EXISTING_USER_FORM_SUBMISSION_SAGA","stateCode","salesBrief","setAddonComplete","EXISTING_USER_SUBMIT_BUY_FORM","resetBuyFormAffectedStatesSaga","resetForm","RESET_BUY_FORM_AFFECTED_STATES","getCustomizeItemsData","getPageViewData","locationState","getSessionInfo","sessionLast","sessionNumber","getPhoneInfo","isLocalNumber","phoneNumberStatus","PHONE_NUMBER_STATUS","ENTERED","NOT_ENTERED","phoneNumberType","PHONE_NUMBER_TYPE","LOCAL","TOLL_FREE","getCartInfo","tierIndex","totalOrganizers","getSelectedTierIndex","totalCouponSavings","getCouponTotalSavings","addonList","isExistingUser","tier","getPurchaseData","transactionID","getCompleteBuyData","gtcTrackingSaga","eventName","formErrors","formIds","step","ctaClickData","url","formName","pathName","currentLocation","VIEW_ITEM","customizeItemsData","trackCustomizeViewItem","VIEW_CONTENT","viewContentData","trackViewContent","SESSION_INFORMATION","sessionData","trackSessionInfo","USER_INFORMATION","cartData","completeBuyData","trackUserInformation","BEGIN_CHECKOUT","phoneInfo","trackBeginCheckout","START_BUY_FLOW","trackGenericEvent","PRODUCT_FAMILY_KEY","purchaseData","trackPurchase","trackPurchaseError","EMAIL_VALIDATION","trackEmailValidation","trackCompleteBuy","START_CONTACT_SALES_FLOW","LOAD_FORM","START_FORM","ABANDON_FORM","SUBMIT_FORM","trackGenericFormEvent","ERROR_FORM","trackFormError","CLICK_CTA","trackCTAClick","GTCTrackingActionTypes","calculateVolumeDiscountSaga","setVolumeDiscountLoading","selectedCurrency","billingFrequencyVolumeDiscountRecords","calculateVolumeDiscount","setVolumeDiscount","getSelectedTierSaga","setSelectedTierIndex","getVolumeDiscount","getVolumeDiscountSaga","buyFormInitialData","billingFrequencyKey","BillingPeriod","MONTHLY","isAnnual","volumeDiscountPerTier","setVolumeDiscountAction","take","volumeDiscountPerTierNow","discountPricePerUnit","totalVolumeDiscount","setBillingFrequencySaga","validateCouponSaga","checkCouponGenericValidity","checkProductValidityArguments","couponSkuValidity","checkCouponProductsValidity","isCouponAppliedToMinimumProductsInCart","checkIfCouponAppliedToMinimumSelectedProducts","calculateCouponPriceActionPayload","getCouponDetailsSaga","couponInfoServerResponse","getCouponInfo","couponServerResponseData","setCouponDisclaimer","calculateCouponPriceSaga","couponDiscountType","getProductItemsArguments","processCouponDataArguments","productItemsMap","getProductItemsMap","couponItemsMap","getCouponItemPriceMap","processCouponData","COUPON_DISCOUNT_TYPE","REPRICE","observeValidateCouponSaga","couponServerDataFromState","isUrlCouponData","getAvailableCouponServerData","validateCouponActionPartialPayload","isCouponDataAction","validateCouponActionPayload","selectedPlanByAction","payloadOrganizers","payloadTierIndex","isUrlCoupon","attempUrlCouponSaga","checkCMSCouponSaga","activeCoupon","checkVolumeDiscountAgainstRepriceCouponSaga","volumeDiscountPrice","adjustCurrentVolumeDiscountForRepriceCoupon","attemptCMSCouponSaga","reservePhoneNumberSaga","setReservingPhoneNumber","gtccontentSaga","initializeLoadContentSaga","gtcsubmitFormSaga","initializeSubmitFormSaga","gtcabandonedCartSaga","initializeAbandonedCartSaga","gtcexistingUserSaga","initializeExistingUserSaga","gtcgetAccessToken","initializeGetAccessToken","gtcuserLoginSaga","initializeLogin","gtcuserLogoutSaga","initializeLogout","gtccreateUserSaga","initializeCreateUserSaga","gtccalculatePriceSaga","initializeCalculatePriceSaga","gtccreateBillingInfoSaga","initializeCreateBillingInfoSaga","gtccreatePaymentSaga","initializeCreatePaymentSaga","gtcgetPaymentSaga","initializeGetPaymentMethodSaga","gtcsubmitPaymentSaga","initializeSubmitPaymentSaga","gtcloadSavedStateSaga","initializeLoadSavedStateSaga","gtcuserLoggedInSaga","initializeUserLoggedInSaga","gtcexistingUserSubmitFormSaga","initializeExistingUserSubmitFormSaga","gtcresetCheckoutFormAffectedStates","initializeResetCheckoutFormAffectedStatesSaga","initializeGTCTrackingSaga","gtccalculateVolumeDiscountSaga","CALCULATE_VOLUME_DISCOUNT","gtcgetVolumeDiscountSaga","GET_VOLUME_DISCOUNT","gtcgetSelectedTierSaga","gtcsetBillingFrequencySaga","gtcvalidateCouponSaga","gtcgetCouponDetailsSaga","gtccalculateCouponPriceSaga","gtcobserveValidateCouponSaga","gtcattemptUrlCouponSaga","gtcheckCMSCouponSaga","gtccheckVolumeDiscountAgainstRepriceCouponSaga","gtcattemptCMSCouponSaga","gtcreservePhoneNumberSaga","RESERVE_PHONE_NUMBER","gtreServices","featureFlags","getFeatureFlags","useNewResolveSkus","flags","FEATURE_FLAGS","RESOLVE_USE_NEW_SKUS","GTR_REMOTE_SUPPORT_NAMED_V2","GTR_STANDARD_NAMED_V2","GTR_REMOTE_ACCESS","GTR_REMOTE_SUPPORT_PLUS","G2RE_BASIC_NAMED","G2RE_STANDARD_NAME","ResolveContentActionTypes","RESOLVE_TRACKING_COMPONENTS","resolveTrackingActions","ResolveUserActionTypes","CompanyName","TaxNumber","TaxType","debounce","ResolveCheckoutActionTypes","FATAL_ERROR_TYPE","CARDINAL_PAYMENT","createAndSubmitPaymentSaga","createAndSubmitPaymentResponse","CREATE_AND_SUBMIT_PAYMENT","CARDINAL_TRIGGER_BIN_PROCESS","CARDINAL_SEND_CHALLENGE","RESOLVE_USER_TYPES","subscriptionInfo","getSubscriptionInfo","CARDINAL_SETUP","resolveBuyFormActions","number","maskCardBin","slice","Status","Cardinal","trigger","resolveUserActions","resolveCheckoutActions","paymentKey","createAndSubmitPaymentAction","createAndSubmitPayment","createAndSubmitPaymentData","isChallengeRequired","isScaRequired","payerAuthEnrollment","acsUrl","paReq","authenticationTransactionId","AcsUrl","Payload","OrderDetails","TransactionId","CARDINAL_SECURITY_MODAL","securityModalAction","CARDINAL_INITIATED","isWithCardAddAfterSca","abandonCartAction","ResolveBuyFormActionTypes","ResolveCouponActionTypes","resolveCouponActions","shortName","_planData$sKU","agentAddons","ADDONS","AGENT","setAgents","userAgentsIncludedAmount","endPointAddons","ENDPOINT","ENDPOINT_PROTECTION_ADDON","setEndpoints","ENDPOINTS_ADDONS_INTERVAL","endpointsIncludedAmount","extraAddons","MOBILE_ADDON","CAMERA_SHARE_ADDON","setExtraAddons","isReplacementBooking","creditback","buyType","BUY_TYPE","DIRECT_BUY","G2R","isSameAsAccount","CHECKOUTFORM_FIELDS","FIRST_NAME","LAST_NAME","COUNTRY_CODE","BILLING_FIRST_NAME","BILLING_LAST_NAME","RESOLVE_USER_TYPES_RESPONSE","currentCountry","setStatesOptional","setCountryInCookie","reload","STREET1","CITY","ZIP_CODE","CONTACT_PHONE","STATE_CODE","resolveSubscriptions","GTR","resolveTrialSubscription","gotoAdminUrl","billingData","flexTokenData","targetOrigin","origin","skipSca","scaResult","URLSearchParams","REFERRER_QUERY_PARAM","REFERRER","gotoAdmin","calculatedCredit","endpoints","agents","taxType","gtresolveTrackingSaga","ResolveTrackingActionTypes","ResolvebillingFrequencyVolumeDiscountRecords","statesOptional","gtresolveContentSaga","gtresolveSubmitFormSaga","gtresolveAbandonedCartSaga","gtresolveExistingUserSaga","gtresolveGetAccessToken","gtresolveUserLoginSaga","gtresolveUserLogoutSaga","gtresolveCreateUserSaga","gtresolveCalculatePriceSaga","gtresolveCreateBillingInfoSaga","gtresolveCreatePaymentSaga","gtresolveCreateAndSubmitPaymentSaga","initializeCreateAndSubmitPaymentSaga","gtresolveGetPaymentSaga","gtresolveSubmitPaymentSaga","gtresolveLoadSavedStateSaga","gtresolveUserLoggedInSaga","gtresolveExistingUserSubmitFormSaga","gtresolveResetCheckoutFormAffectedStates","initializeGTResolveTrackingSaga","gtresolveCalculateVolumeDiscountSaga","initializeCalculateVolumeDiscountSaga","gtresolveGetVolumeDiscountSaga","gtresolveGetSelectedTierSaga","initializeGetSelectedTier","gtresolveSetBillingFrequencySaga","gtresolveValidateCouponSaga","gtresolveGetCouponDetailsSaga","gtresolveCalculateCouponPriceSaga","gtresolveObserveValidateCouponSaga","gtresolveAttemptUrlCouponSaga","gtresolveHeckCMSCouponSaga","gtresolveCheckVolumeDiscountAgainstRepriceCouponSaga","gtresolveAttemptCMSCouponSaga","lmiproServices","plansWithPricing","LMIPRO_REMOTE_ACCESS","pricingInfo","tier1","min","max","price","tier2","tier3","tier4","tier5","LmiProContentActionTypes","LMIPRO_TRACKING_COMPONENTS","lmiproTrackingActions","LmiProUserActionTypes","LmiProCheckoutActionTypes","LMIPRO_USER_TYPES","LMIPRO","lmiproBuyFormActions","lmiproUserActions","lmiproCheckoutActions","LmiProBuyFormActionTypes","LmiProCouponActionTypes","lmiproCouponActions","LOGMEIN","useNewLmiProSkus","LMIPRO_USE_NEW_SKUS","LMIPRO_REDIRECT_PATHS","LMIPRO_REDIRECT_PRO","LMIPRO_INDIVIDUAL_NAME","checkoutBillingFrequencyKey","AnnualBilledMonthly","ANNUALBILLEDMONTHLY","_subscriptionRequest$","LMIPRO_USER_TYPES_RESPONSE","existingSubscriptionSkus","skuFilter","LMIPRO_STANDARD_NAME","LMIPRO_STANDARD_NAMED_V2","LMIPRO_BASIC_NAMED","LMIPRO_REMOTE_SUPPORT_NAMED_V2","getContentState","filterPlans","sku","LMIPRO_SMALL_BUSSINESS_NAME","LMIPRO_POWER_USER_NAME","LMIPRO_POWER_USER_25_NAME","LMIPRO_POWER_USER_50_NAME","allPlanData","lmiproSubscriptions","lmiproTrialSubscription","paymentPlanKey","MONTHLYANNUAL","lmiproTrackingSaga","LmiProTrackingActionTypes","LmiProbillingFrequencyVolumeDiscountRecords","billingFrequencyKeyForMonth","lmiproContentSaga","lmiproSubmitFormSaga","lmiproAbandonedCartSaga","lmiproExistingUserSaga","lmiproGetAccessToken","lmiproUserLoginSaga","lmiproUserLogoutSaga","lmiproCreateUserSaga","lmiproCalculatePriceSaga","lmiproCreateBillingInfoSaga","lmiproCreatePaymentSaga","lmiproCreateAndSubmitPaymentSaga","lmiproGetPaymentSaga","lmiproSubmitPaymentSaga","lmiproLoadSavedStateSaga","lmiproUserLoggedInSaga","lmiproExistingUserSubmitFormSaga","lmiproResetCheckoutFormAffectedStates","initializeLmiProTrackingSaga","lmiproCalculateVolumeDiscountSaga","lmiproGetVolumeDiscountSaga","lmiproGetSelectedTierSaga","lmiproSetBillingFrequencySaga","lmiproValidateCouponSaga","lmiproGetCouponDetailsSaga","lmiproCalculateCouponPriceSaga","lmiproObserveValidateCouponSaga","lmiproAttemptUrlCouponSaga","lmiproHeckCMSCouponSaga","lmiproCheckVolumeDiscountAgainstRepriceCouponSaga","lmiproAttemptCMSCouponSaga","lmicentralServices","LMICENTRAL_BASIC","userAgentsIncludedText","userAgentsTootip","LmiCentralContentActionTypes","LMICENTRAL_TRACKING_COMPONENTS","lmicentralTrackingActions","LmiCentralUserActionTypes","LmiCentralCheckoutActionTypes","LMICENTRAL_USER_TYPES","LMICENTRAL","lmicentralBuyFormActions","lmicentralUserActions","lmicentralCheckoutActions","LmiCentralBuyFormActionTypes","LmiCentralCouponActionTypes","lmicentralCouponActions","useNewLmiCentralSkus","join","LMIPRO_REDIRECT_CENTRAL","AUTOMATION_ADDON","INSIGHT_ADDON","SECURITY_ADDON","LMICENTRAL_USER_TYPES_RESPONSE","lmicentralSubscriptions","lmicentralTrialSubscription","lmicentralTrackingSaga","LmiCentralTrackingActionTypes","LmiCentralbillingFrequencyVolumeDiscountRecords","lmicentralContentSaga","lmicentralSubmitFormSaga","lmicentralAbandonedCartSaga","lmicentralExistingUserSaga","lmicentralGetAccessToken","lmicentralUserLoginSaga","lmicentralUserLogoutSaga","lmicentralCreateUserSaga","lmicentralCalculatePriceSaga","lmicentralCreateBillingInfoSaga","lmicentralCreatePaymentSaga","lmicentralCreateAndSubmitPaymentSaga","lmicentralGetPaymentSaga","lmicentralSubmitPaymentSaga","lmicentralLoadSavedStateSaga","lmicentralUserLoggedInSaga","lmicentralExistingUserSubmitFormSaga","lmicentralResetCheckoutFormAffectedStates","initializeLmiCentralTrackingSaga","lmicentralCalculateVolumeDiscountSaga","lmicentralGetVolumeDiscountSaga","lmicentralGetSelectedTierSaga","lmicentralSetBillingFrequencySaga","lmicentralValidateCouponSaga","lmicentralGetCouponDetailsSaga","lmicentralCalculateCouponPriceSaga","lmicentralObserveValidateCouponSaga","lmicentralAttemptUrlCouponSaga","lmicentralHeckCMSCouponSaga","lmicentralCheckVolumeDiscountAgainstRepriceCouponSaga","lmicentralAttemptCMSCouponSaga","addOns","devices","months","errorCardinalChallenge","errorCardinalSetup","equal","bundles","countAbbr","discount","percentageDiscountPopupText","annualPlanNote","monthlyPlanNote","per","selectAddons","selectAddonsDescription","organizer","added","existingUsersModalContent","existingUsersModalHeader","existingUsersNewEmailButtonText","taxTooltip","agentsVolumediscountTooltip","endpointsVolumediscountTooltip","mobileVolumediscountTooltip","cameraShareVolumediscountTooltip","endpointProtectionVolumediscountTooltip","proratedadjustmentTooltip","errorRequiredTaxNumber","taxBusiness","taxIndividual","gSTDisclaimer","vATDisclaimer","gSTOption","vATOption","optional","changeCountryContent","changeCountryHeader","modalCancel","modalReload","taxCodeGST","taxCodeVAT","upgradeClose","upgradeSubscriptionCredit","upgradeSubscriptionCreditTooltip","upgradeSubscriptionCreditNote","upgradeCreditErrorMessage","upgradeCreditErrorAssistance","totalVolumeDiscountTooltip","resolveAppReducer","filteredPlans","allPlans","SET_EXTRA_ADDON","SET_ENDPOINTS","SET_AGENTS","SET_TAX_TYPE","SET_STATES_OPTIONAL","annualContractTotal","annualConractPlanNote","annuallySubText","monthlySubText","monthlyTooltip","monthlyAnnual","billedMonthlyAnnualPrice","lmiProAppReducer","downloadingInvoice","invoice","baseLine","unit","multiplier","allPrices","skuName","quantityMultiplier","additionalLines","addonLines","totalDiscount","finalTotal","billingTenure","selected","getFormSessionValue","EMAIL","BUY_USER_TYPES","castleToken","validCoupons","planInitialData","groupKey","description","monthlyUnitPrice","paymentPlans","purchaseOption","quantityErrorMessage","endpointsIncludedText","shortDescription","endpointsTooltip","highlightsLabel","highlightSelection","sKUSelectors","billingPeriods","receiptWelcomeMessage","receiptMyAccount","receiptPrint","promoDiscountForAnnualSavingsTooltip","checkoutCTAButtonText","loadingSpinnerText","productSettings","productPortalUrl","favicon","logo","logoMobile","logoUrl","platformProduct","abandonmentProgram","analyticsContainerID","enablePlanCustomization","enableChatBot","adminUrl","qualtricsProductName","buyAppReducer","planDataReducer","BuyPlanActionTypes","SET_BUY_PLAN","BuyCheckoutActionTypes","SET_INVOICE","SET_DOWNLOADING_INVOICE","SET_BASE_LINE","SET_ADDITIONAL_LINES","SET_ADDON_LINES","SET_TOTAL_DISCOUNT","SET_TOTAL_VOLUME_DISCOUNT","SET_BILLING_TENURE","tenure","SET_FINAL_TOTAL","BuyUserActionTypes","SET_CASTLE_TOKEN","BuyCouponActionTypes","SET_VALID_COUPON","getPricingInfo","castleRequestToken","skuList","Set","add","item","productSKUs","from","buyServices","remapPricingInfo","countriesPricingMap","Map","keys","countryKey","billingTenurePricing","tenureKey","tiersMap","tierKey","newPriceItem","set","PriceInfoPeriod","fromEntries","castle","configureCastle","pk","createRequestToken","buyUserActions","setCastleToken","planName","getPlanNameFromPath","contentEndpoint","getProductNameFromPath","replaceAll","currencies","priceInfoResponse","newPlan","skuPricingInfo","baseSku","x","productSKU","addonSku","reMappedAddonSkuPricingInfo","sKUSelector","skuSelectorSku","mapPricingInfo","buyPlanActions","setBuyPlan","assign","VIEW_PATH","PATH_BASE","BUY_TRACKING_COMPONENTS","buyTrackingActions","getProductSettingsData","priceWillFailToProcessErrorMessage","willPriceFailToProcess","environment","queryStringParams","isCyberSourceTestPrice","isTestPriceOverrideEnabled","pathProduct","getCartItems","buyCheckoutActions","silentAuthTicket","removeLocalStorageAuthItems","createUserUcsSaga","CREATE_NEW_USER_UCS","sanitizeCompanyName","rx","RegExp","onePayLocales","gotoAdminLocales","getOnePayLocaleFromContentLanguage","contentLanguage","onePayLocale","componentNameConfirmation","CONFIRMATION_PAGE","transactionSessionId","productFamilyWithSpace","getContentLanguage","companyNameSanitized","trim","thePassword","toUpperCase","requestId","timeZone","billingAddress","addressLine2","ccEmails","ipAddress","invitationEmailExpiry","emailVerificationToken","createNewUserUCS","autoLoginTicket","getTokenFromLocalStorage","cartItems","TimePeriodBillingPeriodFromBOSSMapper","productFamilyKey","cartRequestData","deleteCartResponse","deleteCart","createCartResponseData","createCartV3","applyPromoCodeRequestData","applyPromoCode","totalAfterTax","cartTotal","transactionProducts","cartItem","flowName","publisherId","subscriptionEndDate","transactionType","successRedirectUrl","PATH_CHECKOUT","PATH_CONFIRMATION","setupTransactionRequestData","quoteId","intent","currencyCode","cancelRedirectUrl","setupTransactionResponseData","setupTransaction","sessionId","saveMarketoToSessionStorage","onePayTheme","onePayUrl","SUBMIT_BUY_FORM_UCS","endSilentAuthFromIFrame","getLatestInvoice","userToken","invoiceHistory","getInvoiceHistory","setInvoice","ex","GET_LATEST_INVOICE","downloadInvoiceSaga","setDownloadingInvoice","checkoutState","invoiceId","invoiceID","fetchResponse","fetchInvoiceAsBlob","blob","headers","filename","createElement","URL","createObjectURL","download","click","remove","DOWNLOAD_INVOICE","buyCouponActions","BUY_USER_TYPES_RESPONSE","_response$data$User$S","SCIMSchemasExtensionGetGo1","accounts","_identityUserMeRespon","identityUserMeResponse","getIdentityUserMe","cipAccountKeyFromIdentity","buySubscriptions","productGroupNameTrimmed","productGroupName","buyTrialSubscription","EXISTING_USER_SUBMIT_BUY_FORM_UCS","BillingPeriodTimePeriodMapper","productFamilyName","billingPeriodKeys","BillingPeriodKeyMapper","getPriceTier","sum","currentValue","isReprice","billingPeriod","getPlatformProduct","getProductSettingsPlatformProduct","buyTrackingSaga","saveToSessionStorage","buyBillingFrequencyVolumeDiscountRecords","buyContentSaga","buySubmitFormSaga","buySubmitFormUcsSaga","initializeSubmitFormUcsSaga","buyAbandonedCartSaga","buyExistingUserSaga","buyGetAccessToken","buyUserLoginSaga","buyUserLogoutSaga","buyGetLatestInvoiceSaga","initializeGetLatestInvoiceSaga","buyDownloadInvoiceSaga","initializeDownloadInvoiceSaga","buyCreateUserSaga","buyCreateUserUcsSaga","initializeCreateUserUcsSaga","buyCalculatePriceSaga","buyCreateBillingInfoSaga","buyCreatePaymentSaga","buyCreateAndSubmitPaymentSaga","buyGetPaymentSaga","buySubmitPaymentSaga","buyLoadSavedStateSaga","buyUserLoggedInSaga","buyExistingUserSubmitFormSaga","buyExistingUserSubmitFormUcsSaga","initializeExistingUserSubmitFormUcsSaga","buyResetCheckoutFormAffectedStates","BuyTrackingActionTypes","buyCalculateVolumeDiscountSaga","buyGetVolumeDiscountSaga","buyGetSelectedTierSaga","buySetBillingFrequencySaga","buyGetCouponDetailsSaga","buyAttemptUrlCouponSaga","lmiCentralAppReducer","sagaMiddleware","createSagaMiddleware","onError","sagaStack","throttleMiddleware","createThrottleMiddleware","store","isConnectApp","gtcStore","getState","connect","saveState","isResolveApp","appState","gtResolveStore","commonStore","common","saveCommonSessionState","isLmiProApp","lmiProStore","lmipro","isLmiCentralApp","lmiCentralStore","lmicentral","isBuyApp","gtBuyStore","buy","middlewares","composeEnhancers","composeWithDevTools","trace","enhancer","DEV","applyMiddleware","appReducer","appStore","createStore","appSagas","gtcsagas","gtResolveSagas","lmiProSagas","lmiCentralSagas","commonSagas","buySagas","saga","run","reactPlugin","initializeApplicationInsights","App","ErrorBoundary","AppInsightsContext","Provider","render","getElementById","BoxWrapper","children","modifier","props","_extends","className","styles","CommonButton","purpose","arrow","theme","size","disabled","qaTag","classList","classNames","button","ConvertStringToReact","htmlString","sanitizeHtmlString","sanitizeHTML","allowedSchemes","ErrorMessage","warning","src","warningImg","errorImg","alt","ErrorView","errorIcon","FlexField","needToRefresh","setNeedToRefresh","useState","shouldRefresh","isFieldFocused","setIsFieldFocused","hasValue","setHasValue","hasMicroformAttachedEvents","setHasMicroformAttachedEvents","displayErrorUI","useEffect","createField","flexFieldType","load","on","resp","empty","onChange","onBlur","wrapperClass","labelCopy","errorCopyNotEmpty","errorCopyEmpty","icon","InputField","focus","label","hint","style","isFocus","setIsFocus","isMountedRef","useIsMountedRef","wrapperClassList","htmlFor","Input","persist","debounceOnBlur","current","getDebouncedOnBlur","onFocus","debounceOnFocus","getDebouncedOnFocus","debounceOnChange","getDebouncedOnChange","GenericInput","autoComplete","inputRef","maxLength","checkValid","inputValue","setInputValue","setValue","target","ref","MaskedInput","maskedInputRef","InputMask","ismasked","wrapperModifier","text","inline","white","imgClassList","reservingdisabled","reservingWhite","reserving","RadioInputFieldWithBorder","labelModifier","defaultChecked","constructor","super","this","componentDidCatch","setState","CardSelector","small","wrap","stacked","Checkbox","onchange","checked","centered","labelClassList","CommonLink","ALLOWED_NUMERIC_EXTRA_CHARACTERS","LicenseSelector","minusClassList","plusClassList","qatSubtract","qatAdd","qatInput","updateOrganizers","targetValue","onClickButton","direction","preventDefault","updateNumberSelector","targetElement","onClick","onKeyDown","keyVal","validateKey","RadioInputField","Select","customArrow","outerWrapperClassList","innerWrapperClassList","arrowStyles","ev","onBlurFn","onChangeFn","ToggleButton","isOn","isLarge","widget","labelClasses","wrapper","offLabel","label1","Tooltip","input","check","onLabel","label2","subCallout","callout","discountAmount","ConnectedFormatCurrency","additionalClass","contentClass","isVisible","setIsVisible","DIRECTIONS","RIGHT","LEFT","containerClassList","onMouseEnter","onMouseLeave","TrustArcLogo","rel","Trust","ClockIcon","FormatCurrency","decimals","formattedValue","formatCurrency","FormatDecimalCurrency","punc","wholeNumber","decimal","Header","mobileLogo","onLogin","onLogout","showSignIn","headerLogo","useMediaQuery","query","screenSize","mobile","loginOut","TrustArc","selectedLang","setSelectedLang","useTrustArc","Footer","languageCode","launchTrustArc","setlaunchTrustArc","languageOptions","setLanguageOptions","setLanguageState","languageCodes","languages","codeIndex","indexOf","splice","footerStyle","footer","footerClasslist","footerLink","languageIconClasslist","languageSelectorClasslist","languageOptionsContainerClasslist","detokenizeYear","CustomDropdown","innerText","optionsContainerClass","optionsClass","customizeTheme","selectorClass","iconClass","showAtTop","LoadAnalyticScripts","useGTM","gtmProductKey","BoldChat","useBoldChat","LmiMaScript","useLoadScript","ChatbotScript","useChatbot","GlobalScripts","analyticsProductKey","boldchatOptions","lmiMaScriptUrl","useSmoothScrollPolyfill","FormSubmitButton","isSubmitting","submitClasslist","InlineErrorView","fieldData","setErrorCall","removeErrorCall","ignoreInlineError","meta","setCheckoutInlineError","labelClass","showCustomizeOptions","setShowCustomizeOptions","dropdownRef","useRef","dropdownStyleHeight","setDropdownStyleHeight","offsetHeight","handleCustomize","customizeSelectorStyles","selector","stopPropagation","customizedElem","setTimeout","contains","activeElement","role","tabIndex","top","option","bind","n","arguments","t","r","hasOwnProperty","apply","SvgIconPwTip","xmlns","width","height","fill","fillRule","d","clipRule","SvgIconChevronDownBlue","SvgIconChevronUpBlue","PasswordStrengthIndicator","touched","genericPasswordLabel","isSubmittingRef","isFocused","showTips","setShowTips","pwStrength","setPWStrength","displayGenericError","parsedValue","String","score","zxcvbn","strengthClasslist","subheadClasslist","tiphClasslist","TipIcon","ChevronUp","ChevronDown","mapModalActions","setModalOpen","ConnectedModal","connectRedux","isOpen","closeable","onClose","setModalIsOpen","setModalCloseable","useScrollToTop","trapFocus","onModalClose","Close","getModalState","mapFlexFormActions","setCardValid","setCvvValid","setUserInteractedWithFlexField","setUserInteractedWithFlexFieldCvv","clearMicroformInstance","clearFlexMicroformInstance","ConnectedFlexForm","flexState","actions","gettingKey","setGettingKey","flexScriptLoaded","useFlexForm","orgId","FLEX_KEY","useMetrixScript","getFlexKey","teardown","TAX_COUNTRIES","CH","GR","CURRENCY_SYMBOLS","EUR","GBP","AUD","CAD","MXN","urlSplitForLang","urlLang","GTC_VIEW_PATH","GTRESOLVE_VIEW_PATH","GTC_VIEW_PATHS","CONNECT_CUSTOMIZE","PATH_CUSTOMIZE","CONNECT_CHECKOUT","CONNECT_TRIAL","PATH_TRIAL","CONNECT_ERROR","PATH_ERROR","CONNECT_NEXT_STEPS","PATH_NEXT_STEPS","GTRESOLVE_VIEW_PATHS","RESOLVE_CUSTOMIZE","RESOLVE_CHECKOUT","RESOLVE_FREE_TIER","PATH_FREE_TIER","RESOLVE_STANDARD_TIER","PATH_STANDARD_TIER","RESOLVE_ERROR","BUY_VIEW_PATHS","BUY_ROOT","BUY_CUSTOMIZE","BUY_CHECKOUT","BUY_FREE_TIER","BUY_STANDARD_TIER","BUY_ERROR","LMIPRO_VIEW_PATHS","LMIPRO_CUSTOMIZE","LMIPRO_CHECKOUT","LMICENTRAL_VIEW_PATHS","LMICENTRAL_CUSTOMIZE","LMICENTRAL_CHECKOUT","APP_PATHS","hostName","getDomain","BillingPeriodFromBOSS","BillingPeriodKey","AnnualBilling","MonthlyBilling","MonthlyBillingWithAnnualContract","TimePeriodBillingPeriodMapper","ANNUALCONTRACT","UpfrontAnnual","UpfrontMonthly","MonthlyAnnual","authOptions","client_id","redirect_url","scope","ENVIRONMENT_URL","getExternalUrl","ANALYTICS_CONTAINER_ID","COUPON_TYPE","COUPON_PAYMENT_PLAN","BillingPeriodCouponPaymentPlanMapper","UPFRONTANNUAL","UPFRONTMONTHLY","LMI_MA_SCRIPT","BillingPeriodBillingTypesMapper","CHATBOT_CONFIG","companyKey","appId","widgetId","Español","Deutsch","Français","Italiano","Nederlands","Português","tablet","smoothscrollPolyfill","flexScriptUrl","shouldLoadScript","merchantId","useClearField","shouldClearField","formikRef","fieldName","setFieldValue","setFieldTouched","useRedirectOnLoad","navigate","useNavigate","useLocation","didRedirect","setDidRedirect","dispatch","useDispatch","hash","searchParams","savedRoute","localStorage","SAVED_ROUTE","savedQuery","SAVED_QUERY","val","combinedQuery","isRouteDefined","gtmProductCode","script","innerHTML","head","prepend","gtmIframe","addGTMIframe","removeChild","body","usePageLoad","onPageLoad","shouldExecute","pageLoaded","setPageLoaded","usePageLoadV2","dependencies","result","areBothPopulated","surveyDelay","useQualtrics","showSurvey","Q_ZID","cb","addEventListener","QSI","util","observe","log","KHOROS_CONFIG","useAddressAutoFill","streetFieldRef","onChangePlace","shouldLoad","googlePlacesUrl","alreadyLoaded","setAlreadyLoaded","initGoogleMaps","fields","componentRestrictions","lockHtmlElementAttribute","attributeName","unlockAfterFirstMutationAttempt","originalAttributeValue","observer","MutationObserver","mutations","mutation","disconnect","setAttribute","attributes","google","maps","places","Autocomplete","addListener","place","getPlace","source","scriptLoad","setScriptLoad","onScriptLoad","onScriptError","async","test","scriptTagQualifiedFunction","textContent","appendChild","removeEventListener","scrollToTop","productGroup","Authorization","memoize","siteType","getCountries","getFlexTokenCall","getValidAddress","Tenant","setCheckoutFormInlineError","removeCheckoutFormInlineError","setError","setChallengeCompleteJwt","setCardinalSetupComplete","setStates","setCountryHasStates","countryHasStates","SET_COUNTRY_HAS_STATES","component","getIsUserCountryAllowed","setDisplayOptOut","setIsUserOptOut","postMarketoSessionDataToAWS","getFatalError","appInsights","customProperties","browserHistory","createBrowserHistory","ReactPlugin","ApplicationInsights","config","instrumentationKey","extensions","extensionConfig","identifier","history","loadAppInsights","addTelemetryInitializer","envelope","telemetryItem","obj","uri","newURL","trackPageView","auth","initPromise","Auth","storedLanguage","getSessionState","pathnameSplit","pathToStore","saveRouteAndQuery","accessTokenString","savedToken","parsedSavedToken","urlSearchParams","urlParams","init","then","stateFromLocation","customizeUrl","authorizationCode","code","code_verifier","requestPKCEToken","newToken","storeTokenObject","finally","delete","searchParam","replaceState","login","loginWithSSO","randomString","minLoa","onLoginRedirect","startSilentAuth","loginWithPKCE","GEO_IP","getInnerHTMLByClassName","htmlDocument","elements","getElementsByClassName","getAddressFromGooglePlace","addressComponents","address_components","addAddress","adr_address","DOMParser","parseFromString","c","types","short_name","uniqid","formatDate","datestamp","substring","day","UTC","Intl","DateTimeFormat","format","STORED_GA_EVENT_PREFIX","dataLayer","trackInfo","getFormName","productKey","page_type","platform_product","form_name","cta_name","cta_url","error_message","FATAL_ERROR","stateProps","dispatchProps","ownProps","Flex","color","invalid","_ex","marketoObject","noscript","throttlefns","next","resultState","throttle","throttlefn","throttledfn","accountType","hasInAppSubscription","paymentAccountKey","setCall","removeCall","parentElem","setDefaultFocus","querySelector","focusableElements","firstFocusableElement","querySelectorAll","focusableContent","lastFocusableElement","keyCode","shiftKey","sessionItem","setFormSessionValues","formValues","formKey","sessionFormValue","isNull","formatConfirmationMessage","messageTemplate","myAccountText","myAccountUrl","regexExpressions","CA","isValidPostalCode","countryUpperCase","countryExpressions","i","currentLocationList","possiblePlanNameIndex","findIndex","cpath","has","isLegacyFlow","pathParts","nth","localValue","minimumFractionDigits","maximumFractionDigits","countryCode","formatted","NumberFormat","currencyDisplay","scroll","left","behavior","SILENT_AUTH_EVENTS","FINISHED_SILENT_AUTH","iframeUrl","iframe","display","postMessage","BUY_TRIAL_ERROR_IDS","FLEXIBLE_VOLUME_COMPONENT_TYPE","BUY_PARTIAL_NON_VALIDATION_USER_TYPES","ADDON_SKUS","CHECKOUTFORM_VALIDATION_EXCLUDE_FIELD_TYPES","PRODUCT_PRICE_ITEM_TYPE","tenant","validateStatus","responseType","validateTaxNumber","getBuyPlanData","createUserAccountUcs","castle_request_token","submitPaymentWithCardAdd","getPricingInfoData","submitForm","submitFormUcs","existingUserSubmitForm","existingUserSubmitFormUcs","resetCheckoutFormAffectedStates","setLoading","downloadInvoice","clearAddons","getPaymentMethods","getSavedState","resetCheckoutState","setTaxType","setBaseLine","setAdditionalLines","setAddonLines","setTotalDiscount","setTotalVolumeDiscount","setBillingTenure","setFinalTotal","setValidCoupons","upgrade","getCompareModalContent","PlanGroupdId","setCompareModalContent","SET_COMPARE_MODAL_CONTENT","checkExistingUser","getLoggedInUserState","getDiscount","basePrice","newPrice","processCurrencyPricing","pricingKeys","currencyPricing","billingFrequencyAccumulator","billingFrequencyAccumulatorCopy","pricingTiers","pricingTierKeys","processPricingTier","pricingTierAccumulator","pricingTier","pricingTierIndex","pricingTierAccumulatorCopy","tierPrice","discountPerUser","annualize","volumeDiscountTimesOrganizer","getAddonVolumeDiscount","_currentTier","subscribedAddonQuantity","actualPercentage","discountPercentagesForQuantity","tierTwoPrice","tierThreePrice","tierFourPrice","tierFivePrice","percent","Math","floor","discountPrice","mySelectedAddons","localAddon","matchingAddon","getExtraAddons","getCurrentAgent","getCurrentEndpoint","getIsOnePayFlow","selectedBillingFrequency","planSubscription","canUpgradePlan","otherItems","newItem","contentType","CartAction","getBuyType","TRIAL_CONVERSION","previousTrackData","processSkuData","line","isAddon","mainCartLine","actualQuantity","actualMultiplier","skuPrice","getPrice","priceTier","item_brand","item_category","item_category2","item_category3","item_category4","item_category5","item_name","item_id","item_variant","volume_discount","product_discount_tier","processCartData","productData","mainCartData","planInfo","additionalLinesInfoList","addonInfoList","trackAddToCart","ecommerce","actionField","discount_tier","discount_total","ADD_TO_CART","trackRemoveFromCart","REMOVE_FROM_CART","compareOrderLines","newLine","oldLine","resultLine","ADD","REMOVE","NONE","getLinesByAction","previousLines","newLines","oldDataSkus","newDataSkus","skusToRemove","skusToAdd","skusNeededToBeCompared","linesToRemove","linesToAdd","item2","removedLines","addedLines","checkCartData","previousCartData","currentCartPlan","previousCartPlan","baseLineChanges","additionalLinesDifference","addonLinesDifference","addedCart","removededCart","billingFrequencyLowerCase","pageName","contentTypeName","platform_environment","platform_type","platform_locale","platform_country","platform_language","section","sub_section","template","content_type","content_number","login_status","funnel_name","sessionInfo","session_last","session_number","user_type","is_logged_in","currentStep","isOnePayFlow","cloneDeep","buy_type","transaction_id","revenue","conversion_type","error_purchase_message","user_email","form_error_id","form_error_message","CHECKOUT_PAGE","emailValidation","Yup","required","matches","nameValidation","requiredErrorMessage","invalidCharacterErrorMessage","addressValidation","errorRequiredMessage","zipcodeValidation","contactPhoneValidation","taxNumberValidation","CheckoutSchema","errorContent","shape","pw","checkAlphaNumerical","match","getCouponSkuPrices","couponItems","newCouponDataMap","currencyMap","priceChanges","reMapCouponItemPricingData","processCouponCalculations","discountType","getSkuPrice","getCouponValue","prices","PERCENTAGEOFF","AMOUNTOFF","previousFormValues","isValidationAddressEligible","dontForceCompare","hasFormValuesChanged","isEqual","isAddressComplete","isStatesOptional","isTaxRequired","serializedState","GTC_COUPON_STORE","getStore","buySessionStore","BUY_CHECKOUT_STORE","setCheckoutSessionState","parsedStore","createOrUpdateCheckoutSessionState","existingData","newData","getCheckoutSessionState","SessionKeys","additonalLines","volumeFields","addonFields","BUY_STORE","manuallyValidateFieldData","initialValue","scrollToError","scrollIntoView","block","productPriceItem","tierMap","currentOrganizers","_currencyPricing","billingFrequencyTier","tierName","tierData","planSubscriptions","includedAgents","includedEndpoints","remainingDays","canUpgradeCameraShare","canUpgradeEndpointProtection","canUpgradeMobile","subscription","standard","basic","STANDARD_AGENT_ADDON","BASIC_AGENT_ADDON","STANDARD_ENDPOINT_ADDON","BASIC_ENDPOINT_ADDON","trial","subscriptionBilling","end","setHours","lastday","getRemainingDays","subscribedPlan","createAgentAddon","createEndpointAddon","createMobileAddon","createCameraAddon","createEndpointProtectionAddon","getReplacementBookingAddons","mobileAddon","cameraAddon","endpointProtectionAddon","subscribedMobileAddon","subscribedCameraAddon","subscribedEndpointProtectionAddon","agentQuantity","endpointQuantity","getAddons","subscribedAgents","subscribedEndpoints","endpiontQuantity","extraMobileAddon","extraCameraAddon","extraEndpointProtectionAddon","newPlanCart","canUpgradeMobileAddon","canUpgradeCameraAddon","canUpgradeEndpointProtectionAddon","canUpgradeBillingFrequency","isUpgrading","selectedExtraAddons","subscribedInfo","hasTrial","subscribedStandardPlanCart","subscribedBillFrequency","basicPlan","subscribedBasicPlanCart","trialPlanCart","getUpgradingStatus","remapPricingObject","repriceCouponItems","finalPricingMap","rePriceCouponDiscounts","tempPricingMap","itemPrice","rePriceValue","item3","_rePriceValue$value","abs","rePriceDiscounts","matchedKey","getComponentType","volumeSelector","quantityPerUnit","customListValues","PLUSMINUS","DROPDOWN","leftToggleBillingPeriod","mapGTCTrackingActions","GTCTrackingContext","createContext","ConnectedGTCTrackingProvider","trackingContextValue","mapGTCTrackingState","mapFormatCurrencyState","mapFormatCurrencyActions","mapInternationalBlockerActions","ConnectedInternationalBlocker","isClosable","mapCheckoutFormContainerActions","mapCheckoutFormActions","commonCheckoutActions","TRIAL_ERROR_IDS","ConnectedCheckoutForm","initialIsOptOut","setHasAddressValidationErrors","setGeneralFieldErrors","setHasCardValidationErrors","hasCardValidationErrors","generalFieldErrors","hasAddressValidationErrors","setIsSubmitting","useSameForBilling","setUseSameForBilling","isOptOut","setIsOptOut","isFormReset","setIsFormReset","isPaymentModalOpen","setIsPaymentModalOpen","hasExistingPaymentInformation","isCrossProductFlow","isTrialUser","isExpiredTrialUser","resetFieldTouched","useCallback","fieldKey","canValidateAddress","resetFatalError","trackBillingInfoStep","trackPaymentStep","trackSubmitForm","useCheckoutFormPageTracking","qualtricsDataGtc","onFormErrors","setSubmitting","EXPIRATION_DATE","_ref2","formField","formValue","COUNTRYCODE","PARTIAL_NON_VALIDATION_USER_TYPES","validateField","accountInfoProps","billingInfoProps","paymentInfoProps","checkoutSubmissionProps","preSubmit","CARD_ERROR","ADRESS_ERROR","validateForm","errorList","trialUserValidErrors","errorField","PASSWORD","trialUserValidErrorValues","fieldErrorTuple","trialUserValidErrorKeys","isTabletOrMobileView","contentNumberPicker","handleDidFailToOrderPhoneNumberModalClose","Form","ConnectedAccountFormInfo","ConnectedBillingFormInfo","ConnectedPaymentFormInfo","ConnectedCheckoutFormSubmission","checkoutStyles","getCommonCheckoutState","ConnectCheckoutFormContainer","Formik","initialValues","validationSchema","validateOnChange","validateOnBlur","onSubmit","_values","formikBag","innerRef","formikProps","mapCustomizeActions","setIsChoosingPhoneNumber","Card","cardLabels","hideCheckCircle","splitSubtext","tierLevel","baseTierMonthlyPrice","baseTierAnnualPrice","couponMonthlyPrice","couponAnnualPrice","getCouponPrices","buttonClassList","subtextClassList","newLicenseCopy","Badge","mapLetterToPhoneDialerNumber","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","indexOfVanityPhrase","haystack","needle","needleAsNumbers","characters","phoneDialerNumbers","character","lettersToPhoneDialerNumbers","FormattedPhoneNumber","showVanityLetters","indexOfPhrase","vanityPhraseArray","digit","shouldHighlightCharacter","shouldInsertSpaceBeforeCharacter","NumberPickerSummary","showBadge","showMissingPhoneNumberError","noNumberSelected","IconError","local","tollFree","region","words","formatCity","NumberPickerOptions","isMobileView","useNewNumber","setUseNewNumber","handleOptionChanged","handleOptionChange","optionsWrapperClassName","localOption","portNumber","yourNumber","handleEditClicked","handleEdit","Pencil","editNumber","chooseNumber","InfoView","portInstructions","ModalDrawer","allowEscToDismiss","handleDismiss","listenForEscapeKey","originalOverflowY","overflowY","closeText","scrollingDivRef","headerText","actionButtons","showLoadingSpinner","Navigation","isBasicNumber","enableVanityPhrase","subnav","subnavButton","subnavButtonActive","handleClickLocal","localNumber","handleClickTollFree","tollFreeNumber","numberTypeContainer","numberTypeRadioButton","handleClickBasic","handleClickVanity","vanity","SearchFilters","handleChangeAreaCode","defaultAreaCode","areaCode","setAreaCode","areaCodeHeader","areaCodeSubHeader","maskChar","areaCodeTrimmed","FooterButtons","clickedSearch","isResetVisible","isSearchDisabled","isSaveDisabled","handleSave","handleReset","handleSearch","reset","cancel","Skeleton","SearchResults","numberList","handleSelectNumber","defaultSelectedNumber","selectedNumber","chooseAvailableNumber","_value","noResults","VanityPhrase","handleChangeVanityPhrase","vanityPhrasePlaceholder","vanityPhraseDescriptionLine1","vanityPhraseDescriptionLine2","vanityPhraseDescriptionLine3","NumberPickerModal","handleSearchNumbers","handleChangeNumber","handleResetError","isFirstTimeChoosing","setVanityPhrase","setIsLocalNumber","setIsBasicNumber","setClickedSearch","setNumber","isTollFreeNumber","isVanityNumber","resetError","displayNumberList","reverse","close","localVanity","tollFreeVanity","tollFreeWildcard","newNumber","mapOrderSummaryActions","PasswordValidation","showPW","setShowPW","isPWFocused","setIsPWFocused","InputWrapperClassList","labelClasslist","setBlurState","setFocusState","EyeClosed","Eye","OrderSummaryAddons","planAddons","isPercentageCoupon","addonCouponData","isCouponAppliedtoAddon","addonCouponDiscountPercentage","discountPercentage","addonCouponDiscountAmount","discountTotalSavings","discountLineClasses","addonPrice","getAddonPrice","quantityLabelShort","quantityLabelShortPlural","MemoOrderSummaryAddon","memo","ConnectedOrderSummary","currentTierPrice","planCouponData","isCouponAppliedtoPlan","planCouponDiscountPercentage","planCouponDiscountAmount","totalCouponDiscountSavings","isRepriceCouponAndApplied","isAnnualOnly","setIsAnnualOnly","toggleContent","setToggleContent","calculatedBasePrice","basePriceTotal","calculatedTotalPriceForPlan","annualDiscountAmount","basePriceTotalAnnualOnly","currentTotalPrice","useMemo","calculateTotalPriceWithAddons","saving","subtotalWithCouponDiscounts","getFeesFromProductPrice","displayProrated","isPlural","setToggleContentState","prevState","addonsContent","returningLicenseTotal","returningLicenceCopy","proratedTooltip","purchase_term","purchase_type","order_total","promo_code_applied","toggleStyles","random","Phone","groupName","currSelectedAddons","currentTier","baseTierMonthlyAnnualContractPrice","ConnectedCustomize","isNumberPickerFeatureEnabled","setShowMissingPhoneNumberError","additionalPhoneNumbers","setAdditionalPhoneNumbers","NUMBERSCAP","MIN","initStateLoaded","setInitStateLoaded","isPlanModalOpen","setIsPlanModalOpen","isEditPhoneModalOpen","setEditPhoneModalOpen","showCards","setShowCards","alreadyTrackedChangePlan","setAlreadyTrackedChangePlan","isNumberPickerModalOpen","setIsNumberPickerModalOpen","phoneNumberList","phoneNumberListLoading","phoneNumberListError","setPhoneNumberListError","handlePhoneNumberSearch","setPhoneNumberList","setPhoneNumberListLoading","searchNumbers","phoneNumberDetails","usePhoneNumberSearch","planAdditonalPhoneNumbersAddon","ADDITIONAL_NUMBERS","addedAdditonalPhoneNumbersAddon","localAddons","selectAddon","recalculatePrice","additionalNumbers","LICENSECAP","MAX","fullPlanName","trackCustomizeViewClick","useCustomizePageTracking","orderedPlans","resetFatalPhoneNumberError","handleChangePlanClick","mainNumber","mainNumberSubText","handleChoosePhoneNumber","planAddon","existingUserDescription","additionalNumbersSubText","additionalNumbersTooltip","additionalDescription","organizerNumber","nextSteps","validTo","resetErrorsInNumberPickerModal","contentContinue","currSelectedPlan","mapAccountFormInfoActions","userLogIn","createUserAccountStep","userAccountCreated","accountStyles","signin","grid","Field","autoFocus","_ref3","_ref4","existingUserCheck","_ref5","passwordValidationStyles","mapBillingFormInfoActions","allowAddressAutofill","setCountryCode","autoFillCountries","autoFillLanguage","selectedCountry","setFieldError","setAddressValues","getFormValuesWithUpdatedAddress","currentFormValues","updatedFormValues","addr","billingStyles","selectCountry","selectStyles","_ref6","_ref7","countryState","_ref8","_ref9","addressState","mapPaymentFormInfoActions","_existingPaymentInfor","cardCC","cardCvv","paymentStyles","heading","SecureIcon","PencilIcon","CreditIcon","inputMode","cc","cvv","initialDisplayOptOut","submit","terms","useGTCTracking","trackingContext","useContext","trackingData","useBillingPageTracking","BILLING_PAGE","hasTrackedStartForm","setHasTrackedStartForm","fieldTouched","CUSTOMIZE_PAGE","useNextStepsPageTracking","NEXT_STEPS_PAGE","isLabelsLoaded","stringifyParamsUsingArrayFormatNone","parameters","arrayFormat","paramsSerializer","accSet","errorInvalidMessage","expDateValidation","lastMonthDate","setMonth","transform","parseDateString","originalValue","parsedDate","isDate","expiredMonthDate","isNaN","getTime","GTC_STORE","morphAddonData","addonMap","planPrice","phone_number_status","phone_number_type","currentCartAddons","previousCartAddons","removedOrganizers","addedOrganizers","removedAddonList","addedAddonList","currentAddon","previousAddon","removedQuantity","removedAddon","addedQuantity","addedAddon","removedCartData","addedCartData","calculatedPrice","currAddon","feeAmount","feePriceItem","fee","listPrice","isCouponAppliedToPlan","productCouponData","selectedAddonQuantityMap","isProductSkuAndPaymentPlanValid","selectedProductSku","couponValidationItemsMap","toCheckPaymentPlan","validFrom","isCouponDateValid","start","currentDatems","couponType","couponItem","couponValidationItem","getCouponValidationItemsMap","addonsValidity","selectedAddon","FLEXIBLE","skuAcc","currentSku","falsyCouponSkuValidity","productValidity","selectedPlanUnitPriceForCurrentTier","selectedPlanUnitPriceForBaseTier","annualMultiplier","selectedPlanProductDetails","unitPriceForCurrentTierWithBillingFrequency","unitPriceForBaseTierWithBillingFrequency","filteredPlanAddons","completePlanAddonPrice","isInvalid","selectedCurrencyPriceChange","productItemsEntries","couponDataPerSku","productDetail","couponDiscountAmount","calculatedCouponDiscount","calculateCouponDiscount","productUnitPriceForCurrentTierWithBillingFrequency","productUnitPriceForBaseTierWithBillingFrequency","discountUnitPrice","couponAmountOff","discountUnitSavings","discountTotalPrice","currentProductPrice","originalPrice","amountOff","bossMonthlyPrice","bossAnnualPrice","couponState","FIX","planCoupon","thisCoupon","RESOLVE_TRIAL_ERROR_IDS","RESOLVE_PARTIAL_NON_VALIDATION_USER_TYPES","getResolveLabelData","updatedQueryParams","queryParams","getAddonProrateAmount","v2plan","AGENT_ADDON","GTR_STORE","useResolveNewSkus","p","LMICENTRAL_TRIAL_ERROR_IDS","LMICENTRAL_PARTIAL_NON_VALIDATION_USER_TYPES","getLmiCentralLabelData","_quantity","trierIndex","getUserSubscribedAddons","currentAgent","currentEndpoint","disablePlanSelection","disableExtraAddons","userSubscribedAgent","sub","userSubscribedEndpoint","LMICENTRAL_STORE","LMICENTRAL_STANDARD_NAME","LMICENTRAL_STANDARD_NAMED_V2","createAutomationAddon","createInsightAddon","createSecurityAddon","automationAddon","insightAddon","securityAddon","subscribedAutomationAddon","subscribedInsightAddon","subscribedSecurityAddon","extraAutomationAddon","extraInsightAddon","extraSecurityAddon","canUpgradeAutomationAddon","canUpgradeInsightAddon","canUpgradeSecurityAddon","useLmiCentralNewSkus","LMIPRO_TRIAL_ERROR_IDS","LMIPRO_PARTIAL_NON_VALIDATION_USER_TYPES","getLmiProLabelData","getBillingFrequencyForTracker","filteredBillingPeriod","getBillingFrequencyPlan","BillingPeriodEnum","LMIPRO_STORE","bFrequencyKey","subscriptionBillingKey"],"sourceRoot":""}