{"version":3,"file":"static/js/596.32c12a8b.chunk.js","mappings":"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","sources":["Joyride/JoyridePayAtt.constants.tsx","Theme/base.ts","Theme/ThemeProvider.tsx","Theme/schemes/PureLightTheme.ts","api/auth/authApi.ts","api/campaign/campaignAPI.ts","api/dashboard/interface.ts","api/helper.ts","api/stampCards/websiteMockAPI.ts/stampCardCampaignMocks.ts","api/stampCards/websiteMockAPI.ts/stampCardMocks.ts","api/stampCards/websiteMockAPI.ts/WebsiteMockAPI.ts","api/user/index.ts","api/venues/venuesAPI.ts","builder/constants/types.ts","contexts/SidebarContext.tsx","errorHandling/handleResponse.ts","errorHandling/payattError.ts","errorHandling/payattSuccess.ts","generalComponents/BoxModifications.tsx","generalComponents/SuspenseLoader/SuspenseLoader.tsx","generalComponents/Toasts/Toasts.tsx","generalComponents/Transitions/SlideUp.tsx","api/globalSettings/globalSettingsAPI.ts","store/features/PayAttSettings/billingSettingsSlice.ts","store/features/PayAttSettings/handlers.ts","store/features/auth/authSlice.ts","store/features/auth/handlers.ts","store/features/campaigns/campaignHistorySlice.ts","store/features/campaigns/handlers/handlerCampaignHistory.ts","store/features/colorPicker/colorPickerSlice.ts","store/features/colorPicker/handlers.ts","api/dashboard/dashboardAPI.parseResponse.ts","api/dashboard/dashboardAPI.ts","store/features/dashboard/actions.ts","store/features/dashboard/dashboardSlice.ts","store/features/dashboard/extraReducers.ts","store/features/dashboard/handlers.ts","store/features/dashboard/helpers.ts","store/features/merchantAndVenues/handlers.ts","api/merchant/merchantAPI.ts","store/features/merchantAndVenues/merchantSlice.ts","store/features/merchantAndVenues/venueCategorySpellCheck.ts","store/features/notifications/handlers.ts","store/features/notifications/notificationsSlice.ts","store/features/registationDisplayViews/handlers.ts","store/features/registationDisplayViews/registationDisplayViewsSlice.ts","store/features/registrations/handlers.ts","api/stats/registrationStatisticsAPI.ts","store/features/registrations/registrationSlice.tsx","store/features/stampCardCampaigns/handlers.ts","store/features/stampCardCampaigns/stampCardFormSlice.ts","api/stampCards/Form/getAllCampaignsAPI.ts","store/features/venueCategories/handlers.ts","api/venueCategories/venueCategoriesAPI.ts","store/features/venueCategories/venueCategorySlice.ts","store/localStorageState.ts","store/selectors.ts","store/store.ts","translations/builder/builder.ts","translations/campaigns/intelliSms.content.ts","translations/campaigns/intelliSms.filtersModal.ts","translations/campaigns/intelliSms.infoButton.ts","translations/campaigns/intelliSms.rruleGenerator.ts","translations/campaigns/intelliSms.scheduleCampaign.ts","translations/campaigns/intelliSms.summaryModal.ts","translations/campaigns/campaigns.ts","translations/components/footer.ts","translations/components/status/comingSoon.ts","translations/components/status/status404.ts","translations/components/urlShortener.ts","translations/components/venueToggle.ts","translations/components/dialog.ts","translations/components/main.ts","translations/components/tooltip.ts","translations/contexts/editToggleTranslations.ts","translations/general/errors.ts","translations/home/homeTranslations.ts","translations/login/loginTranslations.ts","translations/management/memberManagement/memberManagementTranslations.ts","translations/management/passwordReset/passwordResetTranslations.ts","translations/management/settings/integration.ts","translations/management/settings/menu.ts","translations/management/settings/profile.ts","translations/management/settings/venueSettings.ts","translations/notifications/notificationTranslations.ts","translations/registrations/registrationTranslations.ts","translations/sidebar/sidebar.ts","translations/stamp-card/stamp-card-form/prolongModalWindow.ts","translations/stamp-card/stamp-card-form/stamp-card-overview.ts","translations/stamp-card/stamp-card-overlay.ts","translations/stamp-card/stamp-card-page/page.ts","translations/dashboard/PayAttComponentTranslations.ts","translations/dashboard/filterTranslations.ts","translations/dashboard/headerTranslations.ts","translations/dashboard/dashboardTranslations.ts","translations/general/noContentTranslations.ts","translations/introductions/JoyrideStepTranslations/JoyrideStepTranslations.dashboard.ts","translations/introductions/JoyrideStepTranslations/JoyrideStepTranslations.homepage.ts","translations/introductions/JoyrideStepTranslations/JoyrideStepTranslations.intelliSms.ts","translations/introductions/introductionTranslations.ts","translations/management/contact/faq.ts","translations/management/contact/form.ts","translations/management/settings/intelliSms.ts","translations/management/settings/introductions.ts","translations/registrationDisplayViews/registrationDisplayViews.ts","translations/stamp-card/stamp-card-form/resetModalWindow.ts","translations/stamp-card/stamp-card-form/sidebar.ts","translations/stamp-card/stamp-card-form/fields.ts","translations/stamp-card/stamp-card-form/step1.ts","translations/stamp-card/stamp-card-form/step2.ts","translations/stamp-card/stamp-card-form/step3.ts","translations/stamp-card/stamp-card-form/step4.ts","translations/stamp-card/stamp-card-form/submitModalWindow.ts","translations/stamp-card/stamp-card-form/update-list.ts","translations/stamp-card/stamp-card-form/imageInfo.ts","translations/stamp-card/stamp-card-form/initialValues.ts","translations/stamp-card/stamp-card-form/step5.ts","translations/stamp-card/stamp-card-form/triggers.ts","translations/stamp-card/stamp-card-form/stamp-card-form.ts","translations/stamp-card/stamp-card-page/cookieConsent.ts","translations/stamp-card/stamp-card-page/pwaInstallButton.ts","translations/translations.ts","utils/contrastor.ts","utils/utils.ts","views/Dashboard/Widgets/MongoDBWidgets/Interfaces/MongoDBWidgets.interfaces.names.ts","views/Dashboard/Widgets/PayAttWidgets/Calculations/Helpers/Calculations.utils.tsx","views/Dashboard/Widgets/PayAttWidgets/PayAttWidgets.names.ts","views/Management/settings/VenueSettings/helpers/scanColor.ts","views/StampCardForm/Form/form-helpers/constraints.ts","views/StampCardForm/Form/props.interfaces.ts","assets/scss/export.module.scss"],"sourcesContent":["import { Step } from 'react-joyride';\n\n// ##### Change these values to add more steps to the intro\n// Homepage\nexport type HomepageMainIntroStepLength = 13;\nexport type HomepageSettingsIntroStepLength = 8;\n\n// Dashboard\nexport type DashboardMainIntroStepLength = 13;\n\n// Intelli SMS\nexport type IntelliSmsNewCampaignIntroStepLength = 8;\nexport type IntelliSmsCalendarIntroStepLength = 7;\n\n// ##### General exports\n\nexport const SHOW_HOMEPAGE_SETTINGS_INTRO_SEARCH_PARAMS = 'showIntro=settings';\nexport const SHOW_HOMEPAGE_INTRO_SEARCH_PARAMS = 'showIntro=main';\nexport const SHOW_DASHBOARD_INTRO_SEARCH_PARAMS = 'showIntro=main';\nexport const SHOW_INTELLI_SMS_NEW_CAMPAIGN_INTRO_SEARCH_PARAMS = 'showIntro=new';\nexport const SHOW_INTELLI_SMS_CALENDAR_INTRO_SEARCH_PARAMS = 'showIntro=calendar';\n\nexport const JOYRIDE_TIMEOUT_MENU_OPEN = 600;\nexport const JOYRIDE_TIMEOUT_ACCORDION_OPEN = 400;\nexport const TRY_IT_NOW_TEXT_COLOR = '#0e8e34';\nexport const NEXT_BUTTON_BG_COLOR = '#0e8e34';\n\nexport type CreateIntroStep = Omit & Partial>;\n","import React from 'react';\n\nimport { Theme } from '@mui/material';\n\nimport { PureLightTheme } from './schemes/PureLightTheme';\n\nconst themeMap: { [key: string]: Theme } = {\n PureLightTheme\n};\n\nexport const themeCreator = (theme: string): Theme => themeMap[theme];\n\ndeclare module '@mui/material/styles' {\n interface Theme {\n colors: {\n gradients: {\n blue1: string;\n blue2: string;\n blue3: string;\n orange1: string;\n orange2: string;\n purple1: string;\n pink1: string;\n pink2: string;\n green1: string;\n black1: string;\n };\n shadows: {\n success: string;\n error: string;\n primary: string;\n warning: string;\n };\n alpha: {\n white: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n trueWhite: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n black: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n };\n secondary: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n primary: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n success: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n warning: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n error: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n info: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n };\n general: {\n reactFrameworkColor: React.CSSProperties['color'];\n borderRadiusSm: string;\n borderRadius: string;\n borderRadiusLg: string;\n borderRadiusXl: string;\n };\n sidebar: {\n background: React.CSSProperties['color'];\n boxShadow: React.CSSProperties['color'];\n width: string;\n textColor: React.CSSProperties['color'];\n dividerBg: React.CSSProperties['color'];\n menuItemColor: React.CSSProperties['color'];\n menuItemColorActive: React.CSSProperties['color'];\n menuItemBg: React.CSSProperties['color'];\n menuItemBgActive: React.CSSProperties['color'];\n menuItemIconColor: React.CSSProperties['color'];\n menuItemIconColorActive: React.CSSProperties['color'];\n menuItemHeadingColor: React.CSSProperties['color'];\n transitionInSidebar: string;\n transitionInSidebarTimeMS: number;\n transitionAwaySidebar: string;\n transitionAwaySidebarTimeMS: number;\n };\n header: {\n height: string;\n background: React.CSSProperties['color'];\n boxShadow: React.CSSProperties['color'];\n textColor: React.CSSProperties['color'];\n };\n }\n\n interface ThemeOptions {\n colors: {\n gradients: {\n blue1: string;\n blue2: string;\n blue3: string;\n orange1: string;\n orange2: string;\n purple1: string;\n pink1: string;\n pink2: string;\n green1: string;\n black1: string;\n };\n shadows: {\n success: string;\n error: string;\n primary: string;\n warning: string;\n };\n alpha: {\n white: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n trueWhite: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n black: {\n 5: string;\n 10: string;\n 30: string;\n 50: string;\n 70: string;\n 100: string;\n };\n };\n secondary: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n primary: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n success: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n warning: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n error: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n info: {\n lighter: string;\n light: string;\n main: string;\n dark: string;\n };\n };\n\n general: {\n reactFrameworkColor: React.CSSProperties['color'];\n borderRadiusSm: string;\n borderRadius: string;\n borderRadiusLg: string;\n borderRadiusXl: string;\n };\n sidebar: {\n background: React.CSSProperties['color'];\n boxShadow: React.CSSProperties['color'];\n width: string;\n textColor: React.CSSProperties['color'];\n dividerBg: React.CSSProperties['color'];\n menuItemColor: React.CSSProperties['color'];\n menuItemColorActive: React.CSSProperties['color'];\n menuItemBg: React.CSSProperties['color'];\n menuItemBgActive: React.CSSProperties['color'];\n menuItemIconColor: React.CSSProperties['color'];\n menuItemIconColorActive: React.CSSProperties['color'];\n menuItemHeadingColor: React.CSSProperties['color'];\n transitionInSidebar: string;\n transitionInSidebarTimeMS: number;\n transitionAwaySidebar: string;\n transitionAwaySidebarTimeMS: number;\n };\n header: {\n height: string;\n background: React.CSSProperties['color'];\n boxShadow: React.CSSProperties['color'];\n textColor: React.CSSProperties['color'];\n };\n }\n}\n","import React, { useMemo, useState } from 'react';\n\nimport { ThemeProvider } from '@mui/material';\nimport { StylesProvider } from '@mui/styles';\n\nimport { themeCreator } from './base';\n\nexport const ThemeContext = React.createContext(\n // eslint-disable-next-line\n (themeName: string): void => {}\n);\n\nconst ThemeProviderWrapper: React.FC = ({ children }) => {\n const curThemeName = localStorage.getItem('appTheme') || 'PureLightTheme';\n const [themeName, _setThemeName] = useState(curThemeName);\n const theme = themeCreator(themeName);\n\n const setThemeName = useMemo(\n () =>\n (themeNameInner: string): void => {\n localStorage.setItem('appTheme', themeNameInner);\n _setThemeName(themeNameInner);\n },\n []\n );\n\n return (\n \n \n {children}\n \n \n );\n};\n\nexport default ThemeProviderWrapper;\n","import '@mui/lab/themeAugmentation';\nimport { alpha, createTheme, darken, lighten } from '@mui/material';\n\nimport sassVariables from 'assets/scss/export.module.scss';\n\nexport const themeFontFamily = [\n 'Verdana',\n 'sans-serif',\n 'Inter',\n '-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\"'\n].join(',');\n\nconst themeData = {\n primary: '#5569ff',\n secondary: '#6E759F',\n success: '#44D600',\n warning: '#FFA319',\n error: '#FF1943',\n info: '#33C2FF',\n black: '#223354',\n white: '#ffffff',\n primaryAlt: '#000C57',\n typography: {\n h1: '#181818',\n h2: '#3f3f3f',\n h3: '#505050',\n h4: '#5e5e5e',\n h5: '#5e5e5e',\n h6: '#5e5e5e'\n },\n sidebar: {\n boxShadow: '2px 0 3px rgba(159, 162, 191, 0.18), 1px 0 1px rgba(159, 162, 191, 0.32)',\n width: '220px',\n transitionInSidebarTimeMS: 200,\n transitionInSidebar: '200ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n transitionAwaySidebarTimeMS: 300,\n transitionAwaySidebar: '300ms cubic-bezier(0.5, 0.15, 0.53, 1) 0ms'\n }\n};\n\nconst colors = {\n gradients: {\n blue1: 'linear-gradient(135deg, #6B73FF 0%, #000DFF 100%)',\n blue2: 'linear-gradient(135deg, #ABDCFF 0%, #0396FF 100%)',\n blue3: 'linear-gradient(127.55deg, #141E30 3.73%, #243B55 92.26%)',\n orange1: 'linear-gradient(135deg, #FCCF31 0%, #F55555 100%)',\n orange2: 'linear-gradient(135deg, #FFD3A5 0%, #FD6585 100%)',\n purple1: 'linear-gradient(135deg, #43CBFF 0%, #9708CC 100%)',\n pink1: 'linear-gradient(135deg, #F6CEEC 0%, #D939CD 100%)',\n pink2: 'linear-gradient(135deg, #F761A1 0%, #8C1BAB 100%)',\n green1: 'linear-gradient(135deg, #FFF720 0%, #3CD500 100%)',\n black1: 'linear-gradient(100.66deg, #434343 6.56%, #000000 93.57%)'\n },\n shadows: {\n success: '0px 1px 4px rgba(68, 214, 0, 0.25), 0px 3px 12px 2px rgba(68, 214, 0, 0.35)',\n error: '0px 1px 4px rgba(255, 25, 67, 0.25), 0px 3px 12px 2px rgba(255, 25, 67, 0.35)',\n info: '0px 1px 4px rgba(51, 194, 255, 0.25), 0px 3px 12px 2px rgba(51, 194, 255, 0.35)',\n primary: '0px 1px 4px rgba(85, 105, 255, 0.25), 0px 3px 12px 2px rgba(85, 105, 255, 0.35)',\n warning: '0px 1px 4px rgba(255, 163, 25, 0.25), 0px 3px 12px 2px rgba(255, 163, 25, 0.35)',\n card: '0px 9px 16px rgba(159, 162, 191, 0.18), 0px 2px 2px rgba(159, 162, 191, 0.32)',\n cardSm: '0px 2px 3px rgba(159, 162, 191, 0.18), 0px 1px 1px rgba(159, 162, 191, 0.32)',\n cardLg: '0 5rem 14rem 0 rgb(255 255 255 / 30%), 0 0.8rem 2.3rem rgb(0 0 0 / 60%), 0 0.2rem 0.3rem rgb(0 0 0 / 45%)'\n },\n layout: {\n general: {\n bodyBg: '#f2f5f9'\n },\n sidebar: {\n background: themeData.white,\n textColor: themeData.secondary,\n dividerBg: '#f2f5f9',\n menuItemColor: '#242E6F',\n menuItemColorActive: themeData.primary,\n menuItemBg: 'transparent',\n menuItemBgActive: '#f2f5f9',\n menuItemIconColor: lighten(themeData.secondary, 0.3),\n menuItemIconColorActive: themeData.primary,\n menuItemHeadingColor: darken(themeData.secondary, 0.3)\n }\n },\n alpha: {\n white: {\n 5: alpha(themeData.white, 0.02),\n 10: alpha(themeData.white, 0.1),\n 30: alpha(themeData.white, 0.3),\n 50: alpha(themeData.white, 0.5),\n 70: alpha(themeData.white, 0.7),\n 100: themeData.white\n },\n trueWhite: {\n 5: alpha(themeData.white, 0.02),\n 10: alpha(themeData.white, 0.1),\n 30: alpha(themeData.white, 0.3),\n 50: alpha(themeData.white, 0.5),\n 70: alpha(themeData.white, 0.7),\n 100: themeData.white\n },\n black: {\n 5: alpha(themeData.black, 0.02),\n 10: alpha(themeData.black, 0.1),\n 30: alpha(themeData.black, 0.3),\n 50: alpha(themeData.black, 0.5),\n 70: alpha(themeData.black, 0.7),\n 100: themeData.black\n }\n },\n secondary: {\n lighter: lighten(themeData.secondary, 0.85),\n light: lighten(themeData.secondary, 0.25),\n main: themeData.secondary,\n dark: darken(themeData.secondary, 0.2)\n },\n primary: {\n lighter: lighten(themeData.primary, 0.85),\n light: lighten(themeData.primary, 0.3),\n main: themeData.primary,\n dark: darken(themeData.primary, 0.2)\n },\n success: {\n lighter: lighten(themeData.success, 0.85),\n light: lighten(themeData.success, 0.3),\n main: themeData.success,\n dark: darken(themeData.success, 0.2)\n },\n warning: {\n lighter: lighten(themeData.warning, 0.85),\n light: lighten(themeData.warning, 0.3),\n main: themeData.warning,\n dark: darken(themeData.warning, 0.2)\n },\n error: {\n lighter: lighten(themeData.error, 0.85),\n light: lighten(themeData.error, 0.3),\n main: themeData.error,\n dark: darken(themeData.error, 0.2)\n },\n info: {\n lighter: lighten(themeData.info, 0.85),\n light: lighten(themeData.info, 0.3),\n main: themeData.info,\n dark: darken(themeData.info, 0.2)\n }\n};\n\nconst {\n palette: { augmentColor }\n} = createTheme();\n\nconst createColor = (mainColor: string, contrastText?: string) => {\n return augmentColor({\n color: { main: mainColor, contrastText }\n });\n};\n\ndeclare module '@mui/material/styles' {\n interface Palette {\n green: Palette['primary'];\n violet: Palette['primary'];\n lightGray: Palette['primary'];\n builderDarkBlue: Palette['primary'];\n payAttGray: Palette['primary'];\n payAttBlack: Palette['primary'];\n payAttPink: Palette['primary'];\n pink: Palette['primary'];\n payAttDarkBlue: Palette['primary'];\n payAttBlue: Palette['primary'];\n payAttBlue2: Palette['primary'];\n payAttLightBlue: Palette['primary'];\n payAttTurquoise: Palette['primary'];\n payAttDarkTurquoise: Palette['primary'];\n payAttPurple: Palette['primary'];\n payAttGreen: Palette['primary'];\n payAttGreen2: Palette['primary'];\n backgroundPrimary: Palette['primary'];\n infoButtonColor: Palette['primary'];\n iconLightBulb: Palette['primary'];\n iconCategory: Palette['primary'];\n iconCategorySecondary: Palette['primary'];\n toggleButtonColorSelected: Palette['primary'];\n toggleButtonBackgroundColorSelected: Palette['primary'];\n }\n\n interface PaletteOptions {\n green?: PaletteOptions['primary'];\n violet?: PaletteOptions['primary'];\n lightGray?: PaletteOptions['primary'];\n builderDarkBlue?: PaletteOptions['primary'];\n payAttGray?: PaletteOptions['primary'];\n payAttBlack?: PaletteOptions['primary'];\n payAttPink?: PaletteOptions['primary'];\n pink?: PaletteOptions['primary'];\n payAttDarkBlue?: PaletteOptions['primary'];\n payAttBlue?: PaletteOptions['primary'];\n payAttBlue2?: PaletteOptions['primary'];\n payAttLightBlue?: PaletteOptions['primary'];\n payAttTurquoise?: PaletteOptions['primary'];\n payAttDarkTurquoise?: PaletteOptions['primary'];\n payAttPurple?: PaletteOptions['primary'];\n payAttGreen?: PaletteOptions['primary'];\n payAttGreen2?: PaletteOptions['primary'];\n backgroundPrimary?: PaletteOptions['primary'];\n infoButtonColor?: PaletteOptions['primary'];\n iconLightBulb?: PaletteOptions['primary'];\n iconCategory?: PaletteOptions['primary'];\n iconCategorySecondary?: PaletteOptions['primary'];\n toggleButtonColorSelected?: Palette['primary'];\n toggleButtonBackgroundColorSelected?: Palette['primary'];\n }\n\n interface Theme {\n bannerHeight: number;\n mainContentArea?: {\n marginLeft?: string;\n marginTop?: string;\n marginRight?: string;\n marginBottom?: string;\n };\n }\n // fix the type error when calling `createTheme()` with a custom theme option\n interface ThemeOptions {\n bannerHeight: number;\n mainContentArea?: {\n marginLeft?: string;\n marginTop?: string;\n marginRight?: string;\n marginBottom?: string;\n };\n }\n\n interface TypographyVariants {\n poppinsBody: React.CSSProperties;\n }\n\n interface TypographyVariantsOptions {\n poppinsBody?: React.CSSProperties;\n }\n}\n\ndeclare module '@mui/material/Typography' {\n interface TypographyPropsVariantOverrides {\n poppinsBody: true;\n }\n}\n\ndeclare module '@mui/material/Button' {\n interface ButtonPropsColorOverrides {\n green: true;\n violet: true;\n lightGray: true;\n builderDarkBlue: true;\n payAttGray: true;\n payAttBlack: true;\n payAttPink: true;\n pink: true;\n payAttDarkBlue: true;\n payAttBlue: true;\n payAttBlue2: true;\n payAttLightBlue: true;\n payAttTurquoise: true;\n payAttDarkTurquoise: true;\n payAttPurple: true;\n payAttGreen: true;\n payAttGreen2: true;\n backgroundPrimary: true;\n infoButtonColor: true;\n iconLightBulb: true;\n iconCategory: true;\n iconCategorySecondary: true;\n toggleButtonColorSelected: true;\n toggleButtonBackgroundColorSelected: true;\n }\n}\n\ndeclare module '@mui/material/ButtonGroup' {\n interface ButtonGroupPropsColorOverrides {\n green: true;\n violet: true;\n lightGray: true;\n builderDarkBlue: true;\n payAttGray: true;\n payAttBlack: true;\n payAttPink: true;\n pink: true;\n payAttDarkBlue: true;\n payAttBlue: true;\n payAttBlue2: true;\n payAttLightBlue: true;\n payAttTurquoise: true;\n payAttDarkTurquoise: true;\n payAttPurple: true;\n payAttGreen: true;\n payAttGreen2: true;\n backgroundPrimary: true;\n infoButtonColor: true;\n iconLightBulb: true;\n iconCategory: true;\n iconCategorySecondary: true;\n toggleButtonColorSelected: true;\n toggleButtonBackgroundColorSelected: true;\n }\n}\n\ndeclare module '@mui/material/Radio' {\n interface RadioPropsColorOverrides {\n green: true;\n violet: true;\n lightGray: true;\n builderDarkBlue: true;\n payAttGray: true;\n payAttBlack: true;\n payAttPink: true;\n pink: true;\n payAttDarkBlue: true;\n payAttBlue: true;\n payAttBlue2: true;\n payAttLightBlue: true;\n payAttTurquoise: true;\n payAttDarkTurquoise: true;\n payAttPurple: true;\n payAttGreen: true;\n payAttGreen2: true;\n backgroundPrimary: true;\n infoButtonColor: true;\n iconLightBulb: true;\n iconCategory: true;\n iconCategorySecondary: true;\n toggleButtonColorSelected: true;\n toggleButtonBackgroundColorSelected: true;\n }\n}\n\ndeclare module '@mui/material/TextField' {\n interface TextFieldPropsColorOverrides {\n green: true;\n violet: true;\n lightGray: true;\n builderDarkBlue: true;\n payAttGray: true;\n payAttBlack: true;\n payAttPink: true;\n pink: true;\n payAttDarkBlue: true;\n payAttBlue: true;\n payAttBlue2: true;\n payAttLightBlue: true;\n payAttTurquoise: true;\n payAttDarkTurquoise: true;\n payAttPurple: true;\n payAttGreen: true;\n payAttGreen2: true;\n backgroundPrimary: true;\n infoButtonColor: true;\n iconLightBulb: true;\n iconCategory: true;\n iconCategorySecondary: true;\n toggleButtonColorSelected: true;\n toggleButtonBackgroundColorSelected: true;\n }\n}\n\nexport const PureLightTheme = createTheme({\n // direction: i18n.dir(),\n mainContentArea: {\n marginLeft: sassVariables.contentMarginLeft,\n marginTop: sassVariables.contentMarginTop,\n marginRight: sassVariables.contentMarginRight,\n marginBottom: sassVariables.contentMarginBottom\n },\n bannerHeight: parseInt(sassVariables.menuHeaderBannerHeight, 10),\n colors: {\n gradients: {\n blue1: colors.gradients.blue1,\n blue2: colors.gradients.blue2,\n blue3: colors.gradients.blue3,\n orange1: colors.gradients.orange1,\n orange2: colors.gradients.orange2,\n purple1: colors.gradients.purple1,\n pink1: colors.gradients.pink1,\n pink2: colors.gradients.pink2,\n green1: colors.gradients.green1,\n black1: colors.gradients.black1\n },\n shadows: {\n success: colors.shadows.success,\n error: colors.shadows.error,\n primary: colors.shadows.primary,\n warning: colors.shadows.warning\n },\n alpha: {\n white: {\n 5: alpha(themeData.white, 0.02),\n 10: alpha(themeData.white, 0.1),\n 30: alpha(themeData.white, 0.3),\n 50: alpha(themeData.white, 0.5),\n 70: alpha(themeData.white, 0.7),\n 100: themeData.white\n },\n trueWhite: {\n 5: alpha(themeData.white, 0.02),\n 10: alpha(themeData.white, 0.1),\n 30: alpha(themeData.white, 0.3),\n 50: alpha(themeData.white, 0.5),\n 70: alpha(themeData.white, 0.7),\n 100: themeData.white\n },\n black: {\n 5: alpha(themeData.black, 0.02),\n 10: alpha(themeData.black, 0.1),\n 30: alpha(themeData.black, 0.3),\n 50: alpha(themeData.black, 0.5),\n 70: alpha(themeData.black, 0.7),\n 100: themeData.black\n }\n },\n secondary: {\n lighter: alpha(themeData.secondary, 0.1),\n light: lighten(themeData.secondary, 0.3),\n main: themeData.secondary,\n dark: darken(themeData.secondary, 0.2)\n },\n primary: {\n lighter: alpha(themeData.primary, 0.1),\n light: lighten(themeData.primary, 0.3),\n main: themeData.primary,\n dark: darken(themeData.primary, 0.2)\n },\n success: {\n lighter: alpha(themeData.success, 0.1),\n light: lighten(themeData.success, 0.3),\n main: themeData.success,\n dark: darken(themeData.success, 0.2)\n },\n warning: {\n lighter: alpha(themeData.warning, 0.1),\n light: lighten(themeData.warning, 0.3),\n main: themeData.warning,\n dark: darken(themeData.warning, 0.2)\n },\n error: {\n lighter: alpha(themeData.error, 0.1),\n light: lighten(themeData.error, 0.3),\n main: themeData.error,\n dark: darken(themeData.error, 0.2)\n },\n info: {\n lighter: alpha(themeData.info, 0.1),\n light: lighten(themeData.info, 0.3),\n main: themeData.info,\n dark: darken(themeData.info, 0.2)\n }\n },\n\n general: {\n reactFrameworkColor: '#00D8FF',\n borderRadiusSm: '4px',\n borderRadius: '6px',\n borderRadiusLg: '10px',\n borderRadiusXl: '18px'\n },\n sidebar: {\n background: colors.layout.sidebar.background,\n textColor: colors.layout.sidebar.textColor,\n dividerBg: colors.layout.sidebar.dividerBg,\n menuItemColor: colors.layout.sidebar.menuItemColor,\n menuItemColorActive: colors.layout.sidebar.menuItemColorActive,\n menuItemBg: colors.layout.sidebar.menuItemBg,\n menuItemBgActive: colors.layout.sidebar.menuItemBgActive,\n menuItemIconColor: colors.layout.sidebar.menuItemIconColor,\n menuItemIconColorActive: colors.layout.sidebar.menuItemIconColorActive,\n menuItemHeadingColor: colors.layout.sidebar.menuItemHeadingColor,\n boxShadow: themeData.sidebar.boxShadow,\n width: themeData.sidebar.width,\n transitionInSidebarTimeMS: themeData.sidebar.transitionInSidebarTimeMS,\n transitionInSidebar: themeData.sidebar.transitionInSidebar,\n transitionAwaySidebarTimeMS: themeData.sidebar.transitionAwaySidebarTimeMS,\n transitionAwaySidebar: themeData.sidebar.transitionAwaySidebar\n },\n header: {\n height: '65px',\n background: colors.alpha.white[100],\n boxShadow: colors.shadows.cardSm,\n textColor: colors.secondary.main\n },\n spacing: 8,\n palette: {\n pink: createColor('#f87171', '#fff'),\n green: createColor('#008000'),\n violet: createColor('#BC00A3'),\n lightGray: createColor('#e1e1e1'),\n builderDarkBlue: createColor('rgba(68, 83, 106, 1)', '#fff'),\n payAttGray: createColor(sassVariables.payAttGray),\n payAttBlack: createColor(sassVariables.payAttBlack),\n payAttPink: createColor(sassVariables.payAttPink),\n payAttDarkBlue: createColor(sassVariables.payAttDarkBlue),\n payAttBlue: createColor(sassVariables.payAttBlue, '#fff'),\n payAttBlue2: createColor(sassVariables.payAttBlue2),\n payAttLightBlue: createColor(sassVariables.payAttLightBlue),\n payAttTurquoise: createColor(sassVariables.payAttTurquoise),\n payAttDarkTurquoise: createColor(sassVariables.payAttDarkTurquoise, '#fff'),\n payAttPurple: createColor(sassVariables.payAttPurple),\n payAttGreen: createColor(sassVariables.payAttGreen),\n payAttGreen2: createColor(sassVariables.payAttGreen, '#fff'),\n backgroundPrimary: createColor(sassVariables.backgroundPrimary),\n infoButtonColor: createColor(sassVariables.infoButtonColor),\n iconLightBulb: createColor(sassVariables.iconLightBulb),\n iconCategory: createColor(sassVariables.iconCategory),\n iconCategorySecondary: createColor(sassVariables.iconCategorySecondary),\n toggleButtonColorSelected: createColor(sassVariables.toggleButtonColorSelected),\n toggleButtonBackgroundColorSelected: createColor(sassVariables.toggleButtonBackgroundColorSelected),\n\n common: {\n black: colors.alpha.black[100],\n white: colors.alpha.white[100]\n },\n mode: 'light',\n primary: {\n light: colors.primary.light,\n main: colors.primary.main,\n dark: colors.primary.dark\n },\n secondary: {\n light: colors.secondary.light,\n main: colors.secondary.main,\n dark: colors.secondary.dark\n },\n error: {\n light: colors.error.light,\n main: colors.error.main,\n dark: colors.error.dark,\n contrastText: colors.alpha.white[100]\n },\n success: {\n light: colors.success.light,\n main: colors.success.main,\n dark: colors.success.dark,\n contrastText: colors.alpha.white[100]\n },\n info: {\n light: colors.info.light,\n main: colors.info.main,\n dark: colors.info.dark,\n contrastText: colors.alpha.white[100]\n },\n warning: {\n light: colors.warning.light,\n main: colors.warning.main,\n dark: colors.warning.dark,\n contrastText: colors.alpha.white[100]\n },\n grey: {\n 50: '#FBFBFB',\n 100: '#F3F5F6',\n 200: '#E8EAED',\n 300: '#DCE0E5',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n A100: '#d5d5d5',\n A200: '#aaaaaa',\n A400: '#303030',\n A700: '#616161'\n },\n text: {\n primary: colors.alpha.black[100],\n secondary: colors.alpha.black[70],\n disabled: colors.alpha.black[50]\n },\n background: {\n paper: colors.alpha.white[100],\n default: colors.layout.general.bodyBg\n },\n action: {\n active: colors.alpha.black[100],\n hover: colors.primary.lighter,\n hoverOpacity: 0.1,\n selected: colors.alpha.black[10],\n selectedOpacity: 0.1,\n disabled: colors.alpha.black[50],\n disabledBackground: colors.alpha.black[5],\n disabledOpacity: 0.38,\n focus: colors.alpha.black[10],\n focusOpacity: 0.05,\n activatedOpacity: 0.12\n },\n tonalOffset: 0.5\n },\n breakpoints: {\n values: {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1840\n }\n },\n components: {\n MuiUseMediaQuery: {\n defaultProps: {\n noSsr: true\n }\n },\n MuiBackdrop: {\n styleOverrides: {\n root: {\n backgroundColor: alpha(darken(themeData.primaryAlt, 0.4), 0.2),\n backdropFilter: 'blur(2px)',\n\n '&.MuiBackdrop-invisible': {\n backgroundColor: 'transparent',\n backdropFilter: 'blur(2px)'\n }\n }\n }\n },\n MuiFormHelperText: {\n styleOverrides: {\n root: {\n textTransform: 'none',\n marginLeft: 8,\n marginRight: 8,\n fontWeight: 'bold'\n }\n }\n },\n MuiCssBaseline: {\n styleOverrides: {\n 'html, body, .App, #root': {\n width: '100%',\n height: '100%',\n fontSize: '14px',\n fontFamily: themeFontFamily\n },\n '#nprogress .bar': {\n background: colors.primary.main\n },\n '#nprogress .spinner-icon': {\n borderTopColor: colors.primary.main,\n borderLeftColor: colors.primary.main\n },\n '#nprogress .peg': {\n boxShadow: `0 0 10px ${colors.primary.main}, 0 0 5px${colors.primary.main}`\n },\n ':root': {\n '--swiper-theme-color': colors.primary.main\n },\n code: {\n background: colors.info.lighter,\n color: colors.info.dark,\n borderRadius: 4,\n padding: 4\n },\n '@keyframes ripple': {\n '0%': {\n transform: 'scale(.8)',\n opacity: 1\n },\n '100%': {\n transform: 'scale(2.8)',\n opacity: 0\n }\n },\n '@keyframes float': {\n '0%': {\n transform: 'translate(0%, 0%)'\n },\n '100%': {\n transform: 'translate(3%, 3%)'\n }\n }\n }\n },\n MuiSelect: {\n styleOverrides: {\n iconOutlined: {\n color: colors.alpha.black[50]\n },\n icon: {\n top: 'calc(50% - 14px)'\n }\n }\n },\n MuiOutlinedInput: {\n styleOverrides: {\n root: {\n '& .MuiInputAdornment-positionEnd.MuiInputAdornment-outlined': {\n paddingRight: 6\n },\n '&:hover .MuiOutlinedInput-notchedOutline': {\n borderColor: colors.alpha.black[50]\n },\n '&.Mui-focused:hover .MuiOutlinedInput-notchedOutline': {\n borderColor: colors.primary.main\n }\n }\n }\n },\n MuiListSubheader: {\n styleOverrides: {\n colorPrimary: {\n fontWeight: 'bold',\n lineHeight: '40px',\n fontSize: 13,\n background: colors.alpha.black[5],\n color: colors.alpha.black[70]\n }\n }\n },\n MuiCardHeader: {\n styleOverrides: {\n action: {\n marginTop: -5,\n marginBottom: -5\n },\n title: {\n fontSize: 15\n }\n }\n },\n MuiRadio: {\n styleOverrides: {\n root: {\n borderRadius: '50px'\n }\n }\n },\n MuiChip: {\n styleOverrides: {\n colorSecondary: {\n background: colors.alpha.black[5],\n color: colors.alpha.black[100],\n\n '&:hover': {\n background: colors.alpha.black[10]\n }\n },\n deleteIcon: {\n color: colors.error.light,\n\n '&:hover': {\n color: colors.error.main\n }\n }\n }\n },\n MuiAccordion: {\n styleOverrides: {\n root: {\n boxShadow: 'none',\n\n '&.Mui-expanded': {\n margin: 0\n },\n '&::before': {\n display: 'none'\n }\n }\n }\n },\n MuiAvatar: {\n styleOverrides: {\n root: {\n fontSize: 14,\n fontWeight: 'bold'\n },\n colorDefault: {\n background: colors.alpha.black[30],\n color: colors.alpha.white[100]\n }\n }\n },\n MuiAvatarGroup: {\n styleOverrides: {\n root: {\n alignItems: 'center'\n },\n avatar: {\n background: colors.alpha.black[10],\n fontSize: 13,\n color: colors.alpha.black[70],\n fontWeight: 'bold',\n\n '&:first-of-type': {\n border: 0,\n background: 'transparent'\n }\n }\n }\n },\n MuiListItemAvatar: {\n styleOverrides: {\n alignItemsFlexStart: {\n marginTop: 0\n }\n }\n },\n MuiPaginationItem: {\n styleOverrides: {\n page: {\n fontSize: 13,\n fontWeight: 'bold',\n transition: 'all .2s'\n },\n textPrimary: {\n '&.Mui-selected': {\n boxShadow: colors.shadows.primary\n },\n '&.MuiButtonBase-root:hover': {\n background: colors.alpha.black[5]\n },\n '&.Mui-selected.MuiButtonBase-root:hover': {\n background: colors.primary.main\n }\n }\n }\n },\n MuiButton: {\n defaultProps: {\n disableRipple: true\n },\n styleOverrides: {\n root: {\n fontWeight: 'bold',\n textTransform: 'none',\n paddingLeft: 16,\n paddingRight: 16,\n\n '.MuiSvgIcon-root': {\n transition: 'all .2s'\n }\n },\n endIcon: {\n marginRight: -8\n },\n containedSecondary: {\n backgroundColor: colors.secondary.main,\n color: colors.alpha.white[100],\n border: `1px solid ${colors.alpha.black[30]}`\n },\n outlinedSecondary: {\n backgroundColor: colors.alpha.white[100],\n\n '&:hover, &.MuiSelected': {\n backgroundColor: colors.alpha.black[5],\n color: colors.alpha.black[100]\n }\n }\n }\n },\n MuiButtonBase: {\n defaultProps: {\n disableRipple: false\n },\n styleOverrides: {\n root: {\n borderRadius: 6\n }\n }\n },\n MuiToggleButton: {\n defaultProps: {\n disableRipple: true\n },\n styleOverrides: {\n root: {\n color: colors.primary.main,\n background: colors.alpha.white[100],\n transition: 'all .2s',\n\n '&:hover, &.Mui-selected, &.Mui-selected:hover': {\n color: colors.alpha.white[100],\n background: colors.primary.main\n }\n }\n }\n },\n MuiIconButton: {\n styleOverrides: {\n root: {\n borderRadius: 6,\n\n '& .MuiTouchRipple-root': {\n borderRadius: 6\n }\n },\n sizeSmall: {\n padding: 4\n }\n }\n },\n MuiListItemText: {\n styleOverrides: {\n root: {\n margin: 0\n }\n }\n },\n\n MuiDivider: {\n styleOverrides: {\n root: {\n background: colors.alpha.black[10],\n border: 0,\n height: 1\n },\n vertical: {\n height: 'auto',\n width: 1,\n\n '&.MuiDivider-flexItem.MuiDivider-fullWidth': {\n height: 'auto'\n },\n '&.MuiDivider-absolute.MuiDivider-fullWidth': {\n height: '100%'\n }\n },\n withChildren: {\n '&:before, &:after': {\n border: 0\n }\n },\n wrapper: {\n background: colors.alpha.white[100],\n fontWeight: 'bold',\n height: 24,\n lineHeight: '24px',\n marginTop: -12,\n color: 'inherit',\n textTransform: 'uppercase'\n }\n }\n },\n MuiPaper: {\n styleOverrides: {\n root: {\n padding: 0\n },\n elevation0: {\n boxShadow: 'none'\n },\n elevation: {\n boxShadow: colors.shadows.card\n },\n elevation2: {\n boxShadow: colors.shadows.cardSm\n },\n elevation24: {\n boxShadow: colors.shadows.cardLg\n }\n }\n },\n MuiLinearProgress: {\n styleOverrides: {\n root: {\n borderRadius: 6,\n height: 6\n }\n }\n },\n MuiSlider: {\n styleOverrides: {\n root: {\n '& .MuiSlider-valueLabelCircle, .MuiSlider-valueLabelLabel': {\n transform: 'none'\n },\n '& .MuiSlider-valueLabel': {\n borderRadius: 6,\n background: colors.alpha.black[100],\n color: colors.alpha.white[100]\n }\n }\n }\n },\n MuiList: {\n styleOverrides: {\n root: {\n padding: 0,\n\n '& .MuiListItem-button': {\n transition: 'all .2s',\n\n '& > .MuiSvgIcon-root': {\n minWidth: 34\n },\n\n '& .MuiTouchRipple-root': {\n opacity: 0.2\n }\n },\n '& .MuiListItem-root.MuiButtonBase-root.Mui-selected': {\n backgroundColor: colors.alpha.black[10]\n }\n },\n padding: {\n padding: '12px',\n\n '& .MuiListItem-button': {\n borderRadius: 6,\n margin: '1px 0'\n }\n }\n }\n },\n MuiTabs: {\n styleOverrides: {\n root: {\n height: 38,\n minHeight: 38,\n overflow: 'visible'\n },\n indicator: {\n height: 38,\n minHeight: 38,\n borderRadius: 6,\n border: `1px solid ${colors.primary.dark}`\n },\n scrollableX: {\n overflow: 'visible !important'\n }\n }\n },\n MuiTab: {\n styleOverrides: {\n root: {\n padding: 0,\n height: 38,\n minHeight: 38,\n borderRadius: 6,\n transition: 'color .2s',\n textTransform: 'capitalize',\n\n '&.MuiButtonBase-root': {\n minWidth: 'auto',\n paddingLeft: 20,\n paddingRight: 20,\n marginRight: 4\n },\n '&.Mui-selected, &.Mui-selected:hover': {\n color: colors.alpha.white[100],\n zIndex: 5\n },\n '&:hover': {\n color: colors.alpha.black[100]\n }\n }\n }\n },\n MuiMenu: {\n styleOverrides: {\n paper: {\n padding: 12\n },\n list: {\n padding: 12,\n\n '& .MuiMenuItem-root.MuiButtonBase-root': {\n fontSize: 14,\n marginTop: 1,\n marginBottom: 1,\n transition: 'all .2s',\n color: colors.alpha.black[70],\n\n '& .MuiTouchRipple-root': {\n opacity: 0.2\n },\n\n '&:hover, &:active, &.active, &.Mui-selected': {\n color: colors.alpha.black[100],\n background: lighten(colors.primary.lighter, 0.5)\n }\n }\n }\n }\n },\n MuiListItem: {\n styleOverrides: {\n root: {\n '&.MuiButtonBase-root': {\n color: colors.secondary.main,\n\n '&:hover, &:active, &.active, &.Mui-selected': {\n color: colors.alpha.black[100],\n background: lighten(colors.primary.lighter, 0.5)\n }\n }\n }\n }\n },\n MuiAutocomplete: {\n styleOverrides: {\n tag: {\n margin: 1\n },\n root: {\n '.MuiAutocomplete-inputRoot.MuiOutlinedInput-root .MuiAutocomplete-endAdornment': {\n right: 14\n }\n },\n clearIndicator: {\n background: colors.error.lighter,\n color: colors.error.main,\n marginRight: 8,\n\n '&:hover': {\n background: colors.error.lighter,\n color: colors.error.dark\n }\n },\n popupIndicator: {\n color: colors.alpha.black[50],\n\n '&:hover': {\n background: colors.primary.lighter,\n color: colors.primary.main\n }\n }\n }\n },\n MuiTablePagination: {\n styleOverrides: {\n toolbar: {\n '& .MuiIconButton-root': {\n padding: 8\n }\n },\n select: {\n '&:focus': {\n backgroundColor: 'transparent'\n }\n }\n }\n },\n MuiToolbar: {\n styleOverrides: {\n root: {\n minHeight: '0 !important',\n padding: '0 !important'\n }\n }\n },\n MuiTableRow: {\n styleOverrides: {\n head: {\n background: colors.alpha.black[5]\n },\n root: {\n transition: 'background-color .2s',\n\n '&.MuiTableRow-hover:hover': {\n backgroundColor: lighten(colors.alpha.black[5], 0.5)\n }\n }\n }\n },\n MuiTableCell: {\n styleOverrides: {\n root: {\n borderBottomColor: colors.alpha.black[10],\n fontSize: 14\n },\n head: {\n textTransform: 'uppercase',\n fontSize: 13,\n fontWeight: 'bold',\n color: colors.alpha.black[70]\n }\n }\n },\n MuiAlert: {\n styleOverrides: {\n message: {\n lineHeight: 1.5,\n fontSize: 14\n },\n standardInfo: {\n color: colors.info.main\n },\n action: {\n color: colors.alpha.black[70]\n }\n }\n },\n MuiTimelineDot: {\n styleOverrides: {\n root: {\n margin: 0,\n zIndex: 5,\n position: 'absolute',\n top: '50%',\n marginTop: -6,\n left: -6\n },\n outlined: {\n backgroundColor: colors.alpha.white[100],\n boxShadow: `0 0 0 6px ${colors.alpha.white[100]}`\n },\n outlinedPrimary: {\n backgroundColor: colors.alpha.white[100],\n boxShadow: `0 0 0 6px ${colors.alpha.white[100]}`\n }\n }\n },\n MuiTimelineConnector: {\n styleOverrides: {\n root: {\n position: 'absolute',\n height: '100%',\n top: 0,\n borderRadius: 50,\n backgroundColor: colors.alpha.black[10]\n }\n }\n },\n MuiTimelineItem: {\n styleOverrides: {\n root: {\n minHeight: 0,\n padding: '8px 0',\n\n '&:before': {\n display: 'none'\n }\n },\n missingOppositeContent: {\n '&:before': {\n display: 'none'\n }\n }\n }\n },\n MuiTooltip: {\n styleOverrides: {\n tooltip: {\n backgroundColor: alpha(colors.alpha.black['100'], 0.95),\n padding: '8px 16px',\n fontSize: 13\n },\n arrow: {\n color: alpha(colors.alpha.black['100'], 0.95)\n }\n }\n },\n MuiSwitch: {\n styleOverrides: {\n root: {\n height: 33,\n overflow: 'visible',\n\n '& .MuiButtonBase-root': {\n position: 'absolute',\n padding: 6,\n transition:\n 'left 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms'\n },\n '& .MuiIconButton-root': {\n borderRadius: 100\n },\n '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': {\n opacity: 0.3\n }\n },\n thumb: {\n backgroundColor: colors.alpha.white[100],\n border: `1px solid ${colors.alpha.black[30]}`,\n boxShadow: `0px 9px 14px ${colors.alpha.black[10]}, 0px 2px 2px ${colors.alpha.black[10]}`\n },\n track: {\n backgroundColor: colors.alpha.black[5],\n border: `1px solid ${colors.alpha.black[10]}`,\n boxShadow: `inset 0px 1px 1px ${colors.alpha.black[10]}`,\n opacity: 1\n },\n colorPrimary: {\n '& .MuiSwitch-thumb': {\n backgroundColor: colors.alpha.white[100]\n },\n\n '&.Mui-checked .MuiSwitch-thumb': {\n backgroundColor: colors.primary.main\n }\n }\n }\n },\n MuiStepper: {\n styleOverrides: {\n root: {\n paddingTop: 20,\n paddingBottom: 20,\n background: colors.alpha.black[5]\n }\n }\n },\n MuiStepIcon: {\n styleOverrides: {\n root: {\n '&.MuiStepIcon-completed': {\n color: colors.success.main\n }\n }\n }\n },\n MuiTypography: {\n defaultProps: {\n variantMapping: {\n h1: 'h1',\n h2: 'h2',\n h3: 'div',\n h4: 'div',\n h5: 'div',\n h6: 'div',\n subtitle1: 'div',\n subtitle2: 'div',\n body1: 'div',\n body2: 'div',\n poppinsBody: 'div'\n }\n },\n styleOverrides: {\n gutterBottom: {\n marginBottom: 4\n },\n paragraph: {\n fontSize: 17,\n lineHeight: 1.7\n }\n }\n }\n },\n shape: {\n borderRadius: 6\n },\n typography: {\n fontFamily: themeFontFamily,\n fontSize: 14,\n htmlFontSize: 15,\n h1: {\n fontWeight: 700,\n fontSize: 30,\n color: themeData.typography.h1\n },\n h2: {\n fontWeight: 700,\n fontSize: 25,\n color: themeData.typography.h2\n },\n h3: {\n fontWeight: 700,\n fontSize: 21,\n lineHeight: 1.4,\n color: themeData.typography.h3\n },\n h4: {\n fontWeight: 700,\n fontSize: 16,\n color: themeData.typography.h4\n },\n h5: {\n fontWeight: 700,\n fontSize: 14,\n color: themeData.typography.h5\n },\n h6: {\n fontSize: 15,\n color: themeData.typography.h6\n },\n body1: {\n fontSize: 14,\n color: colors.alpha.black[100]\n },\n body2: {\n fontSize: 14,\n color: colors.alpha.black[100]\n },\n button: {\n fontSize: 14,\n fontWeight: 700\n },\n caption: {\n fontSize: 13,\n textTransform: 'uppercase',\n color: colors.alpha.black[50]\n },\n subtitle1: {\n fontSize: 14,\n lineHeight: 1.4,\n color: colors.alpha.black[70]\n },\n subtitle2: {\n fontWeight: 400,\n lineHeight: 1.4,\n fontSize: 15,\n color: colors.alpha.black[70]\n },\n overline: {\n fontSize: 13,\n fontWeight: 700,\n textTransform: 'uppercase'\n },\n poppinsBody: {\n fontSize: 14,\n fontFamily: 'Poppins'\n }\n },\n shadows: [\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none',\n 'none'\n ]\n});\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { AuthTokens } from 'store/features/auth/handlers';\n\nconst API_ENDPOINT = `${BASE_URL}/get_token_portal`;\n\nexport const authLogin = async (username: string, password: string, skipContractCheck = false): Promise => {\n const params: { password: string; email?: string; username?: string } = {\n password\n };\n\n if (username.includes('@')) {\n params.email = username;\n } else {\n params.username = username;\n }\n\n try {\n const response = await axios.post(API_ENDPOINT, params, {\n headers: { 'Content-Type': 'application/json' }\n });\n\n if (\n !skipContractCheck &&\n response.data &&\n response.data.contract &&\n response.data.contract.signed === false &&\n response.status === 200\n ) {\n return {\n token: response.data.token,\n chartToken: response.data.chartToken,\n contract: response.data.contract\n };\n }\n\n if (response.data && response.data.token && response.status === 200) {\n return {\n token: response.data.token,\n chartToken: response.data.chartToken\n };\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (err) {\n throw handleAxiosError(err);\n }\n};\n\nexport const endUserSession = async () => {\n try {\n await axios.get(`${BASE_URL}/logout`);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport {\n CampaignHistoryObjectInterface,\n CampaignHistoryPerVenueInterface\n} from 'store/features/campaigns/handlers/handlerCampaignHistory';\n\nconst API_ENDPOINT = `${BASE_URL}/sms-campaign`;\n\nconst extractVenueHistory = (raw: any): CampaignHistoryObjectInterface[] => {\n const data: CampaignHistoryObjectInterface[] = [];\n\n raw.forEach((venue: any) => {\n data.push({\n smsSenderName: venue.smsSenderName,\n messageText: venue.messageText,\n newCustomers: venue.newCustomers,\n recipients: venue.recipients,\n senderUsername: venue.senderUsername,\n timestamp: venue.createdAt,\n venueId: venue.venueId\n });\n });\n\n return data;\n};\n\nconst extractCampaignHistoryFromResponse = (raw: any) => {\n const data: CampaignHistoryPerVenueInterface = {};\n Object.keys(raw).forEach((venueId: string) => {\n data[venueId] = extractVenueHistory(raw[venueId]);\n });\n return data;\n};\n\nexport const getCampaignHistory = async (): Promise => {\n try {\n const response = await axios.get(API_ENDPOINT);\n if (response.data && response.status >= 200 && response.status < 300) {\n return extractCampaignHistoryFromResponse(response.data);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const UrlShortenerAPI = async (originalUrl: string): Promise => {\n try {\n const response = await axios.post(`${BASE_URL}/url-shortener`, { originalUrl });\n\n if (response.status >= 200 && response.status < 300) {\n return response.data.shortUrl;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { DashboardBreakpoint } from 'views/Dashboard/Interfaces/Dashboard.breakpoints';\nimport { DashboardItemLayout } from 'views/Dashboard/Interfaces/Dashboard.layout';\n\nexport type DashboardItemLayoutRaw = Omit & { filter?: string };\n\nexport type DashboardDocsRaw = {\n _id: string;\n name: string;\n layout: DashboardItemLayoutRaw[];\n default?: boolean;\n breakpoint: DashboardBreakpoint;\n}[];\n\nexport const MIN_LENGTH_DASHBOARD_NAME = 3;\nexport const MAX_LENGTH_DASHBOARD_NAME = 15;\nexport const MAX_NUMBER_OF_DASHBOARDS = 10;\nexport const MAX_NUMBER_OF_WIDGETS_PER_DASHBOARD = 20;\n\nexport const DASHBOARD_WHILE_TYPING_REG_EXP = new RegExp(\n `^[\\\\s+\\\\-_.&a-zA-Z0-9åäöÅÄÖ]{0,${MAX_LENGTH_DASHBOARD_NAME}}$`\n);\nexport const DASHBOARD_VALID_NAME_REG_EXP = new RegExp(\n `^[\\\\s+\\\\-_.&a-zA-Z0-9åäöÅÄÖ]{${MIN_LENGTH_DASHBOARD_NAME},${MAX_LENGTH_DASHBOARD_NAME}}$`\n);\n","import axios from 'axios';\n\nimport imageCompression from 'browser-image-compression';\n\nimport { handleAxiosError } from 'errorHandling/handleResponse';\nimport { EndTime, FilterTimeIntervals, StartTime } from 'views/IntelliSms/helpers/interfaces';\n\nimport { GeneratePresignedURL, UploadImageToAWS } from './interfaces';\n\nexport const BASE_URL = process.env.REACT_APP_PAYATT_API?.toLowerCase() || 'http://localhost:3005/api/v1';\n\nexport const generatePresignedPOSTURL = async ({ fileName, fileType }: GeneratePresignedURL) => {\n const body = { fileName, fileType };\n\n try {\n return axios.post<{\n data: { url: string; fields: { [key: string]: string } };\n }>(`${BASE_URL}/aws/generate-post-url-stamp-card`, body);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const uploadImageToAWS = async ({ url, form }: UploadImageToAWS) => {\n try {\n return axios.post(url, form);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const createFileFromString = async (file: string) => {\n const fileBlob = await (await fetch(file)).blob();\n\n return new File([fileBlob], 'file.png', { type: fileBlob.type });\n};\n\nexport const compressImage = (file: File) => {\n const options = {\n maxSizeMB: 2,\n maxWidthOrHeight: 1920,\n useWebWorker: true\n };\n\n return imageCompression(file, options);\n};\n\n//\nexport const adjustTimeForTimezoneOffset = ({\n startTime,\n endTime,\n fromUtc = false\n}: {\n startTime: StartTime;\n endTime: EndTime;\n fromUtc?: boolean;\n}): FilterTimeIntervals => {\n let offset = new Date().getTimezoneOffset() / 60;\n if (fromUtc) offset *= -1;\n\n if (offset === 0) return { startTime, endTime };\n\n let startHour = 0;\n let startMinute = 0;\n let endHour = 0;\n let endMinute = 0;\n try {\n startHour = parseInt(startTime.hour, 10);\n startMinute = parseInt(startTime.min, 10);\n endHour = parseInt(endTime.hour, 10);\n endMinute = parseInt(endTime.min, 10);\n } catch (error) {\n console.error('Failed to parse startTime or endTime', error);\n throw new Error('Failed to parse startTime or endTime');\n }\n\n if (Number.isNaN(startHour)) throw new Error('Invalid start hour');\n if (Number.isNaN(startMinute)) throw new Error('Invalid start minute');\n if (Number.isNaN(endHour)) throw new Error('Invalid end hour');\n if (Number.isNaN(endMinute)) throw new Error('Invalid end minute');\n\n const adjustOffset = (time: number) => {\n const newTime = time + offset;\n if (newTime < 0) return 24 + newTime;\n if (newTime > 23) return newTime - 24;\n return newTime;\n };\n\n return {\n startTime: { hour: `${adjustOffset(startHour)}`, min: startTime.min },\n endTime: { hour: `${adjustOffset(endHour)}`, min: endTime.min }\n };\n};\n","/* eslint-disable max-len */\nimport { VenueCategories } from 'store/features/venueCategories/handlers';\n\n/**\n * ADD NEW STAMP CARD TO WEBSITE\n *\n * 1. Create the stamp card in the PayAtt Website merchant. The stamp card MUST:\n * - Have a venue with the same name\n * - Have a display view collection with the same name as the venue category\n *\n * 2. Copy the JSON of the stamp card to a new object below\n * 3. Add the field \"venueCategory: VenueCategories.XXXX\" (must match venue and display)\n * 4. Add it to the array at the bottom\n * 5. Create a fake stamp card in stampCardMocks\n *\n * When the website queries the portal to show the stamp card, the portal will look at the venueCategory to match it with the query.\n *\n */\nimport { StampCardCampaignRaw } from './interfaces';\n\nexport const SECRET_CODE_FOR_MOCK = 'PayAtt'; // Will be lowercased along with user input\n\nexport const lifestyleInterior: StampCardCampaignRaw = {\n venueCategory: VenueCategories.Lifestyle,\n _id: '679c93a912ebd884b1164c20',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: '!&d2$*d4',\n name: 'Ditt Hem 🏡',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom, av den aktuella näringsidkaren godkända, köp berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare väljer att avsluta tjänsten eller att verksamheten upphör.',\n additionalInformation:\n 'Bonuskortet gäller på Ditt Hem. Handla för minst 300 kr och få en stämpel. 10% rabatt efter 4 stämplar. Samla stämplar genom att registrera ditt telefonnummer vid varje köp. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Klicka på \"hämta belöning\", skriv in koden och visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Ditt Hem Bonuskort. \\nKlicka på länken nedan för att se ditt kort.',\n rewardEarnedSMS: 'Grattis! Du har en bonus att hämta ut!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679c8f0012ebd884b116485b'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-eb6dd3cf-63c1-72a8-6c47-c033f47bacf2.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/stampedImage-add9ef60-cba4-ba4c-06d6-03c13ad909e4.png',\n unstampedImage: 'Storefront',\n unstampedImageOpacity: 0.7,\n rewardsPositionsAndImages: {\n '4': {\n name: '10% rabatt',\n description: '10% rabatt på ett köp',\n image: 'Favorite',\n color: '#DFB1FFFF',\n _id: '679c93a912ebd884b1164c21'\n },\n '8': {\n name: '15% rabatt',\n description: '15% rabatt på ett köp',\n image: 'Favorite',\n color: '#FF1B1BFF',\n _id: '679c9c5c12ebd884b1165630'\n }\n },\n backgroundColor: '#FFFFFFFF',\n rewardsRectangleColor: '#949494FF',\n rectangleBehindCardsColor: '#AB790EFF',\n rectangleBehindCardsBorderColor: '#FFFFFFFF',\n stampCircleColor: '#FFFFFFFF',\n textColor: '#000000FF',\n stampedIconColor: '#000000',\n unstampedIconColor: '#CACACAFF',\n rewardButtonColor: '#00A019FF',\n rewardAreaTextColor: '#000000',\n termsTextColor: '#484848FF',\n rewardButtonTextColor: '#FFFFFFFF',\n rewardStampBorderColorPartOne: '#6B4A00FF',\n rewardStampBorderColorPartTwo: '#583D00FF',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-10-11T12:21:53.838+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n tags: []\n};\n\nexport const beautySalon: StampCardCampaignRaw = {\n venueCategory: VenueCategories.BeautySalon,\n _id: '679cbc8912ebd884b1167c6f',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: '!&d2$*d4',\n name: 'Skönheten 😌',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom, av den aktuella näringsidkaren godkända, köp berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare väljer att avsluta tjänsten eller att verksamheten upphör.',\n additionalInformation:\n 'Bonuskortet gäller på Skönheten. Handla för minst 300 kr och få en stämpel. 100kr rabatt på nästa behandling efter 4 stämplar. Samla stämplar genom att registrera ditt telefonnummer vid varje köp. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Klicka på \"hämta belöning\", skriv in koden och visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Skönheten Bonuskort. \\nKlicka på länken nedan för att se ditt kort.',\n rewardEarnedSMS: 'Grattis! Du har en bonus att hämta ut!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['67926e50ed3744484f299d50'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-5bb47316-07c2-9a05-7ad2-b17d3cf78270.png',\n stampedImage: 'Favorite',\n unstampedImage: 'Favorite',\n unstampedImageOpacity: 0.45,\n rewardsPositionsAndImages: {\n '4': {\n name: '100kr rabatt',\n description: '100kr rabatt på nästa behandling',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage1-35c3b241-fd5e-e808-8cf8-2e521cd162c1.png',\n color: '#000000FF',\n _id: '679cbc8912ebd884b1167c70'\n },\n '8': {\n name: '10% rabatt',\n description: '10% rabatt på en behandling',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage2-64b5c415-ac0c-71d0-a77f-e8cd10b394e7.png',\n color: '#FF1B1BFF',\n _id: '679cbc8912ebd884b1167c71'\n }\n },\n backgroundColor: '#FFFFFFFF',\n rewardsRectangleColor: '#D0D0D0FF',\n rectangleBehindCardsColor: '#98E2FFFF',\n rectangleBehindCardsBorderColor: '#3A3A3AFF',\n stampCircleColor: '#FFFFFFFF',\n textColor: '#3A3A3AFF',\n stampedIconColor: '#FFA4A4FF',\n unstampedIconColor: '#FFA4A4FF',\n rewardButtonColor: '#00C90AFF',\n rewardAreaTextColor: '#000000FF',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#FFFFFFFF',\n rewardStampBorderColorPartOne: '#98E2FFFF',\n rewardStampBorderColorPartTwo: '#98E2FFFF',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n tags: [],\n createdAt: '2025-01-31T12:05:29.333+0000',\n updatedAt: '2025-01-31T12:05:29.333+0000'\n};\n\nexport const fastfoodGrill: StampCardCampaignRaw = {\n venueCategory: VenueCategories.FastFoodGrill,\n _id: '679cc1ae12ebd884b1168452',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: '!&d2$*d4',\n name: 'Din Grill 🍗',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom, av den aktuella näringsidkaren godkända, köp berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare väljer att avsluta tjänsten eller att verksamheten upphör.',\n additionalInformation:\n 'Bonuskortet gäller på Ditt Hem. Stämpel vid köp för minst 100kr. 20% rabatt efter 8 stämplar. Samla stämplar genom att registrera ditt telefonnummer vid varje köp. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Klicka på \"hämta belöning\", skriv in koden och visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Din Grill Bonuskort. \\nKlicka på länken nedan för att se ditt kort.',\n rewardEarnedSMS: 'Grattis! Du har en bonus att hämta ut!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679b78d612ebd884b115cc7f'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-11359403-4e7f-1e28-ac28-6443fe11509e.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/stampedImage-d6bbdfce-a2e6-9b39-be83-732c644123df.png',\n unstampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/unstampedImage-839ffbc8-866d-e102-82c4-d9b800947123.png',\n unstampedImageOpacity: 0.15,\n rewardsPositionsAndImages: {\n '8': {\n name: '20% rabatt',\n description: '20% rabatt på nästa köp',\n image: 'LocalDining',\n color: '#D08200FF',\n _id: '679cc1ae12ebd884b1168453'\n }\n },\n backgroundColor: '#2B2B2BFF',\n rewardsRectangleColor: '#2B2B2BFF',\n rectangleBehindCardsColor: '#E5E5E5FF',\n rectangleBehindCardsBorderColor: '#D0820033',\n stampCircleColor: '#630000FF',\n textColor: '#D08200FF',\n stampedIconColor: '#000000',\n unstampedIconColor: '#CACACAFF',\n rewardButtonColor: '#D08200FF',\n rewardAreaTextColor: '#E5E5E5FF',\n termsTextColor: '#FFFFFFFF',\n rewardButtonTextColor: '#000000FF',\n rewardStampBorderColorPartOne: '#D08200FF',\n rewardStampBorderColorPartTwo: '#D08200FF',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n tags: [],\n createdAt: '2025-01-31T12:27:26.865+0000',\n updatedAt: '2025-01-31T14:29:36.370+0000'\n};\n\nexport const restaurant: StampCardCampaignRaw = {\n venueCategory: VenueCategories.Restaurant,\n _id: '679cc52e12ebd884b1168879',\n startDate: '2023-01-10T23:00:00.000+0000',\n secretCode: '%d9€#0d(',\n name: 'Restaurang 🍽️',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 10,\n startMinute: 0,\n endHour: 14,\n endMinute: 0,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom, av den aktuella näringsidkaren godkända, köp berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Belöningen går att hämta under butikens öppettider. Rätten till belöning förfaller dock om aktuell näringsidkare går i konkurs.',\n additionalInformation:\n 'Bonuskortet gäller på Restaurang under lunchtid, 10:00-14:00. Gratis lunch efter 8 stämplar. Samla stämplar genom att registrera ditt telefonnummer varje gång du äter hos oss, under lunchtid. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Klicka på \"hämta belöning\", skriv in koden och visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Välkommen till Restaurang Stämpelkort!',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['6740d2101a8399b4cf54d314'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-8f5e4e0e-95a7-e552-81f8-56afb6681035.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/stampedImage-80fe197a-d925-35e7-d17a-74bd15319fa0.png',\n unstampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/unstampedImage-f329eb69-8d28-6aa5-be24-6641b3feb8d9.png',\n unstampedImageOpacity: 0.19,\n rewardsPositionsAndImages: {\n '8': {\n name: 'Gratis lunch',\n description: 'Gratis lunch mellan 10-14',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage1-d944b274-92a5-1cf3-dfc2-83b2e9fd042d.png',\n color: '#000000',\n _id: '679cc52e12ebd884b116887a'\n }\n },\n backgroundColor: '#ffffff',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#325380',\n rectangleBehindCardsBorderColor: '#6d1f00',\n stampCircleColor: '#fff4cc',\n textColor: '#ffffff',\n stampedIconColor: '#000000',\n unstampedIconColor: '#000000',\n rewardButtonColor: '#c8163b',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#ffffff',\n rewardStampBorderColorPartOne: '#f7a1dc',\n rewardStampBorderColorPartTwo: '#27EEBA',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-01-10T21:19:54.888+0000',\n updatedAt: '2025-01-31T12:56:28.469+0000',\n tags: []\n};\n\nexport const cafe: StampCardCampaignRaw = {\n venueCategory: VenueCategories.Cafe,\n _id: '679ccbeba2ba693edca63af7',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: 'fd9/n\"3!',\n name: 'Din Hörna ☕️',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Stämpelkortet gäller på Din Hörna under dess öppettider. Belöning avser en valfri gratis kaffe på menyn. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan. \\n\\nEnkelt, eller hur?! ☕️',\n welcomeSMS: 'Välkommen till Din Hörna stämpelkort! Samla stämplar och få belöningar. Klicka på länken nedan.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679b7d19a2ba693edca57dd8'],\n merchantId: '6740d2101a8399b4cf54d30d',\n templateUsed: '63e24b42996410fd3ce64c50',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-38f5a83b-24ff-637b-f8a0-bcf028a9f665.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/templates/Cafe/Cafe/stampedImage-6711e96a-3b7f-8158-b5a2-05e255b12abf.png',\n unstampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/templates/Cafe/Cafe/unstampedImage-a2158ccf-2b0f-7613-6b8f-2f096e4a8e50.png',\n unstampedImageOpacity: 0.32,\n rewardsPositionsAndImages: {\n '6': {\n name: 'En gratis kaffe ☕️',\n description: 'En valfri gratis kaffe ☕️',\n image: 'Favorite',\n color: '#91532c',\n _id: '679ccbeba2ba693edca63af8'\n }\n },\n backgroundColor: '#ffffff',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#f8d5a1',\n rectangleBehindCardsBorderColor: '#f8d5a1',\n stampCircleColor: '#fff4cc',\n textColor: '#010101',\n stampedIconColor: '#000000',\n unstampedIconColor: '#000000',\n rewardButtonColor: '#9a5021',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#ffffff',\n rewardStampBorderColorPartOne: '#f7a1dc',\n rewardStampBorderColorPartTwo: '#27EEBA',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-05-25T11:36:15.891+0000',\n updatedAt: '2025-01-31T13:15:07.481+0000',\n tags: []\n};\n\nexport const deli: StampCardCampaignRaw = {\n venueCategory: VenueCategories.DeliStore,\n _id: '679ccd09a2ba693edca63c0e',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: 'c8(d/2-:',\n name: 'Deli 🍽️',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Stämpelkortet gäller på Deli 🍽️ under våra öppettider. Belöning avser 10% rabatt på nästa köp (obs, max 100kr rabatt). \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan. \\n\\nEnkelt, eller hur?! 🎉',\n welcomeSMS: 'Välkommen till Deli Stämpelkort! Samla stämplar och få belöningar. Klicka på länken nedan.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679b7a10a2ba693edca578ba'],\n merchantId: '6740d2101a8399b4cf54d30d',\n templateUsed: '63c7c9e1686c7dee258e0c1d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-758201fc-b0e9-4358-9e93-68edf874baea.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/stampedImage-b50af78b-acb5-51d3-29b3-05d53c8869e1.png',\n unstampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/unstampedImage-ebf7d1b2-1953-7b41-53ea-0886bc4a0c87.png',\n unstampedImageOpacity: 0.15,\n rewardsPositionsAndImages: {\n '6': {\n name: '10% rabatt',\n description: '10% rabatt 🎉',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage1-129551a4-11e5-2b39-07bd-1aac01d23880.png',\n color: '#000000',\n _id: '679ccd09a2ba693edca63c0f'\n }\n },\n backgroundColor: '#90AEBBFF',\n rewardsRectangleColor: '#1D1D1BFF',\n rectangleBehindCardsColor: '#90AEBBFF',\n rectangleBehindCardsBorderColor: '#90AEBBFF',\n stampCircleColor: '#354B5BFF',\n textColor: '#000000FF',\n stampedIconColor: '#000000',\n unstampedIconColor: '#000000',\n rewardButtonColor: '#90AEBBFF',\n rewardAreaTextColor: '#ffffff',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#000000FF',\n rewardStampBorderColorPartOne: '#354B5BFF',\n rewardStampBorderColorPartTwo: '#354B5BFF',\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-05-22T12:04:34.910+0000',\n updatedAt: '2025-01-31T13:23:48.189+0000',\n tags: [],\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n }\n};\n\nexport const hairdresser: StampCardCampaignRaw = {\n venueCategory: VenueCategories.Hairdresser,\n _id: '679ccf49a2ba693edca63e11',\n startDate: '2025-05-31T22:00:00.000+0000',\n secretCode: 'c,(d!%.3',\n name: 'Frisören 💇‍♀️',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Stämpelkortet är personligt och går inte att dela på flera personer. En stämpel erhålles per besök motsvarande minimum en klippning i pris.\\n(Max en stämpel per dag)\\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan. \\n\\nEnkelt, eller hur?! 🎉',\n welcomeSMS: 'Välkommen till Frisörens! Grattis till din första stämpel, se ditt stämpelkort i länken nedan.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['67926b35ed3744484f299aad'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-62e23029-8d89-d248-e27e-585b80935a03.png',\n stampedImage: 'ContentCut',\n unstampedImage: 'ContentCut',\n unstampedImageOpacity: 0.3,\n rewardsPositionsAndImages: {\n '4': {\n name: '50 kr rabatt',\n description: '50 kr rabatt vid köp',\n image: 'StarOutline',\n color: '#486857',\n _id: '679ccf49a2ba693edca63e12'\n },\n '8': {\n name: '100 kr rabatt',\n description: '100 kr rabatt vid köp',\n image: 'Star',\n color: '#486857',\n _id: '679ccf49a2ba693edca63e13'\n }\n },\n backgroundColor: '#E5EAE7FF',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#E8DAAEFF',\n rectangleBehindCardsBorderColor: '#4d6c5b',\n stampCircleColor: '#ffffff',\n textColor: '#4d6c5b',\n stampedIconColor: '#33473A',\n unstampedIconColor: '#33473a',\n rewardButtonColor: '#E8DAAEFF',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#4d6c5b',\n rewardStampBorderColorPartOne: '#f7a1dc',\n rewardStampBorderColorPartTwo: '#27EEBA',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-06-01T09:37:30.964+0000',\n updatedAt: '2025-01-31T13:45:33.669+0000',\n tags: []\n};\n\nexport const clothesStore: StampCardCampaignRaw = {\n venueCategory: VenueCategories.ClothingStore,\n _id: '679cd45012ebd884b1169741',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: '=/lx.!5(',\n name: 'Klädhörnan 👚👖',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Rabatten gäller i butiken under dess ordinarie öppettider. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Klicka på \"hämta belöning\", skriv in koden och visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Välkommen till vårt stämpelkort! Samla stämplar och få belöningar.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679b7b1f12ebd884b115d1c6'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-72b7096d-c2d4-a74d-deea-c7375755a105.png',\n stampedImage: 'Favorite',\n unstampedImage: 'Favorite',\n unstampedImageOpacity: 0.24,\n rewardsPositionsAndImages: {\n '6': {\n name: '10% rabatt',\n description: '10% rabatt på ditt köp 🎉',\n image: 'Favorite',\n color: '#fd0647',\n _id: '679cd45012ebd884b1169742'\n }\n },\n backgroundColor: '#bac8d3',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#d7929a',\n rectangleBehindCardsBorderColor: '#6d1f00',\n stampCircleColor: '#fff4cc',\n textColor: '#ffffff',\n stampedIconColor: '#f40b61',\n unstampedIconColor: '#f0a3a3',\n rewardButtonColor: '#55ba47',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#ffffff',\n rewardStampBorderColorPartOne: '#f7a1dc',\n rewardStampBorderColorPartTwo: '#27EEBA',\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-05-02T08:57:03.257+0000',\n updatedAt: '2025-01-31T13:53:03.665+0000',\n tags: [],\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n }\n};\n\nexport const flowershop: StampCardCampaignRaw = {\n venueCategory: VenueCategories.FlowerShop,\n _id: '679cdac3a2ba693edca64afc',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: 'd7/2&.2#',\n name: 'Blomsterhandlarna 🌷',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6, 0]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Stämpelkortet gäller på Blomsterhandlarna. Belöning avser en gratis blombukett på 6e stämpeln (max 150kr) och 20% rabatt på 12e stämpeln (max 300kr). Samla stämplar genom att knappa in ditt tel. nr. vid varje besök. \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan. \\n\\nEnkelt, eller hur?!',\n welcomeSMS: 'Blomsterhandlarnas stämpelkort. Samla stämplar - få belöningar! Följ linken.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0762222222', '0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['67926a39ed3744484f299a52'],\n merchantId: '6740d2101a8399b4cf54d30d',\n templateUsed: '63e24b42996410fd3ce64c50',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-4e338ce9-7272-44a7-bc78-6167ad6ea159.png',\n stampedImage:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/stampedImage-0e4a4409-6945-d744-eaf2-0b422ab73f71.png',\n unstampedImage: 'LocalFlorist',\n unstampedImageOpacity: 0.3,\n rewardsPositionsAndImages: {\n '6': {\n name: 'Gratis blombukett!',\n description: 'Gratis blombukett för max 150kr 🌸',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage1-05c7e06d-ff89-949c-bed2-0da25ab5494a.png',\n color: '#91532c',\n _id: '679cdac3a2ba693edca64afd'\n },\n '12': {\n name: '20% rabatt',\n description: '20% rabatt på ditt köp (max 300kr)',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage2-8ed60f27-6832-3dad-8c6d-9cd0a67fe8d6.png',\n color: '#000000',\n _id: '679cdac3a2ba693edca64afe'\n }\n },\n backgroundColor: '#FFFFFFFF',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#A29985FF',\n rectangleBehindCardsBorderColor: '#A29985FF',\n stampCircleColor: '#E4E4DDFF',\n textColor: '#FFFFFFFF',\n stampedIconColor: '#000000',\n unstampedIconColor: '#795700FF',\n rewardButtonColor: '#E4E4DDFF',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#000000FF',\n rewardStampBorderColorPartOne: '#B7B7B7FF',\n rewardStampBorderColorPartTwo: '#E9E9E9FF',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n createdAt: '2023-05-25T11:36:15.891+0000',\n updatedAt: '2025-01-31T14:26:23.615+0000',\n tags: []\n};\n\nexport const other: StampCardCampaignRaw = {\n venueCategory: VenueCategories.Default,\n _id: '679ce07212ebd884b116a469',\n startDate: '2024-12-31T23:00:00.000+0000',\n secretCode: 'd7/2&.2#',\n name: 'Diverse 🌸',\n oneTimeOrOngoing: 'ongoing',\n timeIntervals: [\n {\n startHour: 0,\n startMinute: 0,\n endHour: 23,\n endMinute: 59,\n daysOfWeek: [1, 2, 3, 4, 5, 6]\n }\n ],\n timeZone: 'Europe/Stockholm',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkare säger upp tjänsten eller verksamheten upphör.',\n additionalInformation:\n 'Stämpelkortet gäller på din verksamhet. Samla stämplar genom att knappa in ditt tel. nr. vid varje besök, efter X stämplar får du denna belöning. Varje kort kan ha upp till 3 belöningar utspridda över 18 stämplar! \\n\\nNär du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan. \\n\\nEnkelt, eller hur?!\\n\\nPS. Du kan enkelt ställa in vilka giltighetstider ditt kort ska ha. Du kan till exempel skapa ett lunch- eller middagskort, helgkort, olika tider på olika dagar, mm. \\n\\nDu kan även sätta ett slutdatum eller ställa in kortet som antingen ett engångskort eller ett kort som automatiskt startar om när det är fullt.\\n\\nSjälvklart kan du även ändra färger, ladda upp din logga, modifiera texter (även denna, och mycket mer. Använd kortet som en marknadsföringsplatform och locka dina kunder till dina sociala medier och din butik! 🙌',\n welcomeSMS: 'Din verksamhets stämpelkort. Samla stämplar - få belöningar! Följ länken.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n stampCardSuggestions: [],\n testPhoneNumbers: ['0761424576'],\n activated: false,\n disabled: false,\n POSIds: ['679b7b92a2ba693edca57c3f'],\n merchantId: '6740d2101a8399b4cf54d30d',\n hidden: false,\n logoUrl:\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/logoUrl-3645ac79-603d-2585-4e7d-c8b6d468e403.png',\n stampedImage: 'AutoAwesome',\n unstampedImage: 'StarOutline',\n unstampedImageOpacity: 0.3,\n rewardsPositionsAndImages: {\n '6': {\n name: '10% rabatt',\n description: '10% rabatt vid köp för max 500kr',\n image: 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/6740d2101a8399b4cf54d30d/rewardImage1-7eec70e7-76b6-0ed0-4083-571c0fa8e9a4.png',\n color: '#91532c',\n _id: '679ce07212ebd884b116a46a'\n },\n '12': {\n name: '20% rabatt',\n description: '20% rabatt på ditt köp (max 500kr)',\n image: 'Discount',\n color: '#177C00FF',\n _id: '679ce07212ebd884b116a46b'\n }\n },\n backgroundColor: '#FFFFFFFF',\n rewardsRectangleColor: '#ffffff',\n rectangleBehindCardsColor: '#A29985FF',\n rectangleBehindCardsBorderColor: '#A29985FF',\n stampCircleColor: '#E4E4DDFF',\n textColor: '#FFFFFFFF',\n stampedIconColor: '#795700FF',\n unstampedIconColor: '#795700FF',\n rewardButtonColor: '#E4E4DDFF',\n rewardAreaTextColor: '#010101',\n termsTextColor: '#000000',\n rewardButtonTextColor: '#000000FF',\n rewardStampBorderColorPartOne: '#757400FF',\n rewardStampBorderColorPartTwo: '#E1DE43FF',\n websiteLink: {\n link: 'https://payattclub.se',\n text: 'payattclub.se'\n },\n facebookLink: 'https://www.facebook.com/payatt.store',\n instagramLink: 'https://www.instagram.com/payattofficial/',\n linkedInLink: '',\n youTubeLink: 'https://www.youtube.com/@payatt',\n selectedProducts: [],\n tags: [],\n createdAt: '2025-01-31T14:38:42.683+0000',\n updatedAt: '2025-01-31T14:43:26.738+0000'\n};\n\nexport const StampCardCampaignsMock: Record = {\n [VenueCategories.Lifestyle]: lifestyleInterior,\n [VenueCategories.BeautySalon]: beautySalon,\n [VenueCategories.FastFoodGrill]: fastfoodGrill,\n [VenueCategories.Restaurant]: restaurant,\n [VenueCategories.Cafe]: cafe,\n [VenueCategories.DeliStore]: deli,\n [VenueCategories.Hairdresser]: hairdresser,\n [VenueCategories.ClothingStore]: clothesStore,\n [VenueCategories.FlowerShop]: flowershop,\n [VenueCategories.Other]: other,\n\n // Not used in website\n [VenueCategories.Pizzeria]: other,\n [VenueCategories.Bar]: other,\n [VenueCategories.BarRestaurant]: other,\n [VenueCategories.ThaiRestaurant]: other,\n [VenueCategories.IndianRestaurant]: other,\n [VenueCategories.BurgerRestaurant]: other,\n [VenueCategories.ItalianRestaurant]: other,\n [VenueCategories.SushiRestaurant]: other,\n [VenueCategories.PetStore]: other,\n [VenueCategories.BagelCafe]: other,\n [VenueCategories.FishStore]: other,\n [VenueCategories.MeatStore]: other,\n [VenueCategories.YarnStore]: other,\n [VenueCategories.CandyStore]: other,\n [VenueCategories.HealthyStore]: other,\n [VenueCategories.IcecreamShop]: other,\n [VenueCategories.FoodTruckHealthyFood]: other,\n [VenueCategories.WineImporter]: other,\n [VenueCategories.HairdresserBeauty]: other,\n [VenueCategories.Barber]: other,\n [VenueCategories.Default]: other\n};\n","/* eslint-disable no-underscore-dangle */\nimport { VenueCategories } from 'store/features/venueCategories/handlers';\n\nimport { StampCardRaw } from './interfaces';\nimport {\n beautySalon,\n cafe,\n clothesStore,\n deli,\n fastfoodGrill,\n flowershop,\n hairdresser,\n lifestyleInterior,\n other,\n restaurant\n} from './stampCardCampaignMocks';\n\n/**\n * ADD STAMP CARD TO SHOW IN WEBSITE\n *\n * 1. Create a new stamp card object, it MUST\n * - have an associated stamp card campaign\n * 2. Set the field \"hash: VenueCategories.XXX\"\n * 3. Set the field \"stampCardCampaignId: ._id\"\n * 4. Add any number of rewards that fits the stamp card and looks good in the website\n */\n\nconst lifestyleInteriorStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: lifestyleInterior._id,\n active: true,\n stampCount: 6,\n totalStampCount: 6,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.Lifestyle,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: {\n [Object.values(lifestyleInterior.rewardsPositionsAndImages)[0]._id]: {\n count: 1\n }\n }\n};\n\nconst beautySalonStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: beautySalon._id,\n active: true,\n stampCount: 5,\n totalStampCount: 13,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.BeautySalon,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: {\n [Object.values(beautySalon.rewardsPositionsAndImages)[0]._id]: { count: 2 },\n [Object.values(beautySalon.rewardsPositionsAndImages)[1]._id]: { count: 1 }\n }\n};\n\nconst fastfoodGrillStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: fastfoodGrill._id,\n active: true,\n stampCount: 8,\n totalStampCount: 8,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.FastFoodGrill,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(fastfoodGrill.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nconst restaurantStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: restaurant._id,\n active: true,\n stampCount: 5,\n totalStampCount: 12,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.Restaurant,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(restaurant.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nconst cafeStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: cafe._id,\n active: true,\n stampCount: 6,\n totalStampCount: 6,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.Cafe,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(cafe.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nconst deliStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: deli._id,\n active: true,\n stampCount: 3,\n totalStampCount: 9,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.DeliStore,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(deli.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nconst hairdresserStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: hairdresser._id,\n active: true,\n stampCount: 5,\n totalStampCount: 10,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.Hairdresser,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: {\n [Object.values(hairdresser.rewardsPositionsAndImages)[0]._id]: { count: 1 },\n [Object.values(hairdresser.rewardsPositionsAndImages)[1]._id]: { count: 1 }\n }\n};\n\nconst clothesStoreStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: clothesStore._id,\n active: true,\n stampCount: 6,\n totalStampCount: 6,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.ClothingStore,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(clothesStore.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nconst flowershopStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: flowershop._id,\n active: true,\n stampCount: 7,\n totalStampCount: 7,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.FlowerShop,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: { [Object.values(flowershop.rewardsPositionsAndImages)[0]._id]: { count: 1 } }\n};\n\nexport const otherStampCard: StampCardRaw = {\n _id: 'stampcardid0000000000000',\n customer: '0701111111',\n stampCardCampaignId: other._id,\n active: true,\n stampCount: 9,\n totalStampCount: 21,\n firstRegistration: { venueId: '', POSId: '' },\n tags: [],\n hash: VenueCategories.Other,\n createdAt: '2025-01-31T12:38:51.065+0000',\n updatedAt: '2025-01-31T12:38:51.065+0000',\n rewardsReadyToBeClaimed: {\n [Object.values(other.rewardsPositionsAndImages)[0]._id]: { count: 2 },\n [Object.values(other.rewardsPositionsAndImages)[1]._id]: { count: 1 }\n }\n};\n\nexport const StampCardsMock: Record = {\n [VenueCategories.Lifestyle]: lifestyleInteriorStampCard,\n [VenueCategories.BeautySalon]: beautySalonStampCard,\n [VenueCategories.FastFoodGrill]: fastfoodGrillStampCard,\n [VenueCategories.Restaurant]: restaurantStampCard,\n [VenueCategories.Cafe]: cafeStampCard,\n [VenueCategories.DeliStore]: deliStampCard,\n [VenueCategories.Hairdresser]: hairdresserStampCard,\n [VenueCategories.ClothingStore]: clothesStoreStampCard,\n [VenueCategories.FlowerShop]: flowershopStampCard,\n [VenueCategories.Other]: otherStampCard,\n\n // Not used in website currently\n [VenueCategories.Pizzeria]: otherStampCard,\n [VenueCategories.Bar]: otherStampCard,\n [VenueCategories.BarRestaurant]: otherStampCard,\n [VenueCategories.ThaiRestaurant]: otherStampCard,\n [VenueCategories.IndianRestaurant]: otherStampCard,\n [VenueCategories.BurgerRestaurant]: otherStampCard,\n [VenueCategories.ItalianRestaurant]: otherStampCard,\n [VenueCategories.SushiRestaurant]: otherStampCard,\n [VenueCategories.PetStore]: otherStampCard,\n [VenueCategories.BagelCafe]: otherStampCard,\n [VenueCategories.FishStore]: otherStampCard,\n [VenueCategories.MeatStore]: otherStampCard,\n [VenueCategories.YarnStore]: otherStampCard,\n [VenueCategories.CandyStore]: otherStampCard,\n [VenueCategories.HealthyStore]: otherStampCard,\n [VenueCategories.IcecreamShop]: otherStampCard,\n [VenueCategories.FoodTruckHealthyFood]: otherStampCard,\n [VenueCategories.WineImporter]: otherStampCard,\n [VenueCategories.HairdresserBeauty]: otherStampCard,\n [VenueCategories.Barber]: otherStampCard,\n [VenueCategories.Default]: otherStampCard\n};\n","/* eslint-disable no-underscore-dangle */\n\n/* eslint-disable prefer-destructuring */\nimport axios, { AxiosResponse } from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { ClaimRewardAPI } from 'api/interfaces';\nimport { handleAxiosError } from 'errorHandling/handleResponse';\nimport { payAttError } from 'errorHandling/payattError';\nimport { VenueCategories } from 'store/features/venueCategories/handlers';\nimport {\n IStampCardCampaign,\n StampCardAxiosResponse,\n StampCardInterface,\n TimeIntervalsBackend\n} from 'views/StampCardPage/stampCardPage.interfaces';\n\nimport { StampCardRaw } from './interfaces';\nimport { SECRET_CODE_FOR_MOCK, StampCardCampaignsMock } from './stampCardCampaignMocks';\nimport { StampCardsMock, otherStampCard } from './stampCardMocks';\n\nexport const isWebsiteInstancePayattclub = (): boolean => {\n return (\n typeof process.env.REACT_APP_WEBSITE_INSTANCE === 'string' &&\n process.env.REACT_APP_WEBSITE_INSTANCE?.toLowerCase() === 'true'\n );\n};\n\n// Fix some fields, such as \"activated: true\" and \"disabled: false\"\nconst ensureValidCampaign = (campaign: IStampCardCampaign, customerCard: StampCardRaw): StampCardInterface => {\n const parsedCampaign: StampCardInterface = {\n campaign: {\n id: campaign.id,\n startDate: new Date(campaign.startDate),\n name: campaign.name,\n welcomeSMS: campaign.welcomeSMS,\n rewardEarnedSMS: campaign.rewardEarnedSMS,\n secretCode: campaign.secretCode,\n oneTimeOrOngoing: 'ongoing',\n additionalInformation: campaign.additionalInformation,\n termsAndConditions: campaign.termsAndConditions,\n stampCardSuggestions: campaign.stampCardSuggestions,\n activated: true,\n disabled: false,\n POSIds: campaign.POSIds,\n timeIntervals: campaign.timeIntervals as TimeIntervalsBackend[],\n logoUrl: campaign.logoUrl,\n stampedImage: campaign.stampedImage,\n unstampedImage: campaign.unstampedImage,\n unstampedImageOpacity: campaign.unstampedImageOpacity,\n rewardsPositionsAndImages: campaign.rewardsPositionsAndImages,\n backgroundColor: campaign.backgroundColor,\n rewardsRectangleColor: campaign.rewardsRectangleColor,\n rectangleBehindCardsColor: campaign.rectangleBehindCardsColor,\n rectangleBehindCardsBorderColor: campaign.rectangleBehindCardsBorderColor,\n stampCircleColor: campaign.stampCircleColor,\n textColor: campaign.textColor,\n rewardButtonColor: campaign.rewardButtonColor,\n rewardAreaTextColor: campaign.rewardAreaTextColor,\n stampedIconColor: campaign.stampedIconColor,\n unstampedIconColor: campaign.unstampedIconColor,\n termsTextColor: campaign.termsTextColor,\n rewardButtonTextColor: campaign.rewardButtonTextColor,\n rewardStampBorderColorPartOne: campaign.rewardStampBorderColorPartOne,\n rewardStampBorderColorPartTwo: campaign.rewardStampBorderColorPartTwo,\n facebookLink: campaign.facebookLink,\n instagramLink: campaign.instagramLink,\n youTubeLink: campaign.youTubeLink,\n linkedInLink: campaign.linkedInLink,\n websiteLink: {\n link: campaign.websiteLink.link,\n text: campaign.websiteLink.text\n },\n selectedProducts: campaign.selectedProducts\n },\n customerCard: {\n id: customerCard._id,\n customer: customerCard.customer,\n active: true,\n stampCount: customerCard.stampCount,\n rewardsReadyToBeClaimed: {},\n hash: customerCard.hash\n }\n };\n\n Object.entries(customerCard.rewardsReadyToBeClaimed).forEach(([key, val]) => {\n parsedCampaign.customerCard.rewardsReadyToBeClaimed[key] = val.count;\n });\n\n return parsedCampaign;\n};\n\nconst getStampCardInfo = async (campaignId: string): Promise> => {\n const STAMP_CARD_ENDPOINT_WEBSITE = `${BASE_URL}/website/stamp-card/${campaignId}`;\n\n try {\n return await axios.get(STAMP_CARD_ENDPOINT_WEBSITE);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\n// When mocking via the website, the hash contains the venue category, e.g. \"flowershop\"\nexport const mockWebsiteGetStampCardAPI = async (hash: string): Promise> => {\n const stampCard = StampCardsMock[hash as VenueCategories] || otherStampCard;\n\n const {\n data: { campaign }\n } = await getStampCardInfo(stampCard.stampCardCampaignId);\n\n const parsedCampaign = ensureValidCampaign(campaign, stampCard);\n\n const data: StampCardAxiosResponse = {\n customerCard: parsedCampaign.customerCard,\n campaign: parsedCampaign.campaign\n };\n\n const response: AxiosResponse = { data, status: 200, statusText: '', headers: {}, config: {} };\n\n return response;\n};\n\nexport const mockWebsiteClamRewardAPI = ({ id, customer, code, rewardId, count }: ClaimRewardAPI): AxiosResponse => {\n const data: ClaimRewardAPI = { id, customer, code, rewardId, count };\n\n const stampCardCampaign = Object.values(StampCardCampaignsMock).find((el) => el._id === id);\n if (!stampCardCampaign) {\n throw new Error(`Failed to find stamp card campaign matching id ${id}`);\n }\n\n if (code.toLowerCase() === SECRET_CODE_FOR_MOCK.toLowerCase()) {\n const response: AxiosResponse = { data, status: 0, statusText: '', headers: {}, config: {} };\n\n return response;\n }\n\n throw payAttError({ message: 'Secret code is invalid!' }, 403);\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { CurrentUserInterface, CurrentUserShowIntroductions, UserRoles } from 'store/features/auth/handlers';\nimport { asEnum } from 'utils/utils';\n\nconst API_ENDPOINT = `${BASE_URL}/users`;\n\nconst handleResponse = (raw: any): CurrentUserInterface => {\n try {\n const user: CurrentUserInterface = {\n username: raw.username,\n contact: {\n email: raw.contact?.email,\n firstName: raw.contact?.firstName,\n lastName: raw.contact?.lastName,\n countryCode: raw.contact?.countryCode,\n country: raw.contact?.country,\n phoneNumber: raw.contact?.phoneNumber\n },\n manages: raw.manages,\n role: asEnum(UserRoles, raw.role as any),\n title: raw.title,\n active: raw.active,\n readOnly: false,\n campaignAllowed: false,\n settings: raw.settings,\n showIntroductions: {\n homepage: raw.showIntroductions.homepage || { main: true, settings: true },\n dashboard: raw.showIntroductions.dashboard || { main: true },\n intelliSms: raw.showIntroductions.intelliSms || { newCampaign: true, calendar: true }\n },\n lastLogin: raw.lastLogin,\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt\n };\n\n // Read only user, this most likely indicates a PayAtt employee monitoring an actual customers account\n if (raw.readOnly) {\n user.readOnly = true;\n }\n if (raw.campaignAllowed) {\n user.campaignAllowed = true;\n }\n\n return user;\n } catch (error) {\n console.error('Failed to extract User from response', raw);\n throw error;\n }\n};\nexport const getUserInfo = async (jwtTokenUnencrypted?: string) => {\n const headers: any = {};\n if (jwtTokenUnencrypted) {\n headers.Authorization = `Bearer ${jwtTokenUnencrypted}`;\n }\n\n try {\n const response = await axios.get(API_ENDPOINT, { headers });\n\n if (response.data && response.status >= 200 && response.status < 300) {\n const user: CurrentUserInterface = handleResponse(response.data);\n return user;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const sendContactUsEmail = async (body: { message: string; category: string }) => {\n const EMAIL_POST_ENDPOINT = `${BASE_URL}/emails/contact-us`;\n\n try {\n return await axios.post(EMAIL_POST_ENDPOINT, body);\n } catch (error) {\n return handleAxiosError(error);\n }\n};\n\nexport const updateShowIntroSeenAPI = async (\n introData: Partial\n): Promise> => {\n const endpoint = `${API_ENDPOINT}/intro`;\n\n try {\n const response = await axios.patch(endpoint, introData);\n\n if (response.data && response.status >= 200 && response.status < 300) return introData;\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { VenueSettingsProps } from 'api/venues/handlers';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { payAttError } from 'errorHandling/payattError';\nimport { PayAttSuccess, payAttSuccess } from 'errorHandling/payattSuccess';\nimport { POSInterface, VenuePermissions, VenuesInterface } from 'store/features/merchantAndVenues/handlers';\nimport { getVenueCategoryWithSpellingCheck } from 'store/features/merchantAndVenues/venueCategorySpellCheck';\nimport { asEnum } from 'utils/utils';\n\nconst VENUE_ENDPOINT = `${BASE_URL}/venues`;\nconst VENUES_ENDPOINT = `${BASE_URL}/venues`;\nconst UNREGISTER_NUMBER_ENDPOINT = `${BASE_URL}/unregister`;\n\nexport const extractPOSFromResponse = (rawPOS: any): POSInterface => {\n const pos: POSInterface = {\n id: rawPOS.id,\n name: rawPOS.name,\n headerText: rawPOS.headerText || 'Titel',\n subheaderText: rawPOS.subheaderText || 'Undertitel',\n newCustomerMessage: rawPOS.newCustomerMessage,\n returningCustomerMessage: rawPOS.returningCustomerMessage,\n POSSystem: rawPOS.POSSystem,\n scanColor: {\n red: rawPOS.scanColor?.red ? parseInt(rawPOS.scanColor.red, 10) : 100,\n green: rawPOS.scanColor?.green ? parseInt(rawPOS.scanColor.green, 10) : 100,\n blue: rawPOS.scanColor?.blue ? parseInt(rawPOS.scanColor.blue, 10) : 100\n },\n venueId: rawPOS.venueId\n };\n\n if (rawPOS.permanentScanScreen) {\n pos.permanentScanScreen = rawPOS.permanentScanScreen;\n }\n if (rawPOS.showQR) {\n pos.showQR = rawPOS.showQR;\n }\n return pos;\n};\n\nexport const extractVenueFromResponse = (raw: any): VenuesInterface => {\n try {\n const venue: VenuesInterface = {\n id: raw.id,\n merchantId: raw.merchantId,\n venueTitle: raw.title,\n officialName: raw.officialName,\n category: getVenueCategoryWithSpellingCheck(raw.venueCategory.category),\n venueCategory: raw.venueCategory,\n POS: raw.POS?.map(extractPOSFromResponse) || [],\n smsSenderName: raw.smsSenderName,\n welcomeSMS: raw.welcomeSMS,\n campaignAllowed: raw.campaignAllowed || false,\n permission: asEnum(VenuePermissions, (raw.permission as any) || 'guest'),\n createdAt: raw.createdAt,\n updatedAt: raw.updatedAt,\n lastUpdatedBy: raw.lastUpdatedBy,\n code: raw.code,\n sentSMSTotal: raw.sentSMSTotal,\n products: raw.products\n };\n\n return venue;\n } catch (error) {\n console.error('Error parsing venue object from server', error);\n throw error;\n }\n};\n\nexport const getVenue = async (venueId: string): Promise => {\n try {\n const response = await axios.get(`${VENUE_ENDPOINT}/${venueId}`);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n // Create merchant object from response\n const venue: VenuesInterface = extractVenueFromResponse(response.data);\n return venue;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const getAllUserManagedVenues = async (): Promise => {\n try {\n const response = await axios.get(VENUES_ENDPOINT);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n const venues = response.data.map(extractVenueFromResponse);\n return venues;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const updateVenueSettings = async (data: VenueSettingsProps): Promise => {\n if (!data.venueId) {\n throw payAttError({ message: 'Missing venueId' }, 400);\n }\n\n if (Object.keys(data).length < 2) {\n return payAttSuccess({ message: 'Nothing to update' }, 400);\n }\n\n const params: any = { venueId: data.venueId };\n if (data.welcomeSMS) {\n params.welcomeSMS = data.welcomeSMS;\n }\n\n try {\n const response = await axios.patch(VENUE_ENDPOINT, params, {\n headers: { 'Content-Type': 'application/json' }\n });\n\n if (response.status >= 200 && response.status < 300) {\n return payAttSuccess(response.data, response.status);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\n/** Unregister phone number from one or more membership clubs (venues)\n *\n * Response codes:\n * 200: Successfully unregistered phone number from all provided venues\n * 204: Already unregistered or not existing in customer club for all provided venues\n * 404: Customer does not exist in provided membership club, for all requested venues\n * 500: All requested venues failed to unregister phone number\n * 555: Successfully unregistered number from a subset of the requested venues\n */\nexport const unregisterPhoneNumberAPI = async (\n phoneNumber: string,\n venues: VenuesInterface[]\n): Promise => {\n if (!venues.length) throw payAttError({ message: 'Missing venue' }, 400);\n if (!phoneNumber.length) throw payAttError({ message: 'Missing phone number' }, 400);\n\n const unregisterResponses = await Promise.all(\n venues.map(async (venue) => {\n try {\n const unregisterResponse = await axios.post(\n UNREGISTER_NUMBER_ENDPOINT,\n { venueId: venue.id, phoneNumber },\n { headers: { 'Content-Type': 'application/json' } }\n );\n\n if (unregisterResponse.status >= 200 && unregisterResponse.status < 300) {\n return payAttSuccess(unregisterResponse.data, unregisterResponse.status);\n }\n\n return handleAxiosInvalidResponse(unregisterResponse);\n } catch (error: any) {\n console.error('Error unregistering customer', error.response.data);\n return handleAxiosError(error);\n }\n })\n );\n\n const alreadyUnregisteredList = unregisterResponses.filter((res) => res.status === 204);\n\n const successfullyUnregistered = unregisterResponses.filter((res) => res.status === 200);\n\n const customerMissing = unregisterResponses.filter((res) => res.status === 404);\n\n const failedRequests = unregisterResponses.filter((res) => res.status >= 300);\n\n // Check all venues if number was succesfully unregistered\n if (successfullyUnregistered.length === venues.length) {\n return payAttSuccess({ message: 'Telephone number unregistered from all venues' }, 200);\n }\n\n // Check all venues if number was already unregistered\n if (alreadyUnregisteredList.length === venues.length) {\n return payAttSuccess({ message: unregisterResponses[0].data.message }, 204);\n }\n\n // Check if customer doesn't exist in any associated club\n if (customerMissing.length === venues.length) {\n return payAttSuccess({ message: unregisterResponses[0].data.message }, 404);\n }\n\n // Check if all failed\n if (failedRequests.length === venues.length) {\n // Only return the first error\n throw payAttError({ message: unregisterResponses[0].data.message }, 500);\n }\n\n // If we only unregistered a number from 1 venue, return that specific response\n if (unregisterResponses.length === 1) {\n return payAttSuccess({ message: unregisterResponses[0].data.message }, unregisterResponses[0].data.status);\n }\n\n // Check if customer is now unregistered from all venues (previously unregistered + now)\n if (alreadyUnregisteredList.length + successfullyUnregistered.length === venues.length) {\n return payAttSuccess({ message: `Telephone number unregistered from all venues` }, 200);\n }\n\n // Unregistered number from a subset of venues (not all)\n if (alreadyUnregisteredList.length !== 0 || successfullyUnregistered.length !== 0) {\n return payAttSuccess(\n {\n message: `Unregistered venues count: ${\n alreadyUnregisteredList.length + successfullyUnregistered.length\n }`\n },\n 555\n );\n }\n\n // We should never get here\n console.error('Error when unregistering phone number', unregisterResponses);\n\n throw payAttError({ message: 'error' }, 500);\n};\n","import { Device } from '../context/builderContext';\n\nexport type View =\n | 'standbyView'\n | 'numPadView'\n | 'newCustomerRegistrationView'\n | 'returningCustomerRegistrationView'\n | 'stampCardNewJoinView'\n | 'stampCardProgressView'\n | 'stampCardRewardView';\n\nexport const DisplayViews: Record = {\n standbyView: 'standbyView',\n numPadView: 'numPadView',\n newCustomerRegistrationView: 'newCustomerRegistrationView',\n returningCustomerRegistrationView: 'returningCustomerRegistrationView',\n stampCardNewJoinView: 'stampCardNewJoinView',\n stampCardProgressView: 'stampCardProgressView',\n stampCardRewardView: 'stampCardRewardView'\n} as const;\n\nexport interface PaddingProps {\n paddingBottom?: string;\n paddingTop?: string;\n paddingLeft?: string;\n paddingRight?: string;\n}\nexport type PaddingOptions = 'paddingBottom' | 'paddingTop' | 'paddingLeft' | 'paddingRight';\n\nexport interface MarginProps {\n marginBottom?: string;\n marginTop?: string;\n marginLeft?: string;\n marginRight?: string;\n}\n\nexport type MarginOptions = 'marginTop' | 'marginBottom' | 'marginLeft' | 'marginRight';\n\nexport type JustifyContentOptions =\n | 'flex-start'\n | 'center'\n | 'flex-end'\n | 'space-between'\n | 'space-around'\n | 'space-evenly';\n\nexport type AlignContentOptions = 'center' | 'flex-start' | 'flex-end';\nexport type FlexDirectionOptions = 'row' | 'column';\n\nexport interface AlignmentProps {\n flexDirection?: FlexDirectionOptions;\n alignItems?: AlignContentOptions;\n justifyContent?: JustifyContentOptions;\n}\n\nexport type BackgroundSizes = 'auto' | 'cover' | '125%' | '150%' | '175%' | '200%';\n\nexport type BackgroundPositions = 'center' | 'top' | 'left' | 'bottom' | 'right';\n\nexport interface BackgroundProps {\n brightness?: number;\n backgroundImage?: string;\n backgroundSize?: BackgroundSizes;\n backgroundPosition?: BackgroundPositions;\n backgroundColor?: string;\n}\n\nexport type ShadowOptions = 'shadowColor' | 'shadowOffsetX' | 'shadowOffsetY' | 'shadowBlur' | 'shadowSpread';\n\nexport type TextShadowOptions = Exclude;\n\nexport interface DecorationProps {\n borderRadius?: string;\n boxShadow?: string;\n}\n\nexport type TextAlignOptions = 'left' | 'center' | 'right';\nexport type FontWeightOptions = '300' | '400' | '500' | '700';\nexport type FontStyleOptions = 'normal' | 'italic';\n\nexport interface TextDecorationProps {\n textShadow?: string;\n}\n\nexport interface TypographyProps {\n color?: string;\n textAlign?: TextAlignOptions;\n fontWeight?: FontWeightOptions;\n fontStyle?: FontStyleOptions;\n fontSize?: string;\n fontFamily?: string;\n}\n\nexport type OptionalTypographyProps = {\n colon?: boolean;\n};\n\nexport interface TypographyCustomPropNames {\n fontWeightPropName?: string;\n textAlignPropName?: string;\n fontStylePropName?: string;\n fontFamilyPropName?: string;\n fontSizePropName?: string;\n colorPropName?: string;\n}\n\nexport interface UpdateProp {\n updateProp: (prop: any) => (value: any) => void;\n}\n\nexport interface SizeProps {\n width?: string;\n height?: string;\n}\n\ninterface ViewsCommonProps {\n name: string;\n dimensions: {\n width: string;\n height: string;\n };\n views: {\n standbyView: string;\n numPadView: string;\n newCustomerRegistrationView: string;\n returningCustomerRegistrationView: string;\n stampCardNewJoinView: string;\n stampCardProgressView: string;\n stampCardRewardView: string;\n };\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface DisplayViewCollection extends ViewsCommonProps {\n merchantId: string;\n}\n\nexport interface DisplayViewCollectionTemplate extends ViewsCommonProps {\n deviceType: Device;\n}\n\nexport interface Slide {\n id: string;\n backgroundImage: string;\n}\n","import { FC, createContext, useCallback, useMemo, useState } from 'react';\n\ntype SidebarContext = { sidebarToggle: boolean; toggleSidebar: () => void };\n\nconst initialState = true; // Open\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SidebarContext = createContext({} as SidebarContext);\n\nexport const SidebarProvider: FC = ({ children }) => {\n const [sidebarToggle, setSidebarToggle] = useState(initialState);\n const toggleSidebar = useCallback(() => {\n setSidebarToggle(!sidebarToggle);\n }, [sidebarToggle]);\n\n const value = useMemo(() => {\n return { sidebarToggle, toggleSidebar };\n }, [sidebarToggle, toggleSidebar]);\n\n return {children};\n};\n","import { AxiosResponse } from 'axios';\n\nimport { PayAttError, payAttError } from 'errorHandling/payattError';\n\nexport const handleAxiosError = (error: any): PayAttError => {\n if (error.response) {\n // The request was made and the server responded with a status code >= 3xx\n return payAttError(error.response.data, error.response.status);\n }\n if (error.request) {\n // The request was made but no response was received\n // `error.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n return payAttError({ message: `No response for ${error.request.path}` }, -1);\n }\n\n // Something happened in setting up the request that triggered an Error\n console.warn('Error when setting up axios request');\n console.warn(error.config || error);\n return payAttError({ message: 'Error when setting up axios request' }, -1);\n};\n\nexport const handleAxiosInvalidResponse = (response: AxiosResponse): AxiosResponse => {\n const errorMsg: string = (response.data && response.data.message) || response.statusText || 'Unknown error';\n\n const errorStatus: number = response.status || (response.data && response.data.status) || 400;\n\n const endpoint = response.request?.responseURL || 'Unknown endpoint';\n\n console.error(`Invalid response for request ${endpoint} - ${errorStatus} ${errorMsg}`);\n\n return response;\n};\n","import { RequestData } from 'errorHandling/handlers';\n\nexport interface PayAttError {\n isPayAttError: boolean;\n message: string;\n data: RequestData;\n status: number;\n}\n\nexport const isPayAttError = (obj: any): obj is PayAttError => {\n return typeof obj !== 'undefined' && (obj as PayAttError).isPayAttError;\n};\n\nexport const payAttError = (data: RequestData, status: number): PayAttError => {\n return {\n message: data.message || 'Unknown response',\n status,\n data,\n isPayAttError: true\n };\n};\n","import { RequestData } from 'errorHandling/handlers';\n\nexport interface PayAttSuccess {\n status: number;\n message: string;\n isPayAttSuccess: boolean;\n data: RequestData;\n}\n\nexport const isPayAttSuccess = (obj: any): boolean => {\n return (obj as PayAttSuccess).isPayAttSuccess;\n};\n\nexport const payAttSuccess = (data: RequestData, status: number): PayAttSuccess => {\n return {\n message: data.message || 'Unknown response',\n status,\n data,\n isPayAttSuccess: true\n };\n};\n","import { Divider } from '@mui/material';\nimport Box from '@mui/material/Box';\nimport List from '@mui/material/List';\nimport { styled } from '@mui/styles';\n\nexport const FlexBox = styled(Box)({ display: 'flex' });\nexport const HorizontalCenteredFlexBox = styled(FlexBox)({ justifyContent: 'center' });\nexport const VerticalFlexBox = styled(FlexBox)({ flexDirection: 'column' });\nexport const CenteredFlexBox = styled(FlexBox)({ justifyContent: 'center', alignItems: 'center' });\nexport const VerticalCenteredFlexBox = styled(CenteredFlexBox)({ flexDirection: 'column' });\nexport const VerticalCenteredList = styled(List)({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center'\n});\nexport const FullDivider = styled(Divider)({ opacity: 1 });\n","import { useEffect } from 'react';\n\nimport { CircularProgress, SxProps } from '@mui/material';\n\nimport NProgress from 'nprogress';\n\nimport { CenteredFlexBox } from 'generalComponents/BoxModifications';\n\nconst SuspenseLoader: React.FC<{ sxWrapper?: SxProps; sxSpinner?: SxProps }> = ({ sxWrapper, sxSpinner }) => {\n useEffect(() => {\n NProgress.start();\n\n return () => {\n NProgress.done();\n };\n }, []);\n\n return (\n \n \n \n );\n};\n\nexport default SuspenseLoader;\n","import { Translate } from 'react-redux-i18n';\nimport { ToastContainer, ToastContainerProps, ToastOptions, toast } from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.css';\n\nconst LogoutToastId = 'payatt-logout-toast-id';\n\nexport const PayAttSuccessToast = (Content?: React.ReactNode, options?: ToastOptions) => {\n const Msg: React.ReactNode = Content ||
Success!
;\n toast.success(Msg, { autoClose: 10000, style: { zIndex: Number.MAX_SAFE_INTEGER }, ...options });\n};\n\nexport const PayAttSuccessToastForever = (Content?: React.ReactNode, options?: ToastOptions) => {\n const Msg: React.ReactNode = Content ||
Success!
;\n toast.success(Msg, { autoClose: false, style: { zIndex: Number.MAX_SAFE_INTEGER }, ...options });\n};\n\nexport const PayAttInfoToast = (Content?: React.ReactNode, options?: ToastOptions) => {\n const Msg: React.ReactNode = Content ||
Info
;\n toast.info(Msg, { autoClose: 10000, style: { zIndex: Number.MAX_SAFE_INTEGER }, ...options });\n};\n\nexport const PayAttFailToast = (Content?: React.ReactNode, options?: ToastOptions) => {\n const Msg: React.ReactNode = Content ||
Fail!
;\n toast.error(Msg, { autoClose: 10000, style: { zIndex: Number.MAX_SAFE_INTEGER }, ...options });\n};\n\nexport const PayAttFailToastForever = (Content?: React.ReactNode, options?: ToastOptions) => {\n const Msg: React.ReactNode = Content ||
Fail!
;\n toast.error(Msg, { autoClose: false, style: { zIndex: Number.MAX_SAFE_INTEGER }, ...options });\n};\n\nexport const PayAttLogOutToast = ({\n ms,\n onClose,\n content,\n type = 'info'\n}: {\n ms?: number;\n onClose: any;\n content?: React.ReactNode;\n type: 'info' | 'warn';\n}) => {\n const Msg: React.ReactNode = content ||
Logga ut!
;\n\n const settings: ToastOptions = {\n autoClose: ms || 10000,\n closeOnClick: false,\n closeButton: false,\n draggable: false,\n onClose,\n pauseOnHover: false,\n pauseOnFocusLoss: false,\n style: { zIndex: Number.MAX_SAFE_INTEGER },\n toastId: LogoutToastId\n };\n if (type === 'info') toast.info(Msg, settings);\n else toast.warning(Msg, settings);\n};\n\nexport const PayAttNoDataToast = (onClose: () => void, Content?: React.ReactNode) => {\n const Msg: React.ReactNode = Content || (\n
\n \n
\n );\n toast.warning(Msg, {\n autoClose: 10000,\n closeOnClick: false,\n closeButton: false,\n onClose,\n pauseOnHover: false,\n pauseOnFocusLoss: false,\n toastId: LogoutToastId\n });\n};\n\nexport const DefaultToastContainer: React.FC = (props): JSX.Element => {\n return ;\n};\n","import { forwardRef } from 'react';\n\nimport Slide from '@mui/material/Slide';\nimport { TransitionProps } from '@mui/material/transitions/transition';\n\nexport const SlideUpTransition = forwardRef(function Transition(\n props: TransitionProps & {\n children: React.ReactElement;\n },\n ref: React.Ref\n) {\n return ;\n});\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { BillingSettingsInterface } from 'store/features/PayAttSettings/handlers';\n\nconst GLOBAL_SETTINGS_ENDPOINT = `${BASE_URL}/PayAttSettings`;\n\n/**\n * Get the raw merchant object from the server\n */\nexport const getBillingSettings = async (): Promise => {\n try {\n const response = await axios.get(`${GLOBAL_SETTINGS_ENDPOINT}/billing`);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n const raw = response.data;\n const billingSettings: BillingSettingsInterface = {\n title: raw.title,\n costPerSMS: raw.costPerSMS\n };\n\n return billingSettings;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { getBillingSettings as getBillingSettingsAPI } from 'api/globalSettings/globalSettingsAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport {\n BillingSettingsInterface,\n BillingSettingsState,\n initialBillingSettingsState\n} from 'store/features/PayAttSettings/handlers';\n\nexport const getBillingSettings = createAsyncThunk(\n '/get/billingSettings',\n async (_, { rejectWithValue }) => {\n try {\n // Get sms suggestions\n const settings: BillingSettingsInterface = await getBillingSettingsAPI();\n return settings; // All suggestions objects in a list\n } catch (error: any) {\n return rejectWithValue(error);\n }\n }\n);\n\nexport const billingSettings = createSlice({\n name: 'billingSettings',\n initialState: initialBillingSettingsState,\n reducers: {\n setBillingSettings: (state, payload: PayloadAction) => {\n return payload.payload;\n }\n },\n extraReducers: (builder) => {\n builder.addCase(getBillingSettings.fulfilled, (_state, action) => {\n return {\n data: action.payload,\n isLoading: false,\n error: undefined\n };\n });\n builder.addCase(getBillingSettings.pending, (state) => {\n return { ...state, isLoading: true };\n });\n builder.addCase(getBillingSettings.rejected, (state, action) => {\n const newState = state;\n if (isPayAttError(action.payload)) {\n newState.error = action.payload as PayAttError;\n newState.isLoading = false;\n return newState;\n }\n\n newState.error = payAttError({ message: 'Unknown error' }, 500);\n newState.isLoading = false;\n return newState;\n });\n }\n});\n\nexport default billingSettings.reducer;\n\nexport const { setBillingSettings } = billingSettings.actions;\n","import { PayAttError } from 'errorHandling/payattError';\n\nexport interface BillingSettingsInterface {\n title: string;\n costPerSMS: number;\n}\n\nexport interface BillingSettingsState {\n data?: BillingSettingsInterface;\n isLoading: boolean;\n error?: PayAttError;\n}\n\nexport const initialBillingSettingsState: BillingSettingsState = {\n data: {\n title: '',\n costPerSMS: 0\n },\n isLoading: false,\n error: undefined\n};\n","import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { authLogin } from 'api/auth/authApi';\nimport { getUserInfo, updateShowIntroSeenAPI } from 'api/user';\nimport { PayAttError, isPayAttError } from 'errorHandling/payattError';\n\nimport {\n AuthError,\n AuthState,\n AuthTokens,\n CurrentUserContact,\n CurrentUserInterface,\n CurrentUserShowIntroductions,\n LoginInfo,\n UpdateUserSettings,\n initialState\n} from './handlers';\n\nexport const login = createAsyncThunk(\n 'auth/login',\n async (user: LoginInfo, { rejectWithValue }) => {\n try {\n if (user.token) {\n const currUser: CurrentUserInterface = await getUserInfo(user.token);\n currUser.jwtToken = user.token;\n currUser.chartToken = user.chartToken;\n\n return currUser;\n }\n\n if (!user.email && !user.username) {\n const authError: AuthError = {\n message: 'Missing username',\n authError: true\n };\n throw authError;\n }\n\n let authData: AuthTokens | undefined;\n\n if (user.email) {\n authData = await authLogin(user.email, user.password, user.skipContractCheck);\n } else if (user.username) {\n authData = await authLogin(user.username, user.password, user.skipContractCheck);\n }\n\n if (!authData?.token) {\n const authError: AuthError = {\n message: 'Unknown error',\n authError: true\n };\n throw authError;\n }\n\n if (authData.contract) {\n return authData; // an object containing contract info and token\n }\n\n const currUser: CurrentUserInterface = await getUserInfo(authData.token);\n\n currUser.jwtToken = authData.token;\n currUser.chartToken = authData.chartToken;\n\n return currUser;\n } catch (error: any) {\n if (isPayAttError(error)) {\n const authError: AuthError = {\n message: error.message,\n authError: true\n };\n return rejectWithValue(authError as AuthError);\n }\n return rejectWithValue(error);\n }\n }\n);\n\nexport const updateUser = createAsyncThunk(\n 'auth/updateUser',\n async (_, { getState, rejectWithValue }) => {\n try {\n const auth = getState() as { auth: AuthState };\n\n const userData = auth.auth;\n if (!userData.isAuth || !userData.currentUser || !userData.currentUser.jwtToken) {\n return rejectWithValue({ message: 'No user details available, please log in', authError: true });\n }\n\n const { username } = userData.currentUser;\n const currUser: CurrentUserInterface = await getUserInfo(username);\n\n currUser.jwtToken = userData.currentUser.jwtToken;\n currUser.chartToken = userData.currentUser.chartToken;\n\n return currUser;\n } catch (error: any) {\n if (isPayAttError(error)) {\n const authError: AuthError = { message: error.message, authError: true };\n\n return rejectWithValue(authError as AuthError);\n }\n return rejectWithValue(error);\n }\n }\n);\n\nexport const updateShowIntro = createAsyncThunk<\n Partial,\n Partial,\n { rejectValue: PayAttError }\n>('auth/markIntroAsSeen', async (introData: Partial, { rejectWithValue }) => {\n try {\n return await updateShowIntroSeenAPI(introData);\n } catch (error: any) {\n return rejectWithValue(error);\n }\n});\n\nexport const authSlice = createSlice({\n name: 'auth',\n initialState,\n reducers: {\n setLoading: (state, payload: PayloadAction) => {\n const newState = state;\n newState.isLoading = payload.payload;\n return newState;\n },\n useRefreshToken: (state, payload: PayloadAction | null>) => {\n const newState = state;\n\n if (newState.currentUser && payload.payload?.chartToken && payload.payload.token) {\n newState.currentUser.jwtToken = payload.payload.token;\n newState.currentUser.chartToken = payload.payload.chartToken;\n }\n\n return newState;\n },\n updateSettings: (state, payload: PayloadAction) => {\n const newState = state;\n if (!newState.currentUser) {\n console.error('Failed to update settings in store, no current user data');\n return state;\n }\n\n Object.keys(payload.payload).forEach((key) => {\n const val = payload.payload[key as keyof UpdateUserSettings];\n\n // Update if the value is anything else than \"undefined\"\n if (val && newState.currentUser) {\n if (key === 'username' || key === 'title') {\n newState.currentUser[key] = val;\n } else {\n newState.currentUser.contact[key as keyof CurrentUserContact] = val;\n }\n }\n });\n\n return newState;\n },\n setLogOut: () => {\n return {\n isAuth: false,\n currentUser: undefined,\n isLoading: false,\n error: { message: '', authError: false }\n };\n },\n setAuthFailed: (state, payload: PayloadAction) => {\n const newState = state;\n newState.error = payload.payload;\n newState.isAuth = false;\n newState.currentUser = undefined;\n return newState;\n },\n showContractGuard: (state, payload: PayloadAction) => {\n return { ...state, contractGuardShown: payload.payload };\n }\n },\n extraReducers: (builder) => {\n // Login\n builder.addCase(login.fulfilled, (state, action) => {\n const newState = state;\n newState.error = { message: '', authError: false };\n\n // @ts-ignore\n if (action.payload.contract) {\n newState.isLoading = true;\n newState.isAuth = false;\n } else {\n newState.currentUser = action.payload as CurrentUserInterface;\n newState.isLoading = false;\n newState.isAuth = true;\n }\n\n return newState;\n });\n builder.addCase(login.pending, (state) => {\n const newState = state;\n newState.isLoading = true;\n return newState;\n });\n builder.addCase(login.rejected, (state, action) => {\n const newState = state;\n if (action.payload && (action.payload as AuthError).authError !== undefined) {\n newState.error = action.payload as AuthError;\n newState.isLoading = false;\n return newState;\n }\n\n newState.error = { message: 'Unknown error', authError: true };\n\n newState.isLoading = false;\n newState.isAuth = false;\n return newState;\n });\n\n // Update user\n builder.addCase(updateUser.fulfilled, (state, action) => {\n const newState = state;\n newState.currentUser = action.payload;\n newState.isLoading = false;\n newState.isAuth = true;\n newState.error = { message: '', authError: false };\n return newState;\n });\n builder.addCase(updateUser.pending, (state) => {\n const newState = state;\n newState.isLoading = true;\n return newState;\n });\n builder.addCase(updateUser.rejected, (state, action) => {\n const newState = state;\n\n if (action.payload && (action.payload as AuthError).authError !== undefined) {\n newState.error = action.payload as AuthError;\n newState.isLoading = false;\n return newState;\n }\n\n newState.error = { message: 'Unknown error', authError: true };\n\n newState.isLoading = false;\n newState.isAuth = false;\n return newState;\n });\n\n // Mark user as seen\n builder.addCase(updateShowIntro.fulfilled, (state, action) => {\n // Should not be possible\n if (!state.currentUser) {\n console.error('Missing current user in redux fulfiller case for user markIntroAsSeen');\n return state;\n }\n\n if (state.currentUser) {\n if (action.payload.dashboard) {\n state.currentUser.showIntroductions.dashboard = action.payload.dashboard;\n }\n\n if (action.payload.homepage) {\n state.currentUser.showIntroductions.homepage = action.payload.homepage;\n }\n\n if (action.payload.intelliSms) {\n state.currentUser.showIntroductions.intelliSms = action.payload.intelliSms;\n }\n }\n\n return state;\n });\n builder.addCase(updateShowIntro.pending, (state) => {\n return { ...state, isLoading: true };\n });\n builder.addCase(updateShowIntro.rejected, (state) => {\n return { ...state, error: { message: 'Failed to mark intro as seen', authError: false } };\n });\n }\n});\n\nexport const { setLogOut, setLoading, setAuthFailed, showContractGuard, updateSettings, useRefreshToken } =\n authSlice.actions;\n\nexport default authSlice.reducer;\n","export interface AuthError {\n message: string;\n authError: boolean;\n}\n\nexport interface LoginInfo {\n username?: string;\n email?: string;\n password: string;\n skipContractCheck?: boolean;\n token?: string;\n chartToken?: string;\n}\n\nexport interface AuthTokens {\n token: string;\n chartToken: string;\n contract?: any;\n}\n\nexport enum UserPermissions {\n admin = 'admin',\n member = 'member',\n guest = 'guest'\n}\n\nexport enum UserRoles {\n admin = 'admin',\n member = 'member',\n guest = 'guest'\n}\n\nexport interface CurrentUserManages {\n merchantId: string; // If specified, the user manages an entire organisation\n permission: UserPermissions;\n}\n\nexport interface CurrentUserContact {\n email: string;\n firstName: string;\n lastName: string;\n countryCode: string;\n country: string;\n phoneNumber: string;\n}\n\nexport interface ShowIntroductionHomepage {\n main: boolean;\n settings: boolean;\n}\n\nexport interface ShowIntroductionIntelliSms {\n newCampaign: boolean;\n calendar: boolean;\n}\n\nexport interface ShowIntroductionDashboard {\n main: boolean;\n}\n\nexport type CurrentUserShowIntroductions = {\n homepage: ShowIntroductionHomepage;\n dashboard: ShowIntroductionDashboard;\n intelliSms: ShowIntroductionIntelliSms;\n};\n\nexport type CurrentUserShowIntroductionKeys = keyof CurrentUserShowIntroductions;\nexport type CurrentUserShowIntroductionSections =\n | keyof ShowIntroductionDashboard\n | keyof ShowIntroductionHomepage\n | keyof ShowIntroductionIntelliSms;\n\nexport interface CurrentUserInterface {\n username: string;\n contact: CurrentUserContact;\n role: UserRoles;\n manages: CurrentUserManages;\n title: string;\n active: boolean;\n jwtToken?: string;\n chartToken?: string;\n readOnly: boolean;\n campaignAllowed: boolean;\n settings: Record; // Custom settings\n lastLogin: Date;\n showIntroductions: CurrentUserShowIntroductions;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface UpdateUserSettings {\n email?: string;\n title?: string;\n firstName?: string;\n lastName?: string;\n countryCode?: string;\n country?: string;\n phoneNumber?: string;\n username?: string;\n}\n\nexport interface AuthState {\n isAuth: boolean;\n currentUser?: CurrentUserInterface;\n isLoading: boolean;\n error: AuthError;\n}\n\nexport const initialState: AuthState = {\n isAuth: false,\n isLoading: false,\n error: { authError: false, message: 'An Error occurred' }\n};\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { getCampaignHistory as getCampaignHistoryAPI } from 'api/campaign/campaignAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\n\nimport {\n CampaignHistoryPerVenueInterface,\n CampaignHistoryState,\n initialState\n} from './handlers/handlerCampaignHistory';\n\nexport const getCampaignHistory = createAsyncThunk<\n CampaignHistoryPerVenueInterface,\n void,\n { rejectValue: PayAttError | Error }\n>('get/campaignHistory', async (_, { rejectWithValue }) => {\n try {\n const historyAllVenues = await getCampaignHistoryAPI();\n\n return historyAllVenues;\n } catch (error: any) {\n return rejectWithValue(error);\n }\n});\n\nexport const campaignHistory = createSlice({\n name: 'campaignHistory',\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n // Add reducers for additional action types here, and handle loading state as needed\n builder.addCase(getCampaignHistory.fulfilled, (state, action) => {\n let newState: CampaignHistoryState = state;\n newState = {\n data: action.payload,\n done: true,\n loading: false,\n error: payAttError({ message: '' }, -1)\n };\n return newState;\n });\n builder.addCase(getCampaignHistory.pending, (state) => {\n const newState: CampaignHistoryState = state;\n newState.loading = true;\n return newState;\n });\n builder.addCase(getCampaignHistory.rejected, (state, action) => {\n const newState: CampaignHistoryState = state;\n\n if (isPayAttError(action.payload)) newState.error = action.payload;\n else newState.error = payAttError({ message: 'Unknown error' }, 500);\n\n newState.done = false;\n newState.loading = false;\n return newState;\n });\n }\n});\n\nexport default campaignHistory.reducer;\n","import { PayAttError, payAttError } from 'errorHandling/payattError';\n\nexport interface CampaignHistoryObjectInterface {\n smsSenderName: string;\n timestamp: string;\n messageText: string;\n recipients: number;\n newCustomers: number;\n senderUsername: string;\n venueId: string;\n}\n\nexport interface CampaignHistoryPerVenueInterface {\n [key: string]: CampaignHistoryObjectInterface[];\n}\n\nexport interface CampaignHistoryState {\n loading: boolean;\n done: boolean;\n error: PayAttError;\n data: CampaignHistoryPerVenueInterface;\n}\n\nexport const initialState: CampaignHistoryState = {\n loading: false,\n done: false,\n error: payAttError({ message: '' }, -1),\n data: {}\n};\n\nexport default initialState;\n","import { PayloadAction, createSlice } from '@reduxjs/toolkit';\n\nimport { RGBAToHexA } from 'views/Management/settings/VenueSettings/helpers/scanColor';\n\nimport { initialState } from './handlers';\n\nexport const colorPicker = createSlice({\n name: 'colorPicker',\n initialState,\n reducers: {\n cycleColors: (store, action: PayloadAction) => {\n const hexColor = action.payload.startsWith('#') ? action.payload : RGBAToHexA(action.payload);\n const storedHexColors = store.lastUsedColors.map((c) => (c.startsWith('#') ? c : RGBAToHexA(c)));\n\n if (!storedHexColors.includes(hexColor)) {\n store.lastUsedColors.pop();\n store.lastUsedColors.unshift(action.payload);\n }\n\n return store;\n },\n resetColors: () => {\n return initialState;\n }\n }\n});\n\nexport default colorPicker.reducer;\n\nexport const { cycleColors, resetColors } = colorPicker.actions;\n","export interface ColorPickerProps {\n lastUsedColors: string[];\n}\n\nexport const initialState: ColorPickerProps = {\n lastUsedColors: [\n 'rgba(33,150,243,1)',\n 'rgba(3,169,244,1)',\n 'rgba(0,188,212,1)',\n 'rgba(0,150,136,1)',\n 'rgba(76,175,80,1)',\n 'rgba(139,195,74,1)',\n 'rgba(205,220,57,1)',\n 'rgba(255,235,59,1)',\n 'rgba(255,193,7,1)',\n 'rgba(255,152,0,1)'\n ]\n};\n","/* eslint-disable no-underscore-dangle */\nimport { payAttError } from 'errorHandling/payattError';\nimport { DashboardDoc, DashboardDocs } from 'store/features/dashboard/handlers';\nimport { DashboardItemLayout } from 'views/Dashboard/Interfaces/Dashboard.layout';\n\nimport { DashboardDocsRaw } from './interface';\n\nconst dateTimeReviver = (_key: any, value: any) => {\n if (typeof value === 'string' && /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/.test(value)) {\n const date = new Date(value);\n if (date) return date;\n }\n\n return value;\n};\n\nexport const parseResponse = (dataRaw: DashboardDocsRaw): DashboardDocs => {\n if (!Array.isArray(dataRaw)) throw payAttError({ message: 'Response data is not an array' }, 400);\n return dataRaw.map((doc): DashboardDoc => {\n return {\n ...doc,\n id: doc._id,\n layout: doc.layout.map((el) => {\n if (el.filter) return { ...el, filter: JSON.parse(el.filter, dateTimeReviver) };\n return el as DashboardItemLayout;\n }),\n breakpoint: doc.breakpoint\n };\n });\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { payAttError } from 'errorHandling/payattError';\nimport { PayAttSuccess, payAttSuccess } from 'errorHandling/payattSuccess';\nimport {\n CreateDashboardProps,\n DashboardDoc,\n DashboardDocs,\n DeleteDashboardProps,\n UpdateDashboardDefault,\n UpdateDashboardName,\n UpdateDashboardProps\n} from 'store/features/dashboard/handlers';\nimport { DashboardBreakpoint } from 'views/Dashboard/Interfaces/Dashboard.breakpoints';\nimport { DashboardLayout } from 'views/Dashboard/Interfaces/Dashboard.layout';\n\nimport { parseResponse } from './dashboardAPI.parseResponse';\nimport { DashboardDocsRaw } from './interface';\n\nconst DASHBOARD_ENDPOINT = `${BASE_URL}/dashboards`;\n\nconst stringifyFilter = (layout: DashboardLayout) => {\n return layout.map((el: any) => {\n if (el.filter) return { ...el, filter: JSON.stringify(el.filter) };\n\n return { ...el };\n });\n};\n\nexport const getAllHomepageAPI = async (): Promise => {\n try {\n const response = await axios.get(`${DASHBOARD_ENDPOINT}/homepage`);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n const dataRaw = response.data as DashboardDocsRaw;\n\n if (!Array.isArray(dataRaw)) throw payAttError({ message: 'Response data is not an array' }, 400);\n return parseResponse(dataRaw);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const getAllDashboardAPI = async (): Promise => {\n try {\n const response = await axios.get(DASHBOARD_ENDPOINT);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n const dataRaw = response.data as DashboardDocsRaw;\n\n if (!Array.isArray(dataRaw)) throw payAttError({ message: 'Response data is not an array' }, 400);\n return parseResponse(dataRaw);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const updateDashboardAPI = async (params: UpdateDashboardProps): Promise => {\n try {\n const reqParams = { ...params };\n\n if (reqParams.layout) reqParams.layout = stringifyFilter(reqParams.layout);\n\n const response = await axios.patch(`${DASHBOARD_ENDPOINT}/${params.id}`, reqParams);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n return payAttSuccess(response.data, response.status);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const updateDashboardDefaultAPI = async (params: UpdateDashboardDefault): Promise => {\n try {\n const response = await axios.patch(`${DASHBOARD_ENDPOINT}/default/${params.id}`);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n return payAttSuccess(response.data, response.status);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const updateDashboardNameAPI = async (params: UpdateDashboardName): Promise => {\n try {\n const response = await axios.patch(`${DASHBOARD_ENDPOINT}/${params.id}`, { name: params.name });\n\n if (response.data && response.status >= 200 && response.status < 300) {\n return payAttSuccess(response.data, response.status);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const createNewDashboardAPI = async (params: CreateDashboardProps): Promise => {\n const reqParams = { ...params };\n\n if (reqParams.layout) reqParams.layout = stringifyFilter(reqParams.layout);\n\n try {\n const response = await axios.post(DASHBOARD_ENDPOINT, reqParams);\n\n if (\n response.status >= 200 &&\n response.status < 300 &&\n response.data &&\n response.data.dashboard &&\n response.data.dashboard.id\n ) {\n return response.data.dashboard as DashboardDoc;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const createDefaultDashboardAPI = async (breakpoint: DashboardBreakpoint): Promise => {\n try {\n const response = await axios.post(`${DASHBOARD_ENDPOINT}/createDefault`, { breakpoint });\n\n if (\n response.status >= 200 &&\n response.status < 300 &&\n response.data &&\n response.data.dashboard &&\n response.data.dashboard.id\n ) {\n return response.data.dashboard as DashboardDoc;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport const deleteDashboardAPI = async (params: DeleteDashboardProps): Promise => {\n try {\n const response = await axios.delete(`${DASHBOARD_ENDPOINT}/${params.id}`);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n return payAttSuccess(response.data, response.status);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { createAsyncThunk } from '@reduxjs/toolkit';\n\nimport {\n createDefaultDashboardAPI,\n createNewDashboardAPI,\n deleteDashboardAPI,\n getAllDashboardAPI,\n getAllHomepageAPI,\n updateDashboardAPI,\n updateDashboardDefaultAPI,\n updateDashboardNameAPI\n} from 'api/dashboard/dashboardAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport { PayAttSuccess, payAttSuccess } from 'errorHandling/payattSuccess';\nimport { DashboardBreakpoint } from 'views/Dashboard/Interfaces/Dashboard.breakpoints';\n\nimport {\n CreateDashboardProps,\n DashboardDoc,\n DashboardDocs,\n DashboardLayoutRedux,\n DeleteDashboardProps,\n UpdateDashboardDefault,\n UpdateDashboardName,\n UpdateDashboardProps\n} from './handlers';\nimport { NO_CHANGES, dashboardUpdateHasDiff } from './helpers';\n\nexport const getHomepageDashboards = createAsyncThunk(\n 'get/homepageLayouts',\n async (_, { rejectWithValue }) => {\n try {\n return await getAllHomepageAPI();\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const getDashboard = createAsyncThunk(\n 'get/dashboardLayouts',\n async (_, { rejectWithValue }) => {\n try {\n const dashboards = await getAllDashboardAPI();\n\n return dashboards;\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const updateDashboard = createAsyncThunk(\n 'update/dashboardLayouts',\n async (props: UpdateDashboardProps, { rejectWithValue, getState }) => {\n try {\n const dashboardState: DashboardLayoutRedux = (getState() as any).dashboardLayouts;\n if (dashboardUpdateHasDiff({ props, dashboardState })) {\n return await updateDashboardAPI(props);\n }\n\n return payAttSuccess({ message: NO_CHANGES }, 200);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const updateDashboardName = createAsyncThunk(\n 'update/dashboardName',\n async (props: UpdateDashboardName, { rejectWithValue, getState }) => {\n try {\n const dashboardState: DashboardLayoutRedux = (getState() as any).dashboardLayouts;\n if (dashboardUpdateHasDiff({ props, dashboardState })) {\n return await updateDashboardNameAPI(props);\n }\n\n return payAttSuccess({ message: NO_CHANGES }, 200);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const updateDashboardDefault = createAsyncThunk<\n PayAttSuccess,\n UpdateDashboardDefault,\n { rejectValue: PayAttError }\n>('update/dashboardDefault', async (props: UpdateDashboardDefault, { rejectWithValue }) => {\n try {\n return await updateDashboardDefaultAPI(props);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n});\n\nexport const createDashboard = createAsyncThunk(\n 'create/dashboard',\n async (props: CreateDashboardProps, { rejectWithValue }) => {\n try {\n return await createNewDashboardAPI(props);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const createDefaultDashboard = createAsyncThunk(\n 'create/defaultDashboard',\n async (breakpoint: DashboardBreakpoint, { rejectWithValue }) => {\n try {\n return await createDefaultDashboardAPI(breakpoint);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n\nexport const deleteDashboard = createAsyncThunk(\n 'delete/dashboard',\n async (props: DeleteDashboardProps, { rejectWithValue }) => {\n try {\n return await deleteDashboardAPI(props);\n } catch (error) {\n if (isPayAttError(error)) return rejectWithValue(error);\n return rejectWithValue(payAttError({ message: 'Unknown error' }, 500));\n }\n }\n);\n","import { PayloadAction, createSlice } from '@reduxjs/toolkit';\n\nimport { extraReducersDashboard, extraReducersHomepage } from './extraReducers';\nimport {\n BackgroundImageMap,\n BackgroundImageType,\n initialState,\n initialStateDashboardBackgroundImage,\n initialStateHomepage\n} from './handlers';\n\nexport const dashboardLayouts = createSlice({\n name: 'dashboardLayouts',\n initialState,\n reducers: {},\n extraReducers: extraReducersDashboard\n});\nexport const dashboardLayoutSlice = dashboardLayouts.reducer;\n\nexport const dashboardHomepageLayouts = createSlice({\n name: 'dashboardHomepageLayouts',\n initialState: initialStateHomepage,\n reducers: {},\n extraReducers: extraReducersHomepage\n});\nexport const dashboardHomepageLayoutSlice = dashboardHomepageLayouts.reducer;\n\nexport const dashboardBackgroundImage = createSlice({\n name: 'dashboardBackgroundImage',\n initialState: initialStateDashboardBackgroundImage,\n reducers: {\n setBackgroundImage: (_, payload: PayloadAction<{ name: BackgroundImageType }>) => {\n const { name } = payload.payload;\n return { name, url: BackgroundImageMap.get(name) };\n }\n }\n});\nexport const dashboardBackgroundImageSlice = dashboardBackgroundImage.reducer;\nexport const { setBackgroundImage } = dashboardBackgroundImage.actions;\n","import { ActionReducerMapBuilder } from '@reduxjs/toolkit';\n\nimport { isPayAttError, payAttError } from 'errorHandling/payattError';\n\nimport {\n createDashboard,\n createDefaultDashboard,\n deleteDashboard,\n getDashboard,\n getHomepageDashboards,\n updateDashboard,\n updateDashboardDefault,\n updateDashboardName\n} from './actions';\nimport { DashboardDocs, DashboardLayoutRedux } from './handlers';\nimport { NO_CHANGES } from './helpers';\n\nconst GetDashboardReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(getDashboard.pending, (state) => ({ ...state, isLoading: true }));\n builder.addCase(getDashboard.rejected, (state, action) => {\n if (action.payload && isPayAttError(action.payload)) {\n return { ...state, error: action.payload, isLoading: false };\n }\n\n return { ...state, error: payAttError({ message: 'Unknown error' }, 500), isLoading: false };\n });\n builder.addCase(getDashboard.fulfilled, (state, action) => ({\n data: action.payload,\n isLoading: false,\n error: undefined\n }));\n};\n\nconst UpdateDashboardReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(updateDashboard.pending, (state) => ({ ...state, isLoading: true }));\n builder.addCase(updateDashboard.rejected, (state, action) => {\n if (action.payload && isPayAttError(action.payload)) {\n return { ...state, error: action.payload, isLoading: false };\n }\n\n return { ...state, error: payAttError({ message: 'Unknown error' }, 500), isLoading: false };\n });\n builder.addCase(updateDashboard.fulfilled, (state, action) => {\n if (action.payload.status < 200 || action.payload.status >= 300) return state;\n if (action.payload.message === NO_CHANGES) return state;\n\n const argData = action.meta.arg;\n\n const dashboardId = argData.id;\n\n const updatedDashboard = state.data.find((el) => el.id === dashboardId);\n\n if (!updatedDashboard) {\n console.error(\n 'Could not find dashboard layout in store, BE and FE may have inconsistencies. Please log out and back in.'\n );\n\n return { ...state, isLoading: false, error: undefined };\n }\n\n const newState = { ...state };\n\n newState.data = state.data.map((el) => {\n if (el.id === dashboardId) {\n let { name, layout, breakpoint } = el;\n\n if (argData.name) name = argData.name;\n if (argData.layout) layout = argData.layout;\n if (argData.breakpoint) breakpoint = argData.breakpoint;\n\n return { ...el, name, layout, breakpoint };\n }\n return { ...el };\n });\n\n return { ...newState, isLoading: false, error: undefined };\n });\n};\n\nconst UpdateDashboardNameReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(updateDashboardName.fulfilled, (state, action) => {\n if (action.payload.status < 200 || action.payload.status >= 300) return state;\n if (action.payload.message === NO_CHANGES) return state;\n\n const argData = action.meta.arg;\n const dashboardId = argData.id;\n\n const newState = { ...state };\n newState.data = state.data.map((el) => {\n if (el.id === dashboardId) {\n return { ...el, name: argData.name };\n }\n\n return el;\n });\n\n return { ...newState, isLoading: false, error: undefined };\n });\n};\n\nconst CreateDashboardReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(createDashboard.rejected, (state, action) => {\n return { ...state, error: action.payload };\n });\n builder.addCase(createDashboard.fulfilled, (state, action) => {\n const dashboard = action.payload;\n\n return { data: [...state.data, dashboard], isLoading: false, error: undefined };\n });\n};\n\nconst UpdateDashboardLayoutReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(updateDashboardDefault.fulfilled, (state, action) => {\n const argData = action.meta.arg;\n const { id } = argData;\n\n const newState = { ...state };\n newState.data = state.data.map((el) => ({ ...el, default: el.id === id }));\n\n return { ...newState, isLoading: false, error: undefined };\n });\n};\n\nconst DeleteDashboardReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(deleteDashboard.pending, (state) => ({ ...state, isLoading: true }));\n builder.addCase(deleteDashboard.rejected, (state, action) => {\n if (action.payload && isPayAttError(action.payload)) {\n return { ...state, error: action.payload, isLoading: false };\n }\n\n return { ...state, error: payAttError({ message: 'Unknown error' }, 500), isLoading: false };\n });\n builder.addCase(deleteDashboard.fulfilled, (state, action) => {\n const argData = action.meta.arg;\n const { id } = argData;\n\n const newState = { ...state };\n const newData: DashboardDocs = [];\n newState.data.forEach((el) => {\n if (el.id !== id) newData.push(el);\n });\n newState.data = newData;\n\n return { ...newState, isLoading: false, error: undefined };\n });\n};\n\nconst CreateDefaultDashboardReducers = (builder: ActionReducerMapBuilder) => {\n builder.addCase(createDefaultDashboard.pending, (state) => ({ ...state, isLoading: true }));\n builder.addCase(createDefaultDashboard.rejected, (state, action) => {\n if (action.payload && isPayAttError(action.payload)) {\n return { ...state, error: action.payload, isLoading: false };\n }\n\n return { ...state, error: payAttError({ message: 'Unknown error' }, 500), isLoading: false };\n });\n builder.addCase(createDefaultDashboard.fulfilled, (state, action) => {\n return { data: [...state.data, action.payload], isLoading: false, error: undefined };\n });\n};\n\nexport const extraReducersDashboard = (builder: ActionReducerMapBuilder) => {\n CreateDashboardReducers(builder);\n CreateDefaultDashboardReducers(builder);\n GetDashboardReducers(builder);\n UpdateDashboardReducers(builder);\n UpdateDashboardNameReducers(builder);\n UpdateDashboardLayoutReducers(builder);\n DeleteDashboardReducers(builder);\n};\n\nexport const extraReducersHomepage = (builder: ActionReducerMapBuilder) => {\n builder.addCase(getHomepageDashboards.pending, (state) => ({ ...state, isLoading: true }));\n builder.addCase(getHomepageDashboards.rejected, (state, action) => {\n if (action.payload && isPayAttError(action.payload)) {\n return { ...state, error: action.payload, isLoading: false };\n }\n\n return { ...state, error: payAttError({ message: 'Unknown error' }, 500), isLoading: false };\n });\n builder.addCase(getHomepageDashboards.fulfilled, (state, action) => ({\n data: action.payload,\n isLoading: false,\n error: undefined\n }));\n};\n","import { PayAttError } from 'errorHandling/payattError';\nimport { DashboardBreakpoint } from 'views/Dashboard/Interfaces/Dashboard.breakpoints';\nimport { DashboardLayout } from 'views/Dashboard/Interfaces/Dashboard.layout';\n\nexport type DashboardName = string;\n\nexport type DashboardDoc = {\n id: string;\n name: DashboardName;\n layout: DashboardLayout;\n default?: boolean;\n breakpoint: DashboardBreakpoint;\n};\nexport type DashboardDocs = DashboardDoc[];\n\nexport type UpdateDashboardProps = Partial & { id: string };\nexport type UpdateDashboardName = Pick;\nexport type UpdateDashboardDefault = { id: string };\nexport type CreateDashboardProps = { name: string; breakpoint: DashboardBreakpoint; layout?: DashboardLayout };\nexport type DeleteDashboardProps = { id: string };\n\nexport interface DashboardLayoutRedux {\n data: DashboardDocs;\n isLoading: boolean;\n error: PayAttError | undefined;\n}\n\nexport interface UpdateDashboardContainsDiffProps {\n props: UpdateDashboardProps;\n dashboardState: DashboardLayoutRedux;\n}\n\nexport const initialState: DashboardLayoutRedux = {\n data: [],\n isLoading: false,\n error: undefined\n};\n\nexport const initialStateHomepage: DashboardLayoutRedux = {\n data: [],\n isLoading: false,\n error: undefined\n};\n\n// ##### Background image\n\nexport const BackgroundImages = {\n hide: 'hide',\n store: 'store',\n flowers: 'flowers',\n desk1: 'desk1',\n desk2: 'desk2',\n display: 'display'\n} as const;\n\nexport type BackgroundImageType = keyof typeof BackgroundImages;\n\nconst imagePrefix = '/static/images/homepage';\n\nexport const BackgroundImageMap = new Map([\n [BackgroundImages.hide, undefined],\n [BackgroundImages.store, `${imagePrefix}/Blurred-store.webp`],\n [BackgroundImages.flowers, `${imagePrefix}/Blurred-flowers.webp`],\n [BackgroundImages.desk1, `${imagePrefix}/Blurred-cashier-desk.webp`],\n [BackgroundImages.desk2, `${imagePrefix}/Blurred-cashier-desk2.webp`],\n [BackgroundImages.display, `${imagePrefix}/Blurred-black-and-white-display.webp`]\n]);\n\nexport const DEFAULT_BACKGROUND_IMAGE = BackgroundImages.flowers;\nexport const DEFAULT_BACKGROUND_IMAGE_URL = BackgroundImageMap.get(DEFAULT_BACKGROUND_IMAGE);\n\nexport interface DashboardBackgroundImageRedux {\n name: BackgroundImageType;\n url: string | undefined; // Undefined means \"no background\"\n}\n\nexport const initialStateDashboardBackgroundImage: DashboardBackgroundImageRedux = {\n name: DEFAULT_BACKGROUND_IMAGE,\n url: DEFAULT_BACKGROUND_IMAGE_URL\n};\n","import { payAttError } from 'errorHandling/payattError';\n\nimport { UpdateDashboardContainsDiffProps } from './handlers';\n\nexport const NO_CHANGES = 'No changes';\n\nexport const dashboardUpdateHasDiff = ({ dashboardState, props }: UpdateDashboardContainsDiffProps) => {\n const storeDashboard = dashboardState.data.find((el) => el.id === props.id);\n\n if (!storeDashboard) throw payAttError({ message: 'Dashboard not found' }, 400);\n\n // TODO: Check if objects are DEEPLY equal (may contain arrays of objects, obj order in arrays should not matter)\n if (props.layout) return true;\n\n if (props.name && storeDashboard.name !== props.name) return true;\n\n if (props.breakpoint && storeDashboard.breakpoint !== props.breakpoint) return true;\n\n return false;\n};\n","import { ColorRGB } from 'api/venues/handlers';\nimport { PayAttError, payAttError } from 'errorHandling/payattError';\nimport { VenueCategories } from 'store/features/venueCategories/handlers';\n\nexport enum VenuePermissions {\n admin = 'admin',\n member = 'member',\n guest = 'guest'\n}\n\nexport interface ContractStructure {\n signed: boolean;\n hasToBeSignedBefore: Date;\n userContractSignUrl: string;\n ourContractSignUrl: string;\n zignedAgreementId: string;\n}\n\nexport interface BonusSmsPoolStructure {\n id: string;\n expirationTime: Date | string;\n smsReceived: number;\n smsLeft: number;\n createdAt: Date | string;\n}\n\nexport interface ISubscription {\n stampCardPwa: boolean;\n stampCardAnalytics: boolean;\n}\n\nexport interface MerchantInterface {\n id: string;\n campaignAllowed: boolean;\n merchantTitle: string;\n companyName: string;\n active: boolean;\n venues: VenuesInterface[];\n monthlySMSAllowance: number;\n smsRemaining: number;\n bonusSmsPool: BonusSmsPoolStructure[];\n bonusSmsPoolCount: number;\n PayAttAdmin: boolean;\n smsTextSettings: {\n removeWelcomeSMSEnding: boolean;\n removeStampCardRewardSMSEnding: boolean;\n removeStampCardWelcomeSMSEnding: boolean;\n };\n merchantSubscription?: ISubscription;\n contract?: ContractStructure;\n costPerSMS?: number;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n}\n\nexport interface POSAPIInterface {\n esApiKeys?: {\n machine_id: string;\n machine_key: string;\n };\n onslipApiKeys?: {\n hawk_id: string;\n hawk_key: string;\n };\n}\n\nexport interface POSInterface extends POSAPIInterface {\n id: string;\n headerText: string;\n subheaderText: string;\n newCustomerMessage: string;\n returningCustomerMessage: string;\n scanColor: ColorRGB;\n POSSystem: string;\n name: string;\n showQR?: boolean;\n permanentScanScreen?: boolean;\n venueId: string;\n disabledAt?: Date | string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n}\n\nexport const POSSystems = {\n ESKassa: 'ES',\n Onslip: 'onslip',\n Zettle: 'Zettle',\n None: 'none'\n} as const;\n\nexport type POSSystemEnumValues = (typeof POSSystems)[keyof typeof POSSystems];\nexport type POSPaymentProviders = Exclude;\n\nexport type Product = { name: string; id: string; group: string };\n\ntype POSId = string;\n\nexport type VenueProductsGroups = Record, Record>;\n\nexport interface VenuesInterface {\n id: string;\n campaignAllowed: boolean;\n venueTitle: string;\n officialName: string;\n merchantId: string;\n category: VenueCategories;\n venueCategory: string;\n POS: POSInterface[];\n sentSMSTotal: number;\n smsSenderName: string;\n welcomeSMS: string;\n permission: VenuePermissions;\n code: string;\n lastUpdatedBy: string;\n createdAt?: Date | string;\n updatedAt?: Date | string;\n disabledAt?: Date | string;\n products?: VenueProductsGroups;\n}\n\nexport interface UpdateVenueSettings {\n venueId: string;\n welcomeSMS?: string;\n}\n\nexport interface MerchantState extends MerchantInterface {\n isLoading: boolean;\n error: PayAttError;\n}\n\nconst InitialMerchantState: MerchantState = {\n id: '',\n active: false,\n merchantTitle: '',\n companyName: '',\n venues: [],\n campaignAllowed: false,\n monthlySMSAllowance: 0,\n smsRemaining: 0,\n bonusSmsPool: [],\n bonusSmsPoolCount: 0,\n PayAttAdmin: false,\n smsTextSettings: {\n removeStampCardRewardSMSEnding: false,\n removeWelcomeSMSEnding: false,\n removeStampCardWelcomeSMSEnding: false\n },\n isLoading: false,\n error: payAttError({ message: '' }, -1),\n createdAt: undefined,\n updatedAt: undefined\n};\nexport default InitialMerchantState;\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { extractVenueFromResponse } from 'api/venues/venuesAPI';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { BonusSmsPoolStructure, MerchantInterface, VenuesInterface } from 'store/features/merchantAndVenues/handlers';\n\nconst MERCHANT_ENDPOINT = `${BASE_URL}/merchants`;\n\nconst extractMerchantFromResponse = (raw: any): MerchantInterface => {\n try {\n if (!raw.merchant) {\n // Should never happen\n console.error('Merchant object is invalid');\n return {\n id: '',\n active: false,\n merchantTitle: '',\n companyName: '',\n campaignAllowed: false,\n smsRemaining: 0,\n bonusSmsPool: [],\n bonusSmsPoolCount: 0,\n monthlySMSAllowance: 0,\n PayAttAdmin: false,\n venues: raw.venues?.map((rawVenue: any) => extractVenueFromResponse(rawVenue)) || [],\n smsTextSettings: {\n removeStampCardRewardSMSEnding: false,\n removeWelcomeSMSEnding: false,\n removeStampCardWelcomeSMSEnding: false\n }\n };\n }\n\n // Sanity check, filter away all sms pool elements that have expired (also done in BE)\n const bonusSmsPool = (\n raw.merchant.bonusSmsPool as (BonusSmsPoolStructure & {\n _id: string;\n })[]\n ).filter(\n (el) =>\n typeof el.expirationTime === 'undefined' || new Date(el.expirationTime).getTime() > new Date().getTime()\n );\n\n const data: MerchantInterface = {\n id: raw.merchant.id,\n createdAt: raw.merchant.createdAt,\n updatedAt: raw.merchant.updatedAt,\n PayAttAdmin: raw.merchant.PayAttAdmin,\n active: raw.merchant.active,\n merchantTitle: raw.merchant.merchantTitle,\n companyName: raw.merchant.companyName,\n campaignAllowed: raw.merchant.campaignAllowed || false,\n smsRemaining: raw.merchant.smsRemaining,\n bonusSmsPool: bonusSmsPool.map((el) => ({\n ...el,\n // eslint-disable-next-line no-underscore-dangle\n id: el._id\n })),\n bonusSmsPoolCount: bonusSmsPool.reduce((sum, el) => sum + el.smsLeft, 0),\n monthlySMSAllowance: raw.merchant.monthlySMSAllowance,\n contract: raw.merchant.contract,\n venues: raw.venues\n .map((rawVenue: any) => extractVenueFromResponse(rawVenue))\n .sort((a: VenuesInterface, b: VenuesInterface) =>\n a.venueTitle.localeCompare(b.venueTitle, 'en', {\n numeric: true\n })\n ),\n smsTextSettings: {\n removeStampCardWelcomeSMSEnding:\n raw.merchant?.smsTextSettings?.removeStampCardWelcomeSMSEnding || false,\n removeStampCardRewardSMSEnding: raw.merchant?.smsTextSettings?.removeStampCardRewardSMSEnding || false,\n removeWelcomeSMSEnding: raw.merchant?.smsTextSettings?.removeWelcomeSMSEnding || false\n },\n merchantSubscription: raw.merchantSubscription\n };\n\n if (raw.merchant.costPerSMS) data.costPerSMS = raw.merchant.costPerSMS;\n\n return data;\n } catch (error) {\n console.error('Failed to extract merchant from response', raw);\n throw error;\n }\n};\n\n/**\n * Get the raw merchant object from the server\n */\nexport const getMerchant = async (): Promise => {\n try {\n const response = await axios.get(MERCHANT_ENDPOINT);\n\n if (response.data && response.status >= 200 && response.status < 300) {\n // Create merchant object from response\n return extractMerchantFromResponse(response.data);\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { getMerchant as getMerchantAPI } from 'api/merchant/merchantAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport { CurrentUserInterface } from 'store/features/auth/handlers';\n\nimport InitialMerchantState, {\n MerchantInterface,\n UpdateVenueSettings,\n VenuePermissions,\n VenuesInterface\n} from './handlers';\n\ninterface SetVenuePermissionInterface {\n venueId: string;\n permission: VenuePermissions;\n}\n\ninterface RemoveVenueInterface {\n id: string;\n}\n\n/**\n * Get the merchant object and all associated venues from backend.\n * If the user does not manage a merchant, we create a \"dummy\" merchant object and fetch\n * all venues from the user. If user manages both venues and merchant, we combine both in ONE\n * merchant object. Whether a venue comes from the merchant or user list of venues, can be\n * distinguished by checking the the 'combinationMerchantVenue' object and the state of 'CurrentUser'.\n *\n * Default for PayAtt customers is to manage only a single merchant object.\n */\nexport const getMerchant = createAsyncThunk<\n MerchantInterface,\n CurrentUserInterface,\n { rejectValue: PayAttError | Error }\n>('get/merchant', async (user: CurrentUserInterface, { rejectWithValue }) => {\n try {\n // If user does not manage any merchant, create dummy object\n let merchant: MerchantInterface = {\n id: '-1', // Indicates that this is a dummy merchant\n // Use the username and the user registration in the merchant object\n merchantTitle: user.username,\n companyName: user.username,\n active: false,\n campaignAllowed: false,\n venues: [],\n monthlySMSAllowance: 0,\n smsRemaining: 0,\n bonusSmsPool: [],\n bonusSmsPoolCount: 0,\n PayAttAdmin: false,\n smsTextSettings: {\n removeStampCardRewardSMSEnding: false,\n removeWelcomeSMSEnding: false,\n removeStampCardWelcomeSMSEnding: false\n }\n };\n\n // ========= User manages merchant =========\n if (user.manages.merchantId) {\n merchant = await getMerchantAPI();\n }\n\n return merchant;\n } catch (error: any) {\n return rejectWithValue(error);\n }\n});\n\nexport const merchant = createSlice({\n name: 'merchant',\n initialState: InitialMerchantState,\n reducers: {\n setMerchant: (_state, payload: PayloadAction) => {\n return {\n ...payload.payload,\n isLoading: false,\n error: payAttError({ message: '' }, -1)\n };\n },\n updateVenueSettings: (state, payload: PayloadAction) => {\n const data = payload.payload;\n const venueIndex = state.venues.findIndex((ven) => ven.id === data.venueId);\n if (venueIndex === -1) {\n console.error('Failed to update venue in store, venue not found');\n return state;\n }\n const newState = state;\n\n const newVenue = state.venues[venueIndex];\n\n if (data.welcomeSMS) {\n newVenue.welcomeSMS = data.welcomeSMS;\n }\n\n newState.venues[venueIndex] = newVenue;\n return newState;\n },\n addVenue: (state, payload: PayloadAction) => {\n state.venues.push(payload.payload);\n return state;\n },\n removeVenue: (state, payload: PayloadAction) => {\n const newState = state;\n // Value of payload should be the ID of the venue to remove\n newState.venues = state.venues.filter((venue) => venue.id !== payload.payload.id);\n return newState;\n },\n setVenuePermission: (state, payload: PayloadAction) => {\n const newState = state;\n newState.venues = state.venues.map((venue) =>\n venue.id === payload.payload.venueId ? { ...venue, permission: payload.payload.permission } : venue\n );\n return newState;\n },\n resetVenue: (state) => {\n const newState = state;\n newState.venues = [];\n return state;\n }\n },\n extraReducers: (builder) => {\n // Add reducers for additional action types here, and handle loading state as needed\n builder.addCase(getMerchant.fulfilled, (state, action) => {\n let newState = state;\n newState = {\n ...action.payload,\n isLoading: false,\n error: payAttError({ message: '' }, -1)\n };\n return newState;\n });\n builder.addCase(getMerchant.pending, (state) => {\n const newState = state;\n newState.isLoading = true;\n return newState;\n });\n builder.addCase(getMerchant.rejected, (state, action) => {\n const newState = state;\n\n if (isPayAttError(action.payload)) newState.error = action.payload;\n else newState.error = payAttError({ message: 'Unknown error' }, 500);\n\n newState.isLoading = false;\n\n return newState;\n });\n }\n});\n\nexport default merchant.reducer;\n\nexport const { setMerchant, addVenue, removeVenue, setVenuePermission, resetVenue, updateVenueSettings } =\n merchant.actions;\n","import { VenueCategories } from 'store/features/venueCategories/handlers';\nimport { asEnum } from 'utils/utils';\n\nexport const getVenueCategoryWithSpellingCheck = (categoryRaw: string): VenueCategories => {\n let category: VenueCategories = VenueCategories.Default;\n try {\n category = asEnum(VenueCategories, categoryRaw as any);\n } catch (err) {\n // Value not found in enum\n }\n if (category !== VenueCategories.Default) {\n return category;\n }\n\n // It could be a 'undefined' category, or we didn't manage to parse it, try different word combinations\n const barRestaurantOptions = ['bar/restaurant', 'bar/restaurang', 'restaurang/bar', 'restaurant/bar'];\n const indianRestaurantOptions = [\n 'indianrestaurant',\n 'restaurantindian',\n 'indiskrestaurant',\n 'restaurantindisk',\n 'indiskrestaurang',\n 'restaurangindisk'\n ];\n\n const flowerStoreOptions = [\n 'blomsterhandel',\n 'blombutik',\n 'flowerstore',\n 'blommor',\n 'flower store',\n 'flower venue'\n ];\n\n const petStoreOptions = [\n 'petstore',\n 'pet store',\n 'djurbutik',\n 'djur',\n 'hundbutik',\n 'dogstore',\n 'dog store',\n 'catstore',\n 'cat store',\n 'djur butik',\n 'animalstore',\n 'animal store',\n 'animal',\n 'hund',\n 'hund butik',\n 'hundbutik',\n 'katt',\n 'katt butik',\n 'kattbutik'\n ];\n\n const italianRestaurantOptions = [\n 'italienskrestaurang',\n 'italiensk restaurang',\n 'italiensk',\n 'italien',\n 'italian restaurant',\n 'italian',\n 'italian cafe'\n ];\n\n const icecreamShopOptions = [\n 'glassbutik',\n 'glass butik',\n 'glass',\n 'icecream store',\n 'icecreamstore',\n 'icecreamshop',\n 'icecream shop'\n ];\n\n const foodTruckHealthyFoodOptions = [\n 'food truck',\n 'food truck - healthy food',\n 'food truck healthy food',\n 'food truck - hälsosam mat',\n 'food truck - hälsa',\n 'foodtruck'\n ];\n\n const wineImporterOptions = [\n 'wine importer',\n 'wineimporter',\n 'wine-importer',\n 'vin importör',\n 'vinimportör',\n 'vin-importör',\n 'vin'\n ];\n\n const barberOptions = [\n 'barber',\n 'barbershop',\n 'barber shop',\n 'barber - hairdresser',\n 'hairdresser/barber',\n 'hairdresser - barber',\n 'hairdresser / barber',\n 'frisör/barber',\n 'frisör - barber',\n 'frisör / barber'\n ];\n\n const hairdresserOptions = ['frisör', 'hairdresser'];\n\n const hairdresserBeautyOptions = [\n 'hairdresser beauty',\n 'hairdresser-beauty',\n 'hairdresser/beauty',\n 'hairdresser - beauty',\n 'hairdresser / beauty',\n 'beauty hairdresser',\n 'hairdresser spa',\n 'frisör beauty',\n 'frisör-beauty',\n 'frisör/beauty',\n 'frisör - beauty',\n 'frisör / beauty',\n 'beauty frisör',\n 'frisör spa'\n ];\n\n const cafeOptions = ['cafe'];\n const cafeBagelOptions = ['cafe/bagel', 'bagel/cafe', 'bagel'];\n const restaurantOptions = ['restaurant', 'restaurang'];\n const fishStoreOptions = ['fiskbutik', 'fishstore', 'fish', 'seafood'];\n const meatStoreOptions = ['köttbutik', 'meatstore', 'meat'];\n const yarnStoreOptions = ['garnbutik', 'yarnstore', 'yarn'];\n const hamburgerStoreOptions = ['burger restaurant', 'burgarrestaurang', 'burgare', 'hamburger', 'hamburgare'];\n\n const DeliStoreOptions = ['delibutik'];\n const CandyStoreOptions = ['godisbutik', 'godis', 'candy', 'candystore', 'sweets'];\n const FastFoodGrillOptions = ['fastfood', 'fastfood/grill', 'snabbmat', 'snabbmat/grill'];\n const HealthyStoreOptions = ['hälsokost-butik', 'health', 'hälsokost', 'hälsa'];\n const ClothingStoreOptions = ['klädbutik', 'clothing store', 'kläder', 'clothes'];\n const LifestyleOptions = ['lifestyle/inredning', 'lifestyle', 'livsstil'];\n const BeautySalonOptions = ['skönhetsalong', 'skönhetssalong', 'beauty', 'beauty salon'];\n const SushiRestaurantOptions = [\n 'sushi/japansk restaurang',\n 'japan',\n 'japansk',\n 'japansk restaurang',\n 'sushi',\n 'sushi restaurang',\n 'sushi bar',\n 'japanese food',\n 'japanese restaurant',\n 'sushi restaurant'\n ];\n\n const OtherOptions = ['other', 'annat'];\n\n const categoryLow = categoryRaw.toLowerCase();\n switch (true) {\n case barRestaurantOptions.includes(categoryLow):\n return VenueCategories.BarRestaurant;\n case indianRestaurantOptions.includes(categoryLow):\n return VenueCategories.BarRestaurant;\n case hamburgerStoreOptions.includes(categoryLow):\n return VenueCategories.BurgerRestaurant;\n case flowerStoreOptions.includes(categoryLow):\n return VenueCategories.FlowerShop;\n case petStoreOptions.includes(categoryLow):\n return VenueCategories.PetStore;\n case restaurantOptions.includes(categoryLow):\n return VenueCategories.Restaurant;\n case cafeOptions.includes(categoryLow):\n return VenueCategories.Cafe;\n case cafeBagelOptions.includes(categoryLow):\n return VenueCategories.BagelCafe;\n case fishStoreOptions.includes(categoryLow):\n return VenueCategories.FishStore;\n case meatStoreOptions.includes(categoryLow):\n return VenueCategories.MeatStore;\n case yarnStoreOptions.includes(categoryLow):\n return VenueCategories.YarnStore;\n case DeliStoreOptions.includes(categoryLow):\n return VenueCategories.DeliStore;\n case CandyStoreOptions.includes(categoryLow):\n return VenueCategories.CandyStore;\n case FastFoodGrillOptions.includes(categoryLow):\n return VenueCategories.FastFoodGrill;\n case HealthyStoreOptions.includes(categoryLow):\n return VenueCategories.HealthyStore;\n case ClothingStoreOptions.includes(categoryLow):\n return VenueCategories.ClothingStore;\n case LifestyleOptions.includes(categoryLow):\n return VenueCategories.Lifestyle;\n case BeautySalonOptions.includes(categoryLow):\n return VenueCategories.BeautySalon;\n case SushiRestaurantOptions.includes(categoryLow):\n return VenueCategories.SushiRestaurant;\n case wineImporterOptions.includes(categoryLow):\n return VenueCategories.WineImporter;\n case foodTruckHealthyFoodOptions.includes(categoryLow):\n return VenueCategories.FoodTruckHealthyFood;\n case icecreamShopOptions.includes(categoryLow):\n return VenueCategories.IcecreamShop;\n case italianRestaurantOptions.includes(categoryLow):\n return VenueCategories.ItalianRestaurant;\n case barberOptions.includes(categoryLow):\n return VenueCategories.Barber;\n case hairdresserOptions.includes(categoryLow):\n return VenueCategories.Hairdresser;\n case hairdresserBeautyOptions.includes(categoryLow):\n return VenueCategories.HairdresserBeauty;\n case OtherOptions.includes(categoryLow):\n return VenueCategories.Other;\n default:\n return VenueCategories.Default;\n }\n};\n","import { SingleNotification } from 'views/Navigation/Header/Buttons/Notifications/notifications.interfaces';\n\nexport interface NotificationsState extends SingleNotification {\n showNotification: boolean;\n shouldRefreshNotificationsCenter: boolean;\n lastChecked: string;\n}\n\nconst emptyText = { title: '', body: '' };\n\nexport const initialNotificationsState: NotificationsState = {\n shouldRefreshNotificationsCenter: false,\n lastChecked: '',\n showNotification: false,\n type: 'successToast',\n text: { en: emptyText, se: emptyText },\n richText: { en: emptyText, se: emptyText }\n};\n","import { PayloadAction, createSlice } from '@reduxjs/toolkit';\n\nimport { SingleNotification } from 'views/Navigation/Header/Buttons/Notifications/notifications.interfaces';\n\nimport { initialNotificationsState } from './handlers';\n\nexport const notificationsSlice = createSlice({\n name: 'notifications',\n initialState: initialNotificationsState,\n reducers: {\n setShowNotification: (state, payload: PayloadAction) => {\n const newState = state;\n newState.showNotification = payload.payload;\n return newState;\n },\n setNotificationLastChecked(state, payload: PayloadAction) {\n const newState = state;\n newState.lastChecked = payload.payload;\n return newState;\n },\n setNotificationState(state, payload: PayloadAction) {\n const newState = state;\n newState.text = payload.payload.text;\n newState.type = payload.payload.type;\n return newState;\n },\n setShouldRefreshNotificationCenter(state, payload: PayloadAction) {\n const newState = state;\n newState.shouldRefreshNotificationsCenter = payload.payload;\n return newState;\n }\n }\n});\n\nexport const {\n setShowNotification,\n setNotificationState,\n setNotificationLastChecked,\n setShouldRefreshNotificationCenter\n} = notificationsSlice.actions;\n\nexport default notificationsSlice.reducer;\n","import { DisplayViews, View } from 'builder/constants/types';\n\nexport interface RegistrationDisplayViews {\n id: string;\n selectedViewValue: string;\n selectedViewName: View;\n builderStartSessionState: string;\n viewName: string;\n}\n\nexport const initialState: RegistrationDisplayViews = {\n id: '',\n selectedViewValue: '',\n selectedViewName: DisplayViews.numPadView,\n builderStartSessionState: '',\n viewName: ''\n};\n","import { PayloadAction, createSlice } from '@reduxjs/toolkit';\n\nimport { RegistrationDisplayViews, initialState } from './handlers';\n\nexport const registationDisplayViews = createSlice({\n name: 'registationDisplayViews',\n initialState,\n reducers: {\n setregistationDisplayViews: (_, action: PayloadAction) => {\n return action.payload;\n },\n setInitialBuilderState: (_state, action: PayloadAction) => {\n return { ..._state, builderStartSessionState: action.payload };\n }\n }\n});\n\nexport default registationDisplayViews.reducer;\n\nexport const { setregistationDisplayViews, setInitialBuilderState } = registationDisplayViews.actions;\n","import { PayAttError, payAttError } from 'errorHandling/payattError';\n\nexport interface VenueStatsInterface {\n venueTitle: string;\n venueId: string;\n totalCustomerRegistrations: number;\n totalCustomers: number;\n totalReturningCustomers: number;\n unregisteredCustomers: number;\n totalOwners: number;\n}\n\nexport interface AllRegistrationStats {\n registrationsPerVenue: {\n isLoading: boolean;\n isDone: boolean;\n error: PayAttError;\n data: VenueStatsInterface[];\n };\n}\n\nexport const initialState: AllRegistrationStats = {\n registrationsPerVenue: {\n isLoading: false,\n isDone: false,\n error: payAttError({ message: '' }, -1),\n data: []\n }\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError } from 'errorHandling/handleResponse';\nimport { payAttError } from 'errorHandling/payattError';\nimport { VenuesInterface } from 'store/features/merchantAndVenues/handlers';\nimport { VenueStatsInterface } from 'store/features/registrations/handlers';\n\nconst STATS_ENDPOINT = `${BASE_URL}/stats`;\n\nconst extractStatsFromResponse = (data: any, venue: VenuesInterface): VenueStatsInterface => {\n const k: VenueStatsInterface = {\n venueTitle: venue.venueTitle,\n venueId: venue.id,\n totalCustomerRegistrations: data.totalCustomerRegistrations,\n totalCustomers: data.totalCustomers,\n totalReturningCustomers: data.totalReturningCustomers,\n unregisteredCustomers: data.unregisteredCustomers,\n totalOwners: data.totalOwners\n };\n return k;\n};\n\nexport const getRegistrationPerVenue = async (venues: VenuesInterface[]): Promise => {\n try {\n const allStats: VenueStatsInterface[] = [];\n\n const res = await axios.post(\n `${STATS_ENDPOINT}`,\n { venueIds: venues.map((venue) => venue.id) },\n { headers: { 'Content-Type': 'application/json' } }\n );\n\n if ([401, 424].includes(res.status)) return [];\n\n if (res.status >= 200 && res.status < 300 && res.data) {\n for (let i = 0; i < res.data.length; i += 1) {\n const data = res.data[i];\n\n const venueFromResponse = venues.find((el) => el.id === data?.venueId);\n if (!venueFromResponse) throw payAttError({ message: 'venueId missing in response' }, 400);\n\n allStats.push(extractStatsFromResponse(data, venueFromResponse));\n }\n\n return allStats;\n }\n\n throw payAttError({ message: 'Failed to fetch stats' }, 400);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { endUserSession } from 'api/auth/authApi';\nimport { getRegistrationPerVenue } from 'api/stats/registrationStatisticsAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport { PayAttNoDataToast } from 'generalComponents/Toasts/Toasts';\nimport { VenuesInterface } from 'store/features/merchantAndVenues/handlers';\nimport { saveLogoutState } from 'store/localStorageState';\n\nimport { setLogOut } from '../auth/authSlice';\nimport { VenueStatsInterface, initialState } from './handlers';\n\nexport const getRegistrationsPerVenue = createAsyncThunk<\n { registrationsPerVenue: VenueStatsInterface[] },\n VenuesInterface[],\n { rejectValue: PayAttError | Error }\n>('/get/registrationsPerVenue', async (venues: VenuesInterface[], { rejectWithValue, dispatch, getState }) => {\n try {\n const registrations: VenueStatsInterface[] = await getRegistrationPerVenue(venues);\n return { registrationsPerVenue: registrations };\n } catch (error: any) {\n PayAttNoDataToast(() => {\n endUserSession();\n saveLogoutState(getState());\n dispatch(setLogOut());\n window.location.reload();\n });\n\n return rejectWithValue(error);\n }\n});\n\nexport const registrations = createSlice({\n name: 'registrations',\n initialState,\n reducers: {\n addRegistrationStats: (state, payload: PayloadAction) => {\n // Check if venue exists already\n const newState = state;\n if (\n newState.registrationsPerVenue.data.filter((val) => payload.payload.venueId === val.venueId).length ===\n 0\n ) {\n newState.registrationsPerVenue.data.push(payload.payload);\n newState.registrationsPerVenue.error = payAttError({ message: '' }, -1);\n newState.registrationsPerVenue.isDone = true;\n newState.registrationsPerVenue.isLoading = false;\n }\n return newState;\n },\n resetRegistrations: () => initialState\n },\n extraReducers: (builder) => {\n builder.addCase(getRegistrationsPerVenue.fulfilled, (state, action) => {\n const newState = state;\n newState.registrationsPerVenue.isLoading = false;\n newState.registrationsPerVenue.isDone = true;\n newState.registrationsPerVenue.data = action.payload.registrationsPerVenue;\n newState.registrationsPerVenue.error = payAttError({ message: '' }, -1);\n return newState;\n });\n builder.addCase(getRegistrationsPerVenue.pending, (state) => {\n const newState = state;\n newState.registrationsPerVenue.isLoading = true;\n newState.registrationsPerVenue.isDone = false;\n newState.registrationsPerVenue.error = payAttError({ message: '' }, -1);\n return newState;\n });\n builder.addCase(getRegistrationsPerVenue.rejected, (state, action) => {\n const newState = state;\n\n newState.registrationsPerVenue.error = isPayAttError(action.payload)\n ? action.payload\n : payAttError({ message: 'Unknown error' }, 500);\n\n newState.registrationsPerVenue.data = [];\n newState.registrationsPerVenue.isLoading = false;\n newState.registrationsPerVenue.isDone = false;\n return newState;\n });\n }\n});\n\nexport default registrations.reducer;\n\nexport const { addRegistrationStats, resetRegistrations } = registrations.actions;\n","import { PayAttError } from 'errorHandling/payattError';\nimport { IStampCardCampaign } from 'views/StampCardPage/stampCardPage.interfaces';\n\nenum StampCardCampaignDataKeys {\n uniqueCampaigns = 'uniqueCampaigns'\n}\n\nexport type StampCardCampaignStoreData = {\n -readonly [key in keyof typeof StampCardCampaignDataKeys]?: IStampCardCampaign[];\n} & {\n [key: string]: IStampCardCampaign[];\n};\n\nexport interface StampCardCampaignsStore {\n data: StampCardCampaignStoreData;\n isLoading: boolean;\n error: PayAttError | undefined;\n}\n\nexport const initialState: StampCardCampaignsStore = {\n data: {},\n isLoading: true,\n error: undefined\n};\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport { getAllCampaignsAPI } from 'api/stampCards/Form/getAllCampaignsAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport { MerchantInterface } from 'store/features/merchantAndVenues/handlers';\nimport { sortStampCardCampaigns } from 'utils/utils';\nimport { IStampCardCampaign } from 'views/StampCardPage/stampCardPage.interfaces';\n\nimport { StampCardCampaignStoreData, initialState } from './handlers';\n\nexport const getStampCardCampaigns = createAsyncThunk<\n StampCardCampaignStoreData,\n MerchantInterface,\n { rejectValue: PayAttError | Error }\n>('/get/stampCardCampaigns', async (merchant: MerchantInterface, { rejectWithValue }) => {\n try {\n const campObj: StampCardCampaignStoreData = {};\n const uniqueCamps: IStampCardCampaign[] = [];\n\n merchant.venues.forEach((venue) => {\n campObj[venue.id] = [];\n });\n\n const campaignsArr = sortStampCardCampaigns(await getAllCampaignsAPI());\n\n campaignsArr.forEach((campaign) => {\n const campaignExist = uniqueCamps.find((campInList) => campInList.id === campaign.id);\n\n if (!campaignExist) {\n uniqueCamps.push(campaign);\n }\n });\n\n uniqueCamps.forEach((campaign) => {\n campaign.POSIds.forEach((posId) => {\n const venueId = merchant.venues.find((venue) => venue.POS.find((pos) => pos.id === posId));\n\n if (venueId) {\n const alreadyPresent = campObj[venueId.id].find((camp) => camp.id === campaign.id);\n\n if (!alreadyPresent) campObj[venueId.id].push(campaign);\n }\n });\n });\n\n campObj.uniqueCampaigns = uniqueCamps;\n\n return campObj;\n } catch (error: any) {\n return rejectWithValue(error);\n }\n});\n\nexport const stampCardCampaigns = createSlice({\n name: 'stampCardCampaigns',\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder.addCase(getStampCardCampaigns.fulfilled, (_state, action) => {\n return {\n data: action.payload,\n isLoading: false,\n error: undefined\n } as any;\n });\n builder.addCase(getStampCardCampaigns.pending, (state) => {\n return { ...state, isLoading: true };\n });\n builder.addCase(getStampCardCampaigns.rejected, (state, action) => {\n const newState = state;\n\n newState.error = isPayAttError(action.payload)\n ? action.payload\n : payAttError({ message: 'Unknown error' }, 500);\n\n newState.isLoading = false;\n return newState;\n });\n }\n});\n\nexport default stampCardCampaigns.reducer;\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError } from 'errorHandling/handleResponse';\nimport { IStampCardCampaign } from 'views/StampCardPage/stampCardPage.interfaces';\n\nexport const getAllCampaignsAPI = async () => {\n try {\n return (await axios.get(`${BASE_URL}/stamp-cards/`)).data;\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n","import { PayAttError } from 'errorHandling/payattError';\n\nexport enum VenueCategories {\n Pizzeria = 'Pizzeria',\n Bar = 'Bar',\n BarRestaurant = 'BarRestaurant',\n Restaurant = 'Restaurant',\n ThaiRestaurant = 'ThaiRestaurant',\n IndianRestaurant = 'IndianRestaurant',\n BurgerRestaurant = 'BurgerRestaurant',\n ItalianRestaurant = 'ItalianRestaurant',\n SushiRestaurant = 'SushiRestaurant',\n FlowerShop = 'FlowerShop',\n PetStore = 'PetStore',\n Cafe = 'Cafe',\n BagelCafe = 'BagelCafe',\n FishStore = 'FishStore',\n MeatStore = 'MeatStore',\n YarnStore = 'YarnStore',\n DeliStore = 'DeliStore',\n FastFoodGrill = 'FastFoodGrill',\n CandyStore = 'CandyStore',\n HealthyStore = 'HealthyStore',\n ClothingStore = 'ClothingStore',\n Lifestyle = 'Lifestyle',\n BeautySalon = 'BeautySalon',\n IcecreamShop = 'IcecreamShop',\n FoodTruckHealthyFood = 'FoodTruckHealthyFood',\n WineImporter = 'WineImporter',\n Hairdresser = 'Hairdresser',\n HairdresserBeauty = 'HairdresserBeauty',\n Barber = 'Barber',\n Other = 'Other',\n Default = 'Default'\n}\n\nexport interface venueCategoryInterface {\n category: VenueCategories;\n}\n\nexport interface venueCategoriesInterface {\n venueCategories: venueCategoryInterface[];\n isLoading: boolean;\n error: PayAttError | undefined;\n}\n\nexport const initialState: venueCategoriesInterface = {\n venueCategories: [],\n isLoading: false,\n error: undefined\n};\n","import axios from 'axios';\n\nimport { BASE_URL } from 'api/helper';\nimport { handleAxiosError, handleAxiosInvalidResponse } from 'errorHandling/handleResponse';\nimport { MerchantInterface } from 'store/features/merchantAndVenues/handlers';\nimport { getVenueCategoryWithSpellingCheck } from 'store/features/merchantAndVenues/venueCategorySpellCheck';\nimport { venueCategoryInterface } from 'store/features/venueCategories/handlers';\n\nconst API_ENDPOINT = `${BASE_URL}/venue-categories`;\n\nconst extractSmsSuggestion = (venueCategoriesRaw: any): venueCategoryInterface => {\n try {\n return { category: getVenueCategoryWithSpellingCheck(venueCategoriesRaw.category) };\n } catch (error) {\n console.error(`Failed to extract sms suggestions from response ${venueCategoriesRaw}`);\n throw error;\n }\n};\n\n/**\n * Fetch SMS suggestions for all user managed Venues\n * @returns {array} - SMS suggestions for all managed venues\n */\nconst getVenueCategories = async (merchant: MerchantInterface): Promise => {\n try {\n const response = await axios.get(API_ENDPOINT, {\n headers: { 'Content-Type': 'application/json' },\n params: { merchantId: merchant.id }\n });\n\n if (response.status >= 200 && response.status < 300) {\n const smsResult: venueCategoryInterface[] = response.data.map(extractSmsSuggestion);\n\n return smsResult;\n }\n\n throw handleAxiosInvalidResponse(response);\n } catch (error) {\n throw handleAxiosError(error);\n }\n};\n\nexport default getVenueCategories;\n","import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';\n\nimport getSmsSuggestionAPI from 'api/venueCategories/venueCategoriesAPI';\nimport { PayAttError, isPayAttError, payAttError } from 'errorHandling/payattError';\nimport { MerchantInterface } from 'store/features/merchantAndVenues/handlers';\n\nimport { initialState, venueCategoryInterface } from './handlers';\n\nexport const getVenueCategories = createAsyncThunk<\n venueCategoryInterface[],\n MerchantInterface,\n { rejectValue: PayAttError | Error }\n>('/get/venueCategories', async (merchant: MerchantInterface, { rejectWithValue }) => {\n try {\n // Get sms suggestions\n const suggestions: venueCategoryInterface[] = await getSmsSuggestionAPI(merchant);\n return suggestions; // All suggestions objects in a list\n } catch (error: any) {\n return rejectWithValue(error);\n }\n});\n\nexport const venueCategories = createSlice({\n name: 'venueCategories',\n initialState,\n reducers: {\n setVenueCategories: (_state, action: PayloadAction) => {\n return {\n venueCategories: action.payload,\n isLoading: false,\n error: undefined\n };\n },\n addVenueCategory: (state, action: PayloadAction) => {\n state.venueCategories.push(action.payload);\n return state;\n },\n deleteAllSmsSuggestions: (state) => {\n return { ...state, smsSuggestions: [] };\n }\n },\n extraReducers: (builder) => {\n builder.addCase(getVenueCategories.fulfilled, (_state, action) => {\n return {\n venueCategories: action.payload,\n isLoading: false,\n error: undefined\n };\n });\n\n builder.addCase(getVenueCategories.pending, (state) => {\n return { ...state, isLoading: true };\n });\n\n builder.addCase(getVenueCategories.rejected, (state, action) => {\n const newState = state;\n\n newState.error = isPayAttError(action.payload)\n ? action.payload\n : payAttError({ message: 'Unknown error' }, 500);\n\n newState.isLoading = false;\n return newState;\n });\n }\n});\n\nexport default venueCategories.reducer;\n\nexport const { setVenueCategories, addVenueCategory, deleteAllSmsSuggestions } = venueCategories.actions;\n","import { AsyncThunkPayload } from 'store/handlers';\n\nimport { BackgroundImageMap, BackgroundImages } from './features/dashboard/handlers';\n\nconst validDashboardBackgroundImage = (state: any): boolean => {\n if (!state) return false;\n\n const data = state.dashboardBackgroundImage;\n\n if (!data) return false;\n\n const { name, url } = data;\n if (!Object.keys(BackgroundImages).includes(name)) return false;\n if (BackgroundImageMap.get(name) !== url) return false;\n\n return true;\n};\n\nexport const getPersistedState = (state: any) => {\n const data: any = {};\n if (state && state.colorPicker) data.colorPicker = state.colorPicker;\n if (state && state.dashboardBackgroundImage && validDashboardBackgroundImage(state))\n data.dashboardBackgroundImage = state.dashboardBackgroundImage;\n if (state && state.i18n?.locale) data.i18n = { locale: state.i18n.locale, translations: {} };\n\n return data;\n};\n\nexport const loadState = (): any | undefined => {\n try {\n const serializedState = localStorage.getItem('state');\n\n if (serializedState === null) {\n return undefined;\n }\n\n return JSON.parse(serializedState);\n } catch (error) {\n return undefined;\n }\n};\n\nexport const saveState = (state: any) => {\n try {\n const serializedState = JSON.stringify(state);\n localStorage.setItem('state', serializedState);\n } catch (error) {\n // Ignore write errors.\n }\n};\n\nexport const saveLogoutState = (state: any) => saveState(getPersistedState(state));\n\nexport const saveAsyncThunkPayload = (payload: AsyncThunkPayload) => {\n try {\n const serializedItem = JSON.stringify(payload);\n localStorage.setItem(payload.name, serializedItem);\n } catch (error) {\n console.info(`Failed to store ${payload.name} to local storage`);\n throw new Error(`Failed to store ${payload.name} to local storage`);\n }\n};\n\nexport const loadAsyncThunkPayload = (name: string): AsyncThunkPayload | undefined => {\n try {\n const serializedState = localStorage.getItem(name);\n\n if (serializedState === null) {\n return undefined;\n }\n\n return JSON.parse(serializedState);\n } catch (error) {\n return undefined;\n }\n};\n","// All selectors\nimport { enGB, sv } from 'date-fns/locale';\n\nimport { payAttError } from 'errorHandling/payattError';\nimport { BillingSettingsState } from 'store/features/PayAttSettings/handlers';\nimport { AuthState, CurrentUserInterface } from 'store/features/auth/handlers';\nimport { MerchantInterface, VenuesInterface } from 'store/features/merchantAndVenues/handlers';\nimport { VenueStatsInterface } from 'store/features/registrations/handlers';\nimport {\n VenueCategories,\n venueCategoriesInterface,\n venueCategoryInterface\n} from 'store/features/venueCategories/handlers';\nimport { RootState } from 'store/store.exports';\nimport {\n sortStampCardCampaigns,\n stampCardCampaignIsDisabled,\n stampCardCampaignIsExpired,\n stampCardCampaignIsNotActivated\n} from 'utils/utils';\nimport { DashboardLayout } from 'views/Dashboard/Interfaces/Dashboard.layout';\nimport { SingleNotification } from 'views/Navigation/Header/Buttons/Notifications/notifications.interfaces';\nimport { IStampCardCampaign } from 'views/StampCardPage/stampCardPage.interfaces';\n\nimport { RegistrationDisplayViews } from './features/registationDisplayViews/handlers';\n\nexport const localeSelector = (state: RootState): string =>\n JSON.stringify(state.i18n).split('locale\":\"')[1].split('\"')[0];\n\nexport const localeDateFnsSelector = (state: RootState): Locale => {\n const locale = JSON.stringify(state.i18n).split('locale\":\"')[1].split('\"')[0];\n\n switch (locale.toLowerCase()) {\n case 'en':\n return enGB;\n case 'se':\n default:\n return sv;\n }\n};\n\nexport const venueCategorySelector = (state: RootState): venueCategoriesInterface => state.venueCategories;\n\nexport const colorPickerLastUsedColorsSelector = (state: RootState): string[] => state.colorPicker.lastUsedColors;\n\nexport const regitrationDisplayViewsSelector = (state: RootState): RegistrationDisplayViews =>\n state.registrationDisplayViews;\n\nexport const venueCategoryByCategorySelector = (\n state: RootState,\n category: VenueCategories\n): venueCategoryInterface | null => {\n const val = state.venueCategories.venueCategories.filter((suggestion) => suggestion.category === category);\n if (val.length > 0) {\n return val[0];\n }\n return null;\n};\n\n// Authenticated user, token, state (loading/done) and the current user\nexport const authSelector = (state: RootState): AuthState => state.auth;\n\n// The currently logged in user\nexport const currentUserSelector = (state: RootState): CurrentUserInterface | undefined => state.auth.currentUser;\n\n// Global PayAtt settings\nexport const billingSettingsSelector = (state: RootState): BillingSettingsState => state.billingSettings;\n\n/**\n * Get the merchant of the user. If a user manages both a merchant and a list of venues in backend,\n * the merchant state in Redux will contain *all* managed venues in the merchant object.\n *\n * The flag \"combinationMerchantVenue\" indicates if the merchant object includes the combined venues of a user\n */\nexport const merchantSelector = (state: RootState): MerchantInterface => state.merchant;\n\n// All user managed venues\nexport const venuesSelector = (state: RootState): VenuesInterface[] => state.merchant.venues;\n\nexport const showNotificationSelector = (state: RootState): boolean => state.notifications.showNotification;\n\nexport const getCurrentNotificationSelector = (state: RootState): SingleNotification => state.notifications;\n\nexport const getNotificationLastCheckedSelector = (state: RootState): string => state.notifications.lastChecked;\n\nexport const venueSelector = ({\n state,\n venueTitle,\n venueId\n}: {\n state: RootState;\n venueTitle?: string;\n venueId?: string;\n}): VenuesInterface | undefined => {\n if (!venueTitle && !venueId) {\n console.info(\"Provide either a 'name' or 'venueId' to select a specific venue\");\n if (process.env.NODE_ENV === 'development') console.trace();\n return undefined;\n }\n const venue = state.merchant.venues.find((val) => val.venueTitle === venueTitle || val.id === venueId);\n\n return venue;\n};\n\n// Registration statistics, for each Venue\nexport const allVenueRegistrationStats = (state: RootState) => state.registrations.registrationsPerVenue;\n\n// Registration statistics for a specified venue\nexport const RegistrationsStatsPerVenueSelector = ({\n state,\n venue,\n venueId\n}: {\n state: RootState;\n venue?: VenuesInterface;\n venueId?: string;\n}): VenueStatsInterface | undefined => {\n if (!venue && !venueId) {\n console.error('Must provide either venue or venueId');\n return undefined;\n }\n\n const venueRegistrations = state.registrations.registrationsPerVenue.data.find(\n (el) => el.venueId === venue?.id || el.venueId === venueId\n );\n\n if (venueRegistrations) return venueRegistrations;\n\n return undefined;\n};\n\n// CampaignHistory\nexport const campaignHistorySelector = (state: RootState) => state.campaignHistory;\n\nexport const stampCardSubscriptionSelector = (state: RootState) => state.merchant.venues.map((el) => el.id);\n\n// Stamp Card\nexport const stampCardsSelector = ({\n state,\n includeDisabled = true,\n includeExpired = true,\n includeNotActivated = true,\n includeFuture = true\n}: {\n state: RootState;\n includeDisabled?: boolean;\n includeNotActivated?: boolean;\n includeExpired?: boolean;\n includeFuture?: boolean;\n}) => {\n const { uniqueCampaigns } = state.stampCardCampaigns.data;\n let allCamps = (typeof uniqueCampaigns === 'object' && Object.values(uniqueCampaigns)) || [];\n\n const timeNow = new Date().getTime();\n\n allCamps = allCamps.filter((camp) => {\n if (!includeFuture && new Date(camp.startDate).getTime() > timeNow) {\n return false;\n }\n\n if (!includeExpired && stampCardCampaignIsExpired(camp)) return false;\n\n if (!includeNotActivated && stampCardCampaignIsNotActivated(camp)) return false;\n\n if (!includeDisabled && stampCardCampaignIsDisabled(camp)) return false;\n\n return true;\n });\n\n // Sort active first, then not activated, then disabled, and last expired\n return sortStampCardCampaigns(allCamps);\n};\n\nexport const stampCardByIdSelector = (state: RootState, campaignId: string): IStampCardCampaign | undefined => {\n const { uniqueCampaigns } = state.stampCardCampaigns.data;\n const camp = uniqueCampaigns?.find((el) => el.id === campaignId);\n\n return camp;\n};\n\nexport const stampCardsPerVenue = ({\n state,\n venueInput,\n venueId\n}: {\n state: RootState;\n venueInput?: VenuesInterface;\n venueId?: string;\n}): IStampCardCampaign[] | undefined => {\n const stampCards = state.stampCardCampaigns.data;\n\n const venue = venueInput || venueSelector({ state, venueId });\n\n if (!venue) return undefined;\n\n return stampCards[venue.id];\n};\n\nexport const allDashboardsSelector = (state: RootState) => state.dashboardLayouts;\n\nexport const dashboardSelector = ({\n state,\n dashboardId,\n dashboardName\n}: {\n state: RootState;\n dashboardId?: string;\n dashboardName?: string;\n}): DashboardLayout => {\n const { data } = state.dashboardLayouts;\n\n const dashboardLayout = data.find((el) => (dashboardId ? el.id === dashboardId : el.name === dashboardName));\n\n if (!dashboardLayout)\n throw payAttError({ message: `Could not find dashboard layout ${{ dashboardId, dashboardName }}` }, 500);\n\n return dashboardLayout.layout;\n};\n\nexport const homepageLayoutSelector = (state: RootState) => state.homepageLayouts;\n\nexport const dashboardBackgroundImageSelector = (state: RootState) => state.dashboardBackgroundImage;\n\nexport const introductionSelector = (state: RootState) => {\n if (!state.auth.currentUser) throw new Error('User missing in redux, perhaps he/she is not logged in');\n\n return state.auth.currentUser.showIntroductions;\n};\n\nexport const subscriptionSelector = (state: RootState) => {\n return state.merchant.merchantSubscription;\n};\n","import { i18nReducer, loadTranslations, syncTranslationWithStore } from 'react-redux-i18n';\n\nimport { combineReducers, configureStore } from '@reduxjs/toolkit';\n\nimport billingSettingsReducer from 'store/features/PayAttSettings/billingSettingsSlice';\nimport { initialBillingSettingsState } from 'store/features/PayAttSettings/handlers';\nimport authReducer from 'store/features/auth/authSlice';\nimport { initialState as initialAuthState } from 'store/features/auth/handlers';\nimport campaignHistorySlice from 'store/features/campaigns/campaignHistorySlice';\nimport { initialState as initialStateCampaignHistory } from 'store/features/campaigns/handlers/handlerCampaignHistory';\nimport { initialState as initialStateColorPicker } from 'store/features/colorPicker/handlers';\nimport {\n dashboardBackgroundImageSlice,\n dashboardHomepageLayoutSlice,\n dashboardLayoutSlice\n} from 'store/features/dashboard/dashboardSlice';\nimport {\n initialStateDashboardBackgroundImage,\n initialState as initialStateDashboardLayouts,\n initialStateHomepage\n} from 'store/features/dashboard/handlers';\nimport InitialMerchantState from 'store/features/merchantAndVenues/handlers';\nimport merchantReducer from 'store/features/merchantAndVenues/merchantSlice';\nimport notificationsReducer from 'store/features/notifications/notificationsSlice';\nimport { initialState as initialStateRegistrationDisplayViews } from 'store/features/registationDisplayViews/handlers';\nimport { initialState as initialRegistrationState } from 'store/features/registrations/handlers';\nimport registrationSlice from 'store/features/registrations/registrationSlice';\nimport { initialState as initialStateStampCardCampaigns } from 'store/features/stampCardCampaigns/handlers';\nimport stampCardCampaignsSlice from 'store/features/stampCardCampaigns/stampCardFormSlice';\nimport { initialState as initialVenueCategoryState } from 'store/features/venueCategories/handlers';\nimport venueCategoriesReducer from 'store/features/venueCategories/venueCategorySlice';\nimport translations from 'translations/translations';\n\nimport colorPickerSlice from './features/colorPicker/colorPickerSlice';\nimport { initialNotificationsState } from './features/notifications/handlers';\nimport registationDisplayViewsSlice from './features/registationDisplayViews/registationDisplayViewsSlice';\nimport { getPersistedState, loadState, saveState } from './localStorageState';\n\nconst initialState = {\n auth: initialAuthState,\n notifications: initialNotificationsState,\n i18n: {\n translations: {},\n locale: 'se'\n },\n venueCategories: initialVenueCategoryState,\n billingSettings: initialBillingSettingsState,\n merchant: InitialMerchantState,\n registrations: initialRegistrationState,\n campaignHistory: initialStateCampaignHistory,\n stampCardCampaigns: initialStateStampCardCampaigns,\n registrationDisplayViews: initialStateRegistrationDisplayViews,\n colorPicker: initialStateColorPicker,\n dashboardLayouts: initialStateDashboardLayouts,\n homepageLayouts: initialStateHomepage,\n dashboardBackgroundImage: initialStateDashboardBackgroundImage\n};\n\nconst combinedReducer = combineReducers({\n auth: authReducer,\n notifications: notificationsReducer,\n i18n: i18nReducer,\n venueCategories: venueCategoriesReducer,\n billingSettings: billingSettingsReducer,\n merchant: merchantReducer,\n registrations: registrationSlice,\n campaignHistory: campaignHistorySlice,\n stampCardCampaigns: stampCardCampaignsSlice,\n registrationDisplayViews: registationDisplayViewsSlice,\n colorPicker: colorPickerSlice,\n dashboardLayouts: dashboardLayoutSlice,\n homepageLayouts: dashboardHomepageLayoutSlice,\n dashboardBackgroundImage: dashboardBackgroundImageSlice\n});\n\nconst rootReducer = (state: any, action: any) => {\n return combinedReducer(state, action);\n};\n\nconst createStore = () => {\n // Check if we have a store in session storage\n const persistedState = loadState();\n\n let preloadState = initialState;\n if (\n persistedState !== undefined &&\n persistedState.auth &&\n persistedState.auth.isAuth &&\n persistedState.auth.currentUser &&\n persistedState.auth.currentUser.jwtToken\n ) {\n preloadState = persistedState;\n } else {\n preloadState = { ...initialState, ...getPersistedState(persistedState) };\n }\n\n const store = configureStore({\n reducer: rootReducer,\n preloadedState: preloadState,\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Not the cleanest solution since payload.0.layout potentially could match another reducer path. However,\n // the only other option would be to write a custom serialization checker which is too complicated.\n // serializableCheck does not support wildcards in the middle of paths (only at the end)\n ignoredPaths: ['dashboardLayouts', 'homepageLayouts', /payload\\.\\d*\\.(layout|Layout)\\.\\d*\\..*/],\n ignoredActionPaths: [\n 'meta.arg',\n 'meta.baseQueryMeta',\n 'dashboardLayouts',\n 'homepageLayouts',\n /payload\\.\\d*\\.(layout|Layout)\\.\\d*\\..*$/\n ]\n }\n })\n });\n\n return store;\n};\n\nexport const store = createStore();\n\n// Save state in local storage\nstore.subscribe(() => {\n // Only save state if we are logged in\n const state = store.getState();\n if (state.auth.isAuth) {\n saveState(state);\n }\n});\n\n// Translations\nsyncTranslationWithStore(store);\nstore.dispatch(loadTranslations(translations));\n","const builderTranslations = {\n en: {\n missingNumpad:\n 'Missing Numpad component in registration view, customers may not be able to register. If this is correct, you can ignore this warning.',\n disclaimerMissing: 'PayAtt disclaimer is missing in registration view',\n overflowBodyContainer: 'Elements overflow body container',\n rollback: 'Are you sure you want to revert changes?',\n saveView: 'Are you sure you want to save this view?',\n quitWithoutSaving: 'Are you sure you want to quit without saving?',\n save: 'Save',\n continue: 'Continue',\n quit: 'Quit',\n cancel: 'Cancel',\n warning: 'Warning',\n components: {\n rewardTextPlaceholder: 'Your reward text will appear here',\n rewardTextTooltip:\n 'This text will be replaced by the description of the relevant reward on the customers stamp card',\n progressTextPlaceholder: 'Only X stamps left to receive your reward',\n progressTextTooltip: \"After a registration, 'X' will be replaced by a value\"\n }\n },\n se: {\n missingNumpad:\n 'Numpadkomponenten saknas i registreringsvyn, det är möjligt att kunder inte kan registrera sig. Ifall detta är korrekt kan du ignorera denna varning.',\n disclaimerMissing: 'PayAtt disclaimer saknas från registreringsvyn',\n overflowBodyContainer: 'Någon komponents dimension är för stor för enheten',\n rollback: 'Är du säker på att du vill återställa ändringarna?',\n saveView: 'Är du säker på att du vill spara denna vy?',\n quitWithoutSaving: 'Är du säker på att du vill avsluta utan att spara?',\n save: 'Spara',\n continue: 'Fortsätt',\n quit: 'Avsluta',\n cancel: 'Avbryt',\n warning: 'Varning',\n components: {\n rewardTextPlaceholder: 'Din belöningstext syns här',\n rewardTextTooltip: 'Denna text byts ut mot beskrivningen av relevant belöning på kundens stämpelkort',\n progressTextPlaceholder: 'Endast X stämplar till din belöning',\n progressTextTooltip: \"Efter en registrering kommer 'X' att bytas ut mot ett värde\"\n }\n }\n};\nexport default builderTranslations;\n","export type IntelliSmsContentTranslations = {\n urlShortenerInfo: string;\n isPostingVenueText: string;\n send: {\n testSmsSuccess: string;\n success: string;\n successLargeCampaign: string;\n fail: string;\n tooManyRequests: string;\n tooManySuggestionRequests: string;\n tooFewCustomers: string;\n insufficientSmsBalance: string;\n timeLeft: string;\n blockedParallel: string;\n unknownError: string;\n socketResponse: {\n fail: string;\n success: string;\n };\n };\n delete: {\n success: string;\n campaignInProcess: string;\n campaignCompleted: string;\n unknownFailure: string;\n };\n header: {\n newCampaign: { title: string; subtitle: { 1: string; 2: string; 3: string } };\n overview: { title: string; subtitle: string };\n };\n beyondLimitWarning: { warning: string; multiPart: string; singlePart: string; confirmBoxText: string };\n};\n\nexport const intelliSmsContentTranslations: { en: IntelliSmsContentTranslations; se: IntelliSmsContentTranslations } = {\n en: {\n urlShortenerInfo: `Include more information in your text by adding a link to\n your social media! There are many ways to shorten your URL, here are two options`,\n isPostingVenueText: 'Sending SMS Campaign',\n send: {\n testSmsSuccess: 'Successfully sent campaign to:',\n success: 'Your SMS campaign is being sent! 🎉',\n successLargeCampaign: `Your SMS campaign is being sent! 🎉 \n
\n This can take a few minutes for large campaigns.`,\n fail: 'Failed to send SMS campaign',\n tooManyRequests: 'Too many campaigns, wait 30 min and try again',\n tooManySuggestionRequests: 'Too many refreshes, you can refresh max 20 times in 5 minutes',\n tooFewCustomers: 'Too few members',\n insufficientSmsBalance: 'Insufficient SMS balance',\n timeLeft: 'Time left until you may send another campaign:',\n blockedParallel:\n 'You are already sending a campaign. Wait until it has finished or try again in a little while',\n unknownError: 'Unknown error',\n socketResponse: {\n fail: 'Failed to send campaign',\n success: 'Successfully sent SMS campaign! You can view it in the calendar.'\n }\n },\n delete: {\n success: 'Scheduled campaign deleted',\n campaignInProcess: 'Campaign is being sent',\n campaignCompleted: 'Campaign has already been sent',\n unknownFailure: 'Unknown failure'\n },\n header: {\n newCampaign: {\n title: 'Create Campaign',\n subtitle: {\n 1: 'Create a new SMS campaign based on our suggestion(s)',\n 2: 'Apply recipient filters',\n 3: 'Schedule or send it immediately'\n }\n },\n overview: { title: 'Overview', subtitle: 'Manage past and upcoming campaigns' }\n },\n beyondLimitWarning: {\n warning: 'Confirm Extra Charges',\n multiPart: `You are about to send a campaign to %{recipients} recipients, where each message consists of %{parts} parts, each part uses one SMS from your allowance, and you have %{allowance} SMS remaining. \n

\n To proceed in sending this campaign, an additional charge of %{costPerMessage} SEK per message, above your allowance, will be applied (%{costPerPart} * %{parts}).`,\n singlePart: `You are about to send a campaign which uses more SMS than what you have remaining in your allowance. \n To proceed in sending this campaign, an additional charge of %{costPerMessage} SEK per message, above your allowance, will be applied.`,\n confirmBoxText: `I Confirm additional charges of %{totalCost} SEK`\n }\n },\n se: {\n urlShortenerInfo: `Inkludera mer information i ditt SMS genom att länka till sociala medier! \n Det finns många olika sätt att förkorta en länk, här är två alternativ`,\n isPostingVenueText: 'Skickar SMS-kampanj',\n send: {\n testSmsSuccess: 'Kampanj skickad till:',\n success: 'SMS-kampanjen är mottagen och håller på att skickas! 🎉',\n successLargeCampaign: `SMS-kampanjen är mottagen och håller på att skickas! 🎉\n

\n Detta kan ta några minuter för stora kampanjer.`,\n fail: 'Misslyckades med att skicka SMS-kampanj',\n tooManyRequests: 'För många utskick, vänta 30 min och testa igen',\n tooManySuggestionRequests:\n 'För många genereringar av nya förslag, du kan max genererera 20 gånger per 5 minuter',\n tooFewCustomers: 'För få medlemmar',\n insufficientSmsBalance: 'För lite SMS i potten',\n timeLeft: 'Tid kvar tills du kan skicka en ny kampanj:',\n blockedParallel:\n 'Du har redan en kampanj som håller på att skickas. Vänta tills den är klar, eller försök igen om ett litet tag.',\n unknownError: 'Okänt fel',\n socketResponse: {\n fail: 'Misslyckades med att skicka SMS-kampanj',\n success: 'Din SMS-kampanj har skickats! Du kan se den i kalendern.'\n }\n },\n delete: {\n success: 'Schemalagd kampanj borttagen',\n campaignInProcess: 'Kampanjen håller på att skickas',\n campaignCompleted: 'Kampanjen har redan skickats',\n unknownFailure: 'Okänt fel'\n },\n header: {\n newCampaign: {\n title: 'Skicka ny kampanj',\n subtitle: {\n 1: 'Skapa en ny SMS-kampanj baserat på våra förslag',\n 2: 'Filtrera mottagare',\n 3: 'Schemalägg eller skicka direkt'\n }\n },\n overview: { title: 'Översikt', subtitle: 'Hantering av tidigare och uppkommande kampanjer' }\n },\n beyondLimitWarning: {\n warning: 'Bekräfta Extra Avgift',\n multiPart: `Du är på väg att skicka en kampanj till %{recipients} mottagare, där varje meddelande består av %{parts} delar. Varje del använder ett SMS från dina gratis SMS och du har %{allowance} SMS kvar. \n

\n För att fortsätta med att skicka denna kampanj kommer en avgift på %{costPerMessage} SEK per meddelande att tas ut, på alla delar utöver dina gratis SMS (%{costPerPart} * %{parts}).`,\n singlePart: `Du är på väg att skicka en kampanj som använder mer SMS än du har tillgängligt. \n För att fortsätta med att skicka denna kampanj kommer en avgift på %{costPerMessage} SEK per SMS att tas ut, utöver dina gratis SMS.`,\n confirmBoxText: `Jag bekräftar en extra kostnad på %{totalCost} SEK`\n }\n }\n};\n","/* eslint-disable max-len */\nimport { TARGET_GROUP } from 'views/IntelliSms/helpers/targetGroupEnums';\n\nexport type IntelliSmsFilterModalTranslations = {\n recipients: string;\n sendToEveryone: string;\n selectTargetGroup: string;\n infoButtons: {\n stampCard: { tooltip: string; title: string; text: string };\n venues: { tooltip: string; title: string; text: string };\n targetGroup: { tooltip: string; title: string; text: string };\n };\n general: string;\n stampCard: string;\n stamps: string;\n rewards: string;\n selectStampCardCampaign: string;\n none: string;\n selectVenues: string;\n selectVenuesRequired: string;\n selectAll: string;\n noVenuesSelected: string;\n labels: {\n general: string;\n generalWithin: string;\n generalBefore: string;\n stampCard: string;\n rewards: string;\n stamps: string;\n mostUsed: string;\n };\n fields: Record;\n timeIntervalDialog: {\n mustSelectStartAndEnd: string;\n endAfterStart: string;\n minimum30min: string;\n filterRemoved: string;\n done: string;\n label: {\n startTime: string;\n endTime: string;\n };\n };\n};\n\nexport const intelliSmsFilterModalTranslations: {\n en: IntelliSmsFilterModalTranslations;\n se: IntelliSmsFilterModalTranslations;\n} = {\n en: {\n recipients: 'Select recipients',\n sendToEveryone: 'Send to everyone',\n selectTargetGroup: 'Select target group',\n general: 'General',\n stampCard: 'Stamp card',\n stamps: 'Stamps',\n rewards: 'Rewards',\n selectStampCardCampaign: 'Select stamp card campaign',\n infoButtons: {\n stampCard: {\n tooltip: 'Info',\n title: 'Stamp Card Campaign',\n text: 'Sends an SMS to all members of the selected stamp card campaign. Can be combined with filters and venues.'\n },\n targetGroup: {\n tooltip: 'Info',\n title: 'Target Group',\n text: 'Select who should receive your SMS. If you select multiple filters, only members who meet ALL selected filters will receive an SMS.'\n },\n venues: {\n tooltip: 'Info',\n title: 'Venue',\n text: 'When selecting multiple venues, all filters are applied per venue, and SMS messages are sent separately. Members registered in two or more of the selected venues will only receive one SMS from the venue where they registered first.'\n }\n },\n none: 'None',\n selectVenues: 'Select venues',\n selectVenuesRequired: 'Select venues *',\n selectAll: 'Select all',\n noVenuesSelected: 'No venues selected',\n labels: {\n general: 'General',\n generalBefore: 'Past registrations',\n generalWithin: 'Recent registrations',\n stampCard: 'Stamp card',\n rewards: 'Rewards',\n stamps: 'Stamps',\n mostUsed: 'Most used'\n },\n fields: {\n Everyone: 'Everyone with stamps',\n TimeInterval: 'Registration within given time interval',\n LastVisitWithin1Week: 'New registrations within the last week',\n LastVisitWithin2Weeks: 'New registrations within the last 2 weeks',\n LastVisitWithin1Month: 'New registrations within the last month',\n LastVisitWithin3Months: 'New registrations within the last 3 months',\n LastVisitWithin6Months: 'New registrations within the last 6 months',\n LastVisitBefore1Week: 'Registrations older than 1 week',\n LastVisitBefore2Weeks: 'Registrations older than 2 weeks',\n LastVisitBefore1Month: 'Registrations older than 1 month',\n LastVisitBefore3Months: 'Registrations older than 3 months',\n LastVisitBefore6Months: 'Registrations older than 6 months',\n OneStampLeftForReward: 'One stamp left to receive any reward',\n OneStampLeftForReward1: 'One stamp left to receive the first reward',\n OneStampLeftForReward2: 'One stamp left to receive the second reward',\n OneStampLeftForReward3: 'One stamp left to receive the third reward',\n RewardToClaimAny: 'Any reward ready to be claimed',\n RewardToClaim1: 'Reward 1 ready to be claimed',\n RewardToClaim2: 'Reward 2 ready to be claimed',\n RewardToClaim3: 'Reward 3 ready to be claimed',\n NeverReachedReward: 'Visitors who have never reached any reward',\n OneOrMoreRewardsClaimed: 'Visitors who have claimed at least one reward',\n OneStampRecieved: 'Only one stamp received in total',\n SmallNumberOfStamps: 'Visitors with a small number of stamps',\n MediumNumberOfStamps: 'Visitors with a medium number of stamps',\n LargeNumberOfStamps: 'Visitors with a large number of stamps',\n WithoutStampCard: 'Visitors without stamp card'\n },\n timeIntervalDialog: {\n mustSelectStartAndEnd: 'You must select both a start and an end time',\n endAfterStart: 'The end time must be after the start time',\n minimum30min: 'The end time must be at least 30 minutes after the start time',\n filterRemoved: 'The time interval was not saved, so the filter has been removed',\n done: 'Done',\n label: {\n startTime: 'Start Time',\n endTime: 'End Time'\n }\n }\n },\n se: {\n recipients: 'Välj mottagare',\n sendToEveryone: 'Skicka till alla',\n selectTargetGroup: 'Välj målgrupp',\n infoButtons: {\n stampCard: {\n tooltip: 'Info',\n title: 'Stämpelkortskampanj',\n text: 'Skickar ett SMS till alla medlemmar i den valda stämpelkortskampanjen. Kan kombineras med filter och verksamheter.'\n },\n targetGroup: {\n tooltip: 'Info',\n title: 'Målgrupp',\n text: 'Välj vem som ska motta ditt SMS. Om du väljer flera filter kommer endast medlemmar som uppfyller ALLA valda filter att få ett SMS.'\n },\n venues: {\n tooltip: 'Info',\n title: 'Verksamhet',\n text: 'När du väljer flera verksamheter tillämpas alla filter per verksamhet och SMS skickas ut separat. Medlemmar som är registrerade i två eller fler av de valda verksamheterna får endast ett SMS från den verksamhet där de registrerade sig först.'\n }\n },\n general: 'Allmänt',\n stampCard: 'Stämpelkort',\n stamps: 'Stämplar',\n rewards: 'Belöningar',\n\n selectStampCardCampaign: 'Välj stämpelkortskampanj',\n none: 'Ingen',\n\n selectVenues: 'Välj verksamheter',\n selectVenuesRequired: 'Välj verksamheter *',\n selectAll: 'Välj alla',\n noVenuesSelected: 'Inga verksamheter valda',\n labels: {\n general: 'Allmänt',\n generalBefore: 'Förflutna registreringar',\n generalWithin: 'Nyligen registrerade',\n stampCard: 'Stämpelkort',\n rewards: 'Belöningar',\n stamps: 'Stämplar',\n mostUsed: 'Mest använda'\n },\n fields: {\n Everyone: 'Alla som har stämplar',\n TimeInterval: 'Registreringar inom angett tidsintervall',\n LastVisitWithin1Week: 'Nya registreringar under den senaste veckan',\n LastVisitWithin2Weeks: 'Nya registreringar under de senaste 2 veckorna',\n LastVisitWithin1Month: 'Nya registreringar under den senaste månaden',\n LastVisitWithin3Months: 'Nya registreringar under de senaste 3 månaderna',\n LastVisitWithin6Months: 'Nya registreringar under de senaste 6 månaderna',\n LastVisitBefore1Week: 'Registreringar äldre än 1 vecka',\n LastVisitBefore2Weeks: 'Registreringar äldre än 2 veckor',\n LastVisitBefore1Month: 'Registreringar äldre än 1 månad',\n LastVisitBefore3Months: 'Registreringar äldre än 3 månader',\n LastVisitBefore6Months: 'Registreringar äldre än 6 månader',\n OneStampLeftForReward: 'En stämpel kvar för att få en belöning',\n OneStampLeftForReward1: 'Endast en stämpel kvar för att få den första belöningen',\n OneStampLeftForReward2: 'Endast en stämpel kvar för att få den andra belöningen',\n OneStampLeftForReward3: 'Endast en stämpel kvar för att få den tredje belöningen',\n RewardToClaimAny: 'Minst en belöning redo att hämtas ut',\n RewardToClaim1: 'Första belöningen redo att hämtas ut',\n RewardToClaim2: 'Andra belöningen redo att hämtas ut',\n RewardToClaim3: 'Tredje belöningen redo att hämtas ut',\n NeverReachedReward: 'Besökare som aldrig nått en belöning',\n OneOrMoreRewardsClaimed: 'Besökare som har hämtat minst en belöning',\n OneStampRecieved: 'Endast en stämpel intjänad totalt',\n SmallNumberOfStamps: 'Besökare med ett lågt antal stämplar',\n MediumNumberOfStamps: 'Besökare med ett medel antal stämplar',\n LargeNumberOfStamps: 'Besökare med ett högt antal stämplar',\n WithoutStampCard: 'Besökare som ej har stämpelkort'\n },\n timeIntervalDialog: {\n mustSelectStartAndEnd: 'Du måste välja både en start- och sluttid',\n endAfterStart: 'Sluttiden måste vara efter starttiden',\n minimum30min: 'Sluttiden måste vara minst 30 minuter efter starttiden',\n filterRemoved: 'Tidsintervallet sparades inte. Filtret har tagits bort.',\n done: 'Spara',\n label: {\n startTime: 'Starttid',\n endTime: 'Sluttid'\n }\n }\n }\n};\n","export type IntelliSmsInfoButtonTranslations = {\n remainingSMS: string;\n paidSMS: string;\n paidSMSTooltip: string;\n bonusSmsPool: string;\n bonusSmsPoolTooltip: { text: string; 1: string; 2: string; neverExpires: string; expiresIn: string };\n smsStructure: { title: string; content: string };\n};\n\nexport const intelliSmsInfoButtonTranslations: {\n en: IntelliSmsInfoButtonTranslations;\n se: IntelliSmsInfoButtonTranslations;\n} = {\n en: {\n remainingSMS: 'Monthly SMS pool',\n paidSMS: 'Paid SMS',\n paidSMSTooltip: 'Number of SMS sent beyond limit this month',\n bonusSmsPool: 'Bonus SMS',\n bonusSmsPoolTooltip: {\n text: 'Bonus SMS that are used after the monthly pool is empty',\n 1: 'SMS',\n 2: 'Expires',\n neverExpires: 'Never expires',\n expiresIn: 'Expires in: '\n },\n smsStructure: {\n title: 'Explanation of SMS parts',\n content: `Each message has a maximum number of characters allowed; however, the number of characters per message depends on whether the message contains any special characters, like a emojis \"☕️ 💬\" or some specific symbols \"¢ ∞ •\". \n

\n If the character limit is exceeded, the message will be split into multiple parts, there is no limit to how many parts you may use in a message. Different emojis and symbols use a different amount of characters.\n

\n You can think of it as this: 1 part = 1 SMS\n

\n
    \n
  • No special characters - single message: 160 characters per SMS/part.
  • \n
  • No special characters - multi-part message: 157 characters per SMS/part.
  • \n
  • Inkl. Special characters - single message: 70 characters per SMS/part.
  • \n
  • Inkl. Special characters - multi-part message: 67 characters per SMS/part.
  • \n
\n
\n Each message part uses one SMS from your allowance.\n

\n 🙋‍♂️ The customer will receive the message as one consequitive SMS on their phone, no matter how many parts you use. You can always test it by sending a test SMS to yourself!`\n }\n },\n se: {\n remainingSMS: 'Månadspott-SMS',\n paidSMS: 'Betalade SMS',\n paidSMSTooltip: 'Antal SMS skickade utöver limit denna månad',\n bonusSmsPool: 'Bonus-SMS',\n bonusSmsPoolTooltip: {\n text: 'Bonus-SMS som används efter månadspotten är tom',\n 1: 'SMS',\n 2: 'Löper ut om',\n neverExpires: 'Inget slutdatum',\n expiresIn: 'Löper ut om: '\n },\n smsStructure: {\n title: 'Förklaring av SMS-delar',\n content: `Varje meddelande har ett maximalt antal tillåtna tecken, antalet beror på om meddelandet innehåller specialtecken, som t.ex. emojis \"☕️ 💬\" eller vissa specifika symboler, som t.ex. \"¢ ∞ •\". \n

\n Om antalet tecken överskrids kommer meddelandet att bli uppdelat i delar, det finns ingen begränsning för antalet delar ett meddelande kan bestå av. Olika symboler och emojis använder olika många tecken.\n

\n För att göra det enkelt, utgå från att: 1 del = 1 SMS\n

\n
    \n
  • Inga specialtecken - en del: 160 tecken per SMS/del
  • \n
  • Inga specialtecken - flera delar: 157 tecken per SMS/del
  • \n
  • Inkl. specialtecken - en del: 70 tecken per SMS/del
  • \n
  • Inkl. specialtecken - flera delar: 67 tecken per SMS/del
  • \n
\n
\n Varje del använder 1 SMS från din pott. Notera att månadspotten används före dina eventuella bonus-sms.\n

\n 🙋‍♂️ Mottagaren kommer att se hela meddelandet i ett stycke, oavsett hur många delar som används. Du kan alltid testa hur det kommer se ut genom att göra ett utskick till dig själv!`\n }\n }\n};\n","export type IntelliSmsRRuleGeneratorTranslations = {\n startDate: string;\n eventTime: string;\n frequency: string;\n monthly: string;\n weekly: string;\n daily: string;\n every: string;\n end: string;\n never: string;\n after: string;\n date: string;\n\n repetition: string;\n repetitionPlural: string;\n day: string;\n dayPlural: string;\n week: string;\n weekPlural: string;\n month: string;\n monthPlural: string;\n\n dayOfTheWeek: string;\n\n mon: string;\n tue: string;\n wed: string;\n thu: string;\n fri: string;\n sat: string;\n sun: string;\n\n monday: string;\n tuesday: string;\n wednesday: string;\n thursday: string;\n friday: string;\n saturday: string;\n sunday: string;\n anyDay: string;\n weekday: string;\n weekendDay: string;\n\n first: string;\n second: string;\n third: string;\n fourth: string;\n last: string;\n\n disablePast: string;\n};\n\nexport const intelliSmsRRuleGeneratorTranslations: {\n en: IntelliSmsRRuleGeneratorTranslations;\n se: IntelliSmsRRuleGeneratorTranslations;\n} = {\n en: {\n startDate: 'Start date:',\n eventTime: 'Time:',\n frequency: 'Frequency:',\n monthly: 'Monthly',\n weekly: 'Weekly',\n daily: 'Daily',\n every: 'Every:',\n end: 'End:',\n never: 'Never',\n after: 'After',\n date: 'Date',\n\n repetition: 'repetition',\n repetitionPlural: 'repetitions',\n day: 'day',\n dayPlural: 'days',\n week: 'week',\n weekPlural: 'weeks',\n month: 'month',\n monthPlural: 'months',\n\n dayOfTheWeek: 'Day of the week',\n\n mon: 'Mon',\n tue: 'Tue',\n wed: 'Wed',\n thu: 'Thu',\n fri: 'Fri',\n sat: 'Sat',\n sun: 'Sun',\n\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n anyDay: 'Day',\n weekday: 'Weekday',\n weekendDay: 'Weekend day',\n\n first: 'First',\n second: 'Second',\n third: 'Third',\n fourth: 'Fourth',\n last: 'Last',\n\n disablePast: 'You cannot schedule a campaign in the past'\n },\n se: {\n startDate: 'Startdatum:',\n eventTime: 'Tid:',\n frequency: 'Frekvens:',\n monthly: 'Månadsvis',\n weekly: 'Veckovis',\n daily: 'Dagligen',\n every: 'Varje:',\n end: 'Slut:',\n never: 'Aldrig',\n after: 'Efter',\n date: 'Datum',\n\n repetition: 'upprepning',\n repetitionPlural: 'upprepningar',\n day: 'dag',\n dayPlural: 'dagar',\n week: 'vecka',\n weekPlural: 'veckor',\n month: 'månad',\n monthPlural: 'månader',\n\n dayOfTheWeek: 'Veckodag',\n\n mon: 'Mån',\n tue: 'Tis',\n wed: 'Ons',\n thu: 'Tor',\n fri: 'Fre',\n sat: 'Lör',\n sun: 'Sön',\n\n monday: 'Måndag',\n tuesday: 'Tisdag',\n wednesday: 'Onsdag',\n thursday: 'Torsdag',\n friday: 'Fredag',\n saturday: 'Lördag',\n sunday: 'Söndag',\n anyDay: 'Dag',\n weekday: 'Vardag',\n weekendDay: 'Helgdag',\n\n first: 'Första',\n second: 'Andra',\n third: 'Tredje',\n fourth: 'Fjärde',\n last: 'Sista',\n\n disablePast: 'Du kan inte schemalägga en kampanj i det förflutna'\n }\n};\n","export type CalendarViewTypes = 'timeGridWeek' | 'dayGridMonth' | 'listWeek' | 'listMonth';\n\nexport type IntelliSmsScheduleTranslations = {\n back: string;\n cancel: string;\n delete: string;\n update: string;\n create: string;\n schedule: string;\n scheduleRecurring: string;\n scheduleRecurringHint: string;\n today: string;\n selectDate: string;\n newlyScheduled: string;\n previouslyScheduled: string;\n previousCampaigns: string;\n eventBeingModified: string;\n selectTime: string;\n selectTimeAndDate: string;\n accept: string;\n acceptHint: string;\n views: Record;\n hints: {\n prevDay: string;\n prevWeek: string;\n prevMonth: string;\n prevYear: string;\n nextDay: string;\n nextWeek: string;\n nextMonth: string;\n nextYear: string;\n weekView: string;\n monthView: string;\n today: string;\n };\n};\n\nexport const intelliSmsScheduleTranslations: {\n en: IntelliSmsScheduleTranslations;\n se: IntelliSmsScheduleTranslations;\n} = {\n en: {\n back: 'Back',\n cancel: 'Cancel',\n delete: 'Delete',\n update: 'Update',\n create: 'Create',\n schedule: 'OK',\n scheduleRecurring: 'Repeating',\n scheduleRecurringHint:\n 'Click here to create a recurring campaign. For example, send an SMS every Friday at 15:00 for 4 weeks, or every last weekday of the month for 6 months.',\n today: 'Today',\n selectDate: 'Select date and time',\n newlyScheduled: 'New times for this campaign',\n previouslyScheduled: 'Previously sheduled campaigns',\n previousCampaigns: 'Previous campaigns',\n eventBeingModified: 'Event being modified',\n selectTime: 'Select time',\n selectTimeAndDate: 'Select time and date',\n accept: 'OK',\n acceptHint:\n 'Click here to confirm the selected times and return to the summary page. On the summary page you must again confirm the campaign in order to schedule it.',\n views: {\n timeGridWeek: 'Week',\n dayGridMonth: 'Month',\n listWeek: 'Week',\n listMonth: 'Month',\n calendarSubheader: 'Calendar view',\n listSubheader: 'List view'\n },\n hints: {\n prevDay: 'Previous day',\n prevWeek: 'Previous week',\n prevMonth: 'Previous month',\n prevYear: 'Previous year',\n nextDay: 'Next day',\n nextWeek: 'Next week',\n nextMonth: 'Next month',\n nextYear: 'Next year',\n weekView: 'Week view',\n monthView: 'Month view',\n today: 'Go to today'\n }\n },\n se: {\n back: 'Tillbaka',\n cancel: 'Avbryt',\n delete: 'Radera',\n update: 'Uppdatera',\n create: 'Skapa',\n schedule: 'OK',\n scheduleRecurring: 'Återkommande',\n scheduleRecurringHint:\n 'Klicka här för att skapa en återkommande kampanj. Till exempel, skicka SMS varje fredag kl 15:00 i 4 veckor, eller den sista vardagen på månaden i 6 månader.',\n selectDate: 'Välj datum och tid',\n today: 'Idag',\n newlyScheduled: 'Nya tider för denna kampanj',\n previouslyScheduled: 'Tidigare schemalagda kampanjer',\n previousCampaigns: 'Tidigare kampanjer',\n eventBeingModified: 'Händelse som ändras',\n selectTime: 'Välj tid',\n selectTimeAndDate: 'Välj tid och datum',\n accept: 'OK',\n acceptHint:\n 'Bekräfta dina valda tider och återgå till föregående översikts-sida. På den sidan måste du igen bekräfta kampanjen för att slutföra schemaläggningen.',\n views: {\n timeGridWeek: 'Vecka',\n dayGridMonth: 'Månad',\n listWeek: 'Vecka',\n listMonth: 'Månad',\n calendarSubheader: 'Kalendervyer',\n listSubheader: 'Listvyer'\n },\n hints: {\n prevDay: 'Föregående dag',\n prevWeek: 'Föregående vecka',\n prevMonth: 'Föregående månad',\n prevYear: 'Föregående år',\n nextDay: 'Nästa dag',\n nextWeek: 'Nästa vecka',\n nextMonth: 'Nästa månad',\n nextYear: 'Nästa år',\n weekView: 'Veckovy',\n monthView: 'Månadsvy',\n today: 'Gå till idag'\n }\n }\n};\n","export type ConfirmDialogAction = 'sendNow' | 'testSms' | 'schedule';\n\nexport type IntelliSmsSummaryModalTranslations = {\n loading: string;\n smsMessageInfo: string;\n characters: string;\n parts: string;\n categories: string;\n filters: string;\n venues: string;\n stampCardCampaign: string;\n show: string;\n summary: string;\n sendTime: string;\n sendTimeMultiple: string;\n sendTimeRecurring: string;\n senderName: string;\n recipients: string;\n monthlySms: string;\n monthlySMSAfterCampaign: string;\n totalSmsParts: string;\n totalSmsPartsTooltip: string;\n bonusSMSAfterCampaign: string;\n schedule: string;\n sendNow: string;\n sendScheduled: string;\n test: string;\n senderNameMultiple: string;\n allCustomers: string;\n allCustomersMultiVenue: string;\n weHaveEstimatedRecipients: string;\n sendTooltipNow: string;\n sendTooltipScheduled: string;\n sendOnlyToAdmins: string;\n successfullyScheduled: string;\n toSoon: string;\n noCustomersFound: string;\n extraChargesMayApply: string;\n numbersWarning: string;\n multiPartSmsInfoText: string;\n confirmDialog: Record;\n};\n\nexport const intelliSmsSummaryModalTranslations: {\n en: IntelliSmsSummaryModalTranslations;\n se: IntelliSmsSummaryModalTranslations;\n} = {\n en: {\n loading: 'Loading...',\n\n smsMessageInfo: 'SMS message info',\n characters: 'Characters:',\n parts: 'Parts:',\n\n categories: 'Recipient filters',\n\n filters: 'Recipient filters',\n venues: 'Venues:',\n stampCardCampaign: 'Stamp card campaign:',\n show: 'Show',\n\n summary: 'Summary',\n sendTime: 'Will send:',\n sendTimeMultiple: 'Multiple selected dates, view in \"Schedule\"',\n sendTimeRecurring: 'Recurring date, view in \"Schedule\"',\n senderName: 'Sender name:',\n recipients: 'Number of recipients:',\n totalSmsParts: 'Total SMS',\n totalSmsPartsTooltip:\n 'The total number of SMS that will be used to send this campaign (%{recipients} * %{parts}). Each message consists of %{parts} parts.',\n monthlySms: 'Monthly SMS:',\n monthlySMSAfterCampaign: 'Monthly SMS after campaign:',\n bonusSMSAfterCampaign: 'Bonus-SMS after campaign:',\n schedule: 'Schedule',\n sendNow: 'Send now',\n sendScheduled: 'Confirm',\n test: 'Send now to admin',\n senderNameMultiple: 'Depends on venue',\n allCustomers: 'Message will be sent to all customers!',\n allCustomersMultiVenue: 'Message will be sent to all customers, in all of your venues (%{venueCount})!',\n weHaveEstimatedRecipients: 'We have estimated the number of recipients*',\n sendTooltipNow: 'Send to all selected customers',\n sendTooltipScheduled: 'Send at selected dates to customers after applying recipient filters',\n sendOnlyToAdmins: 'Send test SMS to the number stored on your profile',\n successfullyScheduled: 'SMS campaign successfully scheduled',\n toSoon: 'You must schedule the campaign at least 5 minutes in the future',\n noCustomersFound: 'NO CUSTOMERS FOUND FOR THE CURRENT FILTERS',\n extraChargesMayApply: 'Extra charges may apply',\n numbersWarning:\n '* These numbers are calculated using your current data, but they may change by the time the campaign is sent.',\n multiPartSmsInfoText: 'Messages with multiple parts will show as one long message on the recipients phone',\n confirmDialog: {\n schedule: 'Are you sure you want to schedule the campaign?',\n sendNow: 'Are you sure you want to send the campaign now?',\n testSms: 'Are you sure you want to send a test SMS to yourself?'\n }\n },\n se: {\n loading: 'Laddar...',\n\n smsMessageInfo: 'SMS-info',\n characters: 'Tecken:',\n parts: 'Delar:',\n\n categories: 'Mottagarfilter',\n\n filters: 'Mottagarfilter',\n venues: 'Verksamheter:',\n stampCardCampaign: 'Stämpelkortskampanj:',\n show: 'Visa',\n\n summary: 'Sammanfattning',\n sendTime: 'Skickas:',\n sendTimeMultiple: 'Flera tider valda, synliga under \"Schemalägg\"',\n sendTimeRecurring: 'Återkommande datum, synliga under \"Schemalägg\"',\n senderName: 'Avsändarnamn:',\n recipients: 'Antal mottagare:',\n totalSmsParts: 'Antal SMS:',\n totalSmsPartsTooltip:\n 'Totalt antal SMS som kommer användas för att skicka denna kampanj (%{recipients} * %{parts}). Varje meddelande består av %{parts} delar.',\n monthlySms: 'Månadspott-SMS:',\n monthlySMSAfterCampaign: 'SMS kvar efter kampanj:',\n bonusSMSAfterCampaign: 'Bonus-SMS kvar efter kampanj:',\n schedule: 'Schemalägg',\n sendNow: 'Skicka nu',\n sendScheduled: 'Bekräfta',\n test: 'Skicka nu till admin',\n senderNameMultiple: 'Beror på verksamhet',\n allCustomers: 'Meddelandet kommer att skickas till alla kunder!',\n allCustomersMultiVenue:\n 'Meddelandet kommer att skickas till alla kunder i alla dina verksamheter (%{venueCount})!',\n weHaveEstimatedRecipients: 'Vi har uppskattat antalet mottagare*',\n sendTooltipNow: 'Skicka till alla valda kunder',\n sendTooltipScheduled: 'Skicka vid valda datum till kunder efter tillämpning av mottagarfilter.',\n sendOnlyToAdmins: 'Skicka test-SMS till numret sparat på din profil',\n noCustomersFound: 'INGA KUNDER HITTADE FÖR DE AKTUELLA FILTRERNA',\n successfullyScheduled: 'SMS-kampanj schemalagd',\n toSoon: 'Du måste schemalägga kampanjen minst 5 minuter i framtiden',\n extraChargesMayApply: 'Ytterligare avgifter kan tillkomma',\n numbersWarning:\n '* Alla värden är beräknade på din nuvarande data, men kommer att beräknas på nytt vid tidpunkten av SMS-utskicket.',\n multiPartSmsInfoText: 'Meddelanden med flera delar visas som ett långt SMS på mottagarens telefon',\n confirmDialog: {\n schedule: 'Är du säker på att du vill schemalägga kampanjen?',\n sendNow: 'Är du säker på att du vill skicka kampanjen nu?',\n testSms: 'Är du säker på att du vill göra ett test-utskick till dig själv?'\n }\n }\n};\n","/* eslint-disable max-len */\nimport { TARGET_GROUP } from 'views/IntelliSms/helpers/targetGroupEnums';\n\nimport { IntelliSmsContentTranslations, intelliSmsContentTranslations } from './intelliSms.content';\nimport { IntelliSmsFilterModalTranslations, intelliSmsFilterModalTranslations } from './intelliSms.filtersModal';\nimport { IntelliSmsInfoButtonTranslations, intelliSmsInfoButtonTranslations } from './intelliSms.infoButton';\nimport {\n IntelliSmsRRuleGeneratorTranslations,\n intelliSmsRRuleGeneratorTranslations\n} from './intelliSms.rruleGenerator';\nimport { IntelliSmsScheduleTranslations, intelliSmsScheduleTranslations } from './intelliSms.scheduleCampaign';\nimport { IntelliSmsSummaryModalTranslations, intelliSmsSummaryModalTranslations } from './intelliSms.summaryModal';\n\ntype Translations = {\n title: string;\n overview: { editMessageText: string };\n newCampaign: {\n refresh: string;\n next: string;\n wontSend: string;\n saveSuggestion: string;\n menu: string;\n info: string;\n stampCardNotSubscribedToast: string;\n errorsToProceed: {\n includesStampCardUrlButMissingCampaign: string;\n filterRequiresStampCardCampaign: string;\n noDisplaysConnectedToCampaign: string;\n noVenueSelected: string;\n noMessage: string;\n };\n };\n menuModal: {\n last10SavedSuggestions: string;\n includeStampCardUrl: string;\n includeUnregUrl: string;\n includeUnregUrlTooltip: { title: string; 1: string; 2: string; 3: string; 4: string };\n includeStampCardUrlTooltip: { title: string; 1: string; 2: string; 3: string };\n };\n savedSuggestionsModal: {\n savedSuggestions: string;\n saveSuggestion: string;\n textCopied: string;\n noSuggestionsFound: string;\n save: {\n success: string;\n empty: string;\n fail: string;\n };\n };\n eventPopper: {\n recipients: string;\n messageParts: string;\n smsUsageHeader: string;\n messageHeader: string;\n bonusSmsUsed: string;\n freeSmsUsed: string;\n totalSmsUsed: string;\n paidSms: string;\n confirmDelete: {\n title: string;\n recurringSubtitle: string;\n recurringEvents: string;\n name: string;\n additionalEvents: string;\n };\n pastEvent: string;\n failedToSend: {\n title: string;\n subtitle: string;\n titleRetry: string;\n subtitleRetry: string;\n titleNoRecipients: string;\n subtitleNoRecipients: string;\n };\n venueList: {\n failed: string;\n success: {\n recipients: string;\n messageParts: string;\n };\n };\n tooltipUrlSuffixExplanation: {\n stampCardAndUnreg: string;\n stampCard: string;\n unreg: string;\n };\n };\n smsBox: {\n disabledNextTooltip: string;\n placeholder: string;\n parts: string;\n limitOfCharacters: string;\n totalCharactersUsed: string;\n nextPart: string;\n currentPart: string;\n filterSummary: Record & {\n EveryoneStampCard: string;\n EveryoneVenue: string;\n };\n suffixModified: { stampCard: string; unreg: string; both: string };\n };\n filtersModal: IntelliSmsFilterModalTranslations;\n summaryModal: IntelliSmsSummaryModalTranslations;\n rruleGenerator: IntelliSmsRRuleGeneratorTranslations;\n scheduleCampaign: IntelliSmsScheduleTranslations;\n content: IntelliSmsContentTranslations;\n sidebar: IntelliSmsInfoButtonTranslations;\n};\n\nexport type IntelliSmsTranslations = {\n en: Translations;\n se: Translations;\n};\n\nconst intelliSmsTranslations: IntelliSmsTranslations = {\n en: {\n title: 'IntelliSMS',\n overview: { editMessageText: 'Edit message text' },\n newCampaign: {\n refresh: 'Refresh',\n next: 'Next',\n wontSend: 'Continue to next step',\n saveSuggestion: 'Save suggestion',\n menu: 'Menu',\n info: 'SMS info',\n stampCardNotSubscribedToast:\n 'Your venue does not have the stamp card campaign feature activated, please contact PayAtt.',\n errorsToProceed: {\n filterRequiresStampCardCampaign: 'The selected filter requires a selected stamp card campaign',\n includesStampCardUrlButMissingCampaign:\n 'Must select a stamp card campaign when including personal stamp card link',\n noDisplaysConnectedToCampaign:\n 'The selected Stamp Card Campaign has no associated venues. To update the campaign, navigate to the tab \"Stamp Card Campaigns\"',\n noVenueSelected: 'Select at least one venue',\n noMessage: 'Write a message to proceed'\n }\n },\n menuModal: {\n last10SavedSuggestions: 'Last 10 saved messages',\n includeStampCardUrl: 'Stamp Card URL',\n includeUnregUrl: 'Unregister URL',\n includeUnregUrlTooltip: {\n title: 'Unsubscribe link',\n 1: 'Add unsubscribe link at the end of your SMS: %{PAYATT_DOMAIN}/unreg/abcd1234. \"abcd1234\" will be replaced with the customer\\'s code during the send-out.',\n 2: 'As an admin, you can never unsubscribe from your own club. Therefore, your code will be \"admin\" during SMS campaigns and the link will not work..',\n 3: 'All customers will of course have working links! 😊',\n 4: 'Customers can easily rejoin your club by signing up again!'\n },\n includeStampCardUrlTooltip: {\n title: 'Stamp Card Link',\n 1: 'We use the text %{PAYATT_DOMAIN}/stamp-card/abcdef123456 as a link to a customers stamp card. \"abcdef123456\" will be replaced with the customer\\'s stamp card code during the send-out.',\n 2: 'When you receive an SMS as an admin (test send-out or campaign), you will see your own stamp card. If you don\\'t have a stamp card in your campaign, it will say \"admin\". The link will not work, but is included to show how the full SMS will look for the customer.',\n 3: 'Vary the text before the link in your SMS to make it as appealing as possible, depending on the selected recipient filters! For example: \"My stamp card: ...\", \"My reward: ...\", or \"Card below ...\"'\n }\n },\n savedSuggestionsModal: {\n savedSuggestions: 'Saved messages',\n saveSuggestion: 'Save message',\n textCopied: 'Text copied to clipboard',\n noSuggestionsFound: 'No saved suggestion found! Go ahead and save one!',\n save: {\n success: 'Saved!',\n empty: 'Cannot save an empty message',\n fail: 'Failed to save message'\n }\n },\n eventPopper: {\n recipients: 'Recipients:',\n messageParts: 'Message parts:',\n smsUsageHeader: 'SMS usage',\n messageHeader: 'Info',\n bonusSmsUsed: 'Bonus:',\n freeSmsUsed: 'Monthly SMS pool:',\n totalSmsUsed: 'Total SMS used:',\n paidSms: 'Paid SMS',\n confirmDelete: {\n title: 'Are you sure you want to delete this SMS campaign?',\n recurringSubtitle: 'This will also delete all scheduled events in the same series',\n recurringEvents: 'Schedules events:',\n name: 'Event name:',\n additionalEvents: '%{num} additional dates...'\n },\n pastEvent: 'Sent:',\n failedToSend: {\n title: 'Failed',\n subtitle: 'The campaign failed to send, you may want to re-schedule it.',\n titleRetry: 'Sending...',\n subtitleRetry: 'The campaign is being sent',\n titleNoRecipients: 'No recipients',\n subtitleNoRecipients: 'This campaign had no recipients'\n },\n venueList: {\n failed: 'Failed - No customers who are part of this venue have recieved your message. No SMS were used for this venue. Please contact PayAtt if the problem persists.',\n success: {\n messageParts: 'SMS parts',\n recipients: 'Recipients'\n }\n },\n tooltipUrlSuffixExplanation: {\n stampCardAndUnreg:\n \"The codes 'abcdef123456' and 'abcd1234' in the links are placeholders. In the actual SMS, these are replaced with each customer's unique links.\",\n stampCard:\n \"The code 'abcdef123456' in the link is a placeholder. In the actual SMS, it is replaced with each customer's unique stamp card link.\",\n unreg: \"The code 'abcd1234' in the link is a placeholder. In the actual SMS, it is replaced with each customer's unique unsubscribe link.\"\n }\n },\n smsBox: {\n disabledNextTooltip: 'Please enter an SMS text to proceed',\n placeholder: 'Enter SMS text...',\n parts: 'SMS Parts: %{count}',\n limitOfCharacters: 'Limit per part: %{count}',\n totalCharactersUsed: 'Characters used: %{count}',\n nextPart: 'Next part: %{count}',\n currentPart: 'Current part: %{count}',\n filterSummary: {\n OneStampRecieved: 'Send to customers who only collected one stamp',\n SmallNumberOfStamps: 'Reach customers with few stamps',\n MediumNumberOfStamps: 'Reach customers with an average number of stamps',\n LargeNumberOfStamps: 'Reach customers with many stamps',\n WithoutStampCard: 'Reach customer who have no stamp card',\n OneStampLeftForReward: 'Encourage collection of last stamp to reach reward',\n OneStampLeftForReward1: 'Encourage collection of last stamp to reach reward',\n OneStampLeftForReward2: 'Encourage collection of last stamp to reach reward',\n OneStampLeftForReward3: 'Encourage collection of last stamp to reach reward',\n RewardToClaimAny: 'Encourage collection of stamp card campaign reward',\n RewardToClaim1: 'Encourage collection of stamp card campaign reward',\n RewardToClaim2: 'Encourage collection of stamp card campaign reward',\n RewardToClaim3: 'Encourage collection of stamp card campaign reward',\n NeverReachedReward: 'Encourage customers to reach their first stamp card reward',\n OneOrMoreRewardsClaimed: 'Reach customers who have claimed at least one reward',\n Everyone: 'Send to all customers',\n TimeInterval: 'Registration within given time interval',\n EveryoneVenue: 'Send to all members of specific venue(s)',\n EveryoneStampCard: 'Send to all members of specific stamp card campaign',\n LastVisitWithin1Week: 'Show appreciation to those who recently visited you',\n LastVisitWithin2Weeks: 'Show appreciation to those who recently visited you',\n LastVisitWithin1Month: 'Show appreciation to those who recently visited you',\n LastVisitWithin3Months: 'Encourage visit',\n LastVisitWithin6Months: 'Encourage visit',\n LastVisitBefore1Week: 'Encourage visit',\n LastVisitBefore2Weeks: 'Encourage returning visit',\n LastVisitBefore1Month: 'Encourage returning visit',\n LastVisitBefore3Months: \"Encourage those who haven't visited recently to return\",\n LastVisitBefore6Months: \"Encourage those who haven't visited recently to return\"\n },\n suffixModified: {\n stampCard: 'You may not modify the Stamp Card link at the end of the message',\n unreg: 'You may not modify the unregister link at the end of the message',\n both: 'You may not modify the unregister or the Stamp Card links at the end of the message'\n }\n },\n filtersModal: intelliSmsFilterModalTranslations.en,\n summaryModal: intelliSmsSummaryModalTranslations.en,\n rruleGenerator: intelliSmsRRuleGeneratorTranslations.en,\n scheduleCampaign: intelliSmsScheduleTranslations.en,\n content: intelliSmsContentTranslations.en,\n sidebar: intelliSmsInfoButtonTranslations.en\n },\n se: {\n title: 'IntelliSMS',\n overview: { editMessageText: 'Redigera meddelandetext' },\n newCampaign: {\n refresh: 'Nya förslag',\n next: 'Nästa',\n wontSend: 'Fortsätt till nästa steg',\n saveSuggestion: 'Spara SMS-förslag',\n menu: 'Meny',\n info: 'SMS-info',\n stampCardNotSubscribedToast: 'Din verksamhet är har inte stämpelkort aktiverat, kontakta PayAtt.',\n errorsToProceed: {\n filterRequiresStampCardCampaign: 'Den valda målgruppen kräver att du väljer en stämpelkortskampanj',\n includesStampCardUrlButMissingCampaign:\n 'Du måste välja en stämpelkortskampanj när du inkluderar personliga stämpelkortsslänkar',\n noDisplaysConnectedToCampaign:\n 'Den valda stämpelkortskampanjen är inte kopplad till någon verksamhet. För att uppdatera kampanjen, klicka på fliken \"Stämpelkort\".',\n noVenueSelected: 'Välj minst en verksamhet',\n noMessage: 'Skriv ett meddelande för att fortsätta'\n }\n },\n menuModal: {\n last10SavedSuggestions: '10 senast sparade meddelanden',\n includeStampCardUrl: 'Stämpelkortslänk',\n includeUnregUrl: 'Avregistreringslänk',\n includeUnregUrlTooltip: {\n title: 'Avregistreringslänk',\n 1: 'Lägg till en avregistreringslänk i slutet av ditt SMS: %{PAYATT_DOMAIN}/unreg/abcd1234. \"abcd1234\" ersätts med kundens kod när utskicket görs.',\n 2: 'Som administratör kan du aldrig avregistrera dig från din egen klubb. Därför kommer din kod att vara \"admin\" vid utskick till ditt nummer och länken kommer inte att fungera..',\n 3: 'Alla kunder har såklart fungerande länkar! 🙂',\n 4: 'Kunder kan enkelt gå med i din klubb igen genom att registrera sig på nytt!'\n },\n includeStampCardUrlTooltip: {\n title: 'Stämpelkortslänk',\n 1: 'Vi använder texten %{PAYATT_DOMAIN}/stamp-card/abcdef123456 vilket är kundens länk till stämpelkortet. \"abcdef123456\" ersätts med kundens stämpelkortskod vid det faktiska utskicket.',\n 2: 'När du som administratör får ett SMS (test-utskick eller kampanj) ser du ditt eget stämpelkort. Om du inte har något stämpelkort visas \"admin\". Länken kommer inte att fungera men inkluderas för att visa hur det ser ut för kunden.',\n 3: 'Variera texten före länken i ditt SMS för att göra det så attraktivt som möjligt, beroende på de valda mottagarfiltren! Exempel: \"Mitt stämpelkort: ...\", \"Min belöning: ...\" eller \"Mitt kort nedan ...\"'\n }\n },\n savedSuggestionsModal: {\n savedSuggestions: 'Sparade meddelanden',\n saveSuggestion: 'Spara meddelande',\n textCopied: 'Text kopierad',\n noSuggestionsFound: 'Du har inga sparade förslag!',\n save: {\n success: 'Sparad!',\n empty: 'Du kan inte spara ett tomt meddelande',\n fail: 'Misslyckades med att spara ditt meddelande'\n }\n },\n eventPopper: {\n recipients: 'Mottagare:',\n messageParts: 'Meddelandets delar:',\n smsUsageHeader: 'SMS-förbrukning',\n messageHeader: 'Info',\n paidSms: 'Betalade:',\n bonusSmsUsed: 'Bonus:',\n freeSmsUsed: 'Månadspott:',\n totalSmsUsed: 'Totalt antal använda SMS:',\n confirmDelete: {\n title: 'Är du säker på att du vill ta bort SMS-kampanjen?',\n recurringSubtitle: 'Detta tar även bort alla schemalagda event i samma serie',\n recurringEvents: 'Schemalagda utskick:',\n name: 'Namn:',\n additionalEvents: 'Ytterligare %{num} datum...'\n },\n pastEvent: 'Skickad:',\n failedToSend: {\n title: 'Misslyckad',\n subtitle: 'Kampanjen misslyckades med att skickas, vänligen shemalägg den på nytt.',\n titleRetry: 'Skickas...',\n subtitleRetry: 'Kampanjen håller på att skickas',\n titleNoRecipients: 'Inga mottagare',\n subtitleNoRecipients: 'Denna kampanj hade inga mottagare'\n },\n venueList: {\n failed: 'Misslyckades - Inga mottagare från denna verksamhet har mottagit ditt utskick. Inga SMS eller avgifter har tagits ut. Vänligen kontakta PayAtt om problemet kvarstår.',\n success: {\n messageParts: 'SMS delar',\n recipients: 'Mottagare'\n }\n },\n tooltipUrlSuffixExplanation: {\n stampCardAndUnreg:\n \"Koderna 'abcdef123456' och 'abcd1234' i länkarna är platshållare. I det faktiska SMS:et ersätts dessa med varje kunds unika länkar.\",\n stampCard:\n \"Koden 'abcdef123456' i länken är en platshållare. I det faktiska SMS:et ersätts den med varje kunds unika stämpelkortslänk.\",\n unreg: \"Koden 'abcd1234' i länken är en platshållare. I det faktiska SMS:et ersätts den med varje kunds unika länk för avregistrering.\"\n }\n },\n smsBox: {\n disabledNextTooltip: 'Vänligen fyll i SMS-text för att fortsätta',\n placeholder: 'Skriv ditt SMS här...',\n parts: 'Delar: %{count}',\n limitOfCharacters: 'Limit per part: %{count}',\n totalCharactersUsed: 'Tecken: %{count}',\n nextPart: 'Next part: %{count}',\n currentPart: 'Current part: %{count}',\n filterSummary: {\n OneStampRecieved: 'Skicka till kunder med endast en intjänad stämpel',\n SmallNumberOfStamps: 'Nå dina kunder med få stämplar',\n MediumNumberOfStamps: 'Nå kunder med medel antal stämplar',\n LargeNumberOfStamps: 'Nå kunder med många stämplar',\n WithoutStampCard: 'Nå kunder som inte har något stämpelkort',\n OneStampLeftForReward: 'Uppmuntra insamlande av sista stämpeln för att nå stämpelkortsbelöning',\n OneStampLeftForReward1: 'Uppmuntra insamlande av sista stämpeln för att nå stämpelkortsbelöning',\n OneStampLeftForReward2: 'Uppmuntra insamlande av sista stämpeln för att nå stämpelkortsbelöning',\n OneStampLeftForReward3: 'Uppmuntra insamlande av sista stämpeln för att nå stämpelkortsbelöning',\n RewardToClaimAny: 'Uppmuntra upphämtning av stämpelkortsbelöning',\n RewardToClaim1: 'Uppmuntra upphämtning av stämpelkortsbelöning',\n RewardToClaim2: 'Uppmuntra upphämtning av stämpelkortsbelöning',\n RewardToClaim3: 'Uppmuntra upphämtning av stämpelkortsbelöning',\n NeverReachedReward: 'Uppmuntra kunder att nå deras första stämpelkortsbelöning',\n OneOrMoreRewardsClaimed: 'Nå kunder som har hämtat ut minst en belöning',\n Everyone: 'Skicka till alla kunder',\n TimeInterval: 'Registreringar inom angett tidsintervall',\n EveryoneVenue: 'Skicka till alla kunder från en specifik verksamhet',\n EveryoneStampCard: 'Skicka till alla stämpelkortskunder',\n LastVisitWithin1Week: 'Visa uppskattning till de som nyligen besökt er',\n LastVisitWithin2Weeks: 'Visa uppskattning till de som nyligen besökt er',\n LastVisitWithin1Month: 'Visa uppskattning till de som nyligen besökt er',\n LastVisitWithin3Months: 'Uppmuntra besök',\n LastVisitWithin6Months: 'Uppmuntra besök',\n LastVisitBefore1Week: 'Uppmuntra besök',\n LastVisitBefore2Weeks: 'Uppmuntra återbesök',\n LastVisitBefore1Month: 'Uppmuntra återbesök',\n LastVisitBefore3Months: 'Uppmuntra de som inte besökt er nyligen att återvända',\n LastVisitBefore6Months: 'Uppmuntra de som inte besökt er nyligen att återvända'\n },\n suffixModified: {\n stampCard: 'Du kan inte ändra stämpelkortslänken på slutet at meddelandet',\n unreg: 'Du kan inte ändra avregistreringslänken på slutet av meddelandet',\n both: 'Du kan inte ändra avregistrering- och stämpelkortslänken på slutet av meddelandet'\n }\n },\n filtersModal: intelliSmsFilterModalTranslations.se,\n summaryModal: intelliSmsSummaryModalTranslations.se,\n rruleGenerator: intelliSmsRRuleGeneratorTranslations.se,\n content: intelliSmsContentTranslations.se,\n sidebar: intelliSmsInfoButtonTranslations.se,\n scheduleCampaign: intelliSmsScheduleTranslations.se\n }\n};\nexport default intelliSmsTranslations;\n","const footerTranslations = {\n en: {\n TOC: 'Privacy policy',\n integrityPolicy: 'Integrity policy'\n },\n se: {\n TOC: 'Allmänna villkor',\n integrityPolicy: 'Integritetspolicy'\n }\n};\n\nexport default footerTranslations;\n","const comingSoonTranslations = {\n en: {\n title: 'Coming Soon!',\n content: \"We're working on implementing this feature\"\n },\n se: {\n title: 'Kommer snart!',\n content: 'Vi jobbar med utvecklingen av denna funktionalitet'\n }\n};\n\nexport default comingSoonTranslations;\n","const status404Translations = {\n en: {\n title: \"The page you were looking for doesn't exist.\",\n buttonText: 'Go to Homepage',\n navigateHomeText: 'Oops! Click the link below to navigate back to the homepage.',\n contactText: 'Please contact PayAtt at info@payatt.store if you wish to report this'\n },\n se: {\n title: 'Sidan du sökert finns inte',\n buttonText: 'Gå tillbaka till hemsidan',\n navigateHomeText: 'Oops! Klicka på länken nedan för att gå tillbaka till hemsidan',\n contactText: 'Vänligen kontakta PayAtt på info@payatt.store ifall du vill rapportera detta'\n }\n};\n\nexport default status404Translations;\n","const urlShortenerTranslations = {\n en: {\n mainButton: 'URL Shortener',\n enterUrl: 'Enter URL (incl. https://)',\n enterUrlPlaceholder: 'Enter URL...',\n shortenedUrlPlaceholder: 'Shortened URL will appear here',\n shortenButton: 'Shorten',\n shortenTooltip: 'The button will become active once a valid URL is entered',\n copyButton: 'Copy',\n copyTooltip: 'Nothing to copy yet!',\n urlCopied: 'URL copied to clipboard'\n },\n se: {\n mainButton: 'URL-kortare',\n enterUrl: 'Ange URL (inkl. https://)',\n enterUrlPlaceholder: 'Ange URL...',\n shortenedUrlPlaceholder: 'Kortaste URL kommer att visas här',\n shortenButton: 'Korta',\n shortenTooltip: 'Knapp kommer att aktiveras när en giltig URL är angiven',\n copyButton: 'Kopiera',\n copyTooltip: 'Inget att kopiera just nu',\n urlCopied: 'URL kopierad till urklippen'\n }\n};\n\nexport default urlShortenerTranslations;\n","const venueToggleTranslations = {\n en: {\n buttonName: 'Select venue',\n selectAll: 'All'\n },\n se: {\n buttonName: 'Välj verksamhet',\n selectAll: 'Alla'\n }\n};\n\nexport default venueToggleTranslations;\n","const dialogTranslations = {\n en: { cancel: 'Cancel', decline: 'Decline', confirm: 'Confirm', accept: 'Accept' },\n se: { cancel: 'Avbryt', decline: 'Avbryt', confirm: 'Bekräfta', accept: 'Bekräfta' }\n};\n\nexport default dialogTranslations;\n","import footerTranslations from 'translations/components/footer';\nimport comingSoonTranslations from 'translations/components/status/comingSoon';\nimport status404Translations from 'translations/components/status/status404';\nimport urlShortenerTranslations from 'translations/components/urlShortener';\nimport venueToggleTranslations from 'translations/components/venueToggle';\n\nimport dialogTranslations from './dialog';\n\nconst mainComponentTranslations = {\n en: {\n status: {\n comingSoon: comingSoonTranslations.en,\n status404: status404Translations.en\n },\n footer: footerTranslations.en,\n venueToggle: venueToggleTranslations.en,\n urlShortener: urlShortenerTranslations.en,\n dialog: dialogTranslations.en\n },\n se: {\n status: {\n comingSoon: comingSoonTranslations.se,\n status404: status404Translations.se\n },\n footer: footerTranslations.se,\n venueToggle: venueToggleTranslations.se,\n urlShortener: urlShortenerTranslations.se,\n dialog: dialogTranslations.se\n }\n};\n\nexport default mainComponentTranslations;\n","const tooltipTranslations = {\n en: {\n content: 'Click the edit button'\n },\n se: {\n content: 'Klicka på redigera'\n }\n};\n\nexport default tooltipTranslations;\n","const editToggleTranslations = {\n en: {\n success: 'Data is reset',\n nothingChanged: 'Nothing updated',\n edit: 'Edit',\n done: 'Save',\n reset: 'Cancel'\n },\n se: {\n success: 'All data återställd',\n nothingChanged: 'Ingen data uppdaterad',\n edit: 'Redigera',\n done: 'Spara',\n reset: 'Avbryt'\n }\n};\nexport default editToggleTranslations;\n","const errorTranslations = {\n en: {\n unknownError: 'Unkown error',\n noData: 'Unable to fetch data, you will be automatically logged out in 10 seconds. If the problem persists, contact us at info@payatt.store'\n },\n se: {\n unknownError: 'Okänt fel',\n noData: 'Det gick inte att hämta din data, du kommer automatiskt att loggas ut om 10 sekunder. Om problemet kvarstår, kontakta oss på info@payatt.store'\n }\n};\n\nexport default errorTranslations;\n","/* eslint-disable max-len */\nconst homeTranslations = {\n en: {\n title: 'Home',\n header: {\n welcome: 'Welcome,',\n subtitle: 'Get valuable insights on your customer registrations below',\n settings: 'Settings'\n },\n settingsMenu: {\n generalSettings: {\n title: 'General',\n changeBackground: {\n label: 'Background picture',\n inputLabel: 'Image',\n hide: 'Hide',\n flowers: 'Flowers',\n store: 'Store',\n desk1: 'Desk 1',\n desk2: 'Desk 2',\n display: 'Display'\n }\n },\n filterSettings: {\n title: 'Settings',\n filter: 'Filter',\n subtitle: 'Filter your charts',\n tooltip:\n \"Different charts have different individual settings. When you change the filter on a global level, only charts with relevant filters will be updated.

Click on the 'Apply' button at the bottom to apply your changes.\"\n }\n },\n content: {\n toggle: {\n week: 'This Week',\n month: 'This Month'\n },\n overview: {\n title: 'Registration statistics',\n numberOfStores: 'Number of Venues',\n campaigns: 'Total number of campaigns',\n newCustomers: 'New members',\n newCustomersTooltip: 'Members who register for the first time',\n returningCustomers: 'Returning members',\n totalPeriod: 'Total number of registrations',\n totalPeriodTooltip: 'Includes both new and returning members',\n totalCampaigns: 'Total number of campaigns',\n totalRegistrations: 'Grand total registrations',\n totalCustomers: 'Total number of unique customers'\n },\n venue: {\n title: 'My venues',\n campaigns: 'Campaigns',\n newCustomers: 'New customers',\n returningCustomers: 'Returning customers',\n totalPeriod: 'Total for selected period',\n totalCampaigns: 'Total number of campaigns',\n total: 'Total number of registrations',\n totalCustomers: 'Total number of unique customers'\n }\n }\n },\n se: {\n title: 'Startsida',\n header: {\n welcome: 'Välkommen',\n subtitle: 'Få insikt i dina kunders registreringar nedan',\n settings: 'Inställningar'\n },\n settingsMenu: {\n generalSettings: {\n title: 'Allmänt',\n changeBackground: {\n label: 'Bakgrundsbild',\n inputLabel: 'Bild',\n hide: 'Dölj',\n flowers: 'Blommor',\n store: 'Butik',\n desk1: 'Kassa 1',\n desk2: 'Kassa 2',\n display: 'Skärm'\n }\n },\n filterSettings: {\n title: 'Inställningar',\n filter: 'Filtrera',\n subtitle: 'Filtrera dina grafer',\n tooltip:\n \"Tidspannet på alla widgets är automatiskt inställda på 1 månad och nollställs när du laddar om hemsidan. Här kan du ändra filter på alla widgets.

Olika grafer har olika individuella filter. När du ändrar filter på global nivå kommer endast grafer med relevanta filter att bli uppdaterade.

Klicka på knappen 'Använd' längst ned för att applicera dina val.\"\n }\n },\n content: {\n toggle: {\n week: 'Denna vecka',\n month: 'Denna månad'\n },\n overview: {\n title: 'Registreringsstatistik',\n numberOfStores: 'Antal verksamheter',\n campaigns: 'Totalt antal kampanjer',\n newCustomers: 'Nya medlemmar',\n newCustomersTooltip: 'Kunder som registrerat sig för första gången',\n returningCustomers: 'Återkommande medlemmar',\n totalPeriod: 'Totalt antal registreringar',\n totalPeriodTooltip: 'Inkluderar både nya och återkommande medlemmar',\n totalCampaigns: 'Totalt antal kampanjer',\n totalRegistrations: 'Totalt antal registreringar',\n totalCustomers: 'Totalt antal kunder'\n },\n venue: {\n title: 'Mina verksamheter',\n campaigns: 'Kampanjer',\n newCustomers: 'Nya medlemmar',\n returningCustomers: 'Återkommande medlemmar',\n totalPeriod: 'Registreringar för perioden',\n totalCampaigns: 'Totalt antal kampanjer',\n total: 'Totalt antal registreringar',\n totalCustomers: 'Totalt antal medlemmar'\n }\n }\n }\n};\nexport default homeTranslations;\n","const loginTranslations = {\n en: {\n title: 'Login',\n usernameOrEmail: 'Username or Email',\n requiredField: 'This field is required',\n password: 'Password',\n rememberMe: 'Remember me',\n submit: 'Submit',\n forgotPassword: {\n text1: 'Forgot',\n text2: 'password?'\n },\n contract: {\n signBefore: 'Sign before:',\n topBar: 'Please sign your contract',\n header: 'Hey, we have noticed that you still haven’t signed the contract 📝',\n subHeader: 'This is a the required step to keep using our product! ',\n sign: 'Sign the contract',\n skip: 'Skip for now'\n }\n },\n se: {\n title: 'Login',\n usernameOrEmail: 'Användarnamn eller Email',\n requiredField: 'Nödvändigt fält',\n password: 'Lösenord',\n rememberMe: 'Kom ihåg mig',\n submit: 'Logga in',\n forgotPassword: {\n text1: 'Glömt',\n text2: 'lösenord?'\n },\n contract: {\n signBefore: 'Signera innan:',\n topBar: 'Vänligen signera ditt kontrakt',\n header: 'Hej! Vi ser att du inte signerat ditt kontrakt 📝',\n subHeader: 'Det här är ett obligatoriskt steg för att kunna fortsätta använda vår produkt!',\n sign: 'Signera kontraktet',\n skip: 'Hoppa över'\n }\n }\n};\n\nexport default loginTranslations;\n","import { STAMP_CARD_HASH_EXAMPLE } from 'utils/utils';\n\ntype Translation = {\n tabTitle: string;\n members: {\n title: string;\n totalMembers: string;\n totalAdmins: string;\n totalAdminsTooltip: string;\n returningCustomers: string;\n unregisteredCustomerLength: string;\n unregisterCustomer: { title: string; subtitle: string; example: string; button: string };\n confirmPopup: { title: string; allVenues: string; confirm: string; decline: string };\n unregister: {\n success: string;\n fail: string;\n generalError: string;\n invalidNumber: string;\n alreadyUnregistered: string;\n unregisteredFromAll: string;\n notACustomer: string;\n };\n };\n stampCard: {\n title: string;\n subtitle: string;\n sendSms: {\n title: string;\n subtitle: string;\n subtitleMultiVenue: string;\n next: string;\n stampCardSelector: { title: string };\n confirmDialog: { title: string; subtitle: { 1: string; 2: string; 3: string; 4: string } };\n toasts: { success: string; notAMember: string; unknownError: string; unregistered: string };\n };\n };\n};\n\ntype MemberManagementTranslations = {\n se: Translation;\n en: Translation;\n};\n\nconst memberManagementTranslations: MemberManagementTranslations = {\n en: {\n tabTitle: 'Member Management',\n members: {\n title: 'Club Member Management',\n totalMembers: 'Total members in club',\n totalAdmins: 'Total admins in club',\n totalAdminsTooltip:\n 'Admins are excluded from the total members in the club and do not get counted when sending SMS campaigns, but will still recieve the SMS',\n returningCustomers: 'Returning members (2 or more registrations)',\n unregisteredCustomerLength: 'Unregistered members',\n unregisterCustomer: {\n title: 'Unregister a phone number',\n subtitle:\n 'Unregistered customers will not receive any more communication from your membership club, neither will they be able to redeem rewards in any loyalty programs you have created. ' +\n 'Customers will be automatically re-enrolled in your membership club when entering their phone number on the registration display.',\n example: 'The telephone number must start with 07, for example: 0701234567',\n button: 'Next step'\n },\n confirmPopup: {\n title: 'Confirm Deregistration of Phone Number',\n allVenues: 'All venues',\n confirm: 'Confirm',\n decline: 'Abort'\n },\n unregister: {\n success: 'Telephone number unregistered',\n fail: 'Failed to unregister telephone number',\n generalError:\n 'Unknown error, please try again. If the problem persists, contact PayAtt at info@payatt.store',\n invalidNumber: 'Invalid telephone number. The number must be Swedish and start with the digit 0',\n alreadyUnregistered: 'Telephone number has already been unregistered',\n unregisteredFromAll: 'Telephone number was unregistered from all venues',\n notACustomer: 'This customer does not exist in your membership club'\n }\n },\n stampCard: {\n title: 'Stamp Card Campaign',\n subtitle: 'Stamp Card related management',\n sendSms: {\n title: 'Send a new Stamp Card welcome SMS',\n subtitle:\n 'The message will include the customers Stamp Card URL. Click on Next step to see what the message will look like.',\n subtitleMultiVenue: `The message will include the customers Stamp Card URL. Click on Next step to see what the message will look like.\n If you Stamp Card Campaign spans multiple venues, the customer will see the SMS sender name from the venue where he/she first registered.`,\n next: 'Next step',\n stampCardSelector: { title: 'Stamp Card campaign' },\n confirmDialog: {\n title: 'Send Stamp Card welcome SMS',\n subtitle: {\n 1: 'Recipient: ',\n 2: 'Stamp Card Campaign: ',\n 3: 'This is free and will not use any of your monthly SMS',\n 4: `The text \"${STAMP_CARD_HASH_EXAMPLE}\" is an example and will be replaced with the correct code for the recipient`\n }\n },\n toasts: {\n success: 'New welcome SMS with stamp card URL sent',\n notAMember: 'No Stamp Card found associated with the provided phone number',\n unregistered: 'Customer has unregistererd from your venue',\n unknownError: 'Unknown error'\n }\n }\n }\n },\n se: {\n tabTitle: 'Medlemshantering',\n members: {\n title: 'Hantering av medlemmar',\n totalMembers: 'Totalt antal medlemmar',\n totalAdmins: 'Totalt antal admins',\n totalAdminsTooltip:\n 'Admins exkluderas från det totala antalet medlemmar i klubben och räknas inte när man skickar SMS-kampanjer, men kommer fortfarande att få ett SMS',\n returningCustomers: 'Återkommande medlemmar (2 eller fler registreringar)',\n unregisteredCustomerLength: 'Avregistrerade medlemmar',\n unregisterCustomer: {\n title: 'Avregistrera ett telefonnummer',\n subtitle:\n 'Avregistrerade kunder kommer bli helt uteslutna ur all kommunikation relaterat till din medlemsklubb. ' +\n 'Om en kund skulle ångra sig och vilja ta del av era erbjudanden så krävs återregistrering på er skärm.',\n example: 'Telefonnumret måste börja med 07, till exempel: 0701234567',\n button: 'Nästa steg'\n },\n confirmPopup: {\n title: 'Bekräfta avregistrering av telefonnummer',\n allVenues: 'Alla verksamheter',\n confirm: 'Bekräfta',\n decline: 'Avbryt'\n },\n unregister: {\n success: 'Telefonnummer avregistrerat',\n fail: 'Misslyckades med att avregistrera telefonnummer',\n generalError:\n 'Okänt fel, vänligen försök igen. Om problemet kvarstår, vänligen kontakta PayAtt på info@payatt.store',\n invalidNumber:\n 'Ogiltigt telefonnummer, telefonnumret måste vara svenskt och börja med siffran 0. E.g. 0701234567',\n alreadyUnregistered: 'Telefonnummer redan avregistrerat',\n unregisteredFromAll: 'Telefonnummer avregistrerats från alla verksamheter',\n notACustomer: 'Obefintlig kund'\n }\n },\n stampCard: {\n title: 'Stämpelkortskampanj',\n subtitle: 'Stämpelkortsrelaterad hantering',\n sendSms: {\n title: 'Skicka ett nytt välkomst-sms för ditt stämpelkort',\n subtitle:\n 'Meddelandet kommer att innehålla kundens stämpelkortslänk. Klicka på Nästa steg för att hur meddelandet kommer att se ut.',\n subtitleMultiVenue: `Meddelandet kommer att innehålla kundens stämpelkortslänk. Klicka på Nästa steg för att hur meddelandet kommer att se ut.\n Om du din stämpelkortskampanj inkluderar flera verksamheter kommer kunden att se avsändarnamnet från den verksamhet där han/hon registrerade sig först.`,\n next: 'Nästa steg',\n stampCardSelector: { title: 'Stämpelkortskampanj' },\n confirmDialog: {\n title: 'Skicka stämpelkortskampanj välkomst-SMS',\n subtitle: {\n 1: 'Mottagare: ',\n 2: 'Stämpelkortskampanj: ',\n 3: 'Detta SMS är gratis och kommer inte att påverka den pott du disponerar',\n 4: `Texten \"${STAMP_CARD_HASH_EXAMPLE}\" är ett exempel och kommer bytas ut mot en korrekt kod för mottagaren`\n }\n },\n toasts: {\n success: 'Nytt välkomst SMS med stämpelkortslänk skickad',\n notAMember: 'Inget stämpelkort kunde hittas med det angivna telefonnummeret',\n unregistered: 'Kund har avregistrerat från din verksamhet',\n unknownError: 'Okänt fel'\n }\n }\n }\n }\n};\nexport default memberManagementTranslations;\n","const passwordResetTranslations = {\n en: {\n title: 'Reset Password',\n submit: 'Submit',\n verify: 'Verify',\n cancel: 'Cancel',\n newToken: 'New code',\n header: {\n title: 'Forgot password?',\n subheader: 'Tell us your email address and we will send you a password reset link'\n },\n content: {\n email: 'Email address',\n placeholder: 'example@gmail.com'\n },\n error: {\n invalid: 'Invalid email',\n required: 'Email address is required',\n failed: 'Failed to send password reset email, contact PayAtt',\n verifyCodeFail: 'Invalid token',\n expiredToken: 'Token is expired, please request a new one',\n unexpectedErrorTokenVerify: 'Unexpected error when verifying token'\n },\n success: {\n header: 'A password reset link has been sent to your email',\n subheader: 'Enter the code from your email in the field below'\n },\n newPassword: {\n header: 'Password reset',\n subheader: 'Enter a new password',\n title: 'New Password',\n newPasswordText: 'Password',\n confirmPasswordText: 'Confirm Password',\n error: {\n serverError: 'Unexpected error',\n invalidToken: 'Invalid token, please start over',\n invalidPassword: 'Invalid Password',\n passwordNotSame: \"Passwords don't match\",\n minPasswordLength: 'Minimum New Password Length is 8',\n formatRequirements:\n 'The password must contain at least 1 number, both small and large letters and at least one special symbol'\n },\n successToast: 'Succesfully updated password!'\n }\n },\n se: {\n title: 'Återställ Lösenord',\n submit: 'Skicka',\n verify: 'Verifiera',\n cancel: 'Tillbaka',\n newToken: 'Ny kod',\n header: {\n title: 'Glömt ditt lösenord?',\n subheader: 'Skriv in din email så skickar vi en återställnings-länk'\n },\n content: {\n email: 'Email address',\n placeholder: 'example@gmail.com'\n },\n error: {\n invalid: 'Ogiltig email',\n required: 'Fyll i din email',\n failed: 'Misslyckades med att skicka en länk för lösenordsåterställning, vänligen kontakta PayAtt',\n verifyCodeFail: 'Ogiltig kod',\n expiredToken: 'Din kod är inte längre giltig, vänligen begär en ny kod med knappen nedan',\n unexpectedErrorTokenVerify: 'Okänt fel vid validering av kod'\n },\n success: {\n header: 'En länk för att återställa ditt lösenord har skickats till din email',\n subheader: 'Fyll i koden från ditt email i rutan nedan'\n },\n newPassword: {\n title: 'Nytt lösenord',\n header: 'Återställ lösenord',\n subheader: 'Fyll i nytt lösenord',\n newPasswordText: 'Lösenord',\n confirmPasswordText: 'Bekräfta lösenord',\n error: {\n serverError: 'Okänt fel',\n invalidToken: 'Ogiltig token, vänligen börja om på nytt',\n invalidPassword: 'Ogiltigt lösenord',\n passwordNotSame: 'Lösenord överenstämmer inte',\n minPasswordLength: 'Det nya lösenordet måste vara minst 8 tecken',\n formatRequirements:\n 'Lösenordet måste innehålla minst 1 siffra, både små och stora bokstäver samt minst ett specialtecken'\n },\n successToast: 'Ditt lösenord har uppdaterats!'\n }\n }\n};\n\nexport default passwordResetTranslations;\n","const integrationTranslations = {\n en: {\n header: 'Integrations',\n description: {\n text1: 'Add cashier system integrations for the organisation',\n text2: `If you are integrated with a cashier system, registrations will automatically be connected to purchases,\n which means you will get more options on how to filter the target group when sending SMS campaigns. \n You will also be able to create `,\n text3: 'product based stamp cards.',\n text4: 'We support integrations with the following providers',\n text5: 'For more information, or to remove an integration, contact '\n },\n listItem: {\n onslip: {\n primary: 'Integrate with Onslip',\n secondary: 'To integrate with Onslip you must contact '\n },\n zettle: {\n primary: 'Integrate with Zettle',\n secondary: 'Click on this row to get more information and to start the integration-process',\n instructions: {\n text1: 'To integrate with Zettle you must log in with your Zettle account and accept that PayAtt will receive access rights to read ',\n text2: 'purchase data ',\n text3: 'and ',\n text4: 'product information.',\n text5: 'Information from Zettle regarding integrations ',\n text6: 'Zettle integrations',\n text7: `When you click on the button below, a new window will open where you need to log in with your Zettle account and accept the PayAtt integration.\n When the process is done, you will automatically be redirected back to this page. `,\n text8: 'If your venue has multiple registration displays, you must first select which one of these you wish to integrate.'\n },\n startIntegrationButton: 'Integrate'\n }\n },\n selectPos: {\n nothingSelected: 'Select display',\n label: 'Select registration display'\n },\n toasts: {\n successfullIntegration: 'You are now integrated with'\n }\n },\n se: {\n header: 'Integrationer',\n description: {\n text1: 'Lägg till kassa-systems integrationer för organisationen',\n text2: `Om du är integrerad mot ett kassa-system så kopplas automatiskt dina köp mot ett telefonnumer, \n vilket innebär att du kommer att få fler valmöjligheter till filtrering av mottagar grupp vid SMS-kampanjer. \n Du kommer även att kunna skapa `,\n text3: 'produkt-baserade stämpelkort.',\n text4: 'Just nu stödjer vi integrationer med följande kassa-system',\n text5: 'För mer information, eller för att ta bort en integration, kontakta '\n },\n listItem: {\n onslip: {\n primary: 'Integrera med Onslip',\n secondary: 'För att integrera med Onslip behöver du kontakta '\n },\n zettle: {\n primary: 'Integrera med Zettle',\n secondary: 'Klicka på raden för att få mer information och påbörja integrerings-processen',\n instructions: {\n text1: 'För att integrera med Zettle behöver du logga in med ditt Zettle-konto och acceptera att PayAtt får behörighet att läsa din ',\n text2: 'köpdata ',\n text3: 'samt ',\n text4: 'produktlista.',\n text5: 'Information från Zettle om vad integrationer innebär ',\n text6: 'Zettle-integrationer',\n text7: `När du klickar på knappen nedan kommer ett nytt fönster att öppnas där du loggar in med ditt Zettle-konto och accepterar PayAtt-integrationen. \n När processen är klar kommer du automatiskt att skickas tillbaka till denna sida. `,\n text8: 'Om din verksamhet har flera registreringsskärmar, måste du först välja vilken registreringsskärm som du vill integrera.'\n },\n startIntegrationButton: 'Integrera'\n }\n },\n selectPos: {\n nothingSelected: 'Välj display',\n label: 'Välj registreringsskärm'\n },\n toasts: {\n successfullIntegration: 'Du är nu integrerad med'\n }\n }\n};\nexport default integrationTranslations;\n","const profileTranslations = {\n en: {\n profile: {\n title: 'Profile'\n },\n settings: {\n title: 'Venue Settings'\n },\n logOut: 'Log out',\n logOutToast: 'Your session has expired and you will be automatically logged out in 10 seconds',\n logOutContractSignUrl: 'Contract sign URL',\n logOutContractToast: `To continue using our product, you must sign a contract. You can do this by clicking the link below, or you can also find it in your email inbox.\n\t\t\t\t Please note that if you do not sign the contract, you will be automatically logged out in 5 minutes.`\n },\n se: {\n profile: {\n title: 'Profil'\n },\n settings: {\n title: 'Inställningar'\n },\n logOut: 'Logga ut',\n\n logOutToast: 'Din session har löpt ut och du kommer automatiskt att loggas ut om 10 sekunder',\n\n logOutContractSignUrl: 'URL för att skriva under kontrakt',\n logOutContractToast: `För att fortsätta använda vår produkt måste du skriva under ditt kontrakt. Du kan göra detta genom att klicka på länken nedan eller så hittar du den också i din e-postinkorg.\n\t\t\t\t Observera att om du inte skriver under kontraktet så kommer du att automatiskt loggas ut om 5 minuter.`\n }\n};\nexport default profileTranslations;\n","const profileTranslations = {\n en: {\n title: 'User Settings',\n general: {\n header: {\n title: 'User Settings'\n },\n cannotBeChanged: 'Contact PayAtt to change',\n name: {\n firstName: 'First Name',\n lastName: 'Last Name'\n },\n username: { text: 'Username' },\n email: {\n text: 'Email',\n confirmText: 'Confirm email'\n },\n title: { text: 'Title' },\n role: { text: 'Permission' },\n errors: {\n invalidFirstName: 'Invalid First Name',\n invalidLastName: 'Invalid Last Name',\n invalidUsername: 'Invalid Username',\n invalidEmail: 'Invalid Email',\n emailNotSame: \"Emails don't match\"\n },\n success: 'Successfully updated user settings',\n fail: 'Failed to update user settings',\n usernameChangeLogout: 'Username updated, you will automatically be logged out in 5 seconds'\n },\n contact: {\n header: {\n title: 'Contact',\n subtitle: 'Update Contact Details'\n },\n phoneNumber: { text: 'Phone Number' },\n countryOfResidency: { text: 'Country of Residence' },\n success: 'Contact details successfully updated',\n fail: 'Failed to update contact details',\n invalidPhoneNumber: 'Phone number is invalid'\n },\n merchant: {\n header: {\n title: 'SMS Campaign',\n subtitle: 'Update SMS campaign settings'\n }\n },\n changePassword: {\n header: {\n title: 'Change Password',\n subtitle: 'Start typing your current password to update'\n },\n current: 'Current Password',\n new: 'New Password',\n confirmText: 'Confirm Password',\n passwordRequirements:\n 'The password must be at least 8 characters, contain at least 1 number, both small and large letters and at least one special symbol',\n errors: {\n invalidPassword: 'Invalid Password',\n passwordNotSame: \"Passwords don't match\",\n passwordUpdateFail: 'Old password incorrect',\n missingPassword: 'Missing Password',\n missingCurrentPassword: 'Missing Current Password',\n missingNewPassword: 'Missing New Password',\n missingConfirmPassword: 'Confirmation password missing',\n newPasswordDifferentThanCurrent: 'The new password must be different than the old one',\n minPasswordLength: 'Minimum New Password Length is 8',\n passwordRequirements:\n 'The password must contain at least 1 number, both small and large letters and at least one special symbol'\n },\n success: 'Your password was succcesfully updated',\n fail: 'Password update failed'\n },\n confirm: {\n title: 'Confirm changes',\n text: 'The following fields will be updated',\n confirm: 'Confirm',\n decline: 'Decline',\n willLogOut: 'You will be automatically logged out in order for these changes to take affect'\n },\n confirmDialog: {\n firstName: 'First Name',\n lastName: 'Last Name',\n username: 'Username',\n email: 'Email',\n title: 'Title',\n currentPassword: 'Password',\n phoneNumber: 'Phone Number',\n countryOfResidence: 'Country of Residence'\n }\n },\n se: {\n title: 'Användarinställningar',\n general: {\n header: {\n title: 'Användarinställningar'\n },\n cannotBeChanged: 'Kontakta PayAtt för att ändra',\n name: {\n firstName: 'Förnamn',\n lastName: 'Efternamn'\n },\n username: { text: 'Användarnamn' },\n email: {\n text: 'Email',\n confirmText: 'Bekräfta email'\n },\n title: { text: 'Titel' },\n role: { text: 'Behörighet' },\n errors: {\n invalidFirstName: 'Ogiltigt förnamn',\n invalidLastName: 'Ogiltigt efternamn',\n invalidUsername: 'Ogiltigt användarnamn',\n invalidEmail: 'Ogiltig email',\n emailNotSame: 'Email överenstämmer inte'\n },\n success: 'Dina inställningar har uppdaterats',\n fail: 'Misslyckades med att uppdatera dina inställningar',\n usernameChangeLogout: 'Användarnamn har uppdaterats, du loggas automatiskt ut om 5 sekunder'\n },\n contact: {\n header: {\n title: 'Kontaktuppgifter',\n subtitle: 'Uppdatera dina kontaktuppgifter'\n },\n phoneNumber: { text: 'Telefonnummer' },\n countryOfResidency: { text: 'Bosättningsland' },\n success: 'Dina kontaktupgifter har uppdaterats',\n fail: 'Misslyckades med att uppdatera dina kontaktupgifter',\n invalidPhoneNumber: 'Telefonnumret är ogiltigt'\n },\n merchant: {\n header: {\n title: 'SMS-Kampanjer',\n subtitle: 'Uppdatera dina SMS-kampanj inställningar'\n }\n },\n changePassword: {\n header: {\n title: 'Ändra lösenord',\n subtitle: 'Fyll i nuvarande lösenord för att uppdatera'\n },\n current: 'Nuvarande lösenord',\n new: 'Nytt lösenord',\n confirmText: 'Bekräfta lösenord',\n passwordRequirements:\n 'Lösenordet måste vara minst 8 tecken, innehålla minst 1 siffra, både små och stora bokstäver samt minst ett specialtecken',\n errors: {\n invalidPassword: 'Ogiltigt lösenord',\n passwordNotSame: 'Lösenord överenstämmer inte',\n passwordUpdateFail: 'Det gamla lösenordet är inkorrekt',\n missingPassword: 'Saknar lösenord',\n missingCurrentPassword: 'Nuvarande lösenord saknas',\n missingNewPassword: 'Nytt lösenord saknas',\n missingConfirmPassword: 'Bekräftelselösenord saknas',\n newPasswordDifferentThanCurrent: 'Det nya lösenordet måste skilja sig från det gamla',\n minPasswordLength: 'Det nya lösenordet måste vara minst 8 tecken',\n formatRequirements:\n 'Lösenordet måste innehålla minst 1 siffra, både små och stora bokstäver samt minst ett specialtecken'\n },\n success: 'Ditt lösenord har uppdaterats',\n fail: 'Ditt lösenord kunde inte uppdateras'\n },\n confirm: {\n title: 'Bekräfta ändringar',\n text: 'Följande fält kommer att uppdateras',\n confirm: 'Bekräfta',\n decline: 'Avbryt',\n willLogOut: 'Du kommer att automatiskt loggas ut för att ändringarna ska ta effekt'\n },\n confirmDialog: {\n firstName: 'Förnamn',\n lastName: 'Efternamn',\n username: 'Användarnamn',\n email: 'Email',\n title: 'Titel',\n currentPassword: 'Lösenord',\n phoneNumber: 'Telefonnummer',\n countryOfResidence: 'Bosättningsland'\n }\n }\n};\nexport default profileTranslations;\n","/* eslint-disable max-len */\n\ntype VenueSettingTrans = {\n title: string;\n noVenues: string;\n info: string;\n edit: { text: string; done: string };\n descriptionMultiVenue: string;\n form: {\n descriptionTopText: string;\n venueTitle: string;\n merchantTitle: string;\n smsSenderName: string;\n welcomeSMS: string;\n remainingCharacters: string;\n category: string;\n changePassword: { button: string; old: string; new: string; confirm: string };\n tooltip: { smsSenderName: string; welcomeSMS: string };\n submit: string;\n errors: {\n smsTooLong: string;\n smsTooShort: string;\n smsSenderTooShort: string;\n invalidCategory: string;\n };\n checkStampCardWarningText: { 1: string; 2: string };\n };\n confirm: { title: string; text: string; accept: string; decline: string };\n upload: { success: string; fail: string; venueTitleConflict: string; noEmojis: string; unknownError: string };\n sidebar: { title: string; general: string };\n header: { integrated: { multiple: string; unknown: string; onslip: string; zettle: string; eskassa: string } };\n confirmSaveText: string;\n confirmSave: string;\n confirmDecline: string;\n};\n\nconst settingsTranslations: { en: VenueSettingTrans; se: VenueSettingTrans } = {\n en: {\n title: 'Settings',\n noVenues: \"You don't have any venues to manage\",\n info: 'Remember that different people in your organization may have access to different venues.',\n edit: {\n text: 'Edit',\n done: 'Done'\n },\n descriptionMultiVenue: `This is the settings page for your organization %{merchant}
\n
\n All venues are treaded as separate entities and have individual settings, select a venue in the navigation panel to the left.\n

\n If you wish to change the organization name, you must contact PayAtt\n `,\n form: {\n descriptionTopText:\n 'Click edit to the right and update one or more fields in the form. All relevant updates will be visible immediately on your registration display.',\n venueTitle: 'Venue title',\n merchantTitle: 'Organization title',\n smsSenderName: 'Sender name',\n welcomeSMS: 'Welcome SMS',\n remainingCharacters: 'Remaining characters',\n category: 'Category',\n changePassword: {\n button: 'Change password',\n old: 'Old password',\n new: 'New password',\n confirm: 'Confirm new password'\n },\n tooltip: {\n smsSenderName: 'Sender name displayed on text messages sent to customers',\n welcomeSMS:\n 'Text message automatically sent to all newly registered customers. This message is only sent out once, upon first registration. A link for the custoemr to deregister from the customer club will automatically be added to the end of the SMS.'\n },\n submit: 'Save',\n errors: {\n smsTooLong: 'SMS too long',\n smsTooShort: 'SMS too short',\n smsSenderTooShort: 'Name too short',\n invalidCategory: 'Invalid category'\n },\n checkStampCardWarningText: { 1: 'Test your layout on the ', 2: 'registration display' }\n },\n confirm: {\n title: 'Confirm settings update',\n text: 'You have chosen to update the following settings',\n accept: 'Accept',\n decline: 'Decline'\n },\n upload: {\n success: 'Successfully updated settings',\n fail: 'Failed to update settings',\n venueTitleConflict: 'Venue title already in use',\n noEmojis: 'Welcome SMS may not contain emojis',\n unknownError: 'Unknown error'\n },\n sidebar: {\n title: 'Select venue',\n general: 'General'\n },\n header: {\n integrated: {\n multiple: 'Multiple integrations',\n unknown: 'Integrated',\n onslip: 'Integrated with Onslip',\n zettle: 'Integrated with Zettle',\n eskassa: 'Integrated with ESKassa'\n }\n },\n confirmSaveText: 'Are you sure you want to submit the following changes?',\n confirmSave: 'Confirm',\n confirmDecline: 'Decline'\n },\n se: {\n title: 'Inställningar',\n noVenues: 'Du har inga verksamheter att hantera',\n info: 'Kom ihåg att olika användare i din organisation kan ha tillgång till olika verksamheter',\n edit: {\n text: 'Ändra',\n done: 'Spara'\n },\n descriptionMultiVenue: `Ändra inställningar för din organisation %{merchant}
\n
\n Alla verksamheter behandlas separat och har individuella inställningar. Välj en verksamhet i menyn till vänster.\n

\n Om du önskar ändra organisationsnamnet måste du kontakta PayAtt\n `,\n form: {\n descriptionTopText:\n 'Klicka på redigera (till höger) och uppdatera ett eller fler fält. Du kommer att kunna se relevanta uppdateringar direkt på registreringsskärmen.',\n venueTitle: 'Verksamhets-namn',\n merchantTitle: 'Organisations namn',\n smsSenderName: 'Avsändarnamn SMS',\n welcomeSMS: 'Välkomst-SMS',\n remainingCharacters: 'Återstående tecken',\n category: 'Kategori',\n changePassword: {\n button: 'Ändra lösenord',\n old: 'Ditt gamla lösenord',\n new: 'Ditt nya lösenord',\n confirm: 'Bekräfta ditt nya lösenord'\n },\n tooltip: {\n smsSenderName: 'Avsändarnamn på SMS-utskick',\n welcomeSMS:\n 'Skickas automatiskt till alla nya medlemmar som registrerar sig. Detta meddelande skickas endast ut en gång, till kunder när dom registrar sig för första gången. En avregistrerings-länk kommer automatiskt att läggas till i slutet av meddelandet.'\n },\n submit: 'Spara',\n errors: {\n smsTooLong: 'SMS för långt',\n smsTooShort: 'SMS för kort',\n smsSenderTooShort: 'Namn för kort',\n invalidCategory: 'Ogiltig kategori'\n },\n checkStampCardWarningText: { 1: 'Testa din layout på ', 2: 'registreringskärmen' }\n },\n confirm: {\n title: 'Bekräfta uppdatering av inställningar',\n text: 'Du har valt att uppdatera följande inställningar',\n accept: 'Bekräfta',\n decline: 'Avbryt'\n },\n upload: {\n success: 'Inställningar uppdaterade',\n fail: 'Misslyckades med att uppdatera inställningar',\n venueTitleConflict: 'Titel redan i bruk',\n noEmojis: 'Välkomst-SMS får inte innehålla emojis',\n unknownError: 'Okänt fel'\n },\n sidebar: {\n title: 'Välj verksamhet',\n general: 'Allmänt'\n },\n header: {\n integrated: {\n multiple: 'Flera integrationer',\n unknown: 'Integrerad',\n onslip: 'Integrerad med Onslip',\n zettle: 'Integrerad med Zettle',\n eskassa: 'Integrerad med ESKassa'\n }\n },\n confirmSaveText: 'Bekräfta uppdatering av inställningar',\n confirmSave: 'Bekräfta',\n confirmDecline: 'Avbryt'\n }\n};\nexport default settingsTranslations;\n","const notificationTranslations = {\n en: {\n title: 'Notifications',\n tooltip: 'Notifications',\n nothingToShow: 'No notifcations',\n loading: 'Loading...',\n view: 'View'\n },\n se: {\n title: 'Notifikationer',\n tooltip: 'Notifikationer',\n nothingToShow: 'Inga notifikationer',\n loading: 'Laddar...',\n view: 'Visa'\n }\n};\n\nexport default notificationTranslations;\n","const registrationTranslations = {\n en: {\n title: 'PayAtt Registrations',\n header: {\n welcome: 'Registration Statistics',\n subtitle: 'Get valuable insights on your customer registrations below'\n }\n },\n se: {\n title: 'PayAtt Registreringar',\n header: {\n welcome: 'Registreringsstatistik',\n subtitle: 'Få insikt i dina kunders registreringar nedan'\n }\n }\n};\n\nexport default registrationTranslations;\n","const sidebarTranslations = {\n se: {\n menu: {\n stampCard: {\n root: 'Stämpelkort',\n overview: 'Översikt',\n form: 'Skapa kort',\n trigger: 'Testa skärm'\n },\n home: 'Startsida',\n overview: 'Översikt',\n dashboard: 'Dashboard',\n campaigns: { root: 'IntelliSMS', newCampaign: 'Ny kampanj', overview: 'Kalender' },\n\n insights: 'Insikter',\n registrations: 'Registreringar',\n settings: {\n root: 'Inställningar',\n merchant: 'Verksamhet',\n intelliSms: 'IntelliSMS',\n introductions: 'Introduktioner',\n integrations: 'Integration'\n },\n views: 'Display',\n contact: 'Kontakta PayAtt',\n management: 'Hantering',\n profile: 'Profil',\n memberManagement: 'Medlemshantering'\n },\n header: {\n merchantSelect: {\n text: 'Välj verksamhet'\n },\n testUser: 'Test Användare',\n campaignsDisabled: 'SMS-Kampanjer Förbjudna',\n unauthenticated: `Du har blivit utloggad: Vänligen spara ett utkast av det du jobbar på och logga in på nytt`\n }\n },\n en: {\n menu: {\n stampCard: {\n root: 'Stamp Cards',\n overview: 'Overview',\n form: 'Create card',\n trigger: 'Trigger display'\n },\n home: 'Home',\n overview: 'Overview',\n dashboard: 'Dashboard',\n campaigns: { root: 'IntelliSMS', newCampaign: 'New campaign', overview: 'Calendar' },\n insights: 'Insights',\n registrations: 'Registrations',\n settings: {\n root: 'Settings',\n merchant: 'Venue',\n intelliSms: 'IntelliSMS',\n introductions: 'Introductions',\n integrations: 'Integration'\n },\n views: 'Display',\n contact: 'Contact PayAtt',\n management: 'Management',\n profile: 'Profile',\n memberManagement: 'Memberships'\n },\n header: {\n merchantSelect: {\n text: 'Select merchant'\n },\n testUser: 'Test User',\n campaignsDisabled: 'SMS Campaigns Disabled',\n unauthenticated: `You have been logged out: Please save a draft of what you were working on and log in again`\n }\n }\n};\n\nexport default sidebarTranslations;\n","export type ProlongModalWindowTranslationStructure = {\n prolong: string;\n cancel: string;\n warning: string;\n description: string;\n error: string;\n tooltips: {\n selectEndDate: string;\n };\n};\n\nconst prolongModalWindowTranslations: {\n en: ProlongModalWindowTranslationStructure;\n se: ProlongModalWindowTranslationStructure;\n} = {\n en: {\n description:\n 'Choose a new end date for your stamp card. Your customers will no longer be able to collect stamps or claim rewards after this day has passed.',\n prolong: 'Prolong',\n warning: 'Warning!',\n cancel: 'Cancel',\n error: 'Select end date!',\n tooltips: {\n selectEndDate: 'Please select new end date'\n }\n },\n se: {\n description:\n 'Välj det nya slutdatumet på ditt stämpelkort. Dina kunder kommer inte längre att kunna samla stämplar eller göra anspråk på belöningar efter att denna dag har passerat.',\n prolong: 'Förläng',\n warning: 'Varning!',\n cancel: 'Avbryt',\n error: 'Välj slutdatum!',\n tooltips: {\n selectEndDate: 'Vänligen välj ett nytt slutdatum'\n }\n }\n};\n\nexport default prolongModalWindowTranslations;\n","import prolongModalWindowTranslations from 'translations/stamp-card/stamp-card-form/prolongModalWindow';\n\nconst stampCardOverviewTranslations = {\n en: {\n tabTitle: 'Stamp Card',\n header: 'Stamp Card Overview',\n subheader1:\n 'Here you can view your past and current stamp cards. If you click on a stamp card, you will get more detailed statistics and see all available actions.',\n subheader2:\n 'For example, you can use any stamp card as a template for creating a new stamp card, as well as, re-enable an expired stamp card within 6 months after the end date.',\n products: 'Stamp card products',\n productListPosName: 'products',\n venues: 'Venues',\n displayDevices: 'Display devices',\n buttons: {\n expand: 'Open',\n selectVenue: 'Select Venue',\n selectStampCardType: 'Filter on status',\n stampCardTypeList: {\n all: 'All',\n active: 'Active',\n testMode: 'Test mode',\n disabled: 'Disabled',\n expired: 'Expired'\n },\n update: 'Update',\n return: 'Back to overview',\n copy: 'Copy',\n prolong: 'Prolong'\n },\n stats: {\n general: {\n title: 'General',\n totalMembers: 'Total stamp cards',\n totalVisits: 'Total stamps',\n rewardsEarned: 'Rewards earned',\n rewardsClaimed: 'Rewards claimed',\n startDate: 'Start date',\n endDate: 'End date',\n daysCampaignLasted: 'Days campaign lasted',\n daysSinceStart: 'Days since start date',\n products: 'Stamp card products (click to show)',\n venues: 'Venues (Click to show)'\n },\n availability: {\n limited: 'Limited availability',\n clickToShow: '(Click to show)',\n title: 'Availability',\n days: 'Days',\n interval: 'Hours'\n },\n rewards: {\n earned: 'Rewards Earned',\n claimed: 'Rewards Claimed'\n }\n },\n prolongModalWindow: prolongModalWindowTranslations.en\n },\n se: {\n tabTitle: 'Stämpelkort',\n header: 'Översikt av stämpelkort',\n subheader1:\n 'Här kan du se dina tidigare och nuvarande stämpelkortskampanjer. Klicka på ett stämpelkort för att se utökad statistik, samt olika åtgärder som kan appliceras.',\n subheader2:\n 'Du kan använda en befintlig stämpelkortskampanj som mall för ett nytt stämpelkort, samt återaktivera ett utgånget stämpelkort om mindre än 6 månader har gått sedan slutdatum.',\n products: 'Stämpelkort produkter',\n venues: 'Verksamheter',\n displayDevices: 'Display enheter',\n productListPosName: 'produkter',\n buttons: {\n expand: 'Öppna',\n selectVenue: 'Välj verksamhet',\n selectStampCardType: 'Filtrera på status',\n stampCardTypeList: {\n all: 'Alla',\n active: 'Aktiv',\n testMode: 'Övningsläge',\n disabled: 'Avaktiverad',\n expired: 'Utgången'\n },\n update: 'Uppdatera',\n return: 'Tillbaka till översikt',\n copy: 'Kopiera',\n prolong: 'Förläng'\n },\n stats: {\n general: {\n title: 'Allmänt',\n totalMembers: 'Antal stämpelkort',\n totalVisits: 'Antal stämplar',\n rewardsEarned: 'Intjänade belöningar',\n rewardsClaimed: 'Uthämtade belöningar',\n startDate: 'Startdatum',\n endDate: 'Slutdatum',\n daysCampaignLasted: 'Antal aktiva dagar',\n daysSinceStart: 'Dagar sedan startdatum',\n products: 'Stämpelkort produkter (klicka för att visa)',\n venues: 'Verksamheter (klicka för att visa)'\n },\n availability: {\n limited: 'Begränsad tillgänglighet',\n clickToShow: '(klicka för att visa)',\n title: 'Tillgänglighet',\n days: 'Dagar',\n interval: 'Timmar'\n },\n rewards: {\n earned: 'Intjänade Belöningar',\n claimed: 'Uthämtade belöningar'\n }\n },\n prolongModalWindow: prolongModalWindowTranslations.se\n }\n};\n\nexport default stampCardOverviewTranslations;\n","export type StampCardOverlayTranslationStructure = {\n title: string;\n body: string;\n website: string;\n};\n\nconst stampCardOverlayTranslations: {\n en: StampCardOverlayTranslationStructure;\n se: StampCardOverlayTranslationStructure;\n} = {\n en: {\n title: 'You need a subscription to use stamp card feature 🔒',\n body: 'Get more info about this feature by visiting our website ',\n website: 'https://payattclub.se/se/stamp-card/'\n },\n se: {\n title: 'Stämpelkortet är en betald funktion 🔒',\n body: 'För mer information, besök vår hemsida ',\n website: 'https://payattclub.se/se/stamp-card/'\n }\n};\n\nexport default stampCardOverlayTranslations;\n","export type StampCardPageTranslationStructure = {\n status404: {\n heading: string;\n contactText: string;\n campaignNotFound: string;\n campaignDisabled: string;\n };\n campaignExpired: string;\n cardWillRestart: string;\n testModelModal: { warning: string; text: string };\n additionalInformationModal: { intervals: string; extraInfo: string };\n validUntil: string;\n campaignEndsIn: string;\n rewards: {\n title: string;\n noRewards: string;\n countText: string;\n claim: {\n title: string;\n amountText: string;\n codeText: string;\n confirm: string;\n cancel: string;\n placeholder: string;\n };\n };\n toc: { title: string };\n toasts: {\n loading: string;\n invalidCode: string;\n expiredCampaign: string;\n successModal: { text: string };\n };\n};\n\nconst stampCardPageTranslations: {\n en: StampCardPageTranslationStructure;\n se: StampCardPageTranslationStructure;\n} = {\n en: {\n additionalInformationModal: {\n intervals: 'Availability hours:',\n extraInfo: 'Extra information:'\n },\n campaignExpired: 'Expired',\n cardWillRestart:\n 'Your stamp card is full and will restart with your next registration. You will of course keep all your collected rewards!',\n status404: {\n heading: 'Oops, something went wrong!',\n contactText: 'You may contact your stamp card provider for more details',\n campaignNotFound: 'No stamp card found',\n campaignDisabled: 'This campaign is disabled'\n },\n testModelModal: {\n warning: 'Warning',\n text: 'Your stamp card campaign is not activated!

To activate it, go to the \"Overview\" in the portal!'\n },\n validUntil: 'Valid through:',\n campaignEndsIn: 'This campaign ends in',\n rewards: {\n title: 'Rewards ready to be claimed',\n noRewards: 'None',\n countText: 'Count',\n claim: {\n title: 'Claim Reward',\n amountText: 'How many would you like to claim?',\n codeText: 'Enter code from cashier:',\n placeholder: 'Type the code here...',\n confirm: 'Confirm',\n cancel: 'Cancel'\n }\n },\n toc: {\n title: 'Terms and Conditions'\n },\n toasts: {\n loading: 'Loading...',\n invalidCode: 'Invalid code',\n expiredCampaign: 'Stamp card campaign has expired',\n successModal: {\n text: 'Show this screen to the cashier to claim your reward!'\n }\n }\n },\n se: {\n campaignExpired: 'Utgånget',\n cardWillRestart:\n 'Ditt stämpelkort är fullt och kommer att startas om vid nästa registreringstillfälle. Du behåller självklart alla dina intjänade belöningar!',\n status404: {\n heading: 'Hoppsan, något gick väldigt fel!',\n contactText:\n 'För mer information, vänligen kontakta den verksamhet som är ansvarig för stämpelkortskampanjen',\n campaignNotFound: 'Inget stämpelkort funnet',\n campaignDisabled: 'Denna kampanj är avstängd'\n },\n additionalInformationModal: {\n intervals: 'Giltighetstider:',\n extraInfo: 'Extra information:'\n },\n testModelModal: {\n warning: 'Varning',\n text: 'Din stämpelkortskampanj är inte aktiverad!

För att aktivera den, gå till \"Översikt\" i portalen!'\n },\n validUntil: 'Giltig t.o.m.',\n campaignEndsIn: 'Denna kampanj slutar',\n rewards: {\n title: 'Dina belöningar',\n noRewards: 'Dina belöningar kommer att synas här',\n countText: 'Antal',\n claim: {\n title: 'Hämta belöning',\n amountText: 'Hur många vill du hämta ut?',\n codeText: 'Fyll in koden från kassören:',\n placeholder: 'Skriv kod här...',\n confirm: 'Bekräfta',\n cancel: 'Avbryt'\n }\n },\n toc: {\n title: 'Allmänna villkor'\n },\n toasts: {\n loading: 'Laddar...',\n invalidCode: 'Fel kod',\n expiredCampaign: 'Stämpelkortskampanjen är utgången',\n successModal: {\n text: 'Visa kassören för att få din belöning!'\n }\n }\n }\n};\n\nexport default stampCardPageTranslations;\n","/* eslint-disable max-len */\nexport type PayAttWidgetsTranslationLang = {\n numberOfStampsAndStampCards: string;\n refreshStampCardDataTooltip: string;\n calculations: {\n explanationBox: { title: string; button: string };\n increasedRevenueBasedOnSMSCampaign: {\n explanationBox: {\n ul: {\n 1: { editingAllowed: string; editingDisabled: string };\n 2: { editingAllowed: string; editingDisabled: string };\n };\n };\n titleMissingMembers: string;\n title: { 1: string; 2: string };\n content: { 1: string; 2: { below120: string; above120: string }; 3: string };\n };\n increasedRevenueBasedOnVisits: {\n timespan: { yearly: string; quarterly: string };\n explanationBox: { ul: { 1: { editingAllowed: string; editingDisabled: string } } };\n title: string;\n content: {\n 1: string;\n 2: { time: { Quarterly: string; Yearly: string }; times: { Quarterly: string; Yearly: string } };\n 3: string;\n 4: string;\n 5: { Quarterly: string; Yearly: string };\n 6: string;\n 7: string;\n 8: string;\n };\n };\n increasedRevenueBasedStampCardCampaign: {\n timespan: { yearly: string; quarterly: string; monthly: string };\n explanationBox: {\n button: string;\n ul: {\n 1: { editingAllowed: string; editingDisabled: string };\n 2: string;\n 3: string;\n 4: string;\n 5: string;\n };\n };\n title: string;\n content: {\n 1: string;\n 2: string;\n 3: string;\n 4: { belowThreshold: string; aboveThreshold: string };\n 5: string;\n 6: { time: string; times: string };\n 7: string;\n };\n };\n };\n};\n\ntype PayAttWidgetsTranslationsType = {\n se: PayAttWidgetsTranslationLang;\n en: PayAttWidgetsTranslationLang;\n};\n\nconst PayAttWidgetsTranslations: PayAttWidgetsTranslationsType = {\n en: {\n numberOfStampsAndStampCards:\n 'Your customers have %{stampCards} Stamp Cards with a combined number of %{stamps} stamps',\n refreshStampCardDataTooltip: 'Update Stamp Card Data',\n calculations: {\n explanationBox: {\n title: 'Information',\n button: 'Want to know more about the calculation? Click here.'\n },\n increasedRevenueBasedOnSMSCampaign: {\n explanationBox: {\n ul: {\n 1: {\n editingAllowed:\n 'You may change values directly in the sentence to see your estimated revenue increase.',\n editingDisabled:\n 'You may change values directly in the sentence to see your estimated revenue increase. When you reach more than %{memberThreshold} members, your value will be shown instead.'\n },\n 2: {\n editingAllowed:\n 'We round off the number of returning customers after an SMS campaign. With 10 members and a value of 33% we therefore assume 3 customers will return, rounded down from 10 * (33 / 100) = 3.3',\n editingDisabled: 'We assume that one out of three customers who receive the SMS act on it.'\n }\n }\n },\n titleMissingMembers: 'Increase registrations to boost your sales',\n title: {\n 1: 'You have',\n 2: 'members - well done!'\n },\n content: {\n 1: 'If you write a well-formulated SMS and get',\n 2: {\n below120: 'of 120 members to visit your store, you will increase your revenue by',\n above120: 'of your members to visit your store, you will increase your revenue by'\n },\n 3: ', provided that each customer spends'\n }\n },\n increasedRevenueBasedOnVisits: {\n timespan: { yearly: 'year', quarterly: 'quarter' },\n explanationBox: {\n ul: {\n 1: {\n editingAllowed:\n 'You may change values directly in the sentence to see your estimated revenue increase.',\n editingDisabled:\n 'You may change values directly in the sentence to see your estimated revenue increase.'\n }\n }\n },\n title: 'Increase Your Revenue!',\n content: {\n 1: 'By encouraging the average customer to shop',\n 2: {\n time: { Quarterly: ' more time per', Yearly: ' more time per' },\n times: { Quarterly: ' more times per', Yearly: ' more times per' }\n },\n 3: 'you increase your revenue with',\n 4: ', which results in an increased earning of',\n 5: { Quarterly: 'per quarter', Yearly: 'per year' },\n 6: 'The above calculation is based on',\n 7: 'members, who spend on average',\n 8: 'and that your margin is'\n }\n },\n increasedRevenueBasedStampCardCampaign: {\n timespan: { yearly: 'year', quarterly: 'quarter', monthly: 'month' },\n explanationBox: {\n button: 'Want to know more about the calculation and see our sources? Click here.',\n ul: {\n 1: {\n editingAllowed:\n 'You may change values directly in the sentence to see your estimated revenue increase.',\n editingDisabled:\n 'You may change values directly in the sentence to see your estimated revenue increase.'\n },\n 2: 'We assume that customers visit your venue 1 time per month',\n 3: 'Sources',\n 4: 'Customers thar are part of a loyalty program spend 12-18% more on purchases.',\n 5: '20% of your customers represent 80% of your revenue'\n }\n },\n title: 'Did you know that?',\n content: {\n 1: 'Research shows that by engaging your customer through loyalty-programs, such as PayAtt stamp card, you can increase customer sales with',\n 2: '.',\n 3: 'For you, this could mean an increased revenue of',\n 4: { belowThreshold: 'per month, given', aboveThreshold: 'per month, given your' },\n 5: 'members, who on average visit one',\n 6: { time: 'time per month and spend', times: 'times per month and spend' },\n 7: 'each visit.'\n }\n }\n }\n },\n se: {\n numberOfStampsAndStampCards:\n 'Dina kunder har %{stampCards} stämpelkort med totalt %{stamps} stämplar',\n refreshStampCardDataTooltip: 'Uppdatera stämpelkortdata',\n calculations: {\n explanationBox: {\n title: 'Information',\n button: 'Vill du veta mer om vår uträkning? Klicka här.'\n },\n increasedRevenueBasedOnSMSCampaign: {\n explanationBox: {\n ul: {\n 1: {\n editingAllowed:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring.',\n editingDisabled:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring. Uträkningen är baserad på %{memberThreshold} medlemmar, när du överskrider detta antal så kommer ditt antal medlemmar att visas istället.'\n },\n 2: {\n editingAllowed:\n 'Vi avrundar antalet kunder som besöker din verksamhet efter ett SMS-utskick. Med 10 kunder och ett värde på 33% räknar vi alltså med att 3 kunder återkommer, avrundat nedåt från 10 * (33 / 100) = 3.3',\n editingDisabled: 'Vi antar att en av tre kunder som mottar ditt SMS agerar på detta.'\n }\n }\n },\n titleMissingMembers: 'Snabb registrering boostar din försäljning',\n title: {\n 1: 'Du har',\n 2: 'medlemmar - bra jobbat!'\n },\n content: {\n 1: 'Om du genom ett välriktat SMS kan få',\n 2: {\n below120: 'av 120 medlemmar att besöka din verksamhet, ökar du din omsättning med',\n above120: 'av dina medlemmar att besöka din verksamhet, ökar du din omsättning med'\n },\n 3: ', förutsatt att varje kund handlar för'\n }\n },\n increasedRevenueBasedOnVisits: {\n timespan: { yearly: 'året', quarterly: 'kvartalet' },\n explanationBox: {\n ul: {\n 1: {\n editingAllowed:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring.',\n editingDisabled:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring.'\n }\n }\n },\n title: 'Öka omsättningen!',\n content: {\n 1: 'Genom att få den genomsnittlige kunden att handla hos er ytterligare',\n 2: {\n time: { Quarterly: ' gång i', Yearly: ' gång om' },\n times: { Quarterly: ' gånger i', Yearly: ' gånger om' }\n },\n 3: 'ökar ni er omsättning med',\n 4: ', vilket resulterar i en ökad vinst om',\n 5: { Quarterly: 'i kvartalet', Yearly: 'om året' },\n 6: 'Ovan exempel baseras på att du har',\n 7: 'medlemmar, att ett snittinköp är',\n 8: 'och att ni har en bruttomarginal om'\n }\n },\n increasedRevenueBasedStampCardCampaign: {\n timespan: { yearly: 'året', quarterly: 'kvartalet', monthly: 'månaden' },\n explanationBox: {\n button: 'Vill du veta mer om vår uträkning och se våra källor? Klicka här.',\n ul: {\n 1: {\n editingAllowed:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring.',\n editingDisabled:\n 'Du kan ändra värden direkt i textrutan för att se din omsättningsförändring.'\n },\n 2: 'Vi antar att lojala kunder besöker din verksamhet i genomsnitt 1 gång per månad.',\n 3: 'Källor',\n 4: 'Kunder som är med i lojalitetsprogram spenderar 12-18% mer',\n 5: '20% av dina kunder står för 80% av din inkomst'\n }\n },\n title: 'Visste du att?',\n content: {\n 1: 'Forskning visar att du genom att engagera din kund genom lojalitetsprogram, exempelvis PayAtt stämpelkort, kan få denne att handla för',\n 2: ' mer.',\n 3: 'För dig kan detta innebära en ökad omsättning på',\n 4: { belowThreshold: 'i månaden, givet att du har', aboveThreshold: 'i månaden, givet dina' },\n 5: 'medlemmar, som besöker dig i snitt en',\n 6: { time: 'gång per månad och handlar för', times: 'gånger per månad och handlar för' },\n 7: 'per gång.'\n }\n }\n }\n }\n};\n\nexport default PayAttWidgetsTranslations;\n","/* eslint-disable max-len */\n\nexport type DashboardFilterTranslationLang = {\n settingsMenu: {\n title: string;\n description: string;\n };\n settings: {\n header: string;\n headerNoSettings: string;\n apply: string;\n accordionTitle: string;\n };\n datepicker: {\n label: string;\n tooltip: string;\n startDate: string;\n endDate: string;\n startAfterEnd: string;\n maxLength: string;\n now: string;\n orLabel: string;\n lastLabel: string;\n unit: {\n months: string;\n days: string;\n hours: string;\n minutes: string;\n };\n switchToTrailingTimeframe: string;\n switchToDateRangePicker: string;\n forever: string;\n };\n venueSelector: {\n label: string;\n placeholder: string;\n all: string;\n };\n stampCardSelector: {\n label: string;\n placeholder: string;\n all: string;\n active: string;\n testMode: string;\n disabled: string;\n expired: string;\n };\n periodic: {\n label: string;\n tooltip: string;\n dailyPeriodic: {\n label: string;\n };\n hourlyPeriodic: {\n label: string;\n };\n };\n};\n\ntype DashboardFilterTranslations = {\n se: DashboardFilterTranslationLang;\n en: DashboardFilterTranslationLang;\n};\n\nconst dashboardFilterTranslations: DashboardFilterTranslations = {\n en: {\n settingsMenu: {\n title: 'Filter',\n description: 'Applied to both the summary and all relevant charts/tables'\n },\n settings: {\n header: 'Chart filters',\n headerNoSettings: 'No filters available',\n apply: 'Apply',\n accordionTitle: 'Global filters'\n },\n datepicker: {\n label: 'Date range',\n tooltip: 'The graph will automatically adjust the axis, depending on the selected time interval',\n startDate: 'Start Date',\n endDate: 'End Date',\n startAfterEnd: 'Start date must be after end date',\n maxLength: 'You may only select up to 90 days',\n now: 'Now',\n orLabel: 'or',\n lastLabel: 'Last',\n unit: {\n months: 'months',\n days: 'days',\n hours: 'hours',\n minutes: 'minutes'\n },\n switchToTrailingTimeframe: 'Choose how far back in time you wish to show statistics',\n switchToDateRangePicker: 'Choose a specific start and end date',\n forever: 'All time'\n },\n venueSelector: {\n label: 'Venue selector',\n placeholder: 'Select venues',\n all: 'All'\n },\n stampCardSelector: {\n label: 'Stamp card campaign',\n placeholder: 'Select campaigns',\n all: 'All',\n active: 'Active',\n testMode: 'Test mode',\n disabled: 'Disabled',\n expired: 'Expired'\n },\n periodic: {\n label: 'Periodic charts',\n tooltip:\n 'Periodic charts take the time range into consideration. Do you know if your customers register at different times during the weekend compared to working days? What about during summer and winter? Do you know what time of the day had the highest impact during a specific holiday?

Change the timespan to find out!',\n dailyPeriodic: {\n label: 'Daily'\n },\n hourlyPeriodic: {\n label: 'Hourly'\n }\n }\n },\n se: {\n settingsMenu: {\n title: 'Filtrera',\n description: 'Påverkar samanfattningen samt alla relevanta tabeller/grafer'\n },\n settings: {\n header: 'Filtrera',\n headerNoSettings: 'Inga filter tillgängliga',\n apply: 'Använd',\n accordionTitle: 'Globala filter'\n },\n datepicker: {\n label: 'Tidsintervall',\n tooltip: 'Grafen ställer automatiskt in värdena på axlarna, beroende på hur långt tidsintervall du väljer',\n startDate: 'Startdatum',\n endDate: 'Slutdatum',\n startAfterEnd: 'Startdatum måste vara före slutdatum',\n maxLength: 'Du kan välja max 90 dagar',\n now: 'Nu',\n orLabel: 'eller',\n lastLabel: 'Senaste',\n unit: {\n months: 'månader',\n days: 'dagar',\n hours: 'timmar',\n minutes: 'minuter'\n },\n switchToTrailingTimeframe: 'Välj hur långt tillbaka i tid du vill visa statistik',\n switchToDateRangePicker: 'Välj specifika värden för start och slutdatum',\n forever: 'Alltid'\n },\n venueSelector: {\n label: 'Verksamhet',\n placeholder: 'Select campaigns',\n all: 'Alla'\n },\n stampCardSelector: {\n label: 'Stämpelkortskampanj',\n placeholder: 'Välj kampanj',\n all: 'Alla',\n active: 'Aktiv',\n testMode: 'Övningsläge',\n disabled: 'Avaktiverad',\n expired: 'Utgången'\n },\n periodic: {\n label: 'Periodiska diagram',\n tooltip:\n 'Periodiska diagram tar hänsyn till tidsintervallet.

Vet du om dina kunder registrerar sig vid olika tider under helgen jämfört med arbetsdagar? Hur är det under sommar och vinter? Vet du vilken tid på dagen som hade högst genomslag under en specifik helgdag?

Ändra tidsintervallet för att ta reda på det!',\n dailyPeriodic: {\n label: 'Veckodag'\n },\n hourlyPeriodic: {\n label: 'Tid på dygnet'\n }\n }\n }\n};\n\nexport default dashboardFilterTranslations;\n","export type HeaderTranslationLang = {\n title: string;\n shortSubText: string;\n popover: {\n title: string;\n description: string;\n ul: {\n 1: string;\n 2: string;\n 3: string;\n 4: string;\n 5: string;\n 6: string;\n 7: string;\n };\n contact: string;\n };\n};\n\ntype HeaderTranslations = {\n se: HeaderTranslationLang;\n en: HeaderTranslationLang;\n};\n\nconst headerTranslations: HeaderTranslations = {\n en: {\n title: 'Dashboard',\n shortSubText:\n 'By creating your own dashboard you can gain insight into customer registrations and stamp card usage. Click here for more information.',\n popover: {\n title: 'PayAtt Dashboard helps you gain insight into your data',\n description: `You can easily manage up to %{maxDashboardCount} Dashboards and customize them to your preferences. \n The size of your Dashboard is adjusted to your screen size. If you use different devices with different \n resolutions, we recommend creating a new Dashboard for each device for the best user experience.`,\n ul: {\n 1: `Create a new dashboard by clicking the menu button in the upper left corner and entering the new name \n at the bottom of the menu, then click the plus icon. You can also copy a Dashboard by clicking the \n arrow next to the save button in the upper right corner, then selecting \n New Dashboard from Layout and confirming by clicking the button on the left.`,\n 2: `You can set one of your Dashboards as Default; this dashboard will be displayed automatically \n when you open this tab. The Dashboard marked as default cannot be removed.`,\n 3: `You can add charts and other tools to your Dashboard by clicking on settings in the upper right corner, \n then on Widgets and on the Add button.`,\n 4: `After adding a chart, you can filter by date, choose chart type, stamp card campaign, and more. You can \n do this by clicking the settings button in the upper right corner of the chart.`,\n 5: `You can move around and adjust the size of all widgets on the Dashboard. You adjust the size by\n clicking on the little arrow in the bottomr right corner, and then making it bigger by draging the mouse. \n You can move objects to the desired position by clicking on the for arrows in the upper left corner, and then drag it to where you want it`,\n 6: `In the settings menu, you have global settings; when you change these filters, \n all widgets on your entire Dashboard will receive the new filters.`,\n 7: `Don't forget to save your Dashboard!`\n },\n contact: 'Feel free to contact us if you need any assistance.'\n }\n },\n se: {\n title: 'Dashboard',\n shortSubText:\n 'Genom att skapa din egen dashboard får du ökad insikt i dina kunders registreringar och stämpelkortsanvändande. Klicka här för mer information.',\n popover: {\n title: 'PayAtt Dashboard hjälper dig att få insikt i din data',\n description: `Du kan enkelt hantera upp till %{maxDashboardCount} Dashboards och anpassa dem efter dina önskemål. \n Storleken på din Dashboard är anpassad efter din skärmstorlek. Om du använder olika enheter med olika upplösning\n rekommenderar vi att du skapar en ny Dashboard på varje enhet för den bästa användarupplevelsen.`,\n ul: {\n 1: `Skapa en ny dashboard genom att klicka på meny-knappen i övre vänsta hörnet och skriv i det nya namnet \n längst ned i menyn, klicka därefter på plus-ikonen. Du kan även kopiera en Dashboard genom att klicka på pilen bredvid spara-knappen uppe i högra hörnet, \n därefter välja Ny Dashboard av layout och sedan bekräfta genom att klicka på knappen till vänster.`,\n 2: `Du kan markera ett av dina Dashboards som Default, den här dashboarden kommer att visas automatiskt \n när du öppnar denna flik. Den Dashboard som är markerad som default kan inte tas bort.`,\n 3: `Du kan lägga till grafer och andra verktyg på din Dashboard genom att klicka på inställningar uppe i högra hörnet,\n sedan på Widgets och på Lägg till knappen`,\n 4: `Efter att du lagt till en widget kan du filtrera på datum, välja layout, stämpelkortskampanj, och mer. Du gör detta genom att klicka\n på inställningsknappen uppe i högra hörnet på grafen.`,\n 5: `Du kan flytta runt och justera storleken på alla grafer och verktyg på din Dashboard. Du ändrar storleken genom att dra\n i pilen i nedre högra hörnet. Du kan flytta objektet genom att klicka på de fyra pilarna uppe i \n vänster hörn och sedan dra det dit du vill ha det.`,\n 6: `I inställningsmenyn har du globala inställningar, när du ändrar dessa filter så ändras alla Widgets\n på hela din Dashboard.`,\n 7: `Glöm inte bort att spara din Dashboard!`\n },\n contact: 'Tveka inte att kontakta oss om du behöver hjälp med något'\n }\n }\n};\n\nexport default headerTranslations;\n","/* eslint-disable max-len */\nimport { ChartNames } from 'views/Dashboard/Widgets/MongoDBWidgets/Interfaces/MongoDBWidgets.interfaces.names';\nimport { PayAttWidgetNames } from 'views/Dashboard/Widgets/PayAttWidgets/PayAttWidgets.names';\n\nimport PayAttWidgetsTranslations, { PayAttWidgetsTranslationLang } from './PayAttComponentTranslations';\nimport dashboardFilterTranslations, { DashboardFilterTranslationLang } from './filterTranslations';\nimport headerTranslations, { HeaderTranslationLang } from './headerTranslations';\n\nconst allWidgetNames = { ...ChartNames, ...PayAttWidgetNames };\n\ntype DashboardTranslationLang = {\n header: HeaderTranslationLang;\n emptyDashboardText: { 1: string; 2: string };\n globalSettings: {\n changeDefault: string;\n changeDefaultTooltip: string;\n newName: string;\n titleTooltip: string;\n changeNameButton: string;\n dangerZone: {\n title: string;\n deleteDashboardButton: string;\n deleteDashboardModal: {\n warning: string;\n confirmationText: string;\n delete: string;\n cancel: string;\n cannotDeleteDefaultText: string;\n };\n };\n addCharts: {\n title: string;\n chartTypes: {\n TimeBasedCharts: string;\n NumericCharts: string;\n DonutCharts: string;\n HistogramCharts: string;\n Others: string;\n };\n gridItemNames: Record;\n addItem: string;\n };\n breakpoints: {\n text: string;\n tooltip: {\n 1: string;\n 2: string;\n 3: string;\n 4: string;\n };\n xl: string;\n lg: string;\n md: string;\n sm: string;\n xs: string;\n };\n };\n chartFilters: DashboardFilterTranslationLang;\n PayAttWidgets: PayAttWidgetsTranslationLang;\n newDashboard: string;\n saveSelectButton: {\n save: string;\n newDashboardFromLayout: string;\n duplicateDashboard: string;\n description: string;\n };\n toasts: {\n dashboardNameUpdated: string;\n dashboardNameNotUpdated: string;\n dashboardUpdated: string;\n dashboardNotUpdated: string;\n dashboardDeleted: string;\n dashboardNotDeleted: string;\n dashboardCreated: string;\n dashboardNotCreated: string;\n dashboardNotFound: string;\n dashboardNotLoaded: string;\n invalidDashboardName: string;\n maximumNumberOfDashboardsReached: string;\n unknownError: string;\n cannotDeselectDefault: string;\n errorUpdatingDefault: string;\n maxNumberOfWidgets: string;\n };\n noDashboard: {\n title: string;\n text: string;\n button: string;\n buttonSubtitle: string;\n errorToast: string;\n };\n};\n\ntype DashboardTranslation = {\n en: DashboardTranslationLang;\n se: DashboardTranslationLang;\n};\n\nconst dashboardTranslations: DashboardTranslation = {\n en: {\n header: headerTranslations.en,\n emptyDashboardText: { 1: 'Click on Settings', 2: 'to add a widget' },\n globalSettings: {\n changeDefault: 'Set as default',\n changeDefaultTooltip: 'The default dashboard is shown when the page is loaded',\n newName: 'Change name',\n titleTooltip: 'Click the edit button to change the name',\n changeNameButton: 'Confirm',\n dangerZone: {\n title: 'Danger Zone',\n deleteDashboardButton: 'Delete',\n deleteDashboardModal: {\n warning: 'Warning',\n confirmationText:\n \"Are you sure you want to delete '%{name}'? This action is permanent and cannot be undone.\",\n delete: 'DELETE',\n cancel: 'Cancel',\n cannotDeleteDefaultText: 'Cannot delete default dashboard'\n }\n },\n addCharts: {\n title: 'Widgets',\n chartTypes: {\n TimeBasedCharts: 'Time Based Charts',\n NumericCharts: 'Numeric Charts',\n DonutCharts: 'Donut Charts',\n HistogramCharts: 'Histogram',\n Others: 'Tools'\n },\n gridItemNames: {\n registrationsOverTime: 'Registrations',\n registrationsOverTimePerVenue: 'Registrations per venue',\n registrationsNewOrReturningOverTime: 'Registrations new and returning',\n purchasesOverTime: 'Purchases with registrations',\n newStampCardsOverTime: 'New stamp cards',\n numberOfStampsOverTime: 'Number of stamps',\n numberOfStampsOverTimePerVenue: 'Number of stamps per venue',\n numberOfStampsNewOrReturningOverTime: 'Number of stamps new and returning',\n SMSCampaignsTotal: 'SMS campaigns',\n campaignSMSSentTotal: 'SMS campaigns sent',\n numberOfStampsTotal: 'Number of stamps',\n stampCardsRewardsClaimedTotal: 'Stamp card rewards claimed',\n stampCardsCreatedTotal: 'Stamp cards created',\n averageStampsPerStampCardDonut: 'Stamps per stamp card',\n numberOfStampsPerStampCardCampaignHistogram: 'Number of stamps per campaign',\n numberOfRegistrationsTotal: 'Number of registrations',\n numberOfUniqueRegistrationsTotal: 'Number of members',\n sendSMSCampaign: 'SMS Campaign',\n numberOfStampsAndStampCardsSentence: 'Number of stamps and stamp cards',\n increasedRevenueBasedOnVisits: 'Calculation of increased revenue based on visits',\n increasedRevenueBasedOnSMSCampaign: 'Calculator of increased revenue based on an SMS campaign',\n increasedRevenueBasedOnStampCardCampaign:\n 'Calculation of increased revenue based on Stamp Card Campaigns'\n },\n addItem: 'Add'\n },\n breakpoints: {\n text: 'Dashboard size',\n tooltip: {\n 1: 'Every time you save the dashboard, it will update the size to match your display size. Different sizes fit a different amount of elements on the screen, hence, a dashboard may look different depending on the display size of the device you are using.',\n 2: 'If your layout looks strange, or different from how you designed it, check if the dashboard size matches your display size. If not, it could be that you created this dashboard on a different device, such as a monitor, iPad, mobile phone, etc.',\n 3: `Dashboard size: %{dashboardBreakpoint}`,\n 4: `Screen size: %{breakpoint}`\n },\n xl: 'XXL',\n lg: 'Extra large',\n md: 'Large',\n sm: 'Medium',\n xs: 'Small'\n }\n },\n chartFilters: dashboardFilterTranslations.en,\n PayAttWidgets: PayAttWidgetsTranslations.en,\n newDashboard: 'Create new dashboard',\n saveSelectButton: {\n save: 'Save',\n newDashboardFromLayout: 'Clone Dashboard',\n duplicateDashboard: 'Duplicate',\n description: 'Select an action'\n },\n toasts: {\n dashboardNameUpdated: \"Name changed to '%{name}'\",\n dashboardNameNotUpdated: 'Failed to update name',\n dashboardUpdated: \"Dashboard '%{name}' updated\",\n dashboardNotUpdated: 'Failed to update dashboard',\n dashboardDeleted: \"'%{name}' deleted\",\n dashboardNotDeleted: \"Failed to delete '%{name}'\",\n dashboardCreated: \"Dashboard '%{name}' created\",\n dashboardNotCreated: 'Failed to create dashboard',\n dashboardNotFound: 'Dashboard not found',\n dashboardNotLoaded: 'Failed to load dashboard',\n invalidDashboardName:\n 'Invalid dashboard name \\'%{name}\\', must be between 3 and 15 characters long and contain only characters: [a-ö, A-Ö, 0-9, \"+\", \"-\", \"_\", \".\", \"&\", \" \"]',\n maximumNumberOfDashboardsReached: 'You can have max %{maximumNumberOfDashboards} dashboards',\n unknownError: 'Unknown Error',\n cannotDeselectDefault: 'Cannot deselect default dashboard',\n errorUpdatingDefault: 'Failed to set %{name} as default',\n maxNumberOfWidgets: 'Du kan ha max %{max} widgets på en dashboard'\n },\n noDashboard: {\n title: 'Welcome to your personal Dashboard manager!',\n text: 'Here you can create up to 10 Dashboards and may design them exactly as you wish, to gather valuable insight into your customer usage.',\n button: 'Create your first Dashboard',\n buttonSubtitle: 'We will generate a default Dashboard to help you get started',\n errorToast: 'Unknown error, please try again or contact PayAtt'\n }\n },\n se: {\n header: headerTranslations.se,\n emptyDashboardText: { 1: 'Klicka på Inställningar', 2: 'för att lägga till en widget' },\n globalSettings: {\n changeDefault: 'Använd som default',\n changeDefaultTooltip: 'Default dashboard visas när denna sida laddas',\n newName: 'Ändra namn',\n titleTooltip: 'Klicka på redigera knappen till höger för att ändra namn',\n changeNameButton: 'Ändra',\n dangerZone: {\n title: 'Riskzon',\n deleteDashboardButton: 'Ta bort',\n deleteDashboardModal: {\n warning: 'Varning',\n confirmationText: \"Är du säker på att du vill ta bort '%{name}' permanent?\",\n delete: 'TA BORT',\n cancel: 'Avbryt',\n cannotDeleteDefaultText: 'Kan inte ta bort default dashboard'\n }\n },\n addCharts: {\n title: 'Widgets',\n chartTypes: {\n TimeBasedCharts: 'Tidsbaserade grafer',\n NumericCharts: 'Nummeriska grafer',\n DonutCharts: 'Donut-grafer',\n HistogramCharts: 'Histogram',\n Others: 'Verktyg'\n },\n gridItemNames: {\n registrationsOverTime: 'Registreringar',\n registrationsOverTimePerVenue: 'Registreringar per verksamhet',\n registrationsNewOrReturningOverTime: 'Registreringar nya och återkommande',\n purchasesOverTime: 'Köp med registreringar',\n newStampCardsOverTime: 'Nya stämpelkort',\n numberOfStampsOverTime: 'Antal stämplar',\n numberOfStampsOverTimePerVenue: 'Antal stämplar per verksamhet',\n numberOfStampsNewOrReturningOverTime: 'Antal stämplar nya och återkommande',\n SMSCampaignsTotal: 'SMS-kampanjer',\n campaignSMSSentTotal: 'Antal SMS skickade i kampanjer',\n numberOfStampsTotal: 'Antal stämplar',\n stampCardsRewardsClaimedTotal: 'Stämpelkortsbelöningar uthämtade',\n stampCardsCreatedTotal: 'Skapade stämpelkort',\n averageStampsPerStampCardDonut: 'Stämplar per stämpelkort',\n numberOfStampsPerStampCardCampaignHistogram: 'Stämplar per stämpelkorts-kampanj',\n numberOfRegistrationsTotal: 'Antal registreringar',\n numberOfUniqueRegistrationsTotal: 'Antal medlemmar',\n sendSMSCampaign: 'Gör ett SMS-utskick',\n numberOfStampsAndStampCardsSentence: 'Antal stämplar och stämpelkort',\n increasedRevenueBasedOnVisits: 'Uträkning för omsättningsförändring baserat på besök',\n increasedRevenueBasedOnSMSCampaign: 'Uträkning för omsättningsförändring baserat på SMS-kampanj',\n increasedRevenueBasedOnStampCardCampaign:\n 'Uträkning för omsättningsförändring baserat på stämpelkort'\n },\n addItem: 'Lägg till'\n },\n breakpoints: {\n text: 'Dashboard-storlek',\n tooltip: {\n 1: 'Varje gång du sparar din dashboard uppdateras storleken till din skärmstorlek. Olika storlekar rymmer olika många element på skärmen, därmed kan en dashboard se olika ut beroende på skärmstorleken.',\n 2: 'Om din dashboard layout ser konstig ut, eller annorlunda från hur du designat den, verifiera att din dashboard-storlek matchar skärmstorleken. Annars kan det vara så att du byggt denna på en annan enhet, t.ex. på en monitor, iPad, mobil, etc.',\n 3: `Dashboard-storlek: %{dashboardBreakpoint}`,\n 4: `Skärmstorlek: %{breakpoint}`\n },\n xl: 'XXL',\n lg: 'Extra stor',\n md: 'Stor',\n sm: 'Mellan',\n xs: 'Liten'\n }\n },\n chartFilters: dashboardFilterTranslations.se,\n PayAttWidgets: PayAttWidgetsTranslations.se,\n newDashboard: 'Skapa ny dashboard',\n saveSelectButton: {\n save: 'Spara',\n newDashboardFromLayout: 'Kopiera dashboard',\n duplicateDashboard: 'Kopiera dashboard',\n description: 'Välj en åtgärd'\n },\n toasts: {\n dashboardNameUpdated: \"Namn ändrat till '%{name}'\",\n dashboardNameNotUpdated: 'Misslyckades med att ändra namn',\n dashboardUpdated: \"Dashboard '%{name}' uppdaterad\",\n dashboardNotUpdated: 'Misslyckades med att uppdatera dashboard',\n dashboardDeleted: \"'%{name}' har tagits bort\",\n dashboardNotDeleted: \"Misslyckades med att ta bort '%{name}'\",\n dashboardCreated: \"Dashboard '%{name}' skapad\",\n dashboardNotCreated: 'Misslyckades med att skapa dashboard',\n dashboardNotFound: 'Kan inte hitta dashboard',\n dashboardNotLoaded: 'Misslyckades med att ladda dashboard',\n invalidDashboardName:\n 'Ogiltigt dashboard-namn \\'%{name}\\', måste vara mellan 3 och 15 tecken långt och får bara inehålla tecknen: [a-ö, A-Ö, 0-9, \"+\", \"-\", \"_\", \".\", \"&\", \" \"]',\n maximumNumberOfDashboardsReached: 'Du kan ha max %{maximumNumberOfDashboards} dashboards',\n unknownError: 'Okänt fel',\n cannotDeselectDefault: 'Kan inte avmarkera default dashboard',\n errorUpdatingDefault: 'Misslyckades med att ställa in %{name} som default',\n maxNumberOfWidgets: 'Du kan ha max %{max} widgets på en dashboard'\n },\n noDashboard: {\n title: 'Välkommen till din personliga Dashboard-hanterare!',\n text: 'Här kan du kan skapa upp till 10 Dashboards och designa dem precis hur du vill för att få insikt i dina kunders användande.',\n button: 'Skapa din första Dashboard',\n buttonSubtitle: 'Vi genererar en default dashboard för att hjälpa dig komma igång',\n errorToast: 'Okänt fel, vänligen försök igen eller kontakta PayAtt'\n }\n }\n};\n\nexport default dashboardTranslations;\n","const noContent = {\n en: {\n browserTabTitle: 'No items found',\n header: 'No items found',\n subHeader: 'If this is incorrect, please contact the store manager or contact PayAtt directly using our',\n contactPayAtt: 'contact form'\n },\n se: {\n browserTabTitle: 'Ingen data hittad',\n header: 'Ingen data hittad',\n subHeader:\n 'Om detta är inkorrekt, vänligen kontakta verksamhetsansvarig, alternativt kontakta PayAtt direkt med vårt',\n contactPayAtt: 'kontaktformulär'\n }\n};\n\nexport default noContent;\n","/* eslint-disable max-len */\nimport { DashboardMainIntroStepLength, TRY_IT_NOW_TEXT_COLOR } from 'Joyride/JoyridePayAtt.constants';\n\nimport { MAX_NUMBER_OF_DASHBOARDS, MAX_NUMBER_OF_WIDGETS_PER_DASHBOARD } from 'api/dashboard/interface';\n\ntype Keys = Exclude>, 0>;\n\ntype StepTranslations = {\n title: string;\n content: string;\n extra?: any;\n};\n\ntype Main = Record;\n\ntype DashboardIntroductionTranslations = {\n en: { main: Main };\n se: { main: Main };\n};\n\nconst DashboardIntroductionTranslations: DashboardIntroductionTranslations = {\n en: {\n main: {\n 1: {\n title: 'Dashboard',\n content: `Here you may create your own dashboard based on our graphs and other widgets. This intro will walk you through the steps of adding a new graph, changing the size and position, filter them, and more.\n

\n You may restart this introduction at any time, by navigating to the tab Settings > Introductions in our left menu.`\n },\n 2: {\n title: 'Name',\n content: 'Your dashboard name'\n },\n 3: {\n title: 'Dashboard manager',\n content: `Edit the name of your dashboard and add new ones. You may have up to ${MAX_NUMBER_OF_DASHBOARDS} dashboards in total.\n

\n Try to add a dashboard and/or change a name!`\n },\n 4: {\n title: 'Settings',\n content: 'Click on next to open the settings menu'\n },\n 5: {\n title: 'Name',\n content: `You can edit the name by clicking on the pencil icon. Click again (or press enter) to save.\n

\n Try adding a dashboard or changing name!`\n },\n 6: {\n title: 'Dashboard size',\n content: `To make your dashboard adapt as well as possible to your screen, we remember each dashboard size when you save it. If the text is red it means you are on a display which is different than the one were you built the dashboard.\n

\n This will makes sense when you try to create a dashboard on a computer monitor, then switch to a tablet. Since the tablet is a lot smaller, the dashboard will have to re-arrange the items to fit the screen. Hover the text for more information.`\n },\n 7: {\n title: 'Default dashboard',\n content:\n 'The default dashboard is the one that is loaded when you navigate to this page. Only one dashboard may be set to default and the default dashboard cannot be deleted.'\n },\n 8: {\n title: 'Global filters',\n content: `Just like on the homepage, you can change filters here to select a certain Stamp Card Campaign, change the time-range, change what type of chart to view, and more.\n

\n Settings that are changed here are applied to all charts on your entire dashboard, but only effect the charts/widgets where the setting is applicable.\n

It is also possible to change the settings for a single widget by clicking on the settings icon on the widget itself.\n

To see a walkthrough of the filters, navigate to Settings > Introductions in the left navigation panel, then start the walkthrough for Homepage > Settings.`\n },\n 9: {\n title: 'Widgets',\n content: `Under each category here you have different widgets, you can add up to ${MAX_NUMBER_OF_WIDGETS_PER_DASHBOARD} per dashboard. They will immediately get added to the dashboard, after which you may adjust size, position, settings, and more.`\n },\n 10: {\n title: 'Delete dashboard',\n content: 'Delete your dashboard, this cannot be undone. The default dashboard cannot be deleted.'\n },\n 11: {\n title: 'Save dashboard',\n content: `After you are done working on your dashboard, don't forget to save!\n

\n Try it now!`\n },\n 12: {\n title: 'Save options',\n content: `Instead of saving the dashboard, you may also choose to create a new dashboard, based on the current layout.\n

`,\n extra: 'Use this for duplicating your dashboard when developing for a different resolution!'\n },\n 13: {\n title: 'Well done!',\n content: `If you get stuck, you can always restart this tutorial from the navigation menu in Settings > Introductions\n

\n Don't hesitate to contact us with any questions at info@payatt.store`\n }\n }\n },\n se: {\n main: {\n 1: {\n title: 'Dashboard',\n content: `Bygg din egen dashboard utifrån förinställda alternativ (widgets) som du hittar under Inställningar (kugghjulet uppe till höger på denna sida). Denna introduktion förklarar hur du lägger till nya grafer, ändrar storlek, filtrerar data etc.\n

\n Du kan starta introduktionen på nytt när du vill från fliken Inställningar > Introduktioner i den vänstra huvudmenyn.`\n },\n 2: {\n title: 'Namn',\n content: 'Namnge din dashboard'\n },\n 3: {\n title: 'Dashboard-hanteraren',\n content: `Ändra dashboard-namn och lägg till ytterligare dashboards. Du kan ha max ${MAX_NUMBER_OF_DASHBOARDS} dashboards totalt.\n

\n Testa att lägga till en dashboard eller ändra namn!`\n },\n 4: {\n title: 'Inställningar',\n content: 'Klicka på nästa för att öppna inställningsmenyn'\n },\n 5: {\n title: 'Namn',\n content: `Du kan ändra namn genom att klicka på den blå penn-ikonen. Klicka igen (eller på returtangenten) för att spara.\n

\n Testa nu!`\n },\n 6: {\n title: 'Dashboard-storlek',\n content: `För att din dashboard ska anpassas till din skärmstorlek, sparar vi din dashboard-storlek. Om texten är röd betyder det att du är på en display med annan upplösning än den som dashboarden byggdes för.\n

\n Tänk dig att du till exempel bygger en dashboard till en laptop eller monitor, sen loggar in på en iPad. Eftersom en iPad är mycket mindre än en laptop-skärm kommer dashboarden att behöva anpassa dina widgets för att få plats på skärmen. Flytta musen över texten för att få mer information.`\n },\n 7: {\n title: 'Default dashboard',\n content:\n 'Din default dashboard är den som automatiskt visas när du navigerar till denna sida. Du kan ha endast en default dashboard och den kan inte tas bort'\n },\n 8: {\n title: 'Globala filter',\n content: `Precis som på startsidan kan du ändra filter för att välja stämpelkortskampanj, ändra tidsintervall, ändra vilken typ av graf du vill se och mer.\n

\n Inställningar som ändras är applicerade på alla dina widgets och grafer på hela din dashboard, men endast om de är relevanta för varje specifik widget/graf.\n

För att ändra inställningar på en specifik widget kan du klicka på inställnings-ikonen på den widgeten.\n

För att se en genomgång av alla filter, klicka på Inställningar > Introduktioner i vänstra menyn, sedan börja introduktionen Hemsida > Inställningar.`\n },\n 9: {\n title: 'Widgets',\n content: `Varje kategori innehåller olika typer av widgets, du kan lägga till max ${MAX_NUMBER_OF_WIDGETS_PER_DASHBOARD} per dashboard. De läggs direkt till på din dashboard, därefter kan du ändra storlek, position, inställningar och mer.`\n },\n 10: {\n title: 'Ta bort dashboard',\n content: 'En borttagen dashboard kan inte återskapas. Default dashboard kan inte tas bort.'\n },\n 11: {\n title: 'Spara dashboard',\n content: `När du är klar med att uppdatera din dashboard, glöm inte bort att spara!\n

\n Testa nu!`\n },\n 12: {\n title: 'Extra alternativ',\n content: `Istället för att spara din dashboard kan du välja att skapa en ny dashboard baserad på den nuvarande.\n

`,\n extra: 'Använd detta alternativ för att kopiera din dashboard om du vill skapa en ny dashboard till en annan upplösning!'\n },\n 13: {\n title: 'Snyggt jobbat!',\n content: `Om du fastnar eller har frågor, kan du alltid starta om denna introduktion från vår vänstra meny genom att klicka på Inställningar > Introduktioner\n

\n Tveka inte att kontakta oss med frågor på info@payatt.store`\n }\n }\n }\n};\n\nexport default DashboardIntroductionTranslations;\n","/* eslint-disable max-len */\nimport {\n HomepageMainIntroStepLength,\n HomepageSettingsIntroStepLength,\n TRY_IT_NOW_TEXT_COLOR\n} from 'Joyride/JoyridePayAtt.constants';\n\nimport { MEMBER_THRESHOLD } from 'views/Dashboard/Widgets/PayAttWidgets/Calculations/Helpers/Calculations.utils';\n\ntype KeysMain = Exclude>, 0>;\ntype KeysSettings = Exclude>, 0>;\n\ntype StepTranslations = {\n title: string;\n content: string;\n extra?: any;\n};\n\ntype HomepageIntroductionTranslations = {\n en: { main: Record; settings: Record };\n se: { main: Record; settings: Record };\n};\n\nconst homeIntroductionTranslations: HomepageIntroductionTranslations = {\n en: {\n main: {\n 1: {\n title: 'Välkommen till/Welcome to',\n content: 'Sveriges enklaste kundklubbssystem'\n },\n 2: {\n title: 'Språk/language',\n content:\n 'Ändra genom att flytta musen över ikonen och klicka på flaggan

Change by hovering over the icon and click on a flag',\n extra: '\"(GB)\"'\n },\n 3: {\n title: 'Notifications',\n content: 'See all messages and notifications from us at PayAtt'\n },\n 4: {\n title: 'Profile',\n content: 'Change user settings, such as email, phone number, password and more.'\n },\n 5: {\n title: 'Statistics',\n content: `Handy widgets displaying valuable statistics of your customer club. When you have reached ${MEMBER_THRESHOLD} members, you may modify the values in the calculations to see your increased revenue thanks to PayAtt.`\n },\n 6: {\n title: 'Send SMS Campaign',\n content: `Here you can send an SMS campaign, with a custom written message. For more information on how to select recipient filters and how to schedule a campaign, view the introduction on page IntelliSMS.`\n },\n 7: {\n title: 'Settings',\n content: 'Change the background picture, change the time-interval and filters on graphs, and more.'\n },\n 8: {\n title: 'Navigation',\n content: 'Show/hide the navigation panel'\n },\n 9: {\n title: 'IntelliSMS',\n content: 'Send SMS campaigns to your members'\n },\n 10: {\n title: 'Stamp Card Campaign',\n content:\n 'Here you can manage or create new Stamp Card Campaigns. For example, you can view statistics on how many Stamp Cards have been created for customers, change design, update the SMS sent out to customers, and much more.'\n },\n 11: {\n title: 'View collections for registration display',\n content:\n 'Modify or create new view-collections. A view collection is the design that you use on your registration device. In our view-builder, you can modify the design to look exceptional.'\n },\n 12: {\n title: 'Dashboard',\n content: 'Create your own dashboard to gain insight into your Stamp Card Campaigns and registrations'\n },\n 13: {\n title: 'Good luck! 🙌',\n content: `You can restart this tutorial from\n

\n Settings > Introductions\n

\n If you have any question you may contact us at info@payatt.store.`\n }\n },\n settings: {\n 1: {\n title: 'Dashboard settings',\n content:\n \"Changing values here will apply them to all charts where the modified value is relevant. For example, updating the time interval has no effect on a static widget, such as the calculations. Don't forget to click apply!\"\n },\n 2: {\n title: 'Background picture',\n content: `Select which background picture you wish to use on the homepage.\n

\n Try it now!`\n },\n 3: {\n title: 'Always',\n content: 'Show all data since you joined PayAtt'\n },\n 4: {\n title: 'Chart timespan',\n content:\n 'Toggle what type of timespan you wish to input for the charts; specific dates or last X months/days/hours/minutes.'\n },\n 5: {\n title: 'Venue',\n content: 'Select which venue(s) you wish the charts to show data from'\n },\n 6: {\n title: 'Stamp Card Campaigns',\n content: 'Select which Stamp Card Campaign(s) you wish the charts to show data from'\n },\n 7: {\n title: 'Periodic charts',\n content: `Show periodic charts on applicable charts, all data will be filtered by the provided time interval
\n
    \n
  • Daily: Show data per day of the week
  • \n
  • Hourly: Show per hour of the day
  • \n
      `\n },\n 8: {\n title: 'Apply',\n content: 'Click on Apply to apply your settings. Finish the tutorial to enable the button.'\n }\n }\n },\n se: {\n main: {\n 1: {\n title: 'Välkommen till/Welcome to',\n content: 'Sveriges enklaste kundklubbssystem'\n },\n 2: {\n title: 'Språk/language',\n content:\n 'Ändra genom att flytta musen över ikonen och klicka på flaggan

      Change by hovering over the icon and click on a flag',\n extra: '\"(SE)\"'\n },\n 3: {\n title: 'Notiser',\n content: 'Se notiser och meddelanden från PayAtt'\n },\n 4: {\n title: 'Profil',\n content: 'Ändra användaruppgifter, lösenord och logga ut'\n },\n 5: {\n title: 'Statistik',\n content: `Widgets och grafer ger dig värdefulla insikter. När du uppnått ${MEMBER_THRESHOLD} medlemmar kan du ändra värdena i beräkningarna för att på ett övergripande sätt se hur PayAtt hjälper dig uppnå ökade intäkter.`\n },\n 6: {\n title: 'Skicka SMS-kampanj',\n content: `Skicka en SMS-kampanj direkt med valfri text. För introduktion om hur du väljer mottagarfilter och schemalägger en kampanj, gå till sidan IntelliSMS.`\n },\n 7: {\n title: 'Inställningar',\n content:\n 'Här kan du ändra sidans bakgrundsbild, ställa in grafers tidsintervall, filtrera stämpelkortskampanj med mera.'\n },\n 8: {\n title: 'Navigation',\n content: 'Visa/dölj menyn'\n },\n 9: {\n title: 'IntelliSMS',\n content:\n 'Gör smarta sms-utskick till dina registrerade kunder. Utskicksförslag genereras automatiskt och är anpassade utefter din verksamhet. Skicka till samtliga eller välj mottagarfilter. Schemalägg dina kampanjer via en kalenderfunktion.'\n },\n 10: {\n title: 'Stämpelkortskampanjer',\n content:\n 'Hantera befintliga eller skapa nya stämpelkortskampanjer. Se din stämpelkortsstatistik, ändra design på kortet eller innehåll i det sms som går ut till kunder, bland mycket annat.'\n },\n 11: {\n title: 'Vy-samlingar för registreringsskärm',\n content:\n 'Modifiera eller skapa nya vy-samlingar för din registreringsenhet. Du kan skapa vyer för olika enheter, inklusive Iphone, Ipad eller större skärmar. Designa vyerna så som du vill ha dem i en smart builder.'\n },\n 12: {\n title: 'Dashboard',\n content: 'Skapa en egen dashboard för att få insikt i din stämpelkortsdata och registreringar.'\n },\n 13: {\n title: 'Lycka till! 🙌',\n content: `För att se introduktionen igen, gå till:\n

      \n Inställningar > Introduktioner\n

      \n Vid frågor, välkommen att kontakta oss direkt på info@payatt.store.`\n }\n },\n settings: {\n 1: {\n title: 'Dashboard inställningar',\n content:\n 'När du filterar grafer genom alternativen nedan kommer endast grafer där filtret är relevant att uppdateras. T.ex. en kalkylering påverkas inte av ett förändrat tidsintervall. Glöm inte bort att klicka använd!'\n },\n 2: {\n title: 'Bakgrundsbild',\n content: `Välj vilken bakgrundsbild du vill ha på hemsidan.\n

      \n Testa nu!`\n },\n 3: {\n title: 'Alltid',\n content: 'Visa all data sedan du gick med i PayAtt'\n },\n 4: {\n title: 'Grafers tidsintervall',\n content:\n 'Välj vilken typ av tidsintervall du vill ange för grafer; specifika datum eller senaste X månader/dagar/timmar/minuter.'\n },\n 5: {\n title: 'Verksamhet',\n content: 'Välj verksamhet(er) att filterar graferna på'\n },\n 6: {\n title: 'Stämpelkortskampanj',\n content: 'Välj stämpelkortskampanj(er) att filtrera graferna på'\n },\n 7: {\n title: 'Periodiska diagram',\n content: `Ändra till periodiska diagram på relevanta grafer, all data filtreras med det angivna tidsintervallet
      \n
        \n
      • Veckodag: Visa data per veckodag
      • \n
      • Tid på dygnet: Visa data per timme
      • \n
          `\n },\n 8: {\n title: 'Bekräfta',\n content:\n 'Klicka på Använd för att bekräfta inställningarna. Avsluta introduktionen för att aktivera knappen.'\n }\n }\n }\n};\nexport default homeIntroductionTranslations;\n","/* eslint-disable max-len */\nimport {\n IntelliSmsCalendarIntroStepLength,\n IntelliSmsNewCampaignIntroStepLength,\n TRY_IT_NOW_TEXT_COLOR\n} from 'Joyride/JoyridePayAtt.constants';\n\ntype KeysNewCampaign = Exclude>, 0>;\ntype KeysCalendar = Exclude>, 0>;\n\ntype StepTranslations = {\n title: string;\n content: string;\n extra?: any;\n};\n\ntype IntelliSmsTranslations = {\n en: {\n newCampaign: Record;\n calendar: Record;\n };\n se: {\n newCampaign: Record;\n calendar: Record;\n };\n};\n\nconst intelliSmsIntroductionTranslations: IntelliSmsTranslations = {\n en: {\n newCampaign: {\n 1: {\n title: 'Welcome to IntelliSMS overview',\n content:\n 'Here you can see all your past and future campaigns. During this intro, we will add a past and future campaign to explain all the steps.'\n },\n 2: {\n title: 'Calendar overview',\n content: 'Next / Prev months'\n },\n 3: {\n title: 'Campaign',\n content: `This is a past campaign example\n

          \n Click on it!`\n },\n 4: {\n title: 'Campaign',\n content: 'Campaign overview, here you can see information about the campaign that has been sent.'\n },\n 5: {\n title: 'PayAtt',\n content: 'You cannot modify this event'\n },\n 6: {\n title: 'PayAtt',\n content: 'This is your upcoming event, click on it'\n },\n 7: {\n title: 'PayAtt',\n content: 'Upcoming event !!!'\n },\n 8: {\n title: 'PayAtt',\n content: 'This event can be modified or deleted'\n }\n },\n calendar: {\n 1: {\n title: 'IntelliSMS overview',\n content:\n 'Here you can see all your past and future campaigns. During this intro, we will add a past and future campaign to explain all the steps.'\n },\n 2: {\n title: 'Past campaign',\n content: `This is a past campaign example\n

          \n Click on it!`\n },\n 3: {\n title: 'Past campaign',\n content: 'Past campaign overview, here you can see information about the campaign that has been sent'\n },\n 4: {\n title: 'Upcoming campaign',\n content: `This is your upcoming campaign\n

          \n Click on it!`\n },\n 5: {\n title: 'Upcoming campaign',\n content:\n 'Upcoming campaign overview, here you can see information about the SMS campaign that will be sent'\n },\n 6: {\n title: 'Upcoming campaign',\n content:\n 'Update or delete the campaign. Updating a campaign will follow the exact same structure if you send a new campaign.'\n },\n 7: {\n title: 'Good luck! 🙌',\n content: `You can restart this tutorial from\n

          \n Settings > Introductions\n

          \n If you have any question you may contact us at info@payatt.store.`\n }\n }\n },\n se: {\n newCampaign: {\n 1: {\n title: 'PayAtt',\n content: 'This is the calendar'\n },\n 2: {\n title: 'PayAtt',\n content: 'Next / Prev months'\n },\n 3: {\n title: 'PayAtt',\n content: 'This is your past event, click on it'\n },\n 4: {\n title: 'PayAtt',\n content: 'Past event !!!'\n },\n 5: {\n title: 'PayAtt',\n content: 'You cannot modify this event'\n },\n 6: {\n title: 'PayAtt',\n content: 'This is your upcoming event, click on it'\n },\n 7: {\n title: 'PayAtt',\n content: 'Upcoming event !!!'\n },\n 8: {\n title: 'PayAtt',\n content: 'This event can be modified or deleted'\n }\n },\n calendar: {\n 1: {\n title: 'IntelliSMS kalender',\n content:\n 'Här kan du se alla dina tidigare och kommande SMS-kampanjer. Under denna genomgång kommer vi att lägga till en tidigare samt framtida kampanj i din kalender.'\n },\n 2: {\n title: 'Tidigare kampanjer',\n content: `Här är ett exempel på en tidigare kampanj\n

          \n Klicka på kampanjen!`\n },\n 3: {\n title: 'Tidigare kampanj',\n content: 'Översikt av din tidigare kampanj, här ser du information om kampanjen som redan har skickats'\n },\n 4: {\n title: 'Framtida kampanjer',\n content: `Det här en kampanj som ännu inte skickats\n

          \n Klicka på kampanjen!`\n },\n 5: {\n title: 'Framtida kampanj',\n content: 'Översikt av din kommande kampanj, här ser du information om kampanjen som kommer att skickas'\n },\n 6: {\n title: 'Framtida kampanj',\n content:\n 'Du kan uppdatera eller ta bort en framtida kampanj, processen för att uppdatera följer samma struktur som när du skapar en ny kampanj från scratch'\n },\n 7: {\n title: 'Lycka till! 🙌',\n content: `För att se introduktionen igen, gå till:\n

          \n Inställningar > Introduktioner\n

          \n Vid frågor, välkommen att kontakta oss direkt på info@payatt.store.`\n }\n }\n }\n};\nexport default intelliSmsIntroductionTranslations;\n","import dashboardIntroductionTranslations from './JoyrideStepTranslations/JoyrideStepTranslations.dashboard';\nimport homeIntroductionTranslations from './JoyrideStepTranslations/JoyrideStepTranslations.homepage';\nimport intelliSmsIntroductionTranslations from './JoyrideStepTranslations/JoyrideStepTranslations.intelliSms';\n\nconst introductionTranslations = {\n en: {\n skipToast: `You can start the walkthrough again in our left navigation menu\n

          \n Settings > Introductions`,\n homepage: homeIntroductionTranslations.en,\n dashboard: dashboardIntroductionTranslations.en,\n intelliSms: intelliSmsIntroductionTranslations.en,\n back: 'Back',\n close: 'Close',\n last: 'Finish',\n next: 'Next',\n open: 'Open the dialog',\n skip: 'Exit'\n },\n se: {\n skipToast: `Du kan starta genomgången igen i den vänstra menyn\n

          \n Inställningar > Introduktioner`,\n homepage: homeIntroductionTranslations.se,\n dashboard: dashboardIntroductionTranslations.se,\n intelliSms: intelliSmsIntroductionTranslations.se,\n back: 'Tillbaka',\n close: 'Stäng',\n last: 'Avsluta',\n next: 'Nästa',\n open: 'Öppna dialog',\n skip: 'Avsluta'\n }\n};\nexport default introductionTranslations;\n","/* eslint-disable max-len */\nconst contactFAQTranslations = {\n en: {\n title: 'FAQ',\n subtitle: 'General information and FAQ',\n linkToWebsite: {\n integrated: {\n title: 'Venues with integration',\n text: 'FAQ for venues with payment integration',\n clickHere: 'Click here'\n },\n notIntegrated: {\n title: 'Venues without integration',\n text: 'FAQ for venues without payment integration',\n clickHere: 'Click here'\n }\n },\n productName: 'PayAtt Standard',\n general: {\n title: 'General Usage',\n sections: {\n screens: {\n title: 'Screens',\n text1: 'PayAtts hardware consists of two separate screens with integrated software, one \"merchant\" screen that can be placed where appropriate, and one \"scanner\" placed next to the card reader, facing the customer. The screens must be plugged into a wall socket using the included adapter to function, they use low power and can handle staying active for a long periods of time without getting warm.',\n text2: 'The screens are provided by PayAtt and must be returned upon termination of contract.',\n tip: {\n title: 'Tip!',\n text: 'The screens are robust and made of good quality. In order to keep the glass clean, it might be a good idea to whipe it down regularly, using a damp cloth.'\n }\n },\n merchantSettings: {\n title: 'Settings for the Merchant Screen',\n text1: 'Name of club: Choose a simple and short name that reflects your bussiness, for example, \"club Venezia\" or \"Club Palermo\".',\n text2: 'SMS Sender name (max 11 characters, avoid åäö): Name related to your club name.',\n text3: 'Welcome SMS: See the provided suggestion for inspiration, it can be used as-is or modified.',\n text4: 'Title on PayAtt Scan (for new members): Choose a custom offer combined with the name of your club. For example, \"Join Club XX and receive a free drink with your meal\". It is important that the staff encourage resigration.',\n text5: 'Subtitle on PayAtt Scan (for returning, existing members): Use pre-defined suggestion or modify it to your need \"Already a member? Register your purchase to participate in future offers\".',\n text6: 'Background color: Modify the background color to match your profile.'\n },\n campaigns: {\n title: 'SMS Campaigns',\n text1: 'The first SMS campaign will be made only when 100 customers have registered, in order to achieve desired effect.',\n text2: 'Consider what may attract custoemrs to your bussiness and get inspired by our recomended suggestions. Keep in mind that you should not send out information that can be viewed as spam, always put the customer in focus. Consider what information you personally would have liked to receive and create your campaign keeping that in mind.',\n text3: 'Text messages have a limit of 160 characters, including spaces.',\n tip: {\n title: 'Tip!',\n text1: 'Even out the customer pressure by sending out offers for times where you are typically less busy.',\n text2: 'Record a simple movie about some part of your bussiness, include a link to this video in the text message. For example, \"Allow our chef to demonstrate our latest additions to the menu\".',\n text3: 'More suggestions: Use the existing suggestions for your type of bussiness and select general campaigns, alternatively, use the seasonal SMS suggestions.'\n }\n },\n scan: {\n title: 'Scan Display',\n sections: {\n buyOrScan: {\n title: 'Buy- and Scan Functionality',\n text: 'Ask if the customer wants to become a member and remind them of the offer, displayed on the screen. When a purchase is completed, a signal from your cashier system will trigger the Scan display from PayAtt.'\n },\n registerNewCustomer: {\n title: 'Register a new Membership',\n text1: 'The customer registers his/her purchase by inputting his/her telephone number on the Scan display, alternatively, when QR-kod is enabled the customer can also scan this code to register his/her number on the directed website. Thereafter, the customer will be sent a welcome SMS and the Scan display will display a welcome message.'\n },\n registerExistingCustomer: {\n title: 'Register a Purchase as an Existing Customer',\n text: 'The process is identical to registering as a new member. The only difference is the welcome phrase displayed on the Scan screen and no welcome SMS will be sent. Remember to encourage existing customers to register their purchases in order to provide better offers.'\n },\n termsAndConditions: {\n title: 'Terms and Conditions, and Integrity Policy',\n text: 'In order to become a member, the customer must accept PayAtt general Terms and Conditions, as well as our Integrity Policy. This is done when when the customer enters his/her phone number or uses the QR-code. Both the Terms and Conditions, and our Integrity Policy can be found on our website, https://payattclub.se'\n },\n integrations: {\n title: 'Integration with Cashier Systems',\n text: \"The PayAtt Software integrates with the cashier system, providing PayAtt with the means to associate each purchase with a unique registration. We store both purchase and registration information in our database, in order to identify various patterns and habbits that we utilize to target the correct customers with your selected offers. If you have any question about integration, don't hesitate to ask us at info@payatt.store\"\n },\n contact: {\n title: 'Contact',\n text1: 'Don\\t hesitate to contact PayAtt support! Our team is available for support on all weekdays between 9am-7pm, reach us at: info@payatt.store',\n text2: 'Urgent requests, contact us directly at +46 705 08 30 20'\n }\n }\n }\n }\n },\n faqContent: {\n title: 'FAQ',\n sections: {\n title: '',\n general: {\n title: '',\n sections: {\n whyPayAtt: {\n question: 'Why should I use PayAtt?',\n answer: 'You can easily and effectivly reach your customers using a direct communication channel, leading to increased incentive for customers to purchase products and therefore an increased revenue.'\n },\n simplicity: {\n question: 'Is the system easy to use?',\n answer: 'Yes, the system is very easy to use. By focusing on smart and simple functionality for both the Merchant- and Scan display, we save you and your customers as much time as possible.'\n },\n placementOfScreens: {\n question: 'Where shall I place the screens?',\n answer: 'The Scan display can be placed next to the card reader, so that it is clearly visible to the customer. The Merchant display can be placed at any location behind the register, where your staff can easily use it.'\n },\n campaignImmediatelyAfterInstallation: {\n question: 'Can I create an SMS Campaign immediately after signing up?',\n answer: 'No, you can only send out SMS Campaigns after collecting enough customer data. Your focus until this point should be to register as many customers as possible.'\n },\n whoReceivesCampaign: {\n question: 'Who will receive my SMS?',\n answer: 'In the beginning, all registerd customers will receive a text message from your Campaign. With time, as you build up a larger customer database, your customers will get categorized and you will be able to target a group based on the type of your Campaign. We want to increase the total purchase amount for your most loyal customers, while encouraging other customers to return more frequently. Our only goal is to increase your revenue.'\n }\n }\n },\n security: {\n title: 'Data Security',\n sections: {\n storageLocation: {\n question: 'Where is the data (customer details) collected?',\n answer: 'The data is stored in Swedish data centers, provided by PayAtt. The databases are security classified and PayAtt guarantees that all GDPR rules are enforced and followed.'\n },\n viewMembers: {\n question: 'Can I view my members?',\n answer: 'No, PayAtt will analyse your purchases and customer information to ensure that each offer reaches the correct customer group. This ensures, among others, that GDPR regulations are followed.'\n },\n customerApproval: {\n question: 'How do I accept that my customers details may be collected?',\n answer: 'The customer accepts PayAtt Terms and Conditions, as well as Integrity Policy, by entering his/her phone number on the Scan display, or by registering using the QR-code. The Terms and Conditions, and Integrity Policy, can be found on PayAtts website, https://payattclub.se'\n }\n }\n },\n usage: {\n title: 'Usage',\n sections: {\n frequency: {\n question: 'How often can I use the PayAtt software?',\n answer: 'PayAtt is divided into two systems, Scan display and Merchant display/portal. The Scan display is used at each customer registration and the Merchant app is used primarily to create SMS Campaigns, view statistics and manage settings.'\n },\n recruitNewMembers: {\n question: 'How do I convince new customers to join?',\n answer: 'Our recomendation is to provide a simple, yet attractive, offer to the customer. An example of such an offer is to give away a low-cost product as an incentive to register.'\n },\n choosingCampaign: {\n question: 'How do I know what offers to send to customers?',\n answer: 'Select SMS Campaigns with care and focus on one or a few per month. PayAtt recommends that you do not send too many messages per month. You can use our provided templates to base your SMS content on.'\n },\n customerCampaignOverview: {\n question: 'Can my customers view their membership status and active offers?',\n answer: 'No, PayAtt continuously analyses purchases in order to identify your most loyal customers. The PayAtt user interface is simple, avoiding complicated loggin moments for the customer.'\n },\n smsLimit: {\n question: 'How many text messages can I send per month?',\n answer: 'At the moment, the limit is 800 SMS per month.'\n },\n integratePOS: {\n question: 'How do I PayAtt with my cacsier system?',\n answer: 'We will ensure that your cashier system is correctly integrated with PayAtt during the onboarding process. The only thing we need are your API-keys.'\n },\n mobileApp: {\n question: 'Is there a mobile app for the customer?',\n answer: 'No, we currently do not have any mobile app.'\n }\n }\n }\n }\n }\n },\n se: {\n title: 'FAQ',\n subtitle: 'Allmän information och FAQ',\n linkToWebsite: {\n integrated: {\n title: 'Versamheter med integration',\n text: 'Med kassa-integration',\n clickHere: 'Klicka här'\n },\n notIntegrated: {\n title: 'Versamheter utan integration',\n text: 'Utan kassa-integration',\n clickHere: 'Klicka här'\n }\n },\n productName: 'PayAtt Standard',\n general: {\n title: 'Generell användning',\n sections: {\n screens: {\n title: 'Skärmar',\n text1: 'PayAtts hårdvara består av två separata skärmar med förinstallerad mjukvara, en \"merchant\" skärm som placeras på lämplig plats bakom kassan och en \"scanskärm\" mot konsument som placeras bredvid kortläsaren. Skärmarna är inte uppladdningsbara utan är i behov av ström via medföljande adapter, men kan utan problem vara påslagna utan att bli varma.',\n text2: 'Skärmarna tillhandahålls av PayAtt och lämnas sedan tillbaka i samband med ev. uppsägning av kontrakt.',\n tip: {\n title: 'Tips!',\n text: 'Skärmarna är robusta och av god kvalitet. Glaset kan dock behöva rengöras någon gång per dag med en fuktig trasa.'\n }\n },\n merchantSettings: {\n title: 'Inställningar i Merchant-skärmen',\n text1: 'Namn på klubb: Välj ett enkelt och kort namn som kan relatera till verksamheten, \"Club Venezia\", \"Club Palermo\" etc.',\n text2: 'Avsändarnamn SMS (högst 11 tecken, använd ej ÅÄÖ): Namn som är relaterat till klubbnamnet.',\n text3: 'Välkomst-SMS: Se givet förslag för inspiration. Kan med fördel användas som det är.',\n text4: 'Rubrik på PayAtt Scan (För nya medlemmar): Ställ in ett eget valt erbjudande tillsammans med namn på medlemsklubb. Ex: Gå med i Club XX och få en gratis dryck till din måltid\". Viktigt är att personalen i kassan uppmuntrar till medlemskap.',\n text5: 'Underrubrik på PayAtt Scan (för befintliga medlemmar): För återkommande redan registrerade medlemmar visas med fördel följande text: Redan medlem? Registrera ditt köp för att ta del av kommande erbjudanden.',\n text6: 'Bakgrundsfärg: ställ in färg som matchar din grafiska profil.'\n },\n campaigns: {\n title: 'Utskick',\n text1: 'Första utskicket görs först när 100 kunder har anslutit för att nå effekt',\n text2: 'Tänk över vad som kan locka fler kunder till er verksamhet och inspireras av våra rekommenderade förslag. Tänk på att inte skicka ut information som kan uppfattas som spammig utan sätt kunden i fokus. Fundera på vad du själv vill nås av för information och gör utskick därefter.',\n text3: 'SMS-funktionen har en maxgräns på 160 tecken med blanksteg.',\n tip: {\n title: 'Tips!',\n text1: 'Jämna ut beläggningen under veckan genom att skicka ut erbjudanden för tider då ni normalt sett har mindre kunder.',\n text2: 'Spela in en enkel film för att visa delar av verksamheten och länka till denna i utskicket. Exempel: Låt kökschefen visa delar av en nytillsatt meny.',\n text3: 'Fler förslag: Använd de mallar som finns för din verksamhet och välj generella utskick, alternativt kalenderanpassade utskicksförslag.'\n }\n },\n scan: {\n title: 'Scanskärm',\n sections: {\n buyOrScan: {\n title: 'Köp- och scanfunktion',\n text: 'Fråga om kunden är medlem eller vill bli (påminn om erbjudandet som visas på skärmen). När ett köp har genomförts går en signal från ditt kassasystem till scanskärmen som tillhandahålls av PayAtt.'\n },\n registerNewCustomer: {\n title: 'Registrera nytt medlemskap',\n text1: 'Kunden registrerar sitt medlemskap genom att knappa in telefonnummer på scanskärmen, eller i de fall en QR-kod är installerad scanna denna och registrera telefonnummer via en landningssida på mobilen. Därefter skickas ett välkomstsms till kunden och en välkomsthälsning visas på skärmen.'\n },\n registerExistingCustomer: {\n title: 'Registrera köp som existerande medlem',\n text: 'Det är samma process för att registrera nytt medlemskap som att registrera köp som återkommande medlem. Det som skiljer är hälsningen på skärmen/i mobilen då köpet är registrerat. Tänk på att uppmuntra existerande medlemmar att registrera sina köp för att få bättre erbjudanden.'\n },\n termsAndConditions: {\n title: 'Allmänna villkor och integritetspolicy',\n text: 'För att bli medlem måste kunden godkänna PayAtts allmänna villkor och integritetspolicy vilket sker när kunden registrerar sitt mobilnummer via scanskärmen eller på mobilen. Dessa återfinns på PayAtts hemsida, https://payattclub.se'\n },\n integrations: {\n title: 'Integrationer',\n text: 'PayAtts mjukvara är direkt integrerad till ditt kassasystem vilket gör att vi kan koppla varje köp till person genom att telefonnumret registreras. Dessa uppgifter samlas i PayAtts databas varpå köpmönster kan identifieras för att skicka ut rätt erbjudande till rätt kund. Vid frågor gällande integrationer, kontakta PayAtt direkt på info@payatt.store'\n },\n contact: {\n title: 'Kontaktuppgifter',\n text1: 'Tveka inte att kontakta PayAtts support vid ev. frågor. Vårt team finns på plats för support varje vardag mellan 9-17 och nås på info@payatt.store',\n text2: 'Vid akuta frågor, kontakta oss direkt på +46 705 08 30 20'\n }\n }\n }\n }\n },\n faqContent: {\n title: 'FAQ',\n sections: {\n title: '',\n general: {\n title: '',\n sections: {\n whyPayAtt: {\n question: 'Varför ska jag använda PayAtts system?',\n answer: 'Du kan på ett effektivt sätt nå dina kunder direkt och få dem att handla mer och oftare vilket leder till en ökad omsättning.'\n },\n simplicity: {\n question: 'Är systemet enkelt att använda?',\n answer: 'Ja, systemet är mycket användarvänligt med smarta och enkla funktioner för merchant- och scanskärm för att spara så mycket tid som möjligt.'\n },\n placementOfScreens: {\n question: 'Vart ska jag ställa skärmarna?',\n answer: 'Scanskärmen ställer du bredvid kortläsaren så att den syns tydligt för kunden. Merchant-skärmen placeras på lämplig plats bakom kassan så att personalen enkelt kan använda den.'\n },\n campaignImmediatelyAfterInstallation: {\n question: 'Kan jag göra utskick direkt efter installation?',\n answer: 'Nej, det är först efter att ett tillräckligt dataunderlag (kunduppgifter) är insamlat som det första utskicket görs. Huvudfokus under den första tiden blir att registrera så många medlemmar som möjligt.'\n },\n whoReceivesCampaign: {\n question: 'Vilka får mina utskick?',\n answer: 'I början kommer alla dina kunder som väljer att bli medlemmar att få ett utskick, men allteftersom kunderna delas in i kundgrupper får olika kundgrupper olika typer av utskick. Vi vill få de kunder som är mest lojala att köpa mer och övriga kunder att återkomma oftare. Allt för att öka din omsättning.'\n }\n }\n },\n security: {\n title: 'Datasäkerhet',\n sections: {\n storageLocation: {\n question: 'Vart samlas datan, d.v.s. kunduppgifterna?',\n answer: 'Datan lagras i databaser i Sverige som tillhandahålls och hanteras av PayAtt. Databaserna är säkerhetsklassade och PayAtt garanterar att rådande regleringar efterföljs (GDPR).'\n },\n viewMembers: {\n question: 'Kan jag se mina medlemmar?',\n answer: 'Nej, all persondata lagras hos PayAtt som analyserar köpen så att rätt erbjudande går till rätt kundgrupp. Detta sker också med hänsyn till GDPR.'\n },\n customerApproval: {\n question: 'Hur godkänner mina kunder att data samlas in?',\n answer: 'Kunden accepterar PayAtts allmänna villkor och integritetspolicy genom att knappa in sitt telefonnummer och välja skicka/registrera på scanskärmen eller på landningssidan i mobilen som nås via QR-koden. De allmänna villkoren och integritetspolicyn finns tillgängliga på PayAtts hemsida, https://payattclub.se'\n }\n }\n },\n usage: {\n title: 'Användning',\n sections: {\n frequency: {\n question: 'Hur ofta ska jag använda PayAtts system?',\n answer: 'PayAtt är ett tvådelat system där du använder scan-funktionen vid varje köp för att registrera nya medlemmar samt att registrera köp för återkommande medlemmar. PayAtt merchant-skärmen använder du i första hand för att göra utskick, se statistik samt att ställa in funktioner för de båda skärmarna.'\n },\n recruitNewMembers: {\n question: 'Hur värvar jag nya medlemmar vid köp?',\n answer: 'Vår rekommendation är att du använder ett enkelt erbjudande som uppfattas som attraktivt för kunden. Ett tips är att erbjuda en lågkostnadsprodukt som kan tas in i större volymer.'\n },\n choosingCampaign: {\n question: 'Hur vet jag vilka erbjudanden jag ska skicka ut?',\n answer: 'Välj dina utskick med omsorg och fokusera på en eller ett par kampanjer i månaden. PayAtts rekommendation är att inte skicka för många utskick per månad. Använd våra utskicksmallar för att skapa ditt utskick.'\n },\n customerCampaignOverview: {\n question: 'Kan mina kunder se status på medlemskap och vilka erbjudanden som väntar?',\n answer: 'Nej, PayAtt analyserar köpen löpande för att urskilja vilka kunder som är dina mest lojala kunder. PayAtts system är enkelt och sömlöst utan krångliga inloggningsmoment.'\n },\n smsLimit: {\n question: 'Hur många utskick kan jag göra per månad?',\n answer: 'Du kan i dagsläget skicka 800 SMS per månad.'\n },\n integratePOS: {\n question: 'Hur sammankopplar jag PayAtt med mitt kassasystem?',\n answer: 'Vid installation ser vi till att ditt kassasystem är integrerat med PayAtt. Det enda vi behöver från er är API-nycklar.'\n },\n mobileApp: {\n question: 'Finns det någon mobilapp för kunden att använda?',\n answer: 'Nej, vi använder oss inte av någon mobilapp i dagsläget.'\n }\n }\n }\n }\n }\n }\n};\nexport default contactFAQTranslations;\n","const contactFormTranslations = {\n en: {\n title: 'Contact PayAtt',\n subtitle: 'Use the form below to contact PayAtt on ',\n formHeader: 'Reason for contacting PayAtt',\n selectReason: 'Please select a reason for contacting PayAtt',\n payattemail: 'Alternatively, send an email to',\n submit: 'Submit',\n sucessToast: 'Thank you for your email!',\n errors: {\n message: 'Please enter a message',\n category: 'Please select a category',\n toast: 'Something went wrong!'\n },\n select: {\n general: 'General',\n bug: 'Report bug',\n feature: 'Request feature',\n limit: 'Increase SMS limit',\n label: 'Reason',\n helpText: {\n general: 'Please specify your message in the section below',\n limit: 'Please specify in the section below what SMS limit you would like to have. We will respond with pricing and potential offers.',\n feature: 'Please specify the feature you are missing, be as specific as you can.',\n bug: 'Please provide a bug report below. What happened? What were you doing when the bug occured? What did you expect would happen?'\n }\n },\n message: {\n placeholder: 'Write your message',\n label: 'Message'\n }\n },\n se: {\n title: 'Kontakta PayAtt',\n subtitle: 'Fyll i formuläret nedan för att kontakta PayAtt på ',\n formHeader: 'Anledning till att du vill kontakta PayAtt',\n selectReason: 'Vänligen välj en anledning till att kontakta PayAtt',\n payattemail: 'Alternativt skicka ett email till',\n submit: 'Submit',\n sucessToast: 'Tack för din återkoppling!',\n errors: {\n message: 'Vänligen skriv ett meddelande',\n category: 'Vänligen välj en kategori',\n toast: 'Okänt fel!'\n },\n select: {\n general: 'Allmänt',\n bug: 'Rapportera bug',\n feature: 'Saknad funktionalitet',\n limit: 'Begär ökad SMS-limit',\n label: 'Anledning',\n helpText: {\n general: 'Vänligen ange ditt meddelande i rutan nedan',\n limit: 'Specificera vilken SMS limit du önskar ha. Vi återkomer med prissättning och potentiella erbjudanden.',\n feature:\n 'Specificera vilken funktionalitet du saknar, var gärna så nogran du kan för att vi ska förstå precis vad du menar.',\n bug: 'Skriv en bug rapport i fältet nedan. Var gärna så specifik du kan så att vi ska förstå vad som gått fel. Vad hände? Vad gjorde du när buggen inträffade? Vad förväntade du dig skulle hända?'\n }\n },\n message: {\n placeholder: 'Skriv ditt meddelande här',\n label: 'Meddelande'\n }\n }\n};\nexport default contactFormTranslations;\n","/* eslint-disable max-len */\nimport { SmsSuggestionLanguage } from 'api/intelliSms/intelliSms.interfaces';\n\ntype PageTranslation = {\n title: string;\n header: { title: string; subtitle: string };\n changeLanguage: { [key in SmsSuggestionLanguage]: string } & {\n title: string;\n subtitle: string;\n submit: string;\n confirmPopup: {\n title: string;\n subtitle: string;\n subtitleMultiVenue: string;\n } & { [key in SmsSuggestionLanguage]: string };\n toasts: {\n success: string;\n sameLanguage: string;\n ttl: string;\n unknownFailure: string;\n doneUpdatingSmsSuggestions: string;\n failedUpdatingSmsSuggestions: string;\n };\n };\n};\n\ntype IntelliSmsSettingTranslation = {\n se: PageTranslation;\n en: PageTranslation;\n};\n\nconst intelliSmsSettingTranslations: IntelliSmsSettingTranslation = {\n en: {\n title: 'IntelliSMS settings',\n header: {\n title: 'IntelliSMS Settings',\n subtitle: ' '\n },\n changeLanguage: {\n title: 'Change language on the SMS suggestions',\n subtitle: 'You can only change language once every 10 minutes',\n English: 'English',\n Swedish: 'Swedish',\n submit: 'Change',\n confirmPopup: {\n title: 'Confirm',\n subtitle: `It can take several minutes to update your SMS suggestions, the more Stamp Card Campaigns you have, the longer it wil take.\n

          \n You will receive a notification when the update is done.`,\n subtitleMultiVenue: `It can take several minutes to update your SMS suggestions, the more Venues and Stamp Card Campaigns you have, the longer it wil take.\n

          \n You will receive a notification when the update is done.`,\n English: 'Change SMS suggestion language to: English',\n Swedish: 'Change SMS suggestion language to: Swedish'\n },\n toasts: {\n success:\n 'Successfully updated the language for SMS suggestions, you will get nofified when the update is complete',\n sameLanguage: 'The chosen language is already set',\n ttl: 'You have to wait until you can change the language',\n unknownFailure: 'Unknown failure',\n doneUpdatingSmsSuggestions: 'Done updating your SMS suggestions after changing language 🎉',\n failedUpdatingSmsSuggestions:\n 'Failed to update SMS suggestion language. If the problem persists, please contact us.'\n }\n }\n },\n se: {\n title: 'IntelliSMS inställningar',\n header: {\n title: 'IntelliSMS inställningar',\n subtitle: ' '\n },\n changeLanguage: {\n title: 'Ändra språk på SMS-förslagen',\n subtitle: 'Du kan endast ändra språk en gång var 10 min',\n English: 'Engelska',\n Swedish: 'Svenska',\n submit: 'Ändra',\n confirmPopup: {\n title: 'Bekräfta',\n subtitle: `Det kan ta flera minuter att uppdatera dina SMS-förslag beorende på hur många stämpelkortskampanjer du har.\n

          \n Du kommer få en notifikation då uppdateringen är klar.`,\n subtitleMultiVenue: `Det kan ta flera minuter att uppdatera dina SMS-förslag, ju fler verksamheter och stämpelkortskampanjer du har, ju längre tar det.\n

          \n Du kommer få en notifikation då uppdateringen är klar.`,\n English: 'Ändra SMS-förslag till: Engelska',\n Swedish: 'Ändra SMS-förslag till: Svenska'\n },\n toasts: {\n success:\n 'Språket på dina SMS-förslag har ändrats, du kommer att att få ett meddelande när uppdateringen är klar',\n sameLanguage: 'Du har redan angett det språket på dina SMS-förslag',\n ttl: 'Du måste vänta innan du kan ändra språk',\n unknownFailure: 'Okänt fel',\n doneUpdatingSmsSuggestions: 'Klar med uppdateringen av SMS-förslag efter att ha ändrat språk 🎉',\n failedUpdatingSmsSuggestions:\n 'Misslyckades med att uppdatera SMS-förslag med ditt valda språk. Om felet kvarstår ber vi dig oss.'\n }\n }\n }\n};\n\nexport default intelliSmsSettingTranslations;\n","/* eslint-disable max-len */\n\ntype PageTranslation = {\n title: string;\n header: { title: string; subtitle: string };\n content: {\n buttonStart: string;\n accordions: {\n homepage: { title: string; buttons: { main: string; settings: string } };\n dashboard: { title: string; buttons: { main: string; settings: string } };\n intelliSms: { title: string; buttons: { newCampaign: string; calendar: string } };\n };\n };\n};\n\ntype IntroductionPageTranslation = {\n se: PageTranslation;\n en: PageTranslation;\n};\n\nconst introductionPageTranslations: IntroductionPageTranslation = {\n en: {\n title: 'Introductions',\n header: {\n title: 'Introduktions walkthroughs',\n subtitle:\n 'Click on the walkthrough that you wish to see. You will be redirected to the page of the walkthrough and it will start immediately.'\n },\n content: {\n buttonStart: 'Start',\n accordions: {\n homepage: {\n title: 'Homepage',\n buttons: {\n main: 'Main walkthrough',\n settings: 'Settings menu'\n }\n },\n dashboard: {\n title: 'Dashboard',\n buttons: {\n main: 'Main walkthrough',\n settings: 'Settings menu'\n }\n },\n intelliSms: {\n title: 'IntelliSMS',\n buttons: {\n newCampaign: 'New SMS campaign',\n calendar: 'Calendar'\n }\n }\n }\n }\n },\n se: {\n title: 'Introduktioner',\n header: {\n title: 'Introduktionsgenomgångar',\n subtitle:\n 'Välj den genomgång du vill se igen. Du kommer att omdirigeras till rätt sida och genomgången kommer att startas automatiskt.'\n },\n content: {\n buttonStart: 'Starta',\n accordions: {\n homepage: {\n title: 'Hemsida',\n buttons: {\n main: 'Huvudgenomgång',\n settings: 'Inställningsmenyn'\n }\n },\n dashboard: {\n title: 'Dashboard',\n buttons: {\n main: 'Huvudgenomgång',\n settings: 'Inställningsmenyn'\n }\n },\n intelliSms: {\n title: 'IntelliSMS',\n buttons: {\n newCampaign: 'Ny SMS-kampanj',\n calendar: 'Kalender'\n }\n }\n }\n }\n }\n};\nexport default introductionPageTranslations;\n","type RegistrationDisplayViewsTranslationType = {\n tabTitle: string;\n views: {\n standbyView: string;\n standbyViewDisabled: string;\n numPadView: string;\n newCustomerRegistrationView: string;\n returningCustomerRegistrationView: string;\n stampCardNewJoinView: string;\n stampCardProgressView: string;\n stampCardRewardView: string;\n };\n sort: { createdAt: string; updatedAt: string; name: string };\n width: string;\n height: string;\n infoPopover: { text: { 1: string; 2: string }; list: { 1: string; 2: string; 3: string } };\n title: string;\n subtitle: string;\n createNewCollection: string;\n noCollections: string;\n settings: string;\n lowerCaseSettings: string;\n requiredViewsNotImplemented: string;\n collectionName: string;\n template: string;\n switchToResolutionSelectors: string;\n switchToDeviceSelector: string;\n selectResolution: string;\n keepCurrentResolution: string;\n resolutionHeaders: { PayAtt: string; desktop: string; iPhone: string; iPad: string };\n cancel: string;\n submit: string;\n delete: string;\n change: string;\n imageUrl: string;\n adjustBackgroundBrightness: string;\n backgroundBrightness: string;\n backgroundColor: string;\n backgroundImage: string;\n logo: string;\n resolution: string;\n renameCollection: string;\n duplicateCollection: string;\n deleteCollection: string;\n successfullyDuplicatedCollection: string;\n successfullyRenamedCollection: string;\n successfullyDeletedCollection: string;\n successfullyUpdatedLogo: string;\n successfullyUpdatedBackgroundBrightness: string;\n successfullyUpdatedBackgroundImage: string;\n successfullyUpdatedBackgroundColor: string;\n successfullyUpdatedResolution: string;\n successfullyCreatedNewCollection: string;\n urlOrUpload: string;\n colorPicker: { applyColor: string };\n};\n\nconst registrationDisplayViewsTranslations: {\n en: RegistrationDisplayViewsTranslationType;\n se: RegistrationDisplayViewsTranslationType;\n} = {\n en: {\n tabTitle: 'Display views',\n views: {\n standbyView: 'Standby view, shown until a customer has completed a purchase',\n standbyViewDisabled: `Standby-view for integrated customers.

          \n \n This view is only relevant if you have integrated PayAtt with your payment provider. This view is displayed until a customer has made a purchase.`,\n numPadView: 'Registration view',\n newCustomerRegistrationView: 'New customer view',\n returningCustomerRegistrationView: `Returning customer view
          \n
          \n This view is primarily relevant if you have customers who re-register. For example if you have a time based stamp card which is not active at the time of registration.\n `,\n stampCardNewJoinView: 'Stamp card view for a new customer',\n stampCardProgressView: 'Stamp card view for a returning customer',\n stampCardRewardView: 'Stamp card view when receiving a reward'\n },\n sort: {\n createdAt: 'Created',\n updatedAt: 'Last updated',\n name: 'Name'\n },\n width: 'Width',\n height: 'Height',\n infoPopover: {\n text: {\n 1: \"Since creating and managing view collections can be tricky, we provide multiple sources of information to help you out. If you get stuck on something, don't hesitate to\",\n 2: 'contact us!'\n },\n list: { 1: 'FAQ', 2: 'Startup Guide', 3: 'Startup Video' }\n },\n title: 'Display view collections',\n subtitle: 'Manage the display view collections and adapt them to your devices',\n createNewCollection: 'Create new collection',\n noCollections: 'No collections found, please create a new collection.',\n settings: 'Settings',\n lowerCaseSettings: 'settings',\n requiredViewsNotImplemented: 'Required views not implemented: %{views}',\n collectionName: 'Collection name',\n template: 'Template',\n switchToResolutionSelectors: 'Enter manually',\n switchToDeviceSelector: 'Select from list',\n selectResolution: 'Select resolution',\n keepCurrentResolution: 'Keep current resolution',\n resolutionHeaders: { PayAtt: 'PayAtt L-shaped Display', desktop: 'Desktop', iPhone: 'iPhone', iPad: 'iPad' },\n cancel: 'Cancel',\n submit: 'Submit',\n delete: 'Delete',\n change: 'Submit',\n imageUrl: 'Image URL',\n adjustBackgroundBrightness: 'Adjust background brightness',\n backgroundBrightness: 'Background brightness',\n backgroundColor: 'Background color',\n backgroundImage: 'Background image',\n logo: 'Logo',\n resolution: 'Resolution',\n renameCollection: 'Rename collection',\n duplicateCollection: 'Duplicate collection',\n deleteCollection: 'Delete collection',\n successfullyDuplicatedCollection: 'Successfully duplicated collection',\n successfullyRenamedCollection: 'Successfully renamed collection',\n successfullyDeletedCollection: 'Successfully deleted %{collectionName}',\n successfullyUpdatedLogo: 'Successfully updated logo',\n successfullyUpdatedBackgroundBrightness: 'Successfully updated background brightness',\n successfullyUpdatedBackgroundImage: 'Successfully updated background image',\n successfullyUpdatedBackgroundColor: 'Successfully updated background color',\n successfullyUpdatedResolution: 'Successfully updated resolution',\n successfullyCreatedNewCollection: 'Successfully created %{collectionName} collection',\n urlOrUpload: 'Enter image URL or upload an image',\n colorPicker: { applyColor: 'Apply color' }\n },\n se: {\n tabTitle: 'Display-vyer',\n views: {\n standbyView: 'Standbyläge som visas tills det att en kund genomfört ett köp',\n standbyViewDisabled: `Standbyläge för integrerade skärmar.
          \n
          \n Denna vy är endast tillgänglig om du integrerat PayAtt med ditt kassasystem. Visas tills ett köp har genomförts. Visas tills ett köp har genomförts.`,\n numPadView: 'Registreringsvy',\n newCustomerRegistrationView: 'Vy för ny kund',\n returningCustomerRegistrationView: `Vy för återkommande kund
          \n
          \n Denna vy är framförallt relevant ifall du har kunder som återregistrerar sig. Till exempel om du har ett tidsbaserat stämpelkort som inte är aktivt vid registreringstidpunkten.\n `,\n stampCardNewJoinView: 'Stämpelkortsvy för ny kund',\n stampCardProgressView: 'Stämpelkortsvy för återkommande kund',\n stampCardRewardView: 'Stämpelkortsvy när belöning uppnåtts'\n },\n sort: {\n createdAt: 'Skapad',\n updatedAt: 'Senast uppdaterad',\n name: 'Namn'\n },\n width: 'Bredd',\n height: 'Höjd',\n infoPopover: {\n text: {\n 1: 'Att skapa och hantera vy-samlingar kan i början vara lite svårt, därför har vi en hel del information för att hjälpa dig att komma igång. Ifall du har någon fråga, tveka inte att',\n 2: 'kontakta oss!'\n },\n list: { 1: 'FAQ', 2: 'Startup Guide', 3: 'Startup Video' }\n },\n title: 'Vy-samlingar för display-appen',\n subtitle: 'Hantera samlingar av vyer för display-appen och anpassa dem till dina enheter',\n createNewCollection: 'Skapa ny samling',\n noCollections: 'Inga samlingar hittades, vänligen skapa en ny samling.',\n settings: 'Inställningar',\n lowerCaseSettings: 'inställningar',\n requiredViewsNotImplemented: 'Obligatoriska vyer är inte implementerade: %{views}',\n collectionName: 'Namn på samling',\n template: 'Mall',\n switchToResolutionSelectors: 'Manuell input',\n switchToDeviceSelector: 'Välj från lista',\n selectResolution: 'Välj upplösning',\n keepCurrentResolution: 'Behåll nuvarande upplösning',\n resolutionHeaders: { PayAtt: 'PayAtt Skärm (L-form)', desktop: 'Dator', iPhone: 'iPhone', iPad: 'iPad' },\n cancel: 'Avbryt',\n submit: 'Skapa',\n delete: 'Radera',\n change: 'Ändra',\n imageUrl: 'Bild-URL',\n adjustBackgroundBrightness: 'Ändra bakgrundens ljusstyrka',\n backgroundBrightness: 'Bakgrundens ljusstyrka',\n backgroundColor: 'Bakgrundsfärg',\n backgroundImage: 'Bakgrundsbild',\n logo: 'Logotyp',\n resolution: 'Upplösning',\n renameCollection: 'Byt namn på samlingen',\n duplicateCollection: 'Kopiera samling',\n deleteCollection: 'Radera samling',\n successfullyDuplicatedCollection: 'Samling kopierad',\n successfullyRenamedCollection: 'Samlingen har bytt namn',\n successfullyDeletedCollection: '%{collectionName} raderad',\n successfullyUpdatedLogo: 'Logotyp uppdaterad',\n successfullyUpdatedBackgroundBrightness: 'Bakgrundsläge uppdaterad',\n successfullyUpdatedBackgroundImage: 'Bakgrundsbild uppdaterad',\n successfullyUpdatedBackgroundColor: 'Bakgrundsfärg uppdaterad',\n successfullyUpdatedResolution: 'Uppdatering av upplösning lyckades',\n successfullyCreatedNewCollection: '%{collectionName} skapad',\n urlOrUpload: 'Ange bild-URL eller ladda upp en bild',\n colorPicker: { applyColor: 'Använd' }\n }\n};\nexport default registrationDisplayViewsTranslations;\n","export type ResetModalWindowTranslationStructure = {\n reset: string;\n back: string;\n warning: string;\n description: {\n p1: {\n 1: string;\n 2: string;\n 3: string;\n };\n p2: string;\n p3: string;\n };\n};\n\nconst resetModalWindowTranslations: {\n en: ResetModalWindowTranslationStructure;\n se: ResetModalWindowTranslationStructure;\n} = {\n en: {\n reset: 'Reset',\n back: 'Cancel',\n warning: 'Warning!',\n description: {\n p1: {\n 1: 'You are about to',\n 2: 'RESET',\n 3: 'the form'\n },\n p2: 'All the fields will be set to default values and you will have to re-enter everything, or select a template',\n p3: 'Are you sure that you want to proceed?'\n }\n },\n se: {\n reset: 'Återställ',\n back: 'Avbryt',\n warning: 'Varning!',\n description: {\n p1: {\n 1: 'Du är på väg att',\n 2: 'ÅTERSTÄLLA',\n 3: 'hela formuläret'\n },\n p2: 'Alla fält kommer att återställas till deras ursprungsvärden, du kommer att antingen behöva fylla i allt igen eller välja en ny mall',\n p3: 'Är du säker på att du vill fortsätta'\n }\n }\n};\n\nexport default resetModalWindowTranslations;\n","export type StampCardSidebarTranslationStructure = {\n title: string;\n create: string;\n update: string;\n triggers: string;\n history: string;\n};\n\nconst stampCardSidebarTranslations: {\n en: StampCardSidebarTranslationStructure;\n se: StampCardSidebarTranslationStructure;\n} = {\n en: {\n title: 'Stamp Card',\n create: 'Create card',\n update: 'Update card',\n triggers: 'Trigger display',\n history: 'Overview'\n },\n se: {\n title: 'Stämpelkort',\n create: 'Skapa kort',\n update: 'Uppdatera kort',\n triggers: 'Testa skärm',\n history: 'Översikt'\n }\n};\n\nexport default stampCardSidebarTranslations;\n","import { PropertyInValues } from 'views/StampCardForm/Form/props.interfaces';\n\nexport const STAMP_CARD_FIELDS_MAP: {\n en: PropertyInValues;\n se: PropertyInValues;\n} = {\n en: {\n startDate: 'Start Date',\n endDate: 'End Date',\n welcomeSMS: 'Welcome SMS message',\n rewardEarnedSMS: 'Reward SMS',\n oneTimeOrOngoing: 'One time or ongoing',\n termsAndConditions: 'Terms and Conditions',\n additionalInformation: 'Additional information',\n backgroundColor: 'Background',\n rewardsRectangleColor: 'Reward background',\n rectangleBehindCardsColor: 'Stamp card background',\n rectangleBehindCardsBorderColor: 'Stamp card border',\n stampCircleColor: 'Stamp circle',\n textColor: 'Socials text',\n rewardButtonColor: 'Reward button',\n rewardAreaTextColor: 'Reward area text',\n termsTextColor: 'Terms and conditions text',\n rewardButtonTextColor: 'Reward button text',\n rewardStampBorderColorPartOne: 'Reward stamp border one',\n rewardStampBorderColorPartTwo: 'Reward stamp border two',\n unstampedImageOpacity: 'Unstamped image opacity',\n websiteLink: 'Website link',\n facebookLink: 'Facebook link',\n instagramLink: 'Instagram link',\n linkedInLink: 'LinkedIn link',\n youTubeLink: 'Youtube link',\n logoUrl: 'Logo',\n rewardImage1: 'First reward image or icon',\n rewardPosition1: 'First reward position',\n rewardName1: 'First reward name',\n rewardDescription1: 'First reward description',\n rewardIconColor1: 'First reward icon color',\n rewardImage2: 'Second reward image or icon',\n rewardPosition2: 'Second reward position',\n rewardName2: 'Second reward name',\n rewardDescription2: 'Second reward description',\n rewardIconColor2: 'Second reward icon color',\n rewardImage3: 'Third reward image or icon',\n rewardPosition3: 'Third reward position',\n rewardName3: 'Third reward name',\n rewardDescription3: 'Third reward description',\n rewardIconColor3: 'Third reward icon color',\n stampedImage: 'Stamped image or icon',\n unstampedImage: 'Unstamped image or icon',\n stampedIconColor: 'Stamped icon color',\n unstampedIconColor: 'Unstamped icon color',\n secretCode: 'Secret code',\n campaignName: 'Campaign name',\n timeIntervals: 'Availability times',\n POSIds: 'Registration display',\n templateUsed: 'Template used',\n paymentProviders: 'Payment providers',\n selectedProducts: 'Selected products',\n pwaDescription: 'App description',\n pwaName: 'App download name',\n pwaShortName: 'App name',\n pwaIcon: 'App icon'\n },\n se: {\n startDate: 'Startdatum',\n endDate: 'Slutdatum',\n welcomeSMS: 'Välkomst-SMS',\n rewardEarnedSMS: 'Belönings-SMS',\n oneTimeOrOngoing: 'Engångskort eller pågående',\n termsAndConditions: 'Allmänna Villkor',\n additionalInformation: 'Ytterligare information',\n backgroundColor: 'Bakgrund',\n rewardsRectangleColor: 'Bakgrund - nedre belöningsruta',\n rectangleBehindCardsColor: 'Stämpelkort',\n rectangleBehindCardsBorderColor: 'Stämpelkortets kant',\n stampCircleColor: 'Stämpel',\n textColor: 'Text',\n rewardButtonColor: 'Belöningsknappen',\n rewardAreaTextColor: 'Textfärg för belöningsområdet',\n termsTextColor: 'Allmänna villkor text',\n rewardButtonTextColor: 'Belöningsknapp text',\n rewardStampBorderColorPartOne: 'Belöningsstämpel kantfärg 1',\n rewardStampBorderColorPartTwo: 'Belöningsstämpel kantfärg 2',\n unstampedImageOpacity: 'Ostämplad färgstyrka',\n websiteLink: 'Länk till hemsida',\n facebookLink: 'Facebook länk',\n instagramLink: 'Instagram länk',\n linkedInLink: 'LinkedIn länk',\n youTubeLink: 'Youtube länk',\n logoUrl: 'Logga',\n rewardImage1: 'Första belöningsbild eller ikon',\n rewardPosition1: 'Position för första belöningen',\n rewardName1: 'Namn på första belöningen',\n rewardDescription1: 'Beskrivning på första belöningen',\n rewardIconColor1: 'Färg på första belöningen',\n rewardImage2: 'Andra belöningsbild eller ikon',\n rewardPosition2: 'Position för andra belöningen',\n rewardName2: 'Namn på andra belöningen',\n rewardDescription2: 'Beskrivning för andra belöningen',\n rewardIconColor2: 'Färg på andra belöningen',\n rewardImage3: 'Tredje belöningsbild eller ikon',\n rewardPosition3: 'Position för tredje belöningen',\n rewardName3: 'Namn på tredje belöningen',\n rewardDescription3: 'Beskrivning på tredje belöningen',\n rewardIconColor3: 'Färg på tredje belöningen',\n stampedImage: 'Stämplad bild',\n unstampedImage: 'Ostämplad bild',\n stampedIconColor: 'Färg på stämplade bilder eller ikoner',\n unstampedIconColor: 'Färg på ostämplade bilder eller ikoner',\n secretCode: 'Hemlig kod',\n campaignName: 'Stämpelkorts-namn',\n timeIntervals: 'Giltighetstider',\n POSIds: 'Registreringsskärm',\n templateUsed: 'Mall som används',\n paymentProviders: 'Betalningssystem',\n selectedProducts: 'Valda produkter',\n pwaDescription: 'App beskrivning',\n pwaName: 'App namn för nedladningsrutan',\n pwaShortName: 'App namn',\n pwaIcon: 'App ikon'\n }\n};\n","/* eslint-disable max-len */\nimport { STAMP_CARD_FIELDS_MAP } from 'translations/stamp-card/stamp-card-form/fields';\n\nconst stampCardStep1Translations = {\n en: {\n oneTime: 'One Time',\n ongoing: 'Ongoing',\n selectProducts: { label: 'Select Products', placeholder: 'Type product name here...', selectAll: 'Select All' },\n accordions: {\n selectProducts: {\n title: 'Product Selection',\n description: 'Make a product-based stamp card',\n helperText: {\n partOne:\n 'Here you can limit your Stamp Card Campaign to only allow customers to receive stamps when certain products are bought. When a purchase includes one or more of the selected products, the customer will receive one stamp for each included product.',\n partTwo:\n 'Stamp Card Campaigns with no products selected will give stamps based on visits. What the customer purchased has no influence on whether a stamp is granted or not.',\n partThree:\n 'Customers receive 1 stamp for each product that has been purchased. For example, if a Stamp Card Campaign is allowing \"Coffee\" and \"Cinnamon Roll\", and a customer purchases 2 coffees and 2 cinnamon rolls, the customer will receive 4 stamps in total.'\n },\n table: {\n showSelectedProducts: 'Show Selected',\n clearFilters: 'Clear Filters',\n clearFiltersTooltip: 'Clear all filters and show all products',\n selectAllProducts: 'Select All',\n selectAllProductsTooltip: 'Select all products on all pages',\n productName: 'Product Name',\n groupName: 'Group Name',\n posName: 'Display Name'\n },\n removedProductsWarning:\n 'Selected devices changed: your products have been automatically removed, please re-select the products'\n },\n toc: { title: 'Terms and Conditions' },\n info: { title: 'Additional information' },\n timeIntervals: {\n title: 'Availability times',\n description: 'Select the days and times that your campaign should be active',\n daysOfWeek: {\n text: 'Days',\n label: 'Select days',\n closed: 'Not available this day',\n Mon: 'Mon',\n Tue: 'Tue',\n Wed: 'Wed',\n Thu: 'Thu',\n Fri: 'Fri',\n Sat: 'Sat',\n Sun: 'Sun'\n },\n daysOfWeekLong: {\n Mon: 'Monday',\n Tue: 'Tuesday',\n Wed: 'Wednesday',\n Thu: 'Thursday',\n Fri: 'Friday',\n Sat: 'Saturday',\n Sun: 'Sunday'\n },\n time: {\n from: 'From',\n to: 'To',\n buttons: {\n max: 'You can only add up to 5 intervals',\n add: 'Add another interval',\n reset: 'Reset interval',\n remove: 'Remove interval',\n apply: 'Apply',\n applyTooltips: {\n apply: 'Confirm the above availability times for the selected days: \"%{selectedDays}\"',\n noDaysSelected: 'Select at least one day',\n missingTime: 'Select both start time and end time on all rows'\n }\n },\n error: { missingStart: 'Select a start time', missingEnd: 'Select an end time' }\n },\n summary: {\n description: 'Select one or more days, adjust the availability times above and click confirm',\n reset: 'Remove all availability times, rendering the stamp card unavailable for this day. You can always change your mind and add availability times later.'\n }\n },\n generalSettings: { title: 'General settings', description: 'End date and Welcome SMS' },\n socials: { title: 'Social media links', description: '' }\n },\n tooltips: {\n campaignName:\n 'Select a name for your stamp card, the name is never shown to customers, but makes it easier for you to keep a track of your campaigns',\n secretCode:\n \"When a customer claims a reward, the customer will be prompted to enter a code in his/her phone, the customer may claim the reward from the link which is automatically sent out in an SMS upon receiving a reward. The code should be easily to remember and perhaps written down next to the cashier. We recomend an easy and short code, for example, an abbreviation of your bussiness name, '2020' or 'coffee!'.\",\n oneTimeOrOngoing:\n 'Choose whether the card should automatically restart after getting full of stamps, or if it should only be valid 1 time. If a card is restarted, customers can keep recieving rewards and they may choose how many to redeem when claiming them.',\n startDate: 'The stamp card will be activated at 00:00 this day.',\n generalSettings: {\n endDate:\n 'Optional end date. If specified, customers will no longer be able to collect stamps or claim rewards after this day has passed.',\n endDateRemove: 'Remove end date',\n welcomeSMS:\n 'Welcome SMS, sent out to customer when they collect their first stamp ever. See our templates for suggestions on content. A link to the customers personal stamp card will always be added to the end of the SMS.',\n rewardEarnedSMS:\n 'Reward SMS, sent out to customers when they have reiched a reward. A link to the customers personal stamp card will always be added to the end of the SMS.'\n },\n socials: {\n website: \"Link to your homepage, including 'https://'\",\n facebook: \"Facebook link, including 'https://'\",\n instagram: \"Instagram link, including 'https://'\",\n linkedin: \"LinkedIn link, including 'https://'\",\n youtube: \"YouTube link, including 'https://'\"\n }\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.en, venueIds: 'Select Venues' }\n },\n se: {\n oneTime: 'Engångskort',\n ongoing: 'Pågående',\n selectProducts: { label: 'Välj produkter', placeholder: 'Sök produktnamn här…', selectAll: 'Välj alla' },\n accordions: {\n selectProducts: {\n title: 'Produktbaserat',\n description: 'Skapa ett produktbaserat stämpelkort',\n helperText: {\n partOne:\n 'Här kan du välja att begränsa ditt stämpelkort till vissa produkter. När ett köp har gjorts där en eller flera av de valda produkterna är inkluderade, kommer kunden få en stämpel för varje inkluderad produkt. ',\n partTwo:\n 'Stämpelkortskampanjer där inga produkter har blivit selekterade baserar stämplar enbart på besök. Vad kunden har köpt bär inget inflytande på om kunden får en stämpel eller inte.',\n partThree:\n 'Kunder får 1 stämpel per produkt som har blivit köpt. Till exempel, om ett stämpelkort accepterar produkterna \"Kaffe\" och \"kanelbulle\", och en kund köper 2 Kaffe, 2 Kanelbullar och 1 Coca-Cola (inte inkluderad), kommer totalt 4 stämplar att delas ut.'\n },\n table: {\n showSelectedProducts: 'Visa markerade',\n clearFilters: 'Rensa filter',\n clearFiltersTooltip: 'Rensa alla filter och visa alla produkter',\n selectAllProducts: 'Välj alla',\n selectAllProductsTooltip: 'Välj alla produkter på alla sidor',\n productName: 'Produkt',\n groupName: 'Grupp',\n posName: 'Display'\n },\n removedProductsWarning:\n 'Valda enheter har ändrats: dina produkter har blivit automatiskt borttagna, vänligen välj produkter på nytt'\n },\n toc: { title: 'Allmänna Villkor' },\n info: { title: 'Ytterligare information' },\n timeIntervals: {\n title: 'Giltighetstider',\n description: 'Ange vilka dagar och tider som stämpelkortet ska vara aktivt',\n daysOfWeek: {\n text: 'Dagar',\n label: 'Välj dagar',\n closed: 'Ej tillgänglig denna dag',\n Mon: 'Mån',\n Tue: 'Tis',\n Wed: 'Ons',\n Thu: 'Tors',\n Fri: 'Fre',\n Sat: 'Lör',\n Sun: 'Sön'\n },\n daysOfWeekLong: {\n Mon: 'Måndag',\n Tue: 'Tisdag',\n Wed: 'Onsdag',\n Thu: 'Torsdag',\n Fri: 'Fredag',\n Sat: 'Lördag',\n Sun: 'Söndag'\n },\n time: {\n from: 'Från',\n to: 'Till',\n buttons: {\n max: 'Du kan max lägga till 5 giltighetstider',\n add: 'Lägg till ytterligare en giltighetstid',\n reset: 'Återställ',\n remove: 'Ta bort',\n apply: 'Bekräfta',\n applyTooltips: {\n apply: 'Bekräfta ovanstående giltighetstider för dagarna: \"%{selectedDays}\"',\n noDaysSelected: 'Välj minst en dag',\n missingTime: 'Välj både starttid och sluttid på alla rader'\n }\n },\n error: { missingStart: 'Välj en starttid', missingEnd: 'Välj en sluttid' }\n },\n summary: {\n description: 'Välj en eller flera dagar, justera giltighetstiderna ovan och klicka bekräfta',\n reset: 'Ta bort alla giltighetstider och gör stämpelkortet otillgängligt under denna dag. Du kan alltid ångra dig och lägga till giltighetstider senare.'\n }\n },\n generalSettings: { title: 'Allmänna inställningar', description: 'Slutdatum och välkomst-SMS' },\n socials: { title: 'Sociala medier', description: '' }\n },\n tooltips: {\n campaignName:\n 'Välj ett namn för ditt stämpelkort, namnet visas ej för kunder men gör det lättare för dig att känna igen kampanjen senare.',\n secretCode:\n \"När en kund vill nyttja sitt kort för att få en belöning måste kunden skriva in denna kod i mobiltelefonen, efter att ha klickat på länken som automatiskt skickas ut via SMS. Koden bestämmer du och din kassapersonal behöver känna till den eller ha den lättillgänglig vid kassan. Vi rekommenderar en lätt och kort kod, t.ex. en förkortning på ditt verksamhetsnamn, '2020' eller 'kaffe!'.\",\n oneTimeOrOngoing:\n 'Välj om kortet automatiskt ska startas om eller om det endast ska vara giltigt en gång. När ett kort startas om kan kunder utöka antalet belöningar på sina kort, dem kan välja hur många dem vill utnyttja vid ett besök.',\n startDate: 'Stämpelkortet startar kl 00:00 denna dag.',\n generalSettings: {\n endDate:\n 'Frivilligt slutdatum. Efter detta datum har passerat kommer kunder inte längre kunna samla stämplar eller lösa in belöningar.',\n endDateRemove: 'Ta bort slutdatum',\n welcomeSMS:\n 'Välkomst-SMS som skickas till kunder när de får sin allra första stämpel. Länk till kundens personliga stämpelkort klistras automatiskt in i slutet av SMSet.',\n rewardEarnedSMS:\n 'Belönings-SMS som skickas till kunder när de uppnått en belöning. Länk till kundens personliga stämpelkort klistras automatiskt in i slutet av SMSet.'\n },\n socials: {\n website: \"Länk till hemsida eller annan huvudsida, inklusive 'https://'\",\n facebook: \"Facebook-länk, inklusive 'https://'\",\n instagram: \"Instagram-länk, inklusive 'https://'\",\n linkedin: \"LinkedIn-länk, inklusive 'https://'\",\n youtube: \"YouTube-länk, inklusive 'https://'\"\n }\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.se, venueIds: 'Välj verksamheter' }\n }\n};\n\nexport default stampCardStep1Translations;\n","import { STAMP_CARD_FIELDS_MAP } from 'translations/stamp-card/stamp-card-form/fields';\n\nconst stampCardStep2Translations = {\n en: {\n cropper: {\n select: 'Select',\n cancel: 'Cancel',\n tooltips: { delete: 'Delete icon' }\n },\n logoUrl: 'Upload Logo',\n accordions: {\n generalColorSettings: {\n title: 'General Color Settings',\n description: \"Select colors for the site's background and Terms of Conditions.\"\n },\n stampCardColorSettings: {\n title: 'Stamp Card Color Settings',\n description: 'Select colors for stamp card.'\n },\n rewardRectangleColorSettings: {\n title: 'Reward Area Color Settings',\n description: 'Select colors for reward area.'\n }\n },\n tooltips: {\n backgroundColor: 'Background color of the stamp card',\n rewardsRectangleColor: 'Border color of the reward squares on the stamp card',\n rectangleBehindCardsColor: 'Stamp card color',\n rectangleBehindCardsBorderColor: 'Border color of the stamp card',\n stampCircleColor: 'Color of the stamp circles',\n textColor: 'Text color',\n rewardButtonColor: 'Reward button color',\n rewardAreaTextColor: 'Reward area text color',\n termsTextColor: 'Terms and conditions text color',\n rewardButtonTextColor: 'Reward button text color',\n rewardStampBorderColorPartOne: 'Reward stamp border one color',\n rewardStampBorderColorPartTwo: 'Reward stamp border two color'\n },\n\n fields: { ...STAMP_CARD_FIELDS_MAP.en }\n },\n se: {\n cropper: {\n select: 'Klar',\n cancel: 'Avsluta',\n tooltips: { delete: 'Ta bort ikon' }\n },\n logoUrl: 'Välj Logga',\n accordions: {\n generalColorSettings: {\n title: 'Allmänna färginställningar',\n description: 'Välj färger på sidans bakgrund och villkorstexten.'\n },\n stampCardColorSettings: {\n title: 'Stämpelkortets färginställningar',\n description: 'Välj färger för stämpelkortet.'\n },\n rewardRectangleColorSettings: {\n title: 'Färginställningar för belöningsområde',\n description: 'Välj olika färger på belöningsområdet.'\n }\n },\n tooltips: {\n backgroundColor: 'Bakgrundsfärg på stämpelkortet',\n rewardsRectangleColor: 'Bakgrundsfärg - nedre belöningsruta',\n rectangleBehindCardsColor: 'Stämpelkortsfärg',\n rectangleBehindCardsBorderColor: 'Färg längst kanterna av stämpelkortet',\n stampCircleColor: 'Färg på de normala stämplarna',\n textColor: 'Textfärg för informationsruta',\n rewardButtonColor: 'Färg på belöningsknappen',\n rewardAreaTextColor: 'Textfärg - nedre belöningsruta',\n termsTextColor: 'Allmänna villkor textfärg',\n rewardButtonTextColor: 'Färg på belöningsknappen',\n rewardStampBorderColorPartOne: 'Belöningsstämpel kantfärg 1',\n rewardStampBorderColorPartTwo: 'Belöningsstämpel kantfärg 2'\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.se }\n }\n};\n\nexport default stampCardStep2Translations;\n","/* eslint-disable max-len */\nimport { STAMP_CARD_FIELDS_MAP } from 'translations/stamp-card/stamp-card-form/fields';\n\nconst stampCardStep3Translations = {\n en: {\n back: 'Back',\n done: 'All steps completed!',\n reset: 'Reset rewards',\n continue: 'Continue',\n finish: 'Finish',\n addAnother: 'Add another reward',\n editCurrent: 'Edit current reward',\n deleteCurrent: 'Delete current reward',\n cropper: {\n select: 'Select',\n cancel: 'Cancel',\n tooltips: { delete: 'Delete icon' }\n },\n rewardSteps: {\n 1: {\n label: 'Select reward image',\n description1:\n \"In these steps, you will select a reward, choose it's position and give it a name. You may either select one of our pre-created icons, or upload your own image. This image will be displayed on the customers stamp card.\",\n description2:\n 'Think about what type of reward you wish to have and select and icon/image that can easily be associated with that reward.'\n },\n 2: {\n label: 'Select reward position',\n description:\n 'The first stamp on the card will have position 1 and the max length of the card is 18 stamps. When multiple rewards are used, the last reward will determine the stamp card length'\n },\n 3: {\n label: 'Select reward name and description',\n description: `The name is used to identify the reward on the stamp card, the name is short and shown in the list of rewards as well as when clicking on a reward.
          \n
          \n The description is longer and is shown when a customer registers on your registration display to encourage more visits (only the description text is displayed on the display), the description is also shown when clicking on a reward, on the stamp card, to get more more information.`,\n exampleText: 'Examples',\n nameText: 'Name',\n descriptionText: 'Description',\n examples: {\n 1: {\n name: 'One Coffee ☕️',\n description: 'One free coffe during lunch (10-14)'\n },\n 2: {\n name: 'Two pizza slices',\n description: 'Two pizza slices, minimum purchase of 100 SEK 🍕'\n },\n 3: {\n name: '10% discount',\n description: '10% discount on a purchase above 150 SEK 🤑'\n }\n }\n }\n },\n tooltips: {\n rewardPosition: 'Position this reward should have on your stamp card',\n rewardIconColor: 'Color of the reward icon',\n rewardName: 'Name of the reward, max 20 characters',\n rewardDescription:\n 'Description of the reward, max 50 cahracters. Keep in mind that the description must contain the actual reward as well, people should understand the reward from only reading the description.'\n },\n fields: {\n ...STAMP_CARD_FIELDS_MAP.en,\n rewardPosition: 'The position of this reward on the stamp card'\n }\n },\n se: {\n back: 'Tillbaka',\n done: 'Alla steg avklarade!',\n reset: 'Nollställ belöningar',\n continue: 'Fortsätt',\n finish: 'Klar',\n addAnother: 'Lägg till belöning',\n editCurrent: 'Redigera denna belöning',\n deleteCurrent: 'Ta bort denna belöningen',\n\n cropper: {\n select: 'Klar',\n cancel: 'Avsluta',\n tooltips: { delete: 'Ta bort ikon' }\n },\n rewardSteps: {\n 1: {\n label: 'Välj belöningsbild',\n description1:\n 'I detta steg specificerar du en, eller flera, belöningar. Du väljer antalet stämplar för att uppnå belöningen, ikon, färg, namn och beskrivning. Du kan välja att ladda upp en bild eller välja från våra förvalda ikoner.',\n description2:\n 'Tänk på vilken sorts belöning du vill dela ut och försök välja en bild/ikon som lätt kan associeras med produkten.'\n },\n 2: {\n label: 'Välj position på stämpelkortet',\n description:\n 'Första stämpeln på kortet har position 1 och kortets maxlängd är 18 stämplar. Vid flera belöningar avgör den sista belöningens position längden på stämpelkortet.'\n },\n 3: {\n label: 'Beskriv din belöning',\n description: `Namn används för att identifiera belöningen på kundens stämpelkort, namnet är kort och syns i listan av belöningar samt om kunden klickar på en belöning för att hämta ut den.
          \n
          \n Beskrivningen är längre och syns när en användare registrerar sig på din registreringsskärm för att motivera fler besök (endast beskrivningen visas på skärmen), beskrivningen syns även när man klickar på belöningen på stämpelkortet för att få mer information.`,\n exampleText: 'Exempel',\n nameText: 'Namn',\n descriptionText: 'Beskrivning',\n examples: {\n 1: {\n name: 'En kaffe ☕️',\n description: 'En gratis kaffe över lunchen (10-14)'\n },\n 2: {\n name: 'Två pizza slices',\n description: '2 pizza slices, vid köp över 100 SEK 🍕'\n },\n 3: {\n name: '10% rabatt',\n description: '10% rabatt vid köp över 150 SEK 🤑'\n }\n }\n }\n },\n tooltips: {\n rewardIconColor: 'Färg på belöningsikonen',\n rewardPosition: 'Positionen som denna belöning ska ha på ditt stämpelkort',\n rewardName: 'Namn på belöningen, max 20 tecken',\n rewardDescription:\n 'Beskrivning av belöningen, max 50 tecken. Tänk på att beskrivningen även måste innehålla själva erbjudandet, kunden måste kunna förstå vad belöningen innebär enbart från beskrivningen.'\n },\n fields: {\n ...STAMP_CARD_FIELDS_MAP.se,\n rewardPosition: 'Belönings-position'\n }\n }\n};\n\nexport default stampCardStep3Translations;\n","/* eslint-disable max-len */\nimport { STAMP_CARD_FIELDS_MAP } from 'translations/stamp-card/stamp-card-form/fields';\n\nconst stampCardStep4Translations = {\n en: {\n cropper: {\n select: 'Select',\n cancel: 'Cancel',\n tooltips: { delete: 'Delete icon' }\n },\n stampedImage: 'Stamped Image',\n unstampedImage: 'Unstamped Image',\n rewardImage1: 'First reward',\n rewardImage2: 'Second reward',\n rewardImage3: 'Third reward',\n tooltips: {\n unstampedImageOpacity: 'Choose the visibility of the stamps on the card, 0=invisible'\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.en }\n },\n se: {\n cropper: {\n select: 'Klar',\n cancel: 'Avsluta',\n tooltips: { delete: 'Ta bort ikon' }\n },\n stampedImage: 'Stämpelbild',\n unstampedImage: 'Ostämplad bild',\n rewardImage1: 'Första belöningen',\n rewardImage2: 'Andra belöningen',\n rewardImage3: 'Tredje belöningen',\n tooltips: {\n unstampedImageOpacity: 'Välj hur transparant stämplarna ska vara, 0=osynlig'\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.se }\n }\n};\n\nexport default stampCardStep4Translations;\n","export type SubmitModalWindowToastTexts = {\n success: string;\n pending: string;\n fail: string;\n noEmojisInSMS: string;\n};\n\nexport type SubmitModalWindowTranslationStructure = {\n submit: string;\n back: string;\n warning: string;\n description: {\n p1: {\n 1: string;\n 2: string;\n 3: string;\n };\n p2: string;\n };\n responseToast: {\n create: SubmitModalWindowToastTexts;\n update: SubmitModalWindowToastTexts;\n };\n};\n\nconst submitModalWindowTranslations: {\n en: SubmitModalWindowTranslationStructure;\n se: SubmitModalWindowTranslationStructure;\n} = {\n en: {\n submit: 'Submit',\n back: 'Cancel',\n warning: 'Warning!',\n description: {\n p1: {\n 1: 'You are about to',\n 2: 'SUBMIT',\n 3: 'the stamp card form.'\n },\n p2: 'Are you happy with all the fields?'\n },\n responseToast: {\n create: {\n success: 'Stamp card campaign successfully created! 👌',\n pending: 'Creating stamp card...',\n fail: 'Failed to create stamp card campaign 🤯',\n noEmojisInSMS: 'Emojis are not allowed in SMS'\n },\n update: {\n success: 'Stamp card campaign successfully updated! 👌',\n pending: 'Updating stamp card...',\n fail: 'Failed to update stamp card campaign 🤯',\n noEmojisInSMS: 'Emojis are not allowed in SMS'\n }\n }\n },\n se: {\n submit: 'Bekräfta',\n back: 'Avbryt',\n warning: 'Varning!',\n description: {\n p1: {\n 1: 'Du är på väg att',\n 2: 'SKICKA IN',\n 3: 'dina val.'\n },\n p2: 'Är du nöjd med alla fält?'\n },\n responseToast: {\n create: {\n success: 'Stämpelkortskampanj skapad! 👌',\n pending: 'Skapar stämpelkortskampanj...',\n fail: 'Misslyckades med att skapa stämpelkortskampanj 🤯',\n noEmojisInSMS: 'Emojis är inte tillåtna i SMS text'\n },\n update: {\n success: 'Stämpelkortskampanj uppdaterad! 👌',\n pending: 'Uppdaterar stämpelkortskampanj...',\n fail: 'Misslyckades med att uppdatera stämpelkortskampanj 🤯',\n noEmojisInSMS: 'Emojis är inte tillåtna i SMS text'\n }\n }\n }\n};\n\nexport default submitModalWindowTranslations;\n","/* eslint-disable max-len */\n\nexport type updateStampCardListTranslationStructure = {\n cancel: string;\n warning: string;\n activate: string;\n disableTestMode: string;\n deactivate: string;\n selectVenue: { name: string; all: string };\n modals: {\n disable: {\n success: string;\n loading: string;\n error: string;\n description: any;\n descriptionNotActivated: any;\n buttonTooltip: string;\n };\n disableTestMode: {\n success: string;\n loading: string;\n error: string;\n activateCard: any;\n disableTest: any;\n activateCardTestMode: any;\n };\n };\n};\n\nconst updateStampCardListTranslations: {\n en: updateStampCardListTranslationStructure;\n se: updateStampCardListTranslationStructure;\n} = {\n en: {\n cancel: 'Cancel',\n warning: 'Warning!',\n activate: 'Activate',\n disableTestMode: 'Activate',\n deactivate: 'Deactivate',\n selectVenue: {\n name: 'Select Venue',\n all: 'All'\n },\n modals: {\n disable: {\n success: 'Stamp card campaign successfully deactivated! 👌',\n loading: 'Updating stamp card...',\n error: 'Something went wrong while deactivating stamp card campaign!',\n buttonTooltip: 'Deactivate but keep test mode status',\n description: {\n p1: {\n 1: 'You are about to',\n 2: 'DEACTIVATE',\n 3: 'for the stamp card'\n },\n p2: {\n 1: 'Your users will',\n 2: 'NOT',\n 3: 'be able to get stamps and claim their rewards anymore'\n },\n p3: 'Are you sure you want to deactivate this stamp card campaign?'\n },\n descriptionNotActivated: {\n p2: {\n 1: 'The stamp card campaign will stay in test mode, but be disabled. You can activate it whenever you want to bring it back to test mode'\n }\n }\n },\n disableTestMode: {\n success: 'Stamp card campaign successfully activated! 👌',\n loading: 'Updating stamp card...',\n error: 'Something went wrong while activating stamp card campaign!',\n activateCard: {\n p1: {\n 1: 'You are about to',\n 2: 'ACTIVATE',\n 3: 'the stamp card campaign'\n },\n p2: {\n 1: 'Your users',\n 2: 'WILL BE ABLE',\n 3: 'to collect stamps and claim their rewards'\n },\n p3: 'Are you sure you want to activate'\n },\n activateCardTestMode: {\n p1: {\n 1: 'You are about to',\n 2: 'ACTIVATE',\n 3: 'the stamp card campaign'\n },\n p2: 'The campaign will be in test mode after activation.',\n p3: 'Are you sure you want to bring'\n },\n disableTest: {\n listItemRewards: 'Positions of rewards',\n p1: {\n 1: 'You are about to',\n 2: 'ACTIVATE',\n 3: 'the stamp card campaign'\n },\n p2: {\n 1: 'You will',\n 2: 'NO LONGER',\n 3: 'be able to update the the following fields'\n }\n }\n }\n }\n },\n se: {\n cancel: 'Avbryt',\n warning: 'Varning!',\n activate: 'Aktivera',\n disableTestMode: 'Aktivera',\n deactivate: 'Avaktivera',\n selectVenue: {\n name: 'Välj verksamhet',\n all: 'Alla'\n },\n modals: {\n disable: {\n success: 'Stämpelkortskampanjen har avaktiverats! 👌',\n loading: 'Uppdaterar stämpelkortskampanjen...',\n error: 'Något gick fel vid avaktiveringen av stämpelkortskampanjen',\n buttonTooltip: 'Avaktivera men behåll status övningsläge',\n description: {\n p1: {\n 1: 'Du är på väg att',\n 2: 'AVAKTIVERA',\n 3: 'din stämpelkortskampanj'\n },\n p2: {\n 1: 'Dina medlemmar kommer',\n 2: 'INTE',\n 3: 'att kunna samla stämplar eller hämta ut belöningar'\n },\n p3: 'Är du säker på att du vill avaktivera'\n },\n descriptionNotActivated: {\n p2: {\n 1: 'Kampanjen kommer att stanna i övningsläge men vara avaktiverad. Du kan aktivera den igen när du vill för att få tillbaka den till övningsläge.'\n }\n }\n },\n disableTestMode: {\n success: 'Stämpelkortskampanjen har aktiverats! 👌',\n loading: 'Uppdaterar stämpelkortskampanjen...',\n error: 'Något gick fel vid aktiveringen av stämpelkortskampanjen',\n activateCard: {\n p1: {\n 1: 'Du är på väg att',\n 2: 'AKTIVERA',\n 3: 'din stämpelkortskampanj'\n },\n p2: {\n 1: 'Dina medlemmar',\n 2: 'KOMMER ATT KUNNA',\n 3: 'samla stämplar och hämta ut belöningar'\n },\n p3: 'Är du säker på att du vill aktivera'\n },\n activateCardTestMode: {\n p1: {\n 1: 'Du är på väg att',\n 2: 'AKTIVERA',\n 3: 'din stämpelkortskampanj'\n },\n p2: 'Kampanjen kommer vara i övningsläge efter att ha aktiverats.',\n p3: 'Är du säker på att du vill aktivera'\n },\n disableTest: {\n listItemRewards: 'Positioner för belöningar',\n p1: {\n 1: 'Du är på väg att',\n 2: 'AKTIVERA',\n 3: 'din stämpelkortskampanj'\n },\n p2: {\n 1: 'Du kommer',\n 2: 'INTE',\n 3: 'att kunna uppdatera de följande fälten längre'\n }\n }\n }\n }\n }\n};\n\nexport default updateStampCardListTranslations;\n","export type ImageInfoTranslationStructure = {\n aspectRatio: string;\n youCanCrop: string;\n logoSizeLimitations: string;\n stampedAndUnstampedImageSizeLimitations: string;\n rewardImageSizeLimitations: string;\n pwaIconLimitations: string;\n supportedFormats: string;\n minWidth: string;\n maxWidth: string;\n minHeight: string;\n maxHeight: string;\n};\n\nconst imageInfoTranslations: {\n en: ImageInfoTranslationStructure;\n se: ImageInfoTranslationStructure;\n} = {\n en: {\n aspectRatio: 'Aspect ratio:',\n youCanCrop: 'You can crop the image by dragging and resizing the square on the image.',\n logoSizeLimitations: 'Logo limitations:',\n stampedAndUnstampedImageSizeLimitations: 'Stamped / unstamped image limitations:',\n rewardImageSizeLimitations: 'Reward image limitations:',\n pwaIconLimitations: 'Begränsningar på PWA ikon:',\n supportedFormats: 'Supported formats',\n minHeight: 'Min height:',\n maxHeight: 'Max height:',\n minWidth: 'Min width:',\n maxWidth: 'Max width:'\n },\n se: {\n aspectRatio: 'Bildförhållande:',\n youCanCrop: 'Välj den del av bilden du vill använda genom att flytta och ändra storlek på rektangeln.',\n logoSizeLimitations: 'Storleksbegränsningar på loggan:',\n stampedAndUnstampedImageSizeLimitations: 'Storleksbegränsningar på stämplad och ostämplad bild:',\n rewardImageSizeLimitations: 'Storleksbegränsingar på belönings-bild:',\n pwaIconLimitations: 'Begränsningar på PWA ikon:',\n supportedFormats: 'Giltiga format:',\n minHeight: 'Minsta höjd:',\n maxHeight: 'Max höjd:',\n minWidth: 'Minsta bredd:',\n maxWidth: 'Max bredd:'\n }\n};\n\nexport default imageInfoTranslations;\n","/* eslint-disable max-len */\nimport { Values } from 'views/StampCardForm/Form/props.interfaces';\n\ntype RelevantValues = Pick;\n\nexport type StampCardInitialValuesTranslationStructure = Record;\n\nconst stampCardInitialValuesTranslations: {\n en: StampCardInitialValuesTranslationStructure;\n se: StampCardInitialValuesTranslationStructure;\n} = {\n en: {\n additionalInformation:\n 'When you have reached your reward, you can ask for a code from the staff that you enter into your stamp card (you received a link in an SMS). Show the reward screen to the staff.\\n\\nEasy, right?!',\n welcomeSMS: 'Welcome to our Stamp Card! Collect stamps and get rewards.',\n rewardEarnedSMS: 'Congratulations! You have a new stamp card reward!',\n /* Since we are only active in Sweden atm, this text should always be in Swedish. It needs a proper, legal, translation when we expand */\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkares verksamhet upphör.'\n },\n se: {\n additionalInformation: `När du uppnått din belöning ber du om en kod från personalen i kassan som du knappar in i mobilen på ditt stämpelkort (som du fått via sms-länk). Visa sedan erbjudandet i kassan.\\n\\nEnkelt, eller hur?!`,\n welcomeSMS: 'Välkommen till vårt stämpelkort! Samla stämplar och få belöningar.',\n rewardEarnedSMS: 'Grattis! Du har en ny stämpelkortsbelöning!',\n termsAndConditions:\n 'Samlande av stämplar genom köp som är godkända av den aktuella näringsidkaren, berättigar till inlösen av angiven belöning. Vid de fall den aktuella belöningen ej finns tillgänglig eller ej är möjlig att genomföra, kan innehavaren av stämpelkortet istället erbjudas en ersättningsprodukt/tjänst alternativt erbjudas den aktuella belöningen vid ett senare tillfälle. Rätten till belöning förfaller dock om aktuell näringsidkares verksamhet upphör.'\n }\n};\n\nexport default stampCardInitialValuesTranslations;\n","/* eslint-disable max-len */\nimport { DEFAULT_STAMP_CARD_PWA_DESCRIPTION } from 'views/StampCardForm/Form/form-helpers/constraints';\n\nimport { STAMP_CARD_FIELDS_MAP } from './fields';\n\nconst stampCardStep5Translations = {\n en: {\n cropper: {\n select: 'Select',\n cancel: 'Cancel',\n tooltips: { delete: 'Delete icon' }\n },\n pwaIcon: 'Upload app icon',\n description: {\n 1: 'This step is voluntary. Here you can personalize the App (PWA) that end-customers will see when they save your stamp card to their home screen. Upload an app icon, choose a name (which appears in installation prompts), an app name (displayed under the icon), and a brief description that highlights your brand and its benefits.',\n 2: 'A well-branded PWA enhances recognition and engagement, making it easy for customers to identify and access your digital stamp card. Ensure your icon is high quality, and keep names and descriptions clear and engaging to create a seamless experience.'\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.en },\n removeIcon: 'Remove icon',\n tooltips: {\n pwaIcon: 'App icon shown on the customers phone',\n pwaShortName:\n 'Name shown underneath the app icon on customers telephones, for example, your SMS sender name',\n pwaName:\n 'Name shown when the customer downloads the app, we recommend using your company name so that the customer recognizes the app they are about to download',\n pwaDescription: 'The app description shown in the download prompt. Our recommendation is set as default.'\n },\n update: {\n warning: 'It may take several days for customers to see your updates.'\n }\n },\n se: {\n cropper: {\n select: 'Klar',\n cancel: 'Avsluta',\n tooltips: { delete: 'Ta bort ikon' }\n },\n pwaIcon: 'Ladda upp app ikon',\n description: {\n 1: 'Detta steg är valfritt. Här kan du anpassa den App (PWA) som slutkunder ser när de sparar ditt stämpelkort på sin hemskärm. Ladda upp en appikon, ange ett namn (som visas vid installation), ett appnamn (som syns under ikonen) och en kort beskrivning som lyfter fram ditt varumärke och dess fördelar.',\n 2: 'En väl anpassad PWA ökar igenkänningen och engagemanget, vilket gör det enklare för kunder att hitta och använda ditt digitala stämpelkort. Se till att din ikon har hög kvalitet och att namn och beskrivning är tydliga och tilltalande för att skapa en smidig upplevelse.'\n },\n fields: { ...STAMP_CARD_FIELDS_MAP.se },\n removeIcon: 'Ta bort ikon',\n tooltips: {\n pwaIcon: 'App ikonen som syns på kundens telefon',\n pwaShortName: 'Namnet under app-ikonen på kundens telefon, till exempel, SMS avsändarnam',\n pwaName:\n 'Namnet syns när kunden laddar ner appen, vi rekommenderar att använda ditt verksamhetsnam för att kunden ska känna igen vad de laddar ner',\n pwaDescription: `App beskrivning vilken syns i nedladdningsrutan för appen. Vår rekommendation är:

          ${DEFAULT_STAMP_CARD_PWA_DESCRIPTION}`\n },\n update: {\n warning: 'Det kan dröja flera dagar för kunder som redan laddat ner appen att se dina uppdateringar.'\n }\n }\n};\n\nexport default stampCardStep5Translations;\n","const stampCardTriggersTranslations = {\n en: {\n header: 'Test stamp card view on a registration display',\n subheader: `Select a stamp card campaign which you want to try out on the registration display.\n\t\t\t\tIf the campaign has multiple Venues and/or Registration displays, separate selection boxes will appear to specify which one to use.\n\t\t\t\tWhen done selecting, you can choose to trigger either a \"New stamp card\", \"Receive stamp\" or \"Reward received\" view on the display.`,\n subheader2: `The selected display will immediately show the view for a few seconds, in the same way as if you had performed a registration.\n\t\t\t\tThe \"fake\" number of stamps is random, so if you have multiple rewards, each trigger could display the view for a different reward.`,\n selectCampaign: 'Select stamp card',\n selectVenue: 'Select Venue',\n selectPOS: 'Select Display',\n newButton: 'New stamp card',\n returningButton: 'Receive stamp',\n rewardButton: 'Reward received',\n pendingToast: 'Loading...',\n successToast: 'Successfully triggered action 👌',\n errorToast: 'Something went wrong 🤯'\n },\n\n se: {\n header: 'Testa din stämpelkortsvy på en registreringsskärm',\n subheader: `Välj en stämpelkortskampanj som du vill testa på en registreringsskärm. \n Om kampanjen sträcker sig över flera verksamheter och/eller flera registreringsskärmar, \n så måste du även specificera dessa via ytterligare menyer. När du valt registreringsskärm, \n kan du välja mellan de olika vyerna \"Nytt stämpelkort\", \"Intjänad stämpel\" och \"Belöning nådd\".`,\n subheader2: `Den selekterade skärmen kommer omedelbart att visa den valda vyn i ett antal sekunder, på precis samma sätt som om du genomfört en registrering. \n Det påhittade antalet stämplar är slumpmässigt, vilket innebär att din vy kan se något annorlunda ut baserat på hur stort ditt stämpelkort är och hur många belöningar du har.`,\n selectCampaign: 'Välj stämpelkortskampanj',\n selectVenue: 'Välj verksamhet',\n selectPOS: 'Välj display',\n newButton: 'Nytt stämpelkort',\n returningButton: 'Intjänad stämpel',\n rewardButton: 'Belöning nådd',\n pendingToast: 'Laddar...',\n successToast: 'Din display är triggad 👌',\n errorToast: 'Misslyckades med att trigga din display 🤯'\n }\n};\n\nexport default stampCardTriggersTranslations;\n","import resetModalWindowTranslations, {\n ResetModalWindowTranslationStructure\n} from 'translations/stamp-card/stamp-card-form/resetModalWindow';\nimport stampCardSidebarTranslations, {\n StampCardSidebarTranslationStructure\n} from 'translations/stamp-card/stamp-card-form/sidebar';\nimport stampCardStep1Translations from 'translations/stamp-card/stamp-card-form/step1';\nimport stampCardStep2Translations from 'translations/stamp-card/stamp-card-form/step2';\nimport stampCardStep3Translations from 'translations/stamp-card/stamp-card-form/step3';\nimport stampCardStep4Translations from 'translations/stamp-card/stamp-card-form/step4';\nimport submitModalWindowTranslations, {\n SubmitModalWindowTranslationStructure\n} from 'translations/stamp-card/stamp-card-form/submitModalWindow';\nimport updateStampCardListTranslations, {\n updateStampCardListTranslationStructure\n} from 'translations/stamp-card/stamp-card-form/update-list';\n\nimport { STAMP_CARD_FIELDS_MAP } from './fields';\nimport imageInfoTranslations, { ImageInfoTranslationStructure } from './imageInfo';\nimport stampCardInitialValuesTranslations, { StampCardInitialValuesTranslationStructure } from './initialValues';\nimport stampCardStep5Translations from './step5';\nimport stampCardTriggersTranslations from './triggers';\n\ntype StampCardTranslationsStructure = {\n imageInfo: ImageInfoTranslationStructure;\n sidebar: StampCardSidebarTranslationStructure;\n stampCardUpdateList: updateStampCardListTranslationStructure;\n resetModalWindow: ResetModalWindowTranslationStructure;\n submitModalWindow: SubmitModalWindowTranslationStructure;\n initialValues: StampCardInitialValuesTranslationStructure;\n fields: typeof STAMP_CARD_FIELDS_MAP.en;\n triggers: typeof stampCardTriggersTranslations.en;\n buttons: {\n loading: string;\n next: string;\n back: string;\n reset: string;\n submit: string;\n update: string;\n preview: string;\n };\n header: {\n buttons: { saveDraft: string; loadDraft: string; tooltips: { saveDraft: string; loadDraft: string } };\n draftSaved: string;\n draftLoaded: string;\n noDraft: string;\n title: string;\n subtitle: { update: string; create: { 1: string; 2: string } };\n templates: string;\n };\n chooseImageOrIcon: {\n pickRewardIcon: string;\n pickUnstampedIcon: string;\n pickStampedIcon: string;\n chooseIcon: string;\n uploadImage: string;\n };\n optionalText: string;\n steps: {\n General: string;\n Visuals: string;\n Rewards: string;\n Stamps: string;\n Pwa: string;\n 1: typeof stampCardStep1Translations.en;\n 2: typeof stampCardStep2Translations.en;\n 3: typeof stampCardStep3Translations.en;\n 4: typeof stampCardStep4Translations.en;\n 5: typeof stampCardStep5Translations.en;\n };\n errors: {\n list: string;\n invalidDate: string;\n disablePast: string;\n mixed: { required: string; notType: { default: string; date: string } };\n custom: {\n uniqueProducts: string;\n hex: string;\n selectVenues: string;\n endDateMustBeAfterStartDate: string;\n secondAfterFirst: string;\n thirdAfterFirstAndSecond: string;\n uniqueRewardTwo: string;\n uniqueRewardThree: string;\n imageUploadFailed: string;\n containsEmoji: string;\n pwaRequired: string;\n };\n strings: { min: string; max: string; url: string };\n arrays: { min: string };\n dates: { min: string };\n };\n components: { colorPicker: { accept: string; cancel: string } };\n integratedWithParentheses: string;\n};\n\ninterface StampCardFormTranslations {\n en: StampCardTranslationsStructure;\n se: StampCardTranslationsStructure;\n}\n\nconst stampCardFormTranslations: StampCardFormTranslations = {\n en: {\n imageInfo: imageInfoTranslations.en,\n sidebar: stampCardSidebarTranslations.en,\n stampCardUpdateList: updateStampCardListTranslations.en,\n resetModalWindow: resetModalWindowTranslations.en,\n submitModalWindow: submitModalWindowTranslations.en,\n fields: STAMP_CARD_FIELDS_MAP.en,\n triggers: stampCardTriggersTranslations.en,\n initialValues: stampCardInitialValuesTranslations.en,\n buttons: {\n loading: 'Loading...',\n next: 'Next',\n back: 'Back',\n reset: 'Reset form',\n submit: 'Create',\n update: 'Update',\n preview: 'Preview'\n },\n header: {\n buttons: {\n saveDraft: 'Save draft',\n loadDraft: 'Load draft',\n tooltips: {\n saveDraft: `Save your draft in case you need to take a break and continue creating your Stamp Card later. \n Saving a draft overwrites whatever existing draft was previously saved. Note that after the Stamp Card campaign has been created, all fields may still be modified.`,\n loadDraft: 'Load your saved draft into the form and continue editing where you left off.'\n }\n },\n draftSaved: 'Draft saved!',\n draftLoaded: 'Draft loaded!',\n noDraft: 'No saved draft found!',\n title: 'New Stamp Card',\n subtitle: {\n update: 'When updating your stamp card, some fields are disabled, for more information we refer to our documentation at',\n create: {\n 1: 'Please view our documentation at',\n 2: 'for more information on how to setup your stamp card'\n }\n },\n templates: 'Pick a style from our list of templates'\n },\n chooseImageOrIcon: {\n pickRewardIcon: 'Pick reward icon',\n pickUnstampedIcon: 'Pick unstamped icon',\n pickStampedIcon: 'Pick stamped icon',\n chooseIcon: 'Select Icon',\n uploadImage: 'Upload Image'\n },\n optionalText: 'Optional Fields',\n steps: {\n General: 'General',\n Visuals: 'Visuals',\n Rewards: 'Rewards',\n Stamps: 'Stamps',\n Pwa: 'App',\n 1: stampCardStep1Translations.en,\n 2: stampCardStep2Translations.en,\n 3: stampCardStep3Translations.en,\n 4: stampCardStep4Translations.en,\n 5: stampCardStep5Translations.en\n },\n errors: {\n list: 'These fields contain errors or are not filled up:',\n invalidDate: 'The end date is invalid',\n disablePast: 'The end date must be in the future',\n mixed: {\n required: 'is a required field',\n notType: {\n default: 'must be of type %{type}',\n date: 'must be a date in YYYY/MM/DD format'\n }\n },\n custom: {\n uniqueProducts:\n 'Selected products must be unique. Most likely you have a conflicting ID in your integrations',\n hex: 'Color value needs to start with a # and contain 4, 7 or 9 characters',\n selectVenues: 'At least one venue must be selected',\n endDateMustBeAfterStartDate: 'End date must be after start date',\n secondAfterFirst: 'Second reward position needs to be higher than the first one',\n thirdAfterFirstAndSecond: 'Third reward position need to be higher than first and second rewards',\n uniqueRewardTwo: 'Second reward name must not be the same as the first or third reward names',\n uniqueRewardThree: 'Third reward name must not be the same as the first or second reward names',\n imageUploadFailed: 'image upload failed 🤯',\n containsEmoji: 'Text may not contain emojis',\n pwaRequired: 'is a required field if any other app fields are set'\n },\n strings: {\n min: 'must be at least %{min} characters long',\n max: 'must be at most %{max} characters long',\n url: 'must be a valid URL'\n },\n arrays: {\n min: 'must contain at least %{min} item'\n },\n dates: {\n min: 'Date cannot be in the past'\n }\n },\n components: {\n colorPicker: {\n accept: 'Accept',\n cancel: 'Cancel'\n }\n },\n integratedWithParentheses: '(Integrated)'\n },\n se: {\n imageInfo: imageInfoTranslations.se,\n sidebar: stampCardSidebarTranslations.se,\n stampCardUpdateList: updateStampCardListTranslations.se,\n resetModalWindow: resetModalWindowTranslations.se,\n submitModalWindow: submitModalWindowTranslations.se,\n fields: STAMP_CARD_FIELDS_MAP.se,\n triggers: stampCardTriggersTranslations.se,\n initialValues: stampCardInitialValuesTranslations.se,\n buttons: {\n loading: 'Laddar...',\n next: 'Nästa',\n back: 'Tillbaka',\n reset: 'Återställ allt',\n submit: 'Skapa',\n update: 'Uppdatera',\n preview: 'Förhandsvisning'\n },\n header: {\n buttons: {\n saveDraft: 'Spara utkast',\n loadDraft: 'Ladda utkast',\n tooltips: {\n saveDraft: `Spara ett utkast, ifall du behöver ta en paus innan du fortsätter skapandet av stämpelkortskampanjen.\n Ifall du sedan tidigare redan har ett utkast sparat, raderas detta när du sparar på nytt. Notera att även efter stämpelkortskampanjen har skapats, finns möjligheten att ändra alla fält i kampanjen.`,\n loadDraft: 'Ladda ditt sparade utkast och fortsätt skapandet av stämpelkortskampanjen.'\n }\n },\n draftSaved: 'Utkast sparat!',\n draftLoaded: 'Utkast laddat!',\n noDraft: 'Inget utkast sparat!',\n title: 'Skapa ditt stämpelkort',\n subtitle: {\n update: 'Vid uppdatering av ditt stämpelkort är vissa fält avstängda, se vår dokumentation',\n create: {\n 1: 'Se vår dokumentation',\n 2: 'för mer information på hur du sammanställer en stämpelkortskampanj'\n }\n },\n templates: 'Välj en av våra stämpelkortsmallar'\n },\n chooseImageOrIcon: {\n pickRewardIcon: 'Välj belönings-ikon',\n pickUnstampedIcon: 'Välj ostämplad ikon',\n pickStampedIcon: 'Välj stämplad ikon',\n chooseIcon: 'Välj ikon',\n uploadImage: 'Ladda upp bild'\n },\n optionalText: 'Valfria fält',\n steps: {\n General: 'Allmänt',\n Visuals: 'Design',\n Rewards: 'Belöningar',\n Stamps: 'Stämplar',\n Pwa: 'App',\n 1: stampCardStep1Translations.se,\n 2: stampCardStep2Translations.se,\n 3: stampCardStep3Translations.se,\n 4: stampCardStep4Translations.se,\n 5: stampCardStep5Translations.se\n },\n errors: {\n list: 'Dessa fält är felformaterade eller saknar innehåll:',\n invalidDate: 'Slutdatumet är ogiltigt',\n disablePast: 'Slutdatumet måste vara i framtiden',\n mixed: {\n required: 'är ett obligatoriskt fält',\n notType: {\n default: 'måste vara av typ %{type}',\n date: 'måste vara ett datum i formatet ÅÅÅÅ/MM/DD'\n }\n },\n custom: {\n uniqueProducts:\n 'Valda produkter måste vara unika. Du har förmodligen en konfliktande ID i dina integrationer.',\n hex: 'Färgkod måste börja med # och inehålla 4, 7 eller 9 tecken',\n selectVenues: 'Minst en plats måste väljas',\n endDateMustBeAfterStartDate: 'Slutdatumet måste vara efter startdatumet',\n secondAfterFirst: 'Andra belöningspositionen måste vara högre än den första',\n thirdAfterFirstAndSecond:\n 'Tredje belöningspositionen måste vara högre än den första och andra belöningen',\n uniqueRewardTwo:\n 'Andra belöningsnamnet får inte vara detsamma som det första eller tredje belöningsnamnet',\n uniqueRewardThree:\n 'Tredje belöningsnamnet får inte vara detsamma som det första eller andra belöningsnamnet',\n imageUploadFailed: 'Bilduppladdning misslyckades 🤯',\n containsEmoji: 'Texten får inte innehålla emojis',\n pwaRequired: 'är ett obligatoriskt fält om något annat app fält är ifyllt'\n },\n strings: {\n min: 'måste vara minst %{min} tecken långt',\n max: 'måste vara högst %{max} tecken långt',\n url: 'måste vara en giltig URL'\n },\n arrays: {\n min: 'måste innehålla minst %{min} objekt'\n },\n dates: {\n min: 'Datum kan inte vara i det förflutna.'\n }\n },\n components: {\n colorPicker: {\n accept: 'Bekräfta',\n cancel: 'Avbryt'\n }\n },\n integratedWithParentheses: '(Integrerad)'\n }\n};\n\nexport default stampCardFormTranslations;\n","/* eslint-disable max-len */\nexport type CookieConsentTranslationStructure = {\n buttons: {\n accept: string;\n decline: string;\n options: string;\n };\n banner: string;\n text: string;\n listItems: {\n essential: {\n title: string;\n subtitle: string;\n };\n analytical: {\n title: string;\n subtitle: string;\n };\n };\n readMore: {\n 1: string;\n 2: string;\n 3: string;\n 4: string;\n };\n footer: string;\n};\n\nexport const cookieConsentTranslations: {\n se: CookieConsentTranslationStructure;\n en: CookieConsentTranslationStructure;\n} = {\n se: {\n buttons: {\n accept: 'Acceptera',\n options: 'Mer val',\n decline: 'Avvisa'\n },\n banner: 'Vi använder cookies för att ge dig den bästa upplevelsen och för att förstå hur vår stämpelkortstjänst används. Genom att acceptera hjälper du oss att förbättra tjänsten. Stämpelkortet fungerar även utan cookies och du kan alltid ändra ditt val senare.',\n text: `Vi använder cookies för att ge dig den bästa upplevelsen och för att förstå hur vår stämpelkortstjänst används. Genom att acceptera hjälper du oss att förbättra tjänsten.\n

          \n Stämpelkortet fungerar även utan cookies och du kan alltid ändra ditt val senare.\n

          \n Vi använder två typer av cookies:`,\n listItems: {\n essential: {\n title: 'Nödvändiga cookies',\n subtitle: 'Krävs för att webbplatsen ska fungera.'\n },\n analytical: {\n title: 'Analytiska cookies',\n subtitle: 'Hjälper oss att förstå hur webbplatsen används, så att vi kan förbättra den.'\n }\n },\n readMore: {\n 1: 'Du kan läsa mer i vår',\n 2: 'Integritetspolicy',\n 3: 'och',\n 4: 'Cookiepolicy'\n },\n footer: 'Cookieinställningar'\n },\n en: {\n buttons: {\n accept: 'Accept',\n options: 'Options',\n decline: 'Decline'\n },\n banner: 'We use cookies to provide you with the best experience and to understand how our stamp card service is used. By accepting, you help us improve the service. The stamp card also works without cookies, and you can always change your choice later.',\n text: `We use cookies to give you the best experience and to understand how our stamp card service is used. By accepting, you help us improve the service.\n

          \n The stamp card also works without cookies, and you can always change your choice later.\n

          \n We use two types of cookies:`,\n listItems: {\n essential: {\n title: 'Essential cookies',\n subtitle: 'Required for the website to work.'\n },\n analytical: {\n title: 'Analytical cookies',\n subtitle: 'Helps us to understand how the website is used, so we can improve it.'\n }\n },\n readMore: {\n 1: 'You can read more in our',\n 2: 'Privacy Policy',\n 3: 'and',\n 4: 'Cookie Policy'\n },\n footer: 'Cookie preferences'\n }\n};\n","export type InstallPwaButtonTranslationsStructure = {\n title: string;\n subtitle: string;\n android: {\n 1: string;\n 2: string;\n 3: string;\n };\n iPhone: {\n 1: string;\n 2: string;\n 3: string;\n };\n hint: string;\n};\n\nexport const pwaInstallInstructions: {\n se: InstallPwaButtonTranslationsStructure;\n en: InstallPwaButtonTranslationsStructure;\n} = {\n se: {\n title: 'Lägg till på hemskärm',\n subtitle:\n 'Genom att installera stämpekortet som en app kommer du enkelt att kunna öppna stämpelkortet från din hemskärm.',\n android: {\n 1: 'Klicka på menyn i övre högra hörn (tre punkter) och välj \"Installera app\" eller \"Lägg till på hemskärmen\"',\n 2: 'Klicka installera i dialogrutan som visas',\n 3: 'Starta appen från hemskärmen'\n },\n iPhone: {\n 1: 'Klicka på \"Dela\" ikonen och välj \"Lägg till på hemskärmen\"',\n 2: 'Bekräfta genom att klicka \"Lägg till\"',\n 3: 'Starta appen från hemskärmen'\n },\n hint: 'Om du får välja mellan att installera eller lägga till genväg, välj installera.'\n },\n en: {\n title: 'Add to homescreen',\n subtitle: 'By installing your stamp card as an app, you will be able to easily access it from your homescreen.',\n android: {\n 1: 'Click on the menu in the upper right corner (three dots) and choose \"Install app\" or \"Add to Home screen\"',\n 2: 'Click add in the next window',\n 3: 'Start the app from the home screen'\n },\n iPhone: {\n 1: 'Click on the \"Share\" icon and chose \"Add to home screen\"',\n 2: 'Confirm by clicking \"Add\"',\n 3: 'Start the app from the home screen'\n },\n hint: 'If presented with the options to install or add a shortcut, click install.'\n }\n};\n","import builderTranslations from 'translations/builder/builder';\nimport intelliSmsTranslations from 'translations/campaigns/campaigns';\nimport mainComponentTranslations from 'translations/components/main';\nimport tooltipTranslations from 'translations/components/tooltip';\nimport editToggleTranslations from 'translations/contexts/editToggleTranslations';\nimport errorTranslations from 'translations/general/errors';\nimport homeTranslations from 'translations/home/homeTranslations';\nimport loginTranslations from 'translations/login/loginTranslations';\nimport memberManagementTranslations from 'translations/management/memberManagement/memberManagementTranslations';\nimport passwordResetTranslations from 'translations/management/passwordReset/passwordResetTranslations';\nimport integrationTranslations from 'translations/management/settings/integration';\nimport menuTranslations from 'translations/management/settings/menu';\nimport profileTranslations from 'translations/management/settings/profile';\nimport settingsTranslations from 'translations/management/settings/venueSettings';\nimport notificationTranslations from 'translations/notifications/notificationTranslations';\nimport registrationTranslations from 'translations/registrations/registrationTranslations';\nimport sidebarTranslations from 'translations/sidebar/sidebar';\nimport stampCardOverviewTranslations from 'translations/stamp-card/stamp-card-form/stamp-card-overview';\nimport stampCardOverlayTranslations from 'translations/stamp-card/stamp-card-overlay';\nimport stampCardPageTranslations from 'translations/stamp-card/stamp-card-page/page';\n\nimport dashboardTranslations from './dashboard/dashboardTranslations';\nimport noContentTranslations from './general/noContentTranslations';\nimport introductionTranslations from './introductions/introductionTranslations';\nimport contactFAQTranslations from './management/contact/faq';\nimport contactFormTranslations from './management/contact/form';\nimport intelliSmsSettingTranslations from './management/settings/intelliSms';\nimport introductionPageTranslations from './management/settings/introductions';\nimport registrationDisplayViewsTranslations from './registrationDisplayViews/registrationDisplayViews';\nimport stampCardFormTranslations from './stamp-card/stamp-card-form/stamp-card-form';\nimport { cookieConsentTranslations } from './stamp-card/stamp-card-page/cookieConsent';\nimport { pwaInstallInstructions } from './stamp-card/stamp-card-page/pwaInstallButton';\n\nconst translations = {\n en: {\n dashboard: dashboardTranslations.en,\n builder: builderTranslations.en,\n registrationDisplayViews: registrationDisplayViewsTranslations.en,\n stampCardOverlay: stampCardOverlayTranslations.en,\n stampCardForm: stampCardFormTranslations.en,\n stampCardPage: stampCardPageTranslations.en,\n pwaInstallInstructions: pwaInstallInstructions.en,\n cookieConsent: cookieConsentTranslations.en,\n stampCardOverview: stampCardOverviewTranslations.en,\n login: loginTranslations.en,\n passwordReset: passwordResetTranslations.en,\n management: {\n contact: {\n form: contactFormTranslations.en,\n faq: contactFAQTranslations.en\n },\n settings: {\n venueSettings: settingsTranslations.en,\n profile: profileTranslations.en,\n menu: menuTranslations.en,\n introduction: introductionPageTranslations.en,\n integration: integrationTranslations.en,\n intelliSms: intelliSmsSettingTranslations.en\n },\n memberManagement: memberManagementTranslations.en\n },\n sidebar: sidebarTranslations.en,\n homepage: homeTranslations.en,\n registrations: registrationTranslations.en,\n campaigns: intelliSmsTranslations.en,\n components: mainComponentTranslations.en,\n tooltip: tooltipTranslations.en,\n notifications: notificationTranslations.en,\n general: {\n leavingThePage: 'If you proceed your changes will be lost. Are you sure you want to proceed?',\n portraitViewWarning: 'This phone only works in \"landscape\" mode, please rotate your phone',\n noContent: noContentTranslations.en,\n errors: errorTranslations.en\n },\n context: { editToggle: editToggleTranslations.en },\n introductions: introductionTranslations.en\n },\n se: {\n dashboard: dashboardTranslations.se,\n builder: builderTranslations.se,\n registrationDisplayViews: registrationDisplayViewsTranslations.se,\n stampCardOverlay: stampCardOverlayTranslations.se,\n stampCardForm: stampCardFormTranslations.se,\n stampCardPage: stampCardPageTranslations.se,\n pwaInstallInstructions: pwaInstallInstructions.se,\n cookieConsent: cookieConsentTranslations.se,\n stampCardOverview: stampCardOverviewTranslations.se,\n login: loginTranslations.se,\n passwordReset: passwordResetTranslations.se,\n management: {\n contact: {\n form: contactFormTranslations.se,\n faq: contactFAQTranslations.se\n },\n settings: {\n venueSettings: settingsTranslations.se,\n profile: profileTranslations.se,\n menu: menuTranslations.se,\n introduction: introductionPageTranslations.se,\n integration: integrationTranslations.se,\n intelliSms: intelliSmsSettingTranslations.se\n },\n memberManagement: memberManagementTranslations.se\n },\n sidebar: sidebarTranslations.se,\n homepage: homeTranslations.se,\n registrations: registrationTranslations.se,\n campaigns: intelliSmsTranslations.se,\n components: mainComponentTranslations.se,\n tooltip: tooltipTranslations.se,\n notifications: notificationTranslations.se,\n general: {\n leavingThePage:\n 'Om du fortsätter kommer dina ändringar att gå förlorade. Är du säker på att du vill fortsätta?',\n portraitViewWarning: 'Denna hemsida fungerar enbart i landskapsläge, vänligen rotera telefonen',\n noContent: noContentTranslations.se,\n errors: errorTranslations.se\n },\n context: { editToggle: editToggleTranslations.se },\n introductions: introductionTranslations.se\n }\n};\n\nexport default translations;\n","const HEX_CHARS = {\n '0': true,\n '1': true,\n '2': true,\n '3': true,\n '4': true,\n '5': true,\n '6': true,\n '7': true,\n '8': true,\n '9': true,\n A: true,\n B: true,\n C: true,\n D: true,\n E: true,\n F: true\n};\n\n// All CSS Levels 1-4 named colors\nconst NAMED_COLORS = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgreen: '#006400',\n darkgrey: '#A9A9A9',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n grey: '#808080',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgreen: '#90EE90',\n lightgrey: '#D3D3D3',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n};\n\n/**\n *\n * @description Gives you either the black or white color for a given background color.\n * https://www.npmjs.com/package/contrast-color\n */\nexport const contrastColor = ({\n bgColor = '#FFFFFF',\n fgDarkColor = '#000000',\n fgLightColor = '#FFFFFF',\n defaultColor = '#000000',\n threshold = 128\n} = {}) => {\n const namedColors: Record = { ...NAMED_COLORS };\n\n const [namedBgColor, namedFgDarkColor, namedFgLightColor, namedDefaultColor] = [\n bgColor,\n fgDarkColor,\n fgLightColor,\n defaultColor\n ].map((p) => namedColors[p]);\n\n let bgColorArray: string[] = String(namedBgColor || bgColor)\n .toUpperCase()\n .split('')\n .filter((c) => HEX_CHARS[c as keyof typeof HEX_CHARS]);\n\n switch (bgColorArray.length) {\n case 3:\n case 4:\n // 3 e.g. #FFF\n // 4 e.g. #1234 <- (3hex + alpha-channel)\n bgColorArray = bgColorArray.slice(0, 3).map((c: string) => `${c}${c}`);\n break;\n case 6:\n case 8:\n // 6 e.g. #789ABC <- ideal\n // 8 e.g. #789ABC00 <- (6hex + alpha-channel)\n bgColorArray = bgColorArray\n .slice(0, 6)\n .reduce(\n (acc: string[], curr: string, n: number, arr: string[]) =>\n n % 2 ? [...acc, `${arr[n - 1]}${curr}`] : acc,\n []\n );\n break;\n default:\n // Invalid bgColor value, so you get the default\n return namedDefaultColor || defaultColor;\n }\n\n const [r, g, b] = bgColorArray.map((h: string) => parseInt(h, 16));\n const yiq = (r * 299 + g * 587 + b * 114) / 1000;\n const darkOrLight = yiq >= threshold ? namedFgDarkColor || fgDarkColor : namedFgLightColor || fgLightColor;\n return darkOrLight;\n};\n","/* eslint-disable camelcase */\nimport { useEffect, useRef, useState } from 'react';\nimport { RGBColor } from 'react-color';\n\nimport {\n differenceInDays,\n differenceInHours,\n differenceInMinutes,\n differenceInMonths,\n differenceInSeconds,\n differenceInWeeks,\n differenceInYears\n} from 'date-fns';\nimport { MRT_Localization_EN } from 'material-react-table/locales/en';\nimport { MRT_Localization_SV } from 'material-react-table/locales/sv';\n\nimport { MerchantInterface, POSSystems } from 'store/features/merchantAndVenues/handlers';\nimport { rgb2hex } from 'views/Management/settings/VenueSettings/helpers/scanColor';\nimport { Days, DaysOfWeek, TimeIntervals } from 'views/StampCardForm/Form/props.interfaces';\nimport {\n DaysOfWeekBackend,\n IStampCardCampaign,\n TimeIntervalsBackend\n} from 'views/StampCardPage/stampCardPage.interfaces';\n\nexport const colorToHex = (color: number) => {\n const hexadecimal = color.toString(16);\n return hexadecimal.length === 1 ? `0${hexadecimal}` : hexadecimal;\n};\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nexport const HEX_REGEX = /^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;\n\nexport const FORM_VALUES = 'formValues';\n\nconst DUPLICATED_HASH_SAFE_GUARD = 1;\nexport const ONE_SMS_MAX_LENGTH = 160;\nexport const STAMP_CARD_HASH_EXAMPLE = '123412341234';\n\nexport const PAYATT_DOMAIN =\n process.env.REACT_APP_ENV === 'development'\n ? (window.location.href || 'http://localhost:3000').split('http://')[1].split('/')[0]\n : (process.env.REACT_APP_PAYATT_API?.toLowerCase().match(/payatt\\.[a-z]+/) || ['payatt.club'])[0];\n\nexport const STAMP_CARD_URL_EXAMPLE = `\\n\\nMitt stämpelkort: ${PAYATT_DOMAIN}/stamp-card/${STAMP_CARD_HASH_EXAMPLE}`;\nexport const STAMP_CARD_URL_EXAMPLE_WITHOUT_PREFIX = `${PAYATT_DOMAIN}/stamp-card/${STAMP_CARD_HASH_EXAMPLE}`;\n\nexport const stampCardWelcomeSmsExample = (welcomeSms: string) => `${welcomeSms}${STAMP_CARD_URL_EXAMPLE}`;\nexport const stampCardWelcomeSmsExampleWithoutPrefix = (welcomeSms: string) =>\n `${welcomeSms}${STAMP_CARD_URL_EXAMPLE_WITHOUT_PREFIX}`;\n\nexport const STAMP_CARD_WELCOME_SMS_MAX_LENGTH = (removeSmsEnding: boolean) => {\n if (removeSmsEnding) {\n return ONE_SMS_MAX_LENGTH - STAMP_CARD_URL_EXAMPLE_WITHOUT_PREFIX.length - DUPLICATED_HASH_SAFE_GUARD;\n }\n\n return ONE_SMS_MAX_LENGTH - DUPLICATED_HASH_SAFE_GUARD - STAMP_CARD_URL_EXAMPLE.length;\n};\n\nexport const STAMP_CARD_REWARD_SMS_MAX_LENGTH = (removeSmsEnding: boolean) => {\n if (removeSmsEnding) {\n return ONE_SMS_MAX_LENGTH - STAMP_CARD_URL_EXAMPLE_WITHOUT_PREFIX.length - DUPLICATED_HASH_SAFE_GUARD;\n }\n\n return ONE_SMS_MAX_LENGTH - DUPLICATED_HASH_SAFE_GUARD - STAMP_CARD_URL_EXAMPLE.length;\n};\n\nexport const convertToTimeInterval = (hour: number, minute: number) =>\n `${hour < 10 ? `0${hour}` : hour}:${minute < 10 ? `0${minute}` : minute}`;\n\nexport const getTotalMinFromTimeStr = (hourMin: string) => {\n const hourMinSplit = hourMin.split(':');\n if (hourMinSplit.length !== 2)\n throw new Error(`Error while parsing time, expected hours and minutes when splitting on \":\" ${hourMin}`);\n\n return +hourMinSplit[0] * 60 + +hourMinSplit[1];\n};\n\nexport const buildTimeIntervals = (startTimes: string[], endTimes: string[]) => {\n if (startTimes.length !== endTimes.length) {\n throw new Error(`startTimes and endTimes must be of the same length, ${{ startTimes, endTimes }}`);\n }\n\n const intervalsInMinutes = [];\n\n for (let x = 0; x < startTimes.length; x += 1) {\n const startTime = getTotalMinFromTimeStr(startTimes[x]);\n const endTime = getTotalMinFromTimeStr(endTimes[x]);\n\n intervalsInMinutes.push([startTime, endTime]);\n }\n\n intervalsInMinutes.sort(([a], [a2]) => a - a2);\n\n const intervals: number[][] = [];\n\n intervalsInMinutes.forEach((int) => {\n if (!intervals.length) intervals.push(int);\n\n const [currStart, currEnd] = intervals[intervals.length - 1];\n const [newStart, newEnd] = int;\n\n if (newEnd <= currEnd) return;\n\n if (newStart <= currEnd && newEnd >= currEnd) {\n intervals[intervals.length - 1] = [currStart, newEnd];\n }\n\n if (newStart > currEnd && newEnd > currEnd) {\n intervals.push([newStart, newEnd]);\n }\n });\n\n return intervals.map(([str, end]) => {\n const startH = convertToTimeInterval((str - (str % 60)) / 60, str % 60);\n const endH = convertToTimeInterval((end - (end % 60)) / 60, end % 60);\n\n return [startH, endH];\n });\n};\n\nexport const buildTimeIntervalsFromBackendData = (timeIntervalsBackend: TimeIntervalsBackend[]) => {\n const timeIntervals: TimeIntervals = {\n Mon: [],\n Tue: [],\n Wed: [],\n Thu: [],\n Fri: [],\n Sat: [],\n Sun: []\n };\n\n timeIntervalsBackend.forEach((interval) => {\n const start = convertToTimeInterval(interval.startHour, interval.startMinute);\n const end = convertToTimeInterval(interval.endHour, interval.endMinute);\n\n interval.daysOfWeek.forEach((dayNum) => timeIntervals[DaysOfWeek[dayNum] as Days].push([start, end]));\n });\n\n Object.keys(timeIntervals).forEach((day) => {\n timeIntervals[day as Days] = timeIntervals[day as Days].sort((a, b) => {\n const aStartTime = getTotalMinFromTimeStr(a[0]);\n const bStartTime = getTotalMinFromTimeStr(b[0]);\n\n return aStartTime - bStartTime;\n });\n });\n\n return timeIntervals;\n};\n\nexport const buildBackendTimeIntervals = (timeIntervals: TimeIntervals) => {\n const responseIntervals = [] as TimeIntervalsBackend[];\n\n Object.keys(timeIntervals).forEach((dayNum) => {\n const day = dayNum as Days;\n\n timeIntervals[day].forEach((interval) => {\n const start = interval[0].split(':');\n const end = interval[1].split(':');\n\n const intervalItem: TimeIntervalsBackend = {\n startHour: +start[0],\n startMinute: +start[1],\n endHour: +end[0],\n endMinute: +end[1],\n daysOfWeek: [DaysOfWeek[day]]\n };\n\n // Search for already stored interval with the same values\n const sameTimeItem = responseIntervals.find((el) => {\n if (\n el.startHour === intervalItem.startHour &&\n el.startMinute === intervalItem.startMinute &&\n el.endHour === intervalItem.endHour &&\n el.endMinute === intervalItem.endMinute\n ) {\n return true;\n }\n\n return false;\n });\n\n if (sameTimeItem) {\n sameTimeItem.daysOfWeek.push(DaysOfWeek[day] as DaysOfWeekBackend);\n } else {\n responseIntervals.push(intervalItem);\n }\n });\n });\n\n return responseIntervals;\n};\n\nexport const hasLimitedIntervals = (timeIntervals: TimeIntervalsBackend[]) => {\n const wholeWeek: DaysOfWeekBackend[] = [0, 1, 2, 3, 4, 5, 6];\n\n // If we only have one interval and it spans the entire day, for every day, then it is not limited\n const firstInterval = timeIntervals[0];\n if (\n timeIntervals.length === 1 &&\n firstInterval.startHour === 0 &&\n firstInterval.startMinute === 0 &&\n firstInterval.endHour === 23 &&\n firstInterval.endMinute === 59\n ) {\n return (\n !wholeWeek.every((el) => firstInterval.daysOfWeek.includes(el)) ||\n wholeWeek.length !== firstInterval.daysOfWeek.length\n );\n }\n\n return true;\n};\n\nexport const generateRandomNumber = () => new Date().getTime() + Math.random();\n\nexport const convertRGBAToString = (c: RGBColor) => `rgba(${c.r},${c.g},${c.b},${c.a})`;\n\n// color: Hex string, percent: positive number to make it lighter, negative number to make it darker\nexport const darkenOrLightenColor = (color: string | RGBColor, percent: number) => {\n if (typeof color === 'object') {\n // eslint-disable-next-line no-param-reassign\n color = rgb2hex(color.r, color.g, color.b);\n }\n\n if (color.includes('rgb')) {\n const [r, g, b] = color\n .substring(color.indexOf('(') + 1, color.indexOf(')'))\n .split(',')\n .map(Number);\n\n // eslint-disable-next-line no-param-reassign\n color = rgb2hex(r, g, b);\n }\n\n let R = parseInt(color.substring(1, 3), 16);\n let G = parseInt(color.substring(3, 5), 16);\n let B = parseInt(color.substring(5, 7), 16);\n\n R = parseInt(((R * (100 + percent)) / 100) as unknown as string, 10);\n G = parseInt(((G * (100 + percent)) / 100) as unknown as string, 10);\n B = parseInt(((B * (100 + percent)) / 100) as unknown as string, 10);\n\n R = R < 255 ? R : 255;\n G = G < 255 ? G : 255;\n B = B < 255 ? B : 255;\n\n const RR = R.toString(16).length === 1 ? `0${R.toString(16)}` : R.toString(16);\n const GG = G.toString(16).length === 1 ? `0${G.toString(16)}` : G.toString(16);\n const BB = B.toString(16).length === 1 ? `0${B.toString(16)}` : B.toString(16);\n\n return `#${RR}${GG}${BB}`;\n};\n\nexport const delay = (ms: number) =>\n new Promise((res) => {\n setTimeout(res, ms);\n });\n\nexport const stopPropagation = (e: React.MouseEvent) => {\n e.stopPropagation();\n};\n\nexport interface WindowSizeInterface {\n windowWidth: number | null;\n windowHeight: number | null;\n}\n\nexport const removeTopGapFromMUITextField = {\n '& legend': { display: 'none' },\n '& fieldset': { top: 0 }\n};\n\nexport const getOrientation = (): OrientationType => {\n switch (window.orientation) {\n case 180:\n // Portrait (Upside-down)\n return 'portrait-secondary';\n case -90:\n // Landscape (Clockwise)\n return 'landscape-primary';\n case 90:\n // Landscape (Counterclockwise)\n return 'landscape-secondary';\n case 0:\n default:\n return 'portrait-primary';\n }\n};\nexport const useScreenOrientation = () => {\n const [orientation, setOrientation] = useState(getOrientation());\n\n const updateOrientation = () => {\n setOrientation(getOrientation());\n };\n\n useEffect(() => {\n window.addEventListener('orientationchange', updateOrientation);\n return () => {\n window.removeEventListener('orientationchange', updateOrientation);\n };\n }, []);\n\n return orientation;\n};\n\nexport const asEnum = (\n enumObject: T,\n value: `${T[K]}`\n): T[K] => {\n if (Object.values(enumObject).includes(value)) {\n return value as unknown as T[K];\n }\n throw new Error('Value provided was not found in Enum');\n};\n\nconst usePrevious = (value: any, initialValue: any) => {\n const ref = useRef(initialValue);\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n};\n\nexport const useEffectDebugger = (effectHook: any, dependencies: any, dependencyNames = []) => {\n const previousDeps = usePrevious(dependencies, []);\n\n const changedDeps = dependencies.reduce((accum: any, dependency: any, index: any) => {\n if (dependency !== previousDeps[index]) {\n const keyName = dependencyNames[index] || index;\n return {\n ...accum,\n [keyName]: {\n before: previousDeps[index],\n after: dependency\n }\n };\n }\n\n return accum;\n }, {});\n\n if (Object.keys(changedDeps).length) {\n console.info('[use-effect-debugger] ', changedDeps);\n }\n\n useEffect(effectHook, [effectHook]);\n};\n\nexport const dimOnTrue = (flag: boolean) => {\n return {\n opacity: flag ? 0.15 : 1\n };\n};\n\nexport const disableOnTrue = (flag: boolean): any => {\n return {\n pointerEvents: flag ? 'none' : 'initial'\n };\n};\n\nexport const parseNumberSassVariable = (val: string): number => {\n try {\n return parseInt(val.split('px')[0], 10);\n } catch (err) {\n console.error('Failed to parse variable \"HeaderBannerContext\" from SASS, using default 0px');\n return 0;\n }\n};\n\nexport const addZeroToDateTime = (i: number) => {\n return i < 10 ? `0${i}` : i.toString();\n};\n\nexport const isValidDate = (val: Date | string | undefined) =>\n typeof val !== 'undefined' && !Number.isNaN(Date.parse(val.toString()));\n\nexport const convertFormLocale = (locale: string) => {\n switch (locale) {\n case 'se':\n return MRT_Localization_SV;\n case 'en':\n return MRT_Localization_EN;\n default:\n return MRT_Localization_EN;\n }\n};\n\nexport const convertLocale = (locale: string) => {\n switch (locale) {\n case 'se':\n return 'sv';\n case 'en':\n return 'en-GB';\n default:\n return 'en';\n }\n};\n\nexport const capitalizeFirstLetter = (val: string) => {\n return val.charAt(0).toUpperCase() + val.slice(1);\n};\n\nexport const dateDifferenceInLocale = (date: Date, localePayAtt: string): string => {\n const locale = convertLocale(localePayAtt);\n const rtf2 = new Intl.RelativeTimeFormat(locale.toUpperCase(), {\n numeric: 'auto'\n });\n\n const dateNow = new Date();\n\n const yearDiff = differenceInYears(date, dateNow);\n if (yearDiff < 0) {\n return capitalizeFirstLetter(rtf2.format(yearDiff, 'years'));\n }\n\n const monthDiff = differenceInMonths(date, dateNow);\n if (monthDiff < 0) {\n return capitalizeFirstLetter(rtf2.format(monthDiff, 'months'));\n }\n\n const weekDiff = differenceInWeeks(date, dateNow);\n if (weekDiff < 0) {\n return capitalizeFirstLetter(rtf2.format(weekDiff, 'weeks'));\n }\n\n const dayDiff = differenceInDays(date, dateNow);\n if (dayDiff < 0) return capitalizeFirstLetter(rtf2.format(dayDiff, 'days'));\n\n const hourDiff = differenceInHours(date, dateNow);\n if (hourDiff < 0) {\n return capitalizeFirstLetter(rtf2.format(dayDiff, 'hours'));\n }\n\n const minDiff = differenceInMinutes(date, dateNow);\n if (minDiff < 0) {\n return capitalizeFirstLetter(rtf2.format(dayDiff, 'minutes'));\n }\n\n return rtf2.format(differenceInSeconds(date, dateNow), 'seconds');\n};\n\nexport const getTextWidth = (text: string, font?: string) => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n if (!context) return -1;\n\n context.font = font || getComputedStyle(document.body).font;\n\n return context.measureText(text).width;\n};\n\nexport const merchantIsIntegrated = ({\n merchant,\n trueForPayAttAdmins = false\n}: {\n merchant: MerchantInterface;\n trueForPayAttAdmins?: boolean;\n}): boolean => {\n if (trueForPayAttAdmins && merchant.PayAttAdmin) return true;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const ven of merchant.venues) {\n if (ven.POS.find((el) => el.POSSystem !== POSSystems.None)) return true;\n }\n\n return false;\n};\n\n/**\n * @example ['cat', 'dog', 'bird'] => ['cat', 'dog', 'bird', 'bird-cat', 'bird-dog', 'cat-dog', 'bird-cat-dog']\n * @description Returns all combinations of provided strings separated by \"-\" (sorted)\n */\nexport const generateCombinations = (inputArray: string[]): string[] => {\n const result: string[] = [];\n\n function backtrack(currentIndex: number, currentCombination: string[]): void {\n if (currentIndex === inputArray.length) {\n if (currentCombination.length) {\n const sortedCombination = currentCombination.sort().join('-');\n result.push(sortedCombination);\n }\n\n return;\n }\n\n backtrack(currentIndex + 1, [...currentCombination, inputArray[currentIndex]]);\n backtrack(currentIndex + 1, [...currentCombination]);\n }\n\n backtrack(0, []);\n\n return result;\n};\n\nexport const containsEmoji = (text: string): boolean => !!text.match(/\\p{Extended_Pictographic}/gu);\n\nexport const stampCardCampaignIsActive = (camp: IStampCardCampaign) =>\n camp.activated &&\n !camp.disabled &&\n new Date(camp.startDate).getTime() > new Date().getTime() &&\n (!camp.endDate || new Date(camp.endDate).getTime());\n\nexport const stampCardCampaignIsNotActivated = (camp: IStampCardCampaign) => !camp.activated;\n\nexport const stampCardCampaignIsDisabled = (camp: IStampCardCampaign) => camp.disabled;\n\nexport const stampCardCampaignIsExpired = (camp: IStampCardCampaign) =>\n camp.endDate && new Date(camp.endDate).getTime() < new Date().getTime();\n\nexport const sortStampCardCampaigns = (camps: IStampCardCampaign[]) => {\n return camps.sort((a, b) => {\n if (stampCardCampaignIsActive(a) && !stampCardCampaignIsActive(b)) return 1;\n if (stampCardCampaignIsActive(b) && !stampCardCampaignIsActive(a)) return -1;\n\n if (stampCardCampaignIsNotActivated(a) && !stampCardCampaignIsNotActivated(b)) return 1;\n if (stampCardCampaignIsNotActivated(b) && !stampCardCampaignIsNotActivated(a)) return -1;\n\n if (stampCardCampaignIsDisabled(a) && !stampCardCampaignIsDisabled(b)) return 1;\n if (stampCardCampaignIsDisabled(b) && !stampCardCampaignIsDisabled(a)) return -1;\n\n if (stampCardCampaignIsExpired(a) && !stampCardCampaignIsExpired(b)) return 1;\n if (stampCardCampaignIsExpired(b) && !stampCardCampaignIsExpired(a)) return -1;\n\n return new Date(a.startDate).getTime() < new Date(b.startDate).getTime() ? -1 : 1;\n });\n};\n","export const TimeBasedCharts = {\n registrationsOverTime: 'registrationsOverTime',\n registrationsOverTimePerVenue: 'registrationsOverTimePerVenue',\n registrationsNewOrReturningOverTime: 'registrationsNewOrReturningOverTime',\n purchasesOverTime: 'purchasesOverTime',\n newStampCardsOverTime: 'newStampCardsOverTime',\n numberOfStampsOverTime: 'numberOfStampsOverTime',\n numberOfStampsOverTimePerVenue: 'numberOfStampsOverTimePerVenue',\n numberOfStampsNewOrReturningOverTime: 'numberOfStampsNewOrReturningOverTime'\n} as const;\n\nexport const NumericCharts = {\n SMSCampaignsTotal: 'SMSCampaignsTotal',\n campaignSMSSentTotal: 'campaignSMSSentTotal',\n numberOfStampsTotal: 'numberOfStampsTotal',\n stampCardsRewardsClaimedTotal: 'stampCardsRewardsClaimedTotal',\n stampCardsCreatedTotal: 'stampCardsCreatedTotal',\n numberOfUniqueRegistrationsTotal: 'numberOfUniqueRegistrationsTotal',\n numberOfRegistrationsTotal: 'numberOfRegistrationsTotal'\n} as const;\n\nexport const DonutCharts = {\n averageStampsPerStampCardDonut: 'averageStampsPerStampCardDonut'\n} as const;\n\nexport const HistogramCharts = {\n numberOfStampsPerStampCardCampaignHistogram: 'numberOfStampsPerStampCardCampaignHistogram'\n} as const;\n\nexport type ChartCategories = 'TimeBasedCharts' | 'NumericCharts' | 'DonutCharts' | 'HistogramCharts';\n\nexport const ChartNames = {\n ...TimeBasedCharts,\n ...NumericCharts,\n ...DonutCharts,\n ...HistogramCharts\n};\n\nexport const ChartsThatRequireStampCardFeature: Partial[] = [\n 'averageStampsPerStampCardDonut',\n 'newStampCardsOverTime',\n 'numberOfStampsOverTime',\n 'numberOfStampsPerStampCardCampaignHistogram',\n 'numberOfStampsTotal',\n 'stampCardsCreatedTotal',\n 'stampCardsRewardsClaimedTotal'\n];\n\nexport const ChartsThatRequireIntegration: Partial[] = ['purchasesOverTime'];\n\ntype TimeBasedChartNames = keyof typeof TimeBasedCharts;\n\nexport const ChartsWithVariants: Record<\n | `${TimeBasedChartNames}Hourly`\n | `${TimeBasedChartNames}Daily`\n | `${TimeBasedChartNames}Weekly`\n | `${TimeBasedChartNames}Monthly`\n | `${TimeBasedChartNames}Yearly`\n | `${TimeBasedChartNames}HourPeriodic`\n | `${TimeBasedChartNames}WeekdayPeriodic`\n | keyof typeof NumericCharts\n | keyof typeof DonutCharts\n | keyof typeof HistogramCharts,\n string\n> = {\n registrationsOverTimeHourly: 'registrationsOverTimeHourly',\n registrationsOverTimeDaily: 'registrationsOverTimeDaily',\n registrationsOverTimeWeekly: 'registrationsOverTimeWeekly',\n registrationsOverTimeMonthly: 'registrationsOverTimeMonthly',\n registrationsOverTimeYearly: 'registrationsOverTimeYearly',\n registrationsOverTimeWeekdayPeriodic: 'registrationsOverTimeWeekdayPeriodic',\n registrationsOverTimeHourPeriodic: 'registrationsOverTimeHourPeriodic',\n\n registrationsOverTimePerVenueHourly: 'registrationsOverTimePerVenueHourly',\n registrationsOverTimePerVenueDaily: 'registrationsOverTimePerVenueDaily',\n registrationsOverTimePerVenueWeekly: 'registrationsOverTimePerVenueWeekly',\n registrationsOverTimePerVenueMonthly: 'registrationsOverTimePerVenueMonthly',\n registrationsOverTimePerVenueYearly: 'registrationsOverTimePerVenueYearly',\n registrationsOverTimePerVenueWeekdayPeriodic: 'registrationsOverTimePerVenueWeekdayPeriodic',\n registrationsOverTimePerVenueHourPeriodic: 'registrationsOverTimePerVenueHourPeriodic',\n\n registrationsNewOrReturningOverTimeHourly: 'registrationsNewOrReturningOverTimeHourly',\n registrationsNewOrReturningOverTimeDaily: 'registrationsNewOrReturningOverTimeDaily',\n registrationsNewOrReturningOverTimeWeekly: 'registrationsNewOrReturningOverTimeWeekly',\n registrationsNewOrReturningOverTimeMonthly: 'registrationsNewOrReturningOverTimeMonthly',\n registrationsNewOrReturningOverTimeYearly: 'registrationsNewOrReturningOverTimeYearly',\n registrationsNewOrReturningOverTimeWeekdayPeriodic: 'registrationsNewOrReturningOverTimeWeekdayPeriodic',\n registrationsNewOrReturningOverTimeHourPeriodic: 'registrationsNewOrReturningOverTimeHourPeriodic',\n\n purchasesOverTimeHourly: 'purchasesOverTimeHourly',\n purchasesOverTimeDaily: 'purchasesOverTimeDaily',\n purchasesOverTimeWeekly: 'purchasesOverTimeWeekly',\n purchasesOverTimeMonthly: 'purchasesOverTimeMonthly',\n purchasesOverTimeYearly: 'purchasesOverTimeYearly',\n purchasesOverTimeWeekdayPeriodic: 'purchasesOverTimeWeekdayPeriodic',\n purchasesOverTimeHourPeriodic: 'purchasesOverTimeHourPeriodic',\n\n newStampCardsOverTimeHourly: 'newStampCardsOverTimeHourly',\n newStampCardsOverTimeDaily: 'newStampCardsOverTimeDaily',\n newStampCardsOverTimeWeekly: 'newStampCardsOverTimeWeekly',\n newStampCardsOverTimeMonthly: 'newStampCardsOverTimeMonthly',\n newStampCardsOverTimeYearly: 'newStampCardsOverTimeYearly',\n newStampCardsOverTimeWeekdayPeriodic: 'newStampCardsOverTimeWeekdayPeriodic',\n newStampCardsOverTimeHourPeriodic: 'newStampCardsOverTimeHourPeriodic',\n\n numberOfStampsOverTimeHourly: 'numberOfStampsOverTimeHourly',\n numberOfStampsOverTimeDaily: 'numberOfStampsOverTimeDaily',\n numberOfStampsOverTimeWeekly: 'numberOfStampsOverTimeWeekly',\n numberOfStampsOverTimeMonthly: 'numberOfStampsOverTimeMonthly',\n numberOfStampsOverTimeYearly: 'numberOfStampsOverTimeYearly',\n numberOfStampsOverTimeWeekdayPeriodic: 'numberOfStampsOverTimeWeekdayPeriodic',\n numberOfStampsOverTimeHourPeriodic: 'numberOfStampsOverTimeHourPeriodic',\n\n numberOfStampsOverTimePerVenueHourly: 'numberOfStampsOverTimePerVenueHourly',\n numberOfStampsOverTimePerVenueDaily: 'numberOfStampsOverTimePerVenueDaily',\n numberOfStampsOverTimePerVenueWeekly: 'numberOfStampsOverTimePerVenueWeekly',\n numberOfStampsOverTimePerVenueMonthly: 'numberOfStampsOverTimePerVenueMonthly',\n numberOfStampsOverTimePerVenueYearly: 'numberOfStampsOverTimePerVenueYearly',\n numberOfStampsOverTimePerVenueWeekdayPeriodic: 'numberOfStampsOverTimePerVenueWeekdayPeriodic',\n numberOfStampsOverTimePerVenueHourPeriodic: 'numberOfStampsOverTimePerVenueHourPeriodic',\n\n numberOfStampsNewOrReturningOverTimeHourly: 'numberOfStampsNewOrReturningOverTimeHourly',\n numberOfStampsNewOrReturningOverTimeDaily: 'numberOfStampsNewOrReturningOverTimeDaily',\n numberOfStampsNewOrReturningOverTimeWeekly: 'numberOfStampsNewOrReturningOverTimeWeekly',\n numberOfStampsNewOrReturningOverTimeMonthly: 'numberOfStampsNewOrReturningOverTimeMonthly',\n numberOfStampsNewOrReturningOverTimeYearly: 'numberOfStampsNewOrReturningOverTimeYearly',\n numberOfStampsNewOrReturningOverTimeWeekdayPeriodic: 'numberOfStampsNewOrReturningOverTimeWeekdayPeriodic',\n numberOfStampsNewOrReturningOverTimeHourPeriodic: 'numberOfStampsNewOrReturningOverTimeHourPeriodic',\n\n ...NumericCharts,\n ...DonutCharts,\n ...HistogramCharts\n};\n","import { Box, useTheme } from '@mui/material';\n\nexport const MEMBER_THRESHOLD = 120;\nexport const EMPHASIZED_TEXT_FONT_SIZE = '110%';\n\nexport const useLiveData = (members: number) => members >= MEMBER_THRESHOLD;\n\nexport const formatNumber = (number: number, minimumFractionDigits = 0) =>\n number.toLocaleString(undefined, { minimumFractionDigits });\n\nexport const EmphBoxNumeric: React.FC<{ children?: React.ReactNode; num?: number }> = ({ children, num }) => {\n const theme = useTheme();\n\n return (\n \n {num && formatNumber(num)}\n {children}\n \n );\n};\n","export const PayAttWidgetNames = {\n // Send SMS campaign input box\n sendSMSCampaign: 'sendSMSCampaign',\n\n // Sentences\n numberOfStampsAndStampCardsSentence: 'numberOfStampsAndStampCardsSentence',\n\n // Calculations\n increasedRevenueBasedOnVisits: 'increasedRevenueBasedOnVisits',\n increasedRevenueBasedOnSMSCampaign: 'increasedRevenueBasedOnSMSCampaign',\n increasedRevenueBasedOnStampCardCampaign: 'increasedRevenueBasedOnStampCardCampaign'\n} as const;\n","export const rgb2hex = (r: any, g: any, b: any) => {\n // eslint-disable-next-line no-bitwise\n const rgb = (r << 16) | (g << 8) | b;\n // return '#' + rgb.toString(16) // #80c0\n // return '#' + (0x1000000 + rgb).toString(16).slice(1) // #0080c0\n // or use [padStart](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)\n return `#${rgb.toString(16).padStart(6, '0')}`;\n};\n\nexport const RGBAToHexA = (rgba: string, forceRemoveAlpha = false) => {\n return `#${rgba\n .replace(/^rgba?\\(|\\s+|\\)$/g, '')\n .split(',')\n .filter((_, index) => !forceRemoveAlpha || index !== 3)\n .map((string, index) => {\n const num = parseFloat(string); // Converts strings to numbers\n const alphaToNum = index === 3 ? Math.round(num * 255) : num; // Converts alpha to 255 number\n const hex = alphaToNum.toString(16); // Converts numbers to hex\n return hex.length === 1 ? `0${hex}` : hex; // Adds 0 when length of one number is 1\n })\n .join('')}`.toUpperCase(); // Puts the array to togehter to an uppercase hex string\n};\n\nexport const addAlpha = (color: string, opacity: number) => {\n if (color.length === 9) return color; // Color already contains opacity\n\n // Coerce values so it is between 0 and 1\n const opacityInt = Math.round(Math.min(Math.max(opacity || 1, 0), 1) * 255);\n return color + opacityInt.toString(16).toUpperCase();\n};\n","export const MAX_MONTHS_ALLOWED_FOR_PROLONGING = 6;\n\nexport const CHECKMARK_IMAGE_URL = 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/checkmark.png';\n\nexport const LOGO_PLACEHOLDER_URL =\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/logo-placeholder.png';\n\nexport const CLOUD_16X9_PLACEHOLDER_URL =\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/cloud16.png';\n\nexport const CLOUD_4X4_PLACEHOLDER_URL =\n 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/cloud4.webp';\n\nexport const MAX_CARD_BG_1 = 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/wave-upl.png';\n\nexport const MAX_CARD_BG_2 = 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/wave2-upl.png';\n\nexport const REWARD_ONE_PLACEHOLDER = 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/coffee.png';\n\nexport const REWARD_TWO_PLACEHOLDER = 'https://payatt-stampcard.s3.eu-north-1.amazonaws.com/placeholders/pizza.png';\n\nexport const DEFAULT_STAMP_CARD_PWA_DESCRIPTION =\n 'Bevaka dina stämplar och hämta ut intjänade belöningar i vår enkla och smidiga app. Inget inlogg, inget krångel.';\n\nexport const ASPECT_RATIO_1X1_LIMITS = {\n minWidth: 256,\n maxWidth: 1024 * 4,\n minHeight: 256,\n maxHeight: 1024 * 4\n};\n\nexport const LOGO_LIMITS = {\n minWidth: 256,\n maxWidth: 1920 * 4,\n minHeight: 256,\n maxHeight: 1920 * 4\n};\n\nexport const PWA_LIMITS = {\n minWidth: 512,\n maxWidth: 512 * 4,\n minHeight: 512,\n maxHeight: 512 * 4,\n supportedFormats: ['png', 'jpg']\n};\n\nexport const ASPECT_RATIO_16X9_LIMITS = {\n minWidth: 426,\n maxWidth: 1920 * 4,\n minHeight: 240,\n maxHeight: 1080 * 4\n};\n\nexport const englishDays = {\n Mån: 'Mon',\n Tis: 'Tue',\n Ons: 'Wed',\n Tors: 'Thu',\n Fre: 'Fri',\n Lör: 'Sat',\n Sön: 'Sun'\n};\n","import React, { Dispatch, ReactElement, RefObject, SetStateAction } from 'react';\n\nimport { SelectChangeEvent, TextFieldProps } from '@mui/material';\n\nimport { FormikErrors, FormikProps, FormikTouched } from 'formik';\n\nimport { StampCardCampaignStats } from 'api/interfaces';\nimport { POSInterface, POSPaymentProviders, VenuesInterface } from 'store/features/merchantAndVenues/handlers';\nimport { SetStateBooleanType, SetStateNumberType, SetStateStringType } from 'utils/global.interfaces';\nimport { IconsType, StampCardRewards } from 'views/StampCardPage/props.interfaces';\nimport {\n IStampCardCampaign,\n StampCardInterface,\n TimeIntervalsBackend\n} from 'views/StampCardPage/stampCardPage.interfaces';\n\nexport type SetFieldTouched = (\n field: string,\n isTouched?: boolean | undefined,\n shouldValidate?: boolean | undefined\n) => void;\n\nexport type SetFieldValue = (field: string, value: any, shouldValidate?: boolean | undefined) => void;\n\nexport type TextFieldWrapperProps = TextFieldProps & { tooltip: string | React.ReactNode };\n\nexport type HandleNextType = (data: {\n event: React.MouseEvent;\n setFieldTouched: SetFieldTouched;\n setFieldValue: SetFieldValue;\n nextDisabled: boolean;\n values: Values;\n errors: FormikErrors;\n touched: FormikTouched;\n}) => void;\n\nexport type HandleNextNumberClickProps = {\n setFieldTouched: SetFieldTouched;\n setFieldValue: SetFieldValue;\n nextDisabled: boolean;\n values: Values;\n errors: FormikErrors;\n touched: FormikTouched;\n step: number;\n};\n\nexport type HandleNextNumberClickType = (data: HandleNextNumberClickProps) => void;\n\nexport type HandleChangeAccordionType = (panel: string) => (_: React.SyntheticEvent, isExpanded: boolean) => void;\n\nexport type FormikRef = RefObject> | null;\n\nexport type ToggleItem = 'create' | 'triggers' | 'overview';\n\nexport type ColorFields =\n | 'backgroundColor'\n | 'termsTextColor'\n | 'rewardButtonTextColor'\n | 'rewardStampBorderColorPartOne'\n | 'rewardStampBorderColorPartTwo'\n | 'rewardsRectangleColor'\n | 'rectangleBehindCardsColor'\n | 'rectangleBehindCardsBorderColor'\n | 'stampCircleColor'\n | 'textColor'\n | 'rewardButtonColor'\n | 'rewardAreaTextColor'\n | 'rewardIconColor1'\n | 'rewardIconColor2'\n | 'rewardIconColor3'\n | 'stampedIconColor'\n | 'unstampedIconColor';\n\nexport type AllowedColorFields = Extract;\n\nexport enum DaysOfWeek {\n 'Mon' = 1,\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat',\n 'Sun' = 0\n}\n\nexport type Days = keyof typeof DaysOfWeek;\n\nexport type TimeIntervals = Record;\n\nexport interface Values {\n termsTextColor: string;\n rewardButtonTextColor: string;\n rewardStampBorderColorPartOne: string;\n rewardStampBorderColorPartTwo: string;\n\n startDate: Date;\n endDate?: Date;\n welcomeSMS: string;\n rewardEarnedSMS: string;\n oneTimeOrOngoing: string;\n additionalInformation: string;\n termsAndConditions: string;\n backgroundColor: string;\n rewardsRectangleColor: string;\n rectangleBehindCardsColor: string;\n rectangleBehindCardsBorderColor: string;\n stampCircleColor: string;\n textColor: string;\n rewardButtonColor: string;\n rewardAreaTextColor: string;\n unstampedImageOpacity: number;\n websiteLink: string;\n facebookLink: string;\n instagramLink: string;\n linkedInLink: string;\n youTubeLink: string;\n logoUrl: string;\n rewardImage1: string;\n rewardPosition1: string | number;\n rewardName1: string;\n rewardDescription1: string;\n rewardIconColor1: string;\n rewardImage2: string;\n rewardPosition2: string | number;\n rewardName2: string;\n rewardDescription2: string;\n rewardIconColor2: string;\n rewardImage3: string;\n rewardPosition3: string | number;\n rewardName3: string;\n rewardDescription3: string;\n rewardIconColor3: string;\n stampedImage: string;\n unstampedImage: string;\n stampedIconColor: string;\n unstampedIconColor: string;\n secretCode: string;\n campaignName: string;\n timeIntervals: TimeIntervals;\n POSIds: string[];\n templateUsed?: string;\n paymentProviders: (POSPaymentProviders | 'All')[];\n selectedProducts: string[];\n\n pwaIcon: string;\n pwaName: string;\n pwaShortName: string;\n pwaDescription: string;\n}\n\nexport interface ColorPickerWithTextfieldProps {\n item: AllowedColorFields;\n label: ReactElement;\n tooltip: `${string}.${AllowedColorFields | 'rewardIconColor'}`;\n}\n\nexport interface IconPickerProps {\n name: Exclude;\n iconTextLabel: React.ReactNode;\n}\n\nexport interface AccordionItemProps {\n mainText: React.ReactNode;\n secondaryText: React.ReactNode;\n panelCount: string;\n expanded: string | false;\n handleChangeAccordion: HandleChangeAccordionType;\n marginTop?: number;\n marginBottom?: number;\n mbBelowAccordion?: number;\n}\n\nexport interface ColorPickerItemProps {\n updateColor(newColor: string): void;\n value: string;\n disabled: boolean;\n}\n\nexport interface DatePickerItemProps {\n tooltip: string;\n name: keyof Values;\n label: React.ReactNode;\n required?: boolean;\n}\n\nexport interface ImageUploadItemProps {\n text: string;\n name: AllowedImageInfoFields;\n alt: string;\n}\n\nexport interface SliderItemProps {\n name: string;\n label: ReactElement;\n tooltip: string;\n min?: number;\n max?: number;\n step?: number;\n}\n\nexport type StampCardItemProps = TextFieldProps & {\n tooltip: string;\n label: string | ReactElement;\n item: keyof Values;\n dangerouslySetTooltipTranslate?: boolean;\n required?: boolean;\n select?: boolean;\n grid?: number;\n setColor?: SetStateStringType;\n updateColor?: (newColor: string) => void;\n};\n\nexport interface MultipleSelectVenueItemProps {\n item: keyof Values;\n label: React.ReactNode;\n}\n\n// This enum has to match translations in 'stampCardForm.steps'\nexport enum StepsEnum {\n General = 'General',\n Visual = 'Visual',\n Rewards = 'Rewards',\n Stamps = 'Stamps',\n Pwa = 'Pwa'\n}\n\nexport interface StepperItemProps {\n activeStep: number;\n steps: StepsEnum[];\n updateCard?: boolean;\n maxStepVisited: number;\n nextClickProps: Omit;\n handleNextNumberClick: HandleNextNumberClickType;\n}\n\nexport interface NextIsDisabledProps {\n activeStep: number;\n errors: FormikErrors;\n touched: FormikTouched;\n}\n\nexport interface UploadImages {\n values: Values;\n setFieldValue: SetFieldValue;\n setFieldTouched: SetFieldTouched;\n step: number;\n}\n\nexport type FormikHandleChange = {\n (e: React.ChangeEvent): void;\n >(field: T): T extends React.ChangeEvent\n ? void\n : (e: string | React.ChangeEvent) => void;\n};\n\nexport interface StepFieldsProps {\n expanded: string | false;\n handleChangeAccordion: HandleChangeAccordionType;\n updateCard?: boolean;\n}\n\nexport interface TooltipErrorButtonWrapperItemProps {\n activeStep: number;\n}\n\nexport interface ChooseIconOrImageProps extends ImageUploadItemProps, IconPickerProps {\n name: Exclude;\n step: number;\n}\n\nexport interface MultiStepStampCardFormProps {\n stateFormikRef: FormikRef;\n setFormikRef: React.Dispatch>;\n updateCard?: boolean;\n currentCampaign?: IStampCardCampaign | null;\n loadingTemplate: boolean;\n activeStep: number;\n showError: boolean;\n setActiveStep: SetStateNumberType;\n setShowError: SetStateBooleanType;\n}\n\nexport interface SCFormPageHeaderProps {\n formikRef: FormikRef;\n cardTitle?: string;\n updateCard?: boolean;\n setLoadingTemplate: SetStateBooleanType;\n setActiveStep: SetStateNumberType;\n setShowError: SetStateBooleanType;\n}\n\nexport type DefaultSCTemplateSelectorProps = Omit;\n\nexport interface TemplateSelectMenu {\n [key: string]: boolean;\n}\n\nexport interface SideListItemProps {\n item: ToggleItem;\n label: string | React.ReactNode;\n Icon: IconsType;\n}\n\nexport interface CardRewardKeys {\n image: Extract;\n name: RewardName;\n description: RewardDescription;\n position: RewardPosition;\n color: RewardIconColor;\n}\n\nexport interface GetUpdateCardData {\n setDataFetched: SetStateBooleanType;\n formikRef: React.RefObject>;\n currentCampaign: IStampCardCampaign;\n copyCampaign?: boolean;\n}\n\nexport type StampCardUpdateData = { data: StampCardInterface };\n\nexport interface SelectVenueProps {\n listItem: string;\n setListItem: SetStateStringType;\n venues: VenuesInterface[];\n}\n\nexport type SelectCampaignTypeProps = Omit;\n\nexport interface SelectPOSProps {\n listItem: string;\n setListItem: SetStateStringType;\n POSList: POSInterface[];\n}\n\nexport interface SelectCampaignProps {\n listItem: string;\n setListItem: SetStateStringType;\n campaigns: IStampCardCampaign[];\n}\n\nexport interface CreateStampCardProps {\n cardTitle?: string;\n updateCard?: boolean;\n copyCampaign?: boolean;\n currentCampaign?: IStampCardCampaign | null;\n}\n\nexport interface CampaignListItemProps {\n campaign: IStampCardCampaign;\n index: number;\n arr: IStampCardCampaign[];\n onClick: (campaign: IStampCardCampaign) => void;\n setShouldUpdateList: SetStateBooleanType;\n}\n\nexport interface OverviewPageListItemProps {\n campaign: IStampCardCampaign;\n onClick: (campaign: IStampCardCampaign) => void;\n}\n\nexport interface OverviewPageMaximizedCardProps {\n campaign: IStampCardCampaign | null;\n setCardSelected: SetStateBooleanType;\n setShouldUpdateList: SetStateBooleanType;\n shouldUpdateList: boolean;\n setShowForm: SetStateBooleanType;\n setCopyCampaign: SetStateBooleanType;\n}\n\nexport interface Socials {\n link: string;\n text: string;\n}\n\nexport type KeyOfValues = keyof Values;\n\nexport type StampCardObject = Omit<\n Values,\n | 'startDate'\n | 'endDate'\n | 'rewardsPositionsAndImages'\n | 'campaignName'\n | 'facebookLink'\n | 'instagramLink'\n | 'websiteLink'\n | 'timeIntervals'\n | 'pwaIcon'\n | 'pwaDescription'\n | 'pwaName'\n | 'pwaShortName'\n> & {\n startDate: string | undefined;\n endDate: string | undefined;\n name: string;\n rewardsPositionsAndImages: StampCardRewards;\n facebookLink: Socials | string;\n instagramLink: Socials | string;\n websiteLink: Socials | string;\n POSIds: string[];\n timeIntervals: TimeIntervalsBackend[];\n pwa?: IStampCardCampaign['pwa'];\n};\n\nexport type HandleStampCardFormSubmit = (\n values: Values,\n formikProps: FormikProps,\n props: {\n setFormSubmitted: Dispatch>;\n navigateToOverview: (time: number) => void;\n setShowForm: SetStateBooleanType;\n setSubmitDisabled: SetStateBooleanType;\n currentCampaign?: IStampCardCampaign | null;\n setLoading: SetStateBooleanType;\n setCardSelected: SetStateBooleanType;\n copyCampaign: boolean;\n }\n) => void;\n\nexport interface StampCardMenuContextProps {\n navigateToOverview: (time: number) => void;\n showForm: boolean;\n setShowForm: SetStateBooleanType;\n loading: boolean;\n setLoading: SetStateBooleanType;\n loadedDraft: boolean;\n setLoadedDraft: SetStateBooleanType;\n activatedCampaign: boolean;\n setActivatedCampaign: SetStateBooleanType;\n cardSelected: boolean;\n setCardSelected: SetStateBooleanType;\n copyCampaign: boolean;\n setCopyCampaign: SetStateBooleanType;\n isUnsubscribed: boolean;\n}\n\nexport type PropertyInValuesOptional = { [Property in keyof Values]+?: any };\n\nexport type PropertyInValues = { [Property in keyof Values]: string };\n\nexport type RewardImage = 'rewardImage1' | 'rewardImage2' | 'rewardImage3';\n\nexport type RewardName = 'rewardName1' | 'rewardName2' | 'rewardName3';\n\nexport type RewardDescription = 'rewardDescription1' | 'rewardDescription2' | 'rewardDescription3';\n\nexport type RewardPosition = 'rewardPosition1' | 'rewardPosition2' | 'rewardPosition3';\n\nexport type RewardIconColor = 'rewardIconColor1' | 'rewardIconColor2' | 'rewardIconColor3';\n\nexport type KeyOfValuesArray = (keyof Values)[];\n\nexport interface ErrorResponse {\n data: { message: string };\n}\n\nexport interface DefaultTemplate {\n id: string;\n name: string;\n category: string;\n logoUrl: string;\n welcomeSMS: string;\n hidden: boolean;\n\n rewardName: string;\n rewardDescription: string;\n rewardImage: string;\n rewardPosition: number;\n rewardColor?: string;\n reward2Name?: string;\n reward2Description?: string;\n reward2Image?: string;\n reward2Position?: number;\n reward2Color?: string;\n reward3Name?: string;\n reward3Description?: string;\n reward3Image?: string;\n reward3Position?: number;\n reward3Color?: string;\n\n termsAndConditions: string;\n stampedImage: string;\n unstampedImage: string;\n unstampedImageOpacity: number;\n backgroundColor: string;\n rewardsRectangleColor: string;\n rectangleBehindCardsColor: string;\n rectangleBehindCardsBorderColor: string;\n stampCircleColor: string;\n textColor: string;\n stampedIconColor: string;\n unstampedIconColor: string;\n rewardButtonColor: string;\n rewardAreaTextColor: string;\n termsTextColor: string;\n rewardButtonTextColor: string;\n rewardStampBorderColorPartOne: string;\n rewardStampBorderColorPartTwo: string;\n}\n\nexport interface DefaultTemplates {\n [key: string]: DefaultTemplate[];\n}\n\nexport interface DaysOfWeekProps {\n name: keyof Values;\n translatedDaysMap: Map;\n selectedDays: string[];\n handleDaySelectorChange: (event: SelectChangeEvent) => void;\n}\n\nexport interface TimeRangePickerProps {\n timeStart: string;\n timeEnd: string;\n index: number;\n disabled: boolean;\n onChangeTimeStart: (index: number, time: string) => void;\n onChangeTimeEnd: (index: number, time: string) => void;\n onClick: () => void;\n onClickMinus: (i: number) => void;\n}\n\nexport type ImageFields =\n | 'rewardImage1'\n | 'rewardImage2'\n | 'rewardImage3'\n | 'stampedImage'\n | 'unstampedImage'\n | 'logoUrl';\n\nexport enum UploadStatus {\n Success = 'success',\n Failure = 'failure',\n Skipped = 'skipped'\n}\n\nexport type UploadSuccess = {\n status: UploadStatus.Success;\n url: string;\n};\n\nexport type UploadFailure = {\n status: UploadStatus.Failure;\n};\n\nexport type UploadSkipped = {\n status: UploadStatus.Skipped;\n};\n\nexport interface Rows {\n name: React.ReactNode;\n data: string | number;\n}\n\nexport interface BasicTableProps {\n heading: React.ReactNode;\n rows: Rows[];\n width?: string;\n}\n\nexport interface CampaignsList {\n all: JSX.Element[];\n active: JSX.Element[];\n testMode: JSX.Element[];\n disabled: JSX.Element[];\n expired: JSX.Element[];\n}\n\nexport interface OverviewPageMaximizedCardButtonsProps {\n setShowForm: SetStateBooleanType;\n setCopyCampaign: SetStateBooleanType;\n setActivatedCampaign: SetStateBooleanType;\n setShouldUpdateList: SetStateBooleanType;\n setCardSelected: SetStateBooleanType;\n campaign: IStampCardCampaign;\n stats: StampCardCampaignStats;\n}\n\nexport interface OverviewPageMaximizedCardTablesProps {\n daysIntevals: string[] | undefined;\n campaign: IStampCardCampaign;\n stats: StampCardCampaignStats;\n setOpenProducts: SetStateBooleanType;\n setOpenVenues: SetStateBooleanType;\n setOpenAvailability: SetStateBooleanType;\n}\n\nexport type AllowedImageInfoFields = Extract<\n KeyOfValues,\n 'logoUrl' | 'rewardImage1' | 'rewardImage2' | 'rewardImage3' | 'stampedImage' | 'unstampedImage' | 'pwaIcon'\n>;\n\nexport interface ProductsDialogProps {\n campaign: IStampCardCampaign;\n open: boolean;\n setOpen: SetStateBooleanType;\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"fontSecondaryColor\":\"#5e5e5e\",\"fontSecondaryColorSelected\":\"#7282f9\",\"menuHeaderHeight\":\"65px\",\"menuHeaderBannerHeight\":\"30px\",\"menuSidebarWidth\":\"220px\",\"smsCampaignMenuBgColor\":\"#e6eaec\",\"payAttGray\":\"#4d4d4d\",\"payAttBlack\":\"#1a1a1a\",\"payAttPink\":\"#fdb4b4\",\"payAttDarkBlue\":\"#0082c0\",\"payAttBlue\":\"#3bbaf4\",\"payAttBlue2\":\"#38b9f6\",\"payAttLightBlue\":\"#d9f4fa\",\"payAttTurquoise\":\"#8ee5f0\",\"payAttDarkTurquoise\":\"#1ecbe1\",\"payAttPurple\":\"#e11ecb\",\"payAttGreen\":\"#15cb4b\",\"iconLightBulb\":\"#ffdf2a\",\"contentMarginLeft\":\"20px\",\"contentMarginRight\":\"20px\",\"contentMarginTop\":\"20px\",\"contentMarginBottom\":\"20px\",\"contentMainCardVerticalDiff\":\"20px\",\"contentCardBorder\":\"0px\",\"contentBackgroundColor\":\"#d9f4fa\",\"backgroundPrimary\":\"rgba(217,244,250,.062745098)\",\"infoButtonColor\":\"#c4c4c4\",\"iconCategory\":\"#15cb4b\",\"iconCategorySecondary\":\"#76f7a9\",\"toggleButtonColorSelected\":\"#fff\",\"toggleButtonBackgroundColorSelected\":\"#0082c0\"};"],"names":["SHOW_HOMEPAGE_SETTINGS_INTRO_SEARCH_PARAMS","SHOW_HOMEPAGE_INTRO_SEARCH_PARAMS","SHOW_DASHBOARD_INTRO_SEARCH_PARAMS","SHOW_INTELLI_SMS_CALENDAR_INTRO_SEARCH_PARAMS","JOYRIDE_TIMEOUT_MENU_OPEN","JOYRIDE_TIMEOUT_ACCORDION_OPEN","TRY_IT_NOW_TEXT_COLOR","NEXT_BUTTON_BG_COLOR","themeMap","PureLightTheme","ThemeContext","React","themeName","_ref","children","curThemeName","localStorage","getItem","_setThemeName","useState","theme","themeCreator","setThemeName","useMemo","themeNameInner","setItem","_jsx","StylesProvider","injectFirst","Provider","value","ThemeProvider","themeFontFamily","join","themeData","h1","h2","h3","h4","h5","h6","boxShadow","width","transitionInSidebarTimeMS","transitionInSidebar","transitionAwaySidebarTimeMS","transitionAwaySidebar","colors","gradients","blue1","blue2","blue3","orange1","orange2","purple1","pink1","pink2","green1","black1","shadows","success","error","info","primary","warning","card","cardSm","cardLg","layout","general","bodyBg","sidebar","background","textColor","dividerBg","menuItemColor","menuItemColorActive","menuItemBg","menuItemBgActive","menuItemIconColor","lighten","menuItemIconColorActive","menuItemHeadingColor","darken","alpha","white","trueWhite","black","secondary","lighter","light","main","dark","palette","augmentColor","createTheme","createColor","mainColor","contrastText","color","mainContentArea","marginLeft","sassVariables","marginTop","marginRight","marginBottom","bannerHeight","parseInt","reactFrameworkColor","borderRadiusSm","borderRadius","borderRadiusLg","borderRadiusXl","header","height","spacing","pink","green","violet","lightGray","builderDarkBlue","payAttGray","payAttBlack","payAttPink","payAttDarkBlue","payAttBlue","payAttBlue2","payAttLightBlue","payAttTurquoise","payAttDarkTurquoise","payAttPurple","payAttGreen","payAttGreen2","backgroundPrimary","infoButtonColor","iconLightBulb","iconCategory","iconCategorySecondary","toggleButtonColorSelected","toggleButtonBackgroundColorSelected","common","mode","grey","A100","A200","A400","A700","text","disabled","paper","default","action","active","hover","hoverOpacity","selected","selectedOpacity","disabledBackground","disabledOpacity","focus","focusOpacity","activatedOpacity","tonalOffset","breakpoints","values","xs","sm","md","lg","xl","components","MuiUseMediaQuery","defaultProps","noSsr","MuiBackdrop","styleOverrides","root","backgroundColor","backdropFilter","MuiFormHelperText","textTransform","fontWeight","MuiCssBaseline","fontSize","fontFamily","borderTopColor","borderLeftColor","code","padding","transform","opacity","MuiSelect","iconOutlined","icon","top","MuiOutlinedInput","paddingRight","borderColor","MuiListSubheader","colorPrimary","lineHeight","MuiCardHeader","title","MuiRadio","MuiChip","colorSecondary","deleteIcon","MuiAccordion","margin","display","MuiAvatar","colorDefault","MuiAvatarGroup","alignItems","avatar","border","MuiListItemAvatar","alignItemsFlexStart","MuiPaginationItem","page","transition","textPrimary","MuiButton","disableRipple","paddingLeft","endIcon","containedSecondary","outlinedSecondary","MuiButtonBase","MuiToggleButton","MuiIconButton","sizeSmall","MuiListItemText","MuiDivider","vertical","withChildren","wrapper","MuiPaper","elevation0","elevation","elevation2","elevation24","MuiLinearProgress","MuiSlider","MuiList","minWidth","MuiTabs","minHeight","overflow","indicator","scrollableX","MuiTab","zIndex","MuiMenu","list","MuiListItem","MuiAutocomplete","tag","right","clearIndicator","popupIndicator","MuiTablePagination","toolbar","select","MuiToolbar","MuiTableRow","head","MuiTableCell","borderBottomColor","MuiAlert","message","standardInfo","MuiTimelineDot","position","left","outlined","outlinedPrimary","MuiTimelineConnector","MuiTimelineItem","missingOppositeContent","MuiTooltip","tooltip","arrow","MuiSwitch","thumb","track","MuiStepper","paddingTop","paddingBottom","MuiStepIcon","MuiTypography","variantMapping","subtitle1","subtitle2","body1","body2","poppinsBody","gutterBottom","paragraph","shape","typography","htmlFontSize","button","caption","overline","API_ENDPOINT","BASE_URL","authLogin","async","username","password","skipContractCheck","arguments","length","undefined","params","includes","email","response","axios","headers","data","contract","signed","status","token","chartToken","handleAxiosInvalidResponse","err","handleAxiosError","endUserSession","getCampaignHistory","raw","Object","keys","forEach","venueId","venue","push","smsSenderName","messageText","newCustomers","recipients","senderUsername","timestamp","createdAt","extractVenueHistory","extractCampaignHistoryFromResponse","UrlShortenerAPI","originalUrl","shortUrl","MAX_NUMBER_OF_DASHBOARDS","MAX_NUMBER_OF_WIDGETS_PER_DASHBOARD","DASHBOARD_WHILE_TYPING_REG_EXP","RegExp","DASHBOARD_VALID_NAME_REG_EXP","_process$env$REACT_AP","process","toLowerCase","generatePresignedPOSTURL","fileName","fileType","body","uploadImageToAWS","url","form","_ref2","createFileFromString","fileBlob","fetch","file","blob","File","type","compressImage","imageCompression","maxSizeMB","maxWidthOrHeight","useWebWorker","adjustTimeForTimezoneOffset","_ref3","startTime","endTime","fromUtc","offset","Date","getTimezoneOffset","startHour","startMinute","endHour","endMinute","hour","min","console","Error","Number","isNaN","adjustOffset","time","newTime","lifestyleInterior","venueCategory","VenueCategories","_id","startDate","secretCode","name","oneTimeOrOngoing","timeIntervals","daysOfWeek","timeZone","termsAndConditions","additionalInformation","welcomeSMS","rewardEarnedSMS","stampCardSuggestions","testPhoneNumbers","activated","POSIds","merchantId","hidden","logoUrl","stampedImage","unstampedImage","unstampedImageOpacity","rewardsPositionsAndImages","description","image","rewardsRectangleColor","rectangleBehindCardsColor","rectangleBehindCardsBorderColor","stampCircleColor","stampedIconColor","unstampedIconColor","rewardButtonColor","rewardAreaTextColor","termsTextColor","rewardButtonTextColor","rewardStampBorderColorPartOne","rewardStampBorderColorPartTwo","websiteLink","link","facebookLink","instagramLink","linkedInLink","youTubeLink","selectedProducts","updatedAt","tags","beautySalon","fastfoodGrill","restaurant","cafe","templateUsed","deli","hairdresser","clothesStore","flowershop","other","StampCardCampaignsMock","lifestyleInteriorStampCard","customer","stampCardCampaignId","stampCount","totalStampCount","firstRegistration","POSId","hash","rewardsReadyToBeClaimed","count","beautySalonStampCard","fastfoodGrillStampCard","restaurantStampCard","cafeStampCard","deliStampCard","hairdresserStampCard","clothesStoreStampCard","flowershopStampCard","otherStampCard","StampCardsMock","isWebsiteInstancePayattclub","REACT_APP_WEBSITE_INSTANCE","mockWebsiteGetStampCardAPI","stampCard","campaign","STAMP_CARD_ENDPOINT_WEBSITE","campaignId","getStampCardInfo","parsedCampaign","ensureValidCampaign","customerCard","id","entries","key","val","statusText","config","mockWebsiteClamRewardAPI","rewardId","find","el","payAttError","getUserInfo","jwtTokenUnencrypted","Authorization","_raw$contact","_raw$contact2","_raw$contact3","_raw$contact4","_raw$contact5","_raw$contact6","user","contact","firstName","lastName","countryCode","country","phoneNumber","manages","role","asEnum","UserRoles","readOnly","campaignAllowed","settings","showIntroductions","homepage","dashboard","intelliSms","newCampaign","calendar","lastLogin","handleResponse","sendContactUsEmail","EMAIL_POST_ENDPOINT","updateShowIntroSeenAPI","endpoint","introData","VENUE_ENDPOINT","UNREGISTER_NUMBER_ENDPOINT","extractPOSFromResponse","rawPOS","_rawPOS$scanColor","_rawPOS$scanColor2","_rawPOS$scanColor3","pos","headerText","subheaderText","newCustomerMessage","returningCustomerMessage","POSSystem","scanColor","red","blue","permanentScanScreen","showQR","extractVenueFromResponse","_raw$POS","venueTitle","officialName","category","getVenueCategoryWithSpellingCheck","POS","map","permission","VenuePermissions","lastUpdatedBy","sentSMSTotal","products","updateVenueSettings","payAttSuccess","unregisterPhoneNumberAPI","venues","unregisterResponses","Promise","all","unregisterResponse","alreadyUnregisteredList","filter","res","successfullyUnregistered","customerMissing","failedRequests","DisplayViews","standbyView","numPadView","newCustomerRegistrationView","returningCustomerRegistrationView","stampCardNewJoinView","stampCardProgressView","stampCardRewardView","SidebarContext","createContext","SidebarProvider","sidebarToggle","setSidebarToggle","toggleSidebar","useCallback","request","path","warn","_response$request","errorMsg","errorStatus","responseURL","isPayAttError","obj","isPayAttSuccess","FlexBox","styled","Box","HorizontalCenteredFlexBox","justifyContent","VerticalFlexBox","flexDirection","CenteredFlexBox","VerticalCenteredFlexBox","VerticalCenteredList","List","FullDivider","Divider","sxWrapper","sxSpinner","useEffect","NProgress","sx","CircularProgress","size","disableShrink","thickness","LogoutToastId","PayAttSuccessToast","Content","options","Msg","toast","autoClose","style","MAX_SAFE_INTEGER","PayAttSuccessToastForever","PayAttInfoToast","PayAttFailToast","PayAttFailToastForever","PayAttLogOutToast","ms","onClose","content","closeOnClick","closeButton","draggable","pauseOnHover","pauseOnFocusLoss","toastId","PayAttNoDataToast","Translate","DefaultToastContainer","props","ToastContainer","SlideUpTransition","forwardRef","ref","Slide","direction","GLOBAL_SETTINGS_ENDPOINT","getBillingSettings","createAsyncThunk","_","rejectWithValue","costPerSMS","getBillingSettingsAPI","billingSettings","createSlice","initialState","initialBillingSettingsState","reducers","setBillingSettings","state","payload","extraReducers","builder","addCase","fulfilled","_state","isLoading","pending","rejected","newState","actions","login","_authData","currUser","jwtToken","authError","authData","updateUser","getState","userData","auth","isAuth","currentUser","updateShowIntro","authSlice","setLoading","useRefreshToken","_payload$payload","updateSettings","setLogOut","setAuthFailed","showContractGuard","contractGuardShown","getCampaignHistoryAPI","done","loading","colorPicker","cycleColors","store","hexColor","startsWith","RGBAToHexA","lastUsedColors","c","pop","unshift","resetColors","dateTimeReviver","_key","test","date","parseResponse","dataRaw","Array","isArray","doc","JSON","parse","breakpoint","DASHBOARD_ENDPOINT","stringifyFilter","stringify","getHomepageDashboards","getAllHomepageAPI","getDashboard","getAllDashboardAPI","updateDashboard","dashboardState","dashboardLayouts","dashboardUpdateHasDiff","reqParams","updateDashboardAPI","NO_CHANGES","updateDashboardName","_ref4","updateDashboardNameAPI","updateDashboardDefault","_ref5","updateDashboardDefaultAPI","createDashboard","_ref6","createNewDashboardAPI","createDefaultDashboard","_ref7","createDefaultDashboardAPI","deleteDashboard","_ref8","deleteDashboardAPI","dashboardLayoutSlice","CreateDashboardReducers","CreateDefaultDashboardReducers","GetDashboardReducers","argData","meta","arg","dashboardId","UpdateDashboardReducers","UpdateDashboardNameReducers","UpdateDashboardLayoutReducers","newData","DeleteDashboardReducers","reducer","dashboardHomepageLayoutSlice","initialStateHomepage","dashboardBackgroundImage","initialStateDashboardBackgroundImage","setBackgroundImage","BackgroundImageMap","dashboardBackgroundImageSlice","BackgroundImages","hide","flowers","desk1","desk2","imagePrefix","Map","DEFAULT_BACKGROUND_IMAGE","get","storeDashboard","POSSystems","ESKassa","Onslip","Zettle","None","merchantTitle","companyName","monthlySMSAllowance","smsRemaining","bonusSmsPool","bonusSmsPoolCount","PayAttAdmin","smsTextSettings","removeStampCardRewardSMSEnding","removeWelcomeSMSEnding","removeStampCardWelcomeSMSEnding","MERCHANT_ENDPOINT","getMerchant","_raw$merchant","_raw$merchant$smsText","_raw$merchant2","_raw$merchant2$smsTex","_raw$merchant3","_raw$merchant3$smsTex","_raw$venues","merchant","rawVenue","expirationTime","getTime","reduce","sum","smsLeft","sort","a","b","localeCompare","numeric","merchantSubscription","extractMerchantFromResponse","getMerchantAPI","InitialMerchantState","setMerchant","venueIndex","findIndex","ven","newVenue","addVenue","removeVenue","setVenuePermission","resetVenue","categoryRaw","barRestaurantOptions","indianRestaurantOptions","flowerStoreOptions","petStoreOptions","italianRestaurantOptions","icecreamShopOptions","foodTruckHealthyFoodOptions","wineImporterOptions","barberOptions","hairdresserOptions","hairdresserBeautyOptions","cafeOptions","cafeBagelOptions","restaurantOptions","fishStoreOptions","meatStoreOptions","yarnStoreOptions","hamburgerStoreOptions","DeliStoreOptions","CandyStoreOptions","FastFoodGrillOptions","HealthyStoreOptions","ClothingStoreOptions","LifestyleOptions","BeautySalonOptions","SushiRestaurantOptions","OtherOptions","categoryLow","emptyText","initialNotificationsState","shouldRefreshNotificationsCenter","lastChecked","showNotification","en","se","richText","notificationsSlice","setShowNotification","setNotificationLastChecked","setNotificationState","setShouldRefreshNotificationCenter","selectedViewValue","selectedViewName","builderStartSessionState","viewName","registationDisplayViews","setregistationDisplayViews","setInitialBuilderState","registrationsPerVenue","isDone","STATS_ENDPOINT","extractStatsFromResponse","totalCustomerRegistrations","totalCustomers","totalReturningCustomers","unregisteredCustomers","totalOwners","getRegistrationsPerVenue","dispatch","registrations","allStats","venueIds","i","venueFromResponse","getRegistrationPerVenue","saveLogoutState","window","location","reload","addRegistrationStats","resetRegistrations","getStampCardCampaigns","campObj","uniqueCamps","sortStampCardCampaigns","getAllCampaignsAPI","campInList","posId","camp","uniqueCampaigns","venueCategories","extractSmsSuggestion","venueCategoriesRaw","getVenueCategories","getSmsSuggestionAPI","setVenueCategories","addVenueCategory","deleteAllSmsSuggestions","smsSuggestions","getPersistedState","_state$i18n","validDashboardBackgroundImage","i18n","locale","translations","loadState","serializedState","saveState","localeSelector","split","localeDateFnsSelector","enGB","sv","colorPickerLastUsedColorsSelector","regitrationDisplayViewsSelector","registrationDisplayViews","authSelector","currentUserSelector","billingSettingsSelector","merchantSelector","venuesSelector","showNotificationSelector","notifications","getCurrentNotificationSelector","getNotificationLastCheckedSelector","venueSelector","allVenueRegistrationStats","RegistrationsStatsPerVenueSelector","venueRegistrations","stampCardSubscriptionSelector","stampCardsSelector","includeDisabled","includeExpired","includeNotActivated","includeFuture","stampCardCampaigns","allCamps","timeNow","stampCardCampaignIsExpired","stampCardCampaignIsNotActivated","stampCardCampaignIsDisabled","allDashboardsSelector","homepageLayoutSelector","homepageLayouts","dashboardBackgroundImageSelector","introductionSelector","subscriptionSelector","initialAuthState","initialVenueCategoryState","initialRegistrationState","campaignHistory","initialStateCampaignHistory","initialStateStampCardCampaigns","initialStateRegistrationDisplayViews","initialStateColorPicker","initialStateDashboardLayouts","combinedReducer","combineReducers","authReducer","notificationsReducer","i18nReducer","venueCategoriesReducer","billingSettingsReducer","merchantReducer","registrationSlice","campaignHistorySlice","stampCardCampaignsSlice","registationDisplayViewsSlice","colorPickerSlice","rootReducer","createStore","persistedState","preloadState","configureStore","preloadedState","middleware","getDefaultMiddleware","serializableCheck","ignoredPaths","ignoredActionPaths","subscribe","syncTranslationWithStore","loadTranslations","missingNumpad","disclaimerMissing","overflowBodyContainer","rollback","saveView","quitWithoutSaving","save","continue","quit","cancel","rewardTextPlaceholder","rewardTextTooltip","progressTextPlaceholder","progressTextTooltip","intelliSmsContentTranslations","urlShortenerInfo","isPostingVenueText","send","testSmsSuccess","successLargeCampaign","fail","tooManyRequests","tooManySuggestionRequests","tooFewCustomers","insufficientSmsBalance","timeLeft","blockedParallel","unknownError","socketResponse","delete","campaignInProcess","campaignCompleted","unknownFailure","subtitle","overview","beyondLimitWarning","multiPart","singlePart","confirmBoxText","intelliSmsFilterModalTranslations","sendToEveryone","selectTargetGroup","stamps","rewards","selectStampCardCampaign","infoButtons","targetGroup","none","selectVenues","selectVenuesRequired","selectAll","noVenuesSelected","labels","generalBefore","generalWithin","mostUsed","fields","Everyone","TimeInterval","LastVisitWithin1Week","LastVisitWithin2Weeks","LastVisitWithin1Month","LastVisitWithin3Months","LastVisitWithin6Months","LastVisitBefore1Week","LastVisitBefore2Weeks","LastVisitBefore1Month","LastVisitBefore3Months","LastVisitBefore6Months","OneStampLeftForReward","OneStampLeftForReward1","OneStampLeftForReward2","OneStampLeftForReward3","RewardToClaimAny","RewardToClaim1","RewardToClaim2","RewardToClaim3","NeverReachedReward","OneOrMoreRewardsClaimed","OneStampRecieved","SmallNumberOfStamps","MediumNumberOfStamps","LargeNumberOfStamps","WithoutStampCard","timeIntervalDialog","mustSelectStartAndEnd","endAfterStart","minimum30min","filterRemoved","label","intelliSmsInfoButtonTranslations","remainingSMS","paidSMS","paidSMSTooltip","bonusSmsPoolTooltip","neverExpires","expiresIn","smsStructure","intelliSmsRRuleGeneratorTranslations","eventTime","frequency","monthly","weekly","daily","every","end","never","after","repetition","repetitionPlural","day","dayPlural","week","weekPlural","month","monthPlural","dayOfTheWeek","mon","tue","wed","thu","fri","sat","sun","monday","tuesday","wednesday","thursday","friday","saturday","sunday","anyDay","weekday","weekendDay","first","second","third","fourth","last","disablePast","intelliSmsScheduleTranslations","back","update","create","schedule","scheduleRecurring","scheduleRecurringHint","today","selectDate","newlyScheduled","previouslyScheduled","previousCampaigns","eventBeingModified","selectTime","selectTimeAndDate","accept","acceptHint","views","timeGridWeek","dayGridMonth","listWeek","listMonth","calendarSubheader","listSubheader","hints","prevDay","prevWeek","prevMonth","prevYear","nextDay","nextWeek","nextMonth","nextYear","weekView","monthView","intelliSmsSummaryModalTranslations","smsMessageInfo","characters","parts","categories","filters","stampCardCampaign","show","summary","sendTime","sendTimeMultiple","sendTimeRecurring","senderName","totalSmsParts","totalSmsPartsTooltip","monthlySms","monthlySMSAfterCampaign","bonusSMSAfterCampaign","sendNow","sendScheduled","senderNameMultiple","allCustomers","allCustomersMultiVenue","weHaveEstimatedRecipients","sendTooltipNow","sendTooltipScheduled","sendOnlyToAdmins","successfullyScheduled","toSoon","noCustomersFound","extraChargesMayApply","numbersWarning","multiPartSmsInfoText","confirmDialog","testSms","editMessageText","refresh","next","wontSend","saveSuggestion","menu","stampCardNotSubscribedToast","errorsToProceed","filterRequiresStampCardCampaign","includesStampCardUrlButMissingCampaign","noDisplaysConnectedToCampaign","noVenueSelected","noMessage","menuModal","last10SavedSuggestions","includeStampCardUrl","includeUnregUrl","includeUnregUrlTooltip","includeStampCardUrlTooltip","savedSuggestionsModal","savedSuggestions","textCopied","noSuggestionsFound","empty","eventPopper","messageParts","smsUsageHeader","messageHeader","bonusSmsUsed","freeSmsUsed","totalSmsUsed","paidSms","confirmDelete","recurringSubtitle","recurringEvents","additionalEvents","pastEvent","failedToSend","titleRetry","subtitleRetry","titleNoRecipients","subtitleNoRecipients","venueList","failed","tooltipUrlSuffixExplanation","stampCardAndUnreg","unreg","smsBox","disabledNextTooltip","placeholder","limitOfCharacters","totalCharactersUsed","nextPart","currentPart","filterSummary","EveryoneVenue","EveryoneStampCard","suffixModified","both","filtersModal","summaryModal","rruleGenerator","scheduleCampaign","TOC","integrityPolicy","buttonText","navigateHomeText","contactText","mainButton","enterUrl","enterUrlPlaceholder","shortenedUrlPlaceholder","shortenButton","shortenTooltip","copyButton","copyTooltip","urlCopied","buttonName","decline","confirm","comingSoon","comingSoonTranslations","status404","status404Translations","footer","footerTranslations","venueToggle","venueToggleTranslations","urlShortener","urlShortenerTranslations","dialog","dialogTranslations","nothingChanged","edit","reset","noData","welcome","settingsMenu","generalSettings","changeBackground","inputLabel","filterSettings","toggle","numberOfStores","campaigns","newCustomersTooltip","returningCustomers","totalPeriod","totalPeriodTooltip","totalCampaigns","totalRegistrations","total","usernameOrEmail","requiredField","rememberMe","submit","forgotPassword","text1","text2","signBefore","topBar","subHeader","sign","skip","tabTitle","members","totalMembers","totalAdmins","totalAdminsTooltip","unregisteredCustomerLength","unregisterCustomer","example","confirmPopup","allVenues","unregister","generalError","invalidNumber","alreadyUnregistered","unregisteredFromAll","notACustomer","sendSms","subtitleMultiVenue","stampCardSelector","STAMP_CARD_HASH_EXAMPLE","toasts","notAMember","unregistered","verify","newToken","subheader","invalid","required","verifyCodeFail","expiredToken","unexpectedErrorTokenVerify","newPassword","newPasswordText","confirmPasswordText","serverError","invalidToken","invalidPassword","passwordNotSame","minPasswordLength","formatRequirements","successToast","text3","text4","text5","listItem","onslip","zettle","instructions","text6","text7","text8","startIntegrationButton","selectPos","nothingSelected","successfullIntegration","profile","logOut","logOutToast","logOutContractSignUrl","logOutContractToast","cannotBeChanged","confirmText","errors","invalidFirstName","invalidLastName","invalidUsername","invalidEmail","emailNotSame","usernameChangeLogout","countryOfResidency","invalidPhoneNumber","changePassword","current","new","passwordRequirements","passwordUpdateFail","missingPassword","missingCurrentPassword","missingNewPassword","missingConfirmPassword","newPasswordDifferentThanCurrent","willLogOut","currentPassword","countryOfResidence","noVenues","descriptionMultiVenue","descriptionTopText","remainingCharacters","old","smsTooLong","smsTooShort","smsSenderTooShort","invalidCategory","checkStampCardWarningText","upload","venueTitleConflict","noEmojis","integrated","multiple","unknown","eskassa","confirmSaveText","confirmSave","confirmDecline","nothingToShow","view","trigger","home","insights","introductions","integrations","management","memberManagement","merchantSelect","testUser","campaignsDisabled","unauthenticated","prolong","tooltips","selectEndDate","subheader1","subheader2","productListPosName","displayDevices","buttons","expand","selectVenue","selectStampCardType","stampCardTypeList","testMode","expired","return","copy","stats","totalVisits","rewardsEarned","rewardsClaimed","endDate","daysCampaignLasted","daysSinceStart","availability","limited","clickToShow","days","interval","earned","claimed","prolongModalWindow","prolongModalWindowTranslations","website","additionalInformationModal","intervals","extraInfo","campaignExpired","cardWillRestart","heading","campaignNotFound","campaignDisabled","testModelModal","validUntil","campaignEndsIn","noRewards","countText","claim","amountText","codeText","toc","invalidCode","expiredCampaign","successModal","numberOfStampsAndStampCards","refreshStampCardDataTooltip","calculations","explanationBox","increasedRevenueBasedOnSMSCampaign","ul","editingAllowed","editingDisabled","titleMissingMembers","below120","above120","increasedRevenueBasedOnVisits","timespan","yearly","quarterly","Quarterly","Yearly","times","increasedRevenueBasedStampCardCampaign","belowThreshold","aboveThreshold","headerNoSettings","apply","accordionTitle","datepicker","startAfterEnd","maxLength","now","orLabel","lastLabel","unit","months","hours","minutes","switchToTrailingTimeframe","switchToDateRangePicker","forever","periodic","dailyPeriodic","hourlyPeriodic","shortSubText","popover","ChartNames","PayAttWidgetNames","headerTranslations","emptyDashboardText","globalSettings","changeDefault","changeDefaultTooltip","newName","titleTooltip","changeNameButton","dangerZone","deleteDashboardButton","deleteDashboardModal","confirmationText","cannotDeleteDefaultText","addCharts","chartTypes","TimeBasedCharts","NumericCharts","DonutCharts","HistogramCharts","Others","gridItemNames","registrationsOverTime","registrationsOverTimePerVenue","registrationsNewOrReturningOverTime","purchasesOverTime","newStampCardsOverTime","numberOfStampsOverTime","numberOfStampsOverTimePerVenue","numberOfStampsNewOrReturningOverTime","SMSCampaignsTotal","campaignSMSSentTotal","numberOfStampsTotal","stampCardsRewardsClaimedTotal","stampCardsCreatedTotal","averageStampsPerStampCardDonut","numberOfStampsPerStampCardCampaignHistogram","numberOfRegistrationsTotal","numberOfUniqueRegistrationsTotal","sendSMSCampaign","numberOfStampsAndStampCardsSentence","increasedRevenueBasedOnStampCardCampaign","addItem","chartFilters","dashboardFilterTranslations","PayAttWidgets","PayAttWidgetsTranslations","newDashboard","saveSelectButton","newDashboardFromLayout","duplicateDashboard","dashboardNameUpdated","dashboardNameNotUpdated","dashboardUpdated","dashboardNotUpdated","dashboardDeleted","dashboardNotDeleted","dashboardCreated","dashboardNotCreated","dashboardNotFound","dashboardNotLoaded","invalidDashboardName","maximumNumberOfDashboardsReached","cannotDeselectDefault","errorUpdatingDefault","maxNumberOfWidgets","noDashboard","buttonSubtitle","errorToast","browserTabTitle","contactPayAtt","extra","MEMBER_THRESHOLD","intelliSmsIntroductionTranslations","skipToast","homeIntroductionTranslations","dashboardIntroductionTranslations","close","open","linkToWebsite","clickHere","notIntegrated","productName","sections","screens","tip","merchantSettings","scan","buyOrScan","registerNewCustomer","registerExistingCustomer","faqContent","whyPayAtt","question","answer","simplicity","placementOfScreens","campaignImmediatelyAfterInstallation","whoReceivesCampaign","security","storageLocation","viewMembers","customerApproval","usage","recruitNewMembers","choosingCampaign","customerCampaignOverview","smsLimit","integratePOS","mobileApp","formHeader","selectReason","payattemail","sucessToast","bug","feature","limit","helpText","changeLanguage","English","Swedish","sameLanguage","ttl","doneUpdatingSmsSuggestions","failedUpdatingSmsSuggestions","buttonStart","accordions","standbyViewDisabled","infoPopover","createNewCollection","noCollections","lowerCaseSettings","requiredViewsNotImplemented","collectionName","template","switchToResolutionSelectors","switchToDeviceSelector","selectResolution","keepCurrentResolution","resolutionHeaders","PayAtt","desktop","iPhone","iPad","change","imageUrl","adjustBackgroundBrightness","backgroundBrightness","backgroundImage","logo","resolution","renameCollection","duplicateCollection","deleteCollection","successfullyDuplicatedCollection","successfullyRenamedCollection","successfullyDeletedCollection","successfullyUpdatedLogo","successfullyUpdatedBackgroundBrightness","successfullyUpdatedBackgroundImage","successfullyUpdatedBackgroundColor","successfullyUpdatedResolution","successfullyCreatedNewCollection","urlOrUpload","applyColor","p1","p2","p3","triggers","history","STAMP_CARD_FIELDS_MAP","rewardImage1","rewardPosition1","rewardName1","rewardDescription1","rewardIconColor1","rewardImage2","rewardPosition2","rewardName2","rewardDescription2","rewardIconColor2","rewardImage3","rewardPosition3","rewardName3","rewardDescription3","rewardIconColor3","campaignName","paymentProviders","pwaDescription","pwaName","pwaShortName","pwaIcon","oneTime","ongoing","selectProducts","helperText","partOne","partTwo","partThree","table","showSelectedProducts","clearFilters","clearFiltersTooltip","selectAllProducts","selectAllProductsTooltip","groupName","posName","removedProductsWarning","closed","Mon","Tue","Wed","Thu","Fri","Sat","Sun","daysOfWeekLong","from","to","max","add","remove","applyTooltips","noDaysSelected","missingTime","missingStart","missingEnd","socials","endDateRemove","facebook","instagram","linkedin","youtube","cropper","generalColorSettings","stampCardColorSettings","rewardRectangleColorSettings","finish","addAnother","editCurrent","deleteCurrent","rewardSteps","description1","description2","exampleText","nameText","descriptionText","examples","rewardPosition","rewardIconColor","rewardName","rewardDescription","responseToast","noEmojisInSMS","activate","disableTestMode","deactivate","modals","disable","buttonTooltip","descriptionNotActivated","activateCard","activateCardTestMode","disableTest","listItemRewards","aspectRatio","youCanCrop","logoSizeLimitations","stampedAndUnstampedImageSizeLimitations","rewardImageSizeLimitations","pwaIconLimitations","supportedFormats","maxHeight","maxWidth","stampCardStep5Translations","removeIcon","DEFAULT_STAMP_CARD_PWA_DESCRIPTION","stampCardTriggersTranslations","selectCampaign","selectPOS","newButton","returningButton","rewardButton","pendingToast","stampCardFormTranslations","imageInfo","imageInfoTranslations","stampCardSidebarTranslations","stampCardUpdateList","updateStampCardListTranslations","resetModalWindow","resetModalWindowTranslations","submitModalWindow","submitModalWindowTranslations","initialValues","stampCardInitialValuesTranslations","preview","saveDraft","loadDraft","draftSaved","draftLoaded","noDraft","templates","chooseImageOrIcon","pickRewardIcon","pickUnstampedIcon","pickStampedIcon","chooseIcon","uploadImage","optionalText","steps","General","Visuals","Rewards","Stamps","Pwa","stampCardStep1Translations","stampCardStep2Translations","stampCardStep3Translations","stampCardStep4Translations","invalidDate","mixed","notType","custom","uniqueProducts","hex","endDateMustBeAfterStartDate","secondAfterFirst","thirdAfterFirstAndSecond","uniqueRewardTwo","uniqueRewardThree","imageUploadFailed","containsEmoji","pwaRequired","strings","arrays","dates","integratedWithParentheses","cookieConsentTranslations","banner","listItems","essential","analytical","readMore","pwaInstallInstructions","android","hint","dashboardTranslations","builderTranslations","registrationDisplayViewsTranslations","stampCardOverlay","stampCardOverlayTranslations","stampCardForm","stampCardPage","stampCardPageTranslations","cookieConsent","stampCardOverview","stampCardOverviewTranslations","loginTranslations","passwordReset","passwordResetTranslations","contactFormTranslations","faq","contactFAQTranslations","venueSettings","settingsTranslations","profileTranslations","menuTranslations","introduction","introductionPageTranslations","integration","integrationTranslations","intelliSmsSettingTranslations","memberManagementTranslations","sidebarTranslations","homeTranslations","registrationTranslations","intelliSmsTranslations","mainComponentTranslations","tooltipTranslations","notificationTranslations","leavingThePage","portraitViewWarning","noContent","noContentTranslations","errorTranslations","context","editToggle","editToggleTranslations","introductionTranslations","HEX_CHARS","A","B","C","D","E","F","NAMED_COLORS","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","wheat","whitesmoke","yellow","yellowgreen","contrastColor","bgColor","fgDarkColor","fgLightColor","defaultColor","threshold","namedColors","namedBgColor","namedFgDarkColor","namedFgLightColor","namedDefaultColor","p","bgColorArray","String","toUpperCase","slice","acc","curr","n","arr","r","g","h","sleep","resolve","setTimeout","HEX_REGEX","FORM_VALUES","ONE_SMS_MAX_LENGTH","PAYATT_DOMAIN","match","STAMP_CARD_URL_EXAMPLE","STAMP_CARD_URL_EXAMPLE_WITHOUT_PREFIX","stampCardWelcomeSmsExample","welcomeSms","STAMP_CARD_WELCOME_SMS_MAX_LENGTH","removeSmsEnding","STAMP_CARD_REWARD_SMS_MAX_LENGTH","convertToTimeInterval","minute","getTotalMinFromTimeStr","hourMin","hourMinSplit","buildTimeIntervals","startTimes","endTimes","intervalsInMinutes","x","a2","int","currStart","currEnd","newStart","newEnd","str","buildTimeIntervalsFromBackendData","timeIntervalsBackend","start","dayNum","DaysOfWeek","buildBackendTimeIntervals","responseIntervals","intervalItem","sameTimeItem","hasLimitedIntervals","wholeWeek","firstInterval","generateRandomNumber","Math","random","convertRGBAToString","darkenOrLightenColor","percent","rgb2hex","substring","indexOf","R","G","toString","delay","stopPropagation","e","removeTopGapFromMUITextField","getOrientation","orientation","useScreenOrientation","setOrientation","updateOrientation","addEventListener","removeEventListener","enumObject","parseNumberSassVariable","addZeroToDateTime","isValidDate","convertFormLocale","MRT_Localization_SV","MRT_Localization_EN","convertLocale","capitalizeFirstLetter","charAt","dateDifferenceInLocale","localePayAtt","rtf2","Intl","RelativeTimeFormat","dateNow","yearDiff","differenceInYears","format","monthDiff","differenceInMonths","weekDiff","differenceInWeeks","dayDiff","differenceInDays","differenceInHours","differenceInMinutes","differenceInSeconds","getTextWidth","font","document","createElement","getContext","getComputedStyle","measureText","merchantIsIntegrated","trueForPayAttAdmins","generateCombinations","inputArray","result","backtrack","currentIndex","currentCombination","sortedCombination","stampCardCampaignIsActive","camps","ChartsThatRequireStampCardFeature","ChartsThatRequireIntegration","EMPHASIZED_TEXT_FONT_SIZE","useLiveData","formatNumber","number","minimumFractionDigits","toLocaleString","EmphBoxNumeric","num","useTheme","_jsxs","component","padStart","rgba","forceRemoveAlpha","replace","index","string","parseFloat","round","addAlpha","MAX_MONTHS_ALLOWED_FOR_PROLONGING","CHECKMARK_IMAGE_URL","LOGO_PLACEHOLDER_URL","CLOUD_16X9_PLACEHOLDER_URL","CLOUD_4X4_PLACEHOLDER_URL","MAX_CARD_BG_1","MAX_CARD_BG_2","REWARD_ONE_PLACEHOLDER","REWARD_TWO_PLACEHOLDER","ASPECT_RATIO_1X1_LIMITS","LOGO_LIMITS","PWA_LIMITS","ASPECT_RATIO_16X9_LIMITS","englishDays","Mån","Tis","Ons","Tors","Fre","Lör","Sön","StepsEnum","UploadStatus"],"sourceRoot":""}