@nyris/nyris-webapp 0.3.5 → 0.3.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +18 -32
- package/build/index.html +1 -1
- package/build/{precache-manifest.bbb31f2ce7710d7eb3175b1b48241d24.js → precache-manifest.1b00dd5c15aa0815244681503d6fa9da.js} +13 -89
- package/build/service-worker.js +1 -1
- package/build/static/css/2.43a1c8b7.chunk.css +2 -0
- package/build/static/css/2.43a1c8b7.chunk.css.map +1 -0
- package/build/static/css/main.0c9239ba.chunk.css +2 -0
- package/build/static/css/main.0c9239ba.chunk.css.map +1 -0
- package/build/static/js/2.520bb6d6.chunk.js +3 -0
- package/build/static/js/2.520bb6d6.chunk.js.LICENSE.txt +79 -0
- package/build/static/js/2.520bb6d6.chunk.js.map +1 -0
- package/build/static/js/main.ef6a9744.chunk.js +2 -0
- package/build/static/js/main.ef6a9744.chunk.js.map +1 -0
- package/build/static/js/{runtime-main.b418ff16.js → runtime-main.f5553a9b.js} +1 -1
- package/build/static/js/{runtime-main.b418ff16.js.map → runtime-main.f5553a9b.js.map} +1 -1
- package/package.json +7 -30
- package/src/App.css +64 -20
- package/src/App.test.tsx +49 -0
- package/src/App.tsx +386 -15
- package/src/AppMD.tsx +320 -0
- package/src/actions/nyrisAppActions.ts +80 -0
- package/src/actions/searchActions.ts +323 -0
- package/src/components/CategoryFilter.tsx +16 -13
- package/src/components/Codes.tsx +20 -16
- package/src/components/ExampleImages.tsx +10 -15
- package/src/components/Feedback.tsx +12 -21
- package/src/components/FiltersList.tsx +122 -0
- package/src/components/Header.tsx +26 -29
- package/src/components/PredictedCategories.tsx +15 -12
- package/src/components/SelectedFiltersSummary.tsx +85 -0
- package/src/components/Sidebar.tsx +52 -0
- package/src/defaults.ts +3 -4
- package/src/epics/feedback.ts +59 -0
- package/src/epics/index.ts +223 -0
- package/src/epics/search.ts +239 -0
- package/src/epics/types.ts +12 -0
- package/src/{common/assets/fonts → fonts}/roboto-bold-webfont.woff +0 -0
- package/src/{common/assets/fonts → fonts}/roboto-bold-webfont.woff2 +0 -0
- package/src/{common/assets/fonts → fonts}/roboto-italic-webfont.woff +0 -0
- package/src/{common/assets/fonts → fonts}/roboto-italic-webfont.woff2 +0 -0
- package/src/{common/assets/fonts → fonts}/roboto-regular-webfont.woff +0 -0
- package/src/{common/assets/fonts → fonts}/roboto-regular-webfont.woff2 +0 -0
- package/src/{common/assets/fonts → fonts}/robotocondensed-bold-webfont.woff +0 -0
- package/src/{common/assets/fonts → fonts}/robotocondensed-bold-webfont.woff2 +0 -0
- package/src/{common/assets/fonts → fonts}/robotocondensed-bolditalic-webfont.woff +0 -0
- package/src/{common/assets/fonts → fonts}/robotocondensed-bolditalic-webfont.woff2 +0 -0
- package/src/{common/assets/images → images}/fav/android-icon-192x192.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-114x114.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-120x120.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-144x144.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-152x152.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-180x180.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-57x57.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-60x60.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-72x72.png +0 -0
- package/src/{common/assets/images → images}/fav/apple-icon-76x76.png +0 -0
- package/src/{common/assets/images → images}/fav/browserconfig.xml +0 -0
- package/src/{common/assets/images → images}/fav/favicon-16x16.png +0 -0
- package/src/{common/assets/images → images}/fav/favicon-32x32.png +0 -0
- package/src/{common/assets/images → images}/fav/favicon-96x96.png +0 -0
- package/src/{common/assets/images → images}/fav/manifest.json +0 -0
- package/src/{common/assets/images → images}/ic_cam.png +0 -0
- package/src/{common/assets/images → images}/ic_cam.svg +0 -0
- package/src/{common/assets/images → images}/ic_cam_large.png +0 -0
- package/src/{common/assets/images → images}/ic_cam_large.svg +0 -0
- package/src/{common/assets/images → images}/ic_cam_large_noimage.png +0 -0
- package/src/{common/assets/images → images}/ic_close_feedback.png +0 -0
- package/src/{common/assets/images → images}/ic_close_feedback.svg +0 -0
- package/src/{common/assets/images → images}/ic_shopNow.png +0 -0
- package/src/{common/assets/images → images}/ic_shopNow.svg +0 -0
- package/src/{common/assets/images → images}/ic_shopNowLight.png +0 -0
- package/src/{common/assets/images → images}/ic_shopNowLight.svg +0 -0
- package/src/{common/assets/images → images}/nyris_logo.png +0 -0
- package/src/{common/assets/images → images}/rewe.svg +0 -0
- package/src/{common/assets/images → images}/sectionTransBack.png +0 -0
- package/src/{common/assets/images → images}/sectionTransBack.svg +0 -0
- package/src/{common/assets/images → images}/sectionTransTop.png +0 -0
- package/src/{common/assets/images → images}/sectionTransTop.svg +0 -0
- package/src/index.css +502 -570
- package/src/index.tsx +170 -16
- package/src/types.ts +7 -51
- package/src/utils.ts +5 -0
- package/tsconfig.json +8 -3
- package/build/js/settings.example.js +0 -31
- package/build/js/test.js +0 -56
- package/build/static/css/2.8285176a.chunk.css +0 -2
- package/build/static/css/2.8285176a.chunk.css.map +0 -1
- package/build/static/css/main.6676fe1f.chunk.css +0 -2
- package/build/static/css/main.6676fe1f.chunk.css.map +0 -1
- package/build/static/js/2.4a55bc61.chunk.js +0 -3
- package/build/static/js/2.4a55bc61.chunk.js.LICENSE.txt +0 -124
- package/build/static/js/2.4a55bc61.chunk.js.map +0 -1
- package/build/static/js/main.2660f94a.chunk.js +0 -2
- package/build/static/js/main.2660f94a.chunk.js.map +0 -1
- package/build/static/media/Fill.37094b44.svg +0 -3
- package/build/static/media/Montserrat-Bold.5a052e98.otf +0 -0
- package/build/static/media/Montserrat-Light.21789e89.otf +0 -0
- package/build/static/media/Montserrat-Medium.a53e0373.otf +0 -0
- package/build/static/media/Montserrat-Regular.71cdc681.otf +0 -0
- package/build/static/media/Montserrat-SemiBold.f613d915.otf +0 -0
- package/build/static/media/Rectangle.4dd8b747.png +0 -0
- package/build/static/media/admin.9529c7f6.svg +0 -3
- package/build/static/media/bg-support-page.6ac55268.svg +0 -9
- package/build/static/media/book_mark.8e294c0b.svg +0 -3
- package/build/static/media/icon_dislike.94607ca6.svg +0 -3
- package/build/static/media/icon_like.a4fb1b18.svg +0 -3
- package/build/static/media/icon_modal_image.3068d0ea.svg +0 -21
- package/build/static/media/icon_search_image.c2c728c0.svg +0 -3
- package/build/static/media/nyris_logo.22d8f250.svg +0 -3
- package/build/static/media/reload_icon.4b579a74.svg +0 -3
- package/build/static/media/save_search.bebaeebf.svg +0 -3
- package/build/static/media/support.289c3a3c.svg +0 -3
- package/build/static/media/translate_icon.f0492297.svg +0 -3
- package/public/js/settings.example.js +0 -31
- package/public/js/test.js +0 -56
- package/src/Router.tsx +0 -97
- package/src/Store/Auth.ts +0 -44
- package/src/Store/Nyris.ts +0 -77
- package/src/Store/Search.ts +0 -243
- package/src/Store/Store.ts +0 -53
- package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Bold.otf +0 -0
- package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Light.otf +0 -0
- package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Medium.otf +0 -0
- package/src/common/assets/fonts/Montserrat_OTF/Montserrat-Regular.otf +0 -0
- package/src/common/assets/fonts/Montserrat_OTF/Montserrat-SemiBold.otf +0 -0
- package/src/common/assets/icons/Fill.png +0 -0
- package/src/common/assets/icons/Fill.svg +0 -3
- package/src/common/assets/icons/Icon_wechat.png +0 -0
- package/src/common/assets/icons/Icon_whatsapp.png +0 -0
- package/src/common/assets/icons/admin.png +0 -0
- package/src/common/assets/icons/admin.svg +0 -3
- package/src/common/assets/icons/book_mark.png +0 -0
- package/src/common/assets/icons/book_mark.svg +0 -3
- package/src/common/assets/icons/icon_barcode.png +0 -0
- package/src/common/assets/icons/icon_camera.png +0 -0
- package/src/common/assets/icons/icon_dislike.svg +0 -3
- package/src/common/assets/icons/icon_disslike.png +0 -0
- package/src/common/assets/icons/icon_email.png +0 -0
- package/src/common/assets/icons/icon_like.png +0 -0
- package/src/common/assets/icons/icon_like.svg +0 -3
- package/src/common/assets/icons/icon_modal_image.png +0 -0
- package/src/common/assets/icons/icon_modal_image.svg +0 -21
- package/src/common/assets/icons/icon_picture.png +0 -0
- package/src/common/assets/icons/icon_search_image.png +0 -0
- package/src/common/assets/icons/icon_search_image.svg +0 -3
- package/src/common/assets/icons/nyris_logo.svg +0 -3
- package/src/common/assets/icons/reload_icon.png +0 -0
- package/src/common/assets/icons/reload_icon.svg +0 -3
- package/src/common/assets/icons/save_search.png +0 -0
- package/src/common/assets/icons/save_search.svg +0 -3
- package/src/common/assets/icons/setting_search_icon.png +0 -0
- package/src/common/assets/icons/support.png +0 -0
- package/src/common/assets/icons/support.svg +0 -3
- package/src/common/assets/icons/translate_icon.png +0 -0
- package/src/common/assets/icons/translate_icon.svg +0 -3
- package/src/common/assets/icons/view_off.png +0 -0
- package/src/common/assets/images/Rectangle.png +0 -0
- package/src/common/assets/images/bg-support-page.svg +0 -9
- package/src/common/assets/images/image_test.png +0 -0
- package/src/components/CustomHits/index.tsx +0 -57
- package/src/components/DetailItem.tsx +0 -175
- package/src/components/DragDropFile.tsx +0 -192
- package/src/components/FilterComponent.tsx +0 -33
- package/src/components/Footer.tsx +0 -29
- package/src/components/FooterMD.tsx +0 -54
- package/src/components/FooterNewVersion.tsx +0 -12
- package/src/components/FooterResult.tsx +0 -47
- package/src/components/HeaderMd.tsx +0 -38
- package/src/components/HeaderNewVersion.tsx +0 -92
- package/src/components/Layout.tsx +0 -46
- package/src/components/LoadingScreen/index.tsx +0 -29
- package/src/components/Navigation.tsx +0 -34
- package/src/components/Panigation/Pagination.tsx +0 -140
- package/src/components/Panigation/cx.js +0 -3
- package/src/components/Panigation/isModifierClick.js +0 -10
- package/src/components/Saved/AllItem.tsx +0 -32
- package/src/components/Saved/Category.tsx +0 -16
- package/src/components/carousel/DefaultCarousel.tsx +0 -48
- package/src/components/common.d.ts +0 -9
- package/src/components/common.scss +0 -54
- package/src/components/default-select.tsx +0 -44
- package/src/components/hitItem/hits.tsx +0 -50
- package/src/components/hitItem/infinitiHits.tsx +0 -33
- package/src/components/input/inputSearch.tsx +0 -77
- package/src/components/modal/DefaultModal.tsx +0 -28
- package/src/components/results/ItemResult.tsx +0 -155
- package/src/components/search/ListSearch.tsx +0 -209
- package/src/modules/LandingPage/App.tsx +0 -318
- package/src/modules/LandingPage/AppMD.tsx +0 -399
- package/src/modules/LandingPage/common.scss +0 -1304
- package/src/modules/LandingPage/index.tsx +0 -169
- package/src/modules/LandingPage/indexNewVersion.tsx +0 -110
- package/src/modules/LandingPage/propsType.ts +0 -43
- package/src/page/Auth/login.tsx +0 -7
- package/src/page/Exception/404.tsx +0 -11
- package/src/page/History/index.tsx +0 -76
- package/src/page/Profile/index.tsx +0 -87
- package/src/page/Saved/MockData.ts +0 -223
- package/src/page/Saved/index.tsx +0 -166
- package/src/page/Support/index.tsx +0 -160
- package/src/page/result/MockData.ts +0 -36
- package/src/page/result/index.tsx +0 -418
- package/src/services/Feedback.ts +0 -64
- package/src/services/image.ts +0 -40
- package/src/services/session.ts +0 -17
- package/src/services/types.ts +0 -50
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(this["webpackJsonp@nyris/nyris-webapp"]=this["webpackJsonp@nyris/nyris-webapp"]||[]).push([[0],{303:function(e,t,a){"use strict";var n=this&&this.__awaiter||function(e,t,a,n){return new(a||(a=Promise))((function(r,i){function c(e){try{o(n.next(e))}catch(t){i(t)}}function s(e){try{o(n.throw(e))}catch(t){i(t)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(c,s)}o((n=n.apply(e,t||[])).next())}))},r=this&&this.__generator||function(e,t){var a,n,r,i,c={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"===typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(a)throw new TypeError("Generator is already executing.");for(;c;)try{if(a=1,n&&(r=2&i[0]?n.return:i[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,i[1])).done)return r;switch(n=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,n=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!(r=(r=c.trys).length>0&&r[r.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]<r[3])){c.label=i[1];break}if(6===i[0]&&c.label<r[1]){c.label=r[1],r=i;break}if(r&&c.label<r[2]){c.label=r[2],c.ops.push(i);break}r[2]&&c.ops.pop(),c.trys.pop();continue}i=t.call(e,c)}catch(s){i=[6,s],n=0}finally{a=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var c=i(a(611));function s(e,t){return{x1:e.x1*t.w,x2:e.x2*t.w,y1:e.y1*t.h,y2:e.y2*t.h}}function o(e){return{w:e.x2-e.x1,h:e.y2-e.y1}}function l(e){var t=e,a=e;return{w:t.naturalWidth||a.videoWidth||e.width,h:t.naturalHeight||a.videoHeight||e.height}}t.selectFirstCenteredRegion=function(e,t,a){var n=e.filter((function(e){return function(e,t){var a=e[0],n=e[1],r=t[0],i=t[1];return Math.sqrt(Math.pow(a-r,2)+Math.pow(n-i,2))}([.5,.5],function(e){var t=e.x1,a=e.x2,n=e.y1;return[(a-t)/2+t,(e.y2-n)/2+n]}(e.normalizedRect))<t}));return 0===n.length?a:n[0].normalizedRect},t.getUrlParam=function(e){var t=new RegExp("[?&]"+e+"(=([^&#]*))?(&|$|#)","i").exec(window.location.href);return t&&t[2]?(console.log("has value",e,t[2]),decodeURIComponent(t[2])):!!t||void 0},t.getThumbSizeArea=function(e,t,a){var n=e*t,r=Math.sqrt(n*a);return{w:r,h:r/a}},t.getThumbSizeLongestEdge=function(e,t,a,n){return e/t>a/n?{w:a*t/n,h:t}:{w:e,h:n*e/a}},t.scaleRect=s,t.getRectSize=o,t.getRectAspectRatio=function(e,t){var a=o(s(e,t));return a.w/a.h},t.getElementSize=l,t.elementToCanvas=function(e,t,a){var n=l(e),r=n.w,i=n.h,c=a||{x1:0,x2:1,y1:0,y2:1},s=c.x1,o=c.x2,u=c.y1,p=r*s,m=r*(o-s),d=i*u,f=i*(c.y2-u),h=t&&t.w||r,g=t&&t.h||i,E=document.createElement("canvas");E.width=h,E.height=g;var b=E.getContext("2d");if(!b)throw Error("Error converting element to canvas: Can not get 2d context");return b.fillStyle="rgb(255, 255,255)",b.fillRect(0,0,h,g),b.drawImage(e,p,d,m,f,0,0,h,g),E},t.urlOrBlobToCanvas=function(e){return new Promise((function(t,a){c.default(e,(function(e){e?t(e):a()}),{canvas:!0,orientation:!0,crossOrigin:"anonymous"})}))},t.canvasToJpgBlob=function(e,t){return new Promise((function(a,n){e.toBlob((function(e){e?a(e):n()}),"image/jpeg",t)}))},t.cadExtensions=[".stp",".step",".stl",".obj",".glb",".gltf"],t.isCadFile=function(e){return t.cadExtensions.some((function(t){return e.name.endsWith(t)}))},t.isImageFile=function(e){return e.type.startsWith("image/")},t.timePromise=function(e){return n(this,void 0,void 0,(function(){var t,a,n;return r(this,(function(r){switch(r.label){case 0:return t=Date.now(),[4,e];case 1:return a=r.sent(),n=Date.now(),[2,{res:a,durationSeconds:(n-t)/1e3}]}}))}))}},339:function(e,t,a){e.exports=a(638)},45:function(e,t,a){"use strict";var n=this&&this.__assign||function(){return(n=Object.assign||function(e){for(var t,a=1,n=arguments.length;a<n;a++)for(var r in t=arguments[a])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)},r=this&&this.__awaiter||function(e,t,a,n){return new(a||(a=Promise))((function(r,i){function c(e){try{o(n.next(e))}catch(t){i(t)}}function s(e){try{o(n.throw(e))}catch(t){i(t)}}function o(e){var t;e.done?r(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(c,s)}o((n=n.apply(e,t||[])).next())}))},i=this&&this.__generator||function(e,t){var a,n,r,i,c={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"===typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(a)throw new TypeError("Generator is already executing.");for(;c;)try{if(a=1,n&&(r=2&i[0]?n.return:i[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,i[1])).done)return r;switch(n=0,r&&(i=[2&i[0],r.value]),i[0]){case 0:case 1:r=i;break;case 4:return c.label++,{value:i[1],done:!1};case 5:c.label++,n=i[1],i=[0];continue;case 7:i=c.ops.pop(),c.trys.pop();continue;default:if(!(r=(r=c.trys).length>0&&r[r.length-1])&&(6===i[0]||2===i[0])){c=0;continue}if(3===i[0]&&(!r||i[1]>r[0]&&i[1]<r[3])){c.label=i[1];break}if(6===i[0]&&c.label<r[1]){c.label=r[1],r=i;break}if(r&&c.label<r[2]){c.label=r[2],c.ops.push(i);break}r[2]&&c.ops.pop(),c.trys.pop();continue}i=t.call(e,c)}catch(s){i=[6,s],n=0}finally{a=r=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}};var c=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),a(610);var s=a(303),o=c(a(616));!function(e){for(var a in e)t.hasOwnProperty(a)||(t[a]=e[a])}(a(303));var l=function(){function e(e){if(this.httpClient=o.default.create(),!e.apiKey)throw new Error("The api-key is not set.");this.apiKey=e.apiKey;var t=e.baseUrl||"https://api.nyris.io";this.imageMatchingUrl=t+"/find/v1",this.imageMatchingUrlWithFilters=t+"/find/v2",this.cadMatchingUrl=t+"/cad/find/v0.1",this.imageMatchingUrlBySku=t+"/recommend/v1/",this.imageMatchingSubmitManualUrl=t+"/find/v1/manual/",this.feedbackUrl=t+"/feedback/v1/",this.regionProposalUrl=t+"/find/v1/regions/",this.findFilters=t+"/find/v1/filters",this.responseFormat=e.responseFormat||"application/offers.complete+json",this.maxHeight=e.maxHeight||500,this.maxWidth=e.maxWidth||500,this.jpegQuality=e.jpegQuality||.92,this.customSearchRequest=e.customSearchRequest,this.responseHook=e.responseHook,this.xOptions=e.xOptions}return e.prototype.prepareImage=function(e,t){return r(this,void 0,void 0,(function(){var a,n,r,c,o;return i(this,(function(i){switch(i.label){case 0:return a=t||{x1:0,x2:1,y1:0,y2:1},n=s.getElementSize(e),r=s.getRectAspectRatio(a,n),c=s.getThumbSizeArea(this.maxWidth,this.maxHeight,r),o=s.elementToCanvas(e,c,a),[4,s.canvasToJpgBlob(o,this.jpegQuality)];case 1:return[2,i.sent()]}}))}))},e.prototype.getSearchRequestHeaders=function(e){var t={"X-Api-Key":this.apiKey,"Accept-Language":"de,*;q=0.5",Accept:this.responseFormat,"Content-Type":e||"application/octet-stream"},a=[];return this.xOptions&&a.push(this.xOptions),a.length>0&&(t["X-Options"]=a.join(" ")),t},e.prototype.getRegionRequestHeaders=function(e){var t={"X-Api-Key":this.apiKey,"Content-Type":e||"application/octet-stream"},a=[];return this.xOptions&&a.push(this.xOptions),a.length>0&&(t["X-Options"]=a.join(" ")),t},e.prototype.getParams=function(e){return e.geoLocation?{lat:e.geoLocation.lat.toString(),lon:e.geoLocation.lon.toString(),dist:e.geoLocation.dist.toString()}:{}},e.prototype.parseCategoryPredictions=function(e){return Object.entries(e||{}).map((function(e){return{name:e[0],score:e[1]}})).sort((function(e,t){return t.score-e.score}))},e.prototype.parseSearchResult=function(e,t){var a=this.parseCategoryPredictions(e.data.predicted_category),r=e.data.barcodes||[],i=this.responseHook?this.responseHook(e.data):e.data,c="offerInfos"in i?i.offerInfos.map((function(e,t){return console.log(e),n(n({},e),{position:t})})):i.results.map((function(e,t){return console.log(e),{position:t,sku:e.sku,title:e.title,img:e.images&&e.images[0]?{url:e.images[0]}:void 0,l:e.links?e.links.main:void 0,p:e.price?{vi:100*parseFloat(e.price),c:e.price.split(" ")[1]}:void 0}}));return console.log(c),{results:c,requestId:e.headers["x-matching-request"],duration:"durationSeconds"in e.data?e.data.durationSeconds:t,categoryPredictions:a,codes:r}},e.prototype.findByCad=function(e,t){return r(this,void 0,void 0,(function(){var a,n,r,c,o,l;return i(this,(function(i){switch(i.label){case 0:return a=e.type,n=this.getSearchRequestHeaders(a),r=this.getParams(t),[4,s.timePromise(this.httpClient.request({method:"POST",url:this.cadMatchingUrl,data:e,params:r,headers:n,responseType:"json"}))];case 1:return c=i.sent(),o=c.res,l=c.durationSeconds,[2,this.parseSearchResult(o,l)]}}))}))},e.prototype.findByImage=function(e,t){return r(this,void 0,void 0,(function(){var a,n,r,c,o,l,u;return i(this,(function(i){switch(i.label){case 0:return[4,this.prepareImage(e,t.cropRect)];case 1:return a=i.sent(),this.customSearchRequest?[2,this.customSearchRequest(a,this.httpClient)]:(n=this.getSearchRequestHeaders("image/jpeg"),r=this.getParams(t),(c=new FormData).append("image",a),[4,s.timePromise(this.httpClient.request({method:"POST",url:this.imageMatchingUrlWithFilters,data:c,params:r,headers:n,responseType:"json"}))]);case 2:return o=i.sent(),l=o.res,u=o.durationSeconds,[2,this.parseSearchResult(l,u)]}}))}))},e.prototype.findByImageWithFilters=function(e,t,a){return r(this,void 0,void 0,(function(){var n,r,c,o,l,u,p,m,d,f;return i(this,(function(i){switch(i.label){case 0:return[4,this.prepareImage(e,t.cropRect)];case 1:if(n=i.sent(),this.customSearchRequest)return[2,this.customSearchRequest(n,this.httpClient)];if(r=this.getSearchRequestHeaders("image/jpeg"),c=this.getParams(t),o=new Array,a&&a.forEach((function(e){o.push({key:e.key,values:e.values})})),console.log(o),(l=new FormData).append("image",n),a)for(u=0;u<o.length;u++)for(l.append("filters["+u+"].filterType",o[u].key),p=0;p<o[u].values.length;p++)l.append("filters["+u+"].filterValues["+p+"]",o[u].values[p]);return[4,s.timePromise(this.httpClient.request({method:"POST",url:this.imageMatchingUrlWithFilters,data:l,params:c,headers:r,responseType:"json"}))];case 2:return m=i.sent(),d=m.res,f=m.durationSeconds,[2,this.parseSearchResult(d,f)]}}))}))},e.prototype.findBySku=function(e,t){return r(this,void 0,void 0,(function(){var a,n,r;return i(this,(function(i){switch(i.label){case 0:return a=this.getSearchRequestHeaders(),n=""+this.imageMatchingUrlBySku+encodeURIComponent(e)+"/"+encodeURIComponent(t),[4,this.httpClient.get(n,{headers:a,responseType:"json"})];case 1:return r=i.sent(),this.responseHook&&(r=this.responseHook),[2,r]}}))}))},e.prototype.findRegions=function(e){return r(this,void 0,void 0,(function(){var t,a,n,r,c,o,l,u;return i(this,(function(i){switch(i.label){case 0:return t=s.getElementSize(e),a=t.w,n=t.h,r=s.getThumbSizeArea(this.maxWidth,this.maxHeight,a/n),c=s.elementToCanvas(e,r),[4,s.canvasToJpgBlob(c,this.jpegQuality)];case 1:return o=i.sent(),l=this.getRegionRequestHeaders("image/jpeg"),[4,this.httpClient.request({method:"POST",url:this.regionProposalUrl,data:o,headers:l})];case 2:return u=i.sent(),[2,u.data.map((function(e){return{className:e.className,confidence:e.confidence,normalizedRect:{x1:e.region.left/r.w,x2:e.region.right/r.w,y1:e.region.top/r.h,y2:e.region.bottom/r.h}}}))]}}))}))},e.prototype.sendFeedback=function(e,t,a){return r(this,void 0,void 0,(function(){var r,c;return i(this,(function(i){switch(i.label){case 0:return r={"X-Api-Key":this.apiKey,"Content-Type":"application/json"},c=n({request_id:t,timestamp:new Date,session_id:e},a),[4,this.httpClient.request({method:"POST",url:this.feedbackUrl,headers:r,data:c})];case 1:return i.sent(),[2]}}))}))},e.prototype.getFilters=function(){return r(this,void 0,void 0,(function(){var e,t;return i(this,(function(a){switch(a.label){case 0:return e=this.getSearchRequestHeaders(),t=""+this.findFilters,[4,this.httpClient.get(t,{headers:e,responseType:"json"})];case 1:return[2,a.sent().data]}}))}))},e.prototype.searchFilters=function(e,t){return r(this,void 0,void 0,(function(){var a,n;return i(this,(function(r){switch(r.label){case 0:return a=this.getSearchRequestHeaders(),n=this.findFilters+"/"+e+"/"+t,[4,this.httpClient.get(n,{headers:a,responseType:"json"})];case 1:return[2,r.sent().data]}}))}))},e}();t.default=l},535:function(e,t,a){},638:function(e,t,a){"use strict";a.r(t);var n=a(7),r=(a(340),a(349),a(1)),i=a.n(r),c=a(50),s=a.n(c),o=(a(535),a(171)),l=a(662),u=a(640),p=a(664),m=a(665),d=a(666),f=a(667),h=a(668),g=a(690),E=a(670),b=a(672),y=a(673),v=a(674),O=a(675),k=a(676),S=a(677),C=a(679),w=a(669),j=a(671),x=a(680),R=a(678),I=a(89),_=a(78),T=a.n(_),A=a(98),F=a(45),N=a.n(F),D=Object(l.a)((function(e){return{icon:{marginRight:e.spacing(2)},heroContent:{backgroundColor:e.palette.background.paper,padding:e.spacing(8,0,6),transition:"all 300ms",overflow:"hidden",height:500},heroContentClosed:{height:0,padding:0},heroButtons:{marginTop:e.spacing(4)},cardGrid:{paddingTop:e.spacing(8),paddingBottom:e.spacing(8),minHeight:600,overflow:"hidden",transition:"all 300ms"},cardGridCollapsed:{height:0,opacity:0,minHeight:0,paddingTop:0,paddingBottom:0},card:{height:"100%",display:"flex",flexDirection:"column"},cardMedia:{paddingTop:"56.25%",backgroundSize:"contain"},cardContent:{flexGrow:1,paddingBottom:0},footer:{backgroundColor:e.palette.background.paper,padding:e.spacing(6)},withElipsis:{textOverflow:"ellipsis",overflow:"hidden",whiteSpace:"nowrap"},loading:{margin:e.spacing(2)},fabContainer:{position:"fixed",bottom:e.spacing(2)},fab:{marginLeft:e.spacing(2)}}})),L=function(e){return function(t){var a=t.dataTransfer&&t.dataTransfer.files[0]||t.target.files[0];t.target&&t.target.value&&(t.target.value=""),a&&e(a)}};function U(){return r.createElement(u.a,{variant:"body2",color:"textSecondary",align:"center"},"Powered by ",r.createElement(p.a,{color:"inherit",href:"https://nyris.io/",component:"a",target:"_blank"},"nyris.io"))}var H=function(e){var t=e.settings,a=e.handlers,n=e.showPart,i=e.previewImage,c=e.loading,s=e.search,l=s.results,p=s.regions,_=s.previewSelection,N=s.requestId,H=(s.duration,e.mdSettings),P=D(),M=Object(o.a)({onDrop:function(e){return a.onFileDropped(e[0])}}),W=M.getRootProps,q=M.getInputProps,B=M.isDragActive,G=Math.floor(.45*window.innerHeight),Q=Math.max(400,G),K=["image/*"].concat(t.cadSearch?F.cadExtensions:[]).join(",");return r.createElement(r.Fragment,null,H.resultLinkIcon&&r.createElement("link",{rel:"stylesheet",href:"https://fonts.googleapis.com/icon?family=Material+Icons"}),r.createElement(m.a,null),"camera"===n&&r.createElement(A.Capture,{onCaptureComplete:a.onCaptureComplete,onCaptureCanceled:a.onCaptureCanceled,useAppText:"Use default camera app"}),r.createElement(d.a,{position:"relative",style:{backgroundColor:H.appBarCustomBackgroundColor}},r.createElement(f.a,{maxWidth:"md",style:{flexDirection:"row",display:"flex"}},r.createElement("img",{src:H.appBarLogoUrl,style:{height:"2em",minHeight:"64px",display:"flex"},alt:"Logo"}),r.createElement(h.a,{component:"span"},r.createElement(u.a,{style:{color:H.appBarCustomTextColor}},H.appBarTitle)))),r.createElement("main",null,r.createElement("div",{className:T()(P.heroContent,"results"===n?P.heroContentClosed:null)},r.createElement(f.a,{maxWidth:"md"},r.createElement("div",null,r.createElement(g.a,{mdUp:!0},r.createElement("div",{style:{textAlign:"center"}},r.createElement(w.a,{style:{fontSize:"20em",color:"#cccccc"}})),r.createElement("div",{style:{textAlign:"center"}},r.createElement(E.a,{variant:"contained",color:"primary",onClick:a.onCameraClick},"Take a picture")),r.createElement("div",{style:{textAlign:"center"}},r.createElement(u.a,null,"or")),r.createElement("div",{style:{textAlign:"center"}},r.createElement("input",{accept:K,id:"raised-button-file",type:"file",onChange:L(a.onSelectFile),style:{width:".1px",height:".1px",overflow:"hidden",opacity:0}}),r.createElement("label",{htmlFor:"raised-button-file"},r.createElement(E.a,{variant:"contained",color:"primary",component:"span"},"Select a file")))),r.createElement(g.a,{smDown:!0},r.createElement("div",Object.assign({style:{borderStyle:"dashed",borderWidth:5,borderColor:B?"#ccc":"#eee",borderRadius:10,padding:10,paddingBottom:30}},W({onClick:function(e){e.stopPropagation()}})),r.createElement("div",{style:{textAlign:"center"}},r.createElement(j.a,{style:{fontSize:"20em",color:"#cccccc"}})),r.createElement("div",{style:{textAlign:"center"}},r.createElement(u.a,{variant:"body2"},"DROP AN IMAGE")),r.createElement("div",{style:{textAlign:"center"}},r.createElement(u.a,{variant:"subtitle2"},"or")),r.createElement("div",{style:{textAlign:"center"}},r.createElement("input",Object.assign({accept:K,id:"raised-button-file",type:"file"},q(),{onChange:L(a.onSelectFile),style:{width:".1px",height:".1px",overflow:"hidden",opacity:0}})),r.createElement("label",{htmlFor:"raised-button-file"},r.createElement(E.a,{variant:"contained",color:"primary",component:"span"},"Select an image")))))))),r.createElement(f.a,{className:T()(P.cardGrid,"results"!==n&&P.cardGridCollapsed),maxWidth:"md"},i&&r.createElement(b.a,{style:{marginBottom:"4em"},raised:!0},r.createElement(A.Preview,{key:i.id,maxWidth:document.body.clientWidth,maxHeight:Q,dotColor:H.primaryColor,onSelectionChange:a.onSelectionChange,regions:p,selection:_,image:i.canvas})),c&&r.createElement("div",{style:{textAlign:"center"}},r.createElement(y.a,{className:P.loading})),r.createElement(v.a,{container:!0,spacing:4},r.createElement(I.NodeGroup,{data:l,keyAccessor:function(e){return e.position+e.sku},start:function(e,t){return{opacity:0,translateX:-100}},enter:function(e,t){return{opacity:[1],translateX:[0],timing:{delay:100*t,duration:300}}}},(function(e){return r.createElement(r.Fragment,null,e.map((function(e){var n=e.key,i=e.data,c=e.state;return r.createElement(v.a,{item:!0,key:n,xs:12,sm:4,md:3},r.createElement(b.a,{className:P.card,style:{opacity:c.opacity,position:"relative",transform:"translateX(".concat(c.translateX,"%)")}},r.createElement(O.a,{className:P.cardMedia,image:i.img&&i.img.url||t.noImageUrl,title:i.title}),r.createElement(k.a,{className:P.cardContent},r.createElement(u.a,{gutterBottom:!0,variant:"subtitle2",component:"h5",className:P.withElipsis},i[H.resultFirstRowProperty]),r.createElement(u.a,{variant:"body2",className:P.withElipsis},i[H.resultSecondRowProperty])),i.l&&r.createElement(S.a,null,r.createElement(E.a,{variant:"outlined",style:{marginLeft:"auto"},size:"small",color:"primary",onClick:function(){return a.onLinkClick(i.position,i.l)},onAuxClick:function(){return a.onLinkClick(i.position,i.l)}},H.resultLinkIcon&&r.createElement(r.Fragment,null,r.createElement(R.a,null,H.resultLinkIcon)," "),H.resultLinkText))))})))}))),0===l.length&&"results"===n&&!c&&r.createElement(u.a,{variant:"h3",align:"center"},"We did not find anything")),"start"!==n&&r.createElement(f.a,{maxWidth:"lg"},r.createElement("div",{className:P.fabContainer},r.createElement(C.a,{"aria-label":"back",className:P.fab,color:"primary",onClick:a.onShowStart},r.createElement(x.a,null))))),r.createElement("footer",{className:P.footer},r.createElement(u.a,{variant:"subtitle1",align:"center",color:"textSecondary"},N&&"results"===n&&r.createElement("div",{style:{textAlign:"center",fontSize:"0.7em",paddingTop:"0.8em"}},"Request identifier ",N)),r.createElement(U,null)))};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var P=a(64),M=a(91),W={results:[],regions:[],selectedRegion:{x1:.1,x2:.9,y1:.1,y2:.9},requestImage:void 0,fetchingResults:!1,fetchingRegions:!1,filterOptions:[],categoryPredictions:[],codes:[],errorMessage:"",filters:[],selectedFilters:new Map},q=function(e){return{type:"LOAD_FILE",file:e}},B=function(e){return{type:"LOAD_IMAGE",url:e}},G=function(e){return{type:"LOAD_IMAGE",image:e}},Q=function(e,t){return{type:"IMAGE_LOADED",image:{canvas:e,id:t}}},K=function(e,t){return{type:"CAD_LOADED",file:e}},z=function(e){return{type:"REGION_CHANGED",normalizedRect:e}},V=function(e){return{type:"REGION_REQUEST_START",image:e}},X=function(e,t){return{type:"SEARCH_REQUEST_START",image:e,normalizedRect:t}},J=function(e){return{type:"SEARCH_REQUEST_START",file:e}},Y=function(){return{type:"FEEDBACK_SUBMIT_POSITIVE"}},$=function(){return{type:"FEEDBACK_SUBMIT_NEGATIVE"}},Z=function(e,t){return{type:"REMOVE_FROM_SELECTEDFILTERS",key:e,value:t}},ee=function(e,t){return{type:"SEARCH_FILTERS",key:e,value:t}};function te(e,t,a){if(e){var n=e.get(t);n?n.push(a):n=new Array(a),e.set(t,n)}return console.log(e),e}function ae(e,t,a){if(e){var n=e.get(t);n&&(n=n.filter((function(e){return e!==a})),e.set(t,n))}return console.log(e),e}function ne(e,t,a){if(console.log(e),console.log(t),console.log(a),console.log(e.find((function(e){return e.key===t}))),e&&e.length>0&&e.find((function(e){return e.key===t}))){var n=e.findIndex((function(e){return e.key===t}));e[n].values=a,console.log(e)}return e}var re=function(){return{type:"SHOW_CAMERA"}},ie=function(){return{type:"SHOW_START"}},ce=function(){return{type:"SHOW_RESULTS"}},se=function(){return{type:"SHOW_FEEDBACK"}},oe=function(){return{type:"HIDE_FEEDBACK"}},le={showPart:"start",feedbackState:"hidden"};function ue(e){var t=new RegExp("[?&]".concat(e,"(=([^&#]*))?(&|$|#)"),"i").exec(window.location.href);return t&&t[2]?(console.log("has value",e,t[2]),decodeURIComponent(t[2])):!!t||void 0}function pe(e){return e.charAt(0).toUpperCase()+e.slice(1)}var me=a(320),de=a(686),fe=a(325),he=a(685),ge=(a(637),{appBarLogoUrl:"images/nyris-logo.svg",appBarCustomBackgroundColor:"#f4f4f4",appBarCustomTextColor:"#ccc",appBarTitle:"",primaryColor:"#e2001a",secondaryColor:"#777777",resultFirstRowProperty:"title",resultSecondRowProperty:"sku",resultLinkText:"Info",customFontFamily:"Helvetica"}),Ee=a(19),be=a.n(Ee),ye=a(41),ve=a(28),Oe=a(327),ke=a(691),Se=a(681),Ce=a(692),we=a(682),je=a(168),xe=a(693),Re=a(684),Ie=a(683),_e=Object(ke.a)((function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("FEEDBACK_SUBMIT_POSITIVE","FEEDBACK_SUBMIT_NEGATIVE"),Object(Se.a)(t),Object(Ce.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c,s;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0].type,i=a[1],c="FEEDBACK_SUBMIT_POSITIVE"===r,!(s=i.search.sessionId||i.search.requestId)||!i.search.requestId){e.next=6;break}return e.next=6,n.sendFeedback(s,i.search.requestId,{event:"feedback",data:{success:c}});case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),Object(we.a)())}),(function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("REGION_CHANGED"),Object(Ie.a)(1200),Object(Se.a)(t),Object(Ce.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c,s,o,l,u,p;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],i=a[1],"REGION_CHANGED"!==r.type){e.next=7;break}if(c=r.normalizedRect,s=c.x1,o=c.x2,l=c.y1,u=c.y2,!(p=i.search.sessionId||i.search.requestId)||!i.search.requestId){e.next=7;break}return e.next=7,n.sendFeedback(p,i.search.requestId,{event:"region",data:{rect:{x:s,y:l,w:o-s,h:u-l}}});case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),Object(we.a)())}),(function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("RESULT_LINK_CLICKED","RESULT_IMAGE_CLICKED"),Object(Se.a)(t),Object(Ce.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c,s;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],i=a[1],"RESULT_LINK_CLICKED"!==r.type&&"RESULT_IMAGE_CLICKED"!==r.type){e.next=7;break}if(c=r.position,!(s=i.search.sessionId||i.search.requestId)||!i.search.requestId){e.next=7;break}return e.next=7,n.sendFeedback(s,i.search.requestId,{event:"click",data:{positions:[c]}});case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),Object(we.a)())})),Te=Object(ke.a)((function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("SEARCH_REQUEST_START"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c,s,o,l,u,p,m,d,f,h,g,E,b,y,v,O,k,S,C,w,j,x,R,I;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],i=a[1],"SEARCH_REQUEST_START"===r.type){e.next=3;break}throw new Error("Wrong action type ".concat(r.type));case 3:if(!("image"in r)){e.next=38;break}if(c=r.image,s=r.normalizedRect,o=new Array,i.search.selectedFilters.size>0&&i.search.selectedFilters.forEach((function(e,t){if(e&&e.length>0){var a={key:t,values:e};o.push(a)}})),l={cropRect:s},e.prev=8,!(o&&o.length>0)){e.next=22;break}return console.log("With Filters"),e.next=13,n.findByImageWithFilters(c,l,o);case 13:return u=e.sent,p=u.results,m=u.duration,d=u.requestId,f=u.categoryPredictions,h=u.codes,e.abrupt("return",{type:"SEARCH_REQUEST_SUCCEED",results:p,requestId:d,duration:m,categoryPredictions:f,codes:h});case 22:return console.log("Without Filters"),e.next=25,n.findByImage(c,l);case 25:return g=e.sent,E=g.results,b=g.duration,y=g.requestId,v=g.categoryPredictions,O=g.codes,e.abrupt("return",{type:"SEARCH_REQUEST_SUCCEED",results:E,requestId:y,duration:b,categoryPredictions:v,codes:O});case 32:e.next=38;break;case 34:return e.prev=34,e.t0=e.catch(8),console.warn("search failed",e.t0),e.abrupt("return",{type:"SEARCH_REQUEST_FAIL",reason:e.t0.message,exception:e.t0});case 38:if(!("file"in r)){e.next=58;break}return console.log("file"),k=r.file,S={},e.prev=42,e.next=45,n.findByCad(k,S);case 45:return C=e.sent,w=C.results,j=C.duration,x=C.requestId,R=C.categoryPredictions,I=C.codes,e.abrupt("return",{type:"SEARCH_REQUEST_SUCCEED",results:w,requestId:x,duration:j,categoryPredictions:R,codes:I});case 54:return e.prev=54,e.t1=e.catch(42),console.warn("search failed",e.t1),e.abrupt("return",{type:"SEARCH_REQUEST_FAIL",reason:e.t1.message,exception:e.t1});case 58:throw new Error("Wrong action content ".concat(r));case 59:case"end":return e.stop()}}),e,null,[[8,34],[42,54]])})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("REGION_REQUEST_START"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],a[1].settings,"REGION_REQUEST_START"===r.type){e.next=3;break}throw new Error("Wrong action type ".concat(r.type));case 3:return i=r.image,e.prev=4,e.next=7,n.findRegions(i);case 7:return c=e.sent,e.abrupt("return",{type:"REGION_REQUEST_SUCCEED",regions:c});case 11:return e.prev=11,e.t0=e.catch(4),console.error(e.t0),e.abrupt("return",{type:"REGION_REQUEST_FAIL",reason:e.t0.message,exception:e.t0});case 15:case"end":return e.stop()}}),e,null,[[4,11]])})));return function(t){return e.apply(this,arguments)}}()))}),(function(e){return e.pipe(Object(Oe.a)("LOAD_FILE"),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("LOAD_FILE"===t.type){e.next=2;break}throw new Error("Wrong action type ".concat(t.type));case 2:if(a=Math.random().toString(),!("file"in t)){e.next=14;break}if(n=t.file,!Object(F.isImageFile)(n)){e.next=12;break}return e.t0=Q,e.next=9,Object(F.urlOrBlobToCanvas)(n);case 9:return e.t1=e.sent,e.t2=a,e.abrupt("return",(0,e.t0)(e.t1,e.t2));case 12:if(!Object(F.isCadFile)(n)){e.next=14;break}return e.abrupt("return",K(n));case 14:throw new Error("LOAD_FILE action wrong properties ".concat(Object.keys(t).join(",")));case 15:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e){return e.pipe(Object(Oe.a)("LOAD_IMAGE"),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("LOAD_IMAGE"===t.type){e.next=2;break}throw new Error("Wrong action type ".concat(t.type));case 2:if(a=Math.random().toString(),!("url"in t)){e.next=10;break}return e.t0=Q,e.next=7,Object(F.urlOrBlobToCanvas)(t.url);case 7:return e.t1=e.sent,e.t2=a,e.abrupt("return",(0,e.t0)(e.t1,e.t2));case 10:if(!("file"in t)){e.next=17;break}return e.t3=Q,e.next=14,Object(F.urlOrBlobToCanvas)(t.file);case 14:return e.t4=e.sent,e.t5=a,e.abrupt("return",(0,e.t3)(e.t4,e.t5));case 17:if(!("image"in t)){e.next=19;break}return e.abrupt("return",Q(t.image,a));case 19:throw new Error("LOAD_IMAGE action wrong properties ".concat(Object.keys(t).join(",")));case 20:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("LOAD_FILTERS"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],a[1],"LOAD_FILTERS"===r.type){e.next=3;break}throw new Error("Wrong action type ".concat(r.type));case 3:return e.prev=3,e.next=6,n.getFilters();case 6:return i=(i=e.sent).slice(0,3),console.log(i),e.abrupt("return",{type:"LOAD_FILTERS_SUCCESS",filters:i});case 12:return e.prev=12,e.t0=e.catch(3),console.error(e.t0),e.abrupt("return",{type:"LOAD_FILTERS_FAIL",reason:e.t0.message,exception:e.t0});case 16:case"end":return e.stop()}}),e,null,[[3,12]])})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t,a){var n=a.api;return e.pipe(Object(Oe.a)("SEARCH_FILTERS"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,r,i,c,s,o,l,u;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),r=a[0],a[1],"SEARCH_FILTERS"===r.type){e.next=3;break}throw new Error("Wrong action type ".concat(r.type));case 3:if(e.prev=3,i=r.key,c=r.value,s=[],!c){e.next=18;break}return e.next=9,n.searchFilters(i,c);case 9:if(!((o=e.sent)&&o.length>0)){e.next=16;break}return e.t0=s,e.next=14,n.searchFilters(i,c);case 14:e.t1=e.sent,s=e.t0.concat.call(e.t0,e.t1);case 16:e.next=23;break;case 18:return e.next=20,n.getFilters();case 20:l=e.sent,(u=l.find((function(e){return e.key===i})))&&u.values&&u.values.length>0&&(s=u.values);case 23:return e.abrupt("return",{type:"UPDATE_FILTERS",key:i,values:s});case 26:return e.prev=26,e.t2=e.catch(3),console.error(e.t2),e.abrupt("return",{type:"LOAD_FILTERS_FAIL",reason:e.t2.message,exception:e.t2});case 30:case"end":return e.stop()}}),e,null,[[3,26]])})));return function(t){return e.apply(this,arguments)}}()))})),Ae=Object(ke.a)(Te,_e,(function(e,t,a){var n=a.history;return e.pipe(Object(Oe.a)("SHOW_RESULTS","SHOW_START"),Object(Se.a)(t),Object(Ce.a)((function(e){var t=Object(ve.a)(e,2),a=t[0],r=t[1],i=a.type;console.log("action"),console.log(r.search.selectedFilters),"SHOW_RESULTS"===i&&"/results"!==n.location.pathname&&n.push("/results"),"SHOW_START"===i&&"/"!==n.location.pathname&&n.goBack()})),Object(we.a)())}),(function(e,t){return e.pipe(Object(Oe.a)("IMAGE_LOADED"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r,i;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],r=a[1].settings,"IMAGE_LOADED"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:if(i=n.image,!r.regions){e.next=6;break}return e.abrupt("return",V(i.canvas));case 6:return e.abrupt("return",X(i.canvas));case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t){return e.pipe(Object(Oe.a)("CAD_LOADED"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],a[1].settings,"CAD_LOADED"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:return r=n.file,e.abrupt("return",J(r));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t){return e.pipe(Object(Oe.a)("REGION_REQUEST_SUCCEED"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r,i,c;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],r=a[1].search.requestImage,"REGION_REQUEST_SUCCEED"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:if(r){e.next=5;break}throw new Error("No requestImage");case 5:return i=n.regions,c=Object(F.selectFirstCenteredRegion)(i,.3,{x1:0,x2:1,y1:0,y2:1}),e.abrupt("return",X(r.canvas,c));case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t){return e.pipe(Object(Oe.a)("REGION_REQUEST_FAIL"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],r=a[1].search.requestImage,"REGION_REQUEST_FAIL"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:if(r){e.next=5;break}throw new Error("No requestImage");case 5:return e.abrupt("return",X(r.canvas));case 6:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e,t){return e.pipe(Object(Oe.a)("REGION_CHANGED"),Object(Ie.a)(1200),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r,i;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],r=a[1].search.requestImage,"REGION_CHANGED"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:if(r){e.next=5;break}throw new Error("No requestImage");case 5:return i=n.normalizedRect,e.abrupt("return",X(r.canvas,i));case 7:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))}),(function(e){return e.pipe(Object(Oe.a)("SEARCH_REQUEST_SUCCEED"),Object(je.a)(ce))}),(function(e){return e.pipe(Object(Oe.a)("SEARCH_REQUEST_SUCCEED"),Object(xe.a)(3e3),Object(je.a)(se))}),(function(e,t){return e.pipe(Object(Oe.a)("SEARCH_REQUEST_SUCCEED"),Object(Se.a)(t),Object(Ce.a)((function(e){var t=Object(ve.a)(e,2),a=t[0],n=t[1].settings;if("SEARCH_REQUEST_SUCCEED"===a.type&&a.results&&1===a.results.length){var r=a.results[0].l;n.instantRedirectPatterns.find((function(e){return new RegExp(e).test(r)}))&&(window.location.href=r)}})),Object(we.a)())}),(function(e,t){return e.pipe(Object(Oe.a)("FILTER_CHANGED"),Object(Se.a)(t),Object(Re.a)(function(){var e=Object(ye.a)(be.a.mark((function e(t){var a,n,r;return be.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=Object(ve.a)(t,2),n=a[0],r=a[1].search.requestImage,"FILTER_CHANGED"===n.type){e.next=3;break}throw new Error("Wrong action type ".concat(n.type));case 3:if(!r){e.next=7;break}return e.abrupt("return",X(r.canvas));case 7:return e.abrupt("return",{type:"FILTER_CHANGED_FAIL"});case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()))})),Fe=a(326),Ne=a(687),De=a(688),Le=a(689),Ue=function(e){var t=e.result,a=e.style,r=e.template,c=e.onImageClick,s=e.onLinkClick,o={onImageClick:function(e){e.preventDefault(),c(t.position,t.img.url)},onLinkClick:function(e){e.preventDefault(),s(t.position,t.l)},noImageUrl:e.noImageUrl||"images/ic_cam_large_noimage.png",result:t},l=null;switch(r){case"snr":l=function(e){var t=e.result,a=e.noImageUrl,n=e.onImageClick,r=e.onLinkClick;return i.a.createElement(i.a.Fragment,null,i.a.createElement("a",{href:t.l,className:"imageLink",onClick:n,onAuxClick:r},i.a.createElement("div",{className:"prdctImg"},i.a.createElement("div",{className:"imgWrap"},i.a.createElement("img",{src:t.img&&t.img.url+"?r=512x512"||a,alt:t.title})))),i.a.createElement("div",{className:"prdctDetailsWrap"},i.a.createElement("div",null,i.a.createElement("div",{className:"prdctTitle"},t.sku),i.a.createElement("div",{className:"prdctMeta",style:{height:"5em",whiteSpace:"normal"}},t.title),i.a.createElement("a",{style:{backgroundImage:"none",paddingLeft:"10px"},className:"prdctShopLink",href:t.l,target:"_blank",rel:"noopener noreferrer",onClick:r,onAuxClick:r},"Info"))))}(o);break;case"snr-multilink":l=function(e,t){var a=e.result,n=e.noImageUrl,r=e.onImageClick;return i.a.createElement(i.a.Fragment,null,i.a.createElement("a",{href:a.l,className:"imageLink",onClick:r,onAuxClick:r},i.a.createElement("div",{className:"prdctImg"},i.a.createElement("div",{className:"imgWrap"},i.a.createElement("img",{src:a.img&&a.img.url+"?r=512x512"||n,alt:a.title})))),i.a.createElement("div",{className:"prdctDetailsWrap"},i.a.createElement("div",null,i.a.createElement("div",{className:"prdctTitle"},a.sku),i.a.createElement("div",{className:"prdctMeta",style:{height:"5em",whiteSpace:"normal"}},a.title),a.l.map((function(e){return i.a.createElement("a",{style:{backgroundImage:"none",paddingLeft:"10px"},className:"prdctShopLink",href:e.href,onClick:function(){return t(e.href)},onAuxClick:function(){return t(e.href)},target:"_blank",key:e.href,rel:"noopener noreferrer"},e.text)})))))}(o,(function(e){return s(t.position,e)}));break;case"default":default:l=function(e){var t=e.result,a=e.noImageUrl,n=e.onImageClick,r=e.onLinkClick;return i.a.createElement(i.a.Fragment,null,i.a.createElement("a",{href:t.l,className:"imageLink",title:"Click the image so see similar products",onClick:n,onAuxClick:r},i.a.createElement("div",{className:"prdctImg"},i.a.createElement("div",{className:"imgWrap"},i.a.createElement("img",{src:t.img&&t.img.url+"?r=512x512"||a,alt:t.title})))),i.a.createElement("div",{className:"prdctDetailsWrap"},i.a.createElement("div",null,i.a.createElement("div",{className:"prdctTitle"},t.title),i.a.createElement("div",{className:"prdctMeta"},i.a.createElement("span",{className:"prdctPrice"},function(e){return e.p?(e.p.vi/100).toFixed(2)+" "+e.p.c:""}(t))),i.a.createElement("a",{onClick:r,onAuxClick:r,className:"prdctShopLink",href:t.l,target:"_blank",rel:"noopener noreferrer"},"Buy Now"))))}(o)}return i.a.createElement("div",{className:"prdctItem",style:Object(n.a)({},a)},l)},He=a(135),Pe=a(323),Me=function(e){var t=e.filter,a=e.selectedValues,n=Object(P.c)(),c=Object(r.useState)(!1),s=Object(ve.a)(c,2),o=s[0],l=s[1],u=Object(r.useState)(""),p=Object(ve.a)(u,2),m=p[0],d=p[1],f=function(){l(!o)};return Object(r.useEffect)((function(){""===m&&n(ee(t.key,""))}),[m,t.key,n]),i.a.createElement("div",null,i.a.createElement("div",{className:"item"},i.a.createElement("span",{className:"sidebar-text"}," ",pe(t.key)),i.a.createElement(He.b,{className:o?"sidebar-icon":"sidebar-icon collapsedHide",onClick:function(){return f()}}),i.a.createElement(He.a,{className:o?"sidebar-icon collapsedHide":"sidebar-icon",onClick:function(){return f()}})),i.a.createElement("div",{className:o?"list-container":"list-container collapsedHide"},i.a.createElement("div",{className:"searchBar"},i.a.createElement("input",{id:"searchQueryInput",name:"searchQueryInput",placeholder:"Search",value:m,onChange:function(e){return function(e){d(e.target.value)}(e)}}),i.a.createElement("button",{id:"searchQuerySubmit",type:"submit",name:"searchQuerySubmit",onClick:function(){return e=t.key,void n(ee(e,m));var e}},i.a.createElement(Pe.a,null))),t&&t.values&&t.values.length>0&&t.values.slice(0,6).map((function(e,r){var c=a&&a.includes(e);return i.a.createElement("div",{key:r},i.a.createElement("input",{value:e,checked:!!c,type:"checkbox",onChange:function(a){return function(e,a){e.target.checked?t.key&&n(function(e,t){return{type:"ADD_TO_SELECTEDFILTERS",key:e,value:t}}(t.key,a)):t.key&&n(Z(t.key,a)),n({type:"FILTER_CHANGED"})}(a,e)}}),i.a.createElement("span",{className:"itemLabel"},e))}))))},We=function(e){var t=e.filters,a=e.selectedFilters;console.log(t);var n=Object(r.useState)(!1),c=Object(ve.a)(n,2),s=c[0],o=c[1];return i.a.createElement("div",{className:s?"sidebar":"Sidebar collapsed"},i.a.createElement("div",{className:s?"sidebarContent":"sidebarContent overflowHidden"},i.a.createElement("div",{className:"sidebarHeader"},i.a.createElement(He.c,{className:"sidebar-icon",onClick:function(){o(!s)}})),i.a.createElement("div",{className:s?"Sidebar-items":"Sidebar-items collapsedHide"},t&&t.map((function(e){var t=e.key?a.get(e.key):void 0;return i.a.createElement(Me,{filter:e,selectedValues:t})})))))},qe=function(){return i.a.createElement("div",{id:"header"},i.a.createElement("section",{id:"branding"}),i.a.createElement("div",{id:"menu",className:"menuWrap",role:"navigation"},i.a.createElement("ul",null,i.a.createElement("li",null,i.a.createElement("a",{href:"https://nyris.io/imprint/#privacy",target:"_blank",rel:"noopener noreferrer"},"Privacy Policy")),i.a.createElement("li",null,i.a.createElement("a",{href:"https://nyris.io/",target:"_blank",rel:"noopener noreferrer"},"Visit our Website")))))},Be=function(e){var t=e.feedbackState,a=e.onPositiveFeedback,n=e.onNegativeFeedback,r=e.onClose,c=null;switch(t){case"question":c=i.a.createElement("div",{className:"feedbackForm"},i.a.createElement("p",null,"Did you find what you were looking for?"),i.a.createElement("div",{className:"btn primary positiveFeedback",onClick:a},"Yes"),i.a.createElement("div",{className:"btn secondary negativeFeedback",onClick:n},"No"));break;case"positive":c=i.a.createElement("div",{className:"feedbackMessage positive"},"Great, thank you for your feedback!");break;case"negative":c=i.a.createElement("div",{className:"feedbackMessage negative"},"We saved your request so we can track down the issue and improve the search experience. Your Feedback helps us to make our service better for everyone, thank you!",i.a.createElement("br",null),i.a.createElement("div",{className:"btn dismiss",onClick:r},"Dismiss"));break;default:c=null}return i.a.createElement(I.Animate,{show:"hidden"!==t,start:{y:100,opacity:0},enter:{y:[0],opacity:[1]},leave:{y:[100],opacity:[0]}},(function(e){var t=e.y,a=e.opacity;return i.a.createElement("section",{className:"feedback",style:{transform:"translateY(".concat(t,"%)"),opacity:a}},i.a.createElement("div",{className:"wrapper"},c),i.a.createElement("div",{className:"closeFeedbackContainer"},i.a.createElement("div",{className:"closeFeedback",onClick:r})))}))},Ge=function(e){var t=e.cats;return 0===t.length?null:i.a.createElement("div",{id:"catlist",style:{textAlign:"center"}},t.map((function(e){return i.a.createElement("a",{key:e,href:"#top"},e)})))},Qe=function(e){var t=e.codes;return i.a.createElement(i.a.Fragment,null,i.a.createElement("div",{className:"codes",style:{textAlign:"center"}},t.length>0&&i.a.createElement("span",{style:{fontSize:"0.8em"}},"Codes",i.a.createElement("br",null)," "),t.map((function(e,t){return i.a.createElement("small",{key:t,title:e.type},e.value)}))))},Ke=function(e){var t=e.cs;return i.a.createElement(i.a.Fragment,null,t.map((function(e){return i.a.createElement("small",{key:e.name},""===e.name?"No category":e.name.split(" > ").slice(-1)[0],":",(100*e.score).toFixed(0),"%")})))},ze=function(e){var t=e.images,a=e.onExampleImageClicked;return 0===t.length?null:i.a.createElement("section",{className:"useExampleImg"},"You can also try one of these pictures:",i.a.createElement("div",{className:"exampleImages"},i.a.createElement("div",{className:"exImagesWrap"},t.map((function(e){return i.a.createElement("img",{key:e,src:e,alt:"",onClick:function(){return a(e)}})})))))},Ve=a(324),Xe=function(e){return{showPart:e.nyrisDesign.showPart,search:{filters:e.search.filters,selectedFilters:e.search.selectedFilters}}},Je=(Object(P.b)(Xe),Object(P.b)(Xe)((function(e){var t=e.search,a=Object(P.c)(),n=[].concat.apply([],Array.from(t.selectedFilters.values()));return i.a.createElement("div",{className:"wrap-box-refinements"},i.a.createElement("ul",null,Array.from(t.selectedFilters.keys()).map((function(e){return t.selectedFilters.get(e)&&t.selectedFilters.get(e).map((function(t){return i.a.createElement("li",null,i.a.createElement("button",{onClick:function(){return a(Z(e,t)),void a({type:"FILTER_CHANGED"})}},i.a.createElement("span",{className:"summary-label"},i.a.createElement("div",{className:"summary-label-key-text"},pe(t),i.a.createElement(Ve.a,null)))))}))})),i.a.createElement("li",null,i.a.createElement("button",{className:t.selectedFilters&&t.selectedFilters.size>0&&n&&n.length>0?"clear-all-filters ":"clear-all-filters-hidden",onClick:function(){return a({type:"CLEAR_SELECTED_FILTERS"}),void a({type:"FILTER_CHANGED"})}}," ","Clear All"," "))))}))),Ye=function(e){var t=e.search,a=t.results,c=t.regions,s=t.previewSelection,l=t.requestId,u=t.duration,p=t.errorMessage,m=t.filterOptions,d=t.categoryPredictions,f=t.codes,h=t.toastErrorMessage,g=t.filters,E=t.selectedFilters,b=e.showPart,y=e.settings,v=e.handlers,O=e.loading,k=e.previewImage,S=e.feedbackState,C=Object(o.a)({onDrop:function(e){return v.onFileDropped(e[0])}}),w=C.getRootProps,j=C.getInputProps,x=C.isDragActive,R=Math.floor(.45*window.innerHeight),_=Math.max(400,R),N=Object(r.useState)(!1),D=Object(ve.a)(N,2),L=D[0],U=D[1],H=Object(P.c)(),M=["image/*"].concat(y.cadSearch?F.cadExtensions:[]).join(",");return Object(r.useEffect)((function(){""!==h&&U(!0)}),[h]),Object(r.useEffect)((function(){H({type:"LOAD_FILTERS"})}),[b,H]),i.a.createElement(i.a.Fragment,null,i.a.createElement(qe,null),i.a.createElement("div",{className:"wrapperBody"},i.a.createElement(We,{filters:g,selectedFilters:E}),i.a.createElement("div",{className:"mainContent"},"camera"===b&&i.a.createElement(A.Capture,{onCaptureComplete:v.onCaptureComplete,onCaptureCanceled:v.onCaptureCanceled,useAppText:"Use default camera app"}),i.a.createElement(Je,null),i.a.createElement("div",{className:T()("headSection",{hidden:"results"===b}),id:"headSection"},i.a.createElement("div",Object.assign({},w({onClick:function(e){e.stopPropagation()}}),{className:T()("wrapper","dragAndDropActionArea",{fileIsHover:x})}),i.a.createElement("div",{className:T()("contentWrap")},i.a.createElement(Ne.a,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",minHeight:"100vh"},i.a.createElement("section",{className:"uploadImage"},i.a.createElement("input",{type:"button",name:"file",id:"capture",className:"inputfile",accept:"image/*",capture:"environment",onClick:v.onCameraClick}),i.a.createElement("input",{type:"file",name:"file",id:"capture_file",className:"inputfile",accept:M,capture:"environment"}),i.a.createElement("input",Object.assign({},j(),{type:"file",name:"file",id:"select_file",className:"inputfile",accept:M,onChange:Object(A.makeFileHandler)(v.onSelectFile)})),i.a.createElement("div",{className:"onDesktop"},"Drop an image",i.a.createElement("div",{className:"smallText"},"or")),i.a.createElement("div",{className:"onMobile camIcon"},i.a.createElement("img",{src:"./images/ic_cam_large.svg",alt:"Camera"})),i.a.createElement("label",{htmlFor:"capture",className:"btn primary onMobile",style:{marginBottom:"2em",width:"12em"}},i.a.createElement("span",{className:"onMobile"},"Take a picture")),i.a.createElement("br",null),i.a.createElement("label",{htmlFor:"select_file",className:"btn primary",style:{width:"12em"}},i.a.createElement("span",null,"Select a file")),i.a.createElement("label",{htmlFor:"capture",className:"mobileUploadHandler onMobile"})),i.a.createElement(ze,{images:y.exampleImages,onExampleImageClicked:v.onExampleImageClick})))),i.a.createElement("div",{className:"headerSeparatorTop"}),i.a.createElement("div",{className:"headerSeparatorBack"}),i.a.createElement("div",{className:T()("tryDifferent",{hidden:"results"!==b}),onClick:v.onShowStart},i.a.createElement("div",{className:"icIcon"}),i.a.createElement("div",{className:"textDesc"}," Try a different image"),i.a.createElement("br",{style:{clear:"both"}}))),i.a.createElement("section",{className:T()({hideResults:"results"!==b},"results",{resultsActive:"results"===b},1===a.length?"singleProduct":"multipleProducts")},p&&i.a.createElement("div",{className:"errorMsg"},p,i.a.createElement("div",{style:{textAlign:"center",fontSize:"0\xdf.7em",paddingTop:"0.8em"}},i.a.createElement("span",null,"Make sure to include the request ID when reporting a problem: ",l))),i.a.createElement(I.Animate,{show:O,start:{opacity:0},enter:{opacity:[1],timing:{duration:300}},leave:{opacity:[0],timing:{duration:300}}},(function(e){return i.a.createElement("div",{className:"loadingOverlay",style:Object(n.a)({},e)},i.a.createElement("div",{className:"loading"}))})),y.preview&&k&&i.a.createElement("div",{className:"preview"},i.a.createElement(A.Preview,{key:k.id,maxWidth:document.body.clientWidth,maxHeight:_,dotColor:"#4C8F9F",onSelectionChange:v.onSelectionChange,regions:c,selection:s,image:k.canvas})),i.a.createElement("div",{className:"predicted-categories"},i.a.createElement(Ke,{cs:d})),i.a.createElement("div",{className:"predicted-categories"},i.a.createElement(Qe,{codes:f})),i.a.createElement(Ge,{cats:m}),i.a.createElement("div",{className:"wrapper"},i.a.createElement(I.NodeGroup,{data:a,keyAccessor:function(e){return e.sku},start:function(e,t){return{opacity:0,translateX:-100}},enter:function(e,t){return{opacity:[1],translateX:[0],timing:{delay:100*t,duration:300}}}},(function(e){return i.a.createElement(i.a.Fragment,null,e.map((function(e){var t=e.key,a=e.data,n=e.state;return i.a.createElement(Ue,{key:t,noImageUrl:y.noImageUrl,template:y.resultTemplate,onImageClick:v.onImageClick,onLinkClick:v.onLinkClick,result:a,style:{opacity:n.opacity,transform:"translateX(".concat(n.translateX,"%)")}})})))})),0===a.length&&"results"===b&&!O&&i.a.createElement("div",{className:"noResults"},"We did not find anything"," ",i.a.createElement("span",{role:"img","aria-label":"sad face"},"\ud83d\ude15")),i.a.createElement("br",{style:{clear:"both"}}),u&&"results"===b&&i.a.createElement("div",{style:{textAlign:"center",fontSize:"0.7em",paddingTop:"0.8em"}},"Search took ",u.toFixed(2)," seconds"),l&&"results"===b&&i.a.createElement("div",{style:{textAlign:"center",fontSize:"0.7em",paddingTop:"0.8em"}},"Request identifier ",l))),i.a.createElement(De.a,{open:L,autoHideDuration:3e3,onClose:function(){return U(!1)}},i.a.createElement(Le.a,{onClose:function(){return U(!1)},severity:"error"},h)))),i.a.createElement("section",{className:"footnote"},i.a.createElement("div",{className:"wrapper"},"\xa9 2017 - 2019 ",i.a.createElement("a",{href:"https://nyris.io"},"nyris GmbH")," - All rights reserved - ",i.a.createElement("a",{href:"https://nyris.io/imprint/"},"Imprint"))),i.a.createElement(Be,{feedbackState:S,onPositiveFeedback:v.onPositiveFeedback,onNegativeFeedback:v.onNegativeFeedback,onClose:v.onCloseFeedback}))};var $e=Object(n.a)(Object(n.a)({},{xOptions:!1,apiKey:"UNSET",exampleImages:[],preview:!0,regions:!1,maxWidth:500,maxHeight:500,jpegQuality:.92,baseUrl:"https://api.nyris.io",instantRedirectPatterns:["^https?://(www.)?youtube.com/","^https?://(www.)?youtu.be/","^https?://(www.)?vimeo.com/","^https?://(www.)?dailymotion.com/","^https?://(www.)?dai.ly/"]}),settings);$e=Object(n.a)(Object(n.a)({},$e),{},{apiKey:ue("apiKey")||$e.apiKey,xOptions:ue("xOptions")||$e.xOptions,regions:ue("use.regions")||$e.regions,preview:ue("use.preview")||$e.preview}),document.title=window.location.host;var Ze=new N.a($e),et=Object(Fe.a)(),tt=Object(de.a)({dependencies:{api:Ze,history:et}}),at=Object(M.combineReducers)({settings:function(){return $e},nyrisDesign:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:le,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"SHOW_START":return Object(n.a)(Object(n.a)({},e),{},{showPart:"start"});case"SHOW_CAMERA":return Object(n.a)(Object(n.a)({},e),{},{showPart:"camera"});case"SEARCH_REQUEST_START":case"REGION_REQUEST_START":case"SHOW_RESULTS":return Object(n.a)(Object(n.a)({},e),{},{showPart:"results"});case"SHOW_FEEDBACK":return Object(n.a)(Object(n.a)({},e),{},{feedbackState:"question"});case"HIDE_FEEDBACK":return Object(n.a)(Object(n.a)({},e),{},{feedbackState:"hidden"});case"FEEDBACK_SUBMIT_POSITIVE":return Object(n.a)(Object(n.a)({},e),{},{feedbackState:"positive"});case"FEEDBACK_SUBMIT_NEGATIVE":return Object(n.a)(Object(n.a)({},e),{},{feedbackState:"negative"});default:return e}},search:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:W,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"IMAGE_LOADED":var a=t.image;return console.log("image",a),Object(n.a)(Object(n.a)({},W),{},{requestImage:a,selectedFilters:e.selectedFilters});case"CAD_LOADED":var r=t.file;return Object(n.a)(Object(n.a)({},W),{},{requestCadFile:r});case"REGION_REQUEST_START":return Object(n.a)(Object(n.a)({},e),{},{fetchingRegions:!0});case"REGION_REQUEST_SUCCEED":return Object(n.a)(Object(n.a)({},e),{},{fetchingRegions:!1,regions:t.regions,selectedRegion:Object(F.selectFirstCenteredRegion)(t.regions,.3,e.selectedRegion)});case"REGION_REQUEST_FAIL":return Object(n.a)(Object(n.a)({},e),{},{fetchingRegions:!1,errorMessage:t.exception.response.data.detail});case"SEARCH_REQUEST_START":return Object(n.a)(Object(n.a)({},e),{},{fetchingResults:!0});case"SEARCH_REQUEST_SUCCEED":var i=t.results,c=t.requestId,s=t.duration,o=t.categoryPredictions,l=t.codes;return Object(n.a)(Object(n.a)({},e),{},{results:i,requestId:c,fetchingResults:!1,sessionId:e.sessionId||c,categoryPredictions:o,codes:l,duration:s});case"SEARCH_REQUEST_FAIL":return Object(n.a)(Object(n.a)({},e),{},{fetchingResults:!1,errorMessage:t.reason});case"REGION_CHANGED":return Object(n.a)(Object(n.a)({},e),{},{selectedRegion:t.normalizedRect});case"LOAD_FILTERS_SUCCESS":return Object(n.a)(Object(n.a)({},e),{},{filters:t.filters});case"LOAD_FILTERS_FAIL":return Object(n.a)(Object(n.a)({},e),{},{errorMessage:t.exception.response.data.detail});case"ADD_TO_SELECTEDFILTERS":return Object(n.a)(Object(n.a)({},e),{},{selectedFilters:te(e.selectedFilters,t.key,t.value)});case"REMOVE_FROM_SELECTEDFILTERS":return Object(n.a)(Object(n.a)({},e),{},{selectedFilters:ae(e.selectedFilters,t.key,t.value)});case"CLEAR_SELECTED_FILTERS":return Object(n.a)(Object(n.a)({},e),{},{selectedFilters:new Map});case"CLEAR_REQUEST_IMAGE":return Object(n.a)(Object(n.a)({},e),{},{requestImage:void 0});case"UPDATE_FILTERS":return Object(n.a)(Object(n.a)({},e),{},{filters:ne(e.filters,t.key,t.values)})}return e}}),nt=Object(M.createStore)(at,Object(me.composeWithDevTools)(Object(M.applyMiddleware)(tt)));tt.run(Ae),et.listen((function(e,t){if(console.log("history",e,t),"PUSH"!==t)switch(e.pathname){case"/results":nt.dispatch({type:"SHOW_RESULTS"}),nt.dispatch({type:"LOAD_FILTERS"});break;case"/":nt.dispatch({type:"SHOW_START"})}}));window.addEventListener("message",(function(e){var t=e.data;"image"===t.type&&nt.dispatch(B(t.image))}));var rt=void 0!==settings.materialDesign,it=Object(n.a)(Object(n.a)({},ge),settings.materialDesign),ct=Object(fe.a)({typography:{fontFamily:it.customFontFamily},palette:{primary:{main:it.primaryColor},secondary:{main:it.secondaryColor}}}),st=rt?H:Ye,ot=Object(P.b)((function(e){return{showPart:e.nyrisDesign.showPart,search:{results:e.search.results,categoryPredictions:e.search.categoryPredictions,codes:e.search.codes,filterOptions:e.search.filterOptions,previewSelection:e.search.selectedRegion,regions:e.search.regions,duration:e.search.duration,requestId:e.search.requestId,toastErrorMessage:e.search.errorMessage,filters:e.search.filters,selectedFilters:e.search.selectedFilters},settings:e.settings,previewImage:e.search.requestImage,loading:e.search.fetchingRegions||e.search.fetchingResults,feedbackState:e.nyrisDesign.feedbackState,mdSettings:e.settings.materialDesign||ge}}),(function(e){return{handlers:Object(n.a)(Object(n.a)({},Object(M.bindActionCreators)({onPositiveFeedback:Y,onNegativeFeedback:$,onCameraClick:re,onCaptureCanceled:ie,onCaptureComplete:G,onSelectFile:q,onExampleImageClick:B,onFileDropped:q,onSelectionChange:z,onCloseFeedback:oe},e)),{},{onImageClick:function(t,a){e({type:"RESULT_IMAGE_CLICKED",position:t,url:a}),e(B(a))},onLinkClick:function(t,a){e({type:"RESULT_LINK_CLICKED",position:t,url:a}),a&&window.open(a)},onShowStart:function(){e({type:"SHOW_START"}),e({type:"CLEAR_REQUEST_IMAGE"}),window.scrollTo({top:0,left:0,behavior:"smooth"})}})}}))(st);s.a.render(i.a.createElement(P.a,{store:nt},i.a.createElement(he.a,{theme:ct},i.a.createElement(ot,null))),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()}))}},[[339,1,2]]]);
|
|
2
|
+
//# sourceMappingURL=main.ef6a9744.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../utils.ts","../../index.ts","AppMD.tsx","serviceWorker.ts","actions/searchActions.ts","actions/nyrisAppActions.ts","utils.ts","defaults.ts","epics/feedback.ts","epics/search.ts","epics/index.ts","components/Result.tsx","components/FiltersList.tsx","components/Sidebar.tsx","components/Header.tsx","components/Feedback.tsx","components/CategoryFilter.tsx","components/Codes.tsx","components/PredictedCategories.tsx","components/ExampleImages.tsx","components/SelectedFiltersSummary.tsx","App.tsx","index.tsx"],"names":["r","exports","this","baseUrl","i","bodyFormData","append","useStyles","makeStyles","theme","icon","marginRight","spacing","heroContent","backgroundColor","palette","background","paper","padding","transition","overflow","height","heroContentClosed","heroButtons","marginTop","cardGrid","paddingTop","paddingBottom","minHeight","cardGridCollapsed","opacity","card","display","flexDirection","cardMedia","backgroundSize","cardContent","flexGrow","footer","withElipsis","textOverflow","whiteSpace","loading","margin","fabContainer","position","bottom","fab","marginLeft","makeFileHandler","action","e","file","dataTransfer","files","target","value","Copyright","Typography","variant","color","align","Link","href","component","AppMD","settings","handlers","showPart","previewImage","search","results","regions","previewSelection","requestId","mdSettings","duration","classes","useDropzone","onDrop","fs","onFileDropped","getRootProps","getInputProps","isDragActive","halfOfTheScreenHeight","Math","floor","window","innerHeight","maxPreviewHeight","max","acceptTypes","concat","cadSearch","cadExtensions","join","resultLinkIcon","rel","CssBaseline","onCaptureComplete","onCaptureCanceled","useAppText","AppBar","style","appBarCustomBackgroundColor","Container","maxWidth","src","appBarLogoUrl","alt","Toolbar","appBarCustomTextColor","appBarTitle","className","classNames","Hidden","mdUp","textAlign","PhotoCamera","fontSize","Button","onClick","onCameraClick","accept","id","type","onChange","onSelectFile","width","htmlFor","smDown","borderStyle","borderWidth","borderColor","borderRadius","stopPropagation","Image","Card","marginBottom","raised","key","document","body","clientWidth","maxHeight","dotColor","primaryColor","onSelectionChange","selection","image","canvas","CircularProgress","Grid","container","data","keyAccessor","sku","start","translateX","enter","timing","delay","rs","map","result","state","item","xs","sm","md","transform","CardMedia","img","url","noImageUrl","title","CardContent","gutterBottom","resultFirstRowProperty","resultSecondRowProperty","l","CardActions","size","onLinkClick","onAuxClick","Icon","resultLinkText","length","Fab","aria-label","onShowStart","ArrowBack","Boolean","location","hostname","match","initialState","selectedRegion","x1","x2","y1","y2","requestImage","undefined","fetchingResults","fetchingRegions","filterOptions","categoryPredictions","codes","errorMessage","filters","selectedFilters","Map","loadFile","loadUrl","loadCanvas","imageLoaded","cadFileLoaded","selectionChanged","normalizedRect","searchRegions","searchOffersForImage","searchOffersForCad","submitPositiveFeedback","submitNegativeFeedback","removeFromSelectedFilters","searchFilters","ADDtoSelectedfilters","values","get","push","Array","set","console","log","RemoveFromSelectedFilters","filter","x","UpdateFilters","find","idx","findIndex","showCamera","showStart","showResults","showFeedback","hideFeedback","initialNyrisState","feedbackState","getUrlParam","name","RegExp","exec","decodeURIComponent","capitalizeFirstLetter","val","charAt","toUpperCase","slice","defaultMdSettings","secondaryColor","customFontFamily","combineEpics","action$","state$","api","pipe","ofType","withLatestFrom","tap","a","success","sessionId","sendFeedback","event","ignoreElements","debounceTime","rect","y","w","h","positions","switchMap","Error","forEach","filterObj","options","cropRect","findByImageWithFilters","findByImage","warn","reason","message","exception","findByCad","findRegions","error","randomId","random","toString","isImageFile","urlOrBlobToCanvas","isCadFile","Object","keys","getFilters","response","defaultfilters","rootEpic","searchEpics","feedbackEpics","history","pathname","goBack","selectFirstCenteredRegion","firstLink","instantRedirectPatterns","test","Result","template","onImageClick","preventDefault","resultInner","backgroundImage","paddingLeft","renderSnr","text","renderSnrMultilink","p","vi","toFixed","c","renderPrice","renderDefault","FiltersList","selectedValues","dispatch","useDispatch","useState","isCollapsed","setIsCollapsed","setMessage","handleToggler","useEffect","placeholder","handleChangeOnSearchInputTyped","index","checked","includes","addToSelectedFilters","onFilterChanged","Sidebar","isExpanded","setIsExpanded","Header","role","Feedback","onPositiveFeedback","onNegativeFeedback","onClose","inner","show","leave","CategoryFilter","cats","s","Codes","PredictedCategories","cs","split","score","ExampleImages","images","onExampleImageClicked","mapStateToProps","nyrisDesign","connect","apply","from","filterKey","App","toastErrorMessage","toastOpen","setToastOpen","Fragment","hidden","fileIsHover","Box","justifyContent","alignItems","capture","exampleImages","onExampleImageClick","clear","hideResults","resultsActive","preview","resultTemplate","Snackbar","open","autoHideDuration","Alert","severity","onCloseFeedback","normalizedSettings","xOptions","apiKey","jpegQuality","host","NyrisAPI","createHashHistory","epicMiddleware","createEpicMiddleware","dependencies","rootReducer","combineReducers","requestCadFile","detail","store","createStore","composeWithDevTools","applyMiddleware","run","listen","addEventListener","evt","msg","useMd","materialDesign","createMuiTheme","typography","fontFamily","primary","main","secondary","SelectedApp","ConnectedApp","bindActionCreators","scrollTo","top","left","behavior","ReactDOM","render","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.ef6a9744.chunk.js","sourcesContent":["\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar blueimp_load_image_1 = __importDefault(require(\"blueimp-load-image\"));\n/**\n * Calculates the center of a [[RectCoords]].\n * @param rect The [[RectCoords]] to calculate the center coordinate from.\n */\nfunction rectCenter(_a) {\n var x1 = _a.x1, x2 = _a.x2, y1 = _a.y1, y2 = _a.y2;\n return [\n ((x2 - x1) / 2 + x1),\n ((y2 - y1) / 2 + y1)\n ];\n}\n/**\n * Calculate distance between two points\n * @param x1 The x coordinate of the first point.\n * @param y1 The y coordinate of the first point.\n * @param x2 The x coordinate of the second point.\n * @param y2 The y coordinate of the second point.\n */\nvar dist2d = function (_a, _b) {\n var x1 = _a[0], y1 = _a[1];\n var x2 = _b[0], y2 = _b[1];\n return Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));\n};\n/**\n * Return first `Rect` from list `regions` with center-point which has a maximal distance of `maxDistance` from\n * the center. Otherwise return `defaultRect`\n * @param regions\n * @param maxDistance\n * @param defaultRect\n */\nfunction selectFirstCenteredRegion(regions, maxDistance, defaultRect) {\n var centeredRegion = regions.filter(function (r) {\n var dist = dist2d([0.5, 0.5], rectCenter(r.normalizedRect));\n return dist < maxDistance;\n });\n if (centeredRegion.length === 0) {\n return defaultRect;\n }\n return centeredRegion[0].normalizedRect;\n}\nexports.selectFirstCenteredRegion = selectFirstCenteredRegion;\n/**\n * Gets url parameter values by name.\n * @param name The parameter name.\n * @returns string value if it has value assigned with `=`, true if it is specified but without value or `undefined` if not present\n */\nfunction getUrlParam(name) {\n var results = new RegExp(\"[?&]\" + name + \"(=([^&#]*))?(&|$|#)\", 'i')\n .exec(window.location.href);\n if (results && results[2]) { // has value\n console.log('has value', name, results[2]);\n return decodeURIComponent(results[2]);\n }\n return (results && true) // present but without value\n || undefined; // not present\n}\nexports.getUrlParam = getUrlParam;\n/**\n * Calculate the size of a thumbnail image while keeping proportions, based on pixel area.\n * This leads to better results in cases, where the aspect ratio is extreme.\n * @param targetWidth The desired width of the image.\n * @param targetHeight The desired height of the image.\n * @param aspectRatio Aspect ratio of the image.\n */\nfunction getThumbSizeArea(targetWidth, targetHeight, aspectRatio) {\n var targetArea = targetWidth * targetHeight;\n var width = Math.sqrt(targetArea * aspectRatio);\n return {\n w: width,\n h: width / aspectRatio\n };\n}\nexports.getThumbSizeArea = getThumbSizeArea;\n/**\n * Calculate the size of a thumbnail image to fit in `maxWith` and `maxHeight` while preserving the aspect ratio.\n * @param maxWidth\n * @param maxHeight\n * @param originalWidth\n * @param originalHeight\n */\nfunction getThumbSizeLongestEdge(maxWidth, maxHeight, originalWidth, originalHeight) {\n var iR = originalWidth / originalHeight;\n var dR = maxWidth / maxHeight;\n if (dR > iR) {\n return {\n w: originalWidth * maxHeight / originalHeight,\n h: maxHeight\n };\n }\n return {\n w: maxWidth,\n h: originalHeight * maxWidth / originalWidth\n };\n}\nexports.getThumbSizeLongestEdge = getThumbSizeLongestEdge;\nfunction scaleRect(r, size) {\n return {\n x1: r.x1 * size.w,\n x2: r.x2 * size.w,\n y1: r.y1 * size.h,\n y2: r.y2 * size.h\n };\n}\nexports.scaleRect = scaleRect;\n/**\n * Calculates the size of a rect.\n * @param r The [[RectCoords]].\n */\nfunction getRectSize(r) {\n return {\n w: r.x2 - r.x1,\n h: r.y2 - r.y1\n };\n}\nexports.getRectSize = getRectSize;\n/**\n * Get aspect ratio of a rect\n * @param rect The normalized rect.\n * @param size The original image size.\n */\nfunction getRectAspectRatio(rect, size) {\n var scaledRect = scaleRect(rect, size);\n var _a = getRectSize(scaledRect), w = _a.w, h = _a.h;\n return w / h;\n}\nexports.getRectAspectRatio = getRectAspectRatio;\nfunction getElementSize(elem) {\n var img = elem;\n var video = elem;\n return {\n w: img.naturalWidth || video.videoWidth || elem.width,\n h: img.naturalHeight || video.videoHeight || elem.height\n };\n}\nexports.getElementSize = getElementSize;\nfunction elementToCanvas(elem, newSize, normalizedRect) {\n var _a = getElementSize(elem), ow = _a.w, oh = _a.h;\n var _b = normalizedRect ? normalizedRect : {\n x1: 0,\n x2: 1,\n y1: 0,\n y2: 1\n }, x1 = _b.x1, x2 = _b.x2, y1 = _b.y1, y2 = _b.y2;\n var w = x2 - x1;\n var h = y2 - y1;\n // scale to absolute pixels\n var sx = ow * x1;\n var sw = ow * w;\n var sy = oh * y1;\n var sh = oh * h;\n var dw = (newSize && newSize.w) || ow;\n var dh = (newSize && newSize.h) || oh;\n var canvas = document.createElement('canvas');\n canvas.width = dw;\n canvas.height = dh;\n var context = canvas.getContext('2d');\n if (!context) {\n throw Error(\"Error converting element to canvas: Can not get 2d context\");\n }\n // fill with white first to\n context.fillStyle = \"rgb(255, 255,255)\";\n context.fillRect(0, 0, dw, dh);\n context.drawImage(elem, sx, sy, sw, sh, 0, 0, // dx dy\n dw, dh);\n return canvas;\n}\nexports.elementToCanvas = elementToCanvas;\nfunction urlOrBlobToCanvas(file) {\n return new Promise(function (resolve, reject) {\n // File can also be an image element\n blueimp_load_image_1.default(file, (function (data) {\n var c = data;\n if (c) {\n resolve(c);\n }\n else {\n reject();\n }\n }), {\n canvas: true,\n orientation: true,\n crossOrigin: 'anonymous'\n });\n });\n}\nexports.urlOrBlobToCanvas = urlOrBlobToCanvas;\nfunction canvasToJpgBlob(canvas, quality) {\n return new Promise(function (resolve, reject) {\n canvas.toBlob(function (blob) {\n if (blob) {\n resolve(blob);\n }\n else {\n reject();\n }\n }, 'image/jpeg', quality);\n });\n}\nexports.canvasToJpgBlob = canvasToJpgBlob;\nexports.cadExtensions = ['.stp', '.step', '.stl', '.obj', '.glb', '.gltf'];\nfunction isCadFile(file) {\n return exports.cadExtensions.some(function (ex) { return file.name.endsWith(ex); });\n}\nexports.isCadFile = isCadFile;\nfunction isImageFile(file) {\n return file.type.startsWith('image/');\n}\nexports.isImageFile = isImageFile;\n/**\n * Measures time remaining for a promise to resolve.\n * @param promise The promise\n */\nfunction timePromise(promise) {\n return __awaiter(this, void 0, void 0, function () {\n var t1, res, t2;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n t1 = Date.now();\n return [4 /*yield*/, promise];\n case 1:\n res = _a.sent();\n t2 = Date.now();\n return [2 /*return*/, { res: res, durationSeconds: (t2 - t1) / 1000 }];\n }\n });\n });\n}\nexports.timePromise = timePromise;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nfunction __export(m) {\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\n}\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nrequire(\"blueimp-canvas-to-blob\");\nvar utils_1 = require(\"./utils\");\nvar axios_1 = __importDefault(require(\"axios\"));\n// re-export utils\n__export(require(\"./utils\"));\nvar NyrisAPI = /** @class */ (function () {\n function NyrisAPI(settings) {\n this.httpClient = axios_1.default.create();\n if (!settings.apiKey) {\n throw new Error(\"The api-key is not set.\");\n }\n this.apiKey = settings.apiKey;\n var baseUrl = settings.baseUrl || 'https://api.nyris.io';\n this.imageMatchingUrl = baseUrl + \"/find/v1\";\n this.imageMatchingUrlWithFilters = baseUrl + \"/find/v2\";\n this.cadMatchingUrl = baseUrl + \"/cad/find/v0.1\";\n this.imageMatchingUrlBySku = baseUrl + \"/recommend/v1/\";\n this.imageMatchingSubmitManualUrl = baseUrl + \"/find/v1/manual/\";\n this.feedbackUrl = baseUrl + \"/feedback/v1/\";\n this.regionProposalUrl = baseUrl + \"/find/v1/regions/\";\n this.findFilters = baseUrl + \"/find/v1/filters\";\n this.responseFormat = settings.responseFormat || 'application/offers.complete+json';\n this.maxHeight = settings.maxHeight || 500;\n this.maxWidth = settings.maxWidth || 500;\n this.jpegQuality = settings.jpegQuality || 0.92;\n this.customSearchRequest = settings.customSearchRequest;\n this.responseHook = settings.responseHook;\n this.xOptions = settings.xOptions;\n }\n NyrisAPI.prototype.prepareImage = function (canvas, cropRect) {\n return __awaiter(this, void 0, void 0, function () {\n var crop, originalSize, aspectRatio, scaledSize, resizedCroppedCanvas;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n crop = cropRect || {\n x1: 0,\n x2: 1,\n y1: 0,\n y2: 1\n };\n originalSize = utils_1.getElementSize(canvas);\n aspectRatio = utils_1.getRectAspectRatio(crop, originalSize);\n scaledSize = utils_1.getThumbSizeArea(this.maxWidth, this.maxHeight, aspectRatio);\n resizedCroppedCanvas = utils_1.elementToCanvas(canvas, scaledSize, crop);\n return [4 /*yield*/, utils_1.canvasToJpgBlob(resizedCroppedCanvas, this.jpegQuality)];\n case 1: return [2 /*return*/, _a.sent()];\n }\n });\n });\n };\n NyrisAPI.prototype.getSearchRequestHeaders = function (contentType) {\n // Create headers\n var headers = {\n 'X-Api-Key': this.apiKey,\n 'Accept-Language': 'de,*;q=0.5',\n 'Accept': this.responseFormat,\n 'Content-Type': contentType || 'application/octet-stream'\n };\n // Add options\n var xOptions = [];\n if (this.xOptions)\n xOptions.push(this.xOptions);\n if (xOptions.length > 0)\n headers['X-Options'] = xOptions.join(' ');\n return headers;\n };\n ;\n NyrisAPI.prototype.getRegionRequestHeaders = function (contentType) {\n // Create headers\n var headers = {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': contentType || 'application/octet-stream'\n };\n // Add options\n var xOptions = [];\n if (this.xOptions)\n xOptions.push(this.xOptions);\n if (xOptions.length > 0)\n headers['X-Options'] = xOptions.join(' ');\n return headers;\n };\n ;\n NyrisAPI.prototype.getParams = function (options) {\n var params = options.geoLocation ? {\n lat: options.geoLocation.lat.toString(),\n lon: options.geoLocation.lon.toString(),\n dist: options.geoLocation.dist.toString()\n } : {};\n return params;\n };\n NyrisAPI.prototype.parseCategoryPredictions = function (categoryPredictionResponse) {\n return Object.entries(categoryPredictionResponse || {}).map(function (_a) {\n var name = _a[0], score = _a[1];\n return ({\n name: name,\n score: score\n });\n }).sort(function (a, b) { return b.score - a.score; });\n };\n NyrisAPI.prototype.parseSearchResult = function (res, durationSeconds) {\n var categoryPredictions = this.parseCategoryPredictions(res.data.predicted_category);\n var codes = res.data.barcodes || [];\n var responseData = this.responseHook ? this.responseHook(res.data) : res.data;\n var results = 'offerInfos' in responseData ?\n responseData.offerInfos.map(function (r, i) {\n console.log(r);\n return (__assign(__assign({}, r), { position: i }));\n })\n : responseData.results.map(function (r, i) {\n console.log(r);\n return ({\n position: i,\n sku: r.sku,\n title: r.title,\n img: r.images && r.images[0] ? { url: r.images[0] } : undefined,\n l: r.links ? r.links.main : undefined,\n p: r.price ? { vi: parseFloat(r.price) * 100, c: r.price.split(\" \")[1] } : undefined\n });\n });\n console.log(results);\n var requestId = res.headers[\"x-matching-request\"];\n var duration = 'durationSeconds' in res.data ? res.data.durationSeconds : durationSeconds;\n return { results: results, requestId: requestId, duration: duration, categoryPredictions: categoryPredictions, codes: codes };\n };\n /**\n * Search using the experimental CAD API\n * @param file - A CAD file\n * @param options - Image search options\n * @deprecated This is a prototype API and might be removed/changed at any time.\n */\n NyrisAPI.prototype.findByCad = function (file, options) {\n return __awaiter(this, void 0, void 0, function () {\n var fileType, headers, params, _a, res, durationSeconds;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n fileType = file.type;\n headers = this.getSearchRequestHeaders(fileType);\n params = this.getParams(options);\n return [4 /*yield*/, utils_1.timePromise(this.httpClient.request({\n method: 'POST',\n url: this.cadMatchingUrl,\n data: file,\n params: params,\n headers: headers,\n responseType: 'json'\n }))];\n case 1:\n _a = _b.sent(), res = _a.res, durationSeconds = _a.durationSeconds;\n return [2 /*return*/, this.parseSearchResult(res, durationSeconds)];\n }\n });\n });\n };\n /**\n * Search for an image.\n * @param canvas Image, Video (frame) or Canvas to use use for image search.\n * @param options See [[ImageSearchOptions]].\n */\n NyrisAPI.prototype.findByImage = function (canvas, options) {\n return __awaiter(this, void 0, void 0, function () {\n var imageBytes, headers, params, bodyFormData, _a, res, durationSeconds;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.prepareImage(canvas, options.cropRect)];\n case 1:\n imageBytes = _b.sent();\n if (this.customSearchRequest)\n return [2 /*return*/, this.customSearchRequest(imageBytes, this.httpClient)];\n headers = this.getSearchRequestHeaders('image/jpeg');\n params = this.getParams(options);\n bodyFormData = new FormData();\n bodyFormData.append('image', imageBytes);\n return [4 /*yield*/, utils_1.timePromise(this.httpClient.request({\n method: 'POST',\n url: this.imageMatchingUrlWithFilters,\n data: bodyFormData,\n params: params,\n headers: headers,\n responseType: 'json'\n }))];\n case 2:\n _a = _b.sent(), res = _a.res, durationSeconds = _a.durationSeconds;\n return [2 /*return*/, this.parseSearchResult(res, durationSeconds)];\n }\n });\n });\n };\n NyrisAPI.prototype.findByImageWithFilters = function (canvas, options, filters) {\n return __awaiter(this, void 0, void 0, function () {\n var imageBytes, headers, params, selectedFilters, bodyFormData, i, j, _a, res, durationSeconds;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.prepareImage(canvas, options.cropRect)];\n case 1:\n imageBytes = _b.sent();\n if (this.customSearchRequest)\n return [2 /*return*/, this.customSearchRequest(imageBytes, this.httpClient)];\n headers = this.getSearchRequestHeaders('image/jpeg');\n params = this.getParams(options);\n selectedFilters = new Array();\n if (filters) {\n filters.forEach(function (x) {\n selectedFilters.push({ key: x.key, values: x.values });\n });\n }\n console.log(selectedFilters);\n bodyFormData = new FormData();\n bodyFormData.append('image', imageBytes);\n if (filters) {\n for (i = 0; i < selectedFilters.length; i++) {\n bodyFormData.append(\"filters[\" + i + \"].filterType\", selectedFilters[i].key);\n for (j = 0; j < selectedFilters[i].values.length; j++) {\n bodyFormData.append(\"filters[\" + i + \"].filterValues[\" + j + \"]\", selectedFilters[i].values[j]);\n }\n }\n }\n return [4 /*yield*/, utils_1.timePromise(this.httpClient.request({\n method: 'POST',\n url: this.imageMatchingUrlWithFilters,\n data: bodyFormData,\n params: params,\n headers: headers,\n responseType: 'json'\n }))];\n case 2:\n _a = _b.sent(), res = _a.res, durationSeconds = _a.durationSeconds;\n return [2 /*return*/, this.parseSearchResult(res, durationSeconds)];\n }\n });\n });\n };\n /**\n * Search by SKU (itemID)\n * @param sku The SKU or ID of the item.\n * @param mid The index ID.\n */\n NyrisAPI.prototype.findBySku = function (sku, mid) {\n return __awaiter(this, void 0, void 0, function () {\n var headers, url, r;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n headers = this.getSearchRequestHeaders();\n url = \"\" + this.imageMatchingUrlBySku + encodeURIComponent(sku) + \"/\" + encodeURIComponent(mid);\n return [4 /*yield*/, this.httpClient.get(url, { headers: headers, responseType: 'json' })];\n case 1:\n r = _a.sent();\n if (this.responseHook) {\n r = this.responseHook;\n }\n return [2 /*return*/, r];\n }\n });\n });\n };\n /**\n * Find significant sections in the image.\n * @param canvas Canvas, video or image to search with.\n * @returns A list of regions, see [[Region]].\n */\n NyrisAPI.prototype.findRegions = function (canvas) {\n return __awaiter(this, void 0, void 0, function () {\n var _a, origW, origH, scaledSize, resizedCroppedCanvas, blob, headers, response, regions;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = utils_1.getElementSize(canvas), origW = _a.w, origH = _a.h;\n scaledSize = utils_1.getThumbSizeArea(this.maxWidth, this.maxHeight, origW / origH);\n resizedCroppedCanvas = utils_1.elementToCanvas(canvas, scaledSize);\n return [4 /*yield*/, utils_1.canvasToJpgBlob(resizedCroppedCanvas, this.jpegQuality)];\n case 1:\n blob = _b.sent();\n headers = this.getRegionRequestHeaders('image/jpeg');\n return [4 /*yield*/, this.httpClient.request({\n method: 'POST',\n url: this.regionProposalUrl,\n data: blob,\n headers: headers\n })];\n case 2:\n response = _b.sent();\n regions = response.data;\n return [2 /*return*/, regions.map(function (r) { return ({\n className: r.className,\n confidence: r.confidence,\n normalizedRect: {\n x1: r.region.left / scaledSize.w,\n x2: (r.region.right / scaledSize.w),\n y1: r.region.top / scaledSize.h,\n y2: (r.region.bottom / scaledSize.h),\n }\n }); })];\n }\n });\n });\n };\n /**\n * Send feedback event.\n * @param sessionId ID of the session. Usually the first request ID returned.\n * @param requestId The request ID to submit the feedback event to.\n * @param payload See [[FeedbackEventPayload]].\n */\n NyrisAPI.prototype.sendFeedback = function (sessionId, requestId, payload) {\n return __awaiter(this, void 0, void 0, function () {\n var headers, data;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n headers = {\n 'X-Api-Key': this.apiKey,\n 'Content-Type': 'application/json'\n };\n data = __assign({ request_id: requestId, timestamp: new Date(), session_id: sessionId }, payload);\n return [4 /*yield*/, this.httpClient.request({\n method: 'POST',\n url: this.feedbackUrl,\n headers: headers,\n data: data\n })];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n NyrisAPI.prototype.getFilters = function () {\n return __awaiter(this, void 0, void 0, function () {\n var headers, url, response;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n headers = this.getSearchRequestHeaders();\n url = \"\" + this.findFilters;\n return [4 /*yield*/, this.httpClient.get(url, { headers: headers, responseType: 'json' })];\n case 1:\n response = _a.sent();\n return [2 /*return*/, response.data];\n }\n });\n });\n };\n NyrisAPI.prototype.searchFilters = function (key, value) {\n return __awaiter(this, void 0, void 0, function () {\n var headers, url, response;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n headers = this.getSearchRequestHeaders();\n url = this.findFilters + \"/\" + key + \"/\" + value;\n return [4 /*yield*/, this.httpClient.get(url, { headers: headers, responseType: 'json' })];\n case 1:\n response = _a.sent();\n return [2 /*return*/, response.data];\n }\n });\n });\n };\n return NyrisAPI;\n}());\nexports.default = NyrisAPI;\n//# sourceMappingURL=index.js.map","import {AppProps} from \"./App\";\nimport {useDropzone} from \"react-dropzone\";\nimport {\n makeStyles,\n AppBar,\n Button, Card, CardActions, CardContent,\n CardMedia, CircularProgress,\n Container,\n CssBaseline, Fab,\n Grid, Hidden,\n Link,\n Toolbar,\n Typography\n} from \"@material-ui/core\";\nimport {PhotoCamera, ArrowBack, Image} from \"@material-ui/icons\";\nimport Icon from \"@material-ui/core/Icon\";\nimport * as React from \"react\";\nimport {NodeGroup} from \"react-move\";\nimport classNames from 'classnames';\nimport {Capture, Preview} from \"@nyris/nyris-react-components\";\nimport {cadExtensions} from \"@nyris/nyris-api\";\n\n\nconst useStyles = makeStyles(theme => ({\n icon: {\n marginRight: theme.spacing(2),\n },\n heroContent: {\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(8, 0, 6),\n transition: 'all 300ms',\n overflow: 'hidden',\n height: 500\n },\n heroContentClosed: {\n height: 0,\n padding: 0\n },\n heroButtons: {\n marginTop: theme.spacing(4),\n },\n cardGrid: {\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8),\n minHeight: 600,\n overflow: 'hidden',\n transition: 'all 300ms',\n },\n cardGridCollapsed: {\n height: 0,\n opacity: 0,\n minHeight: 0,\n paddingTop: 0,\n paddingBottom: 0,\n },\n card: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n },\n cardMedia: {\n paddingTop: '56.25%', // 16:9\n backgroundSize: 'contain'\n },\n cardContent: {\n flexGrow: 1,\n paddingBottom: 0\n },\n footer: {\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6),\n },\n withElipsis: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap'\n },\n loading: {\n margin: theme.spacing(2),\n },\n fabContainer: {\n position: 'fixed',\n bottom: theme.spacing(2),\n\n },\n fab: {\n marginLeft: theme.spacing(2),\n },\n}));\n\nconst makeFileHandler = (action: any) => (e: any) => {\n let file = (e.dataTransfer && e.dataTransfer.files[0]) || e.target.files[0];\n if (e.target && e.target.value) {\n e.target.value = \"\";\n }\n\n if (file) {\n action(file);\n }\n};\n\nfunction Copyright() {\n return (\n\n <Typography variant=\"body2\" color=\"textSecondary\" align=\"center\">\n {'Powered by '}\n <Link color=\"inherit\" href=\"https://nyris.io/\" component='a' target=\"_blank\">\n nyris.io\n </Link>\n </Typography>\n );\n}\n\n\nconst AppMD: React.FC<AppProps> = ({settings, handlers, showPart, previewImage, loading, search: {results, regions, previewSelection, requestId, duration}, mdSettings}) => {\n const classes = useStyles();\n const {getRootProps, getInputProps, isDragActive} = useDropzone({onDrop: (fs: File[]) => handlers.onFileDropped(fs[0])});\n\n const minPreviewHeight = 400;\n const halfOfTheScreenHeight = Math.floor(window.innerHeight * 0.45);\n const maxPreviewHeight = Math.max(minPreviewHeight, halfOfTheScreenHeight);\n const acceptTypes =\n [ 'image/*' ].concat(\n settings.cadSearch ? cadExtensions : []\n ).join(',');\n\n return (\n <React.Fragment>\n {mdSettings.resultLinkIcon && <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" />}\n <CssBaseline/>\n {showPart === 'camera' &&\n <Capture onCaptureComplete={handlers.onCaptureComplete} onCaptureCanceled={handlers.onCaptureCanceled}\n useAppText='Use default camera app'/>}\n <AppBar position={\"relative\"} style={{backgroundColor: mdSettings.appBarCustomBackgroundColor}}>\n\n <Container maxWidth='md' style={{flexDirection: 'row', display: 'flex'}}>\n <img src={mdSettings.appBarLogoUrl} style={{height: '2em', minHeight: '64px', display: 'flex'}} alt=\"Logo\"/>\n <Toolbar component=\"span\">\n <Typography style={{color: mdSettings.appBarCustomTextColor}}>\n { mdSettings.appBarTitle }\n </Typography>\n </Toolbar>\n </Container>\n </AppBar>\n\n <main>\n <div\n className={classNames(classes.heroContent, showPart === 'results' ? classes.heroContentClosed : null)}>\n <Container maxWidth='md'>\n <div>\n <Hidden mdUp>\n <div style={{textAlign: 'center'}}>\n <PhotoCamera style={{fontSize: '20em', color: '#cccccc'}}/>\n </div>\n <div style={{textAlign: 'center'}}>\n <Button variant={\"contained\"} color={\"primary\"} onClick={handlers.onCameraClick}>Take\n a\n picture</Button>\n </div>\n <div style={{textAlign: 'center'}}>\n <Typography>\n or\n </Typography>\n </div>\n <div style={{textAlign: 'center'}}>\n <input\n accept={acceptTypes}\n id=\"raised-button-file\"\n type=\"file\"\n onChange={makeFileHandler(handlers.onSelectFile)}\n style={{width: '.1px', height: '.1px', overflow: 'hidden', opacity: 0}}\n />\n <label htmlFor=\"raised-button-file\">\n <Button variant={\"contained\"} color={\"primary\"} component=\"span\">\n Select a file\n </Button>\n </label>\n </div>\n </Hidden>\n <Hidden smDown>\n <div style={{borderStyle: 'dashed', borderWidth: 5, borderColor: isDragActive ? '#ccc' : '#eee', borderRadius: 10, padding: 10, paddingBottom: 30}}\n {...getRootProps({ onClick: e => { e.stopPropagation() }}) }>\n <div style={{textAlign: 'center'}}>\n <Image style={{fontSize: '20em', color: '#cccccc'}}/>\n </div>\n <div style={{textAlign: 'center'}}>\n <Typography variant='body2'>\n DROP AN IMAGE\n </Typography>\n </div>\n <div style={{textAlign: 'center'}}>\n <Typography variant=\"subtitle2\">\n or\n </Typography>\n </div>\n <div style={{textAlign: 'center'}}>\n <input\n accept={acceptTypes}\n id=\"raised-button-file\"\n type=\"file\"\n {...getInputProps()}\n onChange={makeFileHandler(handlers.onSelectFile)}\n style={{width: '.1px', height: '.1px', overflow: 'hidden', opacity: 0}}\n />\n <label htmlFor=\"raised-button-file\">\n <Button variant={\"contained\"} color={\"primary\"} component=\"span\">\n Select an image\n </Button>\n </label>\n </div>\n </div>\n </Hidden>\n </div>\n </Container>\n </div>\n <Container className={classNames(classes.cardGrid, showPart !== 'results' && classes.cardGridCollapsed)}\n maxWidth=\"md\">\n\n { previewImage &&\n <Card style={{marginBottom: '4em'}} raised={true}>\n <Preview key={previewImage.id}\n maxWidth={document.body.clientWidth}\n maxHeight={maxPreviewHeight}\n dotColor={mdSettings.primaryColor}\n onSelectionChange={handlers.onSelectionChange} regions={regions}\n selection={previewSelection} image={previewImage.canvas}/>\n </Card>\n }\n\n {loading && <div style={{textAlign: 'center'}}>\n <CircularProgress className={classes.loading}/>\n </div>}\n\n <Grid container spacing={4}>\n <NodeGroup data={results}\n keyAccessor={r => r.position + r.sku}\n start={(r, i) => ({opacity: 0, translateX: -100})}\n enter={(r, i) => ({\n opacity: [1],\n translateX: [0],\n timing: {delay: i * 100, duration: 300}\n })}>\n {rs =>\n <>\n {rs.map(({key, data: result, state}) =>\n <Grid item key={key} xs={12} sm={4} md={3}>\n <Card className={classes.card} style={{\n opacity: state.opacity,\n position: 'relative',\n transform: `translateX(${state.translateX}%)`\n }}>\n <CardMedia\n className={classes.cardMedia}\n image={(result.img && result.img.url) || settings.noImageUrl}\n title={result.title}\n />\n <CardContent className={classes.cardContent}>\n <Typography gutterBottom variant=\"subtitle2\" component=\"h5\"\n className={classes.withElipsis}>\n {result[mdSettings.resultFirstRowProperty]}\n </Typography>\n <Typography variant=\"body2\" className={classes.withElipsis}>\n {result[mdSettings.resultSecondRowProperty]}\n </Typography>\n </CardContent>\n {result.l &&\n <CardActions>\n <Button variant=\"outlined\" style={{marginLeft: 'auto'}}\n size=\"small\" color=\"primary\"\n onClick={() => handlers.onLinkClick(result.position, result.l)}\n onAuxClick={() => handlers.onLinkClick(result.position, result.l)} >\n { mdSettings.resultLinkIcon && <React.Fragment>\n <Icon>{ mdSettings.resultLinkIcon }</Icon>\n {' '}\n </React.Fragment> }\n {mdSettings.resultLinkText}\n </Button>\n </CardActions>\n }\n </Card>\n </Grid>\n )}\n </>\n }\n\n </NodeGroup>\n\n </Grid>\n\n {results.length === 0 && showPart === 'results' && !loading && (\n <Typography variant=\"h3\" align=\"center\">We did not find anything</Typography>\n )}\n\n\n </Container>\n {showPart !== 'start' &&\n <Container maxWidth='lg'>\n <div className={classes.fabContainer}>\n <Fab aria-label='back' className={classes.fab} color='primary' onClick={handlers.onShowStart}>\n <ArrowBack/>\n </Fab>\n </div>\n </Container>\n }\n\n </main>\n\n <footer className={classes.footer}>\n\n <Typography variant=\"subtitle1\" align=\"center\" color=\"textSecondary\">\n {requestId && showPart === 'results' && <div style={{textAlign: 'center', fontSize: '0.7em', paddingTop: '0.8em'}}>Request\n identifier {requestId}</div>}\n </Typography>\n <Copyright/>\n </footer>\n </React.Fragment>\n );\n};\n\nexport default AppMD;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(\n (process as { env: { [key: string]: string } }).env.PUBLIC_URL,\n window.location.href\n );\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { CanvasWithId } from \"../types\";\nimport {\n Code,\n RectCoords,\n Region,\n selectFirstCenteredRegion,\n Filter,\n} from \"@nyris/nyris-api\";\n\nexport type ImageSourceType =\n | { url: string }\n | { file: File }\n | { image: HTMLCanvasElement };\n\nexport type SearchAction =\n | { type: \"FEEDBACK_SUBMIT_POSITIVE\" }\n | { type: \"FEEDBACK_SUBMIT_NEGATIVE\" }\n | { type: \"IMAGE_LOADED\"; image: CanvasWithId }\n | { type: \"REGION_REQUEST_START\"; image: HTMLCanvasElement }\n | { type: \"REGION_REQUEST_SUCCEED\"; regions: Region[] }\n | { type: \"REGION_REQUEST_FAIL\"; reason: string; exception: any }\n | {\n type: \"SEARCH_REQUEST_START\";\n image: HTMLCanvasElement;\n normalizedRect?: RectCoords;\n selectedFilters?: Filter[];\n }\n | { type: \"SEARCH_REQUEST_START\"; file: File }\n | {\n type: \"SEARCH_REQUEST_SUCCEED\";\n results: any[];\n requestId: string;\n duration: number;\n categoryPredictions: CategoryPrediction[];\n codes: Code[];\n }\n | { type: \"SEARCH_REQUEST_FAIL\"; reason: string; exception?: any }\n | { type: \"REGION_CHANGED\"; normalizedRect: RectCoords }\n | ({ type: \"LOAD_IMAGE\" } & ImageSourceType)\n | { type: \"LOAD_FILE\"; file: File }\n | { type: \"CAD_LOADED\"; file: File }\n | { type: \"LOAD_FILTERS\" }\n | { type: \"LOAD_FILTERS_SUCCESS\"; filters: Filter[] }\n | { type: \"LOAD_FILTERS_FAIL\"; reason: string; exception: any }\n | { type: \"ADD_TO_SELECTEDFILTERS\"; key: string; value: string }\n | { type: \"REMOVE_FROM_SELECTEDFILTERS\"; key: string; value: string }\n | { type: \"CLEAR_SELECTED_FILTERS\" }\n | { type: \"SEARCH_FILTERS\"; key: string; value: string }\n | { type: \"FILTER_CHANGED\" }\n | { type: \"FILTER_CHANGED_FAIL\" }\n | { type: \"CLEAR_REQUEST_IMAGE\" }\n | { type: \"UPDATE_FILTERS\"; key: string; values: string[] };\n\ninterface CategoryPrediction {\n name: string;\n score: number;\n}\n\nexport interface SearchState {\n results: any[];\n duration?: number;\n requestId?: string;\n sessionId?: string;\n regions: Region[];\n selectedRegion: RectCoords;\n fetchingRegions: boolean;\n fetchingResults: boolean;\n filterOptions: string[];\n requestImage?: CanvasWithId;\n requestCadFile?: File;\n categoryPredictions: CategoryPrediction[];\n codes: Code[];\n errorMessage: string;\n filters: Filter[];\n selectedFilters: Map<string, string[]>;\n}\n\nconst initialState: SearchState = {\n results: [],\n regions: [],\n selectedRegion: { x1: 0.1, x2: 0.9, y1: 0.1, y2: 0.9 },\n requestImage: undefined,\n fetchingResults: false,\n fetchingRegions: false,\n filterOptions: [],\n categoryPredictions: [],\n codes: [],\n errorMessage: \"\",\n filters: [],\n selectedFilters: new Map<string, string[]>(),\n};\n\nexport const loadFile = (file: File): SearchAction => ({\n type: \"LOAD_FILE\",\n file,\n});\nexport const loadUrl = (url: string): SearchAction => ({\n type: \"LOAD_IMAGE\",\n url,\n});\nexport const loadCanvas = (image: HTMLCanvasElement): SearchAction => ({\n type: \"LOAD_IMAGE\",\n image,\n});\nexport const imageLoaded = (\n image: HTMLCanvasElement,\n id: string\n): SearchAction => ({ type: \"IMAGE_LOADED\", image: { canvas: image, id: id } });\nexport const cadFileLoaded = (file: File, id: string): SearchAction => ({\n type: \"CAD_LOADED\",\n file,\n});\nexport const selectionChanged = (normalizedRect: RectCoords): SearchAction => ({\n type: \"REGION_CHANGED\",\n normalizedRect,\n});\nexport const searchRegions = (image: HTMLCanvasElement): SearchAction => ({\n type: \"REGION_REQUEST_START\",\n image,\n});\nexport const searchOffersForImage = (\n image: HTMLCanvasElement,\n normalizedRect?: RectCoords\n): SearchAction => ({\n type: \"SEARCH_REQUEST_START\",\n image,\n normalizedRect,\n});\nexport const searchOffersForCad = (file: File): SearchAction => ({\n type: \"SEARCH_REQUEST_START\",\n file,\n});\nexport const submitPositiveFeedback = (): SearchAction => ({\n type: \"FEEDBACK_SUBMIT_POSITIVE\",\n});\nexport const submitNegativeFeedback = (): SearchAction => ({\n type: \"FEEDBACK_SUBMIT_NEGATIVE\",\n});\nexport const loadFilters = (): SearchAction => ({ type: \"LOAD_FILTERS\" });\nexport const addToSelectedFilters = (\n key: string,\n value: string\n): SearchAction => ({ type: \"ADD_TO_SELECTEDFILTERS\", key, value });\nexport const removeFromSelectedFilters = (\n key: string,\n value: string\n): SearchAction => ({ type: \"REMOVE_FROM_SELECTEDFILTERS\", key, value });\nexport const clearAllSelectedFilters = () => ({\n type: \"CLEAR_SELECTED_FILTERS\",\n});\nexport const searchFilters = (key: string, value: string): SearchAction => ({\n type: \"SEARCH_FILTERS\",\n key,\n value,\n});\nexport const filterChanged = (): SearchAction => ({ type: \"FILTER_CHANGED\" });\nexport const clearRequestImage = (): SearchAction => ({\n type: \"CLEAR_REQUEST_IMAGE\",\n});\n\nexport const reducer = (\n state: SearchState = initialState,\n action: SearchAction\n) => {\n switch (action.type) {\n case \"IMAGE_LOADED\":\n let { image } = action;\n console.log(\"image\", image);\n return {\n ...initialState,\n requestImage: image,\n selectedFilters: state.selectedFilters,\n };\n case \"CAD_LOADED\":\n let { file } = action;\n return {\n ...initialState,\n requestCadFile: file,\n };\n case \"REGION_REQUEST_START\":\n return {\n ...state,\n fetchingRegions: true,\n };\n case \"REGION_REQUEST_SUCCEED\":\n return {\n ...state,\n fetchingRegions: false,\n regions: action.regions,\n selectedRegion: selectFirstCenteredRegion(\n action.regions,\n 0.3,\n state.selectedRegion\n ),\n };\n case \"REGION_REQUEST_FAIL\":\n return {\n ...state,\n fetchingRegions: false,\n errorMessage: action.exception.response.data.detail,\n };\n case \"SEARCH_REQUEST_START\":\n return {\n ...state,\n fetchingResults: true,\n };\n case \"SEARCH_REQUEST_SUCCEED\":\n let { results, requestId, duration, categoryPredictions, codes } = action;\n return {\n ...state,\n results,\n requestId,\n fetchingResults: false,\n sessionId: state.sessionId || requestId,\n categoryPredictions,\n codes,\n duration,\n };\n case \"SEARCH_REQUEST_FAIL\":\n return {\n ...state,\n fetchingResults: false,\n errorMessage: action.reason,\n };\n case \"REGION_CHANGED\":\n return {\n ...state,\n selectedRegion: action.normalizedRect,\n };\n case \"LOAD_FILTERS_SUCCESS\":\n return {\n ...state,\n filters: action.filters,\n };\n case \"LOAD_FILTERS_FAIL\":\n return {\n ...state,\n errorMessage: action.exception.response.data.detail,\n };\n case \"ADD_TO_SELECTEDFILTERS\":\n return {\n ...state,\n selectedFilters: ADDtoSelectedfilters(\n state.selectedFilters,\n action.key,\n action.value\n ),\n };\n case \"REMOVE_FROM_SELECTEDFILTERS\":\n return {\n ...state,\n selectedFilters: RemoveFromSelectedFilters(\n state.selectedFilters,\n action.key,\n action.value\n ),\n };\n case \"CLEAR_SELECTED_FILTERS\":\n return {\n ...state,\n selectedFilters: new Map<string, string[]>(),\n };\n case \"CLEAR_REQUEST_IMAGE\":\n return {\n ...state,\n requestImage: undefined,\n };\n case \"UPDATE_FILTERS\":\n return {\n ...state,\n filters: UpdateFilters(state.filters, action.key, action.values),\n };\n }\n return state;\n};\n\nfunction ADDtoSelectedfilters(\n selectedFilters: Map<string, string[]>,\n key: string,\n value: string\n): Map<string, string[]> {\n if (selectedFilters) {\n let values = selectedFilters.get(key);\n if (values) {\n values.push(value);\n } else {\n values = new Array<string>(value);\n }\n selectedFilters.set(key, values);\n }\n console.log(selectedFilters);\n return selectedFilters;\n}\n\nfunction RemoveFromSelectedFilters(\n selectedFilters: Map<string, string[]>,\n key: string,\n value: string\n): Map<string, string[]> {\n if (selectedFilters) {\n let values = selectedFilters.get(key);\n if (values) {\n values = values.filter((x) => x !== value);\n selectedFilters.set(key, values);\n }\n }\n console.log(selectedFilters);\n return selectedFilters;\n}\n\nfunction UpdateFilters(filters: Filter[], key: string, values: string[]) {\n console.log(filters);\n console.log(key);\n console.log(values);\n console.log(filters.find((x) => x.key === key));\n if (filters && filters.length > 0 && filters.find((x) => x.key === key)) {\n let idx = filters.findIndex((x) => x.key === key);\n filters[idx].values = values;\n console.log(filters);\n }\n\n return filters;\n}\n","import { AppAction } from \"../types\";\n\nexport type NyrisAppPart = \"start\" | \"camera\" | \"results\";\nexport type NyrisFeedbackState =\n | \"hidden\"\n | \"question\"\n | \"positive\"\n | \"negative\";\n\nexport interface NyrisAppState {\n showPart: NyrisAppPart;\n feedbackState: NyrisFeedbackState;\n}\n\nexport type NyrisAction =\n | { type: \"SHOW_START\" }\n | { type: \"SHOW_CAMERA\" }\n | { type: \"SHOW_RESULTS\" }\n | { type: \"SHOW_FEEDBACK\" }\n | { type: \"HIDE_FEEDBACK\" }\n | { type: \"RESULT_LINK_CLICKED\"; position: number; url: string }\n | { type: \"RESULT_IMAGE_CLICKED\"; position: number; url: string };\n\nexport const showCamera = (): NyrisAction => ({ type: \"SHOW_CAMERA\" });\nexport const showStart = (): NyrisAction => ({ type: \"SHOW_START\" });\nexport const showResults = (): NyrisAction => ({ type: \"SHOW_RESULTS\" });\nexport const showFeedback = (): NyrisAction => ({ type: \"SHOW_FEEDBACK\" });\nexport const hideFeedback = (): NyrisAction => ({ type: \"HIDE_FEEDBACK\" });\n\nconst initialNyrisState: NyrisAppState = {\n showPart: \"start\",\n feedbackState: \"hidden\",\n};\n\nexport function reducer(\n state: NyrisAppState = initialNyrisState,\n action: AppAction\n): NyrisAppState {\n switch (action.type) {\n case \"SHOW_START\":\n return {\n ...state,\n showPart: \"start\",\n };\n case \"SHOW_CAMERA\":\n return {\n ...state,\n showPart: \"camera\",\n };\n case \"SEARCH_REQUEST_START\":\n case \"REGION_REQUEST_START\":\n case \"SHOW_RESULTS\":\n return {\n ...state,\n showPart: \"results\",\n };\n case \"SHOW_FEEDBACK\":\n return {\n ...state,\n feedbackState: \"question\",\n };\n case \"HIDE_FEEDBACK\":\n return {\n ...state,\n feedbackState: \"hidden\",\n };\n case \"FEEDBACK_SUBMIT_POSITIVE\":\n return {\n ...state,\n feedbackState: \"positive\",\n };\n case \"FEEDBACK_SUBMIT_NEGATIVE\":\n return {\n ...state,\n feedbackState: \"negative\",\n };\n default:\n return state;\n }\n}\n","import {WH} from \"@nyris/nyris-api\";\n\n/**\n * Gets url parameter values by name.\n * @param name The parameter name.\n * @returns string value if it has value assigned with `=`, true if it is specified but without value or `undefined` if not present\n */\nexport function getUrlParam(name: string): string | boolean | undefined {\n let results = new RegExp(`[?&]${name}(=([^&#]*))?(&|$|#)`, 'i')\n .exec(window.location.href);\n if (results && results[2]) { // has value\n console.log('has value', name, results[2]);\n return decodeURIComponent(results[2]);\n }\n return (results && true) // present but without value\n || undefined; // not present\n}\n\nexport function getThumbSizeLongestEdge(maxW: number, maxH: number, iW: number, iH: number): WH {\n let iR = iW / iH;\n let dR = maxW / maxH;\n if (dR > iR) {\n return {\n w: iW * maxH / iH,\n h: maxH\n }\n }\n return {\n w: maxW,\n h: iH * maxW / iW\n }\n}\n\nexport function capitalizeFirstLetter(val: string) {\n return val.charAt(0).toUpperCase() + val.slice(1);\n }\n \n\n","import {AppSettings} from \"./types\";\n\nexport const defaultSettings : AppSettings = {\n\n xOptions: false,\n apiKey: 'UNSET',\n exampleImages: [],\n preview: true,\n regions: false,\n maxWidth: 500,\n maxHeight: 500,\n jpegQuality: 0.92,\n baseUrl: 'https://api.nyris.io',\n instantRedirectPatterns: [\n '^https?://(www.)?youtube.com/',\n '^https?://(www.)?youtu.be/',\n '^https?://(www.)?vimeo.com/',\n '^https?://(www.)?dailymotion.com/',\n '^https?://(www.)?dai.ly/'\n ]\n};\n\nexport const defaultMdSettings = {\n appBarLogoUrl: 'images/nyris-logo.svg',\n appBarCustomBackgroundColor: '#f4f4f4',\n appBarCustomTextColor: '#ccc',\n appBarTitle: '',\n primaryColor: '#e2001a',\n secondaryColor: '#777777',\n\n resultFirstRowProperty: 'title',\n resultSecondRowProperty: 'sku',\n resultLinkText: 'Info',\n\n customFontFamily: 'Helvetica',\n};\n","import {combineEpics, ofType} from \"redux-observable\";\nimport {debounceTime, ignoreElements, tap, withLatestFrom} from \"rxjs/operators\";\nimport {EpicConf} from \"./types\";\n\nconst feedbackSuccessEpic: EpicConf = (action$, state$, {api}) => action$.pipe(\n ofType('FEEDBACK_SUBMIT_POSITIVE', \"FEEDBACK_SUBMIT_NEGATIVE\"),\n withLatestFrom(state$),\n tap(async ([{type}, state]) => {\n const success = type === 'FEEDBACK_SUBMIT_POSITIVE';\n const sessionId = state.search.sessionId || state.search.requestId;\n if (sessionId && state.search.requestId) {\n await api.sendFeedback(sessionId, state.search.requestId, {\n event: 'feedback', data: {success}\n });\n }\n }),\n ignoreElements()\n);\n\nconst feedbackRegionEpic: EpicConf = (action$, state$, {api}) => action$.pipe(\n ofType('REGION_CHANGED'),\n debounceTime(1200),\n withLatestFrom(state$),\n tap(async ([action, state]) => {\n if (action.type === 'REGION_CHANGED') {\n let {normalizedRect: {x1, x2, y1, y2}} = action;\n const sessionId = state.search.sessionId || state.search.requestId;\n if (sessionId && state.search.requestId) {\n await api.sendFeedback(sessionId, state.search.requestId, {\n event: 'region', data: {rect: {x: x1, y: y1, w: x2 - x1, h: y2 - y1}}\n });\n }\n }\n }),\n ignoreElements()\n);\n\nconst feedbackClickEpic: EpicConf = (action$, state$, {api}) => action$.pipe(\n ofType('RESULT_LINK_CLICKED', 'RESULT_IMAGE_CLICKED'),\n withLatestFrom(state$),\n tap(async ([action, state]) => {\n if (action.type === 'RESULT_LINK_CLICKED' || action.type === 'RESULT_IMAGE_CLICKED') {\n let {position} = action;\n const sessionId = state.search.sessionId || state.search.requestId;\n if (sessionId && state.search.requestId) {\n await api.sendFeedback(sessionId, state.search.requestId, {\n event: 'click', data: {positions: [position]}\n });\n }\n }\n }),\n ignoreElements()\n);\n\nexport default combineEpics(\n feedbackSuccessEpic,\n feedbackRegionEpic,\n feedbackClickEpic\n);\n","import { EpicConf } from \"./types\";\nimport { combineEpics, ofType } from \"redux-observable\";\nimport { switchMap, withLatestFrom } from \"rxjs/operators\";\nimport { AppAction } from \"../types\";\nimport {\n ImageSearchOptions,\n urlOrBlobToCanvas,\n isCadFile,\n isImageFile,\n Filter,\n} from \"@nyris/nyris-api\";\nimport { imageLoaded, cadFileLoaded } from \"../actions/searchActions\";\n\nconst imageSearch: EpicConf = (action$, state$, { api }) =>\n action$.pipe(\n ofType(\"SEARCH_REQUEST_START\"),\n withLatestFrom(state$),\n switchMap(async ([action, state]): Promise<AppAction> => {\n if (action.type !== \"SEARCH_REQUEST_START\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n if (\"image\" in action) {\n let { image, normalizedRect } = action;\n\n // refactor this\n let selectedFilters = new Array<Filter>();\n if (state.search.selectedFilters.size > 0) {\n state.search.selectedFilters.forEach((values, key) => {\n if (values && values.length > 0) {\n let filterObj: Filter = {\n key: key,\n values: values,\n };\n selectedFilters.push(filterObj);\n }\n });\n }\n\n let options: ImageSearchOptions = {\n cropRect: normalizedRect,\n };\n\n try {\n if (selectedFilters && selectedFilters.length > 0) {\n console.log(\"With Filters\");\n const { results, duration, requestId, categoryPredictions, codes } =\n await api.findByImageWithFilters(image, options, selectedFilters);\n return {\n type: \"SEARCH_REQUEST_SUCCEED\",\n results,\n requestId,\n duration,\n categoryPredictions,\n codes,\n };\n } else {\n console.log(\"Without Filters\");\n const { results, duration, requestId, categoryPredictions, codes } =\n await api.findByImage(image, options);\n return {\n type: \"SEARCH_REQUEST_SUCCEED\",\n results,\n requestId,\n duration,\n categoryPredictions,\n codes,\n };\n }\n } catch (e) {\n console.warn(\"search failed\", e);\n return {\n type: \"SEARCH_REQUEST_FAIL\",\n reason: e.message,\n exception: e,\n };\n }\n }\n\n if (\"file\" in action) {\n console.log(\"file\");\n let { file } = action;\n\n let options: ImageSearchOptions = {};\n\n try {\n const { results, duration, requestId, categoryPredictions, codes } =\n await api.findByCad(file, options);\n return {\n type: \"SEARCH_REQUEST_SUCCEED\",\n results,\n requestId,\n duration,\n categoryPredictions,\n codes,\n };\n } catch (e) {\n console.warn(\"search failed\", e);\n return {\n type: \"SEARCH_REQUEST_FAIL\",\n reason: e.message,\n exception: e,\n };\n }\n }\n throw new Error(`Wrong action content ${action}`);\n })\n );\n\nconst regionSearch: EpicConf = (action$, state$, { api }) =>\n action$.pipe(\n ofType(\"REGION_REQUEST_START\"),\n withLatestFrom(state$),\n switchMap(async ([action, { settings }]): Promise<AppAction> => {\n if (action.type !== \"REGION_REQUEST_START\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n\n let { image } = action;\n\n try {\n let regions = await api.findRegions(image);\n return { type: \"REGION_REQUEST_SUCCEED\", regions };\n } catch (e) {\n console.error(e);\n return { type: \"REGION_REQUEST_FAIL\", reason: e.message, exception: e };\n }\n })\n );\n\nconst loadFile: EpicConf = (action$) =>\n action$.pipe(\n ofType(\"LOAD_FILE\"),\n switchMap(async (action): Promise<AppAction> => {\n if (action.type !== \"LOAD_FILE\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n const randomId = Math.random().toString();\n if (\"file\" in action) {\n const file = action.file;\n if (isImageFile(file)) {\n return imageLoaded(await urlOrBlobToCanvas(file), randomId);\n }\n if (isCadFile(file)) {\n return cadFileLoaded(file, randomId);\n }\n }\n throw new Error(\n `LOAD_FILE action wrong properties ${Object.keys(action).join(\",\")}`\n );\n })\n );\n\nconst loadImage: EpicConf = (action$) =>\n action$.pipe(\n ofType(\"LOAD_IMAGE\"),\n switchMap(async (action): Promise<AppAction> => {\n if (action.type !== \"LOAD_IMAGE\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n const randomId = Math.random().toString();\n if (\"url\" in action) {\n return imageLoaded(await urlOrBlobToCanvas(action.url), randomId);\n }\n if (\"file\" in action) {\n return imageLoaded(await urlOrBlobToCanvas(action.file), randomId);\n }\n if (\"image\" in action) {\n return imageLoaded(action.image, randomId);\n }\n throw new Error(\n `LOAD_IMAGE action wrong properties ${Object.keys(action).join(\",\")}`\n );\n })\n );\n\nconst loadFilters: EpicConf = (action$, state$, { api }) =>\n action$.pipe(\n ofType(\"LOAD_FILTERS\"),\n withLatestFrom(state$),\n switchMap(async ([action, state]): Promise<AppAction> => {\n if (action.type !== \"LOAD_FILTERS\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n try {\n // use find filters\n\n let filters = await api.getFilters();\n\n filters = filters.slice(0, 3);\n console.log(filters);\n return { type: \"LOAD_FILTERS_SUCCESS\", filters };\n } catch (e) {\n console.error(e);\n return { type: \"LOAD_FILTERS_FAIL\", reason: e.message, exception: e };\n }\n })\n );\n\nconst searchFilters: EpicConf = (action$, state$, { api }) =>\n action$.pipe(\n ofType(\"SEARCH_FILTERS\"),\n withLatestFrom(state$),\n switchMap(async ([action, state]): Promise<AppAction> => {\n if (action.type !== \"SEARCH_FILTERS\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n try {\n // use find filters\n let { key, value } = action;\n let values: string[] = [];\n if (value) {\n let response = await api.searchFilters(key, value);\n if (response && response.length > 0) {\n values = values.concat(await api.searchFilters(key, value));\n }\n } else {\n // if no value load default values in search\n let defaultfilters = await api.getFilters();\n let filter = defaultfilters.find((x) => x.key === key);\n if (filter && filter.values && filter.values.length > 0) {\n values = filter.values;\n }\n }\n return { type: \"UPDATE_FILTERS\", key, values };\n } catch (e) {\n console.error(e);\n return { type: \"LOAD_FILTERS_FAIL\", reason: e.message, exception: e };\n }\n })\n );\n\nexport default combineEpics(\n imageSearch,\n regionSearch,\n loadFile,\n loadImage,\n loadFilters,\n searchFilters\n);\n","import { combineEpics, ofType } from \"redux-observable\";\nimport {\n debounceTime,\n delay,\n ignoreElements,\n map,\n switchMap,\n tap,\n withLatestFrom,\n} from \"rxjs/operators\";\nimport { showFeedback, showResults } from \"../actions/nyrisAppActions\";\nimport { EpicConf } from \"./types\";\nimport feedbackEpics from \"./feedback\";\nimport searchEpics from \"./search\";\nimport {\n searchOffersForImage,\n searchOffersForCad,\n searchRegions,\n} from \"../actions/searchActions\";\nimport { AppAction } from \"../types\";\nimport { selectFirstCenteredRegion } from \"@nyris/nyris-api\";\n\nconst historyEpic: EpicConf = (action$, state$, { history }) =>\n action$.pipe(\n ofType(\"SHOW_RESULTS\", \"SHOW_START\"),\n withLatestFrom(state$),\n tap(([action, state]) => {\n let { type } = action;\n console.log(\"action\");\n console.log(state.search.selectedFilters);\n // action to clear all filters\n if (type === \"SHOW_RESULTS\" && history.location.pathname !== \"/results\") {\n history.push(\"/results\");\n }\n if (type === \"SHOW_START\" && history.location.pathname !== \"/\") {\n history.goBack();\n }\n }),\n ignoreElements()\n );\n\nconst onSearchSuccessShowResults: EpicConf = (action$) =>\n action$.pipe(ofType(\"SEARCH_REQUEST_SUCCEED\"), map(showResults));\n\nconst onSearchSuccessRedirectToSite: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"SEARCH_REQUEST_SUCCEED\"),\n withLatestFrom(state$),\n tap(([action, { settings }]) => {\n if (\n action.type !== \"SEARCH_REQUEST_SUCCEED\" ||\n !action.results ||\n action.results.length !== 1\n ) {\n return;\n }\n\n const firstLink = action.results[0].l;\n const instantRedirectPatterns = settings.instantRedirectPatterns;\n if (!instantRedirectPatterns.find((r) => new RegExp(r).test(firstLink))) {\n return;\n }\n window.location.href = firstLink;\n }),\n ignoreElements()\n );\n\nconst onSearchSuccessShowFeedbackDelayed: EpicConf = (action$) =>\n action$.pipe(\n ofType(\"SEARCH_REQUEST_SUCCEED\"),\n delay(3000),\n map(showFeedback)\n );\n\nconst startSearchOnImageLoaded: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"IMAGE_LOADED\"),\n withLatestFrom(state$),\n switchMap(async ([action, { settings }]): Promise<AppAction> => {\n if (action.type !== \"IMAGE_LOADED\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n\n let { image } = action;\n\n if (settings.regions) {\n return searchRegions(image.canvas);\n }\n return searchOffersForImage(image.canvas);\n })\n );\n\nconst startSearchOnCadLoaded: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"CAD_LOADED\"),\n withLatestFrom(state$),\n switchMap(async ([action, { settings }]): Promise<AppAction> => {\n if (action.type !== \"CAD_LOADED\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n let { file } = action;\n return searchOffersForCad(file);\n })\n );\n\nconst startSearchOnRegionsSuccessful: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"REGION_REQUEST_SUCCEED\"),\n withLatestFrom(state$),\n switchMap(\n async ([\n action,\n {\n search: { requestImage },\n },\n ]): Promise<AppAction> => {\n if (action.type !== \"REGION_REQUEST_SUCCEED\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n if (!requestImage) {\n throw new Error(`No requestImage`);\n }\n let { regions } = action;\n\n let selection = selectFirstCenteredRegion(regions, 0.3, {\n x1: 0,\n x2: 1,\n y1: 0,\n y2: 1,\n });\n return searchOffersForImage(requestImage.canvas, selection);\n }\n )\n );\n\nconst startSearchOnRegionsFailed: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"REGION_REQUEST_FAIL\"),\n withLatestFrom(state$),\n switchMap(\n async ([\n action,\n {\n search: { requestImage },\n },\n ]): Promise<AppAction> => {\n if (action.type !== \"REGION_REQUEST_FAIL\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n if (!requestImage) {\n throw new Error(`No requestImage`);\n }\n\n return searchOffersForImage(requestImage.canvas);\n }\n )\n );\n\nconst startSearchOnRegionChange: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"REGION_CHANGED\"),\n debounceTime(1200),\n withLatestFrom(state$),\n switchMap(\n async ([\n action,\n {\n search: { requestImage },\n },\n ]): Promise<AppAction> => {\n if (action.type !== \"REGION_CHANGED\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n if (!requestImage) {\n throw new Error(`No requestImage`);\n }\n let { normalizedRect } = action;\n return searchOffersForImage(requestImage.canvas, normalizedRect);\n }\n )\n );\n\nconst startSearchOnFilterChange: EpicConf = (action$, state$) =>\n action$.pipe(\n ofType(\"FILTER_CHANGED\"),\n withLatestFrom(state$),\n switchMap(\n async ([\n action,\n {\n search: { requestImage },\n },\n ]): Promise<AppAction> => {\n if (action.type !== \"FILTER_CHANGED\") {\n throw new Error(`Wrong action type ${action.type}`);\n }\n if (requestImage) {\n return searchOffersForImage(requestImage.canvas);\n } else {\n return { type: \"FILTER_CHANGED_FAIL\" };\n }\n }\n )\n );\n\n//const startSearchOnClearingAllFilters:\n\nconst rootEpic = combineEpics(\n searchEpics,\n feedbackEpics,\n historyEpic,\n startSearchOnImageLoaded,\n startSearchOnCadLoaded,\n startSearchOnRegionsSuccessful,\n startSearchOnRegionsFailed,\n startSearchOnRegionChange,\n onSearchSuccessShowResults,\n onSearchSuccessShowFeedbackDelayed,\n onSearchSuccessRedirectToSite,\n startSearchOnFilterChange\n);\n\nexport default rootEpic;\n","import React from \"react\";\nimport { OfferNyrisResult as ResultData } from \"@nyris/nyris-api\";\n\n// TODO this needs refactoring: Make it one block with parameters for first line, second line, image url ..\n\ninterface Options {\n result: any;\n noImageUrl: string;\n onImageClick: (e: React.MouseEvent) => void;\n onLinkClick: (e: React.MouseEvent) => void;\n}\n\nconst renderPrice = (result: ResultData) =>\n result.p ? \"\" + (result.p.vi / 100).toFixed(2) + \" \" + result.p.c : \"\";\n\nconst renderDefault = ({\n result,\n noImageUrl,\n onImageClick,\n onLinkClick,\n}: Options) => {\n return (\n <>\n <a\n href={result.l}\n className=\"imageLink\"\n title=\"Click the image so see similar products\"\n onClick={onImageClick}\n onAuxClick={onLinkClick}\n >\n <div className=\"prdctImg\">\n <div className=\"imgWrap\">\n <img\n src={(result.img && result.img.url + \"?r=512x512\") || noImageUrl}\n alt={result.title}\n />\n </div>\n </div>\n </a>\n <div className=\"prdctDetailsWrap\">\n <div>\n <div className=\"prdctTitle\">{result.title}</div>\n <div className=\"prdctMeta\">\n <span className=\"prdctPrice\">{renderPrice(result)}</span>\n </div>\n <a\n onClick={onLinkClick}\n onAuxClick={onLinkClick}\n className=\"prdctShopLink\"\n href={result.l}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Buy Now\n </a>\n </div>\n </div>\n </>\n );\n};\n\nconst renderSnr = ({\n result,\n noImageUrl,\n onImageClick,\n onLinkClick,\n}: Options) => (\n <>\n <a\n href={result.l}\n className=\"imageLink\"\n onClick={onImageClick}\n onAuxClick={onLinkClick}\n >\n <div className=\"prdctImg\">\n <div className=\"imgWrap\">\n <img\n src={(result.img && result.img.url + \"?r=512x512\") || noImageUrl}\n alt={result.title}\n />\n </div>\n </div>\n </a>\n <div className=\"prdctDetailsWrap\">\n <div>\n <div className=\"prdctTitle\">{result.sku}</div>\n <div\n className=\"prdctMeta\"\n style={{ height: \"5em\", whiteSpace: \"normal\" }}\n >\n {result.title}\n </div>\n <a\n style={{ backgroundImage: \"none\", paddingLeft: \"10px\" }}\n className=\"prdctShopLink\"\n href={result.l}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onLinkClick}\n onAuxClick={onLinkClick}\n >\n Info\n </a>\n </div>\n </div>\n </>\n);\n\nconst renderSnrMultilink = (\n { result, noImageUrl, onImageClick }: Options,\n onLinkClick: (url: string) => void\n) => (\n <>\n <a\n href={result.l}\n className=\"imageLink\"\n onClick={onImageClick}\n onAuxClick={onImageClick}\n >\n <div className=\"prdctImg\">\n <div className=\"imgWrap\">\n <img\n src={(result.img && result.img.url + \"?r=512x512\") || noImageUrl}\n alt={result.title}\n />\n </div>\n </div>\n </a>\n <div className=\"prdctDetailsWrap\">\n <div>\n <div className=\"prdctTitle\">{result.sku}</div>\n <div\n className=\"prdctMeta\"\n style={{ height: \"5em\", whiteSpace: \"normal\" }}\n >\n {result.title}\n </div>\n {result.l.map((l: { text: string; href: string }) => (\n <a\n style={{ backgroundImage: \"none\", paddingLeft: \"10px\" }}\n className=\"prdctShopLink\"\n href={l.href}\n onClick={() => onLinkClick(l.href)}\n onAuxClick={() => onLinkClick(l.href)}\n target=\"_blank\"\n key={l.href}\n rel=\"noopener noreferrer\"\n >\n {l.text}\n </a>\n ))}\n </div>\n </div>\n </>\n);\n\nexport interface ResultProps {\n result: any;\n style: any;\n template?: string;\n onImageClick: (pos: number, url: string) => void;\n onLinkClick: (pos: number, url: string) => void;\n noImageUrl?: string;\n}\n\nconst Result: React.FC<ResultProps> = ({\n result,\n style,\n template,\n onImageClick,\n onLinkClick,\n noImageUrl,\n}) => {\n let options: Options = {\n onImageClick: (e: React.MouseEvent) => {\n e.preventDefault();\n onImageClick(result.position, result.img.url);\n },\n onLinkClick: (e: React.MouseEvent) => {\n e.preventDefault();\n onLinkClick(result.position, result.l);\n },\n noImageUrl: noImageUrl || \"images/ic_cam_large_noimage.png\",\n result,\n };\n\n let resultInner = null;\n switch (template) {\n case \"snr\":\n resultInner = renderSnr(options);\n break;\n case \"snr-multilink\":\n resultInner = renderSnrMultilink(options, (url) =>\n onLinkClick(result.position, url)\n );\n break;\n case \"default\":\n default:\n resultInner = renderDefault(options);\n break;\n }\n\n return (\n <div className=\"prdctItem\" style={{ ...style }}>\n {resultInner}\n </div>\n );\n};\n\nexport default Result;\n","import React, { useEffect, useState } from \"react\";\nimport { Filter } from \"@nyris/nyris-api\";\nimport {\n addToSelectedFilters,\n removeFromSelectedFilters,\n filterChanged,\n searchFilters,\n} from \"../actions/searchActions\";\nimport { useDispatch } from \"react-redux\";\nimport { RiArrowDropUpLine, RiArrowDropDownLine } from \"react-icons/ri\";\nimport { capitalizeFirstLetter } from \"../utils\";\nimport { AiOutlineSearch } from \"react-icons/ai\";\n\ninterface FilterProps {\n filter: Filter;\n selectedValues?: string[];\n}\n\nconst FiltersList: React.FC<FilterProps> = ({ filter, selectedValues }) => {\n const dispatch = useDispatch();\n const [isCollapsed, setIsCollapsed] = useState(false);\n const [message, setMessage] = useState(\"\");\n const handleToggler = () => {\n if (isCollapsed) {\n setIsCollapsed(false);\n return;\n }\n setIsCollapsed(true);\n };\n const onFilterChanged = (\n e: React.ChangeEvent<HTMLInputElement>,\n value: string\n ) => {\n if (e.target.checked) {\n if (filter.key) dispatch(addToSelectedFilters(filter.key, value));\n } else {\n if (filter.key) dispatch(removeFromSelectedFilters(filter.key, value));\n }\n dispatch(filterChanged());\n };\n // 👇️ called every time input's value changes\n const handleChangeOnSearchInputTyped = (\n e: React.ChangeEvent<HTMLInputElement>\n ) => {\n setMessage(e.target.value);\n };\n const queryFilters = (key: string, value: string) => {\n dispatch(searchFilters(key, value));\n };\n\n useEffect(() => {\n if (message === \"\") {\n dispatch(searchFilters(filter.key!, \"\"));\n }\n }, [message, filter.key, dispatch]);\n return (\n <div>\n <div className=\"item\">\n {/* <RiLayoutGridLine className=\"sidebar-icon\" /> */}\n <span className=\"sidebar-text\">\n {\" \"}\n {capitalizeFirstLetter(filter.key!)}\n </span>\n <RiArrowDropUpLine\n className={\n isCollapsed ? \"sidebar-icon\" : \"sidebar-icon collapsedHide\"\n }\n onClick={() => handleToggler()}\n />\n <RiArrowDropDownLine\n className={\n isCollapsed ? \"sidebar-icon collapsedHide\" : \"sidebar-icon\"\n }\n onClick={() => handleToggler()}\n />\n </div>\n\n <div\n className={\n isCollapsed ? \"list-container\" : \"list-container collapsedHide\"\n }\n >\n <div className=\"searchBar\">\n <input\n id=\"searchQueryInput\"\n name=\"searchQueryInput\"\n placeholder=\"Search\"\n value={message}\n onChange={(e) => handleChangeOnSearchInputTyped(e)}\n />\n <button\n id=\"searchQuerySubmit\"\n type=\"submit\"\n name=\"searchQuerySubmit\"\n onClick={() => queryFilters(filter.key!, message)}\n >\n <AiOutlineSearch />\n </button>\n </div>\n {filter &&\n filter.values &&\n filter.values.length > 0 &&\n filter.values.slice(0, 6).map((item, index) => {\n const checked = selectedValues && selectedValues.includes(item);\n return (\n <div key={index}>\n <input\n value={item}\n checked={checked ? true : false}\n type=\"checkbox\"\n onChange={(e) => onFilterChanged(e, item)}\n />\n <span className=\"itemLabel\">{item}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport default FiltersList;\n","import React, { useState } from \"react\";\nimport { RiMenuLine } from \"react-icons/ri\";\nimport { Filter } from \"../../../nyris-api/index\";\nimport FiltersList from \"./FiltersList\";\n\ninterface SidebarProps {\n filters: Filter[];\n selectedFilters: Map<string, string[]>;\n}\n\nconst Sidebar: React.FC<SidebarProps> = ({ filters, selectedFilters }) => {\n console.log(filters);\n const [isExpanded, setIsExpanded] = useState(false);\n const handleToggler = () => {\n if (isExpanded) {\n setIsExpanded(false);\n return;\n }\n setIsExpanded(true);\n };\n return (\n <div className={isExpanded ? \"sidebar\" : \"Sidebar collapsed\"}>\n <div\n className={\n isExpanded ? \"sidebarContent\" : \"sidebarContent overflowHidden\"\n }\n >\n <div className=\"sidebarHeader\">\n <RiMenuLine className=\"sidebar-icon\" onClick={handleToggler} />\n {/* <h1 className={isExpanded ? \"sidebar-logo\" : \"sidebar-logo collapsedHide\"}> Filters </h1>\n */}\n </div>\n <div\n className={\n isExpanded ? \"Sidebar-items\" : \"Sidebar-items collapsedHide\"\n }\n >\n {filters &&\n filters.map((x) => {\n let selectedValues = x.key\n ? selectedFilters.get(x.key)\n : undefined;\n return <FiltersList filter={x} selectedValues={selectedValues} />;\n })}\n {/* <FiltersList2/> */}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Sidebar;\n","import React from \"react\";\n\nconst Header = () => {\n return (\n <div id=\"header\">\n <section id=\"branding\"></section>\n <div id=\"menu\" className=\"menuWrap\" role=\"navigation\">\n <ul>\n <li>\n <a\n href=\"https://nyris.io/imprint/#privacy\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Privacy Policy\n </a>\n </li>\n <li>\n <a\n href=\"https://nyris.io/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Visit our Website\n </a>\n </li>\n </ul>\n </div>\n </div>\n );\n};\nexport default Header;\n","import React from \"react\";\nimport { NyrisFeedbackState } from \"../actions/nyrisAppActions\";\nimport { Animate } from \"react-move\";\n\ninterface FeedbackProps {\n feedbackState: NyrisFeedbackState;\n onPositiveFeedback?: () => void;\n onNegativeFeedback?: () => void;\n onClose?: () => void;\n}\n\nconst Feedback: React.FC<FeedbackProps> = ({\n feedbackState,\n onPositiveFeedback,\n onNegativeFeedback,\n onClose,\n}) => {\n let inner: any = null;\n switch (feedbackState) {\n case \"question\":\n inner = (\n <div className=\"feedbackForm\">\n <p>Did you find what you were looking for?</p>\n <div\n className=\"btn primary positiveFeedback\"\n onClick={onPositiveFeedback}\n >\n Yes\n </div>\n <div\n className=\"btn secondary negativeFeedback\"\n onClick={onNegativeFeedback}\n >\n No\n </div>\n </div>\n );\n break;\n case \"positive\":\n inner = (\n <div className=\"feedbackMessage positive\">\n Great, thank you for your feedback!\n </div>\n );\n break;\n case \"negative\":\n inner = (\n <div className=\"feedbackMessage negative\">\n We saved your request so we can track down the issue and improve the\n search experience. Your Feedback helps us to make our service better\n for everyone, thank you!\n <br />\n <div className=\"btn dismiss\" onClick={onClose}>\n Dismiss\n </div>\n </div>\n );\n break;\n default:\n inner = null;\n break;\n }\n return (\n <Animate\n show={feedbackState !== \"hidden\"}\n start={{ y: 100, opacity: 0 }}\n enter={{ y: [0], opacity: [1] }}\n leave={{ y: [100], opacity: [0] }}\n >\n {({ y, opacity }) => (\n <section\n className=\"feedback\"\n style={{ transform: `translateY(${y}%)`, opacity }}\n >\n <div className=\"wrapper\">{inner}</div>\n <div className=\"closeFeedbackContainer\">\n <div className=\"closeFeedback\" onClick={onClose} />\n </div>\n </section>\n )}\n </Animate>\n );\n};\n\nexport default Feedback;\n","import React from \"react\";\n\nconst CategoryFilter = ({ cats }: { cats: string[] }) => {\n if (cats.length === 0) {\n return null;\n }\n return (\n <div id=\"catlist\" style={{ textAlign: \"center\" }}>\n {\n cats.map((s) => (\n <a key={s} href=\"#top\">\n {s}\n </a>\n )) // TODO fix link\n }\n </div>\n );\n};\n\nexport default CategoryFilter;\n","import React from \"react\";\nimport { Code } from \"@nyris/nyris-api\";\n\ninterface Props {\n codes: Code[];\n}\nconst Codes = ({ codes }: Props) => (\n <>\n <div className=\"codes\" style={{ textAlign: \"center\" }}>\n {codes.length > 0 && (\n <span style={{ fontSize: \"0.8em\" }}>\n Codes\n <br />{\" \"}\n </span>\n )}\n {codes.map((c, i) => (\n <small key={i} title={c.type}>\n {c.value}\n </small>\n ))}\n </div>\n </>\n);\nexport default Codes;\n","import React from \"react\";\n\nconst PredictedCategories = ({\n cs,\n}: {\n cs: { name: string; score: number }[];\n}) => (\n <>\n {cs.map((c) => (\n <small key={c.name}>\n {c.name === \"\" ? \"No category\" : c.name.split(\" > \").slice(-1)[0]}:\n {(c.score * 100).toFixed(0)}%\n </small>\n ))}\n </>\n);\nexport default PredictedCategories;\n","import React from \"react\";\n\ninterface ExampleImagesProps {\n images: string[];\n onExampleImageClicked: (url: string) => void;\n}\n\nconst ExampleImages: React.FC<ExampleImagesProps> = ({\n images,\n onExampleImageClicked,\n}) => {\n if (images.length === 0) {\n return null;\n }\n return (\n <section className=\"useExampleImg\">\n You can also try one of these pictures:\n <div className=\"exampleImages\">\n <div className=\"exImagesWrap\">\n {images.map((i) => (\n <img\n key={i}\n src={i}\n alt=\"\"\n onClick={() => onExampleImageClicked(i)}\n />\n ))}\n </div>\n </div>\n </section>\n );\n};\n\nexport default ExampleImages;\n","import React from \"react\";\nimport { BsX } from \"react-icons/bs\";\nimport { connect, ConnectedProps, useDispatch } from \"react-redux\";\nimport { AppState } from \"../types\";\nimport { capitalizeFirstLetter } from \"../utils\";\nimport {\n removeFromSelectedFilters,\n clearAllSelectedFilters,\n filterChanged,\n} from \"../actions/searchActions\";\n\nconst SelectedFiltersSummary: React.FC<selectedFiltersSummaryProps> = ({\n search,\n}) => {\n const dispatch = useDispatch();\n const handleRemoveFilterButtonClick = (key: string, value: string) => {\n dispatch(removeFromSelectedFilters(key, value));\n dispatch(filterChanged());\n };\n\n const clearAllSelectedFiltersFromList = () => {\n dispatch(clearAllSelectedFilters());\n dispatch(filterChanged());\n };\n const selectedValues = ([] as string[]).concat.apply(\n [],\n Array.from(search.selectedFilters.values())\n );\n\n return (\n <div className=\"wrap-box-refinements\">\n <ul>\n {Array.from(search.selectedFilters.keys()).map(\n (filterKey) =>\n search.selectedFilters.get(filterKey) &&\n search.selectedFilters.get(filterKey)!.map((val) => {\n return (\n <li>\n <button\n onClick={() =>\n handleRemoveFilterButtonClick(filterKey, val)\n }\n >\n <span className=\"summary-label\">\n <div className=\"summary-label-key-text\">\n {capitalizeFirstLetter(val)}\n <BsX />\n </div>\n </span>\n </button>\n </li>\n );\n })\n )}\n <li>\n <button\n className={\n search.selectedFilters &&\n search.selectedFilters.size > 0 &&\n selectedValues &&\n selectedValues.length > 0\n ? \"clear-all-filters \"\n : \"clear-all-filters-hidden\"\n }\n onClick={() => clearAllSelectedFiltersFromList()}\n >\n {\" \"}\n Clear All{\" \"}\n </button>\n </li>\n </ul>\n </div>\n );\n};\n\nconst mapStateToProps = (state: AppState) => ({\n showPart: state.nyrisDesign.showPart,\n search: {\n filters: state.search.filters,\n selectedFilters: state.search.selectedFilters,\n },\n});\nconst connector = connect(mapStateToProps);\ntype selectedFiltersSummaryProps = ConnectedProps<typeof connector>;\nexport default connect(mapStateToProps)(SelectedFiltersSummary);\n","import React, { useEffect, useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { Animate, NodeGroup } from \"react-move\";\nimport { useDropzone } from \"react-dropzone\";\nimport { Box, Snackbar } from \"@material-ui/core\";\nimport { Alert } from \"@material-ui/lab\";\nimport classNames from \"classnames\";\nimport { loadFilters } from \"./actions/searchActions\";\nimport Result from \"./components/Result\";\nimport Sidebar from \"./components/Sidebar\";\nimport Header from \"./components/Header\";\nimport Feedback from \"./components/Feedback\";\nimport CategoryFilter from \"./components/CategoryFilter\";\nimport Codes from \"./components/Codes\";\nimport PredictedCategories from \"./components/PredictedCategories\";\nimport ExampleImages from \"./components/ExampleImages\";\nimport {\n makeFileHandler,\n Capture,\n Preview,\n} from \"@nyris/nyris-react-components\";\nimport {\n RectCoords,\n cadExtensions,\n CategoryPrediction,\n Code,\n Region,\n Filter,\n} from \"@nyris/nyris-api\";\nimport { AppSettings, CanvasWithId, MDSettings } from \"./types\";\nimport { NyrisAppPart, NyrisFeedbackState } from \"./actions/nyrisAppActions\";\nimport SelectedFiltersSummary from \"./components/SelectedFiltersSummary\";\n\nexport interface AppHandlers {\n onExampleImageClick: (url: string) => void;\n onImageClick: (position: number, url: string) => void;\n onLinkClick: (position: number, url: string) => void;\n onFileDropped: (file: File) => void;\n onCaptureComplete: (image: HTMLCanvasElement) => void;\n onCaptureCanceled: () => void;\n onSelectFile: (f: File) => void;\n onCameraClick: () => void;\n onShowStart: () => void;\n onSelectionChange: (r: RectCoords) => void;\n onPositiveFeedback: () => void;\n onNegativeFeedback: () => void;\n onCloseFeedback: () => void;\n}\nexport interface AppProps {\n search: {\n results: any[];\n requestId?: string;\n duration?: number;\n categoryPredictions: CategoryPrediction[];\n codes: Code[];\n filterOptions: string[];\n errorMessage?: string;\n regions: Region[];\n previewSelection: RectCoords;\n toastErrorMessage?: string;\n filters: Filter[];\n selectedFilters: Map<string, string[]>;\n };\n previewImage?: CanvasWithId;\n settings: AppSettings;\n loading: boolean;\n showPart: NyrisAppPart;\n feedbackState: NyrisFeedbackState;\n handlers: AppHandlers;\n mdSettings: MDSettings;\n}\n\nconst App: React.FC<AppProps> = ({\n search: {\n results,\n regions,\n previewSelection,\n requestId,\n duration,\n errorMessage,\n filterOptions,\n categoryPredictions,\n codes,\n toastErrorMessage,\n filters,\n selectedFilters,\n },\n showPart,\n settings,\n handlers,\n loading,\n previewImage,\n feedbackState,\n}) => {\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop: (fs: File[]) => handlers.onFileDropped(fs[0]),\n });\n\n const minPreviewHeight = 400;\n const halfOfTheScreenHeight = Math.floor(window.innerHeight * 0.45);\n const maxPreviewHeight = Math.max(minPreviewHeight, halfOfTheScreenHeight);\n const [toastOpen, setToastOpen] = useState(false);\n const dispatch = useDispatch();\n\n const acceptTypes = [\"image/*\"]\n .concat(settings.cadSearch ? cadExtensions : [])\n .join(\",\");\n\n useEffect(() => {\n if (toastErrorMessage !== \"\") {\n setToastOpen(true);\n }\n }, [toastErrorMessage]);\n\n useEffect(() => {\n dispatch(loadFilters());\n }, [showPart, dispatch]);\n\n return (\n <React.Fragment>\n <Header />\n <div className=\"wrapperBody\">\n <Sidebar filters={filters} selectedFilters={selectedFilters} />\n\n <div className=\"mainContent\">\n {showPart === \"camera\" && (\n <Capture\n onCaptureComplete={handlers.onCaptureComplete}\n onCaptureCanceled={handlers.onCaptureCanceled}\n useAppText=\"Use default camera app\"\n />\n )}\n\n <SelectedFiltersSummary />\n <div\n className={classNames(\"headSection\", {\n hidden: showPart === \"results\",\n })}\n id=\"headSection\"\n >\n <div\n {...getRootProps({\n onClick: (e) => {\n e.stopPropagation();\n },\n })}\n className={classNames(\"wrapper\", \"dragAndDropActionArea\", {\n fileIsHover: isDragActive,\n })}\n >\n <div className={classNames(\"contentWrap\")}>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight=\"100vh\"\n >\n <section className=\"uploadImage\">\n <input\n type=\"button\"\n name=\"file\"\n id=\"capture\"\n className=\"inputfile\"\n accept=\"image/*\"\n capture=\"environment\"\n onClick={handlers.onCameraClick}\n />\n <input\n type=\"file\"\n name=\"file\"\n id=\"capture_file\"\n className=\"inputfile\"\n accept={acceptTypes}\n capture=\"environment\"\n />\n <input\n {...getInputProps()}\n type=\"file\"\n name=\"file\"\n id=\"select_file\"\n className=\"inputfile\"\n accept={acceptTypes}\n onChange={makeFileHandler(handlers.onSelectFile)}\n />\n <div className=\"onDesktop\">\n Drop an image\n <div className=\"smallText\">or</div>\n </div>\n <div className=\"onMobile camIcon\">\n <img src=\"./images/ic_cam_large.svg\" alt=\"Camera\" />\n </div>\n <label\n htmlFor=\"capture\"\n className=\"btn primary onMobile\"\n style={{ marginBottom: \"2em\", width: \"12em\" }}\n >\n <span className=\"onMobile\">Take a picture</span>\n </label>\n <br />\n <label\n htmlFor=\"select_file\"\n className=\"btn primary\"\n style={{ width: \"12em\" }}\n >\n <span>Select a file</span>\n </label>\n <label\n htmlFor=\"capture\"\n className=\"mobileUploadHandler onMobile\"\n />\n </section>\n <ExampleImages\n images={settings.exampleImages}\n onExampleImageClicked={handlers.onExampleImageClick}\n />\n </Box>\n </div>\n </div>\n\n <div className=\"headerSeparatorTop\" />\n <div className=\"headerSeparatorBack\" />\n <div\n className={classNames(\"tryDifferent\", {\n hidden: showPart !== \"results\",\n })}\n onClick={handlers.onShowStart}\n >\n <div className=\"icIcon\"></div>\n <div className=\"textDesc\"> Try a different image</div>\n <br style={{ clear: \"both\" }} />\n </div>\n </div>\n\n <section\n className={classNames(\n { hideResults: showPart !== \"results\" },\n \"results\",\n { resultsActive: showPart === \"results\" },\n results.length === 1 ? \"singleProduct\" : \"multipleProducts\"\n )}\n >\n {errorMessage && (\n <div className=\"errorMsg\">\n {errorMessage}\n <div\n style={{\n textAlign: \"center\",\n fontSize: \"0ß.7em\",\n paddingTop: \"0.8em\",\n }}\n >\n <span>\n Make sure to include the request ID when reporting a\n problem: {requestId}\n </span>\n </div>\n </div>\n )}\n <Animate\n show={loading}\n start={{ opacity: 0.0 }}\n enter={{ opacity: [1.0], timing: { duration: 300 } }}\n leave={{ opacity: [0.0], timing: { duration: 300 } }}\n >\n {(s) => (\n <div className=\"loadingOverlay\" style={{ ...s }}>\n <div className=\"loading\" />\n </div>\n )}\n </Animate>\n {settings.preview && previewImage && (\n <div className=\"preview\">\n <Preview\n key={previewImage.id}\n maxWidth={document.body.clientWidth}\n maxHeight={maxPreviewHeight}\n dotColor=\"#4C8F9F\"\n onSelectionChange={handlers.onSelectionChange}\n regions={regions}\n selection={previewSelection}\n image={previewImage.canvas}\n />\n </div>\n )}\n <div className=\"predicted-categories\">\n <PredictedCategories cs={categoryPredictions} />\n </div>\n <div className=\"predicted-categories\">\n <Codes codes={codes} />\n </div>\n <CategoryFilter cats={filterOptions} />\n\n <div className=\"wrapper\">\n <NodeGroup\n data={results}\n keyAccessor={(r) => r.sku}\n start={(r, i) => ({ opacity: 0, translateX: -100 })}\n enter={(r, i) => ({\n opacity: [1],\n translateX: [0],\n timing: { delay: i * 100, duration: 300 },\n })}\n >\n {(rs) => (\n <>\n {rs.map(({ key, data, state }) => (\n <Result\n key={key}\n noImageUrl={settings.noImageUrl}\n template={settings.resultTemplate}\n onImageClick={handlers.onImageClick}\n onLinkClick={handlers.onLinkClick}\n result={data}\n style={{\n opacity: state.opacity,\n transform: `translateX(${state.translateX}%)`,\n }}\n />\n ))}\n </>\n )}\n </NodeGroup>\n\n {results.length === 0 && showPart === \"results\" && !loading && (\n <div className=\"noResults\">\n We did not find anything{\" \"}\n <span role=\"img\" aria-label=\"sad face\">\n 😕\n </span>\n </div>\n )}\n\n <br style={{ clear: \"both\" }} />\n\n {duration && showPart === \"results\" && (\n <div\n style={{\n textAlign: \"center\",\n fontSize: \"0.7em\",\n paddingTop: \"0.8em\",\n }}\n >\n Search took {duration.toFixed(2)} seconds\n </div>\n )}\n\n {requestId && showPart === \"results\" && (\n <div\n style={{\n textAlign: \"center\",\n fontSize: \"0.7em\",\n paddingTop: \"0.8em\",\n }}\n >\n Request identifier {requestId}\n </div>\n )}\n </div>\n </section>\n\n <Snackbar\n open={toastOpen}\n autoHideDuration={3000}\n onClose={() => setToastOpen(false)}\n >\n <Alert onClose={() => setToastOpen(false)} severity=\"error\">\n {toastErrorMessage}\n </Alert>\n </Snackbar>\n </div>\n </div>\n <section className=\"footnote\">\n <div className=\"wrapper\">\n © 2017 - 2019 <a href=\"https://nyris.io\">nyris GmbH</a> - All rights\n reserved - <a href=\"https://nyris.io/imprint/\">Imprint</a>\n </div>\n </section>\n <Feedback\n feedbackState={feedbackState}\n onPositiveFeedback={handlers.onPositiveFeedback}\n onNegativeFeedback={handlers.onNegativeFeedback}\n onClose={handlers.onCloseFeedback}\n />\n </React.Fragment>\n );\n};\n\nexport default App;\n","// Some people are still using internet explorer\nimport \"react-app-polyfill/ie11\";\nimport \"react-app-polyfill/stable\";\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport AppMD from \"./AppMD\";\nimport * as serviceWorker from \"./serviceWorker\";\n\nimport { connect, Provider } from \"react-redux\";\nimport {\n applyMiddleware,\n bindActionCreators,\n combineReducers,\n createStore,\n Dispatch,\n} from \"redux\";\nimport {\n loadCanvas,\n loadFile,\n loadUrl,\n reducer as searchReducer,\n selectionChanged,\n submitNegativeFeedback,\n submitPositiveFeedback,\n clearRequestImage,\n} from \"./actions/searchActions\";\nimport {\n hideFeedback,\n reducer as nyrisReducer,\n showCamera,\n showStart,\n} from \"./actions/nyrisAppActions\";\nimport { getUrlParam } from \"./utils\";\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport { AppAction, AppSettings, AppState, MDSettings } from \"./types\";\nimport { createEpicMiddleware } from \"redux-observable\";\nimport NyrisAPI from \"@nyris/nyris-api\";\nimport { createMuiTheme, MuiThemeProvider } from \"@material-ui/core\";\nimport \"typeface-roboto\";\nimport { defaultMdSettings, defaultSettings } from \"./defaults\";\nimport rootEpic from \"./epics\";\nimport { createHashHistory } from \"history\";\nimport App from \"./App\";\n\ndeclare var settings: AppSettings;\n\nfunction scrollTop() {\n // TODO might require polyfill for ios and edge\n window.scrollTo({ top: 0, left: 0, behavior: \"smooth\" });\n}\n\nlet normalizedSettings: AppSettings = {\n ...defaultSettings,\n ...settings,\n};\n\nnormalizedSettings = {\n ...normalizedSettings,\n apiKey: (getUrlParam(\"apiKey\") as string) || normalizedSettings.apiKey,\n xOptions: (getUrlParam(\"xOptions\") as string) || normalizedSettings.xOptions,\n regions:\n (getUrlParam(\"use.regions\") as boolean) || normalizedSettings.regions,\n preview:\n (getUrlParam(\"use.preview\") as boolean) || normalizedSettings.preview,\n};\n\ndocument.title = window.location.host;\n\nconst api = new NyrisAPI(normalizedSettings);\nconst history = createHashHistory();\n\nconst epicMiddleware = createEpicMiddleware<AppAction, AppAction, AppState>({\n dependencies: { api, history },\n});\n\nconst rootReducer = combineReducers({\n settings: () => normalizedSettings as AppSettings,\n nyrisDesign: nyrisReducer,\n search: searchReducer,\n});\n\nconst store = createStore(\n rootReducer,\n composeWithDevTools(applyMiddleware(epicMiddleware))\n);\nepicMiddleware.run(rootEpic);\n\nhistory.listen((location, action) => {\n console.log(\"history\", location, action);\n if (action === \"PUSH\") {\n return;\n }\n switch (location.pathname) {\n case \"/results\":\n store.dispatch({ type: \"SHOW_RESULTS\" });\n store.dispatch({ type: \"LOAD_FILTERS\" });\n break;\n case \"/\":\n store.dispatch({ type: \"SHOW_START\" });\n break;\n }\n});\n\n// Here comes the really dirty code of the composition-root\n\nconst mapStateToProps = (state: AppState) => ({\n showPart: state.nyrisDesign.showPart,\n search: {\n results: state.search.results,\n categoryPredictions: state.search.categoryPredictions,\n codes: state.search.codes,\n filterOptions: state.search.filterOptions,\n previewSelection: state.search.selectedRegion,\n regions: state.search.regions,\n duration: state.search.duration,\n requestId: state.search.requestId,\n toastErrorMessage: state.search.errorMessage,\n filters: state.search.filters,\n selectedFilters: state.search.selectedFilters,\n },\n settings: state.settings,\n previewImage: state.search.requestImage,\n loading: state.search.fetchingRegions || state.search.fetchingResults,\n feedbackState: state.nyrisDesign.feedbackState,\n mdSettings: state.settings.materialDesign || defaultMdSettings,\n});\n\nconst mapDispatchToProps = (dispatch: Dispatch<AppAction>) => {\n return {\n handlers: {\n ...bindActionCreators(\n {\n onPositiveFeedback: submitPositiveFeedback,\n onNegativeFeedback: submitNegativeFeedback,\n onCameraClick: showCamera,\n onCaptureCanceled: showStart,\n onCaptureComplete: loadCanvas,\n onSelectFile: loadFile,\n onExampleImageClick: loadUrl,\n onFileDropped: loadFile,\n onSelectionChange: selectionChanged,\n onCloseFeedback: hideFeedback,\n },\n dispatch\n ),\n onImageClick: (position: number, url: string) => {\n dispatch({ type: \"RESULT_IMAGE_CLICKED\", position, url });\n dispatch(loadUrl(url));\n },\n onLinkClick: (position: number, url: string) => {\n dispatch({ type: \"RESULT_LINK_CLICKED\", position, url });\n if (url) {\n window.open(url);\n }\n },\n onShowStart: () => {\n dispatch(showStart());\n dispatch(clearRequestImage());\n scrollTop();\n },\n },\n };\n};\n\n// chrome plugin communication\nfunction onMessage(evt: MessageEvent) {\n let msg = evt.data;\n if (msg.type === \"image\") {\n store.dispatch(loadUrl(msg.image));\n }\n}\nwindow.addEventListener(\"message\", onMessage);\n\nlet useMd = settings.materialDesign !== undefined;\nlet md: MDSettings = {\n ...defaultMdSettings,\n ...settings.materialDesign,\n};\nlet theme = createMuiTheme({\n typography: {\n fontFamily: md.customFontFamily,\n },\n palette: {\n primary: {\n main: md.primaryColor,\n },\n secondary: {\n main: md.secondaryColor,\n },\n },\n});\nconst SelectedApp = useMd ? AppMD : App;\nconst ConnectedApp = connect(mapStateToProps, mapDispatchToProps)(SelectedApp);\n\nReactDOM.render(\n <Provider store={store}>\n <MuiThemeProvider theme={theme}>\n <ConnectedApp />\n </MuiThemeProvider>\n </Provider>,\n document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
!function(e){function r(r){for(var n,i,p=r[0],l=r[1],a=r[2],c=0,s=[];c<p.length;c++)i=p[c],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&s.push(o[i][0]),o[i]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(f&&f(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,p=1;p<t.length;p++){var l=t[p];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={1:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="./";var p=this["webpackJsonp@nyris/nyris-webapp"]=this["webpackJsonp@nyris/nyris-webapp"]||[],l=p.push.bind(p);p.push=r,p=p.slice();for(var a=0;a<p.length;a++)r(p[a]);var f=l;t()}([]);
|
|
2
|
-
//# sourceMappingURL=runtime-main.
|
|
2
|
+
//# sourceMappingURL=runtime-main.f5553a9b.js.map
|