{"version":3,"file":"329-c0c37a6c8df98457283f.js","mappings":"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","sources":["webpack:///./app/javascript/admin/hooks/useLocalStorage.js","webpack:///./app/javascript/admin/utils/formatPhoneNumber.js","webpack:///./app/javascript/types.js","webpack:///./app/javascript/web/components/i18n.js","webpack:///./app/javascript/web/services/session.js","webpack:///./app/javascript/web/styles/theme.js","webpack:///./app/javascript/web/utils/other.js"],"sourcesContent":["// MTS - This can be moved to a root level hooks directory if it is used in other places\n// This hook was taken from: https://usehooks.com/useLocalStorage/\n\n// eslint-disable-next-line\nimport React, { useState } from 'react';\n\nfunction useLocalStorage(key, initialValue) {\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState(() => {\n try {\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n console.log(error);\n return initialValue;\n }\n });\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue = value => {\n try {\n // Allow value to be a function so we have same API as useState\n const valueToStore = value instanceof Function ? value(storedValue) : value;\n // Save state\n setStoredValue(valueToStore);\n // Save to local storage\n window.localStorage.setItem(key, JSON.stringify(valueToStore));\n } catch (error) {\n // A more advanced implementation would handle the error case\n console.log(error);\n }\n };\n\n return [storedValue, setValue];\n}\n\nexport default useLocalStorage;\n","export const formatPhoneNumber = (phoneNumber, withCountryCode = false) => {\n if (!phoneNumber) return '';\n\n // Remove all non-digit characters\n const cleaned = `${phoneNumber}`.replace(/\\D/g, '');\n\n // Check if the number starts with '1' and has 11 digits\n const hasCountryCode = cleaned.length === 11 && cleaned.startsWith('1');\n\n // Remove the leading '1' if it exists\n const normalized = hasCountryCode ? cleaned.slice(1) : cleaned;\n\n // Match the normalized number to the pattern\n const match = normalized.match(/^(\\d{3})(\\d{3})(\\d{4})$/);\n\n if (match) {\n // add \\u00A0 to prevent line breaks\n const formattedNumber = `(${match[1]})\\u00A0${match[2]}-${match[3]}`;\n return withCountryCode ? `+1\\u00A0${formattedNumber}` : formattedNumber;\n }\n\n return phoneNumber;\n};\n","import { array, shape, number, string, bool, any, arrayOf } from 'prop-types';\n\n/* commonly used data objects, listed alphabetically */\n\nconst ImpactiveTypes = {\n campaign: shape({\n active: bool,\n approved: bool,\n custom_fields: array,\n has_active_subscription: bool,\n id: number.isRequired,\n slug: string,\n settings: shape({\n is_biden_national: bool,\n }),\n tags: array,\n }),\n\n // TODO: add all needed types\n activity: shape({\n id: number.isRequired,\n type: string,\n }),\n\n messageThread: shape({\n id: number,\n body: string,\n kind: string,\n created_at: string,\n from_me: bool,\n receiver: shape({}),\n receiver_raw: any,\n receiver_type: string,\n sender: shape({}),\n sender_raw: any,\n sender_type: string,\n type: string,\n unread: bool,\n user_activity: shape({}),\n latest_message_body: string,\n latest_message_at: string,\n users: arrayOf(shape({})),\n contact: any,\n }),\n};\n\nexport default ImpactiveTypes;\n","import i18n from 'i18next';\nimport moment from 'moment';\nimport { initReactI18next } from 'react-i18next';\nimport translationEN from '../../../assets/locales/en/translation.json';\nimport translationES from '../../../assets/locales/es/translation.json';\nimport translationKO from '../../../assets/locales/ko/translation.json';\nimport { getSessionLocale, setSessionLocale } from '../services/session';\n\n// TODO: load resources via XHR to save on bundle size (see: i18next-xhr-backend)\nconst resources = {\n en: {\n translation: translationEN,\n },\n es: {\n translation: translationES,\n },\n ko: {\n translation: translationKO,\n },\n};\n\ni18n.use(initReactI18next).init({\n debug: false,\n fallbackLng: 'en',\n interpolation: {\n escapeValue: false, // not needed for react as it escapes by default\n },\n lng: getSessionLocale() || 'en',\n react: {\n useSuspense: false, // we might need it when we load translation files via XHR\n },\n resources,\n});\n\n// Also recall moment locale if any was stored\nmoment.locale(getSessionLocale() || 'en');\n\n// Function sets application-wide language and persists in in session\nexport const setAppLanguage = (locale, temporary = false) => {\n i18n.changeLanguage(locale); // Make current instance of i18n use selected locale\n if (!temporary) {\n setSessionLocale(locale); // Save selected locale in session storage for next sessions\n moment.locale(locale); // Make moment use selected locale\n }\n};\n\nexport default i18n;\n","import axios from 'axios';\n\nconst AUTH_TOKEN = '_outvote_web__token';\n\nconst setAxiosHeaders = ({ token }) => {\n axios.defaults.headers.common.Authorization = token;\n axios.defaults.headers.common['Content-Type'] = 'application/json';\n axios.defaults.headers.common.Accept = 'application/json';\n axios.defaults.headers.post['Content-Type'] = 'application/json';\n axios.defaults.headers.post.accept = 'application/json';\n};\n\nfunction storeToken(token) {\n localStorage.setItem(AUTH_TOKEN, token);\n setAxiosHeaders({ token });\n}\n\nfunction removeToken() {\n localStorage.removeItem(AUTH_TOKEN);\n delete axios.defaults.headers.common.Authorization;\n}\n\nfunction getToken() {\n return localStorage.getItem(AUTH_TOKEN);\n}\n\n// TODO: Make this work with current setup\nfunction maybeGetToken() {\n // Get the existing token from local storage if there is one\n const token = getToken();\n setAxiosHeaders({ token });\n return token;\n}\n\nfunction isAuthenticated() {\n return !!getToken();\n}\n\n// locale is used to persist user's locale settings across different sessions\nfunction setSessionLocale(locale) {\n localStorage.setItem('locale', locale);\n}\n\nfunction getSessionLocale() {\n return localStorage.getItem('locale');\n}\n\nfunction setRedirectAfterLoginURL(url) {\n localStorage.setItem('redirectAfterLogin', url);\n}\n\nfunction getRedirectAfterLoginURL() {\n return localStorage.getItem('redirectAfterLogin');\n}\n\nfunction getAndClearRedirectAfterLoginURL() {\n const url = localStorage.getItem('redirectAfterLogin');\n localStorage.removeItem('redirectAfterLogin');\n\n return url;\n}\n\nexport {\n getToken,\n isAuthenticated,\n maybeGetToken,\n storeToken,\n removeToken,\n // Locale exports\n setSessionLocale,\n getSessionLocale,\n // redirect utils\n setRedirectAfterLoginURL,\n getRedirectAfterLoginURL,\n getAndClearRedirectAfterLoginURL,\n};\n","// MTS - Disabling eslint on this file because we do not need alphabetizing\n/* eslint-disable */\nexport const sizes = {\n s: '375px',\n md: '600px',\n lg: '900px',\n xl: '1024px',\n xxl: '1200px',\n xxxl: '1440px',\n};\n\n// Reusable media queries for Styled Components\nexport const media = {\n // small\n s: `@media screen and (max-width: ${sizes.s})`,\n // not small\n sm: `@media screen and (max-width: ${sizes.md})`,\n // not small\n ns: `@media screen and (min-width: ${sizes.md})`,\n // medium\n md: `@media screen and (min-width: ${sizes.md}) and (max-width: ${sizes.lg})`,\n // large\n lg: `@media screen and (min-width: ${sizes.lg})`,\n // not large\n nlg: `@media screen and (max-width: ${sizes.lg})`,\n // extra large\n xl: `@media screen and (min-width: ${sizes.xl})`,\n // not extra large\n nxl: `@media screen and (max-width: ${sizes.xl})`,\n // xxlarge\n xxl: `@media screen and (min-width: ${sizes.xxl})`,\n // xxxlarge\n xxxl: `@media screen and (min-width: ${sizes.xxxl})`,\n};\n\nexport const colors = {\n background: 'white',\n black: '#2d343c',\n boxShadow: 'rgba(128, 126, 121, 0.12)',\n deepBlue: '#05133F',\n darkBlack: '#102542',\n lightBlack: '#353c45',\n red: '#e44852',\n white: 'white',\n transparent: 'transparent',\n trueBlack: '#000',\n alabaster: '#FCFCFC',\n trueWhite: '#ffffff',\n yellow: '#FF8C05',\n\n // Impactive\n blue: '#23293E',\n newBlue: '#90B9F6',\n teal: '#6ccbda',\n darkTeal: '#55AEBB',\n coral: '#f3786c',\n link: '#f3786c',\n darkBlue: '#23293E',\n borderGray: '#EDEDED',\n lightGray: '#FAFAFA',\n activityBackground: '#FAFAFA',\n messageBackground: '#C2DEE2',\n whiteSmoke: '#F4F4F4',\n whiteSmokeLighter: '#F8F8F8',\n lightCyan: '#e0f8fa',\n // grays\n mediumLightGray: '#DCDCDC',\n mediumGray: '#A1A1A1',\n darkGray: '#979797',\n gray: '#71717D',\n dimGray: '#666666',\n dimGray2: '#717171',\n dimGray3: '#c2c4ca',\n darksLateGray: '#272727',\n green: '#84BE77',\n cyan: '#96D1DC',\n dodgerBlue: '#40a9ff',\n blackL32: '#525252',\n\n // New design default colors\n blackL25: '#252525',\n salmon: '#ff786a',\n lightBlue: '#f0f9fb',\n\n /**\n * Don't add to this without adding to our design library\n */\n // NEW PALETTE\n\n // BLUE\n blue: '#23293f',\n blue60: '#7b7f8b',\n blue30: '#bdbfc5',\n blue16: '#dcdde0',\n blue06: '#f2f2f3',\n\n // CORAL\n\n coral: '#F3786C',\n coral60: '#f8aea7',\n coral40: '#fac9c4',\n coral20: '#fde4e2',\n coral10: '#fef1f0',\n\n // TEAL\n\n teal: '#6CCBDA',\n teal60: '#a7e0e9',\n teal40: '#c4eaf0',\n teal20: '#e2f5f8',\n teal10: '#f0fafb',\n\n // BLACK\n\n black: '#222222',\n blackL32: '#525252',\n blackL42: '#707070',\n blackL72: '#B7B7B7',\n\n // GRAY\n\n gray: '#d9d9d9',\n whiteSmoke: '#F5F6F7',\n snow: '#fafafa',\n};\n\n// Make sure you update app/javascript/admin/styles/theme.js formDefaultColors when editing these colors\nexport const formDefaultColors = {\n pageBackgroundColor: '#FCFCFC',\n sectionBackgroundColor: '#FCFCFC',\n buttonColor: '#23293e',\n fontColor: '#222222',\n buttonFontColor: '#ffffff',\n fieldOutlineColor: '#d9d9d9',\n fieldBackgroundColor: '#fcfcfc',\n fieldFontColor: '#222222',\n placeHolderColor: '#B7B7B7',\n};\n\nexport const vrDefaultColors = {\n progressBarColor: '#F3786C',\n buttonColor: '#23293E',\n backgroundColor: '#ffffff',\n fontColor: '#23293E',\n fieldOutlineColor: '#d9d9d9',\n registeredColor: '#52C41A',\n unRegisteredColor: '#F5222D',\n};\n\nexport const fonts = {\n black: 'BasicSans-Black',\n blackItalic: 'BasicSans-BlackItalic',\n bold: 'BasicSans-Bold',\n boldItalic: 'BasicSans-BoldItalic',\n italic: 'BasicSans-Italic',\n light: 'BasicSans-Light',\n regular: 'BasicSans-Regular',\n semibold: 'BasicSans-SemiBold',\n semibolditalic: 'BasicSans-SemiboldItalic',\n AccelerateChange: 'Manrope', // this will be used only in a few pages, and has correctly imported font weights, thats why there is only one\n};\n\nexport default {\n colors,\n fonts,\n formDefaultColors,\n};\n","import _ from 'lodash';\nimport i18n from '../components/i18n';\n\nexport const authFromResponse = (data, headers) => {\n const { authorization } = headers;\n return { ...data, authorization };\n};\n\nexport const interpolateMessage = (message, contact, user, campaign = {}) => {\n let text = message;\n if (!text) {\n return text;\n }\n\n if (user) {\n text = text.replace(\n '{{user.first_name}}',\n _.capitalize(user.first_name) || campaign.fallback_user_first_name,\n );\n\n text = text.replace('{{user.last_name}}', _.capitalize(user.last_name));\n const fullName = _.trim(\n `${_.capitalize(user.first_name) || campaign.fallback_user_first_name} ${_.capitalize(\n user.last_name,\n )}`,\n );\n text = text.replace('{{user.fullname}}', fullName);\n text = text.replace('{{user.full_name}}', fullName);\n text = text.replace('{{user.email}}', user.email);\n text = text.replace('{{user.phone}}', user.phone);\n }\n\n if (contact) {\n text = text.replace(\n '{{contact.first_name}}',\n _.capitalize(contact.first_name) || campaign.fallback_contact_first_name,\n );\n\n text = text.replace('{{contact.last_name}}', _.capitalize(contact.last_name));\n const fullName = _.trim(\n `${_.capitalize(contact.first_name) || campaign.fallback_contact_first_name} ${_.capitalize(\n contact.last_name,\n )}`,\n );\n text = text.replace('{{contact.fullname}}', fullName);\n text = text.replace('{{contact.full_name}}', fullName);\n text = text.replace('{{contact.email}}', contact.email);\n text = text.replace('{{contact.phone}}', contact.phone);\n\n text = text.replace(\n '{{first_name}}',\n _.capitalize(contact.first_name) || campaign.fallback_contact_first_name,\n );\n\n text = text.replace('{{last_name}}', _.capitalize(contact.last_name));\n text = text.replace('{{fullname}}', fullName);\n text = text.replace('{{full_name}}', fullName);\n text = text.replace('{{email}}', contact.email);\n text = text.replace('{{phone}}', contact.phone);\n\n if (contact.customizations) {\n contact.customizations.forEach(customization => {\n if (\n customization?.['custom_field'] != null &&\n text.match(`{{${customization?.['custom_field']?.['slug']}}}`)\n ) {\n text = text.replace(\n `{{${customization['custom_field']['slug']}}}`,\n customization['value'] || customization['custom_field']['fallback_value'],\n );\n }\n });\n }\n\n if (contact.custom_fields) {\n contact.custom_fields.forEach(custom_field => {\n if (custom_field != null && text.match(`{{${custom_field?.['slug']}}}`)) {\n text = text.replace(\n `{{${custom_field['slug']}}}`,\n custom_field['value'] || custom_field['fallback_value'],\n );\n }\n });\n }\n }\n\n const safeVariables = [\n 'ga_absentee_ballot_link',\n 'ga_registration_link',\n 'outvote_volunteer_link',\n ];\n const safeRegexString = safeVariables.map(v => `{{${v}}}`).join('|');\n\n const recognizedRegex = `(?!${safeRegexString})`;\n const unrecognizedRegex = '{{[\\\\w.]*}}';\n\n let unrecognized_variables = new RegExp(`${recognizedRegex}${unrecognizedRegex}`, 'g');\n text = text.replace(unrecognized_variables, '');\n\n return text;\n};\n\nexport const getButtonText = (type, completed) => {\n if (completed) {\n return (\n {\n donate_activities: i18n.t('button.donate_again'),\n news_activities: i18n.t('button.read_more'),\n share_activities: i18n.t('button.share_again'),\n text_a_friend_activities: i18n.t('button.email_again'),\n text_a_list_activities: i18n.t('button.text_again'),\n web_activites: i18n.t('button.view_again'),\n }[type] || i18n.t('button.start_again')\n );\n }\n\n return (\n {\n donate_activities: i18n.t('button.donate'),\n news_activities: i18n.t('button.read_more'),\n share_activities: i18n.t('button.share'),\n text_a_friend_activities: i18n.t('button.start'),\n text_a_list_activities: i18n.t('button.start'),\n web_activites: i18n.t('button.go'),\n }[type] || i18n.t('button.start')\n );\n};\n\n/**\n * DK - 26/02/2020 - This might no longer be needed for this specific purpose,\n * but leaving it here in case we decide this is how we want to translate\n * hardcoded 'button_text' attribute of an activity.\n */\nexport const mobileButtonTextToWeb = text => {\n switch (text) {\n // comes hardcoded from database as 'button_text' attribute of an activity\n // case 'Start Texting':\n // return i18n.t('button.start_emailing');\n\n default:\n return text;\n }\n};\n\nexport const verbByType = type => {\n return (\n {\n donate_activities: i18n.t('verbs.donated_to'),\n news_activities: i18n.t('verbs.shared_news_for'),\n share_activities: i18n.t('verbs.shared_for'),\n text_a_friend_activities: i18n.t('verbs.emailed_friends_for'),\n text_a_list_activities: i18n.t('verbs.texted_for'),\n }[type] || i18n.t('verbs.helped')\n );\n};\n\nexport const sortByDisplayOrderFn = (a, b) => {\n if (!a || !b) return 1;\n if (a.display_order === null && b.display_order === null) return -1;\n if (a.display_order === null && b.display_order !== null) return 1;\n if (a.display_order !== null && b.display_order === null) return -1;\n return a.display_order > b.display_order ? 1 : -1;\n};\n\n// In this function, we replace all English onboarding fields with localized ones if they are not equal to null.\nexport const getLocalizedOnboardingData = campaign => {\n if (campaign.localization) {\n for (let i in campaign.localization) {\n if (campaign.localization[i]) {\n campaign[i] = campaign.localization[i];\n }\n }\n }\n\n return campaign;\n};\n\n// Determine if a color is dark or light, we use this to determine the text color of the submit button\n// https://stackoverflow.com/questions/596216/formula-to-determine-perceived-brightness-of-rgb-color/596241#596241\nexport const isDark = color => {\n if (!color) return false;\n const c = color.substring(1); // strip #\n const rgb = parseInt(c, 16); // convert rrggbb to decimal\n const r = (rgb >> 16) & 0xff; // extract red\n const g = (rgb >> 8) & 0xff; // extract green\n const b = (rgb >> 0) & 0xff; // extract blue\n\n return r * 0.299 + g * 0.587 + b * 0.114 < 186;\n};\n\nexport const statFormatted = value => {\n if (!value || value < 0) return 0;\n if (value) return Math.round(Number(value)).toLocaleString();\n};\n\nexport const isAuthFinished = user => {\n const auth = user || {};\n const {\n first_name: first_name_auth,\n last_name: last_name_auth,\n phone: phone_auth,\n last_campaign_id: campaign_id_auth,\n supplied_zip_code: zip_auth,\n } = auth;\n\n const isAuthFinished = !!(\n first_name_auth &&\n last_name_auth &&\n phone_auth &&\n campaign_id_auth &&\n zip_auth\n );\n\n return isAuthFinished;\n};\n\nexport const isShowCampaignOnboarding = campaign => {\n const onboardingCampaign = campaign || {};\n\n const { instructions_text: description, instructions_video_url: url } = onboardingCampaign;\n\n const isShowCampaignOnboarding = !!(description || url);\n\n return isShowCampaignOnboarding;\n};\n"],"names":["key","initialValue","_useState2","_slicedToArray","useState","item","window","localStorage","getItem","JSON","parse","error","console","log","storedValue","setStoredValue","value","valueToStore","Function","setItem","stringify","formatPhoneNumber","phoneNumber","withCountryCode","arguments","length","undefined","cleaned","concat","replace","match","startsWith","slice","formattedNumber","shape","active","bool","approved","custom_fields","array","has_active_subscription","id","number","isRequired","slug","string","settings","is_biden_national","tags","type","body","kind","created_at","from_me","receiver","receiver_raw","any","receiver_type","sender","sender_raw","sender_type","unread","user_activity","latest_message_body","latest_message_at","users","arrayOf","contact","resources","en","translation","translationEN","es","translationES","ko","translationKO","i18n","initReactI18next","init","debug","fallbackLng","interpolation","escapeValue","lng","getSessionLocale","react","useSuspense","moment","setAppLanguage","locale","temporary","setSessionLocale","AUTH_TOKEN","setAxiosHeaders","_ref","token","axios","headers","common","Authorization","Accept","post","accept","storeToken","removeToken","removeItem","getToken","maybeGetToken","getRedirectAfterLoginURL","getAndClearRedirectAfterLoginURL","url","sizes","s","md","lg","xl","xxl","xxxl","media","sm","ns","nlg","nxl","colors","_defineProperty","_colors","background","black","boxShadow","deepBlue","darkBlack","lightBlack","red","white","transparent","trueBlack","alabaster","trueWhite","yellow","blue","newBlue","teal","darkTeal","coral","link","darkBlue","borderGray","lightGray","activityBackground","messageBackground","whiteSmoke","whiteSmokeLighter","lightCyan","mediumLightGray","mediumGray","darkGray","gray","dimGray","dimGray2","dimGray3","darksLateGray","green","cyan","dodgerBlue","blackL32","blackL25","salmon","lightBlue","vrDefaultColors","progressBarColor","buttonColor","backgroundColor","fontColor","fieldOutlineColor","registeredColor","unRegisteredColor","fonts","blackItalic","bold","boldItalic","italic","light","regular","semibold","semibolditalic","AccelerateChange","formDefaultColors","pageBackgroundColor","sectionBackgroundColor","buttonFontColor","fieldBackgroundColor","fieldFontColor","placeHolderColor","interpolateMessage","message","user","campaign","text","_","first_name","fallback_user_first_name","last_name","fullName","email","phone","fallback_contact_first_name","customizations","forEach","customization","_customization$custom","custom_field","safeRegexString","map","v","join","recognizedRegex","unrecognized_variables","RegExp","getButtonText","completed","donate_activities","t","news_activities","share_activities","text_a_friend_activities","text_a_list_activities","web_activites","mobileButtonTextToWeb","verbByType","sortByDisplayOrderFn","a","b","display_order","getLocalizedOnboardingData","localization","i","isDark","color","c","substring","rgb","parseInt","statFormatted","Math","round","Number","toLocaleString","isAuthFinished","auth","first_name_auth","last_name_auth","phone_auth","campaign_id_auth","last_campaign_id","zip_auth","supplied_zip_code","isShowCampaignOnboarding","onboardingCampaign","description","instructions_text","instructions_video_url"],"sourceRoot":""}