(this.form = ref)}\n callback={this.props.handleNext}\n />\n );\n }\n }\n\n render() {\n return (\n <>\n {this.get_form()}\n \n \n {\n this.submitForm();\n }}\n style={{\n background: '#1E9CB2',\n color: 'white',\n padding: '5px 20px',\n textTransform: 'none',\n }}\n >\n Save and Continue\n \n \n \n >\n );\n }\n}\n\nexport default withRouter(AboutYourself);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Grid, Button, Paper } from '@material-ui/core';\n\nimport InstagramIcon from '@material-ui/icons/Instagram';\nimport YouTubeIcon from '@material-ui/icons/YouTube';\n\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\n\nimport FacebookLogin from '../../../components/auth/FacebookLogin';\nimport YoutubeLogin from '../../../components/auth/YoutubeLogin';\n\nimport { getInfluencerProfile, updateInfluencerProfile } from '../../../api_handlers/influencer.js';\nimport { authHandlers } from '../../../api_handlers/auth';\n\nclass ConnectSocialMedia extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isInstagramLinked: false,\n isYoutubeLinked: false,\n };\n }\n\n updateInstagramConnection() {\n this.setState({\n isInstagramLinked: true,\n });\n updateInfluencerProfile({\n is_instagram_linked: true,\n });\n }\n\n updateYoutubeConnection() {\n this.setState({\n isYoutubeLinked: true,\n });\n updateInfluencerProfile({\n is_youtube_linked: true,\n });\n }\n\n async registerToBackendFacebook(data) {\n const user = await authHandlers.facebookLogin(data);\n if (user) this.updateInstagramConnection();\n }\n\n async registerToBackendYoutube(data) {\n const user = await authHandlers.youtubeLogin(data);\n if (user) this.updateYoutubeConnection();\n }\n\n componentDidMount() {\n this.loadData();\n }\n\n async loadData() {\n const influencerData = await getInfluencerProfile();\n this.setState({\n isInstagramLinked: influencerData.is_instagram_linked,\n isYoutubeLinked: influencerData.is_youtube_linked,\n });\n }\n\n render() {\n return (\n \n \n \n \n {\n this.registerToBackendFacebook(response);\n }}\n />\n \n {this.state.isInstagramLinked ? (\n \n \n \n \n \n \n connected! \n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n {\n this.registerToBackendYoutube(response);\n }}\n />\n \n {this.state.isYoutubeLinked ? (\n \n \n \n \n \n \n connected! \n \n \n \n ) : (\n ''\n )}\n \n \n \n );\n }\n}\n\nexport default withRouter(ConnectSocialMedia);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Grid, Button, Paper } from '@material-ui/core';\n\nimport InstagramIcon from '@material-ui/icons/Instagram';\nimport YouTubeIcon from '@material-ui/icons/YouTube';\n\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\n\nimport FacebookLogin from '../../../components/auth/FacebookLogin';\nimport YoutubeLogin from '../../../components/auth/YoutubeLogin';\n\nimport { getInfluencerProfile, updateInfluencerProfile } from '../../../api_handlers/influencer.js';\nimport { authHandlers } from '../../../api_handlers/auth';\n\nclass ConnectSocialMedia extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isInstagramLinked: false,\n isYoutubeLinked: false,\n };\n }\n\n updateInstagramConnection() {\n this.setState({\n isInstagramLinked: true,\n });\n updateInfluencerProfile({\n is_instagram_linked: true,\n });\n }\n\n updateYoutubeConnection() {\n this.setState({\n isYoutubeLinked: true,\n });\n updateInfluencerProfile({\n is_youtube_linked: true,\n });\n }\n\n async registerToBackendFacebook(data) {\n const user = await authHandlers.facebookLogin(data);\n if (user) this.updateInstagramConnection();\n }\n\n async registerToBackendYoutube(data) {\n const user = await authHandlers.youtubeLogin(data);\n if (user) this.updateYoutubeConnection();\n }\n\n componentDidMount() {\n this.loadData();\n }\n\n async loadData() {\n const influencerData = await getInfluencerProfile();\n this.setState({\n isInstagramLinked: influencerData.is_instagram_linked,\n isYoutubeLinked: influencerData.is_youtube_linked,\n });\n }\n\n render() {\n return (\n \n \n \n \n {\n this.registerToBackendFacebook(response);\n }}\n />\n \n {this.state.isInstagramLinked ? (\n \n \n \n \n \n \n connected! \n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n {\n this.registerToBackendYoutube(response);\n }}\n />\n \n {this.state.isYoutubeLinked ? (\n \n \n \n \n \n \n connected! \n \n \n \n ) : (\n ''\n )}\n \n \n \n );\n }\n}\n\nexport default withRouter(ConnectSocialMedia);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Grid, Button, Paper } from '@material-ui/core';\n\nimport InstagramIcon from '@material-ui/icons/Instagram';\nimport YouTubeIcon from '@material-ui/icons/YouTube';\nimport SocialMediaForm from '../forms/ConnectSocialMedia';\nimport MobileSocialMediaForm from '../forms/MobileConnectSocialMedia';\n\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\n\nimport { updateInfluencerProfile } from '../../../api_handlers/influencer.js';\n\nclass ConnectSocialMedia extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isInstagramLinked: false,\n isYoutubeLinked: false,\n };\n }\n\n submitForm() {\n this.props.history.push('/influencer/settings/about-me');\n }\n\n get_form() {\n if (window.matchMedia('(min-width: 768px)').matches) {\n return ;\n } else {\n return ;\n }\n }\n\n render() {\n return (\n \n {this.get_form()}\n \n \n {\n this.submitForm();\n }}\n style={{\n background: '#1E9CB2',\n color: 'white',\n padding: '5px 20px',\n textTransform: 'none',\n }}\n >\n Save and Continue\n \n \n \n \n );\n }\n}\n\nexport default withRouter(ConnectSocialMedia);\n","import React from 'react';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport Stepper from '@material-ui/core/Stepper';\nimport Step from '@material-ui/core/Step';\nimport StepLabel from '@material-ui/core/StepLabel';\n\nimport PersonalDetails from './PersonalDetails';\nimport AboutYourself from './AboutYourself';\nimport ConnectSocialMedia from './ConnectSocialMedia';\n\nimport PropTypes from 'prop-types';\nimport clsx from 'clsx';\nimport SettingsIcon from '@material-ui/icons/Settings';\nimport GroupAddIcon from '@material-ui/icons/GroupAdd';\nimport VideoLabelIcon from '@material-ui/icons/VideoLabel';\nimport StepConnector from '@material-ui/core/StepConnector';\n\nconst ColorlibConnector = withStyles({\n alternativeLabel: {\n top: 15,\n },\n active: {\n '& $line': {\n // backgroundImage:\n // 'linear-gradient( 95deg,rgb(242,113,33) 0%,rgb(233,64,87) 50%,rgb(138,35,135) 100%)',\n },\n },\n completed: {\n '& $line': {\n // backgroundImage:\n // 'linear-gradient( 95deg,rgb(242,113,33) 0%,rgb(233,64,87) 50%,rgb(138,35,135) 100%)',\n },\n },\n line: {\n height: 3,\n borderTop: '2px dashed #BCBCBC',\n // backgroundColor: '#eaeaf0',\n borderRadius: 1,\n },\n})(StepConnector);\n\nconst useColorlibStepIconStyles = makeStyles({\n root: {\n backgroundColor: '#ccc',\n zIndex: 1,\n color: '#fff',\n width: 30,\n height: 30,\n display: 'flex',\n borderRadius: '50%',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: 12,\n fontWeight: 'bold',\n boxShadow: '0px 0px 0px 4px rgba(104, 104, 104, 0.17)',\n },\n active: {\n background: '#686868',\n boxShadow: '0px 0px 0px 4px rgba(104, 104, 104, 0.17)',\n },\n completed: {\n boxShadow: '0px 0px 0px 4px rgba(30, 156, 178, 0.17)',\n background: '#1E9CB2',\n },\n});\n\nfunction ColorlibStepIcon(props) {\n const classes = useColorlibStepIconStyles();\n const { active, completed } = props;\n\n const icons = {\n 1: '1',\n 2: '2',\n 3: '3',\n };\n\n return (\n \n {icons[String(props.icon)]}\n
\n );\n}\n\nColorlibStepIcon.propTypes = {\n /**\n * Whether this step is active.\n */\n active: PropTypes.bool,\n /**\n * Mark the step as completed. Is passed to child components.\n */\n completed: PropTypes.bool,\n /**\n * The label displayed in the step icon.\n */\n icon: PropTypes.node,\n};\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%',\n },\n button: {\n marginRight: theme.spacing(1),\n },\n instructions: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n },\n}));\n\nfunction getSteps() {\n return ['Profile Details', 'About Yourself', 'Connect Social Media'];\n}\n\nfunction getStepContent(stepIndex, handleNext) {\n switch (stepIndex) {\n case 0:\n return ;\n case 1:\n return ;\n case 2:\n return ;\n default:\n return '';\n }\n}\n\nexport default function HorizontalLabelPositionBelowStepper() {\n const classes = useStyles();\n const [activeStep, setActiveStep] = React.useState(0);\n const steps = getSteps();\n const handleNext = () => {\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\n };\n\n const handleSkip = () => {\n setActiveStep((prevActiveStep) => prevActiveStep + 1);\n };\n\n const handleReset = () => {\n setActiveStep(0);\n };\n\n return (\n \n
}>\n {steps.map((label, i) => (\n
\n \n \n {label}\n \n \n \n ))}\n \n
\n
\n {getStepContent(activeStep, handleNext)}\n
\n
\n
\n
\n );\n}\n","export default __webpack_public_path__ + \"static/media/profile-setup-bg.08f59916.png\";","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Grid, Divider } from '@material-ui/core';\n\nimport ProfileStepper from './Stepper';\nimport background from '../../../assets/profile-setup-bg.png';\nimport './ProfileSetup.css';\n\nclass ProfileSetup extends React.Component {\n render() {\n const steps = ['Select campaign settings', 'Create an ad group', 'Create an ad'];\n const activeStep = 0;\n return (\n \n \n \n \n \n \n Complete Your Account Setup \n \n \n \n Your personal information will help us understand you and your audience which\n will be used to find the the right brand for you.\n \n \n \n \n \n \n \n \n \n \n \n Complete Your Account Setup \n \n \n \n Your personal information will help us understand you and your audience which\n will be used to find the the right brand for you.\n \n \n \n \n \n \n \n \n Complete Account Setup \n \n \n \n \n \n \n \n \n \n \n Complete Account Setup \n \n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport default withRouter(ProfileSetup);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\n\nimport BaseSidePanel from '../../ux/BaseSidePanel';\n\nimport PermIdentityIcon from '@material-ui/icons/PermIdentity';\nimport SecurityIcon from '@material-ui/icons/Security';\nimport FacebookIcon from '@material-ui/icons/Facebook';\nimport InfoIcon from '@material-ui/icons/Info';\n\nclass SidePanel extends React.Component {\n getNavigationLinks() {\n return [\n {\n to: `${this.props.match.url}/personal-settings`,\n label: 'Personal Settings',\n icon: PermIdentityIcon,\n },\n {\n to: `${this.props.match.url}/security-settings`,\n label: 'Security Settings',\n icon: SecurityIcon,\n },\n {\n to: `${this.props.match.url}/social-settings`,\n label: 'Social Settings',\n icon: FacebookIcon,\n },\n {\n to: `${this.props.match.url}/about-me`,\n label: 'About Me',\n icon: InfoIcon,\n },\n ];\n }\n\n render() {\n return ;\n }\n}\n\nexport default withRouter(SidePanel);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid, Container, Divider, Button } from '@material-ui/core';\n\nimport PersonalDetailForm from '../forms/PersonalDetails';\nimport AboutYourself from '../forms/AboutYourself';\n\nclass Personal extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n await this.aboutYourselfForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n \n \n Personal Information\n \n \n \n {\n this.submitForm();\n }}\n style={{\n background: '#1E9CB2',\n color: 'white',\n padding: '5px 20px',\n }}\n >\n Save\n \n \n \n \n \n \n \n \n \n \n \n \n (this.personalDetailForm = ref)}\n fieldsToShow={[\n 'profile_pic',\n 'name',\n 'dob',\n 'gender',\n 'addressLine',\n 'state/city',\n 'pincode',\n ]}\n />\n \n \n \n \n \n About Yourself\n \n \n \n \n \n \n \n \n \n \n (this.aboutYourselfForm = ref)} />\n \n \n \n );\n }\n}\n\nexport default withRouter(Personal);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid, Container, Divider } from '@material-ui/core';\n\nimport PersonalDetailForm from '../forms/PersonalDetails';\nimport AboutYourself from '../forms/AboutYourself';\n\nclass Security extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n Security Settings\n \n \n \n \n \n \n \n \n \n \n (this.personalDetailForm = ref)}\n fieldsToShow={['email', 'phone_number', 'change_password']}\n />\n \n \n \n );\n }\n}\n\nexport default withRouter(Security);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid, Container, Divider } from '@material-ui/core';\n\nimport ConnectSocialMedia from '../forms/ConnectSocialMedia';\n\nclass Social extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n Social Settings\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport default withRouter(Social);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid, Container, Divider } from '@material-ui/core';\n\nconst html = `\n\n \n \n Influencer- BFSI survey \n \n \n \n \n \n\n`;\n\nclass AboutMe extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n
\n \n );\n }\n}\n\nexport default withRouter(AboutMe);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid } from '@material-ui/core';\n\nimport SidePanel from './SidePanel';\nimport Personal from './Personal';\nimport Security from './Security';\nimport Social from './Social';\nimport AboutMe from './AboutMe';\n\nclass Settings extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n render() {\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\nexport default withRouter(Settings);\n","import React from 'react';\nimport { withRouter, Route, Switch } from 'react-router-dom';\nimport { Grid } from '@material-ui/core';\n\nimport SidePanel from './SidePanel';\nimport Personal from './Personal';\nimport Security from './Security';\nimport Social from './Social';\nimport AboutMe from './AboutMe';\nimport ButtonStyledLink from '../../ux/ButtonStyledLink';\n\nclass Settings extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n }\n}\n\nexport default withRouter(Settings);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAAmCAYAAACVr4jIAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADZSURBVHgB7ZnLDcIwEEQHaCAlTCt0wJFjSksJdEAJXLkldEAHYS3ZKET4lByym3nSyIlvT5Y/awM74YT1aCxXCy1PBIWW3jLmPBAQ4leypMWGOGIZtNxzO+eNIBD/R3LM/UQACElK0g2EJCXpBkKSknQDIUm/kofJN1E/oCc6ywv+SMXFrfwQ9ZGMkL6UaRcEmXsVuLQedUOZo+m+J11/EDEZ9rIYdfNOYgd7aIGQrGTdQ0hWsu4hJCtZ9xCS/co2CARRl22xIZbWo4PlnNs5Yd5HpxAbf9r/AJfhAzo+yX+YAAAAAElFTkSuQmCC\"","import React from 'react';\nimport { withRouter, Route, Switch, NavLink } from 'react-router-dom';\nimport { Grid, Container, Divider, Button } from '@material-ui/core';\n\nimport PersonalDetailForm from '../forms/MobilePersonalDetails';\nimport AboutYourself from '../forms/MobileAboutYourself';\nimport BackArrowLogo from '../../../assets/back_arrow.png';\n\nclass Personal extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n await this.aboutYourselfForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n Personal Information\n \n \n \n \n \n \n \n \n \n \n \n \n \n (this.personalDetailForm = ref)}\n fieldsToShow={[\n 'profile_pic',\n 'name',\n 'dob',\n 'gender',\n 'addressLine',\n 'state/city',\n 'pincode',\n ]}\n />\n \n \n \n \n \n About Yourself\n \n \n \n \n \n \n \n \n \n \n (this.aboutYourselfForm = ref)} />\n \n \n \n {\n this.submitForm();\n }}\n style={{\n background: '#1E9CB2',\n color: 'white',\n padding: '5px 20px',\n marginBottom: '70px',\n width: '100%',\n }}\n >\n Save & Continue\n \n \n \n );\n }\n}\n\nexport default withRouter(Personal);\n","import React from 'react';\nimport { withRouter, Route, Switch, NavLink } from 'react-router-dom';\nimport { Grid, Container, Divider } from '@material-ui/core';\n\nimport MobilePersonalDetailForm from '../forms/MobilePersonalDetails';\nimport BackArrowLogo from '../../../assets/back_arrow.png';\n\nclass Security extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n Security Settings\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n (this.personalDetailForm = ref)}\n fieldsToShow={['email', 'phone_number', 'change_password']}\n />\n \n \n \n );\n }\n}\n\nexport default withRouter(Security);\n","import React from 'react';\nimport { withRouter, Route, Switch, NavLink } from 'react-router-dom';\nimport { Grid, Container, Divider } from '@material-ui/core';\nimport BackArrowLogo from '../../../assets/back_arrow.png';\n\nimport MobileConnectSocialMedia from '../forms/MobileConnectSocialMedia';\n\nclass Social extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n Social Settings\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 withRouter(Social);\n","export default __webpack_public_path__ + \"static/media/close.84cc8ac1.png\";","import React from 'react';\nimport { withRouter, Route, Switch, NavLink } from 'react-router-dom';\nimport { Grid, Container, Divider, Modal, Button } from '@material-ui/core';\n\nimport MobilePersonalDetailForm from '../forms/MobilePersonalDetails';\nimport BackArrowLogo from '../../../assets/back_arrow.png';\nimport LifestyleLogo from '../../../assets/lifestyle.png';\nimport BfsiLogo from '../../../assets/bfsi.png';\nimport FoodLogo from '../../../assets/food.png';\nimport AutomobileLogo from '../../../assets/automobile.png';\nimport FashionLogo from '../../../assets/fashion.png';\nimport DigitalLogo from '../../../assets/digital.png';\nimport CloseLogo from '../../../assets/close.png';\nimport Iframe from 'react-iframe';\n\nclass AboutMe extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n IframeHtml: null,\n ShowIframe: false,\n };\n }\n\n componentDidMount() {}\n\n async submitForm() {\n await this.personalDetailForm.submitForm();\n }\n\n render() {\n return (\n \n \n \n \n \n \n \n \n \n \n \n About Me\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n How can we help you Tell you more about yourself\n \n \n \n \n Fill out this form\n \n \n \n \n \n {\n this.setState({\n IframeHtml: 0,\n ShowIframe: true,\n });\n }}\n // href=\"https://m8q0s1wparo.typeform.com/to/NkbG27WK?typeform-source=mail.google.com\"\n // target=\"_blank\"\n >\n \n \n BFSI
\n \n \n {\n this.setState({\n IframeHtml: 1,\n ShowIframe: true,\n });\n }}\n //href=\"#\"\n //target=\"_blank\"\n >\n \n \n Fashion
\n \n \n {\n this.setState({\n IframeHtml: 2,\n ShowIframe: true,\n });\n }}\n // href=\"https://m8q0s1wparo.typeform.com/to/XlizfFQv?typeform-source=mail.google.com\"\n // target=\"_blank\"\n >\n \n \n Food
\n \n \n \n \n {\n this.setState({\n IframeHtml: 3,\n ShowIframe: true,\n });\n }}\n //href=\"#\"\n //target=\"_blank\"\n >\n \n \n Lifestyle
\n \n \n {\n this.setState({\n IframeHtml: 4,\n ShowIframe: true,\n });\n }}\n //href=\"#\"\n //target=\"_blank\"\n >\n \n \n Automobile
\n \n \n {\n this.setState({\n IframeHtml: 5,\n ShowIframe: true,\n });\n }}\n //href=\"#\"\n //target=\"_blank\"\n >\n \n \n Digital
\n \n \n \n \n \n {\n this.state.IframeHtml == 0 && this.state.ShowIframe && (\n \n )\n // \n }\n {\n this.state.IframeHtml == 1 && this.state.ShowIframe && (\n \n )\n // \n }\n {\n this.state.IframeHtml == 2 && this.state.ShowIframe && (\n \n )\n // \n }\n {\n this.state.IframeHtml == 4 && this.state.ShowIframe && (\n \n )\n // \n }\n {this.state.ShowIframe && (\n \n
{\n this.setState({\n IframeHtml: null,\n ShowIframe: false,\n });\n }}\n >\n \n \n
\n )}\n \n );\n }\n}\n\nexport default withRouter(AboutMe);\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAABYCAYAAAAQjRJ2AAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAbtSURBVHgB7Z1riFVVFMf/PbSZXmpiGT1GJSs1wl72mIIwKQT7klREmV8qCCXJMnqZSGRBJFRQVMaMRVT0pAdC1JeI7D02BGVZTqllT6eHVmZO69++A3funLXPPvecc++5964f/GE4c89rrXP2Y+219wEMw8iPPdB8HCyaKZosOqy0bYtonahHtBlGIThR9LRop2hA0T+iV0VHw6gb+4vuhu6kKP0rWoHmLGEKTZvoDSRzVrleEo2CUTOeRfXOGtTjMGrCdUjvrEFdCSNXDhR9D78T/hR9KFor+ivmtztEB8HIjduhG79ftBCufhukrbTtV89+t8HIBbbsPoHurBmefWeUfhO172cwcuFY0W5EG31pwP53QH/LOmBkzmzoddahAfvvB93hF6Dg7InGY4yyncXkd4hnu+d3+6LgNKLDRirb/0A4O5Xte6PgFP4CE3CcqAuuWBwLF7IadC4dRIf+IvpWNBpG7owQHS/qRnYd5krx2AwiW4wxBaeJVok2wAVtB3IWz8Em/mrR6TCCmCZaJupD/g6KE4vQW0RHwRgCi6Gz4CLoWrO7nmJ46xXRSWhx6Cga4TXEx/yKID5MfKhmog7Uu3LlMP7NovlIfy1sBX4B18fi37vgRpjZddlL1A7XzxpVOu9YpIPO64aLrmxBk0MjLhH9hurrlRfgArqMfByC5HSIZsENrTyP+Oi/pm1wwehG7NMGMUn0LpIZhW8KIxnLRCcgn1FivoGdortEH5TOmeQaX4frEjQV80W/I9wILNoehIuy17r45jkfE/2E8OtliXEFXBHc0BwAF4UIvfEvRTfARSvqzXjRIrh6KvT62W9s2FyRcaKPEXajfJoXo5j1AaP8bCBtQti9fIQGHK6ZirDOL5vKd8IlgRYdti4fQlhfcSPc+F1DcDLCyn82xc9E48G+I6897v5YlE5FwTkDLrEl7q1ivK6Rm8NMBlqJ+LftR7jAdSFhHLAPiG2mX4Lm4XLRz/Df89coYIr4BLhy23fhfWjOQCqjJ3SK797ZOe9AQWBrkDNEfBfM1uIYNC/sArwNvw16UYDGFTu1DBX5LvQt0eFofniP78BvC86yqWsc91b4L5ChqPFoHRgoYD/MZ5MVqBOnwn9h6+FaU60GIx2fQrcL80zOQY1hJ3Ij9IviUMc4tC5sXPlGAT5Hjev0BzwXw/y/Y2CwBPL1SbtRIxid8HUYr4YxCMftNDvRmbNQA9Z7LmIVjEqeg24vdodGIkcWw98xPgJGJWzuM5FVs9tC5AQ7fZs9J74YhsZc6HZjoLwdObDEc1LOObasWR2ORK+Bbr/lyBg+AT8oJ2MDZBqMODg+prUa2QXYBxmyAPrTsRJGKPdDt+P1yAi+zr3KSTh3uBXihFnBt+xvRNvyfWTEudCfii4YSbkPuj2nIwOegV53TYKRFNpMc9gjSAkDmduUg6+BUS0vI9qmzGxOtW7IPOhPw4UwquUi6HZNNdniSeWgzAhqg1EtHHbaioyLRXaEtfTqLhhpeQLRtuWM06rmoE+H/tqeByMtcxBtW06XGtZaDMkJnK1s53hXL4y0MH1iR8R29ns7KzeGOKxT2c5Ek5CFTAw/TDJdq/xvWPJpiMMmK9sz65Eb/yfsRJF4YJOLlGijyufDyAoOSWnthERDLmd7DhSyEJcRBhOVNDtPKf9hXJGoZTxxZqTVX9nBeqxf+d+QfPw4h2n11yYYWbNV2T5kqlKcw45Utm+AkTWaTYfkx8Q5TEtytM9hZI9m0yFzpaPyL64VXQYXLR6N6KXq+qGXuUZ1aLbm6kAsLplx9WjlP32ZvKYCqPwNay950aLvBaa8DmO+oTmr4JQ7bBeMwlPusO0wCk9lK5Fh/qjYFecm98CoJZymNCXuR1yRLKp18hSMWqN9F20IS5UfsfVYzZqERnXwzYpc/q8y0vEmIrwIF/GYB6NWXIPAfA4usfoNot8yrvTSSisB1IuJ0BfXXBe1w3LoPe3VMPKEJR7XM9HsvyhqJ9ZVvpmCNnc5H9hivxe63RlPVAeN4z6zuwBGlrC+4kIrPptf5TsAJ5X51gJkngeLzhEw0sK1PPgxcJ+z2A+OndnKZR3iVpZm5lQnjGqgA1gnfQW/jTkJZWLoQW9CWNifrRe+staK9MOSi8u43wN96nG5+MLMKT9AyARyrsV7I8LhUuBcFZv5+LthEI6C8GFmykXoCqwcuOQb+DASQqeGLJNqyk609VykhKkDSRbdN1Unlk6nICN4oB4AA6bMxSKQX6JI+xGfYXBWxaWIX9vXFC5OhuDXAHNdlIadPU5FehHJPnNhcuJnG9laTPQBuaw8yg40v+wzAS5bmCGUdtgyRoPwu5pMC2RgnRPO3yv9bRhGofgPHDlkgdvGDrIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABYCAYAAAAKsfL4AAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANESURBVHgB7ZyNbdswEIVfgw6QbsBu4A3qbpANrA2aTiBu4G4gd4KiE6idIN7A3iDZwBVrGXEM/dxJlE5S3gc8GDCkI3lPIinZJEAIIYQQQsjofICOdaEv5acrRYCXQvtCfwvtCh0RmXWhvNCJEilHxIszBXCiOilFTzLApOJLUoaOpIBJhZeoLZQkAKwrvTStUUHdLOgAznBicyz0+fbLu4oDH8DkD4FDzV1wS4b22ykvg92DBNaQTdMzSbCnliC/QOoIuWnK3UESpM1FB1KHQ3v+3lA1CJ/QjPb1xXtDlb87EFNogDE0wBgaYAwNMIYGGEMDjKEBxtAAY2iAMTTAGBpgDA0whgYYQwOMoQHG0ABjaIAxNMAYGmAMDTCGBhhDA4yhAcbQAGNogDE0wBgaYAwNMIYGGEMDjKEBxszVAIfzmqxnvC6bclgIqiU2Bji8Jv5a4bsV7Omdvykb4HBe6Na0CM7BlsUa4NCc/KmYMLgBFmuDQ5mS5F/0BLt69jagraEe49O2drnOhLH5hva7s5W2xcZBjxiPDPrkX5RhPNqSH5TfnvSxIlDYdusBzWzLAsM2XS81MXboT4rzzi1dSXCu33f0J8F5u7ZbQrezhqzL+yk45n+gqmlely6gTz+cRqjDRSm6E9qQR6jDAYrJgUechnt0I41UfoxucxupfA8lXQa+Wz1Dzwa6RnnF8RvoOSjiN139alykwjWsFHH91Xk/FOdpn5ZjJN+hIw79TNBMBR3kY8+u4vyd8FztK4tcGLeu/Q4R8B0rkAjjO8iNbjJV2m1qrsoEujZfTPaI/DDoyqCSRoYKSAc9B3nyw3FNjbrHMCZ4RUwPReK77v0TCliVn7eFhXn3H1Q/H1TFkd6mx0Jf0b4tsIN859p9GVNSV4f67Zr3Zb0kcSbFEFcrEK9LWzQZ5P2pg54V5IN6hndGCvmA1udHFs20Vr277VzRJD9BfxJFeSkWjib5HvF4VJQ75pveUdnAJvkXvKL8DRaGpi+eiqbwA38UHOK83h5bXWdfk0PyC9tUlWNgxtgF94T5Ep5sP2FAxvhn3Owez68Y/J8VYxiwx3z5jQXgwEHYHIf5DMYh8Tm4TT8hhBBCCFku/wBQkmbzY/mZVAAAAABJRU5ErkJggg==\"","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, CardContent, Typography, Grid, Chip, CardMedia } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport clock from '../../assets/clock.png';\n\nconst styles = (theme) => ({\n name: {\n fontFamily: \"'Lato', sans-serif\",\n fontStyle: 'normal',\n fontWeight: 'bold',\n fontSize: '20px',\n lineHeight: '17px',\n },\n description: {\n fontFamily: \"'Lato', sans-serif\",\n fontStyle: 'normal',\n fontWeight: 'normal',\n fontSize: '30px',\n lineHeight: '175%',\n color: '#555555',\n },\n});\n\nclass ComingSoon extends React.Component {\n render() {\n const { classes } = this.props;\n return (\n \n \n \n \n \n Hold on! Something exciting is coming up! \n \n \n \n \n \n );\n }\n}\n\nexport default withRouter(withStyles(styles)(ComingSoon));\n","import React from 'react';\nimport { BrowserRouter, Redirect, Route, Switch, withRouter } from 'react-router-dom';\nimport { Grid } from '@material-ui/core';\n\nimport Home from './Home';\nimport CampaignDashboard from './CampaignDashboard';\nimport MobileDashboard from './MobileDashboard';\nimport MobileCampaignDashboard from './MobileCampaignDashboard';\nimport Feed from './Feed/Feed';\nimport MobileFeed from './Feed/MobileFeed';\nimport NavigationBar from './NavigationBar';\nimport MobileNavigationBar from './MobileNavigationBar';\nimport MobileBottomHeader from './MobileBottomHeader';\nimport NavBar from '../brands/NavigationBar';\nimport ProfileSetup from './profile-setup/Index';\nimport Settings from './settings/Settings';\nimport MobileSettings from './settings/MobileSettings';\nimport Personal from './settings/MobilePersonal';\nimport Security from './settings/MobileSecurity';\nimport Social from './settings/MobileSocial';\nimport AboutMe from './settings/MobileAboutMe';\nimport ComingSoon from '../ux/ComingSoon';\n\nclass InfluencerRouter extends React.Component {\n render() {\n return (\n <>\n \n {JSON.parse(localStorage.getItem('user')).user_type != 'brand' ? (\n \n {window.matchMedia('(min-width: 768px)').matches ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n )}\n \n \n \n \n \n \n\n \n {window.matchMedia('(min-width: 768px)').matches ? (\n \n ) : (\n \n )}\n {window.matchMedia('(min-width: 768px)').matches ? (\n \n ) : (\n \n )}\n \n \n {window.matchMedia('(min-width: 768px)').matches ? (\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 {JSON.parse(localStorage.getItem('user')).user_type != 'brand' ? (\n \n {window.matchMedia('(min-width: 768px)').matches ? '' : }\n \n ) : (\n ''\n )}\n \n >\n );\n }\n}\n\nexport default withRouter(InfluencerRouter);\n","import { Component } from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Grid, Button } from '@material-ui/core';\n\n// import {INSTAGRAM_HOST, INSTAGRAM_APP_ID}\n\nclass InstagramLogin extends Component {\n login() {\n const url =\n 'https://api.instagram.com/oauth/authorize?client_id=487541268980617&redirect_uri=https://localhost:3000/instagram/callback/&scope=user_profile,user_media&response_type=code';\n window.location.href = encodeURI(url);\n }\n\n render() {\n return (\n \n \n {\n this.login();\n }}\n >\n \n Login with Instagram\n \n \n \n Logout from Instagram\n \n \n \n );\n }\n}\n\nexport default withRouter(InstagramLogin);\n","import { Button, Container, Grid, TextField } from '@material-ui/core';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\n\nimport Loading from '../../components/Common/Loading/Loading';\nimport FacebookLogin from '../../components/auth/FacebookLogin';\nimport YoutubeLogin from '../../components/auth/YoutubeLogin';\nimport ErrorDisplay from '../influencers/forms/ErrorDisplay';\n\nimport { authHandlers } from '../../api_handlers/auth';\nimport { colorConstants } from '../../constants/colors';\n\nclass Login extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n email: null,\n password: null,\n user_type: this.props.brand ? 'brand' : 'influencer',\n formErrors: {},\n is_form_error: false,\n };\n }\n\n componentDidUpdate(prevProps, prevState, snapshot) {\n if (prevProps.brand !== this.props.brand) {\n this.setState({ user_type: this.props.brand ? 'brand' : 'influencer' });\n }\n }\n checkUserState() {\n if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'brand'\n ) {\n this.props.history.push(\n `/brand/dashboard/${\n JSON.parse(localStorage.getItem('user')).brand.id === 260 ? 'instagram' : 'youtube'\n }`,\n );\n } else if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'influencer'\n ) {\n this.props.history.push('/influencer/campaigns');\n }\n }\n\n async registerToBackendFacebook(data) {\n const user = await authHandlers.facebookLogin(data);\n if (user) this.props.history.push('/influencer/campaigns');\n }\n\n async registerToBackendYoutube(data) {\n const user = await authHandlers.youtubeLogin(data);\n if (user) this.props.history.push('/influencer/campaigns');\n }\n\n componentDidMount() {\n this.checkUserState();\n }\n\n login() {\n const resp = authHandlers.login({\n email: this.state.email,\n password: this.state.password,\n user_type: this.state.user_type,\n });\n\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n const user = {\n first_name: userData.first_name,\n last_name: userData.last_name,\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n this.checkUserState();\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const errors = await response.json();\n this.setState({\n formErrors: errors,\n is_form_error: true,\n });\n }\n });\n }\n\n render() {\n return (\n <>\n {this.props.loading && }\n {this.state.user_type === 'influencer' ? (\n \n \n \n {\n this.registerToBackendFacebook(response);\n }}\n />\n \n \n \n \n {\n this.registerToBackendYoutube(response);\n }}\n />\n \n \n \n ) : (\n ''\n )}\n {this.state.user_type === 'influencer' ? or : ''}\n \n {this.state.is_form_error && (\n \n )}\n \n \n >\n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n loading: state.auth.loading,\n});\n\nconst actionCreators = {};\n\nexport default connect(mapStateToProps, actionCreators)(withRouter(Login));\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport Button from '@material-ui/core/Button';\nimport TextField from '@material-ui/core/TextField';\nimport Container from '@material-ui/core/Container';\n\nimport Loading from '../../components/Common/Loading/Loading';\nimport ErrorDisplay from '../influencers/forms/ErrorDisplay';\n\nimport { colorConstants } from '../../constants/colors';\nimport { authHandlers } from '../../api_handlers/auth';\n\nclass BrandSignUp extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: null,\n email: null,\n website_url: null,\n password: null,\n confirmedPassword: null,\n passwordOk: true,\n user_type: 'brand',\n formErrors: {},\n is_form_error: false,\n };\n }\n\n signUp(data) {\n const resp = authHandlers.signUp(data);\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n localStorage.setItem('extension',parseInt(1))\n const user = {\n first_name: userData.first_name,\n last_name: userData.last_name,\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n this.props.history.push('/brand/campaign');\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const errors = await response.json();\n this.setState({\n formErrors: errors,\n is_form_error: true,\n });\n }\n });\n }\n\n submitForm = (e) => {\n e.preventDefault();\n if (this.state.password === this.state.confirmedPassword) {\n this.setState({ passwordOk: true });\n const { passwordOk, confirmedPassword, name, website_url, ...apiData } = this.state;\n apiData.brand = {\n name,\n website_url,\n };\n this.signUp(apiData);\n } else this.setState({ passwordOk: false });\n };\n\n render() {\n return (\n <>\n {this.props.loading && }\n \n {this.state.is_form_error && (\n \n )}\n \n \n >\n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n loading: state.auth.loading,\n});\n\nconst actionCreators = {\n // signUp: authActions.signUp\n};\n\nexport default connect(mapStateToProps, actionCreators)(withRouter(BrandSignUp));\n","import { authConstants } from '../constants/auth';\nimport { authHandlers } from '../api_handlers/auth';\n\nexport const authActions = {\n login,\n signUp,\n storeUserData,\n};\n\nfunction login(userData) {\n return (dispatch) => {\n dispatch(request());\n\n return authHandlers.login(userData).then(\n (result) => {\n dispatch(success(result));\n },\n (error) => {\n dispatch(failure());\n },\n );\n };\n\n function request() {\n return { type: authConstants.LOGIN_REQUEST };\n }\n function success(user) {\n return { type: authConstants.LOGIN_SUCCESS, user };\n }\n function failure() {\n return { type: authConstants.LOGIN_FAILURE };\n }\n}\n\nfunction signUp(userData) {\n return (dispatch) => {\n dispatch(request());\n authHandlers.signUp(userData).then(\n (result) => {\n dispatch(success(result));\n },\n (error) => {\n dispatch(failure());\n },\n );\n };\n\n function request() {\n return { type: authConstants.SIGN_UP_REQUEST };\n }\n function success(user) {\n return { type: authConstants.SIGN_UP_SUCCESS, user };\n }\n function failure() {\n return { type: authConstants.SIGN_UP_FAILURE };\n }\n}\n\nfunction storeUserData(userData) {\n return (dispatch) => {\n if (userData) dispatch(success(userData));\n else dispatch(failure());\n };\n\n function success(user) {\n return { type: authConstants.STORE_USER_DATA, user };\n }\n function failure() {\n return { type: authConstants.SIGN_UP_FAILURE };\n }\n}\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { Grid, Button, TextField, Container } from '@material-ui/core';\n\nimport Loading from '../../components/Common/Loading/Loading';\nimport FacebookLogin from '../../components/auth/FacebookLogin';\nimport YoutubeLogin from '../../components/auth/YoutubeLogin';\nimport ErrorDisplay from '../influencers/forms/ErrorDisplay';\n\nimport { colorConstants } from '../../constants/colors';\nimport { authActions } from '../../actions/auth';\nimport { authHandlers } from '../../api_handlers/auth';\nimport PhoneInput from 'react-phone-input-2';\nimport 'react-phone-input-2/lib/material.css';\n\nclass InfluencerSignUp extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: null,\n email: null,\n phone_number: null,\n password: null,\n confirmedPassword: null,\n passwordOk: true,\n phoneNumberOk: true,\n user_type: 'influencer',\n formErrors: {},\n is_form_error: false,\n };\n }\n\n async signUp(e) {\n e.preventDefault();\n if (this.state.password === this.state.confirmedPassword && this.state.phone_number != null) {\n this.setState({ passwordOk: true, phoneNumberOk: true });\n const { passwordOk, confirmedPassword, name, phone_number, ...apiData } = this.state;\n apiData.influencer = {\n name,\n phone_number,\n };\n // this.props.signUp(apiData)\n const resp = authHandlers.signUp(apiData);\n\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n const user = {\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n this.props.history.push('/influencer/profile-setup');\n } else if (response.status === 400) {\n const errors = await response.json();\n this.setState({\n formErrors: errors,\n is_form_error: true,\n });\n }\n });\n } else if (this.state.password != this.state.confirmedPassword) {\n this.setState({ passwordOk: false });\n } else if (this.state.phone_number == null) {\n this.setState({ phoneNumberOk: false });\n }\n }\n\n async registerToBackendFacebook(data) {\n const user = await authHandlers.facebookLogin(data);\n if (user) this.props.history.push('/influencer/profile-setup');\n }\n\n async registerToBackendYoutube(data) {\n const user = await authHandlers.youtubeLogin(data);\n if (user) this.props.history.push('/influencer/profile-setup');\n }\n\n render() {\n const phone_number_style = { width: '100%', '-webkit-font-smoothing': '' };\n return (\n <>\n {this.props.loading && }\n \n \n \n \n {\n this.registerToBackendFacebook(response);\n }}\n />\n \n \n \n \n {\n this.registerToBackendYoutube(response);\n }}\n />\n \n \n \n {/* or */}\n\n {/* */}\n \n >\n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n loading: state.auth.loading,\n});\n\nconst actionCreators = {\n signUp: authActions.signUp,\n};\n\nexport default connect(mapStateToProps, actionCreators)(withRouter(InfluencerSignUp));\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAYCAMAAAAmopZHAAAA7VBMVEUAAAA5WZk5WZk5Wpk5WZk6V5k0WJY5WZk5WZg5WZk4WJg4WZk5WJo2Vpc5WZk5WZg5WZg2WZo5WZk5WZk6WZk5WZk5WZk5WZo4WZo4WJo3WZg5Vpg3WZs6WZk6WZk5Wpk4WJg6WJg3WZg3Wps2W5g6Wpn///82V5d0i7ddd6tTcKY1VZb19/rm6vMsT5Lx8/js7/WwvdfX3uqzwNhrhLM9XJuaqsqXqMmSo8d2jbkyU5UiRo37/P35+vz4+fvj5/Dh5u/b4ezP1+bCy9+sutSaqsuJnMJ/lL1vh7Rfea1QbaVOaqNLaKIwUpMrTpEdJEvHAAAAJXRSTlMA/ez15wgE06+efWJEDtq7WCX4yqOGc2dbUDYfF+G5k5CNSjMqbza7FwAAARFJREFUKM9tzeVyg1AQhuHFLVi0kXqXQ0gDhEAbqbvf/+WUHOQwnb5/dub58S3USaYpwd9GuqYe2KrWazV1rIlYxqtnNbcsbCQ6FfNIZnUEhT3K7j6Sr6DuM98a7VxF8pHMi+J4fvdOsCPnK20k0yuvKI49zyeI+VIXcz+nGr0geaRuAyjMF5tgdU9ddEFk/vyz8IodYQhC5dfJ6/cqiahzBvPbbZhtZw+FD4CvPHpKN/4yKnYcsNj+Rbgs9/lTsJlfhtVfRYIB94/rAJKS+01jJyUoTgDghMMs9fPWAZmu/bcM0YBdfURSRC/ikUxd1jlsdmhC2dBiKhoy1Jn9Di9wXJtX9Ak0k8dOT+seG65Uwi8PHz0KRBYxzgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAABDlBMVEUAAADVAF/YAF/dAGLVAGDVAF/WAF/YAF/eAFnVAF/VAF/WAGDXAGDVAF/VAF/VAF/VAGDVAGDXAF/bAFvVAF/VAF/VAF/VAF/VAGDVAF/WAF/VAF/VAF7VAF/WAF7WAF7VAF/VAGDVAF/WAGDVAF/WAF7WAF/ZAFnVAGDUAFrUAFz75vDVAF7TAFfeM4D52ejbJHf2xtz2wdjqgLDqe63iS4/eNYLXD2n64u3bH3PaG3HZGW/ZFGz87PP64ez63er51OX0vtfkWpjiUpPXCWb3z+H2yt7yrs3wo8XumsDodanob6bmaaLkXpvjVpbjVJTgRIvgQYjSAFTRAFD0w9rytNDxqsrtkLrlYp3cKXq73B6TAAAAKHRSTlMA2CAI/epnGgTnzlso+e7ClIQ/DvXh066qpJp8blRGNPbHtI15UTgUlah9HwAAAXNJREFUKM9dkXdXwjAUxV8LtGWIIMoebpMmHVSg7D0FRMT5/b+IrxQB/Z38kXNv7hsnsMcjh0KiB/5TyCTiF37hOnoGx8hpP9kRToYO+plAjvDn9rrzXKVbVLyeB11dvCCE06Ze0fHUKSfEdw8OSdSHM4NtMT7qlJArZ7r8OdaZtvtmrWnXzP6oN8SMUyyNAZOVNUrNb6pby84a+5wCKKeE0HLbVhtTxt7LpVpxgYZPhIcAGoMqJxNjXXkbc634hMblHYhxNJ6rtNLSNdpkg9diCQ2vBKLgGi+srnLe+XINkgXZKbWqqnZ3RmipVXNLnQTB4zYfYsTotpaUj+dohAsACVyjwkxNbSzmJtXszgoNQQGQvIR7R5MG1TYbjdqfrIELRgEgFsCIbhiW1etZVpeVKa4hA5L3YpfmoPTo0K+rGJBgyy2Ox9UdKJPI7oeVDGaOiMTgl5xwkH2SAgdi2YDvBPcKC1EZ/qCIwZtUKiKFPODyA++cR7AZdKfNAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAYCAYAAAARfGZ1AAAEtklEQVRIibWVy29UdRTHP/d3HzNz505nOn0OFCqtSMGiFKgEZIERkCiIEhNjRHaEKOpG/wDRREOiGDdGNygJgqw0FSSo0aA8K9Y0gAqltYVSStuZdjqd6Tzuw8Vv7LSVoBvP5t7ce873vL7nHPgfRaH2XvBccApwTwvULoKJOATLIVSxjmB0K2Z4Bb5AI0IL4dhp7Fw3E4kO0sk2UiPfkY6DVQmDXdDbAaoGikAruVHAzsPkOETr1jOveQ+hijWoOjh5sAvgOqD7QvitWiK1D+M4rzARb6f/8huM3T5OISdxiqISLJcfMkkIRGD55n00rPwQw5xHfhLsHDg2eJ608DxwbRmIa4MZnktN4/MEQjV0tx8jfh18QfA8VMLVkE1Lw/W7DtG0ZicDg5BIQs4GU58RzT/EzsuMqhe0YoaXceX0Eew8GCYqkZgsxYYX97Fy6066u2hdXMVb25Zihf1c7BoBQ71L1xTZs+wE1C9rwgzP5erZr/BbKNQ0QkPrKra8fo74EMLOkX73SfyaAGDh3h+41hOHSODu1PA80HQoq4av33+UP059L6hugBVb9uPYYGfxHI/eRGbKJpstgCruAHaHDOw8FLKwfPN+YvehsHH3atY8d4bJpFTK5EEVbLi/htN9o2TGsqAJGM0ACkT8MJEH25UedBUqgqXoAawonD2yUaOyfjuqDq4rjQ2NB+vCxDMFltaEOD+RZ36NxSOr63Fcj4Pt11nXWsdTzbXkCi5fXhrkbOcARM2SA0WFyvrtCi8fPEf53FXk0uB6MDZJx57HaJlTJrPdcZgdTyzmwLPLADj1Z4K1C6IzKrLp43OcON8H1ZYslxGA5FCnwGc1UsiWNIXCYCoHwK3xHKiCdN6Z+r12QZTLt1NcndaXt7csAU0Fu1iWQhZ8Zp1A1SM49oxI3GLt/n5O790nF/pp3v0Fi978lp6ig4aoiV5lybkASU2hhQROIYm4C49nyeHOARAKxDNc6JckMFSFgCZKDVUEuPaEIJfuwfD/Z3BTExDQIaBPMdR1PTxvWn66H/KZfsHYrQ4Ms+T1X0QTpVUgimthpqUnd0vy9kXBcN8hXEemMgtAV5UZIFPv3my96UOmyECH+z4TDFz5kZG+LqyobITrUeaXmzhqGuB6GGoJ3FCLxtP0/JqQu8115R1I9N/k5u/HFaobYeGqtWx+7SeSw5DL8cD8cqqCBpMFhzNdI1SVB1gaC4EHFwdTDI9OglBorgtTbfmwHZfTvQkcV0BFDI5/sInfTp5QqGuG8SHY9OpHPPT0LuK9kMhA3gEh5GBk8jAuuU+ZD4KGjH50UtJPUeSExhrgl2MHOfbeC1gVqFjl8spcaz9K5fwW5ixpQilAQAOzCKIJCRg05Lvrybr7NLnvLT+Ux+Da+W9o27sNzwXdh4oZAd2A7DiMD39OtC5GpGYlqsbs4bqj+INy3Id6DnDy02dIXJd1d11UQhWykZoOkTmQTR0lNfIrgVATgVAMIwAKRap6klWaAT4TVB3So5fo/vklblx+h2xKXjWFWQfa80D3gd+C4d42sqk2QpWPY1VsxSxrQffPQ2hBnEKGXPoG6dFOMmNtJIfaSI1AqAIMvwwUSc2/AA3f27Lz6BkBAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAz1BMVEUAAABPsPdUrO5UrO5UrO9Dvf9UrO5UrO9TrO9SrfZUrO5UrO5Vq+5UrO9UrO9TrO9SrfFTrO9TrPNUq/FGuf9Rrv9UrO5UrO5UrO9UrO5VrO5UrO5VrO5Vre5Ure5Sre9SrfFVq+5Ure9Uq+9Uq+5Uq+5VrO7///9Sq+5UrO5Oqe5Qqu5MqO7y+f6Ew/N3vfJuuPFhsu/t9v3k8v3m9Py93/iazvVqtvD7/f/2+/623Pir1veKxvSBwvJyuvHO6PrN5/qj0/ah0fV+wPJHpezv2Rm0AAAAJnRSTlMAE+/gmgTIY08Y6NbPwahuNS0nIgwI97u2rqKSh1pWPRH8inlnSdzqMCwAAAEmSURBVCjPXZFXdoMwEEXHNONe4x7baWMVTHHvqftfUzQgQvD9QId3zxuQBH/MO+1OCe55mI5rlbLpWMW8c50n1FQaWWxPepjB64V0jIV5+tq84D0jm/JmT9UZR3oiMkamSB8YqbdoL5gSu83my79KREcN6xiInr++eJ68LIidanMX4FE1RXA8bK/sRPk6lCqZAIzVIqP3xeK4XpLY/qBi0IU6NW4q05wFiWoBhvHvfKbmEDAtLKRKuNLigyNR60KDViZ3SWV5k0hYNjRpVBQGW8pXvuCod9itqcL+TKM2p1BgjNmGZCMsCnz/ey91js/x4Q7JCM/zBE/vpAREu4p5jBkktJxcbr5BSsniWT5owT9mdbNsGEbZ7Ls25Ji33GLjddosgOYXcgs+X37jN74AAAAASUVORK5CYII=\"","import { Component } from 'react';\n\nimport Grid from '@material-ui/core/Grid';\nimport fbLogo from '../../assets/fb.png';\nimport instaLogo from '../../assets/insta.png';\nimport linkedinLogo from '../../assets/linknew.png';\nimport twitterLogo from '../../assets/twitter.png';\nimport youtubeLogo from '../../assets/youtube-logo.png';\n\nclass Footer extends Component {\n render() {\n return (\n \n \n \n \n Terms\n \n | \n \n Contact Us\n \n | \n \n Privacy Policy\n \n | \n \n Disclousre\n \n | \n \n YouTube Terms of Service\n \n | \n \n Google Privacy Policy\n \n | \n \n Google Security Settings\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 PRODUCT OF SOCIAL BEAT\n \n \n \n );\n }\n}\n\nexport default Footer;\n","import { Component } from 'react';\n\nimport Grid from '@material-ui/core/Grid';\nimport fbLogo from '../../assets/fb.png';\nimport instaLogo from '../../assets/insta.png';\nimport linkedinLogo from '../../assets/linknew.png';\nimport twitterLogo from '../../assets/twitter.png';\nimport youtubeLogo from '../../assets/youtube-logo.png';\n\nclass MobileFooter extends Component {\n render() {\n return (\n \n \n \n \n Terms\n \n | \n \n Contact Us\n \n | \n \n Privacy Policy\n \n | \n \n Disclousre\n \n | \n \n YouTube Terms of Service\n \n | \n \n Google Privacy Policy\n \n | \n \n Google Security Settings\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 PRODUCT OF SOCIAL BEAT\n \n \n \n );\n }\n}\n\nexport default MobileFooter;\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider } from '@material-ui/core';\nimport qs from 'qs';\n\nimport FacebookLogin from '../../components/auth/FacebookLogin';\nimport InstagramLogin from '../../components/auth/InstagramLogin';\nimport NativeLogin from '../../components/Common/Login';\nimport BrandSignUp from '../../components/Brand/SignUp';\nimport InfluencerSignUp from '../../components/Influencer/SignUp';\nimport Footer from '../../components/auth/Footer';\nimport MobileFooter from '../../components/auth/MobileFooter';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport signupImageWeb from '../../assets/signup_web.jpeg';\nimport signupImageMobile from '../../assets/signup_mobile.jpeg';\n\nimport './LoginPage.styles.css';\n\nconst responseInstagram = (response) => {};\n\nclass LoginPage extends React.Component {\n constructor(props) {\n super(props);\n\n this.isRefererNomination = getCookie('nomination_form_id');\n this.influencerHeadline = this.isRefererNomination\n ? \"You're almost done!\"\n : 'Make your Brand go Viral';\n this.influencerSubtitle = this.isRefererNomination\n ? 'Link your Social Media platforms to complete your nomination'\n : 'Collaborate with the best content creators and reach out to millions of users with Ease';\n\n this.state = {\n login: true,\n brand: true,\n style: {\n headline: this.influencerHeadline,\n subtitle: this.influencerSubtitle,\n className: 'bg-influencer',\n },\n };\n }\n\n brandHeadline = 'Get paid for being yourself!';\n brandSubtitle =\n 'Connect with 1000s of brands to help them reach out to their potential customers by ' +\n 'creating high quality content.';\n\n toggleLogin = () => this.setState({ login: !this.state.login });\n\n toggleUser = (event, brand) => {\n this.setState({ brand: !brand }, () => {\n if (this.state.brand) {\n this.setState({\n style: {\n className: 'bg-brand',\n headline: this.brandHeadline,\n subtitle: this.brandSubtitle,\n },\n });\n } else {\n this.setState({\n style: {\n className: 'bg-influencer',\n headline: this.influencerHeadline,\n subtitle: this.influencerSubtitle,\n },\n });\n }\n });\n };\n\n indicatorStyles = (theme) => ({\n indicator: {\n backgroundColor: this.state.brand ? colorConstants.BRAND_RED : colorConstants.INFLUENCER_BLUE,\n },\n });\n\n componentDidMount() {\n if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'brand'\n ) {\n this.props.history.push(\n `/brand/dashboard/${\n JSON.parse(localStorage.getItem('user')).brand.id === 260 ? 'instagram' : 'youtube'\n }`,\n );\n } else if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'influencer'\n ) {\n this.props.history.push('/influencer');\n }\n\n const queryParams = qs.parse(this.props.location.search.replace('?', ''));\n if (queryParams.t === 'inf-signup') {\n this.setState({\n login: false,\n brand: false,\n });\n }\n if (queryParams.t === 'brand-signup') {\n this.setState({\n login: false,\n brand: true,\n });\n }\n if (queryParams.t === 'inf-login') {\n this.setState({\n login: true,\n brand: false,\n });\n }\n if (queryParams.t === 'brand-login') {\n this.setState({\n login: true,\n brand: true,\n });\n }\n const url_attr = this.props.location.pathname.split('/');\n if (url_attr[2] != 'undefined') {\n if (url_attr[1] === 'signup' && url_attr[2] === 'creators') {\n this.setState({\n login: false,\n brand: false,\n });\n }\n if (url_attr[1] === 'signup' && url_attr[2] === 'brands') {\n this.setState({\n login: false,\n brand: true,\n });\n }\n if (url_attr[1] === 'login' && url_attr[2] === 'creators') {\n this.setState({\n login: true,\n brand: false,\n });\n }\n if (url_attr[1] === 'login' && url_attr[2] === 'brands') {\n this.setState({\n login: true,\n brand: true,\n });\n }\n }\n }\n\n render() {\n const background_image = window.matchMedia('(min-width: 768px)').matches\n ? 'https://influencer-media.s3.ap-south-1.amazonaws.com/signup_web_new.jpeg'\n : 'https://influencer-media.s3.ap-south-1.amazonaws.com/signup_mobile_new.jpeg';\n return (\n \n \n
\n \n \n {/*\n {this.state.style.headline}\n \n \n {this.state.style.subtitle}\n
*/}\n \n \n \n \n \n \n {this.state.login && }\n {!this.state.login && (this.state.brand ? : )}\n \n \n Forgot Password?\n \n {/* \n {this.state.login ? 'I want to create an Account' : 'I already have an account'}\n */}\n \n \n \n \n \n {window.matchMedia('(min-width: 768px)').matches ? : }\n \n \n );\n }\n}\n\nexport default withRouter(LoginPage);\n","export default __webpack_public_path__ + \"static/media/signup_web.b753b5b6.jpeg\";","export default __webpack_public_path__ + \"static/media/signup_mobile.8b6638b0.jpeg\";","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { Grid, Button, TextField, Container } from '@material-ui/core';\n\nimport Loading from '../../components/Common/Loading/Loading';\nimport FacebookLogin from '../../components/auth/FacebookLogin';\nimport YoutubeLogin from '../../components/auth/YoutubeLogin';\nimport ErrorDisplay from '../influencers/forms/ErrorDisplay';\n\nimport { colorConstants } from '../../constants/colors';\nimport { authActions } from '../../actions/auth';\nimport { authHandlers } from '../../api_handlers/auth';\nimport PhoneInput from 'react-phone-input-2';\nimport 'react-phone-input-2/lib/material.css';\n\nclass MobileInfluencerSignUp extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: null,\n email: null,\n phone_number: null,\n password: null,\n confirmedPassword: null,\n passwordOk: true,\n phoneNumberOk: true,\n user_type: 'influencer',\n formErrors: {},\n is_form_error: false,\n };\n }\n\n async signUp(e) {\n e.preventDefault();\n if (this.state.password === this.state.confirmedPassword && this.state.phone_number != null) {\n this.setState({ passwordOk: true, phoneNumberOk: true });\n const { passwordOk, confirmedPassword, name, phone_number, ...apiData } = this.state;\n apiData.influencer = {\n name,\n phone_number,\n };\n // this.props.signUp(apiData)\n const resp = authHandlers.signUp(apiData);\n\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n const user = {\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n this.props.history.push('/influencer/profile-setup');\n } else if (response.status === 400) {\n const errors = await response.json();\n this.setState({\n formErrors: errors,\n is_form_error: true,\n });\n }\n });\n } else if (this.state.password != this.state.confirmedPassword) {\n this.setState({ passwordOk: false });\n } else if (this.state.phone_number == null) {\n this.setState({ phoneNumberOk: false });\n }\n }\n\n async registerToBackendFacebook(data) {\n const user = await authHandlers.facebookLogin(data);\n if (user) this.props.history.push('/influencer/profile-setup');\n }\n\n async registerToBackendYoutube(data) {\n const user = await authHandlers.youtubeLogin(data);\n if (user) this.props.history.push('/influencer/profile-setup');\n }\n\n render() {\n const phone_number_style = { width: '100%', '-webkit-font-smoothing': '' };\n return (\n <>\n {this.props.loading && }\n \n \n \n {\n this.registerToBackendFacebook(response);\n }}\n />\n \n \n {\n this.registerToBackendYoutube(response);\n }}\n />\n \n \n {/* or */}\n\n {/* */}\n \n >\n );\n }\n}\n\nconst mapStateToProps = (state) => ({\n loading: state.auth.loading,\n});\n\nconst actionCreators = {\n signUp: authActions.signUp,\n};\n\nexport default connect(mapStateToProps, actionCreators)(withRouter(MobileInfluencerSignUp));\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider } from '@material-ui/core';\nimport qs from 'qs';\n\nimport FacebookLogin from '../../components/auth/FacebookLogin';\nimport InstagramLogin from '../../components/auth/InstagramLogin';\nimport NativeLogin from '../../components/Common/Login';\nimport BrandSignUp from '../../components/Brand/SignUp';\nimport MobileInfluencerSignUp from '../../components/Influencer/MobileSignUp';\nimport Footer from '../../components/auth/Footer';\nimport MobileFooter from '../../components/auth/MobileFooter';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport signupImageWeb from '../../assets/signup_web.jpeg';\nimport signupImageMobile from '../../assets/signup_mobile.jpeg';\n\nimport './MobileLoginPage.styles.css';\n\nconst responseInstagram = (response) => {};\n\nclass MobileLoginPage extends React.Component {\n constructor(props) {\n super(props);\n\n this.isRefererNomination = getCookie('nomination_form_id');\n this.influencerHeadline = this.isRefererNomination\n ? \"You're almost done!\"\n : 'Make your Brand go Viral';\n this.influencerSubtitle = this.isRefererNomination\n ? 'Link your Social Media platforms to complete your nomination'\n : 'Collaborate with the best content creators and reach out to millions of users with Ease';\n\n this.state = {\n login: true,\n brand: true,\n style: {\n headline: this.influencerHeadline,\n subtitle: this.influencerSubtitle,\n className: 'mobile-bg-influencer',\n },\n };\n }\n\n brandHeadline = 'Get paid for being yourself!';\n brandSubtitle =\n 'Connect with 1000s of brands to help them reach out to their potential customers by ' +\n 'creating high quality content.';\n\n toggleLogin = () => this.setState({ login: !this.state.login });\n\n toggleUser = (event, brand) => {\n this.setState({ brand: !brand }, () => {\n if (this.state.brand) {\n this.setState({\n style: {\n className: 'mobile-bg-brand',\n headline: this.brandHeadline,\n subtitle: this.brandSubtitle,\n },\n });\n } else {\n this.setState({\n style: {\n className: 'mobile-bg-influencer',\n headline: this.influencerHeadline,\n subtitle: this.influencerSubtitle,\n },\n });\n }\n });\n };\n\n indicatorStyles = (theme) => ({\n indicator: {\n backgroundColor: this.state.brand ? colorConstants.BRAND_RED : colorConstants.INFLUENCER_BLUE,\n },\n });\n\n componentDidMount() {\n var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n if (userAgent.includes('Android')) {\n window.location.href = 'influencer://open';\n setTimeout(function () {\n window.location.href = 'https://play.google.com/store/apps/details?id=in.influencer';\n }, 3000);\n } else if (userAgent.includes('iPhone')) {\n window.location.href = 'influencer://open';\n setTimeout(function () {\n window.location.href = 'https://apps.apple.com/us/app/influencer-in/id1640001193';\n }, 3000);\n }\n if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'brand'\n ) {\n this.props.history.push('/brand/dashboard/youtube');\n } else if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'influencer'\n ) {\n this.props.history.push('/influencer');\n }\n\n const queryParams = qs.parse(this.props.location.search.replace('?', ''));\n if (queryParams.t === 'inf-signup') {\n this.setState({\n login: false,\n brand: false,\n });\n }\n if (queryParams.t === 'brand-signup') {\n this.setState({\n login: false,\n brand: true,\n });\n }\n if (queryParams.t === 'inf-login') {\n this.setState({\n login: true,\n brand: false,\n });\n }\n if (queryParams.t === 'brand-login') {\n this.setState({\n login: true,\n brand: true,\n });\n }\n const url_attr = this.props.location.pathname.split('/');\n if (url_attr[2] != 'undefined') {\n if (url_attr[1] === 'signup' && url_attr[2] === 'creators') {\n this.setState({\n login: false,\n brand: false,\n });\n }\n if (url_attr[1] === 'signup' && url_attr[2] === 'brands') {\n this.setState({\n login: false,\n brand: true,\n });\n }\n if (url_attr[1] === 'login' && url_attr[2] === 'creators') {\n this.setState({\n login: true,\n brand: false,\n });\n }\n if (url_attr[1] === 'login' && url_attr[2] === 'brands') {\n this.setState({\n login: true,\n brand: true,\n });\n }\n }\n }\n\n render() {\n const background_image = window.matchMedia('(min-width: 768px)').matches\n ? 'https://influencer-media.s3.ap-south-1.amazonaws.com/signup_web_new.jpeg'\n : '';\n return (\n \n \n \n
\n
\n
\n
\n \n \n \n \n \n {this.state.login && }\n {!this.state.login &&\n (this.state.brand ? : )}\n \n \n Forgot Password?\n \n {/*\n {this.state.login ? 'I want to create an Account' : 'I already have an account'}\n */}\n \n \n
\n
\n \n \n {window.matchMedia('(min-width: 768px)').matches ? : }\n \n \n );\n }\n}\n\nexport default withRouter(MobileLoginPage);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport LoginPage from './LoginPage';\nimport MobileLoginPage from './MobileLoginPage';\n\nclass LoginWrapper extends React.Component {\n render() {\n return (\n <>{window.matchMedia('(min-width: 768px)').matches ? : }>\n );\n }\n}\n\nexport default withRouter(LoginWrapper);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAPiSURBVHgB7dw/bhxlGMfxZ2btlJHpqNAeAU5ATgDJCVAKCqqEEyQ+AelSAEpu4EAuEE4AN2BERbmitL0eZjYriyXGDu/zvo6VfD5VZMuzP1kT758Zfbu4xMGzo4PbZ3sPxnG808W4jOiW22+txojfujF+Oj5dv/jzm3tDvAP2vft93UVf/Pjp0XJ/f/Fs+uadeAtjF89PjteH1/WLsC+n5r43TqBPfnj5YPqRx9M/D+L/WcUYh398/cWTaMi+nNr7+p2D//jy0XTwJwUHj83PdPHd62O0YV9Oi33nf4G2Z2ads3+Mb2v/T7Ivp9W+zQk0Pyfe2l/8GmVn5kVWxyfrz2o9p9uX03Lf5ilsekH1qOLBZwfzi7SoxL6clvu67dn5ezTw12L90er+vVUk2Hez9/W39hZ3o5Hbp/3DSLIvp/W+vuviy2hk7LrPI8m+nNb7+ukTx0+jkWn8MpLsy2m9b34RXfPF1a4x/wsI+7Ka7usDEqYTaByindQ7iNfsy2m7r++iG6KR+YpuJNmX03pfP13K/yUamW8HiCT7clrv6/u9s6rXXP6pP12/iCT7ksdovK8fpk86pwtir6K2Lp4PFa7l2JfTet/mXVh3sr4fVV6wnVv1x+vDqMS+nJb7NifQ5kwfo9rg+VhDxbvr7Mtpue/8c6DN/R3jmH+Q6Rgt7qqzL6fVvjdvaf3+54fTV0su/1/PLZn2pdTed+FN9cunR8uzvf7xdLHjq3gL0+cBrxbT82zNP7uXsS+n5r4urnygxd35iu72otz2rB2HcfqAqps+Y5jfJg7Je1ZK2fd+7wMAAAAAAAAAAK7XpTeU6TDbpxMd9v2bTrR9xXSi7SumE21fMZ1o+4rpRNuXohNtXzGdaPtSdKLtS9GJti9FJ9q+LJ1obi6d6DSd6CEa0WHO0YnWYU7RidZhzh1bJ1qHuZhOtA5zgk60DnOCTrQOczGdaB1mnWgd5hSd6J0H0jm2TycaAAAAAAAAAAA+BDrR9ulEX8W+XTrR9hXTibavmE60fcV0ou0rphNtX4pOtH3FdKLtS9GJti9FJ9q+FJ1o+7J0orm5dKLTdKKHaESHOUcnWoc5RSdahzl3bJ1oHeZiOtE6zAk60TrMCTrROszFdKJ1mHWidZhTdKJ3Hkjn2D6daAAAAAAAAAAA+BDoRNunE30V+3bpRNtXTCfavmI60fYV04m2r5hOtH0pOtH2FdOJti9FJ9q+FJ1o+1J0ou3L0onm5tKJTtOJHqIRHeYcnWgd5hSdaB3m3LF1onWYi+lE6zAn6ETrMCfoROswF9OJ1mHWidZhTtGJ3nkgnWP7/nvf38vqVEw8SCF7AAAAAElFTkSuQmCC\"","import { devConfig } from '../config';\nimport { getCookie } from '../components/utils';\n\nconst BASE_URL = `${devConfig.API_HOST}/api/v1`;\nconst BASE_URL_2 = `${devConfig.API_HOST}/api/v2`;\nconst headers = {\n 'Content-Type': 'application/json',\n};\nif (localStorage.getItem('access')) {\n headers['Authorization'] = `Bearer ${localStorage.getItem('access')}`;\n}\n\nfunction priceIndex(userData) {\n return fetch(`${BASE_URL}/price-index/`, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(userData),\n });\n}\n\nfunction priceIndexDemo(userData) {\n return fetch(`${BASE_URL_2}/price-index/`, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(userData),\n });\n}\n\nfunction emailRequired() {\n return fetch(`${BASE_URL}/price-index-email/`, {\n method: 'POST',\n headers: headers,\n });\n}\n\nexport const nonAuthHandlers = {\n priceIndex,\n priceIndexDemo,\n emailRequired,\n};\n","import { noAuthAPIServer } from './index';\n\nexport function fetchYoutubePriceIndex(url, email, category_multiplier) {\n return noAuthAPIServer.get('/extra/price-index/youtube', {\n params: {\n channel_url: url,\n category_multiplier: category_multiplier,\n email: email,\n },\n });\n}\n\nexport function fetchYoutubePriceIndexDemo(url, email) {\n return noAuthAPIServer.get('/extra/price-index2/youtube', {\n params: {\n channel_url: url,\n email: email,\n },\n });\n}\n\nexport function saveContactUsDetails(data) {\n return noAuthAPIServer.post('/extra/contact-us', JSON.stringify(data));\n}\n","import React from 'react';\nimport {\n Grid,\n TextField,\n FormControl,\n FormLabel,\n RadioGroup,\n FormControlLabel,\n Radio,\n Button,\n Snackbar,\n Divider,\n} from '@material-ui/core';\n\nimport { saveContactUsDetails } from '../../api_handlers/extra';\n\nclass ContactUs extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n name: null,\n email: null,\n phone: null,\n launchTime: null,\n budget: null,\n snackbarOpen: false,\n errors: null,\n };\n }\n\n saveForm() {\n this.setState({ errors: null });\n const { name, email, phone, launchTime, budget } = this.state;\n const data = {\n name,\n email,\n phone,\n budget,\n launch_time: launchTime,\n };\n saveContactUsDetails(data)\n .catch(async (errors) => {\n return errors.response;\n })\n .then(async (response) => {\n if ([200, 201].includes(response.status)) {\n this.setState({\n snackbarOpen: true,\n });\n setTimeout(() => {\n this.setState({\n snackbarOpen: false,\n });\n }, 5000);\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const errors = {};\n Object.keys(response.data).forEach((key) => (errors[key] = response.data[key][0]));\n console.log('errors data', errors);\n this.setState({\n errors: errors,\n });\n }\n });\n }\n\n render() {\n return (\n \n \n \n Contact Us\n \n \n \n \n \n \n \n \n {this.state.errors ? (\n \n {Object.keys(this.state.errors).map((key) => {\n return (\n \n {key}: {this.state.errors[key]}\n \n );\n })}\n \n ) : (\n ''\n )}\n \n \n \n Name\n \n \n :\n \n \n {\n this.setState({ name: event.target.value });\n }}\n InputLabelProps={{ shrink: false }}\n style={{\n width: '100%',\n background: '#F9F9F9',\n }}\n InputProps={{\n style: {\n fontSize: 13,\n },\n }}\n />\n \n \n \n \n Email\n \n \n :\n \n \n {\n this.setState({ email: event.target.value });\n }}\n InputLabelProps={{ shrink: false }}\n style={{\n width: '100%',\n background: '#F9F9F9',\n }}\n InputProps={{\n style: {\n fontSize: 13,\n },\n }}\n />\n \n \n \n \n Phone\n \n \n :\n \n \n {\n this.setState({ phone: event.target.value });\n }}\n InputLabelProps={{ shrink: false }}\n style={{\n width: '100%',\n background: '#F9F9F9',\n }}\n InputProps={{\n style: {\n fontSize: 13,\n },\n }}\n />\n \n \n \n \n When do you want to lauch campaign\n \n \n :\n \n \n \n {\n this.setState({ launchTime: event.target.value });\n }}\n >\n } label=\"Today\" />\n } label=\"This Week\" />\n } label=\"This Month\" />\n }\n label=\"Not yet decided\"\n />\n \n \n \n \n \n \n Tentative Budget\n \n \n :\n \n \n \n {\n this.setState({ budget: event.target.value });\n }}\n >\n }\n label=\"Under Rs. 10 Lakhs\"\n />\n }\n label=\"Rs. 10 Lakhs - 50 Lakhs\"\n />\n }\n label=\"Rs. 50 Lakhs - 1 Crore\"\n />\n } label=\"Over Rs. 1 Crore\" />\n \n \n \n \n \n {\n this.saveForm();\n }}\n >\n Submit\n \n \n \n \n );\n }\n}\n\nexport default ContactUs;\n","export default __webpack_public_path__ + \"static/media/inf-avatar.e4f8cd16.png\";","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider, Avatar, Modal } from '@material-ui/core';\nimport qs from 'qs';\nimport Link from '@mui/material/Link';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport PriceIndexLogo from '../../assets/price_index.png';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport Button from '@material-ui/core/Button';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport { nonAuthHandlers } from '../../api_handlers/nonauth';\nimport { fetchYoutubePriceIndex } from '../../api_handlers/extra';\nimport Loading from '../../components/Common/Loading/Loading';\nimport ContactUsForm from '../../components/Common/ContactUsForm';\nimport toast, { Toaster } from 'react-hot-toast';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\n\nimport './PriceIndex.styles.css';\n\nimport AvatarImage from \"../../assets/discovery/inf-avatar.png\";\n\nconst responseInstagram = (response) => {};\n\nclass PriceIndex extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n youtube: false,\n insta_handle: null,\n youtube_url: null,\n data: null, //{\"data_exist\": true, \"follower_count\": \"69.1 M\", \"impressions\": 8361799, \"estimated_engagement\": \"987.3 K\", \"cost_min\": \"24.7 lac\", \"cost_max\": \"39.5 lac\", \"igtv_range\": [\"22.2 lac\", \"35.5 lac\"], \"reel_range\": [\"17.3 lac\", \"27.6 lac\"], \"st_video_range\": [\"9.9 lac\", \"15.8 lac\"], \"video_post_range\": [\"17.3 lac\", \"27.6 lac\"], \"story_n_swipe_range\": [\"7.4 lac\", \"11.8 lac\"], \"estimated_views\": \"1.7 M\", \"estimated_engagement_rate\": 1.43, \"estimated_engage_follower\": \"988.4 K\", \"insta_handle\": \"gal_gadot\", \"profile_pic_url\": \"https://instagram.flko7-1.fna.fbcdn.net/v/t51.2885-19/132197016_214462623590305_6641430723485871092_n.jpg?_nc_ht=instagram.flko7-1.fna.fbcdn.net&_nc_cat=1&_nc_ohc=-4GNkeOmOeAAX--DUwD&edm=AEF8tYYBAAAA&ccb=7-4&oh=f257fa779d5dfc677c41edb06913fc24&oe=61BCC62B&_nc_sid=a9513d\"},\n is_data_found: false,\n email_required: false,\n email: '',\n email_valid: true,\n emailModalOpen: false,\n is_loading: false,\n category: 1,\n };\n }\n\n toggleEmailModal = () => {\n this.setState({ emailModalOpen: !this.state.emailModalOpen });\n };\n\n toggleUser = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n insta_handle: null,\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n youtube_url: null,\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n handleChange = (event) => {\n const email = event.target.value;\n this.setState({ email: email });\n if (email && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(email)) {\n this.setState({\n email_valid: false,\n });\n } else {\n this.setState({\n email_valid: true,\n });\n }\n };\n\n toggleFaq = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n insta_handle: null,\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n youtube_url: null,\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n priceIndex(data) {\n const resp = nonAuthHandlers.priceIndex(data);\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n data: userData.data,\n email_required: userData.data.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 500, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n if (response.status == 400) {\n this.notify(errors.error);\n } else if (response.status == 504) {\n this.notify('Request Time Out.Please Try again later.');\n } else if (response.status == 500) {\n this.notify('Server Not reachable.Please Try again later.');\n } else {\n this.notify('Something went wrong.Please Try again later.');\n }\n }\n });\n }\n\n notify(message) {\n toast(message);\n }\n\n submitForm = (e) => {\n e.preventDefault();\n if (!this.state.email_required) {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndex({\n insta_handle: this.state.insta_handle,\n category_muliplier: this.state.category,\n email: this.state.email,\n });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndex();\n }\n } else {\n this.setState({\n emailModalOpen: true,\n });\n }\n };\n\n submitEmailForm() {\n if (!this.state.email) {\n return;\n } else if (\n this.state.email &&\n !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(this.state.email)\n ) {\n this.setState({\n email_valid: false,\n });\n } else {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndex({\n insta_handle: this.state.insta_handle,\n category_multiplier: this.state.category,\n email: this.state.email,\n });\n this.setState({ emailModalOpen: false });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndex();\n this.setState({ emailModalOpen: false });\n }\n }\n }\n\n async getYoutubePriceIndex() {\n try {\n var category_multiplier = 1;\n if (this.state.category) {\n category_multiplier = this.state.category;\n }\n const { data } = await fetchYoutubePriceIndex(\n this.state.youtube_url,\n this.state.email,\n this.state.category,\n );\n this.setState({\n is_loading: false,\n data: data,\n email_required: data.email_required,\n });\n if (data.message) {\n if (data.message == 'subscriber private or 0') {\n this.notify('Unable to calculate: Channel Subscriber are private or zero');\n } else {\n this.notify(data.message);\n }\n }\n } catch {\n this.setState({ is_loading: false });\n }\n }\n async isEmailRequired() {\n const resp = nonAuthHandlers.emailRequired();\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n email_required: userData.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n }\n });\n }\n componentDidMount() {\n this.isEmailRequired();\n }\n\n render() {\n return (\n \n {this.state.is_loading && }\n \n \n \n \n \n \n \n \n \n {' '}\n \n Influencer.in\n {' '}\n Price Index\n \n \n Evaluate the potential cost for different types of influencer collaborations\n based on profile performance analytics.\n \n \n \n \n \n \n }\n label={'Instagram'}\n style={{\n color: this.state.youtube ? '' : '#F2643E',\n fontWeight: this.state.youtube ? '' : 'bold',\n }}\n />\n }\n label={'Youtube'}\n style={{\n color: this.state.youtube ? colorConstants.BRAND_RED : '',\n fontWeight: this.state.youtube ? 'bold' : '',\n }}\n />\n \n \n \n * This calculator only shows results for influencers with\n Business or Creator accounts and is in Beta. If you have any inputs on a\n specific calculation, please DM us on Insta\n {/*( \n @influencer.in\n )*/}\n . \n Please note: This is only a broad estimate based on available\n data and may vary significantly.\n \n \n \n \n {' '}\n \n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n \n \n \n \n \n Esitmated Price\n \n \n ₹{this.state.data.cost_min} - ₹{this.state.data.cost_max}\n \n \n \n \n \n \n \n {this.state.youtube\n ? this.state.data.title\n : `@${this.state.data.insta_handle}`}\n {' '}\n can charge{' '}\n \n ₹{this.state.data.cost_min} – ₹{this.state.data.cost_max}\n \n \n {this.state.youtube\n ? this.state.data.title\n : `@${this.state.data.insta_handle}`}{' '}\n is expected to engage an estimated{' '}\n {this.state.data.estimated_engage_follower} followers,\n capture a projected {this.state.data.estimated_views} {' '}\n views and generate an average engagement rate of{' '}\n {this.state.data.estimated_engagement_rate}% on execution\n of brand collaboration on their\n {this.state.youtube ? ' Youtube Feed' : ' Instagram feed.'}\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {this.state.data.estimated_engagement}\n \n \n Est. Engagement\n \n \n \n \n \n \n \n \n \n \n {this.state.data.estimated_engagement_rate}%\n \n \n Engagement Rate\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.state.youtube\n ? this.state.data.subscribers\n : this.state.data.follower_count}\n \n \n {this.state.youtube ? 'Subscribers' : 'Followers'}\n \n \n \n \n \n \n {this.state.data.estimated_views}\n \n \n Est. View\n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {this.state.data && this.state.data.data_exist ? (\n \n \n \n Deliverables\n \n \n Estimated Costing Range\n \n {this.state.data.st_video_range ? (\n <>\n \n Static\n \n \n ₹{this.state.data.st_video_range[0]} – ₹\n {this.state.data.st_video_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.story_n_swipe_range ? (\n <>\n \n Stories\n \n \n ₹{this.state.data.story_n_swipe_range[0]} – ₹\n {this.state.data.story_n_swipe_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.reel_range ? (\n <>\n \n Reels\n \n \n ₹{this.state.data.reel_range[0]} – ₹{this.state.data.reel_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.igtv_range ? (\n <>\n \n IGTV\n \n \n ₹{this.state.data.igtv_range[0]} – ₹{this.state.data.igtv_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.dedicated_range ? (\n <>\n \n Dedicated\n \n \n ₹{this.state.data.dedicated_range[0]} – ₹\n {this.state.data.dedicated_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.integrated_range ? (\n <>\n \n Integrated\n \n \n ₹{this.state.data.integrated_range[0]} – ₹\n {this.state.data.integrated_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.shorts_range ? (\n <>\n \n Shorts\n \n \n ₹{this.state.data.shorts_range[0]} – ₹{this.state.data.shorts_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.live_range ? (\n <>\n \n Live\n \n \n ₹{this.state.data.live_range[0]} – ₹{this.state.data.live_range[1]}\n \n >\n ) : (\n ''\n )}\n \n \n ) : null}\n \n \n \n \n \n \n \n \n \n \n Frequently Asked Questions\n \n \n \n \n \n \n \n \n What will the Influencer Price Index show me?\n \n \n \n \n \n \n \n The influencer price index is a tool that will present you with\n estimated commercials for the influencer’s profile. These prices are\n further segmented based on the percentage weights given to each\n deliverable as per industry standards.\n \n \n \n \n \n \n \n \n I’m a brand. Can I use this to estimate how much I should pay an\n influencer?\n \n \n \n \n \n \n \n This tool is a great aid in understanding how much to allocate for an\n influencer based on their estimated engagement and views. The brand\n using the projected kpis that a collaborative post would reach, will be\n able to approach an influencer with a fair price.\n \n \n \n \n \n \n \n \n How reliable is this calculator?\n \n \n \n \n \n \n \n The calculator is highly reliable as it analyzes the real- time data of\n an influencer’s profile and projects the estimated commercials based\n reach and engagement. The tool enables a brand/ influencer to initiate a\n conversation with the counterpart armed with the right set of data to\n fast-track collaborations.\n \n \n \n \n \n \n \n \n What are the metrics that impact the cost of influencer\n collaborations?\n \n \n \n \n \n \n \n Engagement rate ( which includes your views, likes and comments) and the\n reach impacts the cost of collaboration on Instagram. On Youtube, it is\n the views that majorly contribute to the prices.\n \n \n \n \n \n \n \n \n How is the pricing calculated on Instagram different from that on\n Youtube?\n \n \n \n \n \n \n \n Our tool for instagram is based on CPE ( cost per engagement) which\n includes the views , likes and comments whereas the Youtube pricing\n index is based on CPV ( cost per view) model.\n \n \n \n \n ;\n \n \n \n \n \n \n Want to connect with more influencers?\n \n \n Search top influencers with \n Influencer.in\n \n \n \n Sign Up Now\n \n \n \n \n \n \n \n \n
\n \n
Email \n
\n
\n \n Please Enter your Email to know the price Index\n \n \n \n Email:
\n \n \n \n \n {!this.state.email_valid ? (\n \n Email Not Vaild\n \n ) : null}\n \n \n
\n
\n \n Cancel\n \n this.submitEmailForm()}\n >\n Submit\n \n
\n
\n \n
\n \n \n );\n }\n}\n\nexport default withRouter(PriceIndex);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider, Avatar, Modal } from '@material-ui/core';\nimport qs from 'qs';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport PriceIndexLogo from '../../assets/price_index.png';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport Button from '@material-ui/core/Button';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport { nonAuthHandlers } from '../../api_handlers/nonauth';\nimport { fetchYoutubePriceIndex } from '../../api_handlers/extra';\nimport Loading from '../../components/Common/Loading/Loading';\nimport toast, { Toaster } from 'react-hot-toast';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport FormControl from '@mui/material/FormControl';\nimport Select from '@mui/material/Select';\n\nimport './MobilePriceIndex.styles.css';\n\nimport AvatarImage from \"../../assets/discovery/inf-avatar.png\";\n\nconst responseInstagram = (response) => {};\n\nclass MobilePriceIndex extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n youtube: false,\n insta_handle: null,\n youtube_url: null,\n data: null, //{\"data_exist\": true, \"follower_count\": \"69.1 M\", \"impressions\": 8361799, \"estimated_engagement\": \"987.3 K\", \"cost_min\": \"24.7 lac\", \"cost_max\": \"39.5 lac\", \"igtv_range\": [\"22.2 lac\", \"35.5 lac\"], \"reel_range\": [\"17.3 lac\", \"27.6 lac\"], \"st_video_range\": [\"9.9 lac\", \"15.8 lac\"], \"video_post_range\": [\"17.3 lac\", \"27.6 lac\"], \"story_n_swipe_range\": [\"7.4 lac\", \"11.8 lac\"], \"estimated_views\": \"1.7 M\", \"estimated_engagement_rate\": 1.43, \"estimated_engage_follower\": \"988.4 K\", \"insta_handle\": \"gal_gadot\", \"profile_pic_url\": \"https://instagram.flko7-1.fna.fbcdn.net/v/t51.2885-19/132197016_214462623590305_6641430723485871092_n.jpg?_nc_ht=instagram.flko7-1.fna.fbcdn.net&_nc_cat=1&_nc_ohc=-4GNkeOmOeAAX--DUwD&edm=AEF8tYYBAAAA&ccb=7-4&oh=f257fa779d5dfc677c41edb06913fc24&oe=61BCC62B&_nc_sid=a9513d\"},\n is_data_found: false,\n email_required: false,\n email: '',\n email_valid: true,\n emailModalOpen: false,\n is_loading: false,\n category: 1,\n };\n }\n\n toggleEmailModal = () => {\n this.setState({ emailModalOpen: !this.state.emailModalOpen });\n };\n\n toggleUser = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n handleChange = (event) => {\n const email = event.target.value;\n this.setState({ email: email });\n if (email && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(email)) {\n this.setState({\n email_valid: false,\n });\n } else {\n this.setState({\n email_valid: true,\n });\n }\n };\n\n priceIndex(data) {\n const resp = nonAuthHandlers.priceIndex(data);\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n data: userData.data,\n email_required: userData.data.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 500, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n if (response.status == 400) {\n this.notify(errors.error);\n }\n }\n });\n }\n notify(message) {\n toast(message);\n }\n\n submitForm = (e) => {\n e.preventDefault();\n if (!this.state.email_required) {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndex({\n insta_handle: this.state.insta_handle,\n category_muliplier: this.state.category,\n email: this.state.email,\n });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndex();\n }\n } else {\n this.setState({\n emailModalOpen: true,\n });\n }\n };\n\n submitEmailForm() {\n if (!this.state.email) {\n return;\n } else if (\n this.state.email &&\n !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(this.state.email)\n ) {\n this.setState({\n email_valid: false,\n });\n } else {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndex({\n insta_handle: this.state.insta_handle,\n category_muliplier: this.state.category,\n email: this.state.email,\n });\n this.setState({ emailModalOpen: false });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndex();\n this.setState({ emailModalOpen: false });\n }\n }\n }\n\n async getYoutubePriceIndex() {\n try {\n const { data } = await fetchYoutubePriceIndex(\n this.state.youtube_url,\n this.state.email,\n this.state.category,\n );\n this.setState({\n is_loading: false,\n data: data,\n email_required: data.email_required,\n });\n } catch {\n this.setState({ is_loading: false });\n }\n }\n\n async isEmailRequired() {\n const resp = nonAuthHandlers.emailRequired();\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n email_required: userData.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n }\n });\n }\n componentDidMount() {\n this.isEmailRequired();\n }\n\n render() {\n return (\n \n {this.state.is_loading && }\n \n \n \n \n \n \n \n \n \n {' '}\n \n Influencer.in\n {' '}\n Price Index\n \n \n Evaluate the potential cost for different types of influencer collaborations\n based on profile performance analytics.\n \n \n \n \n \n \n }\n label={'Instagram'}\n style={{\n color: this.state.youtube ? '' : '#F2643E',\n fontWeight: this.state.youtube ? '' : 'bold',\n }}\n />\n }\n label={'Youtube'}\n style={{\n color: this.state.youtube ? colorConstants.BRAND_RED : '',\n fontWeight: this.state.youtube ? 'bold' : '',\n }}\n />\n \n \n \n * This calculator only shows results for influencers with\n Business or Creator accounts and is in Beta. If you have any inputs on a\n specific calculation, please DM us on Insta\n {/*( \n @influencer.in\n )*/}\n . \n Please note: This is only a broad estimate based on available\n data and may vary significantly.\n \n \n \n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n \n \n \n \n \n Esitmated Price\n \n \n ₹{this.state.data.cost_min} - ₹{this.state.data.cost_max}\n \n \n \n \n \n \n @{this.state.data.insta_handle} can charge{' '}\n \n ₹{this.state.data.cost_min} – ₹{this.state.data.cost_max}\n \n @{this.state.data.insta_handle} is expected to engage an\n estimated {this.state.data.estimated_engage_follower} {' '}\n followers, capture a projected{' '}\n {this.state.data.estimated_views} views and generate an\n average engagement rate of{' '}\n {this.state.data.estimated_engagement_rate}% on execution\n of brand collaboration on their\n {this.state.youtube ? ' Youtube Feed' : ' Instagram feed.'}.\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {this.state.data.estimated_engagement}\n \n \n Est. Engagement\n \n \n \n \n \n \n \n \n \n \n {this.state.data.estimated_engagement_rate}%\n \n \n Engagement Rate\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.state.data.follower_count}\n \n \n Followers\n \n \n \n \n \n \n {this.state.data.estimated_views}\n \n \n Est. View\n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n Deliverables\n \n \n Estimated Costing Range\n \n \n\n {this.state.data.st_video_range ? (\n <>\n \n \n Static\n \n \n ₹{this.state.data.st_video_range[0]} – ₹\n {this.state.data.st_video_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.story_n_swipe_range ? (\n <>\n \n \n Stories\n \n \n ₹{this.state.data.story_n_swipe_range[0]} – ₹\n {this.state.data.story_n_swipe_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.reel_range ? (\n <>\n \n \n Reels\n \n \n ₹{this.state.data.reel_range[0]} – ₹{this.state.data.reel_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.igtv_range ? (\n <>\n \n \n IGTV\n \n \n ₹{this.state.data.igtv_range[0]} – ₹{this.state.data.igtv_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.dedicated_range ? (\n <>\n \n \n Dedicated\n \n \n ₹{this.state.data.dedicated_range[0]} – ₹\n {this.state.data.dedicated_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.integrated_range ? (\n <>\n \n \n Integrated\n \n \n ₹{this.state.data.integrated_range[0]} – ₹\n {this.state.data.integrated_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.shorts_range ? (\n <>\n \n \n Shorts\n \n \n ₹{this.state.data.shorts_range[0]} – ₹{this.state.data.shorts_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.live_range ? (\n <>\n \n \n Live\n \n \n ₹{this.state.data.live_range[0]} – ₹{this.state.data.live_range[1]}\n \n \n >\n ) : (\n ''\n )}\n \n \n ) : null}\n \n \n \n Frequently Asked Questions\n \n \n \n \n \n \n \n \n What will the Influencer Price Index show me?\n \n \n \n \n \n \n \n The influencer price index is a tool that will present you with\n estimated commercials for the influencer’s profile. These prices are\n further segmented based on the percentage weights given to each\n deliverable as per industry standards.\n \n \n \n \n \n \n \n \n I’m a brand. Can I use this to estimate how much I should pay an\n influencer?\n \n \n \n \n \n \n \n This tool is a great aid in understanding how much to allocate for an\n influencer based on their estimated engagement and views. The brand\n using the projected kpis that a collaborative post would reach, will be\n able to approach an influencer with a fair price.\n \n \n \n \n \n \n \n \n How reliable is this calculator?\n \n \n \n \n \n \n \n The calculator is highly reliable as it analyzes the real- time data of\n an influencer’s profile and projects the estimated commercials based\n reach and engagement. The tool enables a brand/ influencer to initiate a\n conversation with the counterpart armed with the right set of data to\n fast-track collaborations.\n \n \n \n \n \n \n \n \n What are the metrics that impact the cost of influencer\n collaborations?\n \n \n \n \n \n \n \n Engagement rate ( which includes your views, likes and comments) and the\n reach impacts the cost of collaboration on Instagram. On Youtube, it is\n the views that majorly contribute to the prices.\n \n \n \n \n \n \n \n \n How is the pricing calculated on Instagram different from that on\n Youtube?\n \n \n \n \n \n \n \n Our tool for instagram is based on CPE ( cost per engagement) which\n includes the views , likes and comments whereas the Youtube pricing\n index is based on CPV ( cost per view) model.\n \n \n \n \n \n \n \n \n \n \n Want to connect with more influencers?\n \n \n Search top influencers with \n Influencer.in\n \n \n \n Sign Up Now\n \n \n \n \n \n \n \n \n
\n \n
Email \n
\n
\n \n Please Enter your Email to know the price Index\n \n \n \n Email:
\n \n \n \n \n {!this.state.email_valid ? (\n \n Email Not Vaild\n \n ) : null}\n \n \n
\n
\n \n Cancel\n \n this.submitEmailForm()}\n >\n Submit\n \n
\n
\n \n
\n \n \n );\n }\n}\n\nexport default withRouter(MobilePriceIndex);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport PriceIndex from './PriceIndex';\nimport MobilePriceIndex from './MobilePriceIndex';\n\nclass MobilePriceIndexWrapper extends React.Component {\n render() {\n return (\n <>{window.matchMedia('(min-width: 768px)').matches ? : }>\n );\n }\n}\n\nexport default withRouter(MobilePriceIndexWrapper);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider, Avatar, Modal } from '@material-ui/core';\nimport qs from 'qs';\nimport Link from '@mui/material/Link';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport PriceIndexDemoLogo from '../../assets/price_index.png';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport Button from '@material-ui/core/Button';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport { nonAuthHandlers } from '../../api_handlers/nonauth';\nimport { fetchYoutubePriceIndexDemo } from '../../api_handlers/extra';\nimport Loading from '../../components/Common/Loading/Loading';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport toast, { Toaster } from 'react-hot-toast';\n\nimport './PriceIndexDemo.styles.css';\n\nconst responseInstagram = (response) => {};\n\nclass PriceIndexDemo extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n youtube: false,\n insta_handle: null,\n youtube_url: null,\n data: null, //{\"data_exist\": true, \"follower_count\": \"69.1 M\", \"impressions\": 8361799, \"estimated_engagement\": \"987.3 K\", \"cost_min\": \"24.7 lac\", \"cost_max\": \"39.5 lac\", \"igtv_range\": [\"22.2 lac\", \"35.5 lac\"], \"reel_range\": [\"17.3 lac\", \"27.6 lac\"], \"st_video_range\": [\"9.9 lac\", \"15.8 lac\"], \"video_post_range\": [\"17.3 lac\", \"27.6 lac\"], \"story_n_swipe_range\": [\"7.4 lac\", \"11.8 lac\"], \"estimated_views\": \"1.7 M\", \"estimated_engagement_rate\": 1.43, \"estimated_engage_follower\": \"988.4 K\", \"insta_handle\": \"gal_gadot\", \"profile_pic_url\": \"https://instagram.flko7-1.fna.fbcdn.net/v/t51.2885-19/132197016_214462623590305_6641430723485871092_n.jpg?_nc_ht=instagram.flko7-1.fna.fbcdn.net&_nc_cat=1&_nc_ohc=-4GNkeOmOeAAX--DUwD&edm=AEF8tYYBAAAA&ccb=7-4&oh=f257fa779d5dfc677c41edb06913fc24&oe=61BCC62B&_nc_sid=a9513d\"},\n multiplier_data: null,\n summary: null,\n is_data_found: false,\n email_required: false,\n email: '',\n email_valid: true,\n emailModalOpen: false,\n is_loading: false,\n };\n }\n\n toggleEmailModal = () => {\n this.setState({ emailModalOpen: !this.state.emailModalOpen });\n };\n\n toggleUser = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n insta_handle: null,\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n youtube_url: null,\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n handleChange = (event) => {\n const email = event.target.value;\n this.setState({ email: email });\n if (email && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(email)) {\n this.setState({\n email_valid: false,\n });\n } else {\n this.setState({\n email_valid: true,\n });\n }\n };\n\n toggleFaq = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n insta_handle: null,\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n youtube_url: null,\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n countertostring(counter) {\n counter = parseInt(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseInt(counter / 1000.0)\n .toFixed(2)\n .toString() + ' K'\n );\n } else if (counter >= 999999) {\n return (\n parseInt(counter / 1000000.0)\n .toFixed(2)\n .toString() + ' M'\n );\n } else {\n return counter.toString();\n }\n }\n\n indianmoneytostring(counter) {\n counter = parseInt(counter);\n if (counter >= 1000 && counter < 100000) {\n return parseInt(counter / 1000).toString() + ' K';\n } else if (counter >= 100000 && counter <= 9999999) {\n return parseInt(counter / 100000).toString() + ' lac';\n } else if (counter >= 10000000) {\n return parseInt(counter / 10000000).toString() + ' Cr.';\n } else {\n return counter.toString();\n }\n }\n calculate_youtube_data(summary, multiplier_data, pre_data) {\n const data = {};\n data['avg_views'] = summary['view_count'] / summary['video_count'];\n data['avg_engagement'] = (\n (summary['like_count'] + summary['dislike_count'] + summary['comment_count']) /\n summary['video_count']\n ).toFixed(2);\n data['title'] = pre_data['title'];\n data['profile_pic_url'] = pre_data['profile_pic_url'];\n data['estimated_engagement'] = this.countertostring(data['avg_engagement']);\n data['estimated_engagement_rate'] = (\n (data['avg_engagement'] * 100) /\n summary['subscriber_count']\n ).toFixed(2);\n data['subscribers'] = this.countertostring(summary['subscriber_count']);\n data['estimated_views'] = this.countertostring(data['avg_views']);\n data['data_exist'] = true;\n data['cost_min'] = multiplier_data['cost_min_multiplier'] * data['avg_views'];\n data['cost_max'] = multiplier_data['cost_max_multiplier'] * data['avg_views'];\n data['dedicated_range'] = [\n this.indianmoneytostring(multiplier_data['dedicated_range_multiplier'] * data['cost_min']),\n this.indianmoneytostring(multiplier_data['dedicated_range_multiplier'] * data['cost_max']),\n ];\n data['integrated_range'] = [\n this.indianmoneytostring(multiplier_data['integrated_range_multiplier'] * data['cost_min']),\n this.indianmoneytostring(multiplier_data['integrated_range_multiplier'] * data['cost_max']),\n ];\n data['shorts_range'] = [\n this.indianmoneytostring(multiplier_data['shorts_range_multiplier'] * data['cost_min']),\n this.indianmoneytostring(multiplier_data['shorts_range_multiplier'] * data['cost_max']),\n ];\n data['live_range'] = [\n this.indianmoneytostring(multiplier_data['live_range_multiplier'] * data['cost_min']),\n this.indianmoneytostring(multiplier_data['live_range_multiplier'] * data['cost_max']),\n ];\n data['cost_min'] = this.indianmoneytostring(data['cost_min']);\n data['cost_max'] = this.indianmoneytostring(data['cost_max']);\n\n this.setState({\n data: data,\n });\n }\n\n calculate_insta_data(summary, multiplier_data, pre_data) {\n const data = {};\n data['follower_count'] = summary['follower_count'];\n if (summary['view_count']) {\n data['impressions'] = summary['view_count'];\n } else {\n data['impressions'] = ((summary['like_count'] | 0) + (summary['comment_count'] | 0)) * 1.5;\n }\n data['estimated_engagement'] =\n ((summary['like_count'] | 0) + (summary['comment_count'] | 0)) / (summary['post_count'] | 0);\n data['cost_min'] = 0;\n data['cost_max'] = 0;\n data['cost_min'] = multiplier_data['cost_min_multiplier'] * data['estimated_engagement'];\n data['cost_max'] = multiplier_data['cost_max_multiplier'] * data['estimated_engagement'];\n if (data['cost_min'] && data['cost_min'] < 1000) {\n data['cost_min'] = data['cost_min'] + 1000;\n data['cost_max'] = data['cost_max'] + 1000;\n }\n data['igtv_range'] = [\n this.indianmoneytostring(data['cost_min'] * multiplier_data['igtv_range_multiplier']),\n this.indianmoneytostring(data['cost_max'] * multiplier_data['igtv_range_multiplier']),\n ];\n data['reel_range'] = [\n this.indianmoneytostring(data['cost_min'] * multiplier_data['reel_range_multiplier']),\n this.indianmoneytostring(data['cost_max'] * multiplier_data['reel_range_multiplier']),\n ];\n data['st_video_range'] = [\n this.indianmoneytostring(data['cost_min'] * multiplier_data['st_video_range_multiplier']),\n this.indianmoneytostring(data['cost_max'] * multiplier_data['st_video_range_multiplier']),\n ];\n data['video_post_range'] = [\n this.indianmoneytostring(\n data['cost_min'] * multiplier_data['video_post_range_range_multiplier'],\n ),\n this.indianmoneytostring(\n data['cost_max'] * multiplier_data['video_post_range_range_multiplier'],\n ),\n ];\n data['story_n_swipe_range'] = [\n this.indianmoneytostring(\n data['cost_min'] * multiplier_data['story_n_swipe_range_multiplier'],\n ),\n this.indianmoneytostring(\n data['cost_max'] * multiplier_data['story_n_swipe_range_multiplier'],\n ),\n ];\n\n data['cost_min'] = this.indianmoneytostring(data['cost_min']);\n data['cost_max'] = this.indianmoneytostring(data['cost_max']);\n data['estimated_views'] = this.countertostring(\n (data['impressions'] / (summary['video_count'] | summary['post_count'] | 0)).toFixed(2),\n );\n data['estimated_engagement_rate'] = (\n (data['estimated_engagement'] * 100) /\n (data['follower_count'] | 0)\n ).toFixed(2);\n data['estimated_engage_follower'] = this.countertostring(\n ((data['estimated_engagement_rate'] * data['follower_count']) / 100).toFixed(2),\n );\n data['estimated_engagement'] = this.countertostring(data['estimated_engagement']);\n data['follower_count'] = this.countertostring(data['follower_count']);\n data['insta_handle'] = pre_data['insta_handle'];\n data['profile_pic_url'] = pre_data['profile_pic_url'];\n data['data_exist'] = true;\n\n this.setState({\n data: data,\n });\n }\n\n priceIndexDemo(data) {\n const resp = nonAuthHandlers.priceIndexDemo(data);\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n data: userData.data,\n multiplier_data: userData.multiplier_data,\n summary: userData.summary,\n email_required: false,\n is_loading: false,\n });\n this.calculate_insta_data(this.state.summary, this.state.multiplier_data, this.state.data);\n } else if ([400, 401, 402, 403, 500, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n if (response.status == 400) {\n this.notify(errors.error);\n }\n }\n });\n }\n\n notify(message) {\n toast(message);\n }\n\n submitForm = (e) => {\n e.preventDefault();\n if (!this.state.email_required) {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndexDemo({\n insta_handle: this.state.insta_handle,\n email: this.state.email,\n });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndexDemo();\n }\n } else {\n this.setState({\n emailModalOpen: true,\n });\n }\n };\n\n onChangeQty(key, e) {\n const data = this.state.multiplier_data;\n data[key] = e.target.value;\n\n this.setState({\n multiplier_data: data,\n });\n if (!this.state.youtube) {\n this.calculate_insta_data(this.state.summary, this.state.multiplier_data, this.state.data);\n } else {\n this.calculate_youtube_data(this.state.summary, this.state.multiplier_data, this.state.data);\n }\n }\n\n submitEmailForm() {\n if (!this.state.email) {\n return;\n } else if (\n this.state.email &&\n !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(this.state.email)\n ) {\n this.setState({\n email_valid: false,\n });\n } else {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndexDemo({\n insta_handle: this.state.insta_handle,\n email: this.state.email,\n });\n this.setState({ emailModalOpen: false });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndexDemo();\n this.setState({ emailModalOpen: false });\n }\n }\n }\n\n async getYoutubePriceIndexDemo() {\n try {\n const { data } = await fetchYoutubePriceIndexDemo(this.state.youtube_url, this.state.email);\n this.setState({\n is_loading: false,\n data: data.data,\n multiplier_data: data.multiplier_data,\n summary: data.summary,\n email_required: false,\n });\n this.calculate_youtube_data(this.state.summary, this.state.multiplier_data, this.state.data);\n } catch {\n this.setState({ is_loading: false });\n }\n }\n async isEmailRequired() {\n const resp = nonAuthHandlers.emailRequired();\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n email_required: false,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n }\n });\n }\n // componentDidMount() {\n // this.isEmailRequired();\n // }\n\n render() {\n return (\n \n {this.state.is_loading && }\n \n \n \n \n \n \n \n \n \n {' '}\n \n Influencer.in\n {' '}\n Price Index\n \n \n Evaluate the potential cost for different types of influencer collaborations\n based on profile performance analytics.\n \n \n \n \n \n \n }\n label={'Instagram'}\n style={{\n color: this.state.youtube ? '' : '#F2643E',\n fontWeight: this.state.youtube ? '' : 'bold',\n }}\n />\n }\n label={'Youtube'}\n style={{\n color: this.state.youtube ? colorConstants.BRAND_RED : '',\n fontWeight: this.state.youtube ? 'bold' : '',\n }}\n />\n \n \n \n * This calculator only shows results for influencers with\n Business or Creator accounts and is in Beta. If you have any inputs on a\n specific calculation, please DM us on Insta\n {/*( \n @influencer.in\n )*/}\n . \n Please note: This is only a broad estimate based on available\n data and may vary significantly.\n \n \n \n \n {' '}\n \n \n \n {this.state.multiplier_data ? (\n \n ) : null}\n \n \n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n \n \n \n \n \n Esitmated Price\n \n \n ₹{this.state.data.cost_min} - ₹{this.state.data.cost_max}\n \n \n \n \n \n \n \n {this.state.youtube\n ? this.state.data.title\n : `@${this.state.data.insta_handle}`}\n {' '}\n can charge{' '}\n \n ₹{this.state.data.cost_min} – ₹{this.state.data.cost_max}\n \n \n {this.state.youtube\n ? this.state.data.title\n : `@${this.state.data.insta_handle}`}{' '}\n is expected to engage an estimated{' '}\n {this.state.data.estimated_engage_follower} followers,\n capture a projected {this.state.data.estimated_views} {' '}\n views and generate an average engagement rate of{' '}\n {this.state.data.estimated_engagement_rate}% on execution\n of brand collaboration on their\n {this.state.youtube ? ' Youtube Feed' : ' Instagram feed.'}\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {this.state.data.estimated_engagement}\n \n \n Est. Engagement\n \n \n \n \n \n \n \n \n \n \n {this.state.data.estimated_engagement_rate}%\n \n \n Engagement Rate\n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.state.youtube\n ? this.state.data.subscribers\n : this.state.data.follower_count}\n \n \n {this.state.youtube ? 'Subscribers' : 'Followers'}\n \n \n \n \n \n \n {this.state.data.estimated_views}\n \n \n Est. View\n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {this.state.data && this.state.data.data_exist ? (\n \n \n \n Deliverables\n \n \n Estimated Costing Range\n \n {this.state.data.st_video_range ? (\n <>\n \n Static\n \n \n ₹{this.state.data.st_video_range[0]} – ₹\n {this.state.data.st_video_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.story_n_swipe_range ? (\n <>\n \n Stories\n \n \n ₹{this.state.data.story_n_swipe_range[0]} – ₹\n {this.state.data.story_n_swipe_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.reel_range ? (\n <>\n \n Reels\n \n \n ₹{this.state.data.reel_range[0]} – ₹{this.state.data.reel_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.igtv_range ? (\n <>\n \n IGTV\n \n \n ₹{this.state.data.igtv_range[0]} – ₹{this.state.data.igtv_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.dedicated_range ? (\n <>\n \n Dedicated\n \n \n ₹{this.state.data.dedicated_range[0]} – ₹\n {this.state.data.dedicated_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.integrated_range ? (\n <>\n \n Integrated\n \n \n ₹{this.state.data.integrated_range[0]} – ₹\n {this.state.data.integrated_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.shorts_range ? (\n <>\n \n Shorts\n \n \n ₹{this.state.data.shorts_range[0]} – ₹{this.state.data.shorts_range[1]}\n \n >\n ) : (\n ''\n )}\n {this.state.data.live_range ? (\n <>\n \n Live\n \n \n ₹{this.state.data.live_range[0]} – ₹{this.state.data.live_range[1]}\n \n >\n ) : (\n ''\n )}\n \n \n ) : null}\n \n \n \n Frequently Asked Questions\n \n \n \n \n \n \n \n \n What will the Influencer Price Index show me?\n \n \n \n \n \n \n \n The influencer price index is a tool that will present you with\n estimated commercials for the influencer’s profile. These prices are\n further segmented based on the percentage weights given to each\n deliverable as per industry standards.\n \n \n \n \n \n \n \n \n I’m a brand. Can I use this to estimate how much I should pay an\n influencer?\n \n \n \n \n \n \n \n This tool is a great aid in understanding how much to allocate for an\n influencer based on their estimated engagement and views. The brand\n using the projected kpis that a collaborative post would reach, will be\n able to approach an influencer with a fair price.\n \n \n \n \n \n \n \n \n How reliable is this calculator?\n \n \n \n \n \n \n \n The calculator is highly reliable as it analyzes the real- time data of\n an influencer’s profile and projects the estimated commercials based\n reach and engagement. The tool enables a brand/ influencer to initiate a\n conversation with the counterpart armed with the right set of data to\n fast-track collaborations.\n \n \n \n \n \n \n \n \n What are the metrics that impact the cost of influencer\n collaborations?\n \n \n \n \n \n \n \n Engagement rate ( which includes your views, likes and comments) and the\n reach impacts the cost of collaboration on Instagram. On Youtube, it is\n the views that majorly contribute to the prices.\n \n \n \n \n \n \n \n \n How is the pricing calculated on Instagram different from that on\n Youtube?\n \n \n \n \n \n \n \n Our tool for instagram is based on CPE ( cost per engagement) which\n includes the views , likes and comments whereas the Youtube pricing\n index is based on CPV ( cost per view) model.\n \n \n \n \n ;\n \n \n \n \n \n \n Want to connect with more influencers?\n \n \n Search top influencers with \n Influencer.in\n \n \n \n Sign Up Now\n \n \n \n \n \n \n \n \n
\n \n
Email \n
\n
\n \n Please Enter your Email to know the price Index\n \n \n \n Email:
\n \n \n \n \n {!this.state.email_valid ? (\n \n Email Not Vaild\n \n ) : null}\n \n \n
\n
\n \n Cancel\n \n this.submitEmailForm()}\n >\n Submit\n \n
\n
\n \n
\n \n \n );\n }\n}\n\nexport default withRouter(PriceIndexDemo);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport { Card, Tabs, Tab, Grid, Divider, Avatar, Modal } from '@material-ui/core';\nimport qs from 'qs';\n\nimport { colorConstants } from '../../constants/colors';\n\nimport { getCookie } from '../../components/utils';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport PriceIndexDemoLogo from '../../assets/price_index.png';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\nimport Button from '@material-ui/core/Button';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Box from '@mui/material/Box';\nimport { nonAuthHandlers } from '../../api_handlers/nonauth';\nimport { fetchYoutubePriceIndexDemo } from '../../api_handlers/extra';\nimport Loading from '../../components/Common/Loading/Loading';\nimport toast, { Toaster } from 'react-hot-toast';\n\nimport './MobilePriceIndexDemo.styles.css';\n\nconst responseInstagram = (response) => {};\n\nclass MobilePriceIndexDemo extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n youtube: false,\n insta_handle: null,\n youtube_url: null,\n data: null, //{\"data_exist\": true, \"follower_count\": \"69.1 M\", \"impressions\": 8361799, \"estimated_engagement\": \"987.3 K\", \"cost_min\": \"24.7 lac\", \"cost_max\": \"39.5 lac\", \"igtv_range\": [\"22.2 lac\", \"35.5 lac\"], \"reel_range\": [\"17.3 lac\", \"27.6 lac\"], \"st_video_range\": [\"9.9 lac\", \"15.8 lac\"], \"video_post_range\": [\"17.3 lac\", \"27.6 lac\"], \"story_n_swipe_range\": [\"7.4 lac\", \"11.8 lac\"], \"estimated_views\": \"1.7 M\", \"estimated_engagement_rate\": 1.43, \"estimated_engage_follower\": \"988.4 K\", \"insta_handle\": \"gal_gadot\", \"profile_pic_url\": \"https://instagram.flko7-1.fna.fbcdn.net/v/t51.2885-19/132197016_214462623590305_6641430723485871092_n.jpg?_nc_ht=instagram.flko7-1.fna.fbcdn.net&_nc_cat=1&_nc_ohc=-4GNkeOmOeAAX--DUwD&edm=AEF8tYYBAAAA&ccb=7-4&oh=f257fa779d5dfc677c41edb06913fc24&oe=61BCC62B&_nc_sid=a9513d\"},\n is_data_found: false,\n email_required: false,\n email: '',\n email_valid: true,\n emailModalOpen: false,\n is_loading: false,\n };\n }\n\n toggleEmailModal = () => {\n this.setState({ emailModalOpen: !this.state.emailModalOpen });\n };\n\n toggleUser = (event, youtube) => {\n this.setState({ youtube: !!youtube }, () => {\n if (this.state.youtube) {\n this.setState({\n style: {\n className: 'bg-youtube',\n },\n });\n } else {\n this.setState({\n style: {\n className: 'bg-influencer',\n },\n });\n }\n });\n };\n\n handleChange = (event) => {\n const email = event.target.value;\n this.setState({ email: email });\n if (email && !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(email)) {\n this.setState({\n email_valid: false,\n });\n } else {\n this.setState({\n email_valid: true,\n });\n }\n };\n\n priceIndexDemo(data) {\n const resp = nonAuthHandlers.priceIndexDemo(data);\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n data: userData.data,\n email_required: userData.data.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 500, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n if (response.status == 400) {\n this.notify(errors.error);\n }\n }\n });\n }\n\n notify(message) {\n toast(message);\n }\n\n submitForm = (e) => {\n e.preventDefault();\n if (!this.state.email_required) {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndexDemo({\n insta_handle: this.state.insta_handle,\n email: this.state.email,\n });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndexDemo();\n }\n } else {\n this.setState({\n emailModalOpen: true,\n });\n }\n };\n\n submitEmailForm() {\n if (!this.state.email) {\n return;\n } else if (\n this.state.email &&\n !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$/i.test(this.state.email)\n ) {\n this.setState({\n email_valid: false,\n });\n } else {\n if (!this.state.youtube) {\n this.setState({ is_loading: true });\n this.priceIndexDemo({\n insta_handle: this.state.insta_handle,\n email: this.state.email,\n });\n this.setState({ emailModalOpen: false });\n } else {\n this.setState({ is_loading: true });\n this.getYoutubePriceIndexDemo();\n this.setState({ emailModalOpen: false });\n }\n }\n }\n\n async getYoutubePriceIndexDemo() {\n try {\n const { data } = await fetchYoutubePriceIndexDemo(this.state.youtube_url, this.state.email);\n this.setState({\n is_loading: false,\n data: data,\n email_required: data.email_required,\n });\n } catch {\n this.setState({ is_loading: false });\n }\n }\n\n async isEmailRequired() {\n const resp = nonAuthHandlers.emailRequired();\n resp.then(async (response) => {\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n this.setState({\n email_required: userData.email_required,\n is_loading: false,\n });\n } else if ([400, 401, 402, 403, 504].includes(response.status)) {\n const errors = await response.json();\n console.log(response.status);\n this.setState({\n // formErrors: errors,\n // is_form_error: true,\n is_loading: false,\n });\n }\n });\n }\n componentDidMount() {\n this.isEmailRequired();\n }\n\n render() {\n return (\n \n {this.state.is_loading && }\n \n \n \n \n \n \n \n \n \n {' '}\n \n Influencer.in\n {' '}\n Price Index\n \n \n Evaluate the potential cost for different types of influencer collaborations\n based on profile performance analytics.\n \n \n \n \n \n \n }\n label={'Instagram'}\n style={{\n color: this.state.youtube ? '' : '#F2643E',\n fontWeight: this.state.youtube ? '' : 'bold',\n }}\n />\n }\n label={'Youtube'}\n style={{\n color: this.state.youtube ? colorConstants.BRAND_RED : '',\n fontWeight: this.state.youtube ? 'bold' : '',\n }}\n />\n \n \n \n * This calculator only shows results for influencers with\n Business or Creator accounts and is in Beta. If you have any inputs on a\n specific calculation, please DM us on Insta\n {/*( \n @influencer.in\n )*/}\n . \n Please note: This is only a broad estimate based on available\n data and may vary significantly.\n \n \n \n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n \n \n \n \n \n Esitmated Price\n \n \n ₹{this.state.data.cost_min} - ₹{this.state.data.cost_max}\n \n \n \n \n \n \n @{this.state.data.insta_handle} can charge{' '}\n \n ₹{this.state.data.cost_min} – ₹{this.state.data.cost_max}\n \n @{this.state.data.insta_handle} is expected to engage an\n estimated {this.state.data.estimated_engage_follower} {' '}\n followers, capture a projected{' '}\n {this.state.data.estimated_views} views and generate an\n average engagement rate of{' '}\n {this.state.data.estimated_engagement_rate}% on execution\n of brand collaboration on their\n {this.state.youtube ? ' Youtube Feed' : ' Instagram feed.'}.\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n {this.state.data.estimated_engagement}\n \n \n Est. Engagement\n \n \n \n \n \n \n \n \n \n \n {this.state.data.estimated_engagement_rate}%\n \n \n Engagement Rate\n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.state.data.follower_count}\n \n \n Followers\n \n \n \n \n \n \n {this.state.data.estimated_views}\n \n \n Est. View\n \n \n \n \n \n \n \n \n \n \n \n ) : null}\n {this.state.data && this.state.data.data_exist ? (\n \n \n \n \n Deliverables\n \n \n Estimated Costing Range\n \n \n\n {this.state.data.st_video_range ? (\n <>\n \n \n Static\n \n \n ₹{this.state.data.st_video_range[0]} – ₹\n {this.state.data.st_video_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.story_n_swipe_range ? (\n <>\n \n \n Stories\n \n \n ₹{this.state.data.story_n_swipe_range[0]} – ₹\n {this.state.data.story_n_swipe_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.reel_range ? (\n <>\n \n \n Reels\n \n \n ₹{this.state.data.reel_range[0]} – ₹{this.state.data.reel_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.igtv_range ? (\n <>\n \n \n IGTV\n \n \n ₹{this.state.data.igtv_range[0]} – ₹{this.state.data.igtv_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.dedicated_range ? (\n <>\n \n \n Dedicated\n \n \n ₹{this.state.data.dedicated_range[0]} – ₹\n {this.state.data.dedicated_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.integrated_range ? (\n <>\n \n \n Integrated\n \n \n ₹{this.state.data.integrated_range[0]} – ₹\n {this.state.data.integrated_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.shorts_range ? (\n <>\n \n \n Shorts\n \n \n ₹{this.state.data.shorts_range[0]} – ₹{this.state.data.shorts_range[1]}\n \n \n >\n ) : (\n ''\n )}\n\n {this.state.data.live_range ? (\n <>\n \n \n Live\n \n \n ₹{this.state.data.live_range[0]} – ₹{this.state.data.live_range[1]}\n \n \n >\n ) : (\n ''\n )}\n \n \n ) : null}\n \n \n \n Frequently Asked Questions\n \n \n \n \n \n \n \n \n What will the Influencer Price Index show me?\n \n \n \n \n \n \n \n The influencer price index is a tool that will present you with\n estimated commercials for the influencer’s profile. These prices are\n further segmented based on the percentage weights given to each\n deliverable as per industry standards.\n \n \n \n \n \n \n \n \n I’m a brand. Can I use this to estimate how much I should pay an\n influencer?\n \n \n \n \n \n \n \n This tool is a great aid in understanding how much to allocate for an\n influencer based on their estimated engagement and views. The brand\n using the projected kpis that a collaborative post would reach, will be\n able to approach an influencer with a fair price.\n \n \n \n \n \n \n \n \n How reliable is this calculator?\n \n \n \n \n \n \n \n The calculator is highly reliable as it analyzes the real- time data of\n an influencer’s profile and projects the estimated commercials based\n reach and engagement. The tool enables a brand/ influencer to initiate a\n conversation with the counterpart armed with the right set of data to\n fast-track collaborations.\n \n \n \n \n \n \n \n \n What are the metrics that impact the cost of influencer\n collaborations?\n \n \n \n \n \n \n \n Engagement rate ( which includes your views, likes and comments) and the\n reach impacts the cost of collaboration on Instagram. On Youtube, it is\n the views that majorly contribute to the prices.\n \n \n \n \n \n \n \n \n How is the pricing calculated on Instagram different from that on\n Youtube?\n \n \n \n \n \n \n \n Our tool for instagram is based on CPE ( cost per engagement) which\n includes the views , likes and comments whereas the Youtube pricing\n index is based on CPV ( cost per view) model.\n \n \n \n \n \n \n \n \n \n \n Want to connect with more influencers?\n \n \n Search top influencers with \n Influencer.in\n \n \n \n Sign Up Now\n \n \n \n \n \n \n \n \n
\n \n
Email \n
\n
\n \n Please Enter your Email to know the price Index\n \n \n \n Email:
\n \n \n \n \n {!this.state.email_valid ? (\n \n Email Not Vaild\n \n ) : null}\n \n \n
\n
\n \n Cancel\n \n this.submitEmailForm()}\n >\n Submit\n \n
\n
\n \n
\n \n \n );\n }\n}\n\nexport default withRouter(MobilePriceIndexDemo);\n","import React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport PriceIndexDemo from './PriceIndexDemo';\nimport MobilePriceIndexDemo from './MobilePriceIndexDemo';\n\nclass MobilePriceIndexDemoWrapper extends React.Component {\n render() {\n return (\n <>\n {window.matchMedia('(min-width: 768px)').matches ? (\n \n ) : (\n \n )}\n >\n );\n }\n}\n\nexport default withRouter(MobilePriceIndexDemoWrapper);\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\n\nfunction Link({ children, selected }) {\n const classes = useStyles();\n return (\n \n {children} \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n paddingTop: '3px !important',\n paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n selected: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: '18px',\n lineHeight: '27px',\n letterSpacing: '0.03em',\n },\n name: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: '18px',\n lineHeight: '27px',\n letterSpacing: '0.03em',\n },\n}));\n\nexport default Link;\n","export default __webpack_public_path__ + \"static/media/logo.9bfbfb27.png\";","export default __webpack_public_path__ + \"static/media/brand-logo.e16268db.png\";","import { Button, Grid, Popper, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport NavLink from 'components/PlannerTheme/Elements/Link';\nimport { Link } from 'react-router-dom';\nimport StyledNavLink from 'components/ux/StyledNavLink';\nimport Logo from 'assets/planner/logo.png';\nimport BrandLogo from 'assets/planner/brand-logo.png';\nimport { width } from '@material-ui/system';\nimport PersonOutlineIcon from '@material-ui/icons/PersonOutline';\nimport { colorConstants } from 'constants/colors';\nimport { useState } from 'react';\n\nfunction Header() {\n const [anchorEl, setAnchorEl] = useState(null);\n const classes = useStyles();\n const user = JSON.parse(localStorage.getItem('user'));\n const brand_name = user.user_type === 'brand' ? (user.brand.name ? user.brand.name : '') : '';\n const logo =\n user.user_type === 'brand'\n ? user.brand.brand_logo_url\n ? user.brand.brand_logo_url\n : \"\"\n : \"\";\n\n const open = Boolean(anchorEl);\n const handleClick = (event) => {\n setAnchorEl(anchorEl ? null : event.currentTarget);\n };\n const logOut = () => {\n for (const key of ['access', 'refresh', 'user']) localStorage.removeItem(key);\n window.location = '/login';\n };\n return (\n \n \n \n \n \n \n \n \n \n \n {/* \n Dashboard \n */}\n \n \n \n {/* \n My Campaign \n */}\n \n \n \n {/* \n Planner \n */}\n \n \n \n {/* \n Planner \n */}\n \n \n \n \n \n \n {brand_name} \n \n \n \n \n \n \n \n \n \n \n Logout\n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n background: '#FFFFFF',\n borderRadius: 10,\n height: 60,\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingLeft: 20,\n paddingRight: 20,\n },\n logo: {\n height: 30,\n },\n brandBox: {\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n linkBox: {\n justifyContent: 'center',\n alignItems: 'center',\n },\n brandName: {\n // marginLeft: 200,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 15,\n },\n tabBarText: {\n marginRight: 1,\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n letterSpacing: 0.03,\n },\n selectedTabBarText: {\n marginRight: 1,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 14,\n letterSpacing: 0.03,\n },\n}));\n\nexport default Header;\n","import { Grid, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nfunction ObjectiveOption({ selected, children }) {\n const classes = useStyles();\n return (\n \n {children}\n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n selected: {\n padding: 20,\n paddingLeft: 25,\n paddingRight: 25,\n background: '#FFFFFF',\n boxShadow: '6px 4px 20px -3px rgba(34, 34, 34, 0.25)',\n borderRadius: '41px',\n cursor: 'pointer',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 16,\n letterSpacing: '0.03em',\n zIndex: 5,\n position: 'relative',\n },\n ObjectiveOption: {\n padding: 10,\n paddingBottom: 1,\n paddingTop: 0,\n cursor: 'pointer',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n // fontSize: 13,\n fontSize: 13,\n letterSpacing: '0.03em',\n // zIndex: 2,\n position: 'relative',\n },\n}));\n\nexport default ObjectiveOption;\n","import * as React from 'react';\nimport { Grid, Typography, TextField, Checkbox, Button } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport { IconButton } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport { Chip } from '@material-ui/core';\n\nimport ObjectiveOption from './ObjectiveOption';\n\nimport { getFieldOfInterest } from '../../../../../api_handlers/influencer';\n\n// const interestsMap = [\n// \"Actor\",\n// \"Agriculture\",\n// \"Art & Craft\",\n// \"Automobile\",\n// \"Beauty\",\n// \"Business\",\n// \"Career Coach\",\n// \"Comedy\",\n// \"Crypto\",\n// \"Dance\",\n// \"Decor\",\n// \"Digital Marketing\",\n// \"Education\",\n// \"Entertainment\",\n// \"Entertainment Page\",\n// \"Fan Page\",\n// \"Fashion\",\n// \"Finance\",\n// \"Fitness\",\n// \"Food\",\n// \"Gadget review\",\n// \"Gaming\",\n// \"Gardening\",\n// \"Graphic Designer\",\n// \"Haircare\",\n// \"Health\",\n// \"Infotainment\",\n// \"Investment\",\n// \"Kids\",\n// \"Legal\",\n// \"Lifestyle\",\n// \"Literature\",\n// \"Meme Page\",\n// \"Men's Grooming\",\n// \"Model\",\n// \"Motor Vloggers\",\n// \"Movie/TV Review\",\n// \"Music\",\n// \"News & Media\",\n// \"Nutrition\",\n// \"Parenting\",\n// \"Pets\",\n// \"Photography\",\n// \"Product Review\",\n// \"Self-Help & Motivation\",\n// \"Skincare\",\n// \"Spirituality\",\n// \"Sports\",\n// \"Stock Market\",\n// \"Sustainability\",\n// \"Technology\",\n// \"Theatre\",\n// \"Travel\",\n// \"Website & Tools\",\n// \"Yoga\"\n// ]\n\nclass Category extends React.Component {\n constructor(props) {\n super(props);\n\n this.loadInterest = this.loadInterest.bind(this);\n\n this.state = {\n interestText: '',\n valueText: '',\n checkList: '',\n isCheck: Array.from(new Set(this.props.category)),\n interestsMap: [],\n };\n }\n\n async loadInterest() {\n let data = await getFieldOfInterest();\n let interestsMap = [];\n data.map((each) => {\n if (interestsMap.indexOf(each.name) == -1) {\n interestsMap.push(each.name);\n }\n });\n interestsMap.push('Other');\n this.setState({ interestsMap });\n }\n\n componentDidMount() {\n this.loadInterest();\n }\n\n handleChange = (event) => {\n if (event.target.checked === true) {\n this.setState({\n isCheck: this.state.isCheck.concat(event.target.value),\n });\n }\n if (event.target.checked === false) {\n const index = this.state.isCheck.indexOf(event.target.value);\n if (index > -1) {\n this.state.isCheck.splice(index, 1);\n this.setState({\n isCheck: this.state.isCheck,\n });\n }\n }\n };\n\n handleDelete = (t) => {\n this.props.category.splice(this.props.category.indexOf(t), 1);\n this.state.isCheck.splice(this.state.isCheck.indexOf(t), 1);\n this.setState({\n isCheck: this.state.isCheck,\n });\n };\n\n render() {\n let { selected, setSelectedObjective, classes, category } = this.props;\n\n let interestText = this.state.interestText;\n\n return (\n {\n setSelectedObjective('Category');\n }}\n style={{ position: 'relative' }}\n >\n
Category \n {selected ? (\n
\n
\n \n this.setState({\n valueText: '',\n interestText: '',\n })\n }\n >\n \n \n ),\n }}\n value={this.state.valueText}\n onChange={(e) => {\n this.setState({\n interestText: e.target.value,\n valueText: e.target.value,\n });\n }}\n />\n {\n this.props.setFilters('category', []);\n this.setState({ isCheck: [] });\n }}\n >\n Reset\n \n
\n
\n {this.state.isCheck.map((tags) => {\n if (category.indexOf(tags) > -1) {\n return (\n
\n {\n this.handleDelete(tags);\n }}\n className={classes.chips}\n />\n
\n );\n }\n })}\n
\n {this.state.interestsMap.map((each) => {\n if (each.toLowerCase().indexOf(interestText.toLowerCase()) > -1) {\n return (\n
\n -1}\n value={each}\n onClick={(event) => {\n if (category.indexOf(each) > -1) {\n category.splice(category.indexOf(each), 1);\n } else {\n category.push(each);\n }\n // this.setState({\n // isCheck: this.state.isCheck.concat(category)\n // })\n this.props.setFilters('category', category);\n }}\n onChange={this.handleChange}\n />\n {each}\n
\n );\n }\n })}\n
\n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 450,\n top: 80,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n zIndex: 5,\n flexWrap: 'wrap',\n display: 'flex',\n justifyContent: 'flex-start',\n },\n search: {\n border: '1px solid #C4C4C4',\n borderRadius: '30px',\n width: 300,\n outline: 'none',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n marginLeft: 10,\n },\n option: {\n background: '#F1F1F1',\n borderRadius: '10px',\n paddingLeft: 10,\n paddingRight: 10,\n margin: 5,\n borderRadius: 10,\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n // chipset:{\n // color: \"blue\",\n // fontFamily: \"Nunito Sans\",\n // background: \"#FFFFFF\",\n // borderRadius: 34,\n // borderWidth: 1,\n // borderColor: \"#C9C9C9\",\n // // color: color,\n // fontSize: 12,\n // fontWeight: 400,\n // cursor: \"pointer\",\n // },\n};\n\nexport default withStyles(styles)(Category);\n","import * as React from 'react';\nimport { Grid, Typography, Radio, RadioGroup } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport ObjectiveOption from './ObjectiveOption';\n\nclass Objective extends React.Component {\n render() {\n let { classes, objective, selected, setSelectedObjective, setFilters } = this.props;\n\n return (\n {\n setSelectedObjective('Objective');\n }}\n style={{ position: 'relative' }}\n >\n
Objective \n {selected ? (\n
\n
Branding Campaign \n
{\n this.props.setFilters('objective', event.target.value);\n }}\n >\n \n
\n \n Reach \n
\n
\n \n CPV \n
\n
\n \n Engagement Rate \n
\n
\n \n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 300,\n top: 80,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n zIndex: 5,\n },\n heading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n },\n option: {\n background: '#F1F1F1',\n borderRadius: '10px',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n margin: 5,\n borderRadius: 10,\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n optionLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n },\n};\n\nexport default withStyles(styles)(Objective);\n","import { Slider } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst CustomSlider = withStyles({\n root: {\n color: '#EFF0F9',\n height: 8,\n },\n thumb: {\n height: 24,\n width: 24,\n marginTop: -8,\n marginLeft: -12,\n '&:focus, &:hover, &$active': {\n boxShadow: 'inherit',\n },\n color: '#FBF1D8',\n border: '2px solid #FBF1D8',\n boxShadow: '2px 2px 4px rgba(148, 148, 148, 0.25)',\n },\n active: {},\n valueLabel: {\n top: '28px',\n left: 'calc(-50% + 4px)',\n fontSize: '12px',\n borderRadius: '0% 0% 10% 0%',\n '& *': {\n background: 'transparent',\n },\n },\n track: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 50,\n },\n rail: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 20,\n },\n})(Slider);\n\nexport default CustomSlider;\n","import * as React from 'react';\nimport { Grid, Typography, Slider, TextField, FormControl } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport CustomSlider from 'components/PlannerTheme/Elements/Slider/Slider';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Input from '@mui/material/Input';\n\nimport ObjectiveOption from './ObjectiveOption';\nimport { fontSize } from '@material-ui/system';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\n\nfunction countertostring(counter) {\n counter = parseInt(counter);\n if (counter >= 1000 && counter < 99999) {\n return (\n parseInt(counter / 1000.0)\n .toFixed(0)\n .toString() + 'K'\n );\n } else if (counter >= 99999 && counter <= 9999999) {\n return (\n parseFloat(counter / 100000.0)\n .toFixed(1)\n .toString() + 'L'\n );\n } else if (counter > 9999999) {\n return (\n parseFloat(counter / 10000000.0)\n .toFixed(3)\n .toString() + 'Cr'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction valuetext(value) {\n return `₹${countertostring(value)}`;\n}\n\nclass Budget extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n textValue: this.props.budget,\n isError: false,\n };\n }\n\n handleBudgetChange(e) {\n if (Number(e.target.value.replace(/\\D/g, '')) > 50000000) {\n this.setState({\n textValue: 50000000,\n isError: true,\n });\n } else {\n this.setState({\n textValue: Number(e.target.value.replace(/\\D/g, '')),\n isError: false,\n });\n }\n }\n componentDidUpdate(prevProps, prevState) {\n if (prevState.textValue !== this.state.textValue) {\n this.props.setFilters('budget', this.state.textValue);\n }\n }\n render() {\n let { classes, selected, setSelectedObjective } = this.props;\n\n return (\n {\n setSelectedObjective('Budget');\n }}\n style={{ position: 'relative' }}\n >\n
Budget \n {selected ? (\n
\n {this.state.isError ? (\n
Budget cannot exceed 5Cr. \n ) : (\n ''\n )}\n
\n this.handleBudgetChange(e),\n startAdornment: (\n \n ₹\n \n ),\n classes: {\n input: classes.resize,\n },\n }}\n />\n
\n
\n
{\n if (this.state.textValue >= 150000) {\n this.setState({\n textValue: this.state.textValue - 50000,\n });\n this.props.setFilters('budget', this.state.textValue);\n }\n }}\n />\n {\n this.setState({\n textValue: newValue,\n isError: false,\n });\n this.props.setFilters('budget', this.state.textValue);\n }}\n step={50000}\n value={this.state.textValue}\n valueLabelFormat={valuetext}\n />\n {\n this.setState({\n textValue: this.state.textValue + 50000,\n });\n this.props.setFilters('budget', this.state.textValue);\n }}\n />\n \n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 300,\n height: 100,\n top: 128,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n display: 'flex',\n zIndex: 5,\n },\n error: {\n fontSize: '12px',\n color: 'red',\n position: 'absolute',\n left: '20%',\n top: '18%',\n },\n box: {\n boxSizing: 'border-box',\n\n position: 'absolute',\n left: '65.23%',\n right: '6.58%',\n top: '10.55%',\n bottom: '68.2%',\n\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n },\n slider: {\n top: '65px',\n position: 'absolute',\n width: '250px',\n left: '50px',\n },\n resize: {\n fontFamily: 'Nunito Sans',\n fontStyle: 'normal',\n fontWeight: 300,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.03em',\n },\n add: {\n position: 'absolute',\n top: '2px',\n left: '254px',\n cursor: 'pointer',\n color: '#757575',\n },\n remove: {\n position: 'absolute',\n right: '264px',\n top: '2px',\n cursor: 'pointer',\n color: '#757575',\n },\n};\n\nexport default withStyles(styles)(Budget);\n","import * as React from 'react';\nimport { Grid, Typography, Slider } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport Drag from 'assets/planner/drag.png';\n\nclass PriorityTemplate extends React.Component {\n render() {\n let { classes, item, dragHandleProps } = this.props;\n\n return (\n \n
{item.id} \n
\n
{item.name} \n
\n );\n }\n}\n\nconst styles = {\n number: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 16,\n color: '#FEBD1C',\n marginLeft: 5,\n marginRight: 10,\n },\n label: {\n paddingLeft: 10,\n paddingRight: 10,\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n background: '#F1F1F1',\n },\n};\n\nexport default withStyles(styles)(PriorityTemplate);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAYCAYAAADzoH0MAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAB+SURBVHgB7ZLRCYAgEIY9p9JpaoNsgmqCaoNaRnQp7QwEkRMCXxL8HuTu+FBOfmCItXZxzqlQA8AlhJgZAeWBMWbHXqWi936TUq7prORxPEbisSkflDzOKgkXnPkQ97sJl/QgFFrrA5shivn+ka9eY7x/0IPUg1RLD9IfgvQAkyWYoZVii8QAAAAASUVORK5CYII=\"","import React, { useState } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport ObjectiveOption from './ObjectiveOption';\nimport DraggableList from 'react-draggable-list';\nimport Drag from 'assets/planner/drag.png';\nimport PriorityTemplate from './PriorityTemplate';\n\nfunction Priority({ selected, setSelectedObjective, list, setList }) {\n const classes = useStyles();\n\n return (\n {\n setSelectedObjective('Priority');\n }}\n style={{ position: 'relative' }}\n >\n
Priority \n {selected ? (\n
\n
\n What Matters the Most ?\n \n
Rank in the order of Priority. \n
\n {\n newList.map((each, index) => {\n newList[index]['id'] = index + 1;\n });\n setList(newList);\n }}\n container={() => document.body}\n />\n
\n
\n ) : null}\n
\n );\n}\n\nconst useStyles = makeStyles(() => ({\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 200,\n top: 90,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n zIndex: 5,\n },\n heading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n subHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 12,\n color: '#757575',\n },\n number: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 16,\n color: '#FEBD1C',\n marginLeft: 5,\n marginRight: 10,\n },\n label: {\n paddingLeft: 10,\n paddingRight: 10,\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n background: '#F1F1F1',\n },\n}));\n\nexport default Priority;\n","import * as React from 'react';\nimport { Grid, Typography, TextField } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\n\nimport CustomSlider from 'components/PlannerTheme/Elements/Slider/Slider';\n\nimport ObjectiveOption from './ObjectiveOption';\n\nfunction countertostring(counter) {\n counter = parseInt(counter);\n if (counter >= 1000 && counter < 99999) {\n return (\n parseInt(counter / 1000.0)\n .toFixed(0)\n .toString() + 'K'\n );\n } else if (counter >= 99999 && counter <= 1000000) {\n return (\n parseFloat(counter / 100000.0)\n .toFixed(2)\n .toString() + 'L'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction valuetext(value) {\n return `₹${countertostring(value)}`;\n}\n\nclass PricePerCreator extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n textValue: this.props.pricePerCreator,\n isError: false,\n };\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.textValue !== this.state.textValue) {\n this.props.setFilters('pricePerCreator', this.state.textValue);\n }\n if (prevProps.currBudget !== this.props.currBudget) {\n if (this.props.currBudget <= 10000000) {\n this.setState({ textValue: this.props.currBudget * 0.1 });\n } else {\n this.setState({ textValue: 1000000 });\n }\n }\n }\n\n handlePPcChange(e) {\n if (Number(e.target.value.replace(/\\D/g, '')) > 1000000) {\n this.setState({\n textValue: 1000000,\n isError: true,\n });\n } else {\n this.setState({\n textValue: Number(e.target.value.replace(/\\D/g, '')),\n isError: false,\n });\n }\n }\n\n render() {\n let { classes, selected, setSelectedObjective, pricePerCreator } = this.props;\n\n return (\n {\n setSelectedObjective('PricePerCreator');\n }}\n style={{ position: 'relative' }}\n >\n
\n max Price Per Creator\n \n {selected ? (\n
\n {this.state.isError ?
The value cannot exceed 10L. : ''}\n
\n this.handlePPcChange(e)}\n value={this.state.textValue.toLocaleString()}\n InputProps={{\n disableUnderline: true,\n startAdornment: (\n \n ₹\n \n ),\n classes: {\n input: classes.resize,\n },\n }}\n />\n
\n
\n
{\n if (this.state.textValue >= 1000) {\n this.setState({\n textValue: this.state.textValue - 1000,\n });\n this.props.setFilters('pricePerCreator', this.state.textValue);\n }\n }}\n />\n {\n this.setState({\n textValue: newValue,\n isError: false,\n });\n\n this.props.setFilters('pricePerCreator', this.state.textValue);\n }}\n step={1000}\n value={this.state.textValue}\n valueLabelFormat={valuetext}\n />\n {\n this.setState({\n textValue: this.state.textValue + 1000,\n });\n this.props.setFilters('pricePerCreator', this.state.textValue);\n }}\n />\n \n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 300,\n // width: 416,\n height: 100,\n // top: 90,\n top: 128,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n zIndex: 5,\n },\n box: {\n boxSizing: 'border-box',\n\n position: 'absolute',\n left: '65.23%',\n right: '6.58%',\n top: '10.55%',\n bottom: '68.2%',\n\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n },\n slider: {\n top: '65px',\n position: 'absolute',\n width: '250px',\n left: '50px',\n },\n resize: {\n fontFamily: 'Nunito Sans',\n fontStyle: 'normal',\n fontWeight: 300,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.03em',\n },\n add: {\n position: 'absolute',\n top: '2px',\n left: '254px',\n cursor: 'pointer',\n color: '#757575',\n },\n remove: {\n position: 'absolute',\n right: '264px',\n top: '2px',\n cursor: 'pointer',\n color: '#757575',\n },\n};\n\nexport default withStyles(styles)(PricePerCreator);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFISURBVHgBtZO/ToRAEMZnlubKexRboNHO0tLOvUcwBCg9OxMCtR28htV5Ddh5j2GpDwA4a7hks1lu/4BfsmGZ2Znfl2EBkJTneZ1l2R38k6j3Q5qmtRxDGT4MA6ftN62boihOsKIIfEWPz+m1of47sWEKXGhL6zAVrAYfx/Eghfh5EqjAZa0yiTMcEbeadMMIfpypXTwJAxz6vj/idJDTo57p4zUJC/iuqqoGpQK+lglbuNijUsiXmnCBCwVysm3bUxRFP1R8q6nd0LqP4/iNzn2BB5xyj2VZvsqxQD1EzT/CMKQeeA0OJkxwuuzPBH9R44HucNd17y4mLOF7XQ7hgpIk2TPGnmbSf3dCbHzhRgM2JggOvnChAAwyfQ6Kb8ATbmXAwoQ33NqAiwkXuJMBGxOucGcDl0z4wL0M6Ez4whdL/KJiwQL9AulGCh5g5iexAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAACVSURBVHgBxY7RCYAwDERvpI7iBjqCI9wmjugItUIFlahpm9gH+TrIe8CVJd0AP8bsENmHmG5NF2BPyP8jhIjlNHpEhPwzShF3uXWEJL9ETA+jRcSbPGY3vCLUco+IYrllRLX8YG6I+JLPUMKKiC85UQgLIszlJRFucm2Eq1wT4S6viSCcYE+5JoL4CfaUSxFEJ4hG+QZZwtZ4YXCWlwAAAABJRU5ErkJggg==\"","import { Grid, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport DownArrow from 'assets/planner/down-arrow.png';\nimport DownArrowActive from 'assets/planner/down-arrow-active.png';\n\nfunction ParticularFilter({ selected, children }) {\n const classes = useStyles();\n return (\n \n {children}\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n selected: {\n cursor: 'pointer',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 14,\n letterSpacing: '0.03em',\n textAlign: 'center',\n },\n filterOption: {\n padding: 0,\n marginLeft: 0,\n cursor: 'pointer',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n letterSpacing: '0.03rem',\n color: '#000000',\n textAlign: 'center',\n },\n downArrow: {\n marginLeft: 5,\n color: '#000000',\n },\n}));\n\nexport default ParticularFilter;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAbCAYAAAD28DaZAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAD4SURBVHgBxddLDoIwEIDhaeMtEO/ixmtYTwZew4QYrqLXoEWnCSjh0Qcz7Z+QkFm0X9oNAGSsf56uuikryB1CTHPs8RlAAjKEkN6YejIDUUtI3BLEzjW0SU9mDWK0uB0u7zoZxgXB9yQYH0gSjC+EHRMCYcWEQtgwMRAWTCyEHLMHgsnfQkWFi0FkeyGYGCFGKDuQUonz6w4BUUDs3v+QcRgAooJgUhtoZxt8F/e5MkoIZq+pawolQcw+crZOiBoyYkJBHJAJxhfEBZlhXCCLYYIsYrZAS1FBVjG+IErIJsYFooY4MWsgDoh3CBr+cbpHqSB3COKGfADf9B8Aw7bBlwAAAABJRU5ErkJggg==\"","import { useEffect, useState, Component } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Tick from 'assets/planner/tick.png';\n\nclass Channel extends Component {\n render() {\n const { classes, channels } = this.props;\n\n let isInstaSelected = channels.indexOf('Instagram') > -1;\n let isYouTubeSelected = channels.indexOf('YouTube') > -1;\n\n return (\n \n {\n if (isInstaSelected) {\n channels.splice(channels.indexOf('Instagram'), 1);\n this.props.setChannels(channels);\n } else {\n channels.push('Instagram');\n this.props.setChannels(channels);\n }\n }}\n className={isInstaSelected ? classes.selectedBorder : classes.defaultBorder}\n >\n {isInstaSelected ? (\n
\n ) : null}\n
\n Instagram\n \n
\n {\n if (isYouTubeSelected) {\n channels.splice(channels.indexOf('YouTube'), 1);\n this.props.setChannels(channels);\n } else {\n channels.push('YouTube');\n this.props.setChannels(channels);\n }\n }}\n className={isYouTubeSelected ? classes.selectedBorder : classes.defaultBorder}\n >\n {isYouTubeSelected ? (\n
\n ) : null}\n
\n YouTube\n \n
\n \n );\n }\n}\n\nconst styles = {\n selectedText: {\n color: '#FEBD1C',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 13,\n cursor: 'pointer',\n },\n default: {\n color: '#757575',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n cursor: 'pointer',\n },\n selectedBorder: {\n display: 'flex',\n alignItems: 'center',\n marginRight: 15,\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n border: '1px solid #FEBD1C',\n borderRadius: 20,\n },\n defaultBorder: {\n // fontFamily:'Nunito Sans',\n // fontWeight:700,\n display: 'flex',\n alignItems: 'center',\n marginRight: 15,\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n border: '1px solid #757575',\n borderRadius: 20,\n },\n};\n\nexport default withStyles(styles)(Channel);\n","import * as React from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport Tick from 'assets/planner/tick.png';\n\nconst ageGroupMap = ['18-24', '25-34', '35-44', '45-54', '55+'];\n\nclass AudienceAgeGroup extends React.Component {\n render() {\n const { classes, ageGroup } = this.props;\n\n return (\n \n {ageGroupMap.map((each) => {\n return (\n
{\n if (ageGroup.indexOf(each) > -1) {\n ageGroup.splice(ageGroup.indexOf(each), 1);\n } else {\n ageGroup.push(each);\n }\n this.props.setAgeGroup('ageGroup', ageGroup);\n }}\n className={\n ageGroup.indexOf(each) > -1 ? classes.selectedBorder : classes.defaultBorder\n }\n >\n {ageGroup.indexOf(each) > -1 ? (\n
\n ) : null}\n
-1 ? classes.selectedText : classes.default}\n >\n {each} Yrs\n \n
\n );\n })}\n
\n );\n }\n}\n\nconst styles = {\n selectedText: {\n color: '#FEBD1C',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 13,\n cursor: 'pointer',\n },\n default: {\n color: '#757575',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n cursor: 'pointer',\n },\n selectedBorder: {\n display: 'flex',\n alignItems: 'center',\n margin: 10,\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n border: '1px solid #FEBD1C',\n borderRadius: 20,\n },\n defaultBorder: {\n display: 'flex',\n alignItems: 'center',\n margin: 10,\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n border: '1px solid #757575',\n borderRadius: 20,\n },\n};\n\nexport default withStyles(styles)(AudienceAgeGroup);\n","import { useEffect, useState, Component } from 'react';\nimport { Grid, Typography, TextField, Button } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport { IconButton } from '@mui/material';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport { Chip } from '@material-ui/core';\n\nimport Tick from 'assets/planner/tick.png';\n\nconst locationsMap = [\n 'Pune',\n 'Baghpat',\n 'Gorakhpur',\n 'Bellary',\n 'Bagalkot',\n 'Bremen',\n 'Bharatpur',\n 'Eastchester',\n 'Baharampur',\n 'Ottawa',\n 'Gwalior',\n 'New York City',\n 'Chitradurga',\n 'Karachi',\n 'Kozhikode',\n 'Thiruvananthapuram',\n 'Uttarkashi',\n 'Rewari',\n 'Kurukshetra',\n 'Shimla',\n 'Karimnagar',\n 'Buenos Aires',\n 'Vadodara',\n 'Jorhat, Assam',\n 'Sikar',\n 'Kullu',\n 'Panipat',\n 'Faridabad',\n 'Ernakulam',\n 'Sheffield',\n 'Belgaum',\n 'Alwar',\n 'Panjim',\n 'Beed',\n 'Orai',\n 'Jodhpur',\n 'Boston',\n 'Chennai',\n 'Nizamabad',\n 'Bardhaman',\n 'Churu',\n 'Bhilwara',\n 'Nagaur',\n 'Dausa',\n 'Patiala',\n 'Sonipat',\n 'Jammu',\n 'Jalgaon',\n 'Chapel Hill',\n 'Chandigarh',\n 'Jaunpur, Uttar Pradesh',\n 'Jalore',\n 'Gurdaspur',\n 'Chicago',\n 'Kota',\n 'Bhiwani',\n 'Waterloo (Ontario)',\n 'Los Angeles',\n 'Tumkur',\n 'Bishnupur, Bankura',\n 'Solan',\n 'Mangalore',\n 'San Francisco',\n 'Buldhana',\n 'Haridwar',\n 'Nanded',\n 'Jakarta',\n 'New Delhi',\n 'Singapore',\n 'Salem',\n 'Ajmer',\n 'Khammam',\n 'Keylong',\n 'Kurnool',\n 'Gulbarga',\n 'Toronto',\n 'Etah',\n 'Nainital',\n 'Thane',\n 'Brisbane',\n 'Rampur',\n 'Muradabad',\n 'Korba',\n 'South Lakeland',\n 'Houston',\n 'Guntur',\n 'Sundergarh',\n 'Anantnag',\n 'Bangalore',\n 'Chatra, Jharkhand',\n 'Sacramento',\n 'Sirsa',\n 'Rajnandgaon',\n 'Koraput',\n 'Karnal',\n 'Noida',\n 'Barcelona',\n 'Delhi',\n 'Miami',\n 'Chikmagalur',\n 'Melbourne',\n 'Shahjahanpur',\n 'Bikaner',\n 'Domodossola',\n 'Sangli',\n 'Balurghat',\n 'Rajsamand',\n 'Manjhanpur',\n 'Shivpuri',\n 'Ajman',\n 'Banswara',\n 'Mumbai',\n 'Shillong',\n 'Pasig',\n 'Kathmandu',\n 'Vancouver',\n 'Kohima',\n 'Anantapur, Andhra Pradesh',\n 'Ongole',\n 'Hamburg',\n 'Jhansi',\n 'Varanasi',\n 'Leh',\n 'Yavatmal',\n 'Nagpur',\n 'Dehradun',\n 'Aligarh',\n 'Tezpur',\n 'Kollam',\n 'Detroit',\n 'Paris',\n 'London',\n 'Rudrapur',\n 'Kapurthala',\n 'Kheda',\n 'Austin',\n 'Ramanathapuram',\n 'Malappuram',\n 'Nagapattinam',\n 'Pathanamthitta',\n 'Frankfurt',\n 'Ambala',\n 'Narnaul',\n 'Sri Ganganagar',\n 'Dhaka',\n 'Kaithal',\n 'Surat',\n 'Latur',\n 'Bathinda',\n 'Udupi',\n 'Montreal',\n 'Old Delhi',\n 'Hanumangarh',\n 'Fredericksburg',\n 'Incheon',\n 'Lisbon',\n 'Valsad',\n 'Anand',\n 'Vellore',\n 'Seattle',\n 'Ratlam',\n 'Hyderabad',\n 'Santa Barbara',\n 'Chinsurah',\n 'Rio de Janeiro',\n 'Baramulla',\n 'Mehsana',\n 'Ghazipur',\n 'Dibrugarh',\n 'Ahmedabad',\n 'Madurai',\n 'Gurugram',\n 'Midnapore',\n 'Mirzapur',\n 'Chesterfield',\n 'Bankura',\n 'Hassan',\n 'Kadapa',\n 'Naples',\n 'Kasaragod',\n 'Panchkula',\n 'Margao',\n 'Thrissur',\n 'Gandhinagar',\n 'Karwar',\n 'Moga, Punjab',\n 'Kannur',\n 'Rajauri',\n 'Gondia',\n 'Ahmednagar',\n 'Kanpur',\n 'Angul',\n 'Abu Dhabi',\n 'Firozpur',\n 'Charleston',\n 'Mandya',\n 'Satna',\n 'Cuddalore',\n 'Lagos',\n 'Rajkot',\n 'Erode',\n 'Jamshedpur',\n 'Minneapolis',\n 'Vijayawada',\n 'Saharanpur',\n 'Tigard',\n 'Tirunelveli',\n 'Indore',\n 'Raipur',\n 'Silchar',\n 'San Sebastián',\n 'Satara',\n 'Sirohi',\n 'Cuttack',\n 'Barmer, Rajasthan',\n 'São Paulo',\n 'Fatehpur',\n 'Palakkad',\n 'Brig-Glis',\n 'Sultanpur, Uttar Pradesh',\n 'Eluru',\n 'Solapur',\n 'Balasore',\n 'Painavu',\n 'Baripada',\n 'Jalandhar',\n 'Akola',\n 'Ranchi',\n 'Jajpur',\n 'Patna',\n 'Baton Rouge',\n 'Hoshiarpur',\n 'Deoghar',\n 'Durg',\n 'Bolton',\n 'Amravati',\n 'Jabalpur',\n 'Alappuzha',\n 'Prayag',\n 'Mission',\n 'Semarang',\n 'Hamirpur, Himachal Pradesh',\n 'Khordha',\n 'Guwahati',\n 'Brampton',\n 'Perth',\n 'Nagaon',\n 'Mysore',\n 'Dindigul',\n 'Mississauga',\n 'Patan',\n 'Dubai',\n 'Wardha',\n 'Athens-Clarke County',\n 'Riyadh',\n 'Guna',\n 'Ludhiana',\n 'Firozabad',\n 'Bulandshahr',\n 'Dharwad',\n 'Ghaziabad',\n 'Hathras',\n 'Dharamsala',\n 'Kakinada',\n 'Gurgaon',\n 'Meerut',\n 'Dhanbad',\n 'Faridkot',\n 'Hazaribagh',\n 'Pauri',\n 'Namchi',\n 'Tamluk',\n 'Godhra',\n 'Munich',\n 'Darjeeling',\n 'Pali',\n 'Krishnanagar',\n 'Agra',\n 'Kolhapur',\n 'Saharsa',\n 'Auckland',\n 'Sivaganga',\n 'Thoothukudi',\n 'Jaipur',\n 'Warangal Urban district',\n 'Ratnagiri',\n 'Dharmapuri',\n 'Lucknow',\n 'Bilaspur',\n 'Mathura',\n 'Kanker',\n 'Udaipur',\n 'Davangere',\n 'Amritsar',\n 'Rohtak',\n 'Northampton',\n 'Washington, D.C.',\n 'Tbilisi',\n 'Coimbatore',\n 'Bhawanipatna',\n 'Bloomington',\n 'Surendranagar',\n 'Visakhapatnam',\n 'Dahod',\n 'Bundi',\n 'Chhatarpur',\n 'Milan',\n 'Sarasota',\n 'Bareilly',\n 'Ujjain',\n 'Deoria, Uttar Pradesh',\n 'Yamuna Nagar',\n 'Agartala',\n 'Mandy',\n 'Jaisalmer',\n 'Nashik',\n 'Kottayam',\n 'Sitapur',\n 'Jalna',\n 'Kolkata',\n 'Chamoli Gopeshwar',\n 'Bhopal',\n 'Manchester',\n 'Giridih',\n 'Aurangabad',\n];\n\nclass AudienceLocation extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n locationText: '',\n valueText: '',\n isCheck: Array.from(new Set(this.props.locations)),\n };\n }\n\n handleDelete = (t) => {\n this.props.locations.splice(this.props.locations.indexOf(t), 1);\n this.state.isCheck.splice(this.state.isCheck.indexOf(t), 1);\n this.setState({\n isCheck: this.state.isCheck,\n });\n };\n\n render() {\n let { classes, locations } = this.props;\n\n let locationText = this.state.locationText;\n\n return (\n \n \n \n \n \n this.setState({\n valueText: '',\n locationText: '',\n })\n }\n >\n \n \n ),\n }}\n value={this.state.valueText}\n onChange={(e) => {\n this.setState({\n locationText: e.target.value,\n valueText: e.target.value,\n });\n }}\n />\n \n \n {\n this.props.setLocations(\n 'locations',\n [''].filter((data) => data[0]),\n );\n // this.setState({ valueText: '' });\n }}\n >\n Reset\n \n \n \n \n
\n \n {this.state.isCheck.map((tags) => {\n if (locations.indexOf(tags) > -1) {\n return (\n \n {\n this.handleDelete(tags);\n }}\n className={classes.chipset}\n />\n \n );\n }\n })}\n
\n {locationsMap.map((each) => {\n if (each.toLowerCase().indexOf(locationText.toLowerCase()) > -1) {\n return (\n -1 ? '1px solid #FEBD1C' : 'none',\n borderRadius: 20,\n }}\n onClick={(e) => {\n if (locations.indexOf(each) > -1) {\n locations.splice(locations.indexOf(each), 1);\n this.state.isCheck.splice(this.state.isCheck.indexOf(each), 1);\n this.setState({\n isCheck: this.state.isCheck,\n });\n } else {\n locations.push(each);\n this.setState({\n isCheck: this.state.isCheck.concat(each),\n });\n }\n this.props.setLocations('locations', locations);\n // this.setState({ valueText: '' });\n }}\n >\n \n \n \n {locations.indexOf(each) > -1 ? (\n \n ) : null}\n \n \n -1 ? classes.selectedText : classes.default\n }\n >\n {each}\n \n \n \n \n \n );\n }\n })}\n \n \n\n // \n //
\n //
\n // {\n // this.setState({\n // locationText: e.target.value,\n // valueText: e.target.value,\n // });\n // }}\n // />\n //
\n //
\n // {locationsMap.map((each) => {\n // if (each.toLowerCase().indexOf(locationText.toLowerCase()) > -1) {\n // return (\n //
-1\n // ? '1px solid #FEBD1C'\n // : 'none',\n // borderRadius: 20,\n // }}\n // onClick={(e) => {\n // if (locations.indexOf(each) > -1) {\n // locations.splice(locations.indexOf(each), 1);\n // } else {\n // locations.push(each);\n // }\n // this.props.setLocations('locations', locations);\n // this.setState({ valueText: '' });\n // }}\n // >\n // \n // \n // \n // {locations.indexOf(each) > -1 ? (\n // \n // ) : null}\n // \n // \n // -1\n // ? classes.selectedText\n // : classes.default\n // }\n // >\n // {each}\n // \n // \n // \n // \n // \n // //
-1\n // // ? '1px solid #FEBD1C'\n // // : 'none',\n // // borderRadius: 20,\n // // }}\n // // onClick={(e) => {\n // // if (locations.indexOf(each) > -1) {\n // // locations.splice(locations.indexOf(each), 1);\n // // } else {\n // // locations.push(each);\n // // }\n // // this.props.setLocations('locations', locations);\n // // this.setState({ valueText: '' });\n // // }}\n // // >\n // // {locations.indexOf(each) > -1 ? (\n // //
\n // // ) : null}\n // //
-1\n // // ? classes.selectedText\n // // : classes.default\n // // }\n // // >\n // // {each}\n // // \n // //
\n // );\n // }\n // })}\n //
\n //
\n //
\n );\n }\n}\n\nconst styles = {\n search: {\n border: '1px solid #C4C4C4',\n borderRadius: '30px',\n width: 300,\n outline: 'none',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n marginLeft: 10,\n },\n selectedText: {\n color: '#FEBD1C',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 13,\n cursor: 'pointer',\n textAlign: 'left',\n },\n default: {\n color: '#757575',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n cursor: 'pointer',\n textAlign: 'left',\n },\n resetButton: {\n textTransform: 'none',\n color: '#757575',\n },\n chipset: {\n fontFamily: 'Nunito Sans',\n background: '#FFFFFF',\n borderRadius: 34,\n borderWidth: 1,\n borderColor: '#C9C9C9',\n fontSize: 12,\n fontWeight: 400,\n cursor: 'pointer',\n },\n};\n\nexport default withStyles(styles)(AudienceLocation);\n","import { Slider } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst SliderWithoutBackgroundCustomSlider = withStyles({\n root: {\n color: '#FFFFFF',\n height: 8,\n },\n thumb: {\n height: 24,\n width: 24,\n marginTop: -8,\n marginLeft: -12,\n '&:focus, &:hover, &$active': {\n boxShadow: 'inherit',\n },\n background: '#FFFFFF',\n border: '2px solid #FEBD1C',\n boxShadow: '2px 2px 4px rgba(148, 148, 148, 0.25)',\n },\n active: {},\n valueLabel: {\n left: 'calc(-50% + 4px)',\n },\n track: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 20,\n },\n rail: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 20,\n },\n})(Slider);\n\nexport default SliderWithoutBackgroundCustomSlider;\n","import * as React from 'react';\nimport { Grid, Typography, RadioGroup, Radio } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport CustomSlider from 'components/PlannerTheme/Elements/Slider/Slider';\nimport SliderWithoutBackgroundCustomSlider from 'components/PlannerTheme/Elements/SliderWithoutBackground/SliderWithoutBackground';\n\nclass AudienceGenderSplit extends React.Component {\n render() {\n const { classes, genderGroupType, genderGroupPercentage } = this.props;\n\n return (\n \n {\n this.props.setGenderGroup('genderGroupType', event.target.value);\n }}\n >\n \n \n Male \n \n \n \n Female \n \n \n \n {`atleast ${genderGroupPercentage} %`} \n {\n this.props.setGenderGroup('genderGroupPercentage', newValue);\n }}\n step={1}\n disabled={genderGroupType ? false : true}\n value={genderGroupPercentage}\n />\n
\n \n );\n }\n}\n\nconst styles = {\n optionLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n color: '#757575',\n // marginLeft:10\n },\n selectedText: {\n color: '#FEBD1C',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 13,\n },\n slider: {\n width: 150,\n },\n};\n\nexport default withStyles(styles)(AudienceGenderSplit);\n","import * as React from 'react';\nimport { Grid, Typography, TextField, Button, IconButton, InputAdornment } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport SliderWithoutBackgroundCustomSlider from 'components/PlannerTheme/Elements/SliderWithoutBackground/SliderWithoutBackground';\nimport LockIcon from '@mui/icons-material/Lock';\nimport LockOpenIcon from '@mui/icons-material/LockOpen';\nclass CreatorsBudgetValue extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n icons: false,\n };\n }\n changeLockIcon() {\n this.setState({ icons: !this.state.icons });\n }\n render() {\n let { classes } = this.props;\n let icons = false;\n return (\n \n \n \n {this.props.text}\n {this.props.text2} \n \n \n \n \n this.props.setCelebsType(`${this.props.setCelebsTypeText}`, newValue)\n // newValue <= this.props.max_value + this.props.value\n // ? newValue\n // : this.props.max_value + this.props.value\n // )\n }\n step={1000}\n value={this.props.value}\n />\n \n \n \n ₹\n \n ),\n }}\n disabled\n value={`${this.props.value}`}\n // onChange={(e) =>\n // this.props.setCelebsType(\n // `${this.props.setCelebsTypeText}`,\n // Number(e.target.value) <=\n // this.props.max_value + this.props.value\n // ? Number(e.target.value)\n // : this.props.max_value + this.props.value\n // )\n // }\n />\n \n \n {\n this.changeLockIcon();\n this.props.setInfluencerTypeLock(`${this.props.setLockText}`, !this.state.icons);\n }}\n >\n {this.state.icons === false ? (\n \n ) : (\n \n )}\n \n \n {this.props.reset === true ? (\n \n {\n this.props.setCelebsType('mega', 0);\n this.props.setCelebsType('macro', 0);\n this.props.setCelebsType('micro', this.props.budget);\n this.props.setCelebsType('nano', 0);\n }}\n >\n Reset\n \n \n ) : (\n \n \n \n )}\n \n );\n }\n}\n\nconst styles = {\n search: {\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n background: '#FFFFFF',\n width: 90,\n height: 15,\n outline: 'none',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n marginRight: 80,\n fontSize: 12,\n justifyContent: 'center',\n '& .MuiInputBase-root.Mui-disabled': {\n color: '#000000',\n },\n },\n optionLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n },\n label: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n color: '#757575',\n marginBottom: 10,\n marginRight: 50,\n display: 'flex',\n },\n label2: {\n fontSize: 10,\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n marginTop: 3,\n marginLeft: 5,\n color: '#757575',\n display: 'flex',\n },\n align: {\n textAlign: 'center',\n },\n slider: {\n width: 150,\n },\n resetButton: {\n textTransform: 'none',\n color: '#757575',\n },\n gridItems: {\n maxWidth: '20%',\n marginLeft: 20,\n },\n};\n\nexport default withStyles(styles)(CreatorsBudgetValue);\n","import * as React from 'react';\nimport { Grid, Typography, TextField, Button } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport CreatorsBudgetValue from './CreatorsBudgetValue';\n\nimport SliderWithoutBackgroundCustomSlider from 'components/PlannerTheme/Elements/SliderWithoutBackground/SliderWithoutBackground';\n\nclass CreatorsType extends React.Component {\n render() {\n let { classes, mega, macro, micro, nano, budget } = this.props;\n const max_value = budget - mega - macro - micro - nano;\n return (\n \n \n 1M)\"\n setCelebsTypeText=\"mega\"\n setLockText=\"ismegaLocked\"\n budget={budget}\n value={mega}\n setInfluencerTypeLock={this.props.setInfluencerTypeLock}\n max_value={max_value}\n setCelebsType={this.props.setCelebsType}\n remain_value={max_value}\n reset={true}\n > \n \n \n \n \n \n \n \n \n \n \n\n {/* \n \n \n \n \n \n Celebs\n \n \n \n \n \n this.props.setCelebsType(\n 'celebs',\n Number(e.target.value) <= max_value + celebs\n ? Number(e.target.value)\n : max_value + celebs\n )\n }\n />\n \n \n \n this.props.setCelebsType(\n 'celebs',\n newValue <= max_value + celebs\n ? newValue\n : max_value + celebs\n )\n }\n step={1000}\n value={celebs}\n />\n \n \n \n \n \n \n \n Macro\n \n (100K-500K)\n \n \n \n \n \n this.props.setCelebsType(\n 'macro',\n Number(e.target.value) <= max_value + macro\n ? Number(e.target.value)\n : max_value + macro\n )\n }\n />\n \n \n \n this.props.setCelebsType(\n 'macro',\n newValue <= max_value + macro\n ? newValue\n : max_value + macro\n )\n }\n step={1000}\n value={macro}\n />\n \n \n \n \n \n \n \n Micro\n \n (10K-100K)\n \n \n \n \n \n this.props.setCelebsType(\n 'micro',\n Number(e.target.value) <= max_value + micro\n ? Number(e.target.value)\n : max_value + micro\n )\n }\n />\n \n \n \n this.props.setCelebsType(\n 'micro',\n newValue <= max_value + micro\n ? newValue\n : max_value + micro\n )\n }\n step={1000}\n value={micro}\n />\n \n \n \n \n \n \n \n Nano\n \n ({'<'}10K)\n \n \n \n \n \n this.props.setCelebsType(\n 'nano',\n Number(e.target.value) <= max_value + nano\n ? Number(e.target.value)\n : max_value + nano\n )\n }\n />\n \n \n \n this.props.setCelebsType(\n 'nano',\n newValue <= max_value + nano\n ? newValue\n : max_value + nano\n )\n }\n step={1000}\n value={nano}\n />\n \n \n \n \n {\n this.props.setCelebsType('celebs', 0);\n this.props.setCelebsType('macro', 0);\n this.props.setCelebsType('micro', 0);\n this.props.setCelebsType('nano', 0);\n }}\n >\n Reset\n \n \n \n */}\n\n \n \n \n Budget \n \n \n ₹{budget} \n \n {/* \n \n Budget Allocated\n \n \n \n \n ₹{celebs + macro + micro + nano}\n \n */}\n \n \n \n );\n }\n}\n\nconst styles = {\n optionLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n marginLeft: 250,\n },\n moneylabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 13,\n color: '#757575',\n marginBottom: 10,\n paddingLeft: 10,\n paddingRight: 20,\n },\n slider: {\n width: 150,\n marginTop: 40,\n },\n resetButton: {\n textTransform: 'none',\n color: '#757575',\n },\n gridItems: {\n maxWidth: '20%',\n marginLeft: 20,\n },\n};\n\nexport default withStyles(styles)(CreatorsType);\n","export default __webpack_public_path__ + \"static/media/advance_filter.c2d43b3f.png\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/age_group.3d43a63a.png\";","import { useState, useEffect } from 'react';\nimport { Grid, Typography, TextField } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\n\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { getDiscoveryLocations } from 'api_handlers/discovery';\n\nfunction InfluencerLocation({ influencerLocations, hideAdvanceFilters, classes }) {\n const [locations, setLocations] = useState([]);\n\n useEffect(() => {\n getDiscoveryLocations().then((response) => {\n console.log('response data', response.data);\n setLocations(response.data);\n });\n }, []);\n return (\n <>\n \n
\n
Influencer Location \n
\n \n location)\n .map((location) => ({ label: location, value: location }))}\n value={influencerLocations || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('influencerLocations', selectedValues);\n }}\n />\n
\n >\n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(InfluencerLocation);\n","export default \"data:image/png;base64,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\"","import { useState, useEffect } from 'react';\nimport { Grid, Typography, TextField } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport SelectInterest from 'assets/planner/select_interest.png';\n\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { getPlannerAudienceInterests } from 'api_handlers/discovery';\n\nfunction AudienceInterest({ audienceInterest, hideAdvanceFilters, classes }) {\n const [interests, setInterests] = useState([]);\n\n useEffect(() => {\n getPlannerAudienceInterests().then((response) => {\n console.log('response data', response);\n setInterests(response);\n console.log(interests);\n });\n }, []);\n return (\n <>\n \n
\n
Audience Interest \n
\n \n ({\n label: interest,\n value: interest,\n }))}\n value={audienceInterest || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('interest_selection', selectedValues);\n }}\n />\n
\n >\n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(AudienceInterest);\n","import { FormControl, RadioGroup, FormControlLabel, Radio } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nfunction YesNoRadio({ value, onChange, options = [] }) {\n return (\n \n \n {options.map((option, index) => (\n }\n label={option.label}\n labelPlacement=\"end\"\n key={index}\n />\n ))}\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n paddingTop: '3px !important',\n paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n selected: {\n border: '3px solid #FEBD1C',\n boxShadow:\n '-5px 5px 10px rgba(210, 211, 219, 0.2), 5px -5px 10px rgba(210, 211, 219, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(210, 211, 219, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(210, 211, 219, 0.5)',\n borderRadius: '20px',\n },\n name: {\n fontSize: 14,\n },\n}));\n\nexport default YesNoRadio;\n","import { useState, useEffect } from 'react';\nimport { Grid, Typography, TextField } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\n\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { getPlannerCountries } from 'api_handlers/discovery';\n\nfunction InfluencerCountry({ influencerCountries, hideAdvanceFilters, classes }) {\n const [countries, setCountries] = useState([]);\n\n useEffect(() => {\n getPlannerCountries().then((response) => {\n // console.log(\"response data\", response.data);\n setCountries(response.data);\n });\n }, []);\n return (\n <>\n \n
\n
Country \n
\n \n location)\n .map((location) => ({ label: location, value: location }))}\n value={influencerCountries || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('influencerCountries', selectedValues);\n }}\n />\n
\n >\n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(InfluencerCountry);\n","import { Grid, Typography, withStyles } from '@material-ui/core';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { getCityStateList } from 'api_handlers/discovery';\nimport { useState, useEffect } from 'react';\n\nfunction InfluencerState({ influencerState, hideAdvanceFilters, classes, influencerCountries }) {\n const [states, setStates] = useState([]);\n useEffect(() => {\n const fetchStates = async () => {\n try {\n // var occurrences = [];\n // for (var i = 0; i < influencerCountries.length; i++) {\n // occurrences.push(influencerCountries[i]['value']);\n // }\n // const data = { country: occurrences };\n // console.log('countries', occurrences);\n const resp = await getCityStateList();\n console.log(\"States: \", resp)\n setStates(resp.data);\n } catch (error) {\n console.error('Error fetching states:', error);\n }\n };\n fetchStates();\n }, []);\n\n return (\n \n \n \n State \n \n \n ({label: state, value: state}))}\n value={influencerState || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('influencerState', selectedValues);\n }}\n />\n \n \n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(InfluencerState);\n","import { Grid, Typography, withStyles } from '@material-ui/core';\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport { useState, useEffect } from 'react';\nimport { getCityStateList } from 'api_handlers/discovery';\n\nfunction InfluencerCity({ influencerCity, hideAdvanceFilters, influencerState, classes }) {\n const [city, setCity] = useState([]);\n\n useEffect(() => {\n const fetchCities = async () => {\n try {\n // var occurrences = [];\n // for (var i = 0; i < influencerState.length; i++) {\n // occurrences.push(influencerState[i]['value']);\n // }\n // const data = { state: occurrences };\n const resp = await getCityStateList(true);\n setCity(resp.data);\n } catch (error) {\n console.error('Error fetching cities:', error);\n }\n };\n fetchCities();\n }, []);\n\n return (\n \n \n \n City \n \n \n ({label: location, value: location}))}\n value={influencerCity || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('influencerCity', selectedValues);\n }}\n />\n \n \n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(InfluencerCity);\n","import { useState, useEffect } from 'react';\nimport { Grid, Typography, TextField } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport SelectInterest from 'assets/planner/select_interest.png';\n\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { getDeliverables } from 'api_handlers/brand';\n\nfunction Deliverables({ infDeliverables, hideAdvanceFilters, classes }) {\n const [deliverables, setDeliverables] = useState([]);\n\n useEffect(() => {\n getDeliverables().then((response) => {\n setDeliverables(response.data);\n });\n }, []);\n return (\n <>\n \n
\n
Deliverables \n
\n \n ({\n label: deliverable,\n value: deliverable,\n }))}\n value={infDeliverables || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('deliverables', selectedValues);\n }}\n />\n
\n >\n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(Deliverables);\n","import { Grid, Typography, withStyles } from '@material-ui/core';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport { cityStateList } from 'api_handlers/influencer';\nimport { useState, useEffect } from 'react';\n\nfunction InfluencerZone({ influencerZone, hideAdvanceFilters, classes }) {\n const [states, setStates] = useState(['North', 'South', 'East', 'West']);\n\n return (\n \n \n \n Regions \n \n \n location)\n .map((location) => ({ label: location, value: location }))}\n value={influencerZone || []}\n onChange={(event, selectedValues) => {\n hideAdvanceFilters('influencerZone', selectedValues);\n }}\n />\n \n \n );\n}\n\nconst styles = {\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(InfluencerZone);\n","import { useEffect, useState, Component } from 'react';\nimport { Grid, Typography, TextField, Checkbox } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport AdvanceFilter from 'assets/planner/advance_filter.png';\nimport Close from 'assets/planner/close.png';\nimport Date from 'assets/planner/date.png';\nimport Rate from 'assets/planner/rate.png';\nimport Audience from 'assets/planner/audience.png';\nimport Engagement from 'assets/planner/engagement.png';\nimport PostPerformance from 'assets/planner/post_performance.png';\nimport Gender from 'assets/planner/gender.png';\nimport AgeGroup from 'assets/planner/age_group.png';\nimport Language from 'assets/planner/language.png';\nimport Percentage from 'assets/planner/percentage.png';\nimport Credibility from 'assets/planner/credible.png';\nimport Male from 'assets/planner/male.png';\nimport Female from 'assets/planner/female.png';\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport PhoneAndroidIcon from '@mui/icons-material/PhoneAndroid';\nimport EmailIcon from '@mui/icons-material/Email';\nimport DateFnsUtils from '@date-io/date-fns';\nimport { MuiPickersUtilsProvider, DatePicker } from '@material-ui/pickers';\nimport PersonPinCircleIcon from '@mui/icons-material/PersonPinCircle';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport InfluencerLocation from './filterSection/InfluencerLocation';\nimport AudienceInterest from './filterSection/AudienceInterest';\nimport CustomSlider from 'components/PlannerTheme/Elements/Slider/Slider';\nimport MultiSelect from 'components/PlannerTheme/Elements/MultiSelect';\nimport YesNoRadio from 'components/Theme/Elements/YesNoRadio';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport InfluencerCountry from './filterSection/InfluencerCountry';\nimport InfluencerState from './filterSection/InfluencerState';\nimport InfluencerCity from './filterSection/InfluencerCity';\nimport Deliverables from './filterSection/CampaignDeliverable';\nimport InfluencerZone from './filterSection/InfluencerZone';\n\nimport { getLanguages } from '../../../../api_handlers/influencer';\n\nconst icon = ;\nconst checkedIcon = ;\n\nconst interests = [\n 'Actor',\n 'App Review',\n 'Art and craft',\n 'Automobile',\n 'Beauty',\n 'Blogger',\n 'Blooger',\n 'Comedy',\n 'Content',\n 'Content Creation',\n 'Content Creator',\n 'Couple Life’S',\n 'Crypto',\n 'Dance',\n 'Decor',\n 'Digtal Creator',\n 'education ',\n 'Entertainment',\n 'Fashion',\n 'Fashion\tMale',\n 'Finance',\n 'Fitness',\n 'Food',\n 'Gaming',\n 'Gaming / E-sports',\n 'Health',\n 'home decor ',\n 'Influencer',\n 'Infotainment',\n 'Investement',\n 'Investment',\n 'Lifestyle',\n 'Luxury',\n 'Motivation',\n 'Motivational',\n 'Music',\n 'Parenting',\n 'Pets',\n 'Photography',\n 'Phototgraphy',\n 'Self Help',\n 'Social Issues',\n 'Sports',\n 'Sustainable Fashion',\n 'Tech',\n 'Technology',\n 'Travel',\n 'Travel / Content Creator',\n 'Travel/ Food',\n 'Travel/ lifestyle',\n 'Vlogger',\n 'Wellness',\n 'Television & Film',\n 'Music',\n 'Shopping & Retail',\n 'Coffee, Tea & Beverages',\n 'Camera & Photography',\n 'Clothes, Shoes, Handbags & Accessories',\n 'Beer, Wine & Spirits',\n 'Sports',\n 'Electronics & Computers',\n 'Gaming',\n 'Activewear',\n 'Art & Design',\n 'Travel, Tourism & Aviation',\n 'Business & Careers',\n 'Beauty & Cosmetics',\n 'Healthcare & Medicine',\n 'Jewellery & Watches',\n 'Restaurants, Food & Grocery',\n 'Toys, Children & Baby',\n 'Fitness & Yoga',\n 'Wedding',\n 'Tobacco & Smoking',\n 'Pets',\n 'Healthy Lifestyle',\n 'Luxury Goods',\n 'Home Decor, Furniture & Garden',\n 'Friends, Family & Relationships',\n 'Cars & Motorbikes',\n];\n\n// const languages_map = [\n// \"English\",\n// \"Hindi\",\n// \"Gujarati\",\n// \"Bengali\",\n// \"Punjabi\",\n// \"Marathi\",\n// \"Kannada\",\n// \"Malayalam\",\n// \"Tamil\",\n// \"Telugu\",\n// \"Bhojpuri\",\n// \"Assamese\",\n// \"Urdu\",\n// \"Tibetan\",\n// \"Manipuri\",\n// \"Mizo\",\n// \"Nepali\",\n// \"Konkani\",\n// \"Bodo\",\n// \"Dogri\",\n// \"Kashmiri\",\n// \"Maithili\",\n// \"Sindhi\",\n// \"Santali\",\n// \"Odia\",\n// \"Marwari\",\n// \"Tulu\",\n// \"Naga\",\n// \"Haryanvi\",\n// \"Kutchi\",\n// \"French\",\n// \"German\",\n// \"Italian\",\n// ];\n\nconst genderOptions = ['Male', 'Female', 'Other', 'Page'];\n\nconst ageGroupOptions = ['13-17', '18-24', '25-34', '35-44', '45-64', '65-'];\n\nfunction valuetext(value) {\n return `${value}%`;\n}\n\nfunction numberValidation(value) {\n const num = Number(value);\n if (isNaN(num)) {\n return true;\n } else {\n return false;\n }\n}\n\nclass AdvanceFilterWidget extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n language: [],\n ageGroup: '',\n paidPP: '',\n avgEngaged: '',\n avgViews: '',\n languages_map: [],\n brandPrice: '',\n infPrice: '',\n keywordFilter: '',\n bioFilter:'',\n };\n }\n\n async loadInterest() {\n let data = await getLanguages();\n let languages_map = [];\n data.map((each) => {\n languages_map.push(each.name);\n });\n this.setState({ languages_map });\n }\n\n componentDidMount() {\n this.loadInterest();\n }\n\n render() {\n const {\n classes,\n rate,\n audienceCredibility,\n interest_selection,\n avg_engagement,\n ppp,\n gender,\n isEmail,\n isPhone,\n is_audience_data,\n languageAdvance,\n influencerAge,\n influencerLocations,\n influencerCountries,\n influencerState,\n influencerCity,\n startDate,\n endDate,\n avg_views,\n brand_final_price,\n influencer_final_price,\n deliverables,\n keywords,\n bio_keyword,\n influencerZone,\n } = this.props;\n console.log('D: ', deliverables);\n\n return (\n \n \n \n {\n this.props.hideAdvanceFilters('showdAvanceFilter', false);\n this.props.setShowModal(false);\n }}\n >\n
\n
\n \n \n \n
\n
\n
Engagement Rate \n
\n
{\n this.props.hideAdvanceFilters('rate', newValue);\n }}\n step={1}\n value={rate}\n valueLabelFormat={valuetext}\n />\n \n \n
\n
\n
Average Engaged Users \n
\n
{\n this.setState({ avgEngaged: e.target.value });\n if (!isNaN(Number(e.target.value))) {\n this.props.hideAdvanceFilters('avg_engagement', Number(e.target.value));\n }\n }}\n />\n \n \n
\n
\n
Average Views \n
\n
{\n this.setState({ avgViews: e.target.value });\n if (!isNaN(Number(e.target.value))) {\n this.props.hideAdvanceFilters('avg_views', Number(e.target.value));\n }\n }}\n />\n \n \n \n \n \n
\n
\n
Influencer Age Group \n
\n
\n ({\n label: age_group,\n value: age_group,\n }))}\n value={influencerAge || []}\n onChange={(event, selectedValues) => {\n this.props.hideAdvanceFilters('influencerAge', selectedValues);\n }}\n />\n
\n
\n \n
\n
\n
Influencer Language \n
\n
\n ({\n label: language,\n value: language,\n }))}\n value={languageAdvance || []}\n onChange={(event, selectedValues) => {\n this.props.hideAdvanceFilters('languageAdvance', selectedValues);\n }}\n />\n
\n
\n \n \n \n
\n
\n
Paid Post Performance \n
\n
\n
{\n this.setState({ paidPP: e.target.value });\n if (!isNaN(Number(e.target.value))) {\n this.props.hideAdvanceFilters('ppp', Number(e.target.value));\n }\n }}\n />\n \n \n
\n \n
\n
\n
Influencer Gender \n
\n
\n
{\n this.props.hideAdvanceFilters('gender', selectedValues);\n }}\n options={genderOptions.map((genderOpt) => ({\n label: genderOpt,\n value: genderOpt,\n }))}\n value={gender || []}\n disableCloseOnSelect\n disableClearable\n getOptionLabel={(option) => option.label}\n getOptionSelected={(option, value) => option.value === value.value}\n renderOption={(option, { selected }) => (\n <>\n \n {option.label}\n >\n )}\n style={{\n width: '200px',\n border: 'none',\n background: '#FFFFFF',\n boxShadow:\n '-2px 2px 4px rgba(219, 220, 229, 0.2), 2px -2px 4px rgba(219, 220, 229, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n borderRadius: '20px',\n }}\n renderInput={(params) => (\n \n )}\n />\n \n
\n \n
\n
\n
Audience Credibility \n
\n
{\n this.props.hideAdvanceFilters('audienceCredibility', newValue);\n }}\n step={1}\n value={audienceCredibility}\n valueLabelFormat={valuetext}\n />\n \n \n \n {/*
\n
*/}\n\n {this.props.isStaff ? (\n \n \n\n \n
\n
\n
Brand Final Price \n
\n
\n {\n this.setState({ brandPrice: e.target.value });\n if (!isNaN(Number(e.target.value))) {\n this.props.hideAdvanceFilters('brand_final_price', Number(e.target.value));\n }\n }}\n />\n
\n
\n \n
\n
\n
Influencer Final Price \n
\n
\n {\n this.setState({ infPrice: e.target.value });\n if (!isNaN(Number(e.target.value))) {\n this.props.hideAdvanceFilters(\n 'influencer_final_price',\n Number(e.target.value),\n );\n }\n }}\n />\n
\n
\n \n ) : (\n ''\n )}\n \n\n \n \n {this.props.isStaff ? (\n \n \n \n {/*
*/}\n
\n
Email \n
\n \n
{\n this.props.hideAdvanceFilters('isEmail', 'yes');\n }}\n >\n {/* */}\n Yes\n \n
{\n this.props.hideAdvanceFilters('isEmail', 'no');\n }}\n >\n {/* */}\n No\n \n
\n \n \n ) : (\n ''\n )}\n \n\n \n {this.props.isStaff ? (\n \n \n \n {/*
*/}\n
\n
Phone \n
\n \n
{\n this.props.hideAdvanceFilters('isPhone', 'yes');\n }}\n >\n {/* */}\n Yes\n \n
{\n this.props.hideAdvanceFilters('isPhone', 'no');\n }}\n >\n {/* */}\n No\n \n
\n \n \n ) : (\n
\n )}\n \n \n \n \n \n
\n
Audience Data Available \n
\n \n
{\n this.props.hideAdvanceFilters('is_audience_data', 'yes');\n }}\n >\n {/* */}\n Yes\n \n
{\n this.props.hideAdvanceFilters('is_audience_data', 'no');\n }}\n >\n {/* */}\n No\n \n
\n \n \n \n \n\n \n \n \n \n \n
\n
Search: By Caption \n
\n {\n this.setState({ keywordFilter: e.target.value });\n this.props.hideAdvanceFilters('keywords', e.target.value);\n }}\n />\n \n \n \n \n \n
\n
Search: By Bio \n
\n {\n this.setState({ bioFilter: e.target.value });\n this.props.hideAdvanceFilters('bio_keyword', e.target.value);\n }}\n />\n \n \n \n \n \n \n \n {/* */}\n \n \n Influencer Address \n \n \n \n\n \n \n \n \n \n {/* {influencerCountries.length > 0 ? ( */}\n \n \n \n {/* ) : (\n (influencerState.length = [])\n )} */}\n {/* {influencerState.length > 0 ? ( */}\n \n \n \n {/* ) : (\n (influencerCity.length = [])\n )} */}\n \n \n\n \n \n \n \n \n \n \n \n );\n }\n}\n\nconst CssTextField = withStyles({\n root: {\n '& label.Mui-focused': {\n color: 'white',\n },\n '& .MuiInput-underline:after': {\n border: 'none',\n },\n '& .MuiOutlinedInput-root': {\n '& fieldset': {\n border: 'none',\n },\n '&:hover fieldset': {\n border: 'none',\n },\n '&.Mui-focused fieldset': {\n border: 'none',\n },\n },\n },\n})(TextField);\n\nconst styles = {\n search: {\n background: '#FFFFFF',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: '10px',\n width: 300,\n outline: 'none',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n marginLeft: 10,\n },\n InfluencerAddressText: {\n fontFamily: 'Nunito Sans',\n paddingLeft: 10,\n paddingTop: 60,\n fontWeight: 400,\n fontSize: 16,\n },\n InfluencerAddress: {\n padding: 10,\n marginTop: 15,\n },\n defaultCheck: {\n padding: 10,\n background: '#FFFFFF',\n boxShadow:\n '-3px 3px 6px rgba(215, 216, 224, 0.2), 3px -3px 6px rgba(215, 216, 224, 0.2), -3px -3px 6px rgba(255, 255, 255, 0.9), 3px 3px 8px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: '10px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n },\n selectedCheck: {\n color: 'white',\n padding: 10,\n background: '#FEBD1C',\n boxShadow:\n '-3px 3px 6px rgba(215, 216, 224, 0.2), 3px -3px 6px rgba(215, 216, 224, 0.2), -3px -3px 6px rgba(255, 255, 255, 0.9), 3px 3px 8px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: '10px',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n },\n advanceHeading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(AdvanceFilterWidget);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJDSURBVHgBzdlLbsIwFIVhJ14VD6ndExJTwhTBnmAArApSnzQXgXH8vHb8S1VQZUQ+3OblRmhtt9sdtofDYS8qS+0bNsb9k9rAXd/3nXr5u16vxfV6vYhKGhHduH8/+v7Jt4GEoKrBvCF2468aoWHkOFBHULNjDAjqAyMtCGo2jAVBvTDt4/FohCNA6SBQKg8E1Tyfz0be7/fzYrFoVL+ONxSbmQAEvuT98Xjshv+RmjAxCLx+HbVqwMQi0Md5ZE5MCgJJfdAcmFQEkqbBJTEcCCSn3lQCw4VA0vbmnBhOBLJCUA4MNwI5IYgTkwOBvCCIA5MLgbwhKBWzWq2yIFAQBMViPK6yh2IQyHnlO9Vms+natnV+uwrcYZsTgYJnhAqZmfHHWgoCRUNQAMZaKgIlQVAqhgOBkiEoFsOFQCwQFIrhRKBWMCal7D2H9uqI5zvW77MFU77nibGv51KpRZ9HqJDLDkO9+lPcczyeTZqRRARim5loCAOCYsFEQUIQ6uHZXo27OI5myZhgSOil+Ol06jwPzUmYIEjK/QQwy+UyG8YbwnFTpGblLIYLYn6MF4Trzk7NSjaME8J9e5oLY4XkusfOgZmE5HxQgLgxRkhuBMWJ+YKUQlBcGH15GptiCIoD8748jU1xBJWKoeVpbGZDUCkYWQuCisVI9Rgz6xPAmGIwLdaohaOSCEpdNQ9PJ/HZjqH/6+y32816VToHgvKZmY919inMnAjKhjGus+uYGhCUCWNdZyeMenmpBUERRgGM+/cHV2AwuCkH/NIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAaCAYAAABVX2cEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIBSURBVHgBnVTtTeswFD1O35Pejwd0A8IGZQKaDegEtBMUJqCdAJigYQLKBM0GhAkwG4QvCakCc66dpIlJqrZHiur62sfnfiqsQW/xvw8EV4DpASoFvkZp9JG2nVf1y90u8D22l416hjJj73zGb8RrJDcaWCZp9KlbyPafeCjE5tBA5ziNMnkEwYpob7glkSCkJ+fFn8ARiXs4wS5Q5rBckigk+2IHVVXEdPfiDzM0g5W7Meb8XvidVfaG5OlS2Z7BxjA3afRuY9SQrCxw9eND9pSu8+BxRST19zssgbxW50GcRq/HNEW5SwINtTytXJuhQXXAF/ueglB+WDs6jd4GTM4FizMqipPuXTYnK8jaYkZ1byN/02X+6wnN0FJnWYNh6BT4kBJqg5IEfE+bjWZSJWx3r3zoXrmD0kqq7XDsMmsmLSz0zNxKplXl5WtujrE9BoyvzXpQkTnHTliWdVqSUWZCZVNsBTNdM8/s9JDXQvfbuavHUQpcJVzwXGdezLEWslq/aa5lqob5ZBWSA9iEQNYyytmrr5Pi/rrhKCS2bXjhnJ1xmhMJ+k6dGfcW/8Iamats1VCk1uXE+WDiBiMJ/848ZdLE1o3YmxZlgF2CkFRsc+RKC3XKf8qNFyVtI41+VLfZ3nzgMvNtFWUr5ApuWXeD37ZMS9BFMTbFqkS2s/0ATpfaVyiRIRsAAAAASUVORK5CYII=\"","import { constants } from '../constants/discovery';\n\nimport { getDiscoveryInfluencers, getPlannerInfluencers } from 'api_handlers/discovery';\n\nfunction objectToParams(object) {\n let str = '';\n for (let key in object) {\n if (str !== '') {\n str += '&';\n }\n str += key + '=' + encodeURIComponent(object[key]);\n }\n return str;\n}\n\nexport function getInfluencers() {\n return (dispatch, getState) => {\n const {\n discovery: { filters },\n } = getState();\n\n const simple_join_filters = [\n 'followers',\n 'audienceView',\n 'avgEngagement',\n 'audienceGender',\n 'audienceAgeGroup',\n 'audienceReachability',\n ];\n const value_join_filters = [\n 'category',\n 'location',\n 'language',\n 'audienceLocation',\n 'audienceInterest',\n ];\n\n const modifiedFilters = {};\n Object.keys(filters).forEach((key) => {\n if (filters[key] === null) return;\n if (Array.isArray(filters[key]) && filters[key].every((el) => el === null)) return;\n modifiedFilters[key] = filters[key];\n });\n\n simple_join_filters.forEach((key) => {\n if (!modifiedFilters[key]) return;\n modifiedFilters[key] = modifiedFilters[key].join(',');\n });\n\n value_join_filters.forEach((key) => {\n if (!modifiedFilters[key]) return;\n modifiedFilters[key] = modifiedFilters[key].map((item) => item.value).join(',');\n });\n\n dispatch(request());\n getDiscoveryInfluencers(objectToParams(modifiedFilters)).then(\n (result) => {\n dispatch(success(result));\n },\n (error) => {\n dispatch(failure());\n },\n );\n };\n\n function request() {\n return { type: constants.GET_INFLUENCER_REQUEST };\n }\n\n function success(data) {\n return { type: constants.GET_INFLUENCER_SUCCESS, data };\n }\n\n function failure() {\n return { type: constants.GET_INFLUENCER_FAILURE };\n }\n}\n\nexport function updateFilter(filter) {\n return (dispatch) => {\n dispatch(update());\n // dispatch(getInfluencers())\n };\n\n function update() {\n return { type: constants.UPDATE_FILTER, filter };\n }\n}\n\nexport function updatePayload(payload) {\n return (dispatch) => {\n dispatch(update());\n dispatch(getInfluencers());\n };\n\n function update() {\n return { type: constants.UPDATE_PAYLOAD, payload };\n }\n}\n\nexport function getFilteredInfluencer() {\n return (dispatch) => {\n dispatch(update());\n dispatch(getInfluencers());\n };\n\n function update() {\n return { type: constants.UPDATE_FILTER, filter: { page: 1 } };\n }\n}\n\nexport function resetFilter() {\n return (dispatch) => {\n dispatch(reset());\n };\n\n function reset() {\n return { type: constants.RESET_FILTER };\n }\n}\n","import * as React from 'react';\nimport { Grid, Typography, Slider, TextField, FormControl } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport CustomSlider from 'components/PlannerTheme/Elements/Slider/Slider';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Input from '@mui/material/Input';\n\nimport ObjectiveOption from './ObjectiveOption';\nimport { fontSize } from '@material-ui/system';\nimport AddIcon from '@mui/icons-material/Add';\nimport RemoveIcon from '@mui/icons-material/Remove';\n\nfunction countertostring(counter, decimal = true) {\n counter = parseInt(counter);\n if (counter >= 1000 && counter < 99999) {\n return (\n parseInt(counter / 1000.0)\n .toFixed(0)\n .toString() + 'K'\n );\n } else if (counter >= 99999 && counter <= 9999999) {\n return (\n parseFloat(counter / 100000.0)\n .toFixed(decimal && 2)\n .toString() + 'L'\n );\n } else if (counter > 9999999) {\n return (\n parseFloat(counter / 10000000.0)\n .toFixed(decimal && 3)\n .toString() + 'Cr'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction valuetext(value) {\n return `₹${countertostring(value)}`;\n}\n\nclass FilterSlider extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n textValue: this.props.currValue,\n isError: false,\n };\n }\n\n handleBudgetChange(e) {\n if (Number(e.target.value.replace(/\\D/g, '')) > this.props.maxValue) {\n this.setState({\n textValue: this.props.maxValue,\n isError: true,\n });\n } else {\n this.setState({\n textValue: Number(e.target.value.replace(/\\D/g, '')),\n isError: false,\n });\n }\n }\n componentDidUpdate(prevProps, prevState) {\n if (prevProps.currValue !== this.props.currValue) {\n this.setState({ textValue: this.props.currValue });\n }\n if (prevState.textValue !== this.state.textValue) {\n this.props.setFilters(this.props.filter, this.state.textValue);\n }\n if (this.props.filter == 'pricePerCreator' && prevProps.currBudget !== this.props.currBudget) {\n if (this.props.currBudget <= 10000000) {\n this.setState({ textValue: this.props.currBudget * 0.1 });\n } else {\n this.setState({ textValue: this.props.maxValue });\n }\n }\n }\n render() {\n let { classes, selected, setSelectedObjective } = this.props;\n console.log('currValue: ', this.props.currValue);\n // console.log('currBudge)\n\n return (\n {\n setSelectedObjective(this.props.objective);\n }}\n style={{ position: 'relative' }}\n >\n
\n {this.props.title}\n \n {selected ? (\n
\n {this.state.isError ? (\n
\n The value cannot exceed {countertostring(this.props.maxValue, false)}.\n \n ) : (\n ''\n )}\n
\n this.handleBudgetChange(e),\n startAdornment: (\n \n ₹\n \n ),\n classes: {\n input: classes.resize,\n },\n }}\n />\n
\n
\n
{\n if (this.state.textValue >= this.props.minValue + this.props.step) {\n this.setState({\n textValue: this.state.textValue - this.props.step,\n });\n this.props.setFilters(this.props.fitler, this.state.textValue);\n }\n }}\n />\n {\n this.setState({\n textValue: newValue,\n isError: false,\n });\n this.props.setFilters(this.props.filter, this.state.textValue);\n }}\n step={this.props.step}\n value={this.state.textValue}\n valueLabelFormat={valuetext}\n />\n {\n this.setState({\n textValue: this.state.textValue + this.props.step,\n });\n this.props.setFilters(this.props.filter, this.state.textValue);\n }}\n />\n \n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 300,\n height: 100,\n top: 128,\n padding: 20,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n display: 'flex',\n zIndex: 5,\n },\n error: {\n fontSize: '12px',\n color: 'red',\n position: 'absolute',\n left: '15%',\n top: '18%',\n },\n box: {\n boxSizing: 'border-box',\n\n position: 'absolute',\n left: '65.23%',\n right: '6.58%',\n top: '10.55%',\n bottom: '68.2%',\n\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n },\n slider: {\n top: '65px',\n position: 'absolute',\n width: '250px',\n left: '50px',\n },\n resize: {\n fontFamily: 'Nunito Sans',\n fontStyle: 'normal',\n fontWeight: 300,\n fontSize: '12px',\n lineHeight: '16px',\n letterSpacing: '0.03em',\n },\n add: {\n position: 'absolute',\n top: '2px',\n left: '254px',\n cursor: 'pointer',\n color: '#757575',\n },\n remove: {\n position: 'absolute',\n right: '264px',\n top: '2px',\n cursor: 'pointer',\n color: '#757575',\n },\n};\n\nexport default withStyles(styles)(FilterSlider);\n","import { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { Grid, Button, IconButton, Typography } from '@material-ui/core';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Category from './objective/Category';\nimport Objective from './objective/Objective';\nimport Budget from './objective/Budget';\nimport Priority from './objective/Priority';\nimport PricePerCreator from './objective/PricePerCreator';\n\nimport ParticularFilter from './filterSection/ParticularFilter';\nimport Channel from './filterSection/Channel';\nimport AudienceAgeGroup from './filterSection/AudienceAgeGroup';\nimport AudienceLocation from './filterSection/AudienceLocation';\nimport AudienceGenderSplit from './filterSection/AudienceGenderSplit';\nimport CreatorsType from './filterSection/CreatorsType';\n\nimport ObjectiveOption from './objective/ObjectiveOption';\n\nimport AdvanceFilter from 'assets/planner/advance-filter.png';\nimport Edit from 'assets/planner/edit.png';\nimport AdvanceFilterWidget from './AdvanceFilterWidget';\nimport { updatePayload } from 'actions/discovery';\n\nimport moment from 'moment';\nimport FilterSlider from './objective/FilterSlider';\nimport { SignalCellularNull } from '@mui/icons-material';\n\nclass Filters extends Component {\n constructor(props) {\n super(props);\n\n this.setChannels = this.setChannels.bind(this);\n this.setCelebsType = this.setCelebsType.bind(this);\n this.setInfluencerTypeLock = this.setInfluencerTypeLock.bind(this);\n this.setFilters = this.setFilters.bind(this);\n this.applyFilter = this.applyFilter.bind(this);\n this.resetFilter = this.resetFilter.bind(this);\n this.setObjectives = this.setObjectives.bind(this);\n this.setList = this.setList.bind(this);\n\n this.state = {\n channels: [],\n mega: 0,\n macro: 0,\n micro: 300000,\n nano: 0,\n ismegaLocked: false,\n ismacroLocked: false,\n ismicroLocked: false,\n isnanoLocked: false,\n isDisabled: false,\n remainingValue: 0,\n locations: [],\n influencerLocations: [],\n influencerCountries: [],\n influencerState: [],\n influencerCity: [],\n influencerZone: [],\n genderGroupType: '',\n genderGroupPercentage: 0,\n showdAvanceFilter: false,\n ageGroup: [],\n objective: 'Reach',\n budget: 300000,\n pricePerCreator: 30000,\n category: [],\n rate: 0,\n audienceCredibility: 0,\n interest_selection: [],\n avg_engagement: 0,\n ppp: 0,\n avg_views: 0,\n gender: '',\n isEmail: '',\n isPhone: '',\n is_audience_data:'',\n brand_final_price: 0,\n influencer_final_price: 0,\n keywords: '',\n bio_keyword:'',\n deliverables: [],\n languageAdvance: [],\n influencerAge: [],\n endDate: null,\n startDate: null,\n isEdit: true,\n isFirstTime: true,\n priority_list: [\n { name: 'Speed', id: 1 },\n { name: 'Price', id: 2 },\n { name: 'Impact', id: 3 },\n ],\n openAdFilter: false,\n };\n }\n\n setChannels(channels) {\n this.setState({ channels: channels });\n }\n\n setInfluencerTypeLock(type, value) {\n let dict = {};\n dict[type] = value;\n this.setState(dict);\n // console.log(dict);\n }\n getFilteredType(typeList, type) {\n return typeList\n .filter((_type) => _type !== type)\n .filter((_type) => !this.state[`is${_type}Locked`]);\n }\n\n setCelebsType(type, value) {\n if (this.state[`is${type}Locked`]) return;\n\n let dict = {};\n let typeList = ['mega', 'macro', 'micro', 'nano'];\n let remainedValue = this.state[type] - value;\n\n if (remainedValue === 0) return;\n\n let filteredTypeList = this.getFilteredType(typeList, type);\n\n if (filteredTypeList.length === 0) return;\n // Slider moved to left\n if (remainedValue > 0) {\n if (filteredTypeList.length === 1) {\n this.state[filteredTypeList[0]] += remainedValue;\n } else if (filteredTypeList.length === 2) {\n let floorValue = Math.floor(remainedValue / 2);\n this.state[filteredTypeList[0]] += floorValue;\n this.state[filteredTypeList[1]] += remainedValue - floorValue;\n } else if (filteredTypeList.length === 3) {\n let floorValue = Math.floor(remainedValue / 3);\n this.state[filteredTypeList[0]] += floorValue;\n this.state[filteredTypeList[1]] += floorValue;\n this.state[filteredTypeList[2]] += remainedValue - 2 * floorValue;\n }\n remainedValue = 0;\n } else {\n remainedValue = Math.abs(remainedValue);\n let floorValue;\n filteredTypeList\n .sort((first, second) => {\n if (this.state[first] < this.state[second]) return -1;\n if (this.state[first] > this.state[second]) return 1;\n return 0;\n })\n .forEach((influencerType, index) => {\n if (index === filteredTypeList.length - 1) {\n if (this.state[influencerType] - remainedValue < 0) {\n remainedValue = remainedValue - this.state[influencerType];\n this.state[influencerType] = 0;\n } else {\n this.state[influencerType] -= remainedValue;\n remainedValue = 0;\n }\n return false;\n }\n floorValue = Math.floor(remainedValue / (filteredTypeList.length - index));\n if (this.state[influencerType] - floorValue < 0) {\n remainedValue = remainedValue - this.state[influencerType];\n this.state[influencerType] = 0;\n } else {\n this.state[influencerType] -= floorValue;\n remainedValue -= floorValue;\n }\n });\n }\n dict[type] = value - remainedValue;\n this.setState(dict);\n }\n handleBudgetChange(value) {\n let typeList = ['mega', 'macro', 'micro', 'nano'];\n let totalValue = 0;\n typeList.forEach((type) => {\n totalValue += this.state[type];\n });\n let filteredTypeList = this.getFilteredType(typeList, '');\n\n if (totalValue == this.state['micro'] && !this.state['ismicroLocked']) {\n console.log('assigning to micro');\n this.state['micro'] = value;\n return;\n }\n let remainedValue = value - totalValue;\n\n // TODO: Creat a common function for this logic\n if (remainedValue > 0) {\n if (filteredTypeList.length === 1) {\n this.state[filteredTypeList[0]] += remainedValue;\n } else if (filteredTypeList.length === 2) {\n let floorValue = Math.floor(remainedValue / 2);\n this.state[filteredTypeList[0]] += floorValue;\n this.state[filteredTypeList[1]] += remainedValue - floorValue;\n } else if (filteredTypeList.length === 3) {\n let floorValue = Math.floor(remainedValue / 3);\n this.state[filteredTypeList[0]] += floorValue;\n this.state[filteredTypeList[1]] += floorValue;\n this.state[filteredTypeList[2]] += remainedValue - 2 * floorValue;\n } else if (filteredTypeList.length === 4) {\n let floorValue = Math.floor(remainedValue / 4);\n this.state[filteredTypeList[0]] += floorValue;\n this.state[filteredTypeList[1]] += floorValue;\n this.state[filteredTypeList[2]] += floorValue;\n this.state[filteredTypeList[3]] += remainedValue - 3 * floorValue;\n }\n remainedValue = 0;\n } else {\n remainedValue = Math.abs(remainedValue);\n let floorValue;\n filteredTypeList\n .sort((first, second) => {\n if (this.state[first] < this.state[second]) return -1;\n if (this.state[first] > this.state[second]) return 1;\n return 0;\n })\n .forEach((influencerType, index) => {\n if (index === filteredTypeList.length - 1) {\n if (this.state[influencerType] - remainedValue < 0) {\n remainedValue = remainedValue - this.state[influencerType];\n this.state[influencerType] = 0;\n } else {\n this.state[influencerType] -= remainedValue;\n remainedValue = 0;\n }\n return false;\n }\n floorValue = Math.floor(remainedValue / (filteredTypeList.length - index));\n if (this.state[influencerType] - floorValue < 0) {\n remainedValue = remainedValue - this.state[influencerType];\n this.state[influencerType] = 0;\n } else {\n this.state[influencerType] -= floorValue;\n remainedValue -= floorValue;\n }\n });\n }\n return;\n }\n\n setFilters(type, value) {\n let dict = {};\n dict[type] = value;\n this.setState(dict);\n console.log(\"setFilters\",this.state);\n }\n\n setObjectives(type, value) {\n let dict = {};\n dict[type] = value;\n if (type == 'budget') {\n this.handleBudgetChange(value);\n }\n this.setState(dict);\n }\n\n applyFilter() {\n let {\n genderGroupType,\n genderGroupPercentage,\n ageGroup,\n channels,\n locations,\n objective,\n budget,\n pricePerCreator,\n category,\n rate,\n audienceCredibility,\n interest_selection,\n avg_engagement,\n ppp,\n avg_views,\n gender,\n isEmail,\n isPhone,\n is_audience_data,\n brand_final_price,\n influencer_final_price,\n keywords,\n bio_keyword,\n deliverables,\n languageAdvance,\n influencerAge,\n influencerLocations,\n influencerCountries,\n influencerState,\n influencerCity,\n influencerZone,\n startDate,\n endDate,\n priority_list,\n } = this.state;\n\n let payload = {};\n payload['creator-level-requirements'] = {};\n payload['campaign-level-requirements'] = {};\n payload['setReset'] = false;\n if (channels.length > 0) {\n payload['creator-level-requirements']['platform'] = channels.join(',').toLocaleLowerCase();\n }\n if (\n this.state.mega > 0 ||\n this.state.micro > 0 ||\n this.state.macro > 0 ||\n this.state.nano > 0\n ) {\n payload['creator-level-requirements']['creator-type'] = {};\n if (this.state.mega > 0) {\n payload['creator-level-requirements']['creator-type']['mega'] = this.state.mega;\n }\n if (this.state.micro > 0) {\n payload['creator-level-requirements']['creator-type']['micro'] = this.state.micro;\n }\n if (this.state.macro > 0) {\n payload['creator-level-requirements']['creator-type']['macro'] = this.state.macro;\n }\n if (this.state.nano > 0) {\n payload['creator-level-requirements']['creator-type']['nano'] = this.state.nano;\n }\n }\n if (locations.length > 0) {\n payload['creator-level-requirements']['audienceLocation'] = locations.join(',');\n }\n if (genderGroupType && genderGroupType.length > 0) {\n payload['creator-level-requirements']['audienceGender'] =\n genderGroupType.toLocaleLowerCase() + ',' + genderGroupPercentage;\n }\n if (ageGroup && ageGroup.length > 0) {\n payload['creator-level-requirements']['audienceAgeGroup'] = ageGroup.join(',');\n }\n if (objective && objective.length > 0) {\n payload['campaign-level-requirements']['objective'] = objective;\n this.props.setSelectedObjectiveType(objective);\n }\n if (budget > 0) {\n payload['campaign-level-requirements']['budget'] = budget;\n }\n if (pricePerCreator > 0) {\n payload['campaign-level-requirements']['price-per-creator'] = pricePerCreator;\n }\n if (category.length > 0) {\n payload['campaign-level-requirements']['category'] = category.join(',');\n }\n let priority = [];\n priority_list.map((each) => {\n priority.push(each.name.toLowerCase());\n });\n payload['campaign-level-requirements']['priority'] = priority.join(',');\n payload['advance-filters'] = {};\n payload['advance-filters']['sortBy'] = 'followers';\n payload['advance-filters']['sortOrder'] = 'desc';\n if (rate > 0) {\n payload['advance-filters']['engagementRate'] = rate;\n }\n if (audienceCredibility > 0) {\n payload['advance-filters']['audienceCredibility'] = audienceCredibility;\n }\n let audienceInterest = [];\n interest_selection.map((each) => {\n audienceInterest.push(each.label);\n });\n if (audienceInterest.length > 0) {\n payload['advance-filters']['audienceInterest'] = audienceInterest.join('|');\n }\n if (avg_engagement > 0) {\n payload['advance-filters']['avg_engagement'] = avg_engagement;\n }\n if (ppp > 0) {\n payload['advance-filters']['ppp'] = ppp;\n }\n if (avg_views > 0) {\n payload['advance-filters']['avg_views'] = avg_views;\n }\n if (gender?.value) {\n payload['advance-filters']['gender'] = gender?.value.toLocaleLowerCase();\n }\n if (isEmail.length > 0) {\n payload['advance-filters']['isEmail'] = isEmail.toLocaleLowerCase();\n }\n if (isPhone.length > 0) {\n payload['advance-filters']['isPhone'] = isPhone.toLocaleLowerCase();\n }\n if (is_audience_data.length > 0) {\n payload['advance-filters']['is_audience_data'] = is_audience_data.toLocaleLowerCase();\n }\n if (brand_final_price > 0) {\n payload['advance-filters']['brand_final_price'] = brand_final_price;\n }\n if (influencer_final_price > 0) {\n payload['advance-filters']['influencer_final_price'] = influencer_final_price;\n }\n if (keywords.length > 0) {\n payload['advance-filters']['keyword_filter'] = keywords;\n }\n if (bio_keyword.length > 0) {\n payload['advance-filters']['bio_keyword'] = bio_keyword;\n }\n let deliverablesMap = [];\n deliverables.map((each) => {\n deliverablesMap.push(each.label.toLocaleLowerCase());\n });\n if (deliverablesMap.length > 0) {\n payload['advance-filters']['deliverables'] = deliverablesMap.join(',');\n }\n let languageAdvanceMap = [];\n languageAdvance.map((each) => {\n languageAdvanceMap.push(each.label);\n });\n if (languageAdvanceMap.length > 0) {\n payload['advance-filters']['language'] = languageAdvanceMap.join(',');\n }\n let influencerAgeMap = [];\n influencerAge.map((each) => {\n influencerAgeMap.push(each.label.toLocaleLowerCase());\n });\n if (influencerAgeMap.length > 0) {\n payload['advance-filters']['influencerAgeGroup'] = influencerAgeMap.join(',');\n }\n let influencerLocationsMap = [];\n influencerLocations.map((each) => {\n influencerLocationsMap.push(each.label.toLocaleLowerCase());\n });\n if (influencerLocationsMap.length > 0) {\n payload['advance-filters']['influencer_location'] = influencerLocationsMap.join(',');\n }\n let influencerCountriesMap = [];\n influencerCountries.map((each) => {\n influencerCountriesMap.push(each.label.toLocaleLowerCase());\n });\n\n let influencerStateMap = [];\n influencerState.map((each) => {\n influencerStateMap.push(each.label.toLocaleLowerCase());\n });\n\n let influencerCityMap = [];\n influencerCity.map((each) => {\n influencerCityMap.push(each.label.toLocaleLowerCase());\n });\n\n if (influencerCountriesMap.length > 0) {\n payload['advance-filters']['influencer_country'] = influencerCountriesMap.join(',');\n }\n if (influencerStateMap.length > 0) {\n payload['advance-filters']['influencer_state'] = influencerStateMap.join(',');\n }\n\n if (influencerCityMap.length > 0) {\n payload['advance-filters']['influencer_city'] = influencerCityMap.join(',');\n }\n\n let influencerZoneMap = [];\n influencerZone.map((each) => {\n influencerZoneMap.push(each.label);\n });\n\n if (influencerZoneMap.length > 0) {\n payload['advance-filters']['region'] = influencerZoneMap.join(',');\n }\n if (startDate) {\n payload['advance-filters']['camp_start_date'] = moment(startDate).format('YYYY-MM-DD');\n }\n if (endDate) {\n payload['advance-filters']['camp_end_date'] = moment(endDate).format('YYYY-MM-DD');\n }\n\n // if (searchedSelectedInfluencerIds) {\n // payload[\"searchedSelectedInfluencerIds\"] = []\n // }\n\n console.log(\"payload\",payload)\n\n this.setState({ isEdit: false });\n this.props.setReset(false);\n this.props.getPlannerInfluencersData(payload);\n }\n\n resetFilter() {\n let payload = {};\n payload['creator-level-requirements'] = {};\n payload['campaign-level-requirements'] = {};\n payload['advance-filters'] = {};\n payload['setReset'] = true;\n delete payload['budget_left'];\n delete payload['exclude_ids'];\n\n this.setState({\n isEdit: true,\n channels: [],\n mega: 0,\n macro: 0,\n micro: 300000,\n nano: 0,\n ismegaLocked: false,\n ismacroLocked: false,\n ismicroLocked: false,\n isnanoLocked: false,\n locations: [],\n influencerLocations: [],\n influencerCountries: [],\n influencerState: [],\n influencerCity: [],\n influencerZone: [],\n genderGroupType: '',\n genderGroupPercentage: 0,\n showdAvanceFilter: false,\n ageGroup: [],\n objective: 'Reach',\n budget: 300000,\n pricePerCreator: 30000,\n category: [],\n rate: 0,\n audienceCredibility: 0,\n interest_selection: [],\n avg_engagement: 0,\n ppp: 0,\n avg_views: 0,\n gender: '',\n isEmail: '',\n isPhone: '',\n is_audience_data:'',\n brand_final_price: '',\n influencer_final_price: '',\n keywords: '',\n bio_keyword:'',\n deliverables: [],\n languageAdvance: [],\n influencerAge: [],\n endDate: null,\n startDate: null,\n isEdit: true,\n isFirstTime: true,\n priority_list: [\n { name: 'Speed', id: 1 },\n { name: 'Price', id: 2 },\n { name: 'Impact', id: 3 },\n ],\n });\n this.props.setReset(true);\n this.props.getPlannerInfluencersData(payload);\n }\n\n setList(list) {\n this.setState({ priority_list: list });\n }\n\n render() {\n const {\n classes,\n selectedObjective,\n setSelectedObjective,\n selectedFilter,\n setSelectedFilter,\n setShowModal,\n } = this.props;\n\n let {\n isEdit,\n isFirstTime,\n channels,\n nano,\n micro,\n macro,\n mega,\n locations,\n genderGroupType,\n genderGroupPercentage,\n ageGroup,\n startDate,\n endDate,\n rate,\n audienceCredibility,\n languageAdvance,\n influencerAge,\n influencerLocations,\n influencerCountries,\n influencerState,\n influencerCity,\n influencerZone,\n gender,\n isEmail,\n isPhone,\n is_audience_data,\n ppp,\n avg_views,\n brand_final_price,\n influencer_final_price,\n keywords,\n bio_keyword,\n deliverables,\n avg_engagement,\n interest_selection,\n priority_list,\n } = this.state;\n\n let languageAdvanceMap = [];\n languageAdvance.map((each) => {\n languageAdvanceMap.push(each.label);\n });\n let influencerAgeMap = [];\n influencerAge.map((each) => {\n influencerAgeMap.push(each.label);\n });\n let influencerLocationsMap = [];\n influencerLocations.map((each) => {\n influencerLocationsMap.push(each.label);\n });\n let influencerCountriesMap = [];\n influencerCountries.map((each) => {\n influencerCountriesMap.push(each.label);\n });\n\n let influencerStateMap = [];\n influencerState.map((each) => {\n influencerStateMap.push(each.label);\n });\n\n let influencerCityMap = [];\n influencerState.map((each) => {\n influencerCityMap.push(each.label);\n });\n let influencerZoneMap = [];\n influencerZone.map((each) => {\n influencerZoneMap.push(each.label);\n });\n let audienceInterest = [];\n interest_selection.map((each) => {\n audienceInterest.push(each.label);\n });\n\n let priorityMap = [];\n priority_list.map((each) => {\n priorityMap.push(each.name.substr(0, 1));\n });\n let deliverablesMap = [];\n deliverables.map((each) => {\n deliverablesMap.push(each.label);\n });\n\n let creator = [];\n if (mega > 0) {\n creator.push('mega');\n }\n if (macro > 0) {\n creator.push('macro');\n }\n if (micro > 0) {\n creator.push('micro');\n }\n if (nano > 0) {\n creator.push('nano');\n }\n\n return (\n \n \n \n {\n // isEdit ?\n // (\n \n
\n
\n {this.state.category.slice(0, 3).join(',') || '-'}\n\n {this.state.category.length > 3 ? (\n \n {this.state.category.slice(3).map((key, i) => (\n \n {key} \n
\n ))}\n >\n }\n arrow\n placement=\"right\"\n >\n ...
\n \n ) : (\n ''\n )}\n \n
\n // )\n // : (\n // \n // \n // Category\n // \n // \n // {this.state.category.join(\",\") || \"-\"}\n // \n //
\n // )\n }\n {['Objective', 'Category'].indexOf(selectedObjective) > -1 ? null : (\n
\n )}\n {\n // isEdit ?\n // (\n \n \n \n {this.state.objective || '-'}\n \n
\n // )\n // : (\n // \n // \n // Objective\n // \n // \n // {this.state.objective || \"-\"}\n // \n //
\n // )\n }\n {['Objective', 'Budget'].indexOf(selectedObjective) > -1 ? null : (\n
\n )}\n {\n // isEdit ? (\n \n \n ₹{this.state.budget} \n
\n // )\n // : (\n // \n // \n // Budget\n // \n // \n // ₹{this.state.budget}\n // \n //
\n // )\n }\n {['Priority', 'Budget'].indexOf(selectedObjective) > -1 ? null : (\n
\n )}\n {\n // isEdit ? (\n \n
\n
{priorityMap.join(' - ')} \n
\n // )\n // : (\n // \n // \n // Priority\n // \n // \n // {priorityMap.join(\" - \")}\n // \n //
\n // )\n }\n {['Priority', 'PricePerCreator'].indexOf(selectedObjective) > -1 ? null : (\n
\n )}\n {\n // isEdit ? (\n \n \n \n ₹{this.state.pricePerCreator}\n \n
\n // )\n // : (\n // \n // \n // Price Per Creator\n // \n // \n // ₹{this.state.pricePerCreator}\n // \n //
\n // )\n }\n \n \n \n {\n // isEdit ? (\n {\n this.applyFilter();\n this.props.setReset(false);\n this.setState({ isFirstTime: false });\n setSelectedFilter('');\n }}\n disabled={this.props.isLoading}\n >\n {' '}\n {isFirstTime == true ? 'Create Plan' : 'Apply'}\n \n // ) : (\n // {\n // this.setState({ isEdit: true, isFirstTime: false });\n // }}\n // >\n // \n // Edit Plan\n // \n // )\n }\n \n \n {\n this.resetFilter();\n }}\n style={{ position: 'relative', left: '15px' }}\n disabled={this.props.isLoading}\n >\n Reset\n \n \n {\n // isEdit ? (\n \n {\n setSelectedFilter(selectedFilter == 'Channel' ? '' : 'Channel');\n }}\n >\n
Channel \n
\n {channels.join(' | ')}\n \n
\n {\n setSelectedFilter(selectedFilter == 'CreatorsType' ? '' : 'CreatorsType');\n }}\n >\n
\n Creators Type\n \n {macro > 0 || micro > 0 || nano > 0 || mega || 0 ? (\n
{creator.join(' | ')} \n ) : null}\n
\n {\n setSelectedFilter(selectedFilter == 'AudienceLocation' ? '' : 'AudienceLocation');\n }}\n >\n
\n Audience Location\n \n {locations.length > 0 ? (\n
\n {this.state.locations.slice(0, 3).join(',') || '-'}\n\n {this.state.locations.length > 3 ? (\n \n {this.state.locations.slice(3).map((key, i) => (\n \n {key} \n
\n ))}\n >\n }\n arrow\n placement=\"right\"\n >\n ...
\n \n ) : (\n ''\n )}\n \n ) : null}\n
\n {\n setSelectedFilter(\n selectedFilter == 'AudienceGenderSplit' ? '' : 'AudienceGenderSplit',\n );\n }}\n >\n
\n Audience Gender Split\n \n {genderGroupType.length > 0 ? (\n
\n {genderGroupType} - {genderGroupPercentage}%\n \n ) : null}\n
\n {\n setSelectedFilter(selectedFilter == 'AudienceAgeGroup' ? '' : 'AudienceAgeGroup');\n }}\n >\n
\n Audience Age Group\n \n {ageGroup.length > 0 ? (\n
{ageGroup.join(' | ')} \n ) : null}\n
\n \n {this.state.showdAvanceFilter == true ? (\n
\n ) : null}\n
{\n setShowModal(true);\n this.setState({ showdAvanceFilter: true });\n }}\n >\n
\n
\n
\n \n // ) : null\n }\n {/* {!isEdit ? (\n \n {channels.length > 0 ? (\n \n
Channel \n
\n {channels.join(\" | \")}\n \n
\n ) : null}\n {macro > 0 || micro > 0 || nano > 0 || mega || 0 ? (\n \n
Creators Type \n
\n {mega > 0 ? \"mega \" : \" \"}\n {macro > 0 ? \"macro \" : \" \"}\n {micro > 0 ? \"micro \" : \" \"}\n {nano > 0 ? \"nano \" : \" \"}\n \n
\n ) : null}\n {locations.length > 0 ? (\n \n
Audience Location \n
\n {locations.join(\" | \")}\n \n
\n ) : null}\n {genderGroupType.length > 0 ? (\n \n
Audience Gender Split \n
\n {genderGroupType} - {genderGroupPercentage}%\n \n
\n ) : null}\n {ageGroup.length > 0 ? (\n \n
Audience Age Group \n
\n {ageGroup.join(\" | \")}\n \n
\n ) : null}\n {\n this.setState({ openAdFilter: !this.state.openAdFilter });\n }}\n style={{ position: \"relative\" }}\n >\n \n \n \n ) : null}\n\n {!isEdit && this.state.openAdFilter ? (\n \n {startDate || endDate ? (\n \n
Date \n
\n {startDate ? moment(startDate).format(\"YYYY-MM-DD\") : \"\"} -{\" \"}\n {endDate ? moment(endDate).format(\"YYYY-MM-DD\") : \"\"}\n \n
\n ) : null}\n {rate > 0 ? (\n \n
Engagement Rate \n
{rate} \n
\n ) : null}\n {audienceCredibility > 0 ? (\n \n
Auedience Credibility \n
\n {audienceCredibility}\n \n
\n ) : null}\n {gender.length > 0 ? (\n \n
Influencer Gender \n
\n {gender}\n \n
\n ) : null}\n {audienceInterest.length > 0 ? (\n \n
Audience Interest \n
\n {audienceInterest.join(\" | \")}\n \n
\n ) : null}\n {avg_engagement > 0 ? (\n \n
Average Engaged Users \n
\n {avg_engagement}\n \n
\n ) : null}\n {ppp > 0 ? (\n \n
Paid Post Performance \n
{ppp} \n
\n ) : null}\n {languageAdvanceMap.length > 0 ? (\n \n
Language \n
\n {languageAdvanceMap.join(\" | \")}\n \n
\n ) : null}\n {influencerAgeMap.length > 0 ? (\n \n
Influencer Age Group \n
\n {influencerAgeMap.join(\" | \")}\n \n
\n ) : null}\n {influencerLocationsMap.length > 0 ? (\n \n
Influencer Location \n
\n {influencerLocationsMap.join(\" | \")}\n \n
\n ) : null}\n \n ) : null} */}\n\n {\n // isEdit ? (\n \n {selectedFilter == 'Channel' ? (\n \n ) : null}\n {selectedFilter == 'CreatorsType' ? (\n \n
\n \n
\n \n ) : null}\n {selectedFilter == 'AudienceLocation' ? (\n \n
\n \n \n ) : null}\n {selectedFilter == 'AudienceGenderSplit' ? (\n \n
\n \n \n ) : null}\n {selectedFilter == 'AudienceAgeGroup' ? (\n \n \n \n ) : null}\n \n // ) : null\n }\n \n );\n }\n}\n\nconst styles = {\n root: {\n background:\n 'linear-gradient(91.68deg, rgba(239, 26, 116, 0.057) 11.95%, rgba(254, 189, 28, 0.1) 68.66%)',\n boxShadow: '4px 4px 20px 2px rgba(172, 172, 172, 0.25)',\n borderRadius: '10px',\n margin: 10,\n marginLeft: 0,\n paddingTop: 30,\n justifyContent: 'center',\n alignItems: 'center',\n paddingBottom: 30,\n },\n objective: {\n background: '#FFFFFF',\n boxShadow:\n '-4px -5px 20px rgba(226, 226, 226, 0.25), 7px 6px 15px 3px rgba(207, 207, 207, 0.25)',\n borderRadius: '40px',\n alignItems: 'center',\n },\n objectiveDivider: {\n background: '#E9E9E9',\n height: '29px',\n width: '1px',\n },\n createPlan: {\n textTransform: 'none',\n width: 150,\n height: 40,\n fontWeight: 700,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n padding: 10,\n fontSize: 15,\n marginLeft: 20,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n },\n filters: {\n marginTop: 0,\n marginLeft: 70,\n alignItems: 'flex-start',\n },\n ObjectiveOption: {\n cursor: 'pointer',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n letterSpacing: '0.03em',\n },\n optionValue: {\n color: '#757575',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 11,\n },\n listValue: {\n color: '#757575',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 11,\n margin: 0,\n padding: 0,\n width: '10px',\n display: 'inline-block',\n },\n};\n\nconst mapStateToProps = (state) => {\n return {\n filters: state.discovery.filters,\n searchedSelectedInfluencerIds: state.planner.searchedSelectedInfluencerIds,\n };\n};\n\nconst actionCreators = {\n setPayload: updatePayload,\n};\n\nexport default connect(mapStateToProps, actionCreators)(withStyles(styles)(Filters));\n\n// export default withStyles(styles)(Filters)\n","export default \"data:image/png;base64,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\"","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { styled } from '@mui/material/styles';\nimport Tooltip, { tooltipClasses } from '@mui/material/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport IconButton from '@mui/material/IconButton';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\n\nfunction IconLabel({\n imageSrc,\n label,\n sortable = false,\n sort = false,\n sortOrder = '',\n tooltip = '',\n sortByThis,\n}) {\n const classes = useStyles();\n const [dimensions, setDimensions] = useState({});\n\n useEffect(() => {\n const img = new Image();\n img.onload = function () {\n if (this.width > this.height) setDimensions({ width: 15 });\n else setDimensions({ height: 15 });\n };\n img.src = imageSrc;\n }, []);\n\n const CustomWidthTooltip = styled(({ className, ...props }) => (\n \n ))({\n [`& .${tooltipClasses.tooltip}`]: {\n maxWidth: 150,\n },\n });\n\n return (\n sortable && sortByThis()}\n >\n
\n \n \n
\n \n {label}\n \n \n {tooltip ? (\n
\n \n \n \n \n ) : (\n ''\n )}\n {sortable && sort ? (\n
\n {sortOrder === 'asc' ? (\n \n ) : (\n \n )}\n \n ) : null}\n
\n );\n}\n\nIconLabel.propTypes = {\n imageSrc: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'start',\n alignItems: 'center',\n flexDirection: 'row',\n display: 'flex',\n },\n sortableLabel: {\n cursor: 'pointer',\n fontWeight: 700,\n },\n sortArrow: {\n fontSize: '15px !important',\n },\n label: {\n fontFamily: 'Nunito Sans',\n lineHeight: 1,\n fontSize: '0.7em',\n textAlign: 'left',\n },\n icon: {\n // width:73,\n // height:22,\n // height:22,\n // marginLeft:20\n },\n}));\n\nexport default IconLabel;\n","import React, { useEffect, useState, Component } from 'react';\nimport { Grid, Typography, Radio, RadioGroup, Chip, Checkbox } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport DownArrow from 'assets/planner/down-arrow.png';\nimport DownArrowActive from 'assets/planner/down-arrow-active.png';\n\nclass ListSelect extends Component {\n constructor(props) {\n super(props);\n this.selectOption = this.selectOption.bind(this);\n this.ref = React.createRef();\n this.handleClickOutside = this.handleClickOutside.bind(this);\n this.state = {\n all: false,\n recommended: true,\n normal: false,\n };\n }\n\n handleClickOutside(event) {\n if (this.ref.current && !this.ref.current.contains(event.target)) {\n this.props.setlistSelect(false);\n }\n }\n\n componentDidMount() {\n document.addEventListener('click', this.handleClickOutside, true);\n }\n\n componentWillUnmount() {\n document.removeEventListener('click', this.handleClickOutside, true);\n }\n\n selectOption(event) {\n console.log(event.target.value);\n let current_prediction = this.props.selectedPrediction;\n console.log(current_prediction);\n if (event.target.value === 'all') {\n if (event.target.checked) {\n console.log('checked');\n const influencers = this.props.selectedInfluencer;\n this.props.influencers.map((influencer) => {\n if (!influencers.includes(influencer.id)) {\n influencers.push(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] + influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] + 1,\n amount: current_prediction['mega']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + influencer.prediction.max_price,\n };\n }\n }\n });\n this.props.recommendation.map((influencer) => {\n if (!influencers.includes(influencer.id)) {\n influencers.push(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] + influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + influencer.prediction.max_price,\n };\n }\n }\n });\n this.props.setSelectedInfluencer(influencers);\n this.setState({ all: true });\n } else {\n console.log('unchecked');\n this.props.setSelectedInfluencer([]);\n current_prediction = {\n reach: 0,\n views: 0,\n engagement_rate: 0,\n enagaged_users: 0,\n followers: 0,\n max_price: 0,\n mega: {\n count: 0,\n amount: 0,\n },\n macro: {\n count: 0,\n amount: 0,\n },\n micro: {\n count: 0,\n amount: 0,\n },\n nano: {\n count: 0,\n amount: 0,\n },\n };\n this.setState({ all: false });\n }\n }\n if (event.target.value === 'recommended') {\n const influencers = this.props.selectedInfluencer;\n if (event.target.checked) {\n console.log('checked');\n\n this.props.recommendation.map((influencer) => {\n if (!influencers.includes(influencer.id)) {\n influencers.push(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] + influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] + 1,\n amount: current_prediction['mega']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + influencer.prediction.max_price,\n };\n }\n }\n });\n this.setState({ recommended: true });\n } else {\n console.log('unchecked');\n this.props.recommendation.map((influencer) => {\n if (influencers.includes(influencer.id)) {\n influencers.pop(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] - influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] - influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] - influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] - influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] - influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] - influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] - 1,\n amount: current_prediction['micro']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] - 1,\n amount: current_prediction['mega']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] - 1,\n amount: current_prediction['nano']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] - 1,\n amount: current_prediction['macro']['amount'] - influencer.prediction.max_price,\n };\n }\n }\n });\n this.setState({ recommended: false });\n }\n this.props.setSelectedInfluencer(influencers);\n }\n if (event.target.value === 'normal') {\n const influencers = this.props.selectedInfluencer;\n if (event.target.checked) {\n console.log('checked');\n this.props.influencers.map((influencer) => {\n if (!influencers.includes(influencer.id)) {\n influencers.push(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] + influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] + 1,\n amount: current_prediction['mega']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + influencer.prediction.max_price,\n };\n }\n }\n });\n this.setState({ normal: true });\n } else {\n console.log('unchecked');\n const influencers = this.props.selectedInfluencer;\n this.props.influencers.map((influencer) => {\n if (influencers.includes(influencer.id)) {\n influencers.pop(influencer.id);\n current_prediction['reach'] =\n current_prediction['reach'] - influencer.prediction.views * 1.37;\n current_prediction['views'] = current_prediction['views'] - influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] - influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] - influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] - influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] - influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] - 1,\n amount: current_prediction['micro']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] - 1,\n amount: current_prediction['nano']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] - 1,\n amount: current_prediction['mega']['amount'] - influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] - 1,\n amount: current_prediction['macro']['amount'] - influencer.prediction.max_price,\n };\n }\n }\n });\n this.setState({ normal: false });\n }\n this.props.setSelectedInfluencer(influencers);\n }\n this.props.setSelectedPrediction(current_prediction);\n }\n\n render() {\n let {\n classes,\n count,\n listSelect,\n setlistSelect,\n recommendation_count,\n influencers,\n selectedInfluencer,\n setSelectedInfluencer,\n recommendation,\n setRecommendation,\n } = this.props;\n\n return (\n \n
\n
{\n setlistSelect();\n }}\n className={classes.downArrow}\n src={listSelect ? DownArrowActive : DownArrow}\n width={12}\n height={8}\n />\n {listSelect ? (\n
\n
\n
\n {this.state.all ? (\n \n ) : (\n \n )}\n All \n \n
\n
\n {this.state.recommended ? (\n \n ) : (\n \n )}\n Recommended \n \n
\n
\n {this.state.normal ? (\n \n ) : (\n \n )}\n Other Influencers \n \n
\n
\n Selected \n \n
\n
\n
\n ) : null}\n
\n );\n }\n}\n\nconst styles = {\n modal: {\n background: '#ffffff',\n position: 'absolute',\n width: 300,\n top: 50,\n padding: 20,\n left: 55,\n boxShadow: '5px 4px 20px rgba(104, 104, 104, 0.25)',\n borderRadius: '30px',\n zIndex: 9999,\n },\n heading: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n },\n option: {\n // background: '#F1F1F1',\n borderRadius: '10px',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n margin: 5,\n borderRadius: 10,\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n optionLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 16,\n },\n font14: {\n fontSize: 14,\n },\n};\n\nexport default withStyles(styles)(ListSelect);\n","import { Component } from 'react';\nimport {\n Grid,\n Typography,\n TextField,\n Divider,\n Button,\n FormControlLabel,\n IconButton,\n} from '@material-ui/core';\nimport ClearIcon from '@mui/icons-material/Clear';\nimport MoreVertIcon from '@mui/icons-material/MoreVert';\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\nimport { withStyles } from '@material-ui/core/styles';\nimport CheckBox from '@mui/material/Checkbox';\nimport SortIcon from '@mui/icons-material/Sort';\n\nclass customColumns extends Component {\n constructor(props) {\n super(props);\n this.state = {\n displayColumns: [],\n default: true,\n checkLimit: this.props.columns.length,\n removedItem: [],\n count: 8,\n };\n }\n\n handleOnChange = (event) => {\n if (event.target.checked === true) {\n this.setState({\n displayColumns: this.state.displayColumns.concat(event.target.value),\n default: false,\n checkLimit: this.state.checkLimit + 1,\n });\n }\n if (event.target.checked === false) {\n const index = this.state.displayColumns.indexOf(event.target.value);\n const index2 = this.props.columns.indexOf(event.target.value);\n this.setState({\n removedItem: this.state.removedItem.concat(event.target.value),\n checkLimit: this.state.checkLimit - 1,\n });\n if (index > -1) {\n this.setState({\n removedItem: this.state.removedItem.concat(event.target.value),\n });\n this.props.columns.splice(index2, 1);\n this.state.displayColumns.splice(index, 1);\n this.setState({\n default: false,\n });\n }\n }\n };\n\n applyClick = () => {\n this.props.hideColumnSelectModal();\n this.props.onSelectColumns(\n this.state.displayColumns,\n this.state.default,\n this.state.removedItem,\n this.state.checkLimit,\n );\n };\n\n defaultClick = () => {\n this.setState({ default: true });\n this.props.hideColumnSelectModal();\n this.props.onSelectColumns(\n this.state.displayColumns,\n this.state.default,\n this.state.removedItem,\n this.state.checkLimit,\n );\n };\n\n // disableClick = () => {\n // if(this.state.checkLimit > 7){\n // if(this.state.displayColumns.length === 0){\n // if\n // }\n // }\n // }\n\n render() {\n let { classes, isStaff } = this.props;\n const { hideColumnSelectModal } = this.props;\n\n return (\n \n \n \n \n \n \n CUSTOM COLUMNS \n \n \n \n \n \n \n \n \n // hideColumnSelectModal()\n this.applyClick()\n }\n >\n Apply\n \n \n \n hideColumnSelectModal()}>\n \n \n \n \n \n \n this.defaultClick()}\n >\n Default\n \n \n \n 7 ? 'red' : '#757575' }}\n >\n You can select upto 8 metrics\n \n \n \n \n {/* \n \n \n \n \n \n Channel \n \n \n 7 && !this.state.displayColumns.includes(\"Channel\") && !this.props.columns.includes(\"Channel\")}\n />}\n > \n \n \n */}\n \n \n \n \n \n \n Average Views \n \n \n 7 &&\n !this.state.displayColumns.includes('Average Views') &&\n !this.props.columns.includes('Average Views')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Language \n \n \n 7 &&\n !this.state.displayColumns.includes('Language') &&\n !this.props.columns.includes('Language')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Audience Location \n \n \n 7 &&\n !this.state.displayColumns.includes('Audience Location') &&\n !this.props.columns.includes('Audience Location')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n \n \n \n \n Speed Score \n \n \n 7 &&\n !this.state.displayColumns.includes('Speed Score') &&\n !this.props.columns.includes('Speed Score')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Audience Gender \n \n \n 7 &&\n !this.state.displayColumns.includes('Audience Gender') &&\n !this.props.columns.includes('Audience Gender')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Audience Age \n \n \n 7 &&\n !this.state.displayColumns.includes('Audience Age') &&\n !this.props.columns.includes('Audience Age')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n \n \n \n \n Audience Interest \n \n \n 7 &&\n !this.state.displayColumns.includes('Interest') &&\n !this.props.columns.includes('Interest')\n }\n />\n }\n > \n \n \n \n {/*\n \n \n \n \n \n \n Price Score \n \n \n }\n > \n \n \n */}\n \n \n \n \n \n \n Fair Price \n \n \n 7 &&\n !this.state.displayColumns.includes('Fair Price') &&\n !this.props.columns.includes('Fair Price')\n }\n />\n }\n > \n \n \n \n {isStaff ? (\n \n \n \n \n \n \n Actual Price \n \n\n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n \n \n \n Impact Score \n \n \n 7 &&\n !this.state.displayColumns.includes('Impact Score') &&\n !this.props.columns.includes('Impact Score')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Influencer Location \n \n\n \n 7 &&\n !this.state.displayColumns.includes('Influencer Location') &&\n !this.props.columns.includes('Influencer Location')\n }\n />\n }\n > \n \n \n \n {isStaff ? (\n \n \n \n \n \n \n Email \n \n\n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n \n \n \n Followers \n \n \n 7 &&\n !this.state.displayColumns.includes('Followers') &&\n !this.props.columns.includes('Followers')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Influencer Gender \n \n \n 7 &&\n !this.state.displayColumns.includes('Influencer Gender') &&\n !this.props.columns.includes('Influencer Gender')\n }\n />\n }\n > \n \n \n \n {isStaff ? (\n \n \n \n \n \n \n Contact Number \n \n\n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n \n \n \n Engagement Rate \n \n \n 7 &&\n !this.state.displayColumns.includes('Engagement Rate') &&\n !this.props.columns.includes('Engagement Rate')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Influencer Age \n \n \n 7 &&\n !this.state.displayColumns.includes('Influencer Age') &&\n !this.props.columns.includes('Influencer Age')\n }\n />\n }\n > \n \n \n \n \n \n \n \n \n \n Country \n \n \n 7 &&\n !this.state.displayColumns.includes('Country') &&\n !this.props.columns.includes('Country')\n }\n />\n }\n > \n \n \n \n \n \n \n \n {isStaff ? (\n \n \n \n \n \n \n Brand Final Price \n \n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n {isStaff ? (\n \n \n \n \n \n \n Influencer Final Price \n \n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n {isStaff ? (\n \n \n \n \n \n \n Deliverables \n \n\n \n \n }\n >\n \n \n \n ) : (\n ''\n )}\n \n \n \n );\n }\n}\n\nconst styles = {\n heading: {\n width: 500,\n color: '#000000',\n fontWeight: 400,\n fontFamily: 'Nunito Sans',\n fontSize: 16,\n lineHeight: 1,\n padding: 10,\n borderBottom: '6px solid #FEBD1C',\n textAlign: 'start',\n },\n icon: {\n marginTop: 3,\n color: '#676767',\n },\n applyButton: {\n width: 100,\n height: 35,\n background: '#FEBD1C',\n color: '#ffffff',\n fontWeight: 700,\n textTransform: 'none',\n borderRadius: 10,\n alignItems: 'center',\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'center',\n lineHeight: '23px',\n fontSize: 14,\n },\n closeButton: {\n cursor: 'pointer',\n color: '#757575',\n display: 'flex',\n marginTop: 4,\n },\n defaultButton: {\n width: 100,\n height: 30,\n boxShadow:\n '-5px 5px 10px rgba(230, 230, 230, 0.2), 5px -5px 10px rgba(230, 230, 230, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(230, 230, 230, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(230, 230, 230, 0.5)',\n borderRadius: 20,\n border: '2px solid #FEBD1C',\n marginTop: 30,\n textTransform: 'none',\n background: '#ffffff',\n display: 'flex',\n alignItems: 'center',\n textAlign: 'flex-start',\n justifyContent: 'center',\n letterSpacing: '0.03em',\n lineHeight: 1,\n fontSize: 12,\n },\n selectText: {\n color: '#757575',\n fontSize: 14,\n fontWeight: 400,\n fontFamily: 'Nunito Sans',\n display: 'flex',\n alignItems: 'center',\n textAlign: 'flex-start',\n marginTop: 10,\n marginBottom: 10,\n },\n metrics: {\n width: 260,\n height: 40,\n marginTop: 15,\n borderRadius: 5,\n background: '#E7E7E7',\n alignItems: 'center',\n },\n dragIcon: {\n marginTop: 5,\n color: '#888888',\n },\n text: {\n color: '#000000',\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n display: 'flex',\n alignItems: 'center',\n textAlign: 'flex-start',\n },\n checked: {\n borderRadius: 1,\n border: '2px solid rgba(255,255,255)',\n\n '&$checked': {\n color: '#BBBBBB',\n '&.Mui-checked': {\n color: '#FEBD1C',\n },\n },\n },\n};\n\nexport default withStyles(styles)(customColumns);\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADMAAAAmCAYAAABpuqMCAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5gUWEAg33RlZewAAAAFvck5UAc+id5oAAA5zSURBVFjDtZl7jFzVfce/v3POfczszOyLXXs3tsEYkjCDgcSIR6sES6GFVkmroi5qAxJKG5CKaVH6kio5yuw/LKiURKhAcKVKJaqc2JSqVZOUikQGN1BIuxa1Z5NgG2xnM7v2etY7O3Pf55xf/5gHi9cmKThHGs2997x+n/v7nd/9nnsJ71Oq1aool8sEQAZBIMIwVEopKaWUQgjp+74IggADAwMIggBSSiultEop6zhOBsAAMGNjY/bll1+21WqVmRlExPglFHX+BWYmIgIz0549eyQA1Wq1VPOn28dWz15+nU0Gf9Na51fY0maASt1uqyT1nBR6Tvrha1fe9N1/X1pa0p7npb7v60OHDmUAzL59+wwA253jkgPReRAMgPbt2ycWFxfV0NCQary9fWzlZ9fs0tp9YI3x7z+o4Hmhgn/KX3Zi3/CWV98pFAqx4zhZoVDI3njjDQPAVqtVe6lhRN8AIgCgarUq5+bmnJGREe/oK1MPnz15/Ztae3/+i4IAAFvaZNLCw+2F8r4zR6bubbfbRa21v7Cw4KITDWLtjfyleGb//v0iCALHcRz3Jwd+96+t8R64FJNIL/yHrTfvq0opQyFEfOzYsbRcLmdTU1P2UoabXAtSKBRUq9Vyjx38/T1svfsu1SRsnBtWfvaxy4c2Hf5+GIbseR63220+deoU79+//1JN04EhIjE2NqYajYb39muffxyXEKQPZJ1rWosfHb7sip/8IJ/Ps+/7RinFlUqFDxw4cEm8o5iZpqenxblz59T8oc/fB+P3Q0s44WE5cPRfpIxDIqKkteVWm2z8LMiE7vChZyGjNjOY7EAuO3f9LmaZV/nF78j88ddhVUpQWdLc/kds3G0AkCX5+07992/XP/KJF57N5XIZAItOduNLEW5qenqaAIiFuV+7yiYDf7m2UjjnasVN3/uhMcZmWcaO8/EzycJdnyWygXvZS69LKS0zG2MMsnPX3Qcg74y8+m2ncKzOzAkRpTr6yA90tHFbb8w0Gnooamx5wZs8nS4uLppyuWymp6ctgA8NI2677TYBwEX0kXsB2ry2kgSEtZattZm1NgMo7cQMmJkTa22YpmmYZVnUs8Ua1mmaplmWZVpray3em4KZio0TN/1Bq9XKDQ4OOvPz8xJrsuqHgjl8+LAslUquzpzfW1fLYGOMzrIsYeaIM5H0OwoRGWNCKWXgOE7IYO7AiFgpFTuOE0spswuFT5aU7k1XLh/TWnvbtm1TExMTVK1WPzSQSJJErRz9wuf4PK90fWMdx4mVUoG1NoDw4243a60NhRBtZg601iGRtADgSDc1xoTMHKVpGllt1z8cmYrRuY9XmNk5fvy4s3nz5kvjmXa7LaFzv3qhSmaw67qptTZyXTeElnHHFrDrujERxUQUSimj3u23WsS5XC7SWodSyoSEYy40dty67DNaazeXy6l2u93TgB+qqMnJSffUvNh+oUoipQEkvu+naZpq4eSzd0E5ybIsVkoZpZQhJmYAQvkZM2dKqURr7Qgh7YV0i9W5GwE4Qgh58uRJEQTBh4c5e/ashFXlizXQWmsi6vwYGgCIiYlIK6WM67qZMYa4n41EXzF7nocVvnCWslZORlHkFgoFOTIyIm688Uago0g+cFYTpVJJXlR3MVhKSdZa4/s+AKdf5boufN+3URTZJEnsuyYImySJ1VozEVm+CAxYFIQQ0lortNbirbfeWucZZia8K7moe613vK5OpWkq34/WdV1rjCFjzJpo4Z7XKJfLCWst4u49FZbI8zyhtWalFBFdXFAys+gC9c4BoK/eu+J3rcfWXltbBwCkmFkA3AKoiPXNyBhzAWMIWuv+9TiO1wVHFEUQQvDFPENk2wCE1pqzLOPl5WXqkqw18Hwv9Uv3YY+vfOUr/fE7mzPSdbDzsfMHsMb2G0ZRBK0zXKgMDAxQ3OvTkQScy+Xez+EglRwHYI0xrLVWawzsz8nMmJ6epmq1CiJCtVpFuVymubm5fpseFNDRZoJU9EPO1sMQiX6nXC6H1rn+NCCiftgZY7gfCBLwPA+tVouklBcNM6nCtwEgSRIrhLATExP8wAMPcLVaRbVapa6hqNVqNDU1BQCo1Wool8sAIMrlMgNAT3VXKhVWjuMYkTv5ism237sepruwlKI0TaGUg6wbZlJK0lojiiJIKfvBZK2hJEng+z6y7MKeBADyT/+v1toSEVzX1QsLC9zzQtfw/k2oVCrUvcZzc3O0FuLBBx+kl19+2dZqNRLWWuMWjvwIsG38nMJk+k/qJElENwF01k93agUFrTXFcQwp5QW9QqTPFDe9+J9aa+37fqaUes+jqFarUaVSoUqlQsPDw6Jer1O9Xn/P8e233y6Gh4fF3r17CYCoVCoktNYmsIeXyV361vpZQVprmaapY61VwmadzRwxKaVUPp+XYRgqKaVD3UWrKROO4yhmVlmWOQCvkyrCX/xemqapUioxxpi1ED0QAKjX67Rjxw4AwOTkJE1OTpLneeKpp576k/vvv/+lZ5555o8nJyepByjCMNSe56UY/vY3ifi93mFLUkrleZ6Tz+d94ZLTYQSUUkoI4UspPcdxXKZOtpHSulJKt1QqeczsAvY9MCSSpdzoof+QUiZRFCXGmGxhYcFOTEz0vVGv12liYoImJyfppZdeIs/zxMjICDUaDXriiSd2K734OA7f/2mR1v/my1/+8u4dO3ZgcnKS5B133OEZY1yhVoH4SrAevPldFqdgstKpZOXqiWDp8i3JypW/wzZ3LQDKgskV3do8aIJrtiTnbrjVJsOfBQBOh4UOx3R87sotabNSMfHkfWBR7CUOd+jY38uhg68nSdK01jYHBgbSXC6n33zzTW61WlQsFkWapsIYg0ajQYVCgZRSYmVlhR5//PHdCuFu/q+dQHsOWHoRYvw3brt+x6eaBw8efIMee+yxIoBiq9Ua9H1/MD71wF9wNnbXz1s////CEP7pfytu/cYzRNSQUjastSvtdjus1+tZL5TWRmOz2SQACIKAnn766cdk9OOHoAaBhX3gd77aaTV2B3Dt373y8MMP/7pYXFzUURSlSqnEWhu5m77+NajlFy81ivDOfb+49RvPdmwLgtXV1VBKqU+cOGHPAxFrQQYHB+npp59+VkY/fohn7wbPTgETd4O2fgnwN4G2fgnGmIMAIO+8807RfQEohBAyyzLyRw+9ZoNKiU2+/IEsPx/EP/OvQ1c/91SSJKuO4wSFQqF95syZkJlT0ymcpqnI5/Oi2WzS8vKyyLKMxsbG5O7du78uzrxwL2q7AL3a+S29CProNGjzF5GKDY888sgjj2RZRgqAXVhY0AMDA/Hg4KCSUsokSYSc+Nuv0tl7jtrwii8wq40fDMMGTvHUP/qT33ohSWxMRO0oilrLy8ttKWXSbDbN1VdfDQBidnaWlFIUBAGVSiW66667hm655Za9WHz+U/jRn15w9Fi7M489NjPTO5c7d+5Eq9ViZiZmJtd10RGIRGLgyFHhtl5lU4pgchsBUfhFIVR+4fn8ln+eEYVX/0drHWqtAyJqtVqtII7j2Fqbzc/Pm2KxiPn5eRoYGBBrQW699dbvYPH5m9aB+JtAn9yPGJc9umvXrpkkScDMaLfbHRk9NTUlNm7cqAB4xWIxl8vl8mma5qWUnjHGcRzHlVK66dnPfdrG4zfYrHAlTG4rIAYAAGRCQdkZOM0jcuDo617p6FGrFlYApEQUaq1jIgoHBgbCM2fOhL7vJ7VaTVcqFdRqNVQqFdFsNklKKboe+S5OfG073nnioiCPPvroDABEUcTWWlsoFLi3R6C7775bVCoVJ4oiT0rpE5FPRHnXdX1rraOU8rXWiogcpZSy1pIQgrXWQsrOLoI7Gl4bY1IAqRAiybIsjKIodF03LBaL6ezsbLxx40Y7OjrKANBoNGh0dJQAiHvuueeKbdu2ffP9QFbT0q6ZmZm9cRzz4OCgjaKI2+02j4+Pdx5oRMSVSoVrtVoWhmHsOE5krQ19329HURQIISJrbcDMITMHxpi2MaadZVnUPQ+11oExZpWZW8aYVpqmq0S0aq1dBRA4jhPNzs7GAMzo6CjX6/W+iG02m1Sv13HVVVd954IghQrophffAxKGYb9/Pp/v79jWFqpWq7LRaEhjjDM+Pu6maeoRkWuMcYjIJSLluq4SQhAA0ROTUkojhDDWWqO1zpRSiVIqC4IgzrIsLhQKPdVpJyYmCACOHDkilFJicHCQjh8/Ts8991ybv795HQh/4pur7Uj81czMzF4A8H2foyji3n8vzNbppmq1qhcXF/X4+HgKIHYcJ7DWtoUQLWNM706vpmm6aq1tMvOq1roJYCUMwyYzryilmq7rtk6fPt2K4zjcsmWLrtVqBp3XsVhYWGAAGB0d5cHBQQaA6667bn0eKVSAT36reXL+3OdmZmb2NpvNPkhvvfS80mw2+fwvZ709gq1UKgzAEpEeGxvLjDEiCAKn2WyKLMuE53my3W6z67qUZRl7nme77wRMLpczaZra0dFRC0AfPHiQgY6E72mvRqMhAKDVauGKK67A6dOnOxZs/iKgmyB/E3jzHzZP/HT5t/bs2XPY932O47hvaBcK7XabC4UCA+CL7v8PHDjABw4c4J07d/Ls7KwNw9CmaWqEEKZUKukoirINGzZkq6ur6YYNG7Isy7JSqZQtLS1lKysrulgsGgC2XC5ztVq1c3NzWFpaovHxcSoWi8jn8xRFEaVpSkNDQ5SmKe3cuRM0uvOwGb79qC3dfPjU/Ok/e/LJJw8rpUgpBWbmpaUlDA8Pc88raZrCdV0A4J/7rqr3jRMApqamRNdj/fCcmJighYUFLpfLvH//flQqFe59iO0ml/72tyfv6/U6XXvtteLo0aPoZbJ2u02FQoHCMKRcLkfLy8uQUgoAGBoaQi+0AGBkZMQ2Go3ewrcA7MjICP8fyjZI51L+JfcAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjItMDUtMjJUMTY6MDg6NDYrMDA6MDCGfdLzAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIyLTA1LTIyVDE2OjA4OjQ2KzAwOjAw9yBqTwAAAABJRU5ErkJggg==\"","import { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { Typography, Grid, Chip } from '@material-ui/core';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\n\nimport HeaderLabel from './components/HeaderLabel';\nimport ListSelect from './components/ListSelect';\nimport SortIcon from '@mui/icons-material/Sort';\nimport CustomColumns from './CustomColumns';\n\nimport ChannelIcon from 'assets/discovery/channel-icon.png';\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport AvgViewIcon from 'assets/discovery/Avg-View-icon.png';\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport EngRateIcon from 'assets/discovery/Eng-Rate-icon.png';\nimport PPPIcon from 'assets/discovery/PPP-icon.png';\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport HeadingIcon from 'assets/discovery/Heading-Columns-icon.png';\nimport SpeedIcon from 'assets/discovery/SpeedIcon.png';\nimport ScorePriceIcon from 'assets/discovery/PriceIcon.png';\nimport ImpactIcon from 'assets/discovery/ImpactIcon.png';\nimport Checkbox from '@mui/material/Checkbox';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport LanguageIcon from 'assets/discovery/Language-icon.png';\nimport GenderSplitIcon from 'assets/discovery/gender-split-icon.png';\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport { getPlannerInfluencers, getPlannerDownload } from 'api_handlers/discovery';\n\nclass ListHeader extends Component {\n constructor(props) {\n super(props);\n this.sortColumn = this.sortColumn.bind(this);\n this.allowedColumns = this.allowedColumns.bind(this);\n this.state = {\n showColumnSelectModal: false,\n columns: [],\n default: true,\n removedItem: [],\n checkLimit: 0,\n sortColumns: '',\n sortOrders: 'asc',\n micro: 0,\n macro: 0,\n mega: 0,\n nano: 0,\n };\n }\n\n setSort = () => {\n const { sortColumns, sortOrders, micro, macro, mega, nano } = this.state;\n\n const payload = {\n ...this.props.payload,\n 'advance-filters': {\n ...this.props.payload['advance-filters'],\n sortBy: sortColumns,\n sortOrder: sortOrders,\n },\n 'creator-level-requirements': {\n ...this.props.payload['creator-level-requirements'],\n 'creator-type-remain-budget': {\n micro: micro,\n macro: macro,\n mega: mega,\n nano: nano,\n },\n },\n };\n\n delete payload['budget_left'];\n delete payload['exclude_ids'];\n\n this.props.getPlannerInfluencersData(payload, 1);\n };\n\n async sortColumn(column) {\n this.setState(\n {\n sortColumns: column,\n sortOrders:\n this.state.sortOrders === 'asc' && this.props.sortBy === column ? 'desc' : 'asc',\n },\n this.setSort,\n );\n this.props.setSortBy(column);\n this.props.setSortOrder(\n this.props.sortOrder === 'asc' && this.props.sortBy === column ? 'desc' : 'asc',\n );\n }\n\n setCreatorTypeStateIfKeyExists = (type) => {\n this.setState({\n [type]: this.props.payload['creator-level-requirements']['creator-type'][type],\n });\n };\n\n componentDidUpdate(prevProps) {\n ['macro', 'micro', 'mega', 'nano'].forEach((type) => {\n if (type in this.props.payload['creator-level-requirements']['creator-type']) {\n const prevTypeBudget =\n prevProps.payload['creator-level-requirements']['creator-type'][type];\n const typeBudget = this.props.payload['creator-level-requirements']['creator-type'][type];\n if (prevTypeBudget !== typeBudget) {\n this.setCreatorTypeStateIfKeyExists(type);\n }\n }\n });\n }\n\n setShowColumnSelectModal(value) {\n this.setState({ showColumnSelectModal: value });\n }\n\n allowedColumns(column, isDefault, removedItem, checkLimit) {\n if (isDefault === false) {\n if (this.state.columns.length === 0) {\n this.setState({\n columns: Array.from(new Set(this.state.columns.concat(column))),\n default: false,\n checkLimit: checkLimit,\n });\n } else {\n this.state.columns = this.state.columns.filter((c) => !removedItem.includes(c));\n this.setState({\n columns: Array.from(new Set(this.state.columns.concat(column))),\n default: false,\n removedItem: this.state.removedItem.concat(removedItem),\n checkLimit: checkLimit,\n });\n }\n } else {\n this.setState({\n default: true,\n columns: [\n 'Speed Score',\n 'Country',\n 'Average Views',\n 'Fair Price',\n 'Impact Score',\n 'Followers',\n 'Engagement Rate',\n 'Audience Gender',\n ],\n checkLimit: 7,\n });\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.columns !== this.state.columns) {\n this.props.onSelectColumns(\n this.state.columns,\n this.state.default,\n this.state.removedItem,\n this.state.checkLimit,\n );\n }\n }\n\n // this.props.onSelectColumns(this.state.columns, this.state.default)\n\n render() {\n let {\n classes,\n count,\n sortBy,\n setSortBy,\n sortOrder,\n setSortOrder,\n getPlannerInfluencersData,\n listSelect,\n setlistSelect,\n influencers,\n selectedInfluencer,\n setSelectedInfluencer,\n recommendation_count,\n recommendation,\n setRecommendation,\n isPlanActive,\n } = this.props;\n\n return (\n \n \n {/* */}\n {isPlanActive ? (\n \n ) : null}\n \n \n \n \n INFLUENCERS \n \n \n \n \n \n \n \n \n {/* */}\n {/* */}\n {/* */}\n {this.state.columns.includes('Speed Score') || this.state.default ? (\n \n this.sortColumn(\"speed\")}\n />\n \n ) : (\n ''\n )}\n {/* {this.state.columns.includes('Price Score') || this.state.default ?\n \n this.sortColumn('price')}\n />\n \n : (\"\")} */}\n {this.state.columns.includes('Impact Score') || this.state.default ? (\n \n this.sortColumn(\"impact\")}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Followers') || this.state.default ? (\n \n this.sortColumn('followers')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Engagement Rate') || this.state.default ? (\n \n this.sortColumn('eng-rate')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Average Views') || this.state.default ? (\n \n this.sortColumn('views')}\n tooltip=\"Instagram - Avg_reel_plays. Youtube - Avg_views\"\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Audience Gender') || this.state.default ? (\n \n this.sortColumn('audience-gender')}\n />\n \n ) : (\n ''\n )}\n {/* */}\n {/* this.sortColumn('ppp')} */}\n {/* /> */}\n {/* */}\n {this.state.columns.includes('Fair Price') || this.state.default ? (\n \n this.sortColumn('fair-price')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Channel') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Language') ? (\n \n this.sortColumn('language')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Audience Age') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Influencer Location') ? (\n \n this.sortColumn('inf_location')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Interest') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Audience Location') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Influencer Gender') ? (\n \n this.sortColumn('inf_gender')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Influencer Age') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Country') || this.state.default ? (\n \n \n \n ) : (\n ''\n )}\n {this.state.columns.includes('Contact Number') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Email') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Actual Price') ? (\n \n this.sortColumn('views')}\n />\n \n ) : (\n ''\n )}\n {this.state.columns.includes('Brand Final Price') ? (\n \n \n \n ) : (\n ''\n )}\n {this.state.columns.includes('Influencer Final Price') ? (\n \n \n \n ) : (\n ''\n )}\n {this.state.columns.includes('Deliverables') ? (\n \n \n \n ) : (\n ''\n )}\n {/* */}\n {this.state.showColumnSelectModal ? (\n this.setShowColumnSelectModal(false)}\n isStaff={this.props.isStaff}\n />\n ) : null}\n\n {\n // setShowPopup(true);\n this.setState({ showColumnSelectModal: true });\n }}\n >\n \n
\n\n {/* */}\n \n \n {/* */}\n {/* */}\n {/* */}\n \n );\n }\n}\n\nconst styles = {\n root: {\n flexGrow: 1,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 10,\n background: '#FFFFFF',\n height: 50,\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n matrixBox: {\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n font12: {\n fontSize: 12,\n },\n font16: {\n fontSize: 14,\n },\n};\n\n// const mapStateToProps = (state) => {\n// return {\n// filters: state.discovery.filters\n// }\n// }\n// const actionCreators = {\n// setFilters: updateFilter,\n// getFilteredInfluencer,\n// resetFilter,\n// };\n// export default connect(mapStateToProps, actionCreators) (\n// ListHeader\n// );\n\nexport default withStyles(styles)(ListHeader);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABGCAYAAABbnhMrAAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAR2SURBVHgB5ZyNddtGDIA/ZwJ3AqMTxBv0Nqg7QdkJ4g3ETBB3AmYDj6B0AicTkJ3A3iDliVIjJxSBI3EUqXzv4enZPAE8ELh/6orzct1KaEVaebv/lP01+a7sSyvN0eeXVj7v5YWfhIPDPrRSt/LVSZ5aqfa6L5JAV8Fn/Jx2Sp65EGfGaNswj9NOSd1KwcpYguNW68g7fNs279QuWCjSypZlOi5KxY+9+mJ4x7LS9Vi2TOtMhIxRG9u6OByZWsmaLkLu6ZqAW/qjRfbXYpmylUdONxdT0/VQt5pMkSt0Y68pkXGPz80JnbOizui4ks4BYznOqHsyIIzrKA6VE5ZJ4HVQ1GRASHeeR1TkROjvAAucEdKd98ByHTc0Xq1wRkhzXiwbWC4Fw/URnEnpMJYcdQF9vPqAMylDlSy9lgPxgVbYMkdwpMDuvILlkTovL3BEEgwHlkcgvd125ZEzPDUHhHHz8oAjhdFoyXKYMrWscKY2GHXvrSYwdUFDDDbiwzGNLt4ZDNYsY6gSmDYnt2aRJJQ1RZ9wXgSf9UdrIBwe0rNWvjAYrTgf3tsFhcFmQULE1uhPTDgPBb7bBbXR7vc2n04VDAajJfMTyLNdIAbbmxPfDX2FK5YVfdbp1xipDPYl9ftau2Ix6kHubdGoVwz3USk6XnUmdwbDQn4C+bdFS2xoesJx4UopvCUvwjzbojV2tPt5NZHQBqMF+ZhzW7TAzj3Gh3FtMHxLHjYw2hmpsiUNMejctYMBo6edsUwZPUVIp1Z03r1Bj64v+CPMuxjxke5QZir/KNfF4sDP+LNhPppW3jMOre5vowNvJipJRZh3EfZvxkUfhu/tIlBbjWjw5Y75aJjWVDTK9Z0DRSn0jC+/Mx9jU/fAi6WQ1nt5M9eYr8KHQTtX6E66wpccD6WPX/Fpfgbv9w2XyZSOI5m5U7iG5HRMkahf8GPQXozARlFwgy8NeXnvaEOU6y+WFP4FX7TR/RQaulmHF+oQzxKBgi85p3B/4Iso13cR+O9EJanEsdUn/PlInlnTELsIVOd7+PMXvm9YRl1TB819/KZc3wWftpxfkwdtwTJFcp1LrBW7IRayLKjekIcS+DpRSvIgBtv/dzKap3OePI26x0zvcr/7VpCQmQ9K4S15EbpOwOq8Lfl3CbfKPVTHhQMJ4ZoRoYvIePPHUVnv/1fOeB+aP14ty12jp1HJz0OMruSA0o70qke7LoRYxxjx5vQ9EDhfj7ckLLuF4dSXtTS+9CgUbEf8TlKie/8Dl0tMTa3+xZACS2cyGMIrRtDrHaNPzcDSS9GKsHQc5j7AquySUtnyfkmdotByXjBKzineXGyw1bUgka1R8Z+sl3jvljo+MgLBPslfoxOtWWY9EtyLdc1ubeNDwb47WDARbaVmje1hga1OLvs3MbIs76PNed5vKiV6fZ4siizbmnG/Ie52NUo57w2dnDSG6947fIPtRs1yf1Cnj6Gxbta6SI/h+Pct60Por4sk6Bh98irsDTWs/0dgA9/q8olE/gO3KBAePTN8qAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAABBCAYAAADPA7T6AAAACXBIWXMAACxLAAAsSwGlPZapAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAH1SURBVHgB7ZjdccIwEIR3qMAlqAR3EHUQOggdhA5CB6QD6CBJBU4qcKjASQWUQKRgDWAs3UrnPGSGb+YezIhb7kcnGUCPcbZ21jk7ONs7a5wtMCEPveNDxNaYAJMQmFSsIYW82RnKMP7LGetVQjnUpULZlAp9Io/c9RfkNIOBghrpPRTsGRMwF8S2mBDTO2xxOYIsbty4wVA5e8Jx3/j90/bPk2GcbRCfChZKQgTSjNtAgcXppiNZgwJ8FC+kQLGQNJ3p1M0SUaz7SCrk880s8gcaW4uYzSWRR6WAeHTHCt7g2G3e2Fq1MZGxVHW43nQtKbSJCQ1FVhhvAFYoWp8lTmkyiMOmLtmlUpfUpEgTcxD20SvSGHDsIAhJ3JPrpB8swjTCHkoMuPoko2FSV4NDLcTWR/Vq4ukgp62TnEgR+bQZyLxLCxghhjcoYY9wAyXMfGsZR6nU+bQxx/gHsSYpZMGhHjtsfUouLxcw9WlYZ7HUsfXZgSQlxEDXJyZ0Bw71fGPOH2r/BMYi8rVhUpe69obXm6QfC66tV4nvdzidur9NNRYR2whfg+fwYuBb3gw+H4XdqKszRwtcn1tDwSvYG2lwNtzY/nkJgoPCxCgCplCAjiJg8YdRlEaUHcU5FfipbaBkKwhYTETVi4XIOhz/6bX4D/wAZZy9qOEfuO0AAAAASUVORK5CYII=\"","import { Typography, Grid, Avatar } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\n// import AvatarImage from \"assets/discovery/inf-avatar.png\"\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport instaIcon from 'assets/discovery/insta-icon.png';\nimport YoutubeIcon from 'assets/discovery/youtube-icon.png';\n\nfunction InfluencerInfo({ name, gender, language, picture, age_group, platform }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n {platform == 'instagram' ? (\n \n ) : (\n \n )}\n \n \n \n \n \n \n {name}\n \n {language} \n \n \n \n \n \n \n {gender == 'FEMALE' ? 'F' : 'M'} | {age_group} yrs\n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n // background: '#FFFFFF',\n justifyContent: 'space-around',\n alignItems: 'center',\n },\n aboutContainer: {\n color: '#757575',\n },\n genderIcon: {\n height: 13,\n width: 13,\n },\n genderInfo: {\n fontSize: 11,\n color: '#757575',\n },\n avatar: {\n position: 'initial',\n },\n influencerName: {\n fontSize: 14,\n fontWeight: 400,\n color: 'black',\n textAlign: 'left',\n },\n language: {\n color: '#757575',\n textAlign: 'left',\n marginTop: 5,\n marginBottom: 5,\n fontSize: 11,\n },\n}));\n\nexport default InfluencerInfo;\n","import { useEffect, useState } from 'react';\nimport axios from 'axios';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { connect } from 'react-redux';\nimport { TextField, Grid, Chip, InputAdornment, IconButton, Paper } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport InfluencerInfo from './InfluencerInfo';\n// import { getDiscoverySearchResult } from 'api_handlers/discovery';\nimport { getDiscoverySearchResult } from 'api_handlers/es';\nimport { updateSearchedSelectedInfluencerIds } from 'actions/planner';\nimport SearchIcon from '@mui/icons-material/Search';\n\nfunction SearchAutocomplete(props) {\n const [options, setOptions] = useState([]);\n const [searchKeyword, setSearchKeyword] = useState('');\n const [typingTimeout, setTypingTimeout] = useState(null);\n const [requestSource, setRequestSource] = useState(null);\n const [delay, setDelay] = useState(false);\n\n const CancelToken = axios.CancelToken;\n\n useEffect(() => {\n if (searchKeyword.length < 3) return;\n if (typingTimeout) clearTimeout(typingTimeout);\n\n setTypingTimeout(\n setTimeout(async () => {\n try {\n if (requestSource) {\n requestSource.cancel('Operation canceled.');\n }\n console.log('options', options);\n const source = CancelToken.source();\n setRequestSource(source);\n getDiscoverySearchResult(searchKeyword, source).then(({ result }) => {\n setRequestSource(null);\n setOptions([...result]);\n });\n } catch (e) {\n console.error(e);\n }\n }, 500),\n );\n }, [searchKeyword]);\n\n const classes = useStyles();\n return (\n 2 && delay ? false : true}\n noOptionsText={'No result found'}\n id=\"planner-search-autocomplete\"\n InputLabelProps={{ shrink: false }}\n options={options}\n getOptionLabel={(option) => option.label || ''}\n renderInput={(params) => (\n \n this.handleApply()} className={classes.searchButton}>\n \n \n \n }\n inputProps={{\n ...params.inputProps,\n onKeyDown: (e) => {\n if (e.key === 'Enter') {\n e.stopPropagation();\n }\n },\n }}\n />\n )}\n renderTags={(selectedValues, getTagProps) => {\n return selectedValues.map((option) => {\n console.log('render tag change');\n const props = getTagProps(option);\n return ;\n });\n }}\n onInputChange={(event, value) => {\n console.log('input change');\n setSearchKeyword(value);\n if (value.length < 3) setDelay(false);\n setTypingTimeout(\n setTimeout(() => {\n setDelay(true);\n }, 2500),\n );\n }}\n renderOption={(option, { selected }) => (\n \n \n \n )}\n onChange={(event, selectedValues) => {\n console.log('influencer selected', selectedValues);\n // props.updateSearchedSelectedInfluencerIds(selectedValues.map(v => v.id))\n props.getPlannerInfluencersData({\n ...props.payload,\n searchedSelectedInfluencerIds: selectedValues.map((v) => v.id),\n });\n }}\n />\n );\n}\n\nconst useStyles = makeStyles(() => ({\n searchInput: {\n width: 700,\n fontSize: 10,\n height: 35,\n borderRadius: 20,\n backgroundColor: 'white',\n paddingLeft: 20,\n boxShadow:\n '-4px 4px 8px rgba(230, 230, 230, 0.2), 4px -4px 8px rgba(230, 230, 230, 0.2), -4px -4px 8px rgba(255, 255, 255, 0.9), 4px 4px 10px rgba(230, 230, 230, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(230, 230, 230, 0.5)',\n '& .MuiInput-underline:before': {\n border: 'none',\n },\n '& .MuiInput-underline:hover:not(.Mui-disabled):before, & .MuiInput-underline:after': {\n border: 'none',\n },\n },\n}));\n\nconst mapStateToProps = (state) => {\n return {\n searchedSelectedInfluencerIds: state.planner.searchedSelectedInfluencerIds,\n };\n};\n\nconst actionCreators = {\n updateSearchedSelectedInfluencerIds,\n};\n\nexport default connect(mapStateToProps, actionCreators)(SearchAutocomplete);\n","import { constants } from '../constants/discovery';\n\nimport { getPlannerInfluencers } from 'api_handlers/discovery';\n\nexport function updateSearchedSelectedInfluencerIds(searchedSelectedInfluencerIds) {\n return (dispatch) => {\n dispatch(update());\n };\n\n function update() {\n return {\n type: constants.UPDATE_SEARCHED_SELECTED_INFLUENCER_IDS,\n searchedSelectedInfluencerIds,\n };\n }\n}\n","export default \"data:image/png;base64,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\"","import { Button } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { alpha } from '@material-ui/core/styles/colorManipulator';\n\nfunction ButtonUpdated({ children, ...props }) {\n const classes = useStyles({ color: props.color });\n\n return (\n \n {children}\n \n );\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: (props) => ({\n boxShadow: `-1px 1px 2px ${alpha(theme.palette[props.color].main, 0.2)}, 1px -1px 2px ${alpha(\n theme.palette[props.color].main,\n 0.2,\n )}, -1px -1px 2px ${alpha(theme.palette[props.color].main, 0.9)}, 1px 1px 3px ${alpha(\n theme.palette[props.color].main,\n 0.9,\n )}, inset 1px 1px 2px ${alpha(\n theme.palette[props.color].main,\n 0.3,\n )}, inset -1px -1px 2px ${alpha(theme.palette[props.color].main, 0.5)}`,\n borderRadius: 10,\n fontWeight: 700,\n }),\n}));\n\nexport default ButtonUpdated;\n","import { useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Button from 'components/Theme/Elements/Button';\n\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport AddIcon from '@material-ui/icons/Add';\nimport DoneIcon from '@material-ui/icons/Done';\n\nimport { addInfluencerToCampaign } from 'api_handlers/campaign';\n\nfunction CampaignCard({ id, name, desc, start_date, budget, selectedInfluencer }) {\n const classes = useStyles();\n const [influencerAdded, setInfluencerAdded] = useState(false);\n\n function addInfluencerHandler(e) {\n e.preventDefault();\n addInfluencerToCampaign(id, { profiles: selectedInfluencer }).then(() =>\n setInfluencerAdded(true),\n );\n }\n\n return (\n \n \n \n \n {name} \n \n \n \n \n \n Start Date:\n \n \n \n {start_date} \n \n \n \n \n \n \n {desc} \n \n \n \n \n \n Influencer Micro | Small\n \n \n \n \n \n \n \n \n \n \n {budget}\n \n \n \n \n {influencerAdded ? (\n \n \n \n ) : (\n \n \n \n )}\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n height: 150,\n background: '#F3F4FE',\n boxShadow:\n '-5px 5px 10px rgba(219, 220, 229, 0.2), 5px -5px 10px rgba(219, 220, 229, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n borderRadius: 20,\n padding: '10px 30px',\n },\n descContainer: {\n marginTop: 10,\n height: 50,\n },\n badge: {\n background: 'linear-gradient(180deg, #FEBD1C 0%, rgba(254, 189, 28, 0.1) 100%)',\n borderRadius: 5,\n color: 'white',\n padding: 7,\n },\n budgetIcon: {\n height: 25,\n width: 25,\n },\n budgetLabel: {\n background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n border: '1px solid #FEBD1C',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 5,\n padding: 4,\n },\n addButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n },\n startDateLabel: {\n fontWeight: 600,\n marginRight: 5,\n },\n checkButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n background: '#82E900',\n '&.MuiButton-containedPrimary:hover': {\n background: '#179020',\n },\n },\n}));\n\nexport default CampaignCard;\n","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal, Divider } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CampaignIcon from 'assets/discovery/Campaign-Icon.png';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport Button from 'components/Theme/Elements/Button';\nimport CampaignCard from './components/CampaignCard';\n\nimport { campaignHandlers } from 'api_handlers/campaign';\n\nfunction AddToCampaignModal({\n campaignModalOpen = false,\n setCampaignModalOpen,\n selectedInfluencer,\n setSelectedInfluencer,\n}) {\n const classes = useStyles();\n const [campaigns, setCampaigns] = useState([]);\n\n useEffect(() => {\n campaignHandlers.getCampaigns().then((result) => {\n setCampaigns(result);\n });\n }, []);\n\n async function handleDone() {\n await setSelectedInfluencer([]);\n setCampaignModalOpen(false);\n }\n\n return (\n \n \n \n \n \n \n \n CAMPAIGNS \n \n \n \n \n \n \n setCampaignModalOpen(false)}\n >\n \n \n Close \n \n \n \n \n \n \n \n \n \n \n Select Campaign \n \n \n \n {campaigns.map((campaign, i) => (\n \n \n \n ))}\n \n \n \n \n \n \n DONE\n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: 700,\n width: 900,\n margin: 'auto',\n marginTop: 50,\n },\n root: {\n background: '#F3F4FE',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n height: 700,\n width: 900,\n borderRadius: 10,\n padding: 40,\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n },\n campaignIcon: {\n height: 30,\n width: 30,\n },\n divider: {\n border: '2px solid #FEBD1C',\n borderRadius: 10,\n background: '#FEBD1C',\n },\n body: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n marginTop: 25,\n height: 500,\n },\n cardContainer: {\n overflowY: 'scroll',\n height: 400,\n },\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n padding: 7,\n height: 30,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n}));\n\nexport default AddToCampaignModal;\n","import { Avatar, Button, Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport downArrow from 'assets/planner/down-arrow.png';\nimport upArrow from 'assets/planner/up-arrow.png';\n\nimport { Component } from 'react';\n\nclass downloadPlannerStaff extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selected: false,\n value: '',\n contacts: false,\n };\n }\n\n handleDropdownClick = () => {\n this.setState((prevState) => ({\n selected: !prevState.selected,\n }));\n };\n\n handleItemClick = (index) => {\n if (index === 1) {\n this.props.onButtonClick(true);\n } else {\n this.props.onButtonClick(false);\n }\n };\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.selected !== this.state.selected) {\n this.props.setDownloadSelected(this.state.selected);\n }\n }\n\n render() {\n let { classes } = this.props;\n const items = ['Download without contact', 'Download with contact'];\n return (\n \n \n \n \n \n Download Plan \n \n \n \n \n \n \n \n {this.state.selected ? (\n \n \n {items.map((item, index) => (\n this.handleItemClick(index)}\n >\n {item}\n \n ))}\n \n \n ) : (\n ''\n )}\n \n );\n }\n}\n\nconst styles = {\n root: {\n // backgroundColor: \"#fff\",\n // width: 150,\n // innerWidth: 150,\n // borderRadius: 10,\n // marginLeft: \"80%\",\n // marginRight: 100,\n // marginTop: 10,\n // zIndex: 20,\n },\n dropDown: {\n position: 'relative',\n display: 'inline-block',\n justifyContent: 'center',\n },\n menu: {\n cursor: 'pointer',\n padding: 10,\n width: '100%',\n '&:hover': {\n backgroundColor: 'rgb(254, 189, 28, 0.50)',\n borderRadius: 10,\n fontSize: 14,\n },\n },\n dropdownGrid: {\n backgroundColor: '#fff',\n position: 'absolute',\n top: '119%',\n left: '-20px',\n right: '-50px',\n width: 200,\n backgroundColor: '#ffffff',\n border: '1px solid #ccc',\n borderRadius: '10px',\n fontSize: 14,\n zIndex: 20,\n },\n downloadPlan: {\n textTransform: 'none',\n // marginLeft: 150,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n fontSize: 13,\n fontWeight: 600,\n padding: 10,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n '&:disabled': {\n backgroundColor: '#DDDDDD',\n color: '#FFFFFF',\n },\n cursor: 'pointer',\n },\n icon: {\n width: 10,\n height: 10,\n },\n buttonName: {\n fontSize: 14,\n fontWeight: 600,\n marginRight: 5,\n },\n};\n\nexport default withStyles(styles)(downloadPlannerStaff);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAABHNCSVQICAgIfAhkiAAAAR1JREFUSIm90j1Sg0AYxvHnfbex9CimBIqYG1jamdzAYWEpTecwewjiMaxitVh6DMvY2WETZjYGkv0gebv9gP9vGICIkVKupZTrmHeImDgzvxDRfZIk1Lbtx9UAfbxfxyC8Af/jsQgvwFg8BuEMOBcPRTgBXOMhiLOAU/Gu63ZE9AvgJhRxEuAQXwB4A/AYihgFuMS11l/GmO8sy95DEYMA13i/F4M4AhRF8czMr65xH0Sapj/GmM+DfXuR5/lSCNH4xu0py/IOwBbA7ciVldZ6cwSYIh6CoKnjvgi6RNwHwUKI+SXiALB/dgFgN3TOzHPaSxsAyynj9gx9CWbe1HW9IuuSjZhNFR9C9PGhS41S6mnKsD1KqYeqqg7+tz+IhNge8UJS0AAAAABJRU5ErkJggg==\"","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal, Divider, TextField, Snackbar, Text, IconButton } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CampaignIcon from 'assets/discovery/Campaign-Icon.png';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport Button from 'components/Theme/Elements/Button';\nimport { getDiscoveryInfluencersDetails, sendWhatsappMessage } from 'api_handlers/discovery';\nimport { addInfluencerToCampaign, createCampaign,campaignHandlers } from 'api_handlers/campaign';\nimport { ThemeProvider } from '@material-ui/core';\nimport themeV2 from 'themeV2';\nimport { Alert, MenuItem, Select } from '@mui/material';\nimport InputLabel from '@mui/material/InputLabel';\nimport FormControl from '@mui/material/FormControl';\nimport CampaignList from 'components/campaign/cards/CampaignList';\nimport TaskAltIcon from '@mui/icons-material/TaskAlt';\n\n\n\nconst template_dict = {\n \"HXf2c8659547d7af331fe5d11761c50320\": \"Hello Influencer,\\n\\nWe have an exclusive opportunity for you in Upcoming Campaign by Influencer.in. Let's team up to create something amazing. Discover the campaign details at https://product.influencer.in/. Excited to discuss further!\\n\\nWarm regards,\\nTeam Influencer\",\n \"HX8340e6ffec177e070750a1897792119c\": \"Hi Influencer,\\n\\nGreat news! We are thrilled to inform you that you've been shortlisted for our upcoming campaign. Your unique style and audience engagement stood out, and we believe you'd be an excellent fit for this project. We'll be in touch soon with more details about the campaign and the next steps.\\n\\nCongratulations, and thank you for your interest!\\nTeam Influencer.in\",\n \"HX20ec9cff48ea96ae85171e0f5c680119\": \"Hey Influencer,\\n\\nCongratulations on being shortlisted for our upcoming campaign with Influencer.in! We're excited to have you on board for the Upcoming Campaign. It's time for product selection. Please visit the campaign page at https://product.influencer.in/. to choose the products you'd like to feature in your content.\\n\\nIf you have any questions or need assistance, feel free to reach out to us. We can't wait to see the magic you'll create with our products!\\n\\nBest regards,\\nTeam Influencer.in\",\n \"HXd8354ef6be43f922ced13776313dfcb3\": \"Hi Influencer,\\n\\nWe're delighted to inform you that your selected products for the Upcoming Campaign have been dispatched and are on their way to you. You should expect delivery within 2 Days.\\n\\nIf you have any concerns or questions regarding the delivery, please don't hesitate to reach out to us. We look forward to seeing your amazing content!\\n\\nBest regards,\\nTeam Influencer.in\",\n \"HXbc01316b0bbf37c765035414b8301706\": \"Hi Influencer,\\n\\nWe hope you're doing well. It's time for content submission for the Upcoming Campaign. We can't wait to see what you've created with our products. Please send us the content before end of the campaign, including Specific Requirements.\\n\\nYou can submit your content through upload section. If you encounter any issues or have questions, don't hesitate to reach out to us. Thank you for your hard work and dedication to the campaign.\\n\\nBest regards,\\nTeam Influencer.in\",\n \"HXb6613d2eb00572fe1696bf636d0b054f\": \"Hi Influencer,\\n\\nWe're thrilled to inform you that your submitted content for the Upcoming Campaign has been approved. We love what you've created, and we believe your audience will too. You are now clear to publish your content on your chosen platform.\\n\\nPlease go ahead and schedule your publication, making sure it aligns with the agreed-upon timeline. If you have any questions or need any additional support, please don't hesitate to reach out.\\n\\nThank you for your hard work and collaboration!\\nTeam Influencer.in\",\n \"HX5df25eeed65f7dae52910656cf3a9986\": \"Hi Influencer,\\n\\nWe're pleased to inform you that your payment for the Upcoming Campaign has been processed. You should receive the payment in your account within 2-3 Working Days. We appreciate your hard work and dedication to the campaign.\\n\\nOnce you've received the payment, please confirm it by replying to this message or sending a separate confirmation email. If you have any questions or concerns, don't hesitate to reach out.\\n\\nThank you for your collaboration!\\nTeam Influencer.in\"\n}\n\nfunction BroadcastModal({\n communicationModalOpen = false,\n setCommunicationModalOpen,\n selectedInfluencer,\n recommendation,\n setSelectedInfluencer,\n influencers,\n}) {\n const classes = useStyles();\n const [message,setMassege]=useState('')\n var [influenerDetail, setInfluenerDetail] = useState([]);\n var [contactDetails, setContactDetails] = useState([]);\n var [templatesid, setTemplatesid] = useState([]);\n const [errorModalOpen, setErrorModalOpen] = useState(false);\n const [successModalOpen, setSuccessModalOpen] = useState(false);\n const [errorCampaignModalOpen, setErrorCampaignModalOpen] = useState(false);\n const [successCampaignModalOpen, setSuccessCampaignModalOpen] = useState(false);\n const [campaign, setCampaign] = useState('');\n const [campaign_name, setCampaignName] = useState('');\n const [error_message, setErrorMessage] = useState('');\n const [campaignList,setCampaignList]=useState([])\n const [campaignId,setCampaignId]=useState()\n const [customContactNumber,setCustomContactNumber]=useState('');\n const [customContactList,setCustomContactList]=useState([]);\n const [influencerIds,setInfluencerIds]=useState([])\n const list=[]\n var contactList=[]\n\n useEffect(() => {\n\n campaignHandlers.getCampaigns().then((result) => {\n setCampaignList([...result]);\n });\n\n let contact = []\n var influecnerIds = []\n selectedInfluencer.map(influencers=>{\n getDiscoveryInfluencersDetails(influencers).then((response) => {\n list.push(response.name)\n setInfluenerDetail([...list])\n if (response.contact_details && response.contact_details.length > 0) {\n contact.push(response.contact_details);\n influecnerIds.push(response.influencer);\n }\n });\n })\n\n setContactDetails(contact);\n setInfluencerIds(influecnerIds);\n\n }, []);\n\n const errorToggleModal = async () => {\n setErrorModalOpen(!errorModalOpen);\n };\n\n const successToggleModal = async () => {\n if (successModalOpen) {\n setCommunicationModalOpen(false);\n }\n setSuccessModalOpen(!successModalOpen);\n };\n\n const errorCampaignToggleModal = async () => {\n setErrorCampaignModalOpen(!errorModalOpen);\n };\n\n const successCampaignToggleModal = async () => {\n if (successCampaignModalOpen) {\n setCampaign(campaign_name);\n }\n setSuccessCampaignModalOpen(!successModalOpen);\n };\n\n const getBrandName = () => {\n try {\n const user = JSON.parse(localStorage.getItem('user'));\n return user.user_type === 'brand' ? (user.brand.name ? user.brand.name+'.' : 'Influencer.in.') : 'Influencer.in.';\n } catch {\n return 'Influencer.in.'\n }\n }\n\n return (\n \n \n \n \n\n \n \n \n \n Broadcast \n \n \n \n \n \n \n setCommunicationModalOpen(false)}\n >\n \n \n Close \n \n \n \n \n \n \n \n \n\n \n \n Shortlisted Influencers \n \n \n \n \n Custom contact \n \n \n \n \n {\n setCustomContactNumber(evt.target.value)\n }}\n placeholder='Add a number - 98xxxxx'>\n\n \n \n {/* \n {\n setCustomContactList(customContactNumber.split(',')); \n }}>\n \n \n */}\n\n \n \n \n \n \n \n \n {/* {shortlistedInfluencers.map((shortInf, i) => (\n \n \n \n ))} */}\n \n \n Influencer Name \n \n {\n influenerDetail.map((selectedInfluencerName,i)=>{\n return \n \n \n {selectedInfluencerName} \n\n \n \n })\n }\n \n \n \n \n {campaign.length == 0 ? \n \n setCampaignName(evt.target.value)}\n > \n \n \n {error_message}\n \n \n \n \n Campaign added successfully\n \n \n {\n if (campaign_name && campaign_name.length > 0) {\n let date = new Date();\n var yyyy = date.getFullYear().toString();\n var mm = (date.getMonth()+1).toString();\n var dd = date.getDate().toString();\n\n var mmChars = mm.split('');\n var ddChars = dd.split('');\n\n date = yyyy + '-' + (mmChars[1]?mm:\"0\"+mmChars[0]) + '-' + (ddChars[1]?dd:\"0\"+ddChars[0]);\n createCampaign({\"name\": campaign_name, \"start_date\": date, \"end_date\": date}).then((response)=>{\n if (response.status == 400) {\n setErrorCampaignModalOpen(true)\n setErrorMessage(\"Please Try Again Later\");\n } else {\n (async () => {\n let data = await response.json();\n setCampaignId(data.id)\n setCampaign(data.name)\n addInfluencerToCampaign(data.id, { profiles: selectedInfluencer }).then(() =>\n setSuccessCampaignModalOpen(true)\n )\n })();\n }\n }) \n } else {\n setErrorCampaignModalOpen(true)\n setErrorMessage(\"Please Enter Title\");\n }\n }}>\n Add To Campaign\n \n : \n \n \n {campaign} \n \n \n Select Template \n {\n setTemplatesid(event.target.value);\n }}\n >\n Campaign reachout \n Shortlisted \n Product selection \n Product delivery confirmation \n Content submission Deadline \n Content approval \n Payment Confirmation \n \n \n \n {templatesid && templatesid.length > 0 ?\n
\").replace(\"Upcoming Campaign\", campaign).replace(\"upcoming campaign\", campaign).replace(\"Influencer.in.\", getBrandName())}}>\n : null}\n
\n \n \n \n \n \n Please select template first.\n \n \n \n \n Broadcast sent successfully\n \n \n {\n if (templatesid && templatesid.length > 0) {\n if (customContactNumber == '') {\n influencerIds.map(each_id=>{\n sendWhatsappMessage('+919582489634', templatesid, each_id, campaignId, template_dict[templatesid].replace(/\\n/g, \" \"));\n })\n } else {\n var numberAndInfluencerIds = [];\n customContactNumber.split(',').map(each=>{\n influencerIds.map(each_id=>{\n numberAndInfluencerIds.push({ 'number': each, 'id': each_id });\n })\n })\n numberAndInfluencerIds.map(each=>{\n sendWhatsappMessage('+91'+each['number'].replaceAll(' ',''), templatesid, each['id'], campaignId, template_dict[templatesid].replace(/\\n/g, \" \"));\n })\n }\n setSuccessModalOpen(true);\n if (typeof window !== 'undefined') {\n window.location.href = '/brand/campaigns/'+campaignId+'/communication';\n }\n } else {\n setErrorModalOpen(true);\n }\n }} \n >\n Send\n \n \n \n \n \n }\n \n \n \n \n \n\n \n {\n successCampaignModalOpen==false?\n \n \n OR \n \n \n Select Campaign \n \n \n \n \n {\n campaignList.map((campaign,i)=>{\n return(\n {\n setCampaignId(campaign.id)\n setCampaign(campaign.name)\n addInfluencerToCampaign(campaign.id, { profiles: selectedInfluencer }).then(() =>\n setSuccessCampaignModalOpen(true)\n )\n }}\n >\n \n {campaign.name} \n \n \n \n \n Start Date : \n \n \n \n {campaign.start_date} \n \n \n \n \n \n Influencer Micro | Small \n \n \n )\n })\n }\n \n \n :''\n }\n \n \n \n \n \n\n );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: '90%',\n width: '90%',\n marginLeft: '10%',\n marginTop: '5%',\n },\n root: {\n background: '#F3F4FE',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n height: '90%',\n width: '90%',\n borderRadius: 10,\n padding: 40,\n overflowY: 'auto',\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n },\n campaignIcon: {\n height: 30,\n width: 30,\n },\n divider: {\n border: '2px solid #FEBD1C',\n borderRadius: 10,\n background: '#FEBD1C',\n },\n body: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n marginTop: 25,\n height: 200,\n \n },\n cardContainer: {\n // overflowY: 'scroll',\n height: 100,\n marginTop:25,\n },\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n paddingLeft: 15,\n paddingRight: 15,\n paddingTop: 7,\n paddingBottom: 7,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n influencerNameContainer:{\n borderRight:'1px solid #aaaaaa',\n overflowY:'scroll',\n height:150\n },\n chatContainer:{\n border:'1px solid #000000',\n width:'100%',\n },\n sendMessageContainer:{\n border:'1px solid #000000',\n },\n chatTextFieldContainer:{\n border:'1px solid #000000',\n background:'#eeeeee',\n width:'100%'\n },\n chatTextField:{\n\n },\n influencerName:{\n fontSize: 15,\n marginTop:3\n\n },\n alternateOption:{\n // background:'#000000',\n border: '1px solid #aaaaaa',\n borderRadius:10,\n maxWidth:100,\n height:40,\n textAlign:'center',\n marginTop:30,\n padding:6\n },\n campaignListCard:{\n background: '#F3F4FE',\n boxShadow:\n '-5px 5px 10px rgba(219, 220, 229, 0.2), 5px -5px 10px rgba(219, 220, 229, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n borderRadius:10,\n padding:20,\n marginTop:20,\n cursor:'pointer'\n },\n influencerType:{\n background: 'linear-gradient(180deg, #FEBD1C 0%, rgba(254, 189, 28, 0.1) 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius:5,\n marginTop:10,\n padding:10,\n alignItems:'center'\n\n }\n}));\n\nexport default BroadcastModal;","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal, TextField, Button } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport AddIcon from '@mui/icons-material/Add';\nimport InstagramIcon from '@material-ui/icons/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\n\nimport { createInstagramIQProfile, createYoutubeIQProfile } from 'api_handlers/discovery';\n\nfunction AddNewProfileModal({\n showAddProfileModal = false,\n closeAddProfileModal,\n openDetailViewModal\n}) {\n const classes = useStyles();\n const [profile_links, setProfileLinks] = useState([{ link: '', type: 'instagram' },{ link: '', type: 'youtube' }]);\n const [disableBtn, setDisableBtn] = useState(false);\n const [loadingData, setLoadingData] = useState(false);\n\n\n useEffect(() => {\n }, []);\n\n async function createInstagramProfile(index) {\n setLoadingData(true);\n let profile_links_updated = [...profile_links];\n let data = await createInstagramIQProfile(profile_links_updated[index].link);\n if (data.data.error) {\n profile_links_updated[index]['error'] = data.data.error;\n } else {\n profile_links_updated[index]['show_view'] = true;\n profile_links_updated[index]['id'] = data.data.id;\n }\n setDisableBtn(true);\n setProfileLinks(profile_links);\n setLoadingData(false);\n }\n\n async function createYoutubeProfile(index) {\n setLoadingData(true);\n let profile_links_updated = [...profile_links];\n let data = await createYoutubeIQProfile(profile_links_updated[index].link);\n if (data.data.error) {\n profile_links_updated[index]['error'] = data.data.error;\n } else {\n profile_links_updated[index]['show_view'] = true;\n profile_links_updated[index]['id'] = data.data.id;\n }\n setDisableBtn(true);\n setProfileLinks(profile_links);\n setLoadingData(false);\n }\n\n return (\n \n \n \n \n \n \n \n Add profile(s) \n \n \n \n closeAddProfileModal()}\n >\n \n \n Close \n \n \n \n \n \n \n \n \n {\n profile_links.map((each, index)=>{\n return \n
\n {\n each.type == \"youtube\" ? \n \n : \n }\n {\n let profile_links_updated = [...profile_links];\n profile_links_updated[index].link = evt.target.value; \n setProfileLinks(profile_links_updated);\n }}\n placeholder='input the profile link here'>\n \n {\n each.show_view ?\n {\n openDetailViewModal(each.id);\n }}\n >View \n : }\n onClick={(e)=>{\n let profile_links_updated = [...profile_links];\n if (profile_links_updated.length < 3) {\n profile_links_updated.push({ link: '' , type: each.type })\n setProfileLinks(profile_links_updated);\n }\n }}> \n }\n
\n {\n each.error ? \n
\n {each.error}\n
: null\n }\n
\n })\n }\n \n \n closeAddProfileModal()}\n style={{ color: 'gray', marginRight: 10 }}>Cancel \n {\n let profile_links_updated = [...profile_links];\n var link_valid = false;\n profile_links_updated.map((each)=>{\n if (each.type == \"instagram\" && each.link && each.link.toLocaleLowerCase().indexOf('instagram.com') > 0) {\n link_valid = true;\n } else if (each.type == \"youtube\" && each.link && each.link.toLocaleLowerCase().indexOf('youtube.com') > 0) {\n link_valid = true;\n }\n })\n profile_links_updated.map((each, index)=>{\n profile_links_updated[index].error = \"\";\n if (!link_valid || each.link.length > 0) {\n if (each.type == \"instagram\") {\n if (each.link && each.link.toLocaleLowerCase().indexOf('instagram.com') > 0) {\n createInstagramProfile(index);\n } else {\n profile_links_updated[index].error = \"Please Enter Valid Insagram Link.\"\n }\n } else {\n if (each.link && each.link.toLocaleLowerCase().indexOf('youtube.com') > 0) {\n createYoutubeProfile(index);\n } else {\n profile_links_updated[index].error = \"Please Enter Valid Youtube Link.\"\n }\n }\n }\n })\n setProfileLinks(profile_links_updated);\n }}\n variant='contained'\n color='primary'>Create \n
\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: 600,\n width: 900,\n margin: 'auto',\n marginTop: 50,\n },\n root: {\n background: '#F3F4FE',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n height: 600,\n width: 900,\n borderRadius: 10,\n padding: 40,\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n },\n campaignIcon: {\n height: 30,\n width: 30,\n },\n divider: {\n border: '2px solid #FEBD1C',\n borderRadius: 10,\n background: '#FEBD1C',\n },\n body: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n marginTop: 25,\n height: 500,\n },\n cardContainer: {\n overflowY: 'scroll',\n height: 400,\n },\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n padding: 7,\n height: 30,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n}));\n\nexport default AddNewProfileModal;\n","import { Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport makeAnimated from 'react-select/animated';\nimport SearchAutocomplete from './components/SearchAutocomplete';\nimport { Grid, Button } from '@material-ui/core';\nimport AddToCampaignModal from './components/AddToCampaignModal';\nimport { updateFilter, getFilteredInfluencer, resetFilter } from 'actions/discovery';\nimport { getPlannerDownload } from 'api_handlers/discovery';\nimport DownloadPlannerStaff from './DownloadPlannerStaff';\nimport BroadcastModal from './components/BroadcastModal/BroadcastModal'\nimport { isWhatsAppModuleEnable } from 'components/utils';\nimport AddNewProfileModal from './components/AddNewProfileModal';\nimport DetailViewModal from '../InfluencerInfoCard/components/DetailViewModal';\n\nconst animatedComponents = makeAnimated();\n\nclass ActionFilter extends Component {\n // const [campaignModalOpen, setCampaignModalOpen] = useState(false)\n\n constructor(props) {\n super(props);\n\n this.setCampaignModalOpen = this.setCampaignModalOpen.bind(this);\n this.setCommunicationModalOpen = this.setCommunicationModalOpen.bind(this);\n this.setDetailViewOpened = this.setDetailViewOpened.bind(this);\n\n this.state = {\n campaignModalOpen: false,\n search: props.payload ? props.payload.search : '',\n searchOptions: [],\n selectedSearchOptions: [],\n selectedInfluencer: this.props.selectedInfluencer,\n is_contact: 'not_req',\n isDownloadSelected: false,\n communicationModalOpen: false,\n showAddProfileModal: false,\n detailViewOpened: false,\n influencer_id: ''\n };\n }\n setCampaignModalOpen(boolean) {\n this.setState({ campaignModalOpen: boolean });\n }\n\n setCommunicationModalOpen(boolean) {\n this.setState({ communicationModalOpen: boolean });\n }\n\n handleApply() {\n console.log(this.props);\n const payload = this.props.payload;\n payload['search'] = this.state.search;\n delete payload['budget_left'];\n this.props.getPlannerInfluencersData(payload, 1);\n this.props.scrollToElement();\n // getFilteredInfluencer()\n }\n\n async downloadPlanner() {\n console.log(this.props.selectedInfluencer);\n let selected_ids = this.props.selectedInfluencer.map((id) => {\n return id;\n });\n let objective = '';\n if (this.props.selectedObjectiveType == 'Reach') {\n objective = 'reach';\n }\n if (this.props.selectedObjectiveType == 'CPV') {\n objective = 'cpv';\n }\n if (this.props.selectedObjectiveType == 'Engagement Rate') {\n objective = 'engagement_rate';\n }\n let impact_data = {};\n if (this.props.impact_data) {\n impact_data = this.props.impact_data;\n }\n let download_payload = {\n selected_ids: selected_ids,\n objective: objective,\n prediction: this.props.selectedPrediction,\n contacts: this.state.is_contact,\n selectedColumns: this.props.selectedColumns,\n };\n let resp = await getPlannerDownload(download_payload);\n }\n handleButtonClick = (value) => {\n this.setState(\n {\n is_contact: value ? 'req' : 'not_req',\n },\n () => {\n this.downloadPlanner();\n },\n );\n };\n\n setDownloadSelected = (value) => {\n this.setState({ isDownloadSelected: value });\n };\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.isDownloadSelected !== this.state.isDownloadSelected) {\n this.props.showColumnSelectModal(this.state.isDownloadSelected);\n }\n }\n\n setDetailViewOpened(boolean) {\n this.setState({ detailViewOpened: boolean });\n }\n \n render() {\n let {\n classes,\n filters,\n setFilters,\n selectedInfluencer,\n setSelectedInfluencer,\n payload,\n selectedObjectiveType,\n impact_data,\n influencers,\n recommendation,\n getPlannerInfluencersData,\n } = this.props;\n\n // console.log(\"Recommendations : \", recommendation.map((influencers) => {\n // if (selectedInfluencer.includes(influencers.id)){\n // return influencers\n // }\n // }))\n // console.log(\"Influencers: \", influencers.map((inf) => {\n // if (selectedInfluencer.includes(inf.id)){\n // return inf\n // }\n // else{\n // return\n // }\n // }))\n return (\n \n \n {/* {\n if (event.key === \"Enter\") {\n this.handleApply();\n }\n }}\n endAdornment={\n \n this.handleApply()}\n className={classes.searchButton}\n >\n \n \n \n }\n value={this.state.search || null}\n onChange={({ target }) => {\n this.setState({ search: target.value });\n }}\n /> */}\n \n {/* option.name}\n getOptionValue={(option) => option.id}\n onInputChange={(value) => {\n this.updateSearchOptions(value)\n }}\n /> */}\n \n {this.props.isStaff ? \n \n {\n this.setState({ showAddProfileModal: true })\n }}>\n Add Profile\n \n \n : }\n \n \n {this.props.isStaff ? (\n \n \n \n ) : (\n ''\n )}\n \n {this.setCampaignModalOpen(!this.state.campaignModalOpen);\n console.log(\"Campaign model open\", this.state.campaignModalOpen)\n }}\n >\n Add to Campaign\n \n \n \n {\n isWhatsAppModuleEnable() ?\n \n {\n // this.setCommunicationModalOpen(!this.state.communicationModalOpen);\n // console.log(\"Is model open :\", this.state.communicationModalOpen)\n this.setState({communicationModalOpen:true})\n }}\n >\n Communication\n \n : null\n }\n {\n this.state.communicationModalOpen?\n \n :''\n }\n {\n this.state.showAddProfileModal?\n {\n this.setState({ showAddProfileModal: false })\n }}\n openDetailViewModal={(influencer_id)=>{\n this.setState({ influencer_id: influencer_id, detailViewOpened: true });\n }}/>: ''\n }\n {this.state.detailViewOpened ? (\n \n ) : null}\n {/* */}\n \n \n \n );\n }\n}\n\nconst styles = {\n root: {\n zIndex: 4,\n flexGrow: 1,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n // boxShadow:\n // \"-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)\",\n borderRadius: 10,\n // background: \"#FFFFFF\",\n height: 50,\n position: 'sticky',\n top: 0,\n marginBottom: 15,\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n matrixBox: {\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n font12: {\n fontSize: 12,\n },\n font16: {\n fontSize: 16,\n },\n downloadPlan: {\n // width:150,\n textTransform: 'none',\n marginLeft: 20,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n fontSize: 13,\n fontWeight: 600,\n padding: 10,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n '&:disabled': {\n backgroundColor: '#DDDDDD',\n color: '#FFFFFF',\n },\n downArrow: {\n marginLeft: 20,\n },\n // '&.MuiButtonBase-root.Mui-disabled': {\n // cursor: 'pointer',\n // },\n },\n add_to_campaign: {\n textTransform: 'none',\n marginLeft: 20,\n background: 'white',\n borderRadius: '10px',\n borderColor: '#FEBD1C',\n color: '#FEBD1C',\n fontSize: 14,\n fontWeight: 600,\n padding: 10,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n // '&:disabled': {\n // backgroundColor: '#bbbbbb',\n // },\n },\n communication: {\n textTransform: 'none',\n marginLeft: 5,\n background: 'white',\n borderRadius: '10px',\n borderColor: '#FEBD1C',\n color: '#FEBD1C',\n fontSize: 14,\n fontWeight: 600,\n padding: 10,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n // '&:disabled': {\n // backgroundColor: '#bbbbbb',\n // },\n },\n};\n\nexport default withStyles(styles)(ActionFilter);\n","import { Component } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport CircularProgress from '@material-ui/core/CircularProgress';\n\nclass Recommendation extends Component {\n // const classes = useStyles();\n formatCount(count) {\n if (typeof count === 'string' && count.length > 0) {\n const lastChar = count[count.length - 1].toLocaleUpperCase();\n if (['B', 'M', 'K'].includes(lastChar)) return count;\n }\n\n var num;\n const parsedCount = parseFloat(count);\n if (parsedCount <= 1) {\n return parsedCount.toFixed(2);\n } else if (parsedCount > 9999 && parsedCount <= 999999) {\n num = parsedCount / 1000;\n if (num % 1 != 0) {\n num = num.toFixed(2);\n }\n return num + 'K';\n } else if (parsedCount > 999999) {\n num = parsedCount / 1000000;\n if (num % 1 != 0) {\n num = num.toFixed(2);\n }\n return num + 'M';\n } else if (parsedCount > 999999999) {\n num = parsedCount / 1000000000;\n if (num % 1 != 0) {\n num = num.toFixed(2);\n }\n return num + 'B';\n } else if (parsedCount === NaN) {\n return count;\n } else if (parsedCount && count % 1 != 0) {\n return count.toFixed(2);\n } else {\n return count;\n }\n }\n\n formatEngagementRate(count) {\n const num = (parseFloat(count) * 100).toFixed(2);\n return num + '%';\n }\n render() {\n let {\n classes,\n selectedPrediction,\n setSelectedPrediction,\n selectedObjectiveType,\n amount,\n reset,\n showOther,\n } = this.props;\n return (\n \n
\n
\n \n {selectedObjectiveType == 'Reach' && (\n \n PREDICTION You could\n reach{' '}\n \n {!reset ? this.formatCount(selectedPrediction.reach) : 0}\n \n {' '}\n Users with{' '}\n \n ₹ {!reset ? this.formatCount(selectedPrediction.max_price) : 0}{' '}\n \n
\n )}\n {selectedObjectiveType == 'CPV' && (\n \n PREDICTION You could\n reach{' '}\n \n {!reset ? this.formatCount(selectedPrediction.reach) : 0}\n \n {' '}\n Users with{' '}\n \n ₹ {!reset ? this.formatCount(selectedPrediction.max_price) : 0}{' '}\n {' '}\n at an average CPV of{' '}\n \n {selectedPrediction.max_price && !reset\n ? this.formatCount(selectedPrediction.views / selectedPrediction.max_price)\n : '0'}\n \n
\n )}\n\n {selectedObjectiveType == 'Engagement Rate' && (\n \n PREDICTION You could\n engage with{' '}\n \n {!reset ? this.formatCount(selectedPrediction.enagaged_users) : 0}\n \n {' '}\n Users with{' '}\n \n ₹ {!reset ? this.formatCount(selectedPrediction.max_price) : 0}{' '}\n \n
\n )}\n \n \n \n {selectedObjectiveType == 'Reach' && (\n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.reach) : 0}\n \n \n Reach\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.views) : 0}\n \n \n Views\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.enagaged_users) : 0}\n \n \n Engaged Users\n \n \n \n \n \n \n {selectedPrediction.followers && !reset\n ? this.formatEngagementRate(\n selectedPrediction.enagaged_users / selectedPrediction.followers,\n )\n : '0.00%'}\n \n \n Eng. Rate\n \n \n \n \n )}\n {selectedObjectiveType == 'CPV' && (\n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.views) : 0}\n \n \n Views\n \n \n \n \n \n \n ₹\n {selectedPrediction.max_price && !reset\n ? this.formatCount(\n selectedPrediction.views / selectedPrediction.max_price,\n )\n : '0'}\n \n \n Cost per view\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.reach) : 0}\n \n \n Reach\n \n \n \n \n \n \n {selectedPrediction.followers && !reset\n ? this.formatEngagementRate(\n selectedPrediction.enagaged_users / selectedPrediction.followers,\n )\n : '0.00%'}\n \n \n Engagement rate\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.enagaged_users) : 0}\n \n \n Engaged users\n \n \n \n \n )}\n {selectedObjectiveType == 'Engagement Rate' && (\n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.enagaged_users) : 0}\n \n \n Engaged users\n \n \n \n \n \n \n {selectedPrediction.followers && !reset\n ? this.formatEngagementRate(\n selectedPrediction.enagaged_users / selectedPrediction.followers,\n )\n : '0.00%'}\n \n \n Engagement rate\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.reach) : 0}\n \n \n Reach\n \n \n \n \n \n \n {!reset ? this.formatCount(selectedPrediction.views) : 0}\n \n \n Views\n \n \n \n \n \n \n ₹\n {selectedPrediction.max_price && !reset\n ? this.formatCount(\n selectedPrediction.enagaged_users / selectedPrediction.max_price,\n )\n : '0'}\n \n \n Cost per Engagement\n \n \n \n \n )}\n \n \n
\n
\n
\n \n \n \n Spend \n {/* {!showOther && } */}\n \n \n \n ₹ {!reset ? this.formatCount(selectedPrediction.max_price) : 0}\n \n \n \n
\n
\n \n \n \n \n \n {!reset ? selectedPrediction.mega.count : 0}{' '}\n \n Mega\n \n \n ₹{!reset ? this.formatCount(selectedPrediction.mega.amount) : 0}\n \n
\n \n \n \n \n \n {!reset ? selectedPrediction.macro.count : 0}{' '}\n \n Macro\n \n \n ₹{!reset ? this.formatCount(selectedPrediction.macro.amount) : 0}\n \n
\n {/* \n \n {selectedPrediction.macro.count} Macro \n \n \n ₹{this.formatCount(selectedPrediction.macro.amount)} \n \n */}\n \n \n \n \n \n {!reset ? selectedPrediction.micro.count : 0}{' '}\n \n Micro\n \n \n ₹{!reset ? this.formatCount(selectedPrediction.micro.amount) : 0}\n \n
\n {/* \n \n \n \n \n \n */}\n \n \n \n \n \n {!reset ? selectedPrediction.nano.count : 0}{' '}\n \n Nano\n \n \n ₹{!reset ? this.formatCount(selectedPrediction.nano.amount) : 0}\n \n
\n {/* \n \n \n {!reset ? selectedPrediction.nano.count : 0}{\" \"}\n \n Nano\n \n \n \n ₹\n {!reset\n ? this.formatCount(selectedPrediction.nano.amount)\n : 0}\n \n \n */}\n \n \n \n
\n
\n
\n );\n }\n}\n\nconst styles = {\n root: {\n width: '100%',\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n reco_box: {\n // justifyContent: 'space-evenly',\n // alignItems: 'center'\n background: '#FFFFFF',\n // padding:10,\n height: 280,\n maxHeight: 280,\n borderRadius: 10,\n boxShadow: '3px 5px 20px rgba(131, 131, 131, 0.25)',\n borderRadius: '10px',\n },\n reco_text: {\n padding: 20,\n margin: 20,\n fontSize: 24,\n fontWeight: 400,\n width: '90%',\n },\n reco_stats: {\n margin: 20,\n fontSize: 24,\n fontWeight: 600,\n width: '90%',\n },\n reco_data: {\n // margin: 20,\n fontSize: 26,\n fontWeight: 400,\n textAlign: 'left',\n },\n yellow_text: {\n color: '#FEBD1C',\n fontWeight: 700,\n },\n grid_border: {\n width: '100%',\n border: '1px solid #D4D4D4',\n },\n stats_value: {\n padding: 10,\n },\n stats_labels: {\n fontWeight: 400,\n fontSize: 16,\n color: '#757575',\n },\n grey_text: {\n fontWeight: 400,\n fontSize: 18,\n color: '#757575',\n textAlign: 'left',\n },\n circular_div: {\n // margin:20,\n // padding:50,\n fontSize: 16,\n fontWeight: 300,\n position: 'relative',\n alignItems: 'center',\n },\n green_circle: {\n marginTop: -60,\n marginLeft: -20,\n height: 170,\n width: 170,\n borderRadius: 85,\n backgroundColor: '#d9fce0',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n red_circle: {\n height: 150,\n width: 150,\n borderRadius: 75,\n backgroundColor: '#FCD9E8',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n },\n blue_circle: {\n marginTop: -40,\n height: 130,\n width: 130,\n borderRadius: 65,\n backgroundColor: '#CEEBFF',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 1,\n position: 'relative',\n },\n yellow_circle: {\n marginLeft: -20,\n marginBottom: -40,\n height: 100,\n width: 100,\n borderRadius: '50%',\n backgroundColor: '#FDEABB',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n zIndex: 2,\n position: 'relative',\n },\n circle_text_1: {\n fontSize: 20,\n fontWeight: 700,\n },\n circle_text_2: {\n fontSize: 20,\n fontWeight: 700,\n },\n font12: {\n fontSize: 12,\n },\n};\n\nexport default withStyles(styles)(Recommendation);\n// export default Recommendation\n","import { Typography, Grid } from \"@material-ui/core\";\nimport { useTheme } from \"@material-ui/core/styles\";\nimport { withStyles, Theme, makeStyles } from \"@material-ui/core/styles\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\n\nimport CategoryChip from \"./components/CategoryChip\";\n\nconst HtmlTooltip = withStyles((theme: Theme) => ({\n tooltip: {\n backgroundColor: \"#3A3A3A\",\n color: \"white\",\n borderRadius: \"2px\",\n maxWidth: 220,\n width: 120,\n fontSize: theme.typography.pxToRem(12),\n border: \"1px solid #dadde9\",\n },\n arrow: {\n color: \"#3A3A3A\",\n },\n}))(Tooltip);\n\nfunction CategoryContainer({ categories, primary_category }) {\n const classes = useStyles();\n const theme = useTheme();\n const colors = [\n theme.palette.primary.main,\n theme.palette.secondary.main,\n theme.palette.info.main,\n theme.palette.warning.main,\n ];\n\n return (\n \n {primary_category ?\n \n \n \n : null}\n {categories.slice(0, 3).map((name, i) => (\n \n \n \n ))}\n {categories.length > 3 ? (\n \n {categories.slice(3).map((key, i) => (\n \n {key} \n
\n ))}\n >\n }\n arrow\n placement=\"right-start\"\n >\n \n \n \n \n
\n \n ) : (\n \"\"\n )}\n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n // background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n // boxShadow: '-1px 1px 2px rgba(227, 228, 234, 0.2), 1px -1px 2px rgba(227, 228, 234, 0.2), -1px -1px 2px rgba(251, 252, 255, 0.9), 1px 1px 3px rgba(227, 228, 234, 0.9), inset 1px 1px 2px rgba(251, 252, 255, 0.3), inset -1px -1px 2px rgba(227, 228, 234, 0.5)',\n borderRadius: 5,\n height: 50,\n // justifyContent: 'space-evenly',\n alignItems: \"center\",\n },\n}));\n\nexport default CategoryContainer;\n","import { Typography, Grid, Avatar } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\n// import AvatarImage from \"assets/discovery/inf-avatar.png\"\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nfunction InfoCard({ name, gender, language, picture, age_group }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n {name}\n \n {language} \n \n \n \n \n \n \n {gender == 'FEMALE' ? 'F' : 'M'} | {age_group} yrs\n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: 'linear-gradient(118.02deg, rgba(239, 26, 116, 0.57) 32.63%, #FEBD1C 94.6%)',\n boxShadow: '2px 5px 10px rgba(143, 143, 143, 0.25)',\n borderRadius: 10,\n height: 130,\n width: 250,\n justifyContent: 'space-around',\n alignItems: 'center',\n marginRight: 50,\n },\n aboutContainer: {\n color: 'white',\n },\n genderIcon: {\n height: 13,\n width: 13,\n },\n genderInfo: {\n fontSize: 10,\n color: 'white',\n },\n avatar: {\n height: 95,\n width: 95,\n position: 'initial',\n },\n inf_name: {\n fontSize: 16,\n fontWeight: 400,\n },\n language: {\n color: 'white',\n textAlign: 'left',\n marginTop: 5,\n marginBottom: 5,\n fontSize: 12,\n },\n}));\n\nexport default InfoCard;\n","import { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport { Typography, Grid } from '@material-ui/core';\nimport AddIcon from '@material-ui/icons/Add';\nimport DoneIcon from '@material-ui/icons/Done';\n\nimport Button from 'components/Theme/Elements/Button';\n\nimport CategoryContainer from '../CategoryContainer';\nimport InstagramRectIconButton from '../InstagramRectIconButton';\nimport YouTubeIconButton from 'components/Discovery/components/YouTubeIconButton';\n\nimport InfoCard from './components/InfoCard';\nimport DetailViewModal from './components/DetailViewModal';\nimport Checkbox from '@mui/material/Checkbox';\nimport { maxWidth } from '@mui/system';\n\nclass InfluencerInfoCard extends Component {\n constructor(props) {\n super(props);\n\n this.setDetailViewOpened = this.setDetailViewOpened.bind(this);\n\n this.state = {\n detailViewOpened: false,\n is_checked: false,\n // brand_final_price: 25000,\n // influencer_final_price: 15000,\n deliverables: [\n { name: 'Instagram Reel' },\n { name: 'Instagram Post' },\n { name: 'Instagram Static' },\n { name: 'Instagram Story' },\n { name: 'Instagram TV' },\n { name: 'Instagram Live' },\n ],\n };\n }\n setDetailViewOpened(boolean) {\n this.setState({ detailViewOpened: boolean });\n }\n\n handleSelection(e) {\n // e.preventDefault()\n // console.log(this.props.selectedInfluencer.includes(this.props.influencer))\n const current_prediction = this.props.selectedPrediction;\n if (this.props.selectedInfluencer.includes(this.props.id)) {\n // e.preventDefault()\n\n // console.log(this.props.selectedPrediction,this.props.prediction.Reach,this.props.prediction,current_prediction['enagaged_users'],this.props.prediction.enagaged_users)\n if (this.props.platform === 'instagram') {\n if (this.props.prediction.followers < 10000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.6;\n }\n if (this.props.prediction.followers >= 10000 && this.props.prediction.followers <= 100000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.5;\n }\n if (this.props.prediction.followers > 100000 && this.props.prediction.followers <= 500000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.4;\n }\n if (this.props.prediction.followers > 500000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.3;\n }\n } else {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.views * 1.37;\n }\n current_prediction['views'] = current_prediction['views'] - this.props.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] - this.props.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] - this.props.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] - this.props.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] - this.props.prediction.max_price;\n if (this.props.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] - 1,\n amount: current_prediction['micro']['amount'] - this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] - 1,\n amount: current_prediction['mega']['amount'] - this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] - 1,\n amount: current_prediction['nano']['amount'] - this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] - 1,\n amount: current_prediction['macro']['amount'] - this.props.prediction.max_price,\n };\n }\n\n // console.log(current_prediction)\n const influencers = this.props.selectedInfluencer;\n influencers.splice(influencers.indexOf(this.props.id), 1);\n this.props.setSelectedInfluencer(influencers);\n // console.log(this.props.selectedInfluencer)\n } else {\n // console.log(this.props.selectedPrediction,this.props.prediction.Reach,this.props.prediction,current_prediction['enagaged_users'],this.props.prediction.enagaged_users)\n if (this.props.platform === 'instagram') {\n if (this.props.prediction.followers < 10000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.6;\n }\n if (this.props.prediction.followers >= 10000 && this.props.prediction.followers <= 100000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.5;\n }\n if (this.props.prediction.followers > 100000 && this.props.prediction.followers <= 500000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.4;\n }\n if (this.props.prediction.followers > 500000) {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.followers * 0.3;\n }\n } else {\n current_prediction['reach'] =\n current_prediction['reach'] + this.props.prediction.views * 1.37;\n }\n current_prediction['views'] = current_prediction['views'] + this.props.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + this.props.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + this.props.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + this.props.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + this.props.prediction.max_price;\n if (this.props.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] + 1,\n amount: current_prediction['mega']['amount'] + this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + this.props.prediction.max_price,\n };\n }\n if (this.props.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + this.props.prediction.max_price,\n };\n }\n // console.log(current_prediction)\n\n // console.log(this.props.selectedInfluencer)\n this.props.setSelectedInfluencer(this.props.selectedInfluencer.concat(this.props.id));\n // console.log(this.props.selectedInfluencer)\n }\n this.props.setSelectedPrediction(current_prediction);\n }\n render() {\n \n let {\n classes,\n id,\n name,\n gender,\n language,\n picture,\n age_group,\n country,\n followers,\n engagement_rate,\n avg_views,\n audience_gender,\n url,\n interests = [],\n interest_categories,\n fair_price,\n paid_post_performance,\n influencer,\n prediction,\n price_score,\n speed_score,\n impact_score,\n selectedInfluencer,\n setSelectedInfluencer,\n selectedPrediction,\n setSelectedPrediction,\n allowedColumns,\n platform,\n audience_age_split,\n location,\n audience_location_split,\n staff_status,\n contact_details,\n email_details,\n actual_price,\n checkLimit,\n primary_category,\n brand_final_price,\n influencer_final_price,\n deliverables,\n } = this.props;\n let {\n // brand_final_price,\n // influencer_final_price,\n // deliverables,\n } = this.state;\n // console.log(selectedInfluencer,selectedPrediction, \"maaz\",selectedInfluencer.indexOf(influencer) > -1, influencer)\n let is_checked = selectedInfluencer.indexOf(id) > -1 ? true : false;\n return (\n \n \n \n \n {\n this.handleSelection();\n }}\n checked={is_checked}\n />\n \n \n {\n window.open(url, '_blank');\n }}\n platform={this.props.platform}\n />\n \n \n \n this.setDetailViewOpened(true)}\n >\n \n \n this.setDetailViewOpened(true)}\n style={{ cursor: 'pointer' }}\n >\n \n {/* */}\n {/* {window.open(url, \"_blank\")}}/> */}\n {/* */}\n {Object.values(allowedColumns).includes('Speed Score') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n {speed_score} \n \n \n ) : (\n ''\n )}\n {/* {Object.values(allowedColumns).includes(\"Price Score\") ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n \n {price_score}\n \n
\n \n ):(\"\")} */}\n {Object.values(allowedColumns).includes('Impact Score') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n \n {impact_score}\n \n
\n \n ) : (\n ''\n )}\n {Object.values(allowedColumns).includes('Followers') ||\n Object.values(allowedColumns).length === 0 ? (\n \n {followers} \n \n ) : (\n ''\n )}\n {Object.values(allowedColumns).includes('Engagement Rate') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n {engagement_rate}\n \n \n ) : (\n ''\n )}\n {Object.values(allowedColumns).includes('Average Views') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n {avg_views}\n \n \n ) : (\n ''\n )}\n {Object.values(allowedColumns).includes('Audience Gender') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n \n \n {audience_gender?.percentage??\"\"}\n \n \n \n \n {audience_gender?.gender??\"\"}\n \n \n \n \n ) : (\n ''\n )}\n {/* */}\n {/* */}\n {/* {paid_post_performance} */}\n {/* */}\n {/* */}\n\n {/* \n \n ₹{fair_price}\n \n */}\n {/* */}\n {/* */}\n {Object.values(allowedColumns).includes('Fair Price') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n {fair_price}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Interest Category') ? (\n \n \n interest.name,\n )}\n />\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Channel') ? (\n \n {platform ? (\n \n {\n window.open(url, '_blank');\n }}\n platform={this.props.platform}\n />\n \n ) : (\n ''\n )}\n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Language') ? (\n \n \n {language}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Audience Age') ? (\n \n \n {audience_age_split.find((o) => o.percentage) ? \n audience_age_split.find((o) => o.percentage).code \n : \"\"}\n\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Influencer Location') ? (\n \n \n {location}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Interest') ? (\n \n {interests.slice(0, 3).map((interest) => (\n \n \n \n {interest.name}\n \n \n \n ))}\n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Audience Location') ? (\n \n {'cities' in audience_location_split\n ? audience_location_split.cities.slice(0, 3).map((o) => (\n \n \n \n {o.name}:{(o.weight * 100).toFixed(2)}%\n \n \n \n ))\n : ''}\n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Influencer Gender') ? (\n \n \n {gender}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Influencer Age') ? (\n \n \n {age_group}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Country') ||\n Object.values(allowedColumns).length === 0 ? (\n \n \n {country}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Contact Number') ? (\n \n \n {contact_details}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Email') ? (\n \n {email_details.indexOf('custom') === -1 &&\n email_details.indexOf(contact_details) === -1 ? (\n \n \n \n {email_details.split('@')[0]}\n \n \n @{email_details.split('@')[1]}\n \n \n \n ) : (\n 'NA'\n )}\n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Actual Price') ? (\n \n {!([null, undefined].includes(actual_price)) ? (\n \n \n \n {actual_price['deliverables']}: ₹{actual_price['actual_price']}\n \n \n \n ) : (\n ''\n )}\n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Brand Final Price') ? (\n \n \n ₹{brand_final_price}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Influencer Final Price') ? (\n \n \n ₹{influencer_final_price}\n \n \n ) : (\n ''\n )}\n\n {Object.values(allowedColumns).includes('Deliverables') ? (\n \n {deliverables.slice(0, 5).map((deliverable) => (\n \n \n \n {deliverable.name}\n \n \n \n ))}\n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n {/* */}\n {/* */}\n {/* */}\n {/* {selectedInfluencer.includes(influencer) ? */}\n {/* */}\n {/* */}\n {/* : */}\n {/* */}\n {/* */}\n {/* */}\n {/* } */}\n {/* */}\n {/* */}\n {/* setDetailViewOpened(true)}> */}\n {/* View Details */}\n {/* */}\n {this.state.detailViewOpened ? (\n \n ) : null}\n {/* */}\n {/* */}\n {/* */}\n \n );\n }\n}\n\nconst styles = {\n root: {\n background: '#FFFFFF',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n flexGrow: 1,\n height: 150,\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 20,\n padding: 10,\n },\n cardBox: {\n flexGrow: 0,\n maxWidth: '20%',\n flexBasis: '20%',\n },\n statsContainer: {\n paddingRight: 45,\n marginBottom: 30,\n },\n categoryContainer: {\n // marginLeft: 100,\n color: '#4A4A4A',\n },\n addButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n },\n checkButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n background: '#82E900',\n '&.MuiButton-containedPrimary:hover': {\n background: '#179020',\n },\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n speed: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n textAlign: 'center',\n flex: 1,\n marginTop: 0,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#6CBF02',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n price: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#FEBD1C',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n impact: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#FC2E2E',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n followers: {\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n color: '#4A4A4A',\n fontSize: 16,\n },\n subtitles: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '0.1px',\n width: 100,\n },\n subtitles2: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 10,\n },\n subtitlesInterest: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '12px',\n width: 100,\n },\n actualPrice: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '12px',\n width: 100,\n },\n emailDetails: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '10px',\n width: 100,\n },\n audienceLocation: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '12px',\n width: 100,\n },\n};\n\nexport default withStyles(styles)(InfluencerInfoCard);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { Typography, Container, Grid } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\n\nimport { USE_PLANNER_ES } from 'config'\n\nimport Header from './components/Header';\nimport Filters from './components/Filters';\nimport ListHeader from './components/ListHeader';\nimport ActionFilter from './components/ActionFilter';\nimport Recommendation from './components/Recommendation';\nimport InfluencerInfoCard from './components/InfluencerInfoCard';\nimport { ThemeProvider, Chip } from '@material-ui/core';\nimport Loading from 'components/Common/Loading/Loading';\nimport { getPlannerInfluencers, getPlannerDownload } from 'api_handlers/discovery';\nimport { getPlannerInfluencersES } from 'api_handlers/es';\nimport themeV2 from 'themeV2';\n\nimport { getInfluencers } from 'actions/discovery';\n\nlet plannerFetchAPI = getPlannerInfluencers;\nif (USE_PLANNER_ES) plannerFetchAPI = getPlannerInfluencersES\n\nclass Planner extends Component {\n // function Planner({ fetchInfluencers, prediction }) {\n constructor(props) {\n super(props);\n this.scrollRef = React.createRef();\n this.setSelectedInfluencer = this.setSelectedInfluencer.bind(this);\n this.setSelectedPrediction = this.setSelectedPrediction.bind(this);\n this.checkEnd = this.checkEnd.bind(this);\n this.loadData = this.loadData.bind(this);\n this.fetchMoreData = this.fetchMoreData.bind(this);\n this.setSelectedObjective = this.setSelectedObjective.bind(this);\n this.setSelectedObjectiveType = this.setSelectedObjectiveType.bind(this);\n this.setSelectedFilter = this.setSelectedFilter.bind(this);\n this.setChannel = this.setChannel.bind(this);\n this.setShowModal = this.setShowModal.bind(this);\n this.setIsLoading = this.setIsLoading.bind(this);\n this.setShowLoading = this.setShowLoading.bind(this);\n this.setInfluencer = this.setInfluencer.bind(this);\n this.setInfluencersCount = this.setInfluencersCount.bind(this);\n this.setRecommendation = this.setRecommendation.bind(this);\n this.setImpactData = this.setImpactData.bind(this);\n this.setUserData = this.setUserData.bind(this);\n this.setPayload = this.setPayload.bind(this);\n this.setPage = this.setPage.bind(this);\n this.setlistSelect = this.setlistSelect.bind(this);\n this.setReset = this.setReset.bind(this);\n this.setSortBy = this.setSortBy.bind(this);\n this.setSortOrder = this.setSortOrder.bind(this);\n this.getPlannerInfluencersData = this.getPlannerInfluencersData.bind(this);\n this.allowedCardColumns = this.allowedCardColumns.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.handleBackToTopClick = this.handleBackToTopClick.bind(this);\n this.showColumnSelectModal = this.showColumnSelectModal.bind(this);\n this.setRecommendationCalculation = this.setRecommendationCalculation.bind(this);\n\n this.state = {\n selectedInfluencer: [],\n selectedPrediction: {\n reach: 0,\n views: 0,\n engagement_rate: 0,\n enagaged_users: 0,\n followers: 0,\n max_price: 0,\n mega: {\n count: 0,\n amount: 0,\n },\n macro: {\n count: 0,\n amount: 0,\n },\n micro: {\n count: 0,\n amount: 0,\n },\n nano: {\n count: 0,\n amount: 0,\n },\n },\n amount: 100000,\n selectedObjective: '',\n page: 1,\n selectedObjectiveType: '',\n selectedFilter: '',\n channel: [],\n sortBy: '',\n sortOrder: 'asc',\n listselect: false,\n reset: false,\n modal: false,\n isLoading: false,\n showLoading: false,\n influencers: [],\n influencersCount: 0,\n recommendation: [],\n impact_data: {},\n user: {},\n columns: [],\n default: true,\n checkLimit: 0,\n payload: {\n 'campaign-level-requirements': {},\n 'creator-level-requirements': {},\n 'advance-filters': {},\n setReset: false,\n },\n isPlanActive: false,\n showOther: false,\n isVisible: false,\n isColumnSelected: false,\n isNotEnd:true\n };\n }\n\n scrollToElement = () => {\n this.scrollRef.current?.scrollIntoView();\n };\n\n allowedCardColumns(column, isDefault, removedItem, checkLimit) {\n if (!isDefault) {\n if (this.state.columns.length === 0) {\n this.setState({\n columns: Array.from(new Set(this.state.columns.concat(column))),\n default: false,\n checkLimit: checkLimit,\n });\n } else {\n this.state.columns = this.state.columns.filter((c) => !removedItem.includes(c));\n this.setState({\n columns: Array.from(new Set(this.state.columns.concat(column))),\n default: false,\n checkLimit: checkLimit,\n });\n }\n } else {\n this.setState({\n default: true,\n columns: [\n 'Country',\n 'Speed Score',\n 'Average Views',\n 'Price Score',\n 'Fair Price',\n 'Impact Score',\n 'Followers',\n 'Engagement Rate',\n 'Audience Gender',\n ],\n checkLimit: checkLimit,\n });\n }\n }\n\n async getPlannerInfluencersData(payload) {\n if (this.state.isLoading) {\n return;\n }\n this.setState({ isPlanActive: true });\n try {\n let influencers = [];\n this.setPage(1);\n this.setIsLoading(true);\n this.setShowLoading(true);\n this.setPayload(payload);\n let resp = await plannerFetchAPI(payload, 1);\n let data = await resp.json();\n if (!data.payload) {\n this.setIsLoading(false);\n return console.log('payload not set');\n }\n this.setPayload(data.payload);\n if (data.payload && this.state.payload['setReset'] === true) {\n this.setInfluencer([...data.recommendation, ...data.results]);\n this.setRecommendation([]);\n } else {\n this.setInfluencer(data.results);\n this.setRecommendation(data.recommendation);\n }\n this.setInfluencersCount(data.count);\n this.setUserData(data.user);\n this.setImpactData(data.payload.impact_data);\n this.setPage(this.state.page + 1);\n this.setSelectedPrediction({\n reach: 0,\n views: 0,\n engagement_rate: 0,\n enagaged_users: 0,\n followers: 0,\n max_price: 0,\n mega: {\n count: 0,\n amount: 0,\n },\n macro: {\n count: 0,\n amount: 0,\n },\n micro: {\n count: 0,\n amount: 0,\n },\n nano: {\n count: 0,\n amount: 0,\n },\n });\n this.setSelectedInfluencer([]);\n this.setState({ showOther: false });\n this.setIsLoading(false);\n this.setShowLoading(false);\n this.setRecommendationCalculation();\n console.log('=== data.links.next fetchMoreData', data.links.next);\n if (data.links.next) {\n console.log('fetchMoreData')\n await this.fetchMoreData();\n } else {\n this.setState({ showOther: true });\n }\n // if (data.recommendation.length < 20) {\n // this.setState({ showOther: true });\n // }\n } catch (e) {\n this.setIsLoading(false);\n this.setShowLoading(false);\n }\n // this.scrollToElement();\n }\n\n setPage(page) {\n this.setState({ page: page });\n }\n\n setlistSelect() {\n this.setState({ listSelect: !this.state.listSelect });\n }\n\n setReset(isReset) {\n if (isReset === true) {\n this.setState({\n reset: true,\n });\n } else {\n this.setState({ reset: false });\n }\n }\n\n setSortBy(sortBy) {\n this.setState({ sortBy: sortBy });\n }\n\n setSortOrder(sortOrder) {\n this.setState({ sortOrder: sortOrder });\n }\n\n setPayload(payload) {\n this.setState({ payload: payload });\n }\n\n setRecommendation(recommendation) {\n let recommendation_dict = {};\n let recommendation_list = [];\n recommendation.map((influencer) => {\n if (!recommendation_dict[influencer.id]) {\n recommendation_dict[influencer.id] = 1;\n recommendation_list.push(influencer);\n }\n });\n this.setState({ recommendation: recommendation_list });\n }\n\n setImpactData(impact_data) {\n this.setState({ impact_data: impact_data });\n }\n\n setUserData(user) {\n this.setState({ user: user });\n }\n\n setInfluencersCount(influencersCount) {\n this.setState({ influencersCount: influencersCount });\n }\n\n setInfluencer(influencers) {\n let influencers_dict = {};\n let influencers_list = [];\n influencers.map((influencer) => {\n if (!influencers_dict[influencer.id]) {\n influencers_dict[influencer.id] = 1;\n influencers_list.push(influencer);\n }\n });\n if (this.state.payload && this.state.payload['advance-filters'] && this.state.payload['advance-filters'].sortBy && this.state.payload['advance-filters'].sortOrder) {\n influencers_list = influencers_list.sort((a, b)=>{\n return b.followers_count - a.followers_count\n })\n }\n this.setState({ influencers: influencers_list });\n }\n\n setIsLoading(isLoading) {\n this.setState({ isLoading: isLoading });\n }\n\n setShowLoading(showLoading) {\n this.setState({ showLoading: showLoading });\n }\n\n setShowModal(modal) {\n this.setState({ modal: modal });\n }\n\n setChannel(channel) {\n this.setState({ channel: channel });\n }\n\n setSelectedFilter(selectedFilter) {\n this.setState({ selectedFilter: selectedFilter });\n }\n\n setSelectedObjectiveType(selectedObjectiveType) {\n this.setState({ selectedObjectiveType: selectedObjectiveType });\n }\n\n setSelectedObjective(selectedObjective) {\n this.setState({ selectedObjective: selectedObjective });\n }\n\n setSelectedInfluencer(selectedInfluencer) {\n this.setState({ selectedInfluencer: selectedInfluencer });\n }\n\n setSelectedPrediction(selectedPrediction) {\n this.setState({ selectedPrediction: selectedPrediction });\n }\n\n showColumnSelectModal(columnSelected) {\n this.setState({ isColumnSelected: columnSelected });\n }\n\n checkEnd() {\n console.log('scrolling');\n if (\n window.innerHeight + window.scrollY >=\n (document.body.offsetHeight * this.settings.scrollAfterPercentage) / 100\n ) {\n console.log('get next page');\n }\n }\n\n async loadData() {\n if (this.state.isLoading) {\n return;\n }\n try {\n this.setIsLoading(true);\n this.setShowLoading(true);\n let resp = await plannerFetchAPI(this.state.payload, 1);\n let data = await resp.json();\n if (!data.payload) {\n this.setIsLoading(false);\n return console.log('payload not set');\n }\n this.setPayload(data.payload);\n if (data.payload && this.state.payload['setReset'] === true) {\n this.setInfluencer([...data.recommendation, ...data.results]);\n this.setRecommendation([]);\n } else {\n this.setInfluencer(data.results);\n this.setRecommendation(data.recommendation);\n }\n this.setInfluencersCount(data.count);\n this.setImpactData(data.payload.impact_data);\n this.setUserData(data.user);\n this.setPage(this.state.page + 1);\n this.setIsLoading(false);\n this.setShowLoading(false);\n if (data?.recommendation.length < 20 || data?.recommendation.length <= 0) {\n this.setState({ showOther: true });\n }\n } catch (e) {\n this.setIsLoading(false);\n this.setShowLoading(false);\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.isColumnSelected !== this.state.isColumnSelected) {\n this.setState({ isColumnSelected: this.state.isColumnSelected });\n }\n }\n\n componentDidMount() {\n this.loadData();\n window.addEventListener('scroll', this.handleScroll);\n }\n\n componentWillUnmount() {\n window.removeEventListener('scroll', this.handleScroll);\n }\n\n handleScroll() {\n if (window.pageYOffset > 200) {\n this.setState({ isVisible: true });\n } else {\n this.setState({ isVisible: false });\n }\n }\n\n handleBackToTopClick() {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n }\n\n async setRecommendationCalculation() {\n let influencers = this.state.selectedInfluencer;\n const current_prediction = this.state.selectedPrediction;\n this.state.recommendation.map((influencer) => {\n if (!this.state.selectedInfluencer.includes(influencer.id)) {\n influencers.push(influencer.id);\n if (influencer.platform === 'instagram') {\n if (influencer.prediction.followers < 10000) {\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.followers * 0.6;\n }\n if (\n influencer.prediction.followers >= 10000 &&\n influencer.prediction.followers <= 100000\n ) {\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.followers * 0.5;\n }\n if (\n influencer.prediction.followers > 100000 &&\n influencer.prediction.followers <= 500000\n ) {\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.followers * 0.4;\n }\n if (influencer.prediction.followers > 500000) {\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.followers * 0.3;\n }\n } else {\n current_prediction['reach'] =\n current_prediction['reach'] + influencer.prediction.views * 1.37;\n }\n current_prediction['views'] =\n current_prediction['views'] + influencer.prediction.views;\n current_prediction['enagaged_users'] =\n current_prediction['enagaged_users'] + influencer.prediction.enagaged_users;\n current_prediction['followers'] =\n current_prediction['followers'] + influencer.prediction.followers;\n current_prediction['engagement_rate'] =\n current_prediction['engagement_rate'] + influencer.prediction.engagement_rate;\n current_prediction['max_price'] =\n current_prediction['max_price'] + influencer.prediction.max_price;\n if (influencer.prediction.creator_type == 'micro') {\n current_prediction['micro'] = {\n count: current_prediction['micro']['count'] + 1,\n amount: current_prediction['micro']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'mega') {\n current_prediction['mega'] = {\n count: current_prediction['mega']['count'] + 1,\n amount: current_prediction['mega']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'nano') {\n current_prediction['nano'] = {\n count: current_prediction['nano']['count'] + 1,\n amount: current_prediction['nano']['amount'] + influencer.prediction.max_price,\n };\n }\n if (influencer.prediction.creator_type == 'macro') {\n current_prediction['macro'] = {\n count: current_prediction['macro']['count'] + 1,\n amount: current_prediction['macro']['amount'] + influencer.prediction.max_price,\n };\n }\n }\n });\n this.setSelectedInfluencer(influencers);\n this.setSelectedPrediction(current_prediction);\n }\n\n async fetchMoreData() {\n console.log('Fetch more data called', this.state.isLoading);\n if (this.state.isLoading) {\n return;\n }\n console.log(\n 'this.state.page * 10 > this.state.influencersCount',\n this.state.page * 10,\n this.state.influencersCount,\n );\n if (this.state.page * 10 > this.state.influencersCount) {\n return;\n }\n try {\n this.setIsLoading(true);\n console.log('API called');\n let resp = await plannerFetchAPI(this.state.payload, this.state.page);\n let data = await resp.json();\n \n\n console.log('response got');\n if (!data.payload) {\n this.setIsLoading(false);\n return console.log('payload not set');\n }\n this.setPayload(data.payload);\n if (data.payload && this.state.payload['setReset'] === true) {\n this.setInfluencer([...this.state.influencers, ...data.recommendation, ...data.results]);\n this.setInfluencersCount(this.state.influencersCount);\n this.setRecommendation([]);\n } else {\n this.setInfluencer([...this.state.influencers, ...data.results]);\n this.setInfluencersCount(data.count);\n this.setRecommendation([...this.state.recommendation, ...data.recommendation]);\n }\n this.setImpactData(data.payload.impact_data);\n if(data.links.next!==null){\n this.setPage(this.state.page + 1);\n }else{\n this.setState({isNotEnd:false})\n }\n this.setIsLoading(false);\n \n console.log('state set', data && data.recommendation && data.recommendation.length > 0);\n if (data && data.recommendation && data.recommendation.length > 0) {\n console.log('!this.state.showOther', !this.state.showOther);\n // if (!this.state.showOther && this.state.page <= 10) {\n if (!this.state.showOther) {\n this.setRecommendationCalculation();\n if (data.links.next) {\n setTimeout(async ()=>{\n await this.fetchMoreData();\n }, 2000);\n } else {\n this.setState({ showOther: true });\n }\n // if (data.recommendation.length < 20) {\n // this.setState({ showOther: true });\n // }\n }\n } else {\n this.setState({ showOther: true });\n }\n \n } catch (e) {\n console.log(e);\n this.setIsLoading(false);\n }\n }\n\n render() {\n let { classes } = this.props;\n\n let {\n selectedObjective,\n selectedFilter,\n channel,\n selectedInfluencer,\n selectedPrediction,\n selectedObjectiveType,\n amount,\n influencersCount,\n recommendation,\n influencers,\n modal,\n listSelect,\n sortBy,\n sortOrder,\n isPlanActive,\n showOther,\n user,\n payload,\n isColumnSelected,\n } = this.state;\n\n return (\n \n {this.state.showLoading && }\n \n \n \n \n \n \n \n \n \n \n \n {selectedObjectiveType && (\n \n \n \n )}\n \n \n
\n {isPlanActive && payload['setReset'] === false ? (\n \n \n Top Recommendations\n \n \n \n ) : null}\n {payload['setReset'] === false ? (\n \n \n Loading...}\n style={{ padding: 20 }}\n endMessage={\n isPlanActive ? (\n \n No More Recommended Profiles Found. \n
\n ) : (\n ''\n )\n }\n >\n {recommendation.map((recommend, index) => (\n \n \n \n ))}\n \n \n \n ) : null}\n {isPlanActive && showOther && this.state.payload['setReset'] === false ? (\n \n \n Other Influencers\n \n \n ) : null}\n {showOther ? (\n \n \n Loading...}\n style={{ padding: 20 }}\n endMessage={\n \n Try changing filters to get more influencers. \n
\n }\n >\n {influencers.map((influencer, index) => (\n \n \n \n ))}\n \n \n \n ) : null}\n \n \n \n \n {selectedObjective != '' || modal ? (\n {\n this.setSelectedObjective('');\n }}\n >
\n ) : null}\n {/* { */}\n {/* (listSelect) ? {this.setlistSelect(false)}}>
: null */}\n {/* } */}\n \n \n );\n }\n}\n\nconst styles = {\n root: {\n background: '#FFFFFF',\n paddingTop: 20,\n width: '100%',\n maxWidth: '100%',\n height: '100vh',\n },\n modalBackground: {\n background: '#000000',\n opacity: 0.5,\n zIndex: 4,\n height: '100%',\n width: '100%',\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n option: {\n // background: '#F1F1F1',\n borderRadius: '10px',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n margin: 5,\n borderRadius: 10,\n display: 'flex',\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n backToTop: {\n position: 'fixed',\n bottom: '20px',\n right: '15px',\n zIndex: 9999,\n fontSize: '16px',\n border: 'none',\n outline: 'none',\n borderRadius: '50%',\n backgroundColor: '#c2e0ff',\n color: '#004C99',\n cursor: 'pointer',\n padding: '10px',\n height: '40px',\n width: '40px',\n },\n};\n\nconst mapStateToProps = (state) => {\n return {\n prediction: state.discovery.prediction,\n };\n};\n\nconst actionCreators = {\n fetchInfluencers: getInfluencers,\n};\n\nexport default connect(mapStateToProps, actionCreators)(withStyles(styles)(Planner));\n\n// export default Discovery\n","import PropTypes from 'prop-types';\nimport { createContext } from 'react';\n\n// project import\nimport defaultConfig from 'config';\nimport useLocalStorage from 'hooks/useLocalStorage';\n\n// initial state\nconst initialState = {\n ...defaultConfig,\n onChangeMenuOrientation: () => {},\n onChangeMiniDrawer: () => {},\n onChangeMode: () => {},\n onChangePresetColor: () => {},\n onChangeLocale: () => {},\n onChangeDirection: () => {},\n onChangeContainer: () => {},\n onChangeFontFamily: () => {},\n onChangeBorderRadius: () => {},\n onChangeOutlinedField: () => {},\n onReset: () => {}\n};\n\n// ==============================|| CONFIG CONTEXT & PROVIDER ||============================== //\n\nconst ConfigContext = createContext(initialState);\n\nfunction ConfigProvider({ children }) {\n const [config, setConfig] = useLocalStorage('berry-config-vite-js', {\n menuOrientation: initialState.menuOrientation,\n miniDrawer: initialState.miniDrawer,\n fontFamily: initialState.fontFamily,\n borderRadius: initialState.borderRadius,\n outlinedFilled: initialState.outlinedFilled,\n mode: initialState.mode,\n presetColor: initialState.presetColor,\n i18n: initialState.i18n,\n themeDirection: initialState.themeDirection,\n container: initialState.container\n });\n\n const onChangeMenuOrientation = (menuOrientation) => {\n setConfig({\n ...config,\n menuOrientation\n });\n };\n\n const onChangeMiniDrawer = (miniDrawer) => {\n setConfig({\n ...config,\n miniDrawer\n });\n };\n\n const onChangeMode = (mode) => {\n setConfig({\n ...config,\n mode\n });\n };\n\n const onChangePresetColor = (presetColor) => {\n setConfig({\n ...config,\n presetColor\n });\n };\n\n const onChangeLocale = (i18n) => {\n setConfig({\n ...config,\n i18n\n });\n };\n\n const onChangeDirection = (themeDirection) => {\n setConfig({\n ...config,\n themeDirection\n });\n };\n\n const onChangeContainer = (container) => {\n setConfig({\n ...config,\n container\n });\n };\n\n const onChangeFontFamily = (fontFamily) => {\n setConfig({\n ...config,\n fontFamily\n });\n };\n\n const onChangeBorderRadius = (event, newValue) => {\n setConfig({\n ...config,\n borderRadius: newValue\n });\n };\n\n const onChangeOutlinedField = (outlinedFilled) => {\n setConfig({\n ...config,\n outlinedFilled\n });\n };\n\n const onReset = () => {\n setConfig({ ...defaultConfig });\n };\n\n return (\n \n {children}\n \n );\n}\n\nConfigProvider.propTypes = {\n children: PropTypes.node\n};\n\nexport { ConfigProvider, ConfigContext };\n","import { useContext } from 'react';\nimport { ConfigContext } from 'contexts/ConfigContext';\n\n// ==============================|| CONFIG - HOOKS ||============================== //\n\nconst useConfig = () => useContext(ConfigContext);\n\nexport default useConfig;\n","// material-ui\nimport { alpha, createTheme } from '@mui/material/styles';\n\n// project imports\nimport { ThemeMode } from 'config';\n\n// assets\nimport defaultColor from 'assets/scss/_themes-vars.module.scss';\nimport theme1 from 'assets/scss/_theme1.module.scss';\nimport theme2 from 'assets/scss/_theme2.module.scss';\nimport theme3 from 'assets/scss/_theme3.module.scss';\nimport theme4 from 'assets/scss/_theme4.module.scss';\nimport theme5 from 'assets/scss/_theme5.module.scss';\nimport theme6 from 'assets/scss/_theme6.module.scss';\nimport theme7 from 'assets/scss/_theme7.module.scss';\n\n// ==============================|| DEFAULT THEME - PALETTE ||============================== //\n\nconst Palette = (mode, presetColor) => {\n let colors;\n switch (presetColor) {\n case 'theme1':\n colors = theme1;\n break;\n case 'theme2':\n colors = theme2;\n break;\n case 'theme3':\n colors = theme3;\n break;\n case 'theme4':\n colors = theme4;\n break;\n case 'theme5':\n colors = theme5;\n break;\n case 'theme6':\n colors = theme6;\n break;\n case 'theme7':\n colors = theme7;\n break;\n case 'default':\n default:\n colors = defaultColor;\n }\n\n return createTheme({\n palette: {\n mode,\n common: {\n black: colors.darkPaper\n },\n primary: {\n light: mode === ThemeMode.DARK ? colors.darkPrimaryLight : colors.primaryLight,\n main: mode === ThemeMode.DARK ? colors.darkPrimaryMain : colors.primaryMain,\n dark: mode === ThemeMode.DARK ? colors.darkPrimaryDark : colors.primaryDark,\n 200: mode === ThemeMode.DARK ? colors.darkPrimary200 : colors.primary200,\n 800: mode === ThemeMode.DARK ? colors.darkPrimary800 : colors.primary800\n },\n secondary: {\n light: mode === ThemeMode.DARK ? colors.darkSecondaryLight : colors.secondaryLight,\n main: mode === ThemeMode.DARK ? colors.darkSecondaryMain : colors.secondaryMain,\n dark: mode === ThemeMode.DARK ? colors.darkSecondaryDark : colors.secondaryDark,\n 200: mode === ThemeMode.DARK ? colors.darkSecondary200 : colors.secondary200,\n 800: mode === ThemeMode.DARK ? colors.darkSecondary800 : colors.secondary800\n },\n error: {\n light: colors.errorLight,\n main: colors.errorMain,\n dark: colors.errorDark\n },\n orange: {\n light: colors.orangeLight,\n main: colors.orangeMain,\n dark: colors.orangeDark\n },\n warning: {\n light: colors.warningLight,\n main: colors.warningMain,\n dark: colors.warningDark\n },\n success: {\n light: colors.successLight,\n 200: colors.success200,\n main: colors.successMain,\n dark: colors.successDark\n },\n grey: {\n 50: colors.grey50,\n 100: colors.grey100,\n 500: mode === ThemeMode.DARK ? colors.darkTextSecondary : colors.grey500,\n 600: mode === ThemeMode.DARK ? colors.darkTextTitle : colors.grey600,\n 700: mode === ThemeMode.DARK ? colors.darkTextPrimary : colors.grey700,\n 900: mode === ThemeMode.DARK ? colors.darkTextPrimary : colors.grey900\n },\n dark: {\n light: colors.darkTextPrimary,\n main: colors.darkLevel1,\n dark: colors.darkLevel2,\n 800: colors.darkBackground,\n 900: colors.darkPaper\n },\n text: {\n primary: mode === ThemeMode.DARK ? colors.darkTextPrimary : colors.grey700,\n secondary: mode === ThemeMode.DARK ? colors.darkTextSecondary : colors.grey500,\n dark: mode === ThemeMode.DARK ? colors.darkTextPrimary : colors.grey900,\n hint: colors.grey100\n },\n divider: mode === ThemeMode.DARK ? alpha(colors.grey200, 0.2) : colors.grey200,\n background: {\n paper: mode === ThemeMode.DARK ? colors.darkLevel2 : colors.paper,\n default: mode === ThemeMode.DARK ? colors.darkPaper : colors.paper\n }\n }\n });\n};\n\nexport default Palette;\n","import { ThemeMode } from 'config';\n\nconst Typography = (theme, borderRadius, fontFamily) => ({\n fontFamily,\n h7: {\n fontWeight: 800,\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontSize: '0.8rem'\n },\n h6: {\n fontWeight: 500,\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontSize: '0.75rem'\n },\n h5: {\n fontSize: '0.875rem',\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 500\n },\n h4: {\n fontSize: '1rem',\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 600\n },\n h3: {\n fontSize: '1.25rem',\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 600\n },\n h2: {\n fontSize: '1.5rem',\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 700\n },\n h1: {\n fontSize: '2.125rem',\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 700\n },\n subtitle1: {\n fontSize: '0.875rem',\n fontWeight: 500,\n color: theme.palette.text.dark\n },\n subtitle2: {\n fontSize: '0.75rem',\n fontWeight: 400,\n color: theme.palette.text.secondary\n },\n caption: {\n fontSize: '0.75rem',\n color: theme.palette.text.secondary,\n fontWeight: 400\n },\n body1: {\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: '1.334em'\n },\n body2: {\n letterSpacing: '0em',\n fontWeight: 400,\n lineHeight: '1.5em',\n color: theme.palette.text.primary\n },\n button: {\n textTransform: 'capitalize'\n },\n customInput: {\n marginTop: 1,\n marginBottom: 1,\n '& > label': {\n top: 23,\n left: 0,\n color: theme.palette.grey[500],\n '&[data-shrink=\"false\"]': {\n top: 5\n }\n },\n '& > div > input': {\n padding: '30.5px 14px 11.5px !important'\n },\n '& legend': {\n display: 'none'\n },\n '& fieldset': {\n top: 0\n }\n },\n mainContent: {\n backgroundColor: theme.palette.mode === ThemeMode.DARK ? theme.palette.dark[800] : theme.palette.grey[100],\n width: '100%',\n minHeight: 'calc(100vh - 88px)',\n flexGrow: 1,\n padding: '20px',\n marginTop: '88px',\n marginRight: '20px',\n borderRadius: `${borderRadius}px`\n },\n menuCaption: {\n fontSize: '0.875rem',\n fontWeight: 500,\n color: theme.palette.mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n padding: '6px',\n textTransform: 'capitalize',\n marginTop: '10px'\n },\n subMenuCaption: {\n fontSize: '0.6875rem',\n fontWeight: 500,\n color: theme.palette.text.secondary,\n textTransform: 'capitalize'\n },\n commonAvatar: {\n cursor: 'pointer',\n borderRadius: '8px'\n },\n smallAvatar: {\n width: '22px',\n height: '22px',\n fontSize: '1rem'\n },\n mediumAvatar: {\n width: '34px',\n height: '34px',\n fontSize: '1.2rem'\n },\n largeAvatar: {\n width: '44px',\n height: '44px',\n fontSize: '1.5rem'\n }\n});\n\nexport default Typography;\n","import { alpha } from '@mui/material/styles';\n\n// project imports\nimport { ThemeMode } from 'config';\n\nconst createCustomShadow = (theme, color) => {\n const transparent = alpha(color, 0.24);\n return {\n z1: `0 1px 2px 0 ${transparent}`,\n z8: `0 8px 16px 0 ${transparent}`,\n z12: `0 12px 24px 0 ${transparent} 0 10px 20px 0 ${transparent}`,\n z16: `0 0 3px 0 ${transparent} 0 14px 28px -5px ${transparent}`,\n z20: `0 0 3px 0 ${transparent} 0 18px 36px -5px ${transparent}`,\n z24: `0 0 6px 0 ${transparent} 0 21px 44px 0 ${transparent}`,\n\n primary: `0px 12px 14px 0px ${alpha(theme.palette.primary.main, 0.3)}`,\n secondary: `0px 12px 14px 0px ${alpha(theme.palette.secondary.main, 0.3)}`,\n orange: `0px 12px 14px 0px ${alpha(theme.palette.orange.main, 0.3)}`,\n success: `0px 12px 14px 0px ${alpha(theme.palette.success.main, 0.3)}`,\n warning: `0px 12px 14px 0px ${alpha(theme.palette.warning.main, 0.3)}`,\n error: `0px 12px 14px 0px ${alpha(theme.palette.error.main, 0.3)}`\n };\n};\n\nexport default function customShadows(mode, theme) {\n return mode === ThemeMode.DARK\n ? createCustomShadow(theme, theme.palette.dark.main)\n : createCustomShadow(theme, theme.palette.grey[900]);\n}\n","import PropTypes from 'prop-types';\nimport { useMemo } from 'react';\n\n// material-ui\nimport { createTheme, ThemeProvider } from '@mui/material/styles';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport StyledEngineProvider from '@mui/material/StyledEngineProvider';\n\n// project import\nimport useConfig from 'hooks/useConfig';\nimport Palette from './palette';\nimport Typography from './typography';\n\nimport componentStyleOverrides from './compStyleOverride';\nimport customShadows from './shadows';\n\nexport default function ThemeCustomization({ children }) {\n const { borderRadius, fontFamily, mode, outlinedFilled, presetColor, themeDirection } = useConfig();\n\n const theme = useMemo(() => Palette(mode, presetColor), [mode, presetColor]);\n\n const themeTypography = useMemo(() => Typography(theme, borderRadius, fontFamily), [theme, borderRadius, fontFamily]);\n const themeCustomShadows = useMemo(() => customShadows(mode, theme), [mode, theme]);\n\n const themeOptions = useMemo(\n () => ({\n direction: themeDirection,\n palette: theme.palette,\n mixins: {\n toolbar: {\n minHeight: '48px',\n padding: '16px',\n '@media (min-width: 600px)': {\n minHeight: '48px'\n }\n }\n },\n typography: themeTypography,\n customShadows: themeCustomShadows\n }),\n [themeDirection, theme, themeCustomShadows, themeTypography]\n );\n\n const themes = createTheme(themeOptions);\n themes.components = useMemo(\n () => componentStyleOverrides(themes, borderRadius, outlinedFilled),\n [themes, borderRadius, outlinedFilled]\n );\n\n return (\n \n \n \n {children}\n \n \n );\n}\n\nThemeCustomization.propTypes = {\n children: PropTypes.node\n};\n","// material-ui\nimport { alpha } from '@mui/material/styles';\n\n// project imports\nimport { ThemeMode } from 'config';\n\nexport default function componentStyleOverrides(theme, borderRadius, outlinedFilled) {\n const mode = theme.palette.mode;\n const bgColor = mode === ThemeMode.DARK ? theme.palette.dark[800] : theme.palette.grey[50];\n const menuSelectedBack = mode === ThemeMode.DARK ? alpha(theme.palette.secondary.main, 0.15) : theme.palette.secondary.light;\n const menuSelected = mode === ThemeMode.DARK ? theme.palette.secondary.main : theme.palette.secondary.dark;\n\n return {\n MuiButton: {\n styleOverrides: {\n root: {\n fontWeight: 500,\n borderRadius: '4px'\n }\n }\n },\n MuiPaper: {\n defaultProps: {\n elevation: 0\n },\n styleOverrides: {\n root: {\n backgroundImage: 'none'\n },\n rounded: {\n borderRadius: `${borderRadius}px`\n }\n }\n },\n MuiCardHeader: {\n styleOverrides: {\n root: {\n color: theme.palette.text.dark,\n padding: '24px'\n },\n title: {\n fontSize: '1.125rem'\n }\n }\n },\n MuiCardContent: {\n styleOverrides: {\n root: {\n padding: '24px'\n }\n }\n },\n MuiCardActions: {\n styleOverrides: {\n root: {\n padding: '24px'\n }\n }\n },\n MuiAlert: {\n styleOverrides: {\n root: {\n alignItems: 'center'\n },\n outlined: {\n border: '1px dashed'\n }\n }\n },\n MuiListItemButton: {\n styleOverrides: {\n root: {\n color: theme.palette.text.primary,\n paddingTop: '10px',\n paddingBottom: '10px',\n '&.Mui-selected': {\n color: menuSelected,\n backgroundColor: menuSelectedBack,\n '&:hover': {\n backgroundColor: menuSelectedBack\n },\n '& .MuiListItemIcon-root': {\n color: menuSelected\n }\n },\n '&:hover': {\n backgroundColor: menuSelectedBack,\n color: menuSelected,\n '& .MuiListItemIcon-root': {\n color: menuSelected\n }\n }\n }\n }\n },\n MuiListItemIcon: {\n styleOverrides: {\n root: {\n color: theme.palette.text.primary,\n minWidth: '36px'\n }\n }\n },\n MuiListItemText: {\n styleOverrides: {\n primary: {\n color: theme.palette.text.dark\n }\n }\n },\n MuiInputBase: {\n styleOverrides: {\n input: {\n color: theme.palette.text.dark,\n '&::placeholder': {\n color: theme.palette.text.secondary,\n fontSize: '0.875rem'\n }\n }\n }\n },\n MuiOutlinedInput: {\n styleOverrides: {\n root: {\n background: outlinedFilled ? bgColor : 'transparent',\n borderRadius: `${borderRadius}px`,\n '& .MuiOutlinedInput-notchedOutline': {\n borderColor: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.28) : theme.palette.grey[400]\n },\n '&:hover $notchedOutline': {\n borderColor: theme.palette.primary.light\n },\n '&.MuiInputBase-multiline': {\n padding: 1\n }\n },\n input: {\n fontWeight: 500,\n background: outlinedFilled ? bgColor : 'transparent',\n padding: '15.5px 14px',\n borderRadius: `${borderRadius}px`,\n '&.MuiInputBase-inputSizeSmall': {\n padding: '10px 14px',\n '&.MuiInputBase-inputAdornedStart': {\n paddingLeft: 0\n }\n }\n },\n inputAdornedStart: {\n paddingLeft: 4\n },\n notchedOutline: {\n borderRadius: `${borderRadius}px`\n }\n }\n },\n MuiSlider: {\n styleOverrides: {\n root: {\n '&.Mui-disabled': {\n color: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.5) : theme.palette.grey[300]\n }\n },\n mark: {\n backgroundColor: theme.palette.background.paper,\n width: '4px'\n },\n valueLabel: {\n color: mode === ThemeMode.DARK ? theme.palette.primary.main : theme.palette.primary.light\n }\n }\n },\n MuiAutocomplete: {\n styleOverrides: {\n root: {\n '& .MuiAutocomplete-tag': {\n background: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.2) : theme.palette.secondary.light,\n borderRadius: 4,\n color: theme.palette.text.dark,\n '.MuiChip-deleteIcon': {\n color: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.8) : theme.palette.secondary[200]\n }\n }\n },\n popper: {\n borderRadius: `${borderRadius}px`,\n boxShadow: '0px 8px 10px -5px rgb(0 0 0 / 20%), 0px 16px 24px 2px rgb(0 0 0 / 14%), 0px 6px 30px 5px rgb(0 0 0 / 12%)'\n }\n }\n },\n MuiDivider: {\n styleOverrides: {\n root: {\n borderColor: theme.palette.divider\n }\n }\n },\n MuiSelect: {\n styleOverrides: {\n select: {\n '&:focus': {\n backgroundColor: 'transparent'\n }\n }\n }\n },\n MuiAvatar: {\n styleOverrides: {\n root: {\n color: mode === ThemeMode.DARK ? theme.palette.dark.main : theme.palette.primary.dark,\n background: mode === ThemeMode.DARK ? theme.palette.text.primary : theme.palette.primary[200]\n }\n }\n },\n MuiChip: {\n styleOverrides: {\n root: {\n '&.MuiChip-deletable .MuiChip-deleteIcon': {\n color: 'inherit'\n }\n }\n }\n },\n MuiTimelineContent: {\n styleOverrides: {\n root: {\n color: theme.palette.text.dark,\n fontSize: '16px'\n }\n }\n },\n MuiTreeItem: {\n styleOverrides: {\n label: {\n marginTop: 14,\n marginBottom: 14\n }\n }\n },\n MuiTimelineDot: {\n styleOverrides: {\n root: {\n boxShadow: 'none'\n }\n }\n },\n MuiInternalDateTimePickerTabs: {\n styleOverrides: {\n tabs: {\n backgroundColor: mode === ThemeMode.DARK ? theme.palette.dark[900] : theme.palette.primary.light,\n '& .MuiTabs-flexContainer': {\n borderColor: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.2) : theme.palette.primary[200]\n },\n '& .MuiTab-root': {\n color: mode === ThemeMode.DARK ? theme.palette.text.secondary : theme.palette.grey[900]\n },\n '& .MuiTabs-indicator': {\n backgroundColor: theme.palette.primary.dark\n },\n '& .Mui-selected': {\n color: theme.palette.primary.dark\n }\n }\n }\n },\n MuiTabs: {\n styleOverrides: {\n flexContainer: {\n borderBottom: '1px solid',\n borderColor: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.2) : theme.palette.grey[200]\n }\n }\n },\n MuiDialog: {\n styleOverrides: {\n paper: {\n padding: '12px 0 12px 0'\n }\n }\n },\n MuiTableCell: {\n styleOverrides: {\n root: {\n borderColor: mode === ThemeMode.DARK ? alpha(theme.palette.text.primary, 0.15) : theme.palette.grey[200],\n '&.MuiTableCell-head': {\n fontSize: '0.875rem',\n color: mode === ThemeMode.DARK ? theme.palette.grey[600] : theme.palette.grey[900],\n fontWeight: 500\n }\n }\n }\n },\n MuiDateTimePickerToolbar: {\n styleOverrides: {\n timeDigitsContainer: {\n alignItems: 'center'\n }\n }\n },\n MuiTooltip: {\n styleOverrides: {\n tooltip: {\n color: theme.palette.background.paper,\n background: theme.palette.text.primary\n }\n }\n },\n MuiDialogTitle: {\n styleOverrides: {\n root: {\n fontSize: '1.25rem'\n }\n }\n },\n MuiPaginationItem: {\n styleOverrides: {\n root: {\n margin: '3px'\n }\n }\n },\n MuiDataGrid: {\n defaultProps: {\n rowHeight: 54\n },\n styleOverrides: {\n root: {\n borderWidth: 0,\n '& .MuiDataGrid-columnHeader--filledGroup': {\n borderBottomWidth: 0\n },\n '& .MuiDataGrid-columnHeader--emptyGroup': {\n borderBottomWidth: 0\n },\n '& .MuiFormControl-root>.MuiInputBase-root': {\n backgroundColor: `${theme.palette.background.default} !important`,\n borderColor:\n theme.palette.mode === ThemeMode.DARK\n ? `${alpha(theme.palette.divider, 0.05)} !important`\n : `${theme.palette.divider} !important`\n }\n },\n toolbarContainer: {\n '& .MuiButton-root': {\n paddingLeft: '16px !important',\n paddingRight: '16px !important'\n }\n },\n withBorderColor: {\n borderBottom: '1px solid',\n borderColor: mode === ThemeMode.DARK ? alpha(theme.palette.divider, 0.15) : theme.palette.divider\n },\n columnHeader: {\n color: theme.palette.grey[600],\n paddingLeft: 24,\n paddingRight: 24\n },\n footerContainer: {\n '&.MuiDataGrid-withBorderColor': {\n borderBottom: 'none'\n }\n },\n columnHeaderCheckbox: {\n paddingLeft: 0,\n paddingRight: 0\n },\n cellCheckbox: {\n paddingLeft: 0,\n paddingRight: 0\n },\n cell: {\n borderWidth: 0,\n paddingLeft: 24,\n paddingRight: 24,\n '&.MuiDataGrid-cell--withRenderer > div ': {\n ...(mode === ThemeMode.DARK && {\n color: theme.palette.grey[50]\n }),\n ' > .high': {\n background: mode === ThemeMode.DARK ? theme.palette.success.dark : theme.palette.success.light\n },\n '& > .medium': {\n background: mode === ThemeMode.DARK ? theme.palette.warning.dark : theme.palette.warning.light\n },\n '& > .low': {\n background: mode === ThemeMode.DARK ? theme.palette.error.dark : theme.palette.error.light\n }\n }\n }\n }\n }\n };\n}\n","import { Link as RouterLink } from 'react-router-dom';\n\n// material-ui\nimport Link from '@mui/material/Link';\n\n// project imports\nimport { DASHBOARD_PATH } from 'config';\nimport Logo from 'ui-component/Logo';\n\n// ==============================|| MAIN LOGO ||============================== //\n\nconst LogoSection = () => (\n \n);\n\nexport default LogoSection;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\n// material-ui\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/Typography';\n\n// project-import\nimport useConfig from 'hooks/useConfig';\nimport { ThemeMode } from 'config';\n\n// constant\nconst headerSX = {\n '& .MuiCardHeader-action': { mr: 0 }\n};\n\n// ==============================|| CUSTOM MAIN CARD ||============================== //\n\nconst MainCard = React.forwardRef(\n (\n {\n border = false,\n boxShadow,\n children,\n content = true,\n contentClass = '',\n contentSX = {},\n darkTitle,\n secondary,\n shadow,\n sx = {},\n title,\n ...others\n },\n ref\n ) => {\n const { mode } = useConfig();\n const defaultShadow = mode === ThemeMode.DARK ? '0 2px 14px 0 rgb(33 150 243 / 10%)' : '0 2px 14px 0 rgb(32 40 45 / 8%)';\n\n return (\n \n {/* card header and action */}\n {!darkTitle && title && }\n {darkTitle && title && (\n {title}} action={secondary} />\n )}\n\n {/* content & header divider */}\n {title && }\n\n {/* card content */}\n {content && (\n \n {children}\n \n )}\n {!content && children}\n \n );\n }\n);\n\nMainCard.propTypes = {\n border: PropTypes.bool,\n boxShadow: PropTypes.bool,\n children: PropTypes.node,\n content: PropTypes.bool,\n contentClass: PropTypes.string,\n contentSX: PropTypes.object,\n darkTitle: PropTypes.bool,\n secondary: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object]),\n shadow: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n sx: PropTypes.object,\n title: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object])\n};\n\nexport default MainCard;\n","import PropTypes from 'prop-types';\nimport React from 'react';\n\n// material-ui\nimport Collapse from '@mui/material/Collapse';\nimport Fade from '@mui/material/Fade';\nimport Box from '@mui/material/Box';\nimport Grow from '@mui/material/Grow';\nimport Slide from '@mui/material/Slide';\nimport Zoom from '@mui/material/Zoom';\n\n// ==============================|| TRANSITIONS ||============================== //\n\nconst Transitions = React.forwardRef(({ children, position, type, direction, ...others }, ref) => {\n let positionSX = {\n transformOrigin: '0 0 0'\n };\n\n switch (position) {\n case 'top-right':\n positionSX = {\n transformOrigin: 'top right'\n };\n break;\n case 'top':\n positionSX = {\n transformOrigin: 'top'\n };\n break;\n case 'bottom-left':\n positionSX = {\n transformOrigin: 'bottom left'\n };\n break;\n case 'bottom-right':\n positionSX = {\n transformOrigin: 'bottom right'\n };\n break;\n case 'bottom':\n positionSX = {\n transformOrigin: 'bottom'\n };\n break;\n case 'top-left':\n default:\n positionSX = {\n transformOrigin: '0 0 0'\n };\n break;\n }\n\n return (\n \n {type === 'grow' && (\n \n {children} \n \n )}\n {type === 'collapse' && (\n \n {children}\n \n )}\n {type === 'fade' && (\n \n {children} \n \n )}\n {type === 'slide' && (\n \n {children} \n \n )}\n {type === 'zoom' && (\n \n {children} \n \n )}\n \n );\n});\n\nTransitions.propTypes = {\n children: PropTypes.node,\n type: PropTypes.oneOf(['grow', 'fade', 'collapse', 'slide', 'zoom']),\n position: PropTypes.oneOf(['top-left', 'top-right', 'top', 'bottom-left', 'bottom-right', 'bottom']),\n direction: PropTypes.oneOf(['up', 'down', 'left', 'right'])\n};\n\nTransitions.defaultProps = {\n type: 'grow',\n position: 'top-left',\n direction: 'up'\n};\n\nexport default Transitions;\n","export default __webpack_public_path__ + \"static/media/user-round.13b5a31b.svg\";","import { useEffect, useRef, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport Chip from '@mui/material/Chip';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Divider from '@mui/material/Divider';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\n\n// third-party\nimport PerfectScrollbar from 'react-perfect-scrollbar';\n\n// project imports\nimport MainCard from 'ui-component/cards/MainCard';\nimport Transitions from 'ui-component/extended/Transitions';\n// import useAuth from 'hooks/useAuth';\nimport User1 from 'assets/images/users/user-round.svg';\nimport config, { ThemeMode } from 'config';\n\n// assets\nimport LogoutIcon from '@mui/icons-material/Logout';\nimport SettingsIcon from '@mui/icons-material/Settings';\n// import useConfig from 'hooks/useConfig';\n\n// ==============================|| PROFILE MENU ||============================== //\n\nconst ProfileSection = () => {\n const user = useSelector((state) => state.planner2.user);\n const theme = useTheme();\n const { mode, borderRadius } = config;\n // const navigate = useNavigate();\n\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [open, setOpen] = useState(false);\n\n\n /**\n * anchorRef is used on different components and specifying one type leads to other components throwing an error\n * */\n const anchorRef = useRef(null);\n const handleLogout = async () => {\n for (const key of ['access', 'refresh', 'user']) localStorage.removeItem(key);\n window.location = '/login';\n };\n\n const handleListItemClick = (event, index, route = '') => {\n setSelectedIndex(index);\n handleClose(event);\n\n // if (route && route !== '') {\n // navigate(route);\n // }\n };\n\n const handleToggle = () => {\n setOpen((prevOpen) => !prevOpen);\n };\n\n const handleClose = (event) => {\n if (anchorRef.current && anchorRef.current.contains(event.target)) {\n return;\n }\n\n setOpen(false);\n };\n\n const prevOpen = useRef(open);\n useEffect(() => {\n if (prevOpen.current === true && open === false) {\n anchorRef.current.focus();\n }\n\n prevOpen.current = open;\n }, [open]);\n\n return (\n <>\n \n }\n label={ }\n variant=\"outlined\"\n ref={anchorRef}\n aria-controls={open ? 'menu-list-grow' : undefined}\n aria-haspopup=\"true\"\n onClick={handleToggle}\n color=\"primary\"\n aria-label=\"user-account\"\n />\n\n \n {({ TransitionProps }) => (\n \n \n \n {open && (\n \n \n \n \n Hello, \n \n {\n user.influencer ? \n user.influencer.name \n : user.email\n }\n \n \n \n \n \n \n {/* */}\n \n \n \n \n \n \n \n \n Logout\n \n }\n />\n \n
\n \n \n \n )}\n \n \n \n )}\n \n >\n );\n};\n\nexport default ProfileSection;\n","import { Grid, Typography } from \"@mui/material\";\nimport StarBorderIcon from '@mui/icons-material/StarBorder';\n\nfunction ExtensionModalHeading(props) {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n {props.heading}\n \n \n \n \n {props.subHeading}\n \n \n \n \n \n );\n}\n\nexport default ExtensionModalHeading;\n","import {\n Box,\n Button,\n Checkbox,\n Divider,\n FormControlLabel,\n FormGroup,\n Grid,\n IconButton,\n Link,\n Modal,\n Typography,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward';\nimport SystemUpdateAltIcon from '@mui/icons-material/SystemUpdateAlt';\nimport AutoAwesomeIcon from '@mui/icons-material/AutoAwesome';\nimport StarBorderIcon from '@mui/icons-material/StarBorder';\nimport ExtensionModalHeading from './ExtensionModalHeading';\nimport { useState } from 'react';\n\nimport mixpanel from 'mixpanel-browser';\n\nconst style = {\n position: 'absolute',\n top: '50%',\n left: '52.3%',\n transform: 'translate(-50%, -50%)',\n width: '100vw',\n bgcolor: '#f2a83f',\n pt: 1,\n borderRadius: '15px',\n zIndex: 111,\n};\n\nfunction ExtensionModal(props) {\n \n return (\n {\n // props.close(false);\n // }}\n aria-labelledby=\"modal-modal-title\"\n aria-describedby=\"modal-modal-description\"\n >\n \n \n \n \n \n {\n const currentTime = new Date().getTime();\n localStorage.setItem('extensionTime', parseInt(currentTime));\n var ext = localStorage.getItem('extension');\n localStorage.setItem('extension', parseInt(ext) + 1);\n props.close(false);\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Influencer.in\n \n \n \n \n {' '}\n Chrome Extension\n \n \n \n \n \n \n \n \n Transform your influencer discovery experience on Instagram & YouTube with\n instant analytics and insights. Access comprehensive data while browsing\n creator profiles—all in one click.\n \n \n \n {\n window.open(\n 'https://chromewebstore.google.com/detail/influencerin-analyze-inst/ojmcehcdkmmdeokikaambmmifnieokbi',\n '_blank',\n 'noopener,noreferrer',\n )\n mixpanel.track('Chrome-Extension-Download-Click', {\n 'from': 'Banner'\n });\n }\n }\n style={{\n width: '90%',\n borderRadius: '20px',\n background: 'linear-gradient(to right, #505050, #202020)',\n border: '2px solid #ffffff',\n marginBottom:'20px'\n }}\n >\n \n \n \n \n \n \n \n \n Download Extension Now !\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 Do not show again \n \n \n {\n localStorage.setItem('popUpAppearance','doNotShowpopUp')\n }}/>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default ExtensionModal;\n","import { useTheme } from '@mui/material/styles';\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport HelpOutlineIcon from '@mui/icons-material/HelpOutline';\nimport { useDispatch } from 'react-redux';\nimport { useHistory } from 'react-router-dom';\n// project imports\n// import useConfig from 'hooks/useConfig';\nimport LogoSection from '../LogoSection';\n// import SearchSection from './SearchSection';\nimport ProfileSection from './ProfileSection';\n// import MegaMenuSection from './MegaMenuSection';\n// import NotificationSection from './NotificationSection';\nimport SystemUpdateAltIcon from '@mui/icons-material/SystemUpdateAlt';\n\nimport config, { ThemeMode } from 'config';\nimport ExtensionModal from './ExtensionModal';\nimport { getCurrentUser } from 'api_handlers/auth';\nimport { toggleDrawerOpen } from 'actions/planner2';\n\n// assets\nimport MenuIcon from '@mui/icons-material/Menu';\nimport { Button, ButtonBase, Grid, IconButton, Typography } from '@mui/material';\nimport { useEffect, useState } from 'react';\n\nimport mixpanel from 'mixpanel-browser';\n\n// ==============================|| MAIN NAVBAR / HEADER ||============================== //\n\nconst Header = () => {\n const theme = useTheme();\n const downMD = useMediaQuery(theme.breakpoints.down('md'));\n const dispatch = useDispatch();\n const history = useHistory();\n const { mode, menuOrientation } = config;\n const isHorizontal = false;\n const [extensionModal, setExtensionModal] = useState(false);\n\n useEffect(async () => {\n const extension = parseInt(localStorage.getItem('extension'));\n const extensionTime = parseInt(localStorage.getItem('extensionTime'));\n const popUp = localStorage.getItem('popUpAppearance');\n var time = new Date().getTime();\n // console.log('popUpAppearance',popUp)\n getCurrentUser().then((resp) => {\n if (!resp.data.extension_installed && popUp !== 'doNotShowpopUp') {\n if (extension === 1) {\n const timer = setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n } else if (extension === 2 && time >= extensionTime + 1000 * 60 * 60 * 24 * 3) {\n setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n } else if (extension === 3 && time >= extensionTime + 1000 * 60 * 60 * 24 * 7) {\n setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n } else if (extension === 4 && time >= extensionTime + 1000 * 60 * 60 * 24 * 7) {\n setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n } else if (extension === 5 && time >= extensionTime + 1000 * 60 * 60 * 24 * 7) {\n setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n } else if (extension === 6 && time >= extensionTime + 1000 * 60 * 60 * 24 * 7) {\n setTimeout(() => {\n setExtensionModal(true);\n }, 3000);\n }\n // console.log('extension', extension, time >= extensionTime + 1000 * 10);\n // console.log('extension_installed', resp.data.extension_installed);\n }\n });\n }, []);\n\n return (\n <>\n {/* logo & toggler button */}\n \n \n \n \n {!isHorizontal && (\n dispatch(toggleDrawerOpen())}\n color=\"inherit\"\n >\n \n \n )}\n \n\n {/* header search */}\n {/* */}\n \n \n\n {/* mega-menu */}\n {/* \n \n */}\n\n {/* notification */}\n {/* */}\n\n {/* profile */}\n {\n setExtensionModal(true);\n mixpanel.track('Chrome-Extension-Download-Click', {\n 'from': 'Header'\n });\n }}\n >\n \n \n \n \n \n Download Extension \n \n \n \n {/* {\n showExtension==='yes'?\n setExtensionModal(val)}\n > \n :''\n } */}\n {extensionModal ? (\n setExtensionModal(val)}\n > \n ) : (\n ''\n )}\n\n \n {\n history.push('/planner/help-and-support');\n }}\n > \n \n \n >\n );\n};\n\nexport default Header;\n","import PropTypes from 'prop-types';\nimport React, { memo, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Avatar from '@mui/material/Avatar';\nimport Box from '@mui/material/Box';\nimport Card from '@mui/material/Card';\nimport Grid from '@mui/material/Grid';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemAvatar from '@mui/material/ListItemAvatar';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport ErrorIcon from '@mui/icons-material/Error';\nimport { linearProgressClasses } from '@mui/material/LinearProgress';\nimport { ThemeMode } from 'config';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { withStyles, Theme } from '@material-ui/core/styles';\n// assets\nimport TableChartOutlinedIcon from '@mui/icons-material/TableChartOutlined';\n\n// ==============================|| PROGRESS BAR WITH LABEL ||============================== //\n\nconst HtmlTooltip = withStyles((theme: Theme) => ({\n tooltip: {\n color: \"white\",\n borderRadius: \"5px\",\n width: 120,\n height: 'auto',\n fontSize: theme.typography.pxToRem(12),\n fontSize:10\n },\n arrow: {\n color: \"#3A3A3A\",\n },\n}))(Tooltip);\n\nfunction LinearProgressWithLabel({ value, ...others }) {\n const theme = useTheme();\n\n return (\n \n \n \n \n \n Credits used\n \n \n \n {`${Math.round(value)}%`} \n \n \n \n \n \n \n \n );\n}\n\nLinearProgressWithLabel.propTypes = {\n value: PropTypes.number,\n};\n\n// ==============================|| SIDEBAR - MENU CARD ||============================== //\n\nconst MenuCard = () => {\n const theme = useTheme();\n const user = useSelector((state) => state.planner2.user);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n Credit balance\n \n \n \n \n \n \n \n \n \n \n }\n secondary={\n \n {\n user?.premium_user ?\n null : \n \n Standard profiles: {user?.fetched_credit_balance}\n \n }\n \n Premium profiles: {user?.credit_balance}\n \n \n }\n />\n \n
\n \n \n );\n};\n\nexport default memo(MenuCard);\n","import PropTypes from 'prop-types';\nimport { useEffect, useRef, useState } from 'react';\nimport { Link, matchPath, useLocation } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\n\n// material-ui\nimport { alpha, useTheme } from '@mui/material/styles';\nimport Avatar from '@mui/material/Avatar';\nimport ButtonBase from '@mui/material/ButtonBase';\nimport Chip from '@mui/material/Chip';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport { showPremiumFeatureDialog } from 'actions/planner2';\n\n// project imports\nimport config, { MenuOrientation, ThemeMode } from 'config';\n\n// assets\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\n\nimport mixpanel from 'mixpanel-browser';\n\n// ==============================|| SIDEBAR MENU LIST ITEMS ||============================== //\n\nconst NavItem = ({ item, level, isParents = false, setSelectedID }) => {\n const theme = useTheme();\n const downMD = useMediaQuery(theme.breakpoints.down('md'));\n const ref = useRef(null);\n const dispatch = useDispatch();\n\n const { pathname } = useLocation();\n const { mode, menuOrientation, borderRadius } = config;\n\n const drawerOpen = useSelector((state) => state.planner2.drawerOpen);\n const isHorizontal = menuOrientation === MenuOrientation.HORIZONTAL && !downMD;\n const isSelected = !!matchPath({ path: item?.link ? item.link : item.url, end: false }, pathname);\n const user = useSelector((state) => state.planner2.user);\n const [selectedModule,setSelectedModule] =useState('')\n const [hoverStatus, setHover] = useState(false);\n const url = window.location.href.split('/')\n const componentName = url[4]\n const compareSize = () => {\n const compare = ref.current && ref.current.scrollWidth > ref.current.clientWidth;\n setHover(compare);\n };\n\n useEffect(() => {\n compareSize();\n window.addEventListener('resize', compareSize);\n window.removeEventListener('resize', compareSize);\n\n }, []);\n\n\n const Icon = item?.icon;\n const itemIcon = item?.icon ? (\n \n ) : (\n 0 ? 'inherit' : 'medium'}\n />\n );\n const PremiumIcon = item?.premiumIcon;\n const premiumItemIcon = item?.premiumIcon ? (\n \n ) : (\n ''\n );\n // (\n // 0 ? 'inherit' : 'medium'}\n // />\n // );\n\n let itemTarget = '_self';\n if (item.target) {\n itemTarget = '_blank';\n }\n\n if (Object.keys(user).length > 0 && item.url === '/planner/collab-list') {\n item.url = {\n pathname: '/planner/collab-list',\n state: { user }\n };\n }\n\n\n const itemHandler = () => {\n // if (downMD) handlerDrawerOpen(false);\n if (isParents && setSelectedID) {\n setSelectedID();\n }\n };\n\n const iconSelectedColor =\n mode === ThemeMode.DARK && drawerOpen ? 'text.primary' : 'secondary.main';\n\n\n return (\n <>\n {!isHorizontal ? (\n {\n itemHandler();\n if (\n user.premium_user === false &&\n (item.url === '/brand/campaigns' || item.url === '/competitor-insights/')\n ) {\n dispatch(showPremiumFeatureDialog(true));\n }\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Sidepanel click\", {\n \"name\": item.id\n });\n }\n // else );\n }}\n >\n \n \n {itemIcon}\n \n \n\n {(drawerOpen || (!drawerOpen && level !== 1)) && (\n \n \n {item.title}\n \n }\n secondary={\n item.caption && (\n \n {item.caption}\n \n )\n }\n />\n \n )}\n\n {drawerOpen && user.premium_user === false ? (\n \n \n {premiumItemIcon}\n \n \n ) : (\n ''\n )}\n\n {drawerOpen && item.chip && (\n {item.chip.avatar}}\n />\n )}\n \n ) : (\n 1 ? 'transparent !important' : 'inherit',\n py: 1,\n pl: 2,\n mr: isParents ? 1 : 0,\n }}\n selected={isSelected}\n onClick={() => itemHandler()}\n >\n \n {itemIcon}\n \n\n \n {item.title}\n \n }\n secondary={\n item.caption && (\n \n {item.caption}\n \n )\n }\n />\n\n {item.chip && (\n {item.chip.avatar}}\n />\n )}\n \n )}\n >\n );\n};\n\nNavItem.propTypes = {\n setSelectedID: PropTypes.func,\n item: PropTypes.object,\n level: PropTypes.number,\n parentId: PropTypes.string,\n isParents: PropTypes.bool,\n};\n\nexport default NavItem;\n","import PropTypes from 'prop-types';\nimport { useEffect, useRef, useState } from 'react';\nimport { matchPath, useLocation } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport { alpha, styled, useTheme } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Collapse from '@mui/material/Collapse';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\n// project imports\nimport NavItem from '../NavItem';\nimport Transitions from 'ui-component/extended/Transitions';\n\nimport config, { MenuOrientation, ThemeMode } from 'config';\n// import useConfig from 'hooks/useConfig';\n// import { useGetMenuMaster } from 'api/menu';\n\n// assets\n// import { FiberManualRecordIcon, FiberManualRecordIcon, FiberManualRecordIcon } from '@tabler/icons-react';\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\n\n// horizontal-menu - wrapper\nconst PopperStyled = styled(Popper)(({ theme }) => ({\n overflow: 'visible',\n zIndex: 1202,\n minWidth: 180,\n '&:before': {\n content: '\"\"',\n display: 'block',\n position: 'absolute',\n top: 34,\n left: -5,\n width: 12,\n height: 12,\n transform: 'translateY(-50%) rotate(45deg)',\n zIndex: 120,\n borderWidth: '6px',\n borderStyle: 'solid',\n borderColor: `transparent transparent ${theme.palette.background.paper} ${theme.palette.background.paper}`\n },\n '&[data-popper-placement=\"left-start\"]:before': {\n left: 'auto',\n right: -5,\n borderColor: `${theme.palette.background.paper} ${theme.palette.background.paper} transparent transparent`\n },\n '&[data-popper-placement=\"left-end\"]:before': {\n top: 'auto',\n bottom: 15,\n left: 'auto',\n right: -5,\n borderColor: `${theme.palette.background.paper} ${theme.palette.background.paper} transparent transparent`\n },\n '&[data-popper-placement=\"right-end\"]:before': {\n top: 'auto',\n bottom: 15\n }\n}));\n\n// ==============================|| SIDEBAR MENU LIST COLLAPSE ITEMS ||============================== //\n\nconst NavCollapse = ({ menu, level, parentId }) => {\n const theme = useTheme();\n const downMD = useMediaQuery(theme.breakpoints.down('md'));\n const ref = useRef(null);\n\n const { mode, menuOrientation, borderRadius } = config;\n const drawerOpen = useSelector((state) => state.planner2.drawerOpen);\n const isHorizontal = menuOrientation === MenuOrientation.HORIZONTAL && !downMD;\n\n const [open, setOpen] = useState(false);\n const [selected, setSelected] = useState(null);\n const [anchorEl, setAnchorEl] = useState(null);\n\n const handleClickMini = (event) => {\n setAnchorEl(null);\n if (drawerOpen) {\n setOpen(!open);\n setSelected(!selected ? menu.id : null);\n } else {\n setAnchorEl(event?.currentTarget);\n }\n };\n\n const handleHover = (event) => {\n setAnchorEl(event?.currentTarget);\n };\n\n const openMini = Boolean(anchorEl);\n\n const handleClosePopper = () => {\n setOpen(false);\n if (!openMini) {\n if (!menu.url) {\n setSelected(null);\n }\n }\n setAnchorEl(null);\n };\n\n const { pathname } = useLocation();\n\n const checkOpenForParent = (child, id) => {\n child.forEach((item) => {\n if (item.url === pathname) {\n setOpen(true);\n setSelected(id);\n }\n });\n };\n\n // menu collapse for sub-levels\n useEffect(() => {\n setOpen(false);\n openMini ? setAnchorEl(null) : setSelected(null);\n if (menu.children) {\n menu.children.forEach((item) => {\n if (item.children?.length) {\n checkOpenForParent(item.children, menu.id);\n }\n if (item.link && !!matchPath({ path: item?.link, end: false }, pathname)) {\n setSelected(menu.id);\n setOpen(true);\n }\n if (item.url === pathname) {\n setSelected(menu.id);\n setOpen(true);\n }\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname, menu.children]);\n\n const [hoverStatus, setHover] = useState(false);\n\n const compareSize = () => {\n const compare = ref.current && ref.current.scrollWidth > ref.current.clientWidth;\n setHover(compare);\n };\n\n useEffect(() => {\n compareSize();\n window.addEventListener('resize', compareSize);\n window.removeEventListener('resize', compareSize);\n }, []);\n\n useEffect(() => {\n if (menu.url === pathname) {\n setSelected(menu.id);\n setAnchorEl(null);\n setOpen(true);\n }\n }, [pathname, menu]);\n\n // menu collapse & item\n const menus = menu.children?.map((item) => {\n switch (item.type) {\n case 'collapse':\n return ;\n case 'item':\n return ;\n default:\n return (\n \n Menu Items Error\n \n );\n }\n });\n\n const isSelected = selected === menu.id;\n\n const Icon = menu.icon;\n const menuIcon = menu.icon ? (\n \n ) : (\n 0 ? 'inherit' : 'medium'}\n />\n );\n\n const collapseIcon = drawerOpen ? (\n \n ) : (\n \n );\n\n const iconSelectedColor = mode === ThemeMode.DARK && drawerOpen ? 'text.primary' : 'secondary.main';\n const popperId = openMini ? `collapse-pop-${menu.id}` : undefined;\n\n return (\n <>\n {!isHorizontal ? (\n <>\n \n {menuIcon && (\n \n {menuIcon}\n \n )}\n {(drawerOpen || (!drawerOpen && level !== 1)) && (\n \n \n {menu.title}\n \n }\n secondary={\n menu.caption && (\n \n {menu.caption}\n \n )\n }\n />\n \n )}\n\n {openMini || open ? (\n collapseIcon\n ) : (\n \n )}\n\n {!drawerOpen && (\n \n {({ TransitionProps }) => (\n \n \n \n {menus} \n \n \n \n )}\n \n )}\n \n {drawerOpen && (\n \n {open && (\n \n {menus}\n
\n )}\n \n )}\n >\n ) : (\n \n {menuIcon && {menuIcon} }\n \n {menu.title}\n \n }\n />\n {openMini ? : }\n\n {anchorEl && (\n \n {({ TransitionProps }) => (\n \n \n \n {menus} \n \n \n \n )}\n \n )}\n \n )}\n >\n );\n};\n\nNavCollapse.propTypes = {\n menu: PropTypes.object,\n level: PropTypes.number,\n parentId: PropTypes.string\n};\n\nexport default NavCollapse;\n","import PropTypes from 'prop-types';\nimport { Fragment, useEffect, useState } from 'react';\nimport { matchPath, useLocation } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Divider from '@mui/material/Divider';\nimport List from '@mui/material/List';\nimport ListItemButton from '@mui/material/ListItemButton';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Paper from '@mui/material/Paper';\nimport Popper from '@mui/material/Popper';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\n// third-party\n\n// project imports\nimport NavCollapse from '../NavCollapse';\nimport NavItem from '../NavItem';\n\nimport Transitions from 'ui-component/extended/Transitions';\nimport config, { MenuOrientation } from 'config';\n\n// assets\n// import { FiberManualRecordIcon, FiberManualRecordIcon, FiberManualRecordIcon } from '@tabler/icons-react';\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\n\n// ==============================|| SIDEBAR MENU LIST GROUP ||============================== //\n\nconst NavGroup = ({ item, lastItem, remItems, lastItemId, selectedID, setSelectedID }) => {\n const theme = useTheme();\n const downMD = useMediaQuery(theme.breakpoints.down('md'));\n const { pathname } = useLocation();\n\n const { menuOrientation, borderRadius } = config;\n const drawerOpen = useSelector((state) => state.planner2.drawerOpen);\n const isHorizontal = menuOrientation === MenuOrientation.HORIZONTAL && !downMD;\n\n const [anchorEl, setAnchorEl] = useState(null);\n const [currentItem, setCurrentItem] = useState(item);\n\n const openMini = Boolean(anchorEl);\n\n useEffect(() => {\n if (lastItem) {\n if (item.id === lastItemId) {\n const localItem = { ...item };\n const elements = remItems.map((ele) => ele.elements);\n localItem.children = elements.flat(1);\n setCurrentItem(localItem);\n } else {\n setCurrentItem(item);\n }\n }\n }, [item, lastItem, menuOrientation, remItems, lastItemId]);\n\n const checkOpenForParent = (child, id) => {\n child.forEach((ele) => {\n if (ele.children?.length) {\n checkOpenForParent(ele.children, currentItem.id);\n }\n if (ele?.url && !!matchPath({ path: ele?.link ? ele.link : ele.url, end: true }, pathname)) {\n setSelectedID(id);\n }\n });\n };\n\n const checkSelectedOnload = (data) => {\n const childrens = data.children ? data.children : [];\n childrens.forEach((itemCheck) => {\n if (itemCheck?.children?.length) {\n checkOpenForParent(itemCheck.children, currentItem.id);\n }\n if (itemCheck?.url && !!matchPath({ path: itemCheck?.link ? itemCheck.link : itemCheck.url, end: true }, pathname)) {\n setSelectedID(currentItem.id);\n }\n });\n\n if (data?.url && !!matchPath({ path: data?.link ? data.link : data.url, end: true }, pathname)) {\n setSelectedID(currentItem.id);\n }\n };\n\n // keep selected-menu on page load and use for horizontal menu close on change routes\n useEffect(() => {\n checkSelectedOnload(currentItem);\n if (openMini) setAnchorEl(null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname, currentItem]);\n\n const handleClick = (event) => {\n if (!openMini) {\n setAnchorEl(event?.currentTarget);\n }\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const Icon = currentItem?.icon;\n const itemIcon = currentItem?.icon ? : null;\n\n // menu list collapse & items\n const items = currentItem.children?.map((menu) => {\n switch (menu?.type) {\n case 'collapse':\n return ;\n case 'item':\n return ;\n default:\n return (\n \n Menu Items Error\n \n );\n }\n });\n\n const moreItems = remItems?.map((itemRem, i) => (\n \n {itemRem.url ? (\n \n ) : (\n itemRem.title && (\n \n {itemRem.title} {itemRem.url}\n \n )\n )}\n {itemRem?.elements?.map((menu) => {\n switch (menu?.type) {\n case 'collapse':\n return ;\n case 'item':\n return ;\n default:\n return (\n \n Menu Items Error\n \n );\n }\n })}\n \n ));\n\n const popperId = openMini ? `group-pop-${item.id}` : undefined;\n const isSelected = selectedID === currentItem.id;\n\n return (\n <>\n {!isHorizontal ? (\n <>\n \n {currentItem.title}\n {currentItem.caption && (\n \n {currentItem.caption}\n \n )}\n \n )\n }\n >\n {items}\n
\n\n {/* group divider */}\n {drawerOpen && }\n >\n ) : (\n \n \n {itemIcon && (\n \n {currentItem.id === lastItemId ? : itemIcon}\n \n )}\n \n {currentItem.id === lastItemId ? \"More Items\" : currentItem.title}\n \n }\n />\n {openMini ? : }\n\n {anchorEl && (\n \n {({ TransitionProps }) => (\n \n \n \n \n {currentItem.id !== lastItemId ? items : moreItems}\n \n \n \n \n )}\n \n )}\n \n
\n )}\n >\n );\n};\n\nNavGroup.propTypes = {\n selectedID: PropTypes.string,\n setSelectedID: PropTypes.func,\n item: PropTypes.object,\n lastItem: PropTypes.number,\n remItems: PropTypes.array,\n lastItemId: PropTypes.string,\n parentId: PropTypes.string\n};\n\nexport default NavGroup;\n","// third-party\n\n// assets\nimport DashboardIcon from '@mui/icons-material/Dashboard';\nimport AnalyticsIcon from '@mui/icons-material/Analytics';\nimport CampaignIcon from '@mui/icons-material/Campaign';\nimport LiveTvIcon from '@mui/icons-material/LiveTv';\nimport WorkspacePremiumIcon from '@mui/icons-material/WorkspacePremium';\nimport FormatListBulletedRoundedIcon from '@mui/icons-material/FormatListBulletedRounded';\n// import ListIcon from '../assets/discovery/list-icon.svg'\n\nconst icons = {\n DashboardIcon: DashboardIcon,\n AnalyticsIcon: AnalyticsIcon,\n CampaignIcon: CampaignIcon,\n LiveTvIcon: LiveTvIcon,\n WorkspacePremiumIcon: WorkspacePremiumIcon,\n FormatListBulletedRoundedIcon: FormatListBulletedRoundedIcon,\n};\n\n// ==============================|| MENU ITEMS - DASHBOARD ||============================== //\n\nconst dashboard = {\n id: 'dashboard',\n title: '',\n icon: icons.DashboardIcon,\n type: 'group',\n children: [\n {\n id: 'discover',\n title: 'Discover',\n type: 'item',\n url: '/planner/discover',\n icon: icons.DashboardIcon,\n breadcrumbs: false,\n },\n {\n id: 'collab-list',\n title: 'Collab List',\n type: 'item',\n url: '/planner/collab-list',\n icon: icons.FormatListBulletedRoundedIcon,\n breadcrumbs: false,\n },\n {\n id: 'campaigns',\n title: 'Campaign',\n type: 'item',\n url: '/brand/campaigns',\n icon: icons.CampaignIcon,\n breadcrumbs: false,\n premiumIcon: icons.WorkspacePremiumIcon,\n },\n {\n id: 'competitors-analysis',\n title: 'Competitors Analysis',\n type: 'item',\n url: '/competitor-insights/',\n icon: icons.AnalyticsIcon,\n breadcrumbs: false,\n premiumIcon: icons.WorkspacePremiumIcon,\n },\n {\n id: 'curated-list',\n title: 'Curated List',\n type: 'item',\n url: '/planner/curated-list',\n icon: icons.LiveTvIcon,\n breadcrumbs: false,\n },\n ],\n};\n\nexport default dashboard;\n","import discover from './discover';\n\n\n// ==============================|| MENU ITEMS ||============================== //\n\nconst menuItems = {\n items: [discover]\n};\n\nexport default menuItems;\n","import { memo, useLayoutEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport Box from '@mui/material/Box';\nimport Divider from '@mui/material/Divider';\nimport List from '@mui/material/List';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\n// project imports\nimport NavItem from './NavItem';\nimport NavGroup from './NavGroup';\nimport menuItem from 'menu-items';\n\nimport config, { MenuOrientation } from 'config';\n// import { Menu } from 'menu-items/widget';\nimport { HORIZONTAL_MAX_ITEM } from 'config';\n\n// ==============================|| SIDEBAR MENU LIST ||============================== //\n\nconst MenuList = () => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n\n const { menuOrientation } = config;\n const menuLoading = false;\n const drawerOpen = useSelector((state) => state.planner2.drawerOpen);\n const isHorizontal = menuOrientation === MenuOrientation.HORIZONTAL && !downMD;\n\n const [selectedID, setSelectedID] = useState('');\n const [menuItems, setMenuItems] = useState({ items: [] });\n\n // let widgetMenu = Menu(); \n\n useLayoutEffect(() => {\n // const isFound = menuItem.items.some((element) => {\n // if (element.id === 'group-widget') {\n // return true;\n // }\n // return false;\n // });\n // if (menuLoading) {\n // menuItem.items.splice(1, 0, widgetMenu);\n // setMenuItems({ items: [...menuItem.items] });\n // } else if (!menuLoading && widgetMenu?.id !== undefined && !isFound) {\n // menuItem.items.splice(1, 1, widgetMenu);\n // setMenuItems({ items: [...menuItem.items] });\n // } else {\n // setMenuItems({ items: [...menuItem.items] });\n // }\n setMenuItems({ items: [...menuItem.items] });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menuLoading]);\n\n // last menu-item to show in horizontal menu bar\n const lastItem = isHorizontal ? HORIZONTAL_MAX_ITEM : null;\n\n let lastItemIndex = menuItems.items.length - 1;\n let remItems;\n let lastItemId;\n\n if (lastItem && lastItem < menuItems.items.length) {\n lastItemId = menuItems.items[lastItem - 1].id;\n lastItemIndex = lastItem - 1;\n remItems = menuItems.items.slice(lastItem - 1, menuItems.items.length).map((item) => ({\n title: item.title,\n elements: item.children,\n icon: item.icon,\n ...(item.url && {\n url: item.url\n })\n }));\n }\n\n const navItems = menuItems.items.slice(0, lastItemIndex + 1).map((item, index) => {\n switch (item.type) {\n case 'group':\n if (item.url && item.id !== lastItemId) {\n return (\n \n setSelectedID('')} />\n {!isHorizontal && index !== 0 && }\n
\n );\n }\n\n return (\n \n );\n default:\n return (\n \n Menu Items Error\n \n );\n }\n });\n\n return !isHorizontal ? {navItems} : <>{navItems}>;\n};\n\nexport default memo(MenuList);\n","// material-ui\nimport { styled } from '@mui/material/styles';\nimport Drawer from '@mui/material/Drawer';\n\n// project import\nimport { drawerWidth } from 'store/constant';\nimport { ThemeMode } from 'config';\n\nconst openedMixin = (theme) => ({\n width: drawerWidth,\n borderRight: 'none',\n zIndex: 1099,\n background: theme.palette.background.default,\n overflowX: 'hidden',\n boxShadow: theme.palette.mode === ThemeMode.DARK ? theme.customShadows.z1 : 'none',\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen + 200\n })\n});\n\nconst closedMixin = (theme) => ({\n borderRight: 'none',\n zIndex: 1099,\n background: theme.palette.background.default,\n overflowX: 'hidden',\n width: 72,\n transition: theme.transitions.create('width', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.leavingScreen + 200\n })\n});\n\n// ==============================|| DRAWER - MINI STYLED ||============================== //\n\nconst MiniDrawerStyled = styled(Drawer, { shouldForwardProp: (prop) => prop !== 'open' })(({ theme, open }) => ({\n width: drawerWidth,\n borderRight: '0px',\n flexShrink: 0,\n whiteSpace: 'nowrap',\n boxSizing: 'border-box',\n ...(open && {\n ...openedMixin(theme),\n '& .MuiDrawer-paper': openedMixin(theme)\n }),\n ...(!open && {\n ...closedMixin(theme),\n '& .MuiDrawer-paper': closedMixin(theme)\n })\n}));\n\nexport default MiniDrawerStyled;\n","import PropTypes from 'prop-types';\n\n// material-ui\nimport { alpha, useTheme } from '@mui/material/styles';\nimport MuiChip from '@mui/material/Chip';\n\n// project imports\nimport { ThemeMode } from 'config';\nimport { fontSize, fontWeight } from '@material-ui/system';\n\n// ==============================|| CHIP ||============================== //\n\nconst Chip = ({ chipcolor, disabled, sx = {}, variant, ...others }) => {\n const theme = useTheme();\n\n let defaultSX = {\n color: theme.palette.mode === ThemeMode.DARK ? 'primary.light' : 'primary.main',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'primary.main' : 'primary.light',\n ':hover': {\n color: 'primary.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? alpha(theme.palette.primary.dark, 0.9) : 'primary.dark'\n }\n };\n\n let outlineSX = {\n color: 'primary.main',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'primary.main',\n ':hover': {\n color: theme.palette.mode === ThemeMode.DARK ? 'primary.light' : 'primary.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'primary.main' : 'primary.dark'\n }\n };\n\n switch (chipcolor) {\n case 'secondary':\n variant === 'outlined'\n ? (outlineSX = {\n color: 'secondary.main',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'secondary.main',\n ':hover': {\n color: theme.palette.mode === ThemeMode.DARK ? 'secondary.light' : 'secondary.main',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'secondary.dark' : 'secondary.light'\n }\n })\n : (defaultSX = {\n color: theme.palette.mode === ThemeMode.DARK ? 'secondary.light' : 'secondary.main',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'secondary.dark' : 'secondary.light',\n ':hover': {\n color: 'secondary.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? alpha(theme.palette.secondary.dark, 0.9) : 'secondary.main'\n }\n });\n break;\n case 'success':\n variant === 'outlined'\n ? (outlineSX = {\n color: 'success.dark',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'success.dark',\n ':hover': {\n color: theme.palette.mode === ThemeMode.DARK ? 'success.light' : 'success.dark',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'success.dark' : alpha(theme.palette.success.light, 0.6)\n }\n })\n : (defaultSX = {\n color: theme.palette.mode === ThemeMode.DARK ? 'success.light' : 'success.dark',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'success.dark' : alpha(theme.palette.success.light, 0.6),\n ':hover': {\n color: 'success.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? alpha(theme.palette.success.dark, 0.9) : 'success.dark'\n }\n });\n break;\n case 'error':\n variant === 'outlined'\n ? (outlineSX = {\n color: 'error.main',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'error.main',\n ':hover': {\n color: theme.palette.mode === ThemeMode.DARK ? 'error.light' : 'error.dark',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'error.dark' : 'error.light'\n }\n })\n : (defaultSX = {\n color: theme.palette.mode === ThemeMode.DARK ? 'error.light' : 'error.dark',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? 'error.dark' : alpha(theme.palette.error.light, 0.6),\n ':hover': {\n color: 'error.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? alpha(theme.palette.error.dark, 0.9) : 'error.dark'\n }\n });\n break;\n case 'orange':\n variant === 'outlined'\n ? (outlineSX = {\n color: 'orange.dark',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'orange.main',\n ':hover': {\n color: 'orange.dark',\n bgcolor: 'orange.light'\n }\n })\n : (defaultSX = {\n color: 'orange.dark',\n bgcolor: 'orange.light',\n ':hover': {\n color: 'orange.light',\n bgcolor: 'orange.dark'\n }\n });\n break;\n case 'warning':\n variant === 'outlined'\n ? (outlineSX = {\n color: 'warning.dark',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'warning.dark',\n ':hover': {\n color: 'warning.dark',\n bgcolor: 'warning.light'\n }\n })\n : (defaultSX = {\n color: 'warning.dark',\n bgcolor: 'warning.light',\n ':hover': {\n color: 'warning.light',\n bgcolor: theme.palette.mode === ThemeMode.DARK ? alpha(theme.palette.warning.dark, 0.9) : 'warning.dark'\n }\n });\n break;\n default:\n }\n\n if (disabled) {\n variant === 'outlined'\n ? (outlineSX = {\n color: 'grey.500',\n bgcolor: 'transparent',\n border: '1px solid',\n borderColor: 'grey.500',\n ':hover': {\n color: 'grey.500',\n bgcolor: 'transparent'\n }\n })\n : (defaultSX = {\n color: 'grey.500',\n bgcolor: 'grey.50',\n ':hover': {\n color: 'grey.500',\n bgcolor: 'grey.50'\n }\n });\n }\n\n let SX = {...defaultSX, '& .MuiChip-label': {fontWeight: 800, fontSize: '0.8rem'}};\n if (variant === 'outlined') {\n SX = outlineSX;\n }\n SX = { ...SX, ...sx };\n return ;\n};\n\nChip.propTypes = {\n sx: PropTypes.object,\n chipcolor: PropTypes.string,\n variant: PropTypes.string,\n disabled: PropTypes.bool\n};\n\nexport default Chip;\n","import { memo, useMemo } from 'react';\nimport { useSelector } from 'react-redux';\n\n// material-ui\nimport Box from '@mui/material/Box';\nimport Drawer from '@mui/material/Drawer';\nimport Stack from '@mui/material/Stack';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\n\n// third-party\nimport PerfectScrollbar from 'react-perfect-scrollbar';\n\n// project imports\nimport MenuCard from './MenuCard';\nimport MenuList from '../MenuList';\nimport LogoSection from '../LogoSection';\nimport MiniDrawerStyled from './MiniDrawerStyled';\nimport Chip from 'ui-component/extended/Chip';\n\n\nimport config, { MenuOrientation } from 'config';\nimport { drawerWidth } from 'store/constant';\n\n\nconst Sidebar = () => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n const drawerOpen = useSelector((state) => state.planner2.drawerOpen);\n\n const { menuOrientation, miniDrawer } = config;\n\n const logo = useMemo(\n () => (\n \n \n \n ),\n []\n );\n\n const drawer = useMemo(() => {\n const isVerticalOpen = menuOrientation === MenuOrientation.VERTICAL && drawerOpen;\n const drawerContent = (\n <>\n \n {/* \n \n */}\n >\n );\n\n let drawerSX = { paddingLeft: '0px', paddingRight: '0px', marginTop: '20px' };\n if (drawerOpen) drawerSX = { paddingLeft: '16px', paddingRight: '16px', marginTop: '0px' };\n\n return (\n <>\n {downMD ? (\n \n \n {isVerticalOpen && drawerContent}\n \n ) : (\n \n \n {isVerticalOpen && drawerContent}\n \n )}\n >\n );\n }, [downMD, drawerOpen, menuOrientation]);\n\n return (\n {\n // setDrawerOpen(false)\n }}\n >\n {downMD || (miniDrawer && drawerOpen) ? (\n \n {downMD && logo}\n {drawer}\n \n ) : (\n \n {logo}\n {drawer}\n \n )}\n \n );\n};\n\nexport default memo(Sidebar);\n","// material-ui\nimport { styled } from '@mui/material/styles';\n\n// project-import\nimport { drawerWidth } from 'store/constant';\nimport { MenuOrientation, ThemeMode } from 'config';\n\n// ==============================|| MAIN LAYOUT - STYLED ||============================== //\n\nconst MainContentStyled = styled('main', {\n shouldForwardProp: (prop) => prop !== 'open' && prop !== 'borderRadius' && prop !== 'menuOrientation'\n})(({ theme, open, menuOrientation, borderRadius }) => ({\n backgroundColor: theme.palette.mode === ThemeMode.DARK ? theme.palette.dark[800] : theme.palette.grey[100],\n minWidth: '1%',\n width: '100%',\n minHeight: 'calc(100vh - 88px)',\n flexGrow: 1,\n padding: 20,\n marginTop: 88,\n marginRight: 20,\n borderRadius: `${borderRadius}px`,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n ...(!open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.shorter + 200\n }),\n [theme.breakpoints.up('md')]: {\n marginLeft: menuOrientation === MenuOrientation.VERTICAL ? -(drawerWidth - 72) : 20,\n width: `calc(100% - ${drawerWidth}px)`,\n marginTop: menuOrientation === MenuOrientation.HORIZONTAL ? 135 : 88\n }\n }),\n ...(open && {\n transition: theme.transitions.create('margin', {\n easing: theme.transitions.easing.easeOut,\n duration: theme.transitions.duration.shorter + 200\n }),\n marginLeft: menuOrientation === MenuOrientation.HORIZONTAL ? 20 : 0,\n marginTop: menuOrientation === MenuOrientation.HORIZONTAL ? 135 : 88,\n width: `calc(100% - ${drawerWidth}px)`,\n [theme.breakpoints.up('md')]: {\n marginTop: menuOrientation === MenuOrientation.HORIZONTAL ? 135 : 88\n }\n }),\n [theme.breakpoints.down('md')]: {\n marginLeft: 20,\n padding: 16,\n marginTop: 88,\n ...(!open && {\n width: `calc(100% - ${drawerWidth}px)`\n })\n },\n [theme.breakpoints.down('sm')]: {\n marginLeft: 10,\n marginRight: 10\n }\n}));\n\nexport default MainContentStyled;\n","import PropTypes from 'prop-types';\n\n// material-ui\nimport MuiAvatar from '@mui/material/Avatar';\n\n// ==============================|| AVATAR ||============================== //\n\nconst Avatar = ({ color, outline, size, sx, ...others }) => {\n const colorSX = color && !outline && { color: 'background.paper', bgcolor: `${color}.main` };\n const outlineSX = outline && {\n color: color ? `${color}.main` : `primary.main`,\n bgcolor: 'background.paper',\n border: '2px solid',\n borderColor: color ? `${color}.main` : `primary.main`\n };\n let sizeSX = {};\n switch (size) {\n case 'badge':\n sizeSX = { width: 28, height: 28 };\n break;\n case 'xs':\n sizeSX = { width: 34, height: 34 };\n break;\n case 'sm':\n sizeSX = { width: 40, height: 40 };\n break;\n case 'lg':\n sizeSX = { width: 72, height: 72 };\n break;\n case 'xl':\n sizeSX = { width: 82, height: 82 };\n break;\n case 'md':\n sizeSX = { width: 60, height: 60 };\n break;\n default:\n sizeSX = {};\n }\n\n return ;\n};\n\nAvatar.propTypes = {\n color: PropTypes.string,\n outline: PropTypes.bool,\n size: PropTypes.string,\n sx: PropTypes.object\n};\n\nexport default Avatar;\n","// material-ui\nimport TableRow from '@mui/material/TableRow';\nimport TableCell from '@mui/material/TableCell';\nimport Skeleton from '@mui/material/Skeleton';\nimport Stack from '@mui/material/Stack';\nimport Grid from '@mui/material/Grid';\n\n\nconst SkeletonTableRow = () => (\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 \n \n \n \n {[1, 2, 3].map((index) => (\n \n ))}\n \n \n \n);\n\nexport default SkeletonTableRow;\n","\nimport InstagramIcon from 'assets/discovery/insta-icon.png';\nimport YoutubeIcon from 'assets/discovery/youtube-icon.png';\n\nfunction SocialMediaButton({platform, url}) {\n return (\n \n \n \n );\n}\n\nexport default SocialMediaButton;\n","import axios from 'axios';\nimport { apiServer, apiServerV2, noAuthAPIServer2, apiServerFormDataV2,noAuthAPIServerV2 } from './index';\nimport { devConfig } from '../config';\nlet download = require('downloadjs');\nexport function checkProfilePermission(payload) {\n console.log('checkProfilePermission', payload);\n return apiServerV2\n .post(`discover/profile-access/status`, JSON.stringify(payload), {\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n .then((response) => response.data)\n .catch((error) => {\n console.error('Error in get Content Approval List:', error);\n throw error;\n });\n}\n\nexport function unlockProfile(id, profile_type) {\n let url = `discover/${id}/unlock`;\n if (profile_type) {\n url += '?is_premium=true';\n }\n return apiServerV2\n .get(url)\n .then((response) => response.data)\n .catch((error) => {\n console.error('Error in get Content Approval List:', error);\n throw error;\n });\n}\n\nexport function fetchNewInfluencer(payload) {\n return axios.post(\n `${devConfig.API_HOST}/api/v1/campaign/19/social_media/create/planner_profile/`,\n payload,\n {\n headers: {\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n },\n },\n );\n}\n\nexport function fetchCuratedList(platform, category, search, page, rowsPerPage) {\n let url = `discover/curated-all?platform=${platform}`;\n if (category) {\n url += `&category=${category}`;\n }\n if (search) {\n url += `&search=${search}`;\n }\n if (page && rowsPerPage) {\n url += `&page=${page}&rows_per_page=${rowsPerPage}`;\n }\n return apiServer\n .get(url)\n .then((response) => response.data)\n .catch((error) => {\n console.error('Error in get Currated List:', error);\n throw error;\n });\n}\n\nexport function fetchCuratedInfluencers(id, page,search) {\n return apiServer\n .get(`discover/curated-list?id=${id}&page=${page}&search=${search}`)\n .then((response) => {\n console.log('API Response:', response); // Log the entire response object\n return response.data;\n })\n .catch((error) => {\n console.error('Error in get Currated List:', error);\n throw error;\n });\n}\n\nexport function getDiscoveryInfluencersDetails(id) {\n return apiServerV2.get(`/discover/${id}`).then((response) => {\n return response.data;\n });\n}\n\nexport function getProfileUpdateStatus(iq_id) {\n return apiServerV2\n .get(`/discover/update-status?iq_id=${iq_id}`)\n .then((response) => {\n return response.data;\n })\n .catch((error) => {\n console.error('Profile not Found: ', error);\n throw error;\n });\n}\n\nexport function getPlans(brand_id) {\n return apiServer\n .get(`/discover/plan-list?brand_id=${brand_id}`)\n .then((response) => {\n return response.data;\n })\n .catch((error) => {\n console.error('Plan not Found: ', error);\n throw error;\n });\n}\n\nexport function addPlanProfiles(planId, data) {\n return apiServer.put(`/discover/plan/${planId}/add-iqprofile/`, JSON.stringify(data));\n}\n\nexport function createPlan(data) {\n return apiServer\n .post(`/discover/plan/create/`, JSON.stringify(data), {\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n .then((response) => response)\n .catch((error) => {\n console.error('Error in Creating a Plan', error);\n throw error;\n });\n}\n\nexport function fetchPlanList(brand_id, platform, search, page, rowsPerPage) {\n let url = `/discover/plan-list?brand_id=${brand_id}`;\n if (platform) {\n url += `&platform=${platform}`;\n }\n if (search) {\n url += `&search=${search}`;\n }\n if (page && rowsPerPage) {\n url += `&page=${page}&rows_per_page=${rowsPerPage}`;\n }\n return apiServer\n .get(url)\n .then((response) => response.data)\n .catch((error) => {\n console.error('Error in get Plan List:', error);\n throw error;\n });\n}\n\nexport function fetchPlanInfluencers(id, platform, page, sortBy, search = '') {\n console.log('search', search, platform);\n return noAuthAPIServer2\n .get(\n `discover/plan-influencer?uuid=${id}&platform=${platform}&sort-by=${sortBy}&page=${page}&search=${search}`,\n )\n .then((response) => {\n console.log('API Response:', response);\n return response.data;\n })\n .catch((error) => {\n console.error('Error in get Plan List:', error);\n throw error;\n });\n}\n\nexport const addCollabProfileLinks = async (uuid, instaLinks = [], ytLinks = []) => {\n try {\n const payload = {\n uuid: uuid,\n is_csv: false,\n insta_links: instaLinks,\n yt_links: ytLinks,\n };\n const response = await apiServerV2.post(\n 'discover/import-colab-profiles',\n JSON.stringify(payload),\n );\n return response;\n } catch (error) {\n console.error('Error uploading links:', error.response?.data || error.message);\n throw error;\n }\n};\n\nexport const uploadCsvFile = async (uuid, csvFile) => {\n try {\n const formData = new FormData();\n formData.append('uuid', uuid);\n formData.append('is_csv', true);\n formData.append('csv_file', csvFile);\n\n const response = await apiServerFormDataV2.post('discover/import-colab-profiles', formData);\n return response.data;\n } catch (error) {\n console.error('Error uploading CSV file:', error.response?.data || error.message);\n throw error;\n }\n};\n\nexport function colabImportStatus(planUUID) {\n let url = `/discover/colab-import-status?plan_uuid=${planUUID}`;\n return noAuthAPIServerV2\n .get(url)\n .then((response) => response.data)\n}\n\nexport function downloadStatus(planUUID) {\n // https://api-staging.influencer.in/api/v2/discover/colab-response-sheet?uuid=d363d604-389e-4f72-b446-ac6417359055\n let url = `/discover/colab-response-sheet?uuid=${planUUID}`;\n return (\n apiServerV2\n .get(url)\n // .then((response) => response.data)\n .catch((error) => {\n console.error('Error in getting status:', error);\n throw error;\n })\n );\n}\n\nexport function fetchPostWiseBifurcation(\n iq_id,\n is_paid=false, \n organic_post_type = 'all', \n organic_post_count = 12, \n paid_post_type='all', \n paid_post_count=12) {\n let url = `/discover/post-wise?iq_id=${iq_id}`;\n\n if (is_paid) {\n url += `&is_paid=true`;\n if (paid_post_type) {\n url += `&paid_post_type=${paid_post_type}`;\n }\n if (paid_post_count) {\n url += `&paid_post_count=${paid_post_count}`;\n }\n }\n\n else {\n url += `&organic_post_type=${organic_post_type}&organic_post_count=${organic_post_count}`\n }\n\n return apiServer\n .get(url)\n .then((response) => response.data)\n .catch((error) => {\n console.error('Error in fetching Post Wise Bifurcation:', error);\n throw error;\n });\n}\n\n","export default __webpack_public_path__ + \"static/media/list-icon.db5c0bbd.svg\";","import React, { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { styled } from '@mui/material/styles';\n\n// material-ui\nimport { yellow, grey } from '@mui/material/colors';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Checkbox from '@mui/material/Checkbox';\nimport Button from '@mui/material/Button';\n\n// project imports\nimport Avatar from 'ui-component/extended/Avatar';\nimport ExtendedChip from 'ui-component/extended/Chip';\n\n// assets\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport GroupIcon from '@mui/icons-material/Group';\nimport GroupAddIcon from '@mui/icons-material/GroupAdd';\nimport RemoveRedEyeIcon from '@mui/icons-material/RemoveRedEye';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport SellIcon from '@mui/icons-material/Sell';\nimport WorkspacePremiumIcon from '@mui/icons-material/WorkspacePremium';\nimport HttpsIcon from '@mui/icons-material/Https';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport SkeletonTableRow from './SkeletonTableRow';\nimport SocialMediaIcon from '../Extra/SocialMediaIcon';\n\nimport { updateSelectedInfluencers, showPremiumFeatureDialog, updateUser } from 'actions/planner2';\nimport { checkProfilePermission, unlockProfile } from 'api_handlers/planner2';\nimport { fetchNewInfluencer } from 'api_handlers/planner2';\nimport { getDiscoveryInfluencersDetails } from 'api_handlers/planner2';\n\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { DialogActions } from '@mui/material';\n\nimport mixpanel from 'mixpanel-browser';\n\nimport FormatListBulletedRoundedIcon from '@mui/icons-material/FormatListBulletedRounded';\nimport ListIcon from '../../../../assets/discovery/list-icon.svg';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\nconst getCategoryChips = (row) => {\n const categories = [];\n\n if (row.primary_category && row.primary_category.name && row.primary_category.name.length > 0) {\n categories.push(row.primary_category.name);\n }\n\n const categoryChips = categories.slice(0, 3).map((category, index) => (\n \n \n \n ));\n\n if (!row.interest_categories) return categoryChips;\n\n row.interest_categories.forEach((category) => {\n categories.push(category);\n });\n\n if (categories.length <= 3) return categoryChips;\n\n return (\n <>\n {categoryChips}\n {\n \n \n \n }\n >\n );\n};\n\nconst StyledTableRow = styled(TableRow)(({ theme }) => ({\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n '& .action-container': {\n visibility: 'visible',\n opacity: 1,\n },\n },\n}));\n\n// const ActionButton = styled(Button)(({ theme, vibrate }) => ({\n// visibility: 'hidden',\n// opacity: 0,\n// position: 'absolute',\n// right: theme.spacing(2),\n// bottom: '-20px',\n// // transform: 'translateY(-50%)',\n// transition: 'visibility 0s, opacity 0.5s linear',\n// fontSize: '10px',\n// animation: vibrate ? 'vibrate 0.2s ease 5' : 'none', // Vibrate 5 times for 1 second total\n// '@keyframes vibrate': {\n// '0%': { transform: 'translateX(0)' },\n// '25%': { transform: 'translateX(-2px)' },\n// '50%': { transform: 'translateX(2px)' },\n// '75%': { transform: 'translateX(-2px)' },\n// '100%': { transform: 'translateX(0)' },\n// },\n// }));\n\nconst StyledHeaderColumn = ({ name, Icon }) => {\n return (\n \n \n \n \n \n \n \n {name}\n \n \n \n \n );\n};\n\nconst StyledTableCell = ({ children }) => {\n return (\n \n \n {children}\n \n \n );\n};\n\nconst UserList = ({ influencers, loading, handleAddToCampaign }) => {\n const user = useSelector((state) => state.planner2.user);\n const selected = useSelector((state) => state.planner2.selectedInfluencers);\n const [updateStatus, setUpdateStatus] = React.useState('');\n\n let history = useHistory();\n const dispatch = useDispatch();\n\n const [profilePermissionMap, setProfilePermissionMap] = React.useState({});\n const [unlockedProfilePermissionMap, setUnlockedProfilePermissionMap] = React.useState({});\n const [loaderMap, setLoaderMap] = React.useState({});\n\n const [showUnlockedProfileCreditOver, setShowUnlockedProfileCreditOver] = React.useState(false);\n const [showPremiumProfileCreditOver, setShowPremiumProfileCreditOver] = React.useState(false);\n const [showIQProfileNotExists, setShowIQProfileNotExists] = React.useState(false);\n\n const [vibrate, setVibrate] = useState(false);\n\n const skeletonCount = Array.from({ length: 20 });\n\n const setSelected = (newSelected) => {\n dispatch(updateSelectedInfluencers(newSelected));\n };\n\n const onSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = influencers.map((n) => n.id);\n setSelected(new Set(newSelecteds));\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"discover_select_all_list\")\n }\n return;\n }\n setSelected(new Set());\n };\n\n const handleClick = (event, id) => {\n if (selected.has(id)) {\n const newSelected = new Set(selected);\n newSelected.delete(id);\n setSelected(newSelected);\n } else {\n setSelected(new Set(selected).add(id));\n }\n };\n\n const fetchDetails = async (getId) => {\n if (getId) {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: !vibrate ? false : true };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n console.log('fetch details', loaderMap);\n\n try {\n const response = await getDiscoveryInfluencersDetails(getId);\n\n // if (response?.update_status === 'updating') {\n // setUpdateStatus('updating');\n // }\n // if (response?.update_status === 'updated') {\n // setUpdateStatus('updated');\n // }\n return response;\n } catch (error) {\n console.error('Error fetching details:', error);\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n } finally {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n }\n }\n };\n\n const handleShowDetails = async (row, open) => {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: true };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n let response = await fetchDetails(row.id);\n if (row.url && row.url.indexOf('https://www.instagram.com/None') > -1) {\n row.url = response.url;\n }\n console.log('2 loader mapp', loaderMap[row.id]);\n const isLoading = loaderMap[row.id];\n if (!isLoading) {\n if (profilePermissionMap[row.id]) {\n if (!unlockedProfilePermissionMap[row.id]) {\n try {\n const resp = await unlockProfile(row.id, false);\n if (resp?.detail === 'Success') {\n openProfileHandler(row, false);\n } else {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n }\n } catch (error) {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n if (error && error.response && error.response.status === 403) {\n showUnlockedProfileCreditOver(true);\n }\n }\n } else {\n openProfileHandler(row, false);\n }\n } else {\n if (open === true) {\n setVibrate((vibrate) => !vibrate);\n setTimeout(() => setVibrate(false), 1000);\n } else {\n unlockProfileHandler(row);\n }\n }\n } else {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n }\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(async () => {\n const resp = await checkProfilePermission({\n payload: {\n profile_ids: influencers.map((inf) => inf.id),\n },\n });\n setProfilePermissionMap(resp['profile_id_access_map']['standard-profiles'] || {});\n setUnlockedProfilePermissionMap(resp['profile_id_access_map']['unlocked-profiles'] || {});\n }, [influencers]);\n\n const openProfileHandler = (row, is_premium) => {\n dispatch(updateUser());\n setProfilePermissionMap((prevData) => ({\n ...prevData,\n [row.id]: true,\n }));\n setUnlockedProfilePermissionMap((prevData) => ({\n ...prevData,\n [row.id]: true,\n }));\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"Insights viewed\", {\n \"url\": `/planner/profile-details/${row.platform}/${\n row.platform === 'instagram'\n ? `${row.url.split('/')[3]}`\n : `${row.url.split('/')[4]}`\n }`,\n \"type\": (is_premium ? 'Premium' : 'standard')\n });\n }\n window.open(\n `/planner/profile-details/${row.platform}/${\n row.platform === 'instagram' ? `${row.url.split('/')[3]}` : `${row.url.split('/')[4]}`\n }`,\n '_blank',\n );\n };\n\n const unlockProfileHandler = async (row) => {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: true };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n try {\n if (!row.audience_data_exist) {\n const { data } = await fetchNewInfluencer({\n payload: {\n link: row.url,\n 'with-audience-data': true,\n },\n });\n if (data.data && data.data.dump && Object.keys(data.data.dump).length === 0) {\n setShowIQProfileNotExists(true);\n return;\n }\n }\n\n const resp = await unlockProfile(row.id, true);\n if (resp?.detail === 'Success') {\n openProfileHandler(row, true);\n } else {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n }\n } catch (error) {\n setLoaderMap((prevLoaderMap) => {\n console.log('Previous loaderMap:', prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log('Updated loaderMap:', newLoaderMap);\n return newLoaderMap;\n });\n if (error && error.response && error.response.status === 403) {\n setShowPremiumProfileCreditOver(true);\n }\n }\n };\n\n return (\n \n \n \n \n \n 0 && selected.size < influencers.length}\n checked={influencers.length > 0 && selected.size === influencers.length}\n onChange={onSelectAllClick}\n inputProps={{\n 'aria-label': 'select all desserts',\n }}\n />\n \n \n {/* */}\n \n \n \n \n \n \n \n \n \n \n \n \n Categories\n \n \n \n \n \n \n \n \n {loading ? skeletonCount.map((_, index) => ) : null}\n\n {influencers && influencers.length > 0\n ? influencers.map((row, index) => {\n const isItemSelected = selected.has(row.id);\n return (\n \n handleClick(event, row.id)}\n >\n \n \n \n \n {\n await handleShowDetails(row, true);\n }}\n />\n \n \n {\n await handleShowDetails(row, true);\n }}\n >\n {row.name?row.name.length<20?row.name:`${row.name.slice(0,20)}...`:''}\n \n \n \n \n \n \n {row.language}\n \n \n \n \n {/* \n }\n label={`SPEED: ${row.speed_score}`}\n chipcolor=\"success\"\n sx={{\n '& .MuiChip-label': {\n fontWeight: 800,\n fontSize: '0.7rem',\n paddingLeft: '6px',\n paddingRight: '6px'\n },\n '& .MuiChip-avatar': {height: 15, marginLeft: 0},\n height: 25\n }}\n />\n */}\n {row.followers} \n {row.engagement_rate} \n {row.avg_views} \n {row.prediction?.enagaged_users_display} \n {row.city} \n \n \n {getCategoryChips(row)}\n \n \n \n \n \n {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"discover_add_to_list\", {\n \"type\": \"collab_list\"\n })\n }\n // if (user.premium_user) \n handleAddToCampaign([row.id], 'Planner');\n // else dispatch(showPremiumFeatureDialog(true));\n }}\n startIcon={\n \n }\n sx={{\n fontSize: 10,\n width: '130px',\n }}\n \n >\n Add to List\n \n \n \n {\n if (user.premium_user) handleAddToCampaign([row.id], 'AddToCampaign');\n else dispatch(showPremiumFeatureDialog(true));\n }}\n sx={{\n fontSize: 10,\n width: '130px',\n }}\n startIcon={\n \n }\n >\n Add to Campaign\n \n \n \n \n {\n if (user?.credit_balance === 0 && !profilePermissionMap[row.id]) {\n setShowPremiumProfileCreditOver(true);\n } else if (\n !user?.premium_user &&\n user?.fetched_credit_balance === 0 &&\n profilePermissionMap[row.id] &&\n !unlockedProfilePermissionMap[row.id]\n ) {\n setShowUnlockedProfileCreditOver(true);\n } else {\n handleShowDetails(row, false);\n }\n }}\n style={{\n color: loaderMap[row.id] ? 'black' : 'black',\n fontSize: 10,\n width: '130px',\n }}\n sx={{\n animation: vibrate ? 'vibrate 0.2s ease 5' : 'none',\n '@keyframes vibrate': {\n '0%': { transform: 'translateX(0)' },\n '25%': { transform: 'translateX(-2px)' },\n '50%': { transform: 'translateX(2px)' },\n '75%': { transform: 'translateX(-2px)' },\n '100%': { transform: 'translateX(0)' },\n },\n }}\n startIcon={\n loaderMap[row.id] ? (\n \n ) : profilePermissionMap[row.id] ? : (\n \n )\n }\n disabled={loaderMap[row.id]}\n >\n {loaderMap[row.id] ? 'Loading' : 'Show Details'}\n \n \n \n \n \n \n );\n })\n : null}\n \n
\n {showUnlockedProfileCreditOver ? (\n \n {\n setShowUnlockedProfileCreditOver(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n {\n setShowUnlockedProfileCreditOver(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n You’ve reached the limit of unlocking standard profiles. Use your remaining credits to\n unlock premium profiles or upgrade for unlimited access.\n \n \n {\n setShowUnlockedProfileCreditOver(false);\n dispatch(showPremiumFeatureDialog(true));\n }}\n >\n Upgrade\n \n \n \n \n ) : null}\n {showPremiumProfileCreditOver ? (\n \n {\n setShowPremiumProfileCreditOver(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n {\n setShowPremiumProfileCreditOver(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n You’ve used all your premium credits. Upgrade to unlock more premium profiles!\n \n \n {\n setShowPremiumProfileCreditOver(false);\n dispatch(showPremiumFeatureDialog(true));\n }}\n >\n Upgrade\n \n \n \n \n ) : null}\n {showIQProfileNotExists ? (\n \n {\n setShowIQProfileNotExists(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n We are fetching the data for this profile.\n \n {\n setShowIQProfileNotExists(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n \n \n Please wait while we are fetching the latest data for this profile, you can come\n back and check later.\n
\n \n \n \n ) : null}\n \n );\n};\n\nexport default UserList;\n","import React, { useEffect, useState } from 'react';\nimport { useHistory } from \"react-router-dom\";\nimport { useSelector, useDispatch } from 'react-redux';\nimport { styled } from '@mui/material/styles';\n\n\n// material-ui\nimport { yellow, grey } from '@mui/material/colors';\nimport IconButton from '@mui/material/IconButton';\nimport Stack from '@mui/material/Stack';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport Checkbox from '@mui/material/Checkbox';\nimport Button from '@mui/material/Button';\n\n\n// project imports\nimport Avatar from 'ui-component/extended/Avatar';\nimport ExtendedChip from 'ui-component/extended/Chip';\n\n\n// assets\nimport AccountCircleIcon from '@mui/icons-material/AccountCircle';\nimport GroupIcon from '@mui/icons-material/Group';\nimport GroupAddIcon from '@mui/icons-material/GroupAdd';\nimport RemoveRedEyeIcon from '@mui/icons-material/RemoveRedEye';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport SellIcon from '@mui/icons-material/Sell';\nimport WorkspacePremiumIcon from '@mui/icons-material/WorkspacePremium';\nimport HttpsIcon from '@mui/icons-material/Https';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\n\nimport SkeletonTableRow from './SkeletonTableRow'\nimport SocialMediaIcon from '../Extra/SocialMediaIcon'\n\nimport { updateSelectedInfluencers, showPremiumFeatureDialog, updateUser } from 'actions/planner2'\nimport { checkProfilePermission, unlockProfile } from 'api_handlers/planner2'\nimport { fetchNewInfluencer } from 'api_handlers/planner2'\nimport { getDiscoveryInfluencersDetails } from 'api_handlers/planner2';\n\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { DialogActions } from '@mui/material';\n\nimport mixpanel, { push } from 'mixpanel-browser';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n})); \n\nconst getCategoryChips = (row) => {\n const categories = [];\n\n if (row.primary_category && row.primary_category.name && row.primary_category.name.length > 0) {\n categories.push(row.primary_category.name);\n }\n\n const categoryChips = categories.slice(0, 3).map((category, index) => (\n \n ));\n\n if(!row.interest_categories) return categoryChips;\n\n\n row.interest_categories.forEach((category) => {\n categories.push(category);\n });\n \n\n if(categories.length <= 3) return categoryChips;\n\n return (\n <>\n {categoryChips}\n {\n \n }\n >\n )\n}\n\n\nconst StyledTableRow = styled(TableRow)(({ theme }) => ({\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n '& .action-button': {\n visibility: 'visible',\n opacity: 1,\n },\n },\n }));\n \n const ActionButton = styled(Button)(({ theme }) => ({\n visibility: 'hidden',\n opacity: 0,\n position: 'absolute',\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n transition: 'visibility 0s, opacity 0.5s linear',\n fontSize:'10px',\n marginTop:'60%',\n }));\n\nconst StyledHeaderColumn = ({name, Icon}) => {\n return (\n \n \n \n {name} \n \n \n )\n}\n\nconst StyledTableCell = ({children}) => {\n return (\n \n \n {children}\n \n \n )\n}\n\n\nconst PlannerUserList = ({influencers, loading, handleAddToCampaign, openShareDialog, setShareDialogOpen, listName, isAuth}) => {\n const user = useSelector((state) => state.planner2.user);\n const selected = useSelector((state) => state.planner2.selectedInfluencers);\n const [updateStatus, setUpdateStatus] = React.useState('')\n\n let history = useHistory()\n const dispatch = useDispatch();\n\n const [profilePermissionMap, setProfilePermissionMap] = React.useState({});\n const [unlockedProfilePermissionMap, setUnlockedProfilePermissionMap] = React.useState({});\n const [loaderMap, setLoaderMap] = React.useState({});\n\n const [showUnlockedProfileCreditOver, setShowUnlockedProfileCreditOver] = React.useState(false);\n const [showPremiumProfileCreditOver, setShowPremiumProfileCreditOver] = React.useState(false);\n const [showIQProfileNotExists, setShowIQProfileNotExists] = React.useState(false);\n\n const skeletonCount = Array.from({ length: 20 });\n \n\n const setSelected = (newSelected) => {\n if (isAuth !== 'noAuth'){\n dispatch(updateSelectedInfluencers(newSelected))\n }\n }\n\n\n const onSelectAllClick = (event) => {\n if (isAuth === \"noAuth\") {\n return\n }\n if (event.target.checked) {\n const newSelecteds = influencers.map((n) => n.id);\n setSelected(new Set(newSelecteds));\n return;\n }\n setSelected(new Set());\n };\n\n const handleClick = (event, id) => {\n if (selected.has(id)) {\n const newSelected = new Set(selected);\n newSelected.delete(id);\n setSelected(newSelected);\n } else {\n setSelected(new Set(selected).add(id));\n }\n };\n\n const fetchDetails = async (getId) => {\n if (getId) {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: true };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n console.log(\"fetch details\", loaderMap)\n\n try {\n const response = await getDiscoveryInfluencersDetails(getId);\n\n // if (response?.update_status === 'updating') {\n // setUpdateStatus('updating');\n // }\n // if (response?.update_status === 'updated') {\n // setUpdateStatus('updated');\n // }\n return response;\n } catch (error) {\n console.error(\"Error fetching details:\", error);\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n } finally {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [getId]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n }\n }\n };\n\n\n const handleShowDetails = async (row) => {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: true };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n let response = await fetchDetails(row.id);\n if (row.url && row.url.indexOf('https://www.instagram.com/None') > -1) {\n row.url = response.url;\n }\n console.log(\"2 loader mapp\", loaderMap[row.id])\n const isLoading = loaderMap[row.id];\n if (!isLoading) {\n if (profilePermissionMap[row.id]) {\n if (!unlockedProfilePermissionMap[row.id]) {\n try {\n if (isAuth !== 'noAuth'){\n const resp = await unlockProfile(row.id, false)\n if(resp?.detail === \"Success\") {\n openProfileHandler(row)\n } else {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n }\n }\n } catch(error) {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n if (error && error.response && error.response.status === 403) {\n showUnlockedProfileCreditOver(true);\n }\n }\n } else {\n openProfileHandler(row);\n }\n } else {\n unlockProfileHandler(row);\n }\n } else {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n }\n };\n \n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(async () => {\n if (isAuth !== 'noAuth'){\n const resp = await checkProfilePermission({\n payload: {\n profile_ids: influencers.map(inf => inf.id)\n }\n })\n setProfilePermissionMap(resp['profile_id_access_map']['standard-profiles'] || {})\n setUnlockedProfilePermissionMap(resp['profile_id_access_map']['unlocked-profiles'] || {})\n }\n\n }, [influencers])\n\n const openProfileHandler = (row) => {\n if (isAuth !== 'noAuth'){\n dispatch(updateUser())\n }\n setProfilePermissionMap((prevData) => ({\n ...prevData,\n [row.id]: true\n }))\n setUnlockedProfilePermissionMap((prevData) => ({\n ...prevData,\n [row.id]: true\n }))\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Insights viewed\", {\n \"url\": `/planner/profile-details/${row.platform}/${\n row.platform === 'instagram'\n ? `${row.url.split('/')[3]}`\n : `${row.url.split('/')[4]}`\n }`\n });\n }\n window.open(\n `/planner/profile-details/${row.platform}/${\n row.platform === 'instagram'\n ? `${row.url.split('/')[3]}`\n : `${row.url.split('/')[4]}`\n }`,\n '_blank',\n )\n }\n\n const unlockProfileHandler = async (row) => {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: true };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n try {\n if(!row.audience_data_exist && isAuth !== 'noAuth') {\n const { data } = await fetchNewInfluencer({\n payload: {\n link: row.url,\n \"with-audience-data\": true\n },\n });\n if (data.data && data.data.dump && Object.keys(data.data.dump).length === 0) {\n setShowIQProfileNotExists(true);\n return;\n }\n }\n\n const resp = await unlockProfile(row.id, true);\n if(resp?.detail === \"Success\") {\n openProfileHandler(row)\n } else {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n }\n } catch(error) {\n setLoaderMap(prevLoaderMap => {\n console.log(\"Previous loaderMap:\", prevLoaderMap);\n const newLoaderMap = { ...prevLoaderMap, [row.id]: false };\n console.log(\"Updated loaderMap:\", newLoaderMap);\n return newLoaderMap;\n });\n if (error && error.response && error.response.status === 403) {\n setShowPremiumProfileCreditOver(true);\n }\n }\n }\n\n const handleShareClose = () => {\n setShareDialogOpen(false);\n };\n\n const handleCopyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n };\n\n return (\n \n \n \n \n \n 0 && selected.size < influencers.length}\n checked={influencers.length > 0 && selected.size === influencers.length}\n onChange={onSelectAllClick}\n inputProps={{\n 'aria-label': 'select all desserts'\n }}\n />\n \n \n {/* */}\n \n \n \n \n \n \n \n \n Categories \n \n \n \n \n \n \n {loading ? (skeletonCount.map((_, index) => (\n \n ))) : null}\n\n {influencers && influencers.length > 0 ? (\n influencers.map((row, index) => {\n const isItemSelected = selected.has(row.id);\n return (\n \n {\n if (isAuth !== \"noAth\") {\n handleClick(event, row.id)}\n }\n }\n >\n \n \n \n \n \n \n \n {row.name} \n \n \n \n \n \n {row.language}\n \n \n \n \n {/* \n }\n label={`SPEED: ${row.speed_score}`}\n chipcolor=\"success\"\n sx={{\n '& .MuiChip-label': {\n fontWeight: 800,\n fontSize: '0.7rem',\n paddingLeft: '6px',\n paddingRight: '6px'\n },\n '& .MuiChip-avatar': {height: 15, marginLeft: 0},\n height: 25\n }}\n />\n */}\n {row.followers} \n {row.engagement_rate} \n {row.avg_views} \n {row.prediction?.enagaged_users_display} \n {row.city} \n \n \n {getCategoryChips(row)}\n \n \n \n \n {/* {\n if(user.premium_user) handleAddToCampaign([row.id],'Planner')\n // else dispatch(showPremiumFeatureDialog(true));\n \n }}\n sx={{left: profilePermissionMap[row.id] ? '-403px' : '-430px', width: '130px'}}\n // startIcon={ }\n >\n Add to List\n */}\n {/* {\n if(user.premium_user) handleAddToCampaign([row.id],'AddToCampaign')\n else dispatch(showPremiumFeatureDialog(true));\n \n }}\n sx={{right: profilePermissionMap[row.id] ? '150px' : '170px', width: '130px'}}\n startIcon={}\n >\n Add to Campaign\n */}\n \n {\n if (user?.credit_balance === 0 && !profilePermissionMap[row.id]) {\n setShowPremiumProfileCreditOver(true);\n } else if (!user?.premium_user && user?.fetched_credit_balance === 0 && (profilePermissionMap[row.id] && !unlockedProfilePermissionMap[row.id])) {\n setShowUnlockedProfileCreditOver(true);\n } else {\n if (isAuth !== \"noAuth\") {\n handleShowDetails(row)\n }\n else if(isAuth === \"noAuth\"){\n history.push('/login')\n }\n }\n }}\n style={{ color: loaderMap[row.id] ? 'black' : 'black', width: profilePermissionMap[row.id] ? '130px' : '130px' }}\n startIcon={\n loaderMap[row.id] ? (\n \n ) : profilePermissionMap[row.id] ? : (\n \n )\n }\n disabled={loaderMap[row.id]}\n >\n {loaderMap[row.id] ? 'Loading' : 'Show Details' }\n \n \n \n \n \n \n )})\n ) : null\n }\n \n
\n\n {/* \n {listName} \n \n \n {window.location.href}\n \n \n \n \n Copy Link\n \n \n Close\n \n \n */}\n\n {\n showUnlockedProfileCreditOver ? \n \n {\n setShowUnlockedProfileCreditOver(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n \n {\n setShowUnlockedProfileCreditOver(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n You’ve reached the limit of unlocking standard profiles. Use your remaining credits to unlock premium profiles or upgrade for unlimited access.\n \n \n {\n setShowUnlockedProfileCreditOver(false);\n if(isAuth !== 'noAuth'){\n dispatch(showPremiumFeatureDialog(true));\n }\n }}>\n Upgrade\n \n \n \n \n : null\n }\n {\n showPremiumProfileCreditOver ? \n \n {\n setShowPremiumProfileCreditOver(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n \n {\n setShowPremiumProfileCreditOver(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n You’ve used all your premium credits. Upgrade to unlock more premium profiles!\n \n \n {\n setShowPremiumProfileCreditOver(false);\n if(isAuth !== 'noAuth'){\n dispatch(showPremiumFeatureDialog(true));\n }\n }}>\n Upgrade\n \n \n \n \n : null\n }\n {\n showIQProfileNotExists ? \n \n {\n setShowIQProfileNotExists(false);\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n We are fetching the data for this profile.\n \n {\n setShowIQProfileNotExists(false);\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n \n \n Please wait while we are fetching the latest data for this profile, you can come back and check later.\n
\n \n \n \n : null\n }\n \n );\n};\n\nexport default PlannerUserList;\n","import PropTypes from 'prop-types';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Button from '@mui/material/Button';\nimport Card from '@mui/material/Card';\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\n\n// project import\nimport { ThemeMode } from 'config';\n\n// assets\nimport CalendarMonthIcon from '@mui/icons-material/CalendarMonth';\nimport PersonAddTwoToneIcon from '@mui/icons-material/PersonAddTwoTone';\nimport PeopleAltTwoToneIcon from '@mui/icons-material/PeopleAltTwoTone';\n\n\nconst CampaignCard = ({ name, start_date, added, handleAddToCampaign, id, planName, created_at }) => {\n const theme = useTheme();\n \n\n return (\n \n \n \n \n {/* \n \n */}\n \n {planName && (\n \n {planName}\n \n )}\n \n {name}\n \n {planName ? (\n \n \n {created_at}\n \n ): (\n \n \n {start_date}\n \n )}\n \n \n \n \n {added ? (\n }>\n Added\n \n ) : (\n } onClick={() => {\n handleAddToCampaign(id);\n }}>\n Add\n \n )}\n \n \n \n );\n};\n\nCampaignCard.propTypes = {\n avatar: PropTypes.string,\n follow: PropTypes.number,\n location: PropTypes.string,\n name: PropTypes.string,\n planName: PropTypes.string\n};\n\nexport default CampaignCard;\n","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\nimport { useTheme } from '@mui/material/styles';\n\nimport Button from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Grid from '@mui/material/Grid';\nimport { TextField, MenuItem } from '@mui/material';\nimport { useSelector } from 'react-redux';\n\nimport { gridSpacing } from 'store/constant';\nimport { getCampaigns, addInfluencerToCampaign } from 'api_handlers/campaign';\nimport { getPlans, addPlanProfiles, createPlan } from 'api_handlers/planner2';\n\nimport CampaignCard from './CampaignCard';\nimport mixpanel from 'mixpanel-browser';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\nexport default function AdvancedFilters({ open, setOpen, influencers, text }) {\n const [campaigns, setCampaigns] = React.useState([]);\n const [addedInCampaigns, setAddedInCampaigns] = React.useState([]);\n const [planner, setPlanner] = React.useState([]);\n const [addedInPlan, setAddedInPlan] = React.useState([]);\n const [isCreatingPlan, setIsCreatingPlan] = React.useState(false);\n const [planName, setPlanName] = React.useState('');\n const [tags, setTags] = React.useState('');\n const [platform, setPlatform] = React.useState('all');\n const [errors, setErrors] = React.useState({ planName: 'List Name is required' });\n const user = useSelector((state) => state.planner2.user);\n\n const handleClose = () => {\n setAddedInPlan([]);\n setOpen(false);\n setIsCreatingPlan(false);\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const fetchData = async () => {\n try {\n if (text === 'Planner') {\n // Fetch data for Planner\n const plannerData = await getPlans(user.brand.id);\n console.log('Planner Data', plannerData.results.plans_lists);\n const plansArray = Object.keys(plannerData.results.plans_lists || {}).map((key) => ({\n ...plannerData.results.plans_lists[key],\n planName: key,\n }));\n console.log('planner', planner);\n setPlanner(plansArray);\n } else {\n // Fetch default campaigns data\n const resp = await getCampaigns();\n setCampaigns(resp);\n }\n } catch (error) {\n console.error('Error fetching data:', error);\n }\n };\n\n React.useEffect(() => {\n fetchData();\n }, [text]);\n\n const handleAddToCampaign = async (campaignId) => {\n const { data } = await addInfluencerToCampaign(campaignId, {\n profiles: influencers.map((influencer) => influencer.id),\n });\n\n if (data.success) {\n setAddedInCampaigns((prevValue) => [...prevValue, campaignId]);\n }\n };\n\n const handlePlanner = async (planId) => {\n try {\n const { data } = await addPlanProfiles(planId, {\n iq_profile_ids: influencers.map((influencer) => influencer.id),\n });\n\n if (data.msg) {\n setAddedInPlan((prevValue) => [...prevValue, planId]);\n console.log(data.msg);\n }\n } catch (error) {\n console.error('Error adding influencers to the plan:', error);\n }\n };\n\n const handleCreatePlan = () => {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"discover_create_list\", {\n \"type\": \"collab_list\"\n })\n }\n setIsCreatingPlan(true);\n };\n\n const handleSubmitPlan = async () => {\n // Validate Plan Name\n if (!planName.trim()) {\n setErrors({ planName: 'List Name is required' });\n return;\n }\n\n // Proceed with creating the plan\n try {\n const response = await createPlan({\n name: planName,\n brand_id: user.brand.id, // Replace with actual brand_id\n tags: tags,\n platform: platform,\n iq_profile_ids: influencers.map((influencer) => influencer.id),\n });\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"collab_list_created\", {\n name: planName,\n brand_id: user.brand.id,\n tags: tags,\n platform: platform,\n source: 'discover'\n })\n }\n setAddedInPlan([...addedInPlan, response.data.plan_id])\n console.log('Create Response: ', response);\n\n if (response.status === 201) {\n setPlanName('');\n setTags('');\n setPlatform('all');\n setErrors({});\n setIsCreatingPlan(false); // Close the form\n fetchData();\n } else {\n // console.error('Error creating plan:', data);\n }\n } catch (error) {\n console.error('Error submitting plan:', error);\n }\n };\n\n return (\n \n \n \n {text === 'AddToCampaign' ? 'Add To Campaign' : text === 'Planner' ? 'Collab List' : ''}\n \n theme.palette.grey[500],\n }}\n >\n \n \n \n {!isCreatingPlan ? (\n \n {text === 'AddToCampaign'\n ? campaigns.map((campaign, index) => (\n \n \n \n ))\n : text === 'Planner'\n ? planner.map((plan, index) => (\n \n \n \n ))\n : ''}\n \n ) : text === 'Planner' ? (\n \n ) : (\n setIsCreatingPlan(false)\n )}\n \n \n {!isCreatingPlan ? (\n text === 'Planner' ? (\n \n \n \n Done\n \n \n \n \n Create List\n \n \n \n ) : (\n {\n handleClose();\n }}\n >\n Close\n \n )\n ) : (\n \n Submit\n \n )}\n \n \n \n );\n}\n","export default __webpack_public_path__ + \"static/media/tick.079a5158.png\";","export default __webpack_public_path__ + \"static/media/empty.6ad77992.jpg\";","import PersonAddIcon from '@mui/icons-material/PersonAdd';\nimport AddLinkIcon from '@mui/icons-material/AddLink';\nimport ScreenSearchDesktopIcon from '@mui/icons-material/ScreenSearchDesktop';\nimport UploadFileIcon from '@mui/icons-material/UploadFile';\nimport CloseIcon from '@mui/icons-material/Close';\nimport CloudUploadIcon from '@mui/icons-material/CloudUpload';\nimport SystemUpdateAltIcon from '@mui/icons-material/SystemUpdateAlt';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport YouTubeIcon from '@mui/icons-material/YouTube';\nimport { Box, Button, Grid, IconButton, Modal, TextField, Typography } from '@mui/material';\nimport { useEffect, useState } from 'react';\nimport mixpanel from 'mixpanel-browser';\nimport { useHistory } from 'react-router-dom';\nimport { uploadCsvFile, addCollabProfileLinks, colabImportStatus } from 'api_handlers/planner2';\n\nfunction AddInfluencerModal({\n open,\n close,\n planPlatform,\n planUUID,\n bulkUploadingStatus,\n downloadReport,\n statusData,\n}) {\n const [openUploadCsvModal, setOpenUploadCsvModal] = useState(false);\n const [openAddBulkModal, setOpenAddBulkModal] = useState(false);\n const [instaSelected, setInstaSelected] = useState(false);\n const [ytSelected, setYtSelected] = useState(false);\n const [text, setText] = useState('');\n const [instaLinks, setInstaLinks] = useState([]);\n const [ytLinks, setYtLinks] = useState([]);\n const [file, setFile] = useState(null);\n const [platform, setPlatform] = useState(\n planPlatform === 'instagram' ? 'instagram' : planPlatform === 'youtube' ? 'youtube' : '',\n );\n const history = useHistory();\n\n const [csvFile, setCsvFile] = useState(null);\n // const [statusData, setStatusData] = useState({\n // total_count: 0,\n // success_count: 0,\n // failed_count: 0,\n // });\n\n const handleFileChange = (event) => {\n const selectedFile = event.target.files[0];\n if (selectedFile) {\n setFile(selectedFile);\n }\n };\n\n const handleDiscoverClick = () => {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track('collab_list_add_influencer');\n }\n history.push('/planner/discover');\n };\n\n // api to upload csv\n const handleCsvUpload = async (csvFile) => {\n if (!csvFile) {\n alert('Please select a file to upload.');\n return;\n }\n try {\n // const response = await uploadCsvFile(planUUID, csvFile);\n\n // console.log('CSV upload response:', response);\n await uploadCSVFiles(csvFile);\n setOpenUploadCsvModal(false);\n } catch (error) {\n console.error('Error uploading CSV file:', error);\n }\n };\n\n const uploadCSVFiles = (csvFile) => {\n const response = uploadCsvFile(planUUID, csvFile);\n const interval = setInterval(() => {\n importStatus(interval);\n }, 2);\n };\n\n const collabBulkLink = () => {\n const response = addCollabProfileLinks(planUUID, instaLinks, ytLinks);\n // const response2 = colabImportStatus(planUUID);\n const interval = setInterval(() => {\n importStatus(interval);\n }, 2);\n };\n\n // api to bulk upload link\n const handleLinkUpload = async () => {\n if (!instaLinks.length && !ytLinks.length) {\n alert('Please add links to upload.');\n return;\n }\n try {\n await collabBulkLink();\n // const response = await addCollabProfileLinks(planUUID, instaLinks, ytLinks); // Create and use uploadLinks API\n // const statusInterval = setInterval(async()=>{\n // await importStatus()\n // },3000)\n // const timeOut = setTimeout=(async()=>{\n // await clearInterval(statusInterval)\n // }, 3000)\n setOpenAddBulkModal(false);\n } catch (error) {\n console.error('Error uploading links:', error);\n }\n };\n\n // api to check the progress\n const importStatus = async (interval) => {\n try {\n const response = await colabImportStatus(planUUID);\n // console.log('importStatus', response);\n if (response.total_count === response.success_count + response.failed_count) {\n clearInterval(interval);\n }\n statusData({\n total_count: response.total_count || 0,\n success_count: response.success_count || 0,\n failed_count: response.failed_count || 0,\n });\n // setStatusData({\n // total_count: response.total_count || 0,\n // success_count: response.success_count || 0,\n // failed_count: response.failed_count || 0,\n // });\n } catch (error) {\n console.error('Error fetching plan import status:', error);\n }\n };\n\n const handleOnChange = (event) => {\n if (platform === 'instagram') {\n const value = event.target.value;\n setText(value);\n const link = value.split(`\\n`);\n setInstaLinks(link);\n } else if (platform === 'youtube') {\n const value = event.target.value;\n setText(value);\n const link = value.split(`\\n`);\n setYtLinks(link);\n }\n };\n\n \n return (\n \n \n \n {!openUploadCsvModal && !openAddBulkModal ? (\n \n \n \n \n \n \n \n Add Influencers\n \n \n close(false)}>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Upload CSV,XLS,XLSX\n \n \n \n setOpenUploadCsvModal(true)}\n >\n Add Now\n \n \n \n \n \n \n \n \n \n \n \n Import Bulk Links\n \n \n \n setOpenAddBulkModal(true)}\n >\n Add Now\n \n \n \n \n \n \n \n \n \n \n \n Add From Discover\n \n \n \n \n Add Now\n \n \n \n \n \n \n \n ) : openUploadCsvModal ? (\n \n \n \n \n \n Upload Influencers\n \n \n \n close(false)}>\n \n \n \n \n \n \n \n \n \n \n \n Drop files here \n \n \n \n Supported format: CSV, XLS, XLSX\n \n \n \n OR \n \n\n \n {\n document.getElementById('file-input').click();\n }}\n >\n Browse files\n \n \n \n \n {file ? file.name : ''} \n \n \n \n \n \n \n Note - Please download the sample sheet and upload the same, you can add upto \n 30 influencers at a time.\n \n \n \n }\n sx={{\n textTransform: 'none',\n color: '#000',\n borderColor: '#d8dbe0',\n mt: 1,\n height: 30,\n }}\n onClick={() => {\n window.open(\n 'https://docs.google.com/spreadsheets/d/1FgpO-AdjnHm51z_z8AXXiXTalHa1paEwWatCeVqdgEw/edit?usp=sharing',\n '_blank',\n );\n }}\n >\n Sample Sheet\n \n \n \n \n \n \n \n \n setOpenUploadCsvModal(false)}\n >\n Back\n \n \n \n {\n handleCsvUpload(file);\n bulkUploadingStatus(true);\n }}\n >\n Upload\n \n \n \n \n \n ) : (\n ''\n )}\n {openAddBulkModal ? (\n \n \n \n \n \n Add Bulk Links\n \n \n \n close(false)}>\n \n \n \n \n \n \n \n \n {\n setInstaSelected(true);\n setInstaLinks([]);\n setYtLinks([]);\n setText('');\n setYtSelected(false);\n setPlatform('instagram');\n }}\n variant=\"contained\"\n sx={\n instaSelected || planPlatform === 'instagram'\n ? { width: '120px' }\n : { width: '120px', background: '#dedede', color: '#000' }\n }\n startIcon={ }\n disabled={planPlatform === 'youtube' ? true : false}\n >\n Instagram\n \n \n \n {\n setYtSelected(true);\n setInstaSelected(false);\n setInstaLinks([]);\n setYtLinks([]);\n setText('');\n setPlatform('youtube');\n }}\n variant=\"contained\"\n sx={\n ytSelected || planPlatform === 'youtube'\n ? { width: '120px' }\n : { width: '120px', background: '#dedede', color: '#000' }\n }\n startIcon={ }\n disabled={planPlatform === 'instagram' ? true : false}\n >\n YouTube\n \n \n \n \n \n \n \n Paste your links here, one link per line \n \n \n \n \n \n \n \n Note - You can add upto 30 influencers at a time for the selected platform.\n \n \n \n \n \n setOpenAddBulkModal(false)}\n >\n Back\n \n \n \n {\n setInstaLinks([]);\n setYtLinks([]);\n setText('');\n handleLinkUpload();\n bulkUploadingStatus(true);\n }}\n >\n Add\n \n \n \n \n \n \n ) : (\n ''\n )}\n \n \n \n );\n}\n\nexport default AddInfluencerModal;\n","import React, { useEffect, useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\n\n// material-ui\nimport Grid from '@mui/material/Grid';\nimport MenuItem from '@mui/material/MenuItem';\nimport Pagination from '@mui/material/Pagination';\nimport Typography from '@mui/material/Typography';\nimport Select from '@mui/material/Select';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Snackbar from '@mui/material/Snackbar';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport ShareIcon from '@mui/icons-material/Share';\nimport CloseIcon from '@mui/icons-material/Close';\n\nimport MainCard from 'ui-component/cards/MainCard';\nimport { useHistory } from 'react-router-dom';\n\n// project imports\nimport UserList from './UserList';\nimport PlannerUserList from './PlannerUserList';\nimport AddToCampaignModal from './AddToCampaignModal';\nimport { InputAdornment, Modal, Slide } from '@material-ui/core';\nimport Tick from '../../../../assets/discovery/tick.png';\nimport ListIcon from '../../../../assets/discovery/list-icon.svg';\nimport SearchIcon from '@mui/icons-material/Search';\nimport AddIcon from '@mui/icons-material/Add';\nimport { gridSpacing } from 'store/constant';\nimport { getPlannerDownload } from 'api_handlers/discovery';\nimport { showPremiumFeatureDialog, fetchInfluencersAction, updatePage } from 'actions/planner2';\nimport { updateFilters } from 'actions/planner-filters';\nimport empty from '../../../../assets/discovery/empty.jpg';\nimport WorkspacePremiumIcon from '@mui/icons-material/WorkspacePremium';\n\nimport mixpanel from 'mixpanel-browser';\nimport { OutlinedInput, SnackbarContent } from '@mui/material';\nimport AddInfluencerModal from './AddInfluencerModal';\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\n\nimport { colabImportStatus } from 'api_handlers/planner2';\n\nconst scrollToTop = async () => {\n window.scrollTo({\n top: 0,\n behavior: 'auto', // This enables smooth scrolling\n });\n};\n\n// ==============================|| USER LIST STYLE 1 ||============================== //\n\nconst InfluencerList = ({\n influencers,\n totalResults,\n loading,\n isAuth,\n onPlatformChange,\n noInfluencers,\n listName,\n onPageChange,\n onSortChange,\n onSearch,\n isDiscover,\n planPlatform,\n useCategorySort,\n planUUID,\n errorMassage,\n downloadReport,\n successMassage,\n successCount,\n filters,\n // updateFilters,\n}) => {\n const dispatch = useDispatch();\n const user = useSelector((state) => state.planner2.user);\n const page = useSelector((state) => state.planner2.page);\n const selectedInfluencers = useSelector((state) => state.planner2.selectedInfluencers);\n const [platform, setPlatform] = React.useState('all');\n const [sortBy, setSortBy] = React.useState(useCategorySort ? 'category' : 'followers');\n const [openAddToCampaign, setOpenAddToCampaign] = React.useState(false);\n const [openModalCondition, setOpenModalCondition] = useState('');\n const [buttonVariant, setButtonVariant] = useState('outlined');\n const [addToCampaignInfluencers, setAddToCampaignInfluencers] = React.useState([]);\n const [shareDialogOpen, setShareDialogOpen] = useState(false);\n const [bulkUploadingStatus, setBulkUploadingStatus] = useState(false);\n const [searchInfluencer, setSearchInfluencer] = useState('');\n const [openAddInfluencerModal, setOpenAddInfluencerModal] = useState(false);\n const [uploadStatus, setUploadStatus] = useState({});\n const [isSortApplied, setIsSortApplied] = useState(false);\n const [statusData, setStatusData] = useState({\n total_count: 1,\n success_count: 0,\n failed_count: 0,\n });\n const history = useHistory();\n // const [localPayload, setLocalPayload] = React.useState({...payload})\n\n const conditionalDispatch = (action) => {\n if (isAuth !== 'noAuth') {\n dispatch(action);\n }\n };\n\n const updatePageWithoutDispatch = (updatedPage) => {\n onPageChange(updatedPage);\n };\n\n const handleSortByChange = (event) => {\n const newSortBy = event.target.value;\n setSortBy(newSortBy);\n if (isAuth === 'planner' || isAuth === 'noAuth') {\n onSortChange(newSortBy);\n }\n };\n\n useEffect(() => {\n conditionalDispatch(updateFilters('sortBy', sortBy, true, true));\n }, [sortBy]);\n\n const handleDownload = () => {\n getPlannerDownload({\n selected_ids: Array.from(selectedInfluencers),\n objective: '',\n prediction: {},\n contacts: 'not_req',\n selectedColumns: [],\n });\n };\n\n const handleAddToCampaign = (influencerIds, isAuth) => {\n setOpenModalCondition(isAuth);\n const infs = influencers.filter((inf) => influencerIds.includes(inf.id));\n setAddToCampaignInfluencers(infs);\n setOpenAddToCampaign(true);\n };\n\n const handlePlatformChange = (event) => {\n const newPlatform = event.target.value;\n setPlatform(newPlatform);\n onPlatformChange(newPlatform);\n };\n\n const handleDiscoverClick = () => {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track('collab_list_add_influencer');\n }\n history.push('/planner/discover');\n };\n const handleShareClick = () => {\n // Copy the current page URL to the clipboard\n // navigator.clipboard.writeText(window.location.href);\n setButtonVariant('contained');\n setShareDialogOpen(true);\n navigator.clipboard.writeText(window.location.href);\n // setTimeout(() => setButtonVariant('outlined'), 2000);\n };\n\n function SlideTransition(props) {\n return ;\n }\n\n const handleClose = (event, reason) => {\n if (reason === 'clickaway') {\n return;\n }\n setShareDialogOpen(false);\n };\n\n const handleCLoseBulkStatus = (event, reason) => {\n if (reason === 'clickaway') {\n return;\n }\n setBulkUploadingStatus(false);\n };\n\n function handleAddInfluencers() {\n if (isAuth === 'noAuth') {\n history.push('/signup');\n } else {\n setOpenAddInfluencerModal(true);\n }\n }\n // function handleAddInfluencersClose() {\n // setAddInfluencerModal(false);\n // }\n\n useEffect(() => {\n if (isDiscover) {\n if (\n isSortApplied === false &&\n (Object.keys(filters).length > 6 ||\n filters.bio ||\n filters.category ||\n filters.ids ||\n filters.posts)\n ) {\n setSortBy('followers');\n setIsSortApplied(true);\n }else if(filters.platform === 'youtube' ){\n setIsSortApplied(true)\n } else if (\n isSortApplied === true &&\n filters.sortBy === 'category' &&\n Object.keys(filters).length === 6 &&\n filters.platform === 'instagram' &&\n filters.bio === null &&\n filters.category === null &&\n filters.ids === null &&\n filters.posts === null\n ) {\n setSortBy('category');\n setIsSortApplied(false);\n }\n }\n }, [filters]);\n useEffect(() => {\n if (isAuth === 'planner') {\n if (!isDiscover) {\n try {\n const uploadingStatus = setInterval(() => {\n colabImportStatus(planUUID).then((resp) => {\n setUploadStatus(resp);\n // console.log('response', resp);\n if (resp.status === 'processing') {\n setBulkUploadingStatus(true);\n setStatusData((data) => ({\n ...data,\n total_count: resp.total_count,\n success_count: resp.success_count,\n failed_count: resp.failed_count,\n }));\n }\n if (\n resp.status === 'completed' ||\n resp.status === 'Draft' ||\n resp.success_count + resp.failed_count === resp.total_count\n ) {\n // setBulkUploadingStatus(false);\n colabImportStatus(planUUID).then(async (resp) => {\n await setUploadStatus(resp);\n if (resp.status === 'completed') {\n setStatusData((data) => ({\n ...data,\n total_count: resp.total_count,\n success_count: resp.success_count,\n failed_count: resp.failed_count,\n }));\n }\n });\n clearInterval(uploadingStatus);\n }\n });\n }, 500);\n } catch (e) {\n console.log('error', e);\n throw e;\n }\n }\n }\n }, []);\n\n useEffect(() => {\n if (statusData.failed_count > 0) {\n errorMassage(true);\n }\n if (\n bulkUploadingStatus &&\n statusData.total_count > 0 &&\n statusData.success_count === statusData.total_count\n ) {\n successMassage(true);\n }\n if (statusData.success_count + statusData.failed_count < statusData.total_count) {\n setOpenAddInfluencerModal(false);\n }\n if (!isDiscover) {\n successCount(statusData.success_count);\n }\n }, [statusData.failed_count, statusData.success_count, statusData.total_count]);\n return (\n \n {openAddInfluencerModal ? (\n setOpenAddInfluencerModal(val)}\n planPlatform={planPlatform}\n planUUID={planUUID}\n bulkUploadingStatus={(val) => setBulkUploadingStatus(val)}\n errorMassage={(val) => errorMassage(val)}\n downloadReport={downloadReport}\n statusData={(val) =>\n setStatusData((data) => ({\n ...data,\n total_count: val.total_count,\n success_count: val.success_count,\n failed_count: val.failed_count,\n }))\n }\n >\n {' '}\n \n ) : (\n ''\n )}\n \n \n {isAuth === 'planner' || isAuth === 'noAuth' ? listName : 'INFLUENCERS'} (\n {parseInt(totalResults).toLocaleString('en-IN')})\n \n \n\n \n \n {!isDiscover ? (\n \n \n {\n onSearch(event.target.value);\n // setSearchInfluencer(event.target.value);\n }}\n startAdornment={\n \n \n \n }\n > \n \n \n ) : (\n ''\n )}\n {isAuth === 'planner' || isAuth === 'noAuth' ? (\n \n \n Platform \n handlePlatformChange(event)}\n label=\"Platform\"\n >\n All Platforms \n Instagram \n YouTube \n \n \n \n ) : (\n ''\n )}\n\n \n \n Sort by \n \n {useCategorySort && Category }\n Followers \n Avg Views \n ER \n \n \n \n\n {isAuth === 'planner' || (isAuth === 'noAuth' && !noInfluencers) ? (\n \n \n More \n \n \n More Actions\n \n \n Share List\n \n \n Add Influencers\n \n \n \n \n ) : null}\n \n \n \n }\n content={false}\n >\n {noInfluencers ? (\n <>\n \n \n No influencers have been added to this list !\n \n setOpenAddInfluencerModal(true)}\n >\n Add Influencers\n \n >\n ) : (\n // Otherwise show the respective list based on the isAuth prop\n <>\n {isAuth === 'planner' || isAuth === 'noAuth' ? (\n \n ) : (\n \n )}\n >\n )}\n\n {/* {text === 'planner'?\n :\n } */}\n \n \n \n {\n if (user.premium_user || updatedPage < 4) {\n if (isAuth === 'planner' || isAuth === 'noAuth') {\n updatePageWithoutDispatch(updatedPage);\n }\n conditionalDispatch(updatePage(updatedPage));\n conditionalDispatch(fetchInfluencersAction(updatedPage));\n scrollToTop();\n if (process.env.NODE_ENV === 'production') {\n if (isDiscover) {\n mixpanel.track(`Discover - Page clicked`, {\n page: updatedPage,\n });\n } else {\n mixpanel.track(`Page clicked`, {\n page: updatedPage,\n });\n }\n }\n } else conditionalDispatch(showPremiumFeatureDialog(true));\n }}\n />\n \n \n \n 0 && !openAddToCampaign}\n >\n \n \n \n \n Selected {selectedInfluencers.size} influencers\n \n \n \n {\n // if (user.premium_user) {\n handleAddToCampaign(Array.from(selectedInfluencers), 'Planner');\n // } else {\n // conditionalDispatch(showPremiumFeatureDialog(true));\n // }\n }}\n startIcon={ }\n >\n Add to List\n \n \n \n {\n if (user.premium_user) {\n handleAddToCampaign(Array.from(selectedInfluencers), 'AddToCampaign');\n } else {\n conditionalDispatch(showPremiumFeatureDialog(true));\n }\n }}\n startIcon={ }\n >\n Add to Campaign\n \n \n \n {\n if (user.premium_user) {\n handleDownload();\n } else {\n conditionalDispatch(showPremiumFeatureDialog(true));\n }\n }}\n startIcon={ }\n >\n Download\n \n \n \n \n \n \n \n {/* */}\n url is copied\n \n }\n autoHideDuration={1500}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n \n Uploading Status\n \n \n \n \n Influencers Added Successfully :{' '}\n {`${statusData.success_count}/${statusData.total_count}`}\n \n \n \n \n Influencers Failed to add :{' '}\n {`${statusData.failed_count}/${statusData.total_count}`}\n \n \n \n \n \n \n {statusData.total_count > 0 &&\n statusData.failed_count + statusData.success_count === statusData.total_count ? (\n setBulkUploadingStatus(false)}>\n \n \n ) : (\n ''\n )}\n \n \n \n }\n > \n \n {isAuth !== 'noAuth' && (\n \n )}\n \n );\n};\n\nexport default InfluencerList;\n","\nimport React, { useMemo } from 'react'\nimport { useDispatch } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\n\nimport { updateFilters } from 'actions/planner-filters';\n\n\nconst AutocompleteFilter = ({ title, payloadKey, options, value }) => {\n const dispatch = useDispatch();\n // const selectedValues = useMemo(() => value.length > 0 ? value.split(',') : [], [value])\n // console.log(\"in autocomplete\", title, selectedValues, value)\n\n return (\n \n \n \n {title}\n \n \n \n option.label}\n renderInput={(params) => }\n onChange={(_, newValue) => {\n dispatch(updateFilters(payloadKey, newValue))\n }}\n limitTags={1}\n fullWidth\n />\n \n \n )\n}\n\nexport default AutocompleteFilter","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\n\nimport { gridSpacing } from 'store/constant';\n\nimport SliderFilter from './SliderFilter'\nimport AutocompleteFilter from './AutocompleteFilter';\n\nimport { getLanguages } from 'api_handlers/influencer';\nimport { getDeliverables } from 'api_handlers/brand';\nimport { getPlannerCountries, getCityStateList } from 'api_handlers/discovery';\n\nimport { updateFilters } from 'actions/planner-filters';\n\nconst InfluencerFilters = () => {\n const dispatch = useDispatch();\n const engagementRate = useSelector(state => state.plannerFilters.engagementRate);\n const engagedUsers = useSelector(state => state.plannerFilters.engagedUsers);\n const views = useSelector(state => state.plannerFilters.views);\n const ageGroup = useSelector(state => state.plannerFilters.ageGroup);\n\n const [languageOptions, setLocationOptions] = React.useState([]);\n const [deliverableOptions, setDeliverableOptions] = React.useState([]);\n const [countryOptions, setCountryOptions] = React.useState([]);\n const [stateOptions, setStateOptions] = React.useState([]);\n // const [cityOptions, setCityOptions] = React.useState([]);\n\n \n // eslint-disable-next-line react-hooks/exhaustive-deps\n React.useEffect(async () => {\n const langs = await getLanguages();\n setLocationOptions([...langs.map((language) => language.name)]);\n\n const deliverableResponse = await getDeliverables()\n setDeliverableOptions([...deliverableResponse.data.map((deliverable) => deliverable)]);\n\n const countryResponse = await getPlannerCountries();\n setCountryOptions([...countryResponse.data.filter(option => option)]);\n\n const stateResponse = await getCityStateList();\n setStateOptions([...stateResponse.data.filter(option => option)]);\n\n // const cityResponse = await getCityStateList(true);\n // setCityOptions([...cityResponse.data.filter(option => option)]);\n\n\n \n }, [])\n\n return (\n \n \n \n \n \n \n \n \n \n \n {/* Age Group Filter */}\n \n \n \n \n Age Group\n \n \n \n {\n dispatch(updateFilters('ageGroup', event.target.value))\n }}\n label=\"Age Group\"\n fullWidth\n size='small'\n >\n 13 - 17 \n 18 - 24 \n 25 - 34 \n 35 - 44 \n 45 - 64 \n 65 - \n \n \n \n \n\n\n {/* Language Filter */}\n \n \n \n\n {/* Deliverables Filter */}\n \n \n \n \n\n {/* Country Filter */}\n \n \n \n\n {/* State Filter */}\n \n \n \n\n {/* Region Filter */}\n \n \n \n\n \n )\n}\n\nexport default InfluencerFilters;","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { styled } from '@mui/system';\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport Slider from '@mui/material/Slider';\nimport TextField from '@mui/material/TextField';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\n\nimport { updateFilters } from 'actions/planner-filters';\n\n\nfunction formatNumber(num) {\n if (num >= 1e9) {\n return (num / 1e9).toFixed(0) + 'B';\n }\n if (num >= 1e6) {\n return (num / 1e6).toFixed(0) + 'M';\n }\n if (num >= 1e3) {\n return (num / 1e3).toFixed(0) + 'K';\n }\n return num.toString();\n}\n\n\nconst StyledTypography = styled(Typography)({\n wordWrap: 'break-word',\n // Alternatively, you can use overflowWrap\n // overflowWrap: 'break-word',\n});\n\nconst SliderFilter = ({title, min=0, max=100, showTextField=false, useScale=false}) => {\n const dispatch = useDispatch();\n const genderSliderValue = useSelector((state) => state.plannerFilters.audienceGenderSliderValue)\n const genderSelectValue = useSelector((state) => state.plannerFilters.audienceGenderSelectValue)\n\n return (\n \n \n \n {title}\n \n \n \n {\n dispatch(updateFilters('audienceGenderSelectValue', event.target.value))\n }}\n label=\"Platform\"\n fullWidth\n size='small'\n >\n Male \n Female \n \n\n \n \n {\n dispatch(updateFilters('audienceGenderSliderValue', newValue))\n }}\n valueLabelDisplay=\"auto\"\n getAriaValueText={(value) => formatNumber(value)}\n valueLabelFormat={(value) => formatNumber(value)}\n max={max}\n min={min}\n />\n \n {showTextField && (\n \n // \n // \n // }\n />\n )}\n \n )\n}\n\nexport default SliderFilter","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\n\nimport { gridSpacing } from 'store/constant';\n\nimport SliderFilter from './SliderFilter'\nimport GenderSplitSliderFilter from './GenderSplitSliderFilter';\nimport AutocompleteFilter from './AutocompleteFilter';\n\nimport { getCityStateList } from 'api_handlers/discovery';\nimport { getPlannerAudienceInterests } from 'api_handlers/discovery';\n\nimport { updateFilters } from 'actions/planner-filters';\n\n\n\nconst InfluencerFilters = () => {\n const dispatch = useDispatch();\n const audienceCredibility = useSelector((state) => state.plannerFilters.audienceCredibility);\n const ageGroup = useSelector((state) => state.plannerFilters.audienceAgeGroup);\n const audienceInterest = useSelector((state) => state.plannerFilters.audienceInterest);\n const audienceLocation = useSelector((state) => state.plannerFilters.audienceLocation);\n\n const [categoryOptions, setCategoryOptions] = React.useState([]);\n\n\n const [cityOptions, setCityOptions] = React.useState([]);\n\n \n // eslint-disable-next-line react-hooks/exhaustive-deps\n React.useEffect(async () => {\n\n const cityResponse = await getCityStateList(true);\n setCityOptions([...cityResponse.data.filter(option => option)]);\n\n const fieldOfInterest = await getPlannerAudienceInterests();\n setCategoryOptions([...fieldOfInterest]);\n \n }, [])\n\n return (\n \n \n \n \n\n \n \n \n \n Age Group\n \n \n \n {\n dispatch(updateFilters('audienceAgeGroup', event.target.value))\n }}\n label=\"Age Group\"\n fullWidth\n size='small'\n >\n 13 - 17 \n 18 - 24 \n 25 - 34 \n 35 - 44 \n 45 - 64 \n 65 - \n \n \n \n \n\n {/* Interest Filter */}\n \n \n \n\n {/* Location Filter */}\n \n \n \n\n {/* Gender Split Filter */}\n \n \n \n\n \n )\n}\n\nexport default InfluencerFilters;","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Select from '@mui/material/Select';\nimport MenuItem from '@mui/material/MenuItem';\nimport Typography from '@mui/material/Typography';\n\nimport { updateFilters } from 'actions/planner-filters';\n\n\nconst SelectFilter = ({title, payloadKey, selectOptions}) => {\n const dispatch = useDispatch();\n const value = useSelector((state) => state.plannerFilters[payloadKey]);\n\n return (\n \n \n \n {title}\n \n \n \n {\n dispatch(updateFilters(payloadKey, event.target.value))\n }}\n label={payloadKey}\n fullWidth\n size='small'\n >\n {selectOptions.map(option => {\n return {option.label} \n })}\n \n \n \n )\n}\n\nexport default SelectFilter;","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport TextField from '@mui/material/TextField';\n\nimport { updateFilters } from 'actions/planner-filters';\n\n\nconst TextFilter = ({title, payloadKey}) => {\n const dispatch = useDispatch();\n const value = useSelector((state) => state.plannerFilters[payloadKey]);\n\n return (\n \n \n \n {title}\n \n \n \n {\n dispatch(updateFilters(payloadKey, parseInt(event.target.value)))\n }}/>\n \n \n )\n}\n\nexport default TextFilter;","import React from 'react';\n\nimport Grid from '@mui/material/Grid';\n\nimport { gridSpacing } from 'store/constant';\n\nimport SelectFilter from './SelectFilter';\nimport TextFilter from './TextFilter';\n\n\nconst InternalTeamFilters = () => {\n\n\n return (\n \n {/* Influencer Final Price Filter */}\n \n \n \n\n {/* Brand Final Price Filter */}\n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n \n )\n}\n\nexport default InternalTeamFilters;","import * as React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport Button from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\nimport CardContent from '@mui/material/CardContent';\nimport Divider from '@mui/material/Divider';\nimport Tab from '@mui/material/Tab';\nimport Tabs from '@mui/material/Tabs';\n\nimport MainCard from 'ui-component/cards/MainCard';\nimport { gridSpacing } from 'store/constant';\nimport config, { ThemeMode } from 'config';\n\n// assets\nimport BudgetFilters from './components/BudgetFilters';\nimport InfluencerFilters from './components/InfluencerFilters';\nimport AudienceFilters from './components/AudienceFilters';\nimport InternalTeamFilters from './components/InternalTeamFilters';\n\nimport { fetchInfluencersAction } from 'actions/planner2';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\nfunction TabPanel({ children, value, index, ...other }) {\n return (\n \n {value === index &&
{children}
}\n
\n );\n}\n\nfunction a11yProps(index) {\n return {\n id: `simple-tab-${index}`,\n 'aria-controls': `simple-tabpanel-${index}`,\n };\n}\n\n// tabs option\nconst tabsOption = [\n {\n label: 'Budget',\n },\n {\n label: 'Engagement',\n },\n {\n label: 'Audience',\n },\n {\n label: 'Internal Team',\n },\n];\n\nexport default function AdvancedFilters({ open, setOpen }) {\n const dispatch = useDispatch();\n const { mode } = config;\n const handleClose = () => {\n setOpen(false);\n };\n\n const user = useSelector((state) => state.planner2.user);\n const [value, setValue] = React.useState(0);\n\n const filteredTabsOption = user.is_staff\n ? tabsOption.filter((tab) => tab) // Show only Internal Team tab\n : tabsOption.filter((tab) => tab.label !== 'Internal Team'); // Show all tabs except Internal Team\n\n\n const handleChange = (event, newValue) => {\n setValue(newValue);\n };\n\n return (\n \n \n \n Advanced Filters\n \n theme.palette.grey[500],\n }}\n >\n \n \n \n \n \n \n \n \n \n svg': {\n mb: '0px !important',\n mr: 1.1\n }\n }}\n >\n {filteredTabsOption.map((tab, index) => (\n \n \n {tab.label}\n \n \n }\n {...a11yProps(index)}\n />\n ))}\n \n \n \n \n \n \n \n \n \n \n {user.is_staff ? (\n \n \n \n ): \"\"}\n \n \n {/* \n \n \n \n */}\n \n \n \n \n \n \n {\n dispatch(fetchInfluencersAction(1));\n handleClose();\n }}>\n Apply\n \n \n \n \n );\n}\n","import PropTypes from 'prop-types';\n\nimport React from 'react';\n\n// material-ui\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardHeader from '@mui/material/CardHeader';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/Typography';\n\n// project-import\nimport { ThemeMode } from 'config';\nimport useConfig from 'hooks/useConfig';\n\n// ==============================|| CUSTOM SUB CARD ||============================== //\n\nconst SubCard = React.forwardRef(\n ({ children, content, contentClass, darkTitle, secondary, sx = {}, contentSX = {}, title, ...others }, ref) => {\n const { mode } = useConfig();\n const defaultShadow = mode === ThemeMode.DARK ? '0 2px 14px 0 rgb(33 150 243 / 10%)' : '0 2px 14px 0 rgb(32 40 45 / 8%)';\n\n return (\n \n {/* card header and action */}\n {!darkTitle && title && (\n {title}} action={secondary} />\n )}\n {darkTitle && title && (\n {title}} action={secondary} />\n )}\n\n {/* content & header divider */}\n {title && }\n\n {/* card content */}\n {content && (\n \n {children}\n \n )}\n {!content && children}\n \n );\n }\n);\n\nSubCard.propTypes = {\n children: PropTypes.node,\n content: PropTypes.bool,\n contentClass: PropTypes.string,\n darkTitle: PropTypes.bool,\n secondary: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object]),\n sx: PropTypes.object,\n contentSX: PropTypes.object,\n title: PropTypes.oneOfType([PropTypes.node, PropTypes.string, PropTypes.object])\n};\n\nSubCard.defaultProps = {\n content: true\n};\n\nexport default SubCard;\n","\n\nconst circleSx = {\n // width: '100px',\n // height: '100px',\n // backgroundColor: '#4CAF50',\n color: 'black',\n fontSize: '14px',\n fontWeight: 'bold',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '50%',\n textAlign: 'center',\n position: 'absolute',\n lineHeight: 1.2 // No quotes needed for numeric values\n};\n\n\nconst CreatorTypeCircle = ({color, size, text1, text2, top, left}) => {\n return (\n \n {text1} {text2}\n
\n )\n}\n\nexport default CreatorTypeCircle;","\nimport Grid from '@mui/material/Grid';\nimport SubCard from 'ui-component/cards/SubCard';\n\nimport CreatorTypeCircle from './CreatorTypeCircle';\n\nconst containerSx = {\n position: 'relative',\n // width: 600,\n height: 250,\n}\n\nconst Spends = ({predictions}) => {\n const { mega, macro, micro, nano } = predictions.creator_type;\n\n return (\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Spends;\n","import * as React from 'react';\nimport { useSelector } from 'react-redux';\nimport { useTheme } from '@mui/material/styles';\n\n\nimport Button from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\n\nimport SubCard from 'ui-component/cards/SubCard';\nimport Spends from './Spends';\n\nimport config, { ThemeMode } from 'config';\n\n\n\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\n\n\nexport default function AdvancedFilters({ open, setOpen }) {\n const predictions = useSelector(state => state.planner2.predictions);\n\n const theme = useTheme();\n const handleClose = () => {\n setOpen(false);\n };\n\n\n const blockSX = {\n p: 2.5,\n borderLeft: '1px solid ',\n borderBottom: '1px solid ',\n borderLeftColor: theme.palette.mode === ThemeMode.DARK ? 'dark.main' : 'grey.200',\n borderBottomColor: theme.palette.mode === ThemeMode.DARK ? 'dark.main' : 'grey.200'\n };\n\n return (\n \n \n \n Predictions\n \n theme.palette.grey[500],\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {predictions.reach}\n \n \n REACH\n \n \n \n \n \n \n\n \n \n {predictions.views}\n \n \n Views\n \n \n \n \n \n \n \n \n\n \n \n {predictions.engagements}\n \n \n ENGAGEMENTS\n \n \n \n \n \n \n\n \n \n {predictions.engagement_rate}%\n \n \n ENGAGEMENT_RATE\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n","\nimport React, { useMemo } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport Chip from 'ui-component/extended/Chip';\n\nimport { updateFilters } from 'actions/planner-filters';\n\nconst EXCLUDE_KEYS = ['sortBy', 'posts', 'bio', 'category', 'ids']\nconst NON_CANCELABLE_KEYS = ['budget', 'maxPricePerCreator', 'megaBudget', 'macroBudget', 'microBudget', 'nanoBudget']\n\n\nfunction camelCaseToPhrase(camelCaseStr) {\n // Replace capital letters with space followed by the lowercase letter\n try{\n if(!isNaN(camelCaseStr) || !isNaN(parseFloat(camelCaseStr))) return camelCaseStr\n const result = camelCaseStr.replace(/([A-Z])/g, ' $1');\n // Capitalize the first letter\n return result.charAt(0).toUpperCase() + result.slice(1);\n } catch(e) {\n console.log(\"Error in camelCaseToPhrase\", camelCaseStr, e);\n return camelCaseStr;\n }\n}\n\n\nconst AppliedFilters = () => {\n const dispatch = useDispatch();\n const plannerFilters = useSelector((state) => state.plannerFilters);\n\n\n const filters = useMemo(() => {\n const filterValues = {};\n\n Object.keys(plannerFilters).forEach(key => {\n if(!plannerFilters[key]) return;\n if (EXCLUDE_KEYS.includes(key)) return;\n if (plannerFilters[key] === null) return;\n if(key === 'platform' && plannerFilters[key] === 'instagram') return;\n filterValues[key] = plannerFilters[key];\n });\n\n return filterValues;\n\n }, [plannerFilters]);\n\n const handleDelete = (key) => {\n dispatch(updateFilters(key, null, true));\n };\n \n\n\n return Object.keys(filters).length > 0 ? \n \n {Object.keys(filters).length > 0 && \n \n Applied Filters:\n \n }\n {Object.keys(filters).map(key => {\n const value = filters[key];\n return (\n handleDelete(key)})}\n />\n )\n })}\n \n : <>>\n}\n\nexport default AppliedFilters;","\nimport { useSelector } from \"react-redux\";\n\nimport { constants } from \"constants/planner2\";\n\nexport const GetFilterValue = (key) => {\n const payload = useSelector((state) => state.planner2.payload);\n const keys = constants.PAYLOAD_PATH_MAPPING[key].split('.');\n let current = payload;\n\n for (let i = 0; i < keys.length; i++) {\n current = current[keys[i]];\n if (!current) {\n break;\n }\n }\n if(current === undefined) {\n return null;\n }\n\n return current;\n}\n\nexport const GetFilterValueV2 = (payload, key) => {\n const keys = constants.PAYLOAD_PATH_MAPPING[key].split('.');\n let current = payload;\n\n for (let i = 0; i < keys.length; i++) {\n current = current[keys[i]];\n if (!current) {\n break;\n }\n }\n if(current === undefined) {\n return null;\n }\n\n return current;\n}\n\nexport const youTubeIdentifier = (text) => {\n const channelIdRegex = /^UC[a-zA-Z0-9_-]{22}$/;\n\n if (channelIdRegex.test(text)) {\n return 'channelId';\n } else {\n return 'handle';\n }\n};\n\nexport const isValidURL = (string, domain) => {\n const instagramRegex = /^https:\\/\\/www\\.instagram\\.com\\/.+$/;\n const youtubeRegex = /^(https?:\\/\\/)?(www\\.)?youtube\\.com\\/(@[a-zA-Z0-9_-]+|((user|channel|c)\\/[a-zA-Z0-9_-]+)|(watch\\?v=[a-zA-Z0-9_-]+(&list=[a-zA-Z0-9_-]+(&index=\\d+)?)?))$/;\n\n try {\n const url = new URL(string);\n if (domain === 'instagram' && !instagramRegex.test(url.href)) {\n return false;\n } else if (domain === 'youtube' && !youtubeRegex.test(url.href)) {\n return false;\n }\n return string;\n } catch (e) {\n if (domain === 'instagram') {\n return `https://www.instagram.com/${string}/`;\n } else if (domain === 'youtube') {\n const type = youTubeIdentifier(string);\n if (type === 'channelId') {\n return `https://www.youtube.com/channel/${string}`;\n } else {\n return `https://www.youtube.com/@${string}`;\n }\n }\n}\n};","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport axios from 'axios';\n\nimport { Paper } from '@mui/material';\nimport Avatar from 'ui-component/extended/Avatar';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Grid from '@mui/material/Grid';\nimport TextField from '@mui/material/TextField';\nimport Chip from 'ui-component/extended/Chip';\nimport Snackbar from '@mui/material/Snackbar';\nimport Stack from '@mui/material/Stack';\nimport Skeleton from '@mui/material/Skeleton';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\n\nimport CloseIcon from '@mui/icons-material/Close';\n// import { getDiscoverySearchResult } from 'api_handlers/es'\nimport { getDiscoverySearchResultv2 } from 'api_handlers/es';\nimport { fetchNewInfluencer } from 'api_handlers/planner2';\nimport { getFieldOfInterest } from 'api_handlers/influencer';\nimport {\n addNewInfluencer,\n updateNewInfluencerSearch,\n setAutoCompleteValues,\n} from 'actions/planner2';\nimport { isValidURL } from './../../utils';\n\nimport mixpanel from 'mixpanel-browser';\n\nconst SearchAutocomplete = () => {\n const dispatch = useDispatch();\n const autoCompleteValues = useSelector((state) => state.planner2.autoCompleteValues);\n const platform = useSelector((state) => state.plannerFilters.platform);\n const CancelToken = axios.CancelToken;\n const [autoCompleteRequest, setAutoCompleteRequest] = useState(null);\n const [searchAutocompleteOptions, setSearchAutocompleteOptions] = useState([]);\n const [autocompleteLoading, setAutocompleteLoading] = useState(false);\n const [autocompleteTimeout, setAutocompleteTimeout] = useState(null);\n const [categoryGroup, setCategoryGroup] = useState([]);\n\n const [newProfileSnackbarOpen, setNewProfileSnackbarOpen] = useState(false);\n const [errorSnackbar, setErrorSnackbar] = useState(false);\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n const data = await getFieldOfInterest();\n setCategoryGroup([\n ...data.map((option) => ({\n group: 'Categories',\n firstLetter: option.name[0].toUpperCase(),\n id: option.name,\n type: 'Categories',\n ...option,\n })),\n ]);\n } catch (error) {\n console.error('Error fetching field of interest:', error);\n }\n };\n fetchData();\n }, []);\n\n const addInfluencerOptions = async (searchText) => {\n const source = CancelToken.source();\n setAutoCompleteRequest(source);\n const { result } = await getDiscoverySearchResultv2(\n searchText || 'india',\n source,\n platform || 'instagram',\n );\n // const { result } = await getDiscoverySearchResult(searchText || 'india', source);\n\n let influencerOptions = [];\n\n if (result && result.length > 0) {\n result.forEach((option) =>\n influencerOptions.push({\n firstLetter: 'I',\n name: `Influencer=${searchText}`,\n display_name: `${option.name}`,\n id: option.id,\n src: option.picture,\n group: 'Influencers',\n type: 'influencers-found',\n }),\n );\n } else {\n const validatedURL = isValidURL(searchText, platform);\n influencerOptions.push({\n firstLetter: 'I',\n name: `${searchText}`,\n display_name:\n validatedURL === false ? `Invalid URL for platform ${platform}` : `${searchText}`,\n id: validatedURL === false ? `Invalid URL for platform ${platform}` : validatedURL,\n type: 'influencer-not-found',\n group: 'Influencers',\n });\n }\n\n setSearchAutocompleteOptions((prevValue) => [\n ...prevValue.filter((option) => option.type !== 'influencer-pending'),\n ...influencerOptions,\n ]);\n };\n\n const getCategoryOptions = (searchText, selectedIds) => {\n let categories = [];\n if (!searchText) {\n categories = categoryGroup.filter((option) => !selectedIds.includes(option.id)).slice(0, 12);\n } else {\n categories = categoryGroup.filter(\n (option) =>\n !selectedIds.includes(option.id) &&\n option.name.toLowerCase().includes(searchText.toLowerCase()),\n );\n }\n return categories;\n };\n\n const getExtraOptions = (searchText) => {\n if (!searchText) return [];\n const postKey = 'PostSearch';\n const bioKey = 'BioSearch';\n const extraOption = [];\n\n let isUrl = false;\n try {\n const newUrl = new URL(searchText);\n isUrl = true;\n } catch (e) {\n isUrl = searchText.startsWith('www.');\n }\n\n if (!isUrl) {\n if (!autoCompleteValues.find((option) => option.type === postKey))\n extraOption.push({\n firstLetter: 'P',\n name: `${postKey}=${searchText}`,\n display_name: `'${searchText}' post search`,\n id: `${postKey}=${searchText}`,\n type: postKey,\n value: searchText,\n });\n if (!autoCompleteValues.find((option) => option.type === bioKey))\n extraOption.push({\n firstLetter: 'P',\n name: `${bioKey}=${searchText}`,\n display_name: `'${searchText}' bio search`,\n id: `${bioKey}=${searchText}`,\n type: bioKey,\n value: searchText,\n });\n }\n\n if (searchText.length < 3) return extraOption;\n\n [1, 2, 3].forEach(() => {\n extraOption.push({\n firstLetter: 'P',\n name: `${searchText}`,\n display_name: `Search influencer have '${searchText}' in their posts`,\n id: `None`,\n type: 'influencer-pending',\n value: searchText,\n group: 'Influencers',\n });\n });\n return extraOption;\n };\n\n const handleFilterOptions = async (event, inputValue) => {\n if (autoCompleteRequest) autoCompleteRequest.cancel();\n setAutocompleteLoading(true);\n const selectedIds = autoCompleteValues.map((option) => option.id);\n\n if (inputValue && inputValue.length > 2) {\n setAutocompleteTimeout(\n setTimeout(() => {\n addInfluencerOptions(inputValue);\n }, 500),\n );\n }\n\n setSearchAutocompleteOptions([\n ...getCategoryOptions(inputValue, selectedIds),\n ...getExtraOptions(inputValue),\n ]);\n setAutocompleteLoading(false);\n };\n\n const renderOptionGroups = (params) => {\n let parentElement;\n\n if (params.group === 'Categories') {\n parentElement = (\n \n {params.children}\n \n );\n } else {\n parentElement = ;\n }\n\n return (\n \n {params.group} \n {parentElement}\n \n );\n };\n\n const renderOption = (props, option) => {\n let element;\n let size = 12;\n\n if (['Categories'].includes(option.group)) size = 'auto';\n\n if (option.type === 'influencers-found') {\n element = (\n \n \n \n \n {option.display_name} \n \n );\n } else if (option.type === 'influencer-not-found') {\n element = (\n \n \n {option.name[0].toUpperCase()} \n \n {option.display_name} \n \n );\n } else if (option.type === 'PostSearch') {\n element = (\n \n Search influencer have {option.value} in their posts\n \n );\n } else if (option.type === 'BioSearch') {\n element = (\n \n Search influencer have {option.value} in their bio\n \n );\n } else if (option.type === 'Categories') {\n element = ;\n } else if (option.type === 'influencer-pending') {\n element = (\n \n \n \n \n \n \n );\n }\n\n return (\n \n {element}\n \n );\n };\n\n const fetchInfluencer = async (value) => {\n setNewProfileSnackbarOpen(true);\n try {\n const { data } = await fetchNewInfluencer({\n payload: {\n link: value,\n },\n });\n setNewProfileSnackbarOpen(false);\n if (data.status === 'success') {\n const updatedData = data.data;\n updatedData.primary_category = { name: updatedData.primary_category };\n updatedData.prediction = {\n enagaged_users_display: updatedData.avg_comments + updatedData.avg_likes,\n };\n updatedData.city = 'Other';\n if (updatedData.platform === 'instagram' || !updatedData.url) {\n updatedData.url = data.link;\n }\n\n dispatch(addNewInfluencer(data));\n }\n } catch (error) {\n setErrorSnackbar(true);\n setTimeout(() => {\n setNewProfileSnackbarOpen(false);\n setErrorSnackbar(false);\n }, 10000);\n }\n };\n\n useEffect(() => {\n const notFoundOptions = autoCompleteValues.filter(\n (option) => option.type === 'influencer-not-found',\n );\n notFoundOptions.forEach((notFoundOption) => {\n fetchInfluencer(notFoundOption.id);\n });\n dispatch(updateNewInfluencerSearch(notFoundOptions.map((option) => option.id)));\n }, [autoCompleteValues]);\n\n return (\n <>\n option.group}\n getOptionLabel={(option) => option.name}\n renderInput={(params) => (\n {\n if (e.key === 'Enter') {\n e.stopPropagation();\n }\n },\n endAdornment: (\n \n {autocompleteLoading ? : null}\n {params.InputProps.endAdornment}\n \n ),\n }}\n fullWidth\n />\n )}\n freeSolo={true}\n renderOption={renderOption}\n renderGroup={renderOptionGroups}\n PaperComponent={(props) => }\n onInputChange={(event, inputValue) => {\n if (autocompleteTimeout) clearTimeout(autocompleteTimeout);\n handleFilterOptions(event, inputValue);\n }}\n loading={autocompleteLoading}\n getOptionDisabled={(option) =>\n option.type === 'influencer-pending' ||\n (option.display_name && option.display_name.indexOf('Invalid URL for platform ') > -1)\n }\n onChange={(event, value) => {\n let name = [];\n try {\n value.map((each) => {\n name.push(each.name);\n });\n } catch {}\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track('search', {\n value: name.join(','),\n });\n }\n dispatch(setAutoCompleteValues(value));\n }}\n sx={{\n '& .MuiOutlinedInput-root': {\n '& fieldset': {\n borderColor: '#000',\n },\n },\n '& fieldset': {\n borderColor: '#000fff',\n borderLeft: 'none',\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n },\n }}\n />\n (event, reason) => {\n if (reason === 'clickaway') {\n return;\n }\n setNewProfileSnackbarOpen(false);\n }}\n >\n \n \n \n \n {errorSnackbar\n ? 'Something Went Wrong!'\n : 'We are updating data for this account...'}\n \n \n \n {\n setNewProfileSnackbarOpen(false);\n setErrorSnackbar(false);\n }}\n />\n \n \n \n {errorSnackbar\n ? 'Please try again after some time.'\n : 'It may take upto a minute to update the data for this account.'}\n \n \n \n \n \n >\n );\n};\n\nexport default SearchAutocomplete;\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { useDispatch, useSelector } from 'react-redux';\n\n// material-ui\nimport { styled } from '@mui/system';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Grid from '@mui/material/Grid';\nimport TextField from '@mui/material/TextField';\n\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport FormControl from '@mui/material/FormControl';\nimport MenuItem from '@mui/material/MenuItem';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport MainCard from 'ui-component/cards/MainCard';\nimport Chip from '@material-ui/core/Chip';\n\nimport SearchIcon from '@mui/icons-material/Search';\nimport WorkspacePremiumIcon from '@mui/icons-material/WorkspacePremium';\n// project imports\n\nimport { gridSpacing } from 'store/constant';\nimport { getCityStateList } from 'api_handlers/discovery';\n\nimport AdvancedFilters from './AdvancedFilters';\nimport PredictionModal from './PredictionModal';\nimport AppliedFilters from './AppliedFilters';\nimport SearchAutocomplete from './SearchAutocomplete';\nimport SocialMediaButton from '../Extra/SocialMediaIcon';\n\nimport {\n fetchInfluencersAction,\n showPremiumFeatureDialog,\n setAutoCompleteValues,\n} from 'actions/planner2';\nimport { updateFilters, resetFilters } from 'actions/planner-filters';\nimport { getFieldOfInterest } from 'api_handlers/influencer';\nimport { categories } from 'components/Discovery/components/ActionBar/components/FilterDrawer/components/AudienceInterestFilter/categories';\nimport FilterListIcon from '@mui/icons-material/FilterList';\n\nimport mixpanel from 'mixpanel-browser';\n\n// ==============================|| PLUGIN - AUTOCOMPLETE ||============================== //\n\nconst ResizableTextField = styled(TextField)(({ theme }) => ({\n width: '100%',\n transition: 'width 0.3s ease',\n '&:focus-within': {\n width: '100%',\n zIndex: 9999,\n },\n}));\n\nconst Search = (props) => {\n const dispatch = useDispatch();\n const user = useSelector((state) => state.planner2.user);\n const predictionStatus = useSelector((state) => state.planner2.predictionStatus);\n const autoCompleteValues = useSelector((state) => state.planner2.autoCompleteValues);\n const plannerFilters = useSelector((state) => state.plannerFilters);\n\n const gender = useSelector((state) => state.plannerFilters.gender || []);\n const platform = useSelector((state) => state.plannerFilters.platform);\n const creatorType = useSelector((state) => state.plannerFilters.creatorType || []);\n const locations = useSelector((state) => state.plannerFilters.locations);\n const categories = useSelector((state) => state.plannerFilters.categories);\n\n const [locationOptions, setLocationOptions] = React.useState([]);\n const [selectedFilter, setSelectedFilter] = useState(0);\n\n // Advanced filter states\n const [openAdvancedFilters, setOpenAdvancedFilters] = React.useState(false);\n // Predictions Modal\n const [openPredictions, setOpenPredictions] = React.useState(false);\n const [categoryOptions, setCategoryOptions] = React.useState([]);\n\n // const [autoCompleteValues, setAutoCompleteValues] = React.useState([]);\n\n const setFilters = () => {\n const postsText = autoCompleteValues.find((option) => option.type === 'PostSearch');\n if (postsText) dispatch(updateFilters('posts', postsText.value, false));\n else dispatch(updateFilters('posts', null, false));\n\n const bioText = autoCompleteValues.find((option) => option.type === 'BioSearch');\n if (bioText) dispatch(updateFilters('bio', bioText.value, false));\n else dispatch(updateFilters('bio', null, false));\n\n const categories = autoCompleteValues\n .filter((option) => option.group === 'Categories')\n .map((option) => option.name)\n .join(',');\n if (categories && categories.length > 0) dispatch(updateFilters('category', categories, false));\n else dispatch(updateFilters('category', null, false));\n\n const influencerIds = autoCompleteValues\n .filter((option) => option.group === 'Influencers' && option.type === 'influencers-found')\n .map((option) => option.id);\n if (influencerIds.length > 0) dispatch(updateFilters('ids', influencerIds, false));\n else dispatch(updateFilters('ids', null, false));\n\n // const newInfluencers = autoCompleteValues\n // .filter((option) => option.group === 'Influencers' && option.type === 'influencer-not-found')\n // .map((option) => option.id);\n\n // dispatch(updateNewInfluencerSearch(newInfluencers));\n\n dispatch(fetchInfluencersAction(1));\n };\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(async () => {\n dispatch(fetchInfluencersAction(1));\n\n try {\n const resp = await getCityStateList(true);\n setLocationOptions(resp.data);\n } catch (error) {\n console.error('Error fetching states:', error);\n }\n }, []);\n\n useEffect(() => {\n setFilters();\n }, [autoCompleteValues]);\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n const data = await getFieldOfInterest();\n const categories = data.map((option) => option.name);\n console.log('Categories: ', categories);\n setCategoryOptions(categories);\n } catch (error) {\n console.error('Error fetching field of interest:', error);\n }\n };\n fetchData();\n }, []);\n\n const memoizedValue = useMemo(() => (locations ? locations : []), [locations]);\n\n // useEffect(() => {\n // console.log(\"Planner filters changed\", plannerFilters);\n // let values = [...autoCompleteValues]\n // if(!plannerFilters.posts && values.find((option) => option.type === \"PostSearch\")) {\n // values = values.filter((option) => option.type !== \"PostSearch\");\n // }\n\n // if(!plannerFilters.bio && values.find((option) => option.type === \"BioSearch\")) {\n // values = values.filter((option) => option.type !== \"BioSearch\");\n // }\n\n // if(!plannerFilters.category && values.find((option) => option.group === \"Categories\")) {\n // values = values.filter((option) => option.group !== \"Categories\");\n // }\n\n // if(!plannerFilters.ids && values.find((option) => option.group === \"Influencers\")) {\n // values = values.filter((option) => option.group !== \"Influencers\");\n // }\n // // setAutoCompleteValues(values);\n // }, [plannerFilters]);\n\n useEffect(() => {\n props.plannerFilter(plannerFilters);\n }, [plannerFilters]);\n\n return (\n \n \n \n \n \n \n Discover Influencers for your Brand\n \n \n \n \n Discover from 2,00,000+ influencers across India on YouTube and Instagram\n \n \n \n \n \n \n \n \n \n 0 ? 60 : 58,\n },\n '& MuiSelect-icon': {\n top: 'calc(50% - 0.6em)',\n },\n }}\n >\n Platform \n {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track('platform_changed', {\n type: event.target.value,\n });\n }\n dispatch(updateFilters('platform', event.target.value, true));\n }}\n label=\"Platform\"\n >\n \n \n \n \n \n \n \n Instagram\n \n \n \n \n \n \n \n \n \n \n \n YouTube\n \n \n \n \n \n \n \n \n \n \n \n \n {/* \n }\n onClick={setFilters}\n style={{\n height: 40,\n }}\n >\n Search \n \n */}\n \n {\n console.log('Resetting filters');\n dispatch(resetFilters());\n dispatch(setAutoCompleteValues([]));\n }}\n >\n \n Reset\n \n \n \n \n \n \n \n \n \n \n (\n <>\n \n {values[0].length > 7 ? `${values[0].substring(0, 7)}...` : values[0]}\n \n {values.length > 1 ? (\n \n {'+' + (values.length - 1)}\n \n ) : null}\n >\n )}\n renderInput={(params) => }\n onChange={(event, value) => {\n if (value && value.length > 0)\n dispatch(updateFilters('locations', value, true));\n else dispatch(updateFilters('locations', null, true));\n }}\n limitTags={0}\n fullWidth\n sx={{\n '& .MuiOutlinedInput-root': {\n '& fieldset': {\n borderColor: '#000',\n },\n },\n // border: '1px solid #000',\n borderRadius: 2,\n height: '42px',\n '& fieldset': { height: '47px', top: '-5px' },\n }}\n />\n \n\n \n \n Gender \n {\n // setGender(event.target.value);\n dispatch(updateFilters('gender', event.target.value, true));\n // if (event.target.value)\n // dispatch(updateFilters('gender', event.target.value, true));\n // else dispatch(updateFilters('gender', null, true));\n }}\n label=\"Platform\"\n >\n Male \n Female \n Other \n Page \n \n \n \n\n \n \n Creator Type \n {\n dispatch(updateFilters('creatorType', event.target.value, true));\n }}\n label=\"Creator Type\"\n fullWidth\n >\n {`Mega ( > 1M)`} \n {`Macro (100K - 1M)`} \n {`Micro (10K - 100K)`} \n {`Nano ( < 10K)`} \n \n \n \n\n {/* \n }\n onChange={(event, value) => {\n if (value && value.length > 0)\n dispatch(\n updateFilters(\n 'categories',\n value,\n true,\n ),\n );\n else dispatch(updateFilters('categories', null, true));\n }}\n limitTags={0}\n fullWidth\n sx={{'& fieldset': {height: '47px', top: '-7px'}}}\n />\n */}\n\n \n }\n // onClick={() => {\n // if(user.premium_user) setOpenAdvancedFilters(true);\n // else dispatch(showPremiumFeatureDialog(true));\n\n // }}\n onClick={() => {\n setOpenAdvancedFilters(true);\n }}\n style={{\n height: 40,\n borderRadius: 7,\n }}\n >\n \n {' '}\n \n \n Advanced Filters\n \n \n \n {predictionStatus === 'loaded' && (\n \n }\n onClick={() => setOpenPredictions(true)}\n style={{\n height: 40,\n borderRadius: 7,\n }}\n >\n \n Predictions\n \n \n \n )}\n \n \n \n \n await setSelectedFilter(val)} />\n \n \n \n \n );\n};\n\nexport default Search;\n","import React, {Component} from 'react';\nimport { connect } from 'react-redux';\n\n\nimport {Grid} from '@mui/material';\n\nimport { gridSpacing } from 'store/constant';\n\nimport InfluencerList from '../InfluencerList';\nimport Search from '../Search';\n\nimport { addFilterInPayload } from 'actions/planner2';\n\nclass InfluencerDiscover extends Component {\n constructor(props) {\n super(props);\n this.state={\n filters:[]\n }\n }\n\n updateFilters = ({sortBy}) => {\n this.props.addFilterInPayload('sortBy', sortBy, true);\n }\n\n render() {\n const { influencers, loading, totalResults } = this.props;\n\n return \n \n await this.setState({filters:val})}\n />\n \n \n \n \n \n \n }\n}\n\nconst mapStateToProps = (state) => ({\n payload: state.planner2.payload,\n loading: state.planner2.loading,\n influencers: state.planner2.influencers,\n totalResults: state.planner2.totalInfluencersCount,\n});\n\nconst actionPlanner = {\n addFilterInPayload: addFilterInPayload,\n};\n\n// export default Planner;\nexport default connect(mapStateToProps, actionPlanner)(InfluencerDiscover);","import { useHistory } from \"react-router-dom\";\nimport PropTypes from 'prop-types';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardMedia from '@mui/material/CardMedia';\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport AvatarGroup from '@mui/material/AvatarGroup';\n\nimport Avatar from 'ui-component/extended/Avatar';\nimport { gridSpacing } from 'store/constant';\nimport { ThemeMode } from 'config';\n\n\n\nconst CuratedCard = ({ platform, name, background_img, category, id, pictures }) => {\n const theme = useTheme();\n let history = useHistory()\n\n return (\n {\n history.push(`/planner/curated-list/${id}`,{text:''});\n }}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n {name} \n \n \n {category} \n \n \n \n \n \n \n {\n pictures.map((each, index)=>{\n return \n })\n }\n \n \n \n \n );\n};\n\nCuratedCard.propTypes = {\n avatar: PropTypes.string,\n name: PropTypes.string,\n background: PropTypes.string,\n category: PropTypes.string,\n status: PropTypes.string\n};\n\nexport default CuratedCard;\n","import React, { useEffect } from 'react';\n\n// material-ui\nimport Button from '@mui/material/Button';\nimport Grid from '@mui/material/Grid';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Pagination from '@mui/material/Pagination';\nimport Typography from '@mui/material/Typography';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\n\n// project imports\nimport MainCard from 'ui-component/cards/MainCard';\nimport { gridSpacing } from 'store/constant';\n\nimport CuratedCard from './CuratedCard';\n\n// assets\nimport SearchIcon from '@mui/icons-material/Search';\nimport ExpandMoreRoundedIcon from '@mui/icons-material/ExpandMoreRounded';\n\nimport { getFieldOfInterest } from 'api_handlers/influencer';\nimport { fetchCuratedList } from 'api_handlers/planner2';\n\nconst CuratedList = () => {\n const [curatedItems, setCuratedItems] = React.useState([])\n const [search, setSearch] = React.useState('');\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [platform, setPlatform] = React.useState('instagram');\n const [category, setCategory] = React.useState(null);\n const [categoryOptions, setCategoryOptions] = React.useState([]);\n const [page, setPage] = React.useState(1);\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\n\n const handleClick = (event) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n \n const handleSearch = async (event) => {\n const newString = event?.target.value;\n \n // if (newString) {\n setSearch(newString);\n // }\n\n // if (newString) {\n // // dispatch(filterProfileCards(newString));\n // } else {\n // // dispatch(getProfileCards());\n // }\n };\n\n useEffect(() => {\n const fetchAndSetCuratedList = async () => {\n try {\n const response = await fetchCuratedList(platform, category, search, page, rowsPerPage);\n setCuratedItems(\n Object.keys(response.results.curated_lists).map((key) => {\n let data = response.results.curated_lists[key];\n data['name'] = key;\n return data;\n })\n );\n } catch (error) {\n console.error(\"Error fetching curated list:\", error);\n }\n };\n \n fetchAndSetCuratedList();\n \n // If you need to apply additional filtering on `users` based on `search`, `platform`, and `category`, you can uncomment and modify the following code:\n \n // setCuratedItems([\n // ...users\n // .filter((user) => user.name.toLowerCase().includes(search.toLowerCase()))\n // .filter((user) => (platform ? user.platform === platform : true))\n // .filter((user) => (category ? user.category === category.label : true))\n // ]);\n \n }, [search, platform, category, page, rowsPerPage]);\n\n \n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n const fetchAndSetCategories = async () => {\n try {\n const data = await getFieldOfInterest();\n const uniqueCategories = Array.from(\n new Set(data.map((item) => item.name))\n ).map((name) => {\n return data.find((item) => item.name === name);\n });\n \n setCategoryOptions(\n uniqueCategories.map((item) => ({\n label: item.name,\n value: item.id\n }))\n );\n } catch (error) {\n console.error(\"Error fetching categories:\", error);\n }\n };\n \n fetchAndSetCategories();\n }, []);\n\n const handlePageChange = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleRowsPerPageChange = (event) => {\n setRowsPerPage(parseInt(event.target.textContent, 10));\n setPage(1);\n };\n\n const paginatedItems = curatedItems.slice(\n (page - 1) * rowsPerPage,\n page * rowsPerPage\n );\n\n return (\n \n \n Curated List \n \n \n \n \n option.label}\n renderInput={(params) => }\n onChange={(_, value) => {\n setCategory(value ? value.label : null)}\n }\n limitTags={1}\n />\n \n \n \n Platform \n setPlatform(event.target.value)}\n label=\"Platform\"\n >\n All Platforms \n Instagram \n YouTube \n \n \n \n \n \n \n \n \n }\n size=\"small\"\n />\n \n \n\n \n \n \n }\n >\n \n {paginatedItems.map((item, index) => (\n \n \n \n ))}\n \n \n \n \n \n \n }\n onClick={handleClick}\n >\n {rowsPerPage} Rows\n \n \n \n \n \n \n \n );\n};\n\nexport default CuratedList;\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport {Grid} from '@mui/material';\n\nimport { gridSpacing } from 'store/constant';\n\nimport InfluencerList from '../InfluencerList';\n\nimport { getPlannerInfluencersES } from 'api_handlers/es';\nimport { fetchCuratedInfluencers } from 'api_handlers/planner2';\n// import { useLocation } from 'react-router-dom';\n\n\nconst CuratedInfluencers = ({match: { params }}) => {\n const [influencers, setInfluencers] = useState([]);\n const [count, setCount] = useState(0)\n const [search,setSearch] = useState('')\n const { curatedItemId } = params;\n const {plannerItemId} = params\n const page = useSelector((state) => state.planner2.page) || 1;\n\n // const location = useLocation();\n // const message = location.state?.text || 'No message received';\n\n const fetchInfluencers = async (page) => {\n const response = await getPlannerInfluencersES(\n {\n \"campaign-level-requirements\": {},\n \"creator-level-requirements\": {},\n \"advance-filters\": {},\n \"setReset\": false\n }, page);\n const {results} = await response.json();\n setInfluencers(results);\n }\n\n const updateFilters = async () => {}\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(async () => {\n // fetchCuratedInfluencers(curatedItemId?curatedItemId:plannerItemId, page).then((response)=>{\n fetchCuratedInfluencers(curatedItemId, page).then((response)=>{\n console.log(\"RESPONSE: \", response)\n setCount(response.count)\n setInfluencers(response.results.map(profile=>{\n return profile\n }));\n });\n // fetchInfluencers(1)\n }\n , [page]);\n\n return (\n \n \n ''}\n onSearch={val=>setSearch(val)}\n />\n \n \n )\n}\n\nexport default CuratedInfluencers;","import { Typography, Grid, Avatar, CircularProgress } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Box from '@mui/material/Box';\n\nimport TrendingUpIcon from '@material-ui/icons/TrendingUp';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport ManIcon from '@mui/icons-material/Man';\nimport WomanIcon from '@mui/icons-material/Woman';\nimport moment from 'moment';\nimport AutorenewIcon from '@mui/icons-material/Autorenew';\nimport InstagramRectIconButton from 'components/Planner/components/InstagramRectIconButton';\nimport CategoryChip from 'components/Planner/components/CategoryContainer/components/CategoryChip';\nimport { InfluencerUpdateProfile } from 'api_handlers/discovery';\nimport React, { useState, useEffect } from 'react';\nimport CountDisplay from 'components/ux/CountDisplay';\nimport { withStyles, Theme } from '@material-ui/core/styles';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport {getProfileUpdateStatus} from 'api_handlers/planner2';\nimport PlaceIcon from '@mui/icons-material/Place';\n\nconst HtmlTooltip = withStyles((theme: Theme) => ({\n tooltip: {\n backgroundColor: \"#3A3A3A\",\n color: \"white\",\n borderRadius: \"2px\",\n maxWidth: 220,\n width: 120,\n fontSize: theme.typography.pxToRem(12),\n border: \"1px solid #dadde9\",\n },\n arrow: {\n color: \"#3A3A3A\",\n },\n}))(Tooltip);\n\nfunction BasicInfo({\n name,\n picture,\n interests = [],\n url,\n audience_short_desc = {},\n platform = 'instagram',\n prediction,\n primary_category = '',\n last_updated,\n id,\n influencer,\n is_staff,\n update_status,\n isClicked,\n updateStatus,\n getId,\n location,\n country\n}) {\n const [isDisabled, setIsDisabled] = useState(false);\n const [isUpdating, setIsUpdating] = useState(false);\n const classes = useStyles();\n const [status, setStatus] = useState(update_status);\n const date = last_updated !== undefined ? new Date(last_updated) : null;\n\n function handleApi() {\n if (!isDisabled) {\n setIsUpdating(true);\n const res = InfluencerUpdateProfile(id, influencer, platform);\n res.then((responce) => {\n if ([200, 201].includes(responce.status)) {\n // setIsUpdating(false)\n // isClicked(true);\n updateStatusApi();\n }\n });\n // InfluencerUpdateProfile(id,influencer,platform)\n // setIsDisabled(true)\n }\n }\n\n const updateStatusApi = () => {\n const intervalId = setInterval(() => {\n const res = getProfileUpdateStatus(getId);\n res.then((response) => {\n if (response.update_status === 'updated' || response.update_status === 'failed') {\n setStatus(response.update_status);\n setIsUpdating(false);\n isClicked(true);\n clearInterval(intervalId);\n }\n })\n .catch((err) => {\n console.error('Error fetching update status', err);\n clearInterval(intervalId);\n })\n }, 30000);\n };\n\n useEffect(() => {\n setIsUpdating(updateStatus);\n if (status === \"updated\" || status === \"failed\"){\n isClicked(true);\n }\n }, [updateStatus, status]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n {name} \n \n \n {\n window.open(url, '_blank');\n }}\n platform={platform}\n />\n \n \n \n\n \n \n {prediction?.creator_type[0]?.toUpperCase() +\n prediction?.creator_type.slice(1).toLowerCase()}{' '}\n Influencer\n \n \n {is_staff ? (\n \n \n \n \n \n \n {status !== 'failed' ? (\n \n {!isUpdating ? (\n \n \n \n {\n handleApi();\n }}\n >\n Update profile\n \n \n \n {isDisabled && status === 'updated' && !isUpdating ? (\n \n \n \n
\n Wait untill 24 hours\n {/* { minutes == 0 && seconds === 0 && hours === 0\n ? null\n : {hours < 10 ? `0${hours}` : hours}:{minutes < 10 ? `0${minutes}` : minutes}:{seconds < 10 ? `0${seconds}` : seconds}
\n } */}\n \n
\n \n }\n > \n \n ) : (\n ''\n )}\n \n \n \n ) : (\n \n \n \n {\n // handleApi()\n // }}\n >\n Updating...\n \n \n \n \n \n \n \n )}\n \n ) : null}\n \n \n {status === 'failed' ? (\n \n \n {\n handleApi();\n }}\n >\n Update profile\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 Updated :\n \n \n \n \n {' '}\n {moment(date).format('DD-MM-yyyy HH:mm')}{' '}\n \n \n \n }\n \n \n \n \n \n \n \n \n \n {/* \n {\n location !== 'other'?\n \n \n \n \n \n {location} \n\n \n \n :''\n }\n */}\n \n \n \n \n \n \n \n \n \n \n Audience Info\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {audience_short_desc?.location?.name}\n \n \n \n \n \n \n {audience_short_desc?.location?.percentage}\n \n \n \n \n \n \n \n \n \n {audience_short_desc?.gender?.code?.charAt(0) == 'M' ? (\n \n ) : (\n \n )}\n \n \n \n {audience_short_desc?.gender?.code?.charAt(0)}\n \n \n \n \n \n \n {audience_short_desc?.gender?.percentage}\n \n \n \n \n \n \n \n \n \n \n {`${audience_short_desc?.age?.code} yrs`}\n \n \n \n \n \n \n {audience_short_desc?.age?.percentage}\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'space-between',\n alignItems: 'center',\n background:'#d3d3d3',\n padding:20,\n },\n avatarContainer: {\n background: '#EFF0F9',\n // boxShadow:'-5px 5px 10px rgba(203, 204, 212, 0.2), 5px -5px 10px rgba(203, 204, 212, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: '50%',\n padding: 10,\n },\n avatar: {\n // filter: 'drop-shadow(0px 5px 10px rgba(141, 141, 141, 0.25))',\n height: 150,\n width: 150,\n },\n audienceInfoBase: {\n background:'linear-gradient(118.02deg, rgba(127,127,127,255) 40%, rgba(219,200,160,255) 94.6%)',\n // borderRadius: 10,\n height: 150,\n },\n audienceInfo: {\n background: 'rgba(239, 240, 249, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(27.2667px)',\n color: 'white',\n padding: '10px 20px',\n },\n}));\n\nexport default BasicInfo;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nfunction StatsCard({ value, label, iconSrc }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n {value}\n \n \n \n {label} \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n // background: '#EFF0F9',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n // borderRadius: 10,\n // padding: 10,\n width:'100%',\n borderRight:'1px solid #cccccc',\n marginLeft:1\n },\n iconContainer: {\n // background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 221, 0.2), 5px -5px 10px rgba(215, 216, 221, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: '50%',\n height: 18,\n width: 18,\n marginRight: 15,\n },\n icon: {\n // height: 14,\n width: 16,\n },\n}));\n\nexport default StatsCard;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport EngIcon from 'assets/discovery/Eng-Rate-icon.png';\nimport AvgViewIcon from 'assets/discovery/Avg-View-icon.png';\nimport AvgEngIcon from 'assets/discovery/Avg-Eng-Icon.png';\nimport PPPIcon from 'assets/discovery/PPP-icon.png';\n\nimport StatsCard from './components/StatsCard';\n\nfunction BasicStats({\n followers,\n engagement_rate,\n avg_views,\n paid_post_performance,\n engagements,\n audience_followers_credibility,\n filteredData,\n}) {\n const classes = useStyles();\n function credibility(value) {\n if (value) {\n return parseFloat(value * 100).toFixed(2) + '%';\n } else {\n return '';\n }\n }\n function floatval(value){\n if(value){\n return value.toFixed(3)\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\nconst useStyles = makeStyles(() => ({\n root: {\n // paddingTop: '3px !important',\n // paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n}));\n\nexport default BasicStats;\n","import { Typography, Grid, Table, TableHead, TableCell, TableBody } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\n\nimport {\n Chart as ChartJS,\n ArcElement,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js';\nimport { Doughnut, Line } from 'react-chartjs-2';\n\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport BrandAffinityIcon from 'assets/discovery/Brand-affiniy-icon.png';\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport FilterVintageIcon from '@material-ui/icons/FilterVintage';\nimport Location from 'assets/discovery/Location-Icon.png';\nimport LocationOnIcon from '@mui/icons-material/LocationOn';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport TwitterIcon from 'assets/planner/twitter_icon.png';\nimport ActorIcon from 'assets/planner/Actor.png';\nimport AgricultureIcon from 'assets/planner/Agriculture.png';\nimport ArtCraftIcon from 'assets/planner/Art-Craft.png';\nimport AutomobileIcon from 'assets/planner/Automobile.png';\nimport BeautyIcon from 'assets/planner/beauty.png';\nimport BusinessCareerIcon from 'assets/planner/Business-Careers.png';\nimport CareerCoachIcon from 'assets/planner/Career-Coach.png';\nimport ComedyIcon from 'assets/planner/Comedy.png';\nimport CryptoIcon from 'assets/planner/Crypto.png';\nimport DanceIcon from 'assets/planner/Dance.png';\nimport DecorIcon from 'assets/planner/Decor.png';\nimport DigitalMarketingIcon from 'assets/planner/Digital-Marketing.png';\nimport EducationIcon from 'assets/planner/Education.png';\nimport EntertainmentPageIcon from 'assets/planner/Entertainment-Page.png';\nimport EntertainmentIcon from 'assets/planner/Entertainment.png';\nimport FanPageIcon from 'assets/planner/Fan-Page.png';\nimport FashionIcon from 'assets/planner/Fashion.png';\nimport FinanceIcon from 'assets/planner/Finance.png';\nimport FoodIcon from 'assets/planner/Food.png';\nimport GadgetReviewIcon from 'assets/planner/Gadget-Review.png';\nimport GamingIcon from 'assets/planner/Gaming.png';\nimport GardeningIcon from 'assets/planner/Gardening.png';\nimport GraphicDesignerIcon from 'assets/planner/Graphic-Designer.png';\nimport HaircareIcon from 'assets/planner/Haircare.png';\nimport HealthIcon from 'assets/planner/Health.png';\nimport InfortainmentIcon from 'assets/planner/Infotainment.png';\nimport InvestmentIcon from 'assets/planner/Investment.png';\nimport KidsIcon from 'assets/planner/Kids.png';\nimport LegalIcon from 'assets/planner/Legal.png';\nimport LifestyleIcon from 'assets/planner/Lifestyle.png';\nimport LiteratureIcon from 'assets/planner/Literature.png';\nimport MemePageIcon from 'assets/planner/Meme-Page.png';\nimport MensGroomingIcon from 'assets/planner/Mens-Grooming.png';\nimport ModelIcon from 'assets/planner/Model.png';\nimport MusicIcon from 'assets/planner/Music.png';\nimport NewsMediaIcon from 'assets/planner/News-Media.png';\nimport NutritionIcon from 'assets/planner/Nutrition.png';\nimport ParentingIcon from 'assets/planner/Parenting.png';\nimport PetsIcon from 'assets/planner/Pets.png';\nimport PhotographyIcon from 'assets/planner/Photography.png';\nimport ProductReviewIcon from 'assets/planner/Product-Review.png';\nimport SelfMotivationIcon from 'assets/planner/Self-Help-Motivation.png';\nimport SkincareIcon from 'assets/planner/Skincare.png';\nimport SpiritualityIcon from 'assets/planner/Spirituality.png';\nimport SportsIcon from 'assets/planner/Sports.png';\nimport StockMarketIcon from 'assets/planner/Stock-Market.png';\nimport Sustainability from 'assets/planner/Sustainability.png';\nimport TechnologyIcon from 'assets/planner/Technology.png';\nimport TheatreIcon from 'assets/planner/Theatre.png';\nimport TravelIcon from 'assets/planner/Travel.png';\nimport TvReviewIcon from 'assets/planner/TV-Review.png';\nimport WebsiteToolsIcon from 'assets/planner/Website-Tools.png';\nimport YogaIcon from 'assets/planner/Yoga.png';\n\nimport ActivewearIcon from 'assets/planner/Activewear.png';\nimport ArtDesignIcon from 'assets/planner/Art-and-Design.png';\nimport BeautyCosmeticIcon from 'assets/planner/Beauty-and-Cosmetics.png';\nimport BeerWineIcon from 'assets/planner/Beer-Wine-&-Spirits.png';\nimport CameraPhotographyIcon from 'assets/planner/Camera-&-Photography.png';\nimport CarMotorbikeIcon from 'assets/planner/Cars-&-Motorbikes.png';\nimport ClothesShoesIcon from 'assets/planner/Clothes-Shoes.png';\nimport CoffeeTeaIcon from 'assets/planner/Coffee-Tea-&-Beverages.png';\nimport ElectronicsComputerIcon from 'assets/planner/Electronics-and-Computers.png';\nimport FitnessYogaIcon from 'assets/planner/Yoga.png';\nimport FriendsFamilyIcon from 'assets/planner/Friends-Family-&-Relationships.png';\nimport HealthcareMedicineIcon from 'assets/planner/Healthcare-and-Medicine.png';\nimport HealthyLifestyleIcon from 'assets/planner/Healthy-Lifestyle.png';\nimport HomeDecorIcon from 'assets/planner/Home-Decor-Furniture-&-Garden.png';\nimport JewlleryWatchesIcon from 'assets/planner/Jewellery-&-Watches.png';\nimport LuxaryGoodsIcon from 'assets/planner/Luxury-Goods.png';\nimport RestaurantFoodIcon from 'assets/planner/Restaurants-Food-&-Grocery.png';\nimport ShoppingRetail from 'assets/planner/Shopping-&-Retail.png';\nimport TelevisionFilmsIcon from 'assets/planner/Television-and-Film.png';\nimport TobaccoSmokingIcon from 'assets/planner/Tobacco-&-Smoking.png';\nimport ToysIcon from 'assets/planner/Toys-Children-&-Baby.png';\nimport TravelTourismIcon from 'assets/planner/Travel-Tourism-and-Aviation.png';\nimport WeddingIcon from 'assets/planner/Wedding.png';\nimport { fontSize } from '@material-ui/system';\n\nChartJS.register(\n ArcElement,\n Tooltip,\n Legend,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n);\n\nconst interestsIcon = {\n Actor: ActorIcon,\n Agriculture: AgricultureIcon,\n 'Art and craft': ArtCraftIcon,\n Automobile: AutomobileIcon,\n Beauty: BeautyIcon,\n 'Career Coach': CareerCoachIcon,\n Comedy: ComedyIcon,\n Crypto: CryptoIcon,\n Dance: DanceIcon,\n Decor: DecorIcon,\n 'Digtal Marketing': DigitalMarketingIcon,\n Education: EducationIcon,\n 'Entertainment Page': EntertainmentPageIcon,\n Entertainment: EntertainmentIcon,\n 'Fan Page': FanPageIcon,\n Fashion: FashionIcon,\n 'Fashion\tMale': MensGroomingIcon,\n Finance: FinanceIcon,\n Fitness: HealthIcon,\n Food: FoodIcon,\n 'Gadget Review': GadgetReviewIcon,\n Gaming: GamingIcon,\n 'Gaming / E-sports': GamingIcon,\n 'Graphic Designer': GraphicDesignerIcon,\n Haircare: HaircareIcon,\n Health: HealthIcon,\n 'home decor ': DecorIcon,\n Infotainment: InfortainmentIcon,\n Investment: InvestmentIcon,\n Kids: InvestmentIcon,\n Legal: LegalIcon,\n Lifestyle: LifestyleIcon,\n 'Meme Page': MemePageIcon,\n \"Men's Grooming\": MensGroomingIcon,\n Model: ModelIcon,\n 'News Media': NewsMediaIcon,\n Nutrition: NutritionIcon,\n Motivation: SelfMotivationIcon,\n 'Self Motivation': SelfMotivationIcon,\n Music: MusicIcon,\n Parenting: ParentingIcon,\n Pets: PetsIcon,\n Photography: PhotographyIcon,\n 'Product Review': ProductReviewIcon,\n Skincare: SkincareIcon,\n Spirituality: SpiritualityIcon,\n 'Stock Market': StockMarketIcon,\n Sustainability: Sustainability,\n Theatre: TheatreIcon,\n 'Self Help': SelfMotivationIcon,\n Sports: SportsIcon,\n Tech: TechnologyIcon,\n Technology: TechnologyIcon,\n Literature: LiteratureIcon,\n Travel: TravelIcon,\n 'Tv Review': TvReviewIcon,\n 'Website Tools': WebsiteToolsIcon,\n 'Travel / Content Creator': TravelIcon,\n 'Travel/ Food': TravelIcon,\n 'Travel/ lifestyle': TravelIcon,\n 'Television & Film': TvReviewIcon,\n 'Business & Careers': BusinessCareerIcon,\n 'Healthcare & Medicine': HealthIcon,\n 'Toys, Children & Baby': KidsIcon,\n 'Fitness & Yoga': YogaIcon,\n 'Healthy Lifestyle': HealthIcon,\n 'Luxury Goods': LifestyleIcon,\n 'Home Decor, Furniture & Garden': GardeningIcon,\n 'Friends, Family & Relationships': ParentingIcon,\n 'Television & Film': TelevisionFilmsIcon,\n Music: MusicIcon,\n 'Shopping & Retail': ShoppingRetail,\n 'Coffee, Tea & Beverages': CoffeeTeaIcon,\n 'Camera & Photography': CameraPhotographyIcon,\n 'Clothes, Shoes, Handbags & Accessories': ClothesShoesIcon,\n 'Beer, Wine & Spirits': BeerWineIcon,\n Sports: SportsIcon,\n 'Electronics & Computers': ElectronicsComputerIcon,\n Gaming: GamingIcon,\n Activewear: ActivewearIcon,\n 'Art & Design': ArtDesignIcon,\n 'Travel, Tourism & Aviation': TravelTourismIcon,\n 'Business & Careers': BusinessCareerIcon,\n 'Beauty & Cosmetics': BeautyCosmeticIcon,\n 'Healthcare & Medicine': HealthcareMedicineIcon,\n 'Jewellery & Watches': JewlleryWatchesIcon,\n 'Restaurants, Food & Grocery': RestaurantFoodIcon,\n 'Toys, Children & Baby': ToysIcon,\n 'Fitness & Yoga': FitnessYogaIcon,\n Wedding: WeddingIcon,\n 'Tobacco & Smoking': TobaccoSmokingIcon,\n Pets: PetsIcon,\n 'Healthy Lifestyle': HealthyLifestyleIcon,\n 'Luxury Goods': LuxaryGoodsIcon,\n 'Home Decor, Furniture & Garden': HomeDecorIcon,\n 'Friends, Family & Relationships': FriendsFamilyIcon,\n 'Cars & Motorbikes': CarMotorbikeIcon,\n};\n\nconst dummyData = {\n username: 'hiphopunofficial',\n fullname: 'Hiphop unofficial',\n url: 'https://www.instagram.com/hiphopunofficial',\n // 'picture': 'https://imgp.sptds.icu/v2?mb0KwpL92uYofJiSjDn1%2F6peL1lBwv3s%2BUvShHERlDZamZ5Z7xQIUNO094fHaxAdR5uAvdtZ2%2F7CzuicVRY3UnlP2wPf%2BO7j8qGwy4CXajMihLxWsHhCZj3tNJcx7fLrgNlJUwVYqIiahjW32e%2BqWA%3D%3D',\n picture: 'https://influencer-media.s3.ap-south-1.amazonaws.com/232192182',\n followers: 5609,\n engagements: 3990,\n is_verified: false,\n location: 'Mumbai',\n};\n\nconst MONTH = {\n '01': 'Jan',\n '02': 'Feb',\n '03': 'Mar',\n '04': 'Apr',\n '05': 'May',\n '06': 'Jun',\n '07': 'Jul',\n '08': 'Aug',\n '09': 'Sep',\n 10: 'Oct',\n 11: 'Nov',\n 12: 'Dec',\n};\n\nfunction InfluencerDetails({\n interests = [],\n fair_price,\n brand_affinity = [],\n avg_comments,\n avg_likes,\n stat_history,\n interest_categories = [],\n similar_audience,\n similar_users,\n}) {\n const classes = useStyles();\n\n return (\n \n \n \n INFLUENCER DETAILS\n \n \n \n \n \n \n \n \n \n \n \n Followers\n \n \n \n \n \n MONTH[x['month'].split('-')[1]]),\n datasets: [\n {\n label: 'Followers',\n data: stat_history?.map((x) => x['followers']),\n borderColor: 'rgb(239, 26, 116)',\n backgroundColor: 'rgba(239, 26, 116, 0.5)',\n },\n ],\n }}\n options={{\n plugins: {\n legend: {\n display: false,\n },\n },\n }}\n />\n \n \n \n \n \n \n \n \n \n \n Likes\n \n \n \n \n \n MONTH[x['month'].split('-')[1]]),\n datasets: [\n {\n label: 'Likes',\n data: stat_history?.map((x) => x['avg_likes']),\n borderColor: 'rgb(239, 26, 116)',\n backgroundColor: 'rgba(239, 26, 116, 0.5)',\n },\n ],\n }}\n options={{\n plugins: {\n legend: {\n display: false,\n },\n },\n }}\n />\n \n \n \n \n \n \n \n \n \n \n Interests\n \n \n \n {interest_categories !== '' ? (\n \n {interest_categories\n ? interest_categories.slice(0, 3).map((interest, i) => {\n return (\n \n \n \n {/* */}\n 0 ? interest : '']\n }\n style={{\n color: '#B9B9B9',\n fontSize: 13,\n width: 18,\n height: 18,\n }}\n />\n \n \n \n {Object.keys(interest).length > 0 ? interest : ''}\n \n \n \n \n );\n })\n : ''}\n \n ) : null}\n \n \n \n \n \n \n \n \n \n \n Influencer Brand Affinity\n \n \n \n \n {(Array.isArray(brand_affinity) ? brand_affinity.slice(0, 10) : []).map((brand, i) => (\n \n {brand.name} \n \n ))}\n \n \n {/* \n \n \n \n \n \n \n Pricing\n \n \n \n \n \n \n \n \n {`Fair Price(Beta)`}\n \n \n \n \n {fair_price}\n \n \n \n */}\n {\n // \n // \n // \n // \n // Details\n // \n // \n // \n // {/* */}\n // {/* Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut */}\n // {/* */}\n // \n // \n // \n }\n {/* \n */}\n \n \n \n \n \n \n {/* */}\n \n \n \n Similar Audience\n \n \n \n \n \n {similar_audience && similar_audience.length > 0 ? (\n \n \n \n Influencer\n \n Engagements \n Followers \n \n\n {similar_audience.map((data) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n {data.username.length > 0 ? (\n {\n window.open(data.url, '_blank');\n }}\n >\n {data.username}\n \n ) : (\n {\n window.open(data.url, '_blank');\n }}\n >\n {data.fullname}\n \n )}\n \n \n {data.is_verified ? (\n \n ) : (\n ''\n )}\n \n \n \n \n {data.location ? (\n \n \n \n \n \n \n {data.location.length < 15\n ? data.location\n : `${data.location.slice(0, 15)}...`}\n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n \n {data.engagements.toLocaleString()}\n \n \n {data.followers.toLocaleString()}\n \n \n );\n })}\n
\n ) : (\n \n \n No data available \n \n \n )}\n \n \n \n \n \n \n \n \n {/* */}\n \n \n \n Similar Topics\n \n \n \n \n \n {similar_users && similar_users.length > 0 ? (\n \n \n \n Influencer\n \n Engagements \n Followers \n \n {similar_users.map((data) => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n {data.username.length > 0 ? (\n {\n window.open(data.url, '_blank');\n }}\n >\n {data.username}\n \n ) : (\n {\n window.open(data.url, '_blank');\n }}\n >\n {data.fullname}\n \n )}\n \n \n {data.is_verified ? (\n \n ) : (\n ''\n )}\n \n \n \n \n \n {data.location ? (\n \n \n \n \n \n \n {data.location}\n \n \n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n {data.engagements.toLocaleString()}\n \n \n {data.followers.toLocaleString()}\n \n \n );\n })}\n
\n ) : (\n \n \n No data available \n \n \n )}\n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#f4f4fe',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n padding: 15,\n marginTop:10,\n },\n card: {\n // background: 'linear-gradient(135.2deg, white 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n padding: 20,\n border:'1px solid #dedede',\n marginLeft:-1,\n marginBottom:-1\n },\n graphCard: {\n height: 260,\n },\n iconSize: {\n width: 15,\n height: 15,\n },\n brandAffinityCard: {\n height: 130,\n },\n pricingCard: {\n height: 180,\n },\n interestIconContainer: {\n // background: \"linear-gradient(135deg, white 0%, #FFFFFF 100%)\",\n // boxShadow:\n // \"-5px 5px 10px rgba(220, 221, 222, 0.2), 5px -5px 10px rgba(220, 221, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(220, 221, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(220, 221, 222, 0.5)\",\n borderRadius: '50%',\n padding: 3,\n width: 23,\n height: 23,\n },\n interestIcon: {\n color: '#B9B9B9',\n fontSize: 13,\n },\n fairPriceValueBox: {\n background: 'white',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n // borderRadius: 10,\n height: 100,\n padding: 20,\n },\n brandContainer: {\n background: 'white',\n boxShadow:\n '-5px 5px 10px rgba(218, 219, 222, 0.2), 5px -5px 10px rgba(218, 219, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(218, 219, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(218, 219, 222, 0.5)',\n // borderRadius: 10,\n padding: 12,\n marginLeft: 10,\n },\n tableHeader: {\n color: '#777777',\n fontSize: 16,\n },\n tableData: {\n fontSize: 16,\n },\n similarCard: {\n height: 500,\n // marginTop: 15,\n },\n}));\n\nexport default InfluencerDetails;\n","import { Typography, Grid, Button } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js';\nimport { Bar } from 'react-chartjs-2';\nimport { Doughnut, Pie } from 'react-chartjs-2';\n\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport GenderSplitIcon from 'assets/discovery/gender-split-icon.png';\nimport LanguageIcon from 'assets/discovery/Language-icon.png';\nimport FilterVintageIcon from '@material-ui/icons/FilterVintage';\n\nimport ActivewearIcon from 'assets/planner/Activewear.png';\nimport ArtDesignIcon from 'assets/planner/Art-and-Design.png';\nimport BeautyCosmeticIcon from 'assets/planner/Beauty-and-Cosmetics.png';\nimport BeerWineIcon from 'assets/planner/Beer-Wine-&-Spirits.png';\nimport BusinessCareerIcon from 'assets/planner/Business-and-Careers.png';\nimport CameraPhotographyIcon from 'assets/planner/Camera-&-Photography.png';\nimport CarMotorbikeIcon from 'assets/planner/Cars-&-Motorbikes.png';\nimport ClothesShoesIcon from 'assets/planner/Clothes-Shoes.png';\nimport CoffeeTeaIcon from 'assets/planner/Coffee-Tea-&-Beverages.png';\nimport ElectronicsComputerIcon from 'assets/planner/Electronics-and-Computers.png';\nimport FitnessYogaIcon from 'assets/planner/Yoga.png';\nimport FriendsFamilyIcon from 'assets/planner/Friends-Family-&-Relationships.png';\nimport GamingIcon from 'assets/planner/Gaming.png';\nimport HealthcareMedicineIcon from 'assets/planner/Healthcare-and-Medicine.png';\nimport HealthyLifestyleIcon from 'assets/planner/Healthy-Lifestyle.png';\nimport HomeDecorIcon from 'assets/planner/Home-Decor-Furniture-&-Garden.png';\nimport JewlleryWatchesIcon from 'assets/planner/Jewellery-&-Watches.png';\nimport LuxaryGoodsIcon from 'assets/planner/Luxury-Goods.png';\nimport MusicIcon from 'assets/planner/Music.png';\nimport PetsIcon from 'assets/planner/Pets.png';\nimport RestaurantFoodIcon from 'assets/planner/Restaurants-Food-&-Grocery.png';\nimport ShoppingRetail from 'assets/planner/Shopping-&-Retail.png';\nimport SportsIcon from 'assets/planner/Sports.png';\nimport TelevisionFilmsIcon from 'assets/planner/Television-and-Film.png';\nimport TobaccoSmokingIcon from 'assets/planner/Tobacco-&-Smoking.png';\nimport ToysIcon from 'assets/planner/Toys-Children-&-Baby.png';\nimport TravelTourismIcon from 'assets/planner/Travel-Tourism-and-Aviation.png';\nimport WeddingIcon from 'assets/planner/Wedding.png';\n\nimport IconButton from '@mui/material/IconButton';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\n\nconst audienceIcons = {\n 'Television & Film': TelevisionFilmsIcon,\n Music: MusicIcon,\n 'Shopping & Retail': ShoppingRetail,\n 'Coffee, Tea & Beverages': CoffeeTeaIcon,\n 'Camera & Photography': CameraPhotographyIcon,\n 'Clothes, Shoes, Handbags & Accessories': ClothesShoesIcon,\n 'Beer, Wine & Spirits': BeerWineIcon,\n Sports: SportsIcon,\n 'Electronics & Computers': ElectronicsComputerIcon,\n Gaming: GamingIcon,\n Activewear: ActivewearIcon,\n 'Art & Design': ArtDesignIcon,\n 'Travel, Tourism & Aviation': TravelTourismIcon,\n 'Business & Careers': BusinessCareerIcon,\n 'Beauty & Cosmetics': BeautyCosmeticIcon,\n 'Healthcare & Medicine': HealthcareMedicineIcon,\n 'Jewellery & Watches': JewlleryWatchesIcon,\n 'Restaurants, Food & Grocery': RestaurantFoodIcon,\n 'Toys, Children & Baby': ToysIcon,\n 'Fitness & Yoga': FitnessYogaIcon,\n Wedding: WeddingIcon,\n 'Tobacco & Smoking': TobaccoSmokingIcon,\n Pets: PetsIcon,\n 'Healthy Lifestyle': HealthyLifestyleIcon,\n 'Luxury Goods': LuxaryGoodsIcon,\n 'Home Decor, Furniture & Garden': HomeDecorIcon,\n 'Friends, Family & Relationships': FriendsFamilyIcon,\n 'Cars & Motorbikes': CarMotorbikeIcon,\n};\n\nChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend);\n\nfunction AudienceDetails({\n audience_location_split = {},\n audience_interest = [],\n audience_languages = [],\n audience_age_split = [],\n audience_genders_per_age = [],\n audience_gender_split = [],\n audience_gender = {},\n is_staff,\n dump,\n}) {\n const classes = useStyles();\n // const [textToCopy, setTextToCopy] = useState('Text');\n const Icon = '';\n const getLabelData = (x, key = 'code') => {\n if (['weight', 'male', 'female'].includes(key)) {\n return x?.map((i) => Math.round(i[key] * 100));\n }\n return x?.map((i) => (Math.round(i['weight'] * 100) > 0 ? i[key] : '0'));\n };\n\n const copyOnClick = (copyText) => {\n navigator.clipboard.writeText(copyText);\n };\n\n return (\n \n \n \n AUDIENCE DETAILS\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Audience Gender Split\n \n {is_staff ? (\n \n copyOnClick(\n audience_gender_split.map(\n (entry) => `${entry.code} (${Math.round(entry.weight * 100)}%)`,\n ),\n )\n }\n >\n \n \n ) : null}\n \n \n \n {audience_gender_split.every(\n (entry) => entry.hasOwnProperty('code') && entry.hasOwnProperty('weight'),\n ) ? (\n \n `${entry.code} (${Math.round(entry.weight * 100)}%)`,\n ),\n datasets: [\n {\n label: 'Gender',\n data: audience_gender_split.map((entry) =>\n Math.round(entry.weight * 100),\n ),\n backgroundColor: [\n 'rgba(54, 162, 235, 0.6)', // Blue for Male\n 'rgba(255, 99, 132, 0.6)', // Red for Female\n ],\n },\n ],\n }}\n options={{\n legend: {\n display: false,\n position: 'right',\n },\n }}\n />\n \n \n {audience_gender && audience_gender.gender\n ? audience_gender.gender\n : null}\n \n \n {audience_gender && audience_gender.percentage\n ? `${Math.round(parseFloat(audience_gender.percentage))}%`\n : null}\n \n \n \n ) : null}\n \n \n \n \n \n \n \n \n \n \n \n Audience Interest\n \n \n \n \n {audience_interest instanceof Array &&\n audience_interest.map((interest, i) => {\n return (\n \n \n \n {/* */}\n \n \n \n {interest.name} \n \n \n \n );\n })}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Language\n \n {is_staff && audience_languages ? (\n \n copyOnClick(\n audience_languages\n .slice(0, 3)\n .map((language) => `${language.name} (${language.percentage})`),\n )\n }\n >\n \n \n ) : null}\n \n \n \n {audience_languages instanceof Array &&\n audience_languages.slice(0, 3).map((language, i) => (\n \n \n \n \n {language.percentage}\n \n \n \n \n {language.name}\n \n \n \n \n ))}\n \n \n \n \n \n \n \n \n \n \n \n Audience Age Split\n \n {is_staff && audience_age_split instanceof Array ? (\n \n copyOnClick(\n audience_age_split.map(\n (age) => `${age.code} (${Math.round(age.weight * 100)}%)`,\n ),\n )\n }\n >\n \n \n ) : null}\n \n \n \n \n val != '0',\n ),\n datasets: [\n {\n label: 'Age Split',\n data: getLabelData(audience_age_split, 'weight').filter(\n (val) => val > 0,\n ),\n backgroundColor: 'rgba(123, 97, 255, 0.5)',\n },\n ],\n }}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n Audience Location Split\n \n {is_staff &&\n audience_location_split &&\n (audience_location_split?.cities || audience_location_split?.countries) ? (\n {\n const locations =\n audience_location_split?.cities?.map(\n (x) => `${x.name} (${Math.round(x.weight * 100)}%)`,\n ) ||\n audience_location_split?.countries?.map(\n (x) => `${x.name} (${Math.round(x.weight * 100)}%)`,\n );\n copyOnClick(locations);\n }}\n >\n \n \n ) : null}\n \n \n \n \n x['name']),\n datasets: [\n {\n label: 'Location Split',\n data: getLabelData(\n audience_location_split?.cities ||\n audience_location_split?.countries,\n 'weight',\n ),\n backgroundColor: 'rgba(185, 0, 0, 0.8)',\n },\n ],\n }}\n />\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: '#F3F4FE',\n border: '1px solid #ffffff',\n },\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n padding: 15,\n marginTop: 10,\n },\n card: {\n background: '#efeff9',\n // background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n border: '1px solid #dedede',\n marginLeft:-1,\n marginBottom:-1\n },\n graphCard: {\n height: 200,\n },\n iconSize: {\n width: 15,\n height: 15,\n },\n brandAffinityCard: {\n height: 170,\n },\n pricingCard: {\n height: 200,\n marginTop: 15,\n },\n interestContainer: {\n marginTop: 15,\n marginLeft: 5,\n overflowY: 'scroll',\n maxHeight: '90%',\n },\n interestIconContainer: {\n // background: \"linear-gradient(135deg, #E8EAEE 0%, #FFFFFF 100%)\",\n // boxShadow:\n // \"-5px 5px 10px rgba(220, 221, 222, 0.2), 5px -5px 10px rgba(220, 221, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(220, 221, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(220, 221, 222, 0.5)\",\n borderRadius: '50%',\n padding: 3,\n width: 23,\n height: 23,\n },\n interestIcon: {\n color: '#B9B9B9',\n fontSize: 13,\n paddingBottom: 2,\n width: 18,\n height: 18,\n },\n languageBox: {\n // marginLeft: 20,\n // justifyContent: 'space-evenly',\n // alignItems: 'center',\n },\n languageContainer: {\n // background: '#F3F4FE',\n // boxShadow:'-5px 5px 10px rgba(219, 220, 229, 0.2), 5px -5px 10px rgba(219, 220, 229, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n // borderRadius: 5,\n padding: '5px 20px',\n margin: 10,\n borderRight: '1px solid #000000',\n },\n}));\n\nexport default AudienceDetails;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\n\nfunction PopularPosts({ popular_posts = [] }) {\n const classes = useStyles();\n return (\n \n \n \n POPULAR POSTS\n \n \n \n \n {popular_posts.slice(0, 30).map((post, i) => (\n \n \n {\n window.open(post.link, '_blank');\n }}>\n \n \n \n \n \n {\n post.text? {post.text && post.text.slice(0, 100)}... :''\n }\n \n \n \n \n \n \n \n \n \n \n {post.likes} \n \n \n \n \n \n \n \n \n \n {post.comments} \n \n \n \n \n \n \n \n ))}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 15,\n marginTop:5\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop:5,\n marginLeft:2\n\n },\n image: {\n height: 220,\n // width: 220,\n // borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n\nexport default PopularPosts;\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport countertostring from 'components/PlannerV2/components/common';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\nfunction CommercialPosts({ commercial_posts = [] }) {\n const classes = useStyles();\n return (\n \n \n \n COMMERCIAL POSTS\n \n \n \n \n {commercial_posts.length > 0\n ? commercial_posts.slice(0, 30).map((post, i) => (\n \n \n {\n window.open(post.link, '_blank');\n }}\n >\n \n \n \n \n \n \n {post.text && post.text.slice(0, 100)}...\n \n \n \n \n \n \n \n \n \n \n {countertostring(post.stat.likes)} \n \n \n \n \n \n \n \n \n \n {countertostring(post.stat.comments)} \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop:10\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop:5,\n marginLeft:2\n },\n image: {\n height: 220,\n // width: 220,\n // borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n\nexport default CommercialPosts;\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport countertostring from 'components/PlannerV2/components/common';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\nexport default function RecentPosts({ recent_posts = [] }) {\n const classes = useStyles();\n return (\n \n \n \n RECENT POSTS\n \n \n \n {/* */}\n \n {recent_posts.length > 0\n ? recent_posts.slice(0, 30).map((post, i) => (\n \n \n {\n window.open(post.link, '_blank');\n }}\n >\n \n \n \n {/* */}\n \n \n {post.text ? (\n \n {post.text && post.text.slice(0, 100)}...\n \n ) : (\n ''\n )}\n \n \n \n \n \n \n \n \n \n \n {countertostring(post.stat.likes)}\n \n \n \n \n \n \n \n \n \n \n \n {countertostring(post.stat.comments)}\n \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop: 10,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop: 5,\n marginLeft: 2,\n },\n image: {\n height: 220,\n // width: 220,\n // borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport countertostring from 'components/PlannerV2/components/common';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\nexport default function TopReels({ top_reels = [] }) {\n const classes = useStyles();\n return (\n \n \n \n TOP REELS\n \n \n \n \n {top_reels.length > 0\n ? top_reels.slice(0, 30).map((reel, i) => (\n \n \n {\n window.open(reel.link, '_blank');\n }}\n >\n \n \n \n {/* */}\n \n \n {\n reel.text?{reel.text.slice(0, 100)}... :''\n }\n \n \n \n \n \n \n \n \n \n {countertostring(reel.stat.likes)} \n \n \n \n \n \n \n \n \n \n {countertostring(reel.stat.comments)} \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop:10\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop:5,\n marginLeft:2\n },\n image: {\n height: 220,\n // width: 220,\n // borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport countertostring from 'components/PlannerV2/components/common';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\nexport default function RecentReels({ recent_reels = [] }) {\n const classes = useStyles();\n return (\n \n \n \n RECENT REELS\n \n \n \n \n {recent_reels.length > 0\n ? recent_reels.slice(0, 30).map((reel, i) => (\n \n \n {\n window.open(reel.link, '_blank');\n }}\n >\n \n \n \n \n \n {\n reel.text?{reel.text.slice(0, 100)}... :''\n }\n \n \n \n \n \n \n \n \n \n \n {countertostring(reel.stat.likes)} \n \n \n \n \n \n \n \n \n \n {countertostring(reel.stat.comments)} \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop:10\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop:5,\n marginLeft:2\n },\n image: {\n height: 220,\n // width: 220,\n // borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\n\nexport default function TopHashTags({ top_hashtags = [] }) {\n const classes = useStyles();\n return (\n \n \n \n TOP HASHTAGS\n \n \n \n \n {top_hashtags.length > 0\n ? top_hashtags.slice(0, 3).map((hashtag, i) => (\n \n \n \n #{hashtag.tag} \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop: 10,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow: '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop: 5,\n marginLeft: 2,\n },\n}));\n","export default __webpack_public_path__ + \"static/media/instagram-reels-icon.140e9f9e.webp\";","import { FormControl, InputLabel, MenuItem, Select, Typography } from '@mui/material';\nimport { useEffect, useState } from 'react';\nimport InstagramIcon from '@mui/icons-material/Instagram';\nimport AttachMoneyIcon from '@mui/icons-material/AttachMoney';\nimport reels from '../../../../../../assets/instagram-reels-icon.webp';\nimport CurrencyRupeeIcon from '@mui/icons-material/CurrencyRupee';\nimport GridViewIcon from '@mui/icons-material/GridView';\nimport TheatersIcon from '@mui/icons-material/Theaters';\nimport VideoLibraryIcon from '@mui/icons-material/VideoLibrary';\nimport { fetchPostWiseBifurcation } from 'api_handlers/planner2';\n\nimport { Grid } from '@mui/material';\n\nfunction StatsFilters({ id, influencer, platform,filteredData, isClicked}) {\n const [filterViaTypes, SetFilterViaTypes] = useState('all');\n const [filterViaPayment, setFilterViaPayment] = useState('all');\n const [postsNumber, setPostsNumber] = useState(12);\n // const [platform,setplatform] = useState({})\n console.log('postsNumber', filterViaTypes, filterViaPayment, postsNumber, id, influencer,platform, isClicked);\n useEffect(()=>{\n if (id) {\n if (filterViaPayment === 'all') {\n fetchPostWiseBifurcation(\n id,\n false,\n filterViaTypes,\n postsNumber,\n filterViaTypes,\n postsNumber,\n ).then(res=>filteredData(res)); \n } else if (filterViaPayment === 'paid') {\n fetchPostWiseBifurcation(\n id,\n true,\n filterViaTypes,\n postsNumber,\n filterViaTypes,\n postsNumber,\n ).then(res=>filteredData(res));\n }\n }\n },[filterViaTypes,filterViaPayment,postsNumber, isClicked])\n return (\n \n \n \n {platform === 'instagram' ? (\n \n \n SetFilterViaTypes('all')}\n >\n \n \n \n All\n \n \n \n \n SetFilterViaTypes('post')}\n >\n \n \n \n \n \n \n Posts\n \n \n \n \n SetFilterViaTypes('reel')}\n >\n \n \n \n \n \n \n Reels\n \n \n \n \n \n \n ) : (\n ''\n )}\n\n \n \n setFilterViaPayment('all')}\n >\n \n \n \n \n \n \n All Posts\n \n \n \n \n setFilterViaPayment('paid')}\n >\n \n \n \n \n \n \n Paid Posts\n \n \n \n \n setFilterViaPayment('organic')}\n >\n {/* \n\n \n \n \n \n \n Organic\n \n \n */}\n \n \n \n\n \n \n \n \n \n \n {/* Age */}\n {\n setPostsNumber(event.target.value);\n }}\n MenuProps={{\n PaperProps: {\n style: {\n backgroundColor: '#f8f8f8',\n },\n },\n }}\n style={{\n fontSize: '11px',\n fontWeight: 600,\n\n background: '#f5f5f5',\n borderRadius: '5px',\n maxHeight: '30px',\n }}\n >\n \n {' '}\n 12 Posts\n \n \n 15 Posts\n \n \n 20 Posts\n \n \n 25 Posts\n \n \n 30 Posts\n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default StatsFilters;\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\n\nexport default function RelevantHashTags({ relevant_tags = [] }) {\n const classes = useStyles();\n return (\n \n \n \n RELEVANT HASHTAGS\n \n \n \n \n {relevant_tags.length > 0\n ? relevant_tags.slice(0, 3).map((hashtag, i) => (\n \n \n \n #{hashtag.tag} \n \n \n \n ))\n : ''}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n // boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n // borderRadius: 10,\n padding: 15,\n // marginBottom: 30,\n marginTop: 10,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n // boxShadow:'-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n // borderRadius: 20,\n padding: 20,\n marginTop: 5,\n marginLeft: 2,\n },\n}));\n","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\n\nimport InstagramIconButton from 'components/Discovery/components/InstagramIconButton';\nimport YouTubeIconButton from 'components/Discovery/components/YouTubeIconButton';\n\nimport BasicInfo from './components/BasicInfo';\nimport BasicStats from './components/BasicStats';\nimport InfluencerDetails from './components/InfluencerDetails';\nimport AudienceDetails from './components/AudienceDetails';\nimport PopularPosts from './components/PopularPosts';\nimport CommercialPosts from './components/CommercialPosts/CommercialPosts';\nimport RecentPosts from './components/RecentPosts/RecentPosts';\nimport TopReels from './components/TopReels/TopReels';\nimport RecentReels from './components/RecentReels/RecentReels';\nimport TopHashTags from './components/TopHashTags/TopHashTags';\nimport StatsFilters from './components/BasicStats/StatsFilters';\nimport RelevantHashTags from './components/RelevantHashTags/RelevantHashTags';\nimport { ThemeProvider } from '@material-ui/core/styles';\nimport {\n getIdViaChannelYt,\n // getDiscoveryInfluencersDetails,\n getIdViaHandler,\n} from 'api_handlers/discovery';\nimport { getDiscoveryInfluencersDetails } from 'api_handlers/planner2';\nimport themeV2 from 'themeV2';\nimport { useLocation } from 'react-router-dom';\nfunction DetailViewModal({ id, detailViewOpened = false, setDetailViewOpened, is_staff }) {\n const classes = useStyles();\n const [influenerDetail, setInfluenerDetail] = useState({});\n const [isClicked, setIsclicked] = useState(false);\n const [intervalId, setIntervalId] = useState(null);\n const [updateStatus, setUpdateStatus] = useState('');\n const location = useLocation();\n const [getId, setGetId] = useState(id);\n const influencer_handler = window.location.pathname.split('/')[4];\n const platform = window.location.pathname.split('/')[3];\n const [filteredData,setFilteredData] = useState({})\n \n const fetchDetails = async () => {\n if (getId) {\n getDiscoveryInfluencersDetails(getId).then((response) => {\n setInfluenerDetail(response);\n if (response?.update_status === 'updating') {\n setUpdateStatus('updating');\n }\n if (response?.update_status === 'updated') {\n setUpdateStatus('updated');\n }\n });\n }\n };\n\n if (!id) {\n is_staff = true;\n detailViewOpened = true;\n let link = true;\n if (platform == 'youtube') {\n getIdViaChannelYt(influencer_handler).then((res) => {\n setGetId(res.data.id);\n });\n } else if (platform == 'instagram') {\n getIdViaHandler(influencer_handler).then((res) => {\n setGetId(res.data.id);\n });\n }\n }\n\n useEffect(() => {\n // getDiscoveryInfluencersDetails(id).then((response) => {\n // setInfluenerDetail(response);\n\n // });\n fetchDetails();\n }, [getId]);\n\n useEffect(() => {\n if (isClicked == true) {\n fetchDetails().then(() => {\n setIsclicked(false);\n });\n }\n }, [isClicked]);\n\n return (\n // setDetailViewOpened(false)}\n // className={classes.base}\n // >\n \n \n \n \n {/* \n \n \n \n \n \n \n \n \n */}\n {/* setDetailViewOpened(false)}\n >\n \n \n Close \n \n \n \n \n \n */}\n \n \n \n \n \n setIsclicked(val)}\n updateStatus={updateStatus === 'updating' ? true : false}\n getId={getId}\n />\n \n \n {\n influenerDetail.id?\n \n setFilteredData(val)}\n isClicked={isClicked}\n > \n \n \n \n :''\n }\n \n \n \n \n \n \n \n \n \n \n {influenerDetail.youtube === null ? (\n \n \n \n ) : null}\n \n \n \n {influenerDetail.youtube === null ? (\n \n \n \n ) : null}\n {influenerDetail.youtube === null ? (\n \n \n \n ) : null}\n {influenerDetail.youtube === null ? (\n \n \n \n ) : null}\n \n \n \n \n \n \n \n // \n );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: '100%',\n width: '90%',\n // margin: 'auto',\n // marginTop: 5,\n },\n root: {\n background: '#ffffff',\n // filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n // height: 700,\n // width: 1200,\n height: '100%',\n width: '100%',\n // borderRadius: 10,\n // padding: 45,\n // overflowY: 'scroll',\n },\n body: {\n background: '#ffffff',\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n // marginBottom: 40,\n },\n\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n // boxShadow: '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n padding: 7,\n height: 30,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n}));\n\nexport default DetailViewModal;\n","import * as React from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useTheme } from '@mui/material/styles';\n\n\nimport Button from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Typography from '@mui/material/Typography';\nimport Grid from '@mui/material/Grid';\n\nimport SubCard from 'ui-component/cards/SubCard';\n\nimport Chart from 'react-apexcharts';\n\nimport config, { ThemeMode } from 'config';\nimport { showPremiumFeatureDialog } from 'actions/planner2';\nimport { Box, FormControl, FormHelperText, OutlinedInput, TextareaAutosize } from '@material-ui/core';\nimport { saveContactDetails } from 'api_handlers/brand';\n\nimport mixpanel from 'mixpanel-browser';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\n\nexport default function AdvancedFilters() {\n const open = useSelector((state) => state.planner2.showPremiumFeatureDialog);\n const dispatch = useDispatch();\n const theme = useTheme();\n\n const [errors, setErrors] = React.useState('');\n const [formInfo, setFormInfo] = React.useState({\n 'email': { 'value': '', 'error': false },\n 'company_name': { 'value': '', 'error': false },\n 'phone_number': { 'value': '', 'error': false }, \n 'reason': { 'value': '', 'error': false }, \n 'first_name': { 'value': '', 'error': false }, \n 'last_name': { 'value': '', 'error': false }, \n })\n const handleClose = () => dispatch(showPremiumFeatureDialog(false));\n\n\n const blockSX = {\n p: 2.5,\n borderLeft: '1px solid ',\n borderBottom: '1px solid ',\n borderLeftColor: theme.palette.mode === ThemeMode.DARK ? 'dark.main' : 'grey.200',\n borderBottomColor: theme.palette.mode === ThemeMode.DARK ? 'dark.main' : 'grey.200'\n };\n\n const submitContactForm = async () => {\n let tempFormInfo = {...formInfo};\n let isValidationError = false;\n let apiData = {};\n Object.keys(tempFormInfo).map((field)=>{\n let value = tempFormInfo[field]['value'];\n tempFormInfo[field]['error'] = !(value && value.length > 0);\n apiData[field] = value;\n if (!isValidationError && tempFormInfo[field]['error']) {\n isValidationError = tempFormInfo[field]['error'];\n }\n })\n let re = /\\S+@\\S+\\.\\S+/;\n if (!re.test(tempFormInfo['email']['value'])) {\n tempFormInfo['email']['error'] = true;\n isValidationError = true;\n }\n let isValidEmail = true;\n let personalDomain = [\"gmail.com\",\"yahoo.com\",\"outlook.com\",\"protonmail.com\",\"aol.com\",\"zoho.com\",\"icloud.com\",\"gmx.com\",\"yandex.com\",\"mail.com\",\"google.com\"]\n personalDomain.map(each=>{\n if (isValidEmail && tempFormInfo['email']['value'].indexOf(each) > -1) {\n isValidEmail = false;\n }\n })\n if (!isValidEmail) {\n isValidationError = true;\n setErrors({ 'non_field_errors': [\"Oops! There seems to be an issue with your email domain please use your work email or write to us at Enquiry@influencer.in and we will get this working for you immediately.\"] })\n }\n setFormInfo(tempFormInfo);\n if (isValidationError) {\n return\n }\n apiData['phone_number'] = apiData['phone_number'].indexOf('+') === -1 ? \n '+91'+apiData['phone_number'] : apiData['phone_number'];\n let resp = await saveContactDetails(apiData);\n if ([200, 201].includes(resp.status)) {\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Submit-Form\", {\n \"type\": \"Contact-Us\"\n });\n }\n handleClose();\n } else if ([400, 401, 402, 403].includes(resp.status)) { \n const errors = await resp.json();\n setErrors(errors);\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n }\n\n const setFormInfoValue = (key, value) => {\n let tempFormInfo = {...formInfo}\n tempFormInfo[key]['value'] = value;\n tempFormInfo[key]['error'] = !(value && value.length > 0);\n setFormInfo(tempFormInfo);\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n Need \n support? \n Talk to our \n Experts \n \n Connect with Our Experienced Product Specialists to Learn How Influencer.in can\n Benefit Your Business!\n \n \n \n \n \n \n \n First Name \n {\n setFormInfoValue('first_name', e.target.value);\n }}\n />\n {formInfo['first_name']['error'] && (\n \n Please Enter Valid First Name\n \n )}\n \n \n \n \n Last Name \n {\n setFormInfoValue('last_name', e.target.value);\n }}\n />\n {formInfo['last_name']['error'] && (\n \n Please Enter Valid Last Name\n \n )}\n \n \n \n \n \n Work Email Address \n {\n setFormInfoValue('email', e.target.value);\n }}\n />\n {formInfo['email']['error'] && (\n \n Please Enter Valid Email\n \n )}\n \n \n \n \n Company Name \n {\n setFormInfoValue('company_name', e.target.value);\n }}\n />\n {formInfo['company_name']['error'] && (\n \n Please Enter Valid Company Name\n \n )}\n \n \n \n \n Contact Details \n {\n setFormInfoValue('phone_number', e.target.value);\n }}\n />\n {formInfo['phone_number']['error'] && (\n \n Please Enter Valid Conact Details\n \n )}\n \n \n \n \n How Can We Help \n {\n setFormInfoValue('reason', e.target.value);\n }}\n />\n {formInfo['reason']['error'] && (\n \n Please Enter Valid Reason\n \n )}\n \n \n {\n errors ? \n \n {'non_field_errors' in errors ? errors['non_field_errors'].map(each=>{\n return each;\n }) :\n \n {Object.keys(errors).map((key) => {\n const error = errors[key];\n if (Array.isArray(error)) {\n return (\n \n {error}\n \n );\n } else {\n return (\n \n {Object.values(error).join(',')}\n \n );\n }\n })}\n } \n : null\n }\n \n {submitContactForm()}} disableElevation fullWidth size=\"large\" variant=\"contained\" color=\"secondary\">\n Submit\n \n \n \n \n \n \n \n );\n}\n","import * as React from 'react';\nimport { borderRadius } from '@material-ui/system';\nimport { Padding } from '@mui/icons-material';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Iframe from 'react-iframe';\nimport { Grid } from '@material-ui/core';\nimport { useEffect, useState } from 'react';\nimport { getIdViaChannelYt, getIdViaHandler } from 'api_handlers/discovery';\nimport { getDiscoveryInfluencersDetails } from 'api_handlers/planner2';\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton';\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\nexport default function InsightFrame() {\n const platform = window.location.pathname.split('/')[3];\n const influencer_handler = window.location.pathname.split('/')[4];\n const classes = useStyle();\n const [getId, setGetId] = useState(null);\n const [updateStatus, setUpdateStatus] = useState('');\n\n const fetchDetails = async () => {\n if (getId) {\n getDiscoveryInfluencersDetails(getId).then((response) => {\n if (response?.update_status === 'updating') {\n setUpdateStatus('updating');\n }\n if (response?.update_status === 'updated') {\n setUpdateStatus('updated');\n }\n });\n }\n };\n\n if (!getId) {\n if (platform === 'youtube') {\n getIdViaChannelYt(influencer_handler).then((res) => {\n setGetId(res.data.id);\n });\n } else if (platform === 'instagram') {\n getIdViaHandler(influencer_handler).then((res) => {\n setGetId(res.data.id);\n });\n }\n }\n\n useEffect(() => {\n fetchDetails();\n }, [getId]);\n\n return (\n \n \n \n {\n updateStatus ? \n \n {\n setUpdateStatus('')\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={updateStatus === 'updating'}\n fullWidth\n >\n \n \n {\n setUpdateStatus('')\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n We are updating the data for this profile, Please come back later\n \n \n \n : null\n }\n \n \n );\n}\n\nconst useStyle = makeStyles(() => ({\n frameStyle: {\n \n },\n}));\n","import { useHistory } from 'react-router-dom';\nimport PropTypes from 'prop-types';\n\n// material-ui\nimport { useTheme } from '@mui/material/styles';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CardMedia from '@mui/material/CardMedia';\nimport Grid from '@mui/material/Grid';\nimport Typography from '@mui/material/Typography';\nimport AvatarGroup from '@mui/material/AvatarGroup';\n\nimport Avatar from 'ui-component/extended/Avatar';\nimport { gridSpacing } from 'store/constant';\nimport { ThemeMode } from 'config';\nimport { useSelector } from 'react-redux';\n\nconst PlannerCard = ({\n platform,\n name,\n background_img,\n id,\n uuid,\n pictures,\n total_influencers,\n tags,\n created_at,\n created_by,\n brandName,\n}) => {\n const theme = useTheme();\n let history = useHistory();\n const user = useSelector((state) => state.planner2.user);\n return (\n {\n if (Object.keys(user).length > 0) {\n history.push(`/planner/collab-list/${encodeURIComponent(name)}/influencers/${uuid}`, { text: 'planner',platform:platform });\n }\n }}\n >\n \n \n \n \n \n \n {platform === 'all' ? (\n \n \n \n \n \n \n \n \n ) : platform === 'instagram' || 'youtube' ? (\n \n ) : (\n ''\n )}\n {/* */}\n \n \n \n \n \n \n {name} \n \n \n Created By: {brandName ? brandName : 'N/A'} \n \n \n Created At: {created_at ? created_at : 'N/A'} \n \n \n \n \n \n \n {pictures.map((each, index) => {\n return ;\n })}\n \n \n \n \n );\n};\n\nPlannerCard.propTypes = {\n avatar: PropTypes.string,\n name: PropTypes.string,\n background: PropTypes.string,\n category: PropTypes.string,\n status: PropTypes.string,\n};\n\nexport default PlannerCard;\n","import React, { useEffect } from 'react';\n\n// material-ui\nimport Button from '@mui/material/Button';\nimport Grid from '@mui/material/Grid';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport Menu from '@mui/material/Menu';\nimport MenuItem from '@mui/material/MenuItem';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Pagination from '@mui/material/Pagination';\nimport Typography from '@mui/material/Typography';\nimport FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport Select from '@mui/material/Select';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport TextField from '@mui/material/TextField';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\n\n// project imports\nimport MainCard from 'ui-component/cards/MainCard';\nimport { gridSpacing } from 'store/constant';\nimport PlannerCard from './PlannerCard';\n\n// assets\nimport SearchIcon from '@mui/icons-material/Search';\nimport ExpandMoreRoundedIcon from '@mui/icons-material/ExpandMoreRounded';\n\nimport { fetchPlanList, createPlan } from 'api_handlers/planner2';\nimport { useSelector } from \"react-redux\";\nimport { useLocation } from 'react-router-dom';\n\nimport mixpanel from 'mixpanel-browser';\n// import { useParams } from 'react-router-dom';\n\nconst PlannerList = () => {\n const [plannerItems, setPlannerItems] = React.useState([]);\n const [search, setSearch] = React.useState('');\n const [anchorEl, setAnchorEl] = React.useState(null);\n const [platform, setPlatform] = React.useState('');\n const [page, setPage] = React.useState(1);\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\n const [openCreatePlan, setOpenCreatePlan] = React.useState(false);\n const [planName, setPlanName] = React.useState('');\n const [tags, setTags] = React.useState('');\n const [createPlatform, setCreatePlatform] = React.useState('all');\n const [errors, setErrors] = React.useState({ planName: 'List Name is required' });\n const location = useLocation();\n const user = useSelector((state) => state.planner2.user);\n\n const handleClick = (event) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n \n const handleSearch = async (event) => {\n const newString = event?.target.value;\n // if (newString) {\n setSearch(newString);\n // }\n\n // if (newString) {\n // // dispatch(filterProfileCards(newString));\n // } else {\n // // dispatch(getProfileCards());\n // }\n };\n const fetchAndSetPlannerList = async () => {\n try {\n const response = await fetchPlanList(user.brand.id, platform, search, page, rowsPerPage);\n console.log(\"P_list_response: \", response)\n const plansData = response.results.plans_lists;\n setPlannerItems(\n Object.keys(plansData).map((key) => {\n let data = plansData[key];\n data['name'] = key;\n return data;\n })\n );\n } catch (error) {\n console.error(\"Error fetching planner list:\", error);\n }\n };\n\n useEffect(() => {\n \n fetchAndSetPlannerList();\n }, [platform, search, page, rowsPerPage, user]);\n \n // eslint-disable-next-line react-hooks/exhaustive-deps\n const handlePageChange = (event, newPage) => {\n setPage(newPage);\n };\n\n const handleRowsPerPageChange = (event) => {\n setRowsPerPage(parseInt(event.target.textContent, 10));\n setPage(1);\n };\n\n const paginatedItems = plannerItems.slice(\n (page - 1) * rowsPerPage,\n page * rowsPerPage\n );\n\n const handleCreatePlan = () => {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"collab_list_create_list\")\n }\n setOpenCreatePlan(true);\n };\n\n const handleCloseModal = () => {\n setOpenCreatePlan(false);\n };\n\n const handleSubmitPlan = async () => {\n if (!planName.trim()) {\n setErrors({ planName: 'List Name is required' });\n return;\n }\n\n try {\n const response = await createPlan({\n name: planName,\n brand_id: user.brand.id,\n tags: tags,\n platform: createPlatform,\n });\n\n if (response.status === 201) {\n if (process.env.NODE_ENV === 'production') {\n mixpanel.track(\"collab_list_created\", {\n name: planName,\n brand_id: user.brand.id,\n tags: tags,\n platform: createPlatform,\n source: 'collab_list'\n })\n }\n setPlanName('');\n setTags('');\n setCreatePlatform('all');\n setOpenCreatePlan(false);\n fetchAndSetPlannerList();\n } else {\n console.error('Error creating plan');\n }\n } catch (error) {\n console.error('Error submitting plan:', error);\n }\n };\n\n return (\n \n \n Collab List \n \n \n \n \n \n Platform \n {\n const selectedPlatform = e.target.value;\n // Check if the selected value is the same as the current platform, and reset if so\n setPlatform((prevPlatform) => (prevPlatform === selectedPlatform ? '' : selectedPlatform));\n }}\n label=\"Platform\"\n >\n All Platforms \n Instagram \n YouTube \n \n \n \n \n \n \n \n \n }\n size=\"small\"\n />\n \n \n\n \n \n Create List\n \n \n\n \n \n \n }\n >\n \n {paginatedItems.map((item, index) => (\n \n \n \n ))}\n \n \n \n \n \n \n }\n onClick={handleClick}\n >\n {rowsPerPage} Rows\n \n \n \n \n \n \n\n \n Create List \n \n setPlanName(e.target.value)}\n error={Boolean(errors.planName)}\n helperText={errors.planName}\n margin=\"normal\"\n />\n setCreatePlatform(e.target.value)}\n margin=\"normal\"\n >\n Instagram \n YouTube \n All \n \n setTags(e.target.value)}\n margin=\"normal\"\n />\n \n Note:- Please add influencers from Discover\n \n \n \n \n Cancel\n \n \n Submit\n \n \n \n \n );\n};\n\nexport default PlannerList;\n","import React, { useState, useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Grid, Typography, Button, Alert, IconButton } from '@mui/material';\n\nimport { gridSpacing } from 'store/constant';\n\nimport InfluencerList from '../InfluencerList';\n\n// import { getPlannerInfluencersES } from 'api_handlers/es';\nimport { fetchPlanInfluencers } from 'api_handlers/planner2';\nimport { useLocation } from 'react-router-dom';\nimport { useHistory } from 'react-router-dom';\nimport { SearchOff } from '@mui/icons-material';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { downloadStatus } from 'api_handlers/planner2';\nconst PlanInfluencers = ({ match: { params } }) => {\n const [influencers, setInfluencers] = useState([]);\n const [count, setCount] = useState(0);\n const [platform, setPlatform] = useState('all');\n const [sortBy, setSortBy] = useState('followers');\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState('');\n const [errorMassage, setErrorMassage] = useState(false);\n const [successMassage, setSuccessMassage] = useState(false);\n const [downloadReport, setDownloadReport] = useState(false);\n const [successCount, setSuccessCount] = useState(0);\n\n const { planUUID } = params;\n const { listName } = params;\n const location = useLocation();\n const message = location.state?.text || 'noAuth';\n const planPlatform = location.state?.platform || 'noAuth';\n const history = useHistory();\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(async () => {\n console.log('platform PlanInfluencer List: ', platform);\n fetchPlanInfluencers(planUUID, platform, page, sortBy, search).then((response) => {\n console.log('RESPONSE: ', response);\n setCount(response.count);\n setInfluencers(\n response.results.map((profile) => {\n return profile;\n }),\n );\n });\n // fetchInfluencers(1)\n }, [page, platform, sortBy, search, successCount]);\n\n const handleDiscoverClick = () => {\n history.push('/planner/discover');\n };\n\n const handlePlatformChange = (newPlatform) => {\n setPlatform(newPlatform);\n };\n\n const handlePageChange = (newPage) => {\n setPage(newPage);\n };\n\n const handleSortChange = (newSortBy) => {\n setSortBy(newSortBy);\n };\n\n const handleSearch = (newSearch) => {\n if (newSearch.length > 2) {\n setSearch(newSearch);\n }\n if (newSearch.length <= 2) {\n setSearch('');\n }\n };\n\n useEffect(() => {\n if (successMassage) {\n setErrorMassage(false);\n }\n }, [successMassage]);\n\n const noInfluencers = influencers.length === 0;\n\n return (\n \n {errorMassage ? (\n \n Some influencer links encountered errors during upload please resolve them and reupload.{' '}\n {\n downloadStatus(planUUID).then((res) =>\n window.open(res.data.response_sheet_url, '_blank'),\n );\n setDownloadReport(true);\n }}\n >{`[Download error report].`} \n \n ) : successMassage ? (\n setSuccessMassage(false)}>\n \n \n }\n >\n All influencers are added successfully\n \n ) : (\n ''\n )}\n \n setErrorMassage(val)}\n successMassage={(val) => setSuccessMassage(val)}\n downloadReport={downloadReport}\n successCount={(val) => setSuccessCount(val)}\n />\n \n \n );\n};\n\nexport default PlanInfluencers;\n","export default __webpack_public_path__ + \"static/media/search.3a608aca.png\";","export default __webpack_public_path__ + \"static/media/target.36d34b60.png\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAARNZAAETWQGW3VUHAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAwBQTFRF////AwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEAwEEtRVHvgAAAP90Uk5TAAECAwQF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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/two-people.55d52187.png\";","export default __webpack_public_path__ + \"static/media/trophy.16e6df06.png\";","export default __webpack_public_path__ + \"static/media/video-camera.f0777ecc.png\";","export default __webpack_public_path__ + \"static/media/growth.2bb89e1d.png\";","export default __webpack_public_path__ + \"static/media/number-17.addac1ac.png\";","export default __webpack_public_path__ + \"static/media/rocket.1a9f4942.png\";","export default __webpack_public_path__ + \"static/media/speaker.1e11f96b.png\";","export default __webpack_public_path__ + \"static/media/tv.d1669fef.png\";","export default __webpack_public_path__ + \"static/media/fire.1edd2da7.png\";","import { Grid, Typography } from '@mui/material';\n\nfunction VideoText(props) {\n return (\n \n \n \n \n \n \n \n \n {props.paragraphHeading}\n \n \n \n {props.paragraph ? - : ''}\n \n \n \n \n {props.paragraph} \n \n \n );\n}\n\nexport default VideoText;\n","import { Box, Grid, Typography } from '@mui/material';\nimport ImageValidator from 'components/ux/ImageValidator';\nimport { useState } from 'react';\nimport VideoText from './VideoText';\n\nfunction HelpAndSupportComponent(props) {\n const [playing, setPlaying] = useState(0);\n const [playFirst, setPlayFirst] = useState(1);\n return (\n \n \n \n \n {props.heading} \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 {props.paragraph6 ? (\n \n ) : (\n ''\n )}\n \n \n {props.paragraphHeading7 ? (\n \n ) : (\n ''\n )}\n \n \n {props.paragraphHeading8 ? (\n \n ) : (\n ''\n )}\n \n \n {props.paragraphHeading9 ? (\n \n ) : (\n ''\n )}\n \n \n {props.paragraphHeading10 ? (\n \n ) : (\n ''\n )}\n \n \n \n \n {props.bottomLine} \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {playFirst === 1 ? (\n \n ) : (\n 'another video'\n )}\n \n \n \n \n \n \n \n );\n}\n\nexport default HelpAndSupportComponent;\n","import { Box, Grid, Typography } from '@mui/material';\nimport { useState } from 'react';\nimport searchIcon from '../../../../assets/search.png';\nimport filter from '../../../../assets/target.png';\nimport budget from '../../../../assets/bag-with-dollar-sign.png';\nimport insights from '../../../../assets/decreasing-chart.png';\nimport shortList from '../../../../assets/open-folder.png';\nimport person from '../../../../assets/two-people.png';\nimport performers from '../../../../assets/trophy.png';\nimport content from '../../../../assets/video-camera.png';\nimport graph from '../../../../assets/growth.png';\nimport calender from '../../../../assets/number-17.png';\nimport rocket from '../../../../assets/rocket.png';\nimport speaker from '../../../../assets/speaker.png';\nimport tv from '../../../../assets/tv.png';\nimport fire from '../../../../assets/fire.png';\nimport transfer from '../../../../assets/transfer.png';\n\nimport HelpAndSupportComponent from './HelpAndSupportComponent';\n\nfunction HelpAndSupport() {\n return (\n \n \n \n \n\n \n \n \n\n \n \n \n \n );\n}\n\nexport default HelpAndSupport;\n","export default \"data:image/png;base64,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\"","import React, { Component } from 'react';\nimport {Box, AppBar, Toolbar, Container} from '@mui/material';\nimport { connect } from 'react-redux';\nimport { Route, Switch } from 'react-router-dom';\n\nimport ThemeCustomization from 'themes';\nimport { createTheme } from '@mui/material/styles';\nimport Header from './components/Header';\nimport Sidebar from './components/Sidebar';\nimport MainContentStyled from './MainContentStyled';\nimport DiscoverInfluencer from './components/InfluencerDiscover';\nimport CuratedList from './components/CuratedList';\nimport CuratedInfluencers from './components/CuratedInfluencers';\nimport InfluencerInsight from './components/InfluencerInsight';\nimport PremiunFeature from './components/PremiunFeature';\nimport InsightFrame from './components/InfluencerInsight/Insightframe';\nimport PlannerList from './components/PlannerList';\nimport config, { MenuOrientation } from 'config'\nimport { updateUser } from 'actions/planner2';\nimport 'assets/scss/style.scss';\nimport PlanInfluencers from './components/PlanInfluencerList'\nimport HelpAndSupport from './components/HelpAndSupport';\n\nconst {borderRadius, container, menuOrientation} = config\nconst isHorizontal = menuOrientation === MenuOrientation.HORIZONTAL\nconst theme = createTheme();\n\nclass Planner extends Component {\n\n componentDidMount() {\n const { pathname } = this.props.location;\n const collabPattern = new RegExp(`/planner/collab-list/[^/]+/influencers/[^/]+`);\n const accessToken = localStorage.getItem('access')\n if(accessToken === null){\n if (!collabPattern.test(pathname)) {\n this.props.updateUser();\n }\n }else{\n this.props.updateUser();\n }\n }\n\n render() {\n console.log(\"Index Route User: \", this.props)\n // Destructure state\n const { drawerOpen } = this.props;\n console.log('props',this.props)\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\nconst mapStateToProps = (state) => ({\n drawerOpen: state.planner2.drawerOpen,\n user : state.planner2.user,\n});\n\nconst plannerActions = {\n updateUser\n};\n\n// export default Planner;\nexport default connect(mapStateToProps, plannerActions)(Planner);","import React, { useState } from 'react';\nimport { Grid, TextField } from '@material-ui/core';\nimport DateFnsUtils from '@date-io/date-fns';\nimport {\n KeyboardDatePicker,\n MuiPickersUtilsProvider\n} from '@material-ui/pickers';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\n\nfunction StartDatePicker({classes}){\n\n const [selectedDate, setSelectedDate] = useState(null);\n\n function handleDateChange(date) {\n console.log(\"date event\", date)\n setSelectedDate(date);\n }\n\n return (\n \n \n \n \n \n );\n}\n\nconst styles = {\n datePicker: {\n background: \"white\",\n border: \"1px solid #C4C4C4\",\n borderRadius: 9,\n \"& .MuiInput-underline:before\": {\n borderBottom: \"none\"\n },\n \"& .MuiInputBase-input\": {\n paddingLeft: 10\n }\n }\n}\n\nexport default withStyles(styles)(StartDatePicker);","import axios from 'axios';\nimport { API_HOST } from '../config';\nimport store from '../store';\nimport history from '../history';\nimport moment from 'moment';\nlet download = require('downloadjs');\n\nconst getHeaders = () => {\n return new Headers({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n });\n};\n\nconst formatResponse = (response) => {\n if ([200, 201, 400].includes(response.status)) return response.json();\n};\n\nexport function getListCompetitorBrands(brand) {\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/fetched-competitors?brand=${brand}`;\n\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function saveBrandRequestToDB(payload) {\n console.log(' == = saveBrandRequestToDB', saveBrandRequestToDB);\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/fetched-competitors`;\n\n return fetch(baseURL, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function topCreatorFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/top-tagged-posts?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function campaignTypesFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/aggregated-by-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function creatorTypesFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/aggregated-by-creator-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function ytTopCreatorFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/top-tagged-posts?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function ytCampaignTypesFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/aggregated-by-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function campaignTypesYoutubeFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/aggregated-by-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function creatorTypesYoutubeFetch(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/aggregated-by-creator-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function getHandlerData(keyword, creatorType, pageNum, searchKeyword, paidPost, sort_by_views) {\n const apiPath = `${API_HOST}/api/v1/competitor-analysis/${keyword}/tagged-posts`;\n const params = new URLSearchParams({\n ...(creatorType !== null && { creator_type: creatorType }),\n page: pageNum,\n keyword: searchKeyword,\n paid_post: paidPost,\n sort_by_views: sort_by_views\n });\n return fetch(`${apiPath}?${params.toString()}`, {\n method: 'GET',\n headers: new Headers({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n }),\n }).then((response) => {\n if ([200, 201, 400].includes(response.status)) return response.json();\n });\n}\n\nexport function getYtHandlerData(keyword, creatorType, pageNum, startDate, endDate, searchKeyword, paidPost, sort_by_views) {\n const apiPath = `${API_HOST}/api/v1/competitor-analysis/youtube/${keyword}/tagged-posts`;\n const params = new URLSearchParams({\n ...(creatorType !== null && { creator_type: creatorType }),\n ...(startDate !== null && { start_date: startDate }),\n ...(endDate !== null && { end_date: endDate }),\n page: pageNum,\n keyword: searchKeyword ,\n paid_post: paidPost,\n sort_by_views: sort_by_views\n });\n return fetch(`${apiPath}?${params.toString()}`, {\n method: 'GET',\n headers: new Headers({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n }),\n }).then((response) => {\n if ([200, 201, 400].includes(response.status)) return response.json();\n });\n}\nexport function downloadInstagramData(brandName, startDate, endDate, searchKeyword, paidPost) {\n let apiPath = `${API_HOST}/api/v1/competitor-analysis/${brandName}/download?start_date=${moment(\n startDate,\n ).format('YYYY-MM-DD')}&end_date=${moment(endDate).format('YYYY-MM-DD')}&keyword=${searchKeyword}&paid_post=${paidPost}`;\n\n return fetch(apiPath, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n 'Content-Type': 'application/json',\n },\n })\n .then((response) => {\n return response.blob();\n })\n .then(function (blob) {\n download(blob, 'download.csv', 'application/csv');\n });\n}\n\nexport function downloadYtData(brandName, startDate, endDate, searchKeyword, paidPost) {\n let apiPath = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/download?start_date=${moment(\n startDate,\n ).format('YYYY-MM-DD')}&end_date=${moment(endDate).format('YYYY-MM-DD')}&keyword=${searchKeyword}&paid_post=${paidPost}`;\n return fetch(apiPath, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n 'Content-Type': 'application/json',\n },\n })\n .then((response) => {\n\n return response.blob();\n })\n .then(function (blob) {\n download(blob, 'download.csv', 'application/csv');\n });\n}\n\nexport function fetchCreatorTypeCategory(brandName, startDate, endDate, metric, searchKeyword, paidPost){\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/category-by-type?sort_by=${metric}&keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function fetchYtCreatorTypeCategory(brandName, startDate, endDate, metric, searchKeyword, paidPost){\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/category-by-type?sort_by=${metric}&keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\n\nexport function fetchYTPostsOverTime(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/chart-post-count?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\n\nexport function fetchInstaPostsOverTime(brandName, startDate, endDate, searchKeyword, paidPost) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/chart-post-count?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function creatorsFetch(brandName, startDate, endDate, searchKeyword, paidPost, comp_handle, excluded_handles) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/creators?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n if (comp_handle) {\n baseURL += `&brand_handle_comp=${comp_handle}`\n }\n if (excluded_handles) {\n baseURL += `&excluded_handles=${excluded_handles}`\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function ytCreatorsFetch(brandName, startDate, endDate, searchKeyword, paidPost, comp_handle, excluded_channel_ids) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/creators?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n if (comp_handle) {\n baseURL += `&brand_handle_comp=${comp_handle}`;\n }\n if (excluded_channel_ids) {\n baseURL += `&excluded_channel_ids=${excluded_channel_ids}`\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function getBase64HandlerData(keyword, creatorType, pageNum, searchKeyword, paidPost, sort_by_views, startDate, endDate, excluded_handles, included_insta_shortcodes) {\n const apiPath = `${API_HOST}/api/v1/competitor-analysis/${keyword}/tagged-posts-base64`;\n const params = new URLSearchParams({\n ...(creatorType !== null && { creator_type: creatorType }),\n ...(startDate !== null && { start_date: startDate }),\n ...(endDate !== null && { end_date: endDate }),\n page: pageNum,\n keyword: searchKeyword,\n paid_post: paidPost,\n sort_by_views: sort_by_views,\n excluded_handles: excluded_handles || \"\",\n included_insta_shortcodes: included_insta_shortcodes || \"\"\n });\n return fetch(`${apiPath}?${params.toString()}`, {\n method: 'GET',\n headers: new Headers({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n }),\n }).then((response) => {\n if ([200, 201, 400].includes(response.status)) return response.json();\n });\n}\nexport function getBase64YtHandlerData(keyword, creatorType, pageNum, startDate, endDate, searchKeyword, paidPost, sort_by_views, excluded_channel_ids) {\n const apiPath = `${API_HOST}/api/v1/competitor-analysis/youtube/${keyword}/tagged-posts-base64`;\n const params = new URLSearchParams({\n ...(creatorType !== null && { creator_type: creatorType }),\n ...(startDate !== null && { start_date: startDate }),\n ...(endDate !== null && { end_date: endDate }),\n page: pageNum,\n keyword: searchKeyword ,\n paid_post: paidPost,\n sort_by_views: sort_by_views,\n excluded_channel_ids: excluded_channel_ids || \"\"\n });\n return fetch(`${apiPath}?${params.toString()}`, {\n method: 'GET',\n headers: new Headers({\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${localStorage.getItem('access')}`,\n }),\n }).then((response) => {\n if ([200, 201, 400].includes(response.status)) return response.json();\n });\n}\n\nexport function getCombinedBrandListCompetitor(brand) {\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/combined_brand_list?brand=${brand}`;\n\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function creatorTypesWithNormalTypeFetch(brandName, startDate, endDate, searchKeyword, paidPost, excluded_handles) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/${brandName}/aggregated-by-creator-type-wth-normal-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n if (excluded_handles && excluded_handles.length > 0) {\n baseURL += `&excluded_handles=${excluded_handles}`\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function creatorTypesYoutubeWithNormalTypeFetch(brandName, startDate, endDate, searchKeyword, paidPost, excluded_channel_ids) {\n const state = store.getState();\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/youtube/${brandName}/aggregated-by-creator-type-wth-normal-type?keyword=${searchKeyword}&paid_post=${paidPost}`;\n if (startDate && endDate) {\n baseURL += `&start_date=${moment(startDate).format('YYYY-MM-DD')}&end_date=${moment(\n endDate,\n ).format('YYYY-MM-DD')}`;\n }\n if (excluded_channel_ids && excluded_channel_ids.length > 0) {\n baseURL += `&excluded_channel_ids=${excluded_channel_ids}`\n }\n return fetch(baseURL, {\n method: 'GET',\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function updatePostData(payload) {\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/update_post_data`;\n\n return fetch(baseURL, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: getHeaders(),\n }).then(formatResponse);\n}\n\nexport function updateProfileData(payload) {\n let baseURL = `${API_HOST}/api/v1/competitor-analysis/update_profile_data`;\n\n return fetch(baseURL, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: getHeaders(),\n }).then(formatResponse);\n}\n","import { Button, Grid, TextField, Typography, Link } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport { withRouter } from 'react-router-dom';\nimport { Component } from 'react';\nimport StartDatePicker from './StartDatePicker';\nimport { useParams } from 'react-router-dom';\nimport { getListCompetitorBrands, saveBrandRequestToDB } from '../../../api_handlers/competitor';\n\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport Tooltip from \"@material-ui/core/Tooltip\";\n\nfunction withParams(Component) {\n return props => ;\n}\n\nclass Filter extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n startDate: null,\n // endDate: new Date().toISOString().split('T')[0],\n brandName: '',\n brandList: [],\n };\n }\n\n async componentDidMount() {\n const { results } = await getListCompetitorBrands(this.props.params.brand_id);\n this.setState({ brandList: results });\n let { keyword } = this.props.params;\n this.fetchData(keyword);\n \n }\n\n fetchData = keyword => {\n this.setState({brandName:keyword})\n\n};\n\n \n\n async saveBrandRequest(brandName, startDate) {\n await saveBrandRequestToDB({\n handle: brandName,\n start_date: startDate,\n });\n this.props.history.push(`/competitor-insights/${this.props.params.brand_id}/${brandName}`);\n }\n\n render() {\n const { classes } = this.props;\n\n return (\n \n \n \n COMPETITOR INSIGHTS \n \n \n \n \n \n \n \n \n Brand Name or Hashtags \n \n \n {\n this.setState({ brandName: evt.target.value });\n }}\n />\n \n \n \n \n Start Date \n \n \n \n \n \n \n \n {\n this.props.reloadData(\n this.state.brandName,\n );\n this.saveBrandRequest(\n this.state.brandName,\n this.state.startDate,\n );\n }}\n >\n Submit\n \n \n \n \n {/* */}\n {/* \n
Brands Tagged
\n
\n\n
\n
*/}\n \n \n \n {/* \n {this.state.brandList.map(brand => \n \n \n )}\n
*/}\n \n \n \n \n \n \n \n Fetched Brands\n \n \n \n \n {this.state.brandList.map((brand, i) => (\n \n \n \n \n {brand.handle}\n \n {brand.tags.length > 0 ? (\n <>\n {brand.tags.length < 3 ? (\n \n \n [{brand.tags.slice(0, 2).join(\", \")}{\" \"}]\n \n \n ): (\n \n \n \n [{brand.tags.slice(0, 2).join(\", \")}{\" \"}\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\nconst styles = {\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n marginTop: '30px',\n },\n root: {\n background:\n 'linear-gradient(91.68deg, rgba(239, 26, 116, 0.057) 11.95%, rgba(254, 189, 28, 0.1) 68.66%)',\n boxShadow: '4px 4px 20px 2px rgba(172, 172, 172, 0.25)',\n borderRadius: '10px',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n textAlign: 'left',\n paddingTop: 30,\n },\n heading: {\n textAlign: 'left',\n marginLeft: 30,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 20,\n },\n mainContainer: {\n display: 'flex',\n marginTop: 10,\n },\n left: {\n flex: 1,\n marginLeft: 30,\n paddingTop: 40,\n },\n right: {\n marginRight: 30,\n width: 200,\n },\n brand_tagged_label: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 16,\n textAlign: 'center',\n },\n brand_tagged_selection: {\n marginTop: 10,\n borderRadius: 15,\n height: 230,\n width: '100%',\n background: 'white',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n },\n brandNameContainer: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: '51px',\n },\n brandNameOrHashtagLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 17,\n },\n brandNameInput: {\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n background: '#FFFFFF',\n width: 250,\n height: 25,\n outline: 'none',\n padding: 5,\n paddingLeft: 10,\n paddingRight: 10,\n fontSize: 12,\n '& .MuiInputBase-root.Mui-disabled': {\n color: '#000000',\n },\n },\n submit: {\n textTransform: 'none',\n width: 150,\n height: 30,\n fontWeight: 700,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n padding: 10,\n fontSize: 15,\n marginLeft: 20,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n },\n date_range_container: {\n display: 'flex',\n marginTop: 0,\n alignItems: 'center',\n marginLeft: '69px',\n },\n dateRangeLabel: {\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 17,\n },\n submit_date_range: {\n textTransform: 'none',\n width: 200,\n height: 39,\n fontWeight: 700,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n padding: 10,\n fontSize: 15,\n marginLeft: 170,\n paddingLeft: 20,\n paddingRight: 20,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n },\n brandList: {\n height: 100,\n overflowY: 'scroll',\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n },\n iconSize: {\n width: 15,\n height: 15,\n },\n brandContainer: {\n marginTop: 10,\n marginLeft: 10,\n paddingLeft: 5,\n overflowY: 'scroll',\n height: '80%',\n },\n};\n\nexport default withRouter(withParams( withStyles(styles)(Filter)));\n","import { Button, Grid, Popper, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport NavLink from 'components/PlannerTheme/Elements/Link';\nimport { Link } from 'react-router-dom';\nimport StyledNavLink from 'components/ux/StyledNavLink';\nimport Logo from 'assets/planner/logo.png';\nimport BrandLogo from 'assets/planner/brand-logo.png';\nimport { width } from '@material-ui/system';\nimport PersonOutlineIcon from '@material-ui/icons/PersonOutline';\nimport { colorConstants } from 'constants/colors';\nimport { useState } from 'react';\n\nfunction Header() {\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState(null);\n const user = JSON.parse(localStorage.getItem('user'));\n const brand_name = user.user_type === 'brand' ? (user.brand.name ? user.brand.name : '') : '';\n const logo =\n user.user_type === 'brand'\n ? user.brand.brand_logo_url\n ? user.brand.brand_logo_url\n : ''\n : '';\n const open = Boolean(anchorEl);\n const handleClick = (event) => {\n setAnchorEl(anchorEl ? null : event.currentTarget);\n };\n const logOut = () => {\n for (const key of ['access', 'refresh', 'user']) localStorage.removeItem(key);\n window.location = '/login';\n };\n return (\n \n \n \n \n \n \n \n \n \n \n {/* \n Dashboard \n */}\n \n \n \n {/* \n My Campaign\n */}\n \n \n \n \n {/* \n Planner\n */}\n \n \n \n \n {/* \n Competitor Insights \n */}\n \n \n \n \n \n \n {brand_name} \n \n \n \n \n \n \n \n \n \n \n Logout\n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n background: '#FFFFFF',\n borderRadius: 10,\n height: 60,\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingLeft: 20,\n paddingRight: 20,\n },\n logo: {\n height: 30,\n },\n brandBox: {\n justifyContent: 'flex-end',\n alignItems: 'center',\n },\n linkBox: {\n justifyContent: 'center',\n alignItems: 'center',\n },\n brandName: {\n // marginLeft: 200,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 15,\n },\n tabBarText: {\n marginRight: 1,\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n fontSize: 14,\n letterSpacing: 0.03,\n },\n selectedTabBarText: {\n marginRight: 1,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 14,\n letterSpacing: 0.03,\n },\n}));\n\nexport default Header;\n","import * as React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Paper from '@mui/material/Paper';\n\nimport { campaignTypesFetch } from 'api_handlers/competitor';\n\n// function createData(post_type, count, reach, likes, comments) {\n// return { type, count, reach, likes, comments };\n// }\n\n// const data = [\n// createData('Insta Reels', 159, 6.0, 24, 4.0),\n// createData('Insta Posts', 237, 9.0, 37, 4.3),\n// createData('Total', 262, 16.0, 24, 6.0),\n// ];\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nconst CampaignTypes = (props) => {\n let { classes } = props;\n const [aggregatedData, setaggregatedData] = useState([]);\n const [summaryData, setsummaryData] = useState({});\n\n useEffect(() => {\n const fetchCampaignType = async () => {\n try {\n const resp = await campaignTypesFetch(props.brandName, props.startDate, props.endDate, props.searchKeyword, props.paidPost);\n setaggregatedData(resp.campaign_type);\n setsummaryData(resp.summary);\n console.log(resp);\n console.log('Results: ', aggregatedData);\n } catch (error) {\n console.error('Error fetching campaign types:', error);\n }\n };\n fetchCampaignType();\n }, []);\n return (\n \n \n \n TYPE OF CAMPAIGNS \n \n \n \n \n \n \n \n \n \n \n Count\n \n \n View Count\n \n \n Likes\n \n \n Comments\n \n \n Creator's Count\n \n \n \n \n {aggregatedData.map((row) => (\n \n \n {row.post_type === 'post' ? 'Insta Post' : 'Insta Reel'}\n \n \n {countertostring(row.count)}\n \n \n {countertostring(row.view_count)}\n \n \n {countertostring(row.likes_count)}\n \n \n {countertostring(row.comments_count)}\n \n \n {countertostring(row.creators)}\n \n \n ))}\n \n \n Total\n \n \n {countertostring(summaryData.count)}\n \n \n {countertostring(summaryData.view_count)}\n \n \n {countertostring(summaryData.likes_count)}\n \n \n {countertostring(summaryData.comments_count)}\n \n \n {countertostring(summaryData.creators)}\n \n \n \n
\n \n \n \n );\n};\n\nconst styles = {\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '6px',\n marginTop: '30px',\n },\n headerCell: {\n background: '#e4e4e4',\n fontWeight: 600,\n textAlign: 'center',\n fontSize: 12,\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 12,\n // border: \"1px solid #bbbbbb\",\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n};\n\nexport default withStyles(styles)(CampaignTypes);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Table,\n Grid,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n TableSortLabel,\n} from '@material-ui/core';\n\nimport { creatorTypesFetch } from 'api_handlers/competitor';\n\nconst styles = (theme) => ({\n // base: {\n // background: \"white\",\n // height: 700,\n // width: 1200,\n // margin: \"auto\",\n // marginTop: 50,\n // },\n // root: {\n // background: \"white\",\n // filter: \"drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))\",\n // height: 700,\n // width: 1200,\n // borderRadius: 10,\n // padding: 40,\n // overflowY: \"scroll\",\n // },\n\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n },\n headerCell: {\n // background: \"#8282d4\",\n background: '#e4e4e4',\n fontWeight: 400,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n paddingLeft: '40px',\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 13,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n aHover: {\n color: '#111111',\n },\n});\n\n// function calculateEngagementRate(likes, comments, views, followers) {\n// likes = likes !== null ? likes : 0;\n// comments = comments !== null ? comments : 0;\n// views = views !== null ? likes : 0;\n// if (followers === 0 || followers === null) {\n// return 0;\n// }\n// const engagementRate = ((likes + comments + views) / followers) * 100;\n// return parseFloat(engagementRate.toFixed(2));\n// }\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction CreatorTypes({ classes, brand_id, brandName, startDate, endDate, searchKeyword, paidPost }) {\n const [data, setData] = useState([]);\n\n useEffect(() => {\n const fetchCreatorsType = async () => {\n let creatorData = [\n {\n influencer_type: 'All Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n fair_price:'₹0 - 0'\n },\n {\n influencer_type: 'Mega Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Macro Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Micro Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Nano Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n fair_price:'₹0 - 0'\n\n },\n ];\n try {\n const resp = await creatorTypesFetch(brandName, startDate, endDate, searchKeyword, paidPost);\n if (resp.creator_type) {\n resp.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n creatorData[2].accounts = countertostring(each['creators']);\n creatorData[2].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[2].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[2].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[2].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[2].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[2].fair_price = each['fair_price'];\n\n }\n if (each.creator_type == 'nano') {\n creatorData[4].accounts = countertostring(each['creators']);\n creatorData[4].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[4].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[4].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[4].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[4].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[4].fair_price = each['fair_price'];\n\n }\n if (each.creator_type == 'micro') {\n creatorData[3].accounts = countertostring(each['creators']);\n creatorData[3].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[3].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[3].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[3].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[3].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[3].fair_price = each['fair_price'];\n\n }\n if (each.creator_type == 'mega') {\n creatorData[1].accounts = countertostring(each['creators']);\n creatorData[1].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[1].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[1].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[1].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[1].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[1].fair_price = each['fair_price'];\n\n }\n });\n }\n if (resp.all_creators) {\n const each = resp.all_creators;\n creatorData[0].accounts = countertostring(each['creators']);\n creatorData[0].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[0].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[0].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[0].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[0].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[0].fair_price = each['fair_price'];\n\n }\n setData(creatorData);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n fetchCreatorsType();\n }, []);\n\n return (\n \n \n \n TYPE OF CREATORS (By Size) \n \n \n \n \n \n \n \n \n Category \n Accounts \n Followers \n Likes \n Comments \n Posts \n Eng Rate \n Fair price \n\n \n \n \n {data.map((row, index) => (\n \n \n \n \n \n \n \n {row.influencer_type == 'All Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights?start_date=${startDate}&end_date=${endDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Nano Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights?creator_type=nano&start_date=${startDate}&end_date=${endDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Micro Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights?creator_type=micro&start_date=${startDate}&end_date=${endDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Macro Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights?creator_type=macro&start_date=${startDate}&end_date=${endDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Mega Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights?creator_type=mega&start_date=${startDate}&end_date=${endDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : (\n ''\n )}\n {/* {window.open(`/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights`, \"_blank\")}}>{row.influencer_type} */}\n \n\n {/* // :''\n // } */}\n\n {/* \n \n {row.influencer_type}\n \n */}\n \n \n \n \n \n {row.accounts} \n {row.followers} \n {row.likes} \n {row.comments} \n {row.posts} \n {row.eng_rate} \n {row.fair_price} \n\n \n ))}\n \n
\n \n \n \n );\n}\n\nexport default withStyles(styles)(CreatorTypes);\n","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { styled } from '@mui/material/styles';\nimport Tooltip, { tooltipClasses } from '@mui/material/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport IconButton from '@mui/material/IconButton';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport { FontDownloadOff } from '@mui/icons-material';\n\nfunction IconLabel({\n imageSrc,\n label,\n sortable = false,\n sort = false,\n sortOrder = '',\n tooltip = '',\n sortByThis,\n}) {\n const classes = useStyles();\n const [dimensions, setDimensions] = useState({});\n\n useEffect(() => {\n const img = new Image();\n img.onload = function () {\n if (this.width > this.height) setDimensions({ width: 15 });\n else setDimensions({ height: 15 });\n };\n img.src = imageSrc;\n }, []);\n\n const CustomWidthTooltip = styled(({ className, ...props }) => (\n \n ))({\n [`& .${tooltipClasses.tooltip}`]: {\n maxWidth: 150,\n },\n });\n\n return (\n sortable && sortByThis()}\n >\n
\n \n \n
\n \n {label}\n \n \n {tooltip ? (\n
\n \n \n \n \n ) : (\n ''\n )}\n {sortable && sort ? (\n
\n {sortOrder === 'asc' ? (\n \n ) : (\n \n )}\n \n ) : null}\n
\n );\n}\n\nIconLabel.propTypes = {\n imageSrc: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'start',\n alignItems: 'center',\n flexDirection: 'row',\n display: 'flex',\n },\n sortableLabel: {\n cursor: 'pointer',\n fontWeight: 700,\n },\n sortArrow: {\n fontSize: '15px !important',\n },\n label: {\n fontFamily: 'Nunito Sans',\n lineHeight: 1,\n fontSize: '0.8em',\n textAlign: 'left',\n fontWeight: 600,\n },\n icon: {\n // width:73,\n // height:22,\n // height:22,\n // marginLeft:20\n },\n}));\n\nexport default IconLabel;\n","import { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { Typography, Grid, Chip } from '@material-ui/core';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\n\nimport HeadingIcon from 'assets/discovery/Heading-Columns-icon.png';\nimport EngRateIcon from 'assets/discovery/Eng-Rate-icon.png';\n\nimport HeaderLabel from './HeaderLabel';\n\nclass ListHeader extends Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n let { classes } = this.props;\n\n return (\n \n \n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n \n \n );\n }\n}\n\nconst styles = {\n root: {\n flexGrow: 1,\n justifyContent: 'flex-start',\n alignItems: 'center',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 10,\n background: '#FFFFFF',\n height: 50,\n },\n moreWidth: {\n maxWidth: '0.5%',\n },\n matrixBox: {\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n font12: {\n fontSize: 12,\n },\n font16: {\n fontSize: '0.8em',\n fontWeight: 600,\n },\n};\n\nexport default withStyles(styles)(ListHeader);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Table,\n Grid,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n TableSortLabel,\n TextField,\n} from '@material-ui/core';\n\nimport moment from 'moment';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nimport { fetchCreatorTypeCategory } from 'api_handlers/competitor';\n\nconst items = [\n {'metric':'Followers', 'sortBy': '-followers_count'},\n {'metric':'Likes', 'sortBy': '-likes_count'},\n {'metric':'Comments', 'sortBy': '-comments_count'},\n {'metric':'Posts', 'sortBy': '-count'},\n {'metric':'Engagement Rate', 'sortBy': '-engagement__rate'},\n {'metric': 'Creators', 'sortBy': '-creators'},\n]\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n },\n headerCell: {\n background: '#e4e4e4',\n fontWeight: 400,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n paddingLeft: '28px',\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 13,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n aHover: {\n color: '#111111',\n },\n});\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction CategoryCreatorTypes({ classes, brandName, startDate, endDate, searchKeyword, paidPost }) {\n const [data, setData] = useState([]);\n const [metric, setMetric] = useState(items[1].sortBy)\n const [inputValue, setInputValue] = useState('Likes')\n const formattedStartDate = moment(startDate).format('YYYY-MM-DD')\n const formattedEndDate = moment(endDate).format('YYYY-MM-DD')\n\n useEffect(() => {\n const fetchCreatorsType = async () => {\n try {\n const resp = await fetchCreatorTypeCategory(brandName, startDate, endDate, metric, searchKeyword, paidPost);\n setData(resp.category_type)\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n console.log('Metrics: ', metric)\n fetchCreatorsType();\n }, [metric]);\n\n return (\n \n \n \n TYPE OF CREATORS (By Category) \n \n \n \n \n Order By :- \n \n \n item.sortBy === metric) || null}\n getOptionLabel={(option) => option.metric}\n disableCloseOnSelect\n renderInput={(params) => }\n onChange={(event, newValue) => {\n setMetric(newValue.sortBy);\n }}\n />\n \n \n \n \n \n \n \n \n \n \n Category \n Accounts \n Followers \n Likes \n Comments \n Posts \n Eng Rate \n Fair Price \n \n \n \n {data.map((row, index) => (\n \n \n \n \n \n \n \n \n {row.category_name}\n \n \n \n \n \n \n \n {row.creators === null ? 0 : countertostring(row.creators)} \n {row.followers_count === null ? 0 : countertostring(row.followers_count)} \n {row.likes_count === null ? 0 : countertostring(row.likes_count)} \n {row.comments_count === null ? 0 : countertostring(row.comments_count)} \n {row.count === null ? 0 : countertostring(row.count)} \n {parseFloat(row.engagement__rate).toFixed(2)} % \n {row.fair_price ? row.fair_price : 0} \n \n ))}\n \n
\n \n \n \n );\n}\n\nexport default withStyles(styles)(CategoryCreatorTypes);\n","import React from 'react';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport { Typography, Grid } from '@material-ui/core';\nimport { Link } from 'react-router-dom';\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nconst CreatorInfoCard = (props) => {\n let {\n classes,\n creator,\n likes_count,\n comments_count,\n reach,\n engagement__rate,\n shortcode,\n followers_count,\n view_count,\n fair_price,\n category_name,\n } = props;\n\n return (\n \n \n \n \n \n \n \n \n \n \n {category_name}\n \n
\n \n \n \n \n {countertostring(view_count)}\n \n
\n \n \n \n \n {/* {countertostring(likes_count)} */}\n {countertostring(likes_count)}\n \n
\n \n \n \n \n {countertostring(comments_count)}\n \n
\n \n \n \n \n {parseFloat(engagement__rate).toFixed(2)}%\n \n
\n \n \n \n \n {fair_price}\n \n
\n \n \n );\n};\n\nconst styles = {\n root: {\n background: '#FFFFFF',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n flexGrow: 1,\n height: '90px',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 20,\n padding: 10,\n },\n moreWidth: {\n paddingLeft: '24px',\n maxWidth: '6.5%',\n },\n subtitles: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '0.1px',\n width: 100,\n },\n reach: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#FC2E2E',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n engRate: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n textAlign: 'center',\n flex: 1,\n marginTop: 0,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#6CBF02',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n creator: {\n background: 'linear-gradient(118.02deg, rgba(239, 26, 116, 0.57) 32.63%, #FEBD1C 94.6%)',\n boxShadow: '2px 5px 10px rgba(143, 143, 143, 0.25)',\n borderRadius: 10,\n height: 40,\n width: 130,\n justifyContent: 'space-around',\n alignItems: 'center',\n marginRight: 50,\n },\n};\n\nexport default withStyles(styles)(CreatorInfoCard);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Grid, Typography } from '@material-ui/core';\n\nimport { campaignTypesFetch } from 'api_handlers/competitor';\n\nclass Summary extends Component {\n constructor(props) {\n super(props);\n\n this.fetchData = this.fetchData.bind(this);\n this.calculateEngagementRate = this.calculateEngagementRate.bind(this);\n this.countertostring = this.countertostring.bind(this);\n\n this.state = {\n summaryData: {},\n };\n }\n\n calculateEngagementRate(likes, comments, views, followers) {\n likes = likes !== null ? likes : 0;\n comments = comments !== null ? comments : 0;\n views = views !== null ? likes : 0;\n if (followers === 0 || followers === null) {\n return 0;\n }\n const engagementRate = ((likes + comments + views) / followers) * 100;\n return parseFloat(engagementRate.toFixed(2));\n }\n\n countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n }\n\n componentDidMount() {\n this.fetchData();\n }\n\n async fetchData() {\n try {\n const resp = await campaignTypesFetch(\n this.props.brandName,\n this.props.startDate,\n this.props.endDate,\n this.props.searchKeyword,\n this.props.paidPost\n );\n this.setState({ summaryData: resp.summary });\n } catch (error) {\n console.error('Error fetching summary:', error);\n }\n }\n\n render() {\n const { classes } = this.props;\n\n const { summaryData } = this.state;\n\n let engagement_rate = this.calculateEngagementRate(\n summaryData['likes_count'],\n summaryData['comments_count'],\n summaryData['view_count'],\n summaryData['followers_count'] || 0,\n );\n let reach = summaryData['likes_count'] + summaryData['comments_count'];\n\n return (\n \n \n \n SUMMARY \n \n \n \n \n \n Creators
\n \n {this.countertostring(summaryData['creators']) || 0}\n
\n \n \n Posts
\n \n {this.countertostring(summaryData['count']) || 0}\n
\n \n \n Followers
\n \n {this.countertostring(summaryData['followers_count']) || 0}\n
\n \n \n Comments
\n \n {this.countertostring(summaryData['comments_count']) || 0}\n
\n \n \n Likes
\n \n {this.countertostring(summaryData['likes_count']) || 0}\n
\n \n \n Engagement Rate
\n {parseFloat(summaryData['engagement__rate']).toFixed(2)}%
\n \n \n \n \n );\n }\n}\n\nconst styles = {\n root: {\n // background: \"white\",\n // boxShadow:\n // \"-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)\",\n // borderRadius: 10,\n margin: 10,\n paddingTop: 0,\n justifyContent: 'center',\n alignItems: 'center',\n paddingBottom: 30,\n display: 'flex',\n // marginLeft: 30,\n // marginTop: 20,\n },\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n marginTop: '18px',\n },\n heading: {\n textAlign: 'left',\n marginLeft: 30,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 20,\n color: 'black',\n },\n summary_box: {\n display: 'flex',\n marginLeft: 30,\n marginTop: 20,\n },\n summaryItem: {\n marginTop: 10,\n borderRadius: 15,\n padding: 10,\n width: 180,\n marginRight: 30,\n height: 90,\n color: 'black',\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224)',\n borderRadius: 10,\n },\n summary_label: {\n color: 'rgb(74, 74, 74)',\n fontSize: 20,\n fontFamily: 'Nunito Sans sans-serif',\n },\n summary_value: {\n marginTop: 10,\n color: 'rgb(74, 74, 74)',\n fontSize: 20,\n fontFamily: 'Nunito Sans sans-serif',\n fontWeight: 700,\n },\n};\n\nexport default withStyles(styles)(Summary);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography, Container, Grid, AppBar, Tabs, Tab, Box } from '@material-ui/core';\nimport { Line } from 'react-chartjs-2';\nimport CampaignTypes from './CampaignTypes';\nimport CreatorTypes from './creators';\nimport ListHeader from './ListHeader';\nimport CategoryCreatorTypes from './CategoryCreator'\n\nimport CreatorInfoCard from './CreatorInfoCard';\nimport Summary from './summary';\nimport { topCreatorFetch, fetchInstaPostsOverTime } from 'api_handlers/competitor';\n\nfunction InstagramInsights({ classes, brand_id, brandName, startDate, endDate, searchKeyword, paidPost,handleTab}) {\n const [results, setResults] = useState([]);\n const [postOverTimeData, setPostOverTimeData] = useState([]);\n\n useEffect(() => {\n const fetchCreators = async () => {\n try {\n const resp = await topCreatorFetch(brandName, startDate, endDate, searchKeyword, paidPost);\n setResults(resp);\n if(resp.length>0){\n handleTab(true)\n }else{\n handleTab(false)\n }\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n fetchCreators();\n\n const fetchPostsOverTime = async () => {\n try {\n const resp = await fetchInstaPostsOverTime(brandName, startDate, endDate, searchKeyword, paidPost);\n setPostOverTimeData(resp);\n } catch (error) {\n console.error('Error fetching posts:', error);\n }\n };\n fetchPostsOverTime();\n }, [searchKeyword]);\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n BEST PERFORMING POSTS \n \n \n \n \n \n \n \n \n \n {results &&\n results.map((result, index) => (\n \n \n \n ))}\n \n \n \n \n\n \n \n \n Posts Over Time \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '6px',\n marginTop: '35px',\n },\n\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n});\n\nexport default withStyles(styles)(InstagramInsights);\n","import * as React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Paper from '@mui/material/Paper';\n\nimport { ytCampaignTypesFetch } from 'api_handlers/competitor';\n\n// function createData(post_type, count, reach, likes, comments) {\n// return { type, count, reach, likes, comments };\n// }\n\n// const data = [\n// createData('Insta Reels', 159, 6.0, 24, 4.0),\n// createData('Insta Posts', 237, 9.0, 37, 4.3),\n// createData('Total', 262, 16.0, 24, 6.0),\n// ];\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nconst CampaignTypes = (props) => {\n let { classes } = props;\n const [aggregatedData, setaggregatedData] = useState([]);\n const [summaryData, setsummaryData] = useState({});\n\n useEffect(() => {\n const fetchCampaignType = async () => {\n try {\n const resp = await ytCampaignTypesFetch(props.brandName, props.startDate, props.endDate, props.searchKeyword, props.paidPost);\n setaggregatedData(resp.campaign_type);\n setsummaryData(resp.summary);\n console.log(resp);\n console.log('Results: ', aggregatedData);\n } catch (error) {\n console.error('Error fetching campaign types:', error);\n }\n };\n fetchCampaignType();\n }, []);\n return (\n \n \n \n TYPE OF CAMPAIGNS \n \n \n \n \n \n \n \n \n \n \n Count\n \n \n View Count\n \n \n Likes\n \n \n Comments\n \n \n Creator's Count\n \n \n \n \n {aggregatedData.map((row) => (\n \n \n {row.post_type === 'video' ? 'YT Video' : 'YT Shorts'}\n \n \n {countertostring(row.count)}\n \n \n {countertostring(row.view_count)}\n \n \n {countertostring(row.likes_count)}\n \n \n {countertostring(row.comments_count)}\n \n \n {countertostring(row.creators)}\n \n \n ))}\n \n \n Total\n \n \n {countertostring(summaryData.count)}\n \n \n {countertostring(summaryData.view_count)}\n \n \n {countertostring(summaryData.likes_count)}\n \n \n {countertostring(summaryData.comments_count)}\n \n \n {countertostring(summaryData.creators)}\n \n \n \n
\n \n \n \n );\n};\n\nconst styles = {\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '6px',\n marginTop: '30px',\n },\n headerCell: {\n background: '#e4e4e4',\n fontWeight: 600,\n textAlign: 'center',\n fontSize: 12,\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 12,\n // border: \"1px solid #bbbbbb\",\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n};\n\nexport default withStyles(styles)(CampaignTypes);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Table,\n Grid,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n TableSortLabel,\n} from '@material-ui/core';\n\nimport moment from 'moment';\n\nimport { creatorTypesYoutubeFetch } from 'api_handlers/competitor';\n\nconst styles = (theme) => ({\n // base: {\n // background: \"white\",\n // height: 700,\n // width: 1200,\n // margin: \"auto\",\n // marginTop: 50,\n // },\n // root: {\n // background: \"white\",\n // filter: \"drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))\",\n // height: 700,\n // width: 1200,\n // borderRadius: 10,\n // padding: 40,\n // overflowY: \"scroll\",\n // },\n\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n },\n headerCell: {\n // background: \"#8282d4\",\n background: '#e4e4e4',\n fontWeight: 400,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n paddingLeft: '30px',\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 13,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n aHover: {\n color: '#111111',\n },\n});\n\n// function calculateEngagementRate(likes, comments, shares, views) {\n// likes = likes !== null ? likes : 0;\n// comments = comments !== null ? comments : 0;\n// shares = shares !== null ? shares : 0;\n// if (views === 0 || views === null) {\n// return 0;\n// }\n// const engagementRate = ((likes + comments + shares) / views) * 100;\n// return parseFloat(engagementRate.toFixed(2));\n// }\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction CreatorTypes({ classes, brand_id, brandName, startDate, endDate, searchKeyword, paidPost }) {\n const [data, setData] = useState([]);\n const formattedStartDate = moment(startDate).format('YYYY-MM-DD')\n const formattedEndDate = moment(endDate).format('YYYY-MM-DD')\n\n useEffect(() => {\n const fetchCreatorsType = async () => {\n let creatorData = [\n {\n influencer_type: 'All Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n video_views: '0',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Mega Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n video_views: '0',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Macro Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n video_views: '0',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Micro Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n video_views: '0',\n fair_price:'₹0 - 0'\n\n },\n {\n influencer_type: 'Nano Influencers',\n accounts: '0',\n followers: '0',\n likes: '0',\n comments: '0',\n posts: '0',\n eng_rate: '0 %',\n video_views: '0',\n fair_price:'₹0 - 0'\n\n },\n ];\n try {\n const resp = await creatorTypesYoutubeFetch(brandName, startDate, endDate, searchKeyword, paidPost);\n if (resp.creator_type) {\n resp.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n creatorData[2].accounts = countertostring(each['creators']);\n creatorData[2].followers = countertostring(each['followers']);\n creatorData[2].likes = countertostring(each['likes_count']);\n creatorData[2].comments = countertostring(each['comments_count']);\n creatorData[2].posts = countertostring(each['count']);\n creatorData[2].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[2].video_views = countertostring(each['view_count']);\n }\n if (each.creator_type == 'nano') {\n creatorData[4].accounts = countertostring(each['creators']);\n creatorData[4].followers = countertostring(each['followers']);\n creatorData[4].likes = countertostring(each['likes_count']);\n creatorData[4].comments = countertostring(each['comments_count']);\n creatorData[4].posts = countertostring(each['count']);\n creatorData[4].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[4].video_views = countertostring(each['view_count']);\n }\n if (each.creator_type == 'micro') {\n creatorData[3].accounts = countertostring(each['creators']);\n creatorData[3].followers = countertostring(each['followers']);\n creatorData[3].likes = countertostring(each['likes_count']);\n creatorData[3].comments = countertostring(each['comments_count']);\n creatorData[3].posts = countertostring(each['count']);\n creatorData[3].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[3].video_views = countertostring(each['view_count']);\n creatorData[3].fair_price = each['fair_price'];\n\n\n }\n if (each.creator_type == 'mega') {\n creatorData[1].accounts = countertostring(each['creators']);\n creatorData[1].followers = countertostring(each['followers']);\n creatorData[1].likes = countertostring(each['likes_count']);\n creatorData[1].comments = countertostring(each['comments_count']);\n creatorData[1].posts = countertostring(each['count']);\n creatorData[1].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[1].video_views = countertostring(each['view_count']);\n creatorData[1].fair_price = each['fair_price'];\n\n }\n });\n }\n if (resp.all_creators) {\n const each = resp.all_creators;\n creatorData[0].accounts = countertostring(each['creators']);\n creatorData[0].followers =\n each['followers'] === null ? 0 : countertostring(each['followers']);\n creatorData[0].likes =\n each['likes_count'] === null ? 0 : countertostring(each['likes_count']);\n creatorData[0].comments =\n each['comments_count'] === null ? 0 : countertostring(each['comments_count']);\n creatorData[0].posts = each['count'] === null ? 0 : countertostring(each['count']);\n creatorData[0].eng_rate = parseFloat(each['engagement__rate']).toFixed(2);\n creatorData[0].video_views = countertostring(each['view_count']);\n creatorData[0].fair_price = each['fair_price'];\n\n }\n setData(creatorData);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n fetchCreatorsType();\n }, []);\n\n return (\n \n \n \n TYPE OF CREATORS (By Size) \n \n \n \n \n \n \n \n \n Category \n Accounts \n Subscribers \n Likes \n Comments \n Video Views \n Videos \n Eng Rate \n Fair price \n\n \n \n \n {data.map((row, index) => (\n \n \n \n \n \n \n \n {row.influencer_type == 'All Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/youtube/detailed-insights?start_date=${formattedStartDate}&end_date=${formattedEndDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Nano Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/youtube/detailed-insights?creator_type=nano&start_date=${formattedStartDate}&end_date=${formattedEndDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Micro Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/youtube/detailed-insights?creator_type=micro&start_date=${formattedStartDate}&end_date=${formattedEndDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Macro Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/youtube/detailed-insights?creator_type=macro&start_date=${formattedStartDate}&end_date=${formattedEndDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : row.influencer_type == 'Mega Influencers' ? (\n {\n window.open(\n `/competitor-insights/${brand_id}/${brandName}/youtube/detailed-insights?creator_type=mega&start_date=${formattedStartDate}&end_date=${formattedEndDate}&keyword=${searchKeyword}&paidPost=${paidPost}`,\n '_blank',\n );\n }}\n >\n {row.influencer_type}\n \n ) : (\n ''\n )}\n {/* {window.open(`/competitor-insights/${brand_id}/${brandName}/instagram/detailed-insights`, \"_blank\")}}>{row.influencer_type} */}\n \n {/* \n \n {row.influencer_type}\n \n */}\n \n \n \n \n \n {row.accounts} \n {row.followers} \n {row.likes} \n {row.comments} \n {row.video_views} \n {row.posts} \n {row.eng_rate} % \n {row.fair_price} \n\n \n ))}\n \n
\n \n \n \n );\n}\n\nexport default withStyles(styles)(CreatorTypes);\n","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { styled } from '@mui/material/styles';\nimport Tooltip, { tooltipClasses } from '@mui/material/Tooltip';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport IconButton from '@mui/material/IconButton';\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\nimport { FontDownloadOff } from '@mui/icons-material';\n\nfunction IconLabel({\n imageSrc,\n label,\n sortable = false,\n sort = false,\n sortOrder = '',\n tooltip = '',\n sortByThis,\n}) {\n const classes = useStyles();\n const [dimensions, setDimensions] = useState({});\n\n useEffect(() => {\n const img = new Image();\n img.onload = function () {\n if (this.width > this.height) setDimensions({ width: 15 });\n else setDimensions({ height: 15 });\n };\n img.src = imageSrc;\n }, []);\n\n const CustomWidthTooltip = styled(({ className, ...props }) => (\n \n ))({\n [`& .${tooltipClasses.tooltip}`]: {\n maxWidth: 150,\n },\n });\n\n return (\n sortable && sortByThis()}\n >\n
\n \n \n
\n \n {label}\n \n \n {tooltip ? (\n
\n \n \n \n \n ) : (\n ''\n )}\n {sortable && sort ? (\n
\n {sortOrder === 'asc' ? (\n \n ) : (\n \n )}\n \n ) : null}\n
\n );\n}\n\nIconLabel.propTypes = {\n imageSrc: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'start',\n alignItems: 'center',\n flexDirection: 'row',\n display: 'flex',\n },\n sortableLabel: {\n cursor: 'pointer',\n fontWeight: 700,\n },\n sortArrow: {\n fontSize: '15px !important',\n },\n label: {\n fontFamily: 'Nunito Sans',\n lineHeight: 1,\n fontSize: '0.8em',\n textAlign: 'left',\n fontWeight: 600,\n },\n icon: {\n // width:73,\n // height:22,\n // height:22,\n // marginLeft:20\n },\n}));\n\nexport default IconLabel;\n","import { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { Typography, Grid, Chip } from '@material-ui/core';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\n\nimport HeadingIcon from 'assets/discovery/Heading-Columns-icon.png';\nimport EngRateIcon from 'assets/discovery/Eng-Rate-icon.png';\n\nimport HeaderLabel from './ytHeaderLabel';\n\nclass ListHeader extends Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n let { classes } = this.props;\n\n return (\n \n \n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n this.sortColumn(\"reach\")}\n />\n \n \n \n \n );\n }\n}\n\nconst styles = {\n root: {\n flexGrow: 1,\n justifyContent: 'flex-start',\n alignItems: 'center',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 10,\n background: '#FFFFFF',\n height: 50,\n },\n moreWidth: {\n maxWidth: '0.5%',\n },\n matrixBox: {\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n font12: {\n fontSize: 12,\n },\n font16: {\n fontSize: '0.8em',\n fontWeight: 600,\n },\n};\n\nexport default withStyles(styles)(ListHeader);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Table,\n Grid,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n TableSortLabel,\n TextField,\n} from '@material-ui/core';\n\nimport moment from 'moment';\n\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nimport { fetchYtCreatorTypeCategory } from 'api_handlers/competitor';\n\nconst items = [\n {'metric':'Followers', 'sortBy': '-followers_count'},\n {'metric':'Likes', 'sortBy': '-likes_count'},\n {'metric':'Comments', 'sortBy': '-comments_count'},\n {'metric':'Engagement Rate', 'sortBy': '-engagement__rate'},\n {'metric': 'Videos', 'sortBy': '-count'},\n {'metric': 'Video Views', 'sortBy': '-view_count'},\n {'metric': 'Creators', 'sortBy': '-creators'},\n]\n\nconst styles = (theme) => ({\n // base: {\n // background: \"white\",\n // height: 700,\n // width: 1200,\n // margin: \"auto\",\n // marginTop: 50,\n // },\n // root: {\n // background: \"white\",\n // filter: \"drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))\",\n // height: 700,\n // width: 1200,\n // borderRadius: 10,\n // padding: 40,\n // overflowY: \"scroll\",\n // },\n\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n },\n headerCell: {\n // background: \"#8282d4\",\n background: '#e4e4e4',\n fontWeight: 400,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n paddingLeft: '28px',\n },\n table: {\n minWidth: 650,\n },\n cell: {\n textAlign: 'center',\n fontSize: 13,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n aHover: {\n color: '#111111',\n },\n});\n\n// function calculateEngagementRate(likes, comments, shares, views) {\n// likes = likes !== null ? likes : 0;\n// comments = comments !== null ? comments : 0;\n// shares = shares !== null ? shares : 0;\n// if (views === 0 || views === null) {\n// return 0;\n// }\n// const engagementRate = ((likes + comments + shares) / views) * 100;\n// return parseFloat(engagementRate.toFixed(2));\n// }\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nfunction CategoryCreatorTypes({ classes, brandName, startDate, endDate, searchKeyword, paidPost }) {\n const [data, setData] = useState([]);\n const [metric, setMetric] = useState(items[1].sortBy)\n const [inputValue, setInputValue] = useState('Likes')\n const formattedStartDate = moment(startDate).format('YYYY-MM-DD')\n const formattedEndDate = moment(endDate).format('YYYY-MM-DD')\n\n useEffect(() => {\n const fetchCreatorsType = async () => {\n try {\n const resp = await fetchYtCreatorTypeCategory(brandName, startDate, endDate, metric, searchKeyword, paidPost);\n setData(resp.category_type)\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n console.log('Metrics: ', metric)\n fetchCreatorsType();\n }, [metric]);\n\n return (\n \n \n \n TYPE OF CREATORS (By Category) \n \n \n \n \n Order By :- \n \n \n item.sortBy === metric) || null}\n getOptionLabel={(option) => option.metric}\n disableCloseOnSelect\n renderInput={(params) => }\n onChange={(event, newValue) => {\n setMetric(newValue.sortBy);\n }}\n />\n \n \n \n \n \n \n \n \n \n \n Category \n Accounts \n Subscribers \n Likes \n Comments \n Video Views \n Videos \n Eng Rate \n Fair Price \n \n \n \n {data.map((row, index) => (\n \n \n \n \n \n \n \n \n {row.category_name}\n \n \n \n \n \n \n \n {row.creators === null ? 0 : countertostring(row.creators)} \n {row.followers_count === null ? 0 : countertostring(row.followers_count)} \n {row.likes_count === null ? 0 : countertostring(row.likes_count)} \n {row.comments_count === null ? 0 : countertostring(row.comments_count)} \n {row.view_count === null ? 0 : countertostring(row.view_count)} \n {row.count === null ? 0 : countertostring(row.count)} \n {parseFloat(row.engagement__rate).toFixed(2)} % \n {row.fair_price ? row.fair_price : 0} \n \n ))}\n \n
\n \n \n \n );\n}\n\nexport default withStyles(styles)(CategoryCreatorTypes);\n","import React from 'react';\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\nimport { Typography, Grid } from '@material-ui/core';\nimport { Link } from 'react-router-dom';\n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\nconst CreatorInfoCard = (props) => {\n let {\n classes,\n creator,\n likes_count,\n comments_count,\n reach,\n engagement__rate,\n video_id,\n view_count,\n fair_price,\n category_name\n } = props;\n\n return (\n \n \n \n \n \n \n \n \n \n \n {category_name}\n \n
\n \n \n \n \n {countertostring(view_count)}\n \n
\n \n \n \n \n {countertostring(likes_count)}\n \n
\n \n \n \n \n {countertostring(comments_count)}\n \n
\n \n \n \n \n {parseFloat(engagement__rate).toFixed(2)}%\n \n
\n \n \n \n \n {fair_price}\n \n
\n \n \n );\n};\n\nconst styles = {\n root: {\n background: '#FFFFFF',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n flexGrow: 1,\n height: '90px',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 20,\n padding: 10,\n },\n moreWidth: {\n paddingLeft: '24px',\n maxWidth: '6.5%',\n },\n subtitles: {\n fontFamily: 'Nunito Sans',\n fontWeight: 400,\n color: '#4A4A4A',\n fontSize: 12,\n marginRight: 0,\n lineHeight: '0.1px',\n width: 100,\n },\n reach: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#FC2E2E',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n engRate: {\n background: '#FFFFFF',\n height: 42,\n maxWidth: 64,\n textAlign: 'center',\n flex: 1,\n marginTop: 0,\n boxShadow: '4px 4px 4px rgba(206, 206, 206, 0.25)',\n color: '#6CBF02',\n fontSize: 16,\n fontWeight: 700,\n lineHeight: 1.6,\n borderRadius: 6,\n },\n creator: {\n background: 'linear-gradient(118.02deg, rgba(239, 26, 116, 0.57) 32.63%, #FEBD1C 94.6%)',\n boxShadow: '2px 5px 10px rgba(143, 143, 143, 0.25)',\n borderRadius: 10,\n height: 40,\n width: 130,\n justifyContent: 'space-around',\n alignItems: 'center',\n marginRight: 50,\n },\n};\n\nexport default withStyles(styles)(CreatorInfoCard);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { connect } from 'react-redux';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Grid, Typography } from '@material-ui/core';\n\nimport { campaignTypesYoutubeFetch } from 'api_handlers/competitor';\n\nclass Summary extends Component {\n constructor(props) {\n super(props);\n\n this.fetchData = this.fetchData.bind(this);\n this.calculateEngagementRate = this.calculateEngagementRate.bind(this);\n this.countertostring = this.countertostring.bind(this);\n\n this.state = {\n summaryData: {},\n };\n }\n\n calculateEngagementRate(likes, comments, shares, views) {\n likes = likes !== null ? likes : 0;\n comments = comments !== null ? comments : 0;\n shares = shares !== null ? shares : 0;\n if (views === 0 || views === null) {\n return 0;\n }\n const engagementRate = ((likes + comments + shares) / views) * 100;\n return parseFloat(engagementRate.toFixed(2));\n }\n\n countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n }\n\n componentDidMount() {\n this.fetchData();\n }\n\n async fetchData() {\n try {\n const resp = await campaignTypesYoutubeFetch(\n this.props.brandName,\n this.props.startDate,\n this.props.endDate,\n this.props.searchKeyword,\n this.props.paidPost\n );\n this.setState({ summaryData: resp.summary });\n } catch (error) {\n console.error('Error fetching summary:', error);\n }\n }\n\n render() {\n const { classes } = this.props;\n\n const { summaryData } = this.state;\n\n let engagement_rate = this.calculateEngagementRate(\n summaryData['likes_count'],\n summaryData['comments_count'],\n 0,\n summaryData['view_count'],\n );\n let reach = 0;\n\n if (summaryData['view_count'] > 0) {\n reach = summaryData['view_count'] - summaryData['view_count'] * 0.1;\n }\n\n return (\n \n \n \n SUMMARY \n \n \n \n \n \n Creators
\n \n {this.countertostring(summaryData['creators']) || 0}\n
\n \n \n Videos
\n \n {this.countertostring(summaryData['count']) || 0}\n
\n \n \n View
\n \n {this.countertostring(summaryData['view_count']) || 0}\n
\n \n \n Comments
\n \n {this.countertostring(summaryData['comments_count']) || 0}\n
\n \n \n Likes
\n \n {this.countertostring(summaryData['likes_count']) || 0}\n
\n \n \n Engagement Rate
\n {engagement_rate} %
\n \n \n \n \n );\n }\n}\n\nconst styles = {\n root: {\n // background: \"white\",\n // boxShadow:\n // \"-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)\",\n // borderRadius: 10,\n margin: 10,\n paddingTop: 0,\n justifyContent: 'center',\n alignItems: 'center',\n paddingBottom: 30,\n display: 'flex',\n // marginLeft: 30,\n // marginTop: 20,\n },\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '15px',\n marginTop: '18px',\n },\n heading: {\n textAlign: 'left',\n marginLeft: 30,\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n fontSize: 20,\n color: 'black',\n },\n summary_box: {\n display: 'flex',\n marginLeft: 30,\n marginTop: 20,\n },\n summaryItem: {\n marginTop: 10,\n borderRadius: 15,\n padding: 10,\n width: 180,\n marginRight: 30,\n height: 90,\n color: 'black',\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224)',\n borderRadius: 10,\n },\n summary_label: {\n color: 'rgb(74, 74, 74)',\n fontSize: 20,\n fontFamily: 'Nunito Sans sans-serif',\n },\n summary_value: {\n marginTop: 10,\n color: 'rgb(74, 74, 74)',\n fontSize: 20,\n fontFamily: 'Nunito Sans sans-serif',\n fontWeight: 700,\n },\n};\n\nexport default withStyles(styles)(Summary);\n","import React from 'react';\nimport { useEffect, useState, Component } from 'react';\nimport { withStyles } from '@material-ui/core/styles';\nimport { Typography, Grid } from '@material-ui/core';\nimport CampaignTypes from './youtube/ytCampaignTypes';\nimport { Line } from 'react-chartjs-2';\nimport CreatorTypes from './youtube/ytCreator';\nimport ListHeader from './youtube/ytListHeader';\nimport CategoryCreatorTypes from './youtube/ytCategoryCreator';\n\nimport CreatorInfoCard from './youtube/ytCreatorInfoCard';\nimport Summary from './youtube/ytSummary';\nimport { ytTopCreatorFetch, fetchYTPostsOverTime } from 'api_handlers/competitor';\n\nfunction YoutubeInsights({ classes, brand_id, brandName, startDate, endDate, searchKeyword, paidPost }) {\n const [results, setResults] = useState([]);\n const [postOverTimeData, setPostOverTimeData] = useState([]);\n\n useEffect(() => {\n const fetchCreators = async () => {\n try {\n const resp = await ytTopCreatorFetch(brandName, startDate, endDate, searchKeyword, paidPost);\n setResults(resp);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n fetchCreators();\n const fetchPostsOverTime = async () => {\n try {\n const resp = await fetchYTPostsOverTime(brandName, startDate, endDate, searchKeyword, paidPost);\n setPostOverTimeData(resp);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n };\n fetchPostsOverTime();\n }, [searchKeyword, paidPost]);\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n BEST PERFORMING POSTS \n \n \n \n \n \n \n \n \n \n {results &&\n results.map((result, index) => (\n \n \n \n ))}\n \n \n \n \n\n \n\n \n \n \n Posts Over Time \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '6px',\n marginTop: '35px',\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n});\n\nexport default withStyles(styles)(YoutubeInsights);\n","import { AppBar, Box, Button, Grid, IconButton, Switch, Tab, Tabs, TextField, Typography } from '@material-ui/core';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport { withStyles } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useState, useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport SearchIcon from 'assets/planner/search_icon.png';\nimport Filter from './components/Filter';\nimport Header from './components/Header/Header';\nimport InstagramInsights from './components/InstagramInsights';\nimport YoutubeInsights from './components/ytInsights';\nimport { downloadInstagramData, downloadYtData } from 'api_handlers/competitor';\n\nimport DateRangePicker from '../ux/DateRangePicker';\nimport { textAlign } from '@material-ui/system';\n\nfunction TabPanel(props) {\n const { children, value, index, ...other } = props;\n\n return (\n \n {value === index && (\n \n {children} \n \n )}\n
\n );\n}\n\nfunction Insights({ classes }) {\n const { keyword, brand_id } = useParams();\n const [selectedFeedTab, setSelectedFeedTab] = useState(0);\n const [startDate, setStartDate] = useState(null);\n const [endDate, setEndDate] = useState(null);\n const [brandName, setBrandName] = useState('');\n const [loadData, setLoadData] = useState(false);\n const [infoModalOpen, setInfoModalOpen] = useState(false);\n const [errorModalOpen, setErrorModalOpen] = useState(false);\n const [searchKeyword, setSearchKeyword] = useState('');\n const [textSearch, setTextSearch] = useState('')\n const [searchIconClicked, setSearchIconClicked] = useState(false);\n const [paidPost, setPaidPost] = useState(false);\n\n\n console.log(' = == = = keyword', keyword);\n\n const reloadData = async (brand_name) => {\n console.log('Brand NAme: ', brand_name);\n setBrandName(brand_name);\n setLoadData(false);\n if (brand_name && brand_name.length > 0) {\n setInfoModalOpen(true);\n setTimeout(() => {\n setLoadData(true);\n }, 1000);\n } else {\n setErrorModalOpen(true);\n }\n };\n\n const infoToggleModal = async () => {\n setInfoModalOpen(!infoModalOpen);\n };\n\n const errorToggleModal = async () => {\n setErrorModalOpen(!errorModalOpen);\n };\n\n const downloadData = async () => {\n if (startDate && endDate) {\n if (selectedFeedTab === 0) {\n try {\n console.log('brandName', keyword);\n const resp = await downloadInstagramData(keyword, startDate, endDate, searchKeyword);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n } else if (selectedFeedTab === 1) {\n try {\n const resp = await downloadYtData(keyword, startDate, endDate, searchKeyword);\n } catch (error) {\n console.error('Error fetching creators:', error);\n }\n }\n }\n };\n\n function handleTabFunc(bool){\n if(bool || searchKeyword || startDate || endDate || paidPost){\n setSelectedFeedTab(0)\n }else{\n setSelectedFeedTab(1) \n }\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Please Enter Brand Name Or Hashtags\n \n \n \n \n We have received your request. Data will be available in next few hours.\n \n \n \n {keyword ? (\n \n \n \n {\n if (value >= 0) {\n setSelectedFeedTab(value);\n }\n }}\n aria-label=\"simple tabs example\"\n >\n \n \n \n \n \n \n \n \n {\n setTextSearch(event.target.value)\n }} \n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n setSearchKeyword(event.target.value);\n event.preventDefault();\n }\n }}\n >\n \n \n \n {\n // setSearchIconClicked(true);\n setSearchKeyword(textSearch);\n // setSelectedFeedTab(0);\n }}/>\n \n \n \n \n \n {\n setStartDate(result[0].startDate);\n setEndDate(result[0].endDate);\n }}\n > \n \n \n {\n setPaidPost(e.target.checked);\n }}> Paid Post\n \n \n \n Download\n \n \n \n \n \n \n \n \n {\n handleTabFunc(bool)\n }}\n />\n \n \n \n \n \n \n ) : null}\n \n \n \n );\n}\n\nconst styles = (theme) => ({\n base: {\n background: 'white',\n // height: 700,\n width: '100%',\n margin: 'auto',\n marginTop: 0,\n },\n root: {\n background: 'white',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n paddingLeft: 40,\n paddingRight: 40,\n paddingBottom: 40,\n paddingTop: 10,\n },\n downloadButton: {\n textTransform: 'none',\n width: 150,\n height: 39,\n fontWeight: 700,\n background: '#FEBD1C',\n borderRadius: '10px',\n color: 'white',\n fontSize: 16,\n marginRight: 30,\n filter: 'drop-shadow(5px 7px 7px rgba(186, 186, 186, 0.25))',\n },\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 600,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '6px',\n marginTop: '35px',\n },\n\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n paddingTop: 20,\n paddingBottom: 20,\n paddingLeft: '52px',\n paddingRight: '52px',\n },\n keywordContainer:{\n background:'white',\n border: '1px solid #C4C4C4',\n borderRadius: '10px',\n marginRight:30,\n height:35,\n marginTop:5,\n\n },\n keywordField:{\n background: '#FFFFFF',\n width: 200,\n height: 20,\n outline: 'none',\n marginLeft:20,\n marginRight:5,\n fontSize: 12,\n \n },\n icon: {\n height: 20,\n width: 20,\n cursor:'pointer',\n marginRight:20,\n width:15,\n height:15,\n marginTop:5\n },\n});\n\nexport default withStyles(styles)(Insights);\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport { useEffect, useState } from 'react';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport { getYtHandlerData } from 'api_handlers/competitor';\n\nexport default function CreatorDetailedInsightsCard({ keyword, startDate, endDate, searchKeyword }) {\n const classes = useStyles();\n const [userData, setUserData] = useState([]);\n let [pageNumber, setPageNumber] = useState(1);\n const [isNext,setIsNext]=useState(true)\n const queryParameters = new URLSearchParams(window.location.search);\n const [type, setType] = useState(queryParameters.get('creator_type'));\n\n\n useEffect(() => {\n const fetchHandlerData = async () => {\n try {\n const resp = await getYtHandlerData(keyword, type, pageNumber, startDate, endDate, searchKeyword); // Wait for the response\n const mergedData = [...userData, ...resp.results];\n if(resp.next){\n setIsNext(true)\n }else{\n setIsNext(false)\n }\n setUserData(mergedData);\n } catch (error) {\n console.error('Error fetching creator posts:', error);\n }\n }\n\n fetchHandlerData();\n }, [pageNumber]);\n\n function fetchMoreData() {\n setPageNumber((prevPageNumber) => prevPageNumber + 1);\n }\n\n function countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n }\n\n return (\n Loading...}\n endMessage={\n \n No more posts are found. \n
\n // isPlanActive ? (\n \n // ) : (\n // \"\"\n // )\n }\n >\n \n {userData.length > 0\n ? userData.map((data, i) => (\n \n \n \n \n \n {\n window.open(`https://www.youtube.com/${data.creator}/`, '_blank');\n }}\n >\n {data.creator}\n \n \n {\n window.open(\n `https://www.youtube.com/watch?v=${data.video_id}/`,\n '_blank',\n );\n }}\n >\n \n \n \n {data.description && data.description.length < 170 ? (\n \n {data.title}\n \n ) : (\n \n {data.description}\n \n )}\n \n \n \n \n \n \n \n \n \n \n {countertostring(data.likes_count)}\n \n \n \n \n \n \n \n \n \n \n \n {countertostring(data.comments_count)}\n \n \n \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n maxWidth: 300,\n marginLeft: 20,\n marginTop: 50,\n },\n instaHandler: {\n fontSize: 18,\n textAlign: 'start',\n cursor: 'pointer',\n fontWeight: 600,\n },\n image: {\n height: 220,\n width: 220,\n borderRadius: 20,\n marginTop: 10,\n textAlign: 'center',\n cursor: 'pointer',\n },\n icon: {\n height: 20,\n width: 20,\n marginTop: 9,\n },\n data: {\n marginLeft: 3,\n },\n}));\n","import { Grid, Typography, makeStyles } from '@material-ui/core';\nimport CreatorDetailedInsightsCard from './ytCreatorDetailedInsightsCard';\nimport { withStyles } from '@material-ui/core/styles';\nimport { useParams, useLocation } from 'react-router-dom';\n\nfunction YtDetailedInsights({ classes }) {\n const { keyword } = useParams();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n const query = new URLSearchParams(window.location.href);\n const searchKeyword = query.get('keyword')\n // console.log('searchKeyword',searchKeyword)\n // console.log('keyword___',keyword)\n const startDate = queryParams.get(\"start_date\") !== \"Invalid date\" ? queryParams.get(\"start_date\") : null\n const endDate = queryParams.get(\"end_date\") !== \"Invalid date\" ? queryParams.get(\"end_date\") : null\n\n console.log(\"startDate\", startDate)\n\n return (\n \n \n \n DETAILED INSIGHTS \n \n \n {/* \n Detailed Insights for \"Category Clicked\" \n */}\n \n \n \n \n );\n}\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '0px',\n marginTop: '20px',\n marginLeft: '27px',\n marginRight: '40px',\n },\n});\n\nexport default withStyles(styles)(YtDetailedInsights);\n\n// const useStyles = makeStyles(() => ({\n// a:{\n// fontSize:100\n// }\n// }));\n","import { Grid, makeStyles, Typography } from '@material-ui/core';\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\nimport { useEffect, useState } from 'react';\nimport InfiniteScroll from 'react-infinite-scroll-component';\nimport { getHandlerData } from 'api_handlers/competitor';\nimport insta_placeholder from 'assets/discovery/insta_placeholder.png';\nimport ImageValidator from 'components/ux/ImageValidator';\n\nexport default function CreatorDetailedInsightsCard({ keyword, searchKeyword, paidPost }) {\n const classes = useStyles();\n const [userData, setUserData] = useState([]);\n let [pageNumber, setPageNumber] = useState(1);\n const [isNext,setIsNext]=useState(true)\n const queryParameters = new URLSearchParams(window.location.search);\n const [type, setType] = useState(queryParameters.get('creator_type'));\n\n useEffect(() => {\n const fetchHandlerData = async () => {\n try {\n const resp = await getHandlerData(keyword, type, pageNumber, searchKeyword, paidPost);\n const mergedData = [...userData, ...resp.results];\n if(resp.next){\n setIsNext(true)\n }else{\n setIsNext(false)\n }\n setUserData(mergedData);\n } catch (error) {\n console.error('Error fetching creator posts:', error);\n }\n };\n\n fetchHandlerData();\n }, [pageNumber]);\n\n function fetchMoreData() {\n console.log('userData',userData)\n setPageNumber((prevPageNumber) => prevPageNumber + 1);\n }\n\n function countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n }\n\n return (\n Loading...}\n endMessage={\n \n No more posts are found. \n
\n // isPlanActive ? (\n \n // ) : (\n // \"\"\n // )\n }\n >\n \n {userData.length > 0\n ? userData.map((data, i) => (\n \n \n \n \n \n {\n window.open(`https://www.instagram.com/${data.created_by}`, '_blank');\n }}\n >\n {data.created_by}\n \n \n {\n window.open(`https://www.instagram.com/p/${data.shortcode}`, '_blank');\n }}\n >\n \n \n \n ``\n \n \n \n \n \n {data.caption && data.caption.length < 170 ? (\n \n {data.caption}\n \n ) : (\n \n {data.caption}\n \n )}\n \n \n \n \n \n \n \n \n \n \n {countertostring(data.likes_count)}\n \n \n \n \n \n \n \n \n \n \n \n {countertostring(data.comments_count)}\n \n \n \n \n \n \n \n \n \n \n ))\n : ''}\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n maxWidth: 300,\n marginLeft: 20,\n marginTop: 50,\n },\n instaHandler: {\n fontSize: 18,\n textAlign: 'start',\n cursor: 'pointer',\n fontWeight: 600,\n },\n image: {\n height: 220,\n width: 220,\n borderRadius: 20,\n marginTop: 10,\n textAlign: 'center',\n cursor: 'pointer',\n },\n icon: {\n height: 20,\n width: 20,\n marginTop: 9,\n },\n data: {\n marginLeft: 3,\n },\n}));\n","import { Grid, Typography, makeStyles } from '@material-ui/core';\nimport CreatorDetailedInsightsCard from './CreatorDetailedInsightsCard';\nimport { withStyles } from '@material-ui/core/styles';\n\nimport { useParams } from 'react-router-dom';\n\nfunction DetailedInsights({ classes }) {\n const { keyword } = useParams();\n // const classes = useStyles();\n const query = new URLSearchParams(window.location.href);\n const searchKeyword = query.get('keyword')\n const paidPost = query.get('paidPost')\n // console.log('searchKeyword',searchKeyword)\n // console.log('keyword___',keyword)\n \n return (\n \n \n \n DETAILED INSIGHTS \n \n \n {/* \n Detailed Insights for \"Category Clicked\" \n */}\n \n \n \n \n );\n}\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '20px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '0px',\n marginTop: '20px',\n marginLeft: '27px',\n marginRight: '40px',\n },\n});\n\nexport default withStyles(styles)(DetailedInsights);\n\n// const useStyles = makeStyles(() => ({\n// a:{\n// fontSize:100\n// }\n// }));\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\n\nfunction Link({ children, selected }) {\n const classes = useStyles();\n return (\n \n {children} \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n paddingTop: '3px !important',\n paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n selected: {\n border: '3px solid #FEBD1C',\n boxShadow:\n '-5px 5px 10px rgba(210, 211, 219, 0.2), 5px -5px 10px rgba(210, 211, 219, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(210, 211, 219, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(210, 211, 219, 0.5)',\n borderRadius: '20px',\n },\n name: {\n fontSize: 14,\n },\n}));\n\nexport default Link;\n","import { Grid, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Link from 'components/Theme/Elements/Link';\nimport ImageButton from 'components/Theme/Elements/ImageButton';\n\nimport Logo from 'assets/discovery/logo.png';\nimport BrandLogo from 'assets/discovery/brand-logo.png';\n\nfunction Header() {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n Dashboard\n My Campaign\n Influencers\n Discover\n Account\n \n \n \n \n \n Happilo \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n height: 60,\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingLeft: 20,\n paddingRight: 20,\n },\n logo: {\n height: 23,\n },\n brandBox: {\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n linkBox: {\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n}));\n\nexport default Header;\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import { InputBase } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\n\nfunction TextFieldUpdated({ children, className, value = '', ...props }) {\n const classes = useStyles();\n return ;\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: '#EFF0F9',\n border: '1px solid #FFFFFF',\n boxShadow:\n '-5px 5px 10px rgba(232, 233, 242, 0.2), 5px -5px 10px rgba(232, 233, 242, 0.2), -5px -5px 10px rgba(246, 247, 255, 0.9), 5px 5px 13px rgba(232, 233, 242, 0.9), inset 1px 1px 2px rgba(246, 247, 255, 0.3), inset -1px -1px 2px rgba(232, 233, 242, 0.5)',\n borderRadius: 10,\n paddingLeft: 7,\n fontFamily: \"'Nunito Sans', sans-serif\",\n fontStyle: 'normal',\n fontWeight: 500,\n fontSize: 14,\n lineHeight: 25,\n letterSpacing: '0.03e',\n color: '#4A4A4A',\n },\n}));\n\nexport default TextFieldUpdated;\n","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nfunction IconLabel({ imageSrc, label }) {\n const classes = useStyles();\n const [dimensions, setDimensions] = useState({});\n\n useEffect(() => {\n const img = new Image();\n img.onload = function () {\n if (this.width > this.height) setDimensions({ width: 15 });\n else setDimensions({ height: 15 });\n };\n img.src = imageSrc;\n }, []);\n\n return (\n \n \n \n \n \n {label} \n \n \n );\n}\n\nIconLabel.propTypes = {\n imageSrc: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'flex',\n alignItems: 'center',\n },\n iconBox: {},\n icon: {},\n label: {\n fontSize: '0.7em',\n },\n}));\n\nexport default IconLabel;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport IconLabel from 'components/Theme/IconLabel';\n\nfunction Filter({ children, label, labelIconSrc }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n \n \n {children}\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default Filter;\n","import { Grid, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\n\nimport ChannelIcon from 'assets/discovery/channel-icon.png';\nimport InstagramIcon from 'assets/discovery/insta-icon.png';\nimport YouTubeIcon from 'assets/discovery/youtube-icon.png';\n\nfunction PlatformFilter({ value, setFilters }) {\n function handleFilter(platform) {\n setFilters({\n platform,\n });\n }\n\n const classes = useStyles();\n return (\n \n \n \n \n \n handleFilter('instagram')}>\n \n \n \n \n Instagram \n \n \n \n \n handleFilter('youtube')}>\n \n \n \n \n YouTube \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n filterContainer: {\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n padding: '15px 10px',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n filter: {\n background: 'linear-gradient(135deg, #E3E4EA 0%, #FBFCFF 100%)',\n boxShadow:\n '-2px 2px 4px rgba(227, 228, 233, 0.2), 2px -2px 4px rgba(227, 228, 233, 0.2), -2px -2px 4px rgba(251, 252, 255, 0.9), 2px 2px 5px rgba(227, 228, 233, 0.9), inset 1px 1px 2px rgba(251, 252, 255, 0.3), inset -1px -1px 2px rgba(227, 228, 233, 0.5)',\n borderRadius: 39,\n justifyContent: 'center',\n alignItems: 'center',\n padding: '6px 12px 6px 6px',\n cursor: 'pointer',\n },\n iconContainer: {\n background: '#EFF0F9',\n boxShadow:\n '-1px 1px 2px rgba(227, 228, 237, 0.2), 1px -1px 2px rgba(227, 228, 237, 0.2), -1px -1px 2px rgba(251, 252, 255, 0.9), 1px 1px 3px rgba(227, 228, 237, 0.9), inset 1px 1px 2px rgba(251, 252, 255, 0.3), inset -1px -1px 2px rgba(227, 228, 237, 0.5)',\n padding: 8,\n borderRadius: '50%',\n marginRight: 4,\n },\n icon: {\n height: 15,\n width: 15,\n },\n}));\n\nexport default PlatformFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport TextField from 'components/Theme/Elements/TextField';\n\nfunction MinMaxInput({ value = [null, null], onChange }) {\n const classes = useStyles();\n const [minValue, setMinValue] = useState(value[0]);\n const [maxValue, setMaxValue] = useState(value[1]);\n\n function handleMinChange({ target }) {\n setMinValue(target.value);\n onChange([target.value, maxValue]);\n }\n\n function handleMaxChange({ target }) {\n setMaxValue(target.value);\n onChange([minValue, target.value]);\n }\n\n return (\n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n}));\n\nexport default MinMaxInput;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport MinMaxInput from 'components/Theme/Elements/MinMaxInput';\n\nimport Filter from '../Filter';\n\nimport FollowersIcon from 'assets/discovery/followers-icon.png';\n\nfunction FollowersFilter({ value = [null, null], setFilters }) {\n const classes = useStyles();\n console.log('values', value);\n\n function handleFilter(values) {\n setFilters({\n followers: values,\n });\n }\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default FollowersFilter;\n","import { Checkbox, TextField } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\n\nconst icon = ;\nconst checkedIcon = ;\n\nfunction MultiSelect({ value, onChange, options }) {\n const classes = useStyles();\n return (\n option.label}\n renderOption={(option, { selected }) => (\n <>\n \n {option.label}\n >\n )}\n style={{ width: 500 }}\n renderInput={(params) => (\n \n )}\n />\n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n paddingTop: '3px !important',\n paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n selected: {\n border: '3px solid #FEBD1C',\n boxShadow:\n '-5px 5px 10px rgba(210, 211, 219, 0.2), 5px -5px 10px rgba(210, 211, 219, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(210, 211, 219, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(210, 211, 219, 0.5)',\n borderRadius: '20px',\n },\n name: {\n fontSize: 14,\n },\n}));\n\nexport default MultiSelect;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport MultiSelect from 'components/Theme/Elements/MultiSelect';\n\nimport Filter from '../Filter';\n\nimport CategoryIcon from 'assets/discovery/Category-Icon.png';\n\nfunction CategoryFilter({ value, setFilters, categories }) {\n const classes = useStyles();\n // const [categories, setCategories] = useState([])\n\n function handleFilter(event, selectedValues) {\n setFilters({\n category: selectedValues,\n });\n }\n\n return (\n \n \n \n \n category)\n .map((category) => ({ label: category, value: category }))}\n value={value || []}\n onChange={handleFilter}\n />\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default CategoryFilter;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABU1BMVEUAAAD///8AAACAgID///9VVVWqqqoCYaYOY5xAQEADX6UCYqdmZmaAgICZmZkXXZcAYaYAYagOYKVtbW0EYaUBYKaSkpKAgIAaaZ0LYqCAgIBxcXEBYqYBYqcxbJOAgIAHYaUEYqVVVVV0dHQIY6YFYaUFY6cFYqYFYqUFY6UFYaWAgIBmZmZ2dnZ3d3eAgIB5eXl5eXmAgICAgIBtbW0OY6MRZ6IRZqAUZ58XZJ4ZaJ0ia5iAgICAgIAHYqUKYqKLi4sEYqV2dnYLZKIBYaeOjo52dnY3bZYDYqcEYaR3d3cNY6IAYacEY6V4eHgKY6IFY6V8fHwbZp0DYqaAgIAEYqYdZ5x/f38IYqQHY6MHYqQMZKJPcY4HYqMBYaYEYaYaZ554eHhwcHB6enp7e3t7e3uAgIB7e3tycnJ6enpzc3NxcXGIiIh1dXV/f38AYaf///88Y14jAAAAb3RSTlMAAAECAQMDgRIEY4IFBAUW4O8lB4PBBwYnRggJweAaCmaFBguGpaWmp6WWDAoNDxITFRQQDkhKS01PUUMYFpdoC8YajOEJHDiUxx6O8McgncchZsMg1T4Oqaqrjy2r8cVPERAZGx0eHx0XFBIPGBym69rmAAAAAWJLR0QB/wIt3gAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB+YFHQ0KMyu9SMIAAAABb3JOVAHPoneaAAABQklEQVQY0zWOaVPCMBRFH0lbt6Yu1UZbtSoiaClQwQUFF1TUqriL4k7BXfL/v5kSvDOZnDlzcycAPAgjLCJhCYUmgpCEsazIXd1tDSjCa5IUqp5e1qcSWcYIIeAHy0TV+gfY4JCmKjKWJJAQVoim6sOMsRGDEsK7EM4Rqo+yMGO6oRE+i7GiUdMab8uJSZ1yC0hRqWlPMZFp25whMvC3hhWdjc3FE4n4/IKTNCkBXrSibiqd8TxvMZ3NOZahAqHm0vLKan5tvVAo5jdim1sWBVW3xdx2qbQT3ruTJtA9pyPL+wIObDAtV/ChfyTgOApWNCf4pHLa+ZcLtpMSeHZ+IeDShaSb/ZdX1224qYLtZuOJ27ta7b5SeXh8Ys8vrynerGeKQaPpv/nv/kcj+Pz65k3nJ+39Bo1Ws9kql4KCl6lX/wA0GFQwwvg5hgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wNS0yOVQxMzoxMDoyOSswMDowMCP3rAcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDUtMjlUMTM6MTA6MjkrMDA6MDBSqhS7AAAAAElFTkSuQmCC\"","import {\n FormControl,\n // InputLabel,\n // NativeSelect,\n Select,\n MenuItem,\n} from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst generateId = () => {\n return `select-${Math.floor(Math.random() * 10 + 1)}`;\n};\n\nfunction SelectUpdated({ children, options = [], value, onChange, ...props }) {\n const classes = useStyles();\n const id = generateId();\n return (\n \n \n \n {options.map((option, i) => (\n \n {option.label}\n \n ))}\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n width: '100%',\n },\n select: {\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(219, 220, 221, 0.2), 5px -5px 10px rgba(219, 220, 221, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 221, 0.5)',\n borderRadius: 20,\n border: 'none',\n '& .MuiInput-underline:after': {\n borderBottom: 'none',\n },\n '& .MuiInput-underline:before': {\n borderBottom: 'none',\n },\n '& .MuiInput-underline:hover:not(.Mui-disabled):before': {\n borderBottom: 'none',\n },\n width: '100%',\n },\n}));\n\nexport default SelectUpdated;\n","import { useState, useEffect } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Select from 'components/Theme/Elements/Select';\n\nimport Filter from '../Filter';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport MultiSelect from 'components/Theme/Elements/MultiSelect';\nimport { getDiscoveryLocations } from 'api_handlers/discovery';\n\nfunction LocationFilter({ value, setFilters }) {\n const classes = useStyles();\n const [locations, setLocations] = useState([]);\n\n function handleFilter(event, selectedValues) {\n setFilters({\n location: selectedValues,\n });\n }\n\n useEffect(() => {\n getDiscoveryLocations().then((response) => {\n console.log('response data', response.data);\n setLocations(response.data);\n });\n }, []);\n\n return (\n \n \n \n \n location)\n .map((location) => ({ label: location, value: location }))}\n value={value || []}\n onChange={handleFilter}\n />\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n filterContainer: {},\n}));\n\nexport default LocationFilter;\n","import { Slider } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst CustomSlider = withStyles({\n root: {\n color: '#EFF0F9',\n height: 8,\n },\n thumb: {\n height: 24,\n width: 24,\n marginTop: -8,\n marginLeft: -12,\n '&:focus, &:hover, &$active': {\n boxShadow: 'inherit',\n },\n background: '#EFF0F9',\n border: '2px solid #82E900',\n boxShadow: '2px 2px 4px rgba(148, 148, 148, 0.25)',\n },\n active: {},\n valueLabel: {\n left: 'calc(-50% + 4px)',\n },\n track: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 20,\n },\n rail: {\n height: 8,\n boxShadow:\n '-1px 1px 2px rgba(203, 204, 212, 0.2), 1px -1px 2px rgba(203, 204, 212, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: 20,\n },\n})(Slider);\n\nexport default CustomSlider;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport Slider from 'components/Theme/Elements/Slider';\n\nimport EngagementRateIcon from 'assets/discovery/Eng-Rate-icon.png';\n\nfunction valuetext(value) {\n return `${value}%`;\n}\n\nfunction EngagementRateFilter({ value = null, setFilters }) {\n const classes = useStyles();\n const [engRate, setEngRate] = useState(value);\n\n const handleFilter = (event, newValue) => {\n setFilters({\n engagementRate: newValue,\n });\n };\n\n const handleChange = (event, newValue) => {\n setEngRate(newValue);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default EngagementRateFilter;\n","import { Grid, InputAdornment, IconButton } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport MinMaxInput from 'components/Theme/Elements/MinMaxInput';\n\nimport Filter from '../Filter';\n\nimport AudienceViewIcon from 'assets/discovery/Avg-View-icon.png';\n\nfunction AudienceViewsFilter({ value = [null, null], setFilters }) {\n const classes = useStyles();\n\n function handleFilter(values) {\n setFilters({\n audienceView: values,\n });\n }\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n input: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 10,\n width: '100%',\n height: 40,\n },\n button: {\n background: '#000000',\n borderRadius: 10,\n padding: 7,\n color: 'white',\n marginRight: 2,\n },\n buttonIcon: {\n fontSize: '20px !important',\n },\n}));\n\nexport default AudienceViewsFilter;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport YesNoRadio from 'components/Theme/Elements/YesNoRadio';\n\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nconst options = [\n { label: 'Male', value: 'male' },\n { label: 'Female', value: 'female' },\n];\n\nfunction GenderFilter({ value, setFilters }) {\n const classes = useStyles();\n\n const handleChange = ({ target }) => {\n setFilters({\n gender: target.value,\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n input: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 10,\n width: '100%',\n height: 40,\n },\n button: {\n background: '#000000',\n borderRadius: 10,\n padding: 7,\n color: 'white',\n marginRight: 2,\n },\n buttonIcon: {\n fontSize: '20px !important',\n },\n}));\n\nexport default GenderFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport MinMaxInput from 'components/Theme/Elements/MinMaxInput';\n\nimport EngagementRateIcon from 'assets/discovery/Eng-Rate-icon.png';\n\nfunction AvgEngagementFilter({ value = [null, null], setFilters }) {\n const classes = useStyles();\n\n const handleFilter = (values) => {\n setFilters({\n avgEngagement: values,\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AvgEngagementFilter;\n","import { useState, useEffect } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Select from 'components/Theme/Elements/Select';\n\nimport Filter from '../Filter';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport MultiSelect from 'components/Theme/Elements/MultiSelect';\nimport { getDiscoveryLanguages } from 'api_handlers/discovery';\n\nfunction LanguageFilter({ value, setFilters }) {\n const classes = useStyles();\n const [languages, setLanguages] = useState([]);\n\n function handleFilter(event, selectedValues) {\n setFilters({\n language: selectedValues,\n });\n }\n\n useEffect(() => {\n getDiscoveryLanguages().then((response) => {\n setLanguages(response.data);\n });\n }, []);\n\n return (\n \n \n \n \n language)\n .map((language) => ({ label: language, value: language }))}\n value={value || []}\n onChange={handleFilter}\n />\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n filterContainer: {},\n}));\n\nexport default LanguageFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport Slider from 'components/Theme/Elements/Slider';\n\nimport PPPIcon from 'assets/discovery/PPP-icon.png';\n\nfunction PPPFilter({ value = null, setFilters }) {\n const classes = useStyles();\n const [engRate, setEngRate] = useState(value);\n\n const handleFilter = (event, newValue) => {\n setFilters({\n ppp: newValue,\n });\n };\n\n const handleChange = (event, newValue) => {\n setEngRate(newValue);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default PPPFilter;\n","import { useState, useEffect } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\n\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport MultiSelect from 'components/Theme/Elements/MultiSelect';\n\nfunction AudienceLocationFilter({ value, setFilters, locations }) {\n const classes = useStyles();\n\n function handleFilter(event, selectedValues) {\n setFilters({\n audienceLocation: selectedValues,\n });\n }\n\n return (\n \n \n \n \n ({ label: location, value: location }))}\n value={value || []}\n onChange={handleFilter}\n />\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n filterContainer: {},\n}));\n\nexport default AudienceLocationFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport MultiSelect from 'components/Theme/Elements/MultiSelect';\n\nimport Filter from '../Filter';\n\nimport InterestIcon from 'assets/discovery/interest-icon.png';\n\nfunction AudienceInterestFilter({ value, setFilters, interests }) {\n const classes = useStyles();\n\n function handleFilter(event, selectedValues) {\n setFilters({\n audienceInterest: selectedValues,\n });\n }\n\n return (\n \n \n \n \n ({ label: interest, value: interest }))}\n value={value || []}\n onChange={handleFilter}\n />\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AudienceInterestFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Select from 'components/Theme/Elements/Select';\nimport Slider from 'components/Theme/Elements/Slider';\n\nfunction DropDownSlider({ options, value, onChange }) {\n const [selectValue, setSelectValue] = useState(value[0]);\n const [sliderValue, setSliderValue] = useState(value[1]);\n\n function handleSelectChange({ target }) {\n setSelectValue(target.value);\n onChange([target.value, sliderValue]);\n }\n\n function handleSliderChange(event, value) {\n setSliderValue(value);\n onChange([selectValue, value]);\n }\n\n return (\n \n \n \n \n \n setSliderValue(value)}\n onChangeCommitted={handleSliderChange}\n />\n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default DropDownSlider;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport DropDownSlider from 'components/Theme/Elements/DropDownSlider';\n\nimport Filter from '../Filter';\n\nimport FollowersIcon from 'assets/discovery/followers-icon.png';\n\nconst options = [\n { label: 'Male', value: 'male' },\n { label: 'Female', value: 'female' },\n];\n\nfunction AudienceGenderSplitFilter({ value = [null, null], setFilters }) {\n const classes = useStyles();\n\n function handleFilter(values) {\n setFilters({\n audienceGender: values,\n });\n }\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AudienceGenderSplitFilter;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport DropDownSlider from 'components/Theme/Elements/DropDownSlider';\n\nimport Filter from '../Filter';\n\nimport FollowersIcon from 'assets/discovery/followers-icon.png';\n\nconst options = [\n { label: '13-17', value: '13-17' },\n { label: '18-24', value: '18-24' },\n { label: '25-34', value: '25-34' },\n { label: '35-44', value: '35-44' },\n { label: '45-64', value: '45-64' },\n { label: '65-', value: '65-' },\n];\n\nfunction AudienceAgeGroup({ value = [null, null], setFilters }) {\n const classes = useStyles();\n\n function handleFilter(values) {\n setFilters({\n audienceAgeGroup: values,\n });\n }\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AudienceAgeGroup;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport YesNoRadio from 'components/Theme/Elements/YesNoRadio';\n\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nconst options = [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n];\n\nfunction SocialLoginAccessFilter({ value, setFilters }) {\n const classes = useStyles();\n\n const handleChange = ({ target }) => {\n setFilters({\n isSocialLogin: target.value,\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n input: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 10,\n width: '100%',\n height: 40,\n },\n button: {\n background: '#000000',\n borderRadius: 10,\n padding: 7,\n color: 'white',\n marginRight: 2,\n },\n buttonIcon: {\n fontSize: '20px !important',\n },\n}));\n\nexport default SocialLoginAccessFilter;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport YesNoRadio from 'components/Theme/Elements/YesNoRadio';\n\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nconst options = [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n];\n\nfunction IsPhoneFilter({ value, setFilters }) {\n const classes = useStyles();\n\n const handleChange = ({ target }) => {\n setFilters({\n isPhone: target.value,\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n input: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 10,\n width: '100%',\n height: 40,\n },\n button: {\n background: '#000000',\n borderRadius: 10,\n padding: 7,\n color: 'white',\n marginRight: 2,\n },\n buttonIcon: {\n fontSize: '20px !important',\n },\n}));\n\nexport default IsPhoneFilter;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport YesNoRadio from 'components/Theme/Elements/YesNoRadio';\n\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nconst options = [\n { label: 'Yes', value: 'yes' },\n { label: 'No', value: 'no' },\n];\n\nfunction IsEmailFilter({ value, setFilters }) {\n const classes = useStyles();\n\n const handleChange = ({ target }) => {\n setFilters({\n isEmail: target.value,\n });\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n input: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 220, 0.2), 2px -2px 4px rgba(215, 216, 220, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 10,\n width: '100%',\n height: 40,\n },\n button: {\n background: '#000000',\n borderRadius: 10,\n padding: 7,\n color: 'white',\n marginRight: 2,\n },\n buttonIcon: {\n fontSize: '20px !important',\n },\n}));\n\nexport default IsEmailFilter;\n","import { useState } from 'react';\nimport { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Filter from '../Filter';\nimport Slider from 'components/Theme/Elements/Slider';\n\nimport EngagementRateIcon from 'assets/discovery/Eng-Rate-icon.png';\n\nfunction valuetext(value) {\n return `${value}%`;\n}\n\nfunction AudienceCredibilityFilter({ value = null, setFilters }) {\n const classes = useStyles();\n const [engRate, setEngRate] = useState(value);\n\n const handleFilter = (event, newValue) => {\n setFilters({\n audienceCredibility: newValue,\n });\n };\n\n const handleChange = (event, newValue) => {\n setEngRate(newValue);\n };\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AudienceCredibilityFilter;\n","import { Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport DropDownSlider from 'components/Theme/Elements/DropDownSlider';\n\nimport Filter from '../Filter';\n\nimport FollowersIcon from 'assets/discovery/followers-icon.png';\n\nconst options = [\n { label: '<500', value: '-500' },\n { label: '500-1K', value: '500-1000' },\n { label: '1K-1.5k', value: '1000-1500' },\n { label: '>1.5K', value: '1500-' },\n];\n\nfunction AudienceGenderSplitFilter({ value = [null, null], setFilters }) {\n const classes = useStyles();\n\n function handleFilter(values) {\n setFilters({\n audienceReachability: values,\n });\n }\n\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {},\n}));\n\nexport default AudienceGenderSplitFilter;\n","import { useEffect, useState } from 'react';\nimport { Grid, Drawer, Button as BaseButton, ButtonGroup } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\nimport CloseIcon from '@mui/icons-material/Close';\n\nimport PlatformFilter from './components/PlatformFilter';\nimport FollowersFilter from './components/FollowersFilter';\nimport CategoryFilter from './components/CategoryFilter';\nimport LocationFilter from './components/LocationFilter';\nimport EngagementRateFilter from './components/EngagementRateFilter';\nimport AudienceViewsFilter from './components/AudienceViewsFilter';\nimport GenderFilter from './components/GenderFilter';\nimport AvgEngagementFilter from './components/AvgEngagementFilter';\nimport LanguageFilter from './components/LanguageFilter';\nimport PPPFilter from './components/PPPFilter';\nimport AudienceLocationFilter from './components/AudienceLocationFilter';\nimport AudienceInterestFilter from './components/AudienceInterestFilter';\n\nimport AudienceGenderSplitFilter from './components/AudienceGenderSplitFilter';\nimport AudienceAgeGroupFilter from './components/AudienceAgeGroupFilter';\nimport SocialLoginAccessFilter from './components/SocialLoginAccessFilter';\nimport IsPhoneFilter from './components/IsPhoneFilter';\nimport IsEmailFilter from './components/IsEmailFilter';\nimport AudienceCredibilityFilter from './components/AudienceCredibilityFilter';\nimport AudienceReachabilityFilter from './components/AudienceReachabilityFilter';\n\nimport { getDiscoveryFilterData } from 'api_handlers/discovery';\n\nfunction FilterDrawer({\n open,\n closeDrawer,\n filters,\n setFilters,\n getFilteredInfluencer,\n resetFilter,\n}) {\n const classes = useStyles();\n const [filterData, setFilterData] = useState({});\n\n function handleApply() {\n getFilteredInfluencer();\n }\n\n useEffect(() => {\n getDiscoveryFilterData().then((response) => {\n setFilterData(response);\n });\n }, []);\n\n return (\n \n \n \n }\n endIcon={ }\n onClick={() => closeDrawer()}\n >\n Filter\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 \n \n \n \n \n \n \n \n \n \n \n \n \n {filterData.is_staff ? (\n \n \n \n ) : null}\n {filterData.is_staff ? (\n \n \n \n ) : null}\n {/* {filterData.is_staff ? \n \n : null} */}\n {filterData.is_staff ? (\n \n \n \n ) : null}\n {filterData.is_staff ? (\n \n \n \n ) : null}\n \n \n \n resetFilter()}>RESET \n {\n closeDrawer();\n handleApply();\n }}\n >\n APPLY\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles((theme) => ({\n base: {},\n filterContainer: {\n height: '90vh',\n flexDirection: 'row',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n overflowY: 'scroll',\n },\n drawerPaper: {\n width: 300,\n background: theme.palette.background.default,\n },\n filterButton: {\n background:\n 'linear-gradient(99.05deg, #FEBD1C 24.26%, rgba(242, 63, 96, 0.77) 74.68%, rgba(239, 26, 116, 0.93) 89.51%)',\n border: '2px solid #FFFFFF',\n borderRadius: 10,\n color: 'white',\n paddingTop: 5,\n paddingBottom: 5,\n },\n closeButtonIcon: {\n marginLeft: 70,\n },\n buttonContainer: {\n position: 'absolute',\n bottom: 20,\n },\n}));\n\nexport default FilterDrawer;\n","import { useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport Button from 'components/Theme/Elements/Button';\n\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport AddIcon from '@material-ui/icons/Add';\nimport DoneIcon from '@material-ui/icons/Done';\n\nimport { addInfluencerToCampaign } from 'api_handlers/campaign';\n\nfunction CampaignCard({ id, name, desc, start_date, budget, selectedInfluencer }) {\n const classes = useStyles();\n const [influencerAdded, setInfluencerAdded] = useState(false);\n\n function addInfluencerHandler(e) {\n e.preventDefault();\n addInfluencerToCampaign(id, { influencers: selectedInfluencer }).then(() =>\n setInfluencerAdded(true),\n );\n }\n\n return (\n \n \n \n \n {name} \n \n \n \n \n \n Start Date:\n \n \n \n {start_date} \n \n \n \n \n \n \n {desc} \n \n \n \n \n \n Influencer Micro | Small\n \n \n \n \n \n \n \n \n \n \n {budget}\n \n \n \n \n {influencerAdded ? (\n \n \n \n ) : (\n \n \n \n )}\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n height: 150,\n background: '#F3F4FE',\n boxShadow:\n '-5px 5px 10px rgba(219, 220, 229, 0.2), 5px -5px 10px rgba(219, 220, 229, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n borderRadius: 20,\n padding: '10px 30px',\n },\n descContainer: {\n marginTop: 10,\n height: 50,\n },\n badge: {\n background: 'linear-gradient(180deg, #C6BFEE 0%, rgba(148, 129, 239, 0.71) 100%)',\n borderRadius: 5,\n color: 'white',\n padding: 7,\n },\n budgetIcon: {\n height: 25,\n width: 25,\n },\n budgetLabel: {\n background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n border: '1px solid #FD6A00',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 5,\n padding: 4,\n },\n addButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n },\n startDateLabel: {\n fontWeight: 600,\n marginRight: 5,\n },\n checkButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n background: '#82E900',\n '&.MuiButton-containedPrimary:hover': {\n background: '#179020',\n },\n },\n}));\n\nexport default CampaignCard;\n","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal, Divider } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CampaignIcon from 'assets/discovery/Campaign-Icon.png';\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\nimport Button from 'components/Theme/Elements/Button';\nimport CampaignCard from './components/CampaignCard';\n\nimport { campaignHandlers } from 'api_handlers/campaign';\n\nfunction AddToCampaignModal({\n campaignModalOpen = false,\n setCampaignModalOpen,\n selectedInfluencer,\n setSelectedInfluencer,\n}) {\n const classes = useStyles();\n const [campaigns, setCampaigns] = useState([]);\n\n useEffect(() => {\n campaignHandlers.getCampaigns().then((result) => {\n setCampaigns(result);\n });\n }, []);\n\n async function handleDone() {\n await setSelectedInfluencer([]);\n setCampaignModalOpen(false);\n }\n\n return (\n \n \n \n \n \n \n \n CAMPAIGNS \n \n \n \n \n \n \n setCampaignModalOpen(false)}\n >\n \n \n Close \n \n \n \n \n \n \n \n \n \n \n Select Campaign \n \n \n \n {campaigns.map((campaign, i) => (\n \n \n \n ))}\n \n \n \n \n \n \n DONE\n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: 700,\n width: 900,\n margin: 'auto',\n marginTop: 50,\n },\n root: {\n background: '#F3F4FE',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n height: 700,\n width: 900,\n borderRadius: 10,\n padding: 40,\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 10,\n },\n campaignIcon: {\n height: 30,\n width: 30,\n },\n divider: {\n border: '2px solid #7B61FF',\n borderRadius: 10,\n background: '#7B61FF',\n },\n body: {\n justifyContent: 'flex-start',\n alignItems: 'flex-start',\n marginTop: 25,\n height: 500,\n },\n cardContainer: {\n overflowY: 'scroll',\n height: 400,\n },\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n padding: 7,\n height: 30,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n}));\n\nexport default AddToCampaignModal;\n","import { useState } from 'react';\nimport { connect } from 'react-redux';\nimport { Grid, InputAdornment, IconButton, Button as BaseButton } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport SearchIcon from '@mui/icons-material/Search';\nimport FilterAltIcon from '@mui/icons-material/FilterAlt';\n\nimport TextField from 'components/Theme/Elements/TextField';\nimport Button from 'components/Theme/Elements/Button';\nimport InstagramIconButton from '../InstagramIconButton';\nimport YouTubeIconButton from '../YouTubeIconButton';\n\nimport FilterDrawer from './components/FilterDrawer';\nimport AddToCampaignModal from './components/AddToCampaignModal';\n\nimport { updateFilter, getFilteredInfluencer, resetFilter } from 'actions/discovery';\n\nfunction ActionBar({\n filters,\n setFilters,\n selectedInfluencer,\n setSelectedInfluencer,\n getFilteredInfluencer,\n resetFilter,\n}) {\n const [filterOpened, setFilterOpened] = useState(false);\n const [campaignModalOpen, setCampaignModalOpen] = useState(false);\n\n function handleApply() {\n getFilteredInfluencer();\n }\n\n const classes = useStyles();\n return (\n \n \n \n \n setFilterOpened(false)}\n filters={filters}\n setFilters={setFilters}\n getFilteredInfluencer={getFilteredInfluencer}\n resetFilter={resetFilter}\n />\n }\n onClick={() => setFilterOpened(!filterOpened)}\n >\n Filter\n \n \n \n \n \n \n \n \n }\n value={filters.search || null}\n onChange={({ target }) => {\n setFilters({ search: target.value });\n }}\n />\n \n \n \n \n \n \n \n \n \n \n \n \n setCampaignModalOpen(!campaignModalOpen)}\n >\n Add To Campaign\n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n height: 50,\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n filterBox: {\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n buttonBox: {\n justifyContent: 'flex-end',\n },\n searchInput: {\n height: 45,\n },\n searchButton: {\n background: 'linear-gradient(163.61deg, rgba(0, 149, 255, 0.81) 22.36%, #0061A7 79.45%)',\n borderRadius: '50%',\n padding: 4,\n color: 'white',\n marginRight: 4,\n },\n filterButton: {\n background: '#EFF0F9',\n boxShadow:\n '-2px 2px 4px rgba(215, 216, 224, 0.2), 2px -2px 4px rgba(215, 216, 224, 0.2), -2px -2px 4px rgba(255, 255, 255, 0.9), 2px 2px 5px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n textTransform: 'none',\n padding: '6px 16px',\n },\n filterButtonIcon: {\n background: 'linear-gradient(180deg, #FEBD1C 0%, #EF1A74 100%)',\n borderRadius: '50%',\n padding: 6,\n color: 'white',\n marginRight: 10,\n },\n}));\n\nconst mapStateToProps = (state) => {\n return {\n filters: state.discovery.filters,\n };\n};\n\nconst actionCreators = {\n setFilters: updateFilter,\n getFilteredInfluencer,\n resetFilter,\n};\n\nexport default connect(mapStateToProps, actionCreators)(ActionBar);\n\n// export default ActionBar\n","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nimport ArrowUpwardIcon from '@mui/icons-material/ArrowUpward';\nimport ArrowDownwardIcon from '@mui/icons-material/ArrowDownward';\n\nfunction IconLabel({\n imageSrc,\n label,\n sortable = false,\n sort = false,\n sortOrder = '',\n sortByThis,\n}) {\n const classes = useStyles();\n const [dimensions, setDimensions] = useState({});\n\n useEffect(() => {\n const img = new Image();\n img.onload = function () {\n if (this.width > this.height) setDimensions({ width: 15 });\n else setDimensions({ height: 15 });\n };\n img.src = imageSrc;\n }, []);\n\n return (\n sortable && sortByThis()}\n >\n \n \n \n \n \n {label}\n \n \n {sortable && sort ? (\n \n {sortOrder === 'asc' ? (\n \n ) : (\n \n )}\n \n ) : null}\n \n );\n}\n\nIconLabel.propTypes = {\n imageSrc: PropTypes.string.isRequired,\n label: PropTypes.string.isRequired,\n};\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'flex',\n alignItems: 'center',\n },\n sortableLabel: {\n cursor: 'pointer',\n fontWeight: 700,\n },\n sortArrow: {\n fontSize: '15px !important',\n },\n label: {\n fontSize: '0.7em',\n },\n}));\n\nexport default IconLabel;\n","import { connect } from 'react-redux';\nimport { Typography, Grid, Chip } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport HeaderLabel from './components/HeaderLabel';\n\nimport ChannelIcon from 'assets/discovery/channel-icon.png';\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport AvgViewIcon from 'assets/discovery/Avg-View-icon.png';\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport EngRateIcon from 'assets/discovery/Eng-Rate-icon.png';\nimport PPPIcon from 'assets/discovery/PPP-icon.png';\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport HeadingIcon from 'assets/discovery/Heading-Columns-icon.png';\n\nimport { updateFilter, getFilteredInfluencer, resetFilter } from 'actions/discovery';\n\nfunction ListHeader({ count, filters, setFilters, getFilteredInfluencer }) {\n const classes = useStyles();\n\n async function sortColumn(column) {\n await setFilters({\n sortBy: column,\n sortOrder: filters.sortOrder === 'asc' && filters.sortBy === column ? 'desc' : 'asc',\n });\n getFilteredInfluencer();\n }\n\n return (\n \n \n \n \n INFLUENCERS \n \n \n \n \n \n \n \n \n \n \n \n \n sortColumn('followers')}\n />\n \n \n sortColumn('eng-rate')}\n />\n \n \n sortColumn('views')}\n />\n \n \n sortColumn('audience-gender')}\n />\n \n \n sortColumn('ppp')}\n />\n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n flexGrow: 1,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 221, 0.2), 1px -1px 2px rgba(215, 216, 221, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: 10,\n background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n height: 50,\n position: 'sticky',\n top: 0,\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n matrixBox: {\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n font12: {\n fontSize: 12,\n },\n}));\n\nconst mapStateToProps = (state) => {\n return {\n filters: state.discovery.filters,\n };\n};\n\nconst actionCreators = {\n setFilters: updateFilter,\n getFilteredInfluencer,\n resetFilter,\n};\n\nexport default connect(mapStateToProps, actionCreators)(ListHeader);\n\n// export default ListHeader\n","import { Chip } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nfunction CategoryChip({ label, color }) {\n const classes = useStyles({ color });\n return ;\n}\n\nconst useStyles = makeStyles(() => ({\n root: ({ color }) => ({\n background: '#EFF0F4',\n borderRadius: 10,\n borderWidth: 1,\n borderColor: color,\n }),\n}));\n\nexport default CategoryChip;\n","import { Typography, Grid } from '@material-ui/core';\nimport { useTheme } from '@material-ui/core/styles';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CategoryChip from './components/CategoryChip';\n\nfunction CategoryContainer({ categories }) {\n const classes = useStyles();\n const theme = useTheme();\n const colors = [\n theme.palette.primary.main,\n theme.palette.secondary.main,\n theme.palette.info.main,\n theme.palette.warning.main,\n ];\n\n return (\n \n {categories.slice(0, 2).map((name, i) => (\n \n \n \n ))}\n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n // background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n // boxShadow: '-1px 1px 2px rgba(227, 228, 234, 0.2), 1px -1px 2px rgba(227, 228, 234, 0.2), -1px -1px 2px rgba(251, 252, 255, 0.9), 1px 1px 3px rgba(227, 228, 234, 0.9), inset 1px 1px 2px rgba(251, 252, 255, 0.3), inset -1px -1px 2px rgba(227, 228, 234, 0.5)',\n borderRadius: 5,\n height: 50,\n justifyContent: 'start',\n alignItems: 'center',\n },\n}));\n\nexport default CategoryContainer;\n","import ImageButton from 'components/Theme/Elements/ImageButton';\nimport InstagramIcon from 'assets/discovery/insta-icon.png';\n\nfunction InstagramRectIconButton({ ...props }) {\n return (\n \n );\n}\n\nexport default InstagramRectIconButton;\n","import { Typography, Grid, Avatar } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\n// import AvatarImage from \"assets/discovery/inf-avatar.png\"\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\n\nfunction InfoCard({ name, gender, language, picture, age_group }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n \n {name}\n \n \n \n {language} \n \n \n \n \n \n \n \n \n {gender} | {age_group} yrs\n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: 'linear-gradient(118.02deg, rgba(239, 26, 116, 0.57) 32.63%, #FEBD1C 94.6%)',\n boxShadow: '2px 5px 10px rgba(143, 143, 143, 0.25)',\n borderRadius: 10,\n height: 130,\n justifyContent: 'space-around',\n alignItems: 'center',\n },\n aboutContainer: {\n color: 'white',\n alignItems: 'center',\n },\n genderIcon: {\n height: 13,\n width: 13,\n },\n genderInfo: {\n fontSize: 12,\n color: 'white',\n },\n avatar: {\n height: 95,\n width: 95,\n },\n}));\n\nexport default InfoCard;\n","import { Typography, Grid, Avatar } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport TrendingUpIcon from '@material-ui/icons/TrendingUp';\nimport LocationOnIcon from '@material-ui/icons/LocationOn';\nimport WcIcon from '@material-ui/icons/Wc';\n\nimport InstagramRectIconButton from 'components/Discovery/components/InstagramRectIconButton';\nimport CategoryContainer from 'components/Discovery/components/CategoryContainer';\n\nfunction BasicInfo({ name, picture, interests = [], url, audience_short_desc = {} }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n \n \n \n {name} \n \n \n Micro Influencer \n \n \n \n {\n window.open(url, '_blank');\n }}\n />\n \n \n \n interest.name,\n )}\n />\n \n \n \n \n \n \n \n \n \n \n Audience Info\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {audience_short_desc?.location?.name}\n \n \n \n \n \n \n {audience_short_desc?.location?.percentage}\n \n \n \n \n \n \n \n \n \n \n \n \n \n {audience_short_desc?.gender?.code?.charAt(0)}\n \n \n \n \n \n \n {audience_short_desc?.gender?.percentage}\n \n \n \n \n \n \n \n \n \n {`${audience_short_desc?.age?.code} yrs`}\n \n \n \n \n \n {audience_short_desc?.age?.percentage}\n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n avatarContainer: {\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(203, 204, 212, 0.2), 5px -5px 10px rgba(203, 204, 212, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(203, 204, 212, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(203, 204, 212, 0.5)',\n borderRadius: '50%',\n padding: 10,\n },\n avatar: {\n filter: 'drop-shadow(0px 5px 10px rgba(141, 141, 141, 0.25))',\n height: 150,\n width: 150,\n },\n audienceInfoBase: {\n background:\n 'linear-gradient(118.02deg, rgba(239, 26, 116, 0.57) 32.63%, rgba(254, 189, 28, 0.63) 94.6%)',\n borderRadius: 10,\n height: 150,\n },\n audienceInfo: {\n background: 'rgba(239, 240, 249, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n backdropFilter: 'blur(27.2667px)',\n borderRadius: 10,\n color: 'white',\n padding: '10px 20px',\n },\n}));\n\nexport default BasicInfo;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nfunction StatsCard({ value, label, iconSrc }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n {value}\n \n \n \n {label} \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n padding: 10,\n },\n iconContainer: {\n background: 'linear-gradient(135deg, #E3E4ED 0%, #FBFCFF 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 221, 0.2), 5px -5px 10px rgba(215, 216, 221, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 221, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 221, 0.5)',\n borderRadius: '50%',\n height: 18,\n width: 18,\n marginRight: 10,\n },\n icon: {\n height: 14,\n width: 14,\n },\n}));\n\nexport default StatsCard;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport EngIcon from 'assets/discovery/Eng-Rate-icon.png';\nimport AvgViewIcon from 'assets/discovery/Avg-View-icon.png';\nimport AvgEngIcon from 'assets/discovery/Avg-Eng-Icon.png';\nimport PPPIcon from 'assets/discovery/PPP-icon.png';\n\nimport StatsCard from './components/StatsCard';\n\nfunction BasicStats({ followers, engagement_rate, avg_views, paid_post_performance, engagements }) {\n const classes = useStyles();\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n paddingTop: '3px !important',\n paddingBottom: '3px !important',\n cursor: 'pointer',\n },\n}));\n\nexport default BasicStats;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport classNames from 'classnames';\n\nimport {\n Chart as ChartJS,\n ArcElement,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js';\nimport { Doughnut, Line } from 'react-chartjs-2';\n\nimport FollowerIcon from 'assets/discovery/followers-icon.png';\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport BrandAffinityIcon from 'assets/discovery/Brand-affiniy-icon.png';\nimport PriceIcon from 'assets/discovery/Price-icon.png';\nimport FilterVintageIcon from '@material-ui/icons/FilterVintage';\n\nChartJS.register(\n ArcElement,\n Tooltip,\n Legend,\n CategoryScale,\n LinearScale,\n PointElement,\n LineElement,\n Title,\n);\n\nfunction InfluencerDetails({ interests = [], fair_price, brand_affinity = [] }) {\n const classes = useStyles();\n console.log('interests', interests);\n return (\n \n \n \n INFLUENCER DETAILS\n \n \n \n \n \n \n \n \n \n \n \n Followers\n \n \n \n \n \n \n \n \n \n \n \n \n \n Likes\n \n \n \n / Comments \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Interests\n \n \n \n \n {interests.map((interest, i) => (\n \n \n \n \n \n \n {interest.name} \n \n \n \n ))}\n \n \n \n \n \n \n \n \n \n \n \n Influencer Brand Affinity\n \n \n \n \n {(Array.isArray(brand_affinity) ? brand_affinity : []).map((brand, i) => (\n \n {brand.name}\n \n ))}\n \n \n \n \n \n \n \n \n \n Pricing\n \n \n \n \n \n \n \n \n Fair Price\n \n \n \n \n {fair_price}\n \n \n \n \n \n \n \n \n Details\n \n \n \n \n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\n incididunt ut\n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: 10,\n padding: 15,\n marginBottom: 15,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n },\n graphCard: {\n height: 200,\n },\n iconSize: {\n width: 15,\n height: 15,\n },\n brandAffinityCard: {\n height: 170,\n },\n pricingCard: {\n height: 200,\n marginTop: 15,\n },\n interestIconContainer: {\n background: 'linear-gradient(135deg, #E8EAEE 0%, #FFFFFF 100%)',\n boxShadow:\n '-5px 5px 10px rgba(220, 221, 222, 0.2), 5px -5px 10px rgba(220, 221, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(220, 221, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(220, 221, 222, 0.5)',\n borderRadius: '50%',\n padding: 3,\n },\n interestIcon: {\n color: '#B9B9B9',\n fontSize: 13,\n },\n fairPriceValueBox: {\n background: '#F3F4FE',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n height: 100,\n padding: 20,\n },\n brandContainer: {\n background: '#F2F3F7',\n boxShadow:\n '-5px 5px 10px rgba(218, 219, 222, 0.2), 5px -5px 10px rgba(218, 219, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(218, 219, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(218, 219, 222, 0.5)',\n borderRadius: 10,\n padding: 12,\n margin: 10,\n },\n}));\n\nexport default InfluencerDetails;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from 'chart.js';\nimport { Bar } from 'react-chartjs-2';\n\nimport InterestIcon from 'assets/discovery/interest-icon.png';\nimport GenderIcon from 'assets/discovery/Gender-icon.png';\nimport LocationIcon from 'assets/discovery/Location-Icon.png';\nimport GenderSplitIcon from 'assets/discovery/gender-split-icon.png';\nimport LanguageIcon from 'assets/discovery/Language-icon.png';\nimport FilterVintageIcon from '@material-ui/icons/FilterVintage';\n\nChartJS.register(CategoryScale, LinearScale, BarElement, Title, Tooltip, Legend);\n\nfunction AudienceDetails({ audience_interest = [], audience_languages = [] }) {\n const classes = useStyles();\n return (\n \n \n \n AUDIENCE DETAILS\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Audience Age Split\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Audience Interest\n \n \n \n \n {audience_interest.map((interest, i) => (\n \n \n \n \n \n \n {interest.name} \n \n \n \n ))}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Language\n \n \n \n \n {audience_languages.slice(0, 3).map((language, i) => (\n \n \n \n \n {language.percentage}\n \n \n \n \n {language.name}\n \n \n \n \n ))}\n \n \n \n \n \n \n \n \n \n \n \n Audience Gender Split\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Audience Location Split\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: 10,\n padding: 15,\n marginBottom: 15,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n },\n graphCard: {\n height: 200,\n },\n iconSize: {\n width: 15,\n height: 15,\n },\n brandAffinityCard: {\n height: 170,\n },\n pricingCard: {\n height: 200,\n marginTop: 15,\n },\n interestContainer: {\n marginTop: 20,\n marginLeft: 20,\n overflowY: 'scroll',\n maxHeight: '90%',\n },\n interestIconContainer: {\n background: 'linear-gradient(135deg, #E8EAEE 0%, #FFFFFF 100%)',\n boxShadow:\n '-5px 5px 10px rgba(220, 221, 222, 0.2), 5px -5px 10px rgba(220, 221, 222, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(220, 221, 222, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(220, 221, 222, 0.5)',\n borderRadius: '50%',\n padding: 3,\n width: 23,\n height: 23,\n },\n interestIcon: {\n color: '#B9B9B9',\n fontSize: 13,\n },\n languageBox: {\n marginLeft: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n },\n languageContainer: {\n background: '#F3F4FE',\n boxShadow:\n '-5px 5px 10px rgba(219, 220, 229, 0.2), 5px -5px 10px rgba(219, 220, 229, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(219, 220, 229, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(219, 220, 229, 0.5)',\n borderRadius: 5,\n padding: '5px 20px',\n margin: 10,\n },\n}));\n\nexport default AudienceDetails;\n","import { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport CommentIcon from 'assets/discovery/comment-icon.png';\nimport LikeIcon from 'assets/discovery/like-icon.png';\n\nfunction PopularPosts({ popular_posts = [] }) {\n const classes = useStyles();\n return (\n \n \n \n POPULAR POSTS\n \n \n \n \n {popular_posts.slice(0, 3).map((post, i) => (\n \n \n \n \n \n \n {post.text} \n \n \n \n \n \n \n \n \n \n {post.likes} \n \n \n \n \n \n \n \n \n \n {post.comments} \n \n \n \n \n \n \n \n ))}\n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n header: {\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: 10,\n padding: 15,\n marginBottom: 15,\n },\n card: {\n background: 'linear-gradient(135.2deg, #EEEFF8 10.88%, rgba(251, 252, 255, 0.76) 100%)',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 220, 0.2), 5px -5px 10px rgba(215, 216, 220, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n padding: 20,\n },\n image: {\n height: 220,\n width: 220,\n borderRadius: 20,\n },\n icon: {\n height: 20,\n width: 20,\n },\n}));\n\nexport default PopularPosts;\n","import { useState, useEffect } from 'react';\nimport { Typography, Grid, Modal } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport HighlightOffIcon from '@material-ui/icons/HighlightOff';\n\nimport InstagramIconButton from 'components/Discovery/components/InstagramIconButton';\nimport YouTubeIconButton from 'components/Discovery/components/YouTubeIconButton';\n\nimport BasicInfo from './components/BasicInfo';\nimport BasicStats from './components/BasicStats';\nimport InfluencerDetails from './components/InfluencerDetails';\nimport AudienceDetails from './components/AudienceDetails';\nimport PopularPosts from './components/PopularPosts';\n\nimport { getDiscoveryInfluencersDetails } from 'api_handlers/discovery';\n\nfunction DetailViewModal({ id, detailViewOpened = false, setDetailViewOpened }) {\n const classes = useStyles();\n const [influenerDetail, setInfluenerDetail] = useState({});\n\n useEffect(() => {\n getDiscoveryInfluencersDetails(id).then((response) => {\n setInfluenerDetail(response);\n });\n }, []);\n\n return (\n setDetailViewOpened(false)}\n className={classes.base}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n setDetailViewOpened(false)}\n >\n \n \n Close \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 );\n}\n\nconst useStyles = makeStyles(() => ({\n base: {\n background: 'white',\n height: 700,\n width: 1200,\n margin: 'auto',\n marginTop: 50,\n },\n root: {\n background: '#F3F4FE',\n filter: 'drop-shadow(5px 8px 15px rgba(171, 171, 171, 0.25))',\n height: 700,\n width: 1200,\n borderRadius: 10,\n padding: 40,\n overflowY: 'scroll',\n },\n header: {\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 40,\n },\n\n closeContainer: {\n background: 'linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, #FBFCFF 100%)',\n boxShadow:\n '-1px 1px 2px rgba(215, 216, 220, 0.2), 1px -1px 2px rgba(215, 216, 220, 0.2), -1px -1px 2px rgba(255, 255, 255, 0.9), 1px 1px 3px rgba(215, 216, 220, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 220, 0.5)',\n borderRadius: 20,\n justifyContent: 'space-evenly',\n alignItems: 'center',\n padding: 7,\n height: 30,\n cursor: 'pointer',\n },\n closeIcon: {\n fontSize: 14,\n color: '#757575',\n justifyContent: 'center',\n alignItems: 'center',\n marginLeft: 6,\n },\n}));\n\nexport default DetailViewModal;\n","import { useEffect, useState } from 'react';\nimport { Typography, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport AddIcon from '@material-ui/icons/Add';\nimport DoneIcon from '@material-ui/icons/Done';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { yellow } from '@mui/material/colors';\n\nimport Button from 'components/Theme/Elements/Button';\n\nimport CategoryContainer from '../CategoryContainer';\nimport InstagramRectIconButton from '../InstagramRectIconButton';\n\nimport InfoCard from './components/InfoCard';\nimport DetailViewModal from './components/DetailViewModal';\nimport { getDiscoveryFilterData } from 'api_handlers/discovery';\nimport { API_HOST } from '../../../../config';\n\nfunction InfluencerInfoCard({\n id,\n name,\n gender,\n language,\n picture,\n age_group,\n followers,\n engagement_rate,\n avg_views,\n audience_gender,\n url,\n interests = [],\n fair_price,\n paid_post_performance,\n influencer,\n selectedInfluencer,\n setSelectedInfluencer,\n}) {\n const classes = useStyles();\n const [detailViewOpened, setDetailViewOpened] = useState(false);\n\n function handleSelection(e) {\n e.preventDefault();\n setSelectedInfluencer([influencer, ...selectedInfluencer]);\n }\n\n function handleUnSelection(e) {\n e.preventDefault();\n const influencers = [...selectedInfluencer];\n influencers.splice(influencers.indexOf(influencer), 1);\n console.log('influencers', influencers);\n setSelectedInfluencer([...influencers]);\n }\n\n function editInfluencer() {\n window.open(`${API_HOST}/admin/discover/iqprofile/${id}/change/`, '_blank');\n }\n\n const [filterData, setFilterData] = useState({});\n\n useEffect(() => {\n getDiscoveryFilterData().then((response) => {\n setFilterData(response);\n });\n }, []);\n\n return (\n \n \n \n \n \n \n \n {\n window.open(url, '_blank');\n }}\n />\n \n \n {followers} \n \n \n {engagement_rate} \n \n \n {avg_views} \n \n \n \n \n {audience_gender.percentage} \n \n \n {audience_gender.gender} \n \n \n \n \n {paid_post_performance} \n \n \n \n {fair_price}\n \n \n \n \n \n interest.name,\n )}\n />\n \n \n \n \n \n \n {selectedInfluencer.includes(influencer) ? (\n \n \n \n ) : (\n \n \n \n )}\n\n {filterData.is_staff ? (\n \n \n \n \n \n ) : null}\n \n\n \n setDetailViewOpened(true)}>\n View Details\n \n {detailViewOpened ? (\n \n ) : null}\n \n \n \n \n );\n}\n\nconst useStyles = makeStyles(() => ({\n root: {\n background: '#EFF0F9',\n boxShadow:\n '-5px 5px 10px rgba(215, 216, 224, 0.2), 5px -5px 10px rgba(215, 216, 224, 0.2), -5px -5px 10px rgba(255, 255, 255, 0.9), 5px 5px 13px rgba(215, 216, 224, 0.9), inset 1px 1px 2px rgba(255, 255, 255, 0.3), inset -1px -1px 2px rgba(215, 216, 224, 0.5)',\n borderRadius: 10,\n flexGrow: 1,\n height: 150,\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 30,\n },\n cardBox: {\n flexGrow: 0,\n maxWidth: '20%',\n flexBasis: '20%',\n },\n statsContainer: {\n paddingRight: 50,\n },\n categoryContainer: {\n marginLeft: '10%',\n },\n addButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n },\n checkButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n background: '#82E900',\n '&.MuiButton-containedPrimary:hover': {\n background: '#179020',\n },\n },\n editButton: {\n borderRadius: '50%',\n padding: 4,\n minWidth: 0,\n marginTop: '5%',\n height: 30,\n width: 30,\n },\n moreWidth: {\n maxWidth: '10.5%',\n },\n}));\n\nexport default InfluencerInfoCard;\n","import { useEffect, useState } from 'react';\nimport { connect } from 'react-redux';\nimport { Container, Grid } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport InfiniteScroll from 'react-infinite-scroll-component';\n\nimport Header from './components/Header';\nimport ActionBar from './components/ActionBar';\nimport ListHeader from './components/ListHeader';\nimport InfluencerInfoCard from './components/InfluencerInfoCard';\n\nimport { getInfluencers } from 'actions/discovery';\n\nfunction Discovery({ fetchInfluencers, influencers, influencersCount }) {\n const classes = useStyles();\n const [selectedInfluencer, setSelectedInfluencer] = useState([]);\n\n function checkEnd() {\n console.log('scrolling');\n if (\n window.innerHeight + window.scrollY >=\n (document.body.offsetHeight * this.settings.scrollAfterPercentage) / 100\n ) {\n console.log('get enxt page');\n }\n }\n\n useEffect(() => {\n fetchInfluencers();\n }, []);\n\n function fetchMoreData() {\n fetchInfluencers();\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n influencers.length}\n loader={Loading... }\n style={{ padding: 20 }}\n >\n {influencers.map((influencer, index) => (\n \n \n \n ))}\n \n \n \n \n \n );\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n background: theme.palette.background.default,\n width: '100%',\n maxWidth: '100%',\n paddingTop: 20,\n maxHeight: '80vh',\n },\n}));\n\nconst mapStateToProps = (state) => {\n return {\n influencers: state.discovery.influencers,\n influencersCount: state.discovery.influencersCount,\n };\n};\n\nconst actionCreators = {\n fetchInfluencers: getInfluencers,\n};\n\nexport default connect(mapStateToProps, actionCreators)(Discovery);\n\n// export default Discovery 3\n","import { useEffect, useRef, useState } from 'react';\nimport { Grid, Typography, makeStyles, Button } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport { styled } from '@mui/material/styles';\nimport { Bar } from 'react-chartjs-2';\n\nimport CommentIcon from '../../assets/discovery/comment-icon.png';\nimport ViewIcon from '../../assets/View.png';\nimport insta_placeholder from '../../assets/discovery/insta_placeholder.png';\nimport InstagramIcon from 'assets/discovery/insta-icon.png';\nimport YoutubeIcon from 'assets/discovery/youtube-icon.png';\nimport PersonOutlineOutlinedIcon from '@material-ui/icons/PersonOutlineOutlined';\n\nimport ThumbUpOutlinedIcon from '@material-ui/icons/ThumbUpOutlined';\nimport EngagementRateIcon from 'assets/EngagementRate.png';\n\nimport { useParams } from 'react-router-dom';\nimport { creatorsFetch, fetchInstaPostsOverTime, fetchYTPostsOverTime, getBase64HandlerData, getBase64YtHandlerData, ytCreatorsFetch, getCombinedBrandListCompetitor, creatorTypesWithNormalTypeFetch, creatorTypesYoutubeWithNormalTypeFetch } from 'api_handlers/competitor';\n\nimport ImageValidator from 'components/ux/ImageValidator';\nimport html2canvas from 'html2canvas'\nimport jsPDF from 'jspdf';\n\nimport { Line } from 'react-chartjs-2';\n\nimport moment from 'moment';\n\nimport './CompetitorReportAnalysis.style.css';\nimport { boxSizing } from '@material-ui/system';\n\nconst colourPalette = {\n 0 : 'rgb(255, 0, 0)',\n 1 : 'rgb(60, 179, 113)',\n 2 : 'rgb(255, 165, 0)',\n 3 : 'rgb(106, 90, 205)',\n 4 : 'rgb(60, 60, 60)',\n} \n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\n\nfunction calculate_price_index(follower_count=0, like_count=1, comment_count=1, post_count=1) {\n follower_count = follower_count || 0\n\n let estimated_engagement = (like_count + comment_count) / post_count\n let estimated_engagement_rate = (estimated_engagement * 100) / (follower_count || 1)\n let cost_min = 0\n let cost_max = 0\n\n if (parseInt(follower_count) < 10000) {\n cost_min = 2.5 * parseInt(estimated_engagement)\n cost_max = 4 * parseInt(estimated_engagement)\n } else if (parseInt(follower_count) >= 10000 && parseInt(follower_count) < 100000) {\n if (estimated_engagement_rate < 4) {\n cost_min = 12 * parseInt(estimated_engagement)\n cost_max = 14 * parseInt(estimated_engagement)\n } else {\n cost_min = 5 * parseInt(estimated_engagement)\n cost_max = 9 * parseInt(estimated_engagement)\n }\n } else if (parseInt(follower_count) >= 100000 && parseInt(follower_count) < 1000000) {\n if (estimated_engagement_rate < 4) {\n cost_min = 10 * parseInt(estimated_engagement)\n cost_max = 12 * parseInt(estimated_engagement)\n } else {\n cost_min = 3.5 * parseInt(estimated_engagement)\n cost_max = 6 * parseInt(estimated_engagement)\n }\n } else {\n if (estimated_engagement_rate < 4) {\n cost_min = 10 * parseInt(estimated_engagement)\n cost_max = 12 * parseInt(estimated_engagement)\n }\n else {\n cost_min = 1.5 * parseInt(estimated_engagement)\n cost_max = 3 * parseInt(estimated_engagement)\n }\n }\n\n if (cost_min && cost_min < 1000) {\n cost_min = cost_min + 1000\n cost_max = cost_max + 1000\n }\n\n return ((cost_max * 2) + (cost_min * 2)) / 2;\n}\n\nconst calculateEngagementRate = (likes, comments, shares, views) => {\n likes = likes !== null ? likes : 0;\n comments = comments !== null ? comments : 0;\n shares = shares !== null ? shares : 0;\n if (views === 0 || views === null) {\n return 0;\n }\n const engagementRate = ((likes + comments + shares) / views) * 100;\n return parseFloat(engagementRate.toFixed(2));\n}\n\nconst calculateSummaryForParticularType = (summary_dict, brandName, data, type) => {\n if (!summary_dict[brandName][type]) {\n summary_dict[brandName][type] = data;\n } else {\n summary_dict[brandName][type].creators += data.creators || 0;\n summary_dict[brandName][type].followers += data.followers || 0;\n summary_dict[brandName][type].likes_count += data.likes_count || 0;\n summary_dict[brandName][type].comments_count += data.comments_count || 0;\n summary_dict[brandName][type].count += data.count || 0;\n summary_dict[brandName][type].engagement__rate += data.engagement__rate || 0;\n summary_dict[brandName][type].view_count += data.view_count || 0;\n summary_dict[brandName][type].fair_price += data.fair_price || 0;\n }\n return summary_dict\n}\n\nfunction CompetitorReportAnalysis({ classes }) {\n const { brand_id } = useParams();\n const pdfRef = useRef()\n\n const [ competitor_brands, set_competitor_brands ] = useState([]);\n const [ summary, setSummary ] = useState({'instagram': 0, 'youtube': 0});\n const [ totalViews, setTotalViews ] = useState(0);\n const [ totalEng, setTotalEng ] = useState(0);\n const [ maxBugetObj, setMaxBugetObj ] = useState({});\n const [ isDataLoaded, setIsDataLoaded ] = useState(false);\n\n useEffect(() => {\n loadData();\n }, [brand_id])\n\n const loadData = async () => {\n const { results } = await getCombinedBrandListCompetitor(brand_id);\n set_competitor_brands(results.slice(0, 5));\n\n loadSummaryData(results.slice(0, 5), 0, {'instagram': 0, 'youtube': 0}, 0, 0);\n\n }\n \n const query = new URLSearchParams(window.location.href);\n const start_date = query.get('start_date')\n const end_date = query.get('end_date')\n const paid_post = query.get('paid_post') || 0;\n\n const loadSummaryData = async (results, index, summary_dict, totalViews, totalEng) => {\n if (index < results.length) {\n let brandName = results[index].title;\n let paidPost = paid_post == 1;\n const resp = await creatorTypesWithNormalTypeFetch(results[index].ig_handle, start_date, end_date, '', paidPost, results[index].excluded_handles);\n if (!summary_dict[brandName]) {\n summary_dict[brandName] = {};\n }\n if (resp.all_creators) {\n summary_dict[brandName].creators = resp.all_creators.creators || 0;\n summary_dict[brandName].followers = resp.all_creators.followers || 0;\n summary_dict[brandName].likes_count = resp.all_creators.likes_count || 0;\n summary_dict[brandName].comments_count = resp.all_creators.comments_count || 0;\n summary_dict[brandName].count = resp.all_creators.count || 0;\n summary_dict[brandName].engagement__rate = (\n calculateEngagementRate(\n resp.all_creators.likes_count || 0,\n resp.all_creators.comments_count || 0,\n 0,\n resp.all_creators.view_count || 0,\n )\n );\n summary_dict[brandName].view_count = resp.all_creators.view_count || 0;\n summary_dict[brandName].fair_price = resp.all_creators.fair_price || 0;\n summary_dict[brandName]['instagram'] = {}\n summary_dict[brandName]['instagram'].creators = resp.all_creators.creators || 0;\n summary_dict[brandName]['instagram'].followers = resp.all_creators.followers || 0;\n summary_dict[brandName]['instagram'].likes_count = resp.all_creators.likes_count || 0;\n summary_dict[brandName]['instagram'].comments_count = resp.all_creators.comments_count || 0;\n summary_dict[brandName]['instagram'].count = resp.all_creators.count || 0;\n summary_dict[brandName]['instagram'].engagement__rate = resp.all_creators.engagement__rate || 0;\n summary_dict[brandName]['instagram'].view_count = resp.all_creators.view_count || 0;\n summary_dict[brandName]['instagram'].fair_price = resp.all_creators.fair_price || 0;\n summary_dict['instagram'] += resp.all_creators.creators || 0;\n totalViews += resp.all_creators.view_count || 0;\n totalEng += resp.all_creators.engagement__rate || 0;\n } \n resp.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'macro'\n )\n } else if (each.creator_type == 'nano') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'nano'\n )\n } else if (each.creator_type == 'micro') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'micro'\n )\n } else if (each.creator_type == 'mega') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'mega'\n )\n } else if (each.creator_type == 'normal') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'normal'\n )\n }\n })\n const resp_yt = await creatorTypesYoutubeWithNormalTypeFetch(results[index].yt_handle, start_date, end_date, '', paidPost, results[index].excluded_channel_ids);\n if (resp_yt.all_creators) {\n summary_dict[brandName].creators += resp_yt.all_creators.creators || 0;\n summary_dict[brandName].followers += resp_yt.all_creators.followers || 0;\n summary_dict[brandName].likes_count += resp_yt.all_creators.likes_count || 0;\n summary_dict[brandName].comments_count += resp_yt.all_creators.comments_count || 0;\n summary_dict[brandName].count += resp_yt.all_creators.count || 0;\n summary_dict[brandName].engagement__rate = parseFloat((\n summary_dict[brandName].engagement__rate + ((\n calculateEngagementRate(\n resp_yt.all_creators.likes_count || 0,\n resp_yt.all_creators.comments_count || 0,\n 0,\n resp_yt.all_creators.view_count || 0,\n )\n ))) / 2).toFixed(2);\n \n summary_dict[brandName].view_count += resp_yt.all_creators.view_count || 0;\n summary_dict[brandName].fair_price += resp_yt.all_creators.fair_price || 0;\n summary_dict[brandName]['youtube'] = {}\n summary_dict[brandName]['youtube'].creators = resp_yt.all_creators.creators || 0;\n summary_dict[brandName]['youtube'].followers = resp_yt.all_creators.followers || 0;\n summary_dict[brandName]['youtube'].likes_count = resp_yt.all_creators.likes_count || 0;\n summary_dict[brandName]['youtube'].comments_count = resp_yt.all_creators.comments_count || 0;\n summary_dict[brandName]['youtube'].count = resp_yt.all_creators.count || 0;\n summary_dict[brandName]['youtube'].engagement__rate = resp_yt.all_creators.engagement__rate || 0;\n summary_dict[brandName]['youtube'].view_count = resp_yt.all_creators.view_count || 0;\n summary_dict[brandName]['youtube'].fair_price = resp_yt.all_creators.fair_price || 0;\n summary_dict['youtube'] += resp_yt.all_creators.creators || 0;\n totalViews += resp_yt.all_creators.view_count || 0;\n totalEng += resp_yt.all_creators.engagement__rate || 0;\n }\n resp_yt.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'macro'\n )\n } else if (each.creator_type == 'nano') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'nano'\n )\n } else if (each.creator_type == 'micro') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'micro'\n )\n } else if (each.creator_type == 'mega') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'mega'\n )\n } else if (each.creator_type == 'normal') {\n summary_dict = calculateSummaryForParticularType(\n summary_dict,\n brandName,\n each,\n 'normal'\n )\n }\n })\n results[index]['budget'] = parseFloat(calculate_price_index(\n summary_dict[brandName].followers,\n summary_dict[brandName].likes_count,\n summary_dict[brandName].comments_count,\n 1\n )/100000).toFixed(2);\n let resp_post = await getBase64HandlerData(results[index].ig_handle, '', 1, '', paidPost , '1', start_date, end_date, results[index].excluded_handles, results[index].included_insta_shortcodes);\n let resp_yt_post = await getBase64YtHandlerData(results[index].yt_handle, '', 1, start_date, end_date, '', paidPost , '1', results[index].excluded_channel_ids);\n resp_post = resp_post.results;\n resp_yt_post = resp_yt_post.results;\n if (resp_yt_post.length == 0) {\n summary_dict[brandName]['posts'] = resp_post.slice(0, 4);\n } else if (resp_post.length == 0) {\n summary_dict[brandName]['posts'] = resp_yt_post.slice(0, 4);\n } else if (resp_post.length == 1) {\n summary_dict[brandName]['posts'] = resp_post.concat(resp_yt_post.slice(0, 3));\n } else if (resp_yt_post.length == 1) {\n summary_dict[brandName]['posts'] = resp_yt_post.concat(resp_post.slice(0, 3));\n } else {\n summary_dict[brandName]['posts'] = resp_post.slice(0, 2).concat(resp_yt_post.slice(0, 2));\n }\n let creators = await creatorsFetch(results[index].ig_handle, start_date, end_date, '', paidPost, results[0].ig_handle, results[index].excluded_handles);\n let ytCreators = await ytCreatorsFetch(results[index].yt_handle, start_date, end_date, '', paidPost, results[0].yt_handle, results[index].excluded_channel_ids);\n creators = creators.results;\n ytCreators = ytCreators.results;\n let list = (results[index].excluded_handles && results[index].excluded_handles.split(\",\")) || []\n if (list.length > 0) {\n creators = creators.filter((each_creator)=>{\n return list.indexOf(each_creator.handle.replace('@', '')) == -1\n })\n }\n let ytList = (results[index].excluded_channel_ids && results[index].excluded_channel_ids.split(\",\")) || []\n if (ytList.length > 0) {\n ytCreators = ytCreators.filter((each_creator)=>{\n return ytList.indexOf(each_creator.channel_id) == -1\n })\n }\n if (ytCreators.length == 0) {\n summary_dict[brandName]['creators_profile'] = creators.slice(0, 4);\n } else if (creators.length == 0) {\n summary_dict[brandName]['creators_profile'] = ytCreators.slice(0, 4);\n } else if (creators.length == 1) {\n summary_dict[brandName]['creators_profile'] = creators.concat(ytCreators.slice(0, 3));\n } else if (ytCreators.length == 1) {\n summary_dict[brandName]['creators_profile'] = ytCreators.concat(creators.slice(0, 3));\n } else {\n summary_dict[brandName]['creators_profile'] = creators.slice(0, 2).concat(ytCreators.slice(0, 2));\n }\n let resp_data = await fetchInstaPostsOverTime(results[index].ig_handle, start_date, end_date, '', paidPost);\n if (!summary_dict['posts_over_time_labels']) {\n summary_dict['posts_over_time_labels'] = {};\n }\n for (var i=0;i{\n if (budget < each.budget) {\n budget = parseFloat(each.budget);\n maxBudget = each;\n \n }\n })\n setMaxBugetObj(maxBudget);\n setIsDataLoaded(true);\n } else {\n loadSummaryData(results, index+1, summary_dict, totalViews, totalEng);\n }\n }\n }\n\n const getPostCreatorList = () => {\n if (!isDataLoaded) {\n return\n }\n if (competitor_brands.length == 0) {\n return []\n } else if (competitor_brands.length == 1) {\n return [\n [\n { 'type': 'title', 'data': `${competitor_brands[0].title} - Top Content by Views` },\n { 'type': 'posts', 'data': summary[competitor_brands[0].title].posts }\n ]\n ]\n } else if (competitor_brands.length == 2) {\n return [\n [\n { 'type': 'title', 'data': `${competitor_brands[0].title} - Top Content by Views` },\n { 'type': 'posts', 'data': summary[competitor_brands[0].title].posts },\n { 'type': 'title', 'data': `${competitor_brands[1].title} - Top Content by Views`, 'style': { marginTop: '100px' }},\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(0, 2) },\n ],\n [\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(2, 4) },\n { 'type': 'title', 'data': `Top influencer partnered with - ${competitor_brands[0].title}`, 'style': { marginTop: '50px' }},\n { 'type': 'creators', 'data': summary[competitor_brands[0].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[1].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[1].title].creators_profile },\n { 'type': 'graph' }\n ]\n ]\n } else if (competitor_brands.length == 3) {\n return [\n [\n { 'type': 'title', 'data': `${competitor_brands[0].title} - Top Content by Views` },\n { 'type': 'posts', 'data': summary[competitor_brands[0].title].posts },\n { 'type': 'title', 'data': `${competitor_brands[1].title} - Top Content by Views`, 'style': { marginTop: '100px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(0, 2) },\n ],\n [\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(2, 4) },\n { 'type': 'title', 'data': `${competitor_brands[2].title} - Top Content by Views`, 'style': { marginTop: '100px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[2].title].posts.slice(0, 4) } \n ],\n [\n { 'type': 'title', 'data': `Top influencer partnered with - ${competitor_brands[0].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[0].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[1].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[1].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[2].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[2].title].creators_profile },\n { 'type': 'graph' }\n ]\n ]\n } else if (competitor_brands.length == 4) {\n return [\n [\n { 'type': 'title', 'data': `${competitor_brands[0].title} - Top Content by Views` },\n { 'type': 'posts', 'data': summary[competitor_brands[0].title].posts },\n { 'type': 'title', 'data': `${competitor_brands[1].title} - Top Content by Views`, 'style': { marginTop: '100px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(0, 2) },\n ],\n [\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(2, 4) },\n { 'type': 'title', 'data': `${competitor_brands[2].title} - Top Content by Views`, 'style': { marginTop: '150px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[2].title].posts.slice(0, 4) } \n ],\n [\n { 'type': 'title', 'data': `${competitor_brands[3].title} - Top Content by Views`, 'style': { marginTop: '70px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[3].title].posts.slice(0, 4) }, \n { 'type': 'title', 'data': `Top influencer partnered with competitor - ${competitor_brands[0].title}`, 'style': { marginTop: '240px' }},\n { 'type': 'creators', 'data': summary[competitor_brands[0].title].creators_profile },\n ],\n [\n { 'type': 'title', 'data': `Same influencer partnered with - ${competitor_brands[1].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[1].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[2].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[2].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[3].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[3].title].creators_profile },\n { 'type': 'graph' }\n ]\n ]\n } else if (competitor_brands.length == 5) {\n return [\n [\n { 'type': 'title', 'data': `${competitor_brands[0].title} - Top Content by Views` },\n { 'type': 'posts', 'data': summary[competitor_brands[0].title].posts },\n { 'type': 'title', 'data': `${competitor_brands[1].title} - Top Content by Views`, 'style': { marginTop: '100px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(0, 2) },\n ],\n [\n { 'type': 'posts', 'data': summary[competitor_brands[1].title].posts.slice(2, 4) },\n { 'type': 'title', 'data': `${competitor_brands[2].title} - Top Content by Views`, 'style': { marginTop: '150px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[2].title].posts.slice(0, 4) } \n ],\n [\n { 'type': 'title', 'data': `${competitor_brands[3].title} - Top Content by Views`, 'style': { marginTop: '30px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[3].title].posts.slice(0, 4) }, \n { 'type': 'title', 'data': `${competitor_brands[4].title} - Top Content by Views`, 'style': { marginTop: '100px' } },\n { 'type': 'posts', 'data': summary[competitor_brands[4].title].posts.slice(0, 2) },\n ],\n [\n { 'type': 'posts', 'data': summary[competitor_brands[4].title].posts.slice(2, 4) },\n { 'type': 'title', 'data': `Top influencer partnered with - ${competitor_brands[0].title}`, 'style': { marginTop: '240px' }},\n { 'type': 'creators', 'data': summary[competitor_brands[0].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[1].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[1].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[2].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[2].title].creators_profile },\n ],\n [\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[3].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[3].title].creators_profile },\n { 'type': 'title', 'data': `Same influencer partnered with competitor - ${competitor_brands[4].title}`},\n { 'type': 'creators', 'data': summary[competitor_brands[4].title].creators_profile },\n { 'type': 'graph' }\n ]\n ]\n }\n }\n\n const camelCase = (str) => {\n if ((str === null) || (str === ''))\n return false;\n else\n str = str.toString();\n \n return str.replace(/\\w\\S*/g,\n function (txt) {\n return txt.charAt(0).toUpperCase() +\n txt.substr(1).toLowerCase();\n });\n }\n\n const getYMD = (date1, date2) => {\n\n const a = moment(date1);\n const b = moment(date2);\n var days = a.diff(b, 'days') + 1;\n // const a = moment(date1);\n // const b = moment(date2);\n // var years = a.diff(b, 'year');\n // b.add(years, 'years');\n \n // // const noOfDaysInb = b.daysInMonth();\n // // const noOfDaysIna = a.daysInMonth();\n // let months = 0;\n // months = a.diff(b, 'months');\n // b.add(months, 'months');\n // var days = a.diff(b, 'days') + 1;\n // let days_string = \"\";\n // if (months > 0) {\n // days_string += `${months} months`\n // if (days > 0) {\n // days_string += ` ${days} days`\n // }\n // } else {\n // if (days > 0) {\n // days_string += `${days} days`\n // }\n // }\n // return days_string;\n return `${days} days`;\n }\n\n const getInfluencerType = (followers) => {\n if (followers >= 200 && followers <= 2000) {\n return \"Normal User\";\n } if (followers >= 2000 && followers <= 9999) {\n return \"Nano Influencer\";\n } else if (followers >= 10000 && followers <= 99999) {\n return \"Micro Influencer\";\n } else if (followers >= 100000 && followers <= 999999) {\n return \"Macro Influencer\";\n } else if (followers >= 1000000) {\n return \"Mega Influencer\"\n }\n return \"Influencer\"\n }\n\n const generatePdf = () => {\n const input = pdfRef.current;\n html2canvas(input, {\n allowTaint : false,\n useCORS: true\n }).then((canvas)=>{\n var imgWidth = 210;\n var pageHeight = 290;\n var imgHeight = canvas.height * imgWidth / canvas.width;\n var heightLeft = imgHeight;\n\n\n var doc = new jsPDF('p', 'mm');\n var position = 0;\n var pageData = canvas.toDataURL('image/jpeg', 1.0);\n var imgData = encodeURIComponent(pageData);\n doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n doc.setLineWidth(0);\n doc.setDrawColor(255, 255, 255);\n doc.rect(0, 0, 210, 290);\n heightLeft -= pageHeight;\n\n while (heightLeft >= 0) {\n position = heightLeft - imgHeight;\n doc.addPage();\n doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n doc.setLineWidth(0);\n doc.setDrawColor(255, 255, 255);\n doc.rect(0, 0, 210, 290);\n heightLeft -= pageHeight;\n }\n doc.save(camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')+' Competion Analysis report.pdf');\n })\n }\n \n const renderPostTitle = (data, style) => {\n return \n }\n\n const renderPostsData = (data) => {\n return data.map(each=>{\n let isYoutube = 'yt_thumnail_url' in each;\n return \n
\n
\n \n \n \n \n \n \n
\n
\n
\n
\n
\n
\n {each.creator_details.name}\n
Post Link: {isYoutube ? `https://www.youtube.com/watch?v=${each.video_id}/` : `https://www.instagram.com/p/${each.shortcode}`}
\n
\n
{countertostring(each.creator_details.followers)} ({getInfluencerType(each.creator_details.followers)})
\n
\n
\n
\n
\n
\n {countertostring(each.view_count)}\n
\n
\n \n {countertostring(each.likes_count)}\n
\n
\n
\n {countertostring(each.comments_count)}\n
\n
\n
\n {parseFloat(each.new_engagement_rate || \n calculateEngagementRate(each.likes_count, each.comments_count, 0, each.view_count)).toFixed(2)}\n
\n
\n
\n })\n }\n\n const renderCreatorsData = (data) => {\n return \n {\n data.map(each=>{\n return
\n
{\"channel_id\" in each ? each.display_name : '-'}
\n
\n \n \n \n \n \n \n
\n
\n {\"channel_id\" in each ? each.name : each.handle}\n
\n
\n {countertostring(each.followers)}\n
\n
\n
\n })\n }\n {\n data.length == 0 ?\n
No data available to show
\n : null\n }\n
\n }\n \n const renderLineGraph = () => {\n return \n
\n
\n {\n return new Date(a) - new Date(b);\n }),\n datasets: competitor_brands && competitor_brands.map((each, index)=>{\n return {\n label: each.title,\n data: Object.keys(summary['posts_over_time_labels'] || {}).sort((a, b)=>{\n return new Date(a) - new Date(b);\n }).map(each_month=>{\n return (summary[each.title] && summary[each.title]['post_count'] && summary[each.title]['post_count'][each_month]) || 0\n }),\n fill: false,\n backgroundColor: colourPalette[index],\n borderColor: colourPalette[index],\n }})\n }}\n options={{\n indexAxis: 'x',\n scales: {\n y: {\n beginAtZero: true\n }\n },\n maintainAspectRatio: true\n }}\n />\n \n
\n }\n\n return (\n \n
\n \n
\n
Analysis Date: {moment(start_date).format('Do MMM')} - {moment(end_date).format('Do MMM')} ({getYMD(end_date, start_date)})\n
\n
\n \n {camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')} Competition Analysis report\n
\n \n Objective: To evaluate the effectiveness of influencer marketing campaigns implemented by {camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')} and competitor brands by identifying the top content and Influencers\n
\n \n
Summary
\n
Posts
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Mega Influencers (1M - 27M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['mega'] && summary[each.title]['mega'].count) || \"-\"} \n })\n }\n \n \n Macro Influencers (100K - 1M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['macro'] && summary[each.title]['macro'].count) || \"-\"} \n })\n }\n \n \n Micro Influencers (10K - 100K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['micro'] && summary[each.title]['micro'].count) || \"-\"} \n })\n }\n \n \n Nano Influencers (2K - 10K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['nano'] && summary[each.title]['nano'].count) || \"-\"} \n })\n }\n \n \n Normal Users (200 - 2K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['normal'] && summary[each.title]['normal'].count) || \"-\"} \n })\n }\n \n \n Total Posts \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].count) || \"-\"} \n })\n }\n \n \n
\n
Influencers
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Mega Influencers (1M - 27M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['mega'] && summary[each.title]['mega'].creators) || \"-\"} \n })\n }\n \n \n Macro Influencers (100K - 1M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['macro'] && summary[each.title]['macro'].creators) || \"-\"} \n })\n }\n \n \n Micro Influencers (10K - 100K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['micro'] && summary[each.title]['micro'].creators) || \"-\"} \n })\n }\n \n \n Nano Influencers (2K - 10K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['nano'] && summary[each.title]['nano'].creators) || \"-\"} \n })\n }\n \n \n Normal Users (200 - 2K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['normal'] && summary[each.title]['normal'].creators) || \"-\"} \n })\n }\n \n \n Total Influencers \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].creators) || \"-\"} \n })\n }\n \n \n
\n
\n \n
Channel Wise Influencer Split
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Instagram \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['instagram'] && summary[each.title]['instagram'].creators) || \"-\"} \n })\n }\n \n \n Youtube \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['youtube'] && summary[each.title]['youtube'].creators) || \"-\"} \n })\n }\n \n \n Total \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].creators) || \"-\"} \n })\n }\n \n \n
\n
\n \n
ESTIMATED BUDGETS BEING SPENT BY BRANDS (IN LAKHS)
\n
\n
\n { return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return parseFloat(each.budget) }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n />\n
\n
\n
{maxBugetObj.budget} Lakhs
\n
The highest budget being spent by {maxBugetObj.title}
\n
\n
\n
\n Please note: Estimated budget based on Fair Price Index of Influencer.in and may differ from actual spends\n
\n
\n \n
\n
Campaign Performance by Views
\n
{ return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return summary[each.title] && summary[each.title].view_count }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n /> \n \n
\n
Campaign Performance by Engagement Percentage %
\n
{ return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return summary[each.title] && summary[each.title].engagement__rate }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n /> \n \n
\n \n {\n isDataLoaded && getPostCreatorList().map(each_section=>{\n return
\n {\n each_section.map(section_data=>{\n if (section_data.type == \"title\") {\n return renderPostTitle(section_data.data, section_data.style || {});\n }\n if (section_data.type == \"posts\") {\n return renderPostsData(section_data.data);\n }\n if (section_data.type == \"creators\") {\n return renderCreatorsData(section_data.data);\n }\n if (section_data.type == \"graph\") {\n return renderLineGraph();\n }\n return null;\n })\n }\n \n })\n }\n
\n Thank You
\n In case of any queries please reach us at enquiry@influencer.in
\n \n
\n );\n}\n\nconst styles = (theme) => ({\n image: {\n height: 160,\n width: 160,\n borderRadius: 20,\n },\n});\n\nexport default withStyles(styles)(CompetitorReportAnalysis);\n","import { useEffect, useRef, useState } from 'react';\nimport { Grid, Typography, makeStyles, Button } from '@material-ui/core';\nimport { withStyles } from '@material-ui/core/styles';\nimport { styled } from '@mui/material/styles';\nimport { Bar } from 'react-chartjs-2';\n\nimport LikeIcon from '../../assets/discovery/like-icon.png';\nimport CommentIcon from '../../assets/discovery/comment-icon.png';\nimport ViewIcon from '../../assets/View.png';\nimport insta_placeholder from '../../assets/discovery/insta_placeholder.png';\nimport InstagramIcon from 'assets/discovery/insta-icon.png';\nimport YoutubeIcon from 'assets/discovery/youtube-icon.png';\nimport PersonOutlineOutlinedIcon from '@material-ui/icons/PersonOutlineOutlined';\n\nimport ThumbUpOutlinedIcon from '@material-ui/icons/ThumbUpOutlined';\nimport EngagementRateIcon from 'assets/EngagementRate.png';\n\nimport { useParams } from 'react-router-dom';\nimport LinearProgress, { linearProgressClasses } from '@mui/material/LinearProgress';\nimport { creatorsFetch, fetchInstaPostsOverTime, fetchYTPostsOverTime, getBase64HandlerData, getBase64YtHandlerData, getHandlerData, getListCompetitorBrands, getYtHandlerData, topCreatorFetch, ytCreatorsFetch, getCombinedBrandListCompetitor, campaignTypesYoutubeWithNormalTypeFetch, creatorTypesWithNormalTypeFetch, creatorTypesYoutubeWithNormalTypeFetch, updatePostData, updateProfileData } from 'api_handlers/competitor';\n\nimport ImageValidator from 'components/ux/ImageValidator';\nimport html2canvas from 'html2canvas'\nimport jspdf from 'jspdf'\nimport jsPDF from 'jspdf';\n\nimport { Line } from 'react-chartjs-2';\n\nimport moment from 'moment';\n\n// var domtoimage = require('dom-to-image-more');\n\nconst colourPalette = {\n 0 : 'rgb(255, 0, 0)',\n 1 : 'rgb(60, 179, 113)',\n 2 : 'rgb(255, 165, 0)',\n 3 : 'rgb(106, 90, 205)',\n 4 : 'rgb(60, 60, 60)',\n} \n\nfunction countertostring(counter) {\n counter = parseFloat(counter);\n if (counter >= 1000 && counter < 999999) {\n return (\n parseFloat(counter / 1000.0)\n .toFixed(2)\n .toString() + 'K'\n );\n } else if (counter > 999999) {\n return (\n parseFloat(counter / 1000000.0)\n .toFixed(2)\n .toString() + 'M'\n );\n } else {\n return counter.toString();\n }\n}\n\n\nfunction calculate_price_index(follower_count=0, like_count=1, comment_count=1, post_count=1) {\n follower_count = follower_count || 0\n\n let estimated_engagement = (like_count + comment_count) / post_count\n let estimated_engagement_rate = (estimated_engagement * 100) / (follower_count || 1)\n let cost_min = 0\n let cost_max = 0\n\n if (parseInt(follower_count) < 10000) {\n cost_min = 2.5 * parseInt(estimated_engagement)\n cost_max = 4 * parseInt(estimated_engagement)\n } else if (parseInt(follower_count) >= 10000 && parseInt(follower_count) < 100000) {\n if (estimated_engagement_rate < 4) {\n cost_min = 12 * parseInt(estimated_engagement)\n cost_max = 14 * parseInt(estimated_engagement)\n } else {\n cost_min = 5 * parseInt(estimated_engagement)\n cost_max = 9 * parseInt(estimated_engagement)\n }\n } else if (parseInt(follower_count) >= 100000 && parseInt(follower_count) < 1000000) {\n if (estimated_engagement_rate < 4) {\n cost_min = 10 * parseInt(estimated_engagement)\n cost_max = 12 * parseInt(estimated_engagement)\n } else {\n cost_min = 3.5 * parseInt(estimated_engagement)\n cost_max = 6 * parseInt(estimated_engagement)\n }\n } else {\n if (estimated_engagement_rate < 4) {\n cost_min = 10 * parseInt(estimated_engagement)\n cost_max = 12 * parseInt(estimated_engagement)\n }\n else {\n cost_min = 1.5 * parseInt(estimated_engagement)\n cost_max = 3 * parseInt(estimated_engagement)\n }\n }\n\n if (cost_min && cost_min < 1000) {\n cost_min = cost_min + 1000\n cost_max = cost_max + 1000\n }\n\n return ((cost_max * 2) + (cost_min * 2)) / 2;\n}\n\nconst calculateEngagementRate = (likes, comments, shares, views) => {\n likes = likes !== null ? likes : 0;\n comments = comments !== null ? comments : 0;\n shares = shares !== null ? shares : 0;\n if (views === 0 || views === null) {\n return 0;\n }\n const engagementRate = ((likes + comments + shares) / views) * 100;\n return parseFloat(engagementRate.toFixed(2));\n}\n\nconst BorderLinearProgress = styled(LinearProgress)(({ theme }) => ({\n height: 10,\n borderRadius: 5,\n [`&.${linearProgressClasses.colorPrimary}`]: {\n backgroundColor: theme.palette.grey[theme.palette.mode === 'light' ? 200 : 800],\n },\n [`& .${linearProgressClasses.bar}`]: {\n borderRadius: 5,\n backgroundColor: theme.palette.mode === 'light' ? '#00218d' : '#308fe8',\n },\n }));\n\nfunction CompetitorReportAnalysisUI({ classes }) {\n const { brand_id } = useParams();\n const pdfRef = useRef()\n\n const [ competitor_brands, set_competitor_brands ] = useState([]);\n const [ summary, setSummary ] = useState({'instagram': 0, 'youtube': 0});\n const [ totalViews, setTotalViews ] = useState(0);\n const [ totalEng, setTotalEng ] = useState(0);\n const [ maxBugetObj, setMaxBugetObj ] = useState({});\n\n useEffect(() => {\n loadData();\n }, [brand_id])\n\n const loadData = async () => {\n const { results } = await getCombinedBrandListCompetitor(brand_id);\n set_competitor_brands(results.slice(0, 5));\n\n loadSummaryData(results.slice(0, 5), 0, {'instagram': 0, 'youtube': 0}, 0, 0);\n\n }\n \n const query = new URLSearchParams(window.location.href);\n const start_date = query.get('start_date')\n const end_date = query.get('end_date')\n\n const loadSummaryData = async (results, index, summary_dict, totalViews, totalEng) => {\n if (index < results.length) {\n let brandName = results[index].title;\n const resp = await creatorTypesWithNormalTypeFetch(results[index].ig_handle, start_date, end_date, '', '', results[index].excluded_handles);\n if (!summary_dict[brandName]) {\n summary_dict[brandName] = {};\n }\n if (resp.all_creators) {\n summary_dict[brandName].creators = resp.all_creators.creators || 0;\n summary_dict[brandName].followers = resp.all_creators.followers || 0;\n summary_dict[brandName].likes_count = resp.all_creators.likes_count || 0;\n summary_dict[brandName].comments_count = resp.all_creators.comments_count || 0;\n summary_dict[brandName].count = resp.all_creators.count || 0;\n summary_dict[brandName].engagement__rate = (\n calculateEngagementRate(\n resp.all_creators.likes_count || 0,\n resp.all_creators.comments_count || 0,\n 0,\n resp.all_creators.view_count || 0,\n )\n );\n summary_dict[brandName].view_count = resp.all_creators.view_count || 0;\n summary_dict[brandName].fair_price = resp.all_creators.fair_price || 0;\n summary_dict[brandName]['instagram'] = {}\n summary_dict[brandName]['instagram'].creators = resp.all_creators.creators || 0;\n summary_dict[brandName]['instagram'].followers = resp.all_creators.followers || 0;\n summary_dict[brandName]['instagram'].likes_count = resp.all_creators.likes_count || 0;\n summary_dict[brandName]['instagram'].comments_count = resp.all_creators.comments_count || 0;\n summary_dict[brandName]['instagram'].count = resp.all_creators.count || 0;\n summary_dict[brandName]['instagram'].engagement__rate = resp.all_creators.engagement__rate || 0;\n summary_dict[brandName]['instagram'].view_count = resp.all_creators.view_count || 0;\n summary_dict[brandName]['instagram'].fair_price = resp.all_creators.fair_price || 0;\n summary_dict['instagram'] += resp.all_creators.creators || 0;\n totalViews += resp.all_creators.view_count || 0;\n totalEng += resp.all_creators.engagement__rate || 0;\n } \n resp.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n if (!summary_dict[brandName]['macro']) {\n summary_dict[brandName]['macro'] = each;\n } else {\n summary_dict[brandName]['macro'].creators += each.creators || 0;\n summary_dict[brandName]['macro'].followers += each.followers || 0;\n summary_dict[brandName]['macro'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['macro'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['macro'].count += each.count || 0;\n summary_dict[brandName]['macro'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['macro'].view_count += each.view_count || 0;\n summary_dict[brandName]['macro'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'nano') {\n if (!summary_dict[brandName]['nano']) {\n summary_dict[brandName]['nano'] = each;\n } else {\n summary_dict[brandName]['nano'].creators += each.creators || 0;\n summary_dict[brandName]['nano'].followers += each.followers || 0;\n summary_dict[brandName]['nano'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['nano'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['nano'].count += each.count || 0;\n summary_dict[brandName]['nano'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['nano'].view_count += each.view_count || 0;\n summary_dict[brandName]['nano'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'micro') {\n if (!summary_dict[brandName]['micro']) {\n summary_dict[brandName]['micro'] = each;\n } else {\n summary_dict[brandName]['micro'].creators += each.creators || 0;\n summary_dict[brandName]['micro'].followers += each.followers || 0;\n summary_dict[brandName]['micro'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['micro'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['micro'].count += each.count || 0;\n summary_dict[brandName]['micro'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['micro'].view_count += each.view_count || 0;\n summary_dict[brandName]['micro'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'mega') {\n if (!summary_dict[brandName]['mega']) {\n summary_dict[brandName]['mega'] = each;\n } else {\n summary_dict[brandName]['mega'].creators += each.creators || 0;\n summary_dict[brandName]['mega'].followers += each.followers || 0;\n summary_dict[brandName]['mega'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['mega'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['mega'].count += each.count || 0;\n summary_dict[brandName]['mega'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['mega'].view_count += each.view_count || 0;\n summary_dict[brandName]['mega'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'normal') {\n if (!summary_dict[brandName]['normal']) {\n summary_dict[brandName]['normal'] = each;\n } else {\n summary_dict[brandName]['normal'].creators += each.creators || 0;\n summary_dict[brandName]['normal'].followers += each.followers || 0;\n summary_dict[brandName]['normal'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['normal'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['normal'].count += each.count || 0;\n summary_dict[brandName]['normal'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['normal'].view_count += each.view_count || 0;\n summary_dict[brandName]['normal'].fair_price += each.fair_price || 0;\n }\n }\n })\n const resp_yt = await creatorTypesYoutubeWithNormalTypeFetch(results[index].yt_handle, start_date, end_date, '', '', results[index].excluded_channel_ids);\n if (resp_yt.all_creators) {\n summary_dict[brandName].creators += resp_yt.all_creators.creators || 0;\n summary_dict[brandName].followers += resp_yt.all_creators.followers || 0;\n summary_dict[brandName].likes_count += resp_yt.all_creators.likes_count || 0;\n summary_dict[brandName].comments_count += resp_yt.all_creators.comments_count || 0;\n summary_dict[brandName].count += resp_yt.all_creators.count || 0;\n summary_dict[brandName].engagement__rate = parseFloat((\n summary_dict[brandName].engagement__rate + ((\n calculateEngagementRate(\n resp_yt.all_creators.likes_count || 0,\n resp_yt.all_creators.comments_count || 0,\n 0,\n resp_yt.all_creators.view_count || 0,\n )\n ))) / 2).toFixed(2);\n \n summary_dict[brandName].view_count += resp_yt.all_creators.view_count || 0;\n summary_dict[brandName].fair_price += resp_yt.all_creators.fair_price || 0;\n summary_dict[brandName]['youtube'] = {}\n summary_dict[brandName]['youtube'].creators = resp_yt.all_creators.creators || 0;\n summary_dict[brandName]['youtube'].followers = resp_yt.all_creators.followers || 0;\n summary_dict[brandName]['youtube'].likes_count = resp_yt.all_creators.likes_count || 0;\n summary_dict[brandName]['youtube'].comments_count = resp_yt.all_creators.comments_count || 0;\n summary_dict[brandName]['youtube'].count = resp_yt.all_creators.count || 0;\n summary_dict[brandName]['youtube'].engagement__rate = resp_yt.all_creators.engagement__rate || 0;\n summary_dict[brandName]['youtube'].view_count = resp_yt.all_creators.view_count || 0;\n summary_dict[brandName]['youtube'].fair_price = resp_yt.all_creators.fair_price || 0;\n summary_dict['youtube'] += resp_yt.all_creators.creators || 0;\n totalViews += resp_yt.all_creators.view_count || 0;\n totalEng += resp_yt.all_creators.engagement__rate || 0;\n }\n resp_yt.creator_type.map((each) => {\n if (each.creator_type == 'macro') {\n if (!summary_dict[brandName]['macro']) {\n summary_dict[brandName]['macro'] = each;\n } else {\n summary_dict[brandName]['macro'].creators += each.creators || 0;\n summary_dict[brandName]['macro'].followers += each.followers || 0;\n summary_dict[brandName]['macro'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['macro'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['macro'].count += each.count || 0;\n summary_dict[brandName]['macro'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['macro'].view_count += each.view_count || 0;\n summary_dict[brandName]['macro'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'nano') {\n if (!summary_dict[brandName]['nano']) {\n summary_dict[brandName]['nano'] = each;\n } else {\n summary_dict[brandName]['nano'].creators += each.creators || 0;\n summary_dict[brandName]['nano'].followers += each.followers || 0;\n summary_dict[brandName]['nano'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['nano'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['nano'].count += each.count || 0;\n summary_dict[brandName]['nano'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['nano'].view_count += each.view_count || 0;\n summary_dict[brandName]['nano'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'micro') {\n if (!summary_dict[brandName]['micro']) {\n summary_dict[brandName]['micro'] = each;\n } else {\n summary_dict[brandName]['micro'].creators += each.creators || 0;\n summary_dict[brandName]['micro'].followers += each.followers || 0;\n summary_dict[brandName]['micro'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['micro'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['micro'].count += each.count || 0;\n summary_dict[brandName]['micro'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['micro'].view_count += each.view_count || 0;\n summary_dict[brandName]['micro'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'mega') {\n if (!summary_dict[brandName]['mega']) {\n summary_dict[brandName]['mega'] = each;\n } else {\n summary_dict[brandName]['mega'].creators += each.creators || 0;\n summary_dict[brandName]['mega'].followers += each.followers || 0;\n summary_dict[brandName]['mega'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['mega'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['mega'].count += each.count || 0;\n summary_dict[brandName]['mega'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['mega'].view_count += each.view_count || 0;\n summary_dict[brandName]['mega'].fair_price += each.fair_price || 0;\n }\n } else if (each.creator_type == 'normal') {\n if (!summary_dict[brandName]['normal']) {\n summary_dict[brandName]['normal'] = each;\n } else {\n summary_dict[brandName]['normal'].creators += each.creators || 0;\n summary_dict[brandName]['normal'].followers += each.followers || 0;\n summary_dict[brandName]['normal'].likes_count += each.likes_count || 0;\n summary_dict[brandName]['normal'].comments_count += each.comments_count || 0;\n summary_dict[brandName]['normal'].count += each.count || 0;\n summary_dict[brandName]['normal'].engagement__rate += each.engagement__rate || 0;\n summary_dict[brandName]['normal'].view_count += each.view_count || 0;\n summary_dict[brandName]['normal'].fair_price += each.fair_price || 0;\n }\n }\n })\n results[index]['budget'] = (calculate_price_index(\n summary_dict[brandName].followers,\n summary_dict[brandName].likes_count,\n summary_dict[brandName].comments_count,\n 1\n )/100000).toFixed(2);\n let resp_post = await getBase64HandlerData(results[index].ig_handle, '', 1, '', '' , '1', start_date, end_date, results[index].excluded_handles, results[index].included_insta_shortcodes);\n let resp_yt_post = await getBase64YtHandlerData(results[index].yt_handle, '', 1, start_date, end_date, '', '' , '1', results[index].excluded_channel_ids);\n resp_post = resp_post.results;\n resp_yt_post = resp_yt_post.results;\n if (resp_yt_post.length == 0) {\n summary_dict[brandName]['posts'] = resp_post.slice(0, 4);\n } else if (resp_post.length == 0) {\n summary_dict[brandName]['posts'] = resp_yt_post.slice(0, 4);\n } else if (resp_post.length == 1) {\n summary_dict[brandName]['posts'] = resp_post.concat(resp_yt_post.slice(0, 3));\n } else if (resp_yt_post.length == 1) {\n summary_dict[brandName]['posts'] = resp_yt_post.concat(resp_post.slice(0, 3));\n } else {\n summary_dict[brandName]['posts'] = resp_post.slice(0, 2).concat(resp_yt_post.slice(0, 2));\n }\n let creators = await creatorsFetch(results[index].ig_handle, start_date, end_date, '', '', results[0].ig_handle, results[index].excluded_handles);\n let ytCreators = await ytCreatorsFetch(results[index].yt_handle, start_date, end_date, '', '', results[0].yt_handle, results[index].excluded_channel_ids);\n creators = creators.results;\n ytCreators = ytCreators.results;\n let list = (results[index].excluded_handles && results[index].excluded_handles.split(\",\")) || []\n if (list.length > 0) {\n creators = creators.filter((each_creator)=>{\n console.log(list.indexOf(each_creator.handle.replace('@', '')) == -1, list, each_creator.handle.replace('@', ''));\n return list.indexOf(each_creator.handle.replace('@', '')) == -1\n })\n }\n let ytList = (results[index].excluded_channel_ids && results[index].excluded_channel_ids.split(\",\")) || []\n if (ytList.length > 0) {\n ytCreators = ytCreators.filter((each_creator)=>{\n return ytList.indexOf(each_creator.channel_id) == -1\n })\n }\n if (ytCreators.length == 0) {\n summary_dict[brandName]['creators_profile'] = creators.slice(0, 4);\n } else if (creators.length == 0) {\n summary_dict[brandName]['creators_profile'] = ytCreators.slice(0, 4);\n } else if (creators.length == 1) {\n summary_dict[brandName]['creators_profile'] = creators.concat(ytCreators.slice(0, 3));\n } else if (ytCreators.length == 1) {\n summary_dict[brandName]['creators_profile'] = ytCreators.concat(creators.slice(0, 3));\n } else {\n summary_dict[brandName]['creators_profile'] = creators.slice(0, 2).concat(ytCreators.slice(0, 2));\n }\n let resp_data = await fetchInstaPostsOverTime(results[index].ig_handle, start_date, end_date, '', '');\n if (!summary_dict['posts_over_time_labels']) {\n summary_dict['posts_over_time_labels'] = {};\n }\n for (var i=0;i{\n if (budget < parseFloat(each.budget)) {\n budget = parseFloat(each.budget);\n maxBudget = each;\n }\n })\n setMaxBugetObj(maxBudget);\n } else {\n loadSummaryData(results, index+1, summary_dict, totalViews, totalEng);\n }\n }\n }\n\n const camelCase = (str) => {\n if ((str === null) || (str === ''))\n return false;\n else\n str = str.toString();\n \n return str.replace(/\\w\\S*/g,\n function (txt) {\n return txt.charAt(0).toUpperCase() +\n txt.substr(1).toLowerCase();\n });\n }\n\n const getYMD = (date1, date2) => {\n const a = moment(date1);\n const b = moment(date2);\n var days = a.diff(b, 'days') + 1;\n // var years = a.diff(b, 'year');\n // b.add(years, 'years');\n \n // // const noOfDaysInb = b.daysInMonth();\n // // const noOfDaysIna = a.daysInMonth();\n // let months = 0;\n // months = a.diff(b, 'months');\n // b.add(months, 'months');\n // var days = a.diff(b, 'days') + 1;\n // let days_string = \"\";\n // if (months > 0) {\n // days_string += `${months} months`\n // if (days > 0) {\n // days_string += ` ${days} days`\n // }\n // } else {\n // if (days > 0) {\n // days_string += `${days} days`\n // }\n // }\n return `${days} days`;\n }\n\n const getInfluencerType = (followers) => {\n if (followers >= 200 && followers <= 2000) {\n return \"Normal User\";\n } if (followers >= 2000 && followers <= 9999) {\n return \"Nano Influencer\";\n } else if (followers >= 10000 && followers <= 99999) {\n return \"Micro Influencer\";\n } else if (followers >= 100000 && followers <= 999999) {\n return \"Macro Influencer\";\n } else if (followers >= 1000000) {\n return \"Mega Influencer\"\n }\n return \"Influencer\"\n }\n \n return (\n \n
\n \n \n \n \n \n \n {camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')} Competition Analysis report \n \n \n {\n const input = pdfRef.current;\n html2canvas(input, {\n allowTaint : false,\n useCORS: true\n }).then((canvas)=>{\n var imgWidth = 210;\n var pageHeight = 290;\n var imgHeight = canvas.height * imgWidth / canvas.width;\n var heightLeft = imgHeight;\n\n\n var doc = new jsPDF('p', 'mm');\n var position = 0;\n var pageData = canvas.toDataURL('image/jpeg', 1.0);\n var imgData = encodeURIComponent(pageData);\n doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n doc.setLineWidth(0);\n doc.setDrawColor(255, 255, 255);\n doc.rect(0, 0, 210, 290);\n heightLeft -= pageHeight;\n\n while (heightLeft >= 0) {\n position = heightLeft - imgHeight;\n doc.addPage();\n doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);\n doc.setLineWidth(0);\n doc.setDrawColor(255, 255, 255);\n doc.rect(0, 0, 210, 290);\n heightLeft -= pageHeight;\n }\n doc.save(camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')+' Competion Analysis report.pdf');\n })\n \n }}>Analysis Date: {moment(start_date).format('Do MMM')} - {moment(end_date).format('Do MMM')} ({getYMD(end_date, start_date)}) \n\n \n \n \n \n Objective: To evaluate the effectiveness of influencer marketing campaigns implemented by {camelCase(competitor_brands && competitor_brands.length > 0 ? competitor_brands && competitor_brands[0].title :'')} and competitor brands by identifying the top content and Influencers \n \n
\n
Summary
\n
Posts
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Mega Influencers (1M - 27M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['mega'] && summary[each.title]['mega'].count) || \"-\"} \n })\n }\n \n \n Macro Influencers (100K - 1M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['macro'] && summary[each.title]['macro'].count) || \"-\"} \n })\n }\n \n \n Micro Influencers (10K - 100K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['micro'] && summary[each.title]['micro'].count) || \"-\"} \n })\n }\n \n \n Nano Influencers (2K - 10K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['nano'] && summary[each.title]['nano'].count) || \"-\"} \n })\n }\n \n \n Normal Users (200 - 2K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['normal'] && summary[each.title]['normal'].count) || \"-\"} \n })\n }\n \n \n Total Posts \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].count) || \"-\"} \n })\n }\n \n \n
\n
Influencers
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Mega Influencers (1M - 27M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['mega'] && summary[each.title]['mega'].creators) || \"-\"} \n })\n }\n \n \n Macro Influencers (100K - 1M) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['macro'] && summary[each.title]['macro'].creators) || \"-\"} \n })\n }\n \n \n Micro Influencers (10K - 100K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['micro'] && summary[each.title]['micro'].creators) || \"-\"} \n })\n }\n \n \n Nano Influencers (2K - 10K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['nano'] && summary[each.title]['nano'].creators) || \"-\"} \n })\n }\n \n \n Normal Users (200 - 2K) \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['normal'] && summary[each.title]['normal'].creators) || \"-\"} \n })\n }\n \n \n Total Influencers \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].creators) || \"-\"} \n })\n }\n \n \n
\n
\n
\n \n
\n
Channel Wise Influencer Split
\n
\n \n \n \n {\n competitor_brands && competitor_brands.map((each, index)=>{\n if (index == 0) {\n return {camelCase(each.title)} \n } \n return {each.title} \n })\n }\n \n \n \n \n Instagram \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['instagram'] && summary[each.title]['instagram'].creators) || \"-\"} \n })\n }\n \n \n Youtube \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title]['youtube'] && summary[each.title]['youtube'].creators) || \"-\"} \n })\n }\n \n \n Total \n {\n competitor_brands && competitor_brands.map(each=>{\n return {(summary[each.title] && summary[each.title].creators) || \"-\"} \n })\n }\n \n \n
\n
\n
\n
ESTIMATED BUDGETS BEING SPENT BY BRANDS (IN LAKHS)
\n
\n
\n { return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return parseFloat(each.budget) }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n />\n
\n
\n
{maxBugetObj.budget} Lakhs
\n
The highest budget being spent by {maxBugetObj.title}
\n
\n
\n
\n Please note: Estimated budget based on Fair Price Index of Influencer.in and may differ from actual spends\n
\n
\n
\n
\n
Campaign Performance by Views
\n
{ return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return summary[each.title] && summary[each.title].view_count }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n /> \n \n
\n
Campaign Performance by Engagement Percentage %
\n
{ return each.title }),\n datasets: [\n {\n label: '',\n data: (competitor_brands && competitor_brands.map(each=>{ return summary[each.title] && summary[each.title].engagement__rate }) || []),\n backgroundColor: '#00218d',\n },\n ],\n }}\n options={{\n indexAxis: 'y'\n }}\n /> \n \n
\n {\n competitor_brands && competitor_brands.map((each, index)=>{\n return
\n
\n
{each.title} - Top Content by Views
\n
\n {\n summary[each.title] && summary[each.title]['posts'] && summary[each.title]['posts'].map(each=>{\n let isYoutube = 'yt_thumnail_url' in each;\n return
\n
\n
\n \n \n \n \n \n \n
\n
\n
\n
{each.caption || each.title} \n
\n {\n updateProfileData({\n handle: each.creator_details.id,\n brand_id: brand_id,\n profile_type: \"channel_id\" in each ? 'youtube' : 'instagram', \n })\n }}\n variant=\"outlined\" \n style={{\n background: '#1E9CB2',\n borderColor: '#1E9CB2',\n marginRight: '10px',\n color: 'white',\n marginTop: '5px',\n }}>Update Profile \n {\n updatePostData({\n post_id: each.id,\n post_type: isYoutube ? 'youtube' : 'instagram',\n })\n }}\n variant=\"outlined\" \n style={{\n background: '#1E9CB2',\n borderColor: '#1E9CB2',\n marginRight: '10px',\n color: 'white',\n marginTop: '5px',\n }}>Update Post \n
\n
\n
\n
\n
\n {each.creator_details.name}\n
Post Link: {isYoutube ? `https://www.youtube.com/watch?v=${each.video_id}/` : `https://www.instagram.com/p/${each.shortcode}`}
\n
\n
{countertostring(each.creator_details.followers)} ({getInfluencerType(each.creator_details.followers)})
\n
\n
\n
\n
\n
\n {countertostring(each.view_count)}\n
\n
\n \n {countertostring(each.likes_count)}\n
\n
\n
\n {countertostring(each.comments_count)}\n
\n
\n
\n {parseFloat(each.new_engagement_rate || \n calculateEngagementRate(each.likes_count, each.comments_count, 0, each.view_count)).toFixed(2)}\n
\n
\n
\n })\n }\n
\n })\n }\n
\n\n
\n {\n competitor_brands && competitor_brands.map((each, index)=>{\n return
\n
\n
{index == 0 ? 'Top' : 'Same'} influencer partnered {index == 0 ? '' : 'with competitor'} - {each.title}
\n
\n
\n {\n summary[each.title] && summary[each.title]['creators_profile'] && summary[each.title]['creators_profile'].map(each=>{\n return
\n
{\"channel_id\" in each ? each.display_name : '-'}
\n
\n \n \n \n \n \n \n
\n
\n {\"channel_id\" in each ? each.name : each.handle}\n
\n
\n {countertostring(each.followers)}\n
\n
\n
{\n updateProfileData({\n handle: each.handle,\n brand_id: brand_id,\n profile_type: \"channel_id\" in each ? 'youtube' : 'instagram', \n })\n }}\n variant=\"outlined\" \n style={{\n background: '#1E9CB2',\n borderColor: '#1E9CB2',\n marginRight: '10px',\n color: 'white',\n marginTop: '5px',\n cursor: 'pointer'\n }}>Update Profile \n
\n })\n }\n {\n summary[each.title] ? summary[each.title]['creators_profile'] && summary[each.title]['creators_profile'].length > 0 ?\n null :
No data available to show
: null\n }\n
\n
\n })\n }\n
\n
\n
\n {\n return new Date(a) - new Date(b);\n }),\n datasets: competitor_brands && competitor_brands.map((each, index)=>{\n return {\n label: each.title,\n data: Object.keys(summary['posts_over_time_labels'] || {}).sort((a, b)=>{\n return new Date(a) - new Date(b);\n }).map(each_month=>{\n return (summary[each.title] && summary[each.title]['post_count'] && summary[each.title]['post_count'][each_month]) || 0\n }),\n fill: false,\n backgroundColor: colourPalette[index],\n borderColor: colourPalette[index],\n }})\n }}\n options={{\n indexAxis: 'x',\n scales: {\n y: {\n beginAtZero: true\n }\n }\n }}\n />\n
\n
\n
\n
Thank You
\n
In case of any queries please reach us at enquiry@influencer.in
\n
\n
\n\n
\n
\n \n
\n );\n}\n\nconst styles = (theme) => ({\n header: {\n color: '#4A4A4A',\n fontSize: '30px',\n textAlign: 'left',\n fontFamily: 'Nunito Sans',\n fontWeight: 700,\n lineHeight: 1.167,\n letterSpacing: '0.03em',\n padding: '15px',\n background: '#F3F4FE',\n boxShadow: '0px 4px 20px rgba(170, 170, 170, 0.25)',\n borderRadius: '10px',\n marginBottom: '0px',\n marginTop: '20px',\n marginLeft: '27px',\n marginRight: '40px',\n textAlign: 'center'\n },\n image: {\n height: 220,\n width: 220,\n borderRadius: 20,\n marginTop: 10,\n textAlign: 'center',\n cursor: 'pointer',\n },\n});\n\nexport default withStyles(styles)(CompetitorReportAnalysisUI);","import { styled } from '@mui/material/styles';\n\nconst AuthWrapper1 = styled('div')(({ theme }) => ({\n background: '#424346',\n minHeight: '100vh',\n overflowY: 'scroll'\n}));\n\nexport default AuthWrapper1;","import PropTypes from 'prop-types';\n\nimport Box from '@mui/material/Box';\n\nimport MainCard from 'ui-component/cards/MainCard';\nimport zIndex from '@material-ui/core/styles/zIndex';\n\nconst AuthCardWrapper = ({ children, ...other }) => (\n *': {\n flexGrow: 1,\n flexBasis: '50%'\n }\n }}\n content={false}\n {...other}\n >\n {children} \n \n);\n\nAuthCardWrapper.propTypes = {\n children: PropTypes.node\n};\n\nexport default AuthCardWrapper;","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useTheme } from '@mui/material/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Divider from '@mui/material/Divider';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport InputLabel from '@mui/material/InputLabel';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport { authHandlers } from 'api_handlers/auth';\nimport YoutubeLogin from 'components/auth/YoutubeLogin';\n\nimport mixpanel from 'mixpanel-browser';\n\nconst AuthLogin = ({ goToDiscover, showDomainInvalidModal, goToForgotPassword, ...others }) => {\n const theme = useTheme();\n\n const login = (e) => {\n e.preventDefault();\n setErrors('');\n setEmailError(false);\n setPasswordError(false);\n let isValidationError = false;\n if (!(email && email.length > 0)) {\n setEmailError(true);\n isValidationError = true;\n }\n if (!(password && password.length > 0)) {\n setPasswordError(true);\n isValidationError = true;\n }\n if (isValidationError) {\n return;\n }\n setIsSubmitting(true);\n const resp = authHandlers.login({\n email: email,\n password: password,\n user_type: 'brand',\n });\n\n resp.then(async (response) => {\n setIsSubmitting(false);\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n const user = {\n first_name: userData.first_name,\n last_name: userData.last_name,\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Sign-in\");\n }\n goToDiscover();\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const errors = await response.json();\n setErrors(errors);\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n });\n }\n\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState(false);\n const [errors, setErrors] = useState('');\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const handleClickShowPassword = () => {\n setShowPassword(!showPassword);\n };\n\n const handleMouseDownPassword = (event) => {\n event.preventDefault();\n };\n \n const registerToBackendYoutube = async(data) => {\n const resp_data = await authHandlers.youtubeBrandLogin(data);\n if (resp_data.error && resp_data.error === 'Please provide valid brand email') {\n showDomainInvalidModal();\n } else if (resp_data.user) {\n goToDiscover();\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Sign-in\");\n }\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n }\n\n return (\n <>\n \n >\n );\n};\n\nexport default AuthLogin;","import { Link } from 'react-router-dom';\n\nimport Divider from '@mui/material/Divider';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport AuthWrapper1 from './AuthWrapper1';\nimport AuthCardWrapper from './AuthCardWrapper';\nimport AuthLogin from './authentication/auth-forms/AuthLogin';\nimport AuthFooter from 'ui-component/cards/AuthFooter';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\n\nconst Login = ({ goToDiscover, toggleLogin, goToForgotPassword, showDomainInvalidModal }) => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n\n return (\n \n
\n \n \n \n { window.matchMedia('(min-width: 768px)').matches ?
: null }\n \n \n \n \n \n \n \n \n \n \n \n \n \n Hi, Welcome Back\n \n \n Enter your credentials to continue\n \n \n \n \n \n \n \n \n \n \n \n \n {\n toggleLogin();\n }}>\n \n Don't have an account?\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Login;","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useTheme } from '@mui/material/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Divider from '@mui/material/Divider';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport InputLabel from '@mui/material/InputLabel';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport { authHandlers } from 'api_handlers/auth';\nimport YoutubeLogin from 'components/auth/YoutubeLogin';\n\nimport mixpanel from 'mixpanel-browser';\n\nconst AuthSignup = ({ goToDiscover, showDomainInvalidModal, ...others }) => {\n const theme = useTheme();\n\n const [name, setName] = useState('');\n const [nameError, setNameError] = useState(false);\n const [confirmPassword, setConfirmPassword] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState(false);\n const [number, serNumber] = useState('');\n const [numberError, setNumberError] = useState(false);\n const [websiteUrl, setWebsiteUrl] = useState('');\n const [websiteUrlError, setWebsiteUrlError] = useState(false);\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState(false);\n const [errors, setErrors] = useState('');\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const handleClickShowConfirmPassword = () => {\n setShowConfirmPassword(!showConfirmPassword);\n };\n\n const handleMouseDownConfirmPassword = (event) => {\n event.preventDefault();\n };\n const handleClickShowPassword = () => {\n setShowPassword(!showPassword);\n };\n\n const handleMouseDownPassword = (event) => {\n event.preventDefault();\n };\n\n const signUp = (e) => {\n e.preventDefault();\n setErrors('');\n setEmailError(false);\n setPasswordError(false);\n setNameError(false);\n setNumberError(false);\n setWebsiteUrlError(false);\n let isValidationError = false;\n if (!(email && email.length > 0)) {\n setEmailError(true);\n isValidationError = true;\n }\n if (!(password && password.length > 0)) {\n setPasswordError(true);\n isValidationError = true;\n }\n if (!(number && number.length > 0)) {\n setNumberError(true);\n isValidationError = true;\n }\n if (!(name && name.length > 0)) {\n setNameError(true);\n isValidationError = true;\n }\n if (!(websiteUrl && websiteUrl.length > 0)) {\n setWebsiteUrlError(true);\n isValidationError = true;\n }\n if (!(confirmPassword && confirmPassword.length > 0)) {\n setConfirmPasswordError(true);\n isValidationError = true;\n }\n if (confirmPassword !== password) {\n setConfirmPasswordError(true);\n isValidationError = true;\n }\n if (isValidationError) {\n return\n }\n let isValidEmail = true;\n let personalDomain = [\"gmail.com\",\"yahoo.com\",\"outlook.com\",\"protonmail.com\",\"aol.com\",\"zoho.com\",\"icloud.com\",\"gmx.com\",\"yandex.com\",\"mail.com\",\"google.com\"]\n personalDomain.map(each=>{\n console.log(isValidEmail && email.indexOf(each) > -1);\n if (isValidEmail && email.indexOf(each) > -1) {\n isValidEmail = false;\n }\n })\n if (!isValidEmail) {\n showDomainInvalidModal();\n setErrors({ 'non_field_errors': ['Please Enter Valid Domain'] });\n return;\n }\n setIsSubmitting(true);\n let data = {\n email,\n password,\n user_type: 'brand',\n };\n data.brand = {\n name,\n website_url: websiteUrl.startsWith('www.') ? 'https://' + websiteUrl : websiteUrl,\n phone_number: number.indexOf('+') === -1 ? '+91'+number : number\n };\n const resp = authHandlers.signUp(data);\n resp.then(async (response) => {\n setIsSubmitting(false);\n if ([200, 201].includes(response.status)) {\n const userData = await response.json();\n localStorage.setItem('access', userData.access);\n localStorage.setItem('refresh', userData.refresh);\n const user = {\n first_name: userData.first_name,\n last_name: userData.last_name,\n email: userData.email,\n user_type: userData.user_type,\n influencer: userData.influencer,\n brand: userData.brand,\n };\n localStorage.setItem('user', JSON.stringify(user));\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Sign-up\");\n }\n goToDiscover();\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const errors = await response.json();\n setErrors(errors);\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n });\n }\n\n const registerToBackendYoutube = async(data) => {\n const resp_data = await authHandlers.youtubeBrandLogin(data);\n if (resp_data.error && resp_data.error === 'Please provide valid brand email') {\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Google_signup\", {\n 'type': 'unsuccessful'\n });\n }\n showDomainInvalidModal();\n } else if (resp_data.user) {\n if (process.env.NODE_ENV === \"production\") {\n mixpanel.track(\"Google_signup\", {\n 'type': 'successful'\n });\n }\n goToDiscover();\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n }\n\n return (\n <>\n \n >\n );\n};\n\nexport default AuthSignup;","import { Link } from 'react-router-dom';\n\nimport Divider from '@mui/material/Divider';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport AuthWrapper1 from './AuthWrapper1';\nimport AuthCardWrapper from './AuthCardWrapper';\nimport AuthSignup from './authentication/auth-forms/AuthSignup';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\n\nconst Login = ({ goToDiscover, toggleLogin, showDomainInvalidModal }) => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n\n return (\n \n
\n \n \n \n { window.matchMedia('(min-width: 768px)').matches ?
: null }\n \n \n \n \n \n \n \n \n \n \n \n \n \n Sign Up as a Business\n \n \n \n \n \n \n \n \n \n \n \n \n {\n toggleLogin();\n }}>\n \n Already have an account?\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Login;","export default __webpack_public_path__ + \"static/media/Google-Play-Logo-PNG.ce32d165.png\";","export default __webpack_public_path__ + \"static/media/Apple-AppStore-logo.cf0dcd5f.png\";","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useTheme } from '@mui/material/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Divider from '@mui/material/Divider';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport InputLabel from '@mui/material/InputLabel';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport { authHandlers } from 'api_handlers/auth';\n\n\nconst AuthResetPassword = ({ goToDiscover, showDomainInvalidModal, goToForgotPassword, ...others }) => {\n const theme = useTheme();\n\n const [email, setEmail] = useState('');\n const [emailError, setEmailError] = useState(false);\n const [errors, setErrors] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [emailSent, isEmailSent] = useState(false);\n\n const handleMouseDownPassword = (event) => {\n event.preventDefault();\n };\n \n const forgotPassword = (e) => {\n e.preventDefault();\n let isValidationError = false;\n if (!(email && email.length > 0)) {\n setEmailError(true);\n isValidationError = true;\n }\n if (isValidationError) {\n return;\n }\n setIsSubmitting(true);\n isEmailSent(false);\n authHandlers.resetPassword({email})\n .then(async (response) => {\n if ([200, 201].includes(response.status)) {\n isEmailSent(true);\n } else if ([400, 401, 402, 403].includes(response.status)) {\n const data = await response.json();\n setErrors({ 'non_field_errors': [data.message] });\n setIsSubmitting(false);\n } else {\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n setIsSubmitting(false);\n }\n })\n .catch((e)=>{\n setIsSubmitting(false);\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n });\n }\n\n return (\n <>\n \n >\n );\n};\n\nexport default AuthResetPassword;","import { Link } from 'react-router-dom';\n\nimport Divider from '@mui/material/Divider';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport AuthWrapper1 from './AuthWrapper1';\nimport AuthCardWrapper from './AuthCardWrapper';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport AuthForgotPassword from './authentication/auth-forms/AuthForgotPassword';\n\nconst ForgotPassword = ({ goToLogin }) => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n\n return (\n \n
\n \n \n \n { window.matchMedia('(min-width: 768px)').matches ?
: null }\n \n \n \n \n \n \n \n \n \n \n \n \n \n Forgot password?\n \n \n Enter your email address below and we'll send reset link to that email.\n \n \n \n \n \n \n \n \n \n \n \n \n {\n goToLogin();\n }}>\n \n Already have an account?\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default ForgotPassword;","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { useTheme } from '@mui/material/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport Checkbox from '@mui/material/Checkbox';\nimport Divider from '@mui/material/Divider';\nimport FormControl from '@mui/material/FormControl';\nimport FormControlLabel from '@mui/material/FormControlLabel';\nimport FormHelperText from '@mui/material/FormHelperText';\nimport Grid from '@mui/material/Grid';\nimport IconButton from '@mui/material/IconButton';\nimport InputAdornment from '@mui/material/InputAdornment';\nimport InputLabel from '@mui/material/InputLabel';\nimport OutlinedInput from '@mui/material/OutlinedInput';\nimport Typography from '@mui/material/Typography';\nimport Stack from '@mui/material/Stack';\n\nimport Visibility from '@mui/icons-material/Visibility';\nimport VisibilityOff from '@mui/icons-material/VisibilityOff';\nimport { authHandlers } from 'api_handlers/auth';\n\n\nconst AuthResetPassword = ({ uid, token, ...others }) => {\n const theme = useTheme();\n\n const [errors, setErrors] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [password, setPassword] = useState('');\n const [passwordError, setPasswordError] = useState(false);\n const [confirmPassword, setConfirmPassword] = useState('');\n const [confirmPasswordError, setConfirmPasswordError] = useState(false);\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [passwordResetConfirmed, isPasswordResetConfirmed] = useState(false);\n \n\n const handleMouseDownPassword = (event) => {\n event.preventDefault();\n };\n \n const resetPassword = (e) => {\n e.preventDefault();\n setPasswordError(false);\n isPasswordResetConfirmed(false);\n let isValidationError = false;\n if (!(password && password.length > 0)) {\n setPasswordError(true);\n isValidationError = true;\n }\n if (!(confirmPassword && confirmPassword.length > 0)) {\n setConfirmPasswordError(true);\n isValidationError = true;\n }\n if (confirmPassword !== password) {\n setConfirmPasswordError(true);\n isValidationError = true;\n }\n if (isValidationError) {\n return\n }\n setIsSubmitting(true);\n authHandlers.confirmResetPassword(uid, token, {new_password: password})\n .then(async (response) => {\n if ([200, 201].includes(response.status)) {\n isPasswordResetConfirmed(true);\n } else if ([400, 401, 402, 403].includes(response.status)) {\n setIsSubmitting(false);\n const data = await response.json();\n setErrors({ 'non_field_errors': [data.message] });\n } else {\n setIsSubmitting(false);\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n }\n })\n .catch((e)=>{\n setIsSubmitting(false);\n setErrors({ 'non_field_errors': ['Please Try Again'] });\n });\n }\n\n const handleClickShowPassword = () => {\n setShowPassword(!showPassword);\n };\n \n const handleClickShowConfirmPassword = () => {\n setShowConfirmPassword(!showConfirmPassword);\n };\n\n const handleMouseDownConfirmPassword = (event) => {\n event.preventDefault();\n };\n\n return (\n <>\n \n >\n );\n};\n\nexport default AuthResetPassword;","import { Link } from 'react-router-dom';\n\nimport Divider from '@mui/material/Divider';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Typography from '@mui/material/Typography';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport AuthWrapper1 from './AuthWrapper1';\nimport AuthCardWrapper from './AuthCardWrapper';\nimport InfluencerLogo from '../../assets/influencer-logo.png';\nimport AuthResetPassword from './authentication/auth-forms/AuthResetPassword';\n\nconst ResetPassword = ({ goToLogin, uid, token }) => {\n const downMD = useMediaQuery((theme) => theme.breakpoints.down('md'));\n\n return (\n \n
\n \n \n \n { window.matchMedia('(min-width: 768px)').matches ?
: null }\n \n \n \n \n \n \n \n \n \n \n \n \n \n Reset password?\n \n \n Enter your new password.\n \n \n \n \n \n \n \n \n \n \n \n \n {\n goToLogin();\n }}>\n \n Already have an account?\n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default ResetPassword;","import React, { Component } from 'react';\nimport { Box } from '@mui/material';\nimport { connect } from 'react-redux';\nimport qs from 'qs';\n\nimport ThemeCustomization from 'themes';\nimport { createTheme } from '@mui/material/styles';\n\nimport 'assets/scss/style.scss';\nimport { Button, Grid, TextField, Typography } from '@material-ui/core';\nimport Footer from 'components/auth/Footer';\n\nimport { authHandlers } from '../../api_handlers/auth';\nimport ErrorDisplay from '../influencers/forms/ErrorDisplay';\nimport Login from './Login';\nimport Signup from './Signup';\nimport google from '../../assets/Google-Play-Logo-PNG.png';\nimport apple from '../../assets/Apple-AppStore-logo.png';\n\nimport { styled } from '@mui/material/styles';\nimport Dialog from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton';\nimport ForgotPassword from './ForgotPassword';\nimport ResetPassword from './ResetPassword';\n\nconst theme = createTheme();\n\nconst BootstrapDialog = styled(Dialog)(({ theme }) => ({\n '& .MuiDialogContent-root': {\n padding: theme.spacing(2),\n },\n '& .MuiDialogActions-root': {\n padding: theme.spacing(1),\n },\n}));\n\nclass LoginSignupV2 extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n login: true,\n forgotPassword: false,\n confirmResetPassword: false,\n user_type: 'brand',\n passwordOk: true,\n showDomainInvalid: false,\n uid: '',\n token: '',\n };\n }\n\n componentDidMount() {\n if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'brand'\n ) {\n this.props.history.push('/planner/discover');\n } else if (\n localStorage.getItem('access') &&\n JSON.parse(localStorage.getItem('user')).user_type == 'influencer'\n ) {\n this.props.history.push('/influencer');\n }\n\n const queryParams = qs.parse(this.props.location.search.replace('?', ''));\n if (queryParams.t === 'brand-signup') {\n this.setState({\n login: false,\n });\n }\n if (queryParams.t === 'brand-login') {\n this.setState({\n login: true,\n });\n }\n const url_attr = this.props.location.pathname.split('/');\n console.log(url_attr);\n if (url_attr[2] != 'undefined') {\n if (url_attr[1] === 'signup') {\n this.setState({\n login: false,\n });\n }\n if (url_attr[1] === 'login') {\n this.setState({\n login: true,\n });\n }\n if (url_attr[1] === 'forgot-password') {\n this.setState({\n forgotPassword: true,\n });\n }\n if (url_attr[1] === 'password-reset-confirm') {\n this.setState({\n confirmResetPassword: true,\n uid: url_attr[2],\n token: url_attr[3],\n });\n }\n }\n }\n\n toggleLogin = () => {\n if (this.state.login) {\n this.props.history.push('/signup');\n } else {\n this.props.history.push('/login');\n }\n };\n\n render() {\n return (\n \n {this.state.confirmResetPassword ? (\n {\n this.props.history.push('/login');\n }}\n uid={this.state.uid}\n token={this.state.token}\n />\n ) : this.state.forgotPassword ? (\n {\n this.props.history.push('/login');\n }}\n />\n ) : this.state.login ? (\n {\n this.setState({ showDomainInvalid: true });\n }}\n toggleLogin={this.toggleLogin}\n goToForgotPassword={() => {\n this.props.history.push('/forgot-password');\n }}\n goToDiscover={() => {\n localStorage.removeItem('popUpAppearance');\n localStorage.setItem('extension', parseInt(1));\n this.props.history.push('/planner/discover');\n }}\n />\n ) : (\n {\n this.setState({ showDomainInvalid: true });\n }}\n toggleLogin={this.toggleLogin}\n goToDiscover={() => {\n localStorage.removeItem('popUpAppearance');\n localStorage.setItem('extension', parseInt(1));\n this.props.history.push('/planner/discover');\n }}\n />\n )}\n {this.state.showDomainInvalid ? (\n \n {\n this.setState({ showDomainInvalid: false });\n }}\n aria-labelledby=\"customized-dialog-title\"\n open={true}\n fullWidth\n >\n \n {\n this.setState({ showDomainInvalid: false });\n }}\n sx={{\n position: 'absolute',\n right: 8,\n top: 8,\n }}\n >\n \n \n \n \n \n \n \n Oops! It looks like there's an issue with your email domain\n \n . Our dashboard is designed for brands only. If you're an influencer, you can{' '}\n sign up on our mobile app instead.\n \n \n \n \n {\n window.open(\n 'https://play.google.com/store/apps/details?id=in.influencer',\n '_blank',\n );\n }}\n >\n \n \n\n {\n window.open(\n 'https://apps.apple.com/in/app/influencer-in/id1640001193',\n '_blank',\n );\n }}\n >\n \n \n \n \n \n \n For any assistance, feel free to reach out at{' '}\n Enquiry@influencer.in , and we'll be happy\n to help!{' '}\n \n \n \n \n \n \n ) : null}\n \n );\n }\n}\n\nconst mapStateToProps = (state) => ({});\n\nexport default connect(mapStateToProps, {})(LoginSignupV2);\n","import React from 'react';\nimport { Redirect, Route, Switch } from 'react-router-dom';\nimport { PrivateRoute } from './customRoutes/ProtectedRoutes';\n\nimport { ThemeProvider } from '@material-ui/core';\nimport theme from './theme';\n\nimport InstagramCallback from './components/auth/InstagramCallback';\nimport AwardBannerPage from './components/award/BannerPage';\nimport BrandRoutes from './components/brands/Routes';\nimport InfluencerRoutes from './components/influencers/Routes';\nimport ComingSoon from './components/ux/ComingSoon';\nimport LoginWrapper from './pages/LoginPage/LoginWrapper';\nimport MobilePriceIndexWrapper from './pages/PriceIndex/MobilePriceIndexWrapper';\nimport MobilePriceIndexDemoWrapper from './pages/PriceIndexDemo/MobilePriceIndexDemoWrapper';\n\nimport Planner from 'components/Planner';\nimport PlannerV2 from 'components/PlannerV2/Index.jsx';\n\nimport CompetitorsInsights from './components/CompetitorsInsights/Index';\nimport YTDetailInsights from 'components/DetailedInsights/ytDetailedInsights';\nimport InstagramDetailInsights from 'components/DetailedInsights/DetailedInsights';\nimport Discovery from './components/Discovery';\nimport CompetitorReportAnalysis from 'components/CompetitorReportAnalysis';\nimport CompetitorReportAnalysisUI from 'components/CompetitorReportAnalysisUI';\nimport InfluencerInsight from 'components/PlannerV2/components/InfluencerInsight';\n\nimport LoginSignupV2 from 'components/LoginSignupV2/Index.jsx';\n\n\nclass AppRouter extends React.Component {\n render() {\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 \n \n \n \n \n \n \n \n \n \n );\n }\n componentDidMount() {\n document.title = 'Influencer.in';\n }\n}\n\nexport default AppRouter;\n","import { Provider } from 'react-redux';\nimport { BrowserRouter } from 'react-router-dom';\nimport './App.css';\n\nimport AppRouter from './Routes';\nimport store from './store';\n\nimport mixpanel from 'mixpanel-browser'; \n\nif (process.env.NODE_ENV === \"production\") {\n mixpanel.init('ffef6e2ce617a23d1c2ae8722e17963a', {debug: false, track_pageview: true, persistence: 'localStorage', record_sessions_percent: 100});\n const user = JSON.parse(localStorage.getItem('user'));\n if (user && user.email) {\n mixpanel.identify(user.email);\n mixpanel.people.set('$email', user.email)\n }\n}\n\nfunction App() {\n return (\n \n \n \n );\n}\n\nexport default App;\n","const reportWebVitals = (onPerfEntry) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nimport 'react-date-range/dist/styles.css'; // react-date-range main style file\nimport 'react-date-range/dist/theme/default.css'; // treact-date-range heme css file\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root'),\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n","export const constants = {\n UPDATE_FILTER: 'UPDATE_FILTER',\n RESET_FILTER: 'RESET_FILTER',\n GET_INFLUENCER_REQUEST: 'GET_INFLUENCER_REQUEST',\n GET_INFLUENCER_SUCCESS: 'GET_INFLUENCER_SUCCESS',\n GET_INFLUENCER_FAILURE: 'GET_INFLUENCER_FAILURE',\n};\n","export const authConstants = {\n LOGIN_REQUEST: 'LOGIN_REQUEST',\n LOGIN_SUCCESS: 'LOGIN_SUCCESS',\n LOGIN_FAILURE: 'LOGIN_FAILURE',\n SIGN_UP_REQUEST: 'SIGN_UP_REQUEST',\n SIGN_UP_SUCCESS: 'SIGN_UP_SUCCESS',\n SIGN_UP_FAILURE: 'SIGN_UP_FAILURE',\n STORE_USER_DATA: 'STORE_USER_DATA',\n};\n"],"sourceRoot":""}