{"version":3,"sources":["components/Header/index.tsx","styles/global.ts","services/userApi.ts","hooks/auth.tsx","hooks/i18n.tsx","styles/theme/buzzmonitor.ts","utils/formatQuery.ts","hooks/search.tsx","hooks/index.tsx","utils/countOperators.ts","components/SearchForm/Input/index.tsx","components/SearchForm/MultipleSelect/index.tsx","components/Modals/ActiveCampaign/index.tsx","components/SearchForm/RangeDatePicker/styles.ts","components/SearchForm/RangeDatePicker/index.tsx","components/SearchForm/Select/index.tsx","components/SearchForm/styles.ts","components/SearchForm/index.tsx","services/twitterApi.ts","components/Widgets/Twitter/styles.ts","components/Widgets/Twitter/index.tsx","components/Widgets/Google/styles.ts","components/Widgets/Google/index.tsx","utils/formatXMLtoJSON.js","utils/emailUtils.ts","components/Widgets/Twitter/ExportTrendsModal.tsx","pages/Home/styles.ts","pages/Home/index.tsx","utils/formatParamsToObj.ts","components/SectionTitle/index.tsx","components/ResultsHeader/styles.ts","components/ResultsHeader/AddTermButton/styles.ts","components/ResultsHeader/AddTermButton/index.tsx","components/ResultsHeader/TermCard/styles.ts","components/ResultsHeader/TermCard/index.tsx","components/ResultsHeader/index.tsx","services/elasticsearchApi.ts","components/ChartContainers/TermsEvolutionContainer/TermEvolutionWrapper/EvolutionChart/index.tsx","components/ChartContainers/TermsEvolutionContainer/TermEvolutionWrapper/styles.ts","components/ChartContainers/TermsEvolutionContainer/TermEvolutionWrapper/index.tsx","components/ChartContainers/TermsEvolutionContainer/styles.ts","components/ChartContainers/TermsEvolutionContainer/TotalBuzzChart/index.tsx","components/ChartContainers/TermsEvolutionContainer/index.tsx","hooks/defaultChartsContainer.ts","components/ChartContainers/SharingByNetworkContainer/styles.ts","components/ChartContainers/SharingByNetworkContainer/SharingByNetworkChart/index.tsx","components/ChartContainers/SharingByNetworkContainer/index.tsx","components/ChartContainers/SentimentContainer/styles.ts","components/ChartContainers/SentimentContainer/SentimentChart/index.tsx","components/ChartContainers/SentimentContainer/index.tsx","components/ChartContainers/GenderContainer/GenderChart/index.tsx","components/ChartContainers/GenderContainer/styles.ts","components/ChartContainers/GenderContainer/index.tsx","utils/formatStringDate.ts","components/Modals/Download/index.tsx","components/Modals/Import/index.tsx","hooks/postsContainer.ts","components/TopPosts/Facebook/styles.ts","components/Post/style.ts","components/Post/index.tsx","components/TopPosts/PostContainer/styles.ts","components/TopPosts/PostContainer/index.tsx","components/TopPosts/Facebook/index.tsx","components/TopPosts/Instagram/styles.ts","components/TopPosts/Instagram/index.tsx","components/TopPosts/Twitter/styles.ts","components/TopPosts/Twitter/index.tsx","components/InfluencersWidget/styles.ts","services/influencersApi.ts","components/InfluencersWidget/PostContainer/styles.ts","components/SocialIcon/index.tsx","components/InfluencersWidget/PostContainer/Post/styles.ts","components/InfluencersWidget/PostContainer/Post/index.tsx","utils/formatNumber.ts","hooks/cldrTranslator.ts","components/InfluencersWidget/PostContainer/index.tsx","components/InfluencersWidget/index.tsx","pages/Results/styles.ts","pages/Results/index.tsx","routes.tsx","App.tsx","index.tsx","assets/images/broken-link.png","assets/images/lBlack.png","assets/images/bm-logo.png","assets/images/trends-logo.png","assets/images/fb-logo.png","assets/images/insta-logo.png","assets/images/tami.png"],"names":["Container","styled","header","Header","href","src","BuzzmonitorLogo","alt","createGlobalStyle","userApi","axios","create","baseURL","process","AuthContext","createContext","AuthProvider","children","useState","user","localStorage","getItem","tokenData","JSON","parse","token","expire_date","isPast","parseISO","removeItem","consumer_type","data","setData","authorizeUser","useCallback","a","Cookies","get","headers","then","res","setItem","stringify","addDays","Date","toISOString","catch","Provider","value","useAuth","context","useContext","Error","I18nProvider","language","useMemo","toString","messages","ptBRTranslation","ptPTTranslation","enTranslation","esTranslation","locale","buzzmonitorTheme","colors","primary","secondary","tertiary","primaryLight","primaryDark","primaryDarker","secondaryLight","secondaryDark","secondaryDarker","tertiaryLight","tertiaryDark","black","grey","lighgrey","success","error","background","size","borderRadius","booleanOperators","formatInfluencersQuery","obligatory","optional","banned","boolean","match","booleanSplitted","trim","replace","split","filter","term","map","includes","join","obligatoryQuery","optionalString","bannedQuery","optionalQuery","formatQuery","initialParams","languages","date","type","start","format","subDays","end","SearchContext","SearchProvider","history","useHistory","params","setParams","searchedTerms","setSearchedTerms","booleanMode","setBooleanMode","preview","setPreview","comparisonTerms","setComparisonTerms","termExists","termToCheck","findIndex","addNewTermToSearch","prevTerms","removeTermFromSearch","termObj","editTermToSearch","oldTerm","newTerm","index","newParam","newSearchedTerms","Array","from","splice","clearParams","resetParams","useEffect","handleObligatoryChange","queryBuilder","service","grouping","sort_by","customParams","authentication_params","bm_user","username","api_key","public_api_key","general_params","since","until","timezone","time_zone","undefined","query","length","searchedTerm","dateType","String","dateRange","compare","slice","x","urlParams","URLSearchParams","push","useSearch","AppProvider","theme","countOperators","Input","label","rest","intl","useIntl","opened","setOpened","booleanExplanation","Modal","info","width","icon","centered","title","formatMessage","id","onOk","content","dataSource","example","operator","finds","columns","dataIndex","key","pagination","extraContent","style","display","alignItems","justifyContent","padding","QuestionCircleOutlined","onClick","marginLeft","Item","visible","placeholder","suffix","InfoCircleOutlined","MultipleSelect","options","name","mode","onChange","e","Option","ActiveCampaign","setSuccess","handleSubmit","values","Axios","u","f","s","c","m","act","v","fullname","email","phone","jsonp","afterClose","footer","status","subTitle","extra","onFinish","labelCol","span","wrapperCol","rules","required","message","htmlType","block","FormItem","Form","RangePicker","generatePicker","dateFnsGenerateConfig","es","lang","RangeDatePicker","activeCampaign","setActiveCampaign","dates","setDates","hackValue","setHackValue","setValue","isGuestUser","pt","en","disabledDate","current","afterTomorrow","isAfter","startOfTomorrow","twoYearsLater","isBefore","subYears","startOfToday","dateA","dateB","afterRange","differenceInCalendarDays","onOpenChange","open","handleDateSelect","_","concat","startParsed","startOfDay","endParsed","endOfDay","prevParams","disabled","onCalendarChange","getPopupContainer","document","getElementById","onCancel","Select","handleDateChange","defaultValue","FormANT","attrs","layout","Card","CardANT","SearchForm","formValidationFormat","terms","operators","schema","Yup","shape","max","validate","abortEarly","gutter","xs","md","target","maxLength","Paragraph","ellipsis","rows","expandable","minHeight","margin","TwitterService","country","instance","emails","period","formattedEmails","Title","WidgetHeader","setCountry","displayExportModal","isUserLogged","countryMenu","i18n","countrySetter","items","getCountriesItems","justify","CloudDownloadOutlined","overlay","placement","arrow","SettingOutlined","loadingArray","tweet_volume","rel","Intl","NumberFormat","TwitterWidget","props","loading","setLoading","countryName","getTrendsByCoutry","response","body","trends","filtered","trend","orderBy","Promise","resolve","getTrends","pageSize","renderItem","item","active","paragraph","GoogleWidget","xml","xml2js","compact","spaces","rss","channel","_text","count","parseInt","err","formatXMLtoJSON","validateEmail","test","EmailSelector","validInput","React","setEmails","hasEmails","emailsAreValid","every","raw","tokenSeparators","tagRender","valueAsString","isValidEmail","closable","color","marginRight","onClose","DatetimeRangePicker","moment","subtract","range","setRange","timeFormat","dateFormat","allowClear","showTime","ExportTrendsModal","dispose","useForm","form","validEmail","setValidEmail","validDateRange","setValidDateRange","setPeriod","formatDatetime","datetime","cancelText","okText","okButtonProps","exportTrends","CheckCircleOutlined","CloseCircleOutlined","finally","confirmLoading","destroyOnClose","div","Home","displayExportTrends","setDisplayExportTrends","Google","Twitter","formatDate","fdate","h4","SectionTitle","ContainerAddTerm","Grid","InputANT","AddTermButton","isClicked","setIsClicked","setTerm","onSubmit","PlusCircleOutlined","ContainerTerm","TermCardButton","Button","ButtonsContainer","Terms","TermCard","remove","edit","currentTerm","setCurrentTerm","termName","prevCurrentTerm","hoverable","initialValue","EditOutlined","CardHeader","handleNewSearch","handleEditSearch","flexDirection","direction","align","SearchOutlined","ResultsHeader","resume","setResume","handleScroll","window","pageYOffset","addEventListener","removeEventListener","reverse","offsetTop","apiElasticsearch","Authorization","memo","legend","XAxis","Facebook","Instagram","X","Total","magicTypeTranslations","line","bar","totalPosts","reduce","acc","sum","ref","getEchartsInstance","setOption","baseOption","show","text","textStyle","fontSize","fontFamily","grid","top","left","right","bottom","tooltip","trigger","axisPointer","graphic","image","TrendsLogo","height","toolbox","feature","magicType","option","stack","saveAsImage","excludeComponents","brush","xAxisIndex","brushLink","outOfBrush","colorAlpha","dataZoom","backgroundColor","xAxis","boundaryGap","axisLine","yAxis","axisLabel","formatter","numeral","series","smooth","symbolSize","lineStyle","areaStyle","opacity","itemStyle","media","maxWidth","prevProps","newProps","TermEvolutionWrapper","total","dataByNetwork","instagram","facebook","twitter","Object","find","arr","totalValues","isDataValid","metric","description","TotalBuzzChart","formattedData","perItem","totalPerItem","itemWidth","radius","avoidLabelOverlap","fontWeight","position","labelLine","TermEvolutionContainer","setTotalPosts","Map","paramsDatas","setParamsDatas","setTotal","totalBuzz","setTotalBuzz","keyToRemove","difference","keys","prevDatas","delete","totals","totalSum","prev","allPosts","apiRequest","all","elasticsearchApi","post","set","requestData","validateTermData","forEach","marginBottom","bordered","avatar","useDefaultChartsContainer","requestURL","requestBody","url","totalValue","sort","b","localeCompare","uuid","seriesLayoutBy","rich","lineHeight","verticalAlign","dataFormat","charAt","toUpperCase","percent","center","SharingByNetwork","ChartsContainer","sentiment","toLowerCase","SentimentContainer","ContainerBody","numberOfCharts","gender","GenderContainer","formatted","DownloadModal","quantity","parsed_data","post_id","author","profile","user_login","screenname","formatStringDate","likes","shares","comments_amounts","engagement","toFixed","sheetArrays","SheetName","toLocaleDateString","sheet","XLSX","utils","aoa_to_sheet","csvSheet","sheet_to_csv","blob","Blob","saveAs","workbook","book_new","Props","Subject","Author","CreatedDate","SheetNames","Sheets","writeFile","bookType","Group","min","ImportModal","maxImportNumber","requestObj","master_email","master_id","_id","export_type","posts_params","user_tags","max_posts","brand_name","brand","brand_searchable","formValidation","validateFields","brands","remote_name","usePostsContainer","maxImport","setMaxImport","Content","full","PostImage","BrokenLink","PostVideo","Metrics","Post","seeFullPost","dateFormatted","metrics","reactions","RiseOutlined","LikeOutlined","MessageOutlined","LinkOutlined","rts","impressions","UserOutlined","UsergroupAddOutlined","followers","tweets","link","picture_full_size","controls","profile_image_url","border","socialIcon","posts","setPosts","page","setPage","handleSeeMore","handleSeeFullPost","sm","lg","PostMenu","handleMenu","TopPostsFacebookHeader","FBLogo","TopPostsFacebook","downloadModal","setDownloadModal","importModal","setImportModal","handleImportModal","handleDownloadModal","PostLoading","FacebookFilled","Download","Import","TopPostsInstagramHeader","InstaLogo","TopPostsInstagram","InstagramFilled","TopPostsTwitterHeader","XLogo","TopPostsTwitter","TwitterOutlined","influencersApi","SocialIcon","social_network","className","YoutubeFilled","Label","SectionDivider","Divider","TagContainer","TagGroup","Social","SocialFollowers","SocialCount","PopOverText","TagSection","tags","SocialPreview","socials","socialsFormatted","social","number","formattedCount","translateLanguage","cldr","setCldr","version","pkg","dependencies","packurl","framework","CLDRFramework","asyncLoader","fetch","r","json","console","log","packCacheSize","resolveLocale","getAsync","tag","expanded","new_cldr","General","parseLanguageTag","getLanguageDisplayName","useCldrTranslator","photo","interests","formattedLanguages","flatMap","cover","DEFAULT_FILTERS","searchFor","socialNetworks","whereToSearch","min_followers","max_followers","age","countries","currentInfluencers","setCurrentInfluencers","pageRequest","setPageRequest","containerPage","setContainerPage","hasMore","setHasMore","prevPosts","prevpageRequest","TamiLogo","InfluencersWidget","Results","paramsObj","searchData","formatParamsToObj","location","search","newObligatoryQuery","newParamsObj","Routes","path","component","exact","App","ReactDOM","render","StrictMode","module","exports"],"mappings":"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","file":"static/js/main.7021e0ef.chunk.js","sourcesContent":["import React from 'react';\n\nimport styled from 'styled-components';\n\nimport BuzzmonitorLogo from 'assets/images/bm-logo.png';\n\nconst Header: React.FC = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nconst Container = styled.header`\n max-width: 100vw;\n width: 100%;\n position: fixed;\n top: 0;\n height: 57px;\n background-color: black;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n div {\n max-width: 1080px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n a {\n img {\n margin: 0 auto;\n height: 80px;\n width: auto;\n }\n }\n @media (max-width: 900px) {\n display: flex;\n img {\n margin: 0 auto;\n }\n }\n @media (max-width: 420px) {\n max-width: 100vw;\n button {\n font-size: 15px;\n width: 65px;\n }\n span {\n width: 0px;\n }\n }\n }\n`;\n\nexport default Header;\n","import { createGlobalStyle } from 'styled-components';\nimport 'antd/dist/antd.css';\n\nexport default createGlobalStyle`\n * {\n padding: 0;\n margin: 0;\n outline: 0;\n box-sizing: border-box;\n }\n *:focus {\n outline: 0;\n }\n html, body, #root {\n height: 100vh;\n }\n body {\n background: #f5f5f5;\n -webkit-font-smoothing: antialiased;\n }\n body, input,button {\n font-family: 'Lato', sans-serif;\n font-size: 14px;\n }\n a {\n text-decoration: none;\n }\n ul {\n list-style: none;\n }\n button {\n cursor: pointer;\n }\n h1, h2,h3,h4,h5,h6 {\n margin: 0;\n }\n h1 {\n font-weight: 700;\n font-size: 43px;\n }\n h2 {\n font-weight: 700;\n font-size: 38px;\n }\n h3 {\n font-weight: 700;\n font-size: 34px;\n }\n h4 {\n font-weight: 700;\n font-size: 29px;\n }\n h5 {\n font-weight: 700;\n font-size: 25px;\n }\n h6 {\n font-weight: 700;\n font-size: 23px;\n }\n label {\n font-weight: 700;\n font-size: 15px;\n }\n p {\n font-weight: 400;\n line-height: 1.2rem;\n font-size: .9rem;\n }\n small {\n font-weight: 400;\n font-size: 12px;\n }\n div.ant-card, button {\n border-radius: 4px;\n }\n div.ant-card{\n border: 1px solid #e8e8e8;\n }\n button {\n svg {\n height: 0.8rem;\n width:auto;\n }\n }\n div.ant-card-head-title{\n padding: 8px 0;\n }\n @media (max-width: 480px){\n div.ant-card-head-title {\n img , svg {\n height: 1rem;\n width:auto;\n }\n h4 {\n font-size: 1.2rem;\n }\n }\n button {\n svg {\n height: 0.8rem;\n width:auto;\n }\n }\n }\n`;\n","import axios from 'axios';\n\nconst userApi = axios.create({\n baseURL: process.env.REACT_APP_USER_API_URL,\n});\n\nexport default userApi;\n","import React, { createContext, useState, useContext, useCallback } from 'react';\nimport { parseISO, addDays, isPast } from 'date-fns';\nimport userApi from 'services/userApi';\nimport Cookies from 'js-cookie';\n\ntype Language = 'pt-BR' | 'pt-PT' | 'en' | 'es';\n\ninterface User {\n _id: string;\n consumer_type: string;\n language: Language;\n time_zone: string;\n email: string;\n username: string;\n remote_name: string;\n public_api_key: string;\n name: string;\n brands: Array<{ name: string; remote_name: string }>;\n}\n\ninterface AuthState {\n token: string;\n user: User;\n}\n\ninterface AuthContextData {\n user: User;\n authorizeUser(): Promise;\n}\n\nconst AuthContext = createContext({} as AuthContextData);\n\nconst AuthProvider: React.FC = ({ children }) => {\n const [data, setData] = useState(() => {\n const user = localStorage.getItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:user`,\n );\n const tokenData = localStorage.getItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:token`,\n );\n if (tokenData && user) {\n const { token, expire_date } = JSON.parse(tokenData);\n if (!isPast(parseISO(expire_date))) {\n return { token, user: JSON.parse(user) };\n }\n localStorage.removeItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:user`,\n );\n localStorage.removeItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:token`,\n );\n }\n return {\n user: {\n consumer_type:\n process.env.REACT_APP_ENV === 'production'\n ? 'unassigned_costumer'\n : 'employee',\n },\n token: '',\n } as AuthState;\n });\n\n const authorizeUser = useCallback(async () => {\n const token = Cookies.get('token');\n if (token) {\n await userApi\n .get('', {\n headers: {\n 'access-token': process.env.REACT_APP_USER_API_ACCESS_TOKEN,\n token,\n },\n })\n .then(res => {\n localStorage.setItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:user`,\n JSON.stringify(res.data[0]),\n );\n localStorage.setItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:token`,\n JSON.stringify({\n token,\n expire_date: addDays(new Date(), 1).toISOString(),\n }),\n );\n setData({ token, user: res.data[0] });\n })\n .catch(() => {\n setData({ token: '', user: {} as User });\n localStorage.setItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:user`,\n JSON.stringify(''),\n );\n localStorage.setItem(\n `@Buzzmonitor:${process.env.REACT_APP_APPLICATION_NAME}:token`,\n JSON.stringify({}),\n );\n });\n }\n }, []);\n\n return (\n \n {children}\n \n );\n};\n\nfunction useAuth(): AuthContextData {\n const context = useContext(AuthContext);\n\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider!');\n }\n\n return context;\n}\n\nexport { AuthProvider, useAuth };\n","import React from 'react';\nimport { IntlProvider } from 'react-intl';\nimport { useMemo } from 'react';\nimport { useAuth } from './auth';\nimport ptBRTranslation from '../translations/pt-BR.json';\nimport ptPTTranslation from '../translations/pt-PT.json';\nimport enTranslation from '../translations/en.json';\nimport esTranslation from '../translations/es.json';\n\nconst I18nProvider: React.FC = ({ children }) => {\n const { user } = useAuth();\n\n const language = useMemo(() => {\n if (user?.language?.toString() == 'pt_PT') {\n return 'pt-PT';\n } else if (user?.language?.toString() == 'pt_BR') {\n return 'pt-BR';\n } else {\n return user?.language;\n }\n }, [user]);\n\n const messages = useMemo(() => {\n const translations = {\n 'pt-BR': ptBRTranslation,\n 'pt-PT': ptPTTranslation,\n 'en': enTranslation,\n 'es': esTranslation,\n };\n return translations[language || 'en'];\n }, [user]);\n\n return (\n \n {children}\n \n );\n};\n\nexport { I18nProvider };\n","import { DefaultTheme } from 'styled-components';\n\nconst buzzmonitorTheme: DefaultTheme = {\n colors: {\n primary: '#008EED',\n secondary: '#FCB315',\n tertiary: '#969fb7',\n\n primaryLight: '#4DAEFF',\n primaryDark: '#478DDA',\n primaryDarker: '#327BDD',\n\n secondaryLight: '#FFCF67',\n secondaryDark: '#E9A256',\n secondaryDarker: '#FF992D',\n\n tertiaryLight: '#ECEBEB',\n tertiaryDark: '#CCCCCC',\n\n black: '#282828',\n grey: '#cccccc',\n lighgrey: '#ecebeb',\n\n success: '#59cb59',\n error: '#DD5b70',\n\n background: '#F5f5f5',\n },\n size: {\n borderRadius: '4px',\n },\n};\n\nexport default buzzmonitorTheme;\n","interface FormatQueryData {\n obligatory: string;\n optional: string;\n banned: string;\n}\n\nconst booleanOperators = ['AND', '&&', 'OR', '||', 'NOT', '(', ')'];\n\nconst formatQuery = ({\n obligatory,\n optional,\n banned,\n}: FormatQueryData): string => {\n let boolean = obligatory.match(\n /(\")|(OR)|(AND)|(NOT)|(\\()|(\\))|(^(-[a-zA-Z0-9]*)$)/g,\n )\n ? obligatory\n : '';\n\n if (boolean) {\n boolean = boolean.trim().replace(/\\(/g, '( ').replace(/\\)/g, ' )');\n const booleanSplitted = boolean\n .split(/ +(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g)\n .filter(term => term !== '');\n\n const booleanFormatted = booleanSplitted.map(term => {\n if (!booleanOperators.includes(term) && !term.match('\"')) {\n if (term.match(/^-[a-zA-Z0-9]/gi)) {\n return `NOT(\"${term.replace('-', '')}\")`;\n }\n return `\"${term}\"`;\n }\n return term;\n });\n\n boolean = booleanFormatted.join(' ');\n boolean.replace(/\"\"/g, '\"');\n }\n\n const obligatoryQuery = obligatory\n .split(',')\n .map(term => term && `\"${term.trim()}\"`)\n .join(' ');\n const optionalString = optional\n .split(',')\n .map(term => term && `\"${term.trim()}\"`)\n .join(' OR ');\n\n const bannedQuery = banned\n .split(',')\n .map(term => term && `NOT(\"${term.trim()}\")`)\n .join(' ');\n\n const optionalQuery = optionalString ? `( ${optionalString} )` : '';\n return `${boolean || obligatoryQuery} ${optionalQuery} ${bannedQuery}`.trim();\n};\n\n/*\n Format a FormatQueryData to a Influencers query string.\n */\nexport const formatInfluencersQuery = ({\n obligatory,\n optional,\n banned,\n}: FormatQueryData): string => {\n let boolean = obligatory.match(/(\")|(OR)|(AND)|(NOT)|(^(-[a-zA-Z0-9]*)$)/g)\n ? obligatory\n : '';\n\n if (boolean) {\n boolean = boolean.trim().replace(/\\(/g, '( ').replace(/\\)/g, ' )');\n\n const booleanSplitted = boolean\n .split(/ +(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/g)\n .filter(term => term !== '');\n\n const booleanFormatted = booleanSplitted.map(term => {\n if (!booleanOperators.includes(term) && !term.match('\"')) {\n if (term.match(/^-[a-zA-Z0-9]/gi)) {\n return `NOT(\"${term.replace('-', '')}\")`;\n }\n }\n return term;\n });\n\n boolean = booleanFormatted.join(' ');\n }\n\n const obligatoryQuery = obligatory\n .split(',')\n .map(term => term.trim())\n .join(' ');\n const optionalString = optional\n .split(',')\n .map(term => term.trim())\n .join(' OR ');\n const bannedQuery = banned\n .split(',')\n .map(term => term && `NOT(${term.trim()})`)\n .join(' ');\n\n const optionalQuery = optionalString ? `( ${optionalString} )` : '';\n return `${boolean || obligatoryQuery} ${optionalQuery} ${bannedQuery}`\n .trim()\n .replace(/\"/g, '\"\"');\n};\n\nexport default formatQuery;\n","import React, {\n createContext,\n useState,\n useCallback,\n useContext,\n useEffect,\n} from 'react';\nimport { format, subDays, parseISO } from 'date-fns';\nimport formatQuery from 'utils/formatQuery';\nimport { useHistory } from 'react-router-dom';\nimport { useAuth } from './auth';\n\nexport type Language = 'pt-BR' | 'pt-PT' | 'en' | 'es';\nexport type DateType = 'today' | 'last30' | 'last7' | 'last24' | 'personalized';\nexport type IPost = {\n post_id: string;\n content: string;\n service: 'facebook' | 'instagram' | 'twitter';\n likes?: number;\n rts?: number;\n impressions?: number;\n shares?: number;\n comments_amounts?: number;\n page_id?: string;\n type: string;\n link?: string;\n reactions?: number;\n date: string;\n content_type?: string;\n picture_full_size?: string;\n sentiment?: string;\n engagement?: number;\n url?: string;\n user_login?: string;\n author: {\n name?: string;\n login?: string;\n profile?: string;\n profile_image_url?: string;\n followers?: number;\n tweets?: number;\n screenname?: string;\n };\n};\n\nexport type Params = {\n obligatory: string;\n optional: string;\n banned: string;\n languages: Language[];\n date: {\n type: DateType;\n start: string;\n end: string;\n };\n};\n\nexport type Metric = {\n label: string;\n value: number;\n};\ntype Results = {\n term_evolution?: Array;\n sentiments?: Array;\n services?: Array;\n genders?: Array;\n posts: {\n facebook?: Array;\n instagram?: Array;\n twitter?: Array;\n };\n};\n\nexport const allServices = [\n 'twitter',\n 'facebook',\n 'instagram',\n 'photos',\n 'videos',\n 'forums',\n 'blogs',\n 'news',\n 'miscellaneous',\n];\nexport interface QueryBuilderData {\n service?: string[];\n grouping?: string;\n size?: number;\n sort_by?: string;\n customParams?: Params;\n}\n\ninterface QueryBuilderResponse {\n authentication_params: {\n bm_user: string;\n api_key: string;\n };\n general_params: {\n since: string;\n until: string;\n language: string[];\n timezone: string;\n service?: string[];\n query: string;\n };\n sort_by?: string;\n size?: number;\n grouping?: string;\n}\n\ninterface SearchContextData {\n params: Params;\n setParams: React.Dispatch>;\n clearParams(): void;\n booleanMode: boolean;\n handleObligatoryChange(value: string): void;\n preview: string;\n queryBuilder(data: QueryBuilderData): QueryBuilderResponse;\n addNewTermToSearch(term: string): void;\n searchedTerms: Params[];\n setSearchedTerms: React.Dispatch>;\n resetParams(): void;\n removeTermFromSearch(term: string): void;\n editTermToSearch(oldTerm: string, newTerm: string): void;\n comparisonTerms: Params[];\n setComparisonTerms: React.Dispatch>;\n}\n\nconst initialParams = {\n obligatory: '',\n optional: '',\n banned: '',\n languages: [],\n date: {\n type: 'last30',\n start: format(subDays(new Date(), 30), 'yyyy-MM-dd hh:mm:ss').toString(),\n end: format(new Date(), 'yyyy-MM-dd hh:mm:ss').toString(),\n },\n} as Params;\n\nconst SearchContext = createContext({} as SearchContextData);\n\nconst SearchProvider: React.FC = ({ children }) => {\n const { user } = useAuth();\n const history = useHistory();\n const [params, setParams] = useState({ ...initialParams });\n const [searchedTerms, setSearchedTerms] = useState([]);\n const [booleanMode, setBooleanMode] = useState(false);\n const [preview, setPreview] = useState('');\n const [comparisonTerms, setComparisonTerms] = useState([]);\n\n const termExists = useCallback(\n (termToCheck: string): boolean => {\n return (\n searchedTerms.findIndex(term => term.obligatory === termToCheck) > -1\n );\n },\n [searchedTerms],\n );\n\n const addNewTermToSearch = useCallback(\n (term: string) => {\n if (termExists(term)) {\n return;\n }\n setParams({ ...params, obligatory: term, optional: '', banned: '' });\n setSearchedTerms(prevTerms => [\n ...prevTerms,\n { ...params, obligatory: term, optional: '', banned: '' },\n ]);\n },\n [params, termExists],\n );\n\n const removeTermFromSearch = useCallback((term: string) => {\n setSearchedTerms(prevTerms =>\n prevTerms.filter(termObj => termObj.obligatory !== term),\n );\n }, []);\n\n const editTermToSearch = useCallback(\n (oldTerm: string, newTerm: string) => {\n if (oldTerm === newTerm || termExists(newTerm)) {\n return;\n }\n const index = searchedTerms.findIndex(\n term => term.obligatory === oldTerm,\n );\n\n const newParam = {\n ...params,\n obligatory: newTerm,\n optional: '',\n banned: '',\n };\n\n const newSearchedTerms = Array.from(searchedTerms);\n newSearchedTerms.splice(index, 1, newParam);\n\n setSearchedTerms(newSearchedTerms);\n setParams(newParam);\n },\n [params, searchedTerms, termExists],\n );\n\n const clearParams = useCallback(() => {\n setParams({ ...initialParams });\n }, []);\n\n const resetParams = useCallback(() => {\n setParams(searchedTerms[0]);\n }, [searchedTerms]);\n\n useEffect(\n () =>\n setPreview(\n formatQuery({\n obligatory: params.obligatory,\n optional: params.optional,\n banned: params.banned,\n }),\n ),\n [params.obligatory, params.optional, params.banned],\n );\n\n const handleObligatoryChange = useCallback(\n (value: string) => {\n setParams({ ...params, obligatory: value });\n const hasBooleanSearch = !!value.match(/(\")|(OR)|(AND)|(NOT)/g);\n if (hasBooleanSearch) {\n if (!booleanMode) setBooleanMode(true);\n } else if (booleanMode) setBooleanMode(false);\n },\n [booleanMode, params],\n );\n\n const queryBuilder = useCallback(\n ({\n service,\n grouping,\n size,\n sort_by,\n customParams = params,\n }: QueryBuilderData): QueryBuilderResponse => ({\n authentication_params: {\n bm_user: user.username || 'guest',\n api_key:\n user.public_api_key ||\n 'MfcySfJ4jw8Wj3bSlxExD4UEnpDoiAfVDfhjlRdsdafk1g2cDw',\n },\n general_params: {\n since: format(\n parseISO(customParams.date.start),\n 'yyyyMMddHHmmss',\n ).toString(),\n until: format(\n parseISO(customParams.date.end),\n 'yyyyMMddHHmmss',\n ).toString(),\n language: customParams.languages || [],\n timezone: user.time_zone || '-3.0',\n service: service ? [...service] : undefined,\n query: customParams.obligatory,\n },\n sort_by,\n size,\n grouping,\n }),\n [params, user],\n );\n\n /*\n Updates the page URL when the searchedTerms are changed by adding, editing \n or deleting.\n */\n useEffect(() => {\n if (searchedTerms.length >= 1) {\n const { date } = searchedTerms[0];\n\n const searchedTerm = {\n obligatory: searchedTerms[0].obligatory,\n optional: searchedTerms[0].optional,\n banned: searchedTerms[0].banned,\n languages: JSON.stringify(searchedTerms[0].languages),\n dateType: String(date.type),\n dateRange: JSON.stringify([date.start, date.end]),\n compare: JSON.stringify(searchedTerms.slice(1).map(x => x.obligatory)),\n };\n\n const urlParams = new URLSearchParams(searchedTerm).toString();\n history.push(`/results?${urlParams}`);\n }\n }, [history, searchedTerms]);\n\n return (\n \n {children}\n \n );\n};\n\nfunction useSearch(): SearchContextData {\n const context = useContext(SearchContext);\n\n if (!context) {\n throw new Error('useAuth must be used within an AuthProvider!');\n }\n\n return context;\n}\n\nexport { SearchProvider, useSearch };\n","import React from 'react';\nimport { ThemeProvider } from 'styled-components';\nimport { AuthProvider } from './auth';\nimport { I18nProvider } from './i18n';\n\nimport buzzmonitorTheme from '../styles/theme/buzzmonitor';\nimport { SearchProvider } from './search';\n\nconst AppProvider: React.FC = ({ children }) => {\n return (\n \n \n \n {children}\n \n \n \n );\n};\n\nexport default AppProvider;\n","const countOperators = (query: string): number => {\n // eslint-disable-next-line no-useless-escape\n const re = /(\\\" \\\")|( OR [^\\(])|( && [^\\(])|( \\|\\| [^\\(])|(( AND [^\\(]))|(\\\" \\()|(\\( \\\")|(\\) \\\")|(\\) (NOT)|!)/g;\n return ((query || '').match(re) || []).length;\n};\n\nexport default countOperators;\n","import React, { useMemo, useCallback, useState } from 'react';\nimport { Form, Input as InputANT, Tooltip, Modal, Table, Popover } from 'antd';\nimport { useIntl } from 'react-intl';\nimport { InfoCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';\nimport { InputProps } from 'antd/lib/input';\n\ninterface Props extends InputProps {\n label: string;\n booleanMode?: boolean;\n}\nconst Input: React.FC = ({ label, booleanMode, ...rest }) => {\n const intl = useIntl();\n const [opened, setOpened] = useState(false);\n\n const booleanExplanation = useCallback(() => {\n setOpened(true);\n Modal.info({\n width: 650,\n icon: '',\n centered: true,\n title: intl.formatMessage({ id: 'boolean_operators.title' }),\n onOk: () => setOpened(false),\n content: (\n ({\n operator: intl.formatMessage({ id: `example${example}_operator` }),\n finds: intl.formatMessage({ id: `example${example}_finds` }),\n }))}\n columns={[\n {\n title: intl.formatMessage({ id: 'boolean_operators.operator' }),\n dataIndex: 'operator',\n key: 'operator',\n },\n {\n title: intl.formatMessage({ id: 'boolean_operators.finds' }),\n dataIndex: 'finds',\n key: 'finds',\n },\n ]}\n pagination={false}\n />\n ),\n });\n }, [intl]);\n\n const extraContent = useMemo(\n () =>\n booleanMode ? (\n \n {intl.formatMessage({ id: 'boolean.tooltip' })}\n \n \n ) : (\n ''\n ),\n [booleanExplanation, booleanMode, intl],\n );\n\n return (\n \n \n \n \n ,\n ]}\n />\n \n \n );\n};\n\nexport default Input;\n","import React, { useMemo } from 'react';\nimport { Form, Select } from 'antd';\nimport { useIntl } from 'react-intl';\nimport { useSearch, Language } from 'hooks/search';\n\ninterface Option {\n value: string;\n name: string;\n}\ninterface Props {\n label: string;\n}\n\nconst MultipleSelect: React.FC = ({ label }) => {\n const intl = useIntl();\n const { params, setParams } = useSearch();\n\n const options: Array = useMemo(() => {\n return [\n {\n value: 'pt',\n name: intl.formatMessage({ id: 'searchform.language.pt' }),\n },\n {\n value: 'en',\n name: intl.formatMessage({ id: 'searchform.language.en' }),\n },\n {\n value: 'es',\n name: intl.formatMessage({ id: 'searchform.language.es' }),\n },\n ];\n }, [intl]);\n\n return (\n \n setParams({ ...params, languages: e })}\n >\n {options.map(({ value, name }) => (\n \n {name}\n \n ))}\n \n \n );\n};\n\nexport default MultipleSelect;\n","import React, { useState, useCallback } from 'react';\nimport Axios from 'axios';\nimport { useIntl } from 'react-intl';\nimport { Form, Modal, Result, Input, Button } from 'antd';\nimport { ModalProps } from 'antd/lib/modal';\n\nconst ActiveCampaign: React.FC = ({ ...rest }) => {\n const intl = useIntl();\n const [success, setSuccess] = useState(false);\n\n const handleSubmit = useCallback(values => {\n return Axios.get(\n 'https://cors-anywhere.herokuapp.com/http://buzzmonitor.activehosted.com/proc.php',\n {\n params: {\n u: 21,\n f: 21,\n s: null,\n c: 0,\n m: 0,\n act: 'sub',\n v: 2,\n fullname: values.name,\n email: values.email,\n phone: values.phone,\n jsonp: true,\n },\n },\n ).then(() => {\n setSuccess(true);\n });\n }, []);\n\n const resetState = () => {\n setSuccess(false)\n }\n \n if (success) {\n return (\n >}\n >\n \n comercial@getbuzzmonitor.com.br\n ,\n ]}\n />\n \n );\n }\n\n return (\n >}\n >\n {intl.formatMessage({ id: 'contact.subtitle1' })}\n {intl.formatMessage({ id: 'contact.subtitle2' })}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {intl.formatMessage({ id: 'contact.button' })}\n \n \n \n );\n};\n\nexport default ActiveCampaign;\n","import styled from 'styled-components';\nimport { Form } from 'antd';\n\nexport const FormItem = styled(Form.Item)`\n @media (max-width: 680px) {\n #rangepicker {\n .ant-picker-panels {\n flex-direction: column !important;\n }\n }\n }\n`;\n","import React, { useMemo, useCallback, useState, useEffect } from 'react';\nimport pt from 'antd/es/date-picker/locale/pt_BR';\nimport en from 'antd/es/date-picker/locale/en_US';\nimport es from 'antd/es/date-picker/locale/es_ES';\nimport { useIntl } from 'react-intl';\nimport { useAuth } from 'hooks/auth';\nimport {\n format,\n startOfDay,\n parseISO,\n endOfDay,\n differenceInCalendarDays,\n isAfter,\n startOfTomorrow,\n isBefore,\n subYears,\n startOfToday,\n} from 'date-fns';\nimport { useSearch } from 'hooks/search';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\n\nimport dateFnsGenerateConfig from 'rc-picker/lib/generate/dateFns';\nimport generatePicker from 'antd/es/date-picker/generatePicker';\nimport { FormItem } from './styles';\n\nconst DatePicker = generatePicker(dateFnsGenerateConfig);\nconst { RangePicker } = DatePicker; // import locale\ninterface Props {\n label: string;\n}\n\n// fixing antd locale bug\nes.lang.locale = 'es';\n\nconst RangeDatePicker: React.FC = ({ label }) => {\n const intl = useIntl();\n const { user } = useAuth();\n const { params, setParams } = useSearch();\n const { language } = useAuth().user;\n const [activeCampaign, setActiveCampaign] = useState(false);\n\n const [dates, setDates] = useState<[string, string] | []>();\n const [hackValue, setHackValue] = useState<\n [Date | null, Date | null] | null\n >();\n const [value, setValue] = useState<[Date | null, Date | null] | null>();\n\n const isGuestUser = useMemo(() => {\n return !(\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n );\n }, [user.consumer_type]);\n\n useEffect(() => {\n if (isGuestUser) {\n setActiveCampaign(true);\n }\n setValue([new Date(params.date.start), new Date(params.date.end)]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const locale = useMemo(\n () => ({\n pt,\n en,\n es,\n }),\n [],\n );\n\n const disabledDate = useCallback(\n (current: Date): boolean => {\n const afterTomorrow = isAfter(current, startOfTomorrow());\n const twoYearsLater = isBefore(current, subYears(startOfToday(), 2));\n\n if (!dates || dates.length === 0) {\n return afterTomorrow || twoYearsLater;\n }\n const dateA = new Date(dates[0]);\n const dateB = new Date(dates[1]);\n\n const afterRange = isGuestUser\n ? differenceInCalendarDays(dateA, current) > 30 ||\n differenceInCalendarDays(dateA, current) < -30 ||\n differenceInCalendarDays(dateB, current) > 30\n : differenceInCalendarDays(dateA, current) > 182 ||\n differenceInCalendarDays(dateA, current) < -182 ||\n differenceInCalendarDays(dateB, current) > 182;\n return afterTomorrow || twoYearsLater || afterRange;\n },\n [dates, isGuestUser],\n );\n\n const onOpenChange = useCallback((open: boolean): void => {\n if (open) {\n setHackValue([null, null]);\n setDates([]);\n } else {\n setHackValue(undefined);\n }\n }, []);\n\n const handleDateSelect = useCallback(\n (_, date: [string, string]) => {\n if (date[0] === '' && date[1] === '') {\n return;\n }\n\n setValue([\n new Date(date[0].concat('T00:00-0800')),\n new Date(date[1].concat('T00:00-0800')),\n ]);\n const start = date[0];\n const end = date[1];\n\n const startParsed = format(\n startOfDay(parseISO(start)),\n 'yyyy-MM-dd HH:mm:ss',\n );\n const endParsed = format(endOfDay(parseISO(end)), 'yyyy-MM-dd HH:mm:ss');\n\n setParams(prevParams => ({\n ...prevParams,\n date: { ...prevParams.date, start: startParsed, end: endParsed },\n }));\n },\n [setParams],\n );\n\n return (\n \n \n setDates(date)}\n onOpenChange={onOpenChange}\n getPopupContainer={(): HTMLElement => {\n return document.getElementById('rangepicker') as HTMLElement;\n }}\n />\n setActiveCampaign(false)}\n />\n \n );\n};\n\nexport default RangeDatePicker;\n","import React, { useMemo, useCallback } from 'react';\nimport { Form, Select as SelectANT } from 'antd';\nimport { useIntl } from 'react-intl';\nimport { useSearch, DateType } from 'hooks/search';\nimport { format, subDays } from 'date-fns';\n\ninterface Option {\n value: string;\n name: string;\n}\ninterface Props {\n label: string;\n}\n\nconst Select: React.FC = ({ label }) => {\n const intl = useIntl();\n const { params, setParams } = useSearch();\n\n const options: Array = useMemo(() => {\n return [\n {\n value: 'today',\n name: intl.formatMessage({ id: 'searchform.personalized.today' }),\n },\n {\n value: 'last24',\n name: intl.formatMessage({ id: 'searchform.personalized.last24' }),\n },\n {\n value: 'last7',\n name: intl.formatMessage({ id: 'searchform.personalized.last7' }),\n },\n {\n value: 'last30',\n name: intl.formatMessage({ id: 'searchform.personalized.last30' }),\n },\n {\n value: 'personalized',\n name: intl.formatMessage({\n id: 'searchform.personalized.personalized',\n }),\n },\n ];\n }, [intl]);\n\n const handleDateChange = useCallback(\n (e: DateType) => {\n switch (e) {\n case 'today': {\n return setParams({\n ...params,\n date: {\n type: e,\n start: format(new Date(), 'yyyy-MM-dd 00:00:00').toString(),\n end: format(new Date(), 'yyyy-MM-dd hh:mm:ss').toString(),\n },\n });\n }\n case 'last24': {\n return setParams({\n ...params,\n date: {\n type: e,\n start: format(\n subDays(new Date(), 1),\n 'yyyy-MM-dd hh:mm:ss',\n ).toString(),\n end: format(new Date(), 'yyyy-MM-dd hh:mm:ss').toString(),\n },\n });\n }\n case 'last7': {\n return setParams({\n ...params,\n date: {\n type: e,\n start: format(\n subDays(new Date(), 7),\n 'yyyy-MM-dd hh:mm:ss',\n ).toString(),\n end: format(new Date(), 'yyyy-MM-dd hh:mm:ss').toString(),\n },\n });\n }\n case 'last30': {\n return setParams({\n ...params,\n date: {\n type: e,\n start: format(\n subDays(new Date(), 30),\n 'yyyy-MM-dd hh:mm:ss',\n ).toString(),\n end: format(new Date(), 'yyyy-MM-dd hh:mm:ss').toString(),\n },\n });\n }\n default: {\n return setParams({\n ...params,\n date: {\n ...params.date,\n type: e,\n },\n });\n }\n }\n },\n [params, setParams],\n );\n\n return (\n \n \n {options.map(({ value, name }) => (\n \n {name}\n \n ))}\n \n \n );\n};\n\nexport default Select;\n","import { Form as FormANT, Card as CardANT } from 'antd';\nimport styled from 'styled-components';\n\nexport const Form = styled(FormANT).attrs({\n layout: 'vertical',\n})`\n padding: 16px 16px 0px;\n\n p {\n height: 1rem;\n }\n div.ant-col {\n div.ant-form-item {\n margin-bottom: 0px;\n & + div.ant-form-item {\n margin-top: 16px;\n }\n }\n }\n @media (max-width: 860px) {\n display: flex;\n flex-direction: column;\n }\n @media (max-width: 370px) {\n form.ant-form {\n padding: 8px;\n }\n }\n`;\n\nexport const Card = styled(CardANT)`\n grid-area: search;\n width: 100%;\n @media (max-width: 370px) {\n div.ant-card-body {\n padding: 0;\n }\n }\n`;\n","import React, { useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useHistory } from 'react-router-dom';\nimport { Button, Row, Col, Typography, message } from 'antd';\n\nimport { useSearch } from 'hooks/search';\n\nimport * as Yup from 'yup';\nimport formatQuery from 'utils/formatQuery';\nimport countOperators from 'utils/countOperators';\nimport Input from './Input';\nimport MultipleSelect from './MultipleSelect';\nimport RangeDatePicker from './RangeDatePicker';\n\nimport Select from './Select';\nimport { Form, Card } from './styles';\n\nconst SearchForm: React.FC = () => {\n const intl = useIntl();\n const history = useHistory();\n const {\n params,\n preview,\n booleanMode,\n setParams,\n handleObligatoryChange,\n } = useSearch();\n\n const handleSubmit = useCallback(async () => {\n try {\n const { date, obligatory, optional, banned } = params;\n\n const formValidationFormat = {\n terms: formatQuery({ obligatory, optional, banned }),\n operators: countOperators(\n formatQuery({ obligatory, banned, optional }),\n ),\n };\n\n const schema = Yup.object().shape({\n terms: Yup.string().max(\n 512,\n intl.formatMessage({ id: 'searchform.error.maxsize' }),\n ),\n operators: Yup.number().max(\n 15,\n intl.formatMessage({ id: 'searchform.error.maxoperators' }),\n ),\n });\n\n await schema.validate(formValidationFormat, {\n abortEarly: false,\n });\n\n const urlParams = new URLSearchParams({\n obligatory: params.obligatory,\n optional: params.optional,\n banned: params.banned,\n languages: JSON.stringify(params.languages),\n dateType: String(date.type),\n dateRange: JSON.stringify([date.start, date.end]),\n }).toString();\n history.push(`/results?${urlParams}`);\n } catch (error) {\n if (error instanceof Yup.ValidationError) {\n message.error(error.message);\n }\n }\n }, [history, intl, params]);\n\n return (\n \n \n \n \n handleObligatoryChange(e.target.value)}\n maxLength={300 - (params.optional.length + params.banned.length)}\n booleanMode={booleanMode}\n />\n setParams({ ...params, optional: e.target.value })}\n maxLength={\n 300 - (params.obligatory.length + params.banned.length)\n }\n />\n setParams({ ...params, banned: e.target.value })}\n maxLength={\n 300 - (params.optional.length + params.obligatory.length)\n }\n />\n \n \n \n \n {params.date.type === 'personalized' && (\n \n )}\n \n \n \n {preview}\n \n \n \n \n {intl.formatMessage({ id: 'searchform.button' })}\n \n \n \n \n \n );\n};\n\nexport default SearchForm;\n","import axios, { AxiosResponse } from 'axios';\n\nexport class TwitterService {\n private static instance = axios.create({\n baseURL: process.env.REACT_APP_TWITTER_TRENDS_API,\n });\n\n static getTrendsByCoutry(country: string): Promise {\n return TwitterService.instance.get(country);\n }\n\n static exportTrends(\n emails?: Array,\n period?: { start: string; end: string },\n country?: string,\n ): Promise {\n const { start, end } = period || {};\n const formattedEmails = emails ? emails.join(',') : '';\n\n return TwitterService.instance.get('export', {\n params: { emails: formattedEmails, start, end, country },\n });\n }\n}\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n border-top: 4px solid black !important;\n grid-area: widgetTT;\n width: 100%;\n div.ant-card-body {\n padding: 0;\n li.ant-list-item {\n padding: 8px 24px;\n a {\n color: inherit;\n }\n }\n div.ant-list-pagination {\n margin: 8px 0;\n ul.ant-pagination {\n display: flex;\n justify-content: center;\n padding-bottom: 4px;\n }\n }\n div.ant-skeleton-content {\n padding: 0px 24px;\n h3 {\n height: 23px;\n margin: 8px 0;\n }\n }\n }\n`;\n\nexport const Title = styled.header`\n color: black;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 4px;\n strong {\n font-size: 1rem;\n }\n svg {\n margin: 5px;\n height: 1rem;\n width: auto;\n cursor: pointer;\n }\n`;\n","import React, { useEffect, useState, useCallback, useMemo } from 'react';\nimport { useIntl, IntlShape } from 'react-intl';\nimport { Skeleton, Menu, List, Dropdown, Row, Tooltip } from 'antd';\nimport { SettingOutlined, CloudDownloadOutlined } from '@ant-design/icons';\nimport { orderBy } from 'lodash';\nimport { TwitterService } from 'services/twitterApi';\nimport { useAuth } from 'hooks/auth';\nimport { Container, Title } from './styles';\n\ninterface Data {\n name: string;\n tweet_volume: number;\n}\n\nconst WidgetHeader: React.FC<{\n setCountry: (value: string) => void;\n displayExportModal?: (value: boolean) => void;\n}> = ({ setCountry, displayExportModal }) => {\n const intl = useIntl();\n const { user } = useAuth();\n\n const isUserLogged = useMemo(\n () => !!user.consumer_type && user.consumer_type !== 'unassigned_costumer',\n [user.consumer_type],\n );\n\n function getCountriesItems(\n i18n: IntlShape,\n countrySetter: (country: string) => void,\n ): JSX.Element {\n const items = [\n 'world',\n 'brazil',\n 'portugal',\n 'spain',\n 'mexico',\n ].map(country => (\n countrySetter(country)}>\n {i18n.formatMessage({ id: `trends.widget.modal.${country}` })}\n \n ));\n\n return {items};\n }\n\n const countryMenu = useCallback(() => getCountriesItems(intl, setCountry), [\n intl,\n setCountry,\n ]);\n\n function getExportsIcon(): JSX.Element {\n if (!displayExportModal || !isUserLogged) return ;\n\n return (\n \n displayExportModal(true)} />\n \n );\n }\n\n return (\n \n {intl.formatMessage({ id: 'trends.widget.x.title' })}\n \n {getExportsIcon()}\n \n \n \n \n \n );\n};\n\nconst loadingArray = [{}, {}, {}, {}, {}] as Data[];\n\nconst Item: React.FC = ({ name, tweet_volume }: Data) => (\n \n \n {name}\n \n {new Intl.NumberFormat('pt-BR').format(tweet_volume)}\n \n);\n\nconst TwitterWidget: React.FC<{\n displayExportModal: (value: boolean) => void;\n setCountry: (value: string) => void;\n country: string;\n}> = ({ ...props }) => {\n const { country, displayExportModal, setCountry } = props;\n const [data, setData] = useState([]);\n const [loading, setLoading] = useState(false);\n\n async function getTrends(countryName: string): Promise> {\n const response = await TwitterService.getTrendsByCoutry(countryName);\n\n const [{ trends }] = response.data.body;\n const filtered = trends.filter((trend: Data) => trend.tweet_volume > 0);\n\n return orderBy(filtered, 'tweet_volume', 'desc');\n }\n\n useEffect(() => {\n Promise.resolve()\n .then(() => setLoading(true))\n .then(() => getTrends(country))\n .then(trends => setData(trends))\n .then(() => setLoading(false));\n }, [country]);\n\n return (\n \n }\n >\n (\n \n \n \n )}\n />\n \n );\n};\n\nexport default TwitterWidget;\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n border-top: 4px solid #dd5b70 !important;\n grid-area: widgetGT;\n width: 100%;\n div.ant-card-body {\n padding: 0;\n li.ant-list-item {\n padding: 8px 24px;\n a {\n color: inherit;\n }\n }\n div.ant-list-pagination {\n margin: 8px 0;\n ul.ant-pagination {\n display: flex;\n justify-content: center;\n padding-bottom: 4px;\n }\n }\n div.ant-skeleton-content {\n padding: 0px 24px;\n h3 {\n height: 23px;\n margin: 8px 0;\n }\n }\n }\n`;\nexport const Title = styled.header`\n color: #dd5b70;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding-top: 4px;\n strong {\n font-size: 1rem;\n }\n svg {\n height: 1rem;\n width: auto;\n cursor: pointer;\n }\n`;\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport { SettingOutlined } from '@ant-design/icons';\nimport { List, Skeleton, Menu, Dropdown } from 'antd';\nimport Axios from 'axios';\nimport formatXMLtoJSON from 'utils/formatXMLtoJSON.js';\nimport { orderBy } from 'lodash';\nimport { Container, Title } from './styles';\n\nconst googleApiUrl =\n 'https://cors-anywhere.herokuapp.com/https://trends.google.com/trends/trendingsearches/daily';\n\ninterface Data {\n title: string;\n count: number;\n}\n\nconst WidgetHeader: React.FC<{ setCountry: (value: string) => void }> = ({\n setCountry,\n}) => {\n const intl = useIntl();\n\n const countryMenu = useCallback(\n () => (\n \n setCountry('BR')}>\n {intl.formatMessage({ id: 'trends.widget.modal.brazil' })}\n \n setCountry('PT')}>\n {intl.formatMessage({ id: 'trends.widget.modal.portugal' })}\n \n setCountry('US')}>\n {intl.formatMessage({ id: 'trends.widget.modal.usa' })}\n \n setCountry('CO')}>\n {intl.formatMessage({ id: 'trends.widget.modal.colombia' })}\n \n setCountry('MX')}>\n {intl.formatMessage({ id: 'trends.widget.modal.mexico' })}\n \n \n ),\n [intl, setCountry],\n );\n\n return (\n \n \n {intl.formatMessage({ id: 'trends.widget.google.title' })}\n \n \n \n \n \n );\n};\nconst loadingArray = [{}, {}, {}, {}, {}] as Data[];\n\nconst GoogleWidget: React.FC = () => {\n const [data, setData] = useState([]);\n const [country, setCountry] = useState('US');\n\n useEffect(() => {\n Axios.get(`${googleApiUrl}/rss?geo=${country}`)\n .then(response => formatXMLtoJSON(response.data))\n .then(response => setData(orderBy(response, 'count', 'desc')));\n }, [country]);\n\n return (\n }>\n (\n \n \n \n {item.title}\n \n\n {new Intl.NumberFormat('pt-BR').format(item.count)}\n \n \n )}\n />\n \n );\n};\n\nexport default GoogleWidget;\n","import { xml2js } from 'xml-js';\n\nexport default xml => {\n try {\n const response = xml2js(xml, {\n compact: true,\n spaces: 4,\n }).rss.channel.item;\n const responseData = response.map(item => ({\n title: item.title._text,\n count: parseInt(item['ht:approx_traffic']._text.replace(/,/g, '')),\n }));\n return responseData;\n } catch (err) {\n return new Error(err);\n }\n};\n","export function validateEmail(email: string): boolean {\n return /^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$/.test(email);\n}\n","import React, { useEffect } from 'react';\nimport { Modal, Form, DatePicker, Select, Tag } from 'antd';\nimport { ModalProps } from 'antd/lib/modal';\nimport { useIntl } from 'react-intl';\nimport moment from 'moment';\nimport type { RangePickerProps } from 'antd/es/date-picker';\nimport { SelectProps } from 'antd/lib/select';\nimport { validateEmail } from 'utils/emailUtils';\nimport { TwitterService } from 'services/twitterApi';\nimport { CheckCircleOutlined, CloseCircleOutlined } from '@ant-design/icons';\n\ninterface DatetimeRange {\n start: moment.Moment;\n end: moment.Moment;\n}\n\nconst EmailSelector: React.FC<{\n onChange: (emails: Array) => void;\n validInput: (valid: boolean) => void;\n}> = ({ onChange, validInput }) => {\n const [emails, setEmails] = React.useState>([]);\n\n function renderOption({ value }: SelectProps): JSX.Element {\n const valueAsString = value as string;\n const isValidEmail = validateEmail(valueAsString);\n\n function removeEmail(): void {\n setEmails(emails.filter(email => email !== valueAsString));\n }\n\n return (\n \n {valueAsString}\n \n );\n }\n\n useEffect(() => {\n const hasEmails = emails.length > 0;\n const emailsAreValid = emails.every(validateEmail);\n\n validInput(hasEmails && emailsAreValid);\n onChange(emails);\n }, [emails, validInput, onChange]);\n\n return (\n ) => setEmails(raw)}\n tokenSeparators={[',', ' ']}\n open={false}\n tagRender={renderOption}\n />\n );\n};\n\nconst DatetimeRangePicker: React.FC<{\n onChange: (range: DatetimeRange) => void;\n validInput: (valid: boolean) => void;\n}> = ({ onChange, validInput }) => {\n const intl = useIntl();\n const [range, setRange] = React.useState({\n start: moment().subtract(1, 'days'),\n end: moment(),\n });\n\n useEffect(() => onChange(range), [onChange, range]);\n\n const disabledDate: RangePickerProps['disabledDate'] = current => {\n return current && current > moment();\n };\n\n function confirm(period: RangePickerProps['value']): void {\n const [start, end] = period ?? [];\n if (!start || !end) {\n validInput(false);\n return;\n }\n validInput(true);\n\n setRange({\n start: start as moment.Moment,\n end: end as moment.Moment,\n });\n }\n\n const timeFormat = intl.formatMessage({ id: 'general.format.time' });\n const dateFormat = intl.formatMessage({ id: 'general.format.date' });\n\n return (\n \n );\n};\n\ninterface ExportTrendsModalProps extends ModalProps {\n dispose: () => void;\n country?: string;\n}\n\nexport const ExportTrendsModal: React.FC = ({\n dispose,\n ...props\n}: ExportTrendsModalProps) => {\n const intl = useIntl();\n const [form] = Form.useForm();\n const [validEmail, setValidEmail] = React.useState(false);\n const [validDateRange, setValidDateRange] = React.useState(false);\n\n const [loading, setLoading] = React.useState(false);\n\n const [emails, setEmails] = React.useState>([]);\n const [period, setPeriod] = React.useState();\n const country = props.country;\n\n\n function showSuccess(): void {\n dispose();\n Modal.success({\n title: intl.formatMessage({ id: 'trends.export.modal.success.title' }),\n icon: ,\n content: intl.formatMessage({\n id: 'trends.export.modal.success.content',\n }),\n okText: intl.formatMessage({ id: 'trends.export.modal.response.ok' }),\n });\n }\n\n function showFailure(): void {\n dispose();\n Modal.error({\n title: intl.formatMessage({ id: 'trends.export.modal.failure.title' }),\n icon: ,\n type: 'error',\n content: intl.formatMessage({\n id: 'trends.export.modal.failure.content',\n }),\n okText: intl.formatMessage({ id: 'trends.export.modal.response.ok' }),\n });\n }\n\n function formatDatetime(datetime?: moment.Moment): string {\n return datetime?.format('YYYY-MM-DD HH:mm ZZ') ?? '';\n }\n\n function handleOk(): void {\n setLoading(true);\n TwitterService.exportTrends(emails, {\n start: formatDatetime(period?.start),\n end: formatDatetime(period?.end),\n },\n country,\n )\n .then(() => showSuccess())\n .catch(() => showFailure())\n .finally(() => setLoading(false));\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default ExportTrendsModal;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n grid-template-columns: 1fr;\n align-items: center;\n max-width: 1080px;\n margin: 0 auto 0;\n h1 {\n font-weight: regular;\n }\n > main {\n margin-top: 88px;\n margin-bottom: 32px;\n width: 100%;\n display: grid;\n grid-column-gap: 32px;\n grid-row-gap: 40px;\n grid-template-columns: 1fr 1fr;\n grid-template-areas:\n 'search search'\n 'widgetGT widgetTT';\n }\n @media (max-width: 1080px) {\n padding: 0 24px;\n > main {\n margin-bottom: 32px;\n grid-template-columns: repeat(1, 1fr);\n grid-template-areas:\n 'search '\n 'widgetGT'\n 'widgetTT';\n }\n }\n @media (max-width: 370px) {\n padding: 0 8px;\n > main {\n margin-bottom: 32px;\n grid-template-columns: repeat(1, 1fr);\n grid-template-areas:\n 'search '\n 'widgetGT'\n 'widgetTT';\n }\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport SearchForm from 'components/SearchForm';\nimport { useAuth } from 'hooks/auth';\nimport TwitterWidget from 'components/Widgets/Twitter';\nimport GoogleWidget from 'components/Widgets/Google';\nimport { ExportTrendsModal } from 'components/Widgets/Twitter/ExportTrendsModal';\nimport { Container } from './styles';\n\nconst Home: React.FC = () => {\n const { authorizeUser } = useAuth();\n const [displayExportTrends, setDisplayExportTrends] = useState(false);\n const [country, setCountry] = useState('world');\n\n useEffect(() => {\n authorizeUser();\n }, [authorizeUser]);\n\n return (\n \n \n \n \n \n setDisplayExportTrends(false)}\n country={country}\n />\n \n \n );\n};\n\nexport default Home;\n","import { Params, Language } from 'hooks/search';\n\ninterface URLParams extends Params {\n compare: string[];\n}\n\nfunction formatDate(date: string): string {\n // 2020 05 06 10 13 58\n const fdate: RegExpMatchArray | null = date.match(/.{1,2}/g);\n if (!fdate) return '';\n return `${fdate[0]}${fdate[1]}-${fdate[2]}-${fdate[3]} ${fdate[4]}:${fdate[5]}:${fdate[6]}`;\n}\n\nexport default (searchData: string): URLParams => {\n const urlParams = new URLSearchParams(searchData);\n\n const obligatory = urlParams.get('obligatory') || urlParams.get('ob') || '';\n const optional = urlParams.get('optional') || urlParams.get('ops') || '';\n const banned = urlParams.get('banned') || urlParams.get('ba') || '';\n const compare: string[] = JSON.parse(urlParams.get('compare') || '[]');\n\n const languages: Language[] = JSON.parse(\n urlParams.get('languages') || '[]',\n ) as Language[];\n\n const date = {\n type: urlParams.get('dateType') || 'last30',\n start: urlParams.get('dateRange')\n ? JSON.parse(urlParams.get('dateRange') || '[]')[0]\n : formatDate(urlParams.get('initialDate') || ''),\n end: urlParams.get('dateRange')\n ? JSON.parse(urlParams.get('dateRange') || '[]')[1]\n : formatDate(urlParams.get('endDate') || ''),\n };\n\n const data = {\n obligatory,\n optional,\n banned,\n languages,\n date,\n compare,\n } as URLParams;\n return data;\n};\n","import React from 'react';\n\nimport styled from 'styled-components';\n\nconst Title = styled.h4`\n font-size: 20px;\n`;\n\nconst SectionTitle: React.FC = ({ children }) => {\n return {children};\n};\n\nexport default SectionTitle;\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n width: 100%;\n margin-top: 50px;\n margin-bottom: 32px;\n .ant-card-body {\n padding: 0;\n }\n div.ant-card-head-title {\n padding: 16px 0px;\n }\n header {\n display: flex;\n align-items: center;\n button {\n margin-left: auto;\n & + button {\n margin-left: 16px;\n }\n }\n @media (max-width: 600px) {\n flex-direction: column;\n align-items: flex-start;\n button {\n margin: 8px 0;\n width: 100%;\n & + button {\n margin-left: 0px;\n }\n }\n }\n }\n`;\n\nexport const ContainerAddTerm = styled(Container.Grid)`\n flex-grow: 1;\n padding: 12px;\n min-width: 200px;\n width: min-content;\n`;\n","import styled from 'styled-components';\nimport { Input } from 'antd';\n\nexport const InputANT = styled(Input)`\n border: none;\n &:focus {\n outline: none;\n box-shadow: none;\n }\n`;\n","import React, { useState, useCallback } from 'react';\nimport { Button, Form } from 'antd';\nimport { PlusCircleOutlined } from '@ant-design/icons';\nimport { useIntl } from 'react-intl';\nimport { useSearch } from 'hooks/search';\nimport { InputANT } from './styles';\n\nconst AddTermButton: React.FC = () => {\n const intl = useIntl();\n const [isClicked, setIsClicked] = useState(false);\n const [term, setTerm] = useState('');\n const { addNewTermToSearch } = useSearch();\n\n const onSubmit = useCallback((): void => {\n if (term !== '') {\n addNewTermToSearch(term);\n setIsClicked(false);\n setTerm('');\n }\n }, [addNewTermToSearch, term]);\n\n return (\n <>\n {isClicked ? (\n \n setTerm(e.target.value)}\n placeholder={intl.formatMessage({\n id: 'results.comparison.input-placeholder',\n })}\n />\n \n ) : (\n setIsClicked(!isClicked)}>\n \n {intl.formatMessage({\n id: 'results.comparison.button',\n })}\n \n )}\n >\n );\n};\n\nexport default AddTermButton;\n","import styled from 'styled-components';\nimport { Card, Button, Input } from 'antd';\n\nexport const ContainerTerm = styled(Card.Grid)`\n flex-grow: 1;\n min-width: 150px;\n width: min-content;\n text-overflow: ellipsis;\n overflow: hidden;\n position: relative;\n padding: 12px;\n padding-right: 25px;\n .ant-form-item {\n margin-bottom: 0;\n }\n`;\n\nexport const TermCardButton = styled(Button).attrs({\n shape: 'circle',\n type: 'link',\n})`\n height: fit-content;\n width: fit-content;\n display: flex;\n justify-content: flex-end;\n`;\n\nexport const ButtonsContainer = styled.div`\n position: absolute;\n top: 5px;\n right: 5px;\n height: fit-content;\n width: fit-content;\n`;\n\nexport const Terms = styled.span`\n font-size: 1.2rem;\n white-space: nowrap;\n`;\n\nexport const InputANT = styled(Input)`\n &:focus {\n outline: none;\n box-shadow: none;\n }\n`;\n","import React, { useState, useCallback } from 'react';\nimport { Form, Tooltip } from 'antd';\nimport { useIntl } from 'react-intl';\nimport { Params } from 'hooks/search';\nimport { EditOutlined, CloseCircleOutlined } from '@ant-design/icons';\nimport {\n ContainerTerm,\n Terms,\n TermCardButton,\n InputANT,\n ButtonsContainer,\n} from './styles';\n\ninterface TermCardProps {\n term: Params;\n remove: (term: string) => void;\n edit: (oldTerm: string, newTerm: string) => void;\n}\n\nconst TermCard: React.FC = ({ term, remove, edit }) => {\n const intl = useIntl();\n const [isClicked, setIsClicked] = useState(false);\n const [currentTerm, setCurrentTerm] = useState(term);\n\n const onSubmit = useCallback(\n (values): void => {\n edit(currentTerm.obligatory, values.termName);\n setIsClicked(false);\n setCurrentTerm(prevCurrentTerm => ({\n ...prevCurrentTerm,\n obligatory: values.termName,\n optional: '',\n banned: '',\n }));\n },\n [currentTerm, edit],\n );\n\n return (\n \n {isClicked ? (\n \n \n \n \n \n ) : (\n <>\n \n {currentTerm.obligatory}\n \n \n }\n onClick={() => remove(currentTerm.obligatory)}\n />\n }\n onClick={() => setIsClicked(!isClicked)}\n />\n \n >\n )}\n \n );\n};\n\nexport default TermCard;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { Affix, Button, Space } from 'antd';\nimport { SearchOutlined, EditOutlined } from '@ant-design/icons';\nimport { useHistory } from 'react-router-dom';\nimport { useSearch } from 'hooks/search';\nimport { BrowserView, MobileView } from \"react-device-detect\";\nimport { useIntl } from 'react-intl';\nimport SectionTitle from 'components/SectionTitle';\nimport { Container, ContainerAddTerm } from './styles';\nimport AddTermButton from './AddTermButton';\nimport TermCard from './TermCard';\n\nconst CardHeader: React.FC = () => {\n const intl = useIntl();\n const history = useHistory();\n const { clearParams, resetParams } = useSearch();\n\n const handleNewSearch = useCallback(() => {\n clearParams();\n history.push('/');\n }, [clearParams, history]);\n\n const handleEditSearch = useCallback(() => {\n resetParams();\n history.push('/');\n }, [history, resetParams]);\n\n return (\n \n {intl.formatMessage({ id: 'results.title' })}\n \n \n }\n type=\"primary\"\n onClick={handleNewSearch}\n >\n {intl.formatMessage({ id: 'results.button.new' })}\n \n } onClick={handleEditSearch}>\n {intl.formatMessage({ id: 'results.button.modify' })}\n \n \n \n \n \n }\n type=\"primary\"\n shape=\"circle\"\n onClick={handleNewSearch}/>\n } shape=\"circle\" onClick={handleEditSearch}/>\n \n \n \n );\n};\n\nconst ResultsHeader: React.FC = () => {\n const intl = useIntl();\n const [resume, setResume] = useState(false);\n\n const {\n params,\n searchedTerms,\n removeTermFromSearch,\n editTermToSearch,\n } = useSearch();\n\n const handleScroll = useCallback(e => {\n if (window.pageYOffset > 100) {\n setResume(true);\n } else {\n setResume(false);\n }\n }, []);\n\n useEffect(() => {\n window.addEventListener('scroll', handleScroll);\n\n return function cleanupListener() {\n window.removeEventListener('resize', handleScroll);\n };\n }, [handleScroll]);\n\n const formatDate = useCallback((date: string) => {\n return date.split(' ')[0].split('-').reverse().join('/');\n }, []);\n\n return (\n \n }>\n \n {searchedTerms.map(term => (\n \n ))}\n {searchedTerms.length < 2 && (\n \n \n \n )}\n \n {!resume && (\n \n {intl.formatMessage({ id: 'results.date.subtitle' })}\n \n {`${formatDate(params.date.start)} - ${formatDate(\n params.date.end,\n )}`}\n \n \n )}\n \n \n );\n};\n\nexport default ResultsHeader;\n","import axios from 'axios';\n\nconst apiElasticsearch = axios.create({\n baseURL: process.env.REACT_APP_BM_URL,\n params: {\n Authorization:\n 'eyJhbGciOiJIUzI1NiJ9.eyJyZXF1ZXN0ZXIiOiJ0cmVuZHMiLCJpc3MiOiJidXp6LW1vbml0b3ItYXV0aCIsImlhdCI6MTYwMTkxMzUzOH0.yT3G3uQC3ANJHuEEpipZvOuW58IxLtbzCJwb-MPyFCE',\n },\n});\n\nexport default apiElasticsearch;\n","import React, { useMemo, memo } from 'react';\nimport { useIntl } from 'react-intl';\nimport ReactEcharts from 'echarts-for-react';\nimport numeral from 'numeral';\nimport TrendsLogo from 'assets/images/trends-logo.png';\nimport { sum } from 'lodash';\n\ninterface EvolutionChartProps {\n XAxis: string[];\n title: string;\n legend: string[];\n data: Array<{\n name: 'Facebook' | 'X' | 'Instagram' | 'Total';\n value: number[] | undefined;\n }>;\n}\n\nconst EvolutionChart: React.FC = ({\n data,\n title,\n legend,\n XAxis,\n}) => {\n const intl = useIntl();\n\n const colors: {\n [key in 'Facebook' | 'X' | 'Instagram' | 'Total']: string[];\n } = useMemo(\n () => ({\n Facebook: ['#C6D1E8', '#1877f2'],\n Instagram: ['#F0C0DE', '#CD2E92'],\n X: ['#CCCCCC', '#000000'],\n Total: ['#9a9a9a', '#444444'],\n }),\n [],\n );\n\n const magicTypeTranslations = useMemo(\n () => ({\n line: intl.formatMessage({ id: 'toolbox.line' }),\n bar: intl.formatMessage({ id: 'toolbox.bar' }),\n }),\n [intl],\n );\n const totalPosts = useMemo(() => {\n return new Intl.NumberFormat('pt-BR').format(\n data.reduce((acc, current) => {\n return acc + sum(current.value);\n }, 0),\n );\n }, [data]);\n\n return (\n {\n return e?.getEchartsInstance().setOption({\n baseOption: {\n title: {\n show: true,\n text: title\n ? `${title} - ${totalPosts} ${intl.formatMessage({\n id: 'results.representativeness.collected',\n })}`\n : '',\n textStyle: {\n fontSize: 16,\n },\n },\n textStyle: {\n fontFamily: 'Lato',\n },\n grid: {\n top: 42,\n left: 60,\n right: 20,\n bottom: 65,\n },\n legend: {\n data: legend,\n top: 22,\n },\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'shadow',\n },\n },\n graphic: {\n type: 'image',\n bottom: 0,\n left: 'center',\n right: 'center',\n style: {\n image: TrendsLogo,\n width: 244,\n height: 45,\n },\n },\n toolbox: {\n show: true,\n feature: {\n magicType: {\n show: true,\n type: ['line', 'bar'],\n title: magicTypeTranslations,\n option: {\n bar: {\n stack: 'social',\n },\n line: {\n stack: false,\n },\n },\n },\n saveAsImage: {\n show: true,\n title: intl.formatMessage({ id: 'toolbox.save' }),\n name: 'term_evolution_buzzmonitor',\n excludeComponents: ['toolbox', 'dataZoom'],\n },\n },\n },\n brush: {\n xAxisIndex: 'all',\n brushLink: 'all',\n outOfBrush: {\n colorAlpha: 0.1,\n },\n },\n dataZoom: [{ type: 'slider', backgroundColor: '#fff' }],\n xAxis: {\n data: XAxis,\n type: 'category',\n boundaryGap: false,\n axisLine: {\n show: false,\n },\n },\n yAxis: {\n type: 'value',\n axisLine: {\n show: false,\n },\n axisLabel: {\n formatter: (value: number) => numeral(value).format('0.[0]a'),\n },\n },\n series: data.map(item => ({\n data: item.value,\n name: item.name,\n type: 'line',\n stack: false,\n smooth: true,\n symbolSize: 6,\n lineStyle: {\n color: colors[item.name][1],\n width: 2,\n },\n areaStyle: {\n color: colors[item.name][0],\n opacity: 0.4,\n },\n itemStyle: { color: colors[item.name][1] },\n })),\n },\n media: [\n {\n query: { maxWidth: 500 },\n option: {\n toolbox: {\n show: false,\n },\n legend: {\n textStyle: {\n fontSize: 10,\n },\n },\n graphic: {},\n },\n },\n ],\n });\n }}\n option={{}}\n style={{ height: '400px', width: '100%' }}\n />\n );\n};\n\nconst comparisonFn = (\n prevProps: EvolutionChartProps,\n newProps: EvolutionChartProps,\n): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(EvolutionChart, comparisonFn);\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n margin-bottom: 20px;\n`;\n","import React, { useMemo } from 'react';\n\nimport { useIntl } from 'react-intl';\nimport { Metric } from 'hooks/search';\nimport { Empty } from 'antd';\nimport { map } from 'lodash';\nimport EvolutionChart from './EvolutionChart';\nimport { Container } from './styles';\n\ninterface Data {\n name: 'Instagram' | 'Facebook' | 'X' | 'Total';\n value: number[] | undefined;\n}\n\ninterface TermData {\n facebook: Metric[];\n twitter: Metric[];\n instagram: Metric[];\n}\n\ninterface TermEvolutionWrapperProps {\n title: string;\n data: TermData;\n total: boolean;\n}\n\nconst TermEvolutionWrapper: React.FC = ({\n data,\n title,\n total,\n}) => {\n const intl = useIntl();\n\n const dataByNetwork: Data[] = useMemo(\n () => [\n {\n name: 'Instagram',\n value: map(data.instagram, 'value'),\n },\n {\n name: 'Facebook',\n value: map(data.facebook, 'value'),\n },\n {\n name: 'X',\n value: map(data.twitter, 'value'),\n },\n ],\n [data],\n );\n\n const XAxis = useMemo(\n (): string[] =>\n Object.values(data)\n .find((arr: []) => arr.length > 0)\n .map((item: Metric) => {\n const label = item.label.slice(4, 8);\n return [label.slice(2, 4), label.slice(0, 2)].join('/');\n }),\n [data],\n );\n\n const totalValues: Data = useMemo(\n () => ({\n name: 'Total',\n value: XAxis.map(\n (_, index) =>\n (data.facebook ? data.facebook[index].value : 0) +\n (data.instagram ? data.instagram[index].value : 0) +\n (data.twitter ? data.twitter[index].value : 0),\n ),\n }),\n [XAxis, data],\n );\n\n const isDataValid = useMemo(() => {\n return (\n !!data.facebook?.find(metric => metric.value !== 0) ||\n !!data.instagram?.find(metric => metric.value !== 0) ||\n !!data.twitter?.find(metric => metric.value !== 0)\n );\n }, [data]);\n\n return (\n \n {data && isDataValid ? (\n <>\n {total ? (\n \n ) : (\n \n )}\n >\n ) : (\n \n )}\n \n );\n};\n\nexport default TermEvolutionWrapper;\n","import styled from 'styled-components';\n\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: terms;\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n div.ant-skeleton-header {\n padding: 0;\n }\n @media (max-width: 650px) {\n div.ant-card-body {\n padding: 8px;\n }\n }\n`;\n","import ReactEcharts from 'echarts-for-react';\nimport React, { useMemo } from 'react';\nimport { useIntl } from 'react-intl';\n\ntype TotalBuzzChartProps = {\n data: {\n perItem: Array<{ item: string; totalPerItem: number }>;\n total: number;\n };\n title?: string;\n width?: string;\n height?: string;\n};\n\nconst TotalBuzzChart: React.FC = ({\n data,\n title = '',\n width = '100%',\n height = '300px',\n}) => {\n const intl = useIntl();\n\n const formattedData = useMemo(\n () =>\n data && data.perItem.length > 0\n ? data.perItem.map(item => {\n return {\n name: item.item,\n value: item.totalPerItem,\n // itemStyle: { color: colors(sentiment.label) },\n };\n })\n : [],\n [data],\n );\n\n return (\n \n );\n};\n\nexport default TotalBuzzChart;\n","import React, { useEffect, useState, useCallback } from 'react';\n\nimport { useIntl } from 'react-intl';\nimport { useSearch, Metric, Params } from 'hooks/search';\nimport { Select, Skeleton } from 'antd';\nimport elasticsearchApi from 'services/elasticsearchApi';\nimport { sum, map, difference } from 'lodash';\nimport SectionTitle from 'components/SectionTitle';\nimport TermEvolutionWrapper from './TermEvolutionWrapper';\nimport { Container } from './styles';\nimport TotalBuzzChart from './TotalBuzzChart';\n\ninterface TermData {\n facebook: Metric[];\n twitter: Metric[];\n instagram: Metric[];\n totalPosts: number;\n}\n\nconst TermEvolutionContainer: React.FC = () => {\n const intl = useIntl();\n const { queryBuilder, params, searchedTerms, comparisonTerms } = useSearch();\n const [loading, setLoading] = useState(false);\n const [totalPosts, setTotalPosts] = useState(0);\n const [paramsDatas, setParamsDatas] = useState>(\n new Map(),\n );\n const [total, setTotal] = useState(false);\n\n const [totalBuzz, setTotalBuzz] = useState<{\n perItem: Array<{ item: string; totalPerItem: number }>;\n total: number;\n }>({ perItem: [], total: 0 });\n\n useEffect(() => {\n if (searchedTerms.length < paramsDatas.size) {\n const keyToRemove = difference(\n Array.from(paramsDatas.keys()),\n map(searchedTerms, 'obligatory'),\n );\n setParamsDatas(prevDatas => {\n prevDatas.delete(keyToRemove?.[0]);\n return new Map(prevDatas);\n });\n }\n }, [paramsDatas, searchedTerms]);\n\n /*\n Updates the totalPosts state when paramDatas changes.\n */\n useEffect(() => {\n if (paramsDatas.size > 1) {\n const totals = searchedTerms.map(term => {\n const item = term.obligatory;\n const totalPerItem = paramsDatas.get(item)?.totalPosts || 0;\n return {\n item,\n totalPerItem,\n };\n });\n\n const totalSum = totals.reduce(\n (prev, acc) => prev + (acc.totalPerItem || 0),\n 0,\n );\n setTotalBuzz({\n perItem: [...totals],\n total: totalSum,\n });\n }\n }, [paramsDatas, searchedTerms]);\n\n useEffect(() => {\n const allPosts =\n sum(Array.from(paramsDatas).map(([key, value]) => value.totalPosts)) || 0;\n setTotalPosts(allPosts);\n }, [paramsDatas]);\n\n const apiRequest = useCallback(\n async (term: Params) => {\n setLoading(true);\n await Promise.all([\n elasticsearchApi\n .post<{ data: Metric[] }>(\n '/historical_volume.json',\n queryBuilder({\n service: ['facebook'],\n grouping: 'period_daily',\n customParams: { ...term },\n }),\n )\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n return response.data.data;\n }\n return [];\n }),\n elasticsearchApi\n .post<{ data: Metric[] }>(\n '/historical_volume.json',\n queryBuilder({\n service: ['instagram'],\n grouping: 'period_daily',\n customParams: { ...term },\n }),\n )\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n return response.data.data;\n }\n return [];\n }),\n elasticsearchApi\n .post<{ data: Metric[] }>(\n '/historical_volume.json',\n queryBuilder({\n service: ['twitter'],\n grouping: 'period_daily',\n customParams: { ...term },\n }),\n )\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n return response.data.data;\n }\n return [];\n }),\n ])\n .then(([facebook, instagram, twitter]) => {\n const allPosts =\n sum(map(facebook, 'value')) +\n sum(map(instagram, 'value')) +\n sum(map(twitter, 'value'));\n setParamsDatas(\n prevDatas =>\n new Map(\n prevDatas.set(term.obligatory, {\n facebook,\n twitter,\n instagram,\n totalPosts: allPosts,\n }),\n ),\n );\n })\n .finally(() => setLoading(false));\n },\n [queryBuilder],\n );\n\n /*\n Searches for the term set in the params.\n */\n const requestData = useCallback(() => {\n if (params.obligatory || params.optional || params.banned) {\n apiRequest(params);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [params]);\n\n /*\n Calls requestData method always when it gets updated, which means that\n always when params changes requestData is called.\n */\n useEffect(() => {\n requestData();\n }, [requestData]);\n\n const validateTermData = useCallback((value: TermData): boolean => {\n if (\n !(value.facebook.length > 0) ||\n !(value.twitter.length > 0) ||\n !(value.instagram.length > 0)\n ) {\n return false;\n }\n return true;\n }, []);\n\n /*\n This effect is used to search for the comparison terms when the page is\n loaded for the first time.\n */\n useEffect(() => {\n if (comparisonTerms.length > 0) {\n comparisonTerms.forEach(term => {\n apiRequest(term);\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [comparisonTerms]);\n\n return (\n <>\n {paramsDatas.size > 1 && (\n \n \n Total Buzz\n {/* {intl.formatMessage({ id: 'results.evolution' })} */}\n \n ,\n ]}\n >\n \n \n )}\n \n \n {intl.formatMessage({ id: 'results.evolution' })}\n \n \n {paramsDatas.size > 1\n ? ''\n : `${new Intl.NumberFormat('pt-BR').format(totalPosts)} posts`}\n \n ,\n ]}\n >\n {totalPosts > 0 && (\n setTotal(!!e)}\n defaultValue={0}\n bordered={false}\n style={{ width: '100%' }}\n >\n \n {intl.formatMessage({ id: 'terms-evolution.all' })}\n \n \n {intl.formatMessage({ id: 'terms-evolution.social' })}\n \n \n )}\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key) as TermData;\n return value ? (\n \n {value && validateTermData(value) && (\n \n )}\n \n ) : null;\n })}\n \n \n >\n );\n};\n\nexport default TermEvolutionContainer;\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSearch, Metric, Params, QueryBuilderData } from 'hooks/search';\nimport { difference, map } from 'lodash';\nimport elasticsearchApi from 'services/elasticsearchApi';\n\nexport default function useDefaultChartsContainer(\n requestURL: string,\n requestBody: QueryBuilderData,\n): {\n paramsDatas: Map;\n loading: boolean;\n searchedTerms: Params[];\n} {\n const { queryBuilder, params, searchedTerms, comparisonTerms } = useSearch();\n const [loading, setLoading] = useState(false);\n const [paramsDatas, setParamsDatas] = useState>(\n new Map(),\n );\n\n /*\n Checks if some term was removed from searchedTerms and remove its data from \n paramsDatas, thereby removing the chart of term.\n */\n useEffect(() => {\n if (searchedTerms.length < paramsDatas.size) {\n const keyToRemove = difference(\n Array.from(paramsDatas.keys()),\n map(searchedTerms, 'obligatory'),\n );\n setParamsDatas(prevDatas => {\n prevDatas.delete(keyToRemove?.[0]);\n return new Map(prevDatas);\n });\n }\n }, [paramsDatas, searchedTerms]);\n\n const apiRequest = useCallback(\n async (url, body) => {\n setLoading(true);\n const term = body.customParams\n ? body.customParams.obligatory\n : params.obligatory;\n await elasticsearchApi\n .post<{ data: Metric[] }>(url, queryBuilder(body))\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n setParamsDatas(\n prevDatas =>\n new Map(prevDatas.set(term, [...response.data.data])),\n );\n } else {\n setParamsDatas(prevDatas => new Map(prevDatas.set(term, [])));\n }\n })\n .finally(() => setLoading(false));\n },\n [params.obligatory, queryBuilder],\n );\n\n /*\n Searches for the term set in the params.\n */\n const requestData = useCallback(() => {\n if (params.obligatory || params.optional || params.banned) {\n apiRequest(requestURL, requestBody);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [params]);\n\n /*\n Calls requestData method always when it gets updated, which means that \n always when params changes requestData is called.\n */\n useEffect(() => {\n requestData();\n }, [requestData]);\n\n /*\n This effect is used to search for the comparison terms when the page is \n loaded for the first time.\n */\n useEffect(() => {\n if (comparisonTerms.length > 0) {\n comparisonTerms.forEach(term => {\n apiRequest(requestURL, { ...requestBody, customParams: term });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [comparisonTerms]);\n\n return { paramsDatas, loading, searchedTerms };\n}\n","import styled from 'styled-components';\n\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: shares;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n display: grid;\n place-items: center;\n }\n div.echarts-for-react {\n width: 100%;\n display: grid;\n place-items: center;\n\n @media (max-width: 970px) {\n height: 600px !important;\n canvas,\n div {\n height: 600px;\n }\n }\n @media (max-width: 800px) {\n height: 900px !important;\n canvas,\n div {\n height: 900px;\n }\n }\n }\n div.ant-col {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n }\n`;\n","import React, { useMemo, useCallback, memo } from 'react';\nimport ReactEcharts from 'echarts-for-react';\nimport { useIntl } from 'react-intl';\nimport { Metric } from 'hooks/search';\nimport { Empty, Col, Row } from 'antd';\nimport { uuid } from 'uuidv4';\n\ninterface SharingByNetworkChartProps {\n data: Metric[];\n title?: string;\n}\n\nconst SharingByNetworkChart: React.FC = ({\n data,\n title = '',\n}) => {\n const intl = useIntl();\n\n const colors = useCallback((color: string): string[] => {\n switch (color) {\n case 'facebook':\n return ['#C6D1E8', '#1877f2'];\n case 'instagram':\n return ['#F0C0DE', '#CD2E92'];\n case 'x':\n return ['#CCCCCC', '#000000'];\n default: {\n return ['#e8e8e8', '#666666'];\n }\n }\n }, []);\n\n const totalValue = useMemo(\n () => (data ? data.reduce((prev, current) => prev + current.value, 0) : 0),\n [data],\n );\n\n const formattedData: Array<{\n name: 'facebook' | 'instagram' | 'x';\n value: number;\n }> = useMemo(\n () =>\n data\n ? data\n .map(\n service =>\n ({\n name: (service.label === 'twitter') ? \"x\" : service.label,\n value: service.value,\n } as {\n name: 'facebook' | 'instagram' | 'x';\n value: number;\n }),\n )\n .sort((a, b) => {\n return a.name.localeCompare(b.name);\n })\n : [],\n [data],\n );\n\n return (\n \n \n {formattedData.length > 0 ? (\n {\n return e?.getEchartsInstance().setOption({\n baseOption: {\n tooltip: {\n trigger: 'item',\n formatter: '{d}%',\n },\n title: {\n textStyle: {\n fontSize: 16,\n },\n },\n textStyle: {\n fontFamily: 'Lato',\n },\n toolbox: {\n show: true,\n right: 0,\n feature: {\n saveAsImage: {\n show: true,\n title: intl.formatMessage({ id: 'toolbox.save' }),\n name: 'shares_by_network',\n excludeComponents: ['toolbox'],\n },\n },\n },\n series: formattedData.map((item, index) => ({\n type: 'pie',\n\n avoidLabelOverlap: true,\n seriesLayoutBy: 'column',\n name: item.name,\n data: [\n {\n value: totalValue - item.value,\n itemStyle: {\n color: colors(item.name)[0],\n },\n label: {\n show: true,\n position: 'center',\n rich: {\n total: {\n padding: [-275, 0, 0, 0],\n height: 300,\n fontSize: 17,\n lineHeight: 17,\n color: colors(item.name)[1],\n },\n },\n formatter: () => {\n return `{total|${new Intl.NumberFormat(\n 'pt-BR',\n ).format(item.value)} ${intl.formatMessage({\n id: 'results.representativeness.collected',\n })}}`;\n },\n },\n },\n {\n ...item,\n itemStyle: {\n color: colors(item.name)[1],\n },\n verticalAlign: 'bottom',\n label: {\n show: true,\n position: 'center',\n fontSize: 18,\n lineHeight: 24,\n fontWeight: 'bold',\n formatter: (dataFormat: {\n name: string;\n percent: number;\n }) => {\n return `${\n dataFormat.name.charAt(0).toUpperCase() +\n dataFormat.name.slice(1)\n }\\n${dataFormat.percent} %`;\n },\n },\n },\n ],\n })),\n },\n media: [\n {\n query: { maxWidth: 1500 },\n option: {\n series: [\n {\n type: 'pie',\n radius: ['45%', '70%'],\n center: [`${(1 / 6) * 100}%`, '45%'],\n },\n {\n type: 'pie',\n radius: ['45%', '70%'],\n center: [`${(3 / 6) * 100}%`, '45%'],\n },\n {\n type: 'pie',\n radius: ['45%', '70%'],\n center: [`${(5 / 6) * 100}%`, '45%'],\n },\n ],\n },\n },\n {\n query: { maxWidth: 880 },\n option: {\n tooltip: {\n show: false,\n },\n series: [\n {\n type: 'pie',\n center: [`25%`, '25%'],\n radius: ['20%', '35%'],\n },\n {\n type: 'pie',\n center: [`75%`, '25%'],\n radius: ['20%', '35%'],\n },\n {\n type: 'pie',\n center: [`50%`, '75%'],\n radius: ['20%', '35%'],\n },\n ],\n },\n },\n {\n query: { maxWidth: 720 },\n option: {\n series: [\n {\n type: 'pie',\n center: ['50%', `${(1 / 6) * 100}%`],\n radius: ['80px', '120px'],\n },\n {\n type: 'pie',\n center: ['50%', `${(3 / 6) * 100}%`],\n radius: ['80px', '120px'],\n },\n {\n type: 'pie',\n center: ['50%', `${(5 / 6) * 100}%`],\n radius: ['80px', '120px'],\n },\n ],\n },\n },\n {\n query: { maxWidth: 400 },\n option: {\n series: [\n {\n type: 'pie',\n center: ['50%', `${(1 / 6) * 100}%`],\n radius: ['38%', '58%'],\n },\n {\n type: 'pie',\n center: ['50%', `${(3 / 6) * 100}%`],\n radius: ['38%', '58%'],\n },\n {\n type: 'pie',\n center: ['50%', `${(5 / 6) * 100}%`],\n radius: ['38%', '58%'],\n },\n ],\n },\n },\n ],\n });\n }}\n option={{\n title: {\n show: true,\n text: title,\n },\n }}\n />\n ) : (\n \n )}\n \n \n );\n};\n\nconst comparisonFn = (\n prevProps: SharingByNetworkChartProps,\n newProps: SharingByNetworkChartProps,\n): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(SharingByNetworkChart, comparisonFn);\n","import React from 'react';\nimport { useIntl } from 'react-intl';\nimport { Skeleton } from 'antd';\nimport SectionTitle from 'components/SectionTitle';\nimport { Metric } from 'hooks/search';\nimport useDefaultChartsContainer from 'hooks/defaultChartsContainer';\nimport { Container } from './styles';\nimport SharingByNetworkChart from './SharingByNetworkChart';\n\nconst SharingByNetwork: React.FC = () => {\n const intl = useIntl();\n const { paramsDatas, loading, searchedTerms } = useDefaultChartsContainer(\n '/historical_volume.json',\n {\n grouping: 'service',\n },\n );\n\n return (\n \n {intl.formatMessage({ id: 'results.representativeness' })}\n \n }\n >\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key) as Metric[];\n return value ? (\n \n ) : null;\n })}\n \n \n );\n};\n\nexport default SharingByNetwork;\n","import styled from 'styled-components';\n\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: gender;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n display: grid;\n place-items: center;\n }\n }\n`;\n\nexport const ChartsContainer = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n align-items: center;\n gap: 20px;\n\n @media (max-width: 600px) {\n grid-template-columns: 1fr;\n }\n`;\n","import React, { useMemo, useCallback, memo } from 'react';\nimport ReactEcharts from 'echarts-for-react';\nimport { useIntl } from 'react-intl';\nimport { Metric } from 'hooks/search';\nimport { Empty } from 'antd';\n\ninterface SentimentChartProps {\n data: Metric[];\n title?: string;\n width?: string;\n height?: string;\n}\n\nconst SentimentChart: React.FC = ({\n data,\n title = '',\n width = '100%',\n height = '300px',\n}) => {\n const intl = useIntl();\n\n const colors = useCallback((key: string) => {\n switch (key) {\n case 'positive':\n return '#73ca72';\n case 'negative':\n return '#de413a';\n case 'neutral':\n return '#e5ed33';\n default:\n return '#666';\n }\n }, []);\n\n const formattedData = useMemo(\n () =>\n data && data.length > 0\n ? data.map(sentiment => {\n return {\n name: intl.formatMessage({\n id: `results.sentiment.${sentiment.label.toLowerCase()}`,\n }),\n value: sentiment.value,\n itemStyle: { color: colors(sentiment.label) },\n };\n })\n : [],\n [data, intl, colors],\n );\n return (\n <>\n {formattedData.length > 0 &&\n (formattedData[0]?.value !== 0 ||\n formattedData[1]?.value !== 0 ||\n formattedData[2]?.value !== 0) ? (\n \n ) : (\n \n )}\n >\n );\n};\n\nconst comparisonFn = (\n prevProps: SentimentChartProps,\n newProps: SentimentChartProps,\n): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(SentimentChart, comparisonFn);\n","import React, { useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Skeleton } from 'antd';\nimport SectionTitle from 'components/SectionTitle';\nimport { Metric } from 'hooks/search';\nimport useDefaultChartsContainer from 'hooks/defaultChartsContainer';\nimport { Container, ChartsContainer } from './styles';\nimport SentimentChart from './SentimentChart';\n\nconst SentimentContainer: React.FC = () => {\n const intl = useIntl();\n const { paramsDatas, loading, searchedTerms } = useDefaultChartsContainer(\n '/historical_volume.json',\n {\n service: ['facebook', 'instagram', 'twitter'],\n grouping: 'sentiment',\n },\n );\n\n const ContainerBody = useCallback(props => {\n if (props.numberOfCharts && props.numberOfCharts > 1) {\n return {props.children};\n }\n return <>{props.children}>;\n }, []);\n\n return (\n \n {intl.formatMessage({ id: 'results.sentiment' })}\n \n }\n >\n \n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key) as Metric[];\n return value ? (\n 1 ? '250px' : undefined}\n width={paramsDatas.size > 1 ? '100%' : undefined}\n />\n ) : null;\n })}\n 1 ? 180 : 250,\n }}\n />\n \n \n );\n};\n\nexport default SentimentContainer;\n","import React, { useMemo, useCallback, memo } from 'react';\nimport ReactEcharts from 'echarts-for-react';\nimport { useIntl } from 'react-intl';\nimport { Metric } from 'hooks/search';\nimport { Empty } from 'antd';\n\ninterface GenderChartProps {\n data: Metric[];\n title?: string;\n width?: string;\n height?: string;\n}\n\nconst GenderChart: React.FC = ({\n data,\n title = '',\n width = '100%',\n height = '300px',\n}) => {\n const intl = useIntl();\n\n const colors = useCallback((key: string) => {\n switch (key) {\n case 'FEMALE':\n return '#FFCAFF';\n case 'MALE':\n return '#92C8F9';\n default:\n return '#666';\n }\n }, []);\n\n const formattedData = useMemo(() => {\n return data && data.length > 0\n ? data\n .filter(\n gender => gender.label === 'MALE' || gender.label === 'FEMALE',\n )\n .map(gender => ({\n name: intl.formatMessage({\n id: `results.gender.${gender.label.toLowerCase()}`,\n }),\n value: gender.value,\n itemStyle: { color: colors(gender.label) },\n }))\n : [];\n }, [colors, data, intl]);\n\n return (\n <>\n {formattedData.length > 0 &&\n (formattedData[0]?.value !== 0 || formattedData[1]?.value !== 0) ? (\n \n ) : (\n \n )}\n >\n );\n};\n\nconst comparisonFn = (\n prevProps: GenderChartProps,\n newProps: GenderChartProps,\n): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(GenderChart, comparisonFn);\n","import styled from 'styled-components';\n\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: gender;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n display: grid;\n place-items: center;\n }\n }\n`;\n\nexport const ChartsContainer = styled.div`\n display: grid;\n grid-template-columns: 1fr 1fr;\n align-items: center;\n gap: 20px;\n\n @media (max-width: 600px) {\n grid-template-columns: 1fr;\n }\n`;\n","import React, { useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Skeleton } from 'antd';\nimport SectionTitle from 'components/SectionTitle';\nimport { Metric } from 'hooks/search';\nimport useDefaultChartsContainer from 'hooks/defaultChartsContainer';\nimport GenderChart from './GenderChart';\nimport { Container, ChartsContainer } from './styles';\n\nconst GenderContainer: React.FC = () => {\n const intl = useIntl();\n const { paramsDatas, loading, searchedTerms } = useDefaultChartsContainer(\n '/historical_volume.json',\n {\n grouping: 'gender',\n },\n );\n\n const ContainerBody = useCallback(props => {\n if (props.numberOfCharts && props.numberOfCharts > 1) {\n return {props.children};\n }\n return <>{props.children}>;\n }, []);\n\n return (\n \n {intl.formatMessage({ id: 'results.gender' })}\n \n }\n >\n \n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key) as Metric[];\n return value ? (\n 1 ? '250px' : undefined}\n width={paramsDatas.size > 1 ? '100%' : undefined}\n />\n ) : null;\n })}\n 1 ? 180 : 250,\n }}\n />\n \n \n );\n};\n\nexport default GenderContainer;\n","export default (date: string): string => {\n const formatted = date.match(/.{1,2}/g);\n if (!formatted) return '';\n return `${formatted[3]}/${formatted[2]}/${formatted[1] + formatted[0]} ${\n formatted[4]\n }:${formatted[5]}`;\n};\n","import React, { useCallback } from 'react';\nimport Modal, { ModalProps } from 'antd/lib/modal';\nimport { useIntl } from 'react-intl';\nimport { useSearch, IPost } from 'hooks/search';\nimport apiElasticsearch from 'services/elasticsearchApi';\nimport { saveAs } from 'file-saver';\nimport XLSX from 'xlsx';\nimport numeral from 'numeral';\nimport { Form, Radio, Slider, Button } from 'antd';\nimport formatStringDate from 'utils/formatStringDate';\n\ninterface Props extends ModalProps {\n service: 'facebook' | 'instagram' | 'twitter';\n}\n\nconst DownloadModal: React.FC = ({ service, ...rest }) => {\n const intl = useIntl();\n const { queryBuilder, searchedTerms } = useSearch();\n\n const handleSubmit = useCallback(\n async values => {\n const response = await apiElasticsearch.post<{ data: IPost[] }>(\n '/historical_posts.json',\n queryBuilder({\n service: [service],\n sort_by: 'top_posts_field',\n size: values.quantity,\n customParams: searchedTerms[0],\n }),\n );\n\n const parsed_data = response.data.data.map(post => [\n post.post_id || 'N/A',\n post.author.profile ||\n post.user_login ||\n post.author.screenname ||\n 'N/A',\n post.url || 'N/A',\n formatStringDate(post.date) || 'N/A',\n numeral(post.likes).format('0.0a') || 'N/A',\n numeral(post.shares).format('0.0a') || 'N/A',\n numeral(post.comments_amounts).format('0.0a') || 'N/A',\n post.content || 'N/A',\n post.service || 'N/A',\n post.sentiment || 'N/A',\n post.engagement?.toFixed(3) || 'N/A',\n ]);\n const columns = [\n 'ID',\n 'AUTHOR',\n 'URL',\n 'DATE',\n 'LIKES',\n 'SHARES',\n 'COMMENTS',\n 'CONTENT',\n 'SERVICE',\n 'SENTIMENT',\n 'ENGAGEMENT',\n ];\n const sheetArrays = [columns, ...parsed_data];\n\n const SheetName = `${service} Trending ${new Date()\n .toLocaleDateString()\n .split('/')\n .join(' ')}`;\n const sheet = XLSX.utils.aoa_to_sheet(sheetArrays);\n if (values.format === 'csv') {\n const csvSheet = XLSX.utils.sheet_to_csv(sheet);\n const blob = new Blob([csvSheet], { type: 'text/csv' });\n return saveAs(blob, `${SheetName.split(' ').join('_')}.csv`);\n }\n const workbook = XLSX.utils.book_new();\n workbook.Props = {\n Title: SheetName,\n Subject: 'Trendig Topics',\n Author: 'Buzzmonitor',\n CreatedDate: new Date(),\n };\n\n workbook.SheetNames.push(SheetName);\n workbook.Sheets[SheetName] = sheet;\n return XLSX.writeFile(\n workbook,\n `${SheetName.split(' ').join('_')}.xlsx`,\n {\n bookType: 'xlsx',\n type: 'binary',\n },\n );\n },\n [queryBuilder, searchedTerms, service],\n );\n\n return (\n >}\n {...rest}\n >\n \n \n \n CSV\n XLSX\n \n \n \n \n \n \n {intl.formatMessage({ id: 'downloadposts.button' })}\n \n \n \n );\n};\n\nexport default DownloadModal;\n","/* eslint-disable no-underscore-dangle */\nimport React, { useState, useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useAuth } from 'hooks/auth';\nimport { useSearch } from 'hooks/search';\nimport Axios from 'axios';\nimport { Form, Modal, Select, Slider, Result } from 'antd';\nimport { ModalProps } from 'antd/lib/modal';\n\ninterface Props extends ModalProps {\n service: 'facebook' | 'instagram' | 'twitter';\n maxImportNumber?: number;\n}\n\nconst ImportModal: React.FC = ({\n service,\n maxImportNumber = 60000,\n ...rest\n}) => {\n const intl = useIntl();\n const [form] = Form.useForm();\n const { user } = useAuth();\n const { queryBuilder, searchedTerms } = useSearch();\n\n const [success, setSuccess] = useState(false);\n const handleSubmit = useCallback(\n values => {\n const requestObj = {\n master_email: user.email,\n master_id: user._id,\n locale: user.language,\n export_type: 'historical_posts',\n posts_params: JSON.stringify(\n queryBuilder({\n service: [service],\n sort_by: 'top_posts_field',\n customParams: searchedTerms[0],\n }),\n ),\n user_tags: [],\n max_posts: values.quantity || 1,\n brand_name: values.brand,\n brand_searchable: values.brand,\n token:\n 'buGP3p565P9n89p40kFnp1mnGgHyNS4b8T1Eofhw2dQ2UI3MIo5M3Q6L45euTEIv',\n };\n return Axios.post(\n `${process.env.REACT_APP_BM_EXPORTER}bm_historical`,\n requestObj,\n ).then(() => setSuccess(true));\n },\n [queryBuilder, searchedTerms, service, user._id, user.email, user.language],\n );\n\n const formValidation = useCallback(() => {\n form.validateFields().then(values => handleSubmit(values));\n }, [form, handleSubmit]);\n\n const resetState = () => {\n setSuccess(false)\n }\n\n if (success) {\n return (\n >}\n >\n \n \n );\n }\n\n return (\n \n \n \n {user.brands && (\n \n {user.brands.map(option => (\n \n {option.name}\n \n ))}\n \n )}\n \n \n \n \n \n \n );\n};\n\nexport default ImportModal;\n","import { useState, useEffect, useCallback } from 'react';\nimport { useSearch, Params, QueryBuilderData, IPost } from 'hooks/search';\nimport { difference, map } from 'lodash';\nimport elasticsearchApi from 'services/elasticsearchApi';\n\nexport default function usePostsContainer(\n requestURL: string,\n requestBody: QueryBuilderData,\n): {\n paramsDatas: Map;\n loading: boolean;\n searchedTerms: Params[];\n maxImport: number;\n} {\n const { queryBuilder, params, searchedTerms, comparisonTerms } = useSearch();\n const [loading, setLoading] = useState(false);\n const [paramsDatas, setParamsDatas] = useState>(\n new Map(),\n );\n const [maxImport, setMaxImport] = useState(0);\n\n /*\n Check if some term was removed from searchedTerms and remove its data from \n paramsDatas, removing the post container of term.\n */\n useEffect(() => {\n if (searchedTerms.length < paramsDatas.size) {\n const keyToRemove = difference(\n Array.from(paramsDatas.keys()),\n map(searchedTerms, 'obligatory'),\n );\n setParamsDatas(prevDatas => {\n prevDatas.delete(keyToRemove?.[0]);\n return new Map(prevDatas);\n });\n }\n }, [paramsDatas, searchedTerms]);\n\n const apiRequest = useCallback(\n async (url, body) => {\n setLoading(true);\n const term = body.customParams\n ? body.customParams.obligatory\n : params.obligatory;\n await elasticsearchApi\n .post<{ data: IPost[]; count: number }>(url, queryBuilder(body))\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n if (searchedTerms.length === 1) {\n setMaxImport(response.data.count);\n }\n setParamsDatas(\n prevDatas =>\n new Map(prevDatas.set(term, [...response.data.data])),\n );\n } else {\n setParamsDatas(prevDatas => new Map(prevDatas.set(term, [])));\n }\n })\n .finally(() => setLoading(false));\n },\n [params.obligatory, queryBuilder, searchedTerms.length],\n );\n\n /*\n Searches for the term set in the params.\n */\n const requestData = useCallback(() => {\n if (params.obligatory || params.optional || params.banned) {\n apiRequest(requestURL, requestBody);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [params]);\n\n /*\n Calls requestData method always when it gets updated, which means that \n always when params changes requestData is called.\n */\n useEffect(() => {\n requestData();\n }, [requestData]);\n\n /*\n This effect is used to search for the comparison terms when the page is \n loaded for the first time.\n */\n useEffect(() => {\n if (comparisonTerms.length > 0) {\n comparisonTerms.forEach(term => {\n apiRequest(requestURL, { ...requestBody, customParams: term });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [comparisonTerms]);\n\n return { paramsDatas, loading, searchedTerms, maxImport };\n}\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: topPostFB;\n border-top: 4px solid #1877f2 !important;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n }\n button {\n margin-top: 16px;\n color: #1877f2;\n border-color: #1877f2;\n }\n }\n`;\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n h4 {\n margin-right: auto;\n }\n img {\n height: 32px;\n width: 32px;\n margin-right: 16px;\n }\n svg {\n color: #1877f2;\n height: 32px;\n width: 32px;\n }\n`;\n","import styled from 'styled-components';\nimport BrokenLink from 'assets/images/broken-link.png';\n\nexport const Container = styled.div<{ color: string }>`\n color: ${props => props.color};\n`;\n\nexport const Content = styled.a<{ full?: boolean }>`\n display: grid;\n grid-template-columns: repeat(1fr);\n text-decoration: none;\n color: #494949;\n span#date {\n color: #999;\n margin-bottom: 5px;\n font-size: 0.73rem;\n }\n p {\n margin-top: 8px;\n height: ${props => (props.full ? '100%' : '3.6rem')};\n overflow: hidden;\n line-break: loose;\n }\n :hover {\n color: inherit;\n p {\n filter: brightness(70%);\n }\n }\n`;\n\nexport const PostImage = styled.div<{ url?: string; full?: boolean }>`\n background-image: url(${props => props.url || BrokenLink}), url(${BrokenLink});\n background-position: center center;\n background-size: cover;\n\n width: 100%;\n height: ${props => (props.full ? '352px' : '251.5px')};\n border-radius: 4px;\n`;\n\nexport const PostVideo = styled.div<{ full?: boolean }>`\n height: ${props => (props.full ? '352px' : '251.5px')};\n width: auto;\n object-fit: cover;\n overflow: hidden;\n display: grid;\n place-items: center;\n overflow: hidden;\n video {\n object-fit: cover;\n border-radius: 4px;\n height: 100%;\n width: 100%;\n }\n`;\n\nexport const Title = styled.div`\n display: flex;\n flex-direction: column;\n a {\n line-height: 20px;\n overflow: hidden;\n font-weight: bold;\n color: inherit;\n }\n`;\n\nexport const Metrics = styled.div`\n display: flex;\n flex-direction: column;\n div {\n display: flex;\n justify-content: space-between;\n padding: 4px;\n border-top: 1px solid #e8e8e8;\n svg {\n margin-right: 8px;\n }\n p {\n margin: 0;\n color: #494949;\n }\n }\n`;\n","/* eslint-disable jsx-a11y/media-has-caption */\nimport React, { useMemo } from 'react';\nimport { IPost } from 'hooks/search';\nimport numeral from 'numeral';\nimport {\n LikeOutlined,\n MessageOutlined,\n LinkOutlined,\n RiseOutlined,\n UserOutlined,\n UsergroupAddOutlined,\n} from '@ant-design/icons';\n\nimport { useIntl } from 'react-intl';\nimport { Button } from 'antd';\nimport { uuid } from 'uuidv4';\nimport {\n Container,\n Title,\n Content,\n Metrics,\n PostImage,\n PostVideo,\n} from './style';\n\ninterface Props {\n data: IPost;\n seeFullPost?: () => void;\n index?: number;\n full?: boolean;\n}\n\nconst Post: React.FC = ({ data, seeFullPost, index, full }) => {\n const intl = useIntl();\n const { author } = data;\n\n const dateFormatted = useMemo(() => {\n const formatted = data.date.match(/.{1,2}/g);\n if (formatted) {\n return `${formatted[4]}:${formatted[5]} ${formatted[3]}/${formatted[2]}/${\n formatted[0] + formatted[1]\n } `;\n }\n return '';\n }, [data.date]);\n\n const metrics = useMemo(() => {\n switch (data.service) {\n case 'facebook': {\n const { likes, reactions, comments_amounts, shares } = data;\n const sum =\n (likes || 0) +\n (reactions || 0) +\n (comments_amounts || 0) +\n (shares || 0);\n return [\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.interactions' }),\n value: numeral(sum).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.likes' }),\n value: numeral(likes).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.comments' }),\n value: numeral(comments_amounts).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.shares' }),\n value: numeral(shares).format('0.[0]a').toUpperCase(),\n },\n ];\n }\n case 'instagram': {\n const { likes, reactions, comments_amounts, shares } = data;\n const sum =\n (likes || 0) +\n (reactions || 0) +\n (comments_amounts || 0) +\n (shares || 0);\n return [\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.interactions' }),\n value: numeral(sum).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.likes' }),\n value: numeral(likes).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.comments' }),\n value: numeral(comments_amounts).format('0.[0]a').toUpperCase(),\n },\n ];\n }\n case 'twitter': {\n const { likes, rts, impressions } = data;\n const sum =\n (likes || 0) +\n (rts || 0) +\n (impressions || 0);\n return [\n {\n icon: ,\n name: intl.formatMessage({ id: 'posts.interactions' }),\n value: numeral(sum).format('0.[0]a').toUpperCase(),\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'twitter.author' }),\n value: `@${data.author.screenname}`,\n },\n {\n icon: ,\n name: intl.formatMessage({ id: 'twitter.followers' }),\n value: numeral(data.author.followers)\n .format('0.[0]a')\n .toUpperCase(),\n },\n {\n icon: ,\n name: 'Posts',\n value: numeral(data.author.tweets).format('0.[0]a').toUpperCase(),\n },\n ];\n }\n default: {\n return [];\n }\n }\n }, [data, intl]);\n\n const color = useMemo(() => {\n switch (data.service) {\n case 'facebook':\n return '#1877f2';\n case 'instagram':\n return '#cd2e92';\n case 'twitter':\n return 'black';\n default: {\n return '#666';\n }\n }\n }, [data.service]);\n\n return (\n \n \n \n {`${index ? `${index}. ` : ''}${\n author.name ||\n (data.service === 'instagram'\n ? intl.formatMessage({ id: 'posts.hashtags' })\n : '')\n }`}\n \n \n \n {dateFormatted}\n {data.picture_full_size && data?.picture_full_size?.match('video') ? (\n \n \n \n \n \n ) : (\n \n )}\n {data.content}\n \n {!full && (\n \n {intl.formatMessage({ id: 'posts.button.seemore' })}\n \n )}\n \n {metrics.map(metric => (\n \n \n {metric.icon}\n {metric.name}\n \n {metric.value}\n \n ))}\n \n \n );\n};\n\nexport default Post;\n","import styled from 'styled-components';\n\nexport const Container = styled.div``;\n","import React, { useState, useCallback, useEffect, memo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { IPost } from 'hooks/search';\nimport Post from 'components/Post';\nimport { Button, Row, Col, Empty, Modal } from 'antd';\nimport { useAuth } from 'hooks/auth';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\n\nimport { I18nProvider } from 'hooks/i18n';\nimport { uuid } from 'uuidv4';\nimport { Container } from './styles';\n\ninterface PostContainerProps {\n data: IPost[];\n title?: string;\n socialIcon?: React.ReactNode;\n}\n\nconst PostContainer: React.FC = ({\n data,\n title = '',\n socialIcon = undefined,\n}) => {\n const intl = useIntl();\n const { user } = useAuth();\n\n const [activeCampaign, setActiveCampaign] = useState(false);\n const [posts, setPosts] = useState([]);\n const [page, setPage] = useState(0);\n\n useEffect(() => {\n if (data) setPosts([...data].slice(0, 4));\n setPage(1);\n }, [data]);\n\n const handleSeeMore = useCallback(() => {\n if (!user.consumer_type || user.consumer_type === 'unassigned_costumer') {\n return setActiveCampaign(true);\n }\n if (data)\n setPosts([...posts, ...[...data].slice(page * 4, (page + 1) * 4)]);\n return setPage(page + 1);\n }, [data, page, posts, user.consumer_type]);\n\n const handleSeeFullPost = useCallback(\n (post: IPost) =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? Modal.info({\n icon: socialIcon,\n content: (\n \n \n \n ),\n })\n : setActiveCampaign(true),\n [socialIcon, user.consumer_type],\n );\n\n return (\n \n {title}\n {data && data.length > 0 ? (\n <>\n \n {posts.map((post, index) => (\n \n handleSeeFullPost(post)}\n />\n \n ))}\n \n {posts.length !== data.length && (\n \n \n {intl.formatMessage({ id: 'posts.button.seemore' })}\n \n \n )}\n >\n ) : (\n \n )}\n setActiveCampaign(false)}\n />\n \n );\n};\n\nconst comparisonFn = (\n prevProps: PostContainerProps,\n newProps: PostContainerProps,\n): boolean => {\n return JSON.stringify(prevProps.title) === JSON.stringify(newProps.title);\n};\n\nexport default memo(PostContainer, comparisonFn);\n","import React, { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport FBLogo from 'assets/images/fb-logo.png';\nimport { CloudDownloadOutlined, FacebookFilled } from '@ant-design/icons';\nimport { Menu, Dropdown, Skeleton, Row, Col } from 'antd';\nimport { useAuth } from 'hooks/auth';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\nimport DownloadModal from 'components/Modals/Download';\nimport ImportModal from 'components/Modals/Import';\nimport { uuid } from 'uuidv4';\nimport SectionTitle from 'components/SectionTitle';\nimport usePostsContainer from 'hooks/postsContainer';\nimport { Container, Header } from './styles';\nimport PostContainer from '../PostContainer';\n\nconst PostMenu: React.FC<{ handleMenu?: Array<() => void> }> = ({\n handleMenu,\n}) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage({ id: 'posts.button.download' })}\n \n \n {intl.formatMessage({ id: 'posts.button.import' })}\n \n \n );\n};\n\nconst TopPostsFacebookHeader: React.FC<{\n handleMenu?: Array<() => void>;\n}> = ({ handleMenu }) => {\n const intl = useIntl();\n\n return (\n \n \n \n {intl.formatMessage({ id: 'posts.topposts' })}\n \n }\n >\n \n \n \n );\n};\n\nconst TopPostsFacebook: React.FC = () => {\n const { user } = useAuth();\n const [activeCampaign, setActiveCampaign] = useState(false);\n const [downloadModal, setDownloadModal] = useState(false);\n const [importModal, setImportModal] = useState(false);\n const { paramsDatas, maxImport, loading, searchedTerms } = usePostsContainer(\n '/historical_posts.json',\n {\n service: ['facebook'],\n size: 56,\n sort_by: 'top_posts_field',\n },\n );\n\n const handleImportModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setImportModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleDownloadModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setDownloadModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleMenu = useMemo(() => [handleDownloadModal, handleImportModal], [\n handleDownloadModal,\n handleImportModal,\n ]);\n\n const PostLoading = useCallback(\n props => (\n \n {[1, 2, 3, 4].map(() => (\n \n \n \n \n ))}\n \n ),\n [],\n );\n\n return (\n }>\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key);\n return value ? (\n }\n title={paramsDatas.size > 1 ? key : ''}\n key={key}\n data={value}\n />\n ) : null;\n })}\n \n setActiveCampaign(false)}\n />\n setDownloadModal(false)}\n />\n setImportModal(false)}\n maxImportNumber={maxImport}\n />\n \n );\n};\n\nexport default TopPostsFacebook;\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: topPostInsta;\n border-top: 4px solid #cd2e92 !important;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n }\n button {\n margin-top: 16px;\n color: #cd2e92;\n border-color: #cd2e92;\n }\n }\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n h4 {\n margin-right: auto;\n }\n img {\n height: 32px;\n width: 32px;\n margin-right: 16px;\n }\n svg {\n color: #cd2e92;\n height: 32px;\n width: 32px;\n }\n`;\n","import React, { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport InstaLogo from 'assets/images/insta-logo.png';\nimport { CloudDownloadOutlined, InstagramFilled } from '@ant-design/icons';\nimport { Menu, Dropdown, Skeleton, Row, Col } from 'antd';\nimport { useAuth } from 'hooks/auth';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\nimport DownloadModal from 'components/Modals/Download';\nimport ImportModal from 'components/Modals/Import';\nimport { uuid } from 'uuidv4';\nimport SectionTitle from 'components/SectionTitle';\nimport usePostsContainer from 'hooks/postsContainer';\nimport { Container, Header } from './styles';\nimport PostContainer from '../PostContainer';\n\nconst PostMenu: React.FC<{ handleMenu?: Array<() => void> }> = ({\n handleMenu,\n}) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage({ id: 'posts.button.download' })}\n \n \n {intl.formatMessage({ id: 'posts.button.import' })}\n \n \n );\n};\n\nconst TopPostsInstagramHeader: React.FC<{\n handleMenu?: Array<() => void>;\n}> = ({ handleMenu }) => {\n const intl = useIntl();\n\n return (\n \n \n \n {intl.formatMessage({ id: 'posts.topposts' })}\n \n }\n >\n \n \n \n );\n};\n\nconst TopPostsInstagram: React.FC = () => {\n const { user } = useAuth();\n const [activeCampaign, setActiveCampaign] = useState(false);\n const [downloadModal, setDownloadModal] = useState(false);\n const [importModal, setImportModal] = useState(false);\n\n const { paramsDatas, maxImport, loading, searchedTerms } = usePostsContainer(\n '/historical_posts.json',\n {\n service: ['instagram'],\n size: 56,\n sort_by: 'top_posts_field',\n },\n );\n\n const handleImportModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setImportModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleDownloadModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setDownloadModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleMenu = useMemo(() => [handleDownloadModal, handleImportModal], [\n handleDownloadModal,\n handleImportModal,\n ]);\n\n const PostLoading = useCallback(\n props => (\n \n {[1, 2, 3, 4].map(() => (\n \n \n \n \n ))}\n \n ),\n [],\n );\n\n return (\n }>\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key);\n return value ? (\n }\n title={paramsDatas.size > 1 ? key : ''}\n key={key}\n data={value}\n />\n ) : null;\n })}\n \n setActiveCampaign(false)}\n />\n setDownloadModal(false)}\n />\n setImportModal(false)}\n maxImportNumber={maxImport}\n />\n \n );\n};\n\nexport default TopPostsInstagram;\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: topPostTwitter;\n border-top: 4px solid black !important;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n }\n button {\n margin-top: 16px;\n color: black;\n border-color: black;\n }\n }\n`;\n\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n h4 {\n margin-right: auto;\n }\n img {\n height: 25px;\n margin-right: 16px;\n }\n svg {\n color: black;\n height: 32px;\n width: auto;\n }\n`;\n","import React, { useState, useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport XLogo from 'assets/images/lBlack.png';\nimport { CloudDownloadOutlined, TwitterOutlined } from '@ant-design/icons';\nimport { Menu, Dropdown, Skeleton, Col, Row } from 'antd';\nimport { useAuth } from 'hooks/auth';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\nimport DownloadModal from 'components/Modals/Download';\nimport ImportModal from 'components/Modals/Import';\nimport { uuid } from 'uuidv4';\nimport SectionTitle from 'components/SectionTitle';\nimport usePostsContainer from 'hooks/postsContainer';\nimport { Container, Header } from './styles';\nimport PostContainer from '../PostContainer';\n\nconst PostMenu: React.FC<{ handleMenu?: Array<() => void> }> = ({\n handleMenu,\n}) => {\n const intl = useIntl();\n\n return (\n \n \n {intl.formatMessage({ id: 'posts.button.download' })}\n \n \n {intl.formatMessage({ id: 'posts.button.import' })}\n \n \n );\n};\nconst TopPostsTwitterHeader: React.FC<{\n handleMenu?: Array<() => void>;\n}> = ({ handleMenu }) => {\n const intl = useIntl();\n return (\n \n \n \n {intl.formatMessage({ id: 'posts.topposts' })}\n \n }\n >\n \n \n \n );\n};\n\nconst TopPostsTwitter: React.FC = () => {\n const { user } = useAuth();\n const [activeCampaign, setActiveCampaign] = useState(false);\n const [downloadModal, setDownloadModal] = useState(false);\n const [importModal, setImportModal] = useState(false);\n\n const { paramsDatas, maxImport, loading, searchedTerms } = usePostsContainer(\n '/historical_posts.json',\n {\n service: ['twitter'],\n size: 56,\n sort_by: 'top_posts_field',\n },\n );\n\n const handleImportModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setImportModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleDownloadModal = useCallback(\n () =>\n user.consumer_type && user.consumer_type !== 'unassigned_costumer'\n ? setDownloadModal(true)\n : setActiveCampaign(true),\n [user.consumer_type],\n );\n\n const handleMenu = useMemo(() => [handleDownloadModal, handleImportModal], [\n handleDownloadModal,\n handleImportModal,\n ]);\n\n const PostLoading = useCallback(\n props => (\n \n {[1, 2, 3, 4].map(() => (\n \n \n \n \n ))}\n \n ),\n [],\n );\n\n return (\n }>\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n searchedTerms.map(item => {\n const key = item.obligatory;\n const value = paramsDatas.get(key);\n return value ? (\n }\n title={paramsDatas.size > 1 ? key : ''}\n key={key}\n data={value}\n />\n ) : null;\n })}\n \n setActiveCampaign(false)}\n />\n setDownloadModal(false)}\n />\n setImportModal(false)}\n maxImportNumber={maxImport}\n />\n \n );\n};\n\nexport default TopPostsTwitter;\n","import styled from 'styled-components';\nimport { Card } from 'antd';\n\nexport const Container = styled(Card)`\n grid-area: topInfluencers;\n border-top: 4px solid #fbb958 !important;\n div.ant-card-body {\n div.ant-skeleton-header {\n padding: 0;\n }\n button {\n margin-top: 16px;\n color: #fbb958;\n border-color: #fbb958;\n }\n }\n img.x-logo {\n width: 14px;\n margin: 5px 0;\n opacity: 0.3;\n }\n`;\nexport const Header = styled.div`\n display: flex;\n align-items: center;\n h4 {\n margin-right: auto;\n }\n img {\n height: 32px;\n width: 32px;\n margin-right: 16px;\n }\n svg {\n color: #fbb958;\n height: 32px;\n width: 32px;\n }\n`;\n","import axios from 'axios';\n\nconst influencersApi = axios.create({\n baseURL: 'https://crawler.influencers.buzzmonitor.com.br',\n});\n\nexport default influencersApi;\n","import styled from 'styled-components';\n\nexport const Container = styled.div``;\n","import React from 'react';\nimport XLogo from 'assets/images/lBlack.png';\nimport {\n FacebookFilled,\n InstagramFilled,\n YoutubeFilled,\n} from '@ant-design/icons';\n\ninterface SocialIconProps {\n social_network: string;\n}\n\nconst SocialIcon: React.FC = ({ social_network }) => {\n if (social_network === 'facebook') return ;\n if (social_network === 'twitter') return ;\n if (social_network === 'youtube') return ;\n return ;\n};\n\nexport default SocialIcon;\n","import styled from 'styled-components';\nimport BrokenLink from 'assets/images/broken-link.png';\nimport { Divider } from 'antd';\nimport { Card } from 'components/SearchForm/styles';\n\nexport const Container = styled.div``;\n\nexport const Content = styled(Card).attrs({})`\n background-color: white;\n height: fit-content;\n width: 100%;\n max-width: 100%;\n .ant-card-cover {\n margin: 0;\n }\n .ant-card-body {\n padding: 12px;\n }\n color: #515151;\n`;\n\nexport const PostImage = styled.div<{ url?: string; full?: boolean }>`\n background-image: url(${props => props.url || BrokenLink}), url(${BrokenLink});\n background-position: center center;\n background-size: cover;\n\n width: 100%;\n height: ${props => (props.full ? '352px' : '251.5px')};\n border-radius: 4px 4px 0 0;\n`;\n\nexport const Title = styled.div`\n display: flex;\n flex-direction: column;\n margin-bottom: 8px;\n color: #fbb958;\n a {\n height: 22px;\n overflow: hidden;\n font-weight: bold;\n color: inherit;\n }\n`;\n\nexport const Label = styled.span``;\n\nexport const SectionDivider = styled(Divider)`\n margin: 2px 0px 0px;\n`;\n\nexport const TagContainer = styled.div`\n padding-bottom: 8px;\n`;\n\nexport const TagGroup = styled.div`\n padding: 4px 0;\n\n .ant-tag {\n margin-bottom: 8px;\n }\n`;\n\nexport const Social = styled.div`\n display: flex;\n justify-content: space-around;\n margin: 0;\n margin-top: 12px;\n`;\n\nexport const SocialFollowers = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n color: ${props => props.theme.colors.tertiary};\n padding: 0 8px;\n svg {\n height: 20px;\n width: auto;\n margin-bottom: 4px;\n color: #d9d9d9;\n }\n`;\n\nexport const SocialCount = styled.span`\n font-size: 11px;\n color: #515151;\n`;\n\nexport const PopOverText = styled.span`\n font-size: 14px;\n color: #fbb958;\n`;\n","import React, { useMemo, memo } from 'react';\nimport useCldrTranslator from 'hooks/cldrTranslator';\n\nimport { useIntl } from 'react-intl';\nimport { Tag, Popover } from 'antd';\nimport { uuid } from 'uuidv4';\nimport SocialIcon from 'components/SocialIcon';\nimport formatNumber from 'utils/formatNumber';\nimport {\n Container,\n Title,\n Content,\n PostImage,\n SectionDivider,\n Label,\n TagContainer,\n TagGroup,\n Social,\n SocialFollowers,\n SocialCount,\n PopOverText,\n} from './styles';\n\nexport interface SocialType {\n id: string;\n followers: number;\n social_network: string;\n}\n\nexport interface InfluencerType {\n id?: string;\n name: string;\n photo: string;\n social: SocialType[];\n interests: string[];\n languages?: string[];\n}\n\ninterface PostProps {\n data: InfluencerType;\n index?: number;\n}\n\nconst Post: React.FC = ({ data, index }) => {\n const intl = useIntl();\n const translateLanguage = useCldrTranslator(\n intl.formatMessage({ id: 'general.locale' }),\n );\n const { name, photo, social, interests, languages } = data;\n\n const formattedLanguages = useMemo(() => {\n return languages?.flatMap((lang: string) => {\n return translateLanguage(lang) || [];\n });\n }, [languages, translateLanguage]);\n\n return (\n \n \n {`${index ? `${index}. ` : ''}${name}`}\n }>\n {formattedLanguages && formattedLanguages.length > 0 && (\n \n )}\n {interests && interests.length > 0 && (\n <>\n \n \n >\n )}\n {social && social.length > 0 && (\n <>\n \n \n >\n )}\n \n \n \n );\n};\n\ninterface TagSectionProps {\n label: string;\n tags: string[];\n}\n\nconst TagSection: React.FC = ({ label, tags }) => {\n return (\n \n {label}\n \n {tags.map(item => (\n {item}\n ))}\n \n \n );\n};\n\ninterface SocialPreviewProps {\n socials: SocialType[];\n}\n\nconst SocialPreview: React.FC = ({ socials }) => {\n const intl = useIntl();\n const socialsFormatted = useMemo(\n () => [\n socials.slice(0, 4),\n socials.length > 4 ? socials.slice(4, socials.length) : [],\n ],\n [socials],\n );\n\n return (\n \n {socialsFormatted[0].map(social => {\n const { social_network, followers } = social;\n const id = uuid();\n const formattedCount = formatNumber(followers);\n return (\n \n \n {formattedCount}\n \n );\n })}\n\n {socialsFormatted[1].length > 0 && (\n \n {`+ ${socialsFormatted[1].length}`}\n \n )}\n \n );\n};\n\nconst comparisonFn = (prevProps: PostProps, newProps: PostProps): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(Post, comparisonFn);\n","export default function formatNumber(number: number): string {\n if (number / 1000 < 1) {\n return number.toString();\n }\n\n if (number / 1000 >= 1 && number / 1000 < 1000) {\n return `${(number / 1000).toFixed(1)} K`;\n }\n\n if (number / 1000000 >= 1 && number / 1000000 < 1000) {\n return `${(number / 1000000).toFixed(1)} M`;\n }\n if (number / 1000000000 >= 1) {\n return `${(number / 1000000000).toFixed(1)} B`;\n }\n return number.toString();\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport { CLDR, CLDRFramework } from '@phensley/cldr';\nimport pkg from '../../package.json';\n\nexport default function useCldrTranslator(\n locale: string,\n): (lang: string) => string {\n const [cldr, setCldr] = useState({} as CLDR);\n\n useEffect(() => {\n const version = pkg.dependencies['@phensley/cldr'];\n const packurl = `https://cdn.jsdelivr.net/npm/@phensley/cldr@${version}/packs`;\n\n const asyncLoader = (language: string): Promise =>\n fetch(`${packurl}/${language}.json`)\n .then(r => r.json())\n .catch(err => console.log(err));\n\n const framework = new CLDRFramework({\n asyncLoader,\n packCacheSize: 8,\n });\n const { resolveLocale } = CLDRFramework;\n\n framework\n .getAsync(resolveLocale(locale).tag.expanded())\n .then((new_cldr: CLDR) => {\n setCldr(new_cldr);\n });\n }, [locale]);\n\n const translateLanguage = useCallback(\n lang => {\n const tag = cldr.General?.parseLanguageTag(lang);\n return cldr.General?.getLanguageDisplayName(tag);\n },\n [cldr.General],\n );\n\n return translateLanguage;\n}\n","import React, { useState, useCallback, useEffect, memo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { Button, Row, Col, Skeleton } from 'antd';\nimport { useAuth } from 'hooks/auth';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\n\nimport influencersApi from 'services/influencersApi';\nimport { Container } from './styles';\nimport Post from './Post';\n\nexport interface SocialType {\n id: string;\n followers: number;\n social_network: string;\n}\n\nexport interface InfluencerType {\n id?: string;\n name: string;\n photo: string;\n social: SocialType[];\n interests: string[];\n languages?: string[];\n}\n\nconst DEFAULT_FILTERS = {\n searchFor: '',\n socialNetworks: '[\"instagram\", \"facebook\", \"twitter\", \"youtube\"]',\n whereToSearch:\n '[\"username\", \"name\", \"top_hashtags\", \"top_terms\", \"top_entities\", \"top_mentions\", \"bio\"]',\n min_followers: 1000,\n max_followers: 100000000,\n gender: '[\"M\", \"F\", \"ORG\"]',\n languages: '[]',\n age: '[]',\n page: 0,\n countries: '[]',\n interests: '[]',\n};\n\ninterface PostContainerProps {\n searchFor: string;\n languages: string[];\n title?: string;\n}\n\nconst PostContainer: React.FC = ({\n searchFor,\n languages,\n title = '',\n}) => {\n const intl = useIntl();\n const { user } = useAuth();\n\n const [activeCampaign, setActiveCampaign] = useState(false);\n const [posts, setPosts] = useState([]);\n const [currentInfluencers, setCurrentInfluencers] = useState<\n InfluencerType[]\n >([]);\n const [pageRequest, setPageRequest] = useState(0);\n const [containerPage, setContainerPage] = useState(0);\n const [hasMore, setHasMore] = useState(true);\n const [loading, setLoading] = useState(false);\n\n const requestData = useCallback(() => {\n setLoading(true);\n influencersApi\n .get<{\n info: { profiles_found: number };\n data: Array;\n }>('/influencers/search', {\n params: {\n ...DEFAULT_FILTERS,\n searchFor,\n page: pageRequest,\n languages: [languages]\n },\n })\n .then(response => {\n if (response?.data?.data && response.data.data.length > 0) {\n setPosts(prevPosts => [...prevPosts, ...response.data.data]);\n if (response.data.data.length < 12) {\n setHasMore(false);\n }\n }\n setPageRequest(prevpageRequest => prevpageRequest + 1);\n })\n .finally(() => setLoading(false));\n }, [pageRequest, searchFor]);\n\n useEffect(() => {\n requestData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (posts.length > 0 && currentInfluencers.length === 0) {\n setCurrentInfluencers([\n ...currentInfluencers,\n ...[...posts].slice(containerPage * 4, (containerPage + 1) * 4),\n ]);\n setContainerPage(1);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [posts]);\n\n const handleSeeMore = useCallback(() => {\n if (!user.consumer_type || user.consumer_type === 'unassigned_costumer') {\n return setActiveCampaign(true);\n }\n if (posts)\n setCurrentInfluencers([\n ...currentInfluencers,\n ...[...posts].slice(containerPage * 4, (containerPage + 1) * 4),\n ]);\n if (currentInfluencers.length === posts.length - 8) {\n requestData();\n }\n setContainerPage(containerPage + 1);\n }, [\n currentInfluencers,\n containerPage,\n posts,\n requestData,\n user.consumer_type,\n ]);\n\n return (\n \n {title}\n \n {currentInfluencers.map((post, index) => (\n \n \n \n ))}\n \n \n \n \n {intl.formatMessage({ id: 'posts.button.seemore' })}\n \n \n setActiveCampaign(false)}\n />\n \n );\n};\n\nconst comparisonFn = (\n prevProps: PostContainerProps,\n newProps: PostContainerProps,\n): boolean => {\n return JSON.stringify(prevProps) === JSON.stringify(newProps);\n};\n\nexport default memo(PostContainer, comparisonFn);\n","import React, { useState, useEffect } from 'react';\nimport TamiLogo from 'assets/images/tami.png';\nimport { useSearch } from 'hooks/search';\nimport ActiveCampaign from 'components/Modals/ActiveCampaign';\nimport { difference, map } from 'lodash';\nimport { formatInfluencersQuery } from 'utils/formatQuery';\nimport SectionTitle from 'components/SectionTitle';\nimport { Container, Header } from './styles';\nimport PostContainer from './PostContainer';\n\nexport interface ParamDataType {\n query: string;\n}\n\nconst WidgetHeader: React.FC = () => {\n return (\n \n \n Influencers\n \n );\n};\n\nconst InfluencersWidget: React.FC = () => {\n const [paramsDatas, setParamsDatas] = useState>(\n new Map(),\n );\n const [activeCampaign, setActiveCampaign] = useState(false);\n const { params, searchedTerms, comparisonTerms } = useSearch();\n\n /*\n Check if some term was removed from searchedTerms and remove its data from\n paramsDatas, removing the chart of term.\n */\n useEffect(() => {\n if (searchedTerms.length < paramsDatas.size) {\n const keyToRemove = difference(\n Array.from(paramsDatas.keys()),\n map(searchedTerms, 'obligatory'),\n );\n setParamsDatas(prevDatas => {\n prevDatas.delete(keyToRemove?.[0]);\n return new Map(prevDatas);\n });\n }\n }, [paramsDatas, searchedTerms]);\n\n useEffect(() => {\n setParamsDatas(\n prevDatas =>\n new Map(\n prevDatas.set(params.obligatory, {\n query: formatInfluencersQuery(params),\n }),\n ),\n );\n }, [params]);\n\n /*\n This effect is used to search for the comparison terms when the page is\n loaded for the first time.\n */\n useEffect(() => {\n if (comparisonTerms.length > 0) {\n comparisonTerms.forEach(term => {\n setParamsDatas(\n prevDatas =>\n new Map(\n prevDatas.set(term.obligatory, {\n query: formatInfluencersQuery(term),\n }),\n ),\n );\n });\n }\n }, [comparisonTerms]);\n\n return (\n }>\n {paramsDatas &&\n paramsDatas.size >= 1 &&\n Array.from(paramsDatas).map(([key, value]) => (\n 1 ? key : ''}\n searchFor={value.query}\n languages={params.languages}\n key={key}\n />\n ))}\n setActiveCampaign(false)}\n />\n \n );\n};\n\nexport default InfluencersWidget;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n display: flex;\n overflow-x: hidden;\n flex-direction: column;\n align-items: center;\n max-width: 1080px;\n width: 100%;\n padding: 57px 0px 32px;\n margin: 0 auto;\n\n main {\n max-width: 1080px;\n width: 100%;\n display: grid;\n\n grid-template-areas:\n 'terms terms'\n 'shares shares'\n 'gender sentiment'\n 'topPostFB topPostFB'\n 'topPostInsta topPostInsta'\n 'topPostTwitter topPostTwitter'\n 'topInfluencers topInfluencers';\n\n grid-gap: 32px;\n\n > div {\n max-width: 100%;\n }\n }\n\n @media (max-width: 1080px) {\n padding: 57px 20px 0;\n main {\n grid-template-columns: repeat(1fr);\n padding: 0px 20px 0;\n }\n }\n @media (max-width: 480px) {\n padding: 57px 8px 0;\n main {\n grid-template-columns: repeat(1fr);\n padding: 0px 8px;\n }\n }\n`;\n","import React, { useEffect } from 'react';\nimport formatParamsToObj from 'utils/formatParamsToObj';\nimport { useSearch } from 'hooks/search';\nimport ResultsHeader from 'components/ResultsHeader';\nimport TermEvolution from 'components/ChartContainers/TermsEvolutionContainer';\nimport SharingByNetwork from 'components/ChartContainers/SharingByNetworkContainer';\nimport Sentiment from 'components/ChartContainers/SentimentContainer';\nimport Gender from 'components/ChartContainers/GenderContainer';\nimport TopPostsFacebook from 'components/TopPosts/Facebook';\nimport TopPostsInstagram from 'components/TopPosts/Instagram';\nimport TopPostsTwitter from 'components/TopPosts/Twitter';\nimport { Row, Col } from 'antd';\nimport InfluencersWidget from 'components/InfluencersWidget';\nimport { formatInfluencersQuery } from 'utils/formatQuery';\nimport { Container } from './styles';\n\nconst Results: React.FC = () => {\n const { setParams, setSearchedTerms, setComparisonTerms } = useSearch();\n\n /*\n Gets page URL and initializes params, searchedTerms and compareTerms\n */\n useEffect(() => {\n const urlParams = window.location.search;\n const paramsObj = formatParamsToObj(urlParams);\n\n // Formats obligatory, banned and optional terms in one query string\n const newObligatoryQuery = formatInfluencersQuery(paramsObj).replace(\n /\"\"/g,\n '\"',\n );\n\n // Build a new params obj with the query string in the obligatory field\n const newParamsObj = {\n ...paramsObj,\n banned: '',\n optional: '',\n obligatory: newObligatoryQuery,\n };\n\n // Initializes params, searchedTerms and compareTerms\n setParams(newParamsObj);\n const comparisonTerms = newParamsObj.compare.map(term => ({\n ...newParamsObj,\n obligatory: term,\n }));\n setSearchedTerms([newParamsObj, ...comparisonTerms]);\n setComparisonTerms([...comparisonTerms]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Results;\n","import React from 'react';\nimport { Switch, Route } from 'react-router-dom';\n\nimport Home from 'pages/Home';\nimport Results from 'pages/Results';\n\nconst Routes: React.FC = () => {\n return (\n \n \n \n \n );\n};\nexport default Routes;\n","import React from 'react';\nimport { BrowserRouter as Router } from 'react-router-dom';\nimport Header from 'components/Header';\nimport GlobalStyle from './styles/global';\nimport AppProvider from './hooks';\nimport Routes from './routes';\n\nconst App: React.FC = () => {\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport App from './App';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root'),\n);\n","module.exports = __webpack_public_path__ + \"static/media/broken-link.46060d33.png\";","module.exports = __webpack_public_path__ + \"static/media/lBlack.c019bd43.png\";","module.exports = __webpack_public_path__ + \"static/media/bm-logo.604a65f6.png\";","module.exports = __webpack_public_path__ + \"static/media/trends-logo.072e3ab9.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS0AAAEsCAYAAACWv+VLAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAXEgAAFxIBZ5/SUgAABChpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjA8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjE1MDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+MTUwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzAxPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4zMDA8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAg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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}
{intl.formatMessage({ id: 'contact.subtitle1' })}
{intl.formatMessage({ id: 'contact.subtitle2' })}
{data.content}
\n {metric.icon}\n {metric.name}\n