{"version":3,"file":"externalphotopicker.min.js","sources":["externalphotopicker.ts"],"sourcesContent":["\r\nnamespace eXpress.core.mediastore {\r\n\texport class ExternalPhotoPicker {\r\n\r\n\t\t// Start util-methods\r\n\t\t// They live in this file for simplicity\r\n\t\t// Use the generic core-methods when moving this file to .net core\r\n\t\t//\r\n\t\tprivate waitCancellableAsync = async (delayInMs: number, cancellationToken: { cancel: () => void }) => {\r\n\t\t\treturn new Promise((resolve) => {\r\n\t\t\t\tlet timeoutRef: NodeJS.Timeout | null = setTimeout(resolve, delayInMs);\r\n\t\t\t\tcancellationToken.cancel = () => {\r\n\t\t\t\t\t// Only resolve once\r\n\t\t\t\t\tif (timeoutRef == null)\r\n\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t// cancel timeout\r\n\t\t\t\t\tclearTimeout(timeoutRef);\r\n\t\t\t\t\ttimeoutRef = null;\r\n\r\n\t\t\t\t\t// The timeout is cancelled and won't trigger on its own\r\n\t\t\t\t\t// so we have to manually resolve the Promise. \r\n\t\t\t\t\treturn resolve(undefined);\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t};\r\n\t\tprivate expressEventListener<T>(element: any, type: string, listener: (ev: any) => T, useCapture?: boolean): IDisposable {\r\n\t\t\tconst disposable = {\r\n\t\t\t\tdispose: (): void => {\r\n\t\t\t\t\tif (disposable.handler) { // Prevent unregistering twice\r\n\t\t\t\t\t\telement.removeEventListener(disposable.type, disposable.handler, useCapture);\r\n\t\t\t\t\t\tdelete (disposable as any).handler;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\thandler: (ev: any): T => {\r\n\t\t\t\t\treturn listener(ev);\r\n\t\t\t\t},\r\n\t\t\t\ttype\r\n\t\t\t};\r\n\r\n\t\t\telement.addEventListener(disposable.type, disposable.handler, useCapture);\r\n\r\n\t\t\treturn disposable;\r\n\t\t}\r\n\t\tprivate pageVisibilityChange = (onVisible?: () => void | undefined, onHidden?: () => void | undefined): IDisposable | null => {\r\n\t\t\tif (!onVisible && !onHidden)\r\n\t\t\t\treturn null;\r\n\r\n\t\t\tlet hidden: string, visibilityState: string, visibilityChange: string;\r\n\t\t\thidden = '';\r\n\t\t\tvisibilityChange = '';\r\n\r\n\t\t\tif (typeof document.hidden !== \"undefined\") {\r\n\t\t\t\thidden = \"hidden\"; visibilityChange = \"visibilitychange\"; visibilityState = \"visibilityState\";\r\n\t\t\t}\r\n\t\t\t// @ts-ignore\r\n\t\t\telse if (typeof document.mozHidden !== \"undefined\") {\r\n\t\t\t\thidden = \"mozHidden\"; visibilityChange = \"mozvisibilitychange\"; visibilityState = \"mozVisibilityState\";\r\n\t\t\t}\r\n\t\t\t// @ts-ignore\r\n\t\t\telse if (typeof document.msHidden !== \"undefined\") {\r\n\t\t\t\thidden = \"msHidden\"; visibilityChange = \"msvisibilitychange\"; visibilityState = \"msVisibilityState\";\r\n\t\t\t}\r\n\t\t\t// @ts-ignore\r\n\t\t\telse if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\t\t\thidden = \"webkitHidden\"; visibilityChange = \"webkitvisibilitychange\"; visibilityState = \"webkitVisibilityState\";\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof document.addEventListener === \"undefined\" || typeof hidden === \"undefined\") \r\n\t\t\t\t// not supported\r\n\t\t\t\treturn null;\r\n\r\n\t\t\treturn this.expressEventListener(document, visibilityChange, () => {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tswitch (document[visibilityState]) {\r\n\t\t\t\t\t\tcase \"visible\":\r\n\t\t\t\t\t\t\tonVisible && onVisible();\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\t\t\tonHidden && onHidden();\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}, 0);\r\n\t\t\t}, false);\r\n\t\t};\r\n\t\t// End util-methods\r\n\r\n\r\n\t\tprivate sessionCookieName = 'epp';\r\n\t\tprivate storageService: services.StorageService;\r\n\t\tprivate externalPhotoPickerData: eXpress.services.ExternalPhotoPicker | null;\r\n\t\tprivate pollingCancellationToken = { cancel: Function };\r\n\r\n\t\tconstructor(storageService: services.StorageService) {\r\n\t\t\tthis.storageService = storageService;\r\n\t\t}\r\n\r\n\t\tpublic async createExternalPhotoPicker() {\r\n\t\t\t// Close the session from the cookie\r\n\t\t\tconst sessionId = GetCookie(this.sessionCookieName);\r\n\t\t\tif (sessionId && (!this.externalPhotoPickerData || sessionId != this.externalPhotoPickerData.Id))\r\n\t\t\t\tawait this.deleteExternalPhotoPickerById(sessionId);\r\n\r\n\t\t\t// only 3600 sec left (= 1 hour) => delete and create a new one\r\n\t\t\tif (this.externalPhotoPickerData && this.externalPhotoPickerData.ExpiresInSec < 3600)\r\n\t\t\t\tthis.deleteExternalPhotoPicker();\r\n\r\n\t\t\t// only create session if non already exists \r\n\t\t\tif (!this.externalPhotoPickerData) {\r\n\t\t\t\tthis.externalPhotoPickerData = await this.storageService.createExternalPhotoPicker(StoreType.GooglePhotos, GetCookie(\"accid\"), context.pointOfSaleId);\r\n\r\n\t\t\t\t// Keep track of open session in a cookie so we can do a cleanup if it's left open\r\n\t\t\t\tif (this.externalPhotoPickerData)\r\n\t\t\t\t\tthis.setSessionCookie(this.externalPhotoPickerData.Id, this.externalPhotoPickerData.ExpiresInSec);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpublic openPicker(): Window | null {\r\n\t\t\tif (!this.externalPhotoPickerData)\r\n\t\t\t\treturn null;\r\n\r\n\t\t\tconst url = this.externalPhotoPickerData.PickerUri;\r\n\t\t\treturn window.open(url, '_blank');\r\n\t\t}\r\n\r\n\t\tpublic startPickerPolling = async () => {\r\n\t\t\tif (!this.externalPhotoPickerData)\r\n\t\t\t\treturn;\r\n\r\n\t\t\t// on page visibile => cancel the timeout\r\n\t\t\tconst eventHandler = this.pageVisibilityChange(() => { this.pollingCancellationToken.cancel(); });\r\n\r\n\t\t\tlet result = true;\r\n\t\t\tdo {\r\n\t\t\t\tconst waitInMs = this.externalPhotoPickerData.PollingIntervalInSec * 1000;\r\n\t\t\t\tawait this.waitCancellableAsync(waitInMs, this.pollingCancellationToken);\r\n\r\n\t\t\t\tthis.externalPhotoPickerData = await this.getSession();\r\n\t\t\t\tif (!this.externalPhotoPickerData) {\r\n\t\t\t\t\tresult = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twhile (!this.externalPhotoPickerData.MediaItemsSet);\r\n\r\n\t\t\teventHandler?.dispose();\r\n\t\t\treturn result;\r\n\t\t};\r\n\r\n\t\tpublic async getSession(): Promise<eXpress.services.ExternalPhotoPicker | null> {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tif (!this.externalPhotoPickerData)\r\n\t\t\t\t\treturn null;\r\n\r\n\t\t\t\tthis.storageService.getExternalPhotoPicker(StoreType.GooglePhotos, GetCookie(\"accid\"), context.pointOfSaleId, this.externalPhotoPickerData.Id)\r\n\t\t\t\t\t.then(resolve, reject);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tpublic async getSelectedPhotos(): Promise<eXpress.core.partners.PartnerPhoto[]> {\r\n\t\t\tif (!this.externalPhotoPickerData)\r\n\t\t\t\treturn [];\r\n\r\n\t\t\treturn await this.storageService.getExternalPhotoPickerPhotos(StoreType.GooglePhotos, GetCookie(\"accid\"), context.pointOfSaleId, this.externalPhotoPickerData.Id);\r\n\t\t}\r\n\r\n\t\tpublic async deleteExternalPhotoPicker(): Promise<boolean> {\r\n\t\t\treturn await this.deleteExternalPhotoPickerById(this.externalPhotoPickerData?.Id || '');\r\n\t\t}\r\n\r\n\t\tprivate async deleteExternalPhotoPickerById(id: string): Promise<boolean> {\r\n\t\t\tif (!id)\r\n\t\t\t\treturn true;\r\n\r\n\t\t\tthis.externalPhotoPickerData = null;\r\n\r\n\t\t\t// stop polling\r\n\t\t\tthis.pollingCancellationToken.cancel();\r\n\r\n\t\t\tconst result = await this.storageService.deleteExternalPhotoPicker(StoreType.GooglePhotos, GetCookie(\"accid\"), context.pointOfSaleId, id);\r\n\r\n\t\t\t// Whether we failed to delete session or not => delete the cookie anyway to prevent recurring errors\r\n\t\t\tthis.clearSessionCookie();\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\t// start session cookie\r\n\t\t//\r\n\t\t// Keep track of open session.\r\n\t\t// Close all open sessions before creating a new one\r\n\t\t// \r\n\t\tprivate setSessionCookie(id: string, expiresInSeconds: number): void {\r\n\t\t\tconst existingCookieValue = GetCookie(this.sessionCookieName);\r\n\t\t\tif (existingCookieValue)\r\n\t\t\t\tthis.deleteExternalPhotoPickerById(existingCookieValue);\r\n\r\n\r\n\t\t\tconst expiresInDays = (expiresInSeconds / 60 / 60 / 24) + 1;\r\n\t\t\teXpress.utils.writeCookie(this.sessionCookieName, id, expiresInDays);\r\n\t\t}\r\n\t\tprivate clearSessionCookie(): void {\r\n\t\t\tconst existingCookieValue = GetCookie(this.sessionCookieName);\r\n\t\t\tif (!existingCookieValue)\r\n\t\t\t\treturn;\r\n\r\n\t\t\teXpress.utils.writeCookie(this.sessionCookieName, '', -1);\r\n\t\t}\r\n\t\t// end session cookie\r\n\t}\r\n}\r\n"],"names":["eXpress","core","mediastore","ExternalPhotoPicker","storageService","_this","this","waitCancellableAsync","delayInMs","cancellationToken","__awaiter","Promise","resolve","timeoutRef","setTimeout","cancel","clearTimeout","undefined","pageVisibilityChange","onVisible","onHidden","hidden","visibilityChange","document","visibilityState","mozHidden","msHidden","webkitHidden","addEventListener","expressEventListener","sessionCookieName","pollingCancellationToken","Function","startPickerPolling","externalPhotoPickerData","eventHandler","result","waitInMs","PollingIntervalInSec","_b","sent","_a","getSession","MediaItemsSet","dispose","prototype","element","type","listener","useCapture","disposable","handler","removeEventListener","ev","createExternalPhotoPicker","sessionId","GetCookie","Id","deleteExternalPhotoPickerById","ExpiresInSec","deleteExternalPhotoPicker","StoreType","GooglePhotos","context","pointOfSaleId","setSessionCookie","openPicker","url","PickerUri","window","open","reject","getExternalPhotoPicker","then","getSelectedPhotos","getExternalPhotoPickerPhotos","id","clearSessionCookie","expiresInSeconds","existingCookieValue","expiresInDays","utils","writeCookie"],"mappings":"IACUA,8sDAAV,SAAUA,SAAQ,IAAAC,KAAKC,WACtBC,oBADiBF,KAAAD,QAAIC,OAAJD,aAiNjB,CAAA,GAjNsBE,WAAAD,KAAUC,aAAVD,gBAiNtB,CAAA,GAhNAE,oBAAA,WA2FC,SAAAA,oBAAYC,gBAAZ,IAECC,MAAAC,KAvFOA,KAAAC,qBAAuB,SAAOC,UAAmBC,mBAAyC,OAAAC,UAAAL,WAAA,OAAA,GAAA,iDACjG,MAAA,CAAA,EAAO,IAAIM,SAAQ,SAACC,SACnB,IAAIC,WAAoCC,WAAWF,QAASJ,WAC5DC,kBAAkBM,OAAS,WAE1B,GAAkB,MAAdF,WASJ,OALAG,aAAaH,YACbA,WAAa,KAIND,aAAQK,EAChB,CACA,YAoBMX,KAAAY,qBAAuB,SAACC,UAAoCC,UACnE,OAAKD,WAAcC,UAInBC,OAAS,GACTC,iBAAmB,QAEY,IAApBC,SAASF,QACnBA,OAAS,SAAUC,iBAAmB,mBAAoBE,gBAAkB,wBAGtC,IAAvBD,SAASE,WACxBJ,OAAS,YAAaC,iBAAmB,sBAAuBE,gBAAkB,2BAG7C,IAAtBD,SAASG,UACxBL,OAAS,WAAYC,iBAAmB,qBAAsBE,gBAAkB,0BAGvC,IAA1BD,SAASI,eACxBN,OAAS,eAAgBC,iBAAmB,yBAA0BE,gBAAkB,8BAGhD,IAA9BD,SAASK,uBAAsD,IAAXP,OAEvD,KAEDhB,MAAKwB,qBAAqBN,SAAUD,kBAAkB,WAC5DR,YAAW,WACV,OAAQS,SAASC,kBAChB,IAAK,UACJL,WAAaA,YACb,MACD,IAAK,SACJC,UAAYA,WAGd,GAAE,EACH,IAAE,IArCK,KAER,IAAIC,OAAgBG,gBAAyBF,gBAoC9C,EAIQhB,KAAiBwB,kBAAG,MAGpBxB,KAAAyB,yBAA2B,CAAEhB,OAAQiB,UAkCtC1B,KAAA2B,mBAAqB,WAAA,OAAAvB,UAAAL,WAAA,OAAA,GAAA,wHAC3B,IAAKC,KAAK4B,wBACT,MAAO,CAAA,GAGFC,aAAe7B,KAAKY,sBAAqB,WAAQb,MAAK0B,yBAAyBhB,QAAS,IAE1FqB,QAAS,oBAGZ,OADMC,SAA+D,IAApD/B,KAAK4B,wBAAwBI,qBACxC,CAAA,EAAAhC,KAAKC,qBAAqB8B,SAAU/B,KAAKyB,kCAEhB,OAF/BQ,GAAAC,OAEAC,GAAAnC,KAA+B,CAAA,EAAMA,KAAKoC,qBAC1C,GADAD,GAAKP,wBAA0BK,GAAAC,QAC1BlC,KAAK4B,wBAET,OADAE,QAAS,EACH,CAAA,EAAA,qBAGD,IAAC9B,KAAK4B,wBAAwBS,cAAa,MAAA,CAAA,EAAA,qBAGlD,OADAR,oBAAAA,aAAcS,UACd,CAAA,EAAOR,gBApDP9B,KAAKF,eAAiBA,cACtB,CAkHF,OAvLSD,oBAAoB0C,UAAAhB,qBAA5B,SAAgCiB,QAAcC,KAAcC,SAA0BC,YACrF,IAAMC,WAAa,CAClBN,QAAS,WACJM,WAAWC,UACdL,QAAQM,oBAAoBF,WAAWH,KAAMG,WAAWC,QAASF,mBACzDC,WAAmBC,QAE5B,EACDA,QAAS,SAACE,IACT,OAAOL,SAASK,GAChB,EACDN,KAAIA,MAKL,OAFAD,QAAQlB,iBAAiBsB,WAAWH,KAAMG,WAAWC,QAASF,YAEvDC,YAuDK/C,oBAAA0C,UAAAS,0BAAb,0IAGK,QADEC,UAAYC,UAAUlD,KAAKwB,qBACdxB,KAAK4B,yBAA2BqB,WAAajD,KAAK4B,wBAAwBuB,GAAG,CAAA,EAAA,GAC/F,CAAA,EAAMnD,KAAKoD,8BAA8BH,mBAAzChB,GAAAC,yBAOG,OAJAlC,KAAK4B,yBAA2B5B,KAAK4B,wBAAwByB,aAAe,MAC/ErD,KAAKsD,4BAGDtD,KAAK4B,wBAAuB,CAAA,EAAA,IAChCO,GAAAnC,KAAqC,CAAA,EAAAA,KAAKF,eAAekD,0BAA0BrD,KAAA4D,UAAUC,aAAcN,UAAU,SAAUvD,KAAA8D,QAAQC,wBAAvIvB,GAAKP,wBAA0BK,GAAAC,OAG3BlC,KAAK4B,yBACR5B,KAAK2D,iBAAiB3D,KAAK4B,wBAAwBuB,GAAInD,KAAK4B,wBAAwByB,gDAEtF,EAEMxD,oBAAA0C,UAAAqB,WAAP,WACC,IAAK5D,KAAK4B,wBACT,OAAO,KAER,IAAMiC,IAAM7D,KAAK4B,wBAAwBkC,UACzC,OAAOC,OAAOC,KAAKH,IAAK,WA2BZhE,oBAAA0C,UAAAH,WAAb,gHACC,MAAA,CAAA,EAAO,IAAI/B,SAAQ,SAACC,QAAS2D,QAC5B,IAAKlE,MAAK6B,wBACT,OAAO,KAER7B,MAAKD,eAAeoE,uBAAuBvE,KAAA4D,UAAUC,aAAcN,UAAU,SAAUvD,KAAA8D,QAAQC,cAAe3D,MAAK6B,wBAAwBuB,IACzIgB,KAAK7D,QAAS2D,OAChB,UACD,EAEYpE,oBAAA0C,UAAA6B,kBAAb,yHACC,OAAKpE,KAAK4B,wBAGG,CAAA,EAAA5B,KAAKF,eAAeuE,6BAA6B1E,KAAA4D,UAAUC,aAAcN,UAAU,SAAUvD,KAAA8D,QAAQC,cAAe1D,KAAK4B,wBAAwBuB,KAF7J,CAAA,EAAO,IAER,KAAA,EAAA,MAAA,CAAA,EAAOhB,iBACP,EAEYtC,oBAAA0C,UAAAe,0BAAb,yHACQ,KAAA,EAAA,MAAA,CAAA,EAAMtD,KAAKoD,+BAA4D,QAA9BjB,GAAAnC,KAAK4B,+BAAyB,IAAAO,QAAA,EAAAA,GAAAgB,KAAM,KAApF,KAAA,EAAA,MAAA,CAAA,EAAOlB,iBACP,EAEapC,oBAA6B0C,UAAAa,8BAA3C,SAA4CkB,6HAC3C,OAAKA,IAGLtE,KAAK4B,wBAA0B,KAG/B5B,KAAKyB,yBAAyBhB,SAET,CAAA,EAAAT,KAAKF,eAAewD,0BAA0B3D,KAAA4D,UAAUC,aAAcN,UAAU,SAAUvD,KAAA8D,QAAQC,cAAeY,MAPrI,CAAA,GAAO,UAYR,OALMxC,OAASK,GAA0HD,OAGzIlC,KAAKuE,qBAEL,CAAA,EAAOzC,cACP,EAOOjC,oBAAA0C,UAAAoB,iBAAR,SAAyBW,GAAYE,kBACpC,IAAMC,oBAAsBvB,UAAUlD,KAAKwB,mBACvCiD,qBACHzE,KAAKoD,8BAA8BqB,qBAGpC,IAAMC,cAAiBF,iBAAmB,GAAK,GAAK,GAAM,EAC1D9E,QAAQiF,MAAMC,YAAY5E,KAAKwB,kBAAmB8C,GAAII,gBAE/C7E,oBAAA0C,UAAAgC,mBAAR,WAC6BrB,UAAUlD,KAAKwB,oBAI3C9B,QAAQiF,MAAMC,YAAY5E,KAAKwB,kBAAmB,IAAK,IAGxD3B,mBAAA,CA/MD,GAAaD,WAAAC,uCAgNb,CAjND,CAAUH,UAAAA,QAiNT,CAAA"}