{"version":3,"sources":["components/FlexRow.tsx","screens/App/screens/Tenant/screens/Customization/constants.ts","services/auth.js","store/zoom.ts","store/customization.ts","store/index.ts","services/criiptoVerify.ts","screens/App/screens/Tenant/screens/Reporting/components/DateRangePickerButton/calendar.png","screens/App/assets/logo-criipto-white-2.svg","screens/App/screens/Tenant/screens/Reporting/components/Legend.js","services/criiptoPermit.js","hooks/useTenant.ts","config-context.ts","components/Auth/AuthenticatedRoute.js","screens/Auth/Login.js","screens/Auth/Callback.js","components/DropDownMenu.js","components/LoginManager/LoginManager.js","screens/App/screens/Tenant/components/MenuBar/MenuBar.js","screens/App/screens/Tenant/components/MenuBarItem/MenuBarItem.tsx","services/subscriptionManagement.js","components/CreditCard/CreditCardForm.js","services/customerManagement.js","components/CreditCard/index.js","components/Starting.js","components/Auth/AuthorizedRoute.js","screens/App/screens/Tenant/screens/Signup/index.js","screens/App/screens/Tenant/screens/Subscription/PeriodSelector.js","screens/App/screens/Tenant/screens/Subscription/CurrencySelector.js","screens/App/screens/Tenant/screens/Subscription/Plans/Plan.js","screens/App/screens/Tenant/screens/Subscription/Plans/CustomPlan.js","screens/App/screens/Tenant/screens/Subscription/Plans/FreePlan.js","screens/App/screens/Tenant/screens/Subscription/Plans/index.js","screens/App/screens/Tenant/screens/Subscription/index.js","screens/App/screens/Tenant/screens/Invoices/InvoiceItem.js","screens/App/screens/Tenant/screens/Invoices/InvoiceList.js","screens/App/screens/Tenant/screens/Invoices/index.js","screens/App/screens/Tenant/screens/Reporting/constants.js","screens/App/screens/Tenant/screens/Reporting/components/TransactionTypeButton.js","screens/App/screens/Tenant/screens/Reporting/components/EnvironmentButton.js","screens/App/screens/Tenant/screens/Reporting/components/BucketSelector.js","screens/App/screens/Tenant/screens/Reporting/components/DataDimensionSelector.js","screens/App/screens/Tenant/screens/Reporting/components/DateRangePickerButton/presets.js","screens/App/screens/Tenant/screens/Reporting/components/DateRangePickerButton/DateRangePickerButton.js","screens/App/screens/Tenant/screens/Reporting/components/NoDataBanner.js","screens/App/screens/Tenant/screens/Reporting/components/LoadingBanner.js","helpers/csv.js","screens/App/screens/Tenant/screens/Reporting/components/DownloadButton.js","screens/App/screens/Tenant/screens/Reporting/components/StatBoxes.js","screens/App/screens/Tenant/screens/Reporting/components/Tooltip.js","screens/App/screens/Tenant/screens/Reporting/index.js","screens/App/screens/Tenant/screens/Logs/index.tsx","hooks/usePromise.ts","screens/App/screens/Tenant/index.js","screens/App/index.tsx","screens/index.tsx","index.js","screens/App/screens/Tenant/components/Button.tsx","API/subscription.ts","components/DropdownButton/DropdownButton.js"],"names":["FlexRow","styled","div","props","center","spaceBetween","FontFamilies","cssVariable","variable","generateDefaultStyling","prefix","withVariables","createStyling","shared","key","label","css","dknemid_shared","dknemid_cpr_entry","dknemid_cvr_select","sebankid_shared","sebankid_startapp","sebankid_thisdevice","sebankid_anotherdevice","collections","styling","languages","items","id","htmlUrl","htmlCacheable","afterRender","target","targetDocument","contentDocument","document","getElementById","classList","remove","body","add","innerHTML","afterScripts","window","contentWindow","initializeCoreClient","HEADER_HEIGHT","TOOLBAR_TOP_HEIGHT","_requestActiveSemaphor","Auth","_roles","this","auth0","WebAuth","domain","appConfig","clientID","redirectUri","location","origin","login","bind","logout","processAuthentication","getAccessToken","isAuthenticated","isCallback","_requestCache","_resultCache","authorize","responseType","scope","tenantid","audience","Error","Promise","resolve","reject","authResult","isExpired","silentLogin","then","expiresAt","JSON","stringify","expiresIn","Date","now","accessToken","catch","getTenantAccessToken","subscriptionApi","criiptoVerify","criiptoPermit","delay","options","checkSession","err","message","timeout","setTimeout","that","parseHash","idToken","setSession","sessionStorage","setItem","removeItem","getItem","_userProfile","client","userInfo","profile","test","hash","parse","permission","_singleton","singleton","ZOOM_STEPS","zoomGuard","value","Math","max","createSlice","name","initialState","reducers","set","state","action","payload","stepOut","step","last","filter","search","indexOf","stepIn","find","requestId","random","toString","environment","variables","defaultStyling","setEnvironment","updateCss","setStyling","Object","keys","reduce","memo","updateVariable","setVariables","reset","rootReducer","combineReducers","zoom","zoomSlice","reducer","customization","customizationSlice","store","configureStore","CriiptoVerify","_url","_accessToken","_axios","_links","_tenantLinks","_linkTemplates","url","replace","tenantId","auth","getVerifyAccessToken","axios","create","baseURL","headers","get","discoveryResponse","_extractLinks","data","links","linkTemplates","tenantsResponse","tenants","map","tenant","link","setup","found","entityId","getTenantLink","response","domains","production","post","linkArray","forEach","element","rel","href","module","exports","Wrapper","Inner","color","CheckboxWrapper","selected","Label","Checkbox","Legend","onToggle","onClick","data-testid","_scopedUserClaimsRel","_encVerifyAppId","btoa","verifyAppId","_encSubscriptionAppId","subscriptionAppId","_organizations","length","selectedTenant","requiredRole","roles","getPermitAccessToken","token","res","error","force","getAPI","template","_mergeOrgsWithScopes","claimScopes","currentOrgs","newScopes","includeApplicationRoles","resultingOrgs","organization","entityIdentifier","userClaims","claim","type","push","role","substring","lastIndexOf","verifyId","encEntityId","getOwnPropertyNames","useTenant","permitSvc","params","useParams","useState","values","setTenants","setError","loading","setLoading","useEffect","getTenants","finally","React","createContext","stripe","locale","features","CustomizationScreen","AuthenticatedRoute","Component","component","rest","render","to","pathname","from","LoginScreen","CallbackScreen","returnUrl","setState","next","console","log","processCallback","DropDownMenu","item","thisItem","event","onSelected","menuItems","source","itemSelected","uib-dropdown","className","data-toggle","aria-haspopup","aria-expanded","displayName","uib-dropdown-menu","LoginManager","_processingTenants","tenantsForDropdown","undefined","tenantSelected","updateProfile","updateTenantList","getProfile","sub","match","includes","tnt","onNoTenants","onTenantSelected","MenuBar","children","MenuBarItem","config","useContext","ConfigContext","useRouteMatch","path","goto","isAuthorized","requiredFeature","SubscriptionManagement","defaults","common","plans","e","getSubscriptionAccessToken","CreditCardForm","useExistingCard","country","plan","period","currency","customer","nameOnCard","company","street","city","zip","email","taxId","cardLast4","cardBrand","subSvc","subscriptionMngmt","formElementChanged","formSubmitted","toogleCard","createStripeCardElement","nextProps","updateState","stripeJs","createElement","src","async","onload","Stripe","elements","fonts","cssSrc","card","hidePostalCode","classes","base","style","iconColor","fontFamily","fontSize","addEventListener","displayError","textContent","mount","appendChild","preventDefault","formData","onSubmit","tokenData","address_line1","address_city","address_zip","address_country","createToken","result","paymentToken","newcard","currentcard","display","removeAttribute","htmlFor","onChange","maxLength","required","hidden","placeholder","submitText","CreditCardProcessing","height","alt","CreditCardError","startOver","reload","CustomerManagement","startAfter","endBefore","CreditCardManagement","cardState","custMngmt","CustomerMngmt","subMngmt","SubscriptionMngmt","getCustomer","saveCreditCard","Starting","AuthorizedRoute","isAuthorizationReady","Signup","priceInfo","productName","productVolume","getPriceInfo","scrollTo","getPlans","selectedPlanData","p","pop","toLowerCase","volume","analytics","identify","track","gtag","saveSubscription","success","clientSecret","confirmCardPayment","paymentIntent","markBillable","paymentIntentId","onPaymentSuccess","errorCode","toLocaleString","price","unitprice","toUpperCase","SignUpInjected","PeriodSelector","periodChanged","CurrencySelector","thisCurrency","aria-labelledby","currencyChanged","Plan","available","Fragment","CustomPlan","FreePlan","Plans","planData","creditCardPlansAvailable","selectedPlan","onPlanSelected","Subscription","InvoiceItem","num","inputDate","date","includeDay","monthNames","day","String","getDate","monthIndex","getMonth","year","getFullYear","lineItem","hostedInvoiceUrl","formatDate","periodEnd","paidAt","formatNumber","amountDue","invoicePdf","InvoiceList","movingForward","custMgmt","invoiceItems","nextPage","previousPage","getInvoiceItems","startingAfter","endingBefore","getInvoices","invoiceData","invoices","invs","first","hasMore","lines","line","showNextClass","showPreviousClass","InvoicesScreen","COLORS","removeTimezone","input","substr","BUCKETS","HOUR","tickFormatter","bucket","moment","format","tooltipFormatter","exportFormatter","DAY","WEEK","MONTH","DIMENSIONS","transactionType","authentication","signature","authenticationType","_valueLabel","PRODUCTION","TEST","FAKE_CHART","yTicks","range","reverse","days","subtract","toJSON","generateData","dateSelection","diff","toISOLocal","d","z","n","slice","off","getTimezoneOffset","sign","abs","getHours","getMinutes","getSeconds","getMilliseconds","Item","StyledCheckbox","TransactionTypeButton","onSelect","EnvironmentButton","BucketSelector","disabled","DropdownButton","DataDimensionSelector","dimensions","omit","dimension","PRESETS","preset","startOf","endOf","PickerButton","PresetsOverlay","PresetItem","li","CalendarOverlay","today","DateRangePickerButton","presetsButtonRef","useRef","presetsContainerRef","showCalendarOverlay","setShowCalendarOverlay","hideCalendarOverlay","showPresetsOverlay","setShowPresetsOverlay","hidePresetsOverlay","position","START_DATE","selection","setSelection","handleRangeSelected","clone","ref","calendar","show","onHide","rootClose","placement","container","current","ReactDOM","findDOMNode","handlePresetSelected","numberOfMonths","enableOutsideDays","hideKeyboardShortcutsPanel","horizontalMonthPadding","withPortal","noBorder","minimumNights","minDate","maxDate","initialVisibleMonth","focusedInput","startDate","endDate","onDatesChange","END_DATE","isDayBlocked","isBefore","isAfter","defaultSelection","Banner","Y_AXIS_WIDTH","NoDataBanner","LoadingBanner","icon","faSpinner","spin","size","arraysToCSV","arrays","delimiter","csv","join","StyledButton","Button","DownloadButton","results","dataDimension","filename","contents","file","File","saveAs","downloadCSV","objects","columns","object","concat","column","objectsToCSV","total","faArrowAltCircleDown","StatBoxes","route","useRequest","method","query","toDate","timezone","tz","guess","loginResults","totalsResults","totalLogins","StatBox","number","suffix","uniqueUsersAllTime","StatBoxWrapper","Prefix","span","Number","Suffix","split","word","ColorBox","Dimension","Tooltip","active","selectedDataDimensionValues","Actions","Chart","Right","CHART_HEIGHT","Legends","shouldDisallowHourBucket","ReportingScreen","setTransactionType","setBucket","setDataDimension","setDateSelection","setRequestId","dimensionsState","resultsState","setSelectedDataDimensionValues","resetSelectedDataDimensionValues","allDimensionValuesToggled","colorByDimensionValue","index","totalByDimensionValue","sum","shouldFakeData","useMemo","areas","sortBy","dimensionValue","area","Array","isArray","newValues","width","margin","top","left","right","bottom","stroke","fill","dataKey","tickSize","tick","transform","tickCount","min","interval","angle","ticks","content","isAnimationActive","dataObject","stackId","strokeWidth","fillOpacity","activeDot","selectedDataDimensions","handleToggleDimensionValue","ActionBar","SearchInput","LogEntryWrapper","expand","DebuggerScreen","history","useHistory","prev","pagination","setPagination","entries","setEntries","expanded","setExpanded","setSearch","callback","deps","setResponse","pending","setPending","usePromise","a","getTenantDomains","domainsState","handleDomain","loadMorePending","setLoadMorePending","loadMore","previous","getTenantLinkTemplate","faSearch","entry","cursor","toggleEntry","timestamp","statusCode","HeadersFormatter","requestHeaders","NewlineFormatter","text","requestBody","responseHeaders","responseBody","working","upperFirst","lazy","TenantScreen","defaultScreen","traits","debug","group","fallback","Invoices","Reporting","CreditCard","LogsScreen","Header","header","AppScreen","useLocation","noTenants","setNotenants","handleTenantSelected","logo","exact","marginTop","stripePromise","loadStripe","RootScreen","Provider","Callback","Login","startsWith","onunhandledrejection","warn","reduxStore","tooltip","title","TabButton","BASE_URL","requestCache","LRU","setResult","done","setDone","setAccessToken","useAuth","authState","cacheKey","execute","useCallback","executeProps","request","paramsSerializer","qs","arrayFormat","requestCacheKey","Overlay","buttonRef","containerRef","showOverlay","setShowOverlay","hideOverlay","handleSelect"],"mappings":"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","file":"static/js/main.be172700.chunk.js","sourcesContent":["import styled from 'styled-components';\r\n\r\ninterface Props {\r\n center?: boolean;\r\n spaceBetween?: boolean;\r\n};\r\n\r\nconst FlexRow = styled.div`\r\n display: flex;\r\n flex-flow: row no-wrap;\r\n\r\n @media(max-width: 576px) {\r\n flex-flow: row wrap;\r\n }\r\n\r\n ${props => props.center && `\r\n align-items: center;\r\n `}\r\n ${props => props.spaceBetween && `\r\n justify-content: space-between;\r\n `}\r\n`;\r\n\r\nexport default FlexRow;","export const FontFamilies = [\"Arial\", \"Georgia\", \"Courier\"] as const;\r\n\r\nexport interface Variables {\r\n page_background_color?: string;\r\n page_background_image?: string;\r\n page_text_color?: string;\r\n page_text_font?: typeof FontFamilies[number];\r\n page_text_bottom?: string;\r\n logo_url?: string;\r\n logo_width?: string;\r\n logo_height?: string;\r\n frame_background_color?: string;\r\n frame_text_color?: string;\r\n frame_text_font?: typeof FontFamilies[number];\r\n};\r\n\r\ninterface StylingRequestItem {\r\n css: string | null\r\n};\r\nexport interface StylingRequest {\r\n shared: StylingRequestItem,\r\n dknemid_shared: StylingRequestItem;\r\n dknemid_cpr_entry: StylingRequestItem;\r\n dknemid_cvr_select: StylingRequestItem;\r\n sebankid_shared: StylingRequestItem;\r\n sebankid_startapp: StylingRequestItem;\r\n sebankid_thisdevice: StylingRequestItem;\r\n sebankid_anotherdevice: StylingRequestItem;\r\n};\r\n\r\nexport interface CustomizationRequest {\r\n styling: StylingRequest,\r\n variables: Variables\r\n}\r\n\r\nexport interface StylingResponse extends StylingRequest {\r\n published_css_url: string | null;\r\n};\r\n\r\nexport interface CustomizationFiles {\r\n logo: {\r\n upload_urls: {\r\n [key: string]: string\r\n }\r\n },\r\n background: {\r\n upload_urls: {\r\n [key: string]: string\r\n }\r\n }\r\n};\r\nexport interface CustomizationResponse extends CustomizationRequest {\r\n styling: StylingResponse,\r\n files: CustomizationFiles\r\n};\r\n\r\nexport interface StylingItem extends StylingRequestItem {\r\n key: string;\r\n label: string;\r\n css: string;\r\n};\r\n\r\nfunction cssVariable(variable: keyof Variables) {\r\n return `var(--${variable})`;\r\n}\r\n\r\nfunction generateDefaultStyling(prefix: string, withVariables: boolean = false) {\r\n return `\r\n${prefix} .frame {\r\n ${withVariables ? `background-color: ${cssVariable('frame_background_color')};` : ''}\r\n}\r\n\r\n${prefix} .form-group label {\r\n\r\n}\r\n\r\n${prefix} .form-group .input-text {\r\n\r\n}\r\n\r\n${prefix} .form-group .input-checkbox {\r\n\r\n}\r\n\r\n${prefix} .button {\r\n\r\n}\r\n\r\n${prefix} .button.button-primary {\r\n\r\n}\r\n`;\r\n}\r\n\r\nexport interface StylingContainer extends StylingRequest {\r\n shared: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n dknemid_shared: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n dknemid_cpr_entry: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n dknemid_cvr_select: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n sebankid_shared: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n sebankid_startapp: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n sebankid_thisdevice: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n sebankid_anotherdevice: {\r\n key: string;\r\n label: string;\r\n css: string;\r\n };\r\n};\r\n\r\nexport function createStyling():StylingContainer {\r\n return {\r\n shared: {\r\n key: 'shared',\r\n label: 'Global',\r\n css: `\r\nbody, body.broker {\r\n background: ${cssVariable('page_background_color')};\r\n background-color: ${cssVariable('page_background_color')};\r\n background-image: ${cssVariable('page_background_image')};\r\n background-size: cover;\r\n}\r\n\r\n.broker header {\r\n margin-top: 20px;\r\n}\r\n\r\n.broker header .inner {\r\n background-image: ${cssVariable('logo_url')};\r\n background-size: ${cssVariable('logo_width')} ${cssVariable('logo_height')};\r\n width: ${cssVariable('logo_width')};\r\n height: ${cssVariable('logo_height')};\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n/*.broker footer .inner {\r\n background-image: ${cssVariable('logo_url')};\r\n background-size: ${cssVariable('logo_width')} ${cssVariable('logo_height')};\r\n width: ${cssVariable('logo_width')};\r\n height: ${cssVariable('logo_height')};\r\n margin-left: auto;\r\n margin-right: auto;\r\n}*/\r\n\r\nh1#headline, aside#description {\r\n color: ${cssVariable('page_text_color')};\r\n font-family: ${cssVariable('page_text_font')};\r\n}\r\n\r\n/*.broker .frame, */.sebankid .frame {\r\n background: ${cssVariable('frame_background_color')};\r\n background-color: ${cssVariable('frame_background_color')};\r\n background-size: cover;\r\n color: ${cssVariable('frame_text_color')};\r\n font-family: ${cssVariable('frame_text_font')};\r\n\r\n padding: 10px;\r\n min-height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n\r\n@media (min-width: 750px) {\r\n .broker .frame, .sebankid .frame {\r\n width: 400px;\r\n height: 460px;\r\n min-height: auto;\r\n }\r\n} \r\n\r\naside#description p {\r\n display: none;\r\n}\r\n\r\naside#description p:first-child {\r\n display: block;\r\n}\r\n\r\naside#description p:first-child:after {\r\n display: block;\r\n white-space: pre-wrap;\r\n content: '${cssVariable('page_text_bottom')}';\r\n}\r\n\r\naside#description p:first-child .lang {\r\n display: none;\r\n}\r\n\r\n/*\r\n// Changing the headline text in the signing flow\r\n.sign #headline .lang span {\r\n display: none;\r\n}\r\n.sign #headline .lang-sv:after {\r\n content: \"Signera med BankId\";\r\n}\r\n.sign #headline .lang-en:after {\r\n content: \"Sign with BankId\";\r\n}\r\n*/\r\n\r\n/*\r\naside#description p:nth-child(2) {\r\n display: block;\r\n}\r\naside#description p:nth-child(2) .lang {\r\n display: none; \r\n}\r\naside#description p:nth-child(2):after {\r\n content: 'Custom description text'\r\n}\r\n*/\r\n`\r\n },\r\n dknemid_shared: {\r\n key: 'dknemid_shared',\r\n label: 'NemID',\r\n css: generateDefaultStyling('.dknemid')\r\n },\r\n dknemid_cpr_entry: {\r\n key: 'dknemid_cpr_entry',\r\n label: '',\r\n css: `\r\n.dknemid .dknemid-cpr-entry {\r\n\r\n}\r\n\r\n.dknemid .dknemid-cpr-entry .input-text {\r\n\r\n}\r\n.dknemid .dknemid-cpr-entry .form-group label {\r\n\r\n}\r\n\r\n/*\r\n#dknemid_cprentry_input_formgroup label .lang .text {\r\n display: none;\r\n}\r\n\r\n#dknemid_cprentry_input_formgroup label .lang.lang-da:after {\r\n content: 'Dit CPR Nummer'\r\n}\r\n*/\r\n`\r\n },\r\n dknemid_cvr_select: {\r\n key: 'dknemid_cvr_select',\r\n label: '',\r\n css: `\r\n.dknemid .dknemid-cvr-select {\r\n\r\n}\r\n\r\n.dknemid .dknemid-cvr-select ul.company-list {\r\n\r\n}\r\n\r\n.dknemid .dknemid-cvr-select ul.company-list li {\r\n\r\n}\r\n\r\n.dknemid .dknemid-cvr-select ul.company-list li label {\r\n\r\n}\r\n\r\n.dknemid .dknemid-cvr-select ul.company-list li label .note {\r\n\r\n}\r\n\r\n/*\r\n#dknemid_cvrselect_intro .lang .text {\r\n display: none;\r\n}\r\n#dknemid_cvrselect_intro .lang.lang-da:after {\r\n content: 'Vælg virksomhed:'\r\n}\r\n*/\r\n`\r\n },\r\n sebankid_shared: {\r\n key: 'sebankid_shared',\r\n label: 'SEBankID',\r\n css: generateDefaultStyling('.sebankid', true)\r\n },\r\n sebankid_startapp: {\r\n key: 'sebankid_startapp',\r\n label: '',\r\n css: `\r\n.sebankid .sebankid-startapp p {\r\n\r\n}\r\n.sebankid .sebankid-startapp .button {\r\n \r\n}\r\n\r\n/*\r\n#sebankid_startapp_message .lang .text {\r\n display: none;\r\n}\r\n#sebankid_startapp_message .lang:after {\r\n content: 'Starting the BankID application'\r\n}\r\n*/\r\n`\r\n },\r\n sebankid_thisdevice: {\r\n key: 'sebankid_thisdevice',\r\n label: '',\r\n css: `\r\n.sebankid .sebankid-this-device p {\r\n\r\n}\r\n.sebankid .sebankid-this-device .button {\r\n\r\n}\r\n`\r\n },\r\n sebankid_anotherdevice: {\r\n key: 'sebankid_anotherdevice',\r\n label: '',\r\n css: `\r\n.sebankid .sebankid-another-device .form-group label {\r\n\r\n}\r\n.sebankid .sebankid-another-device .form-group .input-text {\r\n \r\n}\r\n.sebankid .sebankid-another-device .button {\r\n \r\n}\r\n`\r\n }\r\n };\r\n}\r\n\r\nexport interface PreviewItem {\r\n id: string;\r\n styling?: keyof StylingContainer;\r\n label: string;\r\n htmlUrl: string;\r\n htmlCacheable?: boolean;\r\n afterRender?: (target: HTMLIFrameElement | Window) => void;\r\n afterScripts?: (target: HTMLIFrameElement | Window) => void;\r\n}\r\nexport interface PreviewCollection {\r\n key: string;\r\n label: string;\r\n styling?: keyof StylingContainer;\r\n items: PreviewItem[];\r\n languages: string[];\r\n};\r\n\r\nexport const DKNEMID_COLLECTION:PreviewCollection = {\r\n key: 'dknemid',\r\n label: 'DKNemID',\r\n styling: 'dknemid_shared',\r\n languages: ['da', 'en'],\r\n items: [\r\n {\r\n id: \"dknemidasync_keycardtemplate\",\r\n label: \"Key Card\",\r\n htmlUrl: '/dknemidasync/keycardlaunchtemplate?viewVersion=unified&language=$language&criiptoBranding=false',\r\n htmlCacheable: false\r\n }, {\r\n id: \"dknemidasync_cprentrytemplate\",\r\n styling: 'dknemid_cpr_entry',\r\n label: \"CPR Entry\",\r\n htmlUrl: '/dknemidasync/cprentrytemplate?viewVersion=unified&language=$language&isError=false&criiptoBranding=false'\r\n }, {\r\n id: \"dknemidasync_cprentrytemplate_error\",\r\n label: \"CPR Entry (With Error)\",\r\n styling: 'dknemid_cvr_select',\r\n htmlUrl: '/dknemidasync/cprentrytemplate?viewVersion=unified&language=$language&isError=true&criiptoBranding=false'\r\n }, {\r\n id: \"dknemidasync_cvrselecttemplate_few\",\r\n label: \"CVR Select (few companies)\",\r\n styling: 'dknemid_cvr_select',\r\n htmlUrl: '/dknemidasync/cvrselecttemplate?numCompanies=2&viewVersion=unified&language=$language&criiptoBranding=false'\r\n }, {\r\n id: \"dknemidasync_cvrselecttemplate_many\",\r\n label: \"CVR Select (many companies)\",\r\n styling: 'dknemid_cvr_select',\r\n htmlUrl: '/dknemidasync/cvrselecttemplate?numCompanies=15&viewVersion=unified&language=$language&criiptoBranding=false'\r\n }, {\r\n id: \"dknemidasync_errormessagetemplate_erstdown\",\r\n label: \"CVR Select (ERST Error)\",\r\n styling: 'dknemid_cvr_select',\r\n htmlUrl: \"/dknemidasync/errormessagetemplate?viewVersion=unified&language=$language&message=ERST%20Down&category=erstDown&criiptoBranding=false\"\r\n }, {\r\n id: \"dknemidasync_errormessagetemplate_notsignatory\",\r\n label: \"CVR Select (Not Signatory Error)\",\r\n styling: 'dknemid_cvr_select',\r\n htmlUrl: \"/dknemidasync/errormessagetemplate?viewVersion=unified&language=$language&message=Not%20company%20signatory&category=notSignatory&criiptoBranding=false\"\r\n }, {\r\n id: \"dknemidasync_errormessagetemplate_generic_error\",\r\n label: \"Generic Error\",\r\n htmlUrl: \"/dknemidasync/errormessagetemplate?viewVersion=unified&language=$language&message=An%20error%20occurred&category=blank&criiptoBranding=false\"\r\n }, {\r\n id: \"dknemidasync_codefiletemplate\",\r\n label: \"Code file\",\r\n htmlUrl: '/dknemidasync/codefilelaunchtemplate?viewVersion=unified&language=$language&criiptoBranding=false',\r\n htmlCacheable: false\r\n }\r\n ]\r\n};\r\n\r\nexport const SEBANKID_COLLECTION:PreviewCollection = {\r\n key: 'sebankid',\r\n label: 'SEBankID',\r\n styling: 'sebankid_shared',\r\n languages: ['sv', 'en'],\r\n items: [{\r\n id: \"sebankidasync_collecttemplate\",\r\n styling: 'sebankid_thisdevice',\r\n label: \"This Device: Auto-launch BankID App\",\r\n htmlUrl: '/sebankidasync/collecttemplate?viewVersion=unified&language=$language&criiptoBranding=false'\r\n }, {\r\n id: \"sebankidasync_collecttemplate_android\",\r\n label: \"This Device: Open BankID App on Android Prompt\",\r\n styling: 'sebankid_thisdevice',\r\n htmlUrl: '/sebankidasync/collecttemplate?viewVersion=unified&language=$language&criiptoBranding=false',\r\n afterRender: (target: HTMLIFrameElement | Window,) => {\r\n const targetDocument = (target as HTMLIFrameElement).contentDocument || (target as Window).document;\r\n if (targetDocument.getElementById('launchbox')) {\r\n targetDocument.getElementById('launchbox')!.classList.remove('hidden');\r\n }\r\n targetDocument.body.classList.add('is-android');\r\n }\r\n }, {\r\n id: \"sebankidasync_anotherdevicetemplate\",\r\n label: \"Another Device: Prompt for SSN\",\r\n styling: 'sebankid_anotherdevice',\r\n htmlUrl: '/sebankidasync/anotherdevicetemplate?viewVersion=unified&language=$language&criiptoBranding=false'\r\n }, {\r\n id: \"sebankidasync_startapptemplate\",\r\n label: \"Another Device: Prompt for App Start\",\r\n styling: 'sebankid_startapp',\r\n htmlUrl: '/sebankidasync/startapptemplate?viewVersion=unified&language=$language&criiptoBranding=false'\r\n }, {\r\n id: \"sebankidasync_error\",\r\n label: \"Generic Error\",\r\n htmlUrl: '/sebankidasync/collecttemplate?viewVersion=unified&language=$language&criiptoBranding=false',\r\n afterRender: (target: HTMLIFrameElement | Window) => {\r\n const targetDocument = (target as HTMLIFrameElement).contentDocument || (target as Window).document;\r\n if (targetDocument.getElementById('user')) {\r\n targetDocument.getElementById('user')!.innerHTML = \"User-oriented error message\";\r\n }\r\n if (targetDocument.getElementById('error')) {\r\n targetDocument.getElementById('error')!.innerHTML = \"Technical details error message\";\r\n }\r\n targetDocument.body.classList.add('has-error');\r\n }\r\n }]\r\n}\r\n\r\nexport const DKMITID_COLLECTION:PreviewCollection = {\r\n key: 'dkmitid',\r\n //styling: 'dkmitid_shared',\r\n label: 'DKMitID',\r\n languages: ['da', 'en'],\r\n items: [{\r\n id: \"dknmit_brokertemplate\",\r\n label: \"MitID Broker\",\r\n htmlUrl: '/dkmitid/brokertemplate?language=$language&criiptoBranding=false',\r\n htmlCacheable: false,\r\n afterScripts: (target: HTMLIFrameElement | Window) => {\r\n const window = (target as HTMLIFrameElement).contentWindow || (target as Window);\r\n if (window && (window as any).initializeCoreClient) {\r\n (window as any).initializeCoreClient();\r\n }\r\n }\r\n }, {\r\n id: \"dkmitid_cprentrytemplate\",\r\n label: \"CPR Entry\",\r\n htmlUrl: '/dkmitid/cprentrytemplate?language=$language&isError=false&criiptoBranding=false'\r\n }, {\r\n id: \"dkmitid_cprentrytemplate_error\",\r\n label: \"CPR Entry (With Error)\",\r\n htmlUrl: '/dkmitid/cprentrytemplate?language=$language&isError=true&criiptoBranding=false'\r\n }]\r\n};\r\n\r\nexport const collections:PreviewCollection[] = [DKNEMID_COLLECTION, SEBANKID_COLLECTION, DKMITID_COLLECTION];\r\n\r\nexport const HEADER_HEIGHT = 115;\r\nexport const TOOLBAR_TOP_HEIGHT = 50;","// src/Auth/Auth.js\r\n\r\nimport {WebAuth} from 'auth0-js';\r\n\r\nvar _requestActiveSemaphor = false;\r\nvar _tenantAuthResults = {};\r\nvar _tenantAuthRequests = {};\r\n\r\nclass Auth {\r\n\r\n _userProfile;\r\n\r\n constructor() {\r\n this.auth0 = new WebAuth({\r\n domain: window.appConfig.auth0.domain,\r\n clientID: window.appConfig.auth0.clientID,\r\n redirectUri: window.location.origin + '/callback'\r\n });\r\n\r\n this.login = this.login.bind(this);\r\n this.logout = this.logout.bind(this);\r\n this.processAuthentication = this.processAuthentication.bind(this);\r\n this.getAccessToken = this.getAccessToken.bind(this);\r\n this.isAuthenticated = this.isAuthenticated.bind(this);\r\n this.isCallback = this.isCallback.bind(this);\r\n\r\n this._requestCache = {};\r\n this._resultCache = {};\r\n }\r\n\r\n login() {\r\n var options = {\r\n responseType: 'token id_token',\r\n scope: 'openid profile'\r\n };\r\n this.auth0.authorize(options);\r\n }\r\n \r\n getTenantAccessToken(tenantid, audience) {\r\n if (!tenantid || !audience) throw new Error('getTenantAccessToken: tenantid, audience required')\r\n\r\n if (!this._requestCache[tenantid]) {\r\n this._requestCache[tenantid] = {};\r\n }\r\n if (!this._requestCache[tenantid][audience]) {\r\n this._requestCache[tenantid][audience] = new Promise((resolve, reject) => {\r\n let authResult = this._resultCache[tenantid] && this._resultCache[tenantid][audience];\r\n if (!authResult || authResult.isExpired()) {\r\n this.silentLogin(audience, 'openid tenant:' + tenantid)\r\n .then(authResult => {\r\n var expiresAt = JSON.stringify((authResult.expiresIn * 1000) + Date.now());\r\n authResult.isExpired = function() {\r\n return Date.now() >= expiresAt;\r\n }\r\n\r\n this._resultCache[tenantid] = this._resultCache[tenantid] || {};\r\n this._resultCache[tenantid][audience] = authResult;\r\n resolve(authResult.accessToken)\r\n }).catch(reject);\r\n\r\n }\r\n else {\r\n resolve(authResult.accessToken);\r\n }\r\n });\r\n\r\n this._requestCache[tenantid][audience].then(() => {\r\n delete this._requestCache[tenantid][audience]\r\n }).catch(() => {\r\n delete this._requestCache[tenantid][audience]\r\n });\r\n }\r\n return this._requestCache[tenantid][audience];\r\n }\r\n\r\n getSubscriptionAccessToken(tenantid) {\r\n return this.getTenantAccessToken(tenantid, window.appConfig.subscriptionApi.audience);\r\n }\r\n\r\n getVerifyAccessToken(tenantid) {\r\n return this.getTenantAccessToken(tenantid, window.appConfig.criiptoVerify.audience);\r\n }\r\n\r\n getPermitAccessToken() {\r\n return this.silentLogin(window.appConfig.criiptoPermit.audience, '').then(authResult => authResult.accessToken);\r\n }\r\n\r\n // returns an access token for the requested audience\r\n silentLogin(audience, scope) {\r\n return new Promise((resolve, reject) => {\r\n if (!_requestActiveSemaphor) {\r\n _requestActiveSemaphor = true;\r\n let options = {\r\n audience: audience || window.appConfig.criiptoPermit.audience,\r\n scope: scope || 'openid',\r\n responseType: 'token id_token',\r\n };\r\n this.auth0.checkSession(options, function (err, authResult) {\r\n _requestActiveSemaphor = false;\r\n if (err) {\r\n reject(err);\r\n } else if (!authResult || !authResult.accessToken) {\r\n reject({ message: 'No access token returned' });\r\n } else {\r\n resolve(authResult);\r\n }\r\n });\r\n }\r\n else {\r\n this.delay(1000)\r\n .then(() => {\r\n return this.silentLogin(audience, scope);\r\n })\r\n .then(authResult => {\r\n resolve(authResult);\r\n });\r\n }\r\n });\r\n }\r\n\r\n delay(timeout) {\r\n return new Promise((resolve, reject) => {\r\n setTimeout(resolve, timeout);\r\n });\r\n }\r\n\r\n processAuthentication() {\r\n var that = this;\r\n return new Promise((resolve, reject) => {\r\n that.auth0.parseHash((err, authResult) => {\r\n if (authResult && authResult.accessToken && authResult.idToken) {\r\n that.setSession(authResult);\r\n resolve();\r\n } else if (err) {\r\n reject(err);\r\n } else {\r\n reject(new Error('authResult did not contain expected {accessToken, idToken}'));\r\n }\r\n });\r\n });\r\n }\r\n\r\n setSession(authResult) {\r\n // Set the time that the Access Token will expire at\r\n let expiresAt = JSON.stringify((authResult.expiresIn * 1000) + Date.now());\r\n sessionStorage.setItem('access_token', authResult.accessToken);\r\n sessionStorage.setItem('id_token', authResult.idToken);\r\n sessionStorage.setItem('expires_at', expiresAt);\r\n // navigate to the home route\r\n }\r\n\r\n logout() {\r\n // Clear Access Token and ID Token from local storage\r\n sessionStorage.removeItem('access_token');\r\n sessionStorage.removeItem('id_token');\r\n sessionStorage.removeItem('expires_at');\r\n // navigate to the home route\r\n }\r\n\r\n getAccessToken() {\r\n if (this.isAuthenticated()) return sessionStorage.getItem('access_token');\r\n return null;\r\n }\r\n\r\n getProfile() {\r\n let that = this;\r\n return new Promise((resolve, reject) => {\r\n if (that.isAuthenticated() && that._userProfile) {\r\n resolve(that._userProfile);\r\n }\r\n else {\r\n let accessToken = that.getAccessToken();\r\n if (accessToken) {\r\n that.auth0.client.userInfo(accessToken, (err, profile) => {\r\n if (profile) {\r\n that._userProfile = profile;\r\n resolve(profile);\r\n }\r\n else {\r\n reject(err);\r\n }\r\n });\r\n } else {\r\n reject('Not Authenticated');\r\n }\r\n }\r\n });\r\n }\r\n\r\n isCallback() {\r\n return /access_token|id_token|error/.test(window.location.hash);\r\n }\r\n\r\n isAuthenticated() {\r\n // Check whether the current time is past the \r\n // Access Token's expiry time\r\n let expiresAt = JSON.parse(sessionStorage.getItem('expires_at'));\r\n return Date.now() < expiresAt;\r\n }\r\n\r\n _roles = {};\r\n hasPermission(permission) {\r\n\r\n }\r\n\r\n}\r\n\r\nlet _singleton = null;\r\nAuth.singleton = function() {\r\n if (!_singleton) {\r\n _singleton = new Auth();\r\n }\r\n return _singleton;\r\n}\r\n\r\nexport default Auth;","import {createSlice, PayloadAction} from '@reduxjs/toolkit';\r\nimport last from 'lodash/last';\r\n\r\nconst ZOOM_STEPS = [\r\n 0.1,\r\n 0.25,\r\n 0.33,\r\n 0.50,\r\n 0.67,\r\n 0.75,\r\n 0.8,\r\n 0.9,\r\n 1,\r\n 1.1,\r\n 1.25,\r\n 1.5,\r\n 1.75,\r\n 2,\r\n 2.5,\r\n 3,\r\n 4,\r\n 5\r\n];\r\n\r\nconst zoomGuard = (value: number):number => {\r\n return Math.max(0.10, value);\r\n};\r\n\r\nexport default createSlice({\r\n name: 'zoom',\r\n initialState: 1,\r\n reducers: {\r\n set: (state, action: PayloadAction) => zoomGuard(action.payload),\r\n stepOut(state) {\r\n let step = last(ZOOM_STEPS.filter(search => search <= state))!;\r\n step = step === last(ZOOM_STEPS) ? step : ZOOM_STEPS[ZOOM_STEPS.indexOf(step) + 1];\r\n return zoomGuard(step);\r\n },\r\n stepIn(state) {\r\n let step = ZOOM_STEPS.find(search => search >= state)!;\r\n step = step === ZOOM_STEPS[0] ? step : ZOOM_STEPS[ZOOM_STEPS.indexOf(step) - 1];\r\n return zoomGuard(step);\r\n }\r\n }\r\n});","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\r\nimport { StylingContainer, StylingRequest, Variables, createStyling } from '../screens/App/screens/Tenant/screens/Customization/constants';\r\nimport { Environment } from '../types';\r\n\r\ntype SliceState = {\r\n environment: Environment,\r\n styling: StylingContainer,\r\n variables: Variables,\r\n requestId: string\r\n};\r\n\r\nexport const initialState:SliceState = {\r\n requestId: Math.random().toString(),\r\n environment: \"TEST\",\r\n styling: createStyling(),\r\n variables: {}\r\n};\r\n\r\nconst defaultStyling = createStyling();\r\n\r\nexport default createSlice({\r\n name: 'customization',\r\n initialState: initialState,\r\n reducers: {\r\n setEnvironment: (state, action: PayloadAction) => ({\r\n ...state,\r\n requestId: Math.random().toString(), // Always force refetch of data on environment change\r\n environment: action.payload\r\n }),\r\n updateCss: (state, action: PayloadAction<{key: keyof StylingContainer, css: string}>) => {\r\n return {\r\n ...state,\r\n styling: {\r\n ...state.styling,\r\n [action.payload.key]: {\r\n ...state.styling[action.payload.key],\r\n css: action.payload.css\r\n }\r\n }\r\n }\r\n },\r\n setStyling: (state, action: PayloadAction) => {\r\n const styling:StylingContainer = Object.keys(defaultStyling).reduce((memo: StylingContainer, key: string) => {\r\n memo[key as keyof StylingContainer] = {\r\n ...defaultStyling[key as keyof StylingContainer],\r\n css: action.payload[key as keyof StylingContainer].css || defaultStyling[key as keyof StylingContainer].css\r\n };\r\n\r\n return memo;\r\n }, {} as StylingContainer);\r\n\r\n return {\r\n ...state,\r\n styling\r\n }\r\n },\r\n updateVariable: (state, action: PayloadAction<{key: keyof Variables, value: string}>) => {\r\n return {\r\n ...state,\r\n variables: {\r\n ...state.variables,\r\n [action.payload.key]: action.payload.value\r\n }\r\n };\r\n },\r\n setVariables: (state, action: PayloadAction) => {\r\n return {\r\n ...state,\r\n variables: {\r\n ...state.variables,\r\n ...action.payload\r\n }\r\n };\r\n },\r\n reset: (state) => {\r\n return {\r\n ...state,\r\n styling: createStyling(),\r\n variables: {}\r\n };\r\n }\r\n }\r\n});","import {configureStore, combineReducers} from '@reduxjs/toolkit';\r\nimport zoomSlice from './zoom';\r\nimport customizationSlice from './customization';\r\n\r\nconst rootReducer = combineReducers({\r\n zoom: zoomSlice.reducer,\r\n customization: customizationSlice.reducer\r\n});\r\n\r\nexport {zoomSlice as zoomSlice};\r\nexport {customizationSlice as customizationSlice};\r\nexport type ReduxRootState = ReturnType;\r\nexport function createStore() {\r\n return configureStore({\r\n reducer: rootReducer\r\n });\r\n}\r\nexport const store = createStore();","import axios, {AxiosInstance, AxiosResponse} from 'axios';\r\nimport {Tenant, Environment} from 'types';\r\nimport Auth from './auth';\r\n\r\ntype GenericObject = {\r\n [key: string]: any\r\n};\r\n\r\nexport type VerifyDomain = {\r\n name: string;\r\n production: boolean;\r\n links: {rel: string, href: string}[]\r\n};\r\n\r\ntype IdServicesStyling = {\r\n testStyle: {\r\n cssUrl: string;\r\n viewVersion: \"initial\" | \"unified\"\r\n },\r\n prodStyle: {\r\n cssUrl: string;\r\n viewVersion: \"initial\" | \"unified\"\r\n }\r\n}\r\n\r\nlet _singleton:CriiptoVerify;\r\n\r\nclass CriiptoVerify {\r\n _url: string;\r\n _accessToken?: string;\r\n _axios?: AxiosInstance;\r\n _links?: GenericObject;\r\n _tenantLinks?: GenericObject[];\r\n _linkTemplates?: GenericObject;\r\n\r\n constructor() {\r\n // remove potential trailing slash\r\n this._url = (window as any).appConfig.criiptoVerify.url.replace(/\\/+$/, \"\");\r\n }\r\n\r\n async setup(tenantId: string) {\r\n const auth = Auth.singleton();\r\n\r\n if (this._accessToken && this._links && this._linkTemplates) return\r\n\r\n this._accessToken = await auth.getVerifyAccessToken(tenantId);\r\n\r\n this._axios = axios.create({\r\n baseURL: this._url,\r\n headers: { 'Authorization': 'Bearer ' + this._accessToken }\r\n });\r\n\r\n const discoveryResponse = await this._axios!.get('/');\r\n this._links = this._extractLinks(discoveryResponse.data.links);\r\n this._linkTemplates = this._extractLinks(discoveryResponse.data.linkTemplates);\r\n\r\n const tenantsResponse = await this._axios!.get(this._links['easyid:tenants']);\r\n this._tenantLinks = tenantsResponse.data.tenants.map((tenant: GenericObject) => {\r\n tenant.links = this._extractLinks(tenant.links);\r\n tenant.linkTemplates = this._extractLinks(tenant.linkTemplates);\r\n return tenant;\r\n });\r\n }\r\n \r\n async getTenantLink(tenant: Tenant, link: string) : Promise {\r\n await this.setup(tenant.value);\r\n const found = this._tenantLinks!.find(search => search.entityId === tenant.entityId);\r\n return found && found.links[link];\r\n }\r\n\r\n async getTenantLinkTemplate(tenant: Tenant, link: string) : Promise {\r\n await this.setup(tenant.value);\r\n const found = this._tenantLinks!.find(search => search.entityId === tenant.entityId);\r\n return found && found.linkTemplates[link];\r\n }\r\n\r\n async getTenantDomains(tenant: Tenant, environment: Environment | null) : Promise {\r\n await this.setup(tenant.value);\r\n const url = await this.getTenantLink(tenant, 'easyid:tenant-domains');\r\n const response = await this._axios!.get(url);\r\n const domains:VerifyDomain[] = response.data.domains || [];\r\n return environment ? domains.filter(domain => domain.production === (environment === \"PRODUCTION\" ? true : false)) : domains;\r\n }\r\n\r\n async getIdServicesStylings(tenant: Tenant) : Promise {\r\n await this.setup(tenant.value);\r\n\r\n const url = await this.getTenantLink(tenant, 'easyid:id-services-styling');\r\n const response = await this._axios!.get(url);\r\n const data:IdServicesStyling = response.data;\r\n\r\n return data;\r\n }\r\n\r\n async updateIdServicesStylings(tenant: Tenant, styling: IdServicesStyling) {\r\n await this.setup(tenant.value);\r\n\r\n const url = await this.getTenantLink(tenant, 'easyid:id-services-styling');\r\n await this._axios!.post(url, styling, {\r\n headers: {\r\n \"Content-Type\": `application/vnd.grn.easyid.id-services-stylings+json`\r\n }\r\n });\r\n }\r\n\r\n _extractLinks(linkArray:{rel: string, href: string}[]) {\r\n let links:GenericObject = {};\r\n linkArray.forEach(element => {\r\n links[element.rel] = element.href;\r\n });\r\n return links;\r\n }\r\n\r\n static singleton():CriiptoVerify {\r\n if (!_singleton) {\r\n _singleton = new CriiptoVerify();\r\n }\r\n return _singleton;\r\n }\r\n}\r\n\r\nexport default CriiptoVerify;\r\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAWtQTFRFAAAA8Mx878p88cp76r+A//8A7sx/8Ml88Mh9/7+A7sp78Mp88Ml778p6/7+A8ct68Ml88Ml88MN478h+8Mh78Ml98Mh88Ml88Ml88Ml88Ml88Ml88cl98Ml88Ml88Ml878l88Ml88syA8Ml88Ml88Ml88cl88cp778h878l88Ml78Ml88Ml98Mp78Ml78Mp78Ml78Ml88Ml878l87sx3/6pV8ch88Mp88Ml888d8/9tt8Mh878l88Mp878+A8cp88Ml878l748Zx8ch88st87ciA78d88cd988WA8Ml878eA8sl5//+A/8xm8Ml788558caA8Mh88Ml88Ml8/9WA7st678l88Ml88Mh+9cx68Mh98Ml87ciA7cp98Ml98cp98Ml88Mp968R268SA8Ml88Ml88Ml88Ml88Ml78Ml88Mp88Ml88Ml87MZ788h58Ml85syA8MuA78h98Ml88Ml88Ml88Ml878l88Ml8pV17NgAAAHl0Uk5TACNzbgwBHopmBE3SvDAISefAEUGVrq2vyPPqvbDG+OuziBTL//3DfG9xnenZmd14evT8kg8DSs21KQdG5r8Q5fmTCSUnDk43FvYgEwIFdhUkmvHcBizF2EUZh6YcK4U12lYNGnfslpzfx4b1pRsq/goikfLh4Pqi+4HJInMAAAFDSURBVHicbZD7O8JgFMdPaWUuk1S8UTGLZYpiKGGVUNaFlkSuyZ1c48/3brI9j+3zy3ue83me8z3nBZAxmbssSkFYbd0kqJA9vX39SkUN2Acdv80hp8s9PII8o26ZMa/PP47fCRomGSMCU4C802xwhpu1sTLmEArPsex8JApoYRH4peWVmDI4vppYWwewbAiAkrhIpTc7e2S2tgksElg4dygdtF2AbFTw6WGwMNwKCxTK7erIcZ3w/yjhWBA8iVchSB73xDyvCrrA2ZPF0t5+2SxVDlD18E/UjoTscf3ExfhPU2fnjOdCHUVZTRYgLtO5PIiOWINQhZiXRDxdknAST5FaxlXTc10s3URuC/HKXbasZdz7Hh6fnl0tOaPa4rSMeK2eAuLF2iBBzLzSWobxgW8ZY9F8/wjr+Ay04evb6HPbwR8eNlK5WtX3yAAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"static/media/logo-criipto-white-2.e4ac1f94.svg\";","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nconst Wrapper = styled.div`\r\n border-bottom: 1px solid #faf8f5;\r\n height: 37px;\r\n`;\r\n\r\nconst Inner = styled.div`\r\n margin: 1px 0px;\r\n height: 35px;\r\n border-right: 10px solid ${props => props.color};\r\n cursor: pointer;\r\n\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n`;\r\n\r\nexport const CheckboxWrapper = styled.div`\r\n width: 17px;\r\n height: 17px;\r\n flex: 0 0 17px;\r\n border: 1px solid ${props => props.color};\r\n background-color: ${props => props.selected ? props.color : '#FFF'};\r\n border-radius: 3px;\r\n margin: 0px 14px;\r\n color: #FFF;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n & span {\r\n color: #FFF;\r\n font-weight: 700;\r\n font-size: 14px;\r\n }\r\n`;\r\n\r\nconst Label = styled.div`\r\n min-width: 0; // flexbox overflow fix\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n`;\r\n\r\nexport function Checkbox(props) {\r\n return (\r\n {props.selected && }\r\n )\r\n}\r\n\r\nexport default function Legend({color, onToggle, selected, label}) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\n\r\nLegend.propTypes = {\r\n label: PropTypes.string.isRequired,\r\n color: PropTypes.string.isRequired,\r\n onToggle: PropTypes.func.isRequired,\r\n selected: PropTypes.bool.isRequired\r\n};","import axios from 'axios';\r\nimport Auth from 'services/auth';\r\n\r\nclass criiptoPermit {\r\n\r\n _url;\r\n _accessToken;\r\n _axios;\r\n _links;\r\n _linkTemplates\r\n _organizations;\r\n\r\n // constants\r\n _scopedUserClaimsRel = 'gauss:scoped-user-claims';\r\n _encVerifyAppId;\r\n _encSubscriptionAppId;\r\n\r\n constructor() {\r\n\r\n // Base64 encode for use in API\r\n this._encVerifyAppId = window.btoa(window.appConfig.criiptoPermit.verifyAppId);\r\n this._encSubscriptionAppId = window.btoa(window.appConfig.criiptoPermit.subscriptionAppId);\r\n\r\n // remove potential trailing slash\r\n this._url = window.appConfig.criiptoPermit.url.replace(/\\/+$/, \"\");\r\n\r\n this._organizations = {};\r\n }\r\n\r\n isAuthorizationReady() {\r\n return Object.keys(this._organizations).length > 0;\r\n }\r\n \r\n isAuthorized(selectedTenant, requiredRole) {\r\n return (selectedTenant \r\n && selectedTenant.roles // selectedTenant may be just a string\r\n && selectedTenant.roles.indexOf(requiredRole) >= 0);\r\n }\r\n\r\n getAPI() {\r\n\r\n let that = this;\r\n const auth = Auth.singleton();\r\n\r\n return new Promise((resolve, reject) => {\r\n if (that._accessToken && that._links && that._linkTemplates) {\r\n resolve();\r\n return;\r\n }\r\n\r\n auth.getPermitAccessToken()\r\n .then(token => {\r\n that._accessToken = token;\r\n that._axios = axios.create({\r\n baseURL: that._url,\r\n headers: { 'Authorization': 'Bearer ' + that._accessToken }\r\n });\r\n })\r\n .then(() => {\r\n return that._axios.get('/');\r\n })\r\n .then(res => {\r\n that._links = that._extractLinks(res.data.links);\r\n that._linkTemplates = that._extractLinks(res.data.linkTemplates);\r\n resolve();\r\n })\r\n .catch(error => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n\r\n getTenants(force) {\r\n let that = this;\r\n\r\n if (Object.keys(this._organizations).length <= 0 || force) {\r\n return this.getAPI().then(() => {\r\n var template = that._linkTemplates[that._scopedUserClaimsRel];\r\n if (!template) return {};\r\n\r\n let url = template.replace('{application}', that._encVerifyAppId);\r\n return that._axios.get(url).then(res => {\r\n // Don't bother about the role claims for the Verify application. Only interested in user-admin\r\n this._organizations = this._mergeOrgsWithScopes(this._organizations, res.data.claimScopes, false);\r\n let url = that._linkTemplates[that._scopedUserClaimsRel].replace('{application}', that._encSubscriptionAppId);\r\n return that._axios.get(url)\r\n })\r\n .then(res => {\r\n // Include the role claims for the Subscription application\r\n this._organizations = this._mergeOrgsWithScopes(this._organizations, res.data.claimScopes, true);\r\n return this._organizations;\r\n })\r\n });\r\n }\r\n else {\r\n return Promise.resolve(this._organizations);\r\n }\r\n }\r\n\r\n\r\n _extractLinks(linkArray) {\r\n let links = {};\r\n linkArray.forEach(element => {\r\n links[element.rel] = element.href;\r\n });\r\n return links;\r\n }\r\n\r\n _mergeOrgsWithScopes(currentOrgs, newScopes, includeApplicationRoles) {\r\n let resultingOrgs = {};\r\n newScopes.forEach(scope => {\r\n let entityId = scope.organization.entityIdentifier;\r\n let name = scope.organization.name;\r\n let roles = [];\r\n scope.userClaims.forEach(claim => {\r\n if (claim.type === 'http://schemas.grean.com/claims/authorizationservice/permission' &&\r\n (claim.value === 'user-admin' || claim.value === 'see-users')) {\r\n roles.push('permit-' + claim.value);\r\n }\r\n else if (includeApplicationRoles && claim.type === 'role') {\r\n roles.push(claim.value);\r\n }\r\n });\r\n var organization = currentOrgs[entityId];\r\n if (organization) {\r\n roles.forEach(role => {\r\n if (organization.roles.indexOf(role) < 0) {\r\n organization.roles.push(role);\r\n }\r\n });\r\n }\r\n else {\r\n organization = {\r\n id: entityId.substring(entityId.lastIndexOf(':') + 1),\r\n verifyId: 'urn:grn:easyid:tenant:' + scope.organization.id,\r\n entityId: entityId,\r\n encEntityId: window.btoa(entityId),\r\n value: window.btoa(entityId),\r\n name: name,\r\n roles: roles\r\n };\r\n }\r\n resultingOrgs[organization.encEntityId] = organization;\r\n });\r\n Object.getOwnPropertyNames(currentOrgs).forEach(entityId => {\r\n resultingOrgs[entityId] = resultingOrgs[entityId] || currentOrgs[entityId];\r\n });\r\n return resultingOrgs;\r\n }\r\n\r\n}\r\n\r\nlet _singleton = null;\r\ncriiptoPermit.singleton = function() {\r\n if (!_singleton) {\r\n _singleton = new criiptoPermit();\r\n }\r\n return _singleton;\r\n}\r\n\r\n\r\nexport default criiptoPermit;\r\n","import { useEffect, useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport criiptoPermit from '../services/criiptoPermit';\r\nimport {Tenant} from '../types';\r\n\r\ntype Response = [\r\n Tenant | null,\r\n {\r\n error: string | null,\r\n loading: boolean\r\n }\r\n];\r\n\r\nexport default function useTenant():Response {\r\n const permitSvc = criiptoPermit.singleton();\r\n const params = useParams<{tenantid: string}>();\r\n const [tenants, setTenants] = useState(Object.values(permitSvc._organizations || {}));\r\n const [error, setError] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!params.tenantid) return;\r\n\r\n setLoading(true);\r\n permitSvc.getTenants().then((tenants:any) => {\r\n setTenants(Object.values(tenants));\r\n }).catch((error: any) => {\r\n setError(error);\r\n }).finally(() => {\r\n setLoading(false);\r\n })\r\n }, []);\r\n\r\n const tenant = tenants.find(search => search.encEntityId === params.tenantid) || null;\r\n\r\n return [\r\n tenant,\r\n {\r\n error,\r\n loading\r\n }\r\n ];\r\n}","import React from 'react';\r\n\r\nexport type FeaturesConfig = {\r\n CustomizationScreen: boolean\r\n}\r\nexport type Config = {\r\n auth0: {\r\n clientID: string\r\n domain: string\r\n },\r\n criiptoPermit: {\r\n audience: string\r\n verifyAppId: string\r\n subscriptionAppId: string\r\n url: string\r\n },\r\n criiptoVerify: {\r\n audience: string\r\n url: string\r\n },\r\n subscriptionApi: {\r\n audience: string\r\n url: string\r\n },\r\n stripe: {\r\n key: string\r\n },\r\n locale: string,\r\n features: FeaturesConfig\r\n}\r\n\r\nexport default React.createContext({\r\n auth0: {\r\n clientID: \"\",\r\n domain: \"\"\r\n },\r\n criiptoPermit: {\r\n audience: \"\",\r\n verifyAppId: \"\",\r\n subscriptionAppId: \"\",\r\n url: \"\"\r\n },\r\n criiptoVerify: {\r\n audience: \"\",\r\n url: \"\"\r\n },\r\n subscriptionApi: {\r\n audience: \"\",\r\n url: \"\"\r\n },\r\n stripe: {\r\n key: \"\"\r\n },\r\n locale: \"\",\r\n features: {\r\n CustomizationScreen: false\r\n }\r\n});\r\n","import React from 'react';\r\nimport { Redirect } from 'react-router';\r\nimport { Route } from 'react-router-dom';\r\nimport Auth from 'services/auth';\r\n\r\nconst AuthenticatedRoute = ({ component: Component, ...rest }) => {\r\n const auth = Auth.singleton();\r\n\r\n return (\r\n \r\n auth.isAuthenticated() ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n};\r\n\r\nexport default AuthenticatedRoute\r\n","import React, { Component } from 'react';\r\nimport { Redirect } from 'react-router';\r\nimport Auth from 'services/auth';\r\n\r\nexport class LoginScreen extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n if (props.location && props.location.state && props.location.state.from) {\r\n sessionStorage.setItem('originalUrl', props.location.state.from.pathname || '/')\r\n }\r\n \r\n this.state = {\r\n \r\n }\r\n }\r\n \r\n render() {\r\n const auth = Auth.singleton();\r\n\r\n if (!auth.isAuthenticated()) {\r\n auth.login();\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default LoginScreen\r\n","import React, { Component } from 'react';\r\nimport { Redirect } from 'react-router';\r\nimport Auth from 'services/auth';\r\n\r\nexport class CallbackScreen extends Component {\r\n\r\n originalUrl;\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n }\r\n }\r\n \r\n processCallback() {\r\n let that = this;\r\n\r\n const auth = Auth.singleton();\r\n if (auth.isCallback()) {\r\n auth.processAuthentication()\r\n .then(() => {\r\n let returnUrl = sessionStorage.getItem('originalUrl') || '/';\r\n sessionStorage.removeItem('originalUrl');\r\n that.setState( { next: returnUrl });\r\n })\r\n .catch(err => {\r\n console.log('Authentication error: ');\r\n console.log(err);\r\n });\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.processCallback();\r\n }\r\n\r\n render() {\r\n if (this.state.next) {\r\n return (\r\n \r\n );\r\n }\r\n else {\r\n return (
loading...
);\r\n }\r\n }\r\n}\r\n\r\nexport default CallbackScreen","import React, { Component } from 'react'\r\nimport { Link } from 'react-router-dom';\r\n\r\nexport class DropDownMenu extends Component {\r\n\r\n itemSelected(item) {\r\n let thisItem = item;\r\n let that = this;\r\n return (event) => {\r\n that.props.onSelected(thisItem);\r\n }\r\n }\r\n\r\n render() {\r\n let menuItems = [];\r\n if (this.props.source) {\r\n this.props.source.forEach(item => { \r\n let id = item.id || '';\r\n menuItems.push(\r\n
  • \r\n {item.name + (id ? ' (' + id + ')' : '')}\r\n
  • \r\n )\r\n });\r\n }\r\n return (\r\n
  • \r\n \r\n {this.props.displayName} \r\n \r\n \r\n
      \r\n {menuItems}\r\n
    \r\n
  • \r\n )\r\n }\r\n}\r\n\r\nexport default DropDownMenu\r\n","import React, { Component } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport DropDownMenu from 'components/DropDownMenu';\r\nimport Auth from 'services/auth';\r\nimport criiptoPermit from 'services/criiptoPermit';\r\nimport './LoginManager.css';\r\n\r\nexport class LoginManager extends Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n profile: {},\r\n tenantsForDropdown: undefined\r\n }\r\n\r\n this.tenantSelected = this.tenantSelected.bind(this);\r\n this.logout = this.logout.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.updateProfile();\r\n this.updateTenantList();\r\n }\r\n\r\n updateProfile() {\r\n let that = this;\r\n const auth = Auth.singleton();\r\n auth.getProfile()\r\n .then(profile => {\r\n if (profile.sub !== that.state.profile.sub)\r\n that.setState({ profile: profile });\r\n });\r\n }\r\n\r\n _processingTenants = false;\r\n\r\n updateTenantList() {\r\n let that = this;\r\n const permitSvc = criiptoPermit.singleton();\r\n\r\n if (!this.state.tenantsForDropdown && !this._processingTenants) {\r\n that._processingTenants = true;\r\n permitSvc.getTenants()\r\n .then(tenants => {\r\n // FILTER OUT THOSE WITHOUT ROLES which means NO ACCESS\r\n \r\n let id = that.props.match.params.tenantid;\r\n let selectedTenant;\r\n let tenantsForDropdown = Object.values(tenants)\r\n .filter(tenant => { \r\n \r\n return tenant.roles && (tenant.roles.includes('financials') || tenant.roles.includes('reporting')); \r\n })\r\n .map(tenant => {\r\n let tnt = { name: tenant.name, value: tenant.encEntityId, roles: tenant.roles, id: tenant.entityId.substring(tenant.entityId.lastIndexOf(':') + 1) };\r\n if (tnt.value === that.props.match.params.tenantid)\r\n selectedTenant = tnt;\r\n return tnt;\r\n });\r\n\r\n if (tenantsForDropdown.length === 0) {\r\n if (that.props.onNoTenants) {\r\n that.props.onNoTenants();\r\n }\r\n }\r\n\r\n selectedTenant = selectedTenant || (tenantsForDropdown && tenantsForDropdown.length > 0 ? tenantsForDropdown[0]: undefined);\r\n that.setState({\r\n tenantsForDropdown: tenantsForDropdown,\r\n selectedTenant: selectedTenant\r\n });\r\n if (selectedTenant) {\r\n if (that.props.onTenantSelected)\r\n that.props.onTenantSelected(selectedTenant);\r\n }\r\n })\r\n .finally(() => {\r\n that._processingTenants = false;\r\n });\r\n }\r\n }\r\n\r\n tenantSelected(item) {\r\n if (this.props.onTenantSelected)\r\n this.props.onTenantSelected(item);\r\n this.setState({ selectedTenant: item });\r\n }\r\n\r\n logout() {\r\n const auth = Auth.singleton();\r\n auth.logout();\r\n }\r\n\r\n render() {\r\n return (\r\n );\r\n }\r\n}\r\n\r\nexport default LoginManager\r\n\r\nLoginManager.propTypes = {\r\n onTenantSelected: PropTypes.func\r\n};","import React, { Component } from 'react';\r\nimport './MenuBar.css';\r\n\r\nclass MenuBar extends Component {\r\n render() {\r\n return (\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default MenuBar;\r\n","import React, {useContext} from 'react';\r\nimport { Link, useRouteMatch } from 'react-router-dom';\r\nimport './MenuBarItem.css';\r\nimport criiptoPermit from '../../../../../../services/criiptoPermit';\r\nimport useTenant from '../../../../../../hooks/useTenant';\r\nimport ConfigContext, {Config, FeaturesConfig} from '../../../../../../config-context';\r\n\r\ninterface Props {\r\n goto: string;\r\n name: string;\r\n requiredRole: string;\r\n requiredFeature?: keyof FeaturesConfig\r\n};\r\n\r\nexport default function MenuBarItem(props: Props) {\r\n const permitSvc = criiptoPermit.singleton();\r\n const config = useContext(ConfigContext);\r\n const [tenant] = useTenant();\r\n const match = useRouteMatch({\r\n path: `/:tenantid/${props.goto}`,\r\n });\r\n\r\n if (!tenant) return null;\r\n if (props.requiredRole && !permitSvc.isAuthorized(tenant, props.requiredRole)) return null;\r\n if (props.requiredFeature && !config.features[props.requiredFeature]) return null;\r\n\r\n return (\r\n
  • \r\n {props.name}\r\n
  • \r\n );\r\n}","\r\nimport axios from 'axios';\r\nimport Auth from './auth';\r\n\r\nclass SubscriptionManagement {\r\n\r\n url;\r\n\r\n constructor() {\r\n // remove potential trailing slash\r\n this.url = window.appConfig.subscriptionApi.url.replace(/\\/+$/, \"\"); \r\n axios.defaults.headers.common['Accept'] = 'application/json';\r\n }\r\n\r\n getPlans(tenantId) {\r\n var that = this;\r\n return new Promise((resolve, reject) => {\r\n axios.get(that.url + \"/plan\")\r\n .then(res => {\r\n resolve(res.data.plans);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n saveSubscription(tenantId, data) {\r\n var that = this;\r\n const auth = Auth.singleton();\r\n return new Promise((resolve, reject) => {\r\n auth.getSubscriptionAccessToken(tenantId)\r\n .then(token => {\r\n let options = {\r\n headers: {\r\n 'Authorization': 'Bearer ' + token\r\n }\r\n };\r\n return axios.post(that.url + \"/subscription\", data, options);\r\n })\r\n .then(res => {\r\n resolve(res.data);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n markBillable(tenantId, data) {\r\n var that = this;\r\n const auth = Auth.singleton();\r\n return new Promise((resolve, reject) => {\r\n auth.getSubscriptionAccessToken(tenantId)\r\n .then(token => {\r\n let options = {\r\n headers: {\r\n 'Authorization': 'Bearer ' + token\r\n }\r\n };\r\n return axios.post(that.url + \"/subscription/markbillable\", data, options);\r\n })\r\n .then(res => {\r\n resolve(res.data);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n saveCreditCard(tenantId, data) {\r\n var that = this;\r\n const auth = Auth.singleton();\r\n return new Promise((resolve, reject) => {\r\n auth.getSubscriptionAccessToken(tenantId)\r\n .then(token => {\r\n let options = {\r\n headers: {\r\n 'Authorization': 'Bearer ' + token\r\n }\r\n };\r\n return axios.post(that.url + \"/subscription/creditcard\", data, options);\r\n })\r\n .then(res => {\r\n resolve(res.data);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n } \r\n\r\n\r\n}\r\n\r\nexport default SubscriptionManagement;","import React, { Component } from 'react';\r\nimport subscriptionMngmt from 'services/subscriptionManagement';\r\n\r\nimport './CreditCardForm.css';\r\n\r\nexport class CreditCardForm extends Component {\r\n\r\n // Stripe elements\r\n stripe;\r\n card;\r\n useExistingCard = false;\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n country: \"DK\", // Set country selector to Denmark\r\n plan: props.plan,\r\n period: props.period,\r\n currency: props.currency,\r\n tenantId: props.tenantId\r\n };\r\n if (props.customer && Object.keys(props.customer).length > 0) {\r\n this.state.name = props.customer.nameOnCard;\r\n this.state.company = props.customer.company;\r\n this.state.street = props.customer.street;\r\n this.state.city = props.customer.city;\r\n this.state.zip = props.customer.zip;\r\n this.state.country = props.customer.country;\r\n this.state.email = props.customer.email;\r\n this.state.taxId = props.customer.taxId;\r\n this.state.cardLast4 = props.customer.cardLast4;\r\n this.state.cardBrand = props.customer.cardBrand;\r\n this.useExistingCard = props.customer.cardLast4;\r\n }\r\n\r\n this.subSvc = new subscriptionMngmt();\r\n\r\n this.formElementChanged = this.formElementChanged.bind(this);\r\n this.formSubmitted = this.formSubmitted.bind(this);\r\n this.toogleCard = this.toogleCard.bind(this);\r\n }\r\n\r\n\r\n componentDidMount() {\r\n this.createStripeCardElement();\r\n }\r\n\r\n UNSAFE_componentWillReceiveProps(nextProps) {\r\n this.updateState(nextProps);\r\n }\r\n\r\n updateState(props) {\r\n this.setState({\r\n country: \"DK\", // Set country selector to Denmark\r\n plan: props.plan,\r\n period: props.period,\r\n currency: props.currency,\r\n tenantId: props.tenantId\r\n });\r\n if (props.customer && Object.keys(props.customer).length > 0) {\r\n this.setState({\r\n name: props.customer.nameOnCard,\r\n company: props.customer.company,\r\n street: props.customer.street,\r\n city: props.customer.city,\r\n zip: props.customer.zip,\r\n country: props.customer.country,\r\n email: props.customer.email,\r\n taxId: props.customer.taxId,\r\n cardLast4: props.customer.cardLast4,\r\n cardBrand: props.customer.cardBrand\r\n });\r\n this.useExistingCard = props.customer.cardLast4;\r\n }\r\n }\r\n\r\n createStripeCardElement() {\r\n let that = this;\r\n const stripeJs = document.createElement('script');\r\n stripeJs.src = 'https://js.stripe.com/v3/';\r\n stripeJs.async = true;\r\n\r\n stripeJs.onload = () => {\r\n that.stripe = window.Stripe(window.appConfig.stripe.key);\r\n\r\n var elements = that.stripe.elements({\r\n fonts: [{\r\n cssSrc: 'https://fonts.googleapis.com/css?family=Raleway:200,300,400,600,700'\r\n }],\r\n locale: 'en'\r\n });\r\n\r\n // Create an instance of the card element\r\n that.card = elements.create('card', {\r\n hidePostalCode: true,\r\n classes: {\r\n base: \"criipto-stripe-base\"\r\n },\r\n style: {\r\n base: {\r\n iconColor: '#2d3e50',\r\n fontFamily: '\"Raleway\", \"Helvetica Neue\", \"Helvetica\", sans-serif',\r\n fontSize: '16px'\r\n }\r\n }\r\n });\r\n\r\n that.card.addEventListener('change', function (event) {\r\n var displayError = document.getElementById('card-errors');\r\n if (event.error) {\r\n displayError.textContent = event.error.message;\r\n } else {\r\n displayError.textContent = '';\r\n }\r\n });\r\n\r\n // Add an instance of the card Element into the `card-element`
    \r\n that.card.mount('#card-element');\r\n\r\n\r\n };\r\n document.body && document.body.appendChild(stripeJs);\r\n }\r\n\r\n formElementChanged(event) {\r\n this.setState({ [event.target.name]: event.target.value });\r\n }\r\n\r\n formSubmitted(event) {\r\n event.preventDefault();\r\n let formData = this.state;\r\n\r\n if (this.useExistingCard) {\r\n this.props.onSubmit(formData);\r\n }\r\n else {\r\n var that = this;\r\n let tokenData = {\r\n name: formData.name,\r\n address_line1: formData.street,\r\n address_city: formData.city,\r\n address_zip: formData.zip,\r\n address_country: formData.country\r\n }\r\n this.stripe.createToken(this.card, tokenData).then(function (result) {\r\n if (result.error) {\r\n var displayError = document.getElementById('card-errors');\r\n displayError.textContent = result.error.message;\r\n } else {\r\n formData.paymentToken = result.token.id;\r\n that.props.onSubmit(formData);\r\n }\r\n });\r\n }\r\n }\r\n\r\n toogleCard(event) {\r\n event.preventDefault();\r\n let newcard = document.getElementById(\"newcard\");\r\n let currentcard = document.getElementById(\"currentcard\");\r\n if (newcard.style.display === 'none') {\r\n newcard.removeAttribute('style');\r\n currentcard.style.display = 'none';\r\n this.useExistingCard = false;\r\n }\r\n else {\r\n newcard.style.display = 'none';\r\n currentcard.removeAttribute('style');\r\n this.useExistingCard = true;\r\n }\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n Credit card details\r\n\r\n {this.state.cardLast4 ?\r\n
    \r\n
    \r\n
    \r\n \r\n

    {this.state.cardBrand}-{this.state.cardLast4}

    \r\n
    \r\n
    \r\n
    : null}\r\n\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {/* A Stripe Element will be inserted here. */}\r\n
    \r\n {/* Used to display Element errors */}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n {/* Used to display errors */}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\n\r\nexport class CreditCardProcessing extends Component {\r\n render() {\r\n return (\r\n
    \r\n

    \"Processing...\"/

    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport class CreditCardError extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.startOver = this.startOver.bind(this);\r\n\r\n }\r\n\r\n startOver() {\r\n window.location.reload();\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n

    \"Something{this.props.error.message || this.props.error}

    \r\n



    \r\n \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport class CreditCardSuccess extends Component {\r\n render() {\r\n return (\r\n
    \r\n Thank you!\r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default { CreditCardForm, CreditCardError, CreditCardProcessing, CreditCardSuccess }\r\n","import axios from 'axios';\r\nimport Auth from 'services/auth';\r\n\r\nclass CustomerManagement {\r\n\r\n url;\r\n\r\n constructor() {\r\n // remove potential trailing slash\r\n this.url = window.appConfig.subscriptionApi.url.replace(/\\/+$/, \"\"); \r\n axios.defaults.headers.common['Accept'] = 'application/json';\r\n }\r\n\r\n getCustomer(tenantId) {\r\n var that = this;\r\n const auth = Auth.singleton();\r\n return new Promise((resolve, reject) => {\r\n auth.getSubscriptionAccessToken(tenantId)\r\n .then(token => {\r\n let options = {\r\n headers: {\r\n 'Authorization': 'Bearer ' + token\r\n }\r\n };\r\n return axios.get(that.url + \"/customer\", options);\r\n })\r\n .then(res => {\r\n resolve(res.data);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n getInvoices(tenantId, startAfter, endBefore) {\r\n var that = this;\r\n const auth = Auth.singleton();\r\n return new Promise((resolve, reject) => {\r\n auth.getSubscriptionAccessToken(tenantId)\r\n .then(token => {\r\n let options = {\r\n headers: {\r\n 'Authorization': 'Bearer ' + token\r\n },\r\n };\r\n if (startAfter) options.params = { startAfter: startAfter };\r\n else if (endBefore) options.params = { endBefore: endBefore };\r\n return axios.get(that.url + \"/customer/invoices\", options);\r\n })\r\n .then(res => {\r\n resolve(res.data);\r\n })\r\n .catch(e => {\r\n reject(e);\r\n });\r\n });\r\n }\r\n\r\n}\r\n\r\nexport default CustomerManagement;\r\n","import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './styles.css';\r\nimport { CreditCardForm, CreditCardProcessing, CreditCardError } from './CreditCardForm';\r\nimport CustomerMngmt from 'services/customerManagement';\r\nimport SubscriptionMngmt from 'services/subscriptionManagement';\r\n\r\nconst CARD_ENTRY = 'entry';\r\nconst CARD_PROCESSING = 'processing';\r\nconst CARD_ERROR = 'error';\r\nconst CARD_SUCCESS = 'success';\r\n\r\nclass CreditCardManagement extends Component {\r\n\r\n custMngmt;\r\n subMngmt;\r\n tenantId;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n cardState: CARD_ENTRY,\r\n tenantId: this.props.match.params.tenantid,\r\n customer: this.props.customer || {}\r\n }\r\n\r\n this.custMngmt = new CustomerMngmt();\r\n this.subMngmt = new SubscriptionMngmt();\r\n\r\n this.formSubmitted = this.formSubmitted.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.getCustomer();\r\n }\r\n\r\n getCustomer() {\r\n let that = this;\r\n // retrieve customer from backend\r\n this.custMngmt.getCustomer(this.state.tenantId)\r\n .then(customer => {\r\n if (customer) {\r\n that.setState({\r\n customer: customer\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n this.setState({\r\n cardState: CARD_ERROR,\r\n error: error\r\n });\r\n });\r\n }\r\n\r\n formSubmitted(formData) {\r\n let savedData = formData;\r\n this.setState({ cardState: CARD_PROCESSING })\r\n this.subMngmt.saveCreditCard(this.state.tenantId, formData)\r\n .then(res => {\r\n this.setState({ cardState: CARD_SUCCESS });\r\n\r\n })\r\n .catch(error => {\r\n if (error.response.data.includes('Invalid EU VAT ID')) {\r\n this.state.customer.taxId = formData.taxId; // bring the bad TaxID back to the form\r\n this.setState({\r\n cardState: CARD_ENTRY,\r\n error: {\r\n type: 'vat',\r\n message: error.response.data\r\n }\r\n });\r\n }\r\n else {\r\n this.setState({\r\n cardState: CARD_ERROR,\r\n error: error\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    Add or update your credit card

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.state.cardState === CARD_ENTRY && }\r\n {this.state.cardState === CARD_PROCESSING && }\r\n {this.state.cardState === CARD_ERROR && }\r\n {this.state.cardState === CARD_SUCCESS &&\r\n
    \r\n

    Your card has been added/updated

    \r\n To dashboard\r\n
    }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default CreditCardManagement;\r\n\r\n\r\n","import React, { Component } from 'react'\r\nimport { Redirect } from 'react-router-dom';\r\n\r\nexport class Starting extends Component {\r\n render() {\r\n if (this.props.tenantId) {\r\n return (\r\n \r\n );\r\n }\r\n else {\r\n return (\r\n
    \r\n

    \"Loading...\"

    \r\n
    \r\n );\r\n }\r\n }\r\n}\r\n\r\nexport default Starting\r\n","import React from 'react';\r\nimport Starting from 'components/Starting';\r\nimport { Route } from 'react-router-dom';\r\nimport criiptoPermit from 'services/criiptoPermit';\r\n\r\nimport useTenant from '../../hooks/useTenant';\r\n\r\nconst AuthorizedRoute = ({ component: Component, requiredRole, ...rest }) => {\r\n const permitSvc = criiptoPermit.singleton();\r\n const [tenant] = useTenant();\r\n\r\n return (\r\n \r\n permitSvc.isAuthorizationReady() ? \r\n (permitSvc.isAuthorized(tenant, requiredRole) ? (\r\n \r\n ) : (\r\n

    You are not authorized to view this page.

    \r\n )\r\n ) : (\r\n \r\n )\r\n }\r\n />\r\n );\r\n}\r\n\r\nexport default AuthorizedRoute\r\n","import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './styles.css';\r\nimport { CreditCardForm, CreditCardProcessing, CreditCardError } from 'components/CreditCard/CreditCardForm';\r\nimport CustomerMngmt from 'services/customerManagement';\r\nimport SubscriptionMngmt from 'services/subscriptionManagement';\r\nimport Auth from 'services/auth';\r\nimport { ElementsConsumer } from '@stripe/react-stripe-js';\r\n\r\nconst CARD_ENTRY = 'entry';\r\nconst CARD_PROCESSING = 'processing';\r\nconst CARD_ERROR = 'error';\r\nconst CARD_SUCCESS = 'success';\r\n\r\nclass Signup extends Component {\r\n\r\n custMngmt;\r\n subMngmt;\r\n tenantId;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n cardState: CARD_ENTRY,\r\n tenantId: this.props.match.params.tenantid,\r\n customer: this.props.customer || {},\r\n priceInfo: {},\r\n productName: \"\",\r\n productVolume: 0\r\n }\r\n\r\n this.custMngmt = new CustomerMngmt();\r\n this.subMngmt = new SubscriptionMngmt();\r\n\r\n this.formSubmitted = this.formSubmitted.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.getCustomer();\r\n this.getPriceInfo();\r\n if(this.state.cardState === CARD_ERROR || this.state.cardState === CARD_SUCCESS)\r\n window.scrollTo(0, 0);\r\n }\r\n\r\n componentDidUpdate() {\r\n if(this.state.cardState === CARD_ERROR || this.state.cardState === CARD_SUCCESS)\r\n window.scrollTo(0, 0);\r\n }\r\n\r\n getCustomer() {\r\n let that = this;\r\n // retrieve customer from backend\r\n this.custMngmt.getCustomer(this.state.tenantId)\r\n .then(customer => {\r\n if (customer) {\r\n that.setState({\r\n customer: customer\r\n });\r\n }\r\n })\r\n .catch(() => {\r\n });\r\n }\r\n\r\n getPriceInfo(){\r\n this.subMngmt.getPlans(this.props.tenantId)\r\n .then(res => {\r\n let selectedPlanData = res.filter((p) => p.id === this.props.match.params.plan)?.pop();\r\n if(selectedPlanData){\r\n let currency = this.props.match.params.currency.toLowerCase();\r\n let priceInfo = selectedPlanData[this.props.match.params.period][currency];\r\n this.setState({\r\n priceInfo: priceInfo,\r\n productName: selectedPlanData.name,\r\n productVolume: selectedPlanData.volume });\r\n }\r\n })\r\n .catch(err => {\r\n console.log(err);\r\n console.log('Error when getting subsription plans: ' + err);\r\n });\r\n }\r\n\r\n onPaymentSuccess(formData) {\r\n const auth = Auth.singleton();\r\n auth.getProfile()\r\n .then(profile => {\r\n window.analytics.identify(profile.sub);\r\n window.analytics.track('Paid', { \r\n 'subscription_plan': formData.plan,\r\n 'subscription_period': formData.period,\r\n 'subscription_currency': formData.currency\r\n });\r\n });\r\n window.gtag('event', 'conversion', {\r\n 'send_to': 'AW-710819373/TZWSCObD6LMBEK38-NIC',\r\n 'transaction_id': ''\r\n });\r\n }\r\n\r\n formSubmitted(formData) {\r\n const { stripe } = this.props;\r\n\r\n this.setState({ cardState: CARD_PROCESSING })\r\n this.subMngmt.saveSubscription(this.state.tenantId, formData)\r\n .then(res => {\r\n if (!res.success && res.clientSecret) {\r\n stripe.confirmCardPayment(res.clientSecret)\r\n .then(result => {\r\n if (result.error) {\r\n this.setState({\r\n cardState: CARD_ERROR,\r\n error: result.error.message\r\n });\r\n } else if (result.paymentIntent) {\r\n this.subMngmt.markBillable(this.state.tenantId, { paymentIntentId: result.paymentIntent.id })\r\n .then(() => {\r\n this.setState({ cardState: CARD_SUCCESS });\r\n this.onPaymentSuccess(formData);\r\n });\r\n }\r\n });\r\n } else if (res.success) {\r\n this.setState({ cardState: CARD_SUCCESS });\r\n this.onPaymentSuccess(formData);\r\n } else {\r\n this.setState({\r\n cardState: CARD_ERROR,\r\n error: res.error ? res.error : 'An unexpected error has occurred. Please try again.'\r\n });\r\n }\r\n })\r\n .catch(error => {\r\n if (error.response?.data?.errorCode === \"tax_id_invalid\")\r\n this.setState({\r\n cardState: CARD_ENTRY,\r\n error: {\r\n type: 'vat',\r\n message: \"Invalid EU VAT ID\"\r\n },\r\n customer: {...this.state.customer, ...formData},\r\n });\r\n else if (error.response?.data?.errorCode === \"email_invalid\")\r\n this.setState({\r\n cardState: CARD_ENTRY,\r\n error: {\r\n type: 'email',\r\n message: \"Invalid email address\"\r\n },\r\n customer: {...this.state.customer, ...formData},\r\n });\r\n else {\r\n this.setState({\r\n cardState: CARD_ERROR,\r\n error: error\r\n });\r\n }\r\n });\r\n }\r\n\r\n render() {\r\n let locale = 'en';\r\n let volume = this.state.productVolume?.toLocaleString(locale);\r\n let price = this.state.priceInfo.price?.toLocaleString(locale);\r\n let unitprice = this.state.priceInfo.unitprice?.toLocaleString(locale);\r\n let currency = this.props.match.params.currency?.toUpperCase();\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    Sign up/change plan

    \r\n

    Enables you for production if this is your first sign up.

    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Your order

    \r\n

    \r\n Chosen product:\r\n {this.state.productName} (Logins per month {volume})\r\n

    \r\n

    \r\n {this.props.match.params.period === 'month' ? \"Monthly fee:\" : \"Yearly fee:\"}\r\n {price} {currency}\r\n

    \r\n

    \r\n \r\n Total to be charged:\r\n {price} {currency}\r\n \r\n

    \r\n

    The subscription fee is charged each {this.props.match.params.period === 'month' ? 'month' : 'year'} to your credit card.

    \r\n
    \r\n

    Should you end up having more logins than your subscription covers, worry not. We will then add the following

    \r\n

    Per-transaction overage fees:

    \r\n
    \r\n

    \r\n Authentication:\r\n {currency + ' ' + unitprice}/login\r\n

    \r\n

    \r\n Native Signature:\r\n {currency + ' ' + unitprice}/native signature\r\n

    \r\n
    \r\n

    You will receive an email with a receipt for each charge. If you have any questions please get in touch by sending an email to support@criipto.com

    \r\n
    \r\n
    \r\n
    \r\n {this.state.cardState === CARD_ENTRY && }\r\n {this.state.cardState === CARD_PROCESSING && }\r\n {this.state.cardState === CARD_ERROR && }\r\n {this.state.cardState === CARD_SUCCESS &&\r\n
    \r\n

    Your subscription has been updated

    \r\n

    Payment receipts will be delivered via email.

    \r\n Continue\r\n
    }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nconst SignUpInjected = props => {\r\n return (\r\n \r\n {({ stripe }) => (\r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default SignUpInjected;\r\n","import React, { Component } from 'react'\r\nimport './PeriodSelector.css'\r\n\r\nexport class PeriodSelector extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.periodChanged = this.periodChanged.bind(this);\r\n }\r\n\r\n periodChanged(e) {\r\n e.preventDefault();\r\n this.props.onChange();\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n}\r\n\r\nexport default PeriodSelector\r\n","import React, { Component } from 'react'\r\nimport './CurrencySelector.css'\r\n\r\nexport class CurrencySelector extends Component {\r\n\r\n currencyChanged(currency) {\r\n let thisCurrency = currency;\r\n let that = this;\r\n return function(e) {\r\n e.preventDefault();\r\n that.props.onChange(thisCurrency)\r\n }\r\n }\r\n \r\n render() {\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default CurrencySelector\r\n","import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './Plan.css';\r\n\r\nclass Plan extends Component {\r\n \r\n render() {\r\n let locale = 'en'; \r\n let volume = this.props.volume.toLocaleString(locale);\r\n let price = this.props.price.toLocaleString(locale);\r\n let unitprice = this.props.unitprice.toLocaleString(locale);\r\n let currency = this.props.currency.toUpperCase();\r\n return (\r\n
    \r\n

    {this.props.name}

    \r\n
    \r\n

    \r\n {currency} {price}

    \r\n

    {volume}\r\n
    logins or native signatures\r\n
    monthly

    \r\n

    {currency} {unitprice} per transaction if you use more than {volume} transactions.

    \r\n
    \r\n
    \r\n {this.props.selected ? \r\n \r\n \r\n Update credit card \r\n :\r\n (this.props.available ? \r\n Choose Plan :\r\n Not available)}\r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default Plan\r\n","import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './Plan.css';\r\n\r\nclass CustomPlan extends Component {\r\n\r\n render() {\r\n if (this.props.selected) {\r\n return (\r\n
    \r\n

    Enterprise

    \r\n
    \r\n

    \r\n \r\n

    \r\n

    You are covered by\r\n
    a seperate agreement.
     

    \r\n

    Please register a credit card to cover your monthly e-ID consumption.

    \r\n
    \r\n
    \r\n Add/update credit card\r\n
    \r\n
    \r\n )\r\n }\r\n else {\r\n return (\r\n
    \r\n

    Enterprise

    \r\n
    \r\n

    A lot of transactions\r\n
    or special requirements?
     

    \r\n

    Please talk to sales for volume discounts or special needs.

    \r\n
    \r\n
    \r\n Get in touch\r\n
    \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default CustomPlan","import React, { Component } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport './Plan.css';\r\n\r\nclass FreePlan extends Component {\r\n\r\n render() {\r\n if (this.props.selected) {\r\n return (\r\n
    \r\n

    Developer

    \r\n
    \r\n

    \r\n \r\n

    \r\n

    All you need to integrate and test you e-ID integration.

    \r\n

    When you are ready for to accept real e-ID users, come back and choose a paid plan.

    \r\n
    \r\n
    \r\n )\r\n }\r\n else {\r\n return (\r\n
    \r\n

    Developer

    \r\n
    \r\n

    \r\n Free\r\n

    \r\n

    Free development, testing, and support.

    \r\n

    Important: When switching to this plan, \r\n Real e-ID accounts can no longer be used with your subscription.

    \r\n
    \r\n \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default FreePlan","import React, { Component } from 'react';\r\nimport Plan from './Plan';\r\nimport CustomPlan from './CustomPlan';\r\nimport FreePlan from './FreePlan';\r\nimport subscriptionMngmt from 'services/subscriptionManagement';\r\n\r\nimport './styles.css';\r\n\r\n\r\nclass Plans extends Component {\r\n\r\n subMngmt;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.subMngmt = new subscriptionMngmt();\r\n\r\n this.state = {\r\n planData: []\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n // get plan data from backend service\r\n this.subMngmt.getPlans(this.props.tenantId)\r\n .then(res => {\r\n this.setState( { planData: res});\r\n })\r\n .catch(err => {\r\n console.log(err);\r\n console.log('Error when getting subsription plans: ' + err);\r\n });\r\n }\r\n \r\n render() {\r\n let plans = [];\r\n let that = this;\r\n let creditCardPlansAvailable = !that.props.selectedPlan || that.props.selectedPlan !== 'custom' ;\r\n this.state.planData.forEach(plan => {\r\n if (plan.id !== 'custom' && plan.id !== 'prepaid' && plan.id != 'free') {\r\n plans.push(\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n else if (plan.id !== 'free') {\r\n plans.push(\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n else {\r\n plans.push(\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n });\r\n\r\n return (\r\n
    \r\n {plans}\r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default Plans\r\n\r\n\r\n/* this.setState({\r\n planData: [{\r\n \"id\": \"basic\",\r\n \"name\": \"Basic\",\r\n \"volume\": 1000,\r\n \"month\": {\r\n \"DKK\": {\r\n \"price\": 320,\r\n \"unitprice\": 0.32\r\n },\r\n \"EUR\": {\r\n \"price\": 45,\r\n \"unitprice\": 0.045\r\n }\r\n },\r\n \"year\": {\r\n \"DKK\": {\r\n \"price\": 3520,\r\n \"unitprice\": 0.32\r\n },\r\n \"EUR\": {\r\n \"price\": 495,\r\n \"unitprice\": 0.045\r\n }\r\n }\r\n },\r\n {\r\n \"id\": \"business\",\r\n \"name\": \"Business\",\r\n \"volume\": 10000,\r\n \"month\": {\r\n \"DKK\": {\r\n \"price\": 2900,\r\n \"unitprice\": 0.29\r\n },\r\n \"EUR\": {\r\n \"price\": 390,\r\n \"unitprice\": 0.039\r\n }\r\n },\r\n \"year\": {\r\n \"DKK\": {\r\n \"price\": 31900,\r\n \"unitprice\": 0.29\r\n },\r\n \"EUR\": {\r\n \"price\": 4290,\r\n \"unitprice\": 0.039\r\n }\r\n }\r\n },\r\n {\r\n \"id\": \"enterprise\",\r\n \"name\": \"Enterprise\",\r\n \"volume\": 40000,\r\n \"month\": {\r\n \"DKK\": {\r\n \"price\": 10400,\r\n \"unitprice\": 0.26\r\n },\r\n \"EUR\": {\r\n \"price\": 1400,\r\n \"unitprice\": 0.035\r\n }\r\n },\r\n \"year\": {\r\n \"DKK\": {\r\n \"price\": 114400,\r\n \"unitprice\": 0.26\r\n },\r\n \"EUR\": {\r\n \"price\": 15400,\r\n \"unitprice\": 0.035\r\n }\r\n }\r\n }]\r\n});\r\n */","import React, { Component } from 'react';\r\nimport PeriodSelector from './PeriodSelector';\r\nimport CurrencySelector from './CurrencySelector';\r\nimport Plans from './Plans';\r\nimport './styles.css';\r\nimport CustomerMngmt from 'services/customerManagement';\r\nimport SubscriptionManagement from 'services/subscriptionManagement';\r\n\r\nconst DKK = 'dkk';\r\nconst MONTH = 'month';\r\nconst YEAR = 'year';\r\n\r\nclass Subscription extends Component {\r\n\r\n custMngmt;\r\n subMngmt;\r\n \r\n constructor(props) {\r\n super(props);\r\n\r\n this.custMngmt = new CustomerMngmt();\r\n this.subMngmt = new SubscriptionManagement();\r\n\r\n this.state = {\r\n currency: DKK,\r\n period: YEAR\r\n };\r\n\r\n this.periodChanged = this.periodChanged.bind(this);\r\n this.currencyChanged = this.currencyChanged.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.getCustomer();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.getCustomer();\r\n }\r\n\r\n getCustomer() {\r\n // retrieve customer from backend\r\n if (this.state.tenantId !== this.props.match.params.tenantid) {\r\n this.custMngmt.getCustomer(this.props.match.params.tenantid)\r\n .then(customer => {\r\n if (customer && customer.plan) {\r\n this.setState({\r\n tenantId: this.props.match.params.tenantid,\r\n selectedPlan: customer.plan,\r\n currency: customer.currency || DKK,\r\n period: customer.period || YEAR\r\n })\r\n }\r\n })\r\n .catch(e => {\r\n this.setState({\r\n tenantId: this.props.match.params.tenantid,\r\n selectedPlan: undefined,\r\n currency: DKK,\r\n period: YEAR\r\n });\r\n });\r\n }\r\n }\r\n\r\n periodChanged() {\r\n this.setState({ period: this.state.period === MONTH ? YEAR : MONTH });\r\n }\r\n\r\n currencyChanged(currency) {\r\n this.setState({ currency: currency });\r\n }\r\n\r\n render() {\r\n return (\r\n
    \r\n
    \r\n

    Choose a plan*

    \r\n

    *Criipto fee only; fees for underlying national/bank e-ID billed separately\r\n

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n );\r\n }\r\n}\r\n\r\nexport default Subscription;\r\n","import React, { Component } from 'react'\r\n\r\nclass InvoiceItem extends Component {\r\n\r\n formatNumber(num) {\r\n return num.toString().replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1,')\r\n }\r\n\r\n formatDate(inputDate, includeDay = false) {\r\n let date;\r\n if (typeof inputDate === 'string' || inputDate instanceof String)\r\n date = new Date(inputDate);\r\n else\r\n date = inputDate;\r\n var monthNames = [\r\n \"January\", \"February\", \"March\",\r\n \"April\", \"May\", \"June\", \"July\",\r\n \"August\", \"September\", \"October\",\r\n \"November\", \"December\"\r\n ];\r\n \r\n var day = date.getDate();\r\n var monthIndex = date.getMonth();\r\n var year = date.getFullYear();\r\n \r\n return monthNames[monthIndex] + ' ' + (includeDay ? day + ', ' : '') + year;\r\n }\r\n \r\n render() {\r\n return (\r\n
    \r\n \r\n
    {this.props.lineItem.paidAt ? this.formatDate(this.props.lineItem.paidAt, true) : 'Not paid'}
    \r\n
    {this.props.lineItem.currency.toUpperCase() + ' ' + this.formatNumber(this.props.lineItem.amountDue/100)}
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default InvoiceItem\r\n","import React, { Component } from 'react'\r\nimport InvoiceItem from './InvoiceItem';\r\nimport CustomerManagement from 'services/customerManagement';\r\n\r\nclass InvoiceList extends Component {\r\n\r\n custMgmt;\r\n first;\r\n movingForward = true;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.custMgmt = new CustomerManagement();\r\n\r\n this.state = {\r\n invoiceItems: []\r\n }\r\n\r\n this.nextPage = this.nextPage.bind(this);\r\n this.previousPage = this.previousPage.bind(this);\r\n }\r\n\r\n componentDidMount() {\r\n this.getInvoiceItems();\r\n }\r\n\r\n getInvoiceItems(startingAfter, endingBefore) {\r\n this.custMgmt.getInvoices(this.props.tenantId, startingAfter, endingBefore)\r\n .then(invoiceData => {\r\n if (!invoiceData.invoices || invoiceData.invoices.length === 0)\r\n return;\r\n\r\n let invs = invoiceData.invoices;\r\n if (!this.first) this.first = invs[0].id;\r\n this.setState({\r\n invoiceItems: invoiceData.invoices,\r\n startAfter: invoiceData.hasMore || !this.movingForward ? invs[invs.length - 1].id : undefined,\r\n endBefore: this.first !== invs[0].id ? invs[0].id : undefined\r\n });\r\n })\r\n .catch(e => {\r\n console.log(\"Something went wrong: \", e);\r\n });\r\n }\r\n\r\n previousPage(event) {\r\n event.preventDefault();\r\n this.movingForward = false\r\n this.getInvoiceItems(undefined, this.state.endBefore);\r\n }\r\n\r\n nextPage(event) {\r\n event.preventDefault();\r\n this.movingForward = true\r\n this.getInvoiceItems(this.state.startAfter);\r\n }\r\n\r\n render() {\r\n let lines = [];\r\n this.state.invoiceItems.forEach(line => {\r\n lines.push(\r\n \r\n );\r\n });\r\n let showNextClass = this.state.startAfter ? \"\" : \"hide\";\r\n let showPreviousClass = this.state.endBefore ? \"\" : \"hide\";\r\n return (\r\n \r\n
    \r\n
    Period end
    \r\n
    Paid
    \r\n
    Amount
    \r\n
    PDF
    \r\n
    \r\n\r\n {lines}\r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default InvoiceList\r\n\r\n","import React, { Component } from 'react'\r\nimport InvoiceList from './InvoiceList';\r\nimport './styles.css';\r\n\r\nclass InvoicesScreen extends Component {\r\n render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    Payment History

    \r\n\r\n \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n}\r\n\r\nexport default InvoicesScreen;\r\n","import moment from 'moment';\r\nimport {range} from 'lodash';\r\n\r\nexport const COLORS = [\r\n '#0c4d87',\r\n '#7ac8f5',\r\n '#dc6a62',\r\n '#e49b4d',\r\n '#f0c97c',\r\n '#b3b3b1',\r\n '#e0e0dd',\r\n '#9ef1f6',\r\n '#e69691',\r\n '#6d94b7'\r\n];\r\n\r\nexport const CHART_HEIGHT = 500;\r\nexport const X_AXIS_HEIGHT = 55;\r\nexport const Y_AXIS_WIDTH = 55;\r\n\r\nfunction removeTimezone(input) {\r\n return input.substr(0, 19);\r\n}\r\n\r\nexport const BUCKETS = {\r\n HOUR: {\r\n label: 'Hour',\r\n tickFormatter: (bucket) => moment(removeTimezone(bucket)).format('HH:mm'),\r\n tooltipFormatter: (bucket) => moment(removeTimezone(bucket)).format('HH:mm, dddd MMM D, YYYY'),\r\n exportFormatter: (bucket) => moment(removeTimezone(bucket)).format('YYYY-MM-DD HH:mm')\r\n },\r\n DAY: {\r\n label: 'Day',\r\n tickFormatter: (bucket) => moment(removeTimezone(bucket)).format('MMM D'),\r\n tooltipFormatter: (bucket) => moment(removeTimezone(bucket)).format('dddd MMM D, YYYY'),\r\n exportFormatter: (bucket) => moment(removeTimezone(bucket)).format('YYYY-MM-DD')\r\n },\r\n WEEK: {\r\n label: 'Week',\r\n tickFormatter: (bucket) => moment(removeTimezone(bucket)).format('MMM D'),\r\n tooltipFormatter: (bucket) => moment(removeTimezone(bucket)).format('dddd MMM D, YYYY'),\r\n exportFormatter: (bucket) => moment(removeTimezone(bucket)).format('YYYY-MM-DD')\r\n },\r\n MONTH: {\r\n label: 'Month',\r\n tickFormatter: (bucket) => moment(removeTimezone(bucket)).format('MMM YYYY'),\r\n tooltipFormatter: (bucket) => moment(removeTimezone(bucket)).format('MMM YYYY'),\r\n exportFormatter: (bucket) => moment(removeTimezone(bucket)).format('YYYY-MM')\r\n }\r\n};\r\n\r\nexport const DIMENSIONS = {\r\n transactionType: {\r\n authentication: {\r\n label: 'Logins',\r\n },\r\n signature: {\r\n label: 'Native Signatures'\r\n },\r\n 'criipto-signature': {\r\n label: 'Criipto Signatures'\r\n },\r\n label: 'Transaction Type'\r\n },\r\n authenticationType: {\r\n _valueLabel: (value) => value.replace('urn:grn:authn:dk:', '').replace('urn:grn:authn:se:', '').replace('urn:grn:authn:no:', '').replace('urn:grn:authn:fi:', ''),\r\n label: 'Authentication Type'\r\n },\r\n environment: {\r\n PRODUCTION: {\r\n label: 'Production',\r\n },\r\n TEST: {\r\n label: 'Test'\r\n }\r\n }\r\n};\r\n\r\nexport const FAKE_CHART = {\r\n yTicks: [\r\n 0,\r\n 100,\r\n 200,\r\n 300,\r\n 400,\r\n 500,\r\n 600,\r\n 700,\r\n 800,\r\n 900,\r\n 1000\r\n ],\r\n data: range(0, 30).reverse().map(days => ({\r\n bucket: moment().subtract(days, 'day').toJSON()\r\n })),\r\n generateData: (dateSelection) => range(0, dateSelection.from.diff(dateSelection.to, 'days')).reverse().map(days => ({\r\n bucket: moment().subtract(days, 'day').toJSON()\r\n }))\r\n};\r\n\r\nexport function toISOLocal(d) {\r\n var z = n => ('0' + n).slice(-2);\r\n var zz = n => ('00' + n).slice(-3);\r\n var off = d.getTimezoneOffset();\r\n var sign = off < 0? '+' : '-';\r\n off = Math.abs(off);\r\n \r\n return d.getFullYear() + '-'\r\n + z(d.getMonth()+1) + '-' +\r\n z(d.getDate()) + 'T' +\r\n z(d.getHours()) + ':' + \r\n z(d.getMinutes()) + ':' +\r\n z(d.getSeconds()) + '.' +\r\n zz(d.getMilliseconds()) +\r\n sign + z(off/60|0) + ':' + z(off%60); \r\n }\r\n ","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport {Checkbox} from './Legend';\r\n\r\nimport {DIMENSIONS} from '../constants';\r\n\r\nconst Wrapper = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n\r\n display: flex;\r\n flex-direction: row;\r\n`;\r\n\r\nconst Item = styled.div`\r\n padding: 5.5px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n background-color: ${props => props.selected ? '#FFF' : '#faf8f5'};\r\n`;\r\n\r\nconst Label = styled.div`\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n line-height: 25px;\r\n text-transform: uppercase;\r\n color: #807e7b;\r\n`;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n margin: 0;\r\n margin-right: 5px;\r\n`;\r\n\r\nexport default function TransactionTypeButton({selected, onSelect}) {\r\n return (\r\n \r\n onSelect('authentication')}>\r\n \r\n \r\n \r\n onSelect('signature')}>\r\n \r\n \r\n \r\n onSelect('criipto-signature')}>\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nTransactionTypeButton.propTypes = {\r\n selected: PropTypes.arrayOf(PropTypes.string.isRequired).isRequired,\r\n onSelect: PropTypes.func.isRequired\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport styled from 'styled-components';\r\n\r\nimport {Checkbox} from './Legend';\r\n\r\nimport {DIMENSIONS} from '../constants';\r\n\r\nconst Wrapper = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n\r\n display: flex;\r\n flex-direction: row;\r\n`;\r\n\r\nconst Item = styled.div`\r\n padding: 5.5px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n background-color: ${props => props.selected ? '#FFF' : '#faf8f5'};\r\n`;\r\n\r\nconst Label = styled.div`\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n line-height: 25px;\r\n text-transform: uppercase;\r\n color: #807e7b;\r\n`;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n margin: 0;\r\n margin-right: 5px;\r\n`;\r\n\r\nexport default function EnvironmentButton({selected, onSelect}) {\r\n return (\r\n \r\n onSelect('PRODUCTION')}>\r\n \r\n \r\n \r\n onSelect('TEST')}>\r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nEnvironmentButton.propTypes = {\r\n selected: PropTypes.arrayOf(PropTypes.string.isRequired).isRequired,\r\n onSelect: PropTypes.func.isRequired\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {map} from 'lodash';\r\n\r\nimport DropdownButton from 'components/DropdownButton';\r\n\r\nimport {BUCKETS} from '../constants';\r\n\r\nexport default function BucketSelector({selected, onChange, disabled}) {\r\n return (\r\n onChange(item.key)}\r\n label={BUCKETS[selected].label}\r\n items={map(BUCKETS, (bucket, key) => ({\r\n label: bucket.label,\r\n key,\r\n selected: selected === key\r\n })).filter(search => !(disabled || []).includes(search.key))}\r\n />\r\n );\r\n}\r\n\r\nBucketSelector.propTypes = {\r\n selected: PropTypes.string.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n disabled: PropTypes.arrayOf(PropTypes.string)\r\n};","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {map, omit} from 'lodash';\r\n\r\nimport DropdownButton from 'components/DropdownButton';\r\nimport {DIMENSIONS} from '../constants';\r\n\r\nexport default function DataDimensionSelector({selected, onChange, dimensions}) {\r\n return (\r\n onChange(item.key)}\r\n label={DIMENSIONS[selected] && DIMENSIONS[selected].label || selected}\r\n items={map(omit(dimensions, 'from', 'to', 'transactionType'), (values, dimension) => ({\r\n label: DIMENSIONS[dimension] && DIMENSIONS[dimension].label || dimension,\r\n key: dimension,\r\n selected: selected === dimension\r\n }))}\r\n />\r\n );\r\n}\r\n\r\nDataDimensionSelector.propTypes = {\r\n selected: PropTypes.string.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n dimensions: PropTypes.object\r\n};","import moment from 'moment';\r\n\r\nconst PRESETS = [\r\n {\r\n preset: 'Last 7 days',\r\n from: moment().subtract(7, 'days').startOf('day')\r\n },\r\n {\r\n preset: 'Last 30 days',\r\n from: moment().subtract(30, 'days').startOf('day')\r\n },\r\n {\r\n preset: 'Last 3 months',\r\n from: moment().subtract(3, 'months').startOf('day')\r\n },\r\n {\r\n preset: 'Last 12 months',\r\n from: moment().subtract(12, 'months').startOf('day')\r\n },\r\n {\r\n preset: 'Last 24 months',\r\n from: moment().subtract(24, 'months').startOf('day')\r\n },\r\n {\r\n preset: 'Last 36 months',\r\n from: moment().subtract(36, 'months').startOf('day')\r\n }\r\n].map(preset => ({\r\n ...preset,\r\n to: preset.to || moment().endOf('day')\r\n}));\r\n\r\nexport default PRESETS;","import React, {useState, useRef, useEffect} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport moment from 'moment';\r\nimport ReactDOM from 'react-dom';\r\nimport 'react-dates/lib/css/_datepicker.css';\r\nimport BootstrapOverlay from 'react-bootstrap/lib/Overlay';\r\nimport styled from 'styled-components';\r\nimport { DayPickerRangeController } from 'react-dates';\r\nimport { START_DATE, END_DATE } from 'react-dates/constants';\r\n\r\nimport PRESETS from './presets';\r\n\r\nimport calendar from './calendar.png';\r\n\r\nconst Wrapper = styled.div`\r\n position: relative;\r\n`;\r\n\r\nconst PickerButton = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n\r\n color: #dc6a62;\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n\r\n height: 40px;\r\n padding: 0px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n & img {\r\n margin-right: 10px;\r\n }\r\n`;\r\n\r\nconst PresetsOverlay = styled.div`\r\n position: absolute;\r\n transform: translateY(10px);\r\n z-index: 1;\r\n\r\n width: 200px;\r\n\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n padding: 4px;\r\n\r\n & ul {\r\n list-stype-type: none;\r\n margin: 0;\r\n }\r\n`;\r\n\r\nconst PresetItem = styled.li`\r\n display: block;\r\n padding: 0 6px;\r\n height: 30px;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n\r\n color: #807e7b;\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n\r\n display: flex;\r\n align-items: center;\r\n\r\n ${props => props.selected ? 'color: #dc6a62;' : null}\r\n ${props => props.selected ? 'background-color: rgba(220, 106, 98, 0.2);' : null}\r\n\r\n &:hover {\r\n color: #dc6a62;\r\n background-color: rgba(220, 106, 98, 0.2);\r\n }\r\n\r\n \r\n`;\r\n\r\nconst CalendarOverlay = styled.div`\r\n position: absolute;\r\n transform: translate(210px, 10px);\r\n z-index: 1;\r\n\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n padding: 16px;\r\n\r\n & .DayPicker, & .DayPicker__horizontal, & .CalendarMonthGrid, & .CalendarMonth {\r\n background: transparent;\r\n box-shadow: none;\r\n }\r\n\r\n & .CalendarMonthGrid__horizontal {\r\n left: 0px;\r\n }\r\n\r\n & .CalendarMonth {\r\n padding: 0px !important;\r\n margin-right: 18px;\r\n }\r\n\r\n & .CalendarMonth_caption {\r\n padding-top: 0px;\r\n padding-bottom: 41px;\r\n }\r\n\r\n & .DayPicker_weekHeader {\r\n top: 39px;\r\n\r\n &:last-child {\r\n margin-left: 18px;\r\n }\r\n }\r\n\r\n & .DayPicker_transitionContainer__horizontal {\r\n margin-bottom: -22px;\r\n }\r\n\r\n & .DayPicker_weekHeaders__horizontal {\r\n margin-left: 0px;\r\n }\r\n\r\n & .DayPickerNavigation_button__horizontalDefault {\r\n top: -4px;\r\n }\r\n\r\n & .DayPickerNavigation_leftButton__horizontalDefault {\r\n left: 0px;\r\n }\r\n\r\n & .DayPickerNavigation_rightButton__horizontalDefault {\r\n right: 0px;\r\n }\r\n\r\n & .CalendarMonth_caption, & .CalendarMonth_caption > * {\r\n color: #dc6a62;\r\n font-family: \"Roboto Slab\";\r\n font-weight: 400;\r\n }\r\n\r\n & .CalendarDay__default {\r\n color: #807e7b;\r\n }\r\n\r\n & .CalendarDay__outside, & .CalendarDay__blocked_calendar {\r\n background: #FFF;\r\n border: 1px solid #e4e7e7;\r\n color: #e4e7e7;\r\n }\r\n\r\n & .CalendarDay__selected_span, .CalendarDay__hovered_span {\r\n background: #aaa5a1;\r\n border: 1px solid #918d89;\r\n color: #FFF;\r\n }\r\n\r\n & .CalendarDay__selected_start, & .CalendarDay__selected_end {\r\n background: #ce6f66;\r\n border: 1px solid #ce6f66;\r\n color: #FFF;\r\n }\r\n`;\r\n\r\nconst today = moment().endOf('day')\r\n\r\nexport default function DateRangePickerButton(props) {\r\n const presetsButtonRef = useRef(null);\r\n const presetsContainerRef = useRef(null);\r\n\r\n const [showCalendarOverlay, setShowCalendarOverlay] = useState(false);\r\n const hideCalendarOverlay = () => setShowCalendarOverlay(false);\r\n const toggleCalendarOverlay = () => setShowCalendarOverlay(value => !value);\r\n\r\n const [showPresetsOverlay, setShowPresetsOverlay] = useState(false);\r\n const hidePresetsOverlay = () => {\r\n setShowPresetsOverlay(false);\r\n hideCalendarOverlay();\r\n };\r\n const togglePresetsOverlay = () => setShowPresetsOverlay(value => !value);\r\n\r\n const [focusedInput, setFocusedInput] = useState(null);\r\n\r\n const [selection, setSelection] = useState({\r\n from: props.selected.from,\r\n to: props.selected.to,\r\n position: START_DATE\r\n });\r\n\r\n useEffect(() => {\r\n setSelection({\r\n from: props.selected.from,\r\n to: props.selected.to,\r\n position: START_DATE\r\n });\r\n }, [props.selected]);\r\n\r\n const handleDatesChange = ({ startDate, endDate }) => {\r\n const { position } = selection;\r\n\r\n if (position === START_DATE) {\r\n setSelection({\r\n position: END_DATE,\r\n from: startDate,\r\n to: null\r\n });\r\n }\r\n \r\n if (position === END_DATE) {\r\n if (!endDate) {\r\n // Picked end date before start date, resetting selection\r\n setSelection({\r\n position: END_DATE,\r\n from: startDate,\r\n to: null\r\n });\r\n return;\r\n }\r\n\r\n setSelection({\r\n position: START_DATE,\r\n from: startDate,\r\n to: endDate\r\n });\r\n\r\n handleRangeSelected({\r\n from: startDate,\r\n to: endDate\r\n });\r\n }\r\n \r\n };\r\n\r\n const reset = () => {\r\n hidePresetsOverlay();\r\n hideCalendarOverlay();\r\n };\r\n\r\n const handleRangeSelected = (range) => {\r\n reset();\r\n\r\n props.onChange({\r\n from: range.from.clone().startOf('day'),\r\n to: range.to.clone().endOf('day')\r\n });\r\n };\r\n\r\n const handlePresetSelected = (preset) => {\r\n reset();\r\n props.onChange(preset);\r\n };\r\n\r\n const isDayBlocked = (day) => {\r\n if (!props.dimensions) return false;\r\n return (props.dimensions.from ? day.isBefore(moment(props.dimensions.from)) : false) ||\r\n day.isAfter(today);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {props.selected.preset ? props.selected.preset : `${props.selected.from.format('MMM D')} - ${props.selected.to.format('MMM D')}`}\r\n ▼\r\n \r\n ReactDOM.findDOMNode(presetsButtonRef.current)}\r\n >\r\n
    \r\n \r\n
      \r\n {PRESETS.map((preset) => (\r\n handlePresetSelected(preset)}>{preset.preset}\r\n ))}\r\n Select a date range ...\r\n
    \r\n
    \r\n {showCalendarOverlay && (\r\n \r\n selection.from || today.clone().subtract(1, 'month')}\r\n\r\n focusedInput={selection.position}\r\n startDate={selection.from}\r\n endDate={selection.to}\r\n onDatesChange={handleDatesChange}\r\n\r\n isDayBlocked={isDayBlocked}\r\n />\r\n \r\n )}\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nDateRangePickerButton.propTypes = {\r\n onChange: PropTypes.func.isRequired,\r\n selected: PropTypes.shape({\r\n preset: PropTypes.string,\r\n from: PropTypes.object.isRequired,\r\n to: PropTypes.object.isRequired,\r\n }).isRequired,\r\n dimensions: PropTypes.object\r\n};\r\n\r\nDateRangePickerButton.defaultSelection = PRESETS[1];","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\n\r\nimport {CHART_HEIGHT, Y_AXIS_WIDTH, X_AXIS_HEIGHT} from '../constants';\r\nconst Banner = styled.div`\r\n color: #dc6a62;\r\n font-size: 22px;\r\n padding: 20px;\r\n position: absolute;\r\n top: ${(CHART_HEIGHT - X_AXIS_HEIGHT) / 2}px;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n margin-left: ${Y_AXIS_WIDTH / 2}px;\r\n background-color: #FFF;\r\n`;\r\n\r\nexport default function NoDataBanner() {\r\n return No data available for selected criteria;\r\n}","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons';\r\n\r\nimport {CHART_HEIGHT, Y_AXIS_WIDTH, X_AXIS_HEIGHT} from '../constants';\r\nconst Banner = styled.div`\r\n color: #dc6a62;\r\n font-size: 18px;\r\n padding: 14px;\r\n position: absolute;\r\n top: ${(CHART_HEIGHT - X_AXIS_HEIGHT) * 0.2}px;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n margin-left: ${Y_AXIS_WIDTH / 2}px;\r\n background-color: #FFF;\r\n\r\n & svg path {\r\n fill: #dc6a62;\r\n color: #dc6a62;\r\n }\r\n`;\r\n\r\nexport default function LoadingBanner() {\r\n return Loading data ...;\r\n}","import { saveAs } from 'file-saver';\r\n\r\nexport function arraysToCSV(arrays, delimiter = ';') {\r\n if (!arrays.length) return null;\r\n\r\n return arrays.reduce(function(csv, items) {\r\n return (\r\n csv +\r\n items\r\n .map(item => `\"${(item ? item.toString() : '').replace(/\\\"/g, '\"')}\"`)\r\n .join(delimiter) +\r\n '\\n'\r\n );\r\n }, '');\r\n}\r\n\r\nexport function objectsToCSV(objects, delimiter = ';') {\r\n if (!objects.length) return null;\r\n\r\n const columns = objects.reduce((columns, object) => {\r\n Object.keys(object).forEach(key => {\r\n if (!columns.includes(key)) columns.push(key);\r\n });\r\n return columns;\r\n }, []);\r\n\r\n return arraysToCSV(\r\n [columns].concat(\r\n objects.map(function(object) {\r\n return columns.reduce(function(values, column) {\r\n return values.concat([object[column]]);\r\n }, []);\r\n })\r\n ),\r\n delimiter\r\n );\r\n}\r\n\r\nexport function downloadCSV(filename, contents) {\r\n if (!contents) return null;\r\n\r\n const file = new File([contents], filename, {\r\n type: 'text/csv;charset=utf-8'\r\n });\r\n saveAs(file);\r\n}","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport PropTypes from 'prop-types';\r\n\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faArrowAltCircleDown } from '@fortawesome/free-solid-svg-icons';\r\n\r\nimport { objectsToCSV, downloadCSV } from 'helpers/csv';\r\n\r\nimport { BUCKETS } from '../constants';\r\nimport Button from '../../../components/Button';\r\n\r\nconst StyledButton = styled(Button)`\r\n & svg path {\r\n fill: #807e7b;\r\n color: #807e7b;\r\n }\r\n\r\n @media(max-width: 576px) {\r\n display: none;\r\n }\r\n`;\r\n\r\nexport default function DownloadButton({results, bucket, dataDimension, ...props}) {\r\n const disabled = !results || !results.length;\r\n const handleClick = () => {\r\n if (disabled) return;\r\n\r\n downloadCSV('criipto_export.csv', objectsToCSV(results.map(result => ({\r\n date: BUCKETS[bucket].exportFormatter(result.bucket),\r\n total: result.total,\r\n ...result.dimension[dataDimension]\r\n })), ','));\r\n }\r\n\r\n return (\r\n \r\n  Download CSV\r\n \r\n );\r\n}\r\n\r\nDownloadButton.propTypes = {\r\n dataDimension: PropTypes.string.isRequired,\r\n bucket: PropTypes.string.isRequired,\r\n results: PropTypes.array\r\n};","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport moment from 'moment';\r\nimport 'moment-timezone';\r\nimport {useRouteMatch} from 'react-router-dom';\r\n\r\nimport {useRequest} from 'API/subscription';\r\nimport FlexRow from 'components/FlexRow';\r\n\r\nimport {Y_AXIS_WIDTH, toISOLocal} from '../constants';\r\n\r\nconst Wrapper = styled(FlexRow)`\r\n align-items: center;\r\n justify-content: space-around;\r\n height: 137px;\r\n margin-top: -20px;\r\n margin-left: ${Y_AXIS_WIDTH}px;\r\n\r\n @media(max-width: 576px) {\r\n height: auto;\r\n display: flex;\r\n flex-flow: row nowrap;\r\n margin: -15px 0px 5px 0px;\r\n }\r\n`;\r\n\r\nexport default function StatBoxes(props) {\r\n const from = moment().startOf('month').startOf('day');\r\n const to = moment().endOf('day');\r\n const route = useRouteMatch();\r\n\r\n const [loginResults, loginResultsState] = useRequest(route.params.tenantid, {\r\n method: 'GET',\r\n url: '/reporting/events/series',\r\n query: {\r\n bucket: 'MONTH',\r\n from: toISOLocal(from.toDate()),\r\n to: toISOLocal(to.toDate()),\r\n transactionType: 'authentication',\r\n timezone: moment.tz.guess(),\r\n environment: props.environment\r\n }\r\n });\r\n\r\n const [totalsResults, totalsResultsState] = useRequest(route.params.tenantid, {\r\n method: 'GET',\r\n url: '/reporting/events/totals'\r\n });\r\n\r\n const totalLogins = loginResults ? loginResults.reduce((memo, result) => memo + result.total, 0) : undefined;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst StatBoxWrapper = styled.div`\r\n display: flex;\r\n flex-flow: row no-wrap;\r\n align-items: center;\r\n\r\n @media(max-width: 576px) {\r\n flex-flow: column;\r\n }\r\n`;\r\n\r\nexport const Highlight = styled.span`\r\n color: #dc6a62;\r\n font-weight: 700;\r\n`;\r\n\r\nconst Prefix = styled.div`\r\n & .word {\r\n color: #0a4b85;\r\n font-family: \"Roboto Slab\";\r\n font-size: 16px;\r\n font-weight: 400;\r\n line-height: 26px;\r\n\r\n margin-left: 5px;\r\n\r\n &:first-of-type {\r\n margin-left: 0px;\r\n }\r\n\r\n &:last-of-type {\r\n color: #dc6a62;\r\n font-weight: 700;\r\n }\r\n }\r\n`;\r\n\r\nconst Number = styled.div`\r\n color: #0c4d87;\r\n font-family: Raleway;\r\n font-size: 50px;\r\n font-weight: 800;\r\n line-height: 60px;\r\n letter-spacing: -2.5px;\r\n margin: 0px 8px;\r\n`;\r\n\r\nconst Suffix = styled.div`\r\n color: #0a4b85;\r\n font-family: \"Roboto Slab\";\r\n font-size: 16px;\r\n font-weight: 400;\r\n line-height: 26px;\r\n`;\r\n\r\nexport function StatBox(props) {\r\n return (\r\n \r\n {props.prefix.split(' ').map(word => {word})}\r\n {props.number}\r\n {props.suffix}\r\n \r\n );\r\n}","import React from 'react';\r\nimport styled from 'styled-components';\r\n\r\nimport {CheckboxWrapper} from './Legend';\r\nimport {BUCKETS, DIMENSIONS} from '../constants';\r\n\r\nconst Wrapper = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n padding: 8px;\r\n\r\n font-family: Raleway;\r\n`;\r\n\r\nconst Label = styled.div`\r\n color: #dc6a62;\r\n font-family: Raleway;\r\n font-size: 14px;\r\n line-height: 26px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n`;\r\n\r\nconst ColorBox = styled(CheckboxWrapper)`\r\n margin: 0;\r\n margin-right: 5px;\r\n width: 8px;\r\n height: 8px;\r\n flex: 0 0 8px;\r\n border-radius: 4px;\r\n margin-top: 1px;\r\n`;\r\n\r\nconst Dimension = styled.div`\r\n display: flex;\r\n flex-flow: row no-wrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n align-items: center;\r\n\r\n font-size: 14px;\r\n line-height: 26px;\r\n`;\r\n\r\nexport default function Tooltip({ active, payload, label, bucket, dataDimension, selectedDataDimensionValues }) {\r\n if (active) {\r\n if (!payload || !payload.length) return null;\r\n const total = Object.keys(payload[0].payload.dimension[dataDimension])\r\n .filter(search => selectedDataDimensionValues.includes(search))\r\n .reduce((total, key) => total + payload[0].payload.dimension[dataDimension][key], 0);\r\n\r\n return (\r\n \r\n \r\n Total: {total}\r\n {payload.map(item => (\r\n {`${DIMENSIONS[dataDimension] ? DIMENSIONS[dataDimension]._valueLabel(item.name.replace(`dimension.${dataDimension}.`, '')) : item.name.replace(`dimension.${dataDimension}.`, '')} : ${item.value}`}\r\n ))}\r\n \r\n );\r\n }\r\n \r\n return null;\r\n};","import React, {useState, useEffect, useMemo} from 'react';\r\nimport {useRouteMatch} from 'react-router-dom';\r\nimport {get, sortBy} from 'lodash';\r\nimport styled from 'styled-components';\r\nimport {ResponsiveContainer, AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip} from 'recharts';\r\nimport moment from 'moment';\r\nimport 'moment-timezone';\r\n\r\nimport {useRequest} from 'API/subscription';\r\nimport FlexRow from 'components/FlexRow';\r\n\r\nimport {COLORS, CHART_HEIGHT, X_AXIS_HEIGHT, Y_AXIS_WIDTH, BUCKETS, DIMENSIONS, FAKE_CHART, toISOLocal} from './constants';\r\nimport Legend from './components/Legend';\r\nimport TransactionTypeButton from './components/TransactionTypeButton';\r\nimport EnvironmentButton from './components/EnvironmentButton';\r\nimport BucketSelector from './components/BucketSelector';\r\nimport DataDimensionSelector from './components/DataDimensionSelector';\r\nimport DateRangePickerButton from './components/DateRangePickerButton';\r\nimport NoDataBanner from './components/NoDataBanner';\r\nimport LoadingBanner from './components/LoadingBanner';\r\nimport DownloadButton from './components/DownloadButton';\r\nimport Button from '../../components/Button';\r\nimport StatBoxes from './components/StatBoxes';\r\nimport {default as CustomTooltip} from './components/Tooltip';\r\n\r\nconst Wrapper = styled.div`\r\n @media (min-width: 1400px) {\r\n width: 1370px;\r\n }\r\n\r\n @media (min-width: 1600px) {\r\n width: 1570px;\r\n }\r\n`;\r\n\r\nconst Error = styled.div`\r\n color: red;\r\n display: flex;\r\n align-items: center;\r\n font-weight: 700;\r\n`;\r\n\r\nconst Actions = styled.div`\r\n padding: 10px 0px;\r\n background-color: #FFF;\r\n margin-left: ${Y_AXIS_WIDTH}px;\r\n\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n .left, .right {\r\n display: flex;\r\n flex-flow: row wrap;\r\n }\r\n\r\n .right {\r\n margin-right: 10px;\r\n }\r\n\r\n & .left > *, & .right > * {\r\n margin-left: 10px;\r\n\r\n @media(max-width: 576px) {\r\n margin-bottom: 10px;\r\n }\r\n }\r\n`;\r\n\r\nconst Chart = styled.div`\r\n position: relative;\r\n flex-basis: 80%;\r\n min-width: 0;\r\n\r\n @media (min-width: 1600px) {\r\n flex-basis: 85%;\r\n }\r\n\r\n height: ${CHART_HEIGHT}px;\r\n\r\n @media(max-width: 576px) {\r\n flex-basis: 100%;\r\n }\r\n\r\n & .recharts-label, & .recharts-label > * {\r\n color: #92908f;\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n letter-spacing: 1.2px;\r\n }\r\n\r\n & .recharts-cartesian-axis-tick-value, & .recharts-cartesian-axis-tick-value > * {\r\n color: #92908f;\r\n font-family: Raleway;\r\n font-size: 11px;\r\n font-weight: 500;\r\n }\r\n\r\n & .recharts-cartesian-axis-tick:first-child, & .recharts-cartesian-axis-tick:last-child {\r\n display: none;\r\n }\r\n\r\n & .recharts-cartesian-axis-line {\r\n display: none;\r\n }\r\n\r\n & .recharts-cartesian-grid-vertical line:first-child, .recharts-cartesian-grid-vertical line:last-child,\r\n .recharts-cartesian-grid-horizontal line:first-child, .recharts-cartesian-grid-horizontal line:last-child {\r\n display: none;\r\n }\r\n`;\r\n\r\nconst Right = styled.div`\r\n min-width: 0;\r\n flex-basis: 20%;\r\n @media (min-width: 1600px) {\r\n flex-basis: 15%;\r\n }\r\n\r\n background-color: #FFF;\r\n height: ${CHART_HEIGHT - X_AXIS_HEIGHT}px;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n\r\n @media(max-width: 576px) {\r\n flex-basis: 100%;\r\n }\r\n`;\r\n\r\nconst Legends = styled.div`\r\n\r\n`;\r\n\r\nconst shouldDisallowHourBucket = (dateSelection) => {\r\n const diff = Math.abs(dateSelection.from.diff(dateSelection.to));\r\n return diff > (3 * 31 * 24 * 60 * 60 * 1000);\r\n}\r\n\r\nexport default function ReportingScreen() {\r\n // UI-input\r\n const [transactionType, setTransactionType] = useState(['authentication']);\r\n const [environment, setEnvironment] = useState(['PRODUCTION']);\r\n const [bucket, setBucket] = useState('DAY');\r\n const [dataDimension, setDataDimension] = useState('authenticationType');\r\n const [dateSelection, setDateSelection] = useState(DateRangePickerButton.defaultSelection);\r\n const handleDateSelection = (dateSelection) => {\r\n setDateSelection(dateSelection);\r\n\r\n if (shouldDisallowHourBucket(dateSelection) && bucket === 'HOUR') {\r\n setBucket('DAY');\r\n }\r\n \r\n };\r\n\r\n const toggleTransactionType = (value) => {\r\n setTransactionType(values => {\r\n if (!Array.isArray(values)) values = [values]; \r\n const newValues = values.includes(value) ? values.filter(search => search !== value) : values.concat([value]);\r\n\r\n if (newValues.length === 0) return ['authentication', 'signature', 'criipto-signature'];\r\n return newValues;\r\n });\r\n }\r\n\r\n const toggleEnvironment = (value) => {\r\n setEnvironment(values => {\r\n if (!Array.isArray(values)) values = [values]; \r\n const newValues = values.includes(value) ? values.filter(search => search !== value) : values.concat([value]);\r\n\r\n if (newValues.length === 0) return ['PRODUCTION', 'TEST'];\r\n return newValues;\r\n });\r\n }\r\n\r\n // Used to refresh a cached request\r\n const [requestId, setRequestId] = useState(Math.random().toString());\r\n const retry = () => setRequestId(Math.random().toString());\r\n\r\n // Tenant based data\r\n const route = useRouteMatch();\r\n\r\n const [dimensions, dimensionsState] = useRequest(route.params.tenantid, {\r\n method: 'GET',\r\n url: '/reporting/events/dimensions',\r\n requestId,\r\n query: {\r\n transactionType,\r\n environment,\r\n timezone: moment.tz.guess()\r\n }\r\n });\r\n\r\n const [results, resultsState] = useRequest(route.params.tenantid, {\r\n method: 'GET',\r\n url: '/reporting/events/series',\r\n requestId,\r\n query: {\r\n bucket,\r\n from: toISOLocal(dateSelection.from.toDate()),\r\n to: toISOLocal(dateSelection.to.toDate()),\r\n dataDimension,\r\n transactionType,\r\n environment,\r\n timezone: moment.tz.guess()\r\n }\r\n });\r\n\r\n const loading = dimensionsState.loading || resultsState.loading;\r\n const error = dimensionsState.error || resultsState.error;\r\n\r\n /*\r\n * Let user switch between dimension types and toggle dimension values\r\n */\r\n const [selectedDataDimensionValues, setSelectedDataDimensionValues] = useState(dimensions ? (dimensions[dataDimension] || []) : []);\r\n const resetSelectedDataDimensionValues = (dimension) => setSelectedDataDimensionValues(dimensions[dimension] || []);\r\n const allDimensionValuesToggled = selectedDataDimensionValues.length === get(dimensions, dataDimension, []).length;\r\n\r\n useEffect(() => {\r\n if (dimensions && results) {\r\n if (!selectedDataDimensionValues.length) {\r\n resetSelectedDataDimensionValues(dataDimension);\r\n }\r\n }\r\n }, [results, dimensions]);\r\n\r\n const handleToggleDimensionValue = (dimension) => {\r\n setSelectedDataDimensionValues((selectedDataDimensions) => {\r\n if (selectedDataDimensions.includes(dimension)) {\r\n return selectedDataDimensions.filter(search => search !== dimension);\r\n }\r\n\r\n return selectedDataDimensions.concat([dimension]);\r\n });\r\n };\r\n const handleToggleAllDimensionValues = () => {\r\n if (!allDimensionValuesToggled) return resetSelectedDataDimensionValues(dataDimension);\r\n setSelectedDataDimensionValues([]);\r\n };\r\n\r\n const handleSelectDimension = (dimension) => {\r\n resetSelectedDataDimensionValues(dimension);\r\n setDataDimension(dimension);\r\n };\r\n\r\n /*\r\n * Lets make sure colors don't jump around as we change selected dimension values and therefore amount of area charts\r\n */\r\n const colorByDimensionValue = get(dimensions, dataDimension, []).reduce((memo, dimension, index) => {\r\n memo[dimension] = COLORS[index % COLORS.length];\r\n return memo;\r\n }, {});\r\n\r\n /*\r\n * Calculate sum by dimension to order area charts for it (so largest values gets rendered at the bottom)\r\n */\r\n const totalByDimensionValue = results ? get(dimensions, dataDimension, []).reduce((memo, dimension) => {\r\n memo[dimension] = results.reduce((sum, result) => get(result, ['dimension', dataDimension, dimension]), 0);\r\n return memo;\r\n }, {}) : {};\r\n\r\n /*\r\n * If the current user selections will result in an empty chart we will render a placeholder chart with a message\r\n */\r\n const shouldFakeData = !results || !results.length || !selectedDataDimensionValues.length;\r\n const data = useMemo(() => {\r\n return shouldFakeData ? FAKE_CHART.generateData(dateSelection) : (results || []).map(result => {\r\n // Fixes null values by making sure that each dimension is always represented by atleast a 0\r\n return {\r\n ...result,\r\n dimension: {\r\n ...result.dimension,\r\n [dataDimension]: {\r\n ...get(dimensions, dataDimension, []).reduce((memo, dimension) => {\r\n memo[dimension] = 0;\r\n return memo;\r\n }, {}),\r\n ...result.dimension[dataDimension]\r\n }\r\n }\r\n };\r\n });\r\n }, [\r\n shouldFakeData,\r\n results,\r\n dataDimension\r\n ]);\r\n\r\n /*\r\n * Filter areas to the selected dimensions\r\n * Sort them by totals to get the highest chart at the bottom\r\n */\r\n const areas = sortBy(\r\n (dimensions && results && results.length) ? get(dimensions, dataDimension, []).filter(dimensionValue => selectedDataDimensionValues.includes(dimensionValue)).map(dimensionValue => ({\r\n dimensionValue: dimensionValue\r\n })) : [],\r\n (area) => -totalByDimensionValue[area.dimensionValue]\r\n );\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n\r\n {error ? (\r\n
    \r\n Unable to fetch data right now, please try again later.\r\n \r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n DIMENSIONS.transactionType[value].label).join(' + ') : DIMENSIONS.transactionType[transactionType].label}`,\r\n angle: -90, // Make the label vertical\r\n position: 'insideLeft'\r\n }}\r\n width={Y_AXIS_WIDTH}\r\n ticks={shouldFakeData ? FAKE_CHART.yTicks : undefined}\r\n />\r\n }\r\n />\r\n\r\n {areas.map(area => (\r\n get(dataObject, ['dimension', dataDimension, area.dimensionValue])}\r\n stackId=\"1\"\r\n stroke={colorByDimensionValue[area.dimensionValue]}\r\n strokeWidth={2.5}\r\n fill={colorByDimensionValue[area.dimensionValue]}\r\n fillOpacity=\"0.25\"\r\n activeDot={false}\r\n />\r\n ))}\r\n \r\n \r\n {!loading && shouldFakeData && }\r\n {loading && }\r\n \r\n \r\n \r\n {get(dimensions, dataDimension, []).length > 3 && ()}\r\n {dimensions && results && get(dimensions, dataDimension, []).map((dimension) => (\r\n handleToggleDimensionValue(dimension)}\r\n selected={selectedDataDimensionValues.includes(dimension)}\r\n />\r\n ))}\r\n\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n )\r\n}\r\n","import React, {useState, useEffect} from 'react';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faSpinner, faSearch } from '@fortawesome/free-solid-svg-icons';\r\nimport styled from 'styled-components';\r\nimport moment from 'moment';\r\nimport {useParams, useRouteMatch, useHistory} from 'react-router-dom';\r\nimport {upperFirst} from 'lodash';\r\n\r\nimport useTenant from 'hooks/useTenant';\r\nimport usePromise from 'hooks/usePromise';\r\nimport CriiptoVerify, {VerifyDomain} from 'services/criiptoVerify';\r\n\r\nimport DropdownButton from 'components/DropdownButton';\r\nimport Button from '../../components/Button';\r\n\r\ninterface LogEntryProps {\r\n expand: boolean;\r\n}\r\n\r\ninterface LogEntry {\r\n cursor: string;\r\n timestamp: string;\r\n url: string;\r\n rawUrl: string;\r\n domain: string;\r\n method: string;\r\n statusCode: number;\r\n requestHeaders: {[key: string]: string};\r\n requestBody: string;\r\n responseHeaders: {[key: string]: string};\r\n responseBody: string;\r\n}\r\n\r\nconst ActionBar = styled.div`\r\n display: flex;\r\n flex-flow: row;\r\n align-items: center;\r\n margin-bottom: 10px;\r\n\r\n & > * {\r\n margin-right: 10px;\r\n }\r\n`;\r\n\r\nconst SearchInput = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n box-sizing: border-box;\r\n\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n line-height: 25px;\r\n color: #807e7b;\r\n\r\n height: 40px;\r\n padding: 0px 11px;\r\n\r\n & input {\r\n height: 36px;\r\n border: 0;\r\n background: transparent;\r\n }\r\n\r\n & svg {\r\n margin-right: 11px;\r\n }\r\n`;\r\n\r\nconst LogEntryWrapper = styled.div`\r\n background-color: #FFF;\r\n border-bottom: 4px solid #faf8f5;\r\n \r\n & .header {\r\n display: flex;\r\n flex-flow: row;\r\n align-items: center;\r\n cursor: pointer;\r\n }\r\n\r\n & .header > * {\r\n border-right: 4px solid #faf8f5;\r\n padding: 5px;\r\n }\r\n\r\n & .header > *:last-child {\r\n border-right: none;\r\n }\r\n\r\n & .header .url {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n & .header .timestamp {\r\n white-space: nowrap;\r\n }\r\n\r\n & .details {\r\n border-top: 4px solid #faf8f5;\r\n display: ${(props: LogEntryProps) => props.expand ? 'flex' : 'none'};\r\n flex-flow: row;\r\n }\r\n\r\n & .details > * {\r\n overflow-wrap: anywhere;\r\n width: 48%;\r\n padding: 5px;\r\n }\r\n\r\n & .details .html {\r\n font-family: monospace;\r\n white-space: pre;\r\n }\r\n`;\r\n\r\n// #faf8f5\r\n\r\nexport default function DebuggerScreen() {\r\n const [tenant] = useTenant();\r\n const params = useParams<{domain?: string}>();\r\n const history = useHistory();\r\n const match = useRouteMatch('/:tenant/logs');\r\n const criiptoVerify = CriiptoVerify.singleton();\r\n const domain = params.domain;\r\n\r\n const [pagination, setPagination] = useState<{prev: string | null; next: string |null}>({prev: null, next: null});\r\n const [entries, setEntries] = useState([]);\r\n const [expanded, setExpanded] = useState<{[key: string]: boolean}>({});\r\n const [search, setSearch] = useState('');\r\n const [domains, domainsState] = usePromise(async () => {\r\n if (!tenant) return [] as VerifyDomain[];\r\n return criiptoVerify.getTenantDomains(tenant, null);\r\n }, [tenant]);\r\n\r\n useEffect(() => {\r\n if (!domain && domains && domains.length) {\r\n handleDomain(domains[0].name);\r\n }\r\n }, [domain, domains]);\r\n\r\n const handleDomain = (domain: string) => {\r\n history.push(`${match!.url}/${domain}`)\r\n }\r\n\r\n const [loadMorePending, setLoadMorePending] = useState(false);\r\n const loadMore = (url: string) => {\r\n if (!domain) throw new Error('loadMore(): domain is required');\r\n\r\n setLoadMorePending(true);\r\n criiptoVerify._axios!.get(url.replace('{domain}', domain!)).then(response => {\r\n const prev = response.data.links.find((search: any) => search.rel === 'pagination:prev');\r\n const next = response.data.links.find((search: any) => search.rel === 'pagination:next');\r\n\r\n setPagination(pagination => ({\r\n prev: prev && prev.href || null ,\r\n next: pagination.next || next && next.href || null\r\n }));\r\n\r\n const entries = (response.data.entries as LogEntry[]);\r\n\r\n setEntries(previous => previous.concat(entries));\r\n setLoadMorePending(false);\r\n });\r\n }\r\n\r\n const toggleEntry = (entry: LogEntry) => {\r\n setExpanded(expanded => ({\r\n ...expanded,\r\n [entry.cursor]: !expanded[entry.cursor]\r\n }));\r\n }\r\n \r\n useEffect(() => {\r\n if (!domain) return;\r\n\r\n setEntries([]);\r\n criiptoVerify.getTenantLinkTemplate(tenant!, 'easyid:domain-http-logs').then(url => {\r\n loadMore(url);\r\n });\r\n }, [domain]);\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n handleDomain(item.value)}\r\n color=\"secondary\"\r\n label={domain || 'Select domain'}\r\n items={(domains ||[]).map(domain => ({\r\n key: domain.name,\r\n label: domain.name,\r\n value: domain.name\r\n }))}\r\n />\r\n\r\n \r\n \r\n setSearch(event.target.value)}/>\r\n \r\n\r\n {domainsState.pending && (\r\n
    Loading ...
    \r\n )}\r\n
    \r\n\r\n
    \r\n {entries.filter(entry => !search || JSON.stringify(entry).includes(search)).map(entry => (\r\n \r\n
    toggleEntry(entry)}>\r\n
    {moment(entry.timestamp).format('YYYY-MM-DD HH:mm:ss')}
    \r\n
    {entry.statusCode}
    \r\n
    {entry.method}
    \r\n
    {entry.url}
    \r\n
    \r\n
    \r\n
    \r\n Request\r\n
    \r\n {entry.method} {entry.url}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n Response\r\n
    \r\n {entry.statusCode}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n ))}\r\n
    \r\n\r\n {pagination.prev && (\r\n \r\n )}\r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface HeadersFormatterProps {\r\n headers: {[key: string]: string};\r\n}\r\n\r\nfunction HeadersFormatter(props: HeadersFormatterProps) {\r\n if (!Object.keys(props.headers).length) return null;\r\n\r\n return (\r\n \r\n {Object.keys(props.headers).map(key => (\r\n \r\n {upperFirst(key)}: {props.headers[key]}
    \r\n
    \r\n ))} \r\n
    \r\n );\r\n}\r\n\r\ninterface NewlineFormatterProps {\r\n text: string;\r\n}\r\nfunction NewlineFormatter(props: NewlineFormatterProps) {\r\n if (!props.text) return null;\r\n return (\r\n \r\n {props.text.split(\"\\n\").map((text, index) => (\r\n \r\n {text}\r\n
    \r\n
    \r\n ))}\r\n
    \r\n );\r\n}","import {useEffect, useState} from 'react';\r\n\r\nexport default function usePromise(callback : () => Promise, deps: any[]) : [Response | null, {pending: boolean, error: Error | null}] {\r\n const [response, setResponse] = useState(null);\r\n const [pending, setPending] = useState(true);\r\n const [error, setError] = useState(null);\r\n\r\n useEffect(() => {\r\n setPending(true);\r\n\r\n Promise.resolve(callback()).then((response: Response) => {\r\n setResponse(response);\r\n setError(null);\r\n setPending(false);\r\n }).catch(error => {\r\n setResponse(null);\r\n setError(error);\r\n setPending(false);\r\n });\r\n }, deps);\r\n\r\n return [response, {pending, error}];\r\n}","import React, { Suspense, useEffect } from 'react';\r\nimport { Switch, Route, Redirect, useRouteMatch } from 'react-router-dom';\r\n\r\nimport useTenant from 'hooks/useTenant';\r\n\r\nimport MenuBar from './components/MenuBar';\r\nimport MenuBarItem from './components/MenuBarItem/MenuBarItem';\r\nimport CreditCard from 'components/CreditCard';\r\nimport AuthorizedRoute from '../../../../components/Auth/AuthorizedRoute';\r\nimport Signup from './screens/Signup';\r\nimport Subscription from './screens/Subscription';\r\nimport Invoices from './screens/Invoices';\r\nimport Reporting from './screens/Reporting';\r\nimport LogsScreen from './screens/Logs';\r\nimport criiptoPermit from 'services/criiptoPermit';\r\n\r\nimport './index.css';\r\nimport Auth from 'services/auth';\r\n\r\n/*\r\n * React bundle splitting, Customization screen will include a bunch of dependencies we are unlikely to need anywhere else on the site.\r\n */\r\nconst CustomizationScreen = React.lazy(() => import('./screens/Customization'));\r\n\r\nfunction analyticsGroup(id, traits) {\r\n console.debug('segment.group', id, traits);\r\n if (window.analytics) window.analytics.group(id, traits);\r\n}\r\n\r\nexport default function TenantScreen() {\r\n const { path, url } = useRouteMatch();\r\n const permitSvc = criiptoPermit.singleton();\r\n const [tenant] = useTenant();\r\n let defaultScreen = permitSvc.isAuthorized(tenant, 'financials') ? 'plans' : 'reporting';\r\n\r\n useEffect(() => {\r\n if (!tenant) return;\r\n\r\n const auth = Auth.singleton();\r\n auth.getProfile()\r\n .then(profile => {\r\n window.analytics.identify(profile.sub);\r\n analyticsGroup(tenant.verifyId, {\r\n tenantId: tenant.verifyId,\r\n entityId: tenant.entityId, \r\n name: tenant.name\r\n });\r\n });\r\n }, [tenant]);\r\n\r\n if (!tenant) return null;\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Loading...
    }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n}","import React, { useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { useHistory, useLocation, useParams, Route, Switch } from 'react-router-dom';\r\nimport LoginManager from '../../components/LoginManager/LoginManager';\r\nimport TenantScreen from './screens/Tenant';\r\nimport './index.css';\r\nimport {Tenant} from '../../types';\r\nimport logo from './assets/logo-criipto-white-2.svg';\r\n\r\nconst Header = styled.header`\r\n height: 46px;\r\n padding: 10px;\r\n background: #0d4b86; \r\n position: fixed;\r\n top: 0;\r\n right: 0;\r\n left: 0;\r\n z-index: 9;\r\n display: flex;\r\n flex-flow: row no-wrap;\r\n justify-content: space-between;\r\n align-items: center;\r\n \r\n @media (min-width: 750px) {\r\n height: 60px;\r\n\r\n & .logo {\r\n margin-left: 33px;\r\n }\r\n }\r\n \r\n & .logo {\r\n display: block;\r\n margin-top: 3px;\r\n }\r\n`;\r\n\r\nexport default function AppScreen() {\r\n const history = useHistory();\r\n const location = useLocation();\r\n\r\n const [noTenants, setNotenants] = useState(false);\r\n const handleTenantSelected = (tenant: Tenant) => {\r\n if (!location.pathname.includes(tenant.value)) {\r\n history.push('/' + tenant.value + '/' );\r\n }\r\n };\r\n\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n \"Criipto\"\r\n \r\n
    \r\n
    \r\n setNotenants(true)} /> } />\r\n
    \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n {noTenants ? (\r\n
    \r\n
    \r\n

    No tenants

    \r\n

    \r\n Please sign up via criipto.com\r\n

    \r\n
    \r\n
    \r\n ) : null}\r\n
    \r\n );\r\n}","import React from 'react';\r\nimport { BrowserRouter, Switch, Route } from 'react-router-dom';\r\n\r\nimport ConfigContext from '../config-context';\r\nimport AuthenticatedRoute from '../components/Auth/AuthenticatedRoute';\r\nimport Login from './Auth/Login';\r\nimport Callback from './Auth/Callback';\r\nimport AppScreen from './App';\r\nimport { Elements } from '@stripe/react-stripe-js';\r\nimport { loadStripe } from '@stripe/stripe-js';\r\n\r\nconst stripePromise = loadStripe(window.appConfig.stripe.key);\r\n\r\nexport default function RootScreen() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport 'react-dates/initialize';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\n\r\nimport './index.css';\r\nimport RootScreen from './screens/index';\r\nimport {store as reduxStore} from './store'\r\n\r\nif (window.location.origin.startsWith('https://subscription-preprod.criipto.com')) {\r\n window.location.href = 'https://dashboard-test.criipto.com/';\r\n}\r\nif (window.location.origin.startsWith('https://subscription.criipto.com')) {\r\n window.location.href = 'https://dashboard.criipto.com/';\r\n}\r\n\r\nwindow.onunhandledrejection = event => {\r\n console.warn(`UNHANDLED PROMISE REJECTION`, event);\r\n};\r\n\r\nReactDOM.render(, document.getElementById('root'));","import React from 'react';\r\nimport styled from 'styled-components';\r\nimport {Checkbox} from '../screens/Reporting/components/Legend';\r\n\r\ninterface ButtonProps {\r\n onClick?: ((event: React.MouseEvent) => void) | undefined;\r\n type?: \"button\" | \"submit\";\r\n color?: \"primary\" | \"secondary\";\r\n width?: number | string;\r\n working?: boolean;\r\n disabled?: boolean;\r\n children: React.ReactNode;\r\n className?: string;\r\n tooltip?: string;\r\n}\r\n\r\nconst Button:React.FunctionComponent = ({working, disabled, children, tooltip, ...props}) => {\r\n return (\r\n \r\n )\r\n};\r\n\r\nconst StyledButton = styled(Button)`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n box-sizing: border-box;\r\n\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n line-height: 25px;\r\n text-transform: uppercase;\r\n color: ${props => props.color === 'primary' ? '#dc6a62' : '#807e7b'};\r\n\r\n height: 40px;\r\n ${(props) => props.width && typeof(props.width) === \"number\" && `width: ${props.width}px;`}\r\n ${(props) => props.width && typeof(props.width) === \"string\" && `width: ${props.width};`}\r\n padding: 0px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n text-align: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n flex-wrap: nowrap;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport default StyledButton;\r\n\r\ninterface TabButtonProps extends ButtonProps {\r\n position?: 'top' | 'right' | 'bottom' | 'left';\r\n}\r\n\r\nexport const TabButton = styled(StyledButton)`\r\n ${(props: TabButtonProps) => (!props.position || props.position === 'top') && `\r\n border-bottom-left-radius: 0px;\r\n border-bottom-right-radius: 0px;\r\n border-bottom: 0px;\r\n `}\r\n ${(props: TabButtonProps) => props.position && props.position === 'right' && `\r\n border-bottom-left-radius: 0px;\r\n border-bottom-right-radius: 0px;\r\n border-bottom: 0px;\r\n transform: translateY(-100%) rotate(90deg);\r\n transform-origin: bottom left; \r\n `}\r\n ${(props: TabButtonProps) => props.position && props.position === 'bottom' && `\r\n border-top-left-radius: 0px;\r\n border-top-right-radius: 0px;\r\n border-top: 0px;\r\n `}\r\n`;\r\n\r\nconst CheckbuxButtonWrapper = styled(StyledButton)`\r\n padding: 0px;\r\n`\r\n\r\nconst CheckboxButtonItem = styled.div`\r\n padding: 5.5px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n cursor: pointer;\r\n\r\n background-color: ${(props:any) => props.selected ? '#FFF' : '#faf8f5'};\r\n`;\r\n\r\nconst CheckboxButtonLabel = styled.div`\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n line-height: 25px;\r\n text-transform: uppercase;\r\n color: #807e7b;\r\n`;\r\n\r\nconst StyledCheckbox = styled(Checkbox)`\r\n margin: 0;\r\n margin-right: 5px;\r\n`;\r\n\r\ninterface ICheckboxButtonItem {\r\n label: string;\r\n selected: boolean;\r\n [key: string]: any;\r\n};\r\n\r\ninterface CheckboxButtonProps {\r\n onSelect: (item: ICheckboxButtonItem) => void,\r\n items: ICheckboxButtonItem[];\r\n}\r\n\r\nexport function CheckboxButton(props: CheckboxButtonProps) {\r\n return (\r\n \r\n {props.items.map(item => (\r\n props.onSelect(item)}>\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n );\r\n}","import {useState, useEffect, useRef, useCallback} from 'react';\r\nimport qs from 'qs';\r\nimport axios from 'axios';\r\nimport LRU from 'lru-cache';\r\nimport useAxios from '../hooks/useAxios';\r\n\r\nimport Auth from '../services/auth';\r\n\r\ndeclare global {\r\n interface Window { appConfig: any; }\r\n};\r\n\r\ntype GenericObject = {\r\n [key: string]: any\r\n};\r\n\r\nconst BASE_URL = window.appConfig ? window.appConfig.subscriptionApi.url.replace(/\\/+$/, \"\") : null;\r\n\r\nexport function useAuth(tenantId: string | null | undefined): [string | null, {loading: boolean, error: any}] {\r\n const auth = Auth.singleton();\r\n const [accessToken, setAccessToken] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!tenantId) return;\r\n\r\n setAccessToken(null);\r\n setLoading(true);\r\n\r\n auth.getSubscriptionAccessToken(tenantId).then((token: string) => {\r\n setLoading(false);\r\n setAccessToken(token);\r\n })\r\n .catch((error: any) => {\r\n setLoading(false);\r\n setError(error);\r\n });\r\n }, [tenantId]);\r\n\r\n return [accessToken, {loading, error}];\r\n}\r\n\r\ninterface RequestProps {\r\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE',\r\n url: string,\r\n query?: GenericObject,\r\n data?: GenericObject\r\n requestId?: string | null;\r\n [key: string]: any;\r\n};\r\n\r\nexport const requestCache = new LRU(20);\r\nexport function useRequest(tenantId: string | null | undefined, props: RequestProps & TRequest): [TResponse | null, {loading: boolean, done: boolean, error: any, requestId: string | null, execute: Function}] {\r\n const [result, setResult] = useState(null);\r\n const [done, setDone] = useState(false);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [accessToken, authState] = useAuth(tenantId);\r\n const method = props.method || 'GET';\r\n const cacheKey = useRef(null);\r\n\r\n const execute = useCallback((executeProps: any, updateState = true) => {\r\n if (!accessToken) throw new Error(`Cannot execute request without accessToken`);\r\n if (updateState) {\r\n setDone(false);\r\n setLoading(true);\r\n }\r\n \r\n return axios.request({\r\n baseURL: BASE_URL,\r\n url: executeProps && executeProps.url || props.url,\r\n method: executeProps && executeProps.method || method,\r\n params: executeProps && executeProps.query || props.query,\r\n data: executeProps && executeProps.data || props.data,\r\n headers: {\r\n 'Authorization': `Bearer ${accessToken}`,\r\n 'Accept': 'application/json'\r\n },\r\n paramsSerializer: params => {\r\n return qs.stringify(params, { arrayFormat: 'indices' });\r\n }\r\n })\r\n .then(result => {\r\n if (updateState) {\r\n setLoading(false);\r\n setDone(true);\r\n setError(null);\r\n setResult(result.data);\r\n }\r\n return result;\r\n })\r\n .catch(error => {\r\n if (updateState) {\r\n setDone(true);\r\n setLoading(false);\r\n setResult(null);\r\n setError(error);\r\n }\r\n throw error;\r\n });\r\n }, [\r\n accessToken,\r\n method,\r\n props\r\n ]);\r\n\r\n /*\r\n * For GET requests we automatically execute them based on props\r\n */\r\n useEffect(() => {\r\n if (!accessToken) return;\r\n if (method !== 'GET') return;\r\n\r\n setDone(false);\r\n setLoading(true);\r\n\r\n const requestCacheKey = accessToken + JSON.stringify(props);\r\n cacheKey.current = requestCacheKey;\r\n\r\n if (!requestCache.get(requestCacheKey)) {\r\n requestCache.set(requestCacheKey, execute(null, false));\r\n }\r\n\r\n requestCache.get(requestCacheKey).then((result: {data: TResponse}) => {\r\n if (cacheKey.current === requestCacheKey) {\r\n setDone(true);\r\n setLoading(false);\r\n setError(null);\r\n setResult(result.data);\r\n }\r\n })\r\n .catch((error: any) => {\r\n if (cacheKey.current === requestCacheKey) {\r\n setDone(true);\r\n setLoading(false);\r\n setResult(null);\r\n setError(error);\r\n }\r\n });\r\n }, [\r\n accessToken,\r\n method,\r\n JSON.stringify(props)\r\n ]);\r\n\r\n if (!tenantId || !props || !props.url) throw new Error('useRequest: (tenantId, props{url}) is required');\r\n\r\n return [result, {\r\n done,\r\n loading: loading || (method === 'GET' ? authState.loading : false) || false,\r\n error: error || (method === 'GET' ? authState.error : null) || null,\r\n requestId: props.requestId || null,\r\n execute\r\n }];\r\n}","import React, {useRef, useState} from 'react';\r\nimport styled from 'styled-components';\r\nimport BootstrapOverlay from 'react-bootstrap/lib/Overlay';\r\nimport PropTypes from 'prop-types';\r\nimport ReactDOM from 'react-dom';\r\n\r\nconst Wrapper = styled.div`\r\n position: relative;\r\n`;\r\n\r\nconst PickerButton = styled.div`\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n\r\n color: ${props => props.color === 'primary' ? '#dc6a62' : '#807e7b'};\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n\r\n height: 40px;\r\n padding: 0px 11px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n cursor: pointer;\r\n flex-wrap: nowrap;\r\n white-space: nowrap;\r\n\r\n & img {\r\n margin-right: 10px;\r\n }\r\n`;\r\n\r\nconst Overlay = styled.div`\r\n position: absolute;\r\n transform: translateY(10px);\r\n z-index: 1;\r\n\r\n width: 200px;\r\n\r\n border-radius: 5px;\r\n border: 2px solid #d4d2cf;\r\n background-color: #faf8f5;\r\n padding: 4px;\r\n\r\n & ul {\r\n list-stype-type: none;\r\n margin: 0;\r\n \r\n & li {\r\n display: block;\r\n padding: 0 6px;\r\n height: 30px;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n\r\n color: #807e7b;\r\n font-family: Raleway;\r\n font-size: 12px;\r\n font-weight: 700;\r\n text-transform: uppercase;\r\n\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n & li:hover {\r\n color: #dc6a62;\r\n background-color: rgba(220, 106, 98, 0.2);\r\n }\r\n }\r\n`;\r\n\r\nexport default function DropdownButton(props) {\r\n const buttonRef = useRef(null);\r\n const containerRef = useRef(null);\r\n const [showOverlay, setShowOverlay] = useState(false);\r\n const hideOverlay = () => setShowOverlay(false);\r\n const toggleOverlay = () => setShowOverlay(value => !value);\r\n \r\n const handleSelect = (item) => {\r\n hideOverlay();\r\n\r\n if (item.onSelect) return item.onSelect();\r\n props.onSelect(item);\r\n };\r\n\r\n return (\r\n \r\n {props.label} ▼\r\n ReactDOM.findDOMNode(buttonRef.current)}\r\n >\r\n \r\n
      \r\n {props.items.map((item) => (\r\n
    • handleSelect(item)}>{item.label}
    • \r\n ))}\r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nDropdownButton.propTypes = {\r\n style: PropTypes.object,\r\n color: PropTypes.oneOf(['primary', 'secondary']),\r\n label: PropTypes.any.isRequired,\r\n onSelect: PropTypes.func.isRequired,\r\n items: PropTypes.arrayOf(\r\n PropTypes.shape({\r\n key: PropTypes.string.isRequired,\r\n label: PropTypes.string.isRequired\r\n })\r\n ).isRequired\r\n};"],"sourceRoot":""}