{"version":3,"file":"247-c9c911ce78f69ecd81f6.js","mappings":"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","sources":["webpack:///./app/javascript/web/components/ImpactiveButton.js","webpack:///./app/javascript/web/components/common/Loading.js","webpack:///./app/javascript/web/hooks/usePaginatedApi.js","webpack:///./app/javascript/web/utils/domPurify.js","webpack:///./app/javascript/web/utils/string.js"],"sourcesContent":["import { LoadingOutlined } from '@ant-design/icons';\nimport { Button } from 'antd';\nimport { bool, func, node, string } from 'prop-types';\nimport React from 'react';\nimport styled, { css } from 'styled-components';\nimport theme from '../styles/theme';\n\nconst ImpactiveButtonInner = styled.button`\n background: ${({ $background }) => $background ?? theme.colors.darkBlue};\n border: none;\n border-radius: 4px;\n cursor: pointer;\n justify-content: center;\n padding: 6px 16px;\n width: ${props => (props.block ? '100%' : '')};\n display: flex;\n align-items: center;\n\n svg {\n margin-right: 10px;\n color: ${theme.colors.white};\n }\n\n ${({ minWidth }) =>\n minWidth &&\n css`\n min-width: ${minWidth};\n `}\n\n ${({ isActivityButton }) =>\n isActivityButton &&\n css`\n width: 122px;\n height: 25px;\n `}\n\n &:active {\n opacity: 0.5;\n text-decoration: none;\n }\n\n @media (hover: hover) {\n &:hover {\n opacity: 0.5;\n text-decoration: none;\n }\n }\n\n ${({ secondary }) =>\n secondary &&\n css`\n border: 1px solid #d9d9d9;\n background: ${theme.colors.white};\n svg {\n color: ${theme.colors.blue};\n }\n `}\n\n ${({ coral }) =>\n coral &&\n css`\n background: ${theme.colors.coral};\n svg {\n color: ${theme.colors.black};\n }\n `}\n\n ${({ teal }) =>\n teal &&\n css`\n background: ${theme.colors.teal};\n svg {\n color: ${theme.colors.black};\n }\n `}\n\n ${({ disabled }) =>\n disabled &&\n css`\n background: ${theme.colors.lightGray};\n cursor: not-allowed;\n border: solid #d9d9d9 1px;\n opacity: 0.5;\n `}\n\n ${({ color }) =>\n color === 'coral' &&\n css`\n background-color: ${theme.colors.coral};\n `}\n\n ${({ size }) =>\n size === 'large' &&\n css`\n font-size: 1.25em;\n height: 35px;\n `}\n\n ${({ size }) =>\n size === 'medium' &&\n css`\n font-size: 1em;\n height: 42px;\n `}\n\n ${({ size }) =>\n size === 'xlarge' &&\n css`\n font-size: 1.4em;\n height: 50px;\n `}\n\n ${({ size }) =>\n size === 'full-width' &&\n css`\n font-size: 16px;\n height: 48px;\n width: 100%;\n `}\n\n ${({ size }) =>\n size === 'large-square' &&\n css`\n font-size: 1em;\n height: 36px;\n width: 36px;\n svg {\n margin-right: 0;\n }\n `}\n`;\n\nconst ButtonText = styled.div`\n color: ${theme.colors.white};\n font-family: ${theme.fonts.regular};\n text-align: center;\n text-transform: capitalize;\n font-weight: 400;\n font-size: 0.875rem;\n line-height: 1.75;\n * &:hover {\n text-decoration: none;\n }\n\n // Remove Safari (<16) issue where it adds button like styles to this component\n &&& {\n -webkit-appearance: none !important;\n }\n\n ${({ size }) =>\n size === 'medium' &&\n css`\n font-family: ${theme.fonts.bold};\n `}\n\n ${({ size }) =>\n size === 'full-width' &&\n css`\n font-size: 16px; // not using rem/em here, because need this to be real 16px on mobile\n font-weight: 700;\n `}\n\n ${({ disabled }) =>\n disabled &&\n css`\n color: ${theme.colors.darkBlue};\n cursor: not-allowed !important;\n `}\n ${({ secondary }) =>\n secondary &&\n css`\n color: ${theme.colors.blue};\n `}\n\n ${({ teal }) =>\n teal &&\n css`\n color: ${theme.colors.black};\n `}\n\n ${({ color }) =>\n color === 'coral' &&\n css`\n color: ${theme.colors.white};\n `}\n`;\n\nconst ImpactiveButton = ({ children, onClick, loading, icon, ...rest }) => {\n return (\n \n {icon}\n \n {loading && }\n {children}\n \n \n );\n};\n\nImpactiveButton.defaultProps = {\n block: false,\n children: null,\n disabled: false,\n icon: null,\n isActivityButton: false,\n loading: false,\n secondary: false,\n size: 'regular',\n};\n\nImpactiveButton.propTypes = {\n block: bool,\n children: node,\n disabled: bool,\n icon: node,\n isActivityButton: bool,\n loading: bool,\n onClick: func,\n secondary: bool,\n size: string,\n};\n\nexport const ImpactiveTextButton = styled(Button)`\n &&& {\n padding: 0;\n margin: 0;\n border: none;\n background: transparent;\n transition: color 0.2s ease-in-out;\n display: flex;\n align-items: center;\n font-size: 14px;\n line-height: 100%;\n height: min-content;\n text-decoration: underline;\n color: ${theme.colors.blackL32};\n svg {\n margin-left: 5px;\n color: ${theme.colors.blackL32};\n }\n &:hover {\n svg {\n color: ${theme.colors.coral};\n }\n background: transparent;\n text-decoration: underline;\n color: ${theme.colors.coral};\n }\n }\n`;\n\nexport default ImpactiveButton;\n","import { LoadingOutlined } from '@ant-design/icons';\nimport { Spin } from 'antd';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { colors } from '../../styles/theme';\n\nconst CenterWrap = styled.div`\n display: flex;\n justify-content: center;\n height: 100vh;\n align-items: center;\n`;\n\n// eslint-disable-next-line\nexport const Spinner = ({ color }) => (\n } />\n);\n\nconst Loading = ({ centered, color }) => {\n return centered ? (\n \n \n \n ) : (\n \n );\n};\n\nLoading.propTypes = {\n centered: PropTypes.bool,\n color: PropTypes.string,\n};\n\nLoading.defaultProps = {\n centered: false,\n color: 'coral',\n};\n\nexport default Loading;\n","import axios from 'axios';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n// TODO: Investigate the `resetPagination` function causing requests looping when it's added to the useEffect dependency\nexport function usePaginatedApi(requestFn, id = null, params = {}, fetchWithInterval) {\n const [items, setItems] = useState([]);\n const [metadata, setMetadata] = useState([]);\n const [page, setPage] = useState(1);\n const [initialLoading, setInitialLoading] = useState(true);\n const [loading, setLoading] = useState(false);\n const [hasMore, setHasMore] = useState(true);\n const [cursor, setCursor] = useState(new Date());\n const [error, setError] = useState(null);\n const [isLiveUpdate, setIsLiveUpdate] = useState(false);\n const [intervalId, setIntervalId] = useState(null);\n\n // Refetching logic after resetting pagination\n const [refetch, setRefetch] = useState(false);\n\n // Axios cancellable pending requests\n const cancelRequestRef = useRef(null);\n\n const cancelPendingRequests = () => {\n if (cancelRequestRef.current) {\n cancelRequestRef.current('Request cancelled.');\n }\n };\n\n // Cancel any pending requests when unmounting\n useEffect(() => {\n return cancelPendingRequests;\n }, []);\n\n // Refetch data when explicitly requested (side effect of resetPagination)\n useEffect(() => {\n if (refetch) {\n loadMore();\n setRefetch(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [refetch]);\n\n const fetchData = callback => {\n // Don't show loading for users when fetch items with interval to simulate live update\n if (isLiveUpdate) {\n setIsLiveUpdate(false);\n } else {\n setLoading(true);\n }\n\n const { CancelToken } = axios;\n const source = CancelToken.source();\n\n cancelRequestRef.current = source.cancel;\n\n // NOTE: cancelationToken needs to be passed to individual request as a config parameter.\n const axiosHeaders = {\n cancelToken: source.token,\n };\n\n const body = { cursor, id, page, ...params };\n requestFn(body, axiosHeaders)\n .then(res => {\n callback(res);\n })\n .catch(error => {\n if (!axios.isCancel(error)) {\n setError(error?.response);\n // this should be added too, but it causes additional re-renders that I'm not willing to debug now.\n // setLoading(false);\n throw new Error(error);\n }\n });\n };\n\n const handleResponse = ({\n data: {\n links,\n data = {},\n meta: { current_page } = {}, // page meta info\n meta,\n ...additionalMetadata\n } = {},\n } = {}) => {\n if (initialLoading) setInitialLoading(false);\n setPage(current_page + 1);\n // MTS - Queued for removal. Temporarily commenting out because we are switching to checking\n // links.next instead of total_pages.\n // setHasMore(current_page < total_pages);\n setHasMore(links && !!links.next);\n // To avoid blank screen we can't just set items to empty array as we do for reset pagination\n // So here we just rewrite existing data instead of merging elements\n setItems(isLiveUpdate ? data : [...items, ...data]);\n setMetadata({\n ...meta,\n ...additionalMetadata,\n });\n setLoading(false);\n };\n\n const loadMore = () => {\n if (!hasMore) {\n setLoading(false);\n return;\n }\n\n fetchData(handleResponse);\n };\n\n const resetPagination = useCallback(({ refetch } = {}) => {\n setItems([]);\n setPage(1);\n setInitialLoading(true);\n setLoading(false);\n setHasMore(true);\n setCursor(new Date());\n\n if (refetch) {\n cancelPendingRequests();\n setRefetch(true);\n }\n }, []);\n\n // To make \"live\" update smooth for users we have avoid loaders and any other blinks\n // This function is similar to \"resetPagination\" function but it don't clean up the items and set isLiveUpdate variable to true\n // To avoid conditions in the resetPagination function I decided to separate these functions\n const resetLiveUpdatePagination = useCallback(() => {\n setPage(1);\n setHasMore(true);\n setCursor(new Date());\n setIsLiveUpdate(true);\n cancelPendingRequests();\n setRefetch(true);\n }, []);\n\n const restartIntervalRefetch = useCallback(\n shouldReset => {\n if (!shouldReset) return;\n clearInterval(intervalId);\n setIntervalId(null);\n },\n [intervalId],\n );\n\n // Use this if you want to emulate live updates\n useEffect(() => {\n if (!fetchWithInterval) return;\n\n if (intervalId === null) {\n const id = setInterval(() => {\n resetLiveUpdatePagination();\n }, 30000);\n setIntervalId(id);\n }\n\n return () => {\n if (intervalId) {\n restartIntervalRefetch(intervalId);\n }\n };\n }, [restartIntervalRefetch, fetchWithInterval, resetLiveUpdatePagination, intervalId]);\n\n // TODO: deprecate array return type - it's easy to skip return value and is error prone\n return [\n hasMore,\n initialLoading,\n items,\n loadMore,\n loading,\n setItems,\n resetPagination,\n metadata,\n cancelPendingRequests,\n error,\n restartIntervalRefetch,\n resetLiveUpdatePagination,\n ];\n}\n\nexport function toObject(paginationArray) {\n const [\n hasMore,\n initialLoading,\n items,\n loadMore,\n loading,\n setItems,\n resetPagination,\n metadata,\n cancelPendingRequests,\n error,\n restartIntervalRefetch,\n resetLiveUpdatePagination,\n ] = paginationArray;\n\n return {\n cancelPendingRequests,\n error,\n hasMore,\n initialLoading,\n items,\n loading,\n loadMore,\n metadata,\n resetLiveUpdatePagination,\n resetPagination,\n restartIntervalRefetch,\n setItems,\n };\n}\n","import * as DOMPurify from 'dompurify';\n\nconst TEMPORARY_ATTRIBUTE = 'data-temp-href-target';\n\nconst dompurify = DOMPurify;\n\ndompurify.addHook('beforeSanitizeAttributes', function (node) {\n if (node.tagName === 'A') {\n if (!node.hasAttribute('target')) {\n node.setAttribute('target', '_self');\n }\n\n if (node.hasAttribute('target')) {\n node.setAttribute(TEMPORARY_ATTRIBUTE, node.getAttribute('target'));\n }\n }\n});\n\ndompurify.addHook('afterSanitizeAttributes', function (node) {\n if (node.tagName === 'A' && node.hasAttribute(TEMPORARY_ATTRIBUTE)) {\n node.setAttribute('target', node.getAttribute(TEMPORARY_ATTRIBUTE));\n node.removeAttribute(TEMPORARY_ATTRIBUTE);\n if (node.getAttribute('target') === '_blank') {\n node.setAttribute('rel', 'noopener');\n }\n }\n});\n\nexport const sanitize = string => dompurify.sanitize(string);\n","import dayjs from 'dayjs';\nimport relativeTime from 'dayjs/plugin/relativeTime';\n\nimport 'dayjs/locale/es';\nimport 'dayjs/locale/ko';\n\n// Using this polyfill until there is a better browser support for URLPattern\n// https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API#browser_compatibility\nimport { URLPattern } from 'urlpattern-polyfill';\nimport { sanitize } from './domPurify';\n\ndayjs.extend(relativeTime);\n\nexport const toLowerWords = text =>\n (text || '')\n .toLowerCase()\n .replace(/[^\\s0-9a-z]/gi, '')\n .split(/\\s+/g)\n .filter(x => x.length > 0);\n\nexport const kFormatter = (num, decimals = 1) => {\n if (!num) return 0;\n\n return Math.abs(num) > 999999\n ? `${Math.sign(num) * (Math.abs(num) / 1000000).toFixed(decimals)}M`\n : Math.abs(num) > 999\n ? `${Math.sign(num) * (Math.abs(num) / 1000).toFixed(decimals)}K`\n : `${Math.sign(num) * Math.abs(num)}`;\n};\n\nexport const toUpperWords = text =>\n (text || '')\n .toUpperCase()\n .replace(/[^\\s0-9a-z]/gi, '')\n .split(/\\s+/g)\n .filter(x => x.length > 0);\n\nexport const tokenMatch = (h, n) => {\n const needles = toLowerWords(n);\n const haystack = toLowerWords(h);\n\n outer: for (const needle of needles) {\n for (let i = 0, l = haystack.length; i < l; i += 1) {\n if (haystack[i].indexOf(needle) >= 0) {\n haystack.splice(i, 1);\n continue outer;\n }\n }\n return false;\n }\n return true;\n};\n\nexport const localizedDateTime = (dateString, format) => {\n const locale = window.localStorage.getItem('locale');\n return dayjs(dateString)\n .locale(locale ?? 'en')\n .format(format ?? 'MM/DD/YYYY hh:mm A');\n};\n\nexport const dateToAge = dateString => {\n if (!dateString) return '';\n\n return dayjs(dateString).fromNow();\n};\n\nexport const truncate = (s, l, ellipsis = '...') => {\n if (!s) {\n return s;\n }\n if (s.length > l) {\n return `${s.substring(0, l).trim()}${ellipsis}`;\n }\n return s;\n};\n\nexport const noBreaks = t => {\n return t.replace(/(\\r\\n|\\n|\\r)/gm, ' ');\n};\n\nexport const roundTo = (number, places = 0) => {\n const multiplier = 10 ** places;\n return Math.round(number * multiplier) / multiplier;\n};\n\nexport const insertInto = (s, insert, p) => {\n if (s.length < p) return s;\n return `${s.slice(0, p)}${insert}${s.slice(p)}`;\n};\n\n// normalize, format, validate\nexport const normalizePhone = phone => {\n return phone.match(/\\+\\d+/) ? phone : `+1${phone}`;\n};\n\nexport const fmtScore = score => {\n if (score < 1000) return score;\n\n const formatted = score / 1000;\n if (formatted < 100) return `${roundTo(formatted, 1)}K`;\n return `${roundTo(formatted, 0)}K`;\n};\n\nexport const fmtNumber = n => {\n return n.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n};\n\nexport const fmtDollars = d => {\n if (Number.isInteger(d)) return d;\n return d.toFixed(2);\n};\n\nexport const allNumeric = s => {\n // are chars are numeric?\n if (!s) return false;\n return !s.match(/\\D/);\n};\n\nexport const isValidEmail = email => {\n if (!email) {\n return false;\n }\n var re =\n /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n return re.test(String(email).toLowerCase());\n};\n\nexport const isValidPhone = phone => {\n return phone.match(/^\\d{10}$/);\n};\n\n// Turn url into a puny decoded url to prevent homograph attacks\nexport const punyEncodedURL = url => {\n try {\n const { protocol, hostname, pathname } = new URLPattern(url);\n return `${protocol}://${hostname}${pathname}`;\n } catch (e) {\n // parsing failed - show regular url even though it's probably empty or invalid\n return url;\n }\n};\n\nexport const parseUrl = url => {\n if (!url) return null;\n\n // Some older clients have a `website_url` that starts with \"www\"\n // In this case we need to add the protocol because otherwise the link goes to \"{impactive_domain}/${url}\"\n // We already have validation for this on the admin side, but we need to take care of the old client\n if (isURLStartingWithWWW(url)) {\n url = `https://${url}`;\n }\n\n if (isCorrectUrl(url)) {\n return url;\n }\n\n return null;\n};\n\nconst isURLStartingWithWWW = url => {\n const pattern = /^www\\.[a-zA-Z0-9-]/;\n return pattern.test(url);\n};\n\nconst isCorrectUrl = url => {\n const urlRegex =\n /^(http:\\/\\/www\\.|https:\\/\\/www\\.|http:\\/\\/|https:\\/\\/)[a-z0-9]+([-.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$/;\n\n return urlRegex.test(url);\n};\n\n// Convert links to clickable in text\nexport const convertLinks = description => {\n if (!description) return '';\n\n const regular =\n /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/g;\n return sanitize(\n description.replaceAll(\n regular,\n link => `${link}`,\n ),\n );\n};\n\nexport const replaceDefaultCampaignImage = url =>\n [\n 'https://assets.impactive.io/default_profile_img.png',\n 'https://assets.outvote.io/default_profile_img.png',\n ].includes(url)\n ? undefined\n : url;\n\nexport const onlyNumbers = s => s?.replace(/\\D/g, '');\n\nexport const capitalize = str => {\n if (!str) return '';\n\n const cap = s => `${s[0].toUpperCase()}${s.slice(1).toLowerCase()}`;\n\n return str.split(' ').map(cap).join(' ');\n};\n"],"names":["ImpactiveButtonInner","styled","button","withConfig","displayName","componentId","_ref","$background","theme","darkBlue","props","block","white","_ref2","minWidth","css","_ref3","isActivityButton","_ref4","secondary","blue","_ref5","coral","black","_ref6","teal","_ref7","disabled","lightGray","_ref8","color","_ref9","size","_ref10","_ref11","_ref12","_ref13","ButtonText","div","regular","_ref14","bold","_ref15","_ref16","_ref17","_ref18","_ref19","ImpactiveButton","_ref20","children","onClick","loading","icon","rest","_objectWithoutProperties","_excluded","React","Object","assign","LoadingOutlined","spin","className","defaultProps","ImpactiveTextButton","_Button","blackL32","CenterWrap","Spinner","_Spin","indicator","style","colors","fontSize","Loading","centered","usePaginatedApi","requestFn","id","arguments","length","undefined","params","fetchWithInterval","_useState2","_slicedToArray","useState","items","setItems","_useState4","metadata","setMetadata","_useState6","page","setPage","_useState8","initialLoading","setInitialLoading","_useState10","setLoading","_useState12","hasMore","setHasMore","_useState14","Date","cursor","setCursor","_useState16","error","setError","_useState18","isLiveUpdate","setIsLiveUpdate","_useState20","intervalId","setIntervalId","_useState22","refetch","setRefetch","cancelRequestRef","useRef","cancelPendingRequests","current","useEffect","loadMore","handleResponse","_ref$data","data","_ref$data2","links","_ref$data2$data","_ref$data2$meta","meta","current_page","additionalMetadata","next","concat","_toConsumableArray","_objectSpread","callback","source","axios","cancel","axiosHeaders","cancelToken","token","body","then","res","catch","response","Error","fetchData","resetPagination","useCallback","resetLiveUpdatePagination","restartIntervalRefetch","shouldReset","clearInterval","setInterval","toObject","paginationArray","_paginationArray","TEMPORARY_ATTRIBUTE","dompurify","DOMPurify","addHook","node","tagName","hasAttribute","setAttribute","getAttribute","removeAttribute","dayjs","relativeTime","kFormatter","num","decimals","Math","abs","sign","toFixed","localizedDateTime","dateString","format","locale","window","localStorage","getItem","dateToAge","fromNow","truncate","s","l","ellipsis","substring","trim","roundTo","number","places","multiplier","pow","round","fmtScore","score","formatted","fmtNumber","n","toString","replace","isValidEmail","email","test","String","toLowerCase","punyEncodedURL","url","_URLPattern","URLPattern","protocol","hostname","pathname","e","parseUrl","isURLStartingWithWWW","isCorrectUrl","convertLinks","description","string","replaceAll","link","sanitize","replaceDefaultCampaignImage","includes","capitalize","str","split","map","toUpperCase","slice","join"],"sourceRoot":""}