{"version":3,"file":"static/js/e9a93ae0242245a9bd86.bundle.js","mappings":";yNA+JYA,mvBAAZ,SAAYA,GAIRA,EAAA,oBAKAA,EAAA,sBAKAA,EAAA,4BAKAA,EAAA,oCAKAA,EAAA,kBAxBJ,CAAYA,IAAAA,EAAiB,KA2B7B,MAQMC,EAAkBA,CAACC,EAAiCC,KAClDD,EAAME,OACNF,EAAME,MAAMD,IASdE,EAAiBA,CAACH,EAAiCC,KACjDD,EAAMI,SACNJ,EAAMI,QAAQH,IAShBI,EAA6BC,MAAAA,IAA0C,IAAAC,EAAAC,EAAAC,EACzE,MAAMC,EAAqC,QAA7BH,EAAGP,EAAMW,4BAAoB,IAAAJ,OAAA,EAA1BA,EAA4BK,QAAOC,IAAYC,EAAAA,iBAAiBC,kBAAkBF,EAAQG,iBACrGC,EAA0E,QAArDT,EAAGR,EAAMkB,QAAQC,cAAcC,eAAeC,eAAO,IAAAb,OAAA,EAAlDA,EAAoDc,sBAC5EC,EAAQb,MAAAA,OAAQ,EAARA,EAAUc,KAAIX,IACxB,MAAMY,EAAiBZ,EAAQa,UAAUC,aACzC,MAAO,CACHd,QAASA,EAAQG,cACjBY,MAAOd,EAAAA,iBAAiBC,kBAAkBF,EAAQa,UAAUG,UApChD,EAoC8EhB,EAAQa,UAAUG,SAC5GC,UAAWjB,EAAQa,UAAUK,UAC7BC,6BAA8BP,GAAkBA,IAAmBR,MAI3E,GAAIgB,EAAAA,gBAAgBC,YAAYX,GAC5B,OAAOA,EAGX,GAAIU,EAAAA,gBAAgBC,YAAYlC,EAAMU,UAAW,KAAAyB,EAC7C,MAAMhB,EAAgBnB,EAAMkB,QAAQC,cAC9BiB,EAAcjB,EAAcC,eAAegB,YAE3CN,EAA2B,QAAlBK,EAAGnC,EAAM8B,iBAAS,IAAAK,EAAAA,GAAIE,EAAAA,EAAAA,IAAarC,EAAMkB,QAAQC,cAAcC,iBAC9EkB,EAAAA,EAAAA,mBAAkBR,GAElB,MAAMS,EAA6C,CAC/CC,QAAS,CACLC,UAAWL,EAAYM,UACvBX,UAAWD,GAEfa,mBAAmB,EACnBC,IAAK5C,EAAMU,SAASc,KAAIX,GAAWA,EAAQgC,aAIzCC,SADqBC,EAAAA,oBAAAA,sBAA0C,CAAEC,cAAe7B,GAAiBoB,IACnDf,KAAIyB,IACpD,MAAMC,EAAsBC,EAAA,GAAQF,GAC9BG,GAAcC,EAAAA,EAAAA,yBAAwBH,EAAwBd,GAMpE,OAJIgB,IACAF,EAAuBI,gBAAkBF,GAGtCF,KAGX,OAAOlD,EAAMU,SAASc,KAAI+B,IACtB,MAAMC,EAAcV,EAA+BW,MAAK5C,GAAWA,EAAQ6C,WAAaH,EAAKV,YAC7F,IAAI7B,EACa,IAAA2C,EAAbH,EACAxC,EAAamC,EAAAA,EAAA,GACNK,GAAW,IACdI,iBAAkBC,EAAAA,YAAYC,QAC9BC,cAAeP,EAAYQ,MAC3BC,UAAgC,QAAvBN,EAAEH,EAAYS,iBAAS,IAAAN,EAAAA,EAAIH,EAAYQ,QAIpDhD,EAAgB,CACZ0C,SAAUH,EAAKV,WAIvB,MAAO,CACHhC,QAASG,EACTY,MAAO2B,EAAKW,SACZpC,UAAWyB,EAAKzB,cAKH,IAAAqC,EAAzB,OAAc,QAAd1D,EAAIT,EAAMoE,YAAI,IAAA3D,GAAVA,EAAYI,QACL,CACH,CACIA,QAASb,EAAMoE,KAAKvD,QACpBe,MAAqB,QAAhBuC,EAAEnE,EAAMkE,gBAAQ,IAAAC,EAAAA,EAvGb,EAwGRrC,UAAW9B,EAAM8B,YAKtB,IA0TLuC,EAAiB/D,MACnBN,EACAsE,EACAC,EACAC,KAEA,MAAMC,QAAuBpE,EAA2BL,GAExD,IAAKiC,EAAAA,gBAAgBC,YAAYuC,GAC7B,OAGJ,MAAMC,QAAkBC,EAAAA,EAAAA,cAAa3E,EAAMkB,QAAQC,eAC7CyD,QAAwBF,EAAUG,kBAAkBJ,GAE1D,GAA+B,YAA3BG,EAAgBE,OAGhBL,EAAeM,SAAQzE,MAAAA,IAAa,IAAA0E,EAAAC,EAAAC,EAEhC,MAAMC,EAAoC,CACtCC,OAAQ7B,EAAK1C,QAAQwE,QAAU,GAC/BC,KAAM/B,EAAK1C,QAAQ0E,MAAQ,GAC3BC,SAAoB,QAAZR,EAAEhF,EAAMoE,YAAI,IAAAY,GAAO,QAAPA,EAAVA,EAAYS,aAAK,IAAAT,OAAA,EAAjBA,EAAmBU,eAC7BC,QAAS,GACTzB,SAAUX,EAAK3B,MACf6D,OAAiB,QAAVR,EAAAjF,EAAMoE,YAAI,IAAAa,GAAO,QAAPA,EAAVA,EAAYQ,aAAK,IAAAR,OAAA,EAAjBA,EAAmBhB,YAAa,EACvC2B,UAAuC,QAA7BV,EAAAlF,EAAMkB,QAAQ2E,QAAQxE,eAAO,IAAA6D,OAAA,EAA7BA,EAA+BY,WAAY,MACrDC,cAAexC,EAAK1C,QAAQmF,uBAGhCC,EAAAA,EAAAA,IAAQ,YAAad,WA1GG7E,OAChCN,EACAsE,EACAC,EACAC,EACAE,EACAD,EAIAG,KACA,IAAAsB,EAAAC,EAAAC,EAAAC,EAAAC,EAEA,MAKMC,GAA4D,QAA/CL,SALuCM,EAAAA,iBAAAA,yBACtD,CAAExD,cAAehD,EAAMkB,QAAQC,cAAesF,YAAa,QAC3D/B,EAAUgC,KAAKC,GACfjC,EAAUgC,KAAKE,UAEkBC,qCAA6B,IAAAX,EAAAA,EAAI,IAAIY,OAEpEC,EADmB,IACPR,EAAqD,QAAtBJ,EAAGnG,EAAMgH,qBAAa,IAAAb,OAAA,EAAnBA,EAAqBc,aAAkC,QAAtBb,EAAGpG,EAAMgH,qBAAa,IAAAZ,OAAA,EAAnBA,EAAqBc,gBACvGC,EACFZ,EAnXK,GAmXea,EAAAA,EAAAA,QAAkD,QAA5Cf,EAAoB,QAApBC,EAACtG,EAAMgH,qBAAa,IAAAV,OAAA,EAAnBA,EAAqBe,8BAAsB,IAAAhB,EAAAA,EAAI,GAAIE,EAAWe,WAAYP,GAAa,GAEtHvC,EAAgB2C,GAGhB,MAAMI,EAAoBvH,EAAMkB,QAAQsG,IAAIC,OAAOF,kBAEnD,GAAIvH,EAAMgH,eAAiBO,IAAsBzH,EAAkB4H,UAC/DpD,GAAY,GACZC,GAA8B,QAC3B,GAAIvE,EAAMgH,eAAiBO,IAAsBzH,EAAkB6H,iBAAkB,KAAAC,EACxFtD,GAAY,GACZ,MAAMuD,EAAiD,CACnDC,mBAAoB9H,EAAMgH,cAAce,aACxCC,iBAAkBhI,EAAMgH,cAAciB,uBACtCC,2BAA4BlI,EAAMgH,cAAcmB,kBAChDC,2BAA4BpI,EAAMgH,cAAcqB,qBAChDC,2BAAqE,QAA3CV,EAAE5H,EAAMgH,cAAcuB,6BAAqB,IAAAX,EAAAA,EAAI,MACzEY,iCAAkCrB,GAGhCsB,EAAe,IAAIC,EAAAA,8CACrB1I,EAAMkB,QACN2G,EACA7H,EAAM2I,cACN3I,EAAM4I,aACNnE,EACAzE,EAAM6I,cACN7I,EAAM8I,iBACN9I,EAAM+I,GACN/I,EAAMgJ,UAEVC,EAAAA,qBAAqBC,WAAWC,gBAAgBV,QAEhDW,EAAAA,GAASC,YACTrJ,EAAM6I,eACL7I,EAAMsJ,qCACgBC,IAAtBhC,GAAmCA,IAAsBzH,EAAkB0J,SAI5ElF,GAAY,GAFZmF,OAAOC,SAASC,OAAO3J,EAAM6I,eAIjC9I,EAAgBC,EAAO4E,IA6CbgF,CACF5J,EACAsE,EACAC,EACAC,EACAE,EACAD,EACAG,OAED,KAAAiF,EACiDC,EAQ7CC,EAAAC,EAAAC,EAAAC,EARP,GAAuB,QAAvBL,EAAI7J,EAAMgH,qBAAa,IAAA6C,GAAnBA,EAAqBM,0BAErBlB,EAAAA,qBAAqBC,WAAWC,gBAC5B,IAAIiB,EAAAA,kBACApK,EAAMgH,cAAcmD,0BACkC,QADTL,EAC7C9J,EAAMgH,cAAcqD,0CAAkC,IAAAP,EAAAA,EAAI,UAIlEb,EAAAA,qBAAqBC,WAAWC,gBAC5B,IAAIiB,EAAAA,kBAC8C,QAD7BL,EACW,QADXC,EACjBpF,EAAgB0F,oBAAY,IAAAN,OAAA,EAA5BA,EAA8BO,wBAAgB,IAAAR,EAAAA,EAAI,qBACP,QAD2BE,EACnD,QADmDC,EACtElK,EAAMgH,qBAAa,IAAAkD,OAAA,EAAnBA,EAAqBjC,8BAAsB,IAAAgC,EAAAA,EAAI,KAK3D9J,EAAeH,EAAO,CAAEwK,cAAe,mBAAoBC,iBAAkB7F,IAC7EN,GAAY,KAuDdoG,EAA4B,CAC9BC,QApCYrK,MACZsK,EACA5K,EACAsE,EACAuG,EACAtG,EACAC,KAEA,IAAKvC,EAAAA,gBAAgBC,YAAYlC,EAAMU,UAAW,CAC9C,MAAMoK,EAAYC,EAAe/K,GAEjC,GAAI8K,EAEA,YADA3K,EAAeH,EAAO8K,GAI1BxG,GAAY,GAGhB,MAAM0G,EACF/I,EAAAA,gBAAgBC,YAAYlC,EAAMW,uBAAyBX,EAAMW,qBAAqBmG,OA9gBtE,EA+gBdmE,EAAchJ,EAAAA,gBAAgBC,YAAYlC,EAAMU,WAAaV,EAAMU,SAASoG,OA/gB9D,EAihBdoE,EAAsBF,GAA2BC,EAEnDjL,EAAMmL,wBAA0BD,QAC1B7G,EAAerE,EAAOsE,EAAaC,EAA+BC,QA9ZvDlE,OACrBN,EACAsE,EACAuG,KACe,IAAAO,EAEf,MAAM7D,EAAoBvH,EAAMkB,QAAQsG,IAAIC,OAAOF,kBAC7CnD,EAAOpE,EAAMoE,KAEbK,QAAuBpE,EAA2BL,GAClDa,EAAU4D,EAAe,GAAG5D,QAC5BqD,EAAWO,EAAe,GAAG7C,MAE7B8C,QAAkBC,EAAAA,EAAAA,cAAa3E,EAAMkB,QAAQC,eASnD,IAAIyD,GAFJyG,EAAAA,EAAAA,GAAwB3G,GAKxB,MAAM4G,EAAoD,QAA9BF,EAAGvK,EAAQ0K,2BAAmB,IAAAH,GAA+D,QAA/DA,EAA3BA,EAA6B3H,MAAK+H,GAAaA,EAAUC,MAAQC,EAAAA,EAAUC,wBAAe,IAAAP,OAAA,EAA1FA,EAA4FQ,MAErHC,EAAkC,CACpCC,QAAS,CAAE,CAAEzG,OAAQxE,EAAQwE,SAC7B7C,QAAS,CACLC,UAAWzC,EAAMkB,QAAQ2E,QAAQzD,YAAYM,UAC7CX,WAAWM,EAAAA,EAAAA,IAAarC,EAAMkB,QAAQ2E,UAE1ClD,mBAAmB,GAIjBoJ,SADsBC,EAAAA,EAAAA,uBAAsB,CAAEhJ,cAAehD,EAAMkB,QAAQC,eAAiB0K,IAC5D,GAEhCI,GAAeC,EAAAA,EAAAA,KAAyBH,MAAAA,OAAe,EAAfA,EAAiBI,kBAAmB,IAG1C,IAAAC,EAAAC,EAAxC,GAAIJ,EAAaP,EAAAA,EAAUY,YAWvB,OAVArD,EAAAA,qBAAqBC,WAAWC,gBAC5B,IAAIiB,EAAAA,kBACA,wCAC2C,QADJgC,EACpB,QADoBC,EACvCrM,EAAMgH,qBAAa,IAAAqF,OAAA,EAAnBA,EAAqBpE,8BAAsB,IAAAmE,EAAAA,EAAI,KAIvDjM,EAAeH,EAAO,CAAEwK,cAAe,mBAAoBC,iBAAkB7F,SAC7EN,GAAY,GAKhB,MAAMiI,EAAWN,EAAaP,EAAAA,EAAUa,UAClCC,EAAWP,EAAaP,EAAAA,EAAUe,aAGlCC,KAAmBH,GAAaA,IAAab,EAAAA,EAAUiB,WAAaH,IAAad,EAAAA,EAAUkB,aAG3FC,EAAcL,IAAad,EAAAA,EAAUoB,iBAG3C,GAAIxB,MAAAA,GAAAA,EAAwByB,gBAAgBC,SAAU,CAClD,MAAM,cAAEC,EAAa,UAAEC,EAAS,SAAEF,EAAQ,iBAAEG,GAAqB7B,EAAuByB,gBAClFK,EAAqD,GAG3D,IAAK,IAAIC,EAAI,EAAGA,EAAInJ,EAAUmJ,IAAK,KAAAC,EAC/B,MAAMC,EAA4C,GAClDA,EAAiB7B,EAAAA,EAAU8B,sBAAwBP,EACnDM,EAAiB7B,EAAAA,EAAU+B,cAAgBP,EAC3CK,EAAiB7B,EAAAA,EAAUgC,aAAeV,EAC1CO,EAAiBJ,iBAAmBA,EAGpC,MAAMQ,EAAaC,OAAOC,KAAKC,MAAsB,IAAhBD,KAAKE,WAI1C,GAHAR,EAAiB7B,EAAAA,EAAUsC,yBAA2BL,EAGlDT,EAAW,CACX,MAKMe,EALiBf,EAAUgB,MAAM,KAAK1M,KAAI2M,GAC1BA,EAASD,MAAM,KAChB,KAGa1M,KAAI2M,IAC3B,CACHxH,GAAIwH,EACJtM,SAAU,EACVsK,gBAAiB,CACb,CAACT,EAAAA,EAAU0C,0BAA2BT,aAK5CU,EAAAA,EAAcC,eAAe5J,EAAW1E,EAAMkB,QAAS+M,GAGjEb,EAAmBmB,KAAK,CACpB1N,QAAAA,EACAe,MAAO,EACP4M,kBAA4C,QAA3BlB,EAAEtN,EAAMyO,2BAAmB,IAAAnB,OAAA,EAAzBA,EAA2BoB,kBAC9CC,qBAAsB,CAAEC,oCAAqC5O,EAAM6O,qCAEnEC,iBAAkB9O,EAAMkB,QAAQsG,IAAIC,OAAOqH,iBAC3CC,eAAgB/O,EAAM+O,eACtBC,YAAahP,EAAM+O,eAAiB/O,EAAMiP,uBAAoB1F,EAC9DvH,6BAA8BhC,EAAMgC,6BACpCmJ,uBAAwBnL,EAAMmL,uBAC9BrJ,UAAW2C,EAAe,GAAG3C,UAC7ByL,iBAAAA,IAIR3I,QAAwBF,EAAUG,kBAAkBuI,QACjD,GAAIV,IAAkBG,EAEzB,IAAK,IAAIjL,EAAQsC,EAAUtC,EAAQ,EAAGA,GAAgB,EAAG,KAAAsN,EACrD,MAAMC,EAAkD,CACpDtO,QAAAA,EACAe,MAAO,EACP4M,kBAA4C,QAA3BU,EAAElP,EAAMyO,2BAAmB,IAAAS,OAAA,EAAzBA,EAA2BR,kBAC9CC,qBAAsB,CAAEC,oCAAqC5O,EAAM6O,qCAEnEC,iBAAkB9O,EAAMkB,QAAQsG,IAAIC,OAAOqH,iBAC3CC,eAAgB/O,EAAM+O,eACtBC,YAAahP,EAAM+O,eAAiB/O,EAAMiP,uBAAoB1F,EAC9DvH,6BAA8BhC,EAAMgC,6BACpCmJ,uBAAwBnL,EAAMmL,uBAC9BrJ,UAAW2C,EAAe,GAAG3C,WAEjC8C,QAAwBF,EAAU0K,iBAAiBD,OAEpD,KAAAE,EAEH,MAAMF,EAAkD,CACpDtO,QAAAA,EACAe,MAAOsC,EACPsK,kBAA4C,QAA3Ba,EAAErP,EAAMyO,2BAAmB,IAAAY,OAAA,EAAzBA,EAA2BX,kBAC9CC,qBAAsB,CAAEC,oCAAqC5O,EAAM6O,qCAEnEC,iBAAkB9O,EAAMkB,QAAQsG,IAAIC,OAAOqH,iBAC3CC,eAAgB/O,EAAM+O,eACtBC,YAAahP,EAAM+O,eAAiB/O,EAAMiP,uBAAoB1F,EAC9DvH,6BAA8BhC,EAAMgC,6BACpCmJ,uBAAwBnL,EAAMmL,uBAC9BrJ,UAAW2C,EAAe,GAAG3C,WAGjC8C,QAAwBF,EAAU0K,iBAAiBD,GAIvD,GAAIvK,EACA,GAA+B,YAA3BA,EAAgBE,OAAsB,KAAAwK,EAAAC,EAAAC,EAGtC,MAAMrK,EAAoC,CACtCC,OAAQvE,EAAQwE,QAAU,GAC1BC,KAAMzE,EAAQ0E,MAAQ,GACtBC,SAAoB,QAAZ8J,EAAEtP,EAAMoE,YAAI,IAAAkL,GAAO,QAAPA,EAAVA,EAAY7J,aAAK,IAAA6J,OAAA,EAAjBA,EAAmB5J,eAC7BC,QAAS,GACTzB,SAAUA,EACVuB,OAAiB,QAAV8J,EAAAvP,EAAMoE,YAAI,IAAAmL,GAAO,QAAPA,EAAVA,EAAY9J,aAAK,IAAA8J,OAAA,EAAjBA,EAAmBtL,YAAa,EACvC2B,UAAuC,QAA7B4J,EAAAxP,EAAMkB,QAAQ2E,QAAQxE,eAAO,IAAAmO,OAAA,EAA7BA,EAA+B1J,WAAY,MACrDC,cAAelF,EAAQmF,sBAM3B,IAHAC,EAAAA,EAAAA,IAAQ,YAAad,GAGjBnF,EAAMgH,eAAiBO,IAAsBzH,EAAkB4H,UAC/DpD,GAAY,GACZuG,GAAU,QACP,GAAI7K,EAAMgH,eAAiBO,IAAsBzH,EAAkB6H,iBAAkB,CACxFrD,GAAY,GACZ,MAAMmE,EAAe,IAAIgH,EAAAA,wCACrBzP,EAAMkB,QACNlB,EAAMgH,cACNhH,EAAM2I,cACN3I,EAAM4I,aACN/H,EACAuD,MAAAA,OAAI,EAAJA,EAAMqB,MACNvB,EACAlE,EAAM6I,cACN7I,EAAM8I,iBACN9I,EAAM+I,GACN/I,EAAMgJ,UAEVC,EAAAA,qBAAqBC,WAAWC,gBAAgBV,QAEhDW,EAAAA,GAASC,YACTrJ,EAAM6I,eACL7I,EAAMsJ,qCACgBC,IAAtBhC,GAAmCA,IAAsBzH,EAAkB0J,SAI5ElF,GAAY,GAFZmF,OAAOC,SAASC,OAAO3J,EAAM6I,eAIjC9I,EAAgBC,EAAO4E,OACpB,KAAA8K,EAAAC,EAAAC,EAAAC,EACH5G,EAAAA,qBAAqBC,WAAWC,gBAC5B,IAAIiB,EAAAA,kBAC8C,QAD7BsF,EACW,QADXC,EACjB/K,EAAgB0F,oBAAY,IAAAqF,OAAA,EAA5BA,EAA8BpF,wBAAgB,IAAAmF,EAAAA,EAAI,qBACP,QAD2BE,EACnD,QADmDC,EACtE7P,EAAMgH,qBAAa,IAAA6I,OAAA,EAAnBA,EAAqB5H,8BAAsB,IAAA2H,EAAAA,EAAI,KAIvDzP,EAAeH,EAAO,CAAEwK,cAAe,mBAAoBC,iBAAkB7F,IAC7EN,GAAY,KA0MVwL,CAAiB9P,EAAOsE,EAAauG,KAgBtCkF,EAAoE/P,IAAmC,IAAAgQ,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAChH,MAAOC,EAAU9M,IAAe+M,EAAAA,EAAAA,WAAS,IAClCC,EAAWC,IAAgBF,EAAAA,EAAAA,WAAS,IACpCG,EAA8BjN,IAAiC8M,EAAAA,EAAAA,WAAS,IACxElK,EAAc3C,IAAmB6M,EAAAA,EAAAA,UAAS,KAC1C5M,EAAgBgN,IAAqBJ,EAAAA,EAAAA,UAK1C,IASIK,EAA8BC,IAAAA,aAAkB,KAClDpN,GAA8B,KAC/B,IAEGqN,EAA2B,QAAV5B,EAAAhQ,EAAMoE,YAAI,IAAA4L,GAAVA,EAAYvK,MAC/BkM,IAAAA,cAACE,EAAAA,eAAc,CACXzN,KAAM,CAAEqB,MAAOzF,EAAMoE,KAAKqB,OAC1BvE,QAASlB,EAAMkB,QACf6H,GAAI/I,EAAM+I,GACVC,SAAUhJ,EAAMgJ,SAChB8I,cAAkC,QAArB7B,EAAEjQ,EAAMgH,qBAAa,IAAAiJ,OAAA,EAAnBA,EAAqB6B,cACpCC,kBAAsC,QAArB7B,EAAElQ,EAAMgH,qBAAa,IAAAkJ,OAAA,EAAnBA,EAAqB6B,kBACxCC,iBAAqC,QAArB7B,EAAEnQ,EAAMgH,qBAAa,IAAAmJ,OAAA,EAAnBA,EAAqB6B,mBAG3C,GAGEC,EAA0B,CAC5B/Q,QAASlB,EAAMkB,QACfgR,UAAW,kBACXnJ,GAAI/I,EAAM+I,GACVC,SAAUhJ,EAAMgJ,SAChB5E,KAAM,CAAEvD,QAA0B,QAAnBuP,EAAE3L,EAAe,UAAE,IAAA2L,OAAA,EAAjBA,EAAmBvP,QAAS4E,MAAiB,QAAZ4K,EAAErQ,EAAMoE,YAAI,IAAAiM,OAAA,EAAVA,EAAY5K,OAChEuB,cAAehH,EAAMgH,cACrB2B,cAAe3I,EAAM2I,cACrBC,aAAc5I,EAAMkB,QAAQ2E,QAAQ+C,aACpCuJ,qBAA8C5I,KAAZ,QAAjB+G,EAAA7L,EAAe,UAAE,IAAA6L,OAAA,EAAjBA,EAAmB1O,OAAuC,QAApB2O,EAAG9L,EAAe,UAAE,IAAA8L,OAAA,EAAjBA,EAAmB3O,MAplB7D,EAqlBhBgQ,eAAAA,EACA/I,cAAe7I,EAAM6I,cACrByI,UAAAA,EACAC,aAAAA,EACAzI,iBAAkB9I,EAAM8I,kBAGtBjB,EAAiD,CACnDC,mBAAqD,QAAnC0I,EAAqB,QAArBC,EAAEzQ,EAAMgH,qBAAa,IAAAyJ,OAAA,EAAnBA,EAAqB1I,oBAAY,IAAAyI,EAAAA,EAAI,GACzDxI,iBAA6D,QAA7C0I,EAAqB,QAArBC,EAAE3Q,EAAMgH,qBAAa,IAAA2J,OAAA,EAAnBA,EAAqB1I,8BAAsB,IAAAyI,EAAAA,EAAI,QACjExI,2BAAkE,QAAxC0I,EAAqB,QAArBC,EAAE7Q,EAAMgH,qBAAa,IAAA6J,OAAA,EAAnBA,EAAqB1I,yBAAiB,IAAAyI,EAAAA,EAAI,GACtExI,2BAAqE,QAA3C0I,EAAqB,QAArBC,EAAE/Q,EAAMgH,qBAAa,IAAA+J,OAAA,EAAnBA,EAAqB1I,4BAAoB,IAAAyI,EAAAA,EAAI,GACzExI,2BAAsE,QAA5C0I,EAAqB,QAArBC,EAAEjR,EAAMgH,qBAAa,IAAAiK,OAAA,EAAnBA,EAAqB1I,6BAAqB,IAAAyI,EAAAA,EAAI,MAC1ExI,iCAAkCrB,GAGhCiL,EAAmBT,IAAAA,cAACU,EAAAA,MAAKC,OAAA3I,OAAA,GAAKsI,IAC9BM,EAAQC,EAAYxS,GACpByS,GAAUC,EAAAA,EAAAA,kBAAiBC,EAAAA,GAAeC,UAAW5S,EAAM8I,iBAAmByJ,EAAO,IACrFM,GAAaC,EAAAA,EAAAA,wBAAuB9S,EAAM8I,iBAAmB2J,GAC7DM,EAAkB/S,EAAMmL,uBAAyB,GAAK,mBAe5D,OAbAwG,IAAAA,WAAgB,KAImBrR,WAC3B,MAAM0S,QAAuB3S,EAA2BL,GACxDyR,EAAkBuB,IAItBC,KACD,CAACjT,EAAOyR,IAGPE,IAAAA,cAAAA,IAAAA,SAAA,KACKS,EACDT,IAAAA,cAAA,SAAAW,OAAA3I,OAAA,CACIuI,UAAWgB,GAAAA,CAAWH,EAAiB/S,EAAMkS,WAAU,aAClB,QADkBhB,EAC3ClR,EAAMmT,2BAAmB,IAAAjC,EAAAA,EAAIqB,EACzCa,MAAgC,QAA3BjC,EAAEnR,EAAMmT,2BAAmB,IAAAhC,EAAAA,EAAIoB,GAChCM,EAAU,CACdlI,QA9EWrK,MAAAA,UACboK,EAA0BC,QAAQ0I,EAAOrT,EAAOsE,EAAaiN,EAAchN,EAA+BC,IA8ExG4M,SAAUpR,EAAMoR,UAAYA,GAAYkC,EAAoBtT,IAAUuT,EAAqBvT,GAAO,KAEjGuS,GAELZ,IAAAA,cAAC6B,EAAAA,gCAA+B,CAC5BtB,UAAU,iCACVnJ,GAAI/I,EAAM+I,GACVC,SAAUhJ,EAAMgJ,SAChB9H,QAASlB,EAAMkB,QACf8F,cAAea,EACfzD,KAAM,CACF1D,SAAU+D,GAEdgP,YAAajC,EACbkC,QAAShC,MAOzB3B,EAA6B4D,aAAe,CACxCzP,SAvpBoB,GA+pBxB,MAAMsO,EAAexS,GACVuT,EAAqBvT,GAAO,IAAUA,EAAM4T,eAAiB5T,EAAM4T,eAAiB5T,EAAM6T,cAQ/F9I,EAAkB/K,IACpB,MAAM,KACFoE,EAAI,oBACJqK,EAAmB,sBACnBqF,EAAqB,kBACrB7E,EAAiB,kBACjB8E,EAAiB,kBACjBC,EAAiB,yBACjBC,EAA2B,IAAG,yBAC9BC,EAA2B,IAC3BlU,EAEJ,IAAKoE,IAASA,EAAKvD,QAAQ6C,SAEvB,MAAO,CAAE8G,cAAe,cAG5B,GAAIpG,EAAKvD,QAAQsT,WAAY,CACzB,MAAMC,EAAoBhQ,EAAKvD,QAAQsT,WAAWvT,QAC9CyT,KAAeA,EAAUC,gBAAkBD,EAAUC,eAAe1I,SAGxE,GAAI3J,EAAAA,gBAAgBC,YAAYkS,GAE5B,MAAO,CAAE5J,cAAe,mBAAoB4J,kBAAAA,GAIpD,GAAIb,EAAqBvT,GAAO,GAAO,KAAAuU,EACnC,MAAMC,EAA2B,EAC3BhG,EAA0D,QAAzC+F,EAAG9F,MAAAA,OAAmB,EAAnBA,EAAqBC,yBAAiB,IAAA6F,EAAAA,EAAIC,EAGpE,MAAO,CAAEhK,cAAe,aAAciK,UAFpB5G,KAAK6G,IAAIlG,EAAmBgG,IAMlD,OACIV,KACE7E,GACEA,GAAqB8E,GAAqBE,IAC1ChF,GAAqB+E,GAAqBE,IAEvC,CAAE1J,cAAe,4BAN5B,GAmBE+I,EAAuBA,CAACvT,EAAiC2U,KAA4C,IAAAC,EACvG,QAAkDrL,IAA9CvJ,EAAMkB,QAAQsG,IAAIC,OAAOqH,mBAAgF,IAA9C9O,EAAMkB,QAAQsG,IAAIC,OAAOqH,iBACpF,OAAO,EAIX,GAAI9O,EAAMmL,uBACN,OAAO,EAGX,GACInL,EAAM6U,WACN7U,EAAM8U,0BACN9U,EAAM+U,qBACN/U,EAAMgV,0BACNhV,EAAMiV,2BACNjV,EAAMkV,uBAGN,OAAO,EAGX,IAAKlV,EAAMoE,OAASpE,EAAMoE,KAAKvD,QAAQ6C,SAEnC,OAAO,EAIX,KADuD,QAA7BkR,EAAG5U,EAAMmV,4BAAoB,IAAAP,GAAAA,GAEnD,OAAO,EAGX,GAAI5U,EAAMoE,KAAKvD,QAAQsT,YACfnU,EAAMoE,KAAKvD,QAAQsT,WAAW1Q,MAAK4Q,KAAeA,EAAUC,gBAAkBD,EAAUC,eAAe1I,SAEvG,OAAO,EAIf,MAAMwJ,EAAyBT,GAA0B3U,EAAMkE,SAAWlE,EAAMkE,SAvwB5D,EAywBpB,QACIlE,EAAMyO,0BAC0ClF,IAAhDvJ,EAAMyO,oBAAoBC,mBAC1B1O,EAAMyO,oBAAoBC,mBAAqB0G,IAIjD9B,EAAuBtT,IAA4C,IAAAqV,EACrE,OAAc,QAAdA,EAAIrV,EAAMoE,YAAI,IAAAiR,IAAVA,EAAYxU,QAAQsT,aAChBnU,EAAMoE,KAAKvD,QAAQsT,WAAW1Q,MAAK4Q,KAAeA,EAAUC,gBAAkBD,EAAUC,eAAe1I,cAM1G5L,EAAM6U,WAAc7U,EAAM+U,qBAAwB/U,EAAMgV,0BAA6BhV,EAAMiV,4BAQvFK,EAAwEC,EAAAA,GAAiBC,wBAClG,YAAWrS,EAAA,CACTsS,UAAW1F,GAAiCrF,IAIlD,wEC36BM,SAAUW,EAAwB3G,GACpC,MAAMgR,EAAgBhR,EAEjBgR,EAAcC,cACfD,EAAcC,aAAc,EAE5BD,EAAc7Q,kBAAoB+Q,EAAoBC,UAAUC,6BAChEJ,EAActG,iBAAmBwG,EAAoBC,UAAUE,4BAC/DL,EAAcM,oBAAsBN,EAAcO,iBAO1D,SAASC,EAAuBrD,GAC5B,MAAMsD,EAA0C,GAEhD,IAAK,IAAIC,KAAOvD,EACRA,EAAWuD,IACXD,EAAiB5H,KAAK,CAClB,cAAe,oEACf,KAAQ6H,EACR,UAAavD,EAAWuD,GACxB,sBAAyB,GACzB,oBAAuB,KAKnC,OAAOD,EAcX,MAAMP,UAA4BS,EAAAA,cAAlCC,kCACW,KAAAX,aAAc,EAEd,KAAAK,oBAAsBO,KAAKN,gBAI3B,mCAAmC1U,GAKtC,OAAOgV,KAAKC,gBAAkClW,UAC1C,MAAMmW,EAKA,GAEN,IAAK,MAAMC,KAAanV,EAAO,KAAAoV,EAC3B,MAAMC,EAAkBF,EAAUnJ,kBAAoB2I,EAAuBQ,EAAUnJ,kBACjFsJ,EAAqB,CACvB9U,UAA8B,QAArB4U,EAAED,EAAU5U,iBAAS,IAAA6U,EAAAA,GAAItU,EAAAA,EAAAA,IAAakU,KAAKpV,cAAcC,gBAClE0V,YAAaJ,EAAU7V,QAAQiW,YAG/BC,qBAAsB,EACtB1R,OAAQqR,EAAU7V,QAAQwE,OAC1B2R,UAAWN,EAAU7V,QAAQ6C,SAC7B7B,SAAU6U,EAAU9U,OAAS,EAC7BqV,WAAY,GACZC,oBAAqBR,EAAU7V,QAAQmF,qBACvCmR,eAAgBT,EAAU3H,eAC1BqI,eAAgBV,EAAU7V,QAAQwW,WAClCrT,MAAO0S,EAAU1H,YAAc0H,EAAU1H,YAAc0H,EAAU7V,QAAQmD,MACzEmI,gBAAiByK,GAGrB,GAAIF,EAAUhN,SAAU,CACpB,IAAK6M,KAAKpV,cAAcC,eAAeC,QACnC,MAAO,CAAEyD,OAAQ,eAIUyE,IAA3BmN,EAAUY,aACVT,EAASlV,aAAe+U,EAAUY,aAElCT,EAASlV,aAAe4U,KAAKpV,cAAcC,eAAeC,QAAQkW,uBAGtEV,EAASW,mBAAqBd,EAAUhN,SAAS+N,cACjDZ,EAASa,YAAchB,EAAUhN,SAASiO,oBAE1Cd,EAASe,gBAAkBrB,KAAKsB,iCAAiCnB,EAAUhN,UAGnC,IAAAoO,EAA5C,GAAIpB,EAAU1U,6BACV6U,EAASlV,aAAwD,QAA5CmW,EAAGvB,KAAKpV,cAAcC,eAAeC,eAAO,IAAAyW,OAAA,EAAzCA,EAA2CxW,sBAIvE,MAAMyW,EAAmB,EACnB7C,EAAyBwB,EAAU7V,QAAQmX,gBAAkBD,EAEnEtB,EAAclI,KAAK,CACf0J,cAAepB,EACfrI,kBAAmBkI,EAAUlI,kBAC7B0J,oBAAqBxB,EAAU5H,iBAC/BoG,uBAAAA,IAKR,OAAOqB,KAAK4B,2BAA0B,KAAMC,EAAAA,EAAAA,2BACxC7B,KAAK7P,KACL6P,KAAKpV,cACLsV,QAOL,kCAAkClV,GAMrC,OAAOgV,KAAKC,gBAAkClW,UAAW,IAAA+X,EAAAC,EAAAC,EACrD,MAAM3B,EAAkBrV,EAAMgM,kBAAoB2I,EAAuB3U,EAAMgM,kBACzEsJ,EAAqB,CACvB9U,UAA0B,QAAjBsW,EAAE9W,EAAMO,iBAAS,IAAAuW,EAAAA,GAAIhW,EAAAA,EAAAA,IAAakU,KAAKpV,cAAcC,gBAC9D0V,YAAavV,EAAMV,QAAQiW,YAG3BC,qBAAsB,EACtB1R,OAAQ9D,EAAMV,QAAQwE,OACtB2R,UAAWzV,EAAMV,QAAQ6C,SACzB7B,SAAUN,EAAMK,OAAS,EACzBqV,WAAY,GACZC,oBAAqB3V,EAAMV,QAAQmF,qBACnCmR,eAAgB5V,EAAMwN,eACtBqI,eAAgB7V,EAAMV,QAAQwW,WAC9BrT,MAAOzC,EAAMyN,YAAczN,EAAMyN,YAAczN,EAAMV,QAAQmD,MAC7DmI,gBAAiByK,GAGrB,GAAIrV,EAAMmI,SAAU,CAChB,IAAK6M,KAAKpV,cAAcC,eAAeC,QACnC,MAAO,CAAEyD,OAAQ,eAIMyE,IAAvBhI,EAAM+V,aACNT,EAASlV,aAAeJ,EAAM+V,aAE9BT,EAASlV,aAAe4U,KAAKpV,cAAcC,eAAeC,QAAQkW,uBAGtEV,EAASW,mBAAqBjW,EAAMmI,SAAS+N,cAC7CZ,EAASa,YAAcnW,EAAMmI,SAASiO,oBAEtCd,EAASe,gBAAkBrB,KAAKsB,iCAAiCtW,EAAMmI,UAG3E,GAAInI,EAAMS,6BAA8B,CACpC,IAAKuU,KAAKpV,cAAcC,eAAeC,QACnC,MAAO,CAAEyD,OAAQ,UAGrB+R,EAASlV,aAAe4U,KAAKpV,cAAcC,eAAeC,QAAQC,sBAItE,MAAM4T,EAAyB3T,EAAMV,QAAQmX,gBAAkBQ,EAAAA,oBAAoBC,QAG7E7J,IAA2E,QAA3B0J,EAAC/W,EAAMoN,4BAAoB,IAAA2J,IAA1BA,EAA4B1J,qCAC7E8J,IAA2E,QAAvBH,EAAChX,EAAMV,QAAQ8X,gBAAQ,IAAAJ,IAAtBA,EAAwBK,iBAGnF,OAAOrC,KAAK4B,2BAA0B,KAAMU,EAAAA,EAAAA,0BACxCtC,KAAK7P,KACLmQ,EACAN,KAAKpV,cACLyN,EACArN,EAAMiN,kBACNjN,EAAMuN,iBACNoG,EACAwD,EACAnX,EAAM4J,+FC1NhB,MAAOkD,EAYTiI,YAAYnV,EAA+BuF,GACvC6P,KAAKpV,cAAgBA,EACrBoV,KAAK7P,KAAOA,EAMT,4BAA4BhC,EAAuBxD,EAAuB4X,GAC7E,IAAKpU,IAAcA,EAAUgC,KAEzB,OADAxF,EAAQ6X,UAAUC,MAAM,sDACjB,CAAClU,OAAQ,UAGpB,GAAKgU,MAAAA,IAAAA,EAAOhS,OAER,OADA5F,EAAQ6X,UAAUC,MAAM,qEACjB,CAAClU,OAAQ,WAIpBuG,EAAAA,EAAAA,GAAwB3G,GAExB,MAIMuU,EAAiB,CACnBnN,QALYgN,EAAMtX,KAAI+B,IACf,CAAE8B,OAAQ9B,EAAKoD,OAKtBnE,QAAS,CACLC,UAAWvB,EAAQ2E,QAAQzD,YAAYM,UACvCX,WAAWM,EAAAA,EAAAA,IAAanB,EAAQ2E,WAIlCnF,QAAiBsL,EAAAA,EAAAA,uBAAsB,CAAEhJ,cAAe9B,EAAQC,eAAiB8X,GAEvF,GAAKvY,MAAAA,IAAAA,EAAUoG,OAEX,OADA5F,EAAQ6X,UAAUC,MAAM,2EACjB,CAAClU,OAAQ,UAGpB,MAAML,EAAiB/D,EAASc,KAAIX,IAChC,MAAM0C,EAAOuV,EAAMrV,MAAKF,GACbA,EAAKoD,KAAO9F,EAAQwE,SAO/B,MAAO,CACHxE,QALkB,CAClB6C,SAAU7C,EAAQ6C,UAKlB9B,OAAO2B,MAAAA,OAAI,EAAJA,EAAM1B,WAAY,EACzBC,WAAWO,EAAAA,EAAAA,IAAanB,EAAQ2E,SAChC0H,iBAAkBhK,MAAAA,OAAI,EAAJA,EAAM4I,gBACxBnK,6BAA8BuB,MAAAA,OAAI,EAAJA,EAAM2V,oBAI5C,OAAOxU,EAAUG,kBAAkBJ,IAOzB4J,EAAA8K,oBAAsB,CAACzS,EAAY0S,EAAuBC,KACpE,GAAK3S,EAAKyF,gBAEH,CACH,MAAMmN,EAAoB5S,EAAKyF,gBAAgB1I,MAAK+H,GAAaA,EAAUjG,OAAS6T,IAChFE,EACAA,EAA6B,UAAID,EAEjC3S,EAAKyF,gBAAgBoC,KACjB,CAEI,cAAe,oEACfhJ,KAAM6T,EACNG,UAAWF,EACX9N,oBAAqB,GACrBiO,sBAAuB,UAbnC9S,EAAKyF,gBAAkB,kBC1G7B,SAAUsN,EAAUC,EAAmBC,GAA2C,IAAxBC,EAAAC,UAAA/S,OAAA,QAAAyC,IAAAsQ,UAAA,GAAAA,UAAA,GAAoB,KAChF,OAAOF,EAAW,GAAGD,IAAYE,IAAYD,SAAapQ","sources":["webpack://bju-press/./src/themes/base/views/components/addtocart.component.tsx?f69e","webpack://bju-press/./src/utilities/cart-attribute-helpers.ts?c7b6","webpack://bju-press/./src/utilities/cart-utils.ts?119d","webpack://bju-press/./src/utilities/class-name-helper.ts?dd10"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport MsDyn365, {\r\n getCatalogId,\r\n IComponent,\r\n IComponentProps,\r\n IGridSettings,\r\n IImageSettings,\r\n msdyn365Commerce,\r\n TelemetryEvent\r\n} from '@msdyn365-commerce/core';\r\nimport { getCartState, ICartActionResult, ICartState } from '@msdyn365-commerce/global-state';\r\nimport {\r\n CartLineValidationResults,\r\n CartsDataActions,\r\n format,\r\n ProductAvailableQuantity,\r\n ProductDimension,\r\n ProductPrice,\r\n ProductsDataActions,\r\n ProductSearchCriteria,\r\n ProductType,\r\n SimpleProduct\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { ErrorNotification, NotificationsManager } from '@msdyn365-commerce-modules/notifications-core';\r\nimport { ArrayExtensions, generateProductImageUrl, ObjectExtensions, validateCatalogId } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { getPayloadObject, getTelemetryAttributes, IPopupProps, ITelemetryContent, Popup } from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport React, { useState } from 'react';\r\n\r\nimport { PriceComponent, IItemsAddedToCartResources, ItemsAddedToCartDialogComponent, ItemSuccessfullyAddedToCartNotification, MultiItemsSuccessfullyAddedToCartNotification, OrderDetailsProduct } from '@msdyn365-commerce/components';\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Kit custom imports\r\n//----------------------------------------------------------\r\nimport { OutputData } from '../../../../modules/buybox-kit-customizer/buybox-kit-customizer';\r\nimport { addOverridesToCartState, AddProductsToCartWithAttribs } from '../../../../utilities/cart-attribute-helpers';\r\nimport { CartUtilities } from '../../../../utilities/cart-utils';\r\nimport { attrNames } from '../../../../utilities/global-constants';\r\nimport { CommercePropertyValue } from '@msdyn365-commerce/retail-proxy';\r\nimport { convertProductAttributes } from '../../../../utilities/data-attribute-parser';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n//----------------------------------------------------------\r\n\r\n// @CUSTOM: analytics implmentation\r\nimport { publish } from '../../../../utilities/analytics/analytics-dispatcher';\r\nimport { SingleProductEvent } from '../../../../utilities/analytics/analytics-events';\r\n\r\n//----------------------------------------------------------\r\n// @CUSTOM: Custom interfaces\r\n//----------------------------------------------------------\r\nexport interface CommercePropertyValueCustom extends CommercePropertyValue {\r\n KitConfigurator: OutputData;\r\n}\r\n//----------------------------------------------------------\r\n\r\n/**\r\n * Interface for add to cart resources.\r\n */\r\nexport interface IAddToCartResources {\r\n goToCartText: string;\r\n continueShoppingText: string;\r\n closeNotificationLabel: string;\r\n headerItemOneText: string;\r\n headerItemFormatText: string;\r\n headerLinesFormatText?: string;\r\n headerMessageText: string;\r\n freePriceText: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n addedQuantityText: string;\r\n buyAgainNotificationTitle?: string;\r\n buyAgainNotificationCloseAriaLabel?: string;\r\n validationErrorMessage?: string;\r\n oneErrorText?: string;\r\n multiErrorsText?: string;\r\n}\r\n\r\n/**\r\n * Interface for add to cart components props.\r\n */\r\nexport interface IAddToCartComponentProps extends IComponentProps<{ product: SimpleProduct; price?: ProductPrice } | undefined> {\r\n className?: string;\r\n addToCartText: string;\r\n outOfStockText?: string;\r\n disabled?: boolean;\r\n quantity?: number;\r\n navigationUrl?: string;\r\n productAvailability?: ProductAvailableQuantity;\r\n getSelectedProduct?: Promise;\r\n isNavigationToCartPageDisabled?: boolean;\r\n shouldSkipSiteSettings?: boolean;\r\n addToCartArialLabel?: string;\r\n products?: {\r\n productId: number;\r\n quantity: number;\r\n catalogId?: number;\r\n }[];\r\n orderDetailsProducts?: OrderDetailsProduct[];\r\n hasAvailableProducts?: boolean;\r\n imageSettings?: IImageSettings;\r\n gridSettings?: IGridSettings;\r\n\r\n isLoading?: boolean;\r\n isUpdatingDimension?: boolean;\r\n isLoadingDeliveryOptions?: boolean;\r\n isUpdatingDeliveryOptions?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPriceAmount?: number;\r\n isOrderQuantityLimitsFeatureEnabled?: boolean;\r\n\r\n dialogStrings?: IAddToCartResources;\r\n\r\n telemetryContent?: ITelemetryContent;\r\n\r\n catalogId?: number;\r\n\r\n isCustomPriceSelected?: boolean;\r\n maximumKeyInPrice?: number;\r\n minimumKeyInPrice?: number;\r\n defaultMaximumKeyInPrice?: number;\r\n defaultMinimumKeyInPrice?: number;\r\n isProductQuantityLoading?: boolean;\r\n\r\n onAdd?(result: ICartActionResult): void;\r\n onError?(result: IAddToCartFailureResult): void;\r\n changeUpdatingDimension?(isUpdatingDimension: boolean): void;\r\n changeUpdatingDeliveryOptions?(isUpdatingDeliveryOptions: boolean): void;\r\n}\r\n\r\n/**\r\n * Cart action Failure reason type.\r\n */\r\nexport declare type ICartActionFailureReason =\r\n | 'EMPTYINPUT'\r\n | 'MISSINGDIMENSION'\r\n | 'OUTOFSTOCK'\r\n | 'CARTACTIONFAILED'\r\n | 'INVALIDCUSTOMAMOUNT';\r\n\r\n/**\r\n * Interface for add to cart failure result.\r\n */\r\nexport interface IAddToCartFailureResult {\r\n failureReason: ICartActionFailureReason;\r\n\r\n stockLeft?: number;\r\n cartActionResult?: ICartActionResult;\r\n missingDimensions?: ProductDimension[];\r\n}\r\n\r\n/**\r\n * This setting defines the experience when a product is added to cart. Corresponds to the configuration in Fabrikam.\r\n */\r\nexport enum AddToCartBehavior {\r\n /**\r\n * Navigate to cart page.\r\n */\r\n goToCart = 'goToCart',\r\n\r\n /**\r\n * Show item added to cart popup.\r\n */\r\n showModal = 'showModal',\r\n\r\n /**\r\n * Show mini cart popup.\r\n */\r\n showMiniCart = 'showMiniCart',\r\n\r\n /**\r\n * Show item added to cart notification.\r\n */\r\n showNotification = 'showNotification',\r\n\r\n /**\r\n * Do nothing and stay on the page.\r\n */\r\n nothing = 'nothing'\r\n}\r\n\r\nconst zero = 0;\r\nconst defaultQuantity = 1;\r\n\r\n/**\r\n * The propagate result.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The cart action result.\r\n */\r\nconst propagateResult = (props: IAddToCartComponentProps, result: ICartActionResult): void => {\r\n if (props.onAdd) {\r\n props.onAdd(result);\r\n }\r\n};\r\n\r\n/**\r\n * The propagate error.\r\n * @param props -- The add to cart component props.\r\n * @param result -- The add to cart failure result.\r\n */\r\nconst propagateError = (props: IAddToCartComponentProps, result: IAddToCartFailureResult): void => {\r\n if (props.onError) {\r\n props.onError(result);\r\n }\r\n};\r\n\r\n/**\r\n * Retrieves add to cart input from the component props.\r\n * @param props - Add to cart component props.\r\n * @returns Add to cart input.\r\n */\r\nconst getAddToCartInputFromProps = async (props: IAddToCartComponentProps) => {\r\n const products = props.orderDetailsProducts?.filter(product => !ObjectExtensions.isNullOrUndefined(product.simpleProduct));\r\n const emailDeliveryModeCode = props.context.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n const input = products?.map(product => {\r\n const deliveryOption = product.salesLine.DeliveryMode;\r\n return {\r\n product: product.simpleProduct!,\r\n count: ObjectExtensions.isNullOrUndefined(product.salesLine.Quantity) ? defaultQuantity : product.salesLine.Quantity,\r\n catalogId: product.salesLine.CatalogId,\r\n isAddEmailDeliveryItemToCart: deliveryOption && deliveryOption === emailDeliveryModeCode\r\n };\r\n });\r\n\r\n if (ArrayExtensions.hasElements(input)) {\r\n return input;\r\n }\r\n\r\n if (ArrayExtensions.hasElements(props.products)) {\r\n const actionContext = props.context.actionContext;\r\n const apiSettings = actionContext.requestContext.apiSettings;\r\n\r\n const catalogId = props.catalogId ?? getCatalogId(props.context.actionContext.requestContext);\r\n validateCatalogId(catalogId);\r\n\r\n const searchCriteriaInput: ProductSearchCriteria = {\r\n Context: {\r\n ChannelId: apiSettings.channelId,\r\n CatalogId: catalogId\r\n },\r\n IncludeAttributes: false,\r\n Ids: props.products.map(product => product.productId)\r\n };\r\n\r\n const searchResult = await ProductsDataActions.searchByCriteriaAsync({ callerContext: actionContext }, searchCriteriaInput);\r\n const productSearchResultsWithImages = searchResult.map(productSearchResult => {\r\n const newProductSearchResult = { ...productSearchResult };\r\n const newImageUrl = generateProductImageUrl(newProductSearchResult, apiSettings);\r\n\r\n if (newImageUrl) {\r\n newProductSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return newProductSearchResult;\r\n });\r\n\r\n return props.products.map(item => {\r\n const productData = productSearchResultsWithImages.find(product => product.RecordId === item.productId);\r\n let simpleProduct: SimpleProduct;\r\n if (productData) {\r\n simpleProduct = {\r\n ...productData,\r\n ProductTypeValue: ProductType.Variant,\r\n AdjustedPrice: productData.Price,\r\n BasePrice: productData.BasePrice ?? productData.Price\r\n };\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- Cast to simple product since only record id is available.\r\n simpleProduct = {\r\n RecordId: item.productId\r\n } as SimpleProduct;\r\n }\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item.quantity,\r\n catalogId: item.catalogId\r\n };\r\n });\r\n }\r\n\r\n if (props.data?.product) {\r\n return [\r\n {\r\n product: props.data.product,\r\n count: props.quantity ?? defaultQuantity,\r\n catalogId: props.catalogId\r\n }\r\n ];\r\n }\r\n\r\n return [];\r\n};\r\n\r\n/**\r\n * Add one item to cart when it is not buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param openModal -- The open modal call back.\r\n */\r\nconst addOneItemToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void\r\n): Promise => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n const data = props.data;\r\n\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n const product = addToCartInput[0].product;\r\n const quantity = addToCartInput[0].count;\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n\r\n //------------------------------------------------------\r\n // @CUSTOM: Kit contents - heavily modified add to cart\r\n // functionality if product is a breakout kit\r\n //------------------------------------------------------\r\n // Cart state overrides to pass attributes\r\n addOverridesToCartState(cartState);\r\n\r\n let addToCartResult;\r\n\r\n // Check for custom attributes passed through extension properties for kit substitutions\r\n const configuratorAttributes = product.ExtensionProperties?.find(attribute => attribute.Key === attrNames.lineAttributes)?.Value as CommercePropertyValueCustom;\r\n\r\n const criteria: ProductSearchCriteria = {\r\n ItemIds: [ { ItemId: product.ItemId }],\r\n Context: {\r\n ChannelId: props.context.request.apiSettings.channelId,\r\n CatalogId: getCatalogId(props.context.request)\r\n },\r\n IncludeAttributes: true\r\n };\r\n\r\n const productLookup = await searchByCriteriaAsync({ callerContext: props.context.actionContext }, criteria);\r\n const productWithAttr = productLookup[0];\r\n\r\n const formattedAtr = convertProductAttributes(productWithAttr?.AttributeValues || []);\r\n\r\n // @CUSTOM: unbuyable product customization\r\n if (formattedAtr[attrNames.notBuyable]) {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n 'Add to cart failed: unbuyable prodcut',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n\r\n return;\r\n }\r\n\r\n const testType = formattedAtr[attrNames.testType];\r\n const itemType = formattedAtr[attrNames.productType];\r\n\r\n // @CUSTOM: add items one at a time for scores or tests\r\n const isTestOrScore = !!(testType && (testType !== attrNames.isNotTest || itemType === attrNames.scoringType));\r\n\r\n // @CUSTOM: Make an exception for \"TestBklt\" types from breakout rule\r\n const isTestBkIt = (itemType === attrNames.purchaseItemType);\r\n\r\n // If kit is a breakout kit, regardless of selections\r\n if (configuratorAttributes?.KitConfigurator.contents) {\r\n const { substitutions, electives, contents, showContentsText } = configuratorAttributes.KitConfigurator;\r\n const productsToAddInput: AddProductsToCartWithAttribs[] = [];\r\n\r\n // Add each quantity separately, we do not want any breakout kits to aggregate\r\n for (let i = 0; i < quantity; i++) {\r\n const customAttributes: {[key: string]: string} = {};\r\n customAttributes[attrNames.kitLineSubstitutions] = substitutions;\r\n customAttributes[attrNames.kitElectives] = electives;\r\n customAttributes[attrNames.kitContents] = contents;\r\n customAttributes.showContentsText = showContentsText;\r\n\r\n // If kit is a breakout kit, add identifier for each quantity regardless of selections\r\n const identifier = String(Math.floor(Math.random() * 1000)); // Stringified randomizer to assign to parent kit and child electives to tie them together\r\n customAttributes[attrNames.kitLineChildAssociation] = identifier;\r\n\r\n // If kit electives have been selected, add to cart by IDs with appropriate attributes and identifier\r\n if (electives) {\r\n const electivesArray = electives.split('|').map(elective => {\r\n const splitData = elective.split(':');\r\n return splitData[0];\r\n });\r\n\r\n const itemsToAdd = electivesArray.map(elective => {\r\n return {\r\n Id: elective,\r\n Quantity: 1,\r\n AttributeValues: {\r\n [attrNames.kitLineParentAssociation]: identifier\r\n }\r\n };\r\n });\r\n\r\n await CartUtilities.addToCartByIds(cartState, props.context, itemsToAdd);\r\n }\r\n\r\n productsToAddInput.push({\r\n product,\r\n count: 1,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId,\r\n customAttributes // @CUSTOM: Added custom attributes to be passed through\r\n });\r\n }\r\n\r\n addToCartResult = await cartState.addProductsToCart(productsToAddInput);\r\n } else if (isTestOrScore && !isTestBkIt) {\r\n // @CUSTOM: add items one at a time for scores or tests\r\n for (let count = quantity; count > 0; count = count - 1) {\r\n const productToAddInput: AddProductsToCartWithAttribs = {\r\n product,\r\n count: 1,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId,\r\n };\r\n addToCartResult = await cartState.addProductToCart(productToAddInput);\r\n }\r\n } else {\r\n // Default product behavior\r\n const productToAddInput: AddProductsToCartWithAttribs = {\r\n product,\r\n count: quantity,\r\n availableQuantity: props.productAvailability?.AvailableQuantity,\r\n additionalProperties: { orderQuantityLimitsFeatureIsEnabled: props.isOrderQuantityLimitsFeatureEnabled },\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n enableStockCheck: props.context.app.config.enableStockCheck,\r\n isPriceKeyedIn: props.isPriceKeyedIn,\r\n customPrice: props.isPriceKeyedIn ? props.customPriceAmount : undefined,\r\n isAddEmailDeliveryItemToCart: props.isAddEmailDeliveryItemToCart,\r\n shouldSkipSiteSettings: props.shouldSkipSiteSettings,\r\n catalogId: addToCartInput[0].catalogId,\r\n };\r\n\r\n addToCartResult = await cartState.addProductToCart(productToAddInput);\r\n }\r\n\r\n // addToCartResult declaration is dependent on if product is breakout kit, so have to add a conditional check\r\n if (addToCartResult) {\r\n if (addToCartResult.status === 'SUCCESS') {\r\n\r\n // @CUSTOM: publish add to cart for analytics\r\n const analyticsData: SingleProductEvent = {\r\n itemID: product.ItemId || '',\r\n name: product.Name || '',\r\n discount: props.data?.price?.DiscountAmount,\r\n variant: '',\r\n quantity: quantity,\r\n price: props.data?.price?.BasePrice || 0,\r\n currency: props.context.request.channel?.Currency || 'USD',\r\n unitOfMeasure: product.DefaultUnitOfMeasure\r\n };\r\n\r\n publish('addToCart', analyticsData);\r\n // end customization\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n openModal(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const notification = new ItemSuccessfullyAddedToCartNotification(\r\n props.context,\r\n props.dialogStrings,\r\n props.imageSettings,\r\n props.gridSettings,\r\n product,\r\n data?.price,\r\n quantity,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n }\r\n //------------------------------------------------------\r\n};\r\n\r\n/**\r\n * Callback to handle success of adding to cart.\r\n * @param props - Add to cart component props.\r\n * @param setDisabled - Callback to update disabled state of the component.\r\n * @param setItemsAddedToCartDialogOpen - Callback to update disabled state of the component.\r\n * @param setErrorMessage - Callback to update error message state of the component.\r\n * @param cartState - Current cart state.\r\n * @param addToCartInput - Input used for adding to cart.\r\n * @param addToCartResult - Result of adding to cart.\r\n */\r\nconst handleAddItemsToCartSuccess = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void,\r\n cartState: ICartState,\r\n addToCartInput: {\r\n product: SimpleProduct;\r\n count: number;\r\n }[],\r\n addToCartResult: ICartActionResult\r\n) => {\r\n // Validate cart for line errors.\r\n const validationResult: CartLineValidationResults = await CartsDataActions.validateForCheckoutAsync(\r\n { callerContext: props.context.actionContext, bypassCache: 'none' },\r\n cartState.cart.Id,\r\n cartState.cart.Version\r\n );\r\n const errorCount = (validationResult.ValidationFailuresByCartLines ?? []).length;\r\n const singleErrorCount = 1;\r\n const errorText = errorCount === singleErrorCount ? props.dialogStrings?.oneErrorText : props.dialogStrings?.multiErrorsText;\r\n const errorMessage =\r\n errorCount > zero ? format(props.dialogStrings?.validationErrorMessage ?? '', errorCount.toString(), errorText) : '';\r\n\r\n setErrorMessage(errorMessage);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- read config file.\r\n const addToCartBehavior = props.context.app.config.addToCartBehavior;\r\n\r\n if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showModal) {\r\n setDisabled(false);\r\n setItemsAddedToCartDialogOpen(true);\r\n } else if (props.dialogStrings && addToCartBehavior === AddToCartBehavior.showNotification) {\r\n setDisabled(false);\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings.goToCartText,\r\n closeButtonLabel: props.dialogStrings.closeNotificationLabel,\r\n itemsAddedToCartHeaderText: props.dialogStrings.headerMessageText,\r\n itemsAddedToCartFormatText: props.dialogStrings.headerItemFormatText,\r\n linesAddedToCartFormatText: props.dialogStrings.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const notification = new MultiItemsSuccessfullyAddedToCartNotification(\r\n props.context,\r\n itemsAddedResource,\r\n props.imageSettings,\r\n props.gridSettings,\r\n addToCartInput,\r\n props.navigationUrl,\r\n props.telemetryContent!,\r\n props.id,\r\n props.typeName\r\n );\r\n NotificationsManager.instance().addNotification(notification);\r\n } else if (\r\n MsDyn365.isBrowser &&\r\n props.navigationUrl &&\r\n !props.isNavigationToCartPageDisabled &&\r\n (addToCartBehavior === undefined || addToCartBehavior === AddToCartBehavior.goToCart)\r\n ) {\r\n window.location.assign(props.navigationUrl);\r\n } else {\r\n setDisabled(false);\r\n }\r\n propagateResult(props, addToCartResult);\r\n};\r\n\r\n/**\r\n * Add one or multi item to cart from buy again.\r\n * @param props -- The props.\r\n * @param setDisabled -- The set disable call back.\r\n * @param setItemsAddedToCartDialogOpen -- The open modal call back.\r\n * @param setErrorMessage -- The set error message call back.\r\n */\r\nconst addItemsToCart = async (\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n const addToCartInput = await getAddToCartInputFromProps(props);\r\n\r\n if (!ArrayExtensions.hasElements(addToCartInput)) {\r\n return;\r\n }\r\n\r\n const cartState = await getCartState(props.context.actionContext);\r\n const addToCartResult = await cartState.addProductsToCart(addToCartInput);\r\n\r\n if (addToCartResult.status === 'SUCCESS') {\r\n\r\n // @CUSTOM: publish add to cart for analytics\r\n addToCartInput.forEach(async item => {\r\n\r\n const analyticsData: SingleProductEvent = {\r\n itemID: item.product.ItemId || '',\r\n name: item.product.Name || '',\r\n discount: props.data?.price?.DiscountAmount,\r\n variant: '',\r\n quantity: item.count,\r\n price: props.data?.price?.BasePrice || 0,\r\n currency: props.context.request.channel?.Currency || 'USD',\r\n unitOfMeasure: item.product.DefaultUnitOfMeasure\r\n };\r\n\r\n publish('addToCart', analyticsData);\r\n });\r\n // end customization\r\n\r\n await handleAddItemsToCartSuccess(\r\n props,\r\n setDisabled,\r\n setItemsAddedToCartDialogOpen,\r\n setErrorMessage,\r\n cartState,\r\n addToCartInput,\r\n addToCartResult\r\n );\r\n } else {\r\n if (props.dialogStrings?.buyAgainNotificationTitle) {\r\n // For buy again show simple error notification.\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n props.dialogStrings.buyAgainNotificationTitle,\r\n props.dialogStrings.buyAgainNotificationCloseAriaLabel ?? ''\r\n )\r\n );\r\n } else {\r\n NotificationsManager.instance().addNotification(\r\n new ErrorNotification(\r\n addToCartResult.errorDetails?.LocalizedMessage ?? 'Add to cart failed',\r\n props.dialogStrings?.closeNotificationLabel ?? ''\r\n )\r\n );\r\n }\r\n\r\n propagateError(props, { failureReason: 'CARTACTIONFAILED', cartActionResult: addToCartResult });\r\n setDisabled(false);\r\n }\r\n};\r\n\r\n/**\r\n * Interface for add to cart component.\r\n */\r\nexport interface IAddtoCartComponent extends IComponent {\r\n onClick(): (event: React.MouseEvent, props: IAddToCartComponentProps) => void;\r\n}\r\n\r\n/**\r\n * On click function.\r\n * @param _event - The mouse event.\r\n * @param props - The props.\r\n * @param setDisabled - Flag to define whether the element is disabled.\r\n * @param openModal - Flag to specify if it should open in a modal window.\r\n * @param setItemsAddedToCartDialogOpen - Sets items added to cart while dialog is open.\r\n * @param setErrorMessage - Error message.\r\n */\r\nconst onClick = async (\r\n _event: React.MouseEvent,\r\n props: IAddToCartComponentProps,\r\n setDisabled: (disabled: boolean) => void,\r\n openModal: (opened: boolean) => void,\r\n setItemsAddedToCartDialogOpen: (opened: boolean) => void,\r\n setErrorMessage: (message: string) => void\r\n): Promise => {\r\n if (!ArrayExtensions.hasElements(props.products)) {\r\n const cartError = addToCartError(props);\r\n\r\n if (cartError) {\r\n propagateError(props, cartError);\r\n return;\r\n }\r\n\r\n setDisabled(true);\r\n }\r\n\r\n const hasOrderDetailsProducts =\r\n ArrayExtensions.hasElements(props.orderDetailsProducts) && props.orderDetailsProducts.length > defaultQuantity;\r\n const hasProducts = ArrayExtensions.hasElements(props.products) && props.products.length > defaultQuantity;\r\n\r\n const hasMultipleProducts = hasOrderDetailsProducts || hasProducts;\r\n\r\n if (props.shouldSkipSiteSettings && hasMultipleProducts) {\r\n await addItemsToCart(props, setDisabled, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n } else {\r\n await addOneItemToCart(props, setDisabled, openModal);\r\n }\r\n};\r\n\r\n/**\r\n * Add to cart component action constant.\r\n */\r\nconst AddToCartComponentActions = {\r\n onClick\r\n};\r\n\r\n/**\r\n * Add to cart component.\r\n * @param props - The props.\r\n * @returns - The add to cart component.\r\n */\r\nexport const AddToCartFunctionalComponent: React.FC = (props: IAddToCartComponentProps) => {\r\n const [disabled, setDisabled] = useState(false);\r\n const [modalOpen, setModalOpen] = useState(false);\r\n const [isItemsAddedToCartDialogOpen, setItemsAddedToCartDialogOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState('');\r\n const [addToCartInput, setAddToCartInput] = useState<\r\n {\r\n product: SimpleProduct;\r\n count: number;\r\n }[]\r\n >([]);\r\n\r\n const onClickHandler = async (event: React.MouseEvent) => {\r\n await AddToCartComponentActions.onClick(event, props, setDisabled, setModalOpen, setItemsAddedToCartDialogOpen, setErrorMessage);\r\n };\r\n\r\n /**\r\n * Close dialog.\r\n */\r\n const closeItemsAddedToCartDialog = React.useCallback(() => {\r\n setItemsAddedToCartDialogOpen(false);\r\n }, []);\r\n\r\n const priceComponent = props.data?.price ? (\r\n \r\n ) : (\r\n ''\r\n );\r\n\r\n const popupProps: IPopupProps = {\r\n context: props.context,\r\n className: 'msc-add-to-cart',\r\n id: props.id,\r\n typeName: props.typeName,\r\n data: { product: addToCartInput[0]?.product, price: props.data?.price }, // addToCartInput[0]?.product?.Price },\r\n dialogStrings: props.dialogStrings,\r\n imageSettings: props.imageSettings,\r\n gridSettings: props.context.request.gridSettings,\r\n productQuantity: addToCartInput[0]?.count !== undefined ? addToCartInput[0]?.count : defaultQuantity,\r\n priceComponent,\r\n navigationUrl: props.navigationUrl,\r\n modalOpen,\r\n setModalOpen,\r\n telemetryContent: props.telemetryContent\r\n };\r\n\r\n const itemsAddedResource: IItemsAddedToCartResources = {\r\n viewCartButtonText: props.dialogStrings?.goToCartText ?? '',\r\n closeButtonLabel: props.dialogStrings?.closeNotificationLabel ?? 'Close',\r\n itemsAddedToCartHeaderText: props.dialogStrings?.headerMessageText ?? '',\r\n itemsAddedToCartFormatText: props.dialogStrings?.headerItemFormatText ?? '',\r\n linesAddedToCartFormatText: props.dialogStrings?.headerLinesFormatText ?? '{0}',\r\n itemsAddedValidationErrorMessage: errorMessage\r\n };\r\n\r\n const renderModalPopup = ;\r\n const label = getLinkText(props);\r\n const payload = getPayloadObject(TelemetryEvent.AddToCart, props.telemetryContent!, label, '');\r\n const attributes = getTelemetryAttributes(props.telemetryContent!, payload);\r\n const buttonClassName = props.shouldSkipSiteSettings ? '' : 'msc-add-to-cart ';\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Retrieves add to cart input and updates the state.\r\n */\r\n const retrieveAddToCartInput = async () => {\r\n const retrievedInput = await getAddToCartInputFromProps(props);\r\n setAddToCartInput(retrievedInput);\r\n };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises -- Call async method as per the documentation of react useEffect.\r\n retrieveAddToCartInput();\r\n }, [props, setAddToCartInput]);\r\n\r\n return (\r\n <>\r\n {renderModalPopup}\r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\n// Set default props\r\nAddToCartFunctionalComponent.defaultProps = {\r\n quantity: defaultQuantity\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns Gets the link text.\r\n */\r\nconst getLinkText = (props: IAddToCartComponentProps): string => {\r\n return shouldShowOutOfStock(props, false) && props.outOfStockText ? props.outOfStockText : props.addToCartText;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @returns The add to cart failure result.\r\n */\r\nconst addToCartError = (props: IAddToCartComponentProps): IAddToCartFailureResult | undefined => {\r\n const {\r\n data,\r\n productAvailability,\r\n isCustomPriceSelected,\r\n customPriceAmount,\r\n maximumKeyInPrice,\r\n minimumKeyInPrice,\r\n defaultMaximumKeyInPrice = 100,\r\n defaultMinimumKeyInPrice = 10\r\n } = props;\r\n\r\n if (!data || !data.product.RecordId) {\r\n // No product exists, won't be able to add to cart\r\n return { failureReason: 'EMPTYINPUT' };\r\n }\r\n\r\n if (data.product.Dimensions) {\r\n const missingDimensions = data.product.Dimensions.filter(\r\n dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value)\r\n );\r\n\r\n if (ArrayExtensions.hasElements(missingDimensions)) {\r\n // At least one dimension with no value exists on the product, won't be able to add to cart\r\n return { failureReason: 'MISSINGDIMENSION', missingDimensions };\r\n }\r\n }\r\n\r\n if (shouldShowOutOfStock(props, true)) {\r\n const defaultAvailableQuantity = 0; // Showing as out of stock if no available products found.\r\n const availableQuantity = productAvailability?.AvailableQuantity ?? defaultAvailableQuantity;\r\n const stockLeft = Math.max(availableQuantity, defaultAvailableQuantity);\r\n\r\n return { failureReason: 'OUTOFSTOCK', stockLeft };\r\n }\r\n\r\n // When Custom price is selected, if there is no keyed-in price or keyed-in price is out of limit, should return error.\r\n if (\r\n isCustomPriceSelected &&\r\n (!customPriceAmount ||\r\n customPriceAmount > (maximumKeyInPrice || defaultMaximumKeyInPrice) ||\r\n customPriceAmount < (minimumKeyInPrice || defaultMinimumKeyInPrice))\r\n ) {\r\n return { failureReason: 'INVALIDCUSTOMAMOUNT' };\r\n }\r\n\r\n // Only allow adding to cart if not showing out of stock\r\n return undefined;\r\n};\r\n\r\n/**\r\n * Resolves whether product is in stock.\r\n * @param props - The add to cart component props.\r\n * @param includeCurrentQuantity - Flag to specify whether current quantity should be included.\r\n * @returns The dialog element.\r\n */\r\nconst shouldShowOutOfStock = (props: IAddToCartComponentProps, includeCurrentQuantity: boolean): boolean => {\r\n if (props.context.app.config.enableStockCheck === undefined || props.context.app.config.enableStockCheck === false) {\r\n return false;\r\n }\r\n\r\n // When skip site settings do not need show out of stock on adding to cart\r\n if (props.shouldSkipSiteSettings) {\r\n return false;\r\n }\r\n\r\n if (\r\n props.isLoading ||\r\n props.isProductQuantityLoading ||\r\n props.isUpdatingDimension ||\r\n props.isLoadingDeliveryOptions ||\r\n props.isUpdatingDeliveryOptions ||\r\n props.isAddServiceItemToCart\r\n ) {\r\n // Out of stock turn off, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n if (!props.data || !props.data.product.RecordId) {\r\n // No product exists, don't bother showing out of stock\r\n return false;\r\n }\r\n\r\n const hasAvailableProducts = props.hasAvailableProducts ?? true;\r\n if (!hasAvailableProducts) {\r\n return true;\r\n }\r\n\r\n if (props.data.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also don't show out of stock\r\n return false;\r\n }\r\n }\r\n\r\n const includedQuantityNumber = includeCurrentQuantity && props.quantity ? props.quantity : defaultQuantity;\r\n\r\n return !(\r\n props.productAvailability &&\r\n props.productAvailability.AvailableQuantity !== undefined &&\r\n props.productAvailability.AvailableQuantity >= includedQuantityNumber\r\n );\r\n};\r\n\r\nconst isIntermediateState = (props: IAddToCartComponentProps): boolean => {\r\n if (props.data?.product.Dimensions) {\r\n if (props.data.product.Dimensions.find(dimension => !(dimension.DimensionValue && dimension.DimensionValue.Value))) {\r\n // At least one dimension with no value exists on the product, so also not in intermediate state\r\n return false;\r\n }\r\n }\r\n\r\n if (!props.isLoading && !props.isUpdatingDimension && !props.isLoadingDeliveryOptions && !props.isUpdatingDeliveryOptions) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\n// @ts-expect-error\r\nexport const AddToCartComponent: React.FunctionComponent = msdyn365Commerce.createComponentOverride(\r\n 'AddToCart',\r\n { component: AddToCartFunctionalComponent, ...AddToCartComponentActions }\r\n);\r\n\r\n\r\nexport default AddToCartComponent;","//==============================================================================\r\n// Tools to help read, write, and process cart header and line attributes\r\n//\r\n// There is currently no OOTB way to add attributes to cart lines when adding\r\n// products to the cart. We would have to add to the cart, then modify the\r\n// newly created line, using two separate retail server calls. Alternately,\r\n// low-level retail server calls could be used, followed by a cart refresh.\r\n// This optimizes the process by allowing a single call, even though the method\r\n// is not ideal.\r\n//==============================================================================\r\n\r\nimport { getCatalogId } from '@msdyn365-commerce/core';\r\nimport { CartLine, OrgUnitLocation, ReleasedProductType, SimpleProduct } from \"@msdyn365-commerce/retail-proxy\";\r\nimport { ICartActionResult, ICartState, BaseCartState, addProductToCartInternal, addProductsToCartInternal } from '@msdyn365-commerce/global-state';\r\n\r\n//==============================================================================\r\n// INTERFACES\r\n//==============================================================================\r\n\r\nexport interface AddProductsToCartWithAttribs {\r\n product: SimpleProduct;\r\n count?: number;\r\n location?: OrgUnitLocation;\r\n additionalProperties?: object;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddEmailDeliveryItemToCart?: boolean;\r\n isPriceKeyedIn?: boolean;\r\n customPrice?: number;\r\n shouldSkipSiteSettings?: boolean;\r\n catalogId?: number;\r\n deliveryMode?: string;\r\n customAttributes?: {};\r\n}\r\n\r\nexport interface SalesOrderAttribute {\r\n '@odata.type': \"#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue\",\r\n Name: string,\r\n TextValue: string,\r\n TextValueTranslations: [],\r\n ExtensionProperties: []\r\n}\r\n\r\n//==============================================================================\r\n// Public Functions\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// This replaces base functionality with our extended version\r\n//\r\n// Old school extensions like this are rightly frowned upon.\r\n// Any other method would be preferred, but there doesn't\r\n// appear to be a reasonable option at this time.\r\n//==========================================================\r\nexport function addOverridesToCartState(cartState: ICartState) {\r\n const extendedState = cartState as CustomBaseCartState;\r\n\r\n if (!extendedState.wasInjected) {\r\n extendedState.wasInjected = true;\r\n\r\n extendedState.addProductsToCart = CustomBaseCartState.prototype.addProductsToCartWithAttribs;\r\n extendedState.addProductToCart = CustomBaseCartState.prototype.addProductToCartWithAttribs;\r\n extendedState.baseRemoveCartLines = extendedState.removeCartLines;\r\n }\r\n}\r\n\r\n//==========================================================\r\n// format custom attributes into attribute value structure\r\n//==========================================================\r\nfunction formatCustomAttributes(attributes: {}): SalesOrderAttribute[] {\r\n const formattedAttribs: SalesOrderAttribute[] = [];\r\n\r\n for (var key in attributes) {\r\n if (attributes[key]) {\r\n formattedAttribs.push({\r\n \"@odata.type\": \"#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue\",\r\n \"Name\": key,\r\n \"TextValue\": attributes[key],\r\n \"TextValueTranslations\": [],\r\n \"ExtensionProperties\": []\r\n });\r\n }\r\n }\r\n\r\n return formattedAttribs;\r\n}\r\n\r\n//==============================================================================\r\n// BaseCartState Overrides\r\n//==============================================================================\r\n\r\n//==========================================================\r\n// This is a direct replacement for CartState.addProduct(s)ToCart\r\n// that accepts line-level attributes\r\n//\r\n// TODO: When upgrading to newer versions of the SSK, be sure\r\n// to update this function!\r\n//==========================================================\r\nclass CustomBaseCartState extends BaseCartState {\r\n public wasInjected = false;\r\n\r\n public baseRemoveCartLines = this.removeCartLines;\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public async addProductsToCartWithAttribs(input: {\r\n product: SimpleProduct; count?: number; location?: OrgUnitLocation; additionalProperties?: object; availableQuantity?: number;\r\n enableStockCheck?: boolean; isAddEmailDeliveryItemToCart?: boolean; isPriceKeyedIn?: boolean; customPrice?: number; deliveryMode?: string; catalogId?: number; customAttributes?: {};\r\n }[]): Promise {\r\n\r\n return this._doAsyncAction(async () => {\r\n const internalInput: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n isStockCheckEnabled?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[] = [];\r\n\r\n for (const inputItem of input) {\r\n const attributeValues = inputItem.customAttributes && formatCustomAttributes(inputItem.customAttributes);\r\n const cartLine: CartLine = {\r\n CatalogId: inputItem.catalogId ?? getCatalogId(this.actionContext.requestContext),\r\n Description: inputItem.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: inputItem.product.ItemId,\r\n ProductId: inputItem.product.RecordId,\r\n Quantity: inputItem.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\r\n IsGiftCardLine: inputItem.product.IsGiftCard,\r\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price,\r\n AttributeValues: attributeValues\r\n };\r\n\r\n if (inputItem.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (inputItem.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = inputItem.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\r\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\r\n // @ts-expect-error\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\r\n }\r\n\r\n if (inputItem.isAddEmailDeliveryItemToCart) {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n internalInput.push({\r\n cartLineToAdd: cartLine,\r\n availableQuantity: inputItem.availableQuantity,\r\n isStockCheckEnabled: inputItem.enableStockCheck,\r\n isAddServiceItemToCart\r\n });\r\n }\r\n\r\n // @ts-expect-error\r\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(\r\n this.cart,\r\n this.actionContext,\r\n internalInput\r\n ));\r\n });\r\n }\r\n\r\n //----------------------------------------------------------\r\n //----------------------------------------------------------\r\n public async addProductToCartWithAttribs(input: {\r\n product: SimpleProduct; count?: number; location?: OrgUnitLocation; additionalProperties?: object; availableQuantity?: number;\r\n enableStockCheck?: boolean; isAddEmailDeliveryItemToCart?: boolean; isPriceKeyedIn?: boolean; customPrice?: number; deliveryMode?: string;\r\n shouldSkipSiteSettings?: boolean; catalogId?: number; customAttributes?: {};\r\n }): Promise {\r\n\r\n return this._doAsyncAction(async () => {\r\n const attributeValues = input.customAttributes && formatCustomAttributes(input.customAttributes);\r\n const cartLine: CartLine = {\r\n CatalogId: input.catalogId ?? getCatalogId(this.actionContext.requestContext),\r\n Description: input.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: input.product.ItemId,\r\n ProductId: input.product.RecordId,\r\n Quantity: input.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: input.isPriceKeyedIn,\r\n IsGiftCardLine: input.product.IsGiftCard,\r\n Price: input.customPrice ? input.customPrice : input.product.Price,\r\n AttributeValues: attributeValues\r\n };\r\n\r\n if (input.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (input.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = input.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\r\n cartLine.WarehouseId = input.location.InventoryLocationId;\r\n // @ts-expect-error\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\r\n }\r\n\r\n if (input.isAddEmailDeliveryItemToCart) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n // @ts-expect-error\r\n const orderQuantityLimitsFeatureIsEnabled: boolean = !!input.additionalProperties?.orderQuantityLimitsFeatureIsEnabled;\r\n const isMaxByQuantityValidationFeatureDefined: boolean = !!input.product.Behavior?.MaximumQuantity;\r\n\r\n // @ts-expect-error\r\n return this._doCartOperationWithRetry(() => addProductToCartInternal(\r\n this.cart,\r\n cartLine,\r\n this.actionContext,\r\n orderQuantityLimitsFeatureIsEnabled,\r\n input.availableQuantity,\r\n input.enableStockCheck,\r\n isAddServiceItemToCart,\r\n isMaxByQuantityValidationFeatureDefined,\r\n input.shouldSkipSiteSettings\r\n ));\r\n });\r\n }\r\n}\r\n","import { IActionContext, ICoreContext, getCatalogId } from '@msdyn365-commerce/core';\r\nimport { ICartState, ICartActionResult } from '@msdyn365-commerce/global-state';\r\nimport { SimpleProduct, Cart } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { addOverridesToCartState } from './cart-attribute-helpers';\r\n\r\n//==============================================================================\r\n// INTERFACES AND TYPES\r\n//==============================================================================\r\n\r\nexport interface CartAttributeValues {\r\n '@odata.type': \"#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue\",\r\n Name: string,\r\n TextValue: string,\r\n TextValueTranslations: [],\r\n ExtensionProperties: []\r\n}\r\n\r\nexport type AddByIdItems = {\r\n Id: string,\r\n Quantity: number,\r\n AttributeValues?: {}, // format as { attributeName: attributeValue }\r\n isEmailDelivery?: true\r\n}[];\r\n\r\n//==============================================================================\r\n// CLASS DEFINITION\r\n//==============================================================================\r\n/**\r\n * Util additions for cart\r\n */\r\n//==============================================================================\r\nexport class CartUtilities {\r\n\r\n protected actionContext: IActionContext;\r\n protected cart: ICartState;\r\n\r\n //==========================================================================\r\n // PUBLIC METHODS\r\n //==========================================================================\r\n\r\n //------------------------------------------------------\r\n // Constructor\r\n //------------------------------------------------------\r\n constructor(actionContext: IActionContext, cart: ICartState) {\r\n this.actionContext = actionContext;\r\n this.cart = cart;\r\n }\r\n\r\n //------------------------------------------------------\r\n // Allows adding to cart by item Id and able to pass through custom attributes that will be set as cartline attributes\r\n //------------------------------------------------------\r\n public static async addToCartByIds(cartState: ICartState, context: ICoreContext, items: AddByIdItems): Promise {\r\n if (!cartState || !cartState.cart) {\r\n context.telemetry.error('[CartUtilities.addToCartByIds] Failed to load cart');\r\n return {status: 'FAILED'};\r\n }\r\n\r\n if (!items?.length) {\r\n context.telemetry.error('[CartUtilities.addToCartByIds] Failed to send, no item ids passed');\r\n return {status: 'FAILED'};\r\n }\r\n\r\n // overrides function to allow custom attributes\r\n addOverridesToCartState(cartState);\r\n\r\n const itemIds = items.map(item => {\r\n return { ItemId: item.Id};\r\n });\r\n\r\n const searchCriteria = {\r\n ItemIds: itemIds,\r\n Context: {\r\n ChannelId: context.request.apiSettings.channelId,\r\n CatalogId: getCatalogId(context.request)\r\n }\r\n };\r\n\r\n const products = await searchByCriteriaAsync({ callerContext: context.actionContext }, searchCriteria);\r\n\r\n if (!products?.length) {\r\n context.telemetry.error('[CartUtilities.addToCartByIds] Failed to find products based on itemIds');\r\n return {status: 'FAILED'};\r\n }\r\n\r\n const addToCartInput = products.map(product => {\r\n const item = items.find(item => {\r\n return item.Id === product.ItemId;\r\n });\r\n\r\n const simpleProduct = {\r\n RecordId: product.RecordId\r\n } as SimpleProduct;\r\n\r\n return {\r\n product: simpleProduct,\r\n count: item?.Quantity || 1,\r\n catalogId: getCatalogId(context.request),\r\n customAttributes: item?.AttributeValues,\r\n isAddEmailDeliveryItemToCart: item?.isEmailDelivery\r\n };\r\n });\r\n\r\n return cartState.addProductsToCart(addToCartInput);\r\n\r\n }\r\n\r\n //------------------------------------------------------\r\n // Add to cart attributes\r\n //------------------------------------------------------\r\n public static addToCartAttributes = (cart: Cart, attributeName: string, attributeValue: string): void => {\r\n if (!cart.AttributeValues) {\r\n cart.AttributeValues = [];\r\n } else {\r\n const attributeToUpdate = cart.AttributeValues.find(attribute => attribute.Name === attributeName);\r\n if (attributeToUpdate) {\r\n attributeToUpdate['TextValue'] = attributeValue;\r\n } else {\r\n cart.AttributeValues.push(\r\n {\r\n // @ts-expect-error -- Need to provide data type.\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attributeName,\r\n TextValue: attributeValue,\r\n ExtensionProperties: [],\r\n TextValueTranslations: []\r\n }\r\n );\r\n }\r\n }\r\n };\r\n}","//==============================================================================\r\n// Class Name Helper\r\n//\r\n// Tool to standardize CSS class naming in module components and elements\r\n//==============================================================================\r\n\r\nexport function clsHelper(baseClass: string, fragment?: string, separator: string = '__'): string | undefined {\r\n return fragment ? `${baseClass}${separator}${fragment}` : undefined;\r\n}\r\n"],"names":["AddToCartBehavior","propagateResult","props","result","onAdd","propagateError","onError","getAddToCartInputFromProps","async","_props$orderDetailsPr","_props$context$action","_props$data","products","orderDetailsProducts","filter","product","ObjectExtensions","isNullOrUndefined","simpleProduct","emailDeliveryModeCode","context","actionContext","requestContext","channel","EmailDeliveryModeCode","input","map","deliveryOption","salesLine","DeliveryMode","count","Quantity","catalogId","CatalogId","isAddEmailDeliveryItemToCart","ArrayExtensions","hasElements","_props$catalogId","apiSettings","getCatalogId","validateCatalogId","searchCriteriaInput","Context","ChannelId","channelId","IncludeAttributes","Ids","productId","productSearchResultsWithImages","ProductsDataActions","callerContext","productSearchResult","newProductSearchResult","_objectSpread","newImageUrl","generateProductImageUrl","PrimaryImageUrl","item","productData","find","RecordId","_productData$BasePric","ProductTypeValue","ProductType","Variant","AdjustedPrice","Price","BasePrice","quantity","_props$quantity","data","addItemsToCart","setDisabled","setItemsAddedToCartDialogOpen","setErrorMessage","addToCartInput","cartState","getCartState","addToCartResult","addProductsToCart","status","forEach","_props$data4","_props$data5","_props$context$reques2","analyticsData","itemID","ItemId","name","Name","discount","price","DiscountAmount","variant","currency","request","Currency","unitOfMeasure","DefaultUnitOfMeasure","publish","_validationResult$Val","_props$dialogStrings3","_props$dialogStrings4","_props$dialogStrings$3","_props$dialogStrings5","errorCount","CartsDataActions","bypassCache","cart","Id","Version","ValidationFailuresByCartLines","length","errorText","dialogStrings","oneErrorText","multiErrorsText","errorMessage","format","validationErrorMessage","toString","addToCartBehavior","app","config","showModal","showNotification","_props$dialogStrings$4","itemsAddedResource","viewCartButtonText","goToCartText","closeButtonLabel","closeNotificationLabel","itemsAddedToCartHeaderText","headerMessageText","itemsAddedToCartFormatText","headerItemFormatText","linesAddedToCartFormatText","headerLinesFormatText","itemsAddedValidationErrorMessage","notification","MultiItemsSuccessfullyAddedToCartNotification","imageSettings","gridSettings","navigationUrl","telemetryContent","id","typeName","NotificationsManager","instance","addNotification","MsDyn365","isBrowser","isNavigationToCartPageDisabled","undefined","goToCart","window","location","assign","handleAddItemsToCartSuccess","_props$dialogStrings6","_props$dialogStrings$5","_addToCartResult$erro3","_addToCartResult$erro4","_props$dialogStrings$6","_props$dialogStrings7","buyAgainNotificationTitle","ErrorNotification","buyAgainNotificationCloseAriaLabel","errorDetails","LocalizedMessage","failureReason","cartActionResult","AddToCartComponentActions","onClick","_event","openModal","cartError","addToCartError","hasOrderDetailsProducts","hasProducts","hasMultipleProducts","shouldSkipSiteSettings","_product$ExtensionPro","addOverridesToCartState","configuratorAttributes","ExtensionProperties","attribute","Key","attrNames","lineAttributes","Value","criteria","ItemIds","productWithAttr","searchByCriteriaAsync","formattedAtr","convertProductAttributes","AttributeValues","_props$dialogStrings$","_props$dialogStrings","notBuyable","testType","itemType","productType","isTestOrScore","isNotTest","scoringType","isTestBkIt","purchaseItemType","KitConfigurator","contents","substitutions","electives","showContentsText","productsToAddInput","i","_props$productAvailab","customAttributes","kitLineSubstitutions","kitElectives","kitContents","identifier","String","Math","floor","random","kitLineChildAssociation","itemsToAdd","split","elective","kitLineParentAssociation","CartUtilities","addToCartByIds","push","availableQuantity","productAvailability","AvailableQuantity","additionalProperties","orderQuantityLimitsFeatureIsEnabled","isOrderQuantityLimitsFeatureEnabled","enableStockCheck","isPriceKeyedIn","customPrice","customPriceAmount","_props$productAvailab2","productToAddInput","addProductToCart","_props$productAvailab3","_props$data2","_props$data3","_props$context$reques","ItemSuccessfullyAddedToCartNotification","_addToCartResult$erro","_addToCartResult$erro2","_props$dialogStrings$2","_props$dialogStrings2","addOneItemToCart","AddToCartFunctionalComponent","_props$data6","_props$dialogStrings8","_props$dialogStrings9","_props$dialogStrings10","_addToCartInput$","_props$data7","_addToCartInput$2","_addToCartInput$3","_props$dialogStrings$7","_props$dialogStrings11","_props$dialogStrings$8","_props$dialogStrings12","_props$dialogStrings$9","_props$dialogStrings13","_props$dialogStrings$10","_props$dialogStrings14","_props$dialogStrings$11","_props$dialogStrings15","_props$addToCartArial","_props$addToCartArial2","disabled","useState","modalOpen","setModalOpen","isItemsAddedToCartDialogOpen","setAddToCartInput","closeItemsAddedToCartDialog","React","priceComponent","PriceComponent","freePriceText","originalPriceText","currentPriceText","popupProps","className","productQuantity","renderModalPopup","Popup","Object","label","getLinkText","payload","getPayloadObject","TelemetryEvent","AddToCart","attributes","getTelemetryAttributes","buttonClassName","retrievedInput","retrieveAddToCartInput","classnames","addToCartArialLabel","title","event","isIntermediateState","shouldShowOutOfStock","ItemsAddedToCartDialogComponent","isModalOpen","onClose","defaultProps","outOfStockText","addToCartText","isCustomPriceSelected","maximumKeyInPrice","minimumKeyInPrice","defaultMaximumKeyInPrice","defaultMinimumKeyInPrice","Dimensions","missingDimensions","dimension","DimensionValue","_productAvailability$","defaultAvailableQuantity","stockLeft","max","includeCurrentQuantity","_props$hasAvailablePr","isLoading","isProductQuantityLoading","isUpdatingDimension","isLoadingDeliveryOptions","isUpdatingDeliveryOptions","isAddServiceItemToCart","hasAvailableProducts","includedQuantityNumber","_props$data8","AddToCartComponent","msdyn365Commerce","createComponentOverride","component","extendedState","wasInjected","CustomBaseCartState","prototype","addProductsToCartWithAttribs","addProductToCartWithAttribs","baseRemoveCartLines","removeCartLines","formatCustomAttributes","formattedAttribs","key","BaseCartState","constructor","this","_doAsyncAction","internalInput","inputItem","_inputItem$catalogId","attributeValues","cartLine","Description","EntryMethodTypeValue","ProductId","TrackingId","UnitOfMeasureSymbol","IsPriceKeyedIn","IsGiftCardLine","IsGiftCard","deliveryMode","PickupDeliveryModeCode","FulfillmentStoreId","OrgUnitNumber","WarehouseId","InventoryLocationId","ShippingAddress","_buildAddressFromOrgUnitLocation","_this$actionContext$r","PRODUCTASSERVICE","ItemTypeValue","cartLineToAdd","isStockCheckEnabled","_doCartOperationWithRetry","addProductsToCartInternal","_input$catalogId","_input$additionalProp","_input$product$Behavi","ReleasedProductType","Service","isMaxByQuantityValidationFeatureDefined","Behavior","MaximumQuantity","addProductToCartInternal","items","telemetry","error","searchCriteria","isEmailDelivery","addToCartAttributes","attributeName","attributeValue","attributeToUpdate","TextValue","TextValueTranslations","clsHelper","baseClass","fragment","separator","arguments"],"sourceRoot":""}