(null)\n const [eventoInputValue, setEventoInputValue] = useState('')\n const [showPastEvents, setShowPastEvents] = useState(false)\n const { eventoId } = useParams<{ eventoId: string }>()\n\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const {\n data: events,\n isLoading: isLoadingEvents,\n isFetching: isFetchingEvents\n } = useEvents(estabelecimentoId, showPastEvents, isMobile)\n\n useEffect(() => {\n //? função executada para buscar o evento o qual esta na url (?eventoId=)\n //? se não existir evento na url não faz nada\n\n if (eventoId && Number(eventoId) > 0) {\n const event =\n events &&\n events.length > 0 &&\n events.find((e) => e.id === Number(eventoId))\n //? se encontrar o evento na url, seta o evento selecionado,\n //? se não encontrar, troca a o estado showPastEvents para true,\n //? pois o evento informado pode ser um evento passado, e não existir na lista de eventos;\n //? com isso, a lista de evento efetua um novo fetch para buscar os eventos passados,\n //? e gera um novo efeito colateral caindo nesse useEffect novamente\n\n if (event) {\n setSelectedEvento(event)\n } else if (selectedEvento === null) {\n setShowPastEvents(!showPastEvents)\n }\n }\n }, [events, eventoId])\n\n useDidMountEffect(() => {\n if (selectedEvento && selectedEvento.id) {\n history.push(`/dashboard/${selectedEvento?.id}`)\n }\n }, [selectedEvento])\n\n useEffect(() => {\n if (!eventoId) {\n setSelectedEvento(null)\n setEventoInputValue('')\n }\n }, [eventoId])\n\n useEffect(() => {\n if (selectedEvento && selectedEvento.id) {\n if (eventoInputValue === '') {\n setEventoInputValue(\n selectedEvento.nome &&\n `${selectedEvento.nome} ${\n selectedEvento.dataHoraInicio\n ? ` - (${toLocalDateFormat(selectedEvento.dataHoraInicio)})`\n : ''\n }`\n )\n }\n }\n }, [selectedEvento])\n\n return (\n \n
\n {\n setSelectedEvento(newValue)\n if (reason === 'clear') {\n //? se o usuário clicar no botão limpar\n setEventoInputValue('')\n history.push('/dashboard')\n }\n }}\n getOptionLabel={(evento) =>\n evento.nome &&\n `${evento.nome} ${\n evento.dataHoraInicio\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\n : ''\n }`\n }\n placeholder=\"Filtrar por evento...\"\n onInputChange={(event, newInputValue) => {\n newInputValue !== null\n ? setEventoInputValue(newInputValue)\n : setEventoInputValue('')\n }}\n inputValue={eventoInputValue}\n renderInput={(params) => (\n \n {!isMobile && (\n \n <>\n {isFetchingEvents && (\n \n )}\n {\n setShowPastEvents(event.target.checked)\n }}\n checked={showPastEvents}\n size=\"small\"\n inputProps={{\n 'aria-label': 'Listar eventos encerrados'\n }}\n />\n {\n setShowPastEvents(!showPastEvents)\n }}\n />\n >\n \n )}\n {params.InputProps.endAdornment}\n >\n )\n }}\n />\n )}\n />\n \n
\n )\n}\n\nexport default SelectFilters\n","import React from 'react'\nimport {\n Card,\n CardContent,\n Grid,\n Typography,\n Avatar,\n makeStyles\n} from '@material-ui/core'\nimport ListAltTwoToneIcon from '@material-ui/icons/ListAltTwoTone'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\nimport { useParams } from 'react-router-dom'\nimport { useEventDashboard } from 'hooks-querys'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n ...constants.shadowCard\n },\n content: {\n alignItems: 'center',\n display: 'flex'\n },\n title: {\n fontWeight: 700\n },\n avatar: {\n backgroundColor: theme.palette.error.main,\n height: 46,\n width: 46\n },\n icon: {\n height: 22,\n width: 22\n },\n difference: {\n marginTop: theme.spacing(2),\n display: 'flex',\n alignItems: 'center'\n },\n differenceIcon: {\n color: theme.palette.success.dark\n },\n differenceValue: {\n color: theme.palette.success.dark,\n marginRight: theme.spacing(1)\n }\n}))\n\nconst PedidosPendentes = () => {\n const classes = useStyles()\n\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data, isFetching } = useEventDashboard(Number(eventoId))\n const { quantidadePedidosPendentes, valorPedidosPendentes } = data || {}\n\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n return (\n \n \n \n \n \n PEDIDOS PENDENTES\n \n \n {isFetching || !showValues ? (\n \n ) : (\n pluralize('PEDIDOS', quantidadePedidosPendentes, true)\n )}\n \n TOTALIZANDO \n \n {isFetching || !showValues ? (\n \n ) : (\n Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(valorPedidosPendentes || 0)\n )}\n \n \n \n \n \n \n \n \n {/* \n \n Desde de 1 de janeiro de 2020\n \n
*/}\n \n \n )\n}\n\nexport default PedidosPendentes\n","import React from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { Line } from 'react-chartjs-2'\nimport { makeStyles, useTheme } from '@material-ui/styles'\nimport { fade } from '@material-ui/core/styles/colorManipulator'\nimport { format, isValid } from 'date-fns'\nimport { ptBR } from 'date-fns/locale'\nconst useStyles = makeStyles(() => ({\n root: {\n position: 'relative'\n }\n}))\n\nconst Chart = (props) => {\n const { className, data: dataProp, ...rest } = props\n const { quantidade, valor, labels } = dataProp\n const classes = useStyles()\n const theme = useTheme()\n\n const data = (canvas) => {\n const ctx = canvas.getContext('2d')\n const gradient = ctx.createLinearGradient(0, 0, 0, 400)\n\n gradient.addColorStop(0, fade(theme.palette.secondary.main, 0.2))\n gradient.addColorStop(0.9, 'rgba(255,255,255,0)')\n gradient.addColorStop(1, 'rgba(255,255,255,0)')\n const gradientPrimary = ctx.createLinearGradient(0, 0, 0, 400)\n\n gradientPrimary.addColorStop(0, fade(theme.palette.primary.main, 0.2))\n gradientPrimary.addColorStop(0.9, 'rgba(255,255,255,0)')\n gradientPrimary.addColorStop(1, 'rgba(255,255,255,0)')\n\n return {\n datasets: [\n {\n label: 'Ingressos vendidos',\n yAxisID: 'A',\n data: quantidade,\n backgroundColor: gradient,\n borderColor: theme.palette.secondary.main,\n pointBorderColor: '#FFFFFF',\n pointBorderWidth: 2,\n pointRadius: 4,\n pointBackgroundColor: theme.palette.secondary.main\n },\n {\n label: 'Valor arrecadado',\n yAxisID: 'B',\n data: valor,\n backgroundColor: gradientPrimary,\n borderColor: theme.palette.primary.main,\n pointBorderColor: '#FFFFFF',\n pointBorderWidth: 2,\n pointRadius: 4,\n pointBackgroundColor: theme.palette.primary.main\n }\n ],\n labels\n }\n }\n\n const options = {\n responsive: true,\n maintainAspectRatio: false,\n //animation: false,\n legend: {\n display: false\n },\n layout: {\n padding: 0\n },\n scales: {\n xAxes: [\n {\n gridLines: {\n display: false,\n drawBorder: false\n },\n ticks: {\n padding: 20,\n fontColor: theme.palette.text.secondary,\n userCallback: function (value) {\n var isValidDate = isValid(new Date(value.replace(/-/g, '/')))\n return isValidDate\n ? format(new Date(value.replace(/-/g, '/')), 'dd/MM')\n : null\n }\n }\n // scaleLabel: {\n // display: true,\n // labelString: 'footer texto'\n // }\n }\n ],\n yAxes: [\n {\n id: 'A',\n gridLines: {\n borderDash: [2],\n borderDashOffset: [2],\n color: theme.palette.divider,\n drawBorder: false,\n zeroLineBorderDash: [2],\n zeroLineBorderDashOffset: [2],\n zeroLineColor: theme.palette.divider\n },\n ticks: {\n padding: 20,\n fontColor: theme.palette.text.secondary,\n beginAtZero: true,\n min: 0,\n maxTicksLimit: 7\n }\n },\n {\n id: 'B',\n ticks: {\n fontColor: theme.palette.text.secondary,\n beginAtZero: true,\n min: 0,\n callback: function (label) {\n return Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(label)\n }\n },\n gridLines: {\n borderDash: [2],\n borderDashOffset: [2],\n color: theme.palette.divider,\n drawBorder: false,\n zeroLineBorderDash: [2],\n zeroLineBorderDashOffset: [2],\n zeroLineColor: theme.palette.divider\n }\n }\n ]\n },\n tooltips: {\n enabled: true,\n mode: 'index',\n intersect: false,\n caretSize: 10,\n borderWidth: 1,\n borderColor: theme.palette.divider,\n backgroundColor: theme.palette.white,\n titleFontColor: theme.palette.text.primary,\n bodyFontColor: theme.palette.text.secondary,\n footerFontColor: theme.palette.text.secondary,\n callbacks: {\n title: function (tooltipItem, data) {\n var dateFormatted = format(\n new Date(\n data['labels'][tooltipItem[0]['index']].replace(/-/g, '/')\n ),\n \"dd 'de' MMMM 'de' yyyy'\",\n {\n locale: ptBR\n }\n )\n return dateFormatted\n },\n label: function (tooltipItems, data) {\n var dataset = data.datasets[tooltipItems.datasetIndex]\n if (dataset.yAxisID === 'A') {\n return `${dataset.label}: ${tooltipItems.yLabel}`\n } else {\n return `${dataset.label}: ${Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(tooltipItems.yLabel)}\n `\n }\n }\n }\n }\n }\n\n return (\n \n \n
\n )\n}\n\nChart.propTypes = {\n className: PropTypes.string,\n data: PropTypes.array.isRequired,\n labels: PropTypes.array.isRequired\n}\n\nexport default Chart\n","import React from 'react'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n makeStyles\n} from '@material-ui/core'\nimport { Chart } from './components'\nimport { Skeleton } from '@material-ui/lab'\nimport { useSelector } from 'react-redux'\nimport constants from 'theme/constants'\nimport { useParams } from 'react-router-dom'\nimport { useEventDashboard } from 'hooks-querys'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {},\n buttons: {\n display: 'flex',\n justifyContent: 'center',\n '& > *': {\n marginLeft: theme.spacing(1)\n }\n },\n inner: {\n height: 375,\n minWidth: 500\n },\n chart: {\n height: '100%'\n }\n}))\n\nconst GraficoVendasPorDia = () => {\n const classes = useStyles()\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data: queryData, isFetching } = useEventDashboard(Number(eventoId))\n\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n const { graficoIngressosDia } = queryData || {}\n const data = graficoIngressosDia\n ? {\n quantidade: graficoIngressosDia.series[0],\n valor: graficoIngressosDia.series[1],\n labels: graficoIngressosDia.options\n }\n : undefined\n\n return (\n \n \n \n \n \n \n {isFetching || !showValues ? (\n \n ) : (\n // @ts-ignore\n \n )}\n
\n \n \n \n )\n}\n\nexport default GraficoVendasPorDia\n","import React from 'react'\nimport {\n Card,\n CardContent,\n Grid,\n Typography,\n Avatar,\n LinearProgress,\n makeStyles\n} from '@material-ui/core'\nimport ConfirmationNumberTwoToneIcon from '@material-ui/icons/ConfirmationNumberTwoTone'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\nimport { useParams } from 'react-router-dom'\nimport { useEventDashboard } from 'hooks-querys'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n ...constants.shadowCard\n },\n content: {\n alignItems: 'center',\n display: 'flex'\n },\n title: {\n fontWeight: 700\n },\n avatar: {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n height: 46,\n width: 46\n },\n icon: {\n height: 22,\n width: 22\n },\n progress: {\n marginTop: theme.spacing(3),\n height: 5,\n borderRadius: 5\n }\n}))\n\nconst IngressosDisponiveis = () => {\n const classes = useStyles()\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data, isFetching } = useEventDashboard(Number(eventoId))\n const { quantidadeIngressosDisponiveis, quantidadeIngressosTotal } =\n data || {}\n\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n\n const percentage = () => {\n if (quantidadeIngressosTotal && quantidadeIngressosDisponiveis) {\n var total = quantidadeIngressosTotal\n var currentValue = quantidadeIngressosDisponiveis\n var percentage = parseFloat(((currentValue / total) * 100).toFixed(1))\n if (isNaN(percentage)) {\n return ' '\n } else {\n return percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n })\n }\n } else {\n return ' '\n }\n }\n return (\n \n \n \n \n \n INGRESSOS RESTANTES\n \n \n {isFetching || !showValues ? (\n \n ) : (\n pluralize('INGRESSOS', quantidadeIngressosDisponiveis, true)\n )}\n \n \n \n \n \n \n \n \n \n \n {isFetching || !showValues ? (\n \n ) : (\n `${percentage()}% dos totais - (${quantidadeIngressosTotal} ingressos)`\n )}\n \n \n \n )\n}\n\nexport default IngressosDisponiveis\n","import React from 'react'\nimport {\n Card,\n CardContent,\n Grid,\n Typography,\n Avatar,\n Button,\n makeStyles\n} from '@material-ui/core'\nimport AttachMoneyTwoToneIcon from '@material-ui/icons/AttachMoneyTwoTone'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport FormatListBulletedTwoToneIcon from '@material-ui/icons/FormatListBulletedTwoTone'\nimport { history } from 'utils'\nimport { useParams } from 'react-router-dom'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport constants from 'theme/constants'\nimport { useEventDashboard } from 'hooks-querys'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n backgroundColor: theme.palette.primary.dark,\n color: theme.palette.primary.contrastText,\n ...constants.shadowCard\n },\n title: {\n fontWeight: 700\n },\n avatar: {\n backgroundColor: '#FFFFFF',\n color: theme.palette.primary.main,\n height: 46,\n width: 46\n },\n icon: {\n height: 22,\n width: 22\n },\n button: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(-1),\n borderColor: '#FFFFFF',\n color: '#FFFFFF',\n '&:hover': {\n borderColor: '#FFFFFF'\n }\n }\n}))\n\nconst IngressosVendidos = () => {\n const classes = useStyles()\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data, isFetching } = useEventDashboard(Number(eventoId))\n\n const { quantidadeIngressos, valorIngressos } = data || {}\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n return (\n \n \n \n \n \n TOTAL VENDIDO\n \n \n {isFetching || !showValues ? (\n \n ) : (\n Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(valorIngressos || 0)\n )}\n \n \n {isFetching || !showValues ? (\n \n ) : (\n pluralize('INGRESSOS', quantidadeIngressos, true)\n )}\n \n \n \n \n \n \n \n \n (\n }\n onClick={() =>\n history.push(\n `/ingressos/lista?eventId=${eventoId}&textSearch=&statusId=0`\n )\n }\n >\n VER LISTA DE INGRESSOS\n \n )}\n />\n \n \n \n \n )\n}\n\nexport default IngressosVendidos\n","import React from 'react'\nimport {\n Card,\n CardContent,\n Grid,\n Typography,\n Avatar,\n Button,\n makeStyles\n} from '@material-ui/core'\nimport LocalOfferTwoToneIcon from '@material-ui/icons/LocalOfferTwoTone'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport LoyaltyTwoToneIcon from '@material-ui/icons/LoyaltyTwoTone'\nimport { history } from 'utils'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\nimport { useEventDashboard } from 'hooks-querys'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n ...constants.shadowCard\n },\n content: {\n alignItems: 'center',\n display: 'flex'\n },\n title: {\n fontWeight: 700\n },\n avatar: {\n backgroundColor: theme.palette.success.main,\n height: 46,\n width: 46\n },\n icon: {\n height: 22,\n width: 22\n },\n differenceValue: {\n color: theme.palette.success.dark,\n marginRight: theme.spacing(1)\n },\n button: {\n marginTop: theme.spacing(2)\n }\n}))\n\nconst CuponsAtivos = () => {\n const classes = useStyles()\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data, isFetching } = useEventDashboard(Number(eventoId))\n const { cuponsAtivos } = data || {}\n\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n return (\n \n \n \n \n \n CUPONS ATIVOS\n \n \n {isFetching || !showValues ? (\n \n ) : cuponsAtivos === 1 ? (\n `${cuponsAtivos} CUPOM`\n ) : (\n `${cuponsAtivos} CUPONS`\n )}\n \n \n \n \n \n \n \n \n (\n }\n onClick={() =>\n history.push(`/cupomDescontos/lista?eventoId=${eventoId}`)\n }\n >\n VER LISTA DE CUPONS\n \n )}\n />\n \n \n \n \n )\n}\n\nexport default CuponsAtivos\n","import React from 'react'\nimport { Pie } from 'react-chartjs-2'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Typography,\n makeStyles,\n useTheme,\n Grid\n} from '@material-ui/core'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { colors } from '@material-ui/core'\nimport constants from 'theme/constants'\nimport { useParams } from 'react-router-dom'\nimport { useEventDashboard } from 'hooks-querys'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n ...constants.shadowCard\n },\n chartContainer: {\n position: 'relative',\n height: '300px',\n justifyContent: 'center'\n },\n stats: {\n marginTop: theme.spacing(2),\n display: 'flex',\n justifyContent: 'center'\n },\n tipoDeIngresso: {\n textAlign: 'center'\n },\n quantity: {\n fontSize: 9\n }\n}))\n\nconst GraficoIngressosTipoIngresso = () => {\n const classes = useStyles()\n const theme = useTheme()\n const { eventoId } = useParams<{ eventoId: string }>()\n const { data, isFetching } = useEventDashboard(Number(eventoId))\n\n // @ts-ignore\n const { showValues } = useSelector((state) => state.global)\n const { graficoIngressosTipoIngresso } = data || {}\n\n const generateData = () => {\n if (graficoIngressosTipoIngresso && graficoIngressosTipoIngresso.options) {\n const data = {\n datasets: [\n {\n data: graficoIngressosTipoIngresso.series[1],\n backgroundColor: [\n colors.deepPurple[200],\n colors.teal[200],\n colors.lightGreen[200],\n colors.brown[200],\n colors.blueGrey[200]\n ],\n borderWidth: 3,\n borderColor: theme.palette.white,\n hoverBorderColor: [\n colors.deepPurple[400],\n colors.teal[400],\n colors.lightGreen[400],\n colors.brown[400],\n colors.blueGrey[400]\n ]\n }\n ],\n labels: graficoIngressosTipoIngresso.options\n }\n return data\n } else {\n return []\n }\n }\n\n const generateStrings = () => {\n var data = [] as any\n if (graficoIngressosTipoIngresso && graficoIngressosTipoIngresso.options) {\n data = [\n {\n title: graficoIngressosTipoIngresso.options[0],\n value:\n graficoIngressosTipoIngresso.series[1][0] !== undefined\n ? Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(graficoIngressosTipoIngresso.series[1][0])\n : null,\n color: colors.deepPurple[200],\n quantity: graficoIngressosTipoIngresso.series[0][0]\n },\n {\n title: graficoIngressosTipoIngresso.options[1],\n value:\n graficoIngressosTipoIngresso.series[1][1] !== undefined\n ? Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(graficoIngressosTipoIngresso.series[1][1])\n : null,\n color: colors.teal[200],\n quantity: graficoIngressosTipoIngresso.series[0][1]\n },\n {\n title: graficoIngressosTipoIngresso.options[2],\n value:\n graficoIngressosTipoIngresso.series[1][2] !== undefined\n ? Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(graficoIngressosTipoIngresso.series[1][2])\n : null,\n color: colors.lightGreen[200],\n quantity: graficoIngressosTipoIngresso.series[0][2]\n },\n {\n title: graficoIngressosTipoIngresso.options[3],\n value:\n graficoIngressosTipoIngresso.series[1][3] !== undefined\n ? Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(graficoIngressosTipoIngresso.series[1][3])\n : null,\n color: colors.brown[200],\n quantity: graficoIngressosTipoIngresso.series[0][3]\n },\n {\n title: graficoIngressosTipoIngresso.options[4],\n value:\n graficoIngressosTipoIngresso.series[1][4] !== undefined\n ? Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(graficoIngressosTipoIngresso.series[1][4])\n : null,\n color: colors.blueGrey[400],\n quantity: graficoIngressosTipoIngresso.series[0][4]\n }\n ]\n return data\n } else {\n return data\n }\n }\n\n const options = {\n legend: {\n display: false\n },\n responsive: true,\n maintainAspectRatio: false,\n //animation: false,\n layout: { padding: 0 },\n tooltips: {\n enabled: true,\n mode: 'index',\n\n borderWidth: 1,\n borderColor: theme.palette.divider,\n backgroundColor: theme.palette.white,\n titleFontColor: theme.palette.text.primary,\n bodyFontColor: theme.palette.text.secondary,\n footerFontColor: theme.palette.text.secondary,\n callbacks: {\n // @ts-ignore\n label: function (tooltipItem, data) {\n var dataset = data.datasets[tooltipItem.datasetIndex]\n var meta = dataset._meta[Object.keys(dataset._meta)[0]]\n var total = meta.total\n var currentValue = dataset.data[tooltipItem.index]\n var percentage = parseFloat(((currentValue / total) * 100).toFixed(1))\n if (!isNaN(percentage)) {\n return (\n Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(currentValue) +\n ' (' +\n percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) +\n '%)'\n )\n } else {\n return null\n }\n },\n // @ts-ignore\n title: function (tooltipItem, data) {\n return data.labels[tooltipItem[0].index].toUpperCase()\n }\n }\n }\n }\n\n return (\n \n \n // \n // \n // }\n title=\"VENDAS POR TIPO DE INGRESSO\"\n />\n \n \n \n {isFetching || !showValues ? (\n
\n \n
\n ) : (\n
\n )}\n
\n \n {isFetching || !showValues ? (\n
\n \n
\n ) : (\n
\n {generateStrings().map(\n // @ts-ignore\n (tipoDeIngresso) =>\n tipoDeIngresso.value !== null && (\n \n \n {tipoDeIngresso.title}\n \n \n {tipoDeIngresso.value}\n \n \n {pluralize('ingressos', tipoDeIngresso.quantity, true)}\n \n \n )\n )}\n \n )}\n
\n \n \n )\n}\n\nexport default GraficoIngressosTipoIngresso\n","import { v1 as uuid } from 'uuid'\n\nexport default [\n {\n id: uuid(),\n ref: 'CDD1049',\n amount: 30.5,\n customer: {\n name: 'Ekaterina Tankova'\n },\n createdAt: 1555016400000,\n status: 'pending'\n },\n {\n id: uuid(),\n ref: 'CDD1048',\n amount: 25.1,\n customer: {\n name: 'Cao Yu'\n },\n createdAt: 1555016400000,\n status: 'delivered'\n },\n {\n id: uuid(),\n ref: 'CDD1047',\n amount: 10.99,\n customer: {\n name: 'Alexa Richardson'\n },\n createdAt: 1554930000000,\n status: 'refunded'\n },\n {\n id: uuid(),\n ref: 'CDD1046',\n amount: 96.43,\n customer: {\n name: 'Anje Keizer'\n },\n createdAt: 1554757200000,\n status: 'pending'\n },\n {\n id: uuid(),\n ref: 'CDD1045',\n amount: 32.54,\n customer: {\n name: 'Clarke Gillebert'\n },\n createdAt: 1554670800000,\n status: 'delivered'\n },\n {\n id: uuid(),\n ref: 'CDD1044',\n amount: 16.76,\n customer: {\n name: 'Adam Denisov'\n },\n createdAt: 1554670800000,\n status: 'delivered'\n }\n]\n","import React, { useState } from 'react'\nimport clsx from 'clsx'\nimport moment from 'moment'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardActions,\n CardHeader,\n CardContent,\n Button,\n Divider,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Tooltip,\n TableSortLabel\n} from '@material-ui/core'\nimport ArrowRightIcon from '@material-ui/icons/ArrowRight'\n\nimport mockData from './data'\nimport { StatusBullet } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n content: {\n padding: 0\n },\n inner: {\n minWidth: 800\n },\n statusContainer: {\n display: 'flex',\n alignItems: 'center'\n },\n status: {\n marginRight: theme.spacing(1)\n },\n actions: {\n justifyContent: 'flex-end'\n }\n}))\n\nconst statusColors = {\n delivered: 'success',\n pending: 'info',\n refunded: 'danger'\n}\n\nconst LatestOrders = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n\n const [orders] = useState(mockData)\n\n return (\n \n \n New entry\n \n }\n title=\"Latest Orders\"\n />\n \n \n \n \n
\n \n \n Order Ref \n Customer \n \n \n \n Date\n \n \n \n Status \n \n \n \n {orders.map((order) => (\n \n {order.ref} \n {order.customer.name} \n \n {moment(order.createdAt).format('DD/MM/YYYY')}\n \n \n \n \n {order.status}\n
\n \n \n ))}\n \n
\n
\n \n \n \n \n \n View all \n \n \n \n )\n}\n\nLatestOrders.propTypes = {\n className: PropTypes.string\n}\n\nexport default LatestOrders\n","import React from 'react'\nimport { Grid } from '@material-ui/core'\n\nimport {\n PedidosPendentes,\n CuponsAtivos,\n IngressosDisponiveis,\n IngressosVendidos,\n GraficoVendasPorDia,\n GraficoIngressosTipoIngresso\n} from '../../components'\n\nconst EventoDashboard = () => {\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\nexport default EventoDashboard\n","import React, { useEffect } from 'react'\nimport { Box, Grid, makeStyles, Typography } from '@material-ui/core'\n\nimport {\n Budget,\n TotalEventos,\n EventosFuturos,\n IngressosRecebidos,\n VendasPorEvento,\n ReceitaUltimos6Meses,\n LatestOrders,\n Filters\n} from './components'\nimport { Header, Page } from 'components'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { globalActions } from '_actions'\nimport { useParams } from 'react-router-dom'\nimport { EventoDashboard } from 'views/Eventos/components/EventoDashboard/components'\nimport { useEstablishmentDashboard, useEventDashboard } from 'hooks-querys'\nimport { format } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\nimport { history, useDidMountEffect } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2),\n [theme.breakpoints.down('sm')]: {\n padding: theme.spacing(3, 1, 1, 1)\n }\n },\n header: {\n marginBottom: theme.spacing(3)\n }\n}))\n\nconst Dashboard = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { eventoId } = useParams<{ eventoId: string }>()\n const {\n data,\n isLoading: isLoadingEventDashboard,\n isFetching: isFetchingEventDashboard,\n isError: isErrorEventDashboard,\n refetch: refetchEventDashboard,\n dataUpdatedAt: dataUpdatedAtEventDashboard\n } = useEventDashboard(Number(eventoId))\n\n const { evento } = data || {}\n const { estabelecimentoId } = useSelector(\n // @ts-ignore\n (state) => state.usuarioEstabelecimento\n )\n\n const {\n isLoading: isLoadingEstablishmentDashboard,\n isFetching: isFetchingEstablishmentDashboard,\n isError: isErrorEstablishmentDashboard,\n refetch: refetchEstablishmentDashboard,\n dataUpdatedAt: dataUpdatedAtEstablishmentDashboard\n } = useEstablishmentDashboard(Number(estabelecimentoId))\n\n const isLoading = isLoadingEventDashboard || isLoadingEstablishmentDashboard\n const isFetching =\n isFetchingEventDashboard || isFetchingEstablishmentDashboard\n useEffect(() => {\n dispatch(globalActions.setIsVisibleButtonShowValues(true))\n return () => {\n dispatch(globalActions.setIsVisibleButtonShowValues(false))\n }\n }, [])\n\n useEffect(() => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n }, [eventoId])\n\n useDidMountEffect(() => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n history.push('/dashboard')\n }, [estabelecimentoId])\n\n return (\n \n 0\n ? refetchEventDashboard\n : refetchEstablishmentDashboard\n }\n />\n \n \n \n \n {!isLoading ? (\n \n Última atualização:{' '}\n {format(\n eventoId && Number(eventoId) > 0\n ? dataUpdatedAtEventDashboard\n : dataUpdatedAtEstablishmentDashboard,\n \"dd/MM/yyyy 'às' HH:mm:ss\",\n {\n locale: brLocale\n }\n )}{' '}\n {isFetching ? '(Atualizando...)' : ''}\n \n ) : null}\n \n {eventoId && Number(eventoId) > 0 ? (\n \n ) : (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* \n \n */}\n \n )}\n \n )\n}\n\nexport default Dashboard\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Typography, Grid, Button, ButtonGroup, Chip } from '@material-ui/core'\nimport { DatePicker } from '@material-ui/pickers'\nimport {\n format,\n subDays,\n differenceInDays,\n isAfter,\n isBefore,\n endOfDay,\n startOfDay,\n startOfYesterday,\n endOfYesterday\n} from 'date-fns'\nimport CalendarTodayIcon from '@material-ui/icons/CalendarTodayOutlined'\nimport { useDispatch } from 'react-redux'\nimport { dashboardAction } from '_actions'\n\nconst chipOptions = [\n { label: 'Hoje', value: '0' },\n { label: 'Ontem', value: '0' },\n { label: '7 dias', value: '7' },\n { label: '30 dias', value: '30' },\n { label: '90 dias', value: '90' },\n { label: '1 ano', value: '365' }\n]\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n dates: {\n [theme.breakpoints.up('md')]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end'\n },\n [theme.breakpoints.down('sm')]: {\n alignItems: 'center',\n justifyContent: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n '& > *': {\n margin: theme.spacing(0.5),\n marginBottom: theme.spacing(2)\n }\n }\n },\n calendarTodayIcon: {\n marginRight: theme.spacing(1)\n },\n chip: {\n marginRight: theme.spacing(1)\n },\n calendarTodayGroup: {\n [theme.breakpoints.up('md')]: {\n marginLeft: theme.spacing(1)\n },\n [theme.breakpoints.down('sm')]: {\n marginTop: theme.spacing(1)\n }\n }\n}))\n\nconst Header = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const dispatch = useDispatch()\n const [selectEdge, setSelectEdge] = useState(null)\n const [calendarDate, setCalendarDate] = useState(new Date())\n const [dateRange, setDateRange] = useState({\n startDate: startOfDay(new Date()),\n endDate: endOfDay(new Date()),\n value: '0'\n })\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(yesterday.getDate() - 1)\n\n const handleCalendarOpen = (edge) => {\n setSelectEdge(edge)\n }\n\n const handleCalendarChange = (date) => {\n setCalendarDate(date)\n }\n\n const handleCalendarClose = () => {\n setCalendarDate(new Date())\n setSelectEdge(null)\n }\n\n const handleCalendarAccept = (date) => {\n setCalendarDate(new Date())\n\n if (selectEdge === 'start') {\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\n\n if (isAfter(date, dateRange.endDate)) {\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\n }\n } else {\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\n\n if (isBefore(date, dateRange.startDate)) {\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\n }\n }\n\n setSelectEdge(null)\n }\n\n const handleRangeChangeChip = (item) => {\n if (item.label === 'Ontem') {\n setDateRange({\n startDate: startOfYesterday(new Date()),\n endDate: endOfYesterday(new Date()),\n value: item.value\n })\n } else {\n setDateRange({\n startDate: startOfDay(subDays(new Date(), Number(item.value))),\n endDate: endOfDay(new Date()),\n value: item.value\n })\n }\n }\n\n const open = Boolean(selectEdge)\n\n useEffect(() => {\n dispatch(\n dashboardAction.getDashboardAdmin(dateRange.startDate, dateRange.endDate)\n )\n }, [dateRange.startDate, dateRange.endDate])\n\n return (\n \n \n \n \n Dashboard\n \n \n Administrativo\n \n \n \n {chipOptions &&\n chipOptions.length > 0 &&\n chipOptions.map((option) => (\n handleRangeChangeChip(option)}\n color={\n option.value != '0' &&\n differenceInDays(dateRange.endDate, dateRange.startDate) ===\n Number(option.value)\n ? 'primary'\n : (option.label === 'Hoje' &&\n format(dateRange.startDate, 'dd/MM/yyyy') ===\n format(today, 'dd/MM/yyyy')) ||\n (option.label === 'Ontem' &&\n format(dateRange.startDate, 'dd/MM/yyyy') ===\n format(yesterday, 'dd/MM/yyyy') &&\n format(dateRange.endDate, 'dd/MM/yyyy') ===\n format(yesterday, 'dd/MM/yyyy'))\n ? 'primary'\n : 'default'\n }\n />\n ))}\n \n handleCalendarOpen('start')}>\n \n {dateRange && format(dateRange.startDate, 'dd/MM/yyyy')}\n \n handleCalendarOpen('end')}>\n \n {dateRange && format(dateRange.endDate, 'dd/MM/yyyy')}\n \n \n \n \n \n
\n )\n}\n\nHeader.propTypes = {\n className: PropTypes.string\n}\n\nHeader.defaultProps = {}\n\nexport default Header\n","import React from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: 56,\n height: 56\n },\n circle1: {\n stroke: 'rgba(0,0,0,0.05)',\n fill: 'none',\n strokeWidth: 4\n },\n circle2: {\n stroke: theme.palette.primary.main,\n fill: 'none',\n strokeWidth: 4,\n animation: '$progress 1s ease-out forwards'\n },\n '@keyframes progress': {\n '0%': {\n strokeDasharray: '0 100'\n }\n }\n}))\n\nconst CircularProgress = (props) => {\n const { value, className, ...rest } = props\n\n const classes = useStyles()\n\n return (\n \n )\n}\n\nCircularProgress.propTypes = {\n className: PropTypes.string,\n value: PropTypes.number.isRequired\n}\n\nexport default CircularProgress\n","import React from 'react'\nimport clsx from 'clsx'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Table,\n TableRow,\n TableCell,\n Typography,\n colors,\n TableBody,\n Avatar\n} from '@material-ui/core'\n\nimport CircularProgress from './components/CircularProgress'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { formatCurrency, getInitials } from 'utils'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n emptyContent: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n [theme.breakpoints.up('lg')]: {\n minHeight: 532\n }\n },\n textEmptyContent: {\n marginTop: theme.spacing(2)\n },\n inner: {\n minWidth: 500\n },\n details: {\n display: 'flex',\n alignItems: 'center'\n },\n image: {\n marginRight: theme.spacing(2),\n flexShrink: 0,\n height: 56,\n width: 56,\n borderRadius: '50%'\n },\n subscriptions: {\n fontWeight: theme.typography.fontWeightMedium\n },\n price: {\n whiteSpace: 'nowrap'\n },\n value: {\n color: colors.green[600],\n fontWeight: theme.typography.fontWeightMedium\n },\n conversion: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end'\n },\n conversionStats: {\n whiteSpace: 'nowrap',\n marginRight: theme.spacing(2)\n },\n actions: {\n justifyContent: 'flex-end'\n },\n arrowForwardIcon: {\n marginLeft: theme.spacing(1)\n }\n}))\n\nconst MostProfitableOrganizes = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.dashboard)\n const { showValues } = useSelector((state) => state.global)\n const { estabelecimentosMaisRentaveis } = useSelector(\n (state) => state.dashboard.dashboardAdmin\n )\n return (\n \n \n \n {estabelecimentosMaisRentaveis &&\n estabelecimentosMaisRentaveis.length > 0 ? (\n \n \n \n
\n \n {estabelecimentosMaisRentaveis.map(\n (estabelecimentoObject) => (\n \n \n \n
\n {getInitials(\n estabelecimentoObject.estabelecimento.nome\n )}\n \n
\n \n {estabelecimentoObject.estabelecimento.nome}\n \n \n \n @\n {\n estabelecimentoObject.estabelecimento\n .username\n }\n \n \n
\n
\n \n \n Valor total \n \n {showValues && !isLoading ? (\n \n {formatCurrency(\n estabelecimentoObject.valorTotal\n )}\n \n ) : (\n \n )}\n \n \n \n \n
\n \n {showValues && !isLoading ? (\n `${estabelecimentoObject.percentualLucroLiquido.toLocaleString(\n 'pt-BR',\n {\n maximumFractionDigits: 2\n }\n )}%`\n ) : (\n \n )}\n \n \n Lucro liquido\n \n
\n {showValues && !isLoading ? (\n
\n ) : (\n
\n )}\n
\n \n \n )\n )}\n \n
\n
\n \n \n ) : (\n \n \n Não há dados para exibir\n \n \n )}\n {/* */}\n {/* \n \n Ver todos\n \n \n */}\n \n )\n}\n\nMostProfitableOrganizes.propTypes = {\n className: PropTypes.string\n}\n\nexport default MostProfitableOrganizes\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Card, Typography, Grid } from '@material-ui/core'\nimport { LabelWithValue } from 'components'\nimport { formatCurrency } from 'utils'\nimport { Skeleton } from '@material-ui/lab'\nimport { useSelector } from 'react-redux'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n item: {\n padding: theme.spacing(3),\n textAlign: 'center',\n [theme.breakpoints.up('md')]: {\n '&:not(:last-of-type)': {\n borderRight: `1px solid ${theme.palette.divider}`\n }\n },\n [theme.breakpoints.down('sm')]: {\n '&:not(:last-of-type)': {\n borderBottom: `1px solid ${theme.palette.divider}`\n }\n }\n },\n valueContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n label: {\n marginLeft: theme.spacing(1)\n }\n}))\n\nconst Overview = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n\n const { isLoading, dashboardAdmin } = useSelector((state) => state.dashboard)\n const { showValues } = useSelector((state) => state.global)\n\n return (\n \n \n \n \n Receita bruta\n \n {showValues && !isLoading ? (\n \n \n {formatCurrency(\n dashboardAdmin &&\n dashboardAdmin.receitaBruta &&\n dashboardAdmin.receitaBruta.valorAtual\n )}\n \n \n
\n ) : (\n \n )}\n \n \n \n Lucro liquido\n \n {showValues && !isLoading ? (\n \n \n {formatCurrency(\n dashboardAdmin &&\n dashboardAdmin.lucroLiquido &&\n dashboardAdmin.lucroLiquido.valorAtual\n )}\n \n \n
\n ) : (\n \n )}\n \n \n \n Valor a transferir\n \n {showValues && !isLoading ? (\n \n \n {formatCurrency(\n dashboardAdmin && dashboardAdmin.valorATransferir\n )}\n \n
\n ) : (\n \n )}\n \n \n \n Tarifa média\n \n {showValues && !isLoading ? (\n \n \n {dashboardAdmin &&\n dashboardAdmin.tarifaMedia &&\n dashboardAdmin.tarifaMedia.valorAtual.toLocaleString(\n 'pt-BR',\n { maximumFractionDigits: 2 }\n )}\n %\n \n \n
\n ) : (\n \n )}\n \n \n \n Eventos realizados\n \n {showValues && !isLoading ? (\n \n \n {dashboardAdmin &&\n dashboardAdmin.eventosRealizados &&\n dashboardAdmin.eventosRealizados.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n )\n}\n\nOverview.propTypes = {\n className: PropTypes.string\n}\n\nexport default Overview\n","import React, { useState, useEffect } from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n Avatar,\n Typography,\n Link,\n Grid\n} from '@material-ui/core'\n\nimport getInitials from 'utils/getInitials'\nimport { dashboard } from 'mock'\nimport { formatDistance } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\nimport { LabelWithValue } from 'components'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n statsItem: {\n padding: theme.spacing(1.2, 2),\n borderRight: `1px solid ${theme.palette.divider}`,\n borderBottom: `1px solid ${theme.palette.divider}`,\n flexGrow: 1\n },\n content: {\n padding: 0,\n marginBottom: theme.spacing(-2.5)\n },\n title: {\n fontSize: '10px'\n },\n date: {\n whiteSpace: 'nowrap'\n },\n valueContainer: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n label: {\n marginLeft: theme.spacing(1),\n height: 15,\n minWidth: 15,\n padding: 7,\n fontSize: 9\n }\n}))\n\nconst CustomerActivity = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.dashboard)\n const { interacoesUsuarios } = useSelector(\n (state) => state.dashboard.dashboardAdmin\n )\n const { showValues } = useSelector((state) => state.global)\n\n return (\n \n \n \n \n \n \n Interações\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.totalInteracoes &&\n interacoesUsuarios.totalInteracoes.valorAtual}\n \n\n \n
\n ) : (\n \n )}\n \n \n \n \n Comentários\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.totalComentarios &&\n interacoesUsuarios.totalComentarios.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n \n Conexões\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.totalConexoes &&\n interacoesUsuarios.totalConexoes.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n \n Avaliações\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.totalAvaliacoes &&\n interacoesUsuarios.totalAvaliacoes.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n \n Novos usuários\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.novosUsuarios &&\n interacoesUsuarios.novosUsuarios.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n \n Usuários ativos\n \n {showValues && !isLoading ? (\n \n \n {interacoesUsuarios &&\n interacoesUsuarios.usuariosAtivos &&\n interacoesUsuarios.usuariosAtivos.valorAtual}\n \n \n
\n ) : (\n \n )}\n \n \n \n \n {interacoesUsuarios &&\n interacoesUsuarios.atividades &&\n interacoesUsuarios.atividades.length > 0 &&\n interacoesUsuarios.atividades.map((activity, i) => {\n const isUser =\n activity &&\n activity.usuario &&\n activity.usuario.id &&\n activity.usuario.id > 0\n return (\n \n \n \n {getInitials(\n isUser\n ? activity.usuario.nome\n : activity.estabelecimento.nome\n )}\n \n \n \n {isUser\n ? activity.usuario.nome\n : activity.estabelecimento.nome}\n \n {` (@${isUser\n ? activity.usuario.username\n : activity.estabelecimento.username\n })`}\n \n \n }\n secondary={\n \n {activity.titulo}\n {/* {user.type === 'payment' && (\n \n {' '}\n | Ver pedido\n \n )} */}\n \n }\n />\n \n {formatDistance(new Date(activity.dataHora), new Date(), {\n locale: brLocale\n })}\n \n \n )\n })}\n
\n \n \n )\n}\n\nCustomerActivity.propTypes = {\n className: PropTypes.string\n}\n\nexport default CustomerActivity\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { Pie } from 'react-chartjs-2'\nimport { makeStyles, useTheme } from '@material-ui/styles'\nimport { formatCurrency } from 'utils'\nimport pluralize from 'pluralize'\n\nconst useStyles = makeStyles(() => ({\n root: {\n position: 'relative'\n }\n}))\n\nconst Chart = (props) => {\n const { data: dataProp, className, ...rest } = props\n const classes = useStyles()\n const theme = useTheme()\n const data = {\n datasets: [\n {\n id: '1',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n },\n {\n id: '2',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n }\n ],\n labels: dataProp && dataProp.options ? dataProp.options : []\n }\n\n for (let i = 0; i < dataProp.options.length; i++) {\n data.datasets[0].data.push(dataProp.series[0][i])\n data.datasets[0].backgroundColor.push(dataProp.colors[i][200])\n // data.datasets[0].hoverBorderColor.push(color[400])\n data.datasets[1].data.push(dataProp.series[1][i])\n data.datasets[1].backgroundColor.push(dataProp.colors[i][200])\n // data.datasets[1].hoverBorderColor.push(color[400])\n }\n\n const options = {\n legend: {\n labels: {\n usePointStyle: true\n }\n },\n responsive: true,\n maintainAspectRatio: false,\n // animation: false,\n layout: { padding: 0 },\n tooltips: {\n enabled: true,\n mode: 'index',\n borderWidth: 1,\n borderColor: theme.palette.divider,\n backgroundColor: theme.palette.white,\n titleFontColor: theme.palette.text.primary,\n bodyFontColor: theme.palette.text.secondary,\n footerFontColor: theme.palette.text.secondary,\n callbacks: {\n label: function (tooltipItem, data) {\n var dataset = data.datasets[tooltipItem.datasetIndex]\n var meta = dataset._meta[Object.keys(dataset._meta)[0]]\n var total = meta.total\n var currentValue = dataset.data[tooltipItem.index]\n var percentage = parseFloat(((currentValue / total) * 100).toFixed(1))\n if (!isNaN(percentage)) {\n if (dataset.id === '2') {\n return `${formatCurrency(\n currentValue\n )} (${percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n })}%)`\n } else {\n return (\n pluralize('pedido', currentValue, true) +\n ' (' +\n percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) +\n '%)'\n )\n }\n } else {\n return null\n }\n },\n title: function (tooltipItem, data) {\n return data.labels[tooltipItem[0].index].toUpperCase()\n }\n }\n }\n }\n\n return (\n \n )\n}\n\nChart.propTypes = {\n className: PropTypes.string,\n data: PropTypes.array.isRequired\n}\n\nexport default Chart\n","import React, { useState, useEffect } from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Typography,\n colors,\n Grid\n} from '@material-ui/core'\n\nimport { Chart } from './components'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { getRandomColorsChart } from 'utils'\nimport constants from 'theme/constants'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n chartContainer: {\n padding: theme.spacing(3),\n alignContent: 'center',\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center'\n },\n chart: {\n height: 281\n },\n title: {\n fontSize: '10px'\n },\n statsContainer: {\n display: 'flex'\n },\n statsItem: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: theme.spacing(1.5, 2),\n '&:not(:last-of-type)': {\n borderRight: `1px solid ${theme.palette.divider}`,\n borderBottom: `1px solid ${theme.palette.divider}`\n }\n }\n}))\n\nconst PlatformSales = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.dashboard)\n const { graficoVendasPorPlataforma } = useSelector(\n (state) => state.dashboard.dashboardAdmin\n )\n const { showValues } = useSelector((state) => state.global)\n\n const percentageCalculator = (value, total) => {\n return (value * 100) / total\n }\n\n const dataProp = {\n ...graficoVendasPorPlataforma,\n colors: getRandomColorsChart(graficoVendasPorPlataforma.options.length)\n }\n return (\n \n \n \n \n \n {showValues &&\n !isLoading &&\n dataProp &&\n dataProp.options &&\n dataProp.options.length > 0 ? (\n \n ) : (\n \n )}\n
\n \n \n {dataProp && dataProp.options && dataProp.options.length > 0 ? (\n dataProp.options.map((plataforma, index) => (\n \n \n {plataforma}\n \n \n {showValues && !isLoading ? (\n percentageCalculator(\n dataProp.series[0][index],\n dataProp.series[0].reduce(\n (a, b) => a + b // soma todos os valores\n )\n ).toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) + '%'\n ) : (\n \n )}\n \n \n ))\n ) : (\n \n \n Nenhum resultado encontrado\n \n \n )}\n \n \n \n )\n}\n\nPlatformSales.propTypes = {\n className: PropTypes.string\n}\n\nexport default PlatformSales\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { Pie } from 'react-chartjs-2'\nimport { makeStyles, useTheme } from '@material-ui/styles'\nimport { formatCurrency } from 'utils'\n\nconst useStyles = makeStyles(() => ({\n root: {\n position: 'relative'\n }\n}))\n\nconst Chart = (props) => {\n const { data: dataProp, className, ...rest } = props\n const classes = useStyles()\n const theme = useTheme()\n const data = {\n datasets: [\n {\n id: '1',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n },\n {\n id: '2',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n }\n ],\n labels: dataProp && dataProp.options ? dataProp.options : []\n }\n\n for (let i = 0; i < dataProp.options.length; i++) {\n data.datasets[0].data.push(dataProp.series[0][i])\n data.datasets[0].backgroundColor.push(dataProp.colors[i][200])\n // data.datasets[0].hoverBorderColor.push(color[400])\n }\n\n const options = {\n legend: {\n labels: {\n usePointStyle: true\n }\n },\n responsive: true,\n maintainAspectRatio: false,\n // animation: false,\n layout: { padding: 0 },\n tooltips: {\n enabled: true,\n mode: 'index',\n borderWidth: 1,\n borderColor: theme.palette.divider,\n backgroundColor: theme.palette.white,\n titleFontColor: theme.palette.text.primary,\n bodyFontColor: theme.palette.text.secondary,\n footerFontColor: theme.palette.text.secondary,\n callbacks: {\n label: function (tooltipItem, data) {\n var dataset = data.datasets[tooltipItem.datasetIndex]\n var meta = dataset._meta[Object.keys(dataset._meta)[0]]\n var total = meta.total\n var currentValue = dataset.data[tooltipItem.index]\n var percentage = parseFloat(((currentValue / total) * 100).toFixed(1))\n if (!isNaN(percentage)) {\n if (dataset.id === '2') {\n return `${formatCurrency(\n currentValue\n )} (${percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n })}%)`\n } else {\n return `${currentValue} ${currentValue === 1 ? 'interação' : 'interações'\n } (${percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n })}%)`\n }\n } else {\n return null\n }\n },\n title: function (tooltipItem, data) {\n return data.labels[tooltipItem[0].index].toUpperCase()\n }\n }\n }\n }\n\n return (\n \n )\n}\n\nChart.propTypes = {\n className: PropTypes.string,\n data: PropTypes.array.isRequired\n}\n\nexport default Chart\n","import React, { useState, useEffect } from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Typography,\n colors,\n Grid\n} from '@material-ui/core'\n\nimport { Chart } from './components'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { getRandomColorsChart } from 'utils'\nimport constants from 'theme/constants'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n chartContainer: {\n padding: theme.spacing(3),\n alignContent: 'center',\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center'\n },\n chart: {\n height: 281\n },\n title: {\n fontSize: '10px'\n },\n statsContainer: {\n display: 'flex'\n },\n statsItem: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: theme.spacing(1.5, 2),\n '&:not(:last-of-type)': {\n borderRight: `1px solid ${theme.palette.divider}`,\n borderBottom: `1px solid ${theme.palette.divider}`\n }\n }\n}))\n\nconst TypeInteractions = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.dashboard)\n const { graficoInteracoesPorTipo } = useSelector(\n (state) => state.dashboard.dashboardAdmin\n )\n const { showValues } = useSelector((state) => state.global)\n\n const percentageCalculator = (value, total) => {\n return (value * 100) / total\n }\n\n const dataProp = {\n ...graficoInteracoesPorTipo,\n colors: getRandomColorsChart(graficoInteracoesPorTipo.options.length)\n }\n return (\n \n \n \n \n \n {showValues &&\n !isLoading &&\n dataProp &&\n dataProp.options &&\n dataProp.options.length > 0 ? (\n \n ) : (\n \n )}\n
\n \n \n {dataProp && dataProp.options && dataProp.options.length > 0 ? (\n dataProp.options.map((plataforma, index) => (\n \n \n {plataforma}\n \n \n {showValues && !isLoading ? (\n percentageCalculator(\n dataProp.series[0][index],\n dataProp.series[0].reduce(\n (a, b) => a + b // soma todos os valores\n )\n ).toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) + '%'\n ) : (\n \n )}\n \n \n ))\n ) : (\n \n \n Nenhum resultado encontrado\n \n \n )}\n \n \n \n )\n}\n\nTypeInteractions.propTypes = {\n className: PropTypes.string\n}\n\nexport default TypeInteractions\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { Pie } from 'react-chartjs-2'\nimport { makeStyles, useTheme } from '@material-ui/styles'\nimport { formatCurrency } from 'utils'\nimport pluralize from 'pluralize'\n\nconst useStyles = makeStyles(() => ({\n root: {\n position: 'relative'\n }\n}))\n\nconst Chart = (props) => {\n const { data: dataProp, className, ...rest } = props\n\n const classes = useStyles()\n const theme = useTheme()\n const data = {\n datasets: [\n {\n id: '1',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n },\n {\n id: '2',\n data: [],\n backgroundColor: [],\n borderWidth: 5,\n borderColor: theme.palette.white,\n hoverBorderColor: theme.palette.white\n }\n ],\n labels: dataProp && dataProp.options ? dataProp.options : []\n }\n\n for (let i = 0; i < dataProp.options.length; i++) {\n data.datasets[0].data.push(dataProp.series[0][i])\n data.datasets[0].backgroundColor.push(dataProp.colors[i][200])\n // data.datasets[0].hoverBorderColor.push(color[400])\n data.datasets[1].data.push(dataProp.series[1][i])\n data.datasets[1].backgroundColor.push(dataProp.colors[i][200])\n // data.datasets[1].hoverBorderColor.push(color[400])\n }\n\n const options = {\n legend: {\n labels: {\n usePointStyle: true\n }\n },\n responsive: true,\n maintainAspectRatio: false,\n // animation: false,\n layout: { padding: 0 },\n tooltips: {\n enabled: true,\n mode: 'index',\n borderWidth: 1,\n borderColor: theme.palette.divider,\n backgroundColor: theme.palette.white,\n titleFontColor: theme.palette.text.primary,\n bodyFontColor: theme.palette.text.secondary,\n footerFontColor: theme.palette.text.secondary,\n callbacks: {\n label: function (tooltipItem, data) {\n var dataset = data.datasets[tooltipItem.datasetIndex]\n var meta = dataset._meta[Object.keys(dataset._meta)[0]]\n var total = meta.total\n var currentValue = dataset.data[tooltipItem.index]\n var percentage = parseFloat(((currentValue / total) * 100).toFixed(1))\n if (!isNaN(percentage)) {\n if (dataset.id === '2') {\n return `${formatCurrency(\n currentValue\n )} (${percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n })}%)`\n } else {\n return (\n pluralize('pedido', currentValue, true) +\n ' (' +\n percentage.toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) +\n '%)'\n )\n }\n } else {\n return null\n }\n },\n title: function (tooltipItem, data) {\n return data.labels[tooltipItem[0].index].toUpperCase()\n }\n }\n }\n }\n\n return (\n \n )\n}\n\nChart.propTypes = {\n className: PropTypes.string,\n data: PropTypes.array.isRequired\n}\n\nexport default Chart\n","import React from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Typography,\n Grid\n} from '@material-ui/core'\n\nimport { Chart } from './components'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { getRandomColorsChart } from 'utils'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n chartContainer: {\n padding: theme.spacing(3),\n alignContent: 'center',\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'center'\n },\n chart: {\n height: 281\n },\n title: {\n fontSize: '10px'\n },\n statsContainer: {\n display: 'flex'\n },\n statsItem: {\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n padding: theme.spacing(1.5, 2),\n '&:not(:last-of-type)': {\n borderRight: `1px solid ${theme.palette.divider}`,\n borderBottom: `1px solid ${theme.palette.divider}`\n }\n }\n}))\n\nconst PaymentTypeSales = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.dashboard)\n const { graficoVendasPorFormaPagamento } = useSelector(\n (state) => state.dashboard.dashboardAdmin\n )\n const { showValues } = useSelector((state) => state.global)\n\n const percentageCalculator = (value, total) => {\n return (value * 100) / total\n }\n\n const dataProp = {\n ...graficoVendasPorFormaPagamento,\n colors: getRandomColorsChart(graficoVendasPorFormaPagamento.options.length)\n }\n return (\n \n \n \n \n \n {showValues &&\n !isLoading &&\n dataProp &&\n dataProp.options &&\n dataProp.options.length > 0 ? (\n \n ) : (\n \n )}\n
\n \n \n {dataProp && dataProp.options && dataProp.options.length > 0 ? (\n dataProp.options.map((plataforma, index) => (\n \n \n {plataforma}\n \n \n {showValues && !isLoading ? (\n percentageCalculator(\n dataProp.series[0][index],\n dataProp.series[0].reduce(\n (a, b) => a + b // soma todos os valores\n )\n ).toLocaleString('pt-BR', {\n maximumFractionDigits: 2\n }) + '%'\n ) : (\n \n )}\n \n \n ))\n ) : (\n \n \n Nenhum resultado encontrado\n \n \n )}\n \n \n \n )\n}\n\nPaymentTypeSales.propTypes = {\n className: PropTypes.string\n}\n\nexport default PaymentTypeSales\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { makeStyles } from '@material-ui/styles'\nimport { Typography, Button, useTheme, useMediaQuery } from '@material-ui/core'\n\nimport { Page } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3),\n paddingTop: '10vh',\n display: 'flex',\n flexDirection: 'column',\n alignContent: 'center'\n },\n imageContainer: {\n marginTop: theme.spacing(6),\n display: 'flex',\n justifyContent: 'center'\n },\n image: {\n maxWidth: '100%',\n width: 560,\n maxHeight: 300,\n height: 'auto'\n },\n buttonContainer: {\n marginTop: theme.spacing(6),\n display: 'flex',\n justifyContent: 'center'\n }\n}))\n\nconst AccessDenied = () => {\n const classes = useStyles()\n const theme = useTheme()\n const mobileDevice = useMediaQuery(theme.breakpoints.down('sm'))\n\n return (\n \n \n 403: O acesso a essa página foi negado.\n \n \n Você não tem autorização para acessar essa página\n \n \n
\n
\n \n \n Voltar para home\n \n
\n \n )\n}\n\nexport default AccessDenied\n","import React, { useEffect } from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\nimport { Page } from 'components'\nimport { useDispatch } from 'react-redux'\nimport {\n Overview,\n MostProfitableOrganizes,\n CustomerActivity,\n Header,\n PlatformSales,\n TypeInteractions,\n PaymentTypeSales\n} from './components'\nimport { globalActions } from '_actions'\nimport { AccessControl } from '../../components/Utils'\nimport AccessDenied from 'views/Errors/AccessDenied'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3)\n },\n\n container: {\n '& > *': {\n height: '100%'\n }\n }\n}))\n\nconst DashboardAdmin = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n\n useEffect(() => {\n dispatch(globalActions.setIsVisibleButtonShowValues(true))\n return () => {\n dispatch(globalActions.setIsVisibleButtonShowValues(false))\n }\n }, [])\n\n return (\n \n (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n >\n )}\n no={() => }\n />\n \n )\n}\n\nexport default DashboardAdmin\n","import { colors } from '@material-ui/core'\n\nconst buildGradient = (start, end) =>\n `linear-gradient(180deg, ${start} 0%, ${end} 100%)`\n\nconst grey = buildGradient(colors.grey[400], colors.grey[600])\nconst blue = buildGradient(colors.blue[700], colors.blue[900])\nconst indigo = buildGradient(colors.indigo[400], colors.indigo[600])\nconst green = buildGradient(colors.green[400], colors.green[600])\nconst orange = buildGradient(colors.orange[400], colors.orange[700])\nconst red = buildGradient(colors.red[500], colors.red[700])\nconst primary = buildGradient('#f7ac52', '#FFC20A')\n\nexport default {\n grey,\n blue,\n indigo,\n green,\n orange,\n red,\n primary\n}\n","import React, { useState, useEffect } from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport validate from 'validate.js'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport { usuarioAction } from '../../../../_actions'\nimport {\n Button,\n Checkbox,\n FormHelperText,\n TextField,\n Typography,\n Link,\n FormControl,\n InputLabel,\n OutlinedInput,\n InputAdornment,\n IconButton\n} from '@material-ui/core'\nimport Visibility from '@material-ui/icons/Visibility'\nimport VisibilityOff from '@material-ui/icons/VisibilityOff'\nimport { useDispatch, useSelector } from 'react-redux'\n\nconst schema = {\n nome: {\n presence: { allowEmpty: false, message: 'é obrigatório' },\n length: {\n maximum: 65\n }\n },\n usuario: {\n presence: { allowEmpty: false, message: 'é obrigatório' },\n length: {\n maximum: 65\n }\n },\n email: {\n presence: { allowEmpty: false, message: 'é obrigatório' },\n email: true,\n length: {\n maximum: 64\n }\n },\n senha: {\n presence: { allowEmpty: false, message: 'é obrigatório' },\n length: {\n maximum: 128\n }\n },\n termosDeUso: {\n presence: { allowEmpty: false, message: 'é obrigatório' },\n checked: true\n }\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n fields: {\n margin: theme.spacing(-1),\n display: 'flex',\n flexWrap: 'wrap',\n '& > *': {\n flexGrow: 1,\n margin: theme.spacing(1)\n }\n },\n termosDeUso: {\n display: 'flex',\n alignItems: 'center',\n marginTop: theme.spacing(-1)\n },\n termosDeUsoCheckbox: {\n marginLeft: '-14px'\n },\n submitButton: {\n marginTop: theme.spacing(0.5),\n width: '100%'\n }\n}))\n\nconst CadastroForm = (props) => {\n const { className, ...rest } = props\n const dispatch = useDispatch()\n const classes = useStyles()\n const loading = useSelector((state) => state.usuario.loading)\n const user = useSelector((state) => state.usuario)\n const [formState, setFormState] = useState({\n isValid: false,\n values: {},\n touched: {},\n errors: {}\n })\n\n const [showPassword, setShowPassword] = useState(false)\n\n const handleClickShowPassword = () => {\n setShowPassword(!showPassword)\n }\n\n const handleMouseDownPassword = (event) => {\n event.preventDefault()\n }\n\n useEffect(() => {\n const errors = validate(formState.values, schema)\n\n setFormState((formState) => ({\n ...formState,\n isValid: errors ? false : true,\n errors: errors || {}\n }))\n }, [formState.values])\n\n const handleChange = (event) => {\n event.persist()\n\n setFormState((formState) => ({\n ...formState,\n values: {\n ...formState.values,\n [event.target.name]:\n event.target.type === 'checkbox'\n ? event.target.checked\n : event.target.value\n },\n touched: {\n ...formState.touched,\n [event.target.name]: true\n }\n }))\n }\n\n const handleChangeUsername = (prop) => (event) => {\n event.persist()\n\n setFormState((formState) => ({\n ...formState,\n values: {\n ...formState.values,\n usuario: event.target.value\n }\n }))\n dispatch(usuarioAction.onChangeProps(prop, event))\n }\n\n const handleChangeEmail = (event) => {\n event.persist()\n\n setFormState((formState) => ({\n ...formState,\n values: {\n ...formState.values,\n email: event.target.value.toLowerCase()\n }\n }))\n }\n\n const handleSubmit = async (event) => {\n event.preventDefault()\n let payload = {\n id: 0,\n email: formState.values.email,\n nome: formState.values.nome,\n senha: formState.values.senha,\n username: formState.values.usuario,\n tipoUsuarioId: 1\n }\n dispatch(usuarioAction.createUsuario(payload))\n }\n\n const hasError = (field) =>\n formState.touched[field] && formState.errors[field] ? true : false\n\n return (\n \n )\n}\n\nCadastroForm.propTypes = {\n className: PropTypes.string\n}\n\nexport default CadastroForm\n","import React, { useState } from 'react'\nimport { Button, Grid } from '@material-ui/core'\nimport { Google } from '../../../../icons'\nimport { authActions } from '../../../../_actions'\nimport FacebookIcon from '@material-ui/icons/Facebook'\nimport FacebookLogin from 'react-facebook-login/dist/facebook-login-render-props'\nimport { makeStyles } from '@material-ui/styles'\nimport { useDispatch } from 'react-redux'\n\nconst useStyles = makeStyles((theme) => ({\n facebook: {\n backgroundColor: '#3b5998',\n textTransform: 'none',\n '&:hover': {\n backgroundColor: theme.palette.secondary.light\n }\n },\n google: {\n backgroundColor: '#fff',\n textTransform: 'none',\n color: theme.palette.primary.dark,\n '&:hover': {\n color: 'white'\n }\n }\n}))\n\nconst SocialButtons = () => {\n const classes = useStyles()\n const [submitted, setSubmitted] = useState(false)\n const dispatch = useDispatch()\n const responseFacebook = (response) => {\n if (response.accessToken) {\n dispatch(authActions.facebookLogin(response.accessToken, true))\n }\n }\n return (\n \n \n \n (\n }\n >\n {submitted ? (\n 'Validando informações...'\n ) : (\n <>\n Entrar com\n Facebook \n >\n )}\n \n )}\n />\n \n {/* \n }\n >\n {submitted ? (\n 'Validando informações...'\n ) : (\n <>\n Entrar com\n Google \n >\n )}\n \n */}\n \n
\n )\n}\n\nexport default SocialButtons\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardContent,\n Typography,\n Divider,\n Link,\n Hidden\n} from '@material-ui/core'\nimport Image from 'material-ui-image'\nimport PersonAddIcon from '@material-ui/icons/PersonAddOutlined'\n\nimport gradients from 'utils/gradients'\nimport { Page } from 'components'\nimport { CadastroForm } from './components'\nimport SocialButtons from './components/SocialButtons/SocialButtons'\nimport TagManager from 'react-gtm-module'\n\nconst tagManagerArgs = {\n dataLayer: {\n event: 'pageView',\n page: '/cadastro'\n },\n dataLayerName: 'PaginaCadastro'\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(6, 2)\n },\n card: {\n width: theme.breakpoints.values.md,\n maxWidth: '100%',\n overflow: 'unset',\n display: 'flex',\n position: 'relative',\n '& > *': {\n flexGrow: 1,\n flexBasis: '50%',\n width: '50%'\n },\n [theme.breakpoints.down('sm')]: {\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1)\n },\n [theme.breakpoints.down('xs')]: {\n marginTop: theme.spacing(20),\n marginBottom: theme.spacing(3)\n }\n },\n content: {\n padding: theme.spacing(6, 4, 3, 3)\n },\n media: {\n // borderTopRightRadius: 4,\n // borderBottomRightRadius: 4,\n padding: theme.spacing(7)\n // color: theme.palette.white,\n // display: 'flex',\n // flexDirection: 'column',\n // justifyContent: 'flex-end',\n // [theme.breakpoints.down('md')]: {\n // display: 'none'\n // }\n },\n icon: {\n backgroundImage: gradients.primary,\n color: theme.palette.white,\n borderRadius: theme.shape.borderRadius,\n padding: theme.spacing(1),\n position: 'absolute',\n top: -32,\n left: theme.spacing(3),\n height: 64,\n width: 64,\n fontSize: 32\n },\n registerForm: {\n marginTop: theme.spacing(2)\n },\n divider: {\n margin: theme.spacing(2, 0)\n },\n person: {\n marginTop: theme.spacing(2),\n display: 'flex'\n },\n avatar: {\n marginRight: theme.spacing(2)\n }\n}))\n\nconst Cadastro = () => {\n TagManager.dataLayer(tagManagerArgs)\n const classes = useStyles()\n return (\n \n \n \n \n \n Cadastrar-se\n \n \n Descubra uma forma simples de gerenciar eventos\n \n \n \n {/* \n ou\n */}\n \n \n \n Já tem uma conta? 🤔\n \n \n \n \n \n \n \n )\n}\n\nexport default Cadastro\n","export default () => {\n var today = new Date()\n var curHr = today.getHours()\n\n if (curHr < 12) {\n return 'Bom dia 🌞'\n } else if (curHr < 18) {\n return 'Boa tarde ✌'\n } else {\n return 'Boa noite 🌜'\n }\n}\n","import React from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Typography,\n Grid,\n Button,\n Hidden,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport BarChartIcon from '@material-ui/icons/BarChart'\nimport messageTime from 'utils/stringTimeHello'\nimport { history } from 'utils'\nimport Image from 'material-ui-image'\nimport { eventoAction } from '_actions'\nimport EventRoundedIcon from '@material-ui/icons/EventRounded'\n\nconst useStyles = makeStyles((theme) => ({\n root: {}\n}))\n\nconst Header = (props) => {\n const { className, ...rest } = props\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const dispatch = useDispatch()\n const user = useSelector((state) => state.authentication.user)\n const classes = useStyles()\n const isDisabled = useSelector((state) => {\n if (\n state.usuarioEstabelecimento.usuarioEstabelecimento.length <= 0 ||\n !state.authentication.user.emailVerificado\n ) {\n return true\n }\n return false\n })\n\n const handleClickNewEvent = () => {\n dispatch(eventoAction.prepareStateToNewEvento())\n }\n\n return (\n \n \n \n \n Página inicial\n \n \n {messageTime()}, {user.nome.split(' ').slice(0, -1).join(' ')}\n \n \n Dê uma espiada no que está acontecendo hoje\n \n \n \n history.push('/dashboard')}\n startIcon={ }\n >\n Ver dashboard\n \n \n \n handleClickNewEvent()}\n startIcon={ }\n >\n Criar novo evento\n \n \n \n \n\n \n \n \n \n \n \n
\n )\n}\n\nHeader.propTypes = {\n className: PropTypes.string\n}\n\nexport default Header\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n Typography,\n Grid,\n CardHeader,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport { Skeleton } from '@material-ui/lab'\nimport CachedRoundedIcon from '@material-ui/icons/CachedRounded'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { dashboardAction } from '_actions'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n item: {\n padding: theme.spacing(2),\n textAlign: 'center',\n [theme.breakpoints.up('md')]: {\n '&:not(:last-of-type)': {\n borderRight: `1px solid ${theme.palette.divider}`\n }\n },\n [theme.breakpoints.down('sm')]: {\n '&:not(:last-of-type)': {\n borderBottom: `1px solid ${theme.palette.divider}`\n }\n }\n },\n titleWrapper: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n },\n label: {\n marginLeft: theme.spacing(1),\n marginTop: theme.spacing(1)\n },\n h2: {\n paddingTop: theme.spacing(1)\n },\n header: {\n marginBottom: theme.spacing(-7)\n }\n}))\n\nconst Statistics = (props) => {\n const { className, dashboardHome, isLoading, ...rest } = props\n const classes = useStyles()\n const dispatch = useDispatch()\n const { estabelecimentoId } = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const handleClickRefresh = () => {\n if (estabelecimentoId !== '') {\n dispatch(dashboardAction.getDashboardHome(estabelecimentoId))\n }\n }\n const { showValues } = useSelector((state) => state.global)\n return (\n \n \n \n \n \n \n }\n />\n \n \n \n Pedidos aguardando pagamento\n \n \n {isLoading || !showValues ? (\n \n ) : (\n dashboardHome.quantidadePedidosPendentes\n )}\n \n \n \n \n Pedidos realizados últimos 7 dias\n \n \n {isLoading || !showValues ? (\n \n ) : (\n dashboardHome.quantidadePagamentos7Dias\n )}\n \n \n \n \n Valor recebido últimos 7 dias\n \n \n {isLoading || !showValues ? (\n \n ) : (\n Intl.NumberFormat('pt-BR', {\n style: 'currency',\n currency: 'BRL'\n }).format(dashboardHome.valorPagamentos7Dias)\n )}\n \n \n \n \n Eventos ativos\n \n \n {isLoading || !showValues ? (\n \n ) : (\n dashboardHome.eventosAtivos\n )}\n \n \n \n \n )\n}\n\nStatistics.propTypes = {\n className: PropTypes.string,\n dashboardHome: PropTypes.object.isRequired\n}\n\nexport default Statistics\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport clsx from 'clsx'\nimport { history } from 'utils'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n Typography,\n Button,\n CircularProgress,\n Box,\n useMediaQuery,\n useTheme\n} from '@material-ui/core'\nimport { Alert, AlertTitle } from '@material-ui/lab'\nimport { crudService } from '_services/'\nimport { useTimer } from 'use-timer'\nimport { toast } from 'react-toastify'\n\nfunction CircularProgressWithLabel(props) {\n return (\n \n \n \n {`${props.value}s`} \n \n \n )\n}\n\nCircularProgressWithLabel.propTypes = {\n /**\n * The value of the progress indicator for the determinate and static variants.\n * Value between 0 and 100.\n */\n value: PropTypes.number.isRequired\n}\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst Notifications = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const { time, start, isRunning } = useTimer({\n initialTime: 99,\n endTime: 0,\n timerType: 'DECREMENTAL'\n })\n\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento.usuarioEstabelecimento.length\n )\n\n const emailVerificado = useSelector(\n (state) => state.authentication.user.emailVerificado\n )\n\n const email = useSelector((state) => state.authentication.user.email)\n\n const requestEmailVerification = (email) => {\n let payload = {\n email: email\n }\n let apiEndpoint = 'usuarios/request-email-verification'\n crudService\n .post(apiEndpoint, payload)\n .then(() => {\n start()\n toast.success('E-mail enviado! 📩 Verifique a caixa de entrada!')\n })\n .catch(() => {\n toast.error('Aconteceu um erro inesperado ao enviar o e-mail! 😪')\n })\n }\n return (\n <>\n {!emailVerificado && (\n \n \n {isRunning && (\n <>\n \n Enviar novamente em\n \n \n >\n )}\n requestEmailVerification(email)}\n >\n Reenviar e-mail\n \n >\n )\n }\n severity=\"error\"\n >\n \n \n {' '}\n Seu e-mail não foi verificado... 😪 Para usar a\n plataforma confirme seu endereço email!\n \n \n \n Verifique a caixa de entrada do seu e-mail para continuar com a\n confirmação.\n \n {isMobile && (\n requestEmailVerification(email)}\n >\n {isRunning ? 'Enviar novamente' : 'Reenviar e-mail'}\n {isRunning && }\n \n )}\n \n \n )}\n {(usuarioEstabelecimento === 0 || usuarioEstabelecimento === undefined) &&\n emailVerificado && (\n \n history.push(`/estabelecimento/`)}\n color=\"inherit\"\n size=\"small\"\n disabled={!emailVerificado}\n >\n CADASTRAR AGORA\n \n )\n }\n severity=\"warning\"\n >\n \n \n Notamos que você ainda não cadastrou nenhum organizador e/ou\n estabelecimento.\n \n Para liberar e aproveitar todas as funções clique no botão ao\n lado para iniciar seu primeiro cadastro.\n \n \n \n ATENÇÃO! Você precisa cadastrar ao menos um organizador e/ou\n estabelecimento para criar seu evento!\n \n {isMobile && (\n history.push(`/estabelecimento/`)}\n color=\"inherit\"\n size=\"small\"\n disabled={!emailVerificado}\n >\n CADASTRAR AGORA\n \n )}\n \n \n )}\n >\n )\n}\n\nNotifications.propTypes = {\n className: PropTypes.string\n}\n\nexport default Notifications\n","import React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport Button from '@material-ui/core/Button'\nimport Dialog from '@material-ui/core/Dialog'\nimport DialogTitle from '@material-ui/core/DialogTitle'\nimport DialogContent from '@material-ui/core/DialogContent'\nimport DialogActions from '@material-ui/core/DialogActions'\nimport Typography from '@material-ui/core/Typography'\nimport { history } from 'utils'\n\nconst FirstEstabelecimento = () => {\n const { usuarioEstabelecimento } = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const emailVerificado = useSelector(\n (state) => state.authentication.user.emailVerificado\n )\n const [open, setOpen] = useState(false)\n\n const handleClick = () => {\n setOpen(false)\n history.push(`/estabelecimento/`)\n }\n const handleClose = () => {\n setOpen(false)\n }\n\n useEffect(() => {\n if (\n (usuarioEstabelecimento.length === 0 ||\n usuarioEstabelecimento === undefined) &&\n emailVerificado\n ) {\n setOpen(true)\n } else {\n setOpen(false)\n }\n }, [usuarioEstabelecimento, emailVerificado])\n\n return (\n \n \n \n Saudações do Corujas 🦉\n \n \n \n Seja bem vindo a plataforma para gerenciar seus eventos de forma\n simples, rápida e eficaz.\n \n \n O Corujas e todo seu time estão prontos e dispostos a lhe ajudar em\n quaisquer dúvidas e dificuldades que forem encontradas em nossa\n plataforma.\n \n \n Notamos que você ainda não cadastrou nenhum organizador e/ou\n estabelecimento. Para liberar e aproveitar todas as funções clique\n no botão abaixo para iniciar seu primeiro cadastro.\n \n \n \n \n Vamos lá!\n \n \n \n
\n )\n}\n\nexport default FirstEstabelecimento\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { v1 as uuid } from 'uuid'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n IconButton,\n List,\n ListItem,\n ListItemIcon,\n ListItemSecondaryAction,\n ListItemText,\n Typography,\n Tooltip\n} from '@material-ui/core'\nimport ArrowForwardIcon from '@material-ui/icons/ArrowForwardOutlined'\nimport PaymentIcon from '@material-ui/icons/PaymentOutlined'\nimport NotificationsActiveOutlinedIcon from '@material-ui/icons/NotificationsActiveOutlined'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n value: {\n fontWeight: theme.typography.fontWeightMedium\n },\n type: {\n fontWeight: theme.typography.fontWeightMedium\n }\n}))\n\nconst Summary = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n const summary = [\n {\n id: uuid(),\n value: 2,\n type: 'ações',\n message: 'que precisam de sua atenção'\n },\n {\n id: uuid(),\n value: 3,\n type: 'pagamentos',\n message: 'que precisam de sua confirmação'\n }\n ]\n\n const icons = {\n ações: ,\n pagamentos: \n }\n\n return (\n \n \n {summary.map((notification, i) => (\n \n {icons[notification.type]} \n \n \n {notification.value} {' '}\n {notification.type} {' '}\n {notification.message}\n \n \n \n \n \n \n \n \n \n \n ))}\n
\n \n )\n}\n\nSummary.propTypes = {\n className: PropTypes.string\n}\n\nexport default Summary\n","import React, { useEffect } from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Page } from 'components'\n\nimport {\n Notifications,\n Header,\n Statistics,\n Summary,\n FirstEstabelecimento\n} from './components'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { dashboardAction, globalActions } from '_actions'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3),\n [theme.breakpoints.up('lg')]: {\n paddingTop: theme.spacing(0)\n }\n },\n statistics: {\n [theme.breakpoints.down('md')]: {\n marginTop: theme.spacing(3)\n }\n },\n notifications: {\n marginTop: theme.spacing(3),\n [theme.breakpoints.down('md')]: {\n marginTop: theme.spacing(0),\n marginBottom: theme.spacing(3)\n }\n },\n summary: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst Home = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { dashboardHome, isLoading } = useSelector((state) => state.dashboard)\n const { estabelecimentoId } = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n\n useEffect(() => {\n if (estabelecimentoId !== '') {\n dispatch(dashboardAction.getDashboardHome(estabelecimentoId))\n }\n }, [dispatch, estabelecimentoId])\n\n useEffect(() => {\n dispatch(globalActions.setIsVisibleButtonShowValues(true))\n return () => {\n dispatch(globalActions.setIsVisibleButtonShowValues(false))\n }\n }, [])\n\n return (\n \n \n \n \n \n {/* */}\n \n )\n}\n\nexport default Home\n","import React, { useEffect, useState } from 'react'\nimport {\n makeStyles,\n Tooltip,\n Paper,\n Typography,\n IconButton\n} from '@material-ui/core'\nimport { formatCurrency } from 'utils'\nimport VisibilityOffTwoToneIcon from '@material-ui/icons/VisibilityOffTwoTone'\nimport VisibilityTwoToneIcon from '@material-ui/icons/VisibilityTwoTone'\nimport { Skeleton } from '@material-ui/lab'\nimport { Navigation } from '..'\nimport { useSelector } from 'react-redux'\nimport { useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'column'\n },\n tab: {\n width: '100%',\n // maxWidth: theme.breakpoints.values.md,\n ...constants.shadowCard,\n padding: 10\n },\n divMiddlePaper: {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center'\n },\n middlePaper: {\n position: 'relative',\n borderRadius: '10px',\n webkitBorderRadius: '10px',\n mozBorderRadius: '10px',\n boxShadow: 'rgb(0 0 0 / 8%) 0px 2px 16px',\n height: '100px',\n [theme.breakpoints.up('md')]: {\n width: theme.spacing(40),\n marginBottom: theme.spacing(-5)\n },\n [theme.breakpoints.down('sm')]: {\n width: '100%',\n marginBottom: theme.spacing(4)\n }\n }\n}))\n\nexport default function CardSaldo() {\n const classes = useStyles()\n const { tab } = useParams()\n const saldo = useSelector(\n (state) =>\n state.ingresso.ingresso.reduce((a, b) => a + (b['valor'] || 0), 0) -\n state.ingresso.ingresso.reduce(\n (a, b) => a + (b['valorDesconto'] || 0),\n 0\n ) -\n state.ingresso.ingresso.reduce((a, b) => a + (b['valorTaxa'] || 0), 0)\n )\n const saldoALiberar = useSelector(\n (state) =>\n state.ingresso.ingressoALiberar.reduce(\n (a, b) => a + (b['valor'] || 0),\n 0\n ) -\n state.ingresso.ingressoALiberar.reduce(\n (a, b) => a + (b['valorDesconto'] || 0),\n 0\n ) -\n state.ingresso.ingressoALiberar.reduce(\n (a, b) => a + (b['valorTaxa'] || 0),\n 0\n )\n )\n\n const { isLoading } = useSelector((state) => state.ingresso)\n const { showValues } = useSelector((state) => state.global)\n const [visible, setVisible] = useState(showValues)\n\n useEffect(() => {\n setVisible(showValues)\n }, [showValues])\n\n return (\n \n
\n
\n \n {tab === 'aliberar' ? 'Saldo a liberar:' : 'Saldo:'}\n \n \n \n {visible && !isLoading ? (\n formatCurrency(tab === 'aliberar' ? saldoALiberar : saldo)\n ) : (\n \n )}\n \n \n setVisible(!visible)}\n >\n {visible ? (\n \n ) : (\n \n )}\n \n \n
\n \n
\n
\n
\n )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport clsx from 'clsx'\nimport { history } from 'utils'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n Typography,\n Button,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport { Alert, AlertTitle } from '@material-ui/lab'\nimport useRouter from 'utils/useRouter'\n\nconst useStyles = makeStyles((theme) => ({\n button: {\n [theme.breakpoints.up('md')]: {\n marginRight: theme.spacing(2)\n },\n webkitTransition: 'all 300ms ease',\n transition: 'all 300ms ease',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A'\n }\n }\n}))\n\nconst Notifications = (props) => {\n const { className } = props\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const { match } = useRouter()\n const { url } = match\n\n const hasContaBancaria = useSelector((state) => {\n if (state.contaBancaria.contaBancaria.length > 0) {\n return true\n }\n return false\n })\n\n const { isFetching } = useSelector((state) => state.contaBancaria)\n return (\n <>\n {!hasContaBancaria && !isFetching && !url.includes('contasBancarias') && (\n \n \n \n history.push(`/carteira/contasBancarias/cadastro`)\n }\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n >\n Cadastrar conta! 💰\n \n \n history.push(`/carteira/contasBancarias/pix`)\n }\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n >\n Cadastrar Pix! 💰\n \n >\n )\n }\n severity=\"error\"\n >\n \n \n Notamos que você ainda não cadastrou nenhuma conta bancária.\n \n \n \n ATENÇÃO! Você precisa cadastrar ao menos um conta bancária para\n realizar retiradas!\n \n {isMobile && (\n <>\n \n history.push(`/carteira/contasBancarias/cadastro`)\n }\n >\n Cadastrar conta! 💰\n \n history.push(`/carteira/contasBancarias/pix`)}\n >\n Cadastrar Pix! 💰\n \n >\n )}\n \n \n )}\n >\n )\n}\n\nNotifications.propTypes = {\n className: PropTypes.string\n}\n\nexport default Notifications\n","import React, { Fragment, useRef, useState, memo } from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Tooltip,\n IconButton,\n Menu,\n MenuItem,\n Switch,\n FormControlLabel,\n Typography\n} from '@material-ui/core'\nimport SortRoundedIcon from '@material-ui/icons/SortRounded'\n\nconst useStyles = makeStyles((theme) => ({\n title: { paddingLeft: theme.spacing(2), paddingTop: theme.spacing(1) }\n}))\n\nconst SortSwitches = (props) => {\n const classes = useStyles()\n const moreRef = useRef(null)\n const { sortByEvento, setSortByEvento, sortByLote, setSortByLote } = props\n const [openMenu, setOpenMenu] = useState(false)\n\n const handleMenuOpen = () => {\n setOpenMenu(true)\n }\n\n const handleMenuClose = () => {\n setOpenMenu(false)\n }\n\n return (\n \n \n \n \n \n \n \n \n Agrupar por:\n \n \n setSortByEvento(event.target.checked)}\n name=\"sortByEvento\"\n inputProps={{ 'aria-label': 'agrupar por eventos' }}\n />\n }\n label=\"Eventos\"\n />\n \n {sortByEvento && (\n \n setSortByLote(event.target.checked)}\n name=\"sortByLote\"\n inputProps={{ 'aria-label': 'agrupar por lotes' }}\n />\n }\n label=\"Lotes\"\n />\n \n )}\n \n \n )\n}\n\nSortSwitches.propTypes = {\n className: PropTypes.string\n}\n\nexport default memo(SortSwitches)\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport {\n withStyles,\n makeStyles,\n Table,\n colors,\n Button,\n useTheme,\n useMediaQuery,\n Collapse,\n Badge,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Toolbar,\n Typography,\n Paper,\n Checkbox,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { ingressoAction } from '_actions'\nimport { formatCurrency, toLocalDateFormat, useDidMountEffect } from 'utils'\nimport { MessageData, Label, SkeletonTable } from 'components'\nimport { ModalSolicitarRetirada } from '..'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'\nimport LibraryAddCheckIcon from '@material-ui/icons/LibraryAddCheck'\nimport { SortSwitches } from './components'\nimport { Skeleton } from '@material-ui/lab'\n\nvar pluralize = require('pluralize')\n\nconst StyledBadge = withStyles((theme) => ({\n badge: {\n right: -3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px'\n }\n}))(Badge)\n\nconst statusColors = {\n 5: colors.green[600],\n 2: colors.red[600]\n}\n\nconst headCells = [\n {\n id: 'evento-lote',\n numeric: false,\n disablePadding: true,\n label: 'Evento - (Lote)'\n },\n {\n id: 'data-evento',\n numeric: true,\n disablePadding: false,\n label: 'Data evento'\n },\n {\n id: 'valor',\n numeric: true,\n disablePadding: false,\n label: 'Valor total (R$)'\n },\n { id: 'status', numeric: true, disablePadding: false, label: 'Status' }\n]\n\nfunction EnhancedTableHead(props) {\n const { onSelectAllClick, order, orderBy, numSelected, rowCount } = props\n\n return (\n \n \n \n 0 && numSelected === rowCount\n ? 'Desmarcar todos'\n : 'Marcar todos'\n }\n >\n }\n color=\"primary\"\n indeterminate={numSelected > 0 && numSelected < rowCount}\n checked={rowCount > 0 && numSelected === rowCount}\n onChange={onSelectAllClick}\n inputProps={{ 'aria-label': 'select all tickets' }}\n />\n \n \n {headCells.map((headCell) => (\n \n {headCell.label}\n \n ))}\n \n \n )\n}\n\nEnhancedTableHead.propTypes = {\n classes: PropTypes.object.isRequired,\n numSelected: PropTypes.number.isRequired,\n onSelectAllClick: PropTypes.func.isRequired,\n order: PropTypes.oneOf(['asc', 'desc']).isRequired,\n orderBy: PropTypes.string.isRequired,\n rowCount: PropTypes.number.isRequired\n}\n\nconst useToolbarStyles = makeStyles((theme) => ({\n root: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n highlight: {\n borderRadius: '8px 8px 0px 0px',\n webkitBorderRadius: '8px 8px 0px 0px',\n mozBorderRadius: '8px 8px 0px 0px',\n color: theme.palette.text.primary,\n backgroundColor: 'rgba(225, 194, 10, 0.1)'\n },\n title: {\n flex: '1 1 100%'\n },\n buttonRetirar: {\n whiteSpace: 'nowrap',\n [theme.breakpoints.up('sm')]: {\n minWidth: 150,\n marginRight: theme.spacing(4)\n },\n marginRight: theme.spacing(1),\n marginLeft: theme.spacing(1)\n }\n}))\n\nexport default function TableIngressosLiberados() {\n function Row(props) {\n const { row, index, showValues } = props\n const [open, setOpen] = useState(false)\n const [openLote, setOpenLote] = useState(false)\n const labelId = `enhanced-table-checkbox-${index}`\n const haveRowEvento =\n row.ingressosSortedByEvento !== undefined &&\n row.ingressosSortedByEvento.length > 0\n ? true\n : false\n\n const sizeIngressoByEvento = ingressos.filter(\n (c) => c.lote.eventoId === row.lote.eventoId\n ).length\n const sizeSelectedIngressoByEvento = selectedIngressos.filter(\n (c) => c.lote.eventoId === row.lote.eventoId\n ).length\n\n const allIngressosSelectedByEvento =\n sizeSelectedIngressoByEvento === sizeIngressoByEvento ? true : false\n const isItemSelected = (eventoId) =>\n selectedIngressos.some((n) => n.id === eventoId)\n function totalValueRowLote(ingressosSortedByLote) {\n var value = 0\n const haveRowLote =\n ingressosSortedByLote !== undefined && ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value +=\n ingressosSortedByLote.reduce((a, b) => a + (b['valor'] || 0), 0) -\n ingressosSortedByLote.reduce(\n (a, b) => a + (b['valorDesconto'] || 0),\n 0\n ) -\n ingressosSortedByLote.reduce((a, b) => a + (b['valorTaxa'] || 0), 0)\n }\n return value\n }\n\n function totalValueRowEvento(ingressosSortedByEvento) {\n var value = 0\n ingressosSortedByEvento.map((row) => {\n const haveRowLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value += totalValueRowLote(row.ingressosSortedByLote)\n } else {\n value += row.valor - row.valorTaxa - row.valorDesconto\n }\n })\n\n return value\n }\n const totalValueRow = haveRowEvento\n ? totalValueRowEvento(row.ingressosSortedByEvento)\n : row.valor - row.valorTaxa - row.valorDesconto\n\n const handleSelectAllRowEvento = (eventoId) => {\n if (allIngressosSelectedByEvento) {\n const newSelecteds = selectedIngressos.filter(\n (n) => n.lote.eventoId !== eventoId\n )\n setSelectedIngressos(newSelecteds)\n return\n } else if (sizeSelectedIngressoByEvento > 0) {\n const selectedIngressosExcludeEvento = selectedIngressos.filter(\n (n) => n.lote.eventoId !== eventoId\n )\n const newSelecteds = ingressos.filter(\n (n) => n.lote.eventoId === eventoId\n )\n setSelectedIngressos([\n ...selectedIngressosExcludeEvento,\n ...newSelecteds\n ])\n return\n } else {\n const newSelecteds = ingressos.filter(\n (n) => n.lote.eventoId === eventoId\n )\n setSelectedIngressos([...selectedIngressos, ...newSelecteds])\n return\n }\n }\n\n return (\n <>\n \n \n \n {haveRowEvento ? (\n \n 0\n ? true\n : false\n }\n onClick={() => handleSelectAllRowEvento(row.lote.eventoId)}\n checkedIcon={ }\n color=\"primary\"\n checked={allIngressosSelectedByEvento}\n inputProps={{ 'aria-labelledby': labelId }}\n />\n \n ) : (\n handleClick(row)}\n color=\"primary\"\n checked={isItemSelected(row.id)}\n inputProps={{ 'aria-labelledby': labelId }}\n />\n )}\n {haveRowEvento && (\n \n setOpen(!open)}\n >\n \n {open ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {haveRowEvento\n ? row.lote.evento.nome\n : `${row.lote.evento.nome} - (${row.lote.descricao} - ${row.lote.tipoIngresso.descricao})`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n \n {showValues ? (\n formatCurrency(totalValueRow)\n ) : (\n \n )}\n \n \n \n {row.statusIngresso.descricao}\n \n \n \n {haveRowEvento && (\n \n \n \n \n \n {row.ingressosSortedByEvento.map((row) => {\n const hasLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n\n const sizeIngressoByLote = ingressos.filter(\n (c) => c.lote.id === row.lote.id\n ).length\n const sizeSelectedIngressoByLote = selectedIngressos.filter(\n (c) => c.lote.id === row.lote.id\n ).length\n\n const allIngressosSelectedByLote =\n sizeSelectedIngressoByLote === sizeIngressoByLote\n ? true\n : false\n const handleSelectAllRowLote = (loteId) => {\n if (allIngressosSelectedByLote) {\n const newSelecteds = selectedIngressos.filter(\n (n) => n.lote.id !== loteId\n )\n setSelectedIngressos(newSelecteds)\n return\n } else if (sizeSelectedIngressoByLote > 0) {\n const selectedIngressosExcludeLote = selectedIngressos.filter(\n (n) => n.lote.id !== loteId\n )\n const newSelecteds = ingressos.filter(\n (n) => n.lote.id === loteId\n )\n setSelectedIngressos([\n ...selectedIngressosExcludeLote,\n ...newSelecteds\n ])\n return\n } else {\n const newSelecteds = ingressos.filter(\n (n) => n.lote.id === loteId\n )\n setSelectedIngressos([\n ...selectedIngressos,\n ...newSelecteds\n ])\n return\n }\n }\n return (\n <>\n \n \n \n {hasLote ? (\n \n 0\n ? true\n : false\n }\n onClick={() =>\n handleSelectAllRowLote(row.lote.id)\n }\n checkedIcon={ }\n color=\"primary\"\n checked={allIngressosSelectedByLote}\n inputProps={{\n 'aria-labelledby': labelId\n }}\n />\n \n ) : (\n handleClick(row)}\n color=\"primary\"\n checked={isItemSelected(row.id)}\n inputProps={{ 'aria-labelledby': labelId }}\n />\n )}\n {hasLote && (\n \n setOpenLote(!openLote)}\n >\n \n {openLote ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {`${row.lote.descricao} - ${row.lote.tipoIngresso.descricao}`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n \n {hasLote\n ? formatCurrency(\n totalValueRowLote(row.ingressosSortedByLote)\n )\n : formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n \n {row.statusIngresso.descricao}\n \n \n \n {hasLote && (\n \n \n \n \n \n {row.ingressosSortedByLote.map((row) => {\n return (\n \n \n handleClick(row)}\n color=\"primary\"\n checked={isItemSelected(row.id)}\n inputProps={{\n 'aria-labelledby': labelId\n }}\n />\n \n \n {`Ingresso n.º: ${row.id}`}\n \n \n {`Cliente: ${row.usuario.nome}`}\n \n \n {formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n \n {row.statusIngresso.descricao}\n \n \n \n )\n })}\n \n
\n \n \n \n )}\n >\n )\n })}\n \n
\n \n \n \n )}\n >\n )\n }\n const EnhancedTableToolbar = (props) => {\n const classes = useToolbarStyles()\n const { numSelected, showValues } = props\n return (\n 0\n })}\n >\n {numSelected > 0 ? (\n \n {`${pluralize('selecionados', numSelected, true)}`}\n \n ) : (\n <>\n \n Ingressos disponíveis para retirada\n \n \n >\n )}\n\n {numSelected > 0 && (\n <>\n \n {`Valor total à retirar: ${\n showValues ? formatCurrency(valorTotalARetirar) : `R$ **,**`\n }`}\n \n {!hasContaBancaria ? (\n \n \n \n {isMobile ? 'Retirar' : 'Solicitar retirada'}\n \n \n \n ) : (\n \n {isMobile ? 'Retirar' : 'Solicitar retirada'}\n \n )}\n\n \n \n \n \n \n \n >\n )}\n \n )\n }\n\n EnhancedTableToolbar.propTypes = {\n numSelected: PropTypes.number.isRequired\n }\n\n const useStyles = makeStyles((theme) => ({\n root: {\n width: '100%'\n },\n table: {\n minWidth: 750\n },\n visuallyHidden: {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: 1,\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n top: 20,\n width: 1\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n boxShadow: 'rgb(0 0 0 / 8%) 0px 2px 8px',\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px'\n }\n }))\n\n const classes = useStyles()\n const [sortByEvento, setSortByEvento] = useState(true)\n const [sortByLote, setSortByLote] = useState(true)\n const { showValues } = useSelector((state) => state.global)\n const [openModal, setOpenModal] = useState(false)\n const [selectedIngressos, setSelectedIngressos] = useState([])\n const dispatch = useDispatch()\n const ingressos = useSelector((state) => state.ingresso.ingresso)\n const { isLoading } = useSelector((state) => state.ingresso)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const valorTotalARetirar =\n selectedIngressos.reduce((a, b) => a + (b['valor'] || 0), 0) -\n selectedIngressos.reduce((a, b) => a + (b['valorDesconto'] || 0), 0) -\n selectedIngressos.reduce((a, b) => a + (b['valorTaxa'] || 0), 0)\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const hasContaBancaria = useSelector((state) => {\n if (state.contaBancaria.contaBancaria.length > 0) {\n return true\n }\n return false\n })\n\n const ingressosSortByEventoAndLote = (ingressos) => {\n var ingressosSorted = []\n if (sortByEvento) {\n ingressos.map((row, index) => {\n if (index === 0) {\n ingressosSorted.push(row)\n } else {\n const ingressosSortedByEventoFindIndex = ingressosSorted.findIndex(\n (item) => item.lote.eventoId === row.lote.eventoId\n )\n if (ingressosSortedByEventoFindIndex !== -1) {\n if (\n ingressosSorted[ingressosSortedByEventoFindIndex]\n .ingressosSortedByEvento === undefined\n ) {\n ingressosSorted[ingressosSortedByEventoFindIndex] = {\n ...ingressosSorted[ingressosSortedByEventoFindIndex],\n ingressosSortedByEvento: [\n ingressosSorted[ingressosSortedByEventoFindIndex]\n ]\n }\n\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n } else {\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n }\n } else {\n ingressosSorted.push(row)\n }\n }\n })\n if (sortByLote) {\n ingressosSorted.map((row, index) => {\n if (row.ingressosSortedByEvento !== undefined) {\n const arrayIngressos = []\n row.ingressosSortedByEvento.map(\n (rowArrayEvento, indexArrayEvento) => {\n if (indexArrayEvento === 0) {\n arrayIngressos.push(rowArrayEvento)\n } else {\n const ingressosSortedByLoteFindIndex = arrayIngressos.findIndex(\n (item) => item.lote.id === rowArrayEvento.lote.id\n )\n if (ingressosSortedByLoteFindIndex !== -1) {\n if (\n arrayIngressos[ingressosSortedByLoteFindIndex]\n .ingressosSortedByLote === undefined\n ) {\n arrayIngressos[ingressosSortedByLoteFindIndex] = {\n ...arrayIngressos[ingressosSortedByLoteFindIndex],\n ingressosSortedByLote: [\n arrayIngressos[ingressosSortedByLoteFindIndex]\n ]\n }\n\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n } else {\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n }\n } else {\n arrayIngressos.push(rowArrayEvento)\n }\n }\n }\n )\n ingressosSorted[index].ingressosSortedByEvento = arrayIngressos\n }\n })\n }\n } else {\n ingressosSorted = ingressos\n }\n return ingressosSorted\n }\n\n useEffect(() => {\n !isLoading &&\n dispatch(\n ingressoAction.getIngressosLiberadosByEstabelecimento(estabelecimentoId)\n )\n setSelectedIngressos([])\n }, [estabelecimentoId])\n\n useDidMountEffect(() => {\n setSelectedIngressos([])\n }, [ingressos])\n\n const handleSelectAllClick = (event) => {\n if (event.target.checked) {\n const newSelecteds = ingressos\n setSelectedIngressos(newSelecteds)\n return\n }\n setSelectedIngressos([])\n }\n const handleClickDelete = () => {\n setSelectedIngressos([])\n }\n const handleClickSubmit = () => {\n setOpenModal(true)\n }\n\n const handleClick = (ingresso) => {\n const isSelected = selectedIngressos.some((n) => n.id === ingresso.id)\n if (isSelected) {\n const newSelected = selectedIngressos.filter((n) => n.id !== ingresso.id)\n setSelectedIngressos(newSelected)\n } else {\n const newSelecteds = ingressos.filter((n) => n.id === ingresso.id)\n setSelectedIngressos([...selectedIngressos, ...newSelecteds])\n }\n }\n\n return (\n \n {!isLoading ? (\n <>\n {ingressos && ingressos.length > 0 ? (\n <>\n
\n Total de ingressos encontrados: {ingressos.length} \n \n
\n \n \n \n \n \n {ingressosSortByEventoAndLote(ingressos).map(\n (row, index) => {\n return (\n
\n )\n }\n )}\n \n
\n \n \n >\n ) : (\n
\n )}\n
\n >\n ) : (\n
\n )}\n
\n )\n}\n","import {\n DialogContentText,\n Typography,\n makeStyles,\n Tooltip\n} from '@material-ui/core'\nimport React from 'react'\nimport { cpfCnpjMask } from 'utils'\nimport PropTypes from 'prop-types'\nimport { CheckCircleTwoTone } from '@material-ui/icons'\n\nconst useStyles = makeStyles((theme) => ({\n card: {\n border: `1px solid ${theme.palette.primary.light}`,\n borderRadius: '5px',\n webkitBorderRadius: '5px',\n mozBorderRadius: '5px',\n padding: 10\n },\n totalLabel: {\n [theme.breakpoints.up('sm')]: {\n marginTop: theme.spacing(4)\n }\n },\n radio: { display: 'flex', alignItems: 'flex-end' }\n}))\n\nconst CardContaBancaria = ({ contaBancaria }) => {\n const classes = useStyles()\n\n return (\n \n {contaBancaria !== undefined && (\n
\n \n \n {contaBancaria.padrao\n ? contaBancaria.conta === '0'\n ? 'Chave Pix padrão selecionada'\n : 'Conta padrão selecionada:'\n : contaBancaria.conta === '0'\n ? 'Chave Pix selecionada'\n : 'Conta selecionada:'}\n \n {contaBancaria.padrao && (\n \n \n \n )}\n
\n \n {contaBancaria.descricao} \n \n <>\n {contaBancaria.conta !== '0' ? (\n <>\n {`Banco: ${contaBancaria.instituicaoBancaria.nome}`} \n \n {`Nome titular: ${contaBancaria.nomeTitular}`}\n \n \n {`CPF/CNPJ: ${cpfCnpjMask(contaBancaria.cpfCnpjTitular)}`}\n \n {`Agência: ${contaBancaria.agencia}`} \n {`Conta: ${contaBancaria.conta}`} \n >\n ) : (\n {`Chave PIX: ${contaBancaria.chavePix}`} \n )}\n >\n \n )}\n
\n )\n}\n\nCardContaBancaria.propTypes = {\n contaBancaria: PropTypes.object\n}\n\nexport default CardContaBancaria\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { movimentacaoFinanceiraAction, ingressoAction } from '_actions'\nimport { MessageData } from 'components'\n\nconst SuccessMessage = () => {\n const dispatch = useDispatch()\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n useEffect(() => {\n return () => {\n dispatch(movimentacaoFinanceiraAction.clear())\n dispatch(\n ingressoAction.getIngressosLiberadosByEstabelecimento(estabelecimentoId)\n )\n }\n }, [])\n return (\n \n )\n}\n\nexport default SuccessMessage\n","import React, { useEffect, useState } from 'react'\nimport {\n IconButton,\n DialogTitle,\n Dialog,\n DialogActions,\n DialogContent,\n makeStyles,\n Slide,\n Grid,\n FormControl,\n RadioGroup,\n FormLabel,\n FormControlLabel,\n Radio,\n Button,\n useTheme,\n useMediaQuery,\n Typography,\n Zoom,\n Tooltip,\n CircularProgress\n} from '@material-ui/core'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { contaBancariaAction, movimentacaoFinanceiraAction } from '_actions'\nimport { formatCurrency } from 'utils'\nimport ExpandMoreRoundedIcon from '@material-ui/icons/ExpandMoreRounded'\nimport ExpandLessRoundedIcon from '@material-ui/icons/ExpandLessRounded'\nimport CloseIcon from '@material-ui/icons/Close'\nimport { CheckCircleTwoTone } from '@material-ui/icons'\nimport { SuccessMessage, CardContaBancaria } from './components'\n\nconst Transition = React.forwardRef(function Transition(props, ref) {\n return \n})\n\nconst useStyles = makeStyles((theme) => ({\n closeButton: {\n position: 'absolute',\n right: theme.spacing(2),\n top: theme.spacing(2),\n color: theme.palette.grey[500]\n },\n totalLabel: {\n paddingTop: theme.spacing(3),\n [theme.breakpoints.down('xs')]: {\n position: 'absolute',\n bottom: theme.spacing(8),\n right: theme.spacing(2)\n }\n }\n}))\n\nexport default function ModalSolicitarRetirada({\n ingressos,\n setOpenModal,\n openModal,\n valorTotalARetirar\n}) {\n const classes = useStyles()\n const dispatch = useDispatch()\n const movimentacaoFinanceira = useSelector(\n (state) => state.movimentacaoFinanceira\n )\n const { isLoading } = movimentacaoFinanceira\n const { contaBancaria } = useSelector((state) => state.contaBancaria)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const [contaBancariaSelecionada, setContaBancariaSelecionada] = useState('')\n const [showRadioSelect, setShowRadioSelect] = useState(false)\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n function findContaBancaria(id) {\n const contaBancariaNew = contaBancaria.find((x) => x.id == id)\n return contaBancariaNew\n }\n const handleChange = (event) => {\n const contaBancariaNew = findContaBancaria(event.target.value)\n setContaBancariaSelecionada(contaBancariaNew)\n }\n\n const handleClose = () => {\n setOpenModal(false)\n }\n\n const createObjectIngressos = (ingressos) => {\n const ingressosFormatted = []\n ingressos.map((ingresso) => {\n let ingressoNew = {\n id: 0,\n movimentacaoFinanceiraId: 0,\n ingressoId: ingresso.id,\n excluido: null\n }\n ingressosFormatted.push(ingressoNew)\n })\n return ingressosFormatted\n }\n\n const handleSubmit = () => {\n let payload = {\n id: 0,\n statusMovimentacaoFinanceiraId: 0,\n estabelecimentoId: estabelecimentoId,\n dataHoraProcessamento: '',\n valor: 0,\n contaBancariaId: contaBancariaSelecionada.id,\n anexo: null,\n motivoCancelamento: null,\n movimentacaoFinanceiraIngresso: createObjectIngressos(ingressos)\n }\n dispatch(movimentacaoFinanceiraAction.createMovimentacaoFinanceira(payload))\n }\n\n useEffect(() => {\n dispatch(\n contaBancariaAction.getContaBancariaByEstabelecimento(estabelecimentoId)\n )\n }, [estabelecimentoId])\n\n useEffect(() => {\n setContaBancariaSelecionada(contaBancaria.find((x) => x.padrao === true))\n }, [contaBancaria])\n\n useEffect(() => {\n dispatch(movimentacaoFinanceiraAction.clear())\n }, [])\n\n return (\n \n \n Solicitação de retirada \n \n \n \n \n \n {movimentacaoFinanceira !== undefined &&\n movimentacaoFinanceira.id > 0 ? (\n \n ) : (\n \n \n \n {contaBancaria !== undefined && contaBancaria.length > 1 && (\n setShowRadioSelect(!showRadioSelect)}\n size=\"small\"\n style={{ marginTop: 15 }}\n variant=\"outlined\"\n color=\"primary\"\n startIcon={\n showRadioSelect ? (\n \n ) : (\n \n )\n }\n >\n Trocar conta/Pix\n \n )}\n \n \n {showRadioSelect && (\n \n \n Contas bancárias \n \n {contaBancaria.map((contaBancaria) => {\n return (\n }\n label={\n \n \n {contaBancaria.conta === '0'\n ? `${contaBancaria.descricao} (pix)`\n : contaBancaria.descricao}\n \n {contaBancaria.padrao && (\n \n \n \n )}\n
\n }\n />\n )\n })}\n \n \n \n )}\n \n \n )}\n {movimentacaoFinanceira !== undefined &&\n movimentacaoFinanceira.id === 0 && (\n <>\n \n Se estiver tudo certo com seu pedido, o dinheiro estará em sua\n conta bancária em até dois dias úteis.\n \n \n {`Valor total à retirar: ${formatCurrency(valorTotalARetirar)}`}\n \n >\n )}\n \n {movimentacaoFinanceira !== undefined && movimentacaoFinanceira.id === 0 && (\n \n }\n >\n {isLoading ? 'Solicitando...' : 'Confirmar'}\n \n \n )}\n \n )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\nimport { TableIngressosLiberados } from './components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n value: {\n fontWeight: theme.typography.fontWeightMedium\n },\n card: {\n borderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)',\n height: 200\n }\n}))\n\nconst IngressosLiberados = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n\n return (\n \n \n \n \n \n )\n}\n\nIngressosLiberados.propTypes = {\n className: PropTypes.string\n}\n\nexport default IngressosLiberados\n","import React, { Fragment, useRef, useState, memo } from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Tooltip,\n IconButton,\n Menu,\n MenuItem,\n Switch,\n FormControlLabel,\n Typography\n} from '@material-ui/core'\nimport SortRoundedIcon from '@material-ui/icons/SortRounded'\n\nconst useStyles = makeStyles((theme) => ({\n title: { paddingLeft: theme.spacing(2), paddingTop: theme.spacing(1) }\n}))\n\nconst SortSwitches = (props) => {\n const classes = useStyles()\n const moreRef = useRef(null)\n const { sortByEvento, setSortByEvento, sortByLote, setSortByLote } = props\n const [openMenu, setOpenMenu] = useState(false)\n\n const handleMenuOpen = () => {\n setOpenMenu(true)\n }\n\n const handleMenuClose = () => {\n setOpenMenu(false)\n }\n\n return (\n \n \n \n \n \n \n \n \n Agrupar por:\n \n \n setSortByEvento(event.target.checked)}\n name=\"sortByEvento\"\n inputProps={{ 'aria-label': 'agrupar por eventos' }}\n />\n }\n label=\"Eventos\"\n />\n \n {sortByEvento && (\n \n setSortByLote(event.target.checked)}\n name=\"sortByLote\"\n inputProps={{ 'aria-label': 'agrupar por lotes' }}\n />\n }\n label=\"Lotes\"\n />\n \n )}\n \n \n )\n}\n\nSortSwitches.propTypes = {\n className: PropTypes.string\n}\n\nexport default memo(SortSwitches)\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n makeStyles,\n Table,\n colors,\n Collapse,\n Badge,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Toolbar,\n Typography,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { ingressoAction } from '_actions'\nimport { formatCurrency, toLocalDateFormat } from 'utils'\nimport { MessageData, Label, SkeletonTable } from 'components'\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'\nimport { SortSwitches } from './components'\nimport { Skeleton } from '@material-ui/lab'\n\nconst StyledBadge = withStyles((theme) => ({\n badge: {\n right: -3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px'\n }\n}))(Badge)\n\nconst statusColors = {\n 1: colors.orange[600],\n 2: colors.red[600],\n 3: colors.green[600]\n}\n\nconst headCells = [\n {\n id: 'evento-lote',\n numeric: false,\n disablePadding: true,\n label: 'Evento - (Lote)'\n },\n {\n id: 'data-evento',\n numeric: true,\n disablePadding: false,\n label: 'Data evento'\n },\n {\n id: 'valor',\n numeric: true,\n disablePadding: false,\n label: 'Valor total (R$)'\n },\n { id: 'status', numeric: true, disablePadding: false, label: 'Status' }\n]\n\nfunction EnhancedTableHead(props) {\n const { order, orderBy } = props\n\n return (\n \n \n \n {headCells.map((headCell) => (\n \n {headCell.label}\n \n ))}\n \n \n )\n}\n\nEnhancedTableHead.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst useToolbarStyles = makeStyles((theme) => ({\n root: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n title: {\n flex: '1 1 100%'\n }\n}))\n\nexport default function TableIngressosNaoLiberados() {\n function Row(props) {\n const { row } = props\n const [open, setOpen] = useState(false)\n const [openLote, setOpenLote] = useState(false)\n const haveRowEvento =\n row.ingressosSortedByEvento !== undefined &&\n row.ingressosSortedByEvento.length > 0\n ? true\n : false\n\n const sizeIngressoByEvento = ingressos.filter(\n (c) => c.lote.eventoId === row.lote.eventoId\n ).length\n\n function totalValueRowLote(ingressosSortedByLote) {\n var value = 0\n const haveRowLote =\n ingressosSortedByLote !== undefined && ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value +=\n ingressosSortedByLote.reduce((a, b) => a + (b['valor'] || 0), 0) -\n ingressosSortedByLote.reduce(\n (a, b) => a + (b['valorDesconto'] || 0),\n 0\n ) -\n ingressosSortedByLote.reduce((a, b) => a + (b['valorTaxa'] || 0), 0)\n }\n return value\n }\n\n function totalValueRowEvento(ingressosSortedByEvento) {\n var value = 0\n ingressosSortedByEvento.map((row) => {\n const haveRowLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value += totalValueRowLote(row.ingressosSortedByLote)\n } else {\n value += row.valor - row.valorTaxa - row.valorDesconto\n }\n })\n\n return value\n }\n const totalValueRow = haveRowEvento\n ? totalValueRowEvento(row.ingressosSortedByEvento)\n : row.valor - row.valorTaxa - row.valorDesconto\n\n return (\n <>\n \n \n \n {haveRowEvento && (\n \n setOpen(!open)}\n >\n \n {open ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {haveRowEvento\n ? row.lote.evento.nome\n : `${row.lote.evento.nome} - (${row.lote.descricao} - ${row.lote.tipoIngresso.descricao})`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n \n {showValues ? (\n formatCurrency(totalValueRow)\n ) : (\n \n )}\n \n \n {!haveRowEvento && (\n \n {row.statusIngresso.descricao}\n \n )}\n \n \n {haveRowEvento && (\n \n \n \n \n \n {row.ingressosSortedByEvento.map((row) => {\n const hasLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n\n const sizeIngressoByLote = ingressos.filter(\n (c) => c.lote.id === row.lote.id\n ).length\n\n return (\n <>\n \n \n \n {hasLote && (\n \n setOpenLote(!openLote)}\n >\n \n {openLote ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {`${row.lote.descricao} - ${row.lote.tipoIngresso.descricao}`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n \n {hasLote\n ? formatCurrency(\n totalValueRowLote(row.ingressosSortedByLote)\n )\n : formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n {!hasLote && (\n \n {row.statusIngresso.descricao}\n \n )}\n \n \n {hasLote && (\n \n \n \n \n \n {row.ingressosSortedByLote.map((row) => {\n return (\n \n \n \n {`Ingresso n.º: ${row.id}`}\n \n \n {`Cliente: ${row.usuario.nome}`}\n \n \n {formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n \n {row.statusIngresso.descricao}\n \n \n \n )\n })}\n \n
\n \n \n \n )}\n >\n )\n })}\n \n
\n \n \n \n )}\n >\n )\n }\n const EnhancedTableToolbar = () => {\n const classes = useToolbarStyles()\n return (\n \n \n Ingressos a liberar\n \n \n \n )\n }\n\n EnhancedTableToolbar.propTypes = {\n numSelected: PropTypes.number.isRequired\n }\n\n const useStyles = makeStyles((theme) => ({\n root: {\n width: '100%'\n },\n table: {\n minWidth: 750\n },\n visuallyHidden: {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: 1,\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n top: 20,\n width: 1\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n boxShadow: 'rgb(0 0 0 / 8%) 0px 2px 8px',\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px'\n }\n }))\n\n const classes = useStyles()\n const [sortByEvento, setSortByEvento] = useState(true)\n const [sortByLote, setSortByLote] = useState(true)\n const { showValues } = useSelector((state) => state.global)\n const dispatch = useDispatch()\n const ingressos = useSelector((state) => state.ingresso.ingressoALiberar)\n const { isLoading } = useSelector((state) => state.ingresso)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const ingressosSortByEventoAndLote = (ingressos) => {\n var ingressosSorted = []\n if (sortByEvento) {\n ingressos.map((row, index) => {\n if (index === 0) {\n ingressosSorted.push(row)\n } else {\n const ingressosSortedByEventoFindIndex = ingressosSorted.findIndex(\n (item) => item.lote.eventoId === row.lote.eventoId\n )\n if (ingressosSortedByEventoFindIndex !== -1) {\n if (\n ingressosSorted[ingressosSortedByEventoFindIndex]\n .ingressosSortedByEvento === undefined\n ) {\n ingressosSorted[ingressosSortedByEventoFindIndex] = {\n ...ingressosSorted[ingressosSortedByEventoFindIndex],\n ingressosSortedByEvento: [\n ingressosSorted[ingressosSortedByEventoFindIndex]\n ]\n }\n\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n } else {\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n }\n } else {\n ingressosSorted.push(row)\n }\n }\n })\n if (sortByLote) {\n ingressosSorted.map((row, index) => {\n if (row.ingressosSortedByEvento !== undefined) {\n const arrayIngressos = []\n row.ingressosSortedByEvento.map(\n (rowArrayEvento, indexArrayEvento) => {\n if (indexArrayEvento === 0) {\n arrayIngressos.push(rowArrayEvento)\n } else {\n const ingressosSortedByLoteFindIndex = arrayIngressos.findIndex(\n (item) => item.lote.id === rowArrayEvento.lote.id\n )\n if (ingressosSortedByLoteFindIndex !== -1) {\n if (\n arrayIngressos[ingressosSortedByLoteFindIndex]\n .ingressosSortedByLote === undefined\n ) {\n arrayIngressos[ingressosSortedByLoteFindIndex] = {\n ...arrayIngressos[ingressosSortedByLoteFindIndex],\n ingressosSortedByLote: [\n arrayIngressos[ingressosSortedByLoteFindIndex]\n ]\n }\n\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n } else {\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n }\n } else {\n arrayIngressos.push(rowArrayEvento)\n }\n }\n }\n )\n ingressosSorted[index].ingressosSortedByEvento = arrayIngressos\n }\n })\n }\n } else {\n ingressosSorted = ingressos\n }\n return ingressosSorted\n }\n\n useEffect(() => {\n !isLoading &&\n dispatch(\n ingressoAction.getIngressosNaoLiberadosByEstabelecimento(\n estabelecimentoId\n )\n )\n }, [estabelecimentoId])\n\n return (\n \n {!isLoading ? (\n <>\n {ingressos && ingressos.length > 0 ? (\n <>\n
\n Total de ingressos encontrados: {ingressos.length} \n \n
\n \n \n \n \n \n {ingressosSortByEventoAndLote(ingressos).map(\n (row, index) => {\n return
\n }\n )}\n \n
\n \n \n >\n ) : (\n
\n )}\n >\n ) : (\n
\n )}\n
\n )\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\nimport { TableIngressosNaoLiberados } from './components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n value: {\n fontWeight: theme.typography.fontWeightMedium\n },\n card: {\n borderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)',\n height: 200\n }\n}))\n\nconst IngressosNaoLiberados = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n\n return (\n \n \n \n \n \n )\n}\n\nIngressosNaoLiberados.propTypes = {\n className: PropTypes.string\n}\n\nexport default IngressosNaoLiberados\n","import React, { useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport PropTypes from 'prop-types'\nimport {\n makeStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Toolbar,\n colors,\n Divider,\n TablePagination,\n useTheme,\n useMediaQuery,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport { formatCurrency, history, toLocalDateFormat } from 'utils'\nimport { Label, MessageData, Page, SkeletonTable } from 'components'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\n\nconst statusColors = {\n 1: colors.orange[600],\n 2: colors.red[600],\n 3: colors.green[600]\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: { paddingTop: theme.spacing(2) },\n paper: {\n width: '100%',\n [theme.breakpoints.up('md')]: {\n minHeight: 380\n },\n ...constants.shadowCard\n },\n tableCell: {\n fontSize: '8pt'\n },\n container: {\n height: 290\n },\n toolbar: {}\n}))\n\nconst CardRetiradas = ({ movimentacoesFinanceiras, title }) => {\n const { isLoading } = useSelector((state) => state.movimentacaoFinanceira)\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [page, setPage] = useState(0)\n const [rowsPerPage, setRowsPerPage] = useState(isMobile ? 5 : 8)\n const { showValues } = useSelector((state) => state.global)\n const handleChangePage = (event, newPage) => {\n setPage(newPage)\n }\n\n const handleChangeRowsPerPage = (event) => {\n setRowsPerPage(+event.target.value)\n setPage(0)\n }\n return (\n \n <>\n {isLoading ? (\n \n ) : (\n <>\n \n \n \n {title}\n \n \n \n {undefined !== movimentacoesFinanceiras &&\n movimentacoesFinanceiras.length > 0 ? (\n <>\n \n \n \n \n \n \n Valor (R$)\n \n \n Solicitação\n \n \n Finalização\n \n \n Status\n \n \n \n \n \n {movimentacoesFinanceiras\n .slice(\n page * rowsPerPage,\n page * rowsPerPage + rowsPerPage\n )\n .map((n) => {\n return (\n \n history.push(\n `/movimentacaoFinanceira/${n.id}/resumo`\n )\n }\n style={{ cursor: 'pointer' }}\n hover\n key={n.id}\n >\n \n {showValues ? (\n formatCurrency(n.valor)\n ) : (\n \n )}\n \n \n {toLocalDateFormat(n.dataHora)}\n \n \n {n.dataHoraProcessamento !== null\n ? toLocalDateFormat(\n n.dataHoraProcessamento\n )\n : '------'}\n \n \n \n \n {\n n.statusMovimentacaoFinanceira\n .descricao\n }\n \n \n \n \n \n \n history.push(\n `/movimentacaoFinanceira/${n.id}/resumo`\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\nCardRetiradas.propTypes = {\n movimentacoesFinanceiras: PropTypes.array.isRequired,\n title: PropTypes.string.isRequired\n}\n\nexport default CardRetiradas\n","import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\nimport { CardRetiradas } from './components'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { movimentacaoFinanceiraAction } from '_actions'\nimport { AccessControl } from 'components/Utils/AccessControl'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n value: {\n fontWeight: theme.typography.fontWeightMedium\n },\n card: {\n borderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)',\n height: 200\n }\n}))\n\nconst Retiradas = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const dispatch = useDispatch()\n const { movimentacaoFinanceira } = useSelector(\n (state) => state.movimentacaoFinanceira\n )\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const movimentacaoFinanceiraEmAndamento = movimentacaoFinanceira.filter(\n (c) => c.statusMovimentacaoFinanceira.id === 1\n )\n const movimentacaoFinanceiraConcluido = movimentacaoFinanceira.filter(\n (c) => c.statusMovimentacaoFinanceira.id !== 1\n )\n useEffect(() => {\n dispatch(\n movimentacaoFinanceiraAction.getMovimentacaoFinanceiraByEstabelecimento(\n estabelecimentoId\n )\n )\n return () => {\n dispatch(movimentacaoFinanceiraAction.clear())\n }\n }, [estabelecimentoId])\n\n return (\n (\n \n \n \n \n \n \n \n \n )}\n />\n )\n}\n\nRetiradas.propTypes = {\n className: PropTypes.string\n}\n\nexport default Retiradas\n","import React from 'react'\nimport {\n Tabs,\n Paper,\n Tab,\n makeStyles,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport AccountBalanceWalletTwoToneIcon from '@material-ui/icons/AccountBalanceWalletTwoTone'\nimport AccountBalanceTwoToneIcon from '@material-ui/icons/AccountBalanceTwoTone'\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\nimport EventBusyTwoToneIcon from '@material-ui/icons/EventBusyTwoTone'\nimport { history } from 'utils'\nimport { Redirect, useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n paper: {\n width: '100%',\n ...constants.shadowCard,\n padding: 10\n },\n tabs: {\n width: '100%'\n },\n tab: {\n [theme.breakpoints.down('xs')]: {\n fontSize: 11\n },\n textTransform: 'none'\n },\n marginLeft: {\n [theme.breakpoints.down('sm')]: {\n marginLeft: '0'\n },\n marginLeft: 'auto'\n }\n}))\n\nconst Navigation = () => {\n const classes = useStyles()\n const { tab } = useParams()\n\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'))\n\n const handleChange = (event, value) => {\n history.push(`/carteira/${value}`)\n }\n return (\n \n \n }\n label=\"Liberados\"\n />\n }\n label=\"A liberar\"\n />\n }\n label=\"Retiradas\"\n />\n }\n label={isMobile ? 'Contas' : 'Contas bancárias'}\n />\n \n \n )\n}\n\nexport default Navigation\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Button, Grid, Typography } from '@material-ui/core'\nimport Image from 'material-ui-image'\nimport { history } from 'utils'\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(4),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(1) },\n button: {\n [theme.breakpoints.up('sm')]: {\n marginRight: theme.spacing(2)\n },\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstContaBancaria = () => {\n const classes = useStyles()\n\n const handleClickContaBancaria = () => {\n history.push(`/carteira/contasBancarias/cadastro`)\n }\n\n const handleClickPix = () => {\n history.push(`/carteira/contasBancarias/pix`)\n }\n\n return (\n \n \n \n \n \n \n \n Você ainda não cadastrou nenhuma conta bancária\n \n \n \n \n Cadastrar conta! 💰\n \n \n \n \n Cadastrar pix! 💰\n \n \n \n
\n )\n}\n\nexport default EmptyFirstContaBancaria\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { contaBancariaAction } from '_actions'\nimport {\n makeStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n Typography,\n Button,\n Grid\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { history } from 'utils'\nimport { Page, SkeletonTable } from 'components'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport CheckCircleTwoToneIcon from '@material-ui/icons/CheckCircleTwoTone'\nimport EmptyFirstContaBancaria from '../EmptyFirstContaBancaria/EmptyFirstContaBancaria'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n paper: {\n marginTop: theme.spacing(1),\n ...constants.shadowCard\n }\n}))\n\nconst ContaBancariaList = () => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const classes = useStyles()\n\n const { contaBancaria, isFetching } = useSelector(\n (state) => state.contaBancaria\n )\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n\n useEffect(() => {\n dispatch(\n contaBancariaAction.getContaBancariaByEstabelecimento(estabelecimentoId)\n )\n }, [estabelecimentoId])\n\n const handleDeleteClick = (id, strFrom) => {\n confirm({\n title: `Você deseja excluir esta ${strFrom}?`,\n description: `Confirmando essa operação, esta ${strFrom} não valerá mais.`,\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(contaBancariaAction.deleteContaBancariaById(id))\n })\n }\n\n const thereIsPix = contaBancaria.some((element) => element.conta === '0')\n\n const thereIsContaBancaria = contaBancaria.some(\n (element) => element.conta !== '0'\n )\n\n return (\n \n (\n <>\n {isFetching ? (\n \n ) : (\n <>\n {undefined !== contaBancaria && contaBancaria.length > 0 ? (\n \n
\n \n {`Total de dados encontrados: ${contaBancaria.length}`} \n \n \n history.push('contasBancarias/pix')}\n variant=\"contained\"\n color=\"primary\"\n >\n Nova Chave Pix\n \n \n \n \n history.push('contasBancarias/cadastro')\n }\n variant=\"contained\"\n color=\"primary\"\n >\n Nova conta\n \n \n \n\n <>\n {thereIsContaBancaria && (\n
\n \n \n \n Descrição \n Agência \n Conta \n CPF/CNPJ \n \n Nome Titular\n \n Padrão \n Ações \n \n \n \n {contaBancaria.map((n) => {\n return (\n <>\n {n.conta !== '0' && (\n \n \n {n.descricao}\n \n \n {n.agencia}\n \n \n {n.conta}\n \n \n {n.cpfCnpjTitular}\n \n \n {n.nomeTitular}\n \n \n {n.padrao && (\n \n )}\n \n \n {/* (\n \n history.push(\n `/carteira/contasBancarias/cadastro/${n.id}`\n )\n }\n >\n \n \n \n \n )}\n /> */}\n (\n \n handleDeleteClick(\n n.id,\n 'Conta Bancária'\n )\n }\n >\n \n \n \n \n )}\n />\n \n \n )}\n >\n )\n })}\n \n
\n \n )}\n >\n\n <>\n {thereIsPix && (\n
\n \n \n \n Descrição \n Chave PIX \n \n Nome Titular\n \n Padrão \n Ações \n \n \n \n {contaBancaria.map((n) => {\n return (\n <>\n {n.conta === '0' && (\n \n \n {n.descricao}\n \n \n {n.chavePix}\n \n \n {n.nomeTitular}\n \n \n {n.padrao && (\n \n )}\n \n \n {/* (\n \n history.push(\n `/carteira/contasBancarias/pix/${n.id}`\n )\n }\n >\n \n \n \n \n )}\n /> */}\n (\n \n handleDeleteClick(\n n.id,\n 'Chave PIX'\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\nexport default ContaBancariaList\n","import React, { useState, useEffect } from 'react'\nimport { cpfCnpjMask } from 'utils/masks'\nimport { crudService } from '_services'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport { cnpj, cpf } from 'cpf-cnpj-validator'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n makeStyles,\n Checkbox,\n FormControlLabel,\n Grid\n} from '@material-ui/core'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { contaBancariaAction } from '_actions'\nimport { useParams } from 'react-router-dom'\nimport { history } from 'utils'\nimport { HelperToolTip } from 'components'\nimport { Page } from 'components'\nimport TextField from '@material-ui/core/TextField'\nimport Autocomplete from '@material-ui/lab/Autocomplete'\nimport { toast } from 'react-toastify'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {},\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst ContaBancariaEdit = () => {\n const dispatch = useDispatch()\n const { idContaBancaria } = useParams()\n const classes = useStyles()\n const contaBancaria = useSelector((state) => state.contaBancaria)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const [instituicoes, setInstituicoes] = useState([])\n const [instituicaoSelecionada, setInstituicaoSelecionada] = useState('')\n const [\n instituicaoSelecionadaInputValue,\n setInstituicaoSelecionadaInputValue\n ] = useState('')\n\n const handleChange = (prop) => (event) => {\n dispatch(contaBancariaAction.onChangeProps(prop, event))\n }\n\n const handleSelectInstituicao = (instituicao) => {\n if (instituicao === null) {\n setInstituicaoSelecionada('')\n setInstituicaoSelecionadaInputValue('')\n } else {\n setInstituicaoSelecionada(instituicao.id)\n setInstituicaoSelecionadaInputValue(instituicao.nome)\n }\n }\n\n useEffect(() => {\n if (idContaBancaria) {\n setInstituicaoSelecionadaInputValue(\n contaBancaria.instituicaoBancaria.nome\n )\n setInstituicaoSelecionada(contaBancaria.instituicaoBancariaId)\n }\n }, [contaBancaria.instituicaoBancaria.id])\n\n useEffect(() => {\n if (idContaBancaria) {\n dispatch(contaBancariaAction.getContaBancariaById(idContaBancaria))\n } else {\n dispatch(contaBancariaAction.clear())\n }\n crudService.get('InstituicoesBancarias/').then((response) => {\n setInstituicoes(response.data)\n })\n\n ValidatorForm.addValidationRule('isValidCpf', (value) => {\n if (value && value.length <= 14) {\n if (cpf.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCnpj', (value) => {\n if (value && value.length >= 15) {\n if (cnpj.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n return () => {\n ValidatorForm.removeValidationRule('isValidCpf')\n ValidatorForm.removeValidationRule('isValidCnpj')\n dispatch(contaBancariaAction.clear())\n }\n }, [])\n\n const handleSubmit = () => {\n if (instituicaoSelecionada < 1) {\n toast.error('Opss! Selecione a instituição bancária!')\n } else {\n let payload = {\n id: idContaBancaria,\n estabelecimentoId: estabelecimentoId,\n instituicaoBancariaId: instituicaoSelecionada,\n descricao: contaBancaria.descricao,\n agencia: contaBancaria.agencia,\n conta: contaBancaria.conta,\n nomeTitular: contaBancaria.nomeTitular,\n padrao: contaBancaria.padrao,\n cpfCnpjTitular: contaBancaria.cpfCnpjTitular\n .split('.')\n .join('')\n .replace(/[-/.]/g, '')\n }\n\n if (idContaBancaria) {\n dispatch(\n contaBancariaAction.editContaBancariaInfo(idContaBancaria, payload)\n )\n } else {\n dispatch(contaBancariaAction.createContaBancaria(payload))\n }\n }\n }\n\n return (\n \n \n \n handleSubmit(event)}\n >\n \n \n \n \n \n \n \n\n \n {\n handleSelectInstituicao(newValue)\n }}\n InputLabelProps={{\n shrink: true\n }}\n onInputChange={(event, newInputValue) => {\n newInputValue !== null &&\n newInputValue.length > 0 &&\n setInstituicaoSelecionadaInputValue(newInputValue)\n }}\n inputValue={instituicaoSelecionadaInputValue}\n fullWidth\n labelId=\"instituicaoBancariaId\"\n options={instituicoes}\n getOptionLabel={(option) => (option ? option.nome : '')}\n renderInput={(params) => (\n \n )}\n />\n \n\n \n \n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n }\n label={\n \n Padrão\n \n Se selecionado, todos os depósitos serão feitos nessa\n conta!\n \n
\n }\n />\n \n \n \n \n \n history.push('/carteira/contasBancarias')}\n color=\"secondary\"\n variant=\"outlined\"\n >\n Cancelar\n \n \n {idContaBancaria ? 'Atualizar' : 'Salvar'}\n \n \n \n \n \n \n )\n}\n\nexport default ContaBancariaEdit\n","import React, { useEffect } from 'react'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n makeStyles,\n Checkbox,\n FormControlLabel,\n Grid,\n MenuItem\n} from '@material-ui/core'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { contaBancariaAction } from '_actions'\nimport { useParams } from 'react-router-dom'\nimport { cpfCnpjMask, history } from 'utils'\nimport { HelperToolTip } from 'components'\nimport { Page } from 'components'\nimport constants from 'theme/constants'\nimport { cnpj, cpf } from 'cpf-cnpj-validator'\n\nconst useStyles = makeStyles(() => ({\n root: {},\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst PixEdit = () => {\n const dispatch = useDispatch()\n const { idContaBancaria } = useParams()\n const classes = useStyles()\n const contaBancaria = useSelector((state) => state.contaBancaria)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const tipoChavePix = []\n tipoChavePix.push({ id: 0, tipo: 'CPF/CNPJ' })\n tipoChavePix.push({ id: 1, tipo: 'Email' })\n tipoChavePix.push({ id: 2, tipo: 'Nº Celular' })\n tipoChavePix.push({ id: 3, tipo: 'Chave Aleatória' })\n\n const handleChange = (prop) => (event) => {\n dispatch(contaBancariaAction.onChangeProps(prop, event))\n }\n\n useEffect(() => {\n if (idContaBancaria) {\n dispatch(contaBancariaAction.getContaBancariaById(idContaBancaria))\n } else {\n dispatch(contaBancariaAction.clear())\n }\n ValidatorForm.addValidationRule('isValidCpf', (value) => {\n if (value && value.length <= 14) {\n if (cpf.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCnpj', (value) => {\n if (value && value.length >= 15) {\n if (cnpj.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n return () => {\n ValidatorForm.removeValidationRule('isValidCpf')\n ValidatorForm.removeValidationRule('isValidCnpj')\n dispatch(contaBancariaAction.clear())\n }\n }, [])\n\n const handleSubmit = () => {\n let payload = {\n id: idContaBancaria,\n estabelecimentoId: estabelecimentoId,\n descricao: contaBancaria.descricao,\n agencia: 0,\n conta: 0,\n nomeTitular: contaBancaria.nomeTitular,\n instituicaoBancariaId: 1,\n padrao: contaBancaria.padrao,\n cpfCnpjTitular: contaBancaria.cpfCnpjTitular\n .split('.')\n .join('')\n .replace(/[-/.]/g, ''),\n chavePix: contaBancaria.chavePix,\n tipoChavePix: contaBancaria.tipoChavePix\n }\n\n if (idContaBancaria) {\n dispatch(\n contaBancariaAction.editContaBancariaInfo(idContaBancaria, payload)\n )\n } else {\n dispatch(contaBancariaAction.createContaBancaria(payload))\n }\n }\n\n return (\n \n \n \n handleSubmit(event)}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n Tipo Chave Pix * \n \n {tipoChavePix.map((row) => (\n \n {row.tipo}\n \n ))}\n \n \n\n \n \n \n\n \n \n \n\n \n \n }\n label={\n \n Padrão\n \n Se selecionado, todos os depósitos serão feitos nessa\n conta!\n \n
\n }\n />\n \n \n \n \n \n history.push('/carteira/contasBancarias')}\n color=\"secondary\"\n variant=\"outlined\"\n >\n Cancelar\n \n \n {idContaBancaria ? 'Atualizar' : 'Salvar'}\n \n \n \n \n \n \n )\n}\n\nexport default PixEdit\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Page } from 'components'\nimport { ContaBancariaList, ContaBancariaEdit, PixEdit } from './components'\nimport useRouter from 'utils/useRouter'\n\nconst useStyles = makeStyles((theme) => ({\n root: { padding: theme.spacing(4, 0, 2, 0) }\n}))\n\nconst ContasBancaria = () => {\n const classes = useStyles()\n const { match } = useRouter()\n const { path } = match\n\n return (\n \n {path && path.includes('pix') ? (\n \n ) : path.includes('cadastro') ? (\n \n ) : (\n \n )}\n \n )\n}\n\nexport default ContasBancaria\n","import React, { useEffect } from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Header, Page } from 'components'\nimport {\n Notifications,\n CardSaldo,\n IngressosLiberados,\n IngressosNaoLiberados,\n ContasBancaria,\n Retiradas\n} from './components'\nimport { Redirect, useParams } from 'react-router'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { globalActions, ingressoAction } from '_actions'\nimport messageTime from 'utils/stringTimeHello'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n paddingBottom: theme.spacing(4)\n },\n cardSaldo: {\n [theme.breakpoints.down('md')]: {\n marginTop: theme.spacing(3)\n }\n },\n notifications: {\n marginTop: theme.spacing(4)\n },\n ingressosLiberados: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst Carteira = () => {\n const classes = useStyles()\n const { tab } = useParams()\n const dispatch = useDispatch()\n const { nome } = useSelector((state) => state.authentication.user)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n useEffect(() => {\n dispatch(\n ingressoAction.getIngressosLiberadosByEstabelecimento(estabelecimentoId)\n )\n }, [estabelecimentoId])\n\n useEffect(() => {\n dispatch(globalActions.setIsVisibleButtonShowValues(true))\n return () => {\n dispatch(globalActions.setIsVisibleButtonShowValues(false))\n }\n }, [])\n\n if (!tab) {\n return \n }\n return (\n \n \n \n \n {tab === 'liberados' && (\n \n )}\n {tab === 'aliberar' && (\n \n )}\n {tab === 'contasBancarias' && }\n {tab === 'retiradas' && }\n \n )\n}\n\nexport default Carteira\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport { makeStyles } from '@material-ui/styles'\nimport { Typography, Button, useTheme, useMediaQuery } from '@material-ui/core'\n\nimport { Page } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3),\n paddingTop: '10vh',\n display: 'flex',\n flexDirection: 'column',\n alignContent: 'center'\n },\n imageContainer: {\n marginTop: theme.spacing(6),\n display: 'flex',\n justifyContent: 'center'\n },\n image: {\n maxWidth: '100%',\n width: 560,\n maxHeight: 300,\n height: 'auto'\n },\n buttonContainer: {\n marginTop: theme.spacing(6),\n display: 'flex',\n justifyContent: 'center'\n }\n}))\n\nconst Error404 = () => {\n const classes = useStyles()\n const theme = useTheme()\n const mobileDevice = useMediaQuery(theme.breakpoints.down('sm'))\n\n return (\n \n \n 404: A página que você está procurando não está aqui\n \n \n Você tentou alguma rota sombria ou veio aqui por engano. Seja qual for,\n tente usar a navegação\n \n \n
\n
\n \n \n Voltar para home\n \n
\n \n )\n}\n\nexport default Error404\n","import React from 'react'\n\nconst Ajuda = () => {\n return (\n <>\n \n >\n )\n}\n\nexport default Ajuda\n","import React from 'react'\r\nimport {\r\n TableBody,\r\n Table,\r\n makeStyles,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Typography,\r\n Toolbar,\r\n Tooltip,\r\n IconButton,\r\n Backdrop,\r\n CircularProgress,\r\n Box,\r\n TableSortLabel,\r\n TablePagination,\r\n Avatar\r\n} from '@material-ui/core'\r\nimport ReactToPrint from 'react-to-print'\r\nimport { CSVLink } from 'react-csv'\r\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport { toast } from 'react-toastify'\r\n\r\n//? Own imports\r\nimport {\r\n cpfCnpjMask,\r\n formatCurrency,\r\n getImageUrls,\r\n getInitials,\r\n getStatusIngressoColor,\r\n history,\r\n phoneMask,\r\n toLocalDateFormat,\r\n useSearchQuery\r\n} from 'utils'\r\nimport { Label } from 'components'\r\nimport { Ingresso } from 'types/api'\r\nimport constants from 'theme/constants'\r\nimport { useTickets } from 'hooks-querys'\r\n\r\nconst headers = [\r\n { label: 'N.º', key: 'id' },\r\n { label: 'Cliente', key: 'usuario.nome' },\r\n { label: 'CPF/CNPJ', key: 'usuario.cpfCnpj' },\r\n { label: 'Celular', key: 'usuario.telefone' },\r\n { label: 'Email', key: 'usuario.email' },\r\n { label: 'Tipo de Ingresso', key: 'tipoIngresso' },\r\n { label: 'Valor Pago (R$)', key: 'valorPago' },\r\n { label: 'Data Hora Validação', key: 'dataHoraValidacao' },\r\n { label: 'Status', key: 'statusIngresso' }\r\n]\r\n\r\nexport const prepareDataForCSV = (tickets: Ingresso[]) => {\r\n return tickets.map((ticket) => ({\r\n id: ticket.id,\r\n 'usuario.nome': ticket.usuario.nome,\r\n 'usuario.cpfCnpj': cpfCnpjMask(ticket.usuario.cpfCnpj),\r\n 'usuario.telefone': phoneMask(ticket.usuario.telefone),\r\n 'usuario.email': ticket.usuario.email,\r\n tipoIngresso: `${ticket.lote.tipoIngresso.descricao} - (${ticket.lote.descricao})`,\r\n valorPago: (ticket.valor - ticket.valorDesconto)?.toFixed(2),\r\n dataHoraValidacao: toLocalDateFormat(ticket?.dataHoraValidacao),\r\n statusIngresso: ticket.statusIngresso.descricao\r\n }))\r\n}\r\n\r\nconst handleDownload = () => {\r\n toast.success('Download concluído com sucesso! 👍', {\r\n position: 'top-right'\r\n })\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n table: {\r\n minWidth: 700\r\n },\r\n rootToolbarStyles: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1)\r\n },\r\n titleToolbarStyles: {\r\n flex: '1 1 100%'\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n ...constants.shadowCard\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff'\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1\r\n },\r\n nameCell: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n },\r\n avatar: {\r\n height: 32,\r\n width: 32,\r\n marginRight: theme.spacing(2)\r\n },\r\n statusCell: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: theme.spacing(1)\r\n }\r\n}))\r\n\r\ntype Order = 'asc' | 'desc'\r\ninterface EnhancedTableProps {\r\n classes: ReturnType\r\n onRequestSort: (event: React.MouseEvent, property: string) => void\r\n order: Order\r\n orderBy: string\r\n}\r\ninterface HeadCell {\r\n id: string\r\n label: string\r\n align?: 'right' | 'left'\r\n enableSort: boolean\r\n}\r\n\r\nconst headCells: HeadCell[] = [\r\n {\r\n id: 'id',\r\n label: 'N.º',\r\n align: 'left',\r\n enableSort: true\r\n },\r\n { id: 'nome', label: 'Cliente', enableSort: true },\r\n { id: 'cpfCnpj', label: 'CPF/CNPJ', enableSort: false },\r\n {\r\n id: 'telefone',\r\n label: 'Telefone',\r\n enableSort: false\r\n },\r\n {\r\n id: 'tipoIngresso',\r\n label: 'Tipo Ingresso',\r\n enableSort: true\r\n },\r\n {\r\n id: 'valor',\r\n label: 'Valor Pago (R$)',\r\n enableSort: false\r\n },\r\n { id: 'status', label: 'Status', enableSort: true, align: 'right' }\r\n]\r\n\r\nfunction EnhancedTableHead(props: EnhancedTableProps) {\r\n const { classes, order, orderBy, onRequestSort } = props\r\n const createSortHandler = (property: string) => (\r\n event: React.MouseEvent\r\n ) => {\r\n onRequestSort(event, property)\r\n }\r\n return (\r\n \r\n \r\n {headCells?.map((headCell) => (\r\n \r\n \r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n \r\n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n \r\n ) : null}\r\n \r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n\r\nconst TableIngressos = () => {\r\n const classes = useStyles()\r\n const refTable = React.useRef(null)\r\n const querySearch = useSearchQuery()\r\n const order = (querySearch.get('direction') || 'asc') as 'asc' | 'desc'\r\n const orderBy = querySearch.get('order') || 'nome'\r\n\r\n const { data, isLoading, isFetching } = useTickets({\r\n eventoId: Number(querySearch.get('eventId') || 0),\r\n term: querySearch.get('busca') || '',\r\n statusIngressoId: Number(querySearch.get('statusId')) || 0,\r\n limit: Number(querySearch.get('limit') || 15),\r\n page: Number(querySearch.get('page') || 0),\r\n loteId: Number(querySearch.get('loteId')) || 0,\r\n tipoIngressoId: Number(querySearch.get('tipoIngressoId')) || 0,\r\n validados: querySearch.get('validados') || '',\r\n order: orderBy,\r\n direction: order\r\n })\r\n\r\n const csvData = prepareDataForCSV(data?.items || [])\r\n\r\n const handleRequestSort = (\r\n event: React.MouseEvent,\r\n property: string\r\n ) => {\r\n const isAsc = orderBy === property && order === 'asc'\r\n querySearch.set('direction', isAsc ? 'desc' : 'asc')\r\n querySearch.set('order', property)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n const handleChangePage = (event: unknown, newPage: number) => {\r\n querySearch.set('page', newPage?.toString())\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n const handleChangeRowsPerPage = (\r\n event: React.ChangeEvent\r\n ) => {\r\n querySearch.set('limit', event.target.value)\r\n querySearch.set('page', '0')\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n Carregando dados... \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {data && data?.totalRows > 0 ? (\r\n <>\r\n Total de dados encontrados: {data?.totalRows} \r\n >\r\n ) : (\r\n Nenhum dado encontrado. \r\n )}\r\n \r\n {data && data?.totalRows > 0 && (\r\n \r\n \r\n \r\n Lista de Ingressos\r\n \r\n {\r\n handleDownload()\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n content={() => refTable.current}\r\n />\r\n \r\n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\r\n \r\n {/* ------------------------------------------------------------>\t */}\r\n \r\n \r\n \r\n \r\n {data?.items.map((ticket) => (\r\n \r\n \r\n {ticket.id}\r\n \r\n \r\n \r\n
\r\n {getInitials(ticket?.usuario?.nome)}\r\n \r\n
\r\n {ticket?.usuario?.nome}\r\n
{ticket?.usuario?.email}
\r\n
\r\n
\r\n \r\n \r\n {cpfCnpjMask(ticket.usuario.cpfCnpj)}\r\n \r\n \r\n {phoneMask(ticket.usuario.telefone)}\r\n \r\n \r\n {ticket.lote.tipoIngresso.descricao} - (\r\n {ticket.lote.descricao})\r\n \r\n \r\n {formatCurrency(ticket.valor - ticket.valorDesconto)}\r\n \r\n \r\n \r\n
\r\n {ticket.statusIngresso.descricao}\r\n \r\n
\r\n {ticket?.dataHoraValidacao ? (\r\n \r\n Validado em:{' '}\r\n {toLocalDateFormat(ticket?.dataHoraValidacao)}\r\n \r\n ) : null}\r\n
\r\n
\r\n \r\n \r\n ))}\r\n \r\n
\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default TableIngressos\r\n","import React, { useEffect, useState } from 'react'\r\nimport {\r\n Grid,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n InputLabel,\r\n makeStyles,\r\n Switch,\r\n TextField,\r\n InputAdornment,\r\n IconButton,\r\n Divider,\r\n useTheme,\r\n useMediaQuery,\r\n Chip,\r\n CircularProgress,\r\n Tooltip,\r\n Fade,\r\n Box\r\n} from '@material-ui/core'\r\nimport { useSelector } from 'react-redux'\r\nimport { Autocomplete } from '@material-ui/lab'\r\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\r\nimport CloseIcon from '@material-ui/icons/Close'\r\n\r\n//? Own imports\r\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\r\nimport {\r\n useEvents,\r\n useLotesByEventSelect,\r\n useStatusIngressoSelect,\r\n useTipoIngressoSelect\r\n} from 'hooks-querys'\r\nimport { history, toLocalDateFormat, useSearchQuery } from 'utils'\r\nimport { Evento } from 'types/api'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1\r\n },\r\n formControl: {\r\n width: '100%'\r\n },\r\n divider: {\r\n height: 28,\r\n margin: 4\r\n }\r\n}))\r\n\r\nconst SelectFilters = () => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const querySearch = useSearchQuery()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const [selectedEvento, setSelectedEvento] = useState(null)\r\n const [eventoInputValue, setEventoInputValue] = useState('')\r\n const [showPastEvents, setShowPastEvents] = useState(false)\r\n\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const textSearch = querySearch.get('busca') || ''\r\n const [searchText, setSearchText] = useState(textSearch || '')\r\n const eventId = querySearch.get('eventId') || '0'\r\n const loteId = querySearch.get('loteId') || ''\r\n const tipoIngressoId = querySearch.get('tipoIngressoId')\r\n const statusId = querySearch.get('statusId') || ''\r\n const validados = querySearch.get('validados') || ''\r\n const {\r\n data: events,\r\n isLoading: isLoadingEvents,\r\n isFetching: isFetchingEvents\r\n } = useEvents(estabelecimentoId, showPastEvents, isMobile)\r\n const {\r\n data: statusIngressoSelect,\r\n isLoading: isLoadingStatusIngressoSelect\r\n } = useStatusIngressoSelect()\r\n\r\n const {\r\n isLoading: isLoadingLotesByEventSelect,\r\n data: lotesByEventSelect\r\n } = useLotesByEventSelect(Number(eventId) || 0, Number(tipoIngressoId) || 0)\r\n const {\r\n isLoading: isLoadingTipoIngressoSelect,\r\n data: tipoIngressoSelect\r\n } = useTipoIngressoSelect(estabelecimentoId || 0)\r\n\r\n useEffect(() => {\r\n setSearchText(textSearch)\r\n }, [textSearch])\r\n\r\n useEffect(() => {\r\n //? função executada para buscar o evento o qual esta na url (?eventId=)\r\n //? se não existir evento na url não faz nada\r\n\r\n if (eventId && Number(eventId) > 0) {\r\n const event =\r\n events &&\r\n events.length > 0 &&\r\n events.find((e) => e.id === Number(eventId))\r\n //? se encontrar o evento na url, seta o evento selecionado,\r\n //? se não encontrar, troca a o estado showPastEvents para true,\r\n //? pois o evento informado pode ser um evento passado, e não existir na lista de eventos;\r\n //? com isso, a lista de evento efetua um novo fetch para buscar os eventos passados,\r\n //? e gera um novo efeito colateral caindo nesse useEffect novamente\r\n\r\n if (event) {\r\n setSelectedEvento(event)\r\n } else if (selectedEvento === null) {\r\n setShowPastEvents(!showPastEvents)\r\n }\r\n }\r\n }, [events])\r\n\r\n const handleSubmitSearch = (event: React.FormEvent) => {\r\n event.preventDefault()\r\n\r\n const sanitizeInput = (input: string) => input.replace(/[^\\w\\s@]/g, '')\r\n\r\n const sanitizedSearchText = sanitizeInput(searchText.trim())\r\n\r\n if (sanitizedSearchText) {\r\n querySearch.set('busca', sanitizedSearchText)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n }\r\n\r\n const handleRemoveFilter = (property: string) => {\r\n querySearch.delete(property)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n const handleChangeSelectFilter = (property: string, value: string) => {\r\n if (!value) {\r\n handleRemoveFilter(property)\r\n } else {\r\n querySearch.set(property, value)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n }\r\n const clearTextSearch = () => {\r\n querySearch.delete('busca')\r\n history.push({ search: querySearch.toString() })\r\n }\r\n const handleChangeValidatedTickets = (showValidatedTickets: string) => {\r\n querySearch.set('validados', showValidatedTickets)\r\n querySearch.delete('statusId')\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n useDidMountEffect(() => {\r\n history.push('/ingressos')\r\n }, [estabelecimentoId])\r\n\r\n useDidMountEffect(() => {\r\n if (selectedEvento?.id) {\r\n querySearch.set('eventId', selectedEvento?.id?.toString())\r\n history.push({ search: querySearch.toString() })\r\n }\r\n }, [statusId, selectedEvento])\r\n\r\n useEffect(() => {\r\n if (selectedEvento && selectedEvento.id) {\r\n if (eventoInputValue === '') {\r\n setEventoInputValue(\r\n selectedEvento.nome &&\r\n `${selectedEvento.nome} ${\r\n selectedEvento.dataHoraInicio\r\n ? ` - (${toLocalDateFormat(selectedEvento.dataHoraInicio)})`\r\n : ''\r\n }`\r\n )\r\n }\r\n }\r\n }, [selectedEvento])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n {\r\n setSelectedEvento(newValue)\r\n if (reason === 'clear') {\r\n //? se o usuário clicar no botão limpar\r\n setEventoInputValue('')\r\n history.push('/ingressos')\r\n }\r\n }}\r\n getOptionLabel={(evento) =>\r\n evento.nome &&\r\n `${evento.nome} ${\r\n evento.dataHoraInicio\r\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\r\n : ''\r\n }`\r\n }\r\n placeholder=\"Selecione o evento...\"\r\n onInputChange={(event, newInputValue) => {\r\n newInputValue !== null\r\n ? setEventoInputValue(newInputValue)\r\n : setEventoInputValue('')\r\n }}\r\n inputValue={eventoInputValue}\r\n renderInput={(params) => (\r\n \r\n {!isMobile && (\r\n \r\n <>\r\n {isFetchingEvents && (\r\n \r\n )}\r\n {\r\n setShowPastEvents(event.target.checked)\r\n }}\r\n checked={showPastEvents}\r\n size=\"small\"\r\n inputProps={{\r\n 'aria-label': 'Listar eventos encerrados'\r\n }}\r\n />\r\n {\r\n setShowPastEvents(!showPastEvents)\r\n }}\r\n />\r\n >\r\n \r\n )}\r\n {params.InputProps.endAdornment}\r\n >\r\n )\r\n }}\r\n />\r\n )}\r\n />\r\n \r\n \r\n\r\n 0)}>\r\n \r\n \r\n \r\n \r\n 0)}>\r\n \r\n \r\n \r\n Filtrar por status\r\n \r\n {\r\n handleChangeSelectFilter(\r\n 'statusId',\r\n event.target.value as string\r\n )\r\n }}\r\n label=\"Filtrar por status\"\r\n endAdornment={\r\n <>\r\n {!isMobile && (\r\n \r\n <>\r\n {\r\n handleChangeValidatedTickets(\r\n event.target.checked.toString()\r\n )\r\n }}\r\n checked={validados === 'true'}\r\n size=\"small\"\r\n inputProps={{\r\n 'aria-label': 'Listar ingressos validados'\r\n }}\r\n />\r\n {\r\n handleChangeValidatedTickets(\r\n validados !== 'true' ? 'true' : 'false'\r\n )\r\n }}\r\n />\r\n >\r\n \r\n )}\r\n >\r\n }\r\n >\r\n \r\n {statusId === '0' ? (\r\n 'Filtrar por status'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n {statusIngressoSelect &&\r\n statusIngressoSelect.length > 0 &&\r\n statusIngressoSelect.map((statusIngresso) => (\r\n \r\n {statusIngresso.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n 0)}>\r\n \r\n \r\n \r\n Filtrar por tipo de ingresso\r\n \r\n {\r\n handleChangeSelectFilter(\r\n 'tipoIngressoId',\r\n event.target.value as string\r\n )\r\n handleRemoveFilter('loteId')\r\n }}\r\n label={\r\n isLoadingTipoIngressoSelect\r\n ? 'Carregando...'\r\n : 'Filtrar por tipo de ingresso'\r\n }\r\n >\r\n \r\n {!tipoIngressoId ? (\r\n 'Filtrar por tipo de ingresso'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n {Array.isArray(tipoIngressoSelect) &&\r\n tipoIngressoSelect?.map((selectItem) => (\r\n \r\n {selectItem?.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n {Number(tipoIngressoId) > 0 && (\r\n 0 &&\r\n selectedEvento &&\r\n selectedEvento.id > 0\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n {isLoadingLotesByEventSelect\r\n ? 'Carregando...'\r\n : 'Filtrar por lote'}\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n placeholder={\r\n isLoadingLotesByEventSelect\r\n ? 'Carregando...'\r\n : 'Filtrar por lote'\r\n }\r\n labelId=\"lote-select-label\"\r\n id=\"lote-select-select\"\r\n value={loteId}\r\n onChange={(event) => {\r\n handleChangeSelectFilter(\r\n 'loteId',\r\n event.target.value as string\r\n )\r\n }}\r\n label={\r\n isLoadingLotesByEventSelect\r\n ? 'Carregando...'\r\n : 'Filtrar por lote'\r\n }\r\n >\r\n \r\n {!loteId ? (\r\n 'Filtrar por lote'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n {Array.isArray(lotesByEventSelect) &&\r\n lotesByEventSelect?.map((selectItem) => (\r\n \r\n {selectItem?.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {isMobile && (\r\n 0)}>\r\n \r\n {\r\n handleChangeValidatedTickets(event.target.checked.toString())\r\n }}\r\n checked={validados === 'true'}\r\n size=\"small\"\r\n inputProps={{\r\n 'aria-label': 'Listar ingressos validados'\r\n }}\r\n />\r\n {\r\n handleChangeValidatedTickets(\r\n validados !== 'true' ? 'true' : 'false'\r\n )\r\n }}\r\n />\r\n \r\n \r\n )}\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default SelectFilters\r\n","import React from 'react'\r\nimport { makeStyles } from '@material-ui/core'\r\n//? Own imports\r\n\r\nimport { SelectFilters, TableIngressos } from './components'\r\nimport { AccessControl } from 'components/Utils/AccessControl'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%'\r\n }\r\n}))\r\n\r\nconst TicketsList = () => {\r\n const classes = useStyles()\r\n\r\n return (\r\n (\r\n \r\n )}\r\n />\r\n )\r\n}\r\n\r\nexport default TicketsList\r\n","import React, { useEffect, useState } from 'react'\r\nimport {\r\n Grid,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n InputLabel,\r\n makeStyles,\r\n TextField,\r\n InputAdornment,\r\n useTheme,\r\n useMediaQuery,\r\n Chip,\r\n CircularProgress,\r\n Avatar,\r\n Typography,\r\n Button,\r\n Box\r\n} from '@material-ui/core'\r\nimport { useSelector } from 'react-redux'\r\nimport { Autocomplete } from '@material-ui/lab'\r\nimport { useConfirm } from 'material-ui-confirm'\r\n\r\n//? Own imports\r\nimport {\r\n useEvents,\r\n useLotesByEvent,\r\n useMutationCreateFreeTicket,\r\n useUserSearch\r\n} from 'hooks-querys'\r\nimport {\r\n getGenderFull,\r\n getInitials,\r\n toLocalDateFormat,\r\n useDebouncedEffect\r\n} from 'utils'\r\nimport { Evento, UserItem } from 'types/api'\r\nimport { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'\r\nimport { HelperToolTip } from 'components'\r\nimport { toast } from 'react-toastify'\r\n\r\nvar pluralize = require('pluralize')\r\n\r\nconst MAX_TICKETS_QUANTITY = 10\r\nconst MAX_USERS_QUANTITY = 10\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1\r\n },\r\n formControl: {\r\n width: '100%'\r\n },\r\n divider: {\r\n height: 28,\r\n margin: 4\r\n },\r\n selectedUserModalContainer: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flexGrow: 1,\r\n gap: theme.spacing(1),\r\n paddingTop: theme.spacing(2)\r\n },\r\n selectedUserItem: {\r\n borderRadius: 8,\r\n backgroundColor: '#f9f9f9',\r\n padding: theme.spacing(1),\r\n display: 'flex',\r\n alignItems: 'center'\r\n },\r\n nameCell: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n },\r\n\r\n avatar: {\r\n height: 40,\r\n width: 40,\r\n marginRight: theme.spacing(1)\r\n },\r\n submitButton: {\r\n [theme.breakpoints.down('xs')]: {\r\n width: '100%'\r\n },\r\n minWidth: 200\r\n }\r\n}))\r\n\r\nconst Generate = () => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const confirm = useConfirm()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const [selectedEvento, setSelectedEvento] = useState({} as Evento)\r\n const [selectedUser, setSelectedUser] = useState([] as UserItem[])\r\n const [quantity, setQuantity] = useState(1)\r\n const [loteId, setLoteId] = useState(null)\r\n const [eventoInputValue, setEventoInputValue] = useState('')\r\n const [searchTextValue, setSearchTextValue] = useState('')\r\n const [searchTextValueToSubmit, setSearchTextValueToSubmit] = useState('')\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const totalTicketsToGenerate = selectedUser?.length * quantity\r\n\r\n const {\r\n data: events,\r\n isLoading: isLoadingEvents,\r\n isFetching: isFetchingEvents\r\n } = useEvents(estabelecimentoId, false, isMobile)\r\n\r\n const {\r\n data: lotes,\r\n isLoading: isLoadingLotes,\r\n isError: isErrorLotes\r\n } = useLotesByEvent(selectedEvento?.id)\r\n const {\r\n data: resultUserSearch,\r\n isError: isErrorUserSearch,\r\n isLoading: isLoadingUserSearch\r\n } = useUserSearch(searchTextValueToSubmit)\r\n\r\n const mutationCreateFreeTicket = useMutationCreateFreeTicket()\r\n\r\n useDebouncedEffect(\r\n () => {\r\n setSearchTextValueToSubmit(searchTextValue)\r\n },\r\n 500,\r\n [searchTextValue]\r\n )\r\n\r\n useEffect(() => {\r\n setSelectedEvento({} as Evento)\r\n setLoteId(0)\r\n setSelectedUser([])\r\n }, [estabelecimentoId])\r\n\r\n const handleSubmitForm = () => {\r\n const loteDetails = lotes?.find((lote) => lote.id === loteId)\r\n confirm({\r\n title: `Você tem certeza que deseja gerar ${pluralize(\r\n 'ingressos',\r\n totalTicketsToGenerate,\r\n true\r\n )} (${quantity} por usuário)?`,\r\n confirmationButtonProps: {\r\n disabled: mutationCreateFreeTicket.isLoading,\r\n endIcon: mutationCreateFreeTicket.isLoading && (\r\n \r\n )\r\n },\r\n description: (\r\n \r\n
\r\n Evento:{' '}\r\n \r\n {selectedEvento.nome} - (\r\n {toLocalDateFormat(selectedEvento.dataHoraInicio)})\r\n \r\n {'\\n'}\r\n \r\n
\r\n Lote:{' '}\r\n \r\n {loteDetails\r\n ? loteDetails.tipoIngresso\r\n ? `${loteDetails.tipoIngresso.descricao} - ${\r\n loteDetails.descricao\r\n } (${getGenderFull(loteDetails.genero)})`\r\n : loteDetails.descricao\r\n : ''}\r\n \r\n \r\n
\r\n \r\n {pluralize('Os', totalTicketsToGenerate)}{' '}\r\n {pluralize('ingressos', totalTicketsToGenerate)}{' '}\r\n {totalTicketsToGenerate === 1 ? 'será' : 'serão'}{' '}\r\n {pluralize('gerado', totalTicketsToGenerate)} para{' '}\r\n {pluralize('os', selectedUser?.length)}{' '}\r\n {pluralize('seguintes', selectedUser?.length)}{' '}\r\n {pluralize('usuários', selectedUser?.length)}:\r\n \r\n \r\n {pluralize('Os', selectedUser?.length)}{' '}\r\n {pluralize('usuários', selectedUser?.length)}{' '}\r\n {selectedUser?.length === 1 ? 'receberá' : 'receberão'} uma\r\n notificação no aplicativo com {pluralize('os', quantity)}{' '}\r\n {pluralize('ingressos', quantity)}{' '}\r\n {pluralize('gerados', quantity)}.\r\n \r\n \r\n {selectedUser?.map((item) => (\r\n \r\n \r\n {getInitials(item?.nome)}\r\n \r\n \r\n \r\n {`${item?.nome} ${\r\n item?.username ? `(@${item?.username})` : ''\r\n }`}\r\n \r\n
\r\n \r\n ))}\r\n \r\n \r\n
\r\n ),\r\n confirmationText: (\r\n <>\r\n {mutationCreateFreeTicket.isLoading\r\n ? `Gerando ${pluralize('ingressos', totalTicketsToGenerate)}...`\r\n : `Enviar ${pluralize('cortesia', totalTicketsToGenerate)}`}\r\n >\r\n ),\r\n cancellationText: 'Cancelar'\r\n }).then(() => {\r\n if (selectedUser?.length > 0 && loteId && loteId > 0) {\r\n const payloadArray = selectedUser?.map((user) => ({\r\n usuarioId: user?.id,\r\n loteId: loteId,\r\n quantidade: quantity\r\n }))\r\n\r\n mutationCreateFreeTicket.mutateAsync(payloadArray).then(() => {\r\n setSelectedUser([])\r\n setSearchTextValue('')\r\n })\r\n }\r\n })\r\n }\r\n\r\n const showMaxUserQuantityToastError = () => {\r\n toast.error(\r\n `Você atingiu o número máximo de usuários permitidos (${MAX_USERS_QUANTITY}).`,\r\n { toastId: 'maxUserQuantityToastError' }\r\n )\r\n }\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n {\r\n if (reason === 'select-option') {\r\n newValue !== null && setSelectedEvento(newValue)\r\n }\r\n if (reason === 'clear') {\r\n //? se o usuário clicar no botão limpar\r\n setEventoInputValue('')\r\n setSelectedEvento({} as Evento)\r\n }\r\n }}\r\n getOptionLabel={(evento) =>\r\n evento.nome &&\r\n `${evento.nome} ${\r\n evento.dataHoraInicio\r\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\r\n : ''\r\n }`\r\n }\r\n placeholder=\"Selecione o evento...\"\r\n onInputChange={(event, newInputValue) => {\r\n newInputValue !== null\r\n ? setEventoInputValue(newInputValue)\r\n : setEventoInputValue('')\r\n }}\r\n inputValue={eventoInputValue}\r\n renderInput={(params) => (\r\n \r\n \r\n <>\r\n {isFetchingEvents && (\r\n \r\n )}\r\n >\r\n \r\n {params.InputProps.endAdornment}\r\n >\r\n )\r\n }}\r\n />\r\n )}\r\n />\r\n \r\n \r\n {selectedEvento && selectedEvento.id > 0 && (\r\n <>\r\n <>\r\n \r\n \r\n Selecione o lote \r\n {\r\n setLoteId(Number(event.target.value))\r\n }}\r\n label=\"Selecione o lote\"\r\n >\r\n \r\n {loteId === 0 ? (\r\n 'Selecione o lote'\r\n ) : (\r\n Limpar seleção \r\n )}\r\n \r\n {lotes &&\r\n lotes.length > 0 &&\r\n lotes.map((lote) => (\r\n \r\n {lote.tipoIngresso\r\n ? `${lote.tipoIngresso.descricao} - ${\r\n lote.descricao\r\n } (${getGenderFull(lote.genero)})`\r\n : lote.descricao}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n Informe a quantidade de ingressos a serem gerados\r\n para cada usuário. O valor deve ser entre 1 e{' '}\r\n {MAX_TICKETS_QUANTITY}.\r\n \r\n \r\n )\r\n }}\r\n label=\"Quantidade de ingressos *\"\r\n variant=\"outlined\"\r\n inputProps={{ type: 'number' }}\r\n fullWidth\r\n type=\"number\"\r\n placeholder={`Digite a quantidade de ingressos (máx: ${MAX_TICKETS_QUANTITY})`}\r\n value={quantity}\r\n onChange={(event: React.ChangeEvent) =>\r\n setQuantity(Number(event?.target?.value))\r\n }\r\n disabled={mutationCreateFreeTicket?.isLoading}\r\n />\r\n \r\n >\r\n {loteId && loteId > 0 ? (\r\n \r\n \r\n \r\n selectedUser.some((user) => user.id === option.id)\r\n }\r\n loading={isLoadingUserSearch}\r\n id=\"combo-box-user\"\r\n multiple\r\n options={\r\n resultUserSearch?.filter(\r\n (userItem) => userItem.tipo === 'usuario'\r\n ) || []\r\n }\r\n value={selectedUser}\r\n onFocus={() => {\r\n if (selectedUser?.length === MAX_USERS_QUANTITY) {\r\n showMaxUserQuantityToastError()\r\n }\r\n }}\r\n onChange={(event, newValue, reason) => {\r\n if (reason === 'select-option' && newValue !== null) {\r\n if (newValue?.length > MAX_USERS_QUANTITY) {\r\n showMaxUserQuantityToastError()\r\n return\r\n }\r\n setSelectedUser(newValue) // Mantém todos os valores selecionados\r\n }\r\n if (reason === 'clear') {\r\n // Se o usuário clicar no botão limpar\r\n setSearchTextValue('')\r\n setSelectedUser([]) // Limpa os usuários selecionados\r\n }\r\n }}\r\n renderTags={(value, getTagProps) =>\r\n value.map((option, index) => (\r\n \r\n {getInitials(option?.nome)}\r\n \r\n }\r\n variant=\"outlined\"\r\n label={`${option?.nome} ${\r\n option.username ? `(@${option.username})` : ''\r\n }`}\r\n onDelete={() => {\r\n setSelectedUser(\r\n selectedUser?.filter(\r\n (user) => user?.id !== option?.id\r\n )\r\n )\r\n }}\r\n />\r\n ))\r\n }\r\n getOptionLabel={(userItem) =>\r\n userItem.nome &&\r\n `${userItem.nome} ${\r\n userItem.username ? ` - (${userItem.username})` : ''\r\n }`\r\n }\r\n placeholder=\"Buscar por nome ou nome do usuário...\"\r\n onInputChange={(event, newInputValue) => {\r\n newInputValue !== null\r\n ? setSearchTextValue(newInputValue)\r\n : setSearchTextValue('')\r\n }}\r\n inputValue={searchTextValue}\r\n renderInput={(params) => (\r\n \r\n \r\n <>\r\n {isLoadingUserSearch && (\r\n \r\n )}\r\n >\r\n \r\n {params.InputProps.endAdornment}\r\n >\r\n )\r\n }}\r\n />\r\n )}\r\n noOptionsText={\r\n searchTextValueToSubmit.length > 0\r\n ? 'Nenhum usuário encontrado'\r\n : 'Digite para buscar'\r\n }\r\n renderOption={(userItem) => (\r\n \r\n
\r\n {getInitials(userItem?.nome)}\r\n \r\n
\r\n \r\n {`${userItem?.nome} ${\r\n userItem.username\r\n ? `(@${userItem.username})`\r\n : ''\r\n }`}\r\n \r\n
\r\n
\r\n )}\r\n />\r\n \r\n \r\n ) : null}\r\n >\r\n )}\r\n {selectedUser?.length > 0 && loteId && loteId > 0 ? (\r\n \r\n \r\n )\r\n }\r\n >\r\n {mutationCreateFreeTicket.isLoading\r\n ? `Gerando ${pluralize(\r\n 'ingressos',\r\n totalTicketsToGenerate\r\n )}...`\r\n : `Gerar ${pluralize('ingressos', totalTicketsToGenerate)}`}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Generate\r\n","import React from 'react'\nimport Lottie from 'react-lottie'\nimport { Box, Typography } from '@material-ui/core'\n\n//? Own imports\nimport animationData from 'assets/animations/casino-draw.json'\n\nexport default function DrawingAnimation() {\n const defaultOptions = {\n loop: true,\n autoplay: true,\n animationData: animationData,\n rendererSettings: {\n preserveAspectRatio: 'xMidYMid slice'\n }\n }\n\n return (\n \n \n \n Sorteando ingresso...\n \n \n )\n}\n","import React from 'react'\nimport Lottie from 'react-lottie'\nimport { Avatar, Box, Fade, Typography, makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport animationData from 'assets/animations/surprise-box.json'\nimport { User } from 'types/api'\nimport { getInitials } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n avatar: {\n [theme.breakpoints.down('xs')]: {\n width: '18vw',\n height: '18vw'\n },\n [theme.breakpoints.up('sm')]: {\n width: '15vw',\n height: '15vw'\n },\n [theme.breakpoints.up('md')]: {\n width: '8vw',\n height: '8vw'\n },\n border: '3px solid #fff',\n boxShadow: '0 0 0 2px #fff'\n },\n avatarContainer: {\n width: '100%',\n height: '100%',\n display: 'flex',\n position: 'absolute',\n alignItems: 'center',\n justifyContent: 'center',\n top: '-7px',\n left: '-2px'\n },\n animation: {\n width: '100%',\n height: '100%',\n position: 'relative'\n }\n}))\n\nexport default function WinnerAnimation({ user }: { user: User | undefined }) {\n const [showUser, setShowUser] = React.useState(false)\n const classes = useStyles()\n const defaultOptions = {\n loop: false,\n autoplay: true,\n animationData: animationData,\n rendererSettings: {\n preserveAspectRatio: 'xMidYMid slice'\n }\n }\n\n return (\n <>\n {user && user.id ? (\n \n
\n \n Já temos um vencedor!\n \n \n \n Parabéns, {user.apelido || user.nome}! (@{user.username})\n \n \n \n
{\n setShowUser(true)\n }\n }\n ]}\n speed={0.7}\n options={defaultOptions}\n height=\"95%\"\n width=\"95%\"\n />\n \n
\n \n {getInitials(user.nome)}\n \n \n
\n \n \n
\n ) : null}\n >\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport {\n Dialog,\n DialogContent,\n makeStyles,\n Slide,\n useTheme,\n useMediaQuery,\n Zoom,\n Box\n} from '@material-ui/core'\n\n//? Own imports\nimport { DrawingAnimation, WinnerAnimation } from './components'\nimport { useMutationDrawTicket } from 'hooks-querys'\n\nconst Transition = React.forwardRef(function Transition(props, ref) {\n return \n})\n\nconst useStyles = makeStyles((theme) => ({\n dialog: {\n [theme.breakpoints.up('sm')]: {\n '& .MuiDialog-paper': {\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px',\n overflow: 'hidden',\n overflowY: 'hidden',\n overflowX: 'hidden'\n }\n }\n }\n}))\n\ntype ModalDrawTicketProps = {\n openModal: boolean\n setOpenModal: (open: boolean) => void\n loteId: number\n segueEstabelecimento: boolean\n favoritouEvento: boolean\n}\nexport default function ModalSolicitarRetirada({\n openModal,\n setOpenModal,\n loteId,\n segueEstabelecimento,\n favoritouEvento\n}: ModalDrawTicketProps) {\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [isDrawingAnimation, setIsDrawingAnimation] = useState(false)\n const mutationDrawTicket = useMutationDrawTicket()\n\n const handleClose = () => {\n setOpenModal(false)\n }\n\n useEffect(() => {\n if (openModal) {\n setIsDrawingAnimation(true)\n mutationDrawTicket\n .mutateAsync({\n loteId: loteId || 0,\n favoritouEvento: favoritouEvento,\n segueEstabelecimento: segueEstabelecimento\n })\n .then(() => {\n setTimeout(() => {\n setIsDrawingAnimation(false)\n }, 3000)\n })\n .catch(() => {\n setIsDrawingAnimation(false)\n })\n }\n }, [openModal])\n\n return (\n \n \n \n {isDrawingAnimation && (\n \n \n \n )}\n \n \n \n \n \n \n )\n}\n","import React, { useEffect, useState, useMemo } from 'react'\nimport {\n Grid,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n makeStyles,\n TextField,\n InputAdornment,\n useTheme,\n useMediaQuery,\n CircularProgress,\n Typography,\n Button,\n Box,\n FormLabel,\n FormHelperText,\n FormGroup,\n FormControlLabel,\n Checkbox,\n Backdrop\n} from '@material-ui/core'\nimport { useSelector } from 'react-redux'\nimport { Autocomplete } from '@material-ui/lab'\n\n//? Own imports\nimport { useEvents, useLotesByEvent, useUsersDrawTicket } from 'hooks-querys'\nimport { getGenderFull, toLocalDateFormat } from 'utils'\nimport { Evento, UserItem } from 'types/api'\nimport { ModalDrawTicket } from './components'\nimport { HelperToolTip } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1\n },\n formControl: {\n width: '100%'\n },\n submitButton: {\n [theme.breakpoints.down('xs')]: {\n width: '100%'\n },\n minWidth: 200\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff'\n },\n helperText: {\n display: 'flex',\n alignItems: 'center'\n }\n}))\n\nconst Draw = () => {\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [selectedEvento, setSelectedEvento] = useState({} as Evento)\n const [loteId, setLoteId] = useState(null)\n const [eventoInputValue, setEventoInputValue] = useState('')\n const [openModal, setOpenModal] = useState(false)\n const [selectedDrawRules, setSelectedDrawRules] = useState({\n segueEstabelecimento: false,\n favoritouEvento: false\n })\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const {\n data: events,\n isLoading: isLoadingEvents,\n isFetching: isFetchingEvents\n } = useEvents(estabelecimentoId, false, isMobile)\n\n const {\n data: lotes,\n isLoading: isLoadingLotes,\n isError: isErrorLotes\n } = useLotesByEvent(selectedEvento?.id)\n\n useEffect(() => {\n setSelectedEvento({} as Evento)\n setLoteId(0)\n }, [estabelecimentoId])\n\n const {\n data: numberOfUsers,\n isLoading: isLoadingNumberOfUsers,\n isSuccess: isSuccessNumberOfUsers\n } = useUsersDrawTicket({\n loteId: loteId || 0,\n favoritouEvento: selectedDrawRules.favoritouEvento,\n segueEstabelecimento: selectedDrawRules.segueEstabelecimento\n })\n\n const handleDrawRulesChange = (\n event: React.ChangeEvent\n ) => {\n setSelectedDrawRules({\n ...selectedDrawRules,\n [event.target.name]: event.target.checked\n })\n }\n\n const handleClickSubmit = () => {\n setOpenModal(true)\n }\n const errorDrawRules = useMemo(() => {\n if (\n !selectedDrawRules.segueEstabelecimento &&\n !selectedDrawRules.favoritouEvento\n ) {\n return 'Selecione ao menos uma regra de sorteio'\n }\n return ''\n }, [selectedDrawRules])\n\n return (\n \n
\n
\n \n \n {\n if (reason === 'select-option') {\n newValue !== null && setSelectedEvento(newValue)\n }\n if (reason === 'clear') {\n //? se o usuário clicar no botão limpar\n setEventoInputValue('')\n setSelectedEvento({} as Evento)\n }\n }}\n getOptionLabel={(evento) =>\n evento.nome &&\n `${evento.nome} ${\n evento.dataHoraInicio\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\n : ''\n }`\n }\n placeholder=\"Selecione o evento...\"\n onInputChange={(_event, newInputValue) => {\n newInputValue !== null\n ? setEventoInputValue(newInputValue)\n : setEventoInputValue('')\n }}\n inputValue={eventoInputValue}\n renderInput={(params) => (\n \n \n <>\n {isFetchingEvents && (\n \n )}\n >\n \n {params.InputProps.endAdornment}\n >\n )\n }}\n />\n )}\n />\n \n \n {selectedEvento && selectedEvento.id > 0 && (\n <>\n \n \n Selecione o lote \n {\n setLoteId(Number(event.target.value))\n }}\n label=\"Selecione o lote\"\n >\n \n {loteId === 0 ? (\n 'Selecione o lote'\n ) : (\n Limpar seleção \n )}\n \n {lotes &&\n lotes.length > 0 &&\n lotes.map((lote) => (\n \n {lote.tipoIngresso\n ? `${lote.tipoIngresso.descricao} - ${\n lote.descricao\n } (${getGenderFull(lote.genero)})`\n : lote.descricao}\n \n ))}\n \n \n \n {loteId && loteId > 0 ? (\n \n \n \n Selecione as regras para o sorteio\n \n \n \n \n \n }\n label={\n \n \n Favoritou o evento\n \n \n O usuário precisa ter favoritado o evento para poder\n participar do sorteio.\n \n
\n }\n />\n \n }\n label={\n \n \n Segue o estabelecimento\n \n \n O usuário precisa seguir o perfil do estabelecimento\n para poder participar do sorteio.\n \n
\n }\n />\n \n {errorDrawRules} \n \n \n ) : null}\n >\n )}\n\n {!isLoadingNumberOfUsers && isSuccessNumberOfUsers ? (\n \n {numberOfUsers > 0 ? (\n \n \n {`${numberOfUsers} ${\n numberOfUsers === 1 ? 'pessoa' : 'pessoas'\n }`} \n \n \n {`${\n numberOfUsers === 1 ? 'está' : 'estão'\n } participando deste sorteio!`}\n \n \n ) : (\n \n \n Não foram encontrados usuários participantes deste sorteio!\n \n \n )}\n \n ) : null}\n\n {isSuccessNumberOfUsers && numberOfUsers > 0 ? (\n \n \n Sortear ingresso\n \n \n ) : null}\n \n
\n \n \n \n \n Buscando participantes para o sorteio...\n \n \n \n \n \n \n \n \n
\n )\n}\n\nexport default Draw\n","import React, { ChangeEvent, useState } from 'react'\r\nimport { Redirect, useParams } from 'react-router-dom'\r\nimport ListRoundedIcon from '@material-ui/icons/ListRounded'\r\nimport CardGiftcardTwoToneIcon from '@material-ui/icons/CardGiftcardTwoTone'\r\nimport CasinoTwoToneIcon from '@material-ui/icons/CasinoTwoTone'\r\nimport {\r\n Tabs,\r\n Tab,\r\n Divider,\r\n colors,\r\n makeStyles,\r\n useTheme,\r\n useMediaQuery,\r\n LinearProgress\r\n} from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { Page, Header } from 'components'\r\nimport { history } from 'utils'\r\nimport { Draw, Generate, TicketsList } from './components'\r\nimport { useQueryClient } from 'react-query'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(3, 2, 2, 2)\r\n },\r\n tabs: {\r\n marginTop: theme.spacing(3)\r\n },\r\n divider: {\r\n backgroundColor: colors.grey[300]\r\n },\r\n content: {\r\n marginTop: theme.spacing(3)\r\n }\r\n}))\r\n\r\nconst tabs = [\r\n { value: 'lista', label: 'Lista', icon: },\r\n {\r\n value: 'gerar',\r\n label: 'Gerar cortesia',\r\n icon: \r\n },\r\n {\r\n value: 'sortear',\r\n label: 'Sortear ingresso',\r\n icon: \r\n }\r\n]\r\n\r\nconst Tickets = () => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const { tab } = useParams<{ tab: string }>()\r\n\r\n const queryClient = useQueryClient()\r\n const [refreshing, setRefreshing] = useState(false)\r\n\r\n const handleTabsChange = (_event: ChangeEvent<{}>, value: string) => {\r\n history.push(`/ingressos/${value}`)\r\n }\r\n\r\n if (!tab) {\r\n return \r\n }\r\n\r\n if (!tabs.find((t) => t.value === tab)) {\r\n return \r\n }\r\n\r\n const onRefresh = async () => {\r\n setRefreshing(true)\r\n try {\r\n await queryClient.refetchQueries({ active: true })\r\n } finally {\r\n setRefreshing(false)\r\n }\r\n }\r\n\r\n const getTitle = () => {\r\n switch (tab) {\r\n case 'lista':\r\n return 'Lista de ingressos'\r\n case 'gerar':\r\n return 'Gerar cortesia'\r\n case 'sortear':\r\n return 'Sortear ingresso'\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {refreshing && (\r\n \r\n )}\r\n \r\n
\r\n
\r\n {tabs.map((tab) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n {tab === 'lista' && (\r\n
\r\n \r\n \r\n )}\r\n {tab === 'gerar' && (\r\n
\r\n \r\n \r\n )}\r\n {tab === 'sortear' && (\r\n
\r\n \r\n \r\n )}\r\n
\r\n
\r\n >\r\n )\r\n}\r\n\r\nexport default Tickets\r\n","import axios from 'axios'\nimport config from '../../../../config/config'\n\nconst api = axios.create({\n baseURL: config.baseUrl\n})\n\nexport default api\n","import { createGlobalStyle } from 'styled-components'\n\nimport 'react-circular-progressbar/dist/styles.css'\n\nexport default createGlobalStyle`\n * {\n margin: 0;\n padding: 0;\n outline: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, Helvetica, sans-serif;\n font-size: 14px;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n\n html, body, #root {\n height: 100%;\n }\n`\n","import styled from 'styled-components'\n\nexport const Container = styled.div`\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n`\n\nexport const Content = styled.div`\n width: 100%;\n /* margin: 30px; */\n background: #fff;\n border-radius: 4px;\n /* padding: 20px; */\n`\n","import styled, { css } from 'styled-components'\n\nconst dragActive = css`\n border-color: #78e5d5;\n`\n\nconst dragReject = css`\n border-color: #e57878;\n`\n\nexport const DropContainer = styled.div.attrs({\n className: 'dropzone'\n})`\n border: 1px dashed #ddd;\n border-radius: 4px;\n cursor: pointer;\n min-height: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: height 0.2s ease;\n\n ${(props) => props.isDragActive && dragActive};\n ${(props) => props.isDragReject && dragReject};\n`\n\nconst messageColors = {\n default: '#999',\n error: '#e57878',\n success: '#78e5d5'\n}\n\nexport const UploadMessage = styled.p`\n display: flex;\n color: ${(props) => messageColors[props.type || 'default']};\n justify-content: center;\n align-items: center;\n padding: 15px 0;\n`\n","import React, { Component } from 'react'\nimport { MdFileUpload, MdError, MdDone } from 'react-icons/md'\nimport Dropzone from 'react-dropzone'\n\nimport { DropContainer, UploadMessage } from './styles'\n\nexport default class Upload extends Component {\n renderDragMessage = (isDragActive, isDragReject) => {\n if (!isDragActive) {\n return (\n \n Clique ou arraste a imagem aqui...\n \n \n )\n }\n\n if (isDragReject) {\n return (\n \n Arquivo não suportado!\n \n \n )\n }\n\n return (\n \n Solte a imagem aqui!\n \n \n )\n }\n\n render() {\n const { onUpload } = this.props\n\n return (\n \n {({ getRootProps, getInputProps, isDragActive, isDragReject }) => (\n \n \n {this.renderDragMessage(isDragActive, isDragReject)}\n \n )}\n \n )\n }\n}\n","import styled from 'styled-components'\n\nexport const Container = styled.ul`\n margin-top: 20px;\n\n li {\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: #444;\n\n & + li {\n margin-top: 15px;\n }\n }\n`\n\nexport const FileInfo = styled.div`\n display: flex;\n align-items: center;\n\n div {\n display: flex;\n flex-direction: column;\n\n span {\n font-size: 12px;\n color: #999;\n margin-top: 5px;\n\n button {\n border: 0;\n background: transparent;\n color: #e57878;\n margin-left: 5px;\n cursor: pointer;\n }\n }\n }\n`\n\nexport const Preview = styled.div`\n width: 180px;\n height: 110px;\n border-radius: 5px;\n background-image: url('${(props) => props.src}');\n background-repeat: no-repeat;\n background-size: cover;\n background-position: 50% 50%;\n margin-right: 10px;\n`\n","import React from 'react'\nimport { CircularProgressbarWithChildren } from 'react-circular-progressbar'\nimport 'react-circular-progressbar/dist/styles.css'\nimport { MdCheckCircle, MdError, MdLink } from 'react-icons/md'\n\nimport { Container, FileInfo, Preview } from './styles'\n\nconst FileList = ({ files }) => (\n \n {files.map((uploadedFile) => (\n \n \n \n \n {uploadedFile.name} \n \n {uploadedFile.readableSize}{' '}\n {/* {!!uploadedFile.url && (\n onDelete(uploadedFile.id)}>\n Excluir\n \n )} */}\n \n
\n \n\n \n {!uploadedFile.uploaded && !uploadedFile.error && (\n
\n {/* Put any JSX content in here that you'd like. It'll be vertically and horizonally centered. */}\n \n \n {uploadedFile.progress} %\n
\n \n )}\n {uploadedFile.url && (\n
\n \n \n )}\n\n {uploadedFile.uploaded &&
}\n {uploadedFile.error &&
}\n
\n \n ))}\n \n)\n\nexport default FileList\n","import React, { Component } from 'react'\nimport { uniqueId } from 'lodash'\nimport filesize from 'filesize'\nimport { Typography } from '@material-ui/core'\nimport api from './services/api'\nimport { toast } from 'react-toastify'\nimport GlobalStyle from './styles/global'\nimport { Container, Content } from './styles'\nimport Upload from './components/Upload'\nimport FileList from './components/FileList'\n\nclass UploadField extends Component {\n state = {\n uploadedFiles: [],\n new: false\n }\n\n componentDidMount() {\n if (this.props.url !== '') {\n let uploadedFile = []\n uploadedFile.push({\n id: uniqueId(),\n name: 'Imagem atual',\n readableSize: null,\n preview: this.props.url,\n uploaded: true,\n url: this.props.url\n })\n this.setState({ ...this.state, uploadedFiles: uploadedFile })\n } else {\n this.setState({\n uploadedFiles: [],\n url: '',\n preview: '',\n uploaded: false\n })\n }\n }\n componentWillReceiveProps(nextProps) {\n if (nextProps.url !== '') {\n if (this.state.new !== true) {\n let uploadedFile = []\n uploadedFile.push({\n id: uniqueId(),\n name: 'Imagem atual',\n readableSize: null,\n preview: nextProps.url,\n uploaded: true,\n url: nextProps.url\n })\n this.setState({ ...this.state, uploadedFiles: uploadedFile })\n }\n } else {\n this.setState({\n uploadedFiles: [],\n url: '',\n preview: '',\n uploaded: false\n })\n }\n }\n componentWillUnmount() {\n this.setState({ ...this.state, uploadedFiles: [] })\n }\n\n sendURLToParent = (url) => {\n this.props.parentCallback(url)\n }\n\n handleUpload = (files) => {\n const uploadedFiles = files.map((file) => ({\n file,\n id: uniqueId(),\n name: file.name,\n readableSize: filesize(file.size),\n preview: URL.createObjectURL(file),\n progress: 0,\n uploaded: false,\n error: false,\n url: null\n }))\n\n this.setState({\n uploadedFiles\n // Várias imagens\n // uploadedFiles: this.state.uploadedFiles.concat(uploadedFiles)\n })\n this.setState({ ...this.state, new: true })\n uploadedFiles.forEach(this.processUpload)\n }\n\n updateFile = (id, data) => {\n this.setState({\n uploadedFiles: this.state.uploadedFiles.map((uploadedFile) => {\n return id === uploadedFile.id\n ? { ...uploadedFile, ...data }\n : uploadedFile\n })\n })\n }\n\n processUpload = (uploadedFile) => {\n const data = new FormData()\n\n data.append('file', uploadedFile.file, uploadedFile.name)\n\n api\n .post('uploads/S3', data, {\n onUploadProgress: (e) => {\n const progress = parseInt(Math.round((e.loaded * 100) / e.total))\n\n this.updateFile(uploadedFile.id, {\n progress\n })\n },\n headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }\n })\n .then((response) => {\n this.updateFile(uploadedFile.id, {\n uploaded: true,\n id: response.data._id,\n url: response.data.url\n })\n toast.success('Feito! Upload de imagem finalizado! 👏')\n this.sendURLToParent(response.data.url)\n })\n .catch(() => {\n this.updateFile(uploadedFile.id, {\n error: true\n })\n })\n }\n\n handleDelete = async (id) => {\n await api.delete(`uploads/${id}`)\n\n this.setState({\n uploadedFiles: this.state.uploadedFiles.filter((file) => file.id !== id)\n })\n }\n\n componentWillUnmount() {\n this.state.uploadedFiles.forEach((file) =>\n URL.revokeObjectURL(file.preview)\n )\n }\n\n render() {\n const { uploadedFiles } = this.state\n return (\n \n \n {this.props.labelText} \n {this.props.disabled !== true &&\n \n }\n {!!uploadedFiles.length && (\n \n )}\n \n \n \n )\n }\n}\n\nexport default UploadField\n","import React, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Button,\n Divider,\n Table,\n TableBody,\n TableRow,\n TableCell,\n colors,\n MenuItem,\n FormControl,\n InputLabel,\n Select,\n TextField,\n CircularProgress\n} from '@material-ui/core'\nimport EditIcon from '@material-ui/icons/Edit'\n\nimport { Label } from 'components'\nimport { formatCurrency, toLocalDateFormat } from 'utils'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport { isEmpty } from 'validate.js'\nimport {\n movimentacaoFinanceiraAction,\n statusMovimentacaoFinanceiraAction\n} from '_actions'\nimport { UploadField } from 'components/Utils/Uploads'\nimport { toast } from 'react-toastify'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport constants from 'theme/constants'\n\nconst statusColors = {\n 1: colors.orange[600],\n 2: colors.red[600],\n 3: colors.green[600]\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n actions: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n '& > * + *': {\n marginLeft: 0\n }\n },\n buttonIcon: {\n marginRight: theme.spacing(1)\n }\n}))\n\nconst CardMovimentacaoFinanceira = ({\n movimentacaoFinanceira,\n className,\n ...rest\n}) => {\n const classes = useStyles()\n const [openEdit, setOpenEdit] = useState(false)\n const { isLoading } = useSelector((state) => state.movimentacaoFinanceira)\n const {\n statusMovimentacaoFinanceiraSelect,\n isFetching: isFetchingStatusMovimentacaoFinanceira\n } = useSelector((state) => state.statusMovimentacaoFinanceira)\n\n const dispatch = useDispatch()\n\n const handleSubmit = () => {\n if (movimentacaoFinanceira.statusMovimentacaoFinanceiraId == 3) {\n if (\n movimentacaoFinanceira.anexo !== null &&\n movimentacaoFinanceira.anexo !== ''\n ) {\n setOpenEdit(false)\n dispatch(\n movimentacaoFinanceiraAction.finishMovimentacaoFinanceira(\n movimentacaoFinanceira\n )\n )\n } else {\n toast.error('Eii! Faltou anexar o comprovante da transferência!')\n }\n } else if (movimentacaoFinanceira.statusMovimentacaoFinanceiraId == 2) {\n if (\n movimentacaoFinanceira.motivoCancelamento !== null &&\n movimentacaoFinanceira.motivoCancelamento !== ''\n ) {\n setOpenEdit(false)\n dispatch(\n movimentacaoFinanceiraAction.cancelMovimentacaoFinanceira(\n movimentacaoFinanceira\n )\n )\n } else {\n toast.error('Eii! Faltou descrever o motivo do cancelamento!')\n }\n }\n }\n const handleEditOpen = () => {\n setOpenEdit(true)\n }\n\n const handleEditClose = () => {\n dispatch(\n movimentacaoFinanceiraAction.getMovimentacaoFinanceiraById(\n movimentacaoFinanceira.id\n )\n )\n setOpenEdit(false)\n }\n\n const handleChange = (prop) => (event) => {\n dispatch(movimentacaoFinanceiraAction.onChangeProps(prop, event))\n }\n\n useDidMountEffect(() => {\n if (openEdit === true) {\n if (\n statusMovimentacaoFinanceiraSelect !== undefined &&\n statusMovimentacaoFinanceiraSelect.length === 0\n ) {\n dispatch(\n statusMovimentacaoFinanceiraAction.getStatusMovimentacaoFinanceiraSelect()\n )\n }\n }\n }, [openEdit])\n\n const getURL = (url) => {\n dispatch(movimentacaoFinanceiraAction.onChangeProps('anexo', url))\n }\n\n return (\n \n \n \n \n \n \n \n Número: \n \n {isLoading ? : movimentacaoFinanceira.id}\n \n \n \n Estabelecimento: \n \n {isLoading ? (\n \n ) : (\n movimentacaoFinanceira.estabelecimento.nome\n )}\n \n \n \n Data solicitação: \n \n {isLoading ? (\n \n ) : (\n toLocalDateFormat(movimentacaoFinanceira.dataHora)\n )}\n \n \n \n Data finalização: \n \n {isLoading ? (\n \n ) : movimentacaoFinanceira.dataHoraProcessamento !== null ? (\n toLocalDateFormat(\n movimentacaoFinanceira.dataHoraProcessamento\n )\n ) : (\n '---------'\n )}\n \n \n \n Valor: \n \n {isLoading ? (\n \n ) : (\n formatCurrency(movimentacaoFinanceira.valor)\n )}\n \n \n \n Status: \n {openEdit ? (\n \n \n \n Status\n \n \n )\n }\n disabled={isFetchingStatusMovimentacaoFinanceira}\n placeholder=\"Status\"\n labelId=\"status-movimentacao-financeira-label\"\n id=\"status-movimentacao-financeira-select\"\n value={\n movimentacaoFinanceira.statusMovimentacaoFinanceiraId\n }\n onChange={handleChange('statusMovimentacaoFinanceiraId')}\n label=\"Status\"\n >\n {!isEmpty(statusMovimentacaoFinanceiraSelect) &&\n statusMovimentacaoFinanceiraSelect.map((status) => (\n \n {status.text}\n \n ))}\n \n \n \n ) : (\n \n {isLoading ? (\n \n ) : (\n !!movimentacaoFinanceira.statusMovimentacaoFinanceira && (\n \n {\n movimentacaoFinanceira.statusMovimentacaoFinanceira\n .descricao\n }\n \n )\n )}\n \n )}\n \n {movimentacaoFinanceira.statusMovimentacaoFinanceiraId == 3 && (\n \n Comprovante *: \n \n \n \n \n )}\n {movimentacaoFinanceira.statusMovimentacaoFinanceiraId == 2 && (\n \n Motivo de cancelamento *: \n \n \n \n \n )}\n \n
\n \n \n openEdit ? (\n \n \n Cancelar\n \n \n Salvar\n \n \n ) : (\n \n \n \n Editar\n \n \n )\n }\n />\n \n )\n}\n\nCardMovimentacaoFinanceira.propTypes = {\n className: PropTypes.string,\n movimentacaoFinanceira: PropTypes.object.isRequired\n}\n\nexport default CardMovimentacaoFinanceira\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardContent,\n CardHeader,\n Divider,\n Table,\n TableBody,\n TableCell,\n TableRow,\n colors,\n Typography\n} from '@material-ui/core'\n\nimport { Label } from 'components'\nimport { cpfCnpjMask } from 'utils'\nimport { isEmpty } from 'validate.js'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n actions: {\n flexDirection: 'column',\n alignItems: 'flex-start',\n '& > * + *': {\n marginLeft: 0\n }\n },\n buttonIcon: {\n marginRight: theme.spacing(1)\n }\n}))\n\nconst CardContaBancaria = ({ contaBancaria, className, ...rest }) => {\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.movimentacaoFinanceira)\n\n function getNameTipoPix(tipoChavePix) {\n switch (tipoChavePix) {\n case 0:\n return 'CPF/CNPJ'\n case 1:\n return 'Email'\n case 2:\n return 'Nº Celular'\n case 3:\n return 'Chave Aleatória'\n }\n }\n\n return (\n <>\n {!isEmpty(contaBancaria) && contaBancaria.conta !== '0' ? (\n \n \n \n \n \n \n \n Descrição: \n \n {isLoading ? : contaBancaria.descricao}\n \n {isLoading ? (\n \n ) : (\n \n Conta padrão:{' '}\n \n )}\n {!isLoading && (\n \n {contaBancaria.padrao ? 'SIM' : 'NÃO'}\n \n )}\n
\n \n \n \n Instituição bancária: \n \n {isLoading ? (\n \n ) : (\n contaBancaria.instituicaoBancaria.nome\n )}\n \n \n \n Agência: \n \n {isLoading ? : contaBancaria.agencia}\n \n \n \n Conta: \n \n {isLoading ? : contaBancaria.conta}\n \n \n \n Nome titular: \n \n {isLoading ? : contaBancaria.nomeTitular}\n \n \n \n CPF/CNPJ Titular: \n \n {isLoading ? (\n \n ) : (\n cpfCnpjMask(contaBancaria.cpfCnpjTitular)\n )}\n \n \n \n
\n \n \n ) : (\n \n \n \n \n \n \n \n Descrição: \n \n {isLoading ? : contaBancaria.descricao}\n \n {isLoading ? (\n \n ) : (\n \n Conta padrão:{' '}\n \n )}\n {!isLoading && (\n \n {contaBancaria.padrao ? 'SIM' : 'NÃO'}\n \n )}\n
\n \n \n \n Chave Pix: \n \n {isLoading ? : contaBancaria.chavePix}\n \n \n \n Tipo Chave Pix: \n \n {isLoading ? (\n \n ) : (\n getNameTipoPix(contaBancaria.tipoChavePix)\n )}\n \n \n \n
\n \n \n )}\n >\n )\n}\n\nCardContaBancaria.propTypes = {\n className: PropTypes.string,\n contaBancaria: PropTypes.object.isRequired\n}\n\nexport default CardContaBancaria\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardContent,\n CardHeader,\n Divider,\n Table,\n TableBody,\n TableCell,\n TableRow,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport MapTwoToneIcon from '@material-ui/icons/MapTwoTone'\n\nimport { cepMask, cpfCnpjMask } from 'utils'\nimport { isEmpty } from 'validate.js'\nimport { useSelector } from 'react-redux'\nimport { Skeleton } from '@material-ui/lab'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n buttonIcon: {\n marginLeft: theme.spacing(1),\n padding: 5\n }\n}))\n\nconst CardEstabelecimento = ({ estabelecimento, className, ...rest }) => {\n const classes = useStyles()\n const { isLoading } = useSelector((state) => state.movimentacaoFinanceira)\n return (\n <>\n {!isEmpty(estabelecimento) && (\n \n \n \n \n \n \n \n Nome: \n \n {isLoading ? (\n \n ) : (\n <>\n {estabelecimento.nome}\n {estabelecimento.latLon && (\n \n \n \n \n \n )}\n >\n )}\n \n \n \n CPF/CNPJ: \n \n {isLoading ? (\n \n ) : (\n cpfCnpjMask(estabelecimento.cpfCnpj)\n )}\n \n \n \n Localização: \n {!!estabelecimento.cidade && (\n \n {isLoading ? (\n \n ) : (\n `${estabelecimento.cidade.nome} - ${estabelecimento.cidade.estado.nome}`\n )}\n \n )}\n \n \n Endereço: \n \n {isLoading ? (\n \n ) : (\n `${estabelecimento.endereco}, ${estabelecimento.numero}${\n estabelecimento.complemento !== null\n ? ` - ${estabelecimento.complemento}`\n : ''\n }`\n )}\n \n \n \n Bairro: \n \n {isLoading ? : estabelecimento.bairro}\n \n \n \n CEP: \n \n {isLoading ? : cepMask(estabelecimento.cep)}\n \n \n \n
\n \n \n )}\n >\n )\n}\n\nCardEstabelecimento.propTypes = {\n className: PropTypes.string,\n estabelecimento: PropTypes.object.isRequired\n}\n\nexport default CardEstabelecimento\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n TextField,\n Button,\n Divider,\n Table,\n TableBody,\n TableRow,\n TableCell\n} from '@material-ui/core'\nimport MaiIcon from '@material-ui/icons/MailOutline'\nimport { toLocalDateFormat } from 'utils'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {},\n sendButton: {\n marginTop: theme.spacing(2)\n },\n mailIcon: {\n marginRight: theme.spacing(1)\n },\n table: {\n marginTop: theme.spacing(2)\n },\n cell: {\n padding: theme.spacing(1)\n }\n}))\nconst OtherActions = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n\n const options = ['Reenviar email de confirmação', 'Enviar comprovante']\n\n const [option, setOption] = useState(options[0])\n\n const handleChange = (event) => {\n event.persist()\n\n setOption(event.target.value)\n }\n\n return (\n \n \n \n \n \n {options.map((option) => (\n \n {option}\n \n ))}\n \n \n \n Enviar email\n \n \n \n \n \n {toLocalDateFormat(new Date())}\n \n emailenviadopara \n \n \n
\n \n \n )\n}\n\nOtherActions.propTypes = {\n className: PropTypes.string\n}\n\nexport default OtherActions\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\n\nimport {\n CardMovimentacaoFinanceira,\n CardContaBancaria,\n CardEstabelecimento,\n OtherActions\n} from './components'\nimport { AccessControl } from 'components/Utils/AccessControl'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst Summary = ({ movimentacaoFinanceira }, props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const { contaBancaria, estabelecimento } = movimentacaoFinanceira\n\n return (\n \n (\n \n \n \n )}\n no={() => (\n \n \n \n )}\n />\n (\n \n \n \n )}\n />\n \n \n \n (\n \n \n \n )}\n />\n \n )\n}\n\nSummary.propTypes = {\n className: PropTypes.string\n}\n\nexport default Summary\n","import React, { Fragment, useRef, useState, memo } from 'react'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Tooltip,\n IconButton,\n Menu,\n MenuItem,\n Switch,\n FormControlLabel,\n Typography\n} from '@material-ui/core'\nimport SortRoundedIcon from '@material-ui/icons/SortRounded'\n\nconst useStyles = makeStyles((theme) => ({\n title: { paddingLeft: theme.spacing(2), paddingTop: theme.spacing(1) }\n}))\n\nconst SortSwitches = (props) => {\n const classes = useStyles()\n const moreRef = useRef(null)\n const { sortByEvento, setSortByEvento, sortByLote, setSortByLote } = props\n const [openMenu, setOpenMenu] = useState(false)\n\n const handleMenuOpen = () => {\n setOpenMenu(true)\n }\n\n const handleMenuClose = () => {\n setOpenMenu(false)\n }\n\n return (\n \n \n \n \n \n \n \n \n Agrupar por:\n \n \n setSortByEvento(event.target.checked)}\n name=\"sortByEvento\"\n inputProps={{ 'aria-label': 'agrupar por eventos' }}\n />\n }\n label=\"Eventos\"\n />\n \n {sortByEvento && (\n \n setSortByLote(event.target.checked)}\n name=\"sortByLote\"\n inputProps={{ 'aria-label': 'agrupar por lotes' }}\n />\n }\n label=\"Lotes\"\n />\n \n )}\n \n \n )\n}\n\nSortSwitches.propTypes = {\n className: PropTypes.string\n}\n\nexport default memo(SortSwitches)\n","\n// @ts-nocheck\nimport React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n makeStyles,\n Table,\n colors,\n Collapse,\n Badge,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Toolbar,\n Typography,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport { formatCurrency, toLocalDateFormat } from 'utils'\nimport { MessageData, Label, SkeletonTable } from 'components'\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'\nimport { SortSwitches } from './components'\nimport { useIngressosMovimentacaoFinanceira } from 'hooks-querys'\nimport { Ingresso } from 'types/api'\n\nconst StyledBadge = withStyles((theme) => ({\n badge: {\n right: -3,\n border: `2px solid ${theme.palette.background.paper}`,\n padding: '0 4px'\n }\n}))(Badge)\n\nconst statusColors = {\n 1: colors.orange[600],\n 2: colors.red[600],\n 3: colors.green[600]\n}\n\nconst headCells = [\n {\n id: 'evento-lote',\n numeric: false,\n disablePadding: true,\n label: 'Evento - (Lote)'\n },\n {\n id: 'data-evento',\n numeric: true,\n disablePadding: false,\n label: 'Data evento'\n },\n {\n id: 'valor',\n numeric: true,\n disablePadding: false,\n label: 'Valor total (R$)'\n },\n { id: 'status', numeric: true, disablePadding: false, label: 'Status' }\n]\n\nfunction EnhancedTableHead(props) {\n const { order, orderBy } = props\n\n return (\n \n \n \n {headCells.map((headCell) => (\n \n {headCell.label}\n \n ))}\n \n \n )\n}\n\nEnhancedTableHead.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst useToolbarStyles = makeStyles((theme) => ({\n root: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n title: {\n flex: '1 1 100%'\n }\n}))\n\ntype Props ={\n movimentacaoFinanceiraId: number | undefined\n}\nexport default function Tickets({ movimentacaoFinanceiraId }:Props) {\n\n const {isLoading,data:ingressosListOfObject} = useIngressosMovimentacaoFinanceira(movimentacaoFinanceiraId)\n\n const organizeIngressos = () => {\n\n if(ingressosListOfObject){\n const ingressosFormatted = Object.values(ingressosListOfObject)\n var ingressosReturn:Ingresso[] = []\n ingressosFormatted.map((item) => {\n ingressosReturn.push(item)\n })\n return ingressosReturn\n }\n return []\n }\n const ingressos = organizeIngressos()\n\n function Row(props) {\n const { row } = props\n const [open, setOpen] = useState(false)\n const [openLote, setOpenLote] = useState(false)\n const haveRowEvento =\n row.ingressosSortedByEvento !== undefined &&\n row.ingressosSortedByEvento.length > 0\n ? true\n : false\n\n const sizeIngressoByEvento = ingressos.filter(\n (c) => c.lote.eventoId === row.lote.eventoId\n ).length\n\n function totalValueRowLote(ingressosSortedByLote) {\n var value = 0\n const haveRowLote =\n ingressosSortedByLote !== undefined && ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value +=\n ingressosSortedByLote.reduce((a, b) => a + (b['valor'] || 0), 0) -\n ingressosSortedByLote.reduce(\n (a, b) => a + (b['valorDesconto'] || 0),\n 0\n ) -\n ingressosSortedByLote.reduce((a, b) => a + (b['valorTaxa'] || 0), 0)\n }\n return value\n }\n\n function totalValueRowEvento(ingressosSortedByEvento) {\n var value = 0\n ingressosSortedByEvento.map((row) => {\n const haveRowLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n if (haveRowLote) {\n value += totalValueRowLote(row.ingressosSortedByLote)\n } else {\n value += row.valor - row.valorTaxa - row.valorDesconto\n }\n })\n\n return value\n }\n const totalValueRow = haveRowEvento\n ? totalValueRowEvento(row.ingressosSortedByEvento)\n : row.valor - row.valorTaxa - row.valorDesconto\n\n return (\n <>\n \n \n \n {haveRowEvento && (\n \n setOpen(!open)}\n >\n \n {open ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {haveRowEvento\n ? row.lote.evento.nome\n : `${row.lote.evento.nome} - (${row.lote.descricao} - ${row.lote.tipoIngresso.descricao})`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n {formatCurrency(totalValueRow)} \n \n {!haveRowEvento && (\n \n {row.statusIngresso.descricao}\n \n )}\n \n \n {haveRowEvento && (\n \n \n \n \n \n {row.ingressosSortedByEvento.map((row) => {\n const hasLote =\n row.ingressosSortedByLote !== undefined &&\n row.ingressosSortedByLote.length > 0\n ? true\n : false\n\n const sizeIngressoByLote = ingressos.filter(\n (c) => c.lote.id === row.lote.id\n ).length\n\n return (\n <>\n \n \n \n {hasLote && (\n \n setOpenLote(!openLote)}\n >\n \n {openLote ? (\n \n ) : (\n \n )}\n \n \n \n )}\n
\n \n \n {`${row.lote.descricao} - ${row.lote.tipoIngresso.descricao}`}\n \n \n {toLocalDateFormat(row.lote.evento.dataHoraFim)}\n \n \n {hasLote\n ? formatCurrency(\n totalValueRowLote(row.ingressosSortedByLote)\n )\n : formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n {!hasLote && (\n \n {row.statusIngresso.descricao}\n \n )}\n \n \n {hasLote && (\n \n \n \n \n \n {row.ingressosSortedByLote.map((row) => {\n return (\n \n \n \n {`Ingresso n.º: ${row.id}`}\n \n \n {`Cliente: ${row.usuario.nome}`}\n \n \n {formatCurrency(\n row.valor -\n row.valorTaxa -\n row.valorDesconto\n )}\n \n \n \n {row.statusIngresso.descricao}\n \n \n \n )\n })}\n \n
\n \n \n \n )}\n >\n )\n })}\n \n
\n \n \n \n )}\n >\n )\n }\n const EnhancedTableToolbar = () => {\n const classes = useToolbarStyles()\n return (\n \n \n Lista de ingressos\n \n \n \n )\n }\n\n EnhancedTableToolbar.propTypes = {\n numSelected: PropTypes.number.isRequired\n }\n\n const useStyles = makeStyles((theme) => ({\n root: {\n width: '100%'\n },\n table: {\n minWidth: 750\n },\n visuallyHidden: {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: 1,\n margin: -1,\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n top: 20,\n width: 1\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n boxShadow: 'rgb(0 0 0 / 8%) 0px 2px 8px',\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px'\n }\n }))\n\n const classes = useStyles()\n const [sortByEvento, setSortByEvento] = useState(true)\n const [sortByLote, setSortByLote] = useState(true)\n\n const ingressosSortByEventoAndLote = (ingressos) => {\n var ingressosSorted = []\n if (sortByEvento) {\n ingressos.map((row, index) => {\n if (index === 0) {\n ingressosSorted.push(row)\n } else {\n const ingressosSortedByEventoFindIndex = ingressosSorted.findIndex(\n (item) => item.lote.eventoId === row.lote.eventoId\n )\n if (ingressosSortedByEventoFindIndex !== -1) {\n if (\n ingressosSorted[ingressosSortedByEventoFindIndex]\n .ingressosSortedByEvento === undefined\n ) {\n ingressosSorted[ingressosSortedByEventoFindIndex] = {\n ...ingressosSorted[ingressosSortedByEventoFindIndex],\n ingressosSortedByEvento: [\n ingressosSorted[ingressosSortedByEventoFindIndex]\n ]\n }\n\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n } else {\n ingressosSorted[\n ingressosSortedByEventoFindIndex\n ].ingressosSortedByEvento.push(row)\n }\n } else {\n ingressosSorted.push(row)\n }\n }\n })\n if (sortByLote) {\n ingressosSorted.map((row, index) => {\n if (row.ingressosSortedByEvento !== undefined) {\n const arrayIngressos = []\n row.ingressosSortedByEvento.map(\n (rowArrayEvento, indexArrayEvento) => {\n if (indexArrayEvento === 0) {\n arrayIngressos.push(rowArrayEvento)\n } else {\n const ingressosSortedByLoteFindIndex = arrayIngressos.findIndex(\n (item) => item.lote.id === rowArrayEvento.lote.id\n )\n if (ingressosSortedByLoteFindIndex !== -1) {\n if (\n arrayIngressos[ingressosSortedByLoteFindIndex]\n .ingressosSortedByLote === undefined\n ) {\n arrayIngressos[ingressosSortedByLoteFindIndex] = {\n ...arrayIngressos[ingressosSortedByLoteFindIndex],\n ingressosSortedByLote: [\n arrayIngressos[ingressosSortedByLoteFindIndex]\n ]\n }\n\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n } else {\n arrayIngressos[\n ingressosSortedByLoteFindIndex\n ].ingressosSortedByLote.push(rowArrayEvento)\n }\n } else {\n arrayIngressos.push(rowArrayEvento)\n }\n }\n }\n )\n ingressosSorted[index].ingressosSortedByEvento = arrayIngressos\n }\n })\n }\n } else {\n ingressosSorted = ingressos\n }\n return ingressosSorted\n }\n\n return (\n \n {!isLoading ? (\n <>\n {ingressos && ingressos.length > 0 ? (\n <>\n
\n Quantidade de ingressos: {ingressos.length} \n \n
\n \n \n \n \n \n {ingressosSortByEventoAndLote(ingressos).map(\n (row, index) => {\n return
\n }\n )}\n \n
\n \n \n >\n ) : (\n
\n )}\n >\n ) : (\n
\n )}\n
\n )\n}\n","import React, { useEffect } from 'react'\nimport { Header, Page } from 'components'\nimport {\n Divider,\n makeStyles,\n Tab,\n Tabs,\n colors,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport { Tickets, Summary } from './components'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { movimentacaoFinanceiraAction } from '_actions'\nimport { Redirect, useParams } from 'react-router'\nimport { history } from 'utils'\nimport MenuBookTwoToneIcon from '@material-ui/icons/MenuBookTwoTone'\nimport ConfirmationNumberTwoToneIcon from '@material-ui/icons/ConfirmationNumberTwoTone'\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%',\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n paddingBottom: theme.spacing(2)\n },\n tabs: {\n marginTop: theme.spacing(3)\n },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst MovimentacoesFinanceirasDetails = () => {\n const classes = useStyles()\n const { id, tab } = useParams()\n const dispatch = useDispatch()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const handleTabsChange = (event, value) => {\n history.push(value)\n }\n const movimentacaoFinanceira = useSelector(\n (state) => state.movimentacaoFinanceira\n )\n const { isLoading } = useSelector((state) => state.movimentacaoFinanceira)\n\n useEffect(() => {\n dispatch(movimentacaoFinanceiraAction.getMovimentacaoFinanceiraById(id))\n }, [])\n\n if (!id) {\n return null\n }\n const tabs = [\n {\n value: 'resumo',\n label: 'Resumo',\n icon: \n },\n {\n value: 'ingressos',\n label: 'Ingressos',\n icon: \n }\n ]\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n (\n \n \n \n {tabs.map((tab) => (\n \n ))}\n \n \n \n {tab === 'resumo' && (\n \n )}\n {tab === 'ingressos' && (\n \n )}\n
\n \n )}\n />\n )\n}\n\nexport default MovimentacoesFinanceirasDetails\n","import React from 'react'\nimport {\n TableBody,\n colors,\n Table,\n withStyles,\n makeStyles,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport { formatCurrency, history, toLocalDateFormat } from 'utils'\nimport { Label } from 'components'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\n\nconst StyledTableCell = withStyles((theme) => ({\n head: {\n backgroundColor: theme.palette.common.black,\n color: theme.palette.common.white\n },\n body: {\n fontSize: 14\n }\n}))(TableCell)\n\nconst useStyles = makeStyles({\n table: {\n minWidth: 700\n }\n})\n\nconst TableIngressos = ({ movimentacoesFinanceiras }) => {\n const classes = useStyles()\n\n const statusColors = {\n 1: colors.orange[600],\n 2: colors.red[600],\n 3: colors.green[600]\n }\n\n return (\n \n {movimentacoesFinanceiras.length !== undefined &&\n movimentacoesFinanceiras.length !== 0 ? (\n
\n Total de dados encontrados: {movimentacoesFinanceiras.length} \n \n ) : (\n
\n {'Nenhum dado encontrado.'} \n \n )}\n
\n {movimentacoesFinanceiras !== undefined &&\n movimentacoesFinanceiras.length > 0 && (\n \n \n \n N.º \n \n Estabelecimento\n \n \n Data solicitação\n \n \n Data processamento\n \n Valor (R$) \n Status \n \n \n \n \n {movimentacoesFinanceiras.map((row) => (\n \n \n {row.id}\n \n \n {row.estabelecimento.nome}\n \n \n {toLocalDateFormat(row.dataHora)}\n \n \n {row.dataHoraProcessamento !== null\n ? toLocalDateFormat(row.dataHoraProcessamento)\n : '--------'}\n \n \n {formatCurrency(row.valor)}\n \n \n \n {row.statusMovimentacaoFinanceira.descricao}\n \n \n \n \n \n history.push(\n `movimentacaoFinanceira/${row.id}/resumo`\n )\n }\n >\n \n \n \n \n \n ))}\n \n
\n )}\n \n
\n )\n}\n\nexport default TableIngressos\n","import React, { useEffect, useState } from 'react'\nimport { Header, SkeletonTable } from 'components'\nimport {\n CircularProgress,\n FormControl,\n Grid,\n InputLabel,\n makeStyles,\n MenuItem,\n Select\n} from '@material-ui/core'\nimport { TableMovimentacoesFinanceiras } from './components'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport {\n movimentacaoFinanceiraAction,\n statusMovimentacaoFinanceiraAction\n} from '_actions'\nimport { isEmpty } from 'validate.js'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%',\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n paddingBottom: theme.spacing(2)\n }\n}))\n\nconst MovimentacoesFinanceirasList = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const {\n movimentacaoFinanceira: movimentacoesFinanceiras,\n isLoading\n } = useSelector((state) => state.movimentacaoFinanceira)\n const {\n statusMovimentacaoFinanceiraSelect,\n isFetching: isFetchingStatusMovimentacaoFinanceira\n } = useSelector((state) => state.statusMovimentacaoFinanceira)\n const [\n statusMovimentacaoFinanceiraId,\n setStatusMovimentacaoFinanceiraId\n ] = useState(1)\n\n const handleChange = (event) => {\n event.preventDefault()\n setStatusMovimentacaoFinanceiraId(event.target.value)\n }\n\n useEffect(() => {\n let payload = {\n statusMovimentacaoFinanceiraId: statusMovimentacaoFinanceiraId\n // estabelecimentoId: 0\n }\n dispatch(movimentacaoFinanceiraAction.getAllMovimentacaoFinanceira(payload))\n }, [statusMovimentacaoFinanceiraId])\n\n useEffect(() => {\n if (\n statusMovimentacaoFinanceiraSelect !== undefined &&\n statusMovimentacaoFinanceiraSelect.length === 0\n ) {\n dispatch(\n statusMovimentacaoFinanceiraAction.getStatusMovimentacaoFinanceiraSelect()\n )\n }\n }, [])\n\n return (\n (\n \n
\n
\n \n \n \n Status\n \n \n )\n }\n disabled={isFetchingStatusMovimentacaoFinanceira}\n placeholder=\"Status\"\n labelId=\"status-movimentacao-financeira-label\"\n id=\"status-movimentacao-financeira-select\"\n value={statusMovimentacaoFinanceiraId}\n onChange={handleChange}\n label=\"Status\"\n >\n {!isEmpty(statusMovimentacaoFinanceiraSelect) &&\n statusMovimentacaoFinanceiraSelect.map((status) => (\n \n {status.text}\n \n ))}\n \n \n \n \n\n {isLoading ? (\n
\n ) : (\n
\n )}\n
\n )}\n />\n )\n}\n\nexport default MovimentacoesFinanceirasList\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Page } from 'components'\nimport {\n MovimentacoesFinanceirasDetails,\n TableMovimentacoesFinanceiras\n} from './components'\nimport useRouter from 'utils/useRouter'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst MovimentacoesFinanceiras = () => {\n const classes = useStyles()\n const { match } = useRouter()\n const { path } = match\n\n return (\n \n {path && path.includes('movimentacaoFinanceira') ? (\n \n ) : (\n \n )}\n \n )\n}\n\nexport default MovimentacoesFinanceiras\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport {\n TableRow,\n TableCell,\n Grid,\n Tooltip,\n IconButton,\n Button,\n colors,\n CircularProgress,\n Link,\n Avatar,\n makeStyles\n} from '@material-ui/core'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\n\n//? Own imports\nimport { CancelamentoIngresso, StatusCancelamentoIngresso } from 'types/api'\nimport {\n getInitials,\n getStatusCancelamentoIngressoColor,\n toLocalDateFormat\n} from 'utils'\nimport { Label } from 'components'\nimport { useMutationFinishOrderCancel } from 'hooks-querys'\n\nconst useStyles = makeStyles((theme) => ({\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n avatar: {\n height: 42,\n width: 42,\n marginRight: theme.spacing(1)\n }\n}))\n\nconst RowTableCancelamentosIngressos = ({\n orderCancelItem\n}: {\n orderCancelItem: CancelamentoIngresso\n}) => {\n const classes = useStyles()\n const mutationFinishOrderCancel = useMutationFinishOrderCancel()\n const evento = orderCancelItem.pedido?.ingresso[0]?.lote?.evento\n const usuario = orderCancelItem.pedido?.ingresso[0]?.usuario\n return (\n \n \n {orderCancelItem.id}\n \n \n {usuario && usuario.nome ? (\n \n
\n {getInitials(usuario?.nome)}\n \n
\n
\n {usuario?.nome}\n \n
{usuario?.email}
\n
\n
\n ) : (\n 'Usuário não encontrado'\n )}\n \n \n {evento && evento.nome ? evento.nome : 'Evento não encontrado'}\n \n \n {orderCancelItem &&\n orderCancelItem.motivoCancelamentoIngresso?.descricao}\n \n \n {orderCancelItem && orderCancelItem.dataHora\n ? toLocalDateFormat(orderCancelItem.dataHora)\n : '----------'}\n \n \n {orderCancelItem && orderCancelItem.dataHoraProcessamento\n ? toLocalDateFormat(orderCancelItem.dataHoraProcessamento)\n : '----------'}\n \n {orderCancelItem && orderCancelItem.statusCancelamentoIngresso && (\n \n \n {orderCancelItem.statusCancelamentoIngresso.descricao}\n \n \n )}\n \n \n {orderCancelItem &&\n orderCancelItem.statusCancelamentoIngresso?.pendente && (\n \n \n \n )\n }\n onClick={() => {\n mutationFinishOrderCancel.mutate(orderCancelItem)\n }}\n >\n {mutationFinishOrderCancel.isLoading\n ? 'Finalizando...'\n : 'Finalizar'}\n \n \n \n )}\n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default RowTableCancelamentosIngressos\n","import React from 'react'\nimport {\n TableBody,\n Table,\n makeStyles,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Toolbar,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\nimport ReactToPrint from 'react-to-print'\n\n//? Own imports\nimport { CancelamentoIngresso } from 'types/api'\nimport { RowTableCancelamentosIngressos } from './components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n table: {\n minWidth: 700\n },\n rootToolbarStyles: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n titleToolbarStyles: {\n flex: '1 1 100%'\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n ...constants.shadowCard\n }\n}))\n\nconst TableCancelamentosIngressos = ({\n ordersCancel\n}: {\n ordersCancel: CancelamentoIngresso[]\n}) => {\n const classes = useStyles()\n const refTable = React.useRef(null)\n\n return (\n \n
\n {ordersCancel && ordersCancel.length > 0 ? (\n <>\n Total de dados encontrados: {ordersCancel.length} \n >\n ) : (\n Nenhum dado encontrado. \n )}\n \n {ordersCancel && ordersCancel.length > 0 && (\n
\n \n \n Lista de solicitações de cancelamento\n \n (\n \n \n \n \n \n )}\n content={() => refTable.current}\n />\n \n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\n \n {/* ------------------------------------------------------------>\t */}\n \n {ordersCancel !== undefined && ordersCancel.length > 0 && (\n \n \n \n N.º \n Usuário \n Evento \n Motivo \n Data solicitação \n Data finalização \n Status \n Ações \n \n \n \n {ordersCancel.map((orderCancelItem) => {\n return (\n \n )\n })}\n \n
\n )}\n \n \n )}\n
\n )\n}\n\nexport default TableCancelamentosIngressos\n","import React, { useState } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Grid,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n makeStyles,\n TextField,\n InputAdornment,\n IconButton,\n Divider,\n Tooltip\n} from '@material-ui/core'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\n\n//? Own imports\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport {\n useStatusCancelamentoIngressoSelect,\n useOrderCancelReasonsSelect\n} from 'hooks-querys'\nimport { history } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n marginTop: theme.spacing(2)\n },\n formControl: {\n width: '100%'\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst Filters = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n textSearch: querySearch.get('textSearch') || '',\n selectedStatusOrderCancelId: querySearch.get('statusOrderCancelId') || '1',\n selectedReasonOrderCancelId: querySearch.get('reasonOrderCancelId') || '0'\n })\n const {\n data: statusOrderCancelSelect,\n isLoading: isLoadingStatusOrderCancelSelect\n } = useStatusCancelamentoIngressoSelect()\n\n const {\n data: reasonOrderCancelSelect,\n isLoading: isLoadingStatusIngressoSelect\n } = useOrderCancelReasonsSelect()\n\n const runQuery = () => {\n history.push(\n `/cancelamentosIngressos?statusOrderCancelId=${\n filters.selectedStatusOrderCancelId\n }&textSearch=${filters.textSearch}&reasonOrderCancelId=${\n filters.selectedReasonOrderCancelId\n ? filters.selectedReasonOrderCancelId\n : 0\n }`\n )\n }\n\n const handleChangeText = (value: string) => {\n setFilters((prev) => ({ ...prev, textSearch: value }))\n }\n\n const handleSubmitSearch = (event: React.FormEvent) => {\n event.preventDefault()\n if (filters.textSearch && filters.textSearch.length > 0) {\n runQuery()\n }\n }\n\n const clearTextSearch = () => {\n setFilters((prev) => ({ ...prev, textSearch: '' }))\n }\n\n useDidMountEffect(() => {\n if (filters.textSearch === '') {\n runQuery()\n }\n }, [filters.textSearch])\n\n useDidMountEffect(() => {\n runQuery()\n }, [filters.selectedStatusOrderCancelId, filters.selectedReasonOrderCancelId])\n\n useDidMountEffect(() => {\n setFilters((prev) => ({\n ...prev,\n selectedStatusOrderCancelId:\n querySearch.get('statusOrderCancelId') || '1',\n selectedReasonOrderCancelId: querySearch.get('reasonOrderCancelId') || '',\n textSearch: querySearch.get('textSearch') || ''\n }))\n }, [querySearch])\n\n return (\n \n
\n \n \n \n Filtrar por status\n \n {\n setFilters((prev) => ({\n ...prev,\n selectedStatusOrderCancelId: event.target.value as string\n }))\n }}\n label=\"Filtrar por status\"\n >\n \n {filters.selectedStatusOrderCancelId === '0' ? (\n 'Filtrar por status'\n ) : (\n Limpar filtro \n )}\n \n {statusOrderCancelSelect &&\n statusOrderCancelSelect.length > 0 &&\n statusOrderCancelSelect.map((statusIngresso) => (\n \n {statusIngresso.text}\n \n ))}\n \n \n \n \n \n \n Filtrar por motivo\n \n {\n setFilters((prev) => ({\n ...prev,\n selectedReasonOrderCancelId: event.target.value as string\n }))\n }}\n label=\"Filtrar por motivo\"\n >\n \n {filters.selectedReasonOrderCancelId === '0' ? (\n 'Filtrar por motivo'\n ) : (\n Limpar filtro \n )}\n \n {reasonOrderCancelSelect &&\n reasonOrderCancelSelect.length > 0 &&\n reasonOrderCancelSelect.map((reasonOrderCancel) => (\n \n {reasonOrderCancel.text}\n \n ))}\n \n \n \n \n \n \n \n
\n )\n}\n\nexport default Filters\n","import React, { useEffect, useState } from 'react'\nimport { makeStyles } from '@material-ui/core'\nimport { useOrdersCancel } from 'hooks-querys'\nimport { useLocation } from 'react-router-dom'\n\n//? Own imports\nimport { Header, SkeletonTable } from 'components'\nimport { Filters, TableCancelamentosIngressos } from './components'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { AccessDenied } from 'views'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%',\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n paddingBottom: theme.spacing(2)\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst CancelamentosIngressosList = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || '',\n statusOrderCancelId: querySearch.get('statusOrderCancelId') || '1',\n reasonOrderCancelId: querySearch.get('reasonOrderCancelId') || '0'\n })\n\n useEffect(() => {\n setFilters({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || '',\n statusOrderCancelId: querySearch.get('statusOrderCancelId') || '1',\n reasonOrderCancelId: querySearch.get('reasonOrderCancelId') || '0'\n })\n }, [querySearch])\n\n const { isLoading, data } = useOrdersCancel({\n page: 1, // valor fixo para paginação, pois o componente de paginação não está implementado\n direction: 'desc',\n order: 'dataHora',\n limit: 10000, //limite alto para não haver paginação\n term: filters.textSearch,\n statusCancelamentoIngressoId: filters.statusOrderCancelId,\n motivoCancelamentoIngressoId: filters.reasonOrderCancelId\n })\n\n return (\n (\n \n
\n
\n {isLoading ? (\n
\n ) : (\n
\n )}\n
\n )}\n // @ts-ignore\n no={() => }\n />\n )\n}\n\nexport default CancelamentosIngressosList\n","import React, { useState } from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport clsx from 'clsx'\nimport {\n Card,\n CardActions,\n CardHeader,\n CardContent,\n Divider,\n Button,\n Table,\n TableBody,\n TableRow,\n TableCell,\n TextField,\n Link,\n makeStyles,\n Grid,\n Tooltip,\n CircularProgress\n} from '@material-ui/core'\nimport CloseIcon from '@material-ui/icons/Close'\nimport ReceiptIcon from '@material-ui/icons/ReceiptOutlined'\nimport CheckRoundedIcon from '@material-ui/icons/CheckRounded'\n\n//? Own imports\nimport { CancelamentoIngresso } from 'types/api'\nimport { getStatusCancelamentoIngressoColor, toLocalDateFormat } from 'utils'\nimport { Label } from 'components'\nimport { useMutationFinishOrderCancel } from 'hooks-querys'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n buttonIcon: {\n marginRight: theme.spacing(1)\n }\n}))\n\nconst OrderCancelInfo = ({\n orderCancel\n}: {\n orderCancel: CancelamentoIngresso\n}) => {\n const classes = useStyles()\n const mutationFinishOrderCancel = useMutationFinishOrderCancel()\n return (\n \n \n \n \n \n \n \n ID \n #{orderCancel.id || 'ID não identificado'} \n \n \n Motivo \n \n {orderCancel.motivoCancelamentoIngresso?.descricao ||\n 'Motivo não identificado'}\n \n \n \n Data solicitação \n \n {orderCancel && orderCancel.dataHora\n ? toLocalDateFormat(orderCancel.dataHora)\n : '----------'}\n \n \n \n Data finalização \n \n {orderCancel && orderCancel.dataHoraProcessamento\n ? toLocalDateFormat(orderCancel.dataHoraProcessamento)\n : '----------'}\n \n \n {orderCancel.chavePix && (\n \n Chave PIX \n {orderCancel.chavePix} \n \n )}\n \n Status \n \n {orderCancel.statusCancelamentoIngresso ? (\n \n {orderCancel.statusCancelamentoIngresso.descricao}\n \n ) : (\n 'Status não identificado'\n )}\n \n \n \n
\n \n \n \n {/* {orderCancel.statusCancelamentoIngresso?.finalizado && (\n \n \n \n Cancelar\n \n \n )}\n {orderCancel.statusCancelamentoIngresso?.finalizado && (\n \n \n \n Reenviar notificações\n \n \n )} */}\n {orderCancel.statusCancelamentoIngresso?.pendente && (\n \n \n \n ) : (\n \n )\n }\n onClick={() => {\n mutationFinishOrderCancel.mutate(orderCancel)\n }}\n >\n {mutationFinishOrderCancel.isLoading\n ? 'Finalizando...'\n : 'Finalizar'}\n \n \n \n )}\n \n \n \n )\n}\n\nexport default OrderCancelInfo\n","import React, { useState } from 'react'\r\nimport { Link as RouterLink } from 'react-router-dom'\r\nimport clsx from 'clsx'\r\nimport {\r\n Card,\r\n CardActions,\r\n CardHeader,\r\n CardContent,\r\n Divider,\r\n Button,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n TextField,\r\n Link,\r\n makeStyles,\r\n Grid,\r\n Typography,\r\n CircularProgress\r\n} from '@material-ui/core'\r\nimport CloseIcon from '@material-ui/icons/Close'\r\nimport ReceiptIcon from '@material-ui/icons/ReceiptOutlined'\r\nimport CheckRoundedIcon from '@material-ui/icons/CheckRounded'\r\n\r\n//? Own imports\r\nimport { CancelamentoIngresso, Pedido } from 'types/api'\r\nimport {\r\n cepMask,\r\n formatCurrency,\r\n getLabelGatewayColor,\r\n getStatusPedidoColor,\r\n toLocalDateFormat\r\n} from 'utils'\r\nimport { Label } from 'components'\r\nimport constants from 'theme/constants'\r\nimport {\r\n useMutationCreateOrderCancel,\r\n useMutationFinishOrderCancel\r\n} from 'hooks-querys'\r\nimport OrderCancelDetails from 'views/OrderCancelDetails'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n ...constants.shadowCard\r\n },\r\n content: {\r\n padding: 0\r\n },\r\n buttonIcon: {\r\n marginRight: theme.spacing(1)\r\n }\r\n}))\r\n\r\nconst OrderInfo = ({ order }: { order: Pedido }) => {\r\n const classes = useStyles()\r\n const usuario = order.carrinhoItem[0]?.usuario\r\n const mutationCreateOrderCancel = useMutationCreateOrderCancel()\r\n const mutationFinishOrderCancel = useMutationFinishOrderCancel()\r\n\r\n const getTextCupomDesconto = () => {\r\n if (order.cupomDesconto) {\r\n if (order.cupomDesconto.percentualDesconto) {\r\n return `${order.cupomDesconto.codigo} (${order.cupomDesconto.percentualDesconto}%)`\r\n }\r\n if (order.cupomDesconto.valorDesconto) {\r\n return `${order.cupomDesconto.codigo} (${formatCurrency(\r\n order.cupomDesconto.valorDesconto\r\n )})`\r\n }\r\n return `${order.cupomDesconto.codigo} (SEM DESCONTO)`\r\n }\r\n return 'N/A'\r\n }\r\n\r\n const createOrderCancel = () => {\r\n mutationCreateOrderCancel\r\n .mutateAsync({\r\n id: 0,\r\n pedidoId: order.id,\r\n motivoCancelamentoIngressoId: Number(6),\r\n dataHora: new Date(),\r\n dataHoraProcessamento: null,\r\n statusCancelamentoIngressoId: 0\r\n //chavePix: '',\r\n //tipoChavePix:\r\n })\r\n .then((data) => {\r\n if (data && data.id) {\r\n finishOrderCancel(data)\r\n }\r\n })\r\n }\r\n\r\n const finishOrderCancel = (orderCancel: CancelamentoIngresso) => {\r\n mutationFinishOrderCancel.mutate(orderCancel)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Usuário \r\n \r\n \r\n {usuario?.nome}\r\n \r\n {usuario?.endereco ? (\r\n \r\n {`${usuario?.endereco}, ${usuario?.numero} ${\r\n usuario?.complemento ? ` - ${usuario?.complemento}` : ''\r\n }${usuario?.bairro ? ` - ${usuario?.bairro}` : ''}`}\r\n
\r\n ) : (\r\n ''\r\n )}\r\n {cepMask(usuario?.cep)}
\r\n {usuario?.cidade ? (\r\n \r\n {`${usuario?.cidade?.nome} -\r\n ${usuario?.cidade?.estado.uf.toUpperCase()}/${\r\n usuario?.cidade?.estado?.pais?.nomePt\r\n }`}\r\n
\r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n \r\n ID \r\n #{order.id} \r\n \r\n \r\n Transação \r\n {order.transacao} \r\n \r\n \r\n Forma pagamento \r\n \r\n {order.formaPagamento?.descricao} \r\n {order.formaPagamento?.id === 1 ? (\r\n \r\n {order.parcelas &&\r\n `em ${order.parcelas}x ${formatCurrency(\r\n order.valorParcelamento\r\n )}`}\r\n \r\n ) : order.formaPagamento?.id === 2 ? (\r\n \r\n {order.linhaDigitavelBoleto &&\r\n `${order.linhaDigitavelBoleto}`}\r\n \r\n ) : order.formaPagamento?.id === 3 ? (\r\n \r\n {order.pixBase64 && `${order.pixBase64}`}\r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n \r\n Plataforma \r\n {order.plataforma?.toUpperCase()} \r\n \r\n \r\n Gateway \r\n \r\n {order.gateway && (\r\n \r\n {order.gateway.toUpperCase()}\r\n \r\n )}\r\n \r\n \r\n \r\n Data compra \r\n \r\n {order && order.dataHora\r\n ? toLocalDateFormat(order.dataHora)\r\n : '----------'}\r\n \r\n \r\n \r\n Data validade \r\n \r\n {order && order.dataHoraValidade\r\n ? toLocalDateFormat(order.dataHoraValidade)\r\n : '----------'}\r\n \r\n \r\n \r\n Cupom de desconto \r\n {getTextCupomDesconto()} \r\n \r\n \r\n Valor total (R$) \r\n {formatCurrency(order.valorTotal)} \r\n \r\n \r\n Status \r\n \r\n {order.statusPedido ? (\r\n \r\n {order.statusPedido.descricao}\r\n \r\n ) : (\r\n 'Status não identificado'\r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n {order.statusPedido?.finalizado && (\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n onClick={() => {\r\n createOrderCancel()\r\n }}\r\n >\r\n {mutationCreateOrderCancel.isLoading\r\n ? 'Criando cancelamento...'\r\n : mutationFinishOrderCancel.isLoading\r\n ? 'Finalizando cancelamento...'\r\n : 'Cancelar Pedido'}\r\n \r\n \r\n )}\r\n {order.statusPedido?.finalizado && (\r\n \r\n \r\n \r\n Reenviar notificações (dummy)\r\n \r\n \r\n )}\r\n {order.statusPedido?.pendente && (\r\n \r\n \r\n \r\n Finalizar pedido\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default OrderInfo\r\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Typography,\n useTheme\n} from '@material-ui/core'\nimport { CarrinhoItem } from 'types/api'\nimport { formatCurrency, getGenderFull } from 'utils'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n }\n}))\n\nconst OrderItems = ({ carrinhoItens }: { carrinhoItens: CarrinhoItem[] }) => {\n const classes = useStyles()\n const theme = useTheme()\n const getTotalWithDiscount = (item: CarrinhoItem) => {\n if (item.valorDesconto && item.valorDesconto > 0) {\n return (\n \n \n {formatCurrency(item.valor * item.quantidade)}\n \n {' - '}\n \n {formatCurrency(\n (item.valor - item.valorDesconto) * item.quantidade\n )}\n \n \n )\n } else {\n return (\n {formatCurrency(item.valor * item.quantidade)} \n )\n }\n }\n const textLoteFormatted = (item: CarrinhoItem) => {\n if (item.lote) {\n return `${item.quantidade}x ${item.lote.tipoIngresso?.descricao}${' '}\n - ${item.lote?.descricao} (${getGenderFull(item.lote?.genero)})`\n }\n return 'Lote não encontrado'\n }\n\n return (\n \n \n \n \n \n \n \n \n Lote \n Valor (R$) \n \n \n \n {carrinhoItens.map((item) => (\n \n {textLoteFormatted(item)} \n \n {getTotalWithDiscount(item)}\n \n \n ))}\n \n
\n \n \n \n )\n}\n\nexport default OrderItems\n","import React from 'react'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Table,\n TableHead,\n TableBody,\n TableRow,\n TableCell,\n Typography,\n useTheme\n} from '@material-ui/core'\nimport { Ingresso } from 'types/api'\nimport { formatCurrency, getGenderFull, getStatusIngressoColor } from 'utils'\nimport { Label } from 'components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n }\n}))\n\nconst OrderTickets = ({ tickets }: { tickets: Ingresso[] }) => {\n const classes = useStyles()\n const theme = useTheme()\n const getTotalWithDiscount = (item: Ingresso) => {\n if (item.valorDesconto && item.valorDesconto > 0) {\n return (\n \n \n {formatCurrency(item.valor)}\n \n {' - '}\n \n {formatCurrency(item.valor - item.valorDesconto)}\n \n \n )\n } else {\n return {formatCurrency(item.valor)} \n }\n }\n const textLoteFormatted = (item: Ingresso) => {\n if (item.lote) {\n return `1x ${item.lote.tipoIngresso?.descricao}${' '}\n - ${item.lote?.descricao} (${getGenderFull(item.lote?.genero)})`\n }\n return 'Lote não encontrado'\n }\n\n return (\n \n \n \n \n \n \n \n \n Lote \n Valor (R$) \n Status \n \n \n \n {tickets.map((item) => (\n \n {textLoteFormatted(item)} \n {getTotalWithDiscount(item)} \n \n {item.statusIngresso && (\n \n {item.statusIngresso.descricao}\n \n )}\n \n \n ))}\n \n
\n \n \n \n )\n}\n\nexport default OrderTickets\n","import React, { useEffect } from 'react'\nimport { Grid, makeStyles } from '@material-ui/core'\nimport { useParams } from 'react-router-dom'\n\n//? Own imports\nimport { Header, Page } from 'components'\nimport { OrderCancelInfo } from './components'\nimport { Pedido } from 'types/api'\nimport { useOrderCancel } from 'hooks-querys'\nimport {\n OrderItems,\n OrderTickets,\n OrderInfo\n} from 'views/OrderManagementDetails/components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n container: {\n marginTop: theme.spacing(2)\n }\n}))\n\nconst OrderCancelDetails = () => {\n const classes = useStyles()\n const { id } = useParams<{ id: string }>()\n\n const { data, isLoading } = useOrderCancel(Number(id), undefined)\n\n useEffect(() => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n }, [])\n\n return (\n <>\n {data ? (\n \n \n \n \n \n \n \n \n {data.pedido && (\n \n \n \n )}\n \n \n \n \n {data.pedido && data.pedido?.carrinhoItem && (\n \n \n \n )}\n {data.pedido?.ingresso && data.pedido?.ingresso.length > 0 && (\n \n \n \n )}\n \n \n \n \n ) : null}\n >\n )\n}\n\nexport default OrderCancelDetails\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport useRouter from 'utils/useRouter'\n\n//? Own imports\nimport { Page } from 'components'\nimport {\n // CancelamentosIngressosDetails,\n CancelamentosIngressosList\n} from './components'\nimport OrderCancelDetails from '../OrderCancelDetails'\n\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst CancelamentosIngressos = () => {\n const classes = useStyles()\n const { match } = useRouter()\n const { path } = match\n\n return (\n \n {path && path.includes('cancelamentoIngresso') ? (\n \n ) : (\n \n )}\n {/* */}\n \n )\n}\n\nexport default CancelamentosIngressos\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport {\n TableRow,\n TableCell,\n Grid,\n Tooltip,\n IconButton,\n colors,\n Link,\n Avatar,\n makeStyles\n} from '@material-ui/core'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\n\n//? Own imports\nimport { Pedido } from 'types/api'\nimport {\n formatCurrency,\n getInitials,\n getLabelGatewayColor,\n getStatusPedidoColor,\n toLocalDateFormat\n} from 'utils'\nimport { Label } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n avatar: {\n height: 42,\n width: 42,\n marginRight: theme.spacing(1)\n }\n}))\n\nconst RowTableOrderManagementList = ({ orderItem }: { orderItem: Pedido }) => {\n const classes = useStyles()\n const evento = orderItem.carrinhoItem[0]?.lote?.evento\n const usuario = orderItem.carrinhoItem[0]?.usuario\n return (\n \n \n {orderItem.id}\n \n \n {usuario && usuario.nome ? (\n \n
\n {getInitials(usuario?.nome)}\n \n
\n
\n {usuario?.nome}\n \n
{usuario?.email}
\n
\n
\n ) : (\n 'Usuário não encontrado'\n )}\n \n \n {evento && evento.nome ? evento.nome : 'Evento não encontrado'}\n \n \n {orderItem && orderItem.formaPagamento?.descricao}\n {orderItem && orderItem.formaPagamento === null && orderItem.gateway && (\n \n {orderItem.gateway.toUpperCase()}\n \n )}\n \n \n {orderItem && orderItem.dataHora\n ? toLocalDateFormat(orderItem.dataHora)\n : '----------'}\n \n \n {orderItem && orderItem.dataHoraValidade\n ? toLocalDateFormat(orderItem.dataHoraValidade)\n : '----------'}\n \n \n {orderItem && orderItem.valorTotal\n ? formatCurrency(orderItem.valorTotal)\n : '----------'}\n \n \n {orderItem && orderItem.statusPedido ? (\n \n {orderItem.statusPedido.descricao}\n \n ) : (\n '----------'\n )}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default RowTableOrderManagementList\n","import React from 'react'\nimport {\n TableBody,\n Table,\n makeStyles,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Toolbar,\n Tooltip,\n IconButton,\n Box,\n BoxProps\n} from '@material-ui/core'\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\nimport ReactToPrint from 'react-to-print'\n\n//? Own imports\nimport { Pedido } from 'types/api'\nimport { RowTableOrderManagementList } from './components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n table: {\n minWidth: 700\n },\n rootToolbarStyles: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n titleToolbarStyles: {\n flex: '1 1 100%'\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n ...constants.shadowCard\n }\n}))\n\ntype TableOrderManagementListProps = BoxProps & {\n orders: Pedido[]\n}\n\nconst TableOrderManagementList = ({\n orders,\n ...rest\n}: TableOrderManagementListProps) => {\n const classes = useStyles()\n const refTable = React.useRef(null)\n\n return (\n \n \n {orders && orders.length > 0 ? (\n <>\n Total de dados encontrados: {orders.length} \n >\n ) : (\n Nenhum dado encontrado. \n )}\n \n {orders && orders.length > 0 && (\n \n \n \n Lista de pedidos\n \n (\n \n \n \n \n \n )}\n content={() => refTable.current}\n />\n \n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\n \n {/* ------------------------------------------------------------>\t */}\n \n {orders !== undefined && orders.length > 0 && (\n \n \n \n N.º \n Usuário \n Evento \n Forma pagamento \n Data compra \n Data validade \n Valor (R$) \n Status \n Ações \n \n \n \n {orders.map((orderItem) => {\n return (\n \n )\n })}\n \n
\n )}\n \n \n )}\n \n )\n}\n\nexport default TableOrderManagementList\n","import React, { useState, useEffect } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Grid,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n makeStyles,\n TextField,\n InputAdornment,\n IconButton,\n Divider,\n Tooltip,\n Switch,\n Chip,\n useMediaQuery,\n useTheme,\n CircularProgress\n} from '@material-ui/core'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\n\n//? Own imports\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport { useStatusPedidoSelect, useFormaPagamentoSelect, useEvents, useOrders } from 'hooks-querys'\nimport { history, toLocalDateFormat } from 'utils'\nimport { Autocomplete } from '@material-ui/lab'\nimport { Evento } from 'types/api'\nimport { useSelector } from 'react-redux'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n marginTop: theme.spacing(4)\n },\n formControl: {\n width: '100%'\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst Filters = () => {\n const classes = useStyles()\n const theme = useTheme()\n const querySearch = useSearchQuery()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [selectedEvento, setSelectedEvento] = useState(null)\n const [eventoInputValue, setEventoInputValue] = useState('')\n const [showPastEvents, setShowPastEvents] = useState(false)\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const {\n data: events,\n isLoading: isLoadingEvents,\n isFetching: isFetchingEvents\n } = useEvents(estabelecimentoId, showPastEvents, isMobile)\n\n const [filters, setFilters] = useState({\n textSearch: querySearch.get('Term') || '',\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || ''\n })\n const {\n data: statusPedidoSelect,\n isLoading: isLoadingstatusPedidoSelect\n } = useStatusPedidoSelect()\n\n const {\n data: formaPagamentoSelect,\n isLoading: isLoadingFormaPagamentoSelect\n } = useFormaPagamentoSelect()\n\n useEffect(() => {\n const eventId = querySearch.get('EventoId') || 0\n if (eventId && Number(eventId) > 0) {\n const event =\n events &&\n events.length > 0 &&\n events.find((e) => e.id === Number(eventId))\n\n if (event) {\n setSelectedEvento(event)\n } else if (selectedEvento === null) {\n setShowPastEvents(!showPastEvents)\n }\n }\n }, [events])\n\n const runQuery = () => {\n history.push(\n `/pedidos/admin?StatusPedidoId=${\n filters.selectedStatusPedidoId\n }&FormaPagamentoId=${\n filters.selectedFormaPagamentoId ? filters.selectedFormaPagamentoId : 0\n }&Term=${filters.textSearch\n }&DataHoraInicio=${filters.dataHoraInicio\n }&DataHoraFim=${filters.dataHoraFim\n }&EventoId=${selectedEvento && selectedEvento.id ? selectedEvento.id : ''}`\n )\n }\n\n const handleChangeText = (value: string) => {\n setFilters((prev) => ({ ...prev, textSearch: value }))\n }\n\n const handleSubmitSearch = (event: React.FormEvent) => {\n event.preventDefault()\n if (filters.textSearch && filters.textSearch.length > 0) {\n runQuery()\n }\n }\n\n const clearTextSearch = () => {\n setFilters((prev) => ({ ...prev, textSearch: '' }))\n }\n\n useDidMountEffect(() => {\n if (filters.textSearch === '') {\n runQuery()\n }\n }, [filters.textSearch])\n\n useDidMountEffect(() => {\n runQuery()\n }, [filters.selectedStatusPedidoId, filters.selectedFormaPagamentoId])\n\n useDidMountEffect(() => {\n history.push(\n `/pedidos/admin?StatusPedidoId=${\n filters.selectedStatusPedidoId\n }&FormaPagamentoId=${\n filters.selectedFormaPagamentoId ? filters.selectedFormaPagamentoId : 0\n }&Term=${filters.textSearch\n }&DataHoraInicio=${filters.dataHoraInicio\n }&DataHoraFim=${filters.dataHoraFim\n }&EventoId=${selectedEvento && selectedEvento.id ? selectedEvento.id : ''}`\n )\n }, [estabelecimentoId])\n\n useDidMountEffect(() => {\n if (selectedEvento && selectedEvento.id) {\n runQuery()\n }\n }, [selectedEvento])\n\n useEffect(() => {\n if (selectedEvento && selectedEvento.id) {\n if (eventoInputValue === '') {\n setEventoInputValue(\n selectedEvento.nome &&\n `${selectedEvento.nome} ${\n selectedEvento.dataHoraInicio\n ? ` - (${toLocalDateFormat(selectedEvento.dataHoraInicio)})`\n : ''\n }`\n )\n }\n }\n }, [selectedEvento])\n\n useDidMountEffect(() => {\n setFilters((prev) => ({\n ...prev,\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\n textSearch: querySearch.get('Term') || '',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || ''\n }))\n }, [querySearch])\n\n return (\n \n
\n \n \n Filtrar por status \n {\n setFilters((prev) => ({\n ...prev,\n selectedStatusPedidoId: event.target.value as string\n }))\n }}\n label=\"Filtrar por status\"\n >\n \n {filters.selectedStatusPedidoId === '0' ? (\n 'Filtrar por status'\n ) : (\n Limpar filtro \n )}\n \n {statusPedidoSelect &&\n statusPedidoSelect.length > 0 &&\n statusPedidoSelect.map((statusPedido) => (\n \n {statusPedido.text}\n \n ))}\n \n \n \n \n \n \n Filtrar por forma de pagamento\n \n {\n setFilters((prev) => ({\n ...prev,\n selectedFormaPagamentoId: event.target.value as string\n }))\n }}\n label=\"Filtrar por forma de pagamento\"\n >\n \n {filters.selectedFormaPagamentoId === '0' ? (\n 'Filtrar por forma de pagamento'\n ) : (\n Limpar filtro \n )}\n \n {formaPagamentoSelect &&\n formaPagamentoSelect.length > 0 &&\n formaPagamentoSelect.map((formaPagamento) => (\n \n {formaPagamento.text}\n \n ))}\n \n \n \n \n \n {\n setSelectedEvento(newValue)\n if (reason === 'clear') {\n setEventoInputValue('')\n history.push(\n `/pedidos/admin?StatusPedidoId=${\n filters.selectedStatusPedidoId\n }&FormaPagamentoId=${\n filters.selectedFormaPagamentoId ? filters.selectedFormaPagamentoId : 0\n }&Term=${filters.textSearch}&DataHoraInicio=${filters.dataHoraInicio\n }&DataHoraFim=${filters.dataHoraFim\n }&EventoId=`\n )\n }\n }}\n getOptionLabel={(evento) =>\n evento.nome &&\n `${evento.nome} ${\n evento.dataHoraInicio\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\n : ''\n }`\n }\n placeholder=\"Selecione o evento...\"\n onInputChange={(event, newInputValue) => {\n newInputValue !== null\n ? setEventoInputValue(newInputValue)\n : setEventoInputValue('')\n }}\n inputValue={eventoInputValue}\n renderInput={(params) => (\n \n {!isMobile && (\n \n <>\n {isFetchingEvents && (\n \n )}\n {\n setShowPastEvents(event.target.checked)\n }}\n checked={showPastEvents}\n size=\"small\"\n inputProps={{\n 'aria-label': 'Listar eventos encerrados'\n }}\n />\n {\n setShowPastEvents(!showPastEvents)\n }}\n />\n >\n \n )}\n {params.InputProps.endAdornment}\n >\n )\n }}\n />\n )}\n />\n \n \n \n \n \n \n
\n )\n}\n\nexport default Filters\n","import React, { useEffect, useState } from 'react'\nimport {\n Typography,\n Grid,\n Button,\n ButtonGroup,\n Chip,\n makeStyles,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport { DatePicker } from '@material-ui/pickers'\nimport {\n format,\n subDays,\n differenceInDays,\n isAfter,\n isBefore,\n endOfDay,\n startOfDay,\n startOfYesterday,\n endOfYesterday\n} from 'date-fns'\nimport CalendarTodayIcon from '@material-ui/icons/CalendarTodayOutlined'\nimport { useLocation } from 'react-router-dom'\n\n//? Own imports\nimport { history } from 'utils'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport { Evento } from 'types/api'\nimport { useEvents } from 'hooks-querys'\nimport { useSelector } from 'react-redux'\n\ntype ChipType = {\n label: string\n value: string\n}\nconst chipOptions: ChipType[] = [\n { label: 'Hoje', value: '0' },\n { label: 'Ontem', value: '0' },\n { label: '7 dias', value: '7' },\n { label: '30 dias', value: '30' },\n { label: '90 dias', value: '90' },\n { label: '1 ano', value: '365' }\n]\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n dates: {\n [theme.breakpoints.up('md')]: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end'\n },\n [theme.breakpoints.down('sm')]: {\n alignItems: 'center',\n justifyContent: 'center',\n display: 'flex',\n flexWrap: 'wrap',\n '& > *': {\n margin: theme.spacing(0.5),\n marginBottom: theme.spacing(2)\n }\n }\n },\n calendarTodayIcon: {\n marginRight: theme.spacing(1)\n },\n chip: {\n marginRight: theme.spacing(1)\n },\n calendarTodayGroup: {\n [theme.breakpoints.up('md')]: {\n marginLeft: theme.spacing(1)\n },\n [theme.breakpoints.down('sm')]: {\n marginTop: theme.spacing(1)\n }\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst Header = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [selectedEvento, setSelectedEvento] = useState(null)\n const [selectEdge, setSelectEdge] = useState(null)\n const [calendarDate, setCalendarDate] = useState(new Date())\n const [dateRange, setDateRange] = useState({\n startDate: startOfDay(new Date()),\n endDate: endOfDay(new Date()),\n value: '0'\n })\n const [filters, setFilters] = useState({\n textSearch: querySearch.get('Term') || '',\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || '',\n })\n const [showPastEvents, setShowPastEvents] = useState(false)\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const {\n data: events,\n isLoading: isLoadingEvents,\n isFetching: isFetchingEvents\n } = useEvents(estabelecimentoId, showPastEvents, isMobile)\n\n const runQuery = () => {\n history.push(\n `/pedidos/admin?StatusPedidoId=${\n filters.selectedStatusPedidoId\n }&FormaPagamentoId=${\n filters.selectedFormaPagamentoId\n ? filters.selectedFormaPagamentoId\n : 0\n }&Term=${filters.textSearch\n }&DataHoraInicio=${format(dateRange.startDate, 'yyyy/MM/dd HH:mm:ss')\n }&DataHoraFim=${format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss')\n }&EventoId=${selectedEvento && selectedEvento.id ? selectedEvento.id : ''}`\n )\n }\n const today = new Date()\n const yesterday = new Date(today)\n yesterday.setDate(yesterday.getDate() - 1)\n\n const handleCalendarOpen = (edge: string) => {\n setSelectEdge(edge as 'start' | 'end')\n }\n\n const handleCalendarChange = (date: Date) => {\n setCalendarDate(date)\n }\n\n const handleCalendarClose = () => {\n setCalendarDate(new Date())\n setSelectEdge(null)\n }\n\n const handleCalendarAccept = (date: Date) => {\n setCalendarDate(new Date())\n\n if (selectEdge === 'start') {\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\n\n if (isAfter(date, dateRange.endDate)) {\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\n }\n } else {\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\n\n if (isBefore(date, dateRange.startDate)) {\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\n }\n }\n\n setFilters((prev) => ({\n ...prev,\n dataHoraInicio: format(dateRange.startDate, 'yyyy/MM/dd HH:mm:ss'),\n dataHoraFim: format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss')\n }))\n setSelectEdge(null)\n }\n\n const handleRangeChangeChip = (item: ChipType) => {\n if (item.label === 'Ontem') {\n setDateRange({\n startDate: startOfYesterday(),\n endDate: endOfYesterday(),\n value: item.value\n })\n } else {\n setDateRange({\n startDate: startOfDay(subDays(new Date(), Number(item.value))),\n endDate: endOfDay(new Date()),\n value: item.value\n })\n }\n setFilters((prev) => ({\n ...prev,\n dataHoraInicio: format(dateRange.startDate, 'yyyy/MM/dd HH:mm:ss'),\n dataHoraFim: format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss') }))\n }\n\n const open = Boolean(selectEdge)\n\n useEffect(() => {\n runQuery()\n }, [dateRange.startDate, dateRange.endDate])\n\n useEffect(() => {\n const eventId = querySearch.get('EventoId') || ''\n if (eventId && Number(eventId) > 0) {\n const event =\n events &&\n events.length > 0 &&\n events.find((e) => e.id === Number(eventId))\n if (event) {\n setSelectedEvento(event)\n } else if (selectedEvento === null) {\n setShowPastEvents(!showPastEvents)\n }\n }\n }, [events])\n\n useDidMountEffect(() => {\n const eventId = querySearch.get('EventoId') || ''\n if (eventId && Number(eventId) > 0) {\n const event =\n events &&\n events.length > 0 &&\n events.find((e) => e.id === Number(eventId))\n\n if (event) {\n setSelectedEvento(event)\n }\n } else {\n setSelectedEvento(null)\n }\n\n setFilters((prev) => ({\n ...prev,\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '',\n textSearch: querySearch.get('Term') || '',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || ''\n }))\n }, [querySearch])\n\n useDidMountEffect(() => {\n runQuery()\n }, [dateRange.startDate, dateRange.endDate])\n\n return (\n \n \n \n \n Gerência de Pedidos\n \n \n Lista de Pedidos\n \n \n \n {chipOptions &&\n chipOptions.length > 0 &&\n chipOptions.map((option) => (\n handleRangeChangeChip(option)}\n color={\n option.value != '0' &&\n differenceInDays(dateRange.endDate, dateRange.startDate) ===\n Number(option.value)\n ? 'primary'\n : (option.label === 'Hoje' &&\n format(dateRange.startDate, 'dd/MM/yyyy') ===\n format(today, 'dd/MM/yyyy')) ||\n (option.label === 'Ontem' &&\n format(dateRange.startDate, 'dd/MM/yyyy') ===\n format(yesterday, 'dd/MM/yyyy') &&\n format(dateRange.endDate, 'dd/MM/yyyy') ===\n format(yesterday, 'dd/MM/yyyy'))\n ? 'primary'\n : 'default'\n }\n />\n ))}\n \n handleCalendarOpen('start')}>\n \n {dateRange && format(dateRange.startDate, 'dd/MM/yyyy')}\n \n handleCalendarOpen('end')}>\n \n {dateRange && format(dateRange.endDate, 'dd/MM/yyyy')}\n \n \n \n \n \n
\n )\n}\n\nexport default Header\n","import React, { useEffect, useState } from 'react'\nimport { makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { Page, SkeletonTable } from 'components'\nimport { Filters, TableOrderManagementList, Header } from './components'\nimport { AccessControl } from 'components/Utils'\nimport AccessDenied from 'views/Errors/AccessDenied'\nimport { useOrders } from 'hooks-querys'\nimport { useLocation } from 'react-router-dom'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n results: {\n marginTop: theme.spacing(3)\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst OrderManagementList = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('Term') || '',\n statusPedidoId: querySearch.get('StatusPedidoId') || '0',\n formaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || '',\n selectedEvento: querySearch.get('EventoId') || ''\n })\n\n useEffect(() => {\n setFilters({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('Term') || '',\n statusPedidoId: querySearch.get('StatusPedidoId') || '0',\n formaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\n dataHoraFim: querySearch.get('DataHoraFim') || '',\n selectedEvento: querySearch.get('EventoId') || ''\n })\n }, [querySearch])\n\n const { isLoading, data } = useOrders({\n term: filters.textSearch,\n statusPedidoId: filters.statusPedidoId,\n formaPagamentoId: filters.formaPagamentoId,\n dataHoraInicio: filters.dataHoraInicio,\n dataHoraFim: filters.dataHoraFim,\n eventoId: filters.selectedEvento\n })\n\n return (\n (\n // @ts-ignore\n \n \n \n {isLoading ? (\n \n ) : (\n \n )}\n \n )}\n // @ts-ignore\n no={() => }\n />\n )\n}\n\nexport default OrderManagementList\n","import React, { useEffect } from 'react'\nimport {\n Box,\n Grid,\n LinearProgress,\n makeStyles,\n Typography\n} from '@material-ui/core'\nimport { useQueryClient } from 'react-query'\nimport { useParams } from 'react-router-dom'\n\n//? Own imports\nimport { Header, Page } from 'components'\nimport { OrderInfo, OrderItems, OrderTickets } from './components'\nimport { Pedido } from 'types/api'\nimport { useOrder } from 'hooks-querys'\nimport { format } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n marginBottom: theme.spacing(3)\n }\n}))\n\nconst OrderManagementDetails = () => {\n const classes = useStyles()\n //const queryClient = useQueryClient()\n const { pedidoId } = useParams<{ pedidoId: string }>()\n\n //const order = queryClient.getQueryData(['orders']) as Pedido[]\n //const orderItem = order?.find((order) => order.id === Number(pedidoId))\n\n const { data, isFetching, refetch, isLoading, dataUpdatedAt } = useOrder(\n Number(pedidoId),\n undefined\n )\n\n useEffect(() => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n }, [])\n\n return (\n <>\n {isFetching && (\n \n )}\n {data ? (\n // @ts-ignore\n \n \n \n {!isLoading ? (\n \n Última atualização:{' '}\n {format(dataUpdatedAt, \"dd/MM/yyyy 'às' HH:mm:ss\", {\n locale: brLocale\n })}{' '}\n {isFetching ? '(Atualizando...)' : ''}\n \n ) : null}\n \n \n \n \n \n \n \n \n \n \n {data.ingresso && data.ingresso.length > 0 && (\n \n \n \n )}\n \n \n \n \n ) : null}\n >\n )\n}\n\nexport default OrderManagementDetails\n","import React from 'react'\nimport { Avatar, Typography, makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { User } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n cover: {\n position: 'relative',\n [theme.breakpoints.down('sm')]: {\n height: 180\n },\n [theme.breakpoints.up('md')]: {\n height: 360\n },\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center',\n // filter: 'blur(10px)',\n // webkitFilter: 'blur(10px)',\n // mozFilter: 'blur(10px)',\n // oFilter: 'blur(10px)',\n // msFilter: 'blur(10px)',\n '&:before': {\n position: 'absolute',\n content: '\" \"',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n backgroundImage:\n 'linear-gradient(-180deg, rgba(0,0,0,0.00) 58%, rgba(0,0,0,0.32) 100%)'\n },\n '&:hover': {\n '& $changeButton': {\n visibility: 'visible'\n }\n }\n },\n container: {\n maxWidth: '100%',\n padding: theme.spacing(2, 3),\n position: 'relative',\n display: 'flex',\n flexWrap: 'wrap',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column'\n }\n },\n avatar: {\n border: `2px solid ${theme.palette.white}`,\n height: 120,\n width: 120,\n top: -60,\n left: theme.spacing(3),\n position: 'absolute'\n },\n details: {\n marginLeft: 136\n }\n}))\n\ntype HeaderProps = {\n user: User | undefined\n}\nconst Header = ({ user }: HeaderProps) => {\n const classes = useStyles()\n\n return (\n \n
\n
\n
\n
\n \n @{user?.username}\n \n \n {user?.nome}\n \n
\n
\n
\n )\n}\n\nexport default Header\n","import React, { useEffect, useState } from 'react'\nimport {\n Modal,\n Card,\n CardContent,\n CardActions,\n Grid,\n Typography,\n Button,\n makeStyles,\n Box,\n MenuItem\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { KeyboardDatePicker } from '@material-ui/pickers'\nimport { cnpj, cpf } from 'cpf-cnpj-validator'\n\n//? Own imports\nimport { Cidade, Estado, User } from 'types/api'\nimport { cepMask, cpfCnpjMask, phoneMask } from 'utils'\n\ntype UserEditProps = {\n user: User\n open: boolean\n onClose: () => void\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n outline: 'none',\n boxShadow: theme.shadows[20],\n [theme.breakpoints.up('sm')]: {\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px'\n },\n width: 700,\n maxHeight: '100%',\n overflowY: 'auto',\n maxWidth: '100%'\n },\n container: {\n marginTop: theme.spacing(3)\n },\n actions: {\n justifyContent: 'flex-end'\n }\n}))\n\ntype UserEditForm = {\n user: User\n nome: string\n cpfCnpj: string\n apelido?: string\n username: string\n dataNascimento?: Date\n telefone: string\n genero: 'M' | 'F' | 'U'\n cidadeId: number\n cep: string\n endereco: string\n numero: string\n complemento?: string\n bairro: string\n email: string\n}\n\nconst UserEdit = ({ open, onClose, user }: UserEditProps) => {\n const classes = useStyles()\n const [formState, setFormState] = useState({\n nome: user?.nome,\n cpfCnpj: user?.cpfCnpj,\n apelido: user?.apelido,\n username: user?.username,\n dataNascimento: user?.dataNascimento,\n telefone: user?.telefone,\n genero: user?.genero,\n cidadeId: user?.cidadeId,\n cep: user?.cep,\n endereco: user?.endereco,\n numero: user?.numero,\n complemento: user?.complemento,\n bairro: user?.bairro,\n email: user?.email\n })\n\n useEffect(() => {\n ValidatorForm.addValidationRule('isValidCpf', (value) => {\n if (value && value.length <= 14) {\n if (cpf.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCnpj', (value) => {\n if (value && value.length >= 15) {\n if (cnpj.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n ValidatorForm.addValidationRule('isValidPhone', (value) => {\n if (value && value !== null) {\n if (value.length > 0 && value.length < 14) {\n return false\n }\n return true\n }\n return true\n })\n ValidatorForm.addValidationRule('isValidCep', (value) => {\n if (value.length === 9) {\n return true\n } else {\n return false\n }\n })\n return () => {\n ValidatorForm.removeValidationRule('isValidCpf')\n ValidatorForm.removeValidationRule('isValidCnpj')\n ValidatorForm.removeValidationRule('isValidCep')\n ValidatorForm.removeValidationRule('isValidPhone')\n }\n }, [])\n\n const handleFieldChange = (event: React.ChangeEvent) => {\n event.persist()\n setFormState((formState: any) => ({\n ...formState,\n [event.target.name]:\n event.target.type === 'checkbox'\n ? event.target.checked\n : event.target.value\n }))\n }\n\n const handleSave = () => {\n console.log(formState)\n }\n if (!open) {\n return null\n }\n\n return (\n \n \n \n \n \n \n Editar usuário\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n // \n // generateUsername()}\n // >\n // \n // \n // \n // \n // ),\n startAdornment: @ \n }}\n // onFocus={() =>\n // (formState.username === '' ||\n // formState.username === null) &&\n // generateUsername()\n // }\n />\n \n \n handleFieldChange}\n InputAdornmentProps={{ position: 'start' }}\n />\n \n \n \n \n \n \n \n Sexo \n \n Masculino \n Feminino \n \n \n \n \n \n \n \n \n Estado * \n \n {/* {undefined !== estados && estados.length\n ? estados.map((row) => (\n \n {row.nome}\n \n ))\n : null} */}\n \n \n \n \n \n Cidade * \n \n {/* {cidades.map((row) => (\n \n {row.nome}\n \n ))} */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Cancelar\n \n \n Salvar\n \n \n \n \n \n )\n}\n\nUserEdit.displayName = 'UserEdit'\n\nexport default UserEdit\n","import React, { useState } from 'react'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Button,\n Divider,\n Table,\n TableBody,\n TableRow,\n TableCell,\n colors,\n makeStyles\n} from '@material-ui/core'\nimport EditIcon from '@material-ui/icons/Edit'\n\n//? Own imports\nimport { Label } from 'components'\nimport { UserEdit } from './components'\nimport { cepMask, cpfCnpjMask, getGenderFull, phoneMask } from 'utils'\nimport { User } from 'types/api'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n },\n actions: {\n flexDirection: 'column',\n alignItems: 'flex-start',\n '& > * + *': {\n marginLeft: 0\n }\n },\n label: {\n marginTop: theme.spacing(1)\n }\n}))\n\ntype UserInfoProps = {\n user: User\n}\n\nconst UserInfo = ({ user }: UserInfoProps) => {\n const classes = useStyles()\n const [openEdit, setOpenEdit] = useState(false)\n\n const handleEditOpen = () => {\n setOpenEdit(true)\n }\n\n const handleEditClose = () => {\n setOpenEdit(false)\n }\n\n return (\n \n \n \n \n \n \n \n ID \n #{user?.id} \n \n \n Nome \n {user?.nome} \n \n \n Apelido \n \n {user?.apelido ? user?.apelido : 'Não informado'}\n \n \n \n Nome do usuário \n @{user?.username} \n \n \n CPF/CNPJ \n {cpfCnpjMask(user?.cpfCnpj)} \n \n \n Data de nascimento \n \n {user?.dataNascimento\n ? `${user?.dataNascimento\n .toString()\n .split('-')[2]\n .substring(0, 2)}/${\n user?.dataNascimento.toString().split('-')[1]\n }/${user?.dataNascimento.toString().split('-')[0]}`\n : 'Não informada'}\n \n \n \n Email \n \n {user?.email}\n \n \n {user?.emailVerificado\n ? 'Email verificado'\n : 'Email não verificado'}\n \n
\n \n \n \n Telefone \n \n {user?.telefone ? phoneMask(user?.telefone) : 'Não informado'}\n {user?.telefone && (\n \n \n {user?.telefoneVerificado\n ? 'Telefone verificado'\n : 'Telefone não verificado'}\n \n
\n )}\n \n \n \n Género \n {getGenderFull(user?.genero)} \n \n \n Endereço \n \n {user?.endereco\n ? `${user?.endereco}, ${user?.numero}${\n user?.complemento ? `, ${user?.complemento}` : ''\n } - ${user?.bairro} - ${cepMask(user?.cep)}`\n : 'Não informado'}\n \n \n \n Cidade \n \n {user && user.cidade && user?.cidade?.nome} -{' '}\n {user && user.cidade && user?.cidade?.estado?.uf}\n \n \n \n Pais \n \n {user?.cidade?.estado?.pais?.nomePt || 'Não informado'}\n \n \n \n
\n \n \n } onClick={handleEditOpen}>\n Editar\n \n \n \n \n )\n}\n\nexport default UserInfo\n","import React from 'react'\nimport {\n Card,\n CardContent,\n CardHeader,\n Divider,\n Table,\n TableBody,\n TableCell,\n TableRow,\n colors,\n makeStyles\n} from '@material-ui/core'\nimport { format, formatRelative } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\n\n//? Own imports\nimport { Label } from 'components'\nimport { Cidade, Hashtag, User } from 'types/api'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0\n }\n}))\n\ntype ExtraInfoProps = {\n user: User\n}\n\nconst ExtraInfo = ({ user }: ExtraInfoProps) => {\n const classes = useStyles()\n\n const extractedUserHashtag = () => {\n if (user?.usuarioHashtag && user?.usuarioHashtag.length > 0) {\n const extractedUserHashtag: Hashtag[] = []\n user?.usuarioHashtag?.map((usuarioHashtagItem) => {\n extractedUserHashtag.push(usuarioHashtagItem.hashtag)\n })\n return extractedUserHashtag\n }\n return []\n }\n\n const extractedUserCities = () => {\n if (user?.usuarioCidade && user?.usuarioCidade.length > 0) {\n const extractedUserCities: Cidade[] = []\n user?.usuarioCidade?.map((usuarioCidadeItem) => {\n extractedUserCities.push(usuarioCidadeItem.cidade)\n })\n return extractedUserCities\n }\n return []\n }\n\n return (\n \n \n \n \n \n \n \n Tipo de usuário \n \n {user && user?.tipoUsuario && user?.tipoUsuario?.descricao\n ? user?.tipoUsuario?.descricao\n : 'Não identificado'}\n \n \n \n Data de cadastro \n \n {user?.dataHoraCadastro\n ? format(\n new Date(user.dataHoraCadastro),\n \"dd/MM/yyyy 'às' HH:mm:ss\"\n )\n : 'Não informado'}\n \n \n \n Último acesso \n \n {user?.dataHoraUltimoAcesso\n ? format(\n new Date(user.dataHoraUltimoAcesso),\n \"dd/MM/yyyy 'às' HH:mm:ss\"\n )\n : 'Não informado'}{' '}\n \n {user?.dataHoraUltimoAcesso &&\n formatRelative(\n new Date(user.dataHoraUltimoAcesso),\n new Date(),\n {\n locale: brLocale\n }\n )}\n \n \n \n Permite publicidade \n \n \n \n {user?.aceiteEmails ? 'SIM' : 'NÃO'}\n \n
\n \n \n \n Atividade privadas \n \n \n \n {user?.atividadesPrivadas ? 'SIM' : 'NÃO'}\n \n
\n \n \n \n Aceite termos de uso \n \n \n \n {user?.aceiteTermosUso ? 'SIM' : 'NÃO'}\n \n
\n \n \n \n Email vendas \n \n \n \n {user?.emailVendas ? 'SIM' : 'NÃO'}\n \n
\n \n \n \n Hashtag \n \n {extractedUserHashtag() &&\n extractedUserHashtag().length > 0 &&\n extractedUserHashtag().map((hashtag) =>\n hashtag && hashtag.descricao\n ? `#${hashtag.descricao} `\n : ''\n )}\n \n \n \n Cidades selecionadas \n \n {extractedUserCities &&\n extractedUserCities().length > 0 &&\n extractedUserCities().map((cidade, index) =>\n cidade && cidade.nome\n ? `${cidade.nome} - ${cidade.estado.uf}${\n index < extractedUserCities().length - 1 ? ', ' : ''\n }`\n : ''\n )}\n \n \n \n Dispositivos cadastrados \n {user?.usuarioDispositivo?.length} \n \n \n Total seguidores \n {user?.totalSeguidores} \n \n \n Total seguindo \n {user?.totalSeguindo} \n \n \n
\n \n \n )\n}\n\nexport default ExtraInfo\n","import React from 'react'\nimport {\n Card,\n CardHeader,\n CardContent,\n Button,\n Divider,\n Typography,\n makeStyles,\n Switch,\n Box\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/DeleteOutline'\nimport MailOutlineRoundedIcon from '@material-ui/icons/MailOutlineRounded'\n\n//? Own imports\nimport { User } from 'types/api'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n mainActions: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start'\n },\n notice: {\n marginTop: theme.spacing(1)\n },\n deleteButton: {\n marginTop: theme.spacing(1),\n color: '#fff',\n backgroundColor: theme.palette.error.main,\n '&:hover': {\n backgroundColor: theme.palette.error.dark\n }\n }\n}))\n\ntype OtherActionsProps = {\n user: User\n}\nconst OtherActions = ({ user }: OtherActionsProps) => {\n const classes = useStyles()\n\n return (\n \n \n \n \n Email verificado \n \n Habilitar ou desabilitar o email verificado.\n \n \n \n }>\n Reenviar email de verificação\n \n \n \n \n Remova os dados deste cliente se ele solicitou, se não, por favor\n esteja ciente de que o que for excluído nunca poderá ser recuperado.\n \n }>\n Excluir conta do cliente\n \n \n \n )\n}\n\nexport default OtherActions\n","import React, { useState, useEffect } from 'react'\nimport { Grid, makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { UserInfo, ExtraInfo, OtherActions } from './components'\nimport { User } from 'types/api'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\ntype UserInfoProps = {\n user: User | undefined\n}\n\nconst Summary = ({ user }: UserInfoProps) => {\n const classes = useStyles()\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default Summary\n","import React from 'react'\nimport { makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { TableOrderManagementList } from 'views/OrderManagementList/components'\nimport { useUserOrders } from 'hooks-querys'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst Orders = ({ userId }: { userId: number }) => {\n const classes = useStyles()\n const {\n data: userOrders\n } = useUserOrders(userId)\n\n return (\n \n )\n}\n\nexport default Orders\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport {\n Avatar,\n Button,\n Card,\n CardContent,\n CardHeader,\n Divider,\n Input,\n List,\n ListItem,\n ListItemAvatar,\n ListItemText,\n makeStyles,\n colors,\n Box,\n Typography,\n CircularProgress,\n Chip,\n Grid\n} from '@material-ui/core'\nimport SearchIcon from '@material-ui/icons/Search'\nimport PersonAddRoundedIcon from '@material-ui/icons/PersonAddRounded'\nimport PersonAddDisabledRoundedIcon from '@material-ui/icons/PersonAddDisabledRounded'\n\n//? Own Imports\nimport { getInitials, history } from 'utils'\nimport constants from 'theme/constants'\nimport { useUserConnections} from 'hooks-querys'\nimport { UserConnection } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n search: {\n padding: theme.spacing(2, 3),\n display: 'flex',\n alignItems: 'center'\n },\n searchIcon: {\n color: theme.palette.text.secondary\n },\n searchInput: {\n marginLeft: theme.spacing(1),\n color: theme.palette.text.secondary,\n fontSize: '14px'\n },\n avatar: {\n height: 60,\n width: 60\n },\n list: {},\n listItem: {\n flexWrap: 'wrap',\n padding: theme.spacing(1, 2)\n },\n listItemText: {\n marginLeft: theme.spacing(2)\n },\n unconnectedButton: {\n marginLeft: 'auto',\n color: '#fff',\n backgroundColor: colors.red[600],\n '&:hover': {\n backgroundColor: colors.red[900]\n },\n cursor: 'default'\n },\n connectedButton: {\n marginLeft: 'auto',\n color: '#fff',\n backgroundColor: colors.green[600],\n '&:hover': {\n backgroundColor: colors.green[900]\n },\n cursor: 'default'\n },\n cardHeaderAction: {\n margin: 'auto'\n }\n}))\n\nconst Connections = ({ userId }: { userId: number }) => {\n const classes = useStyles()\n const [selectedChip, setSelectedChip] = React.useState<\n 'followers' | 'following'\n >('followers')\n const {\n data: userConnections,\n isLoading\n } = useUserConnections(userId, selectedChip)\n\n const getSubheaderText = () => {\n if (isLoading) {\n return 'Carregando...'\n }\n if (userConnections && userConnections.totalRows > 0) {\n switch (selectedChip) {\n case 'followers':\n return `${userConnections?.totalRows} ${\n userConnections?.totalRows === 1 ? 'seguidor' : 'seguidores'\n }`\n case 'following':\n return `seguindo ${userConnections?.totalRows}`\n default:\n return undefined\n }\n } else {\n return 'Nenhuma conexão encontrada.'\n }\n }\n return (\n \n \n \n setSelectedChip('followers')}\n />\n \n \n setSelectedChip('following')}\n />\n \n \n }\n />\n \n \n \n \n
\n \n \n {isLoading ? (\n \n \n \n Carregando dados... \n \n \n \n \n \n \n ) : (\n \n {userConnections && userConnections.totalRows > 0 && (\n \n {userConnections?.items.map((connection: UserConnection) => (\n \n \n \n {getInitials(connection.nome)}\n \n \n \n {!connection.usuarioSegue && (\n }\n >\n Não segue\n \n )}\n {connection.usuarioSegue && selectedChip === 'followers' && (\n }\n >\n Seguindo\n \n )}\n \n ))}\n
\n )}\n \n )}\n \n \n )\n}\n\nexport default Connections\n","import React from 'react'\nimport { Grid, Typography, makeStyles, Box } from '@material-ui/core'\nimport { Rating } from '@material-ui/lab'\n\n//? Own imports\nimport { ReviewItem } from 'types/api'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard,\n padding: '1rem',\n backgroundColor: theme.palette.background.paper\n },\n stars: {\n display: 'flex',\n alignItems: 'center'\n },\n rating: {\n marginLeft: theme.spacing(2),\n fontWeight: 'bold'\n }\n}))\n\nconst OverallReviews = ({ reviews }: { reviews: ReviewItem[] }) => {\n const classes = useStyles()\n let rating = 0\n\n if (reviews?.length > 0) {\n rating =\n reviews.reduce((acc, review) => acc + review.nota, 0) /\n reviews.length\n }\n\n return (\n \n \n \n Avaliações no geral \n \n \n \n \n {rating}\n \n \n \n \n {reviews?.length && reviews?.length > 1 ? (\n `${reviews?.length} avaliações no total`)\n : `${reviews?.length} avaliação no total`}\n \n \n \n \n )\n}\n\nexport default OverallReviews\n","import React from 'react'\nimport { Link as RouterLink } from 'react-router-dom'\nimport {\n Avatar,\n Card,\n CardContent,\n CardHeader,\n Link,\n Typography,\n makeStyles\n} from '@material-ui/core'\nimport { Rating } from '@material-ui/lab'\nimport { formatDistance } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\n\n//? Own imports\nimport getInitials from 'utils/getInitials'\nimport { Review } from 'types/api'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard,\n marginTop: theme.spacing(2)\n },\n header: {\n paddingBottom: 0\n },\n subheader: {\n flexWrap: 'wrap',\n display: 'flex',\n alignItems: 'center'\n },\n stars: {\n display: 'flex',\n alignItems: 'center',\n marginRight: theme.spacing(1)\n },\n rating: {\n marginLeft: theme.spacing(1),\n fontWeight: 'bold'\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n message: {\n padding: theme.spacing(2, 3)\n },\n noMessage: {\n padding: theme.spacing(1, 3)\n }\n}))\n\nconst ReviewCard = ({ reviewItem }: { reviewItem: Review }) => {\n const classes = useStyles()\n\n return (\n \n \n {getInitials(reviewItem.usuario?.nome)}\n \n }\n className={classes.header}\n disableTypography\n subheader={\n \n
\n \n \n {reviewItem.nota}\n \n
\n {reviewItem.evento && (\n
\n | Referente ao evento{' '}\n \n {`${reviewItem.evento?.nome} `}\n \n \n )}\n {reviewItem.estabelecimento && (\n
\n | Estabelecimento:{' '}\n \n {`${reviewItem.estabelecimento?.nome} `}\n {' '}\n \n )}\n
\n {' '}|{' '}\n {formatDistance(\n new Date(reviewItem.dataHora),\n new Date(),\n {\n locale: brLocale,\n addSuffix: true\n }\n )}\n \n
\n }\n title={\n \n {reviewItem.usuario?.nome}\n \n }\n />\n \n \n \n {reviewItem.mensagem}\n \n
\n \n \n )\n}\n\nexport default ReviewCard\n","import React, { useState, useEffect } from 'react'\nimport {\n Box,\n CircularProgress,\n makeStyles,\n Typography\n} from '@material-ui/core'\n\n//? Own Imports\nimport { OverallReviews, ReviewCard } from './components'\nimport { useUserReviews } from 'hooks-querys'\nimport { Review } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {}\n}))\n\nconst Reviews = ({ userId }: { userId: number }) => {\n const classes = useStyles()\n const isError = false\n const {\n data: userReviews,\n isLoading\n } = useUserReviews(userId)\n\n return (\n \n {isLoading ? (\n \n \n \n Carregando dados... \n \n \n \n \n \n \n ) : (\n <>\n \n {userReviews &&\n userReviews?.map((review: Review) => (\n \n ))}\n >\n )}\n
\n )\n}\n\nexport default Reviews\n","import React from 'react'\nimport PerfectScrollbar from 'react-perfect-scrollbar'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Typography,\n Table,\n TableBody,\n TableCell,\n TableRow,\n colors,\n makeStyles,\n TableHead,\n Tooltip,\n Box,\n CircularProgress,\n IconButton,\n Grid\n} from '@material-ui/core'\nimport { format } from 'date-fns'\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\nimport ReactToPrint from 'react-to-print'\n\n//? Own Imports\nimport { Label } from 'components'\nimport constants from 'theme/constants'\nimport { useUserLogs } from 'hooks-querys'\nimport { LogDescritivo } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n card: {\n ...constants.shadowCard\n },\n content: {\n padding: 0,\n '&:last-child': {\n paddingBottom: 0\n }\n },\n headCell: {\n padding: theme.spacing(1, 2)\n },\n action: {\n margin: 0\n }\n}))\n\nconst Logs = ({ userId }: { userId: number }) => {\n const classes = useStyles()\n const refTable = React.useRef(null)\n const {\n data: userLogs,\n isLoading\n } = useUserLogs(userId)\n\n return (\n \n
\n (\n \n \n \n \n \n \n \n \n \n )}\n content={() => refTable.current}\n />\n }\n />\n \n \n {isLoading ? (\n \n \n \n Carregando dados... \n \n \n \n \n \n \n ) : (\n \n \n \n \n \n Tipo\n \n \n Tabela\n \n \n Campo\n \n \n Chave\n \n \n Valor\n \n \n Data e hora\n \n \n \n \n {userLogs.map((log: LogDescritivo) => (\n \n \n \n {log.tipo === 'I'\n ? 'Inclusão'\n : log.tipo === 'A'\n ? 'Alteração'\n : 'Exclusão'}\n \n \n {log.tabela} \n {log.campo} \n {log.chave} \n \n \n {`${log.valorAntigo}`} \n \n \n \n {` → ${log.valorNovo}`}\n \n \n \n \n {format(\n new Date(log.dataHora),\n \"dd/MM/yyyy 'às' HH:mm:ss\"\n )}\n \n \n ))}\n \n
\n \n )}\n \n \n
\n )\n}\n\nexport default Logs\n","import React, { ChangeEvent } from 'react'\nimport { Redirect, useParams } from 'react-router-dom'\nimport { Tabs, Tab, Divider, colors, makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { Page } from 'components'\nimport { Info, Header, Orders, Connections, Reviews, Logs } from './components'\nimport { history } from 'utils'\nimport { User } from 'types/api'\nimport { AccessControl } from 'components/Utils'\nimport AccessDenied from 'views/Errors/AccessDenied'\nimport { useUserInfo } from 'hooks-querys'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n inner: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst CustomerManagementDetails = () => {\n const classes = useStyles()\n const { tab, userId } = useParams<{ tab: string; userId: string }>()\n const {\n data: user\n } = useUserInfo(Number(userId))\n\n const handleTabsChange = (_event: ChangeEvent<{}>, value: string) => {\n history.push(value)\n }\n\n const tabs = [\n { value: 'informacoes', label: 'Informações' },\n { value: 'pedidos', label: 'Pedidos' },\n { value: 'conexoes', label: 'Conexões' },\n { value: 'avaliacoes', label: 'Avaliações' },\n { value: 'logs', label: 'Logs' }\n ]\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n // @ts-ignore\n (\n \n \n \n
\n {tabs.map((tab) => (\n \n ))}\n \n
\n
\n {tab === 'informacoes' && }\n {tab === 'pedidos' && }\n {tab === 'conexoes' && (\n \n )}\n {tab === 'avaliacoes' && }\n {tab === 'logs' && }\n
\n
\n \n )}\n // @ts-ignore\n no={() => }\n />\n )\n}\n\nexport default CustomerManagementDetails\n","import React from 'react'\nimport {\n TableRow,\n TableCell,\n Grid,\n Tooltip,\n IconButton,\n Avatar,\n makeStyles,\n Typography,\n Link\n} from '@material-ui/core'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\nimport { Link as RouterLink } from 'react-router-dom'\n\n//? Own imports\nimport { User } from 'types/api'\nimport { cepMask, cpfCnpjMask, getInitials, phoneMask } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n avatar: {\n height: 42,\n width: 42,\n marginRight: theme.spacing(1)\n }\n}))\n\nconst RowTableUsers = ({ user }: { user: User }) => {\n const classes = useStyles()\n\n return (\n \n \n {user.id}\n \n \n {user && user.nome ? (\n \n
\n {getInitials(user?.nome)}\n \n
\n
\n {user?.nome}\n \n
@{user?.username}
\n
\n
\n ) : (\n 'Usuário não encontrado'\n )}\n \n \n {cpfCnpjMask(user.cpfCnpj) || 'Não informado'}\n \n {user?.email || 'Não identificado'} \n \n \n {`${user?.endereco ? user?.endereco : ''}${\n user?.numero ? `, ${user?.numero}` : ''\n } ${user?.complemento ? ` - ${user?.complemento}` : ''}${\n user?.bairro ? ` - ${user?.bairro}` : ''\n }`}\n
\n {cepMask(user?.cep)}
\n {user?.cidade ? (\n \n {`${user?.cidade?.nome} -\n ${user?.cidade?.estado.uf.toUpperCase()}/${\n user?.cidade?.estado?.pais?.nomePt\n }`}\n
\n ) : null}\n \n \n {phoneMask(user.telefone) || 'Não informado'}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default RowTableUsers\n","import React from 'react'\nimport {\n TableBody,\n Table,\n makeStyles,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Toolbar,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\nimport ReactToPrint from 'react-to-print'\n\n//? Own imports\nimport { User } from 'types/api'\nimport { RowTableUsers } from './components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n table: {\n minWidth: 700\n },\n rootToolbarStyles: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n titleToolbarStyles: {\n flex: '1 1 100%'\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n ...constants.shadowCard\n }\n}))\n\nconst TableUsers = ({ users }: { users: User[] }) => {\n const classes = useStyles()\n const refTable = React.useRef(null)\n\n return (\n \n
\n {users && users.length > 0 ? (\n <>\n Total de dados encontrados: {users.length} \n >\n ) : (\n Nenhum dado encontrado. \n )}\n \n {users && users.length > 0 && (\n
\n \n \n Lista de usuários\n \n (\n \n \n \n \n \n )}\n content={() => refTable.current}\n />\n \n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\n \n {/* ------------------------------------------------------------>\t */}\n \n {users !== undefined && users.length > 0 && (\n \n \n \n #ID \n Nome \n CPF/CNPJ \n Email \n Localização \n Telefone \n Ações \n \n \n \n {users.map((user) => {\n return \n })}\n \n
\n )}\n \n \n )}\n
\n )\n}\n\nexport default TableUsers\n","import React, { useState } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Grid,\n makeStyles,\n TextField,\n InputAdornment,\n IconButton,\n Divider,\n Tooltip\n} from '@material-ui/core'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\n\n//? Own imports\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport { history } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst Filters = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n textSearch: querySearch.get('textSearch') || ''\n })\n\n const runQuery = () => {\n history.push(`/usuarios?textSearch=${filters.textSearch}`)\n }\n\n const handleChangeText = (value: string) => {\n setFilters((prev) => ({ ...prev, textSearch: value }))\n }\n\n const handleSubmitSearch = (event: React.FormEvent) => {\n event.preventDefault()\n if (filters.textSearch && filters.textSearch.length > 0) {\n runQuery()\n }\n }\n\n const clearTextSearch = () => {\n setFilters((prev) => ({ ...prev, textSearch: '' }))\n }\n\n useDidMountEffect(() => {\n if (filters.textSearch === '') {\n runQuery()\n }\n }, [filters.textSearch])\n\n useDidMountEffect(() => {\n setFilters((prev) => ({\n ...prev,\n textSearch: querySearch.get('textSearch') || ''\n }))\n }, [querySearch])\n\n return (\n \n )\n}\n\nexport default Filters\n","import React, { useEffect, useState } from 'react'\nimport { Box, LinearProgress, makeStyles, Typography } from '@material-ui/core'\n\n//? Own imports\nimport { AccessControl } from 'components/Utils'\nimport { Header, Page, SkeletonTable } from 'components'\nimport AccessDenied from 'views/Errors/AccessDenied'\nimport { Filters, TableUsers } from './components'\nimport { useUsers } from 'hooks-querys'\nimport { useLocation } from 'react-router-dom'\nimport { User } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n marginBottom: theme.spacing(4)\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst CustomerManagementList = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || ''\n })\n\n useEffect(() => {\n setFilters({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || ''\n })\n }, [querySearch])\n\n const { data, isLoading, refetch, isFetching, isSuccess } = useUsers({\n page: 1, // valor fixo para paginação, pois o componente de paginação não está implementado\n direction: 'desc',\n order: '',\n limit: 10000, //limite alto para não haver paginação\n term: filters.textSearch\n })\n return (\n \n (\n <>\n {isFetching && (\n \n )}\n \n
\n
\n {(filters.textSearch === undefined ||\n filters.textSearch.length < 3) && (\n
\n \n Digite pelo menos 3 caracteres para iniciar a busca\n \n \n )}\n {isLoading ? (\n
\n ) : (\n isSuccess && (\n
\n )\n )}\n
\n >\n )}\n // @ts-ignore\n no={() => }\n />\n \n )\n}\n\nexport default CustomerManagementList\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport {\n Card,\n CardContent,\n CardActions,\n Avatar,\n Typography,\n Button,\n withStyles,\n Divider,\n Tooltip,\n CircularProgress,\n Backdrop,\n Grid\n} from '@material-ui/core'\nimport { withRouter } from 'react-router-dom'\nimport { connect, useDispatch } from 'react-redux'\nimport getInitials from 'utils/getInitials'\nimport ImageUploading from 'react-images-uploading'\nimport { uploadImage } from '_services'\nimport { usuarioAction } from '_actions'\nimport { useSelector } from 'react-redux'\nimport CloudUploadTwoToneIcon from '@material-ui/icons/CloudUploadTwoTone'\nimport { useConfirm } from 'material-ui-confirm'\nimport { errorsUploadImage } from 'utils'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n textAlgin: 'center'\n },\n name: {\n marginTop: theme.spacing(1)\n },\n avatar: {\n height: 100,\n width: 100,\n cursor: 'pointer'\n },\n uploadButton: {\n marginRight: theme.spacing(2),\n justifyContent: 'space-between'\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff'\n }\n})\n\nconst ProfileDetails = (props) => {\n const { className, ...rest } = props\n const [images, setImages] = useState([])\n const [open, setOpen] = useState(false)\n const usuario = useSelector((state) => state.authentication.user)\n const { classes } = props\n const dispatch = useDispatch()\n const confirm = useConfirm()\n\n const removeImage = () => {\n confirm({\n title: 'Deseja remover a imagem?',\n description: '',\n confirmationText: 'Sim, quero remover!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n let payload = {\n ...usuario,\n imagem: null\n }\n dispatch(usuarioAction.editUsuarioInfo(usuario.id, payload))\n dispatch(usuarioAction.onChangeProps('imagem', null))\n })\n }\n\n const onChange = (imageList) => {\n // data for submit\n setOpen(true)\n setImages(imageList)\n uploadImage(imageList[0])\n .then((response) => {\n let payload = {\n ...usuario,\n imagem: response\n }\n dispatch(usuarioAction.editUsuarioInfo(usuario.id, payload))\n dispatch(usuarioAction.onChangeProps('imagem', response))\n setOpen(false)\n })\n .catch((err) => {\n console.log(err)\n setOpen(false)\n })\n }\n return (\n \n
\n \n \n \n \n \n \n Enviando imagem...\n \n \n \n \n
errorsUploadImage(errors)}\n value={images}\n onChange={onChange}\n dataURLKey=\"data_url\"\n >\n {({ onImageUpload, isDragging, dragProps }) => (\n // write your building UI\n \n \n {isDragging ? (\n <>\n \n \n Solte a imagem aqui!\n \n >\n ) : (\n <>\n \n \n {getInitials(usuario.nome)}\n \n \n \n {usuario.nome}\n \n \n {usuario.tipoUsuario.descricao}\n \n \n {usuario.email}\n \n >\n )}\n \n \n \n \n {usuario.imagem !== null && usuario.imagem !== ''\n ? 'Trocar imagem'\n : 'Carregar imagem'}\n \n {usuario.imagem !== null && usuario.imagem !== '' && (\n \n Remover imagem\n \n )}\n \n \n )}\n \n
\n )\n}\n\nProfileDetails.propTypes = {\n className: PropTypes.string,\n profile: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return {\n usuario: state.authentication.usuario\n }\n}\nconst connectedProfileDetailsPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(ProfileDetails))\n)\nexport default connectedProfileDetailsPage\n","import React, { useState, useEffect } from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport {\n Button,\n Card,\n CardActions,\n CardContent,\n CardHeader,\n Grid,\n Divider,\n CircularProgress\n} from '@material-ui/core'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { usuarioAction } from '_actions'\nimport { phoneMask } from 'utils/masks'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n }\n}))\n\nconst GeneralSettings = (props) => {\n const { className, ...rest } = props\n const dispatch = useDispatch()\n const classes = useStyles()\n const usuario = useSelector((state) => state.authentication.user)\n const { loading } = useSelector((state) => state.usuario)\n\n const [values, setValues] = useState({\n nome: '',\n telefone: ''\n })\n const [editable, setEditable] = useState(false)\n\n useEffect(() => {\n ValidatorForm.addValidationRule('isValidPhone', (value) => {\n if (value !== null && value) {\n if (value.length > 0 && value.length < 14) {\n return false\n }\n return true\n }\n return true\n })\n }, [])\n\n useEffect(() => {\n // antes de desmontar o componente\n return () => {\n ValidatorForm.removeValidationRule('isValidPhone')\n }\n }, [])\n\n useEffect(() => {\n setValues({\n ...values,\n nome: usuario.nome,\n telefone: usuario.telefone\n })\n }, [usuario])\n\n const handleChange = (event) => {\n event.persist()\n\n setValues({\n ...values,\n [event.target.name]:\n event.target.type === 'checkbox'\n ? event.target.checked\n : event.target.value\n })\n }\n\n const handleClickEdit = (event) => {\n event.preventDefault()\n setEditable(!editable)\n }\n const handleClickCancel = (event) => {\n event.preventDefault()\n setEditable(!editable)\n setValues({\n ...values,\n nome: usuario.nome,\n telefone: usuario.telefone\n })\n }\n\n const handleSubmit = async (event) => {\n event.preventDefault()\n let payload = {\n ...usuario,\n nome: values.nome,\n telefone:\n values.telefone !== null &&\n values.telefone !== undefined &&\n values.telefone !== ''\n ? values.telefone.replace(/\\D/g, '')\n : values.telefone\n }\n dispatch(usuarioAction.editUsuarioInfo(usuario.id, payload))\n setEditable(false)\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {editable ? (\n <>\n \n {loading ? 'Enviando informações...' : 'Salvar Alterações'}\n \n \n Cancelar\n \n >\n ) : (\n \n )\n }\n >\n {loading ? 'Enviando informações... ' : 'Editar Informações'}\n \n )}\n \n \n \n )\n}\n\nGeneralSettings.propTypes = {\n className: PropTypes.string\n}\n\nexport default GeneralSettings\n","import React from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport { Grid } from '@material-ui/core'\nimport { ProfileDetails, GeneralSettings } from './components'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst General = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n return (\n \n \n \n \n \n \n \n \n )\n}\n\nGeneral.propTypes = {\n className: PropTypes.string\n}\n\nexport default General\n","import React, { useEffect, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Grid,\n FormControlLabel,\n Checkbox,\n Typography,\n Button,\n Divider,\n CircularProgress\n} from '@material-ui/core'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { usuarioAction } from '_actions'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n ...constants.shadowCard\n },\n item: {\n display: 'flex',\n flexDirection: 'column'\n }\n}))\n\nconst Notifications = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const { user } = useSelector((state) => state.authentication)\n const { loading } = useSelector((state) => state.usuario)\n const [emailVendas, setEmailVendas] = useState(user.emailVendas)\n\n useEffect(() => {\n setEmailVendas(user.emailVendas)\n return () => {\n setEmailVendas(user.emailVendas)\n }\n }, [user.emailVendas])\n\n const dispatch = useDispatch()\n const handleSubmit = async () => {\n let payload = {\n ...user,\n emailVendas: emailVendas\n }\n dispatch(usuarioAction.editUsuarioInfo(user.id, payload))\n }\n return (\n \n \n \n \n \n \n \n \n }\n >\n {loading ? 'Salvando...' : 'Salvar alterações'}\n \n \n \n )\n}\n\nNotifications.propTypes = {\n className: PropTypes.string\n}\n\nexport default Notifications\n","import React from 'react'\nimport { withRouter, Redirect } from 'react-router-dom'\nimport { connect, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport PersonOutlineRoundedIcon from '@material-ui/icons/PersonOutlineRounded'\nimport PermDataSettingRoundedIcon from '@material-ui/icons/PermDataSettingRounded'\nimport NotificationsNoneRoundedIcon from '@material-ui/icons/NotificationsNoneRounded'\nimport LockRoundedIcon from '@material-ui/icons/LockRounded'\nimport { Tabs, Tab, Divider, colors, withStyles } from '@material-ui/core'\nimport { Header, Page } from 'components'\nimport { General, Parametros, Notifications, Security } from './components'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: {\n marginTop: theme.spacing(3)\n },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n})\n\nconst Settings = (props) => {\n const { match, history } = props\n const { classes } = props\n const { tab } = match.params\n\n const handleTabsChange = (event, value) => {\n history.push(value)\n }\n\n const tabs = [\n { value: 'general', label: 'Geral', icon: },\n // {\n // value: 'parameters',\n // label: 'Parâmetros ',\n // icon: \n // },\n {\n value: 'notifications',\n label: 'Notificações',\n icon: \n }\n // { value: 'security', label: 'Segurança', icon: }\n ]\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n \n \n \n {tabs.map((tab) => (\n \n ))}\n \n \n \n {tab === 'general' &&
}\n {/* {tab === 'parameters' &&
} */}\n {tab === 'notifications' &&
}\n {/* {tab === 'security' &&
} */}\n
\n \n )\n}\n\nSettings.propTypes = {\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return {\n usuario: state.usuario,\n usuarioEstabelecimento: state.usuarioEstabelecimento\n }\n}\nconst connectedSettingsPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Settings))\n)\nexport { connectedSettingsPage as Settings }\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Grid,\n Button,\n Divider,\n TextField,\n colors\n} from '@material-ui/core'\n\nconst useStyles = makeStyles((theme) => ({\n root: {}\n}))\n\nconst Security = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n\n const [values, setValues] = useState({\n password: '',\n confirm: ''\n })\n\n const handleChange = (event) => {\n setValues({\n ...values,\n [event.target.name]: event.target.value\n })\n }\n\n const valid = values.password && values.password === values.confirm\n\n return (\n \n \n \n \n \n \n \n \n \n Salvar mudanças\n \n \n \n )\n}\n\nSecurity.propTypes = {\n className: PropTypes.string\n}\n\nexport default Security\n","import React, { Fragment } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Grid,\n FormControlLabel,\n Checkbox,\n Typography,\n Button,\n Divider\n} from '@material-ui/core'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n item: {\n display: 'flex',\n flexDirection: 'column'\n }\n}))\n\nconst Parametros = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n\n return (\n \n \n \n \n \n \n \n \n \n Salvar alterações\n \n \n \n )\n}\n\nParametros.propTypes = {\n className: PropTypes.string\n}\n\nexport default Parametros\n","import React, { useState } from 'react'\nimport {\n Button,\n CircularProgress,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Grid,\n TextField,\n Typography\n} from '@material-ui/core'\nimport { usuarioAction } from '_actions'\nimport { useDispatch, useSelector } from 'react-redux'\n\nconst ModalRequestPasswordReset = () => {\n const [email, setEmail] = useState()\n const dispatch = useDispatch()\n const { openModalRequestPasswordReset, loading } = useSelector(\n (state) => state.usuario\n )\n const handleChange = (event) => {\n setEmail(event.target.value.toLowerCase())\n }\n const handleClose = () => {\n dispatch(usuarioAction.openModalRequestPasswordReset(false))\n }\n const handleSubmit = (event) => {\n event.preventDefault()\n dispatch(usuarioAction.requestPasswordReset(email))\n }\n return (\n \n \n Recuperação de senha perdida\n \n \n \n )\n}\n\nexport default ModalRequestPasswordReset\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n CircularProgress,\n Avatar,\n FormControlLabel,\n withStyles,\n Paper,\n Grid,\n Button,\n Box,\n Typography,\n CssBaseline,\n Checkbox,\n Link,\n IconButton\n} from '@material-ui/core'\nimport { connect } from 'react-redux'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nimport { authActions, usuarioAction } from '../../_actions'\nimport { history } from '../../utils'\nimport { withRouter } from 'react-router-dom'\nimport KeyboardBackspaceIcon from '@material-ui/icons/KeyboardBackspace'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport LockOpenIcon from '@material-ui/icons/LockOpen'\nimport FacebookLogin from 'react-facebook-login/dist/facebook-login-render-props'\nimport FacebookIcon from '@material-ui/icons/Facebook'\nimport ModalRequestPasswordReset from './ModalRequestPasswordReset'\n\nconst styles = (theme) => ({\n root: {\n height: '100vh'\n },\n image: {\n backgroundImage: `url(/images/img-login.svg)`,\n backgroundRepeat: 'no-repeat',\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.secondary.dark\n : theme.palette.secondary.main,\n backgroundSize: '40rem',\n backgroundPosition: 'center'\n },\n paper: {\n margin: theme.spacing(8, 4),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center'\n },\n avatar: {\n margin: theme.spacing(1),\n backgroundColor: theme.palette.secondary.main\n },\n form: {\n width: '100%', // Fix IE 11 issue.\n marginTop: theme.spacing(1)\n },\n submit: {\n margin: theme.spacing(3, 0, 2)\n },\n facebook: {\n margin: theme.spacing(0, 0, 2),\n backgroundColor: '#3b5998',\n '&:hover': {\n backgroundColor: theme.palette.secondary.light\n }\n },\n backButtom: {}\n})\n\nfunction Copyright() {\n return (\n \n {'Copyright © '}\n \n Corujas\n {' '}\n {new Date().getFullYear()}\n {'.'}\n \n )\n}\n\nclass Login extends Component {\n constructor(props) {\n super(props)\n this.state = {\n email: '',\n senha: '',\n showPassword: false,\n submitted: false\n }\n }\n\n componentDidMount() {\n if (localStorage.getItem('auth')) {\n history.push('/home')\n }\n }\n handleChange = (prop) => (event) => {\n if (prop === 'email') {\n this.setState({ [prop]: event.target.value.toLowerCase() })\n } else {\n this.setState({ [prop]: event.target.value })\n }\n }\n\n handleChangeBox = (name) => (event) => {\n this.setState({ ...this.state, [name]: event.target.checked })\n }\n\n handleSubmit = (event) => {\n event.preventDefault()\n const { email, senha } = this.state\n const { dispatch } = this.props\n if (email && senha) {\n dispatch(authActions.login(email, senha))\n }\n }\n\n responseFacebook = (response) => {\n const { dispatch } = this.props\n if (response.accessToken) {\n dispatch(authActions.facebookLogin(response.accessToken, true))\n }\n }\n handleClickopenModalRequestPasswordReset = () => {\n const { dispatch } = this.props\n dispatch(usuarioAction.openModalRequestPasswordReset(true))\n }\n render() {\n const { loggingIn } = this.props\n const { email, senha } = this.state\n const { classes } = this.props\n return (\n \n \n \n \n \n \n
\n history.goBack()}\n aria-label=\"Voltar\"\n color=\"primary\"\n >\n \n \n \n
\n \n \n
\n Login\n \n
\n \n \n \n \n }\n label=\"Mostrar senha\"\n />\n \n }\n endIcon={loggingIn && }\n >\n {loggingIn ? 'Validando informações... ' : 'Entrar'}\n \n\n (\n }\n endIcon={loggingIn && }\n >\n {loggingIn\n ? 'Validando informações... '\n : 'Entrar com o Facebook'}\n \n )}\n />\n \n
\n \n {\n history.push(`/cadastro`)\n }}\n >\n {'Não possui uma conta? Seja nosso parceiro!'}\n \n \n \n \n {'Esqueceu a senha?'}\n \n \n \n
\n \n \n
\n \n \n )\n }\n}\nLogin.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n const { loggingIn } = state.authentication\n return {\n loggingIn\n }\n}\nconst connectedLoginPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Login))\n)\nexport { connectedLoginPage as Login }\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { usuarioAction } from '../../_actions'\n\nconst EmailVerification = (props) => {\n const dispatch = useDispatch()\n const refreshed = useSelector((state) => state.authentication.refreshed)\n const loggedIn = useSelector((state) => state.authentication.loggedIn)\n\n const verificaEmail = () => {\n const query = new URLSearchParams(props.location.search)\n var email = query.toString().substr(6, query.toString().indexOf('&', 0) - 6)\n email = decodeURIComponent(email)\n var token = query\n .toString()\n .substr(\n query.toString().indexOf('token=', 0) + 6,\n query.toString().length - query.toString().indexOf('token=', 0) - 6\n )\n\n let payload = {\n username: decodeURIComponent(email),\n password: 'senha'\n }\n dispatch(usuarioAction.emailVerification(payload, token))\n }\n\n useEffect(() => {\n if (loggedIn) {\n if (refreshed) {\n verificaEmail()\n }\n }\n }, [refreshed])\n\n useEffect(() => {\n if (!loggedIn) {\n verificaEmail()\n }\n }, [])\n\n return <>>\n}\nexport default EmailVerification\n","import React, { Component } from 'react'\nimport Button from '@material-ui/core/Button'\nimport CssBaseline from '@material-ui/core/CssBaseline'\nimport PropTypes from 'prop-types'\nimport { withRouter } from 'react-router-dom'\nimport { connect } from 'react-redux'\nimport Paper from '@material-ui/core/Paper'\nimport Grid from '@material-ui/core/Grid'\nimport Typography from '@material-ui/core/Typography'\nimport Container from '@material-ui/core/Container'\nimport IconButton from '@material-ui/core/IconButton'\nimport KeyboardBackspaceIcon from '@material-ui/icons/KeyboardBackspace'\nimport { withStyles } from '@material-ui/core/styles'\nimport { usuarioAction } from '../../_actions'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport { history } from 'utils'\nimport { CircularProgress } from '@material-ui/core'\n\nconst styles = (theme) => ({\n paper: {\n marginTop: theme.spacing(5),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center'\n },\n avatar: {\n margin: theme.spacing(1),\n backgroundColor: theme.palette.secondary.main,\n width: theme.spacing(9),\n height: theme.spacing(9)\n },\n form: {\n width: '100%', // Fix IE 11 issue.\n marginTop: theme.spacing(3)\n },\n submit: {\n margin: theme.spacing(3, 0, 2),\n color: '#ffffff'\n },\n backButton: {\n marginTop: theme.spacing(1)\n }\n})\n\nclass PasswordReset extends Component {\n state = {\n email: '',\n token: '',\n password: '',\n repeatPassword: ''\n }\n\n componentDidMount() {\n const query = new URLSearchParams(this.props.location.search)\n var email = query.toString().substr(6, query.toString().indexOf('&', 0) - 6)\n this.setState({ email: decodeURIComponent(email) })\n\n var token = query\n .toString()\n .substr(\n query.toString().indexOf('token=', 0) + 6,\n query.toString().length - query.toString().indexOf('token=', 0) - 6\n )\n this.setState({ token: token })\n\n ValidatorForm.addValidationRule('isPasswordMatch', (value) => {\n if (value !== this.state.password) {\n return false\n }\n return true\n })\n }\n\n handleChangePassword = (prop) => (event) => {\n this.setState({ [prop]: event.target.value })\n }\n\n handleChangeRepeatPassword = (prop) => (event) => {\n this.setState({ [prop]: event.target.value })\n }\n\n handleSubmit = (event) => {\n event.preventDefault()\n const { dispatch } = this.props\n let payload = {\n username: this.state.email,\n password: this.state.password\n }\n dispatch(usuarioAction.passwordReset(payload, this.state.token))\n }\n\n render() {\n const { loading } = this.props.usuario\n const { classes } = this.props\n\n return (\n \n \n \n \n history.goBack()}\n aria-label=\"Voltar\"\n color=\"primary\"\n >\n \n \n \n \n Informe e confirme a nova senha.\n \n \n \n \n \n \n \n \n \n \n }\n >\n {loading ? 'Enviando informações...' : 'Alterar'}\n \n \n
\n \n )\n }\n}\nPasswordReset.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nfunction mapStateToProps(state) {\n return state\n}\nconst connectedPasswordResetPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(PasswordReset))\n)\nexport { connectedPasswordResetPage as PasswordReset }\n","import React from 'react'\n// import { makeStyles } from '@material-ui/styles';\nimport { Grid, Typography, Button } from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport { history } from '../utils'\nimport clsx from 'clsx'\nimport { AccessControl } from '../components/Utils/AccessControl'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst TitleContent = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n return (\n \n
\n \n \n {props.subTitle}\n \n \n {props.title}\n \n \n (\n \n \n history.push(`${props.href}`)}\n >\n NOVO\n \n \n \n )}\n />\n \n
\n {props.length !== undefined && props.length !== 0 ? (\n
\n \n Total de dados encontrados: {props.length} \n \n \n ) : (\n
\n {'Nenhum dado encontrado.'} \n \n )}\n
\n )\n}\n\nTitleContent.propTypes = {\n title: PropTypes.string.isRequired,\n subTitle: PropTypes.string,\n buttonOnClick: PropTypes.object.isRequired,\n rule: PropTypes.string\n}\nexport default TitleContent\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Button, Grid, Typography } from '@material-ui/core'\nimport Image from 'material-ui-image'\nimport { history } from 'utils'\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(6),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(3) },\n button: {\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstTiposIngresso = () => {\n const classes = useStyles()\n const handleClickContaBancaria = () => {\n history.push(`/tipoIngresso`) //history.push(`/contaBancaria`)\n }\n return (\n \n \n \n \n \n \n \n Você ainda não cadastrou nenhum tipo de ingresso\n \n \n \n \n Cadastrar agora!\n \n \n \n
\n )\n}\n\nexport default EmptyFirstTiposIngresso\n","import React, { useEffect } from 'react'\nimport { connect, useDispatch } from 'react-redux'\nimport { tipoIngressoAction } from '../../_actions'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport Skeleton from '@material-ui/lab/Skeleton'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport { Page } from 'components'\nimport EmptyFirstTiposIngresso from './EmptyFirstTiposIngresso/EmptyFirstTiposIngresso'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nconst TipoIngresso = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const { tipoIngresso } = props.tipoIngresso\n\n useEffect(() => {\n dispatch(\n tipoIngressoAction.getTipoIngressoByEstabelecimento(\n props.usuarioEstabelecimento.estabelecimentoId\n )\n )\n }, [dispatch, props.usuarioEstabelecimento.estabelecimentoId])\n\n const handleClick = (id) => {\n confirm({\n title: 'Você deseja excluir este Tipo de Ingresso?',\n description:\n 'Confirmando essa operação, você não poderá cadastrar novos lotes com este tipo de ingresso.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(tipoIngressoAction.deleteTipoIngressoById(id))\n })\n }\n\n return (\n \n (\n \n {undefined !== tipoIngresso && tipoIngresso.length > 0 ? (\n
\n ) : (\n
\n )}\n {!props.tipoIngresso.isLoading ? (\n undefined !== tipoIngresso && tipoIngresso.length > 0 ? (\n
\n \n \n \n Descrição \n Ações \n \n \n \n {tipoIngresso.map((n) => {\n return (\n \n \n {n.descricao}\n \n \n (\n \n history.push(`/tipoIngresso/${n.id}`)\n }\n >\n \n \n \n \n )}\n />\n (\n handleClick(n.id)}\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}\nTipoIngresso.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return {\n tipoIngresso: state.tipoIngresso,\n usuarioEstabelecimento: state.usuarioEstabelecimento\n }\n}\nconst connectedTipoIngressoPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(TipoIngresso))\n)\nexport { connectedTipoIngressoPage as TipoIngresso }\n","import React, { useEffect } from 'react'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Divider,\r\n Button,\r\n Grid,\r\n InputAdornment\r\n} from '@material-ui/core'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { tipoIngressoAction } from '../../_actions'\r\nimport { history } from '../../utils'\r\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\r\nimport { Page } from 'components'\r\nimport constants from 'theme/constants'\r\n\r\nconst MAX_LENGTH = 50\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(2)\r\n },\r\n paper: {\r\n ...constants.shadowCard\r\n }\r\n}))\r\n\r\nconst TipoIngressoEdit = (props) => {\r\n const dispatch = useDispatch()\r\n const classes = useStyles()\r\n const { tipoIngresso, usuarioEstabelecimento } = useSelector((state) => state)\r\n const {\r\n match: { params }\r\n } = props\r\n\r\n useEffect(() => {\r\n if (params.id) {\r\n dispatch(tipoIngressoAction.getTipoIngressoById(params.id))\r\n }\r\n }, [])\r\n\r\n const handleChange = (prop) => (event) => {\r\n if (event?.target?.value?.length <= MAX_LENGTH) {\r\n dispatch(tipoIngressoAction.onChangeProps(prop, event))\r\n }\r\n }\r\n\r\n const handleSubmit = (event) => {\r\n event.preventDefault()\r\n\r\n let payload = {\r\n id: params.id,\r\n descricao: tipoIngresso.descricao,\r\n estabelecimentoId: usuarioEstabelecimento.estabelecimentoId\r\n }\r\n\r\n if (params.id) {\r\n dispatch(tipoIngressoAction.editTipoIngressoInfo(params.id, payload))\r\n } else {\r\n dispatch(tipoIngressoAction.createTipoIngresso(payload, true))\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {params.id\r\n ? 'Editar Tipo de Ingresso'\r\n : 'Novo Tipo de Ingresso'}\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n = MAX_LENGTH\r\n ? 'error'\r\n : undefined\r\n }\r\n >\r\n {tipoIngresso?.descricao?.length}/{MAX_LENGTH}\r\n \r\n \r\n >\r\n )\r\n }}\r\n />\r\n \r\n \r\n \r\n history.push('/tipoIngressos')}\r\n color=\"secondary\"\r\n variant=\"outlined\"\r\n >\r\n Cancelar\r\n \r\n \r\n {params.id ? 'Atualizar' : 'Salvar'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default TipoIngressoEdit\r\n","import brLocale from 'date-fns/locale/pt-BR'\r\nimport { format, isSameDay } from 'date-fns'\r\nimport { createDynamicLink } from '_services/firebaseDynamicLinks'\r\nimport toISODateFormat from './toISODateFormat'\r\nimport { Evento, CupomDesconto, Estabelecimento } from '../types/api'\r\n\r\nconst dateFormatted = (dataHoraInicio: string, dataHoraFim: string) => {\r\n if (isSameDay(new Date(dataHoraInicio), new Date(dataHoraFim))) {\r\n return `${format(\r\n new Date(dataHoraInicio),\r\n `eee, d 'de' MMMM 'de' yyyy 'às' H:mm`,\r\n {\r\n locale: brLocale\r\n }\r\n )} até ${format(new Date(dataHoraFim), `H:mm`, {\r\n locale: brLocale\r\n })}`\r\n } else {\r\n return `Começa: ${format(\r\n new Date(dataHoraInicio),\r\n `eee, d 'de' MMMM 'de' yyyy 'às' H:mm`,\r\n {\r\n locale: brLocale\r\n }\r\n )} - Termina: ${format(\r\n new Date(dataHoraFim),\r\n `eee, d 'de' MMMM 'de' yyyy 'às' H:mm`,\r\n {\r\n locale: brLocale\r\n }\r\n )}`\r\n }\r\n}\r\n\r\nexport const onShare = async (event: Evento) => {\r\n if (undefined === event) return\r\n const dynamicLink = await createDynamicLink({\r\n dynamicLinkInfo: {\r\n domainUriPrefix: 'corujas.page.link',\r\n link: `https://corujasapp.com/event-details/${event.id}`,\r\n androidInfo: {\r\n androidPackageName: 'com.quintos.corujas',\r\n androidMinPackageVersionCode: '1'\r\n },\r\n iosInfo: {\r\n iosBundleId: 'com.quintos.corujas',\r\n iosAppStoreId: '1593667736',\r\n iosFallbackLink: `https://corujasapp.com/event-details/${event.id}`\r\n },\r\n navigationInfo: {\r\n enableForcedRedirect: true\r\n },\r\n socialMetaTagInfo: {\r\n socialTitle: !!event && event.nome.toUpperCase(),\r\n socialDescription:\r\n event &&\r\n event.dataHoraInicio &&\r\n dateFormatted(\r\n //@ts-ignore\r\n toISODateFormat(event.dataHoraInicio),\r\n toISODateFormat(event.dataHoraFim)\r\n ),\r\n socialImageLink: !!event && event.imagem\r\n }\r\n },\r\n suffix: {\r\n option: 'SHORT'\r\n }\r\n })\r\n\r\n const link =\r\n // dynamicLink ||\r\n `https://corujasapp.com/event-details/${event.id}`\r\n\r\n return link\r\n}\r\n\r\nexport const shareEventCouponCode = async (\r\n event: Evento,\r\n couponCode: CupomDesconto\r\n) => {\r\n if (undefined === event) return\r\n const dynamicLink = await createDynamicLink({\r\n dynamicLinkInfo: {\r\n domainUriPrefix: 'corujas.page.link',\r\n link: `https://corujasapp.com/event-details/${event.id}?couponCode=${couponCode.codigo}`,\r\n androidInfo: {\r\n androidPackageName: 'com.quintos.corujas',\r\n androidMinPackageVersionCode: '1',\r\n androidFallbackLink: `https://corujasapp.com/event-details/${event.id}?couponCode=${couponCode.codigo}`\r\n },\r\n iosInfo: {\r\n iosBundleId: 'com.quintos.corujas',\r\n iosAppStoreId: '1593667736',\r\n iosFallbackLink: `https://corujasapp.com/event-details/${event.id}?couponCode=${couponCode.codigo}`\r\n },\r\n navigationInfo: {\r\n enableForcedRedirect: true\r\n },\r\n socialMetaTagInfo: {\r\n socialTitle: event?.nome?.toUpperCase() || undefined,\r\n socialDescription:\r\n event?.dataHoraInicio &&\r\n event?.dataHoraFim &&\r\n dateFormatted(\r\n String(event?.dataHoraInicio),\r\n String(event?.dataHoraFim)\r\n ),\r\n socialImageLink: event?.imagem\r\n }\r\n },\r\n suffix: {\r\n option: 'SHORT'\r\n }\r\n })\r\n\r\n const link =\r\n // dynamicLink ||\r\n `https://corujasapp.com/event-details/${event.id}?couponCode=${couponCode.codigo}`\r\n\r\n return link\r\n}\r\n\r\nexport const onShareEstablishment = async (establishment: Estabelecimento) => {\r\n if (undefined === establishment) return\r\n const dynamicLink = await createDynamicLink({\r\n dynamicLinkInfo: {\r\n domainUriPrefix: 'corujas.page.link',\r\n link: `https://corujasapp.com/estabelecimento-profile/${establishment.id}`,\r\n androidInfo: {\r\n androidPackageName: 'com.quintos.corujas',\r\n androidMinPackageVersionCode: '1'\r\n },\r\n iosInfo: {\r\n iosBundleId: 'com.quintos.corujas',\r\n iosAppStoreId: '1593667736',\r\n iosFallbackLink: `https://corujasapp.com/estabelecimento-profile/${establishment.id}`\r\n },\r\n navigationInfo: {\r\n enableForcedRedirect: true\r\n },\r\n socialMetaTagInfo: {\r\n socialTitle: `${establishment.nome.toUpperCase()} (@${\r\n establishment.username\r\n })`,\r\n socialDescription: establishment.detalhes,\r\n socialImageLink: !!establishment && establishment.imagem\r\n }\r\n },\r\n suffix: {\r\n option: 'SHORT'\r\n }\r\n })\r\n const link =\r\n dynamicLink ||\r\n `https://corujasapp.com/estabelecimento-profile/${establishment.id}`\r\n\r\n return link\r\n}\r\n","import React, { useCallback, useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\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'\nimport Button from '@material-ui/core/Button'\nimport Typography from '@material-ui/core/Typography'\nimport { eventoAction } from '../../../../_actions'\nimport {\n LoteList,\n LoteEdit,\n EventoEditForm,\n EventoSummary\n} from '../../components'\nimport Grid from '@material-ui/core/Grid'\nimport { history } from '../../../../utils'\nimport { toast } from 'react-toastify'\nimport { toISODateFormat } from 'utils'\nimport { Header, Page } from 'components'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport EventTwoToneIcon from '@material-ui/icons/EventTwoTone'\nimport ConfirmationNumberTwoToneIcon from '@material-ui/icons/ConfirmationNumberTwoTone'\nimport AddToQueueTwoToneIcon from '@material-ui/icons/AddToQueueTwoTone'\nimport StepConnector from '@material-ui/core/StepConnector'\nimport { Box, Paper, StepButton } from '@material-ui/core'\nimport SocialShare from 'components/Share/Share'\nimport { onShare } from 'utils/linkShare'\nimport constants from 'theme/constants'\n\nconst ColorlibConnector = withStyles({\n alternativeLabel: {\n top: 22\n },\n active: {\n '& $line': {\n backgroundImage:\n 'linear-gradient( 95deg,#f7ac52 0%, rgba(225, 194, 10, 0.8) 80%,rgba(3, 5, 23, 1) 100%)'\n }\n },\n completed: {\n '& $line': {\n backgroundImage:\n 'linear-gradient( 95deg,#f7ac52 0%, rgba(225, 194, 10, 0.8) 80%,rgba(3, 5, 23, 1) 100%)'\n }\n },\n line: {\n height: 3,\n border: 0,\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: 50,\n height: 50,\n display: 'flex',\n borderRadius: '50%',\n justifyContent: 'center',\n alignItems: 'center'\n },\n active: {\n backgroundImage:\n 'linear-gradient( 136deg, #f7ac52 0%, rgba(225, 194, 10, 0.8) 50%, rgba(225, 194, 10, 1) 100%)',\n boxShadow: '0 4px 10px 0 rgba(0,0,0,.25)'\n },\n completed: {\n backgroundImage:\n 'linear-gradient( 136deg, #f7ac52 0%, rgba(225, 194, 10, 0.8) 50%, rgba(225, 194, 10, 1) 100%)'\n }\n})\n\nfunction ColorlibStepIcon(props) {\n const classes = useColorlibStepIconStyles()\n const { active, completed } = props\n\n const icons = {\n 1: ,\n 2: ,\n 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 padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n },\n header: {\n marginBottom: theme.spacing(3)\n },\n button: {\n display: 'flex',\n justifyContent: 'center'\n },\n backButton: {\n marginRight: theme.spacing(2)\n },\n instructions: {\n textAlign: 'center',\n alignItems: 'center',\n justifyContent: 'center',\n marginTop: theme.spacing(3),\n marginBottom: theme.spacing(1)\n },\n imageGooglePlay: {\n width: '160px',\n height: 'auto'\n },\n imageAppStore: {\n width: '145px',\n height: 'auto'\n },\n containerAppValidate: {\n marginBottom: theme.spacing(3)\n }\n}))\n\nfunction getSteps() {\n return ['Dados do evento', 'Gerenciar lotes', 'Resumo final']\n}\n\nfunction getStepContent(stepIndex) {\n switch (stepIndex) {\n case 0:\n return \n case 1:\n return (\n \n \n
\n )\n case 2:\n return \n default:\n return 'Etapa desconhecida'\n }\n}\n\nconst Steppers = (props) => {\n const classes = useStyles()\n const steps = getSteps()\n const {\n match: { params }\n } = props\n const dispatch = useDispatch()\n const activeStep = useSelector((state) => state.evento.activeStep)\n const evento = useSelector((state) => state.evento)\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const [link, setLink] = useState('')\n\n const generateLink = useCallback(async () => {\n let link = await onShare(evento)\n setLink(link)\n }, [evento])\n\n useEffect(() => {\n if (activeStep === 3) {\n generateLink()\n }\n }, [activeStep, generateLink])\n\n const handleNext = () => {\n if (activeStep === 1) {\n dispatch(eventoAction.setNextStep())\n } else if (activeStep === 2) {\n if (params.id) {\n toast.success(\n 'Feito! Os dados do evento foram alterados com sucesso! 🎉🧡'\n )\n dispatch(eventoAction.setNextStep())\n } else {\n dispatch(eventoAction.createEvento(generatePayload()))\n }\n }\n }\n\n const setActiveStep = (step) => () => {\n dispatch(eventoAction.setStep(step))\n }\n\n const generatePayload = () => {\n let payload = {\n id: evento.id,\n nome: evento.nome,\n imagem: evento.imagem,\n estabelecimentoId: usuarioEstabelecimento.estabelecimentoId,\n detalhes: evento.detalhes,\n dataHoraInicio: toISODateFormat(evento.dataHoraInicio),\n dataHoraFim: toISODateFormat(evento.dataHoraFim),\n categoriaId: evento.categoriaId,\n disponivel: evento.disponivel,\n cidadeId: evento.cidadeId,\n slug: evento.slug,\n endereco: evento.endereco,\n cep: evento.cep,\n bairro: evento.bairro,\n latLon: evento.latLon,\n tipoLocalizacao: evento.tipoLocalizacao,\n nomeLocal: evento.nomeLocal,\n complemento: evento.complemento,\n numero: evento.numero,\n eventoHashtag: evento.eventoHashtag\n }\n if (!params.id) {\n let lote = evento.lote\n lote.forEach((loteItem) => {\n delete loteItem.id\n })\n payload = { ...payload, lote: lote, id: 0 }\n }\n return payload\n }\n\n const handleBack = () => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n if (activeStep === 0) {\n history.push('/eventos')\n } else {\n dispatch(eventoAction.setPrevStep())\n }\n }\n\n const handleReset = () => {\n dispatch(eventoAction.prepareStateToNewEvento())\n }\n\n return (\n \n \n
\n \n 0}\n activeStep={activeStep}\n connector={ }\n >\n {steps.map((label, index) => (\n \n 0)}\n onClick={setActiveStep(index)}\n >\n \n {label}\n \n \n \n ))}\n \n \n {activeStep === steps.length ? (\n
\n
\n Todos os dados deste evento foram salvos! 😄\n \n
\n Compartilhe o link para o evento nas redes sociais!\n {\n navigator.clipboard.writeText(link)\n toast.success(\n 'Link para o evento copiado com sucesso! 🎉',\n {\n autoClose: 4000,\n toastId: 'eventocopiadolink'\n }\n )\n }}\n >\n {link}\n \n \n
\n \n \n
\n \n \n Para ler os ingressos no dia do evento baixe o nosso app\n validador de ingressos!\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n history.push('/eventos')}\n variant=\"contained\"\n style={{ marginRight: 10 }}\n >\n Ver lista de eventos\n \n \n Novo evento\n \n \n
\n ) : (\n
\n {getStepContent(activeStep)} \n \n \n Voltar\n \n \n {activeStep === steps.length - 1\n ? 'Finalizar'\n : activeStep === 0\n ? params.id && params.id > 0\n ? 'Salvar'\n : 'Próxima etapa'\n : 'Revisão final'}\n \n \n
\n )}\n
\n \n
\n \n )\n}\nexport default Steppers\n","import React from 'react'\n// import { makeStyles } from '@material-ui/styles';\nimport { Grid, Typography, Button } from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport clsx from 'clsx'\nimport { AccessControl } from '../components/Utils/AccessControl'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst TitleContentEvent = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n return (\n \n
\n \n \n {props.subTitle}\n \n \n {props.title}\n \n \n (\n \n \n props.onClick}\n >\n NOVO\n \n \n \n )}\n />\n \n
\n {props.length !== undefined && props.length !== 0 && (\n
\n \n Total de dados encontrados: {props.length} \n \n \n )}\n
\n )\n}\n\nTitleContentEvent.propTypes = {\n title: PropTypes.string.isRequired,\n subTitle: PropTypes.string,\n buttonOnClick: PropTypes.object.isRequired,\n rule: PropTypes.string\n}\nexport default TitleContentEvent\n","import React, { useEffect } from 'react'\nimport { eventoAction } from '../../../../../../_actions'\nimport { useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n Typography,\n Link\n} from '@material-ui/core'\nimport DeleteIconRoundedIcon from '@material-ui/icons/DeleteRounded'\nimport EditIconRoundedIcon from '@material-ui/icons/EditRounded'\nimport { useConfirm } from 'material-ui-confirm'\nimport FileCopyRoundedIcon from '@material-ui/icons/FileCopyRounded'\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\nimport EventBusyTwoToneIcon from '@material-ui/icons/EventBusyTwoTone'\nimport { history, toLocalDateFormat } from 'utils'\nimport PieChartRoundedIcon from '@material-ui/icons/PieChartRounded'\nimport ShareIcon from '@material-ui/icons/Share'\nimport { makeStyles } from '@material-ui/styles'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { MessageData, SkeletonTable } from 'components'\nimport { onShare } from 'utils/linkShare'\nimport { toast } from 'react-toastify'\nimport constants from 'theme/constants'\nimport GroupAddRoundedIcon from '@material-ui/icons/GroupAddRounded'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n }\n}))\n\nconst FutureEvents = () => {\n const classes = useStyles()\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { evento: eventos, isLoading } = useSelector((state) => state.evento)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n\n const handleClickDuplicate = (eventoId) => {\n confirm({\n title: 'Você deseja duplicar esse evento?',\n description: (\n \n \n Todos os dados serão copiados e você só precisa realizar as\n alterações necessárias.\n \n \n Obs: O evento só é salvo no final do processo.\n \n
\n ),\n confirmationText: 'Sim, duplicar!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(eventoAction.duplicateEvento(eventoId))\n })\n }\n\n const handleClickEditEvento = (eventoId) => {\n dispatch(eventoAction.prepareStateToEditEvento(eventoId))\n }\n\n const handleClick = (id) => {\n confirm({\n title: 'Você deseja excluir este Evento?',\n description:\n 'Confirmando essa operação, seu evento não aparecerá mais no site da Corujas.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(eventoAction.deleteEventoById(id))\n })\n }\n\n const handleClickGenerateTicketsToMembers = (eventId) => {\n confirm({\n title:\n 'Você deseja gerar os ingressos, para os membros ativos, para este Evento?',\n confirmationText: 'Sim, gerar!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(eventoAction.generateTicketsToMembers(eventId))\n })\n }\n\n useEffect(() => {\n dispatch(eventoAction.getEventoByEstabelecimento(estabelecimentoId, false))\n }, [dispatch, estabelecimentoId])\n\n const handleClickNewEvento = () => {\n dispatch(eventoAction.prepareStateToNewEvento())\n }\n\n return (\n <>\n {isLoading ? (\n \n ) : eventos.length === 0 ? (\n \n ) : (\n \n \n \n \n Nome do evento \n Data de início \n Data de término \n Disponível \n Ações \n \n \n \n {eventos.map((n) => {\n return (\n \n \n \n \n history.push(`/evento/dashboard/${n.id}`, null)\n }\n >\n {n.nome}\n \n \n \n \n {toLocalDateFormat(n.dataHoraInicio)}\n \n \n {toLocalDateFormat(n.dataHoraFim)}\n \n \n {n.disponivel ? (\n \n ) : (\n \n )}\n \n\n \n (\n \n \n handleClickGenerateTicketsToMembers(n.id)\n }\n >\n \n \n \n )}\n />\n \n history.push(`/evento/dashboard/${n.id}`, null)\n }\n >\n \n \n \n \n {\n const link = await onShare({\n ...n,\n dataHoraInicio: toLocalDateFormat(n.dataHoraInicio),\n dataHoraFim: toLocalDateFormat(n.dataHoraFim)\n })\n navigator.clipboard.writeText(link)\n toast.success(\n 'Link para o evento copiado com sucesso! 🎉',\n {\n autoClose: 4000\n }\n )\n }}\n >\n \n \n \n \n (\n \n handleClickDuplicate(n.id)}\n >\n \n \n \n )}\n />\n (\n handleClickEditEvento(n.id)}\n >\n \n \n \n \n )}\n />\n (\n handleClick(n.id)}\n >\n \n \n \n \n )}\n />\n \n \n )\n })}\n \n
\n \n )}\n >\n )\n}\n\nFutureEvents.propTypes = {\n className: PropTypes.string\n}\n\nexport default FutureEvents\n","import React, { useEffect } from 'react'\nimport { eventoAction } from '../../../../../../_actions'\nimport { useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n Typography,\n Link\n} from '@material-ui/core'\nimport { useConfirm } from 'material-ui-confirm'\nimport FileCopyRoundedIcon from '@material-ui/icons/FileCopyRounded'\nimport { history, toLocalDateFormat } from 'utils'\nimport PieChartRoundedIcon from '@material-ui/icons/PieChartRounded'\nimport { makeStyles } from '@material-ui/styles'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { MessageData, SkeletonTable } from 'components'\nimport constants from 'theme/constants'\nimport AddPhotoAlternateRoundedIcon from '@material-ui/icons/AddPhotoAlternateRounded'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n }\n}))\n\nconst PastEvents = () => {\n const classes = useStyles()\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { evento: eventos, isLoading } = useSelector((state) => state.evento)\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n\n const handleClickDuplicate = (eventoId) => {\n confirm({\n title: 'Você deseja duplicar esse evento?',\n description: (\n \n \n Todos os dados serão copiados e você só precisa realizar as\n alterações necessárias.\n \n \n Obs: O evento só é salvo no final do processo.\n \n
\n ),\n confirmationText: 'Sim, duplicar!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(eventoAction.duplicateEvento(eventoId))\n })\n }\n\n useEffect(() => {\n dispatch(eventoAction.getEventoByEstabelecimento(estabelecimentoId, true))\n }, [dispatch, estabelecimentoId])\n\n const handleClickNewEvento = () => {\n dispatch(eventoAction.prepareStateToNewEvento())\n }\n\n return (\n <>\n {isLoading ? (\n \n ) : eventos.length === 0 ? (\n \n ) : (\n \n \n \n \n Nome do evento \n Data de início \n Data de término \n Ações \n \n \n \n {eventos.map((n) => {\n return (\n \n \n \n \n history.push(`/evento/dashboard/${n.id}`, null)\n }\n >\n {n.nome}\n \n \n \n \n {toLocalDateFormat(n.dataHoraInicio)}\n \n \n {toLocalDateFormat(n.dataHoraFim)}\n \n \n \n history.push(\n `/photoAlbum/cadastro/evento/${n.id}`,\n null\n )\n }\n >\n \n \n \n \n \n history.push(`/evento/dashboard/${n.id}`, null)\n }\n >\n \n \n \n \n (\n \n handleClickDuplicate(n.id)}\n >\n \n \n \n )}\n />\n \n \n )\n })}\n \n
\n \n )}\n >\n )\n}\n\nPastEvents.propTypes = {\n className: PropTypes.string\n}\n\nexport default PastEvents\n","import React from 'react'\nimport { eventoAction } from '../../../../_actions'\nimport { connect, useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { Tabs, Tab, useMediaQuery, useTheme } from '@material-ui/core'\nimport { Redirect } from 'react-router-dom'\nimport { withStyles } from '@material-ui/core/styles'\nimport { withRouter } from 'react-router-dom'\nimport TitleContentEvent from '../../../TitleContentEvent'\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\nimport EventTwoToneIcon from '@material-ui/icons/EventTwoTone'\nimport { Page } from 'components'\nimport { FutureEvents, PastEvents } from './components'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: { marginBottom: theme.spacing(4) }\n})\n\nconst EventoList = (props) => {\n const dispatch = useDispatch()\n const { classes, match, history } = props\n const { tab } = match.params\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const { evento: events } = useSelector((state) => state.evento)\n\n const handleClickNewEvento = () => {\n dispatch(eventoAction.prepareStateToNewEvento())\n }\n\n const handleTabsChange = (event, value) => {\n history.push(value)\n }\n\n const tabs = [\n {\n value: 'futureEvents',\n label: 'Eventos Futuros',\n icon: \n }\n ]\n {\n tabs.push({\n value: 'pastEvents',\n label: 'Eventos Realizados',\n icon: \n })\n }\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n \n {undefined !== events && events.length > 0 ? (\n \n ) : (\n \n )}\n \n {tabs.map((tab) => (\n \n ))}\n \n \n {tab === 'futureEvents' &&
}\n {tab === 'pastEvents' &&
}\n
\n \n )\n}\n\nEventoList.propTypes = {\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired\n}\n\nconst connectedEventoPage = withRouter(\n connect(null, null, null, {\n pure: false\n })(withStyles(styles)(EventoList))\n)\n\nexport { connectedEventoPage as EventoList }\n","import React from 'react'\r\nimport Table from '@material-ui/core/Table'\r\nimport Tooltip from '@material-ui/core/Tooltip'\r\nimport TableBody from '@material-ui/core/TableBody'\r\nimport TableCell from '@material-ui/core/TableCell'\r\nimport TableContainer from '@material-ui/core/TableContainer'\r\nimport TableHead from '@material-ui/core/TableHead'\r\nimport TableRow from '@material-ui/core/TableRow'\r\nimport Paper from '@material-ui/core/Paper'\r\nimport PropTypes from 'prop-types'\r\nimport { withStyles } from '@material-ui/core/styles'\r\nimport Typography from '@material-ui/core/Typography'\r\nimport { Grid, useTheme } from '@material-ui/core'\r\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\r\nimport EventBusyTwoToneIcon from '@material-ui/icons/EventBusyTwoTone'\r\nimport { connect, useDispatch, useSelector } from 'react-redux'\r\nimport { loteAction, eventoAction } from '_actions'\r\nimport { useParams, withRouter } from 'react-router-dom'\r\nimport {\r\n Delete as DeleteIcon,\r\n Edit as EditIcon,\r\n ControlPointDuplicate as ControlPointDuplicateIcon\r\n} from '@material-ui/icons'\r\nimport IconButton from '@material-ui/core/IconButton'\r\nimport CheckRoundedIcon from '@material-ui/icons/CheckRounded'\r\nimport CloseRoundedIcon from '@material-ui/icons/CloseRounded'\r\nimport { useConfirm } from 'material-ui-confirm'\r\nimport { toLocalDateFormat } from 'utils'\r\nimport constants from 'theme/constants'\r\nimport { AccessControl } from 'components/Utils'\r\nimport { useQueryClient } from 'react-query'\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n padding: theme.spacing(2, 0, 4, 0)\r\n },\r\n paper: {\r\n ...constants.shadowCard\r\n }\r\n})\r\n\r\nconst LoteList = (props) => {\r\n const queryClient = useQueryClient()\r\n const confirm = useConfirm()\r\n const dispatch = useDispatch()\r\n const { estabelecimentoId } = useSelector((state) => state.evento)\r\n const { classes } = props\r\n let { id } = useParams()\r\n const theme = useTheme()\r\n const convertGenero = (genero) => {\r\n switch (genero) {\r\n case 'M':\r\n return 'Masculino'\r\n case 'F':\r\n return 'Feminino'\r\n case 'U':\r\n return 'Unissex'\r\n default:\r\n return ''\r\n }\r\n }\r\n\r\n const findDescricaoTipoIngresso = (id) => {\r\n if (props.tipoIngresso && props.tipoIngresso.length > 0) {\r\n var item = props.tipoIngresso.find((item) => item.id === id)\r\n return item && item.descricao ? item.descricao : ''\r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n const handleClickEdit = (lote) => {\r\n dispatch(loteAction.editLotesDetails(lote))\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n }\r\n\r\n const handleClickDuplicate = (lote) => {\r\n dispatch(loteAction.editLotesDetails({ ...lote, id: 0 }))\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n }\r\n\r\n const handleClickDelete = (loteId) => {\r\n confirm({\r\n title: 'Você deseja excluir este Lote?',\r\n description:\r\n 'Confirmando essa operação, este lote não aparecerá mais no site da Corujas.',\r\n confirmationText: 'Sim, excluir!',\r\n cancellationText: 'Nãããoo!'\r\n }).then(() => {\r\n if (id) {\r\n dispatch(loteAction.deleteLoteById(loteId, id))\r\n } else {\r\n dispatch(eventoAction.deleteLoteLocaleById(loteId))\r\n }\r\n })\r\n }\r\n\r\n // Retornar nome do Plano\r\n const getPlanNameById = (planId) => {\r\n const plans = queryClient.getQueryData([\r\n 'establishmentPlansSelect',\r\n estabelecimentoId\r\n ])\r\n\r\n if (!plans || !Array.isArray(plans)) {\r\n console.error('Plans data is not available or invalid:', plans)\r\n return ''\r\n }\r\n\r\n const plan = plans.find((plan) => plan?.id === planId)\r\n\r\n return plan?.text || ''\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {'Lista de Lotes'} \r\n \r\n \r\n {props.lote.length !== 0 ? (\r\n \r\n \r\n Total de Lotes encontrados: {props.lote.length} \r\n \r\n \r\n ) : null}\r\n \r\n {props.lote.length !== 0 ? (\r\n \r\n \r\n \r\n \r\n \r\n Descrição - Tipo Ingresso\r\n \r\n Sexo \r\n Valor (R$) \r\n Repassar Taxa \r\n Quantidade \r\n Limite Quantidade \r\n Data Início \r\n Data Término \r\n Disponível \r\n Check-In }\r\n />\r\n {props.actions ? (\r\n Ações \r\n ) : null}\r\n \r\n \r\n \r\n {props.lote.map((row) => {\r\n if (row.excluido === true) {\r\n return null\r\n } else {\r\n return (\r\n \r\n \r\n {row.descricao}\r\n {' - '}\r\n {id\r\n ? row.tipoIngresso.descricao\r\n : findDescricaoTipoIngresso(row.tipoIngressoId)}\r\n \r\n \r\n {row.genero ? (\r\n \r\n {row.genero.toUpperCase()} \r\n \r\n ) : (\r\n \r\n {'-'} \r\n \r\n )}\r\n \r\n \r\n {row.valor === 0\r\n ? 'Gratuito'\r\n : Intl.NumberFormat('pt-BR', {\r\n style: 'currency',\r\n currency: 'BRL'\r\n }).format(row.valor)}\r\n \r\n \r\n {row.valor === 0 ? (\r\n 'Não possui taxa'\r\n ) : row.repassarTaxa === true ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n {row.quantidade} \r\n \r\n {!row.limiteQuantidadePedido\r\n ? '-'\r\n : row.limiteQuantidadePedido}\r\n \r\n \r\n {toLocalDateFormat(row.dataHoraInicio)}\r\n \r\n \r\n {toLocalDateFormat(row.dataHoraTermino)}\r\n \r\n\r\n \r\n {row.disponivel ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n\r\n (\r\n \r\n {row.checkIn ? (\r\n \r\n \r\n \r\n ) : (\r\n '-'\r\n )}\r\n \r\n )}\r\n />\r\n\r\n {props.actions ? (\r\n \r\n \r\n handleClickDuplicate(row)}\r\n >\r\n \r\n \r\n \r\n \r\n handleClickEdit(row)}\r\n >\r\n \r\n \r\n \r\n \r\n handleClickDelete(row.id)}\r\n >\r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n )\r\n }\r\n })}\r\n \r\n
\r\n \r\n ) : (\r\n \r\n {'Nenhum Lote encontrado!'} \r\n \r\n )}\r\n \r\n )\r\n}\r\nLoteList.propTypes = {\r\n classes: PropTypes.object.isRequired\r\n}\r\nconst mapStateToProps = (state) => {\r\n return {\r\n lote: state.evento.lote,\r\n tipoIngresso: state.tipoIngresso.tipoIngresso\r\n }\r\n}\r\n\r\nconst connectedLoteListPage = withRouter(\r\n connect(mapStateToProps, null, null, {\r\n pure: false\r\n })(withStyles(styles)(LoteList))\r\n)\r\nexport { connectedLoteListPage as LoteList }\r\n","import React from 'react'\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n InputAdornment,\r\n TextField,\r\n Typography\r\n} from '@material-ui/core'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { loteAction, tipoIngressoAction } from '_actions'\r\n\r\nconst MAX_LENGTH = 50\r\n\r\nconst ModalAddTipoDeIngresso = () => {\r\n const dispatch = useDispatch()\r\n const { tipoIngresso, usuarioEstabelecimento } = useSelector((state) => state)\r\n const open = useSelector((state) => state.lote.openModalTipoDeIngresso)\r\n\r\n const handleClose = () => {\r\n dispatch(loteAction.openModalTipoDeIngresso(false))\r\n }\r\n const handleChange = (prop) => (event) => {\r\n if (event?.target?.value?.length <= MAX_LENGTH) {\r\n dispatch(tipoIngressoAction.onChangeProps(prop, event))\r\n }\r\n }\r\n const handleSubmit = (event) => {\r\n event.preventDefault()\r\n let payload = {\r\n id: 0,\r\n descricao: tipoIngresso.descricao,\r\n estabelecimentoId: usuarioEstabelecimento.estabelecimentoId\r\n }\r\n dispatch(tipoIngressoAction.createTipoIngresso(payload))\r\n dispatch(loteAction.openModalTipoDeIngresso(false))\r\n }\r\n\r\n return (\r\n \r\n \r\n Adicionar novo Tipo de Ingresso\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ModalAddTipoDeIngresso\r\n","import React, { useEffect, useState } from 'react'\r\nimport { loteAction, eventoAction, tipoIngressoAction } from '_actions'\r\nimport MenuItem from '@material-ui/core/MenuItem'\r\nimport { toISODateFormat, validateDatesLote } from 'utils'\r\nimport AddCircleTwoToneIcon from '@material-ui/icons/AddCircleTwoTone'\r\nimport {\r\n ValidatorForm,\r\n TextValidator,\r\n SelectValidator\r\n} from 'react-material-ui-form-validator'\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Divider,\r\n Grid,\r\n Button,\r\n FormControlLabel,\r\n makeStyles,\r\n InputAdornment,\r\n Chip,\r\n Switch,\r\n Tooltip,\r\n FormControl,\r\n InputLabel,\r\n Select,\r\n Typography,\r\n Box\r\n} from '@material-ui/core'\r\nimport { uniqueId } from 'lodash'\r\nimport { HelperToolTip, ValidatedDatePicker } from 'components'\r\nimport { toast } from 'react-toastify'\r\nimport { isValid } from 'date-fns'\r\nimport { ModalAddTipoDeIngresso } from './components'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { useParams } from 'react-router-dom'\r\nimport constants from 'theme/constants'\r\nimport { colors } from 'material-ui/styles'\r\nimport { useEstablishmentPlansSelect } from 'hooks-querys'\r\nimport { AccessControl } from 'components/Utils'\r\n\r\nconst LOTE_DESCRICAO_MAX_LENGTH = 50\r\n\r\nconst drawerWidth = 240\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(4, 0, 0, 0)\r\n },\r\n contentRoot: {\r\n ...theme.mixins.gutters(),\r\n paddingTop: theme.spacing.unit * 2,\r\n paddingBottom: theme.spacing.unit * 2\r\n },\r\n paper: {\r\n ...constants.shadowCard\r\n },\r\n drawerPaper: {\r\n position: 'relative',\r\n width: drawerWidth\r\n },\r\n backButton: {\r\n marginRight: theme.spacing(1)\r\n },\r\n button: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n padding: theme.spacing(1)\r\n },\r\n margin: {\r\n '& > *': {\r\n marginRight: theme.spacing(1)\r\n }\r\n },\r\n input: {\r\n display: 'flex'\r\n }\r\n}))\r\nconst LoteEdit = () => {\r\n const { lote, usuarioEstabelecimento } = useSelector((state) => state)\r\n const { tipoIngresso } = useSelector((state) => state.tipoIngresso)\r\n const repassarTaxaEstabelecimento = useSelector(\r\n (state) => state.estabelecimento.repassarTaxa\r\n )\r\n const dispatch = useDispatch()\r\n const classes = useStyles()\r\n let { id } = useParams()\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const {\r\n isLoading: isLoadingPlans,\r\n data: plans\r\n } = useEstablishmentPlansSelect(estabelecimentoId)\r\n\r\n const handleChange = (prop) => (event) => {\r\n if (prop === 'descricao') {\r\n if (event?.target?.value?.length <= LOTE_DESCRICAO_MAX_LENGTH) {\r\n dispatch(loteAction.onChangeProps(prop, event))\r\n }\r\n } else if (prop == 'checkIn') {\r\n // handleSwitchValor()\r\n if (lote.checkIn == false) {\r\n lote.valor = 0\r\n } else if (lote.checkIn == true) {\r\n lote.planoId = null\r\n lote.valor = ''\r\n }\r\n }\r\n dispatch(loteAction.onChangeProps(prop, event))\r\n }\r\n const handleSwitchValor = (event) => {\r\n dispatch(loteAction.onSwitchValor(event))\r\n }\r\n const setRepassarTaxaDefault = (repassarTaxaEstabecimento) => {\r\n dispatch(\r\n loteAction.setRepassarTaxaByEstabelecimento(repassarTaxaEstabecimento)\r\n )\r\n }\r\n\r\n const handleChangeData = (prop, newValue) => {\r\n dispatch(loteAction.onChangeData(prop, newValue))\r\n }\r\n const handleClickOpenModalAddTipoDeIngresso = () => {\r\n dispatch(loteAction.openModalTipoDeIngresso(true))\r\n }\r\n useEffect(() => {\r\n window.scrollTo({\r\n top: 0,\r\n behavior: 'smooth'\r\n })\r\n ValidatorForm.addValidationRule('isValidDate', (value) => {\r\n if (value !== undefined && value !== null) {\r\n return isValid(new Date(toISODateFormat(value)))\r\n } else {\r\n return true\r\n }\r\n })\r\n }, [])\r\n\r\n useEffect(() => {\r\n return () => {\r\n ValidatorForm.removeValidationRule('isValidDate')\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n dispatch(\r\n tipoIngressoAction.getTipoIngressoByEstabelecimento(\r\n usuarioEstabelecimento.estabelecimentoId\r\n )\r\n )\r\n }, [])\r\n\r\n useEffect(() => {\r\n if (!lote.id) {\r\n setRepassarTaxaDefault(repassarTaxaEstabelecimento)\r\n }\r\n }, [lote.id, repassarTaxaEstabelecimento])\r\n\r\n const clear = () => {\r\n dispatch(loteAction.clear(repassarTaxaEstabelecimento))\r\n }\r\n\r\n const add = () => {\r\n if (\r\n !validateDatesLote(lote.dataHoraInicio, lote.dataHoraTermino, lote.id)\r\n ) {\r\n toast.error('Opss! 😥 Datas incorretas, revise por favor!')\r\n } else {\r\n let payload = {\r\n id: lote.id,\r\n descricao: lote.descricao,\r\n tipoIngressoId: lote.tipoIngressoId,\r\n eventoId: lote.eventoId,\r\n valor: parseFloat(lote.valor),\r\n quantidade: parseInt(lote.quantidade),\r\n limiteQuantidadePedido: parseInt(lote.limiteQuantidadePedido),\r\n genero: lote.genero,\r\n dataHoraInicio: toISODateFormat(lote.dataHoraInicio),\r\n dataHoraTermino: toISODateFormat(lote.dataHoraTermino),\r\n disponivel: lote.disponivel,\r\n excluido: lote.excluido,\r\n repassarTaxa: lote.repassarTaxa,\r\n checkIn: lote.checkIn,\r\n planoId: lote?.planoId\r\n }\r\n if (id) {\r\n if (payload.id) {\r\n dispatch(loteAction.editLoteInfo(payload.id, payload))\r\n } else {\r\n payload.eventoId = id\r\n dispatch(loteAction.createLote(payload))\r\n }\r\n } else {\r\n if (payload.id) {\r\n dispatch(eventoAction.editLoteLocale(payload.id, payload))\r\n } else {\r\n payload.id = uniqueId()\r\n dispatch(eventoAction.addLoteLocale(payload))\r\n }\r\n }\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n add()}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n =\r\n LOTE_DESCRICAO_MAX_LENGTH\r\n ? 'error'\r\n : undefined\r\n }\r\n >\r\n {lote?.descricao?.length}/\r\n {LOTE_DESCRICAO_MAX_LENGTH}\r\n \r\n \r\n >\r\n )\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n Tipo de Ingresso * \r\n \r\n {undefined !== tipoIngresso && tipoIngresso.length > 0 ? (\r\n tipoIngresso.map((row) => (\r\n \r\n {row.descricao}\r\n \r\n ))\r\n ) : (\r\n \r\n Nenhum resultado encontrado\r\n \r\n )}\r\n }\r\n className={classes.buttonAddTipoDeIngresso}\r\n variant=\"text\"\r\n color=\"primary\"\r\n onClick={() => handleClickOpenModalAddTipoDeIngresso()}\r\n >\r\n Cadastrar novo\r\n \r\n \r\n \r\n \r\n \r\n \r\n Sexo \r\n \r\n Masculino \r\n Feminino \r\n Unissex \r\n \r\n \r\n \r\n \r\n <>\r\n \r\n \r\n >\r\n \r\n )\r\n }}\r\n variant=\"outlined\"\r\n id=\"valor\"\r\n disabled={lote.valor === 0 ? true : false}\r\n label=\"Valor em R$ *\"\r\n className={classes.textField}\r\n value={lote.valor === 0 ? 'Gratuito' : lote.valor}\r\n onChange={handleChange('valor')}\r\n fullWidth\r\n type={lote.valor === 0 ? 'text' : 'number'}\r\n inputProps={{\r\n min: '0',\r\n step: '0.01'\r\n }}\r\n lines=\"5\"\r\n validators={\r\n lote.valor === 0 ? [] : ['required', 'minNumber:3']\r\n }\r\n errorMessages={[\r\n 'Campo obrigatório!',\r\n 'O ticket deve ter um valor superior a R$ 3,00!'\r\n ]}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Quantidade máxima de ingressos que o usuário poderá\r\n comprar por pedido. Caso não definido, o limite é de\r\n 10 ingressos.\r\n \r\n \r\n )\r\n }}\r\n inputProps={{\r\n min: '1'\r\n }}\r\n className={classes.textField}\r\n value={lote.limiteQuantidadePedido}\r\n onChange={handleChange('limiteQuantidadePedido')}\r\n fullWidth\r\n type=\"number\"\r\n lines=\"5\"\r\n validators={\r\n parseInt(lote.limiteQuantidadePedido) >\r\n parseInt(lote.quantidade)\r\n ? ['maxNumber']\r\n : []\r\n }\r\n errorMessages={[\r\n 'Quantidade máxima maior que quantidade disponibilizada'\r\n ]}\r\n />\r\n \r\n \r\n \r\n handleChangeData('dataHoraInicio', newValue)\r\n }\r\n //Comentado para aceitar datas passadas, facilitar input..\r\n //disablePast={lote.id !== 0 ? false : true}\r\n format=\"dd/MM/yyyy HH:mm\"\r\n invalidDateMessage=\"Data inválida\"\r\n invalidLabel=\"dd/MM/aaaa HH:mm\"\r\n maxDateMessage=\"A data não deve ser posterior à data máxima\"\r\n minDateMessage=\"A data não deve ser anterior à data mínima\"\r\n cancelLabel=\"Cancelar\"\r\n okLabel=\"Definir\"\r\n clearable\r\n clearLabel=\"Limpar\"\r\n placeholder=\"dd/MM/aaaa HH:mm\"\r\n todayLabel=\"Hoje\"\r\n defaultValue={undefined}\r\n openTo=\"month\"\r\n views={['month', 'date', 'hours', 'minutes']}\r\n />\r\n \r\n \r\n \r\n handleChangeData('dataHoraTermino', newValue)\r\n }\r\n disablePast\r\n minDate={toISODateFormat(lote.dataHoraInicio)}\r\n initialFocusedDate={toISODateFormat(lote.dataHoraInicio)}\r\n format=\"dd/MM/yyyy HH:mm\"\r\n invalidDateMessage=\"Data inválida\"\r\n invalidLabel=\"dd/MM/aaaa HH:mm\"\r\n maxDateMessage=\"A data não deve ser posterior à data máxima\"\r\n minDateMessage={\r\n lote.dataHoraInicio != null\r\n ? 'A data não deve ser anterior à data mínima'\r\n : 'A data não deve estar no passado'\r\n }\r\n cancelLabel=\"Cancelar\"\r\n okLabel=\"Definir\"\r\n clearable\r\n clearLabel=\"Limpar\"\r\n placeholder=\"dd/MM/aaaa HH:mm\"\r\n todayLabel=\"Hoje\"\r\n defaultValue={undefined}\r\n openTo=\"month\"\r\n views={['month', 'date', 'hours', 'minutes']}\r\n />\r\n {' '}\r\n \r\n \r\n \r\n \r\n }\r\n label=\"Disponibilizar Lote\"\r\n />\r\n \r\n {lote.valor !== 0 && (\r\n \r\n \r\n \r\n }\r\n label={'Repassar taxa para cliente'}\r\n />\r\n \r\n Se ativado, a taxa de serviço será repassada para o\r\n cliente.\r\n \r\n
\r\n \r\n )}\r\n \r\n (\r\n \r\n
\r\n \r\n \r\n
\r\n \r\n \r\n \r\n }\r\n label=\"Check-In\"\r\n />\r\n \r\n Quando essa opção é marcada, membros podem pedir\r\n check-in até o momento estabelecido acima (Campo\r\n Término das Vendas)\r\n \r\n
\r\n \r\n {lote.checkIn && (\r\n \r\n \r\n \r\n Selecione o plano *\r\n \r\n \r\n \r\n {lote?.planoId === 0 ? (\r\n isLoadingPlans ? (\r\n 'Carregando...'\r\n ) : (\r\n 'Selecione o plano *'\r\n )\r\n ) : (\r\n Limpar seleção \r\n )}\r\n \r\n {plans &&\r\n plans.length > 0 &&\r\n // @ts-ignore\r\n plans.map((plan) => (\r\n \r\n {plan.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n )}\r\n />\r\n \r\n \r\n \r\n clear()}\r\n >\r\n Limpar\r\n \r\n \r\n {lote.id ? 'Atualizar' : 'Adicionar'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default LoteEdit\r\n","import { isPast, isAfter, isBefore } from 'date-fns'\nimport toISODateFormat from './toISODateFormat'\n\nexport default function validateDatesLote(dataInicio, dataFim, loteId) {\n var isValid = true\n if (\n isAfter(\n new Date(toISODateFormat(dataInicio)),\n new Date(toISODateFormat(dataFim))\n ) ||\n isBefore(\n new Date(toISODateFormat(dataFim)),\n new Date(toISODateFormat(dataInicio))\n )\n ) {\n isValid = false\n } else if (isPast(new Date(toISODateFormat(dataFim)))) {\n isValid = false\n }\n //Comentado para aceitar datas passadas, facilitar input..\n /*if (loteId === 0) {\n if (isPast(new Date(toISODateFormat(dataInicio)))) {\n isValid = false\n }\n }*/\n return isValid\n}\n","import React, { useEffect } from 'react'\nimport clsx from 'clsx'\nimport PropTypes from 'prop-types'\nimport { cepMask } from 'utils/masks'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport {\n Card,\n CardContent,\n CardHeader,\n Grid,\n Divider,\n MenuItem\n} from '@material-ui/core'\nimport { isEmpty } from 'lodash'\nimport { useSelector, useDispatch } from 'react-redux'\nimport { eventoAction, estadoAction, cidadeAction } from '_actions'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {\n ...constants.shadowCard\n }\n}))\n\nconst EventoEditLocale = (props) => {\n const { className, ...rest } = props\n const dispatch = useDispatch()\n const classes = useStyles()\n const evento = useSelector((state) => state.evento)\n const { estado } = useSelector((state) => state.estado)\n const { cidade } = useSelector((state) => state.cidade)\n const estabelecimento = useSelector((state) => state.estabelecimento)\n\n useEffect(() => {\n if (evento.id > 0 && evento.tipoLocalizacao !== 'O') {\n dispatch(estadoAction.getEstado())\n }\n }, [])\n\n useDidMountEffect(() => {\n if (evento.tipoLocalizacao !== 'O' && evento.tipoLocalizacao !== '') {\n if (estado.length === 0) {\n dispatch(estadoAction.getEstado())\n }\n }\n }, [evento.tipoLocalizacao])\n\n useEffect(() => {\n if (evento.estadoId > 0) {\n dispatch(cidadeAction.getCidadeByUf(evento.estadoId))\n }\n }, [evento.estadoId])\n\n const handleChange = (prop) => (event) => {\n dispatch(eventoAction.onChangeProps(prop, event))\n }\n\n const onChangeTipoEvento = (event) => {\n dispatch(eventoAction.onChangeProps('tipoLocalizacao', event))\n if (event.target.value === 'E') {\n dispatch(eventoAction.copyEstabelecimentoAddress(estabelecimento))\n } else {\n dispatch(eventoAction.clearAddress())\n }\n }\n\n return (\n \n \n \n \n \n \n \n \n \n Local \n \n Cadastrar endereço \n Local a definir \n Evento online \n \n O evento será no mesmo endereço do estabelecimento\n \n \n \n \n {evento.tipoLocalizacao !== '' && evento.tipoLocalizacao !== null && (\n <>\n {(evento.tipoLocalizacao === 'E' ||\n evento.tipoLocalizacao === 'N') && (\n \n \n \n )}\n {evento.tipoLocalizacao !== 'O' && (\n <>\n \n \n \n Estado * \n \n {undefined !== estado && estado.length\n ? estado.map((row) => (\n \n {row.nome}\n \n ))\n : null}\n \n \n \n \n \n Cidade * \n \n {!isEmpty(cidade) &&\n cidade.map((row) => (\n \n {row.nome}\n \n ))}\n \n \n {evento.tipoLocalizacao !== 'A' && (\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\nEventoEditLocale.propTypes = {\n className: PropTypes.string\n}\n\nexport default EventoEditLocale\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { eventoAction, categoriaAction, hashtagAction } from '_actions'\nimport CKEditor from '@ckeditor/ckeditor5-react'\nimport ClassicEditor from '@ckeditor/ckeditor5-build-classic'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport '@ckeditor/ckeditor5-build-classic/build/translations/pt-br'\nimport {\n Card,\n CardHeader,\n CardContent,\n Divider,\n Grid,\n Switch,\n FormControlLabel,\n makeStyles,\n Typography,\n MenuItem,\n TextField,\n useTheme,\n InputAdornment,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport { ImageCrop } from '../../../../components'\nimport { HelperToolTip, ValidatedDatePicker } from 'components/'\nimport { toISODateFormat, validateDates } from 'utils'\nimport EventoEditLocale from '../EventoEditLocale'\nimport { toast } from 'react-toastify'\nimport { isValid } from 'date-fns'\nimport Geocode from 'react-geocode'\nimport Autocomplete from '@material-ui/lab/Autocomplete'\nimport { useConfirm } from 'material-ui-confirm'\nimport YoutubeSearchedForRoundedIcon from '@material-ui/icons/YoutubeSearchedForRounded'\nimport constants from 'theme/constants'\n\nGeocode.setApiKey(process.env.REACT_APP_MAPS_KEY)\nGeocode.setLanguage('pt-BR')\nGeocode.setRegion('pt-BR')\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 0, 4, 0)\n },\n divider: {\n padding: theme.spacing(2, 0, 2, 0)\n },\n card: {\n marginBottom: theme.spacing(2),\n ...constants.shadowCard\n }\n}))\n\nconst EventoEdit = () => {\n const dispatch = useDispatch()\n const classes = useStyles()\n const confirm = useConfirm()\n const theme = useTheme()\n const { estabelecimento } = useSelector((state) => state.estabelecimento)\n const { evento, cidade, estado } = useSelector((state) => state)\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const { categoria } = useSelector((state) => state.categoria)\n const { hashtag } = useSelector((state) => state.hashtag)\n const minHashtags = 1\n const maxHashtags = 5\n let eventoHashtagLength = 0\n if (evento.eventoHashtag !== (null || undefined)) {\n eventoHashtagLength = evento.eventoHashtag.length\n }\n const getURL = (url) => {\n dispatch(eventoAction.onChangeProps('imagem', url))\n }\n\n const handleChange = (prop) => (event) => {\n dispatch(eventoAction.onChangeProps(prop, event))\n }\n\n const hashtagPrepareData = (eventoHashtag) => {\n let readyEventoHashtag = []\n eventoHashtag.map((row) => {\n readyEventoHashtag.push({\n id: 0,\n eventoId: 0,\n hashtagId: row.id,\n excluido: false\n })\n })\n return readyEventoHashtag\n }\n\n const handleOnChangeHashtag = (event) => {\n dispatch(eventoAction.handleOnChangeHashtag(hashtagPrepareData(event)))\n }\n\n const generateSlug = () => {\n dispatch(eventoAction.onChangeProps('generate-slug', evento.nome))\n }\n\n useEffect(() => {\n ValidatorForm.addValidationRule('isValidNome', (value) => {\n if (value !== '' && value !== null) {\n if (value.length >= 4) {\n return true\n }\n return false\n }\n return false\n })\n ValidatorForm.addValidationRule('isValidDate', (value) => {\n return isValid(new Date(toISODateFormat(value)))\n })\n dispatch(categoriaAction.getCategoria())\n dispatch(hashtagAction.getHashtags('', '', '', '', ''))\n return () => {\n ValidatorForm.removeValidationRule('isValidNome')\n ValidatorForm.removeValidationRule('isValidDate')\n }\n }, [])\n\n const handleChangeData = (prop, newValue) => {\n dispatch(eventoAction.onChangeData(prop, newValue))\n }\n\n const prepareAddressFromState = (evento, cidade, estado) => {\n var estadoSelected = estado.find((item) => item.id === evento.estadoId)\n var cidadeSelected = cidade.find((item) => item.id === evento.cidadeId)\n return `${evento.endereco}, ${evento.numero} - ${evento.bairro} , ${cidadeSelected.nome} - ${estadoSelected.uf}, ${evento.cep}`\n }\n\n const generatePayload = async () => {\n let payload = {\n id: evento.id,\n nome: evento.nome,\n imagem: evento.imagem,\n estabelecimentoId: usuarioEstabelecimento.estabelecimentoId,\n detalhes: evento.detalhes,\n dataHoraInicio: toISODateFormat(evento.dataHoraInicio),\n dataHoraFim: toISODateFormat(evento.dataHoraFim),\n categoriaId: evento.categoriaId,\n disponivel: evento.disponivel,\n cidadeId: evento.cidadeId,\n endereco: evento.endereco,\n cep: evento.cep,\n bairro: evento.bairro,\n latLon: evento.latLon,\n slug: evento.slug,\n tipoLocalizacao: evento.tipoLocalizacao,\n nomeLocal: evento.nomeLocal,\n complemento: evento.complemento,\n numero: evento.numero,\n eventoHashtag: evento.eventoHashtag\n }\n if (evento.tipoLocalizacao === 'N') {\n await Geocode.fromAddress(\n prepareAddressFromState(evento, cidade.cidade, estado.estado)\n ).then(\n (response) => {\n const { lat, lng } = response.results[0].geometry.location\n let latLonResult = {\n x: lat,\n y: lng\n }\n dispatch(eventoAction.changeCoordinates(latLonResult))\n payload = { ...payload, latLon: latLonResult }\n },\n (error) => {\n console.error(error)\n }\n )\n }\n return payload\n }\n\n const dispatchAfterGeneratePayload = async () => {\n const payload = await generatePayload()\n dispatch(eventoAction.editEventoInfo(evento.id, payload))\n }\n\n const handleSubmit = (event) => {\n event.preventDefault()\n if (!validateDates(evento.dataHoraInicio, evento.dataHoraFim)) {\n toast.error('Opss! 😥 Datas incorretas, revise por favor!')\n window.scrollTo(0, 250)\n } else if (evento.imagem === '') {\n toast.error('Você precisa adicionar uma imagem para o evento!')\n window.scrollTo(0, 500)\n } else if (evento.detalhes === '') {\n toast.error(\n 'Você precisa adicionar detalhes sobre o evento! Dica: Quanto mais informações, melhor 😉'\n )\n window.scrollTo(0, 1000)\n } else if (evento.eventoHashtag.length === 0) {\n toast.error('Você precisa adicionar ao menos uma hashtag!')\n\n window.scrollTo(0, 250)\n } else if (evento.id) {\n dispatchAfterGeneratePayload()\n } else {\n dispatch(eventoAction.setNextStep())\n }\n }\n\n function getCategoriaName(categoriaId) {\n const categoriaItem = categoria.find((element) => element.id == categoriaId)\n if (categoriaItem !== (undefined && null)) {\n return categoriaItem.descricao\n }\n }\n\n function getHashtagObjectById(hashtagId) {\n let hashtagObject = ''\n const hashtagItem = hashtag.find((element) => element.id == hashtagId)\n if (hashtagItem !== undefined) {\n hashtagObject = hashtagItem\n }\n return hashtagObject\n }\n\n function getHashtagsObjects(eventoHashtag) {\n let hashtags = []\n if (eventoHashtag === [] || eventoHashtag === undefined) {\n hashtags = []\n } else {\n eventoHashtag.forEach((item) =>\n item.hashtag === undefined\n ? hashtags.push(getHashtagObjectById(item.hashtagId))\n : hashtags.push(getHashtagObjectById(item.hashtag.id))\n )\n }\n return hashtags\n }\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n {/* \n \n www.corujasapp.com/\n \n */}\n \n \n \n generateSlug()}\n >\n \n \n \n \n )\n }}\n onFocus={() =>\n (evento.slug === '' || evento.slug === null) &&\n generateSlug()\n }\n label=\"Slug *\"\n value={evento.slug}\n onChange={handleChange('slug')}\n fullWidth\n validators={['required']}\n errorMessages={['Campo obrigatório!']}\n />\n \n \n \n \n Categoria * \n \n {categoria.map((row) => (\n \n {row.descricao}\n \n ))}\n \n \n \n \n handleChangeData('dataHoraInicio', newValue)\n }\n disablePast\n format=\"dd/MM/yyyy HH:mm\"\n invalidDateMessage=\"Data inválida!\"\n invalidLabel=\"dd/MM/aaaa HH:mm\"\n maxDateMessage=\"A data não deve ser posterior à data máxima\"\n minDateMessage=\"A data não deve ser anterior à data mínima\"\n cancelLabel=\"Cancelar\"\n okLabel=\"Definir\"\n clearable\n clearLabel=\"Limpar\"\n placeholder=\"dd/MM/aaaa HH:mm\"\n todayLabel=\"Hoje\"\n defaultValue={undefined}\n openTo=\"month\"\n views={['month', 'date', 'hours', 'minutes']}\n />\n \n \n \n handleChangeData('dataHoraFim', newValue)\n }\n disablePast\n minDate={toISODateFormat(evento.dataHoraInicio)}\n initialFocusedDate={toISODateFormat(evento.dataHoraInicio)}\n format=\"dd/MM/yyyy HH:mm\"\n invalidDateMessage=\"Data inválida!\"\n invalidLabel=\"dd/MM/aaaa HH:mm\"\n maxDateMessage=\"A data não deve ser posterior à data máxima\"\n minDateMessage=\"A data não deve ser anterior à data de início\"\n cancelLabel=\"Cancelar\"\n okLabel=\"Definir\"\n clearable\n clearLabel=\"Limpar\"\n placeholder=\"dd/MM/aaaa HH:mm\"\n todayLabel=\"Hoje\"\n defaultValue={undefined}\n openTo=\"month\"\n views={['month', 'date', 'hours', 'minutes']}\n />\n \n \n {\n handleOnChangeHashtag(value)\n }}\n multiple\n getOptionDisabled={(option) =>\n eventoHashtagLength === maxHashtags ? true : false\n }\n filterSelectedOptions\n limitTags={5}\n id=\"hashtag-selection\"\n options={hashtag}\n getOptionLabel={(option) => `#${option.descricao}`}\n groupBy={(option) => getCategoriaName(option.categoriaId)}\n renderInput={(params) => (\n \n )}\n />\n \n \n \n \n }\n label=\"Disponibilizar evento\"\n />\n \n Se ativado, o evento passa a ficar visível no portal da\n Corujas.\n \n
\n \n \n Imagem de divulgação * \n \n \n \n \n \n \n {'Detalhes do evento *'} \n {}}\n onChange={(event, editor) => {\n const data = editor.getData()\n dispatch(eventoAction.onChangeDetails(data, event))\n }}\n onBlur={(event, editor) => {}}\n onFocus={(event, editor) => {}}\n />\n \n \n \n \n \n \n \n
\n )\n}\n\nexport default EventoEdit\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { LoteList } from '../../components'\nimport { EventoCard } from './EventoCard'\nimport {\n Card,\n CardHeader,\n CardContent,\n Typography,\n Divider,\n Grid,\n makeStyles\n} from '@material-ui/core'\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\nimport EventBusyTwoToneIcon from '@material-ui/icons/EventBusyTwoTone'\nimport { Row } from '@mui-treasury/components/flex'\nimport constants from 'theme/constants'\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(4, 0, 4, 0)\n },\n card: {\n marginBottom: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst EventoSummary = () => {\n const evento = useSelector((state) => state.evento)\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const classes = useStyles()\n const { estado: estados } = useSelector((state) => state.estado)\n const { cidade: cidades } = useSelector((state) => state.cidade)\n const { hashtag: hashtags } = useSelector((state) => state.hashtag)\n\n function getNameEstadoById(estadoId) {\n const nameEstado = estados.find((estado) => estado.id === estadoId)\n return nameEstado ? nameEstado.nome : ''\n }\n\n function getNameCidadeById(cidadeId) {\n const nameCidade = cidades.find((cidade) => cidade.id === cidadeId)\n return nameCidade ? nameCidade.nome : ''\n }\n\n function getHashtagNameById(hashtagId) {\n let hashtagName = ''\n const hashtagItem = hashtags.find((element) => element.id === hashtagId)\n if (hashtagItem !== undefined) {\n hashtagName = hashtagItem.descricao\n }\n return hashtagName\n }\n\n return (\n \n \n \n \n \n \n \n \n {'Como seu evento aparecerá na Corujas: '} \n \n {/* */}\n \n \n \n \n \n {'1 - Informações sobre o evento '} \n \n \n Nome: {evento.nome}\n \n \n Data de Início: {evento.dataHoraInicio}\n \n \n Data de Término: {evento.dataHoraFim}\n \n \n \n Disponibilizar evento: {' '}\n \n {evento.disponivel ? (\n \n ) : (\n \n )}\n
\n \n Hashtags: {' '}\n {evento.eventoHashtag.map(\n (row) =>\n `#${\n row.hashtag === undefined\n ? getHashtagNameById(row.hashtagId)\n : getHashtagNameById(row.hashtag.id)\n } `\n )}\n \n \n Detalhes do Evento: \n \n \n {' '}\n \n \n \n \n \n \n \n \n \n {'2 - Onde vai ser o evento '} \n \n {evento.tipoLocalizacao === 'O' ? (\n \n Evento online \n \n ) : (\n <>\n {evento.tipoLocalizacao === 'N' && (\n \n Nome do local: {evento.nomeLocal}\n \n )}\n \n Estado: {getNameEstadoById(evento.estadoId)}\n \n \n Cidade: {getNameCidadeById(evento.cidadeId)}\n \n {evento.tipoLocalizacao !== 'A' && (\n <>\n \n CEP: {evento.cep}\n \n \n Endereço: {evento.endereco}\n \n \n Número: {evento.numero}\n \n \n Bairro: {evento.bairro}\n \n \n Complemento: {' '}\n {evento.complemento !== null\n ? evento.complemento\n : '-'}\n \n >\n )}\n >\n )}\n \n \n \n \n \n \n \n \n )\n}\n\nexport default EventoSummary\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {\n Grid,\n // Chip,\n withStyles,\n Tooltip,\n CardContent,\n CardMedia,\n Card,\n CardActionArea,\n Typography,\n Zoom,\n Divider,\n List,\n ListItem,\n ListItemText,\n ListItemIcon\n} from '@material-ui/core'\nimport LocationIcon from '@material-ui/icons/LocationOn'\nimport EventTwoToneIcon from '@material-ui/icons/EventTwoTone'\nimport PermContactCalendarTwoToneIcon from '@material-ui/icons/PermContactCalendarTwoTone'\n// import HomeWorkTwoToneIcon from '@material-ui/icons/HomeWorkTwoTone';\nimport { Item } from '@mui-treasury/components/flex'\nimport { format } from 'date-fns'\nimport { toISODateFormat } from 'utils'\n\nconst styles = (theme) => ({\n card: {\n transition: '0.3s cubic-bezier(.47,1.64,.41,.8)',\n border: '2px solid transparent',\n '&:hover': {\n boxShadow: '0px 0px 20px 8px rgba(0,0,0,0.18)',\n border: '2px solid rgba(225, 194, 10, 1)'\n },\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 15,\n marginBottom: -35\n },\n cardMedia: {\n paddingTop: '56.25%' // 16:9\n }\n})\n\nconst EventoCard = (props) => {\n const { classes } = props\n const evento = props.evento\n\n return (\n \n \n \n \n \n {evento.nome} \n \n \n \n - \n
\n {/* \n {evento.cidade !== null && evento.cidade !== undefined\n ? `${evento.cidade.nome} - ${evento.cidade.estado.uf}`\n : evento.estabelecimento.cidade !== null &&\n evento.estabelecimento.cidade !== undefined\n ? `${evento.estabelecimento.cidade.nome} - ${evento.estabelecimento.cidade.estado.uf}`\n : 'Localização não definida'}\n */}\n \n \n \n \n \n \n {props.estabelecimento.estabelecimento}\n \n }\n />\n \n \n \n \n \n {evento.dataHoraInicio !== null &&\n evento.dataHoraInicio !== undefined ? (\n \n {format(\n new Date(toISODateFormat(evento.dataHoraInicio)),\n \"dd/MM/yyyy 'às' hh:mm\"\n )}\n \n }\n />\n ) : (\n \n Sem data definida\n \n }\n />\n )}\n \n
\n \n \n \n )\n}\nEventoCard.propTypes = {\n classes: PropTypes.object.isRequired\n}\nexport default withStyles(styles)(EventoCard)\n","import React, { useEffect } from 'react'\nimport { EventoDashboard as EventoDashboardComponent } from './components'\nimport { Header, Page } from 'components'\nimport { useDispatch } from 'react-redux'\nimport { globalActions } from '_actions'\nimport { useParams } from 'react-router-dom'\nimport { Box, makeStyles, Typography } from '@material-ui/core'\nimport { useEventDashboard } from 'hooks-querys'\nimport { format } from 'date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n paddingTop: theme.spacing(3),\n [theme.breakpoints.down('sm')]: {\n padding: theme.spacing(1),\n paddingTop: theme.spacing(3)\n }\n },\n header: {\n marginBottom: theme.spacing(3)\n }\n}))\n\nconst EventoDashboard = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { eventoId } = useParams<{ eventoId: string }>()\n const {\n data,\n isLoading,\n isFetching,\n isError,\n refetch,\n dataUpdatedAt\n } = useEventDashboard(Number(eventoId))\n const { evento } = data || {}\n\n useEffect(() => {\n dispatch(globalActions.setIsVisibleButtonShowValues(true))\n return () => {\n dispatch(globalActions.setIsVisibleButtonShowValues(false))\n }\n }, [])\n\n useEffect(() => {\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n }, [eventoId])\n\n return (\n \n \n \n {!isLoading ? (\n \n Última atualização:{' '}\n {format(dataUpdatedAt, \"dd/MM/yyyy 'às' HH:mm:ss\", {\n locale: brLocale\n })}{' '}\n {isFetching ? '(Atualizando...)' : ''}\n \n ) : null}\n \n \n \n )\n}\n\nexport default EventoDashboard\n","import React from 'react'\nimport {\n TableRow,\n TableCell,\n Grid,\n Tooltip,\n IconButton,\n colors,\n Avatar,\n makeStyles,\n Typography\n} from '@material-ui/core'\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\n\n//? Own imports\nimport { EstabelecimentoListAdmin } from 'types/api'\nimport { cepMask, cpfCnpjMask, getInitials } from 'utils'\nimport { Label } from 'components'\n\nconst useStyles = makeStyles((theme) => ({\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n avatar: {\n height: 42,\n width: 42,\n marginRight: theme.spacing(1)\n }\n}))\n\nconst RowTableEstabelecimentos = ({\n estabelecimento\n}: {\n estabelecimento: EstabelecimentoListAdmin\n}) => {\n const classes = useStyles()\n\n return (\n \n \n {estabelecimento.id}\n \n \n {estabelecimento && estabelecimento.nome ? (\n \n
\n {getInitials(estabelecimento?.nome)}\n \n
\n
\n {estabelecimento?.nome}\n \n
@{estabelecimento?.username}
\n
\n
\n ) : (\n 'Estabelecimento não encontrado'\n )}\n \n \n {cpfCnpjMask(estabelecimento.cpfCnpj) || 'Não informado'}\n \n \n \n {`${estabelecimento?.endereco}, ${estabelecimento?.numero} ${\n estabelecimento?.complemento\n ? ` - ${estabelecimento?.complemento}`\n : ''\n }${estabelecimento?.bairro ? ` - ${estabelecimento?.bairro}` : ''}`}\n
\n {cepMask(estabelecimento?.cep)}
\n {estabelecimento?.cidade ? (\n \n {`${estabelecimento?.cidade?.nome} -\n ${estabelecimento?.cidade?.estado.uf.toUpperCase()}/${\n estabelecimento?.cidade?.estado?.pais?.nomePt\n }`}\n
\n ) : null}\n \n \n \n {estabelecimento.repassarTaxa ? 'Sim' : 'Não'}\n \n \n \n {estabelecimento?.taxa\n ? `${estabelecimento?.taxa}%`\n : 'Não identificado'}\n \n \n {estabelecimento?.categoria?.descricao || 'Não identificado'}\n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default RowTableEstabelecimentos\n","import React from 'react'\nimport {\n TableBody,\n Table,\n makeStyles,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n Paper,\n Typography,\n Toolbar,\n Tooltip,\n IconButton\n} from '@material-ui/core'\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\nimport ReactToPrint from 'react-to-print'\n\n//? Own imports\nimport { EstabelecimentoListAdmin } from 'types/api'\nimport { RowTableEstabelecimentos } from './components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n table: {\n minWidth: 700\n },\n rootToolbarStyles: {\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(1)\n },\n titleToolbarStyles: {\n flex: '1 1 100%'\n },\n paper: {\n width: '100%',\n marginBottom: theme.spacing(2),\n ...constants.shadowCard\n }\n}))\n\nconst TableEstabelecimentos = ({\n estabelecimentos\n}: {\n estabelecimentos: EstabelecimentoListAdmin[]\n}) => {\n const classes = useStyles()\n const refTable = React.useRef(null)\n\n return (\n \n
\n {estabelecimentos && estabelecimentos.length > 0 ? (\n <>\n Total de dados encontrados:{' '}\n {estabelecimentos.length} \n >\n ) : (\n Nenhum dado encontrado. \n )}\n \n {estabelecimentos && estabelecimentos.length > 0 && (\n
\n \n \n Lista de estabelecimentos\n \n (\n \n \n \n \n \n )}\n content={() => refTable.current}\n />\n \n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\n \n {/* ------------------------------------------------------------>\t */}\n \n {estabelecimentos !== undefined && estabelecimentos.length > 0 && (\n \n \n \n #ID \n Nome \n CPF/CNPJ \n Localização \n Repassar taxa \n Taxa \n Categoria \n Ações \n \n \n \n {estabelecimentos.map((estabelecimento) => {\n return (\n \n )\n })}\n \n
\n )}\n \n \n )}\n
\n )\n}\n\nexport default TableEstabelecimentos\n","import React, { useState } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport {\n Grid,\n makeStyles,\n TextField,\n InputAdornment,\n IconButton,\n Divider,\n Tooltip\n} from '@material-ui/core'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\n\n//? Own imports\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport { history } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1,\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst Filters = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n textSearch: querySearch.get('textSearch') || ''\n })\n\n const runQuery = () => {\n history.push(`/estabelecimentos?textSearch=${filters.textSearch}`)\n }\n\n const handleChangeText = (value: string) => {\n setFilters((prev) => ({ ...prev, textSearch: value }))\n }\n\n const handleSubmitSearch = (event: React.FormEvent) => {\n event.preventDefault()\n if (filters.textSearch && filters.textSearch.length > 0) {\n runQuery()\n }\n }\n\n const clearTextSearch = () => {\n setFilters((prev) => ({ ...prev, textSearch: '' }))\n }\n\n useDidMountEffect(() => {\n if (filters.textSearch === '') {\n runQuery()\n }\n }, [filters.textSearch])\n\n useDidMountEffect(() => {\n setFilters((prev) => ({\n ...prev,\n textSearch: querySearch.get('textSearch') || ''\n }))\n }, [querySearch])\n\n return (\n \n )\n}\n\nexport default Filters\n","import React, { useEffect, useState } from 'react'\nimport { LinearProgress, makeStyles } from '@material-ui/core'\n\n//? Own imports\nimport { AccessControl } from 'components/Utils'\nimport { Header, Page, SkeletonTable } from 'components'\nimport AccessDenied from 'views/Errors/AccessDenied'\nimport { Filters, TableEstabelecimentos } from './components'\nimport { useEstablishments } from 'hooks-querys'\nimport { useLocation } from 'react-router-dom'\nimport { EstabelecimentoListAdmin } from 'types/api'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n marginBottom: theme.spacing(4)\n }\n}))\n\nfunction useSearchQuery() {\n const { search } = useLocation()\n return React.useMemo(() => new URLSearchParams(search), [search])\n}\n\nconst EstabelecimentoList = () => {\n const classes = useStyles()\n const querySearch = useSearchQuery()\n const [filters, setFilters] = useState({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || ''\n })\n\n useEffect(() => {\n setFilters({\n // page: Number(querySearch.get('page')) || 1,\n textSearch: querySearch.get('textSearch') || ''\n })\n }, [querySearch])\n\n const { data, isLoading, refetch, isFetching } = useEstablishments({\n page: 1, // valor fixo para paginação, pois o componente de paginação não está implementado\n direction: 'desc',\n order: 'id',\n limit: 10000, //limite alto para não haver paginação\n term: filters.textSearch\n })\n return (\n \n {isFetching && (\n \n )}\n (\n \n
\n
\n {isLoading ? (\n
\n ) : (\n
\n )}\n
\n )}\n // @ts-ignore\n no={() => }\n />\n \n )\n}\n\nexport default EstabelecimentoList\n","export const abbreviateNumber = (number) => {\n const SI_SYMBOL = ['', 'k', 'M', 'G', 'T', 'P', 'E']\n\n // what tier? (determines SI symbol)\n const tier = (Math.log10(Math.abs(number)) / 3) | 0\n\n // if zero, we don't need a suffix\n if (tier === 0) return number\n\n // get suffix and determine scale\n const suffix = SI_SYMBOL[tier]\n const scale = Math.pow(10, tier * 3)\n\n // scale the number\n const scaled = number / scale\n\n // format number and add suffix\n return scaled.toFixed(1) + suffix\n}\n","import React, { useState, useCallback, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport {\n Card,\n CardContent,\n CardActions,\n Avatar,\n Typography,\n Button,\n withStyles,\n Divider,\n CircularProgress,\n Grid,\n Backdrop,\n Tooltip,\n Box\n} from '@material-ui/core'\nimport Rating from '@material-ui/lab/Rating'\nimport { withRouter } from 'react-router-dom'\nimport { connect, useDispatch } from 'react-redux'\nimport getInitials from 'utils/getInitials'\nimport CloudUploadTwoToneIcon from '@material-ui/icons/CloudUploadTwoTone'\nimport { useConfirm } from 'material-ui-confirm'\nimport ImageUploading from 'react-images-uploading'\nimport { uploadImage } from '_services'\nimport { estabelecimentoAction } from '_actions'\nimport { errorsUploadImage } from 'utils'\nimport { abbreviateNumber } from 'utils/abbreviateNumber'\nimport SocialShare from 'components/Share/Share'\nimport { onShareEstablishment } from 'utils/linkShare'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n content: {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n textAlgin: 'center'\n },\n nome: {\n marginTop: theme.spacing(1)\n },\n uploadButton: {\n marginRight: theme.spacing(2),\n justifyContent: 'space-between'\n },\n avatar: {\n height: 130,\n width: 130,\n borderRadius: '10px',\n webkitBorderRadius: '10px',\n mozBorderRadius: '10px',\n cursor: 'pointer'\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff'\n }\n})\n\nconst EstabelecimentoDetails = (props) => {\n const { classes, estabelecimento, className, ...rest } = props\n const [images, setImages] = useState([])\n const [open, setOpen] = useState(false)\n const dispatch = useDispatch()\n const confirm = useConfirm()\n\n const [link, setLink] = useState('')\n\n const generateLink = useCallback(async () => {\n let link = await onShareEstablishment(estabelecimento)\n setLink(link)\n }, [estabelecimento])\n\n useEffect(() => {\n generateLink()\n }, [estabelecimento.nome, generateLink])\n\n const removeImage = () => {\n confirm({\n title: 'Deseja remover a imagem?',\n description: '',\n confirmationText: 'Sim, quero remover!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n let payload = {\n ...estabelecimento,\n imagem: null\n }\n dispatch(\n estabelecimentoAction.editEstabelecimentoInfo(\n estabelecimento.id,\n payload\n )\n )\n dispatch(estabelecimentoAction.onChangeProps('imagem', null))\n })\n }\n const onChange = (imageList) => {\n // data for submit\n setOpen(true)\n setImages(imageList)\n uploadImage(imageList[0])\n .then((response) => {\n let payload = {\n ...estabelecimento,\n imagem: response\n }\n if (estabelecimento.id !== 0) {\n dispatch(\n estabelecimentoAction.editEstabelecimentoInfo(\n estabelecimento.id,\n payload\n )\n )\n }\n dispatch(estabelecimentoAction.onChangeProps('imagem', response))\n setOpen(false)\n })\n .catch((err) => {\n console.log(err)\n setOpen(false)\n })\n }\n return (\n \n
\n \n \n \n \n \n \n Enviando imagem...\n \n \n \n \n
errorsUploadImage(errors)}\n value={images}\n onChange={onChange}\n dataURLKey=\"data_url\"\n >\n {({ onImageUpload, isDragging, dragProps }) => (\n \n \n {isDragging ? (\n <>\n \n \n Solte a imagem aqui!\n \n >\n ) : (\n <>\n \n \n {getInitials(estabelecimento.nome)}\n \n \n \n {estabelecimento.nome}\n \n {estabelecimento.id != 0 && (\n <>\n \n \n \n >\n )}\n \n \n {estabelecimento.totalAvaliacoes > 0\n ? `${abbreviateNumber(\n estabelecimento.totalAvaliacoes\n )} avaliações`\n : 'Nenhuma avaliação'}\n \n \n {estabelecimento.totalSeguidores > 0\n ? `${abbreviateNumber(\n estabelecimento.totalSeguidores\n )} seguidores`\n : 'Nenhum seguidor'}\n \n {/* \n Capacidade: {estabelecimento.capacidade} pessoas.\n \n \n Categoria\n */}\n >\n )}\n \n \n \n \n {estabelecimento.imagem !== null &&\n estabelecimento.imagem !== ''\n ? 'Trocar imagem'\n : 'Carregar imagem'}\n \n {estabelecimento.imagem !== null &&\n estabelecimento.imagem !== '' && (\n \n Remover imagem\n \n )}\n \n \n )}\n \n
\n )\n}\n\nEstabelecimentoDetails.propTypes = {\n className: PropTypes.string,\n estabelecimento: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return {\n estabelecimento: state.estabelecimento\n }\n}\nconst connectedEstabelecimentoDetailsPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(EstabelecimentoDetails))\n)\nexport default connectedEstabelecimentoDetailsPage\n","import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { cepMask, cpfCnpjMask, history } from 'utils'\nimport Typography from '@material-ui/core/Typography'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n MenuItem,\n Grid,\n CircularProgress,\n InputAdornment,\n Tooltip,\n IconButton,\n makeStyles,\n FormControlLabel,\n Switch,\n TextField\n} from '@material-ui/core'\nimport YoutubeSearchedForRoundedIcon from '@material-ui/icons/YoutubeSearchedForRounded'\nimport Autocomplete from '@material-ui/lab/Autocomplete'\nimport { useDispatch, useSelector } from 'react-redux'\nimport {\n estabelecimentoAction,\n categoriaAction,\n cidadeAction,\n estadoAction,\n hashtagAction\n} from '_actions'\nimport { cnpj, cpf } from 'cpf-cnpj-validator'\nimport { isEmpty } from 'lodash'\nimport { HelperToolTip } from 'components'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles(() => ({\n root: {},\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst EstabelecimentoForm = () => {\n const dispatch = useDispatch()\n const classes = useStyles()\n const estados = useSelector((state) => state.estado.estado)\n const { cidade } = useSelector((state) => state.cidade)\n const { categoria } = useSelector((state) => state.categoria)\n const { hashtag } = useSelector((state) => state.hashtag)\n const estabelecimento = useSelector((state) => state.estabelecimento)\n const usuarioId = useSelector((state) => state.authentication.user.id)\n const isAddPlace = useSelector(\n (state) => state.usuarioEstabelecimento.isAddPlace\n )\n const minHashtags = 1\n const maxHashtags = 5\n let hashtagLength = 0\n if (estabelecimento.estabelecimentoHashtag !== (null || undefined)) {\n hashtagLength = estabelecimento.estabelecimentoHashtag.length\n }\n\n useEffect(() => {\n ValidatorForm.addValidationRule('isValidCpf', (value) => {\n if (value && value.length <= 14) {\n if (cpf.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCnpj', (value) => {\n if (value && value.length >= 15) {\n if (cnpj.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCep', (value) => {\n if (value.length === 9) {\n return true\n } else {\n return false\n }\n })\n dispatch(categoriaAction.getCategoria())\n dispatch(hashtagAction.getHashtags('', '', '', '', ''))\n dispatch(estadoAction.getEstado())\n if (estabelecimento.estadoId > 0) {\n dispatch(cidadeAction.getCidadeByUf(estabelecimento.estadoId))\n }\n }, [])\n\n useDidMountEffect(() => {\n if (estabelecimento.estadoId > 0) {\n dispatch(cidadeAction.getCidadeByUf(estabelecimento.estadoId))\n }\n }, [estabelecimento.estadoId])\n\n useEffect(() => {\n return () => {\n ValidatorForm.removeValidationRule('isValidCpf')\n ValidatorForm.removeValidationRule('isValidCnpj')\n ValidatorForm.removeValidationRule('isValidCep')\n }\n }, [])\n\n const hashtagPrepareData = (estabelecimentoHashtag) => {\n let readyEstabelecimentoHashtag = []\n estabelecimentoHashtag.map((row) => {\n readyEstabelecimentoHashtag.push({\n id: 0,\n estabelecimentoId: 0,\n hashtagId: row.id,\n excluido: false\n })\n })\n return readyEstabelecimentoHashtag\n }\n\n const handleOnChangeHashtag = (event) => {\n dispatch(\n estabelecimentoAction.handleOnChangeHashtag(hashtagPrepareData(event))\n )\n }\n\n function getHashtagObjectById(hashtagId) {\n let hashtagObject = ''\n const hashtagItem = hashtag.find((element) => element.id == hashtagId)\n if (hashtagItem !== undefined) {\n hashtagObject = hashtagItem\n }\n return hashtagObject\n }\n\n function getHashtagsObjects(estabelecimentoHashtag) {\n let hashtags = []\n if (estabelecimentoHashtag === [] || estabelecimentoHashtag === undefined) {\n hashtags = []\n } else {\n estabelecimentoHashtag.forEach((item) =>\n item.hashtag === undefined\n ? hashtags.push(getHashtagObjectById(item.hashtagId))\n : hashtags.push(getHashtagObjectById(item.hashtag.id))\n )\n }\n return hashtags\n }\n\n function getCategoriaName(categoriaId) {\n const categoriaItem = categoria.find((element) => element.id == categoriaId)\n if (categoriaItem !== (undefined && null)) {\n return categoriaItem.descricao\n }\n }\n\n const handleSubmit = (event) => {\n event.preventDefault()\n\n if (estabelecimento.username.length < 1) {\n generateUsername()\n }\n\n let usuarioEstabelecimento = []\n usuarioEstabelecimento.push({\n id: 0,\n usuarioId: usuarioId,\n estabelecimentoId: 0\n })\n\n let payload = {\n id: estabelecimento.id,\n nome: estabelecimento.nome,\n detalhes: estabelecimento.detalhes,\n endereco: estabelecimento.endereco,\n numero: estabelecimento.numero,\n complemento: estabelecimento.complemento,\n capacidade: estabelecimento.capacidade,\n cidadeId: estabelecimento.cidadeId,\n estadoId: estabelecimento.estadoId,\n imagem: estabelecimento.imagem,\n banner: estabelecimento.banner,\n bairro: estabelecimento.bairro,\n cep: estabelecimento.cep,\n latLon: estabelecimento.latLon,\n username: estabelecimento.username,\n categoriaId: estabelecimento.categoriaId,\n usuarioEstabelecimento: usuarioEstabelecimento,\n cpfCnpj: estabelecimento.cpfCnpj\n .split('.')\n .join('')\n .replace(/[-/.]/g, ''),\n repassarTaxa: estabelecimento.repassarTaxa,\n estabelecimentoHashtag: estabelecimento.estabelecimentoHashtag\n }\n\n if (estabelecimento.id > 0 && !isAddPlace) {\n delete payload.usuarioEstabelecimento\n dispatch(\n estabelecimentoAction.editEstabelecimentoInfo(\n estabelecimento.id,\n payload\n )\n )\n } else {\n history.push('location')\n }\n }\n\n const generateUsername = () => {\n let usernameGenerate = {\n target: {\n value: estabelecimento.nome\n }\n }\n dispatch(estabelecimentoAction.onChangeProps('username', usernameGenerate))\n }\n\n const handleBlur = (prop) => (event) => {\n if (prop === 'cep') {\n var numerosCep = event.target.value.replace('-', '').replace(/\\D/g, '')\n if (numerosCep.length === 8) {\n dispatch(estabelecimentoAction.getEnderecoByCep(numerosCep))\n }\n }\n }\n\n const handleChange = (prop) => (event) => {\n dispatch(estabelecimentoAction.onChangeProps(prop, event))\n }\n\n return (\n \n \n \n handleSubmit(event)}\n debounceTime={1100}\n >\n \n \n Aqui ficam as informações sobre quem esta organizando os\n eventos!\n \n \n O estabelecimento pode ser um lugar físico ou conter seus\n dados pessoais caso você seja o organizador.\n \n
\n }\n titleTypographyProps={{ variant: 'h4' }}\n />\n \n \n \n \n \n \n \n \n \n generateUsername()}\n >\n \n \n \n \n ),\n startAdornment: @ \n }}\n onFocus={() =>\n (estabelecimento.username === '' ||\n estabelecimento.username === null) &&\n generateUsername()\n }\n // validators={['required']}\n // errorMessages={['Campo obrigatório!']}\n />\n \n \n \n \n \n \n {estabelecimento.isSearchingCep && (\n \n )}\n \n )\n }}\n id=\"cep\"\n disabled={estabelecimento.isSearchingCep}\n label=\"CEP *\"\n name=\"cep\"\n type=\"text\"\n inputProps={{\n maxLength: '9'\n }}\n value={cepMask(estabelecimento.cep)}\n onChange={handleChange('cep')}\n onBlur={handleBlur('cep')}\n autoComplete=\"cep\"\n validators={['required', 'isValidCep']}\n errorMessages={['Campo obrigatório!', 'O CEP não é válido']}\n />\n \n \n \n \n Estado * \n \n {!isEmpty(estados) &&\n undefined !== estados &&\n estados.length &&\n estados.map((row) => (\n \n {row.nome}\n \n ))}\n \n \n \n \n \n Cidade * \n \n {!isEmpty(cidade) &&\n cidade.length &&\n cidade.map((row) => (\n \n {row.nome}\n \n ))}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Categoria * \n \n {!isEmpty(categoria) &&\n undefined !== categoria &&\n typeof undefined !== categoria &&\n categoria.length &&\n categoria.map((row) => (\n \n {row.descricao}\n \n ))}\n \n \n \n \n \n \n {\n handleOnChangeHashtag(value)\n }}\n multiple\n getOptionDisabled={(option) =>\n hashtagLength === maxHashtags ? true : false\n }\n filterSelectedOptions\n limitTags={5}\n id=\"hashtag-selection\"\n options={hashtag}\n getOptionLabel={(option) => `#${option.descricao}`}\n groupBy={(option) => getCategoriaName(option.categoriaId)}\n renderInput={(params) => (\n \n )}\n />\n \n \n \n \n \n \n \n }\n label=\"Repassar taxa para cliente\"\n />\n \n Se ativado, por padrão, a taxa de serviço será repassada\n para o cliente.\n \n
\n \n \n \n \n \n \n {isAddPlace\n ? 'Avançar'\n : estabelecimento.id\n ? estabelecimento.loading\n ? 'Atualizando... '\n : 'Atualizar'\n : 'Avançar'}\n {estabelecimento.loading && }\n \n \n \n \n \n \n )\n}\n\nEstabelecimentoForm.propTypes = {\n className: PropTypes.string\n}\n\nexport default EstabelecimentoForm\n","import React from 'react'\nimport clsx from 'clsx'\nimport { Grid, makeStyles } from '@material-ui/core'\nimport { ProfileDetails, EstabelecimentoForm } from './components'\nimport { Page } from 'components'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst General = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n\n return (\n \n \n \n \n \n \n \n \n \n \n )\n}\n\nexport default General\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport clsx from 'clsx'\nimport { makeStyles } from '@material-ui/styles'\nimport {\n Avatar,\n Typography,\n Button,\n colors,\n Grid,\n CircularProgress,\n Backdrop\n} from '@material-ui/core'\nimport AddPhotoIcon from '@material-ui/icons/AddPhotoAlternate'\nimport { useSelector, useDispatch } from 'react-redux'\nimport CloudUploadTwoToneIcon from '@material-ui/icons/CloudUploadTwoTone'\nimport ImageUploading from 'react-images-uploading'\nimport { uploadImage } from '_services'\nimport { estabelecimentoAction } from '_actions'\nimport { errorsUploadImage } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n cover: {\n position: 'relative',\n height: 360,\n backgroundSize: 'cover',\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'center',\n '&:before': {\n position: 'absolute',\n content: '\" \"',\n top: 0,\n left: 0,\n height: '100%',\n width: '100%',\n backgroundImage:\n 'linear-gradient(-180deg, rgba(0,0,0,0.00) 58%, rgba(0,0,0,0.32) 100%)'\n },\n '&:hover': {\n '& $changeButton': {\n visibility: 'visible'\n }\n }\n },\n coverDragging: {\n height: 360\n },\n changeButton: {\n visibility: 'hidden',\n position: 'absolute',\n bottom: theme.spacing(3),\n right: theme.spacing(3),\n backgroundColor: colors.blueGrey[900],\n color: theme.palette.white,\n [theme.breakpoints.down('md')]: {\n top: theme.spacing(3),\n bottom: 'auto'\n },\n '&:hover': {\n backgroundColor: colors.blueGrey[900]\n }\n },\n addPhotoIcon: {\n marginRight: theme.spacing(1)\n },\n container: {\n width: theme.breakpoints.values.lg,\n maxWidth: '100%',\n padding: theme.spacing(2, 3),\n margin: '0 auto',\n position: 'relative',\n display: 'flex',\n flexWrap: 'wrap',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column'\n }\n },\n avatar: {\n border: `2px solid ${theme.palette.white}`,\n height: 120,\n width: 120,\n top: -60,\n left: theme.spacing(3),\n position: 'absolute',\n boxShadow: '0px 0px 7px 6px rgba(0,0,0,0.12)',\n borderRadius: '10px',\n webkitBorderRadius: '10px',\n mozBorderRadius: '10px'\n },\n details: {\n marginLeft: 136,\n [theme.breakpoints.down('xs')]: {\n maxWidth: theme.breakpoints.values.sm,\n marginLeft: 0,\n marginTop: 60\n }\n },\n actions: {\n marginLeft: 'auto',\n [theme.breakpoints.down('sm')]: {\n marginTop: theme.spacing(1)\n },\n '& > * + *': {\n marginLeft: theme.spacing(1)\n }\n },\n pendingButton: {\n color: theme.palette.white,\n backgroundColor: colors.red[600],\n '&:hover': {\n backgroundColor: colors.red[900]\n }\n },\n personAddIcon: {\n marginRight: theme.spacing(1)\n },\n mailIcon: {\n marginRight: theme.spacing(1)\n },\n backdrop: {\n zIndex: theme.zIndex.drawer + 1,\n color: '#fff'\n }\n}))\n\nconst Header = (props) => {\n const { className, ...rest } = props\n\n const classes = useStyles()\n\n const { estabelecimento } = useSelector((state) => ({\n estabelecimento: state.estabelecimento\n }))\n const [images, setImages] = useState([])\n const [open, setOpen] = useState(false)\n const dispatch = useDispatch()\n\n const onChange = (imageList) => {\n // data for submit\n setOpen(true)\n setImages(imageList)\n uploadImage(imageList[0])\n .then((response) => {\n let payload = {\n ...estabelecimento,\n banner: response\n }\n if (estabelecimento.id !== 0) {\n dispatch(\n estabelecimentoAction.editEstabelecimentoInfo(\n estabelecimento.id,\n payload\n )\n )\n }\n dispatch(estabelecimentoAction.onChangeProps('banner', response))\n setOpen(false)\n })\n .catch((err) => {\n console.log(err)\n setOpen(false)\n })\n }\n return (\n \n
\n \n \n \n \n \n \n Enviando imagem...\n \n \n \n \n
errorsUploadImage(errors)}\n value={images}\n onChange={onChange}\n dataURLKey=\"data_url\"\n >\n {({ onImageUpload, isDragging, dragProps }) => (\n \n {isDragging && (\n
\n \n \n \n \n \n Solte a imagem aqui!\n \n \n \n )}\n
\n \n {estabelecimento.banner !== null\n ? 'Trocar capa'\n : 'Adicionar capa'}\n \n
\n )}\n \n
\n
\n
\n \n @{estabelecimento.username}\n \n \n {estabelecimento.nome}\n \n
\n
\n
\n )\n}\n\nHeader.propTypes = {\n className: PropTypes.string\n}\n\nexport default Header\n","import React, { useEffect, useState } from 'react'\nimport { connect, useDispatch } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport validator from 'validator'\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n Link,\n Avatar,\n IconButton,\n Tooltip,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n DialogContentText,\n TextField,\n Grid,\n Typography\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport { withRouter, Link as RouterLink } from 'react-router-dom'\nimport { usuarioEstabelecimentoAction } from '../../../../../_actions'\nimport { useConfirm } from 'material-ui-confirm'\nimport getInitials from 'utils/getInitials'\nimport constants from 'theme/constants'\nimport { AccessControl } from 'components/Utils'\nconst styles = (theme) => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n avatar: {\n height: 42,\n width: 42,\n marginRight: theme.spacing(1)\n },\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n addButton: {\n display: 'flex',\n justifyContent: 'flex-end',\n alignItems: 'right'\n }\n})\nconst Usuarios = (props) => {\n const [open, setOpen] = React.useState(false)\n const [email, setEmail] = React.useState('')\n\n const handleClickOpen = (event) => {\n setOpen(true)\n }\n\n const handleClose = () => {\n setOpen(false)\n }\n const handleSubmit = (event) => {\n event.preventDefault()\n if (validator.isEmail(email)) {\n let payload = {\n email: email,\n estabelecimentoId: props.usuarioEstabelecimento.estabelecimentoId\n }\n dispatch(usuarioEstabelecimentoAction.addUsuarioByEmail(payload))\n setOpen(false)\n }\n }\n\n const handleChange = (event) => {\n setEmail(event.target.value)\n }\n\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes, usuarioEstabelecimento } = props\n\n useEffect(() => {\n dispatch(\n usuarioEstabelecimentoAction.getUsuarioEstabelecimentoByEstabelecimento(\n usuarioEstabelecimento.estabelecimentoId\n )\n )\n }, [dispatch, usuarioEstabelecimento.estabelecimentoId])\n\n const handleDeleteClick = (id) => {\n confirm({\n title: 'Você deseja excluir este Usuário?',\n description:\n 'Confirmando essa operação, este usuário não terá mais acesso ao sistema.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(usuarioEstabelecimentoAction.deleteUsuarioById(id))\n })\n }\n\n return (\n \n \n \n ADICIONAR USUÁRIO\n \n
\n {usuarioEstabelecimento.listUserPlace.length !== undefined &&\n usuarioEstabelecimento.listUserPlace.length !== 0 ? (\n \n \n Total de dados encontrados:{' '}\n {usuarioEstabelecimento.listUserPlace.length} \n \n \n ) : (\n \n {'Nenhum dado encontrado.'} \n \n )}\n \n \n \n \n Nome \n Email \n {/* Função */}\n Ações \n \n \n \n {undefined !== usuarioEstabelecimento.listUserPlace &&\n usuarioEstabelecimento.listUserPlace.length &&\n usuarioEstabelecimento.listUserPlace.map((n) => {\n return (\n \n \n \n
\n {getInitials(n.usuario.nome)}\n \n
(\n \n
\n {n.usuario.nome}\n \n
{n.usuario.email}
\n
\n )}\n no={() => (\n \n
\n {n.usuario.nome}\n \n
{n.usuario.email}
\n
\n )}\n />\n \n \n {/* {n.email} */}\n {n.usuario.email} \n \n handleDeleteClick(n.id)}\n >\n \n \n \n \n \n \n )\n })}\n \n
\n \n \n Adicionar usuário \n \n \n \n )\n}\nUsuarios.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return {\n usuario: state.usuario,\n usuarioEstabelecimento: state.usuarioEstabelecimento\n }\n}\nconst connectedUsuarioPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Usuarios))\n)\nexport { connectedUsuarioPage as Usuarios }\n","import React, { useEffect, useState } from 'react'\nimport { Map, GoogleApiWrapper, Marker, InfoWindow } from 'google-maps-react'\nimport Skeleton from '@material-ui/lab/Skeleton'\nimport { estabelecimentoAction } from '_actions'\nimport { useDispatch, useSelector } from 'react-redux'\n\nconst mapStyles = {\n width: '100%',\n position: 'relative',\n height: '300px',\n borderRadius: '10px'\n}\nconst containerStyle = {\n position: 'relative',\n width: '100%',\n height: '100%'\n}\n\nconst MapContainer = (props) => {\n const [showingInfoWindow, setShowingInfoWindow] = useState(false)\n const [activeMarker, setActiveMarker] = useState({})\n const [selectedPlace, setSelectedPlace] = useState({})\n const dispatch = useDispatch()\n const estabelecimento = useSelector((state) => state.estabelecimento)\n\n const onMarkerClick = (props, marker, e) => {\n setSelectedPlace(props)\n setActiveMarker(marker)\n setShowingInfoWindow(true)\n }\n\n const onClose = (props) => {\n if (showingInfoWindow) {\n setActiveMarker(null)\n setShowingInfoWindow(false)\n }\n }\n\n const onClick = (ref, map, coord) => {\n const { latLng } = coord\n const lat = latLng.lat()\n const lng = latLng.lng()\n let latLon = {\n x: lat,\n y: lng\n }\n dispatch(estabelecimentoAction.changeCoordinates(latLon))\n\n setActiveMarker(null)\n }\n\n return (\n \n {estabelecimento.latLon && (\n \n \n \n {estabelecimento.nome} \n {estabelecimento.endereco} \n \n {estabelecimento.bairro} - {estabelecimento.cep}\n \n \n \n )}\n
\n )\n}\n\nconst LoadingContainer = (props) => (\n \n \n \n \n
\n)\nexport default GoogleApiWrapper({\n language: 'pt-BR',\n apiKey: process.env.REACT_APP_MAPS_KEY,\n LoadingContainer: LoadingContainer\n})(MapContainer)\n","import React, { useEffect } from 'react'\nimport clsx from 'clsx'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { estabelecimentoAction } from '_actions'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Grid,\n Button,\n Divider,\n makeStyles,\n Typography\n} from '@material-ui/core'\nimport Map from './map'\nimport Geocode from 'react-geocode'\nimport { history } from 'utils'\nimport constants from 'theme/constants'\n// set Google Maps Geocoding API for purposes of quota management. Its optional but recommended.\nGeocode.setApiKey(process.env.REACT_APP_MAPS_KEY)\n\n// set response language. Defaults to english.\nGeocode.setLanguage('pt-BR')\n\n// set response region. Its optional.\n// A Geocoding request with region=es (Spain) will return the Spanish city.\nGeocode.setRegion('pt-BR')\n\n// Enable or disable logs. Its optional.\nGeocode.enableDebug()\n\nconst useStyles = makeStyles(() => ({\n root: {},\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst Location = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n const dispatch = useDispatch()\n const estabelecimento = useSelector((state) => state.estabelecimento)\n const { cidade } = useSelector((state) => state.cidade)\n const { estado } = useSelector((state) => state.estado)\n const usuarioId = useSelector((state) => state.authentication.user.id)\n const isAddPlace = useSelector(\n (state) => state.usuarioEstabelecimento.isAddPlace\n )\n // const onSubmit = props => {\n // let payload = {\n // id: estabelecimento.id,\n // latLon: [lat, long]\n // }\n // dispatch(estabelecimentoAction.editEstabelecimentoInfo(props.estabelecimento.id, payload));\n // };\n\n // useEffect(() => {\n // var options = {\n // enableHighAccuracy: true,\n // timeout: 5000,\n // maximumAge: 0\n // }\n\n // function success(position) {\n // const { latitude, longitude } = position.coords\n // setCoordinatesInit({\n // ...estabelecimento.latLon,\n // x: latitude,\n // y: longitude\n // })\n // }\n\n // function error(err) {\n // setCoordinatesInit({\n // ...estabelecimento.latLon,\n // x: -29.4487586,\n // y: -51.9659174\n // })\n // }\n\n // if (estabelecimento.latLon !== null) {\n // setCoordinatesInit({\n // ...estabelecimento.latLon,\n // x: estabelecimento.latLon.x,\n // y: estabelecimento.latLon.y\n // })\n // } else {\n // navigator.geolocation.getCurrentPosition(success, error, options)\n // }\n // }, [])\n\n useEffect(() => {\n if (!estabelecimento.id) {\n Geocode.fromAddress(\n prepareAddressFromState(estabelecimento, cidade, estado)\n ).then(\n (response) => {\n const { lat, lng } = response.results[0].geometry.location\n let latLon = {\n x: lat,\n y: lng\n }\n dispatch(estabelecimentoAction.changeCoordinates(latLon))\n },\n (error) => {\n console.error(error)\n }\n )\n }\n }, [])\n\n const onClickSaveButton = () => {\n let usuarioEstabelecimento = []\n usuarioEstabelecimento.push({\n id: 0,\n usuarioId: usuarioId,\n estabelecimentoId: 0\n })\n\n let payload = {\n id: estabelecimento.id,\n nome: estabelecimento.nome,\n detalhes: estabelecimento.detalhes,\n endereco: estabelecimento.endereco,\n numero: estabelecimento.numero,\n complemento: estabelecimento.complemento,\n capacidade: estabelecimento.capacidade,\n cidadeId: estabelecimento.cidadeId,\n estadoId: estabelecimento.estadoId,\n imagem: estabelecimento.imagem,\n banner: estabelecimento.banner,\n bairro: estabelecimento.bairro,\n cep: estabelecimento.cep,\n latLon: estabelecimento.latLon,\n username: estabelecimento.username,\n categoriaId: estabelecimento.categoriaId,\n repassarTaxa: estabelecimento.repassarTaxa,\n usuarioEstabelecimento: usuarioEstabelecimento,\n cpfCnpj: estabelecimento.cpfCnpj\n .split('.')\n .join('')\n .replace(/[-/.]/g, ''),\n estabelecimentoHashtag: estabelecimento.estabelecimentoHashtag\n }\n if (estabelecimento.id && !isAddPlace) {\n delete payload.usuarioEstabelecimento\n dispatch(\n estabelecimentoAction.editEstabelecimentoInfo(\n estabelecimento.id,\n payload\n )\n )\n } else {\n dispatch(estabelecimentoAction.createEstabelecimento(payload, isAddPlace))\n }\n }\n const prepareAddressFromState = (estabelecimento, cidade, estado) => {\n var estadoSelected = estado.find(\n (item) => item.id === estabelecimento.estadoId\n )\n var cidadeSelected = cidade.find(\n (item) => item.id === estabelecimento.cidadeId\n )\n return `${estabelecimento.endereco}, ${estabelecimento.numero} - ${estabelecimento.bairro} , ${cidadeSelected.nome} - ${estadoSelected.uf}, ${estabelecimento.cep}`\n }\n return (\n \n \n \n \n \n {estabelecimento.id\n ? 'Mantenha sempre a localização atualizada. '\n : 'Confirme se essa é a localização correta. '}\n Para alterar a localização é só clicar no mapa.{' '}\n \n Obs: A localização ajuda a Corujas a mostrar seu evento para as\n pessoas próximas do local.\n \n \n \n \n {estabelecimento.latLon && }\n \n \n \n \n \n history.push('general')}\n variant=\"contained\"\n color=\"inherit\"\n >\n Voltar\n \n \n {estabelecimento.id ? 'Salvar alterações' : 'Salvar'}\n \n \n \n )\n}\n\nexport default Location\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport {\n Card,\n CardHeader,\n CardContent,\n Grid,\n Divider,\n Typography,\n Avatar\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/styles'\nimport { HelperToolTip } from 'components'\nimport { getInitials } from 'utils'\n\nconst listNiveis = [\n {\n title: 'Alfa',\n subtitle: '0-25XP',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`,\n beneficios: [\n {\n title: '10%',\n subtitle: 'DE TAXA'\n },\n {\n title: '30 DIAS',\n subtitle: 'PARA PAGAMENTO'\n },\n {\n title: 'VISIBILIDADE ABAIXO DA MÉDIA',\n subtitle: ''\n }\n ]\n },\n {\n title: 'Beta',\n subtitle: '25-50XP',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`,\n beneficios: [\n {\n title: '10%',\n subtitle: 'DE TAXA'\n },\n {\n title: '30 DIAS',\n subtitle: 'PARA PAGAMENTO'\n },\n {\n title: 'VISIBILIDADE ABAIXO DA MÉDIA',\n subtitle: ''\n }\n ]\n },\n {\n title: 'Gama',\n subtitle: '50-75XP',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`,\n beneficios: [\n {\n title: '10%',\n subtitle: 'DE TAXA'\n },\n {\n title: '30 DIAS',\n subtitle: 'PARA PAGAMENTO'\n },\n {\n title: 'VISIBILIDADE ABAIXO DA MÉDIA',\n subtitle: ''\n }\n ]\n },\n {\n title: 'Delta',\n subtitle: '75-100XP',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`,\n beneficios: [\n {\n title: '10%',\n subtitle: 'DE TAXA'\n },\n {\n title: '30 DIAS',\n subtitle: 'PARA PAGAMENTO'\n },\n {\n title: 'VISIBILIDADE ABAIXO DA MÉDIA',\n subtitle: ''\n }\n ]\n }\n]\n\nconst listBeneficiosNivel = [\n {\n title: 'Taxa',\n subtitle: '10%',\n info: 'A Corujas ficará com 10% do valor do ingresso.',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`\n },\n {\n title: 'Prazo de Recebimento',\n subtitle: `X dias para receber!`,\n info: 'Você irá receber o pagamento dos eventos em X dias.',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`\n },\n {\n title: 'Visibilidade',\n subtitle: `Sua pontuação é: 6/10`,\n info:\n 'Quanto maior a pontuação, o estabelecimento estará mais visível na plataforma.',\n image: `https://picsum.photos/2${Math.floor(\n Math.random() * 10\n )}${Math.floor(Math.random() * 10)}`\n }\n]\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n content: {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'column',\n textAlgin: 'center'\n },\n rewardContent: {\n display: 'flex',\n alignItems: 'center',\n flexDirection: 'row',\n textAlign: 'center'\n },\n avatar: {\n height: 130,\n width: 130\n },\n cardNivel: {\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)',\n height: '350px'\n },\n cardNextNiveis: {\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)'\n },\n cardBeneficio: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n borderRadius: '8px'\n },\n card: {\n minHeight: '350px',\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px',\n boxShadow: '0px 2px 8px rgb(0 0 0 / 8%)'\n },\n alignContentCenter: {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n paddingTop: theme.spacing(3)\n }\n}))\n\nconst Level = () => {\n const classes = useStyles()\n const estabelecimento = useSelector((state) => state.estabelecimento)\n\n return (\n \n \n \n \n \n \n \n {getInitials(estabelecimento.nome)}\n \n \n {estabelecimento.nome}\n \n \n Nível atual: Alfa 6/100 xp\n \n \n \n \n \n \n \n \n \n \n {listBeneficiosNivel.map((item, index) => (\n \n \n \n \n \n \n {item.subtitle}\n \n {item.info} \n \n \n \n ))}\n \n \n \n \n \n \n \n \n \n \n {listNiveis.map((item, index) => (\n \n \n \n \n \n {item.title}\n \n \n {item.subtitle}\n \n {item.beneficios.map((item, index) => (\n \n {item.title} {item.subtitle}\n \n ))}\n \n \n \n ))}\n \n \n \n \n \n )\n}\n\nexport default Level\n","import React, { useEffect, useState } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { useConfirm } from 'material-ui-confirm'\r\nimport { toast } from 'react-toastify'\r\nimport { TextValidator, ValidatorForm } from 'react-material-ui-form-validator'\r\n\r\nimport {\r\n Box,\r\n Card,\r\n CardContent,\r\n CardHeader,\r\n Divider,\r\n Grid,\r\n Button,\r\n makeStyles,\r\n Typography,\r\n Collapse,\r\n CardActions,\r\n InputAdornment,\r\n CircularProgress\r\n} from '@material-ui/core'\r\n\r\nimport FacebookIcon from '@material-ui/icons/Facebook'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport SaveIcon from '@material-ui/icons/Save'\r\nimport PowerOffIcon from '@material-ui/icons/PowerOff'\r\nimport PowerIcon from '@material-ui/icons/Power'\r\n\r\n//? Own imports\r\nimport AccessDenied from 'views/Errors/AccessDenied'\r\nimport { HelperToolTip, Page } from 'components'\r\nimport { AccessControl } from 'components/Utils'\r\nimport constants from 'theme/constants'\r\nimport { Estabelecimento } from 'types/api'\r\nimport { useMutationEditEstablishment } from 'hooks-querys'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {},\r\n card: {\r\n ...constants.shadowCard,\r\n marginBottom: theme.spacing(2)\r\n },\r\n content: {\r\n padding: theme.spacing(2)\r\n },\r\n actions: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: theme.spacing(0, 0, 2, 2)\r\n },\r\n gridContainer: {\r\n marginTop: theme.spacing(1)\r\n },\r\n inputField: {\r\n marginTop: theme.spacing(2)\r\n },\r\n subtitle: {\r\n marginTop: theme.spacing(1)\r\n },\r\n connectedMessage: {\r\n marginTop: theme.spacing(1),\r\n color: theme.palette.success.main\r\n }\r\n}))\r\n\r\nconst Integrations = () => {\r\n const classes = useStyles()\r\n const confirm = useConfirm()\r\n const estabelecimento = useSelector(\r\n //@ts-ignore\r\n (state) => state.estabelecimento as Estabelecimento\r\n )\r\n\r\n const { mutateAsync, isLoading } = useMutationEditEstablishment(\r\n estabelecimento?.id\r\n )\r\n const pixelId = estabelecimento?.facebookPixelId\r\n const [inputPixelId, setInputPixelId] = useState(pixelId || '')\r\n const [isEditing, setIsEditing] = useState(false)\r\n const isEdition = pixelId?.localeCompare(inputPixelId) !== 0\r\n const isSameString = pixelId?.localeCompare(inputPixelId) !== 0\r\n\r\n const isConnected = !!pixelId\r\n const showInput = isEditing || isConnected\r\n const showCardActions = isEditing || isConnected\r\n const showConnectButton = !isConnected && !isEditing\r\n const showRemoveButton = !isEditing && isConnected && !isEdition\r\n const showCancelButton = isEditing\r\n const buttonTitle = isLoading ? 'Conectando...' : 'Conectar'\r\n\r\n useEffect(() => {\r\n setInputPixelId(estabelecimento?.facebookPixelId || '')\r\n }, [estabelecimento])\r\n\r\n const handlePressRemoveButton = () => {\r\n confirm({\r\n title: 'Você deseja desconectar o Pixel?',\r\n description: (\r\n \r\n \r\n Ao desconectar, o Pixel do Facebook deixará de rastrear os eventos e\r\n conversões deste estabelecimento.\r\n \r\n \r\n Obs: Essa ação pode impactar negativamente o desempenho de suas\r\n campanhas.\r\n \r\n
\r\n ),\r\n confirmationText: 'Sim, desconectar!',\r\n cancellationText: 'Não, cancelar'\r\n }).then(() => {\r\n mutateAsync({\r\n ...estabelecimento,\r\n facebookPixelId: null\r\n })\r\n .then(() => {\r\n setInputPixelId('')\r\n setIsEditing(false)\r\n toast.success('Facebook pixel desconectado com sucesso!')\r\n })\r\n .finally(() => {})\r\n })\r\n }\r\n const handleSavePixelId = () => {\r\n if (inputPixelId.trim() !== '') {\r\n setIsEditing(false)\r\n mutateAsync({\r\n ...estabelecimento,\r\n facebookPixelId: inputPixelId\r\n })\r\n .then(() => {\r\n toast.success(\r\n isEdition\r\n ? 'Facebook pixel alterado com sucesso!'\r\n : 'Facebook pixel conectado com sucesso!'\r\n )\r\n })\r\n .finally(() => {})\r\n }\r\n }\r\n\r\n const handlePressEdit = () => {\r\n setIsEditing(true)\r\n }\r\n\r\n const handleChangePixelId = (event: React.ChangeEvent) => {\r\n setInputPixelId(event.target.value)\r\n }\r\n\r\n const handlePressConnectButton = () => {\r\n setIsEditing(!isEditing)\r\n }\r\n const handlePressCancelEditButton = () => {\r\n setIsEditing(false)\r\n setInputPixelId(pixelId || '')\r\n }\r\n\r\n useEffect(() => {\r\n ValidatorForm.addValidationRule('isValidFacebookPixelId', (value) => {\r\n if (value?.length < 15 || value?.length > 20) {\r\n return false\r\n } else {\r\n return true\r\n }\r\n })\r\n\r\n return () => {\r\n ValidatorForm.removeValidationRule('isValidFacebookPixelId')\r\n }\r\n }, [])\r\n\r\n return (\r\n (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Facebook Pixel \r\n \r\n {showConnectButton && (\r\n \r\n }\r\n startIcon={ }\r\n >\r\n {buttonTitle}\r\n \r\n )}\r\n {showCancelButton && (\r\n \r\n Cancelar\r\n \r\n )}\r\n {showRemoveButton && (\r\n }\r\n endIcon={\r\n isLoading && \r\n }\r\n >\r\n {isLoading ? 'Desconectando...' : 'Desconectar'}\r\n \r\n )}\r\n \r\n {isConnected && (\r\n \r\n Pixel conectado com sucesso!\r\n \r\n )}\r\n \r\n Use o Facebook Pixel para rastrear e otimizar seus\r\n anúncios, alcançando mais clientes e medindo o\r\n desempenho de suas campanhas em tempo real.\r\n \r\n \r\n \r\n {isEditing && (\r\n 20\r\n ? 'error'\r\n : inputPixelId?.length >= 15\r\n ? 'primary'\r\n : 'initial'\r\n }\r\n >\r\n {inputPixelId?.length || 0}/20\r\n \r\n )}\r\n \r\n O Pixel ID é um identificador único para o\r\n seu Pixel do Facebook. Para encontrá-lo,\r\n acesse o Gerenciador de Eventos do Facebook,\r\n selecione o pixel desejado e copie o ID\r\n fornecido. Insira este ID aqui para conectar\r\n o pixel com sucesso.\r\n \r\n \r\n )\r\n }}\r\n label=\"Pixel ID\"\r\n variant=\"outlined\"\r\n inputProps={{ type: 'number' }}\r\n fullWidth\r\n className={classes.inputField}\r\n placeholder=\"Insira seu Pixel ID aqui\"\r\n value={inputPixelId}\r\n onChange={handleChangePixelId}\r\n disabled={!isEditing}\r\n />\r\n \r\n \r\n {showCardActions && (\r\n \r\n {isConnected && !isEditing && (\r\n }\r\n onClick={handlePressEdit}\r\n disabled={isLoading}\r\n endIcon={\r\n isLoading && \r\n }\r\n >\r\n {isLoading\r\n ? 'Salvando alteração...'\r\n : 'Editar Pixel ID'}\r\n \r\n )}\r\n {isEditing && (\r\n }\r\n type=\"submit\"\r\n disabled={isLoading || !isSameString}\r\n >\r\n Salvar\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n // @ts-ignore\r\n no={() => }\r\n />\r\n )\r\n}\r\n\r\nexport default Integrations\r\n","import React from 'react'\r\nimport { withRouter, Redirect } from 'react-router-dom'\r\nimport { connect, useDispatch, useSelector } from 'react-redux'\r\nimport PropTypes from 'prop-types'\r\nimport LocationCityRoundedIcon from '@material-ui/icons/LocationCityRounded'\r\nimport PeopleOutlineRoundedIcon from '@material-ui/icons/PeopleOutlineRounded'\r\nimport LocationOnRoundedIcon from '@material-ui/icons/LocationOnRounded'\r\nimport SettingsInputComponentRoundedIcon from '@material-ui/icons/SettingsInputComponentRounded'\r\nimport {\r\n Tabs,\r\n Tab,\r\n Divider,\r\n colors,\r\n withStyles,\r\n Button,\r\n Box,\r\n useMediaQuery,\r\n useTheme\r\n} from '@material-ui/core'\r\nimport { Page } from 'components'\r\nimport {\r\n Header,\r\n General,\r\n Location,\r\n Usuarios,\r\n Level,\r\n Integrations\r\n} from './components'\r\nimport { estabelecimentoAction } from '../../../_actions'\r\nimport { usuarioEstabelecimentoAction } from '_actions'\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n padding: theme.spacing(3)\r\n },\r\n tabs: {},\r\n divider: {\r\n backgroundColor: colors.grey[300]\r\n },\r\n content: {\r\n marginTop: theme.spacing(3)\r\n },\r\n box: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'flex-end',\r\n [theme.breakpoints.down('sm')]: {\r\n marginBottom: theme.spacing(3)\r\n }\r\n },\r\n bottomLeftBox: {\r\n display: 'flex',\r\n justifyContent: 'flex-end',\r\n alignItems: 'flex-end'\r\n }\r\n})\r\n\r\nconst EstabelecimentoEdit = (props) => {\r\n const { match, history } = props\r\n const { classes } = props\r\n const { tab } = match.params\r\n const dispatch = useDispatch()\r\n const theme = useTheme()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const isAddPlace = useSelector((state) => {\r\n return state.usuarioEstabelecimento.isAddPlace\r\n })\r\n const { usuarioEstabelecimento } = useSelector(\r\n (state) => state.usuarioEstabelecimento\r\n )\r\n\r\n const hasEstabelecimentoSelected = useSelector((state) => {\r\n if (\r\n state.usuarioEstabelecimento.estabelecimentoId === '' ||\r\n state.usuarioEstabelecimento.estabelecimentoId === undefined\r\n ) {\r\n return false\r\n }\r\n return true\r\n })\r\n\r\n const handleTabsChange = (event, value) => {\r\n history.push(value)\r\n }\r\n\r\n const getUsuarioEstabelecimentoId = useSelector((state) => {\r\n return state.usuarioEstabelecimento.id\r\n })\r\n\r\n const getBackupIndex = useSelector((state) => {\r\n let indexBackup = state.usuarioEstabelecimento.usuarioEstabelecimento.findIndex(\r\n (item) => item.id === state.usuarioEstabelecimento.backupId\r\n )\r\n return indexBackup\r\n })\r\n\r\n const handleAddPlace = () => {\r\n if (!isAddPlace) {\r\n dispatch(\r\n usuarioEstabelecimentoAction.setIsAddPlace(\r\n true,\r\n getUsuarioEstabelecimentoId\r\n )\r\n )\r\n dispatch(estabelecimentoAction.clearFields())\r\n history.push('/estabelecimento/general')\r\n } else {\r\n dispatch(\r\n usuarioEstabelecimentoAction.changeDetailsUsuarioEstabelecimento(\r\n usuarioEstabelecimento[getBackupIndex]\r\n )\r\n )\r\n dispatch(usuarioEstabelecimentoAction.setIsAddPlace(false, ''))\r\n }\r\n }\r\n\r\n const tabs = []\r\n {\r\n //Adicionar outro estabelecimento\r\n isAddPlace &&\r\n tabs.push({\r\n value: 'general',\r\n label: 'Adicionar',\r\n icon: \r\n })\r\n }\r\n {\r\n //Primeiro estabelecimento ou edição\r\n !isAddPlace &&\r\n tabs.push({\r\n value: 'general',\r\n label: 'Geral',\r\n icon: \r\n })\r\n }\r\n {\r\n //Definir melhor a localização via maps\r\n //isAddPlace &&\r\n tabs.push({\r\n disabled: !hasEstabelecimentoSelected || isAddPlace,\r\n value: 'location',\r\n label: 'Localização',\r\n icon: \r\n })\r\n }\r\n {\r\n //Tab de Usuários\r\n hasEstabelecimentoSelected &&\r\n !isAddPlace &&\r\n tabs.push({\r\n value: 'users',\r\n label: 'Usuários ',\r\n icon: \r\n })\r\n }\r\n {\r\n //Tab de Integrações\r\n hasEstabelecimentoSelected &&\r\n !isAddPlace &&\r\n tabs.push({\r\n value: 'integrations',\r\n label: 'Integrações ',\r\n icon: \r\n })\r\n }\r\n /*{\r\n //Level Tab\r\n hasEstabelecimentoSelected &&\r\n !isAddPlace &&\r\n tabs.push({\r\n value: 'level',\r\n label: 'Nível ',\r\n icon: \r\n })\r\n }*/\r\n\r\n if (!tab) {\r\n return \r\n }\r\n\r\n if (!tabs.find((t) => t.value === tab)) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n <>\r\n {hasEstabelecimentoSelected && (\r\n \r\n \r\n {!isAddPlace\r\n ? 'Adicionar Outro Estabelecimento'\r\n : 'Cancelar Adição'}\r\n \r\n \r\n )}\r\n >\r\n \r\n {tabs.map((tab) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {tab === 'general' && }\r\n {tab === 'location' && }\r\n {tab === 'users' && }\r\n {tab === 'level' && }\r\n {tab === 'integrations' && }\r\n
\r\n \r\n >\r\n )\r\n}\r\n\r\nEstabelecimentoEdit.propTypes = {\r\n history: PropTypes.object.isRequired,\r\n match: PropTypes.object.isRequired,\r\n classes: PropTypes.object.isRequired\r\n}\r\nconst mapStateToProps = (state) => {\r\n return {\r\n estabelecimento: state.estabelecimento,\r\n usuarioEstabelecimento: state.usuarioEstabelecimento\r\n }\r\n}\r\nconst connectedEstabelecimentoEditPage = withRouter(\r\n connect(mapStateToProps, null, null, {\r\n pure: false\r\n })(withStyles(styles)(EstabelecimentoEdit))\r\n)\r\nexport { connectedEstabelecimentoEditPage as EstabelecimentoEdit }\r\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Button, Grid, Typography } from '@material-ui/core'\nimport Image from 'material-ui-image'\nimport { history } from 'utils'\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(6),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(3) },\n button: {\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstCupomDesconto = () => {\n const classes = useStyles()\n const handleClickCupomDesconto = () => {\n history.push(`/cupomDescontos/cadastro`)\n }\n return (\n \n \n \n \n \n \n \n Você ainda não cadastrou nenhum cupom de desconto\n \n \n \n \n Cadastrar cupom! 🎟\n \n \n \n
\n )\n}\n\nexport default EmptyFirstCupomDesconto\n","import React, { useEffect, useState } from 'react'\r\nimport { connect, useDispatch, useSelector } from 'react-redux'\r\nimport { cupomDescontoAction, eventoAction, loteAction } from '_actions'\r\nimport PropTypes from 'prop-types'\r\nimport {\r\n withStyles,\r\n Table,\r\n TableContainer,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n useMediaQuery,\r\n Box,\r\n CircularProgress,\r\n Select,\r\n InputLabel,\r\n FormControl,\r\n Switch,\r\n InputAdornment,\r\n TextField,\r\n useTheme,\r\n Chip,\r\n MenuItem\r\n} from '@material-ui/core'\r\nimport DeleteIcon from '@material-ui/icons/Delete'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport { useLocation, useParams, withRouter } from 'react-router-dom'\r\nimport { history } from '../../utils'\r\nimport ShareIcon from '@material-ui/icons/Share'\r\nimport { useConfirm } from 'material-ui-confirm'\r\nimport { toLocalDateFormat } from 'utils'\r\nimport { AccessControl } from '../../components/Utils/AccessControl'\r\nimport DoneRoundedIcon from '@material-ui/icons/DoneRounded'\r\nimport DoneAllRoundedIcon from '@material-ui/icons/DoneAllRounded'\r\nimport { Page } from 'components'\r\nimport EmptyFirstCupomDesconto from './components/EmptyFirstCupomDesconto/EmptyFirstCupomDesconto'\r\nimport constants from 'theme/constants'\r\nimport { toast } from 'react-toastify'\r\nimport { shareEventCouponCode } from 'utils/linkShare'\r\nimport { Autocomplete } from '@material-ui/lab'\r\nimport { useEvents } from 'hooks-querys'\r\n\r\nconst styles = (theme) => ({\r\n root: {},\r\n paper: {\r\n ...constants.shadowCard\r\n },\r\n formControl: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2)\r\n },\r\n selectEmpty: {\r\n marginTop: theme.spacing(2)\r\n }\r\n})\r\n\r\nfunction useSearchQuery() {\r\n const { search } = useLocation()\r\n return React.useMemo(() => new URLSearchParams(search), [search])\r\n}\r\n\r\nconst CuponsDescontoList = (props) => {\r\n const confirm = useConfirm()\r\n const dispatch = useDispatch()\r\n const { classes } = props\r\n const [selectedEvento, setSelectedEvento] = useState({\r\n id: 0,\r\n nome: '',\r\n dataHoraInicio: null,\r\n dataHoraFim: null\r\n })\r\n const [eventoInputValue, setEventoInputValue] = useState('')\r\n const [loteId, setLoteId] = useState(0)\r\n const [showPastEvents, setShowPastEvents] = useState(false)\r\n const estabelecimentoId = useSelector(\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const { cupomDesconto, isLoading } = useSelector(\r\n (state) => state.cupomDesconto\r\n )\r\n const { lote: lotes } = useSelector((state) => state.evento)\r\n const theme = useTheme()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const querySearch = useSearchQuery()\r\n const {\r\n data: events,\r\n isLoading: isLoadingEvents,\r\n isFetching: isFetchingEvents\r\n } = useEvents(estabelecimentoId, showPastEvents, isMobile)\r\n\r\n useEffect(() => {\r\n setSelectedEvento({\r\n id: 0,\r\n nome: '',\r\n dataHoraInicio: null,\r\n dataHoraFim: null\r\n })\r\n setLoteId(0)\r\n setShowPastEvents(false)\r\n setEventoInputValue('')\r\n }, [estabelecimentoId])\r\n\r\n useEffect(() => {\r\n if (isMobile) {\r\n dispatch(eventoAction.getAllEventosByEstabelecimento(estabelecimentoId))\r\n } else {\r\n dispatch(\r\n eventoAction.getEventoByEstabelecimento(\r\n estabelecimentoId,\r\n showPastEvents\r\n )\r\n )\r\n }\r\n }, [estabelecimentoId, showPastEvents, isMobile])\r\n\r\n useEffect(() => {\r\n dispatch(\r\n cupomDescontoAction.getListCupomDesconto(\r\n loteId,\r\n selectedEvento ? selectedEvento.id : 0,\r\n estabelecimentoId\r\n )\r\n )\r\n }, [selectedEvento, loteId, estabelecimentoId])\r\n\r\n useEffect(() => {\r\n if (selectedEvento === null || selectedEvento.id === 0) {\r\n setLoteId(0)\r\n }\r\n }, [selectedEvento])\r\n\r\n useEffect(() => {\r\n if (selectedEvento && selectedEvento.id > 0) {\r\n dispatch(loteAction.getLotesByEvento(selectedEvento.id))\r\n }\r\n }, [selectedEvento])\r\n\r\n useEffect(() => {\r\n //? função executada para buscar o evento o qual esta na url (?eventId=)\r\n //? se não existir evento na url não faz nada\r\n\r\n const eventId = querySearch.get('eventoId') || 0\r\n if (eventId && Number(eventId) > 0) {\r\n const event =\r\n events &&\r\n events.length > 0 &&\r\n events.find((e) => e.id === Number(eventId))\r\n //? se encontrar o evento na url, seta o evento selecionado,\r\n //? se não encontrar, troca a o estado showPastEvents para true,\r\n //? pois o evento informado pode ser um evento passado, e não existir na lista de eventos;\r\n //? com isso, a lista de evento efetua um novo fetch para buscar os eventos passados,\r\n //? e gera um novo efeito colateral caindo nesse useEffect novamente\r\n\r\n if (event) {\r\n setSelectedEvento(event)\r\n } else if (selectedEvento === null) {\r\n setShowPastEvents(!showPastEvents)\r\n }\r\n }\r\n }, [events])\r\n\r\n const handleClick = (id) => {\r\n confirm({\r\n title: 'Você deseja excluir esse cupom de desconto?',\r\n description: 'Confirmando essa operação, ele não valerá mais.',\r\n confirmationText: 'Sim, excluir!',\r\n cancellationText: 'Nãããoo!'\r\n }).then(() => {\r\n dispatch(cupomDescontoAction.deleteCupomDescontoById(id))\r\n })\r\n }\r\n\r\n return (\r\n \r\n \r\n {\r\n setSelectedEvento(newValue)\r\n if (reason === 'clear') {\r\n //? se o usuário clicar no botão limpar\r\n setEventoInputValue('')\r\n history.push('/cupomDescontos')\r\n }\r\n }}\r\n getOptionLabel={(evento) =>\r\n evento.nome &&\r\n `${evento.nome} ${\r\n evento.dataHoraInicio\r\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\r\n : ''\r\n }`\r\n }\r\n placeholder=\"Selecione o evento...\"\r\n onInputChange={(event, newInputValue) => {\r\n newInputValue !== null\r\n ? setEventoInputValue(newInputValue)\r\n : setEventoInputValue('')\r\n }}\r\n inputValue={eventoInputValue}\r\n renderInput={(params) => (\r\n \r\n {!isMobile && (\r\n \r\n <>\r\n {isFetchingEvents && (\r\n \r\n )}\r\n {\r\n setShowPastEvents(event.target.checked)\r\n }}\r\n checked={showPastEvents}\r\n size=\"small\"\r\n inputProps={{\r\n 'aria-label': 'Listar eventos encerrados'\r\n }}\r\n />\r\n {\r\n setShowPastEvents(!showPastEvents)\r\n }}\r\n />\r\n >\r\n \r\n )}\r\n {params.InputProps.endAdornment}\r\n >\r\n )\r\n }}\r\n />\r\n )}\r\n />\r\n \r\n {selectedEvento && selectedEvento.id > 0 && lotes && lotes.length > 0 && (\r\n \r\n \r\n Filtrar por lote\r\n \r\n setLoteId(event.target.value)}\r\n fullWidth\r\n displayEmpty\r\n labelId=\"lote-select-label\"\r\n >\r\n {loteId === 0 ? (\r\n \r\n Selecione o lote... \r\n \r\n ) : (\r\n \r\n Limpar seleção \r\n \r\n )}\r\n {lotes &&\r\n lotes.length > 0 &&\r\n lotes.map((row) => (\r\n \r\n {row.tipoIngresso\r\n ? `${row.tipoIngresso.descricao} - ${row.descricao}`\r\n : row.descricao}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n {isLoading ? (\r\n \r\n \r\n \r\n Carregando dados... \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n // \r\n (\r\n \r\n {cupomDesconto && cupomDesconto.length > 0 ? (\r\n
\r\n Total de dados encontrados: {cupomDesconto.length} \r\n \r\n ) : null}\r\n {undefined !== cupomDesconto && cupomDesconto.length ? (\r\n
\r\n \r\n \r\n \r\n Código \r\n % Desconto \r\n Valor Desconto \r\n Quantidade Mínima \r\n \r\n Limite de Utilização\r\n \r\n \r\n Data Início Validade\r\n \r\n \r\n Data Término Validade\r\n \r\n Evento \r\n Lote \r\n Ações \r\n \r\n \r\n \r\n {cupomDesconto.map((n) => {\r\n return (\r\n \r\n \r\n {n.codigo}\r\n \r\n \r\n {n.percentualDesconto !== null &&\r\n n.percentualDesconto !== ''\r\n ? `${n.percentualDesconto}%`\r\n : '-----'}\r\n \r\n \r\n {n.valorDesconto !== null &&\r\n n.valorDesconto !== ''\r\n ? Intl.NumberFormat('pt-BR', {\r\n style: 'currency',\r\n currency: 'BRL'\r\n }).format(n.valorDesconto)\r\n : '-----'}\r\n \r\n \r\n {n.quantidadeMinima}\r\n \r\n \r\n {n.quantidade}\r\n \r\n \r\n {toLocalDateFormat(n.dataInicioValidade)}\r\n \r\n \r\n {toLocalDateFormat(n.dataTerminoValidade)}\r\n \r\n \r\n {n.eventoId ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {n.loteId ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {selectedEvento && selectedEvento.id > 0 ? (\r\n {\r\n const link = await shareEventCouponCode(\r\n selectedEvento,\r\n n\r\n )\r\n navigator.clipboard.writeText(link)\r\n toast.success(\r\n `Link para o evento com aplicação automática do cupom ${n.codigo} copiado com sucesso! 🎉`,\r\n {\r\n autoClose: 4000\r\n }\r\n )\r\n }}\r\n >\r\n \r\n \r\n ) : (\r\n {\r\n toast.warn(\r\n 'Selecione um evento para poder copiar o link com a aplicação automática deste cupom!',\r\n {\r\n autoClose: 8000\r\n }\r\n )\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n (\r\n \r\n history.push(\r\n `/cupomDesconto/cadastro/${n.id}`\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n handleClick(n.id)}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n })}\r\n \r\n
\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n )}\r\n />\r\n )}\r\n \r\n )\r\n}\r\nCuponsDescontoList.propTypes = {\r\n classes: PropTypes.object.isRequired\r\n}\r\nconst mapStateToProps = (state) => {\r\n return {\r\n cupomDesconto: state.cupomDesconto,\r\n estabelecimentoId: state.usuarioEstabelecimento.estabelecimentoId\r\n }\r\n}\r\nconst connectedCupomDescontoPage = withRouter(\r\n connect(mapStateToProps, null, null, {\r\n pure: false\r\n })(withStyles(styles)(CuponsDescontoList))\r\n)\r\nexport { connectedCupomDescontoPage as CuponsDescontoList }\r\n","import React, { useEffect } from 'react'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n MenuItem,\n Button,\n Tooltip,\n Grid,\n Checkbox,\n FormControlLabel,\n InputAdornment\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { cupomDescontoAction, eventoAction, loteAction } from '_actions'\nimport { HelperToolTip, ValidatedDatePicker } from 'components/'\nimport { toast } from 'react-toastify'\nimport { toISODateFormat, validateDates } from 'utils'\nimport { history } from 'utils'\nimport { isValid } from 'date-fns'\nimport { Page } from 'components'\nimport { makeStyles } from '@material-ui/styles'\nimport { useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n // padding: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst CupomDescontoEdit = (props) => {\n const dispatch = useDispatch()\n const classes = useStyles()\n const { cupomDesconto, usuarioEstabelecimento } = useSelector(\n (state) => state\n )\n const { evento, lote } = useSelector((state) => state.evento)\n\n const params = useParams()\n const handleChange = (prop) => (event) => {\n dispatch(cupomDescontoAction.onChangeProps(prop, event))\n }\n\n const selectValidOnAllEventos = () => (event) => {\n dispatch(cupomDescontoAction.selectValidOnAllEventos(event))\n }\n\n const cancelClick = () => {\n dispatch(cupomDescontoAction.clear())\n history.goBack()\n }\n\n useEffect(() => {\n if (\n cupomDesconto.eventoId !== null &&\n cupomDesconto.eventoId !== undefined &&\n cupomDesconto.eventoId !== ''\n ) {\n dispatch(loteAction.getLotesByEvento(cupomDesconto.eventoId))\n }\n }, [cupomDesconto.eventoId])\n\n useEffect(() => {\n if (params.idCupomDesconto) {\n dispatch(cupomDescontoAction.getCupomDescontoById(params.idCupomDesconto))\n } else {\n dispatch(cupomDescontoAction.clear())\n }\n\n dispatch(\n eventoAction.getEventoByEstabelecimento(\n usuarioEstabelecimento.estabelecimentoId\n )\n )\n ValidatorForm.addValidationRule('isValidDate', (value) => {\n if (value !== null && value !== undefined) {\n return isValid(new Date(toISODateFormat(value)))\n } else {\n return true\n }\n })\n\n return () => {\n ValidatorForm.removeValidationRule('isValidDate')\n }\n }, [])\n\n const handleSubmit = (event) => {\n event.preventDefault()\n\n if (\n !validateDates(\n cupomDesconto.dataInicioValidade,\n cupomDesconto.dataTerminoValidade\n )\n ) {\n toast.error('Opss! 😥 Datas incorretas, revise por favor!')\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n } else if (\n (cupomDesconto.percentualDesconto === '' ||\n cupomDesconto.percentualDesconto === null) &&\n (cupomDesconto.valorDesconto === '' ||\n cupomDesconto.valorDesconto === null)\n ) {\n toast.error(\n 'Opss! 😥 Você precisa inserir o percentual ou o valor do desconto!'\n )\n window.scrollTo({\n top: 0,\n behavior: 'smooth'\n })\n } else {\n let payload = {\n id: params.idCupomDesconto,\n codigo: cupomDesconto.codigo,\n percentualDesconto: cupomDesconto.percentualDesconto,\n valorDesconto: cupomDesconto.valorDesconto,\n dataInicioValidade: toISODateFormat(cupomDesconto.dataInicioValidade),\n dataTerminoValidade: toISODateFormat(cupomDesconto.dataTerminoValidade),\n estabelecimentoId: usuarioEstabelecimento.estabelecimentoId,\n eventoId: cupomDesconto.eventoId,\n loteId: cupomDesconto.loteId,\n quantidadeMinima: cupomDesconto.quantidadeMinima,\n quantidade: cupomDesconto.quantidade\n }\n\n if (params.idCupomDesconto) {\n dispatch(\n cupomDescontoAction.editCupomDescontoInfo(\n params.idCupomDesconto,\n payload\n )\n )\n dispatch(cupomDescontoAction.clear())\n } else {\n dispatch(cupomDescontoAction.createCupomDesconto(payload))\n dispatch(cupomDescontoAction.clear())\n }\n }\n }\n\n const handleChangeData = (prop, newValue) => {\n dispatch(cupomDescontoAction.onChangeData(prop, newValue))\n }\n\n return (\n \n \n \n \n \n \n \n )\n}\n\nexport default CupomDescontoEdit\n","import React from 'react'\r\nimport {\r\n TableBody,\r\n Table,\r\n makeStyles,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Typography,\r\n Toolbar,\r\n Tooltip,\r\n IconButton\r\n} from '@material-ui/core'\r\nimport { formatCurrency } from 'utils'\r\nimport ReactToPrint from 'react-to-print'\r\nimport { CSVLink } from 'react-csv'\r\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport constants from 'theme/constants'\r\nimport { toast } from 'react-toastify'\r\n\r\nconst headers = [\r\n { label: 'Código do Cupom', key: 'cupomDesconto' },\r\n { label: 'N.º de Utilizações', key: 'quantidadeUtilizacao' },\r\n { label: 'Valor Total (R$)', key: 'valorTotal' },\r\n { label: 'Valor Desconto (R$)', key: 'valorDesconto' }\r\n]\r\n\r\nconst prepareDataForCSV = (cuponsDescontoResult) => {\r\n return cuponsDescontoResult.map((row) => ({\r\n cupomDesconto: row.cupomDesconto,\r\n quantidadeUtilizacao: row.quantidadeUtilizacao,\r\n valorTotal: row.valorTotal,\r\n valorDesconto: row.valorDesconto\r\n }))\r\n}\r\n\r\nconst handleDownload = () => {\r\n toast.success('Download concluído com sucesso! 👍', {\r\n position: 'top-right'\r\n })\r\n}\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n rootToolbarStyles: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1)\r\n },\r\n titleToolbarStyles: {\r\n flex: '1 1 100%'\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n ...constants.shadowCard\r\n }\r\n}))\r\n\r\nconst TableUtilizacao = ({ cuponsDescontoResult }) => {\r\n const classes = useStyles()\r\n const refTable = React.useRef(null)\r\n const csvData = prepareDataForCSV(cuponsDescontoResult)\r\n return (\r\n <>\r\n \r\n {cuponsDescontoResult && cuponsDescontoResult.length !== 0 ? (\r\n <>\r\n
\r\n Total de dados encontrados: {cuponsDescontoResult.length} \r\n \r\n
\r\n \r\n \r\n Relatório de Utilizações\r\n \r\n {\r\n handleDownload()\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n content={() => refTable.current}\r\n />\r\n \r\n \r\n {cuponsDescontoResult && cuponsDescontoResult.length > 0 && (\r\n \r\n \r\n \r\n Código \r\n N.º de Utilizações \r\n Valor Total (R$) \r\n Valor Desconto (R$) \r\n \r\n \r\n \r\n {cuponsDescontoResult.map((row) => (\r\n \r\n \r\n {row.cupomDesconto ? row.cupomDesconto : '-----'}\r\n \r\n \r\n {row.quantidadeUtilizacao\r\n ? row.quantidadeUtilizacao\r\n : '-----'}\r\n \r\n \r\n {formatCurrency(row.valorTotal)}\r\n \r\n \r\n {formatCurrency(row.valorDesconto)}\r\n \r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n >\r\n ) : (\r\n
\r\n {'Nenhum dado encontrado.'} \r\n \r\n )}\r\n
\r\n >\r\n )\r\n}\r\n\r\nexport default TableUtilizacao\r\n","import {\n FormControl,\n InputLabel,\n makeStyles,\n Select,\n MenuItem,\n CircularProgress,\n Box,\n Typography,\n TextField,\n Chip,\n InputAdornment,\n Switch,\n useMediaQuery,\n useTheme\n} from '@material-ui/core'\nimport { Autocomplete } from '@material-ui/lab'\nimport { Page } from 'components'\nimport React, { useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { cupomDescontoAction, eventoAction, loteAction } from '_actions'\nimport TableUtilizacao from './components/TableUtilizacao'\nimport { toLocalDateFormat } from 'utils'\nconst useStyles = makeStyles((theme) => ({\n root: {},\n formControl: {\n width: '100%',\n marginBottom: theme.spacing(2)\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nconst CuponsDescontoUtilizacao = () => {\n const classes = useStyles()\n const [selectedEvento, setSelectedEvento] = useState({\n id: 0,\n nome: '',\n dataHoraInicio: null\n })\n const [eventoInputValue, setEventoInputValue] = useState('')\n const [loteId, setLoteId] = useState(0)\n const [showPastEvents, setShowPastEvents] = useState(false)\n const dispatch = useDispatch()\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const eventos = useSelector((state) => state.evento.evento)\n const { utilizacaoCuponsDesconto, isLoading } = useSelector(\n (state) => state.cupomDesconto\n )\n const { lote: lotes } = useSelector((state) => state.evento)\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n\n useEffect(() => {\n setSelectedEvento({\n id: 0,\n nome: '',\n dataHoraInicio: null\n })\n setLoteId(0)\n setShowPastEvents(false)\n setEventoInputValue('')\n }, [estabelecimentoId])\n\n useEffect(() => {\n if (isMobile) {\n dispatch(eventoAction.getAllEventosByEstabelecimento(estabelecimentoId))\n } else {\n dispatch(\n eventoAction.getEventoByEstabelecimento(\n estabelecimentoId,\n showPastEvents\n )\n )\n }\n }, [estabelecimentoId, showPastEvents, isMobile])\n\n useEffect(() => {\n dispatch(\n cupomDescontoAction.getUtilizacaoCupomDesconto(\n loteId,\n selectedEvento ? selectedEvento.id : 0,\n estabelecimentoId\n )\n )\n }, [selectedEvento, loteId, estabelecimentoId])\n\n useEffect(() => {\n if (selectedEvento === null || selectedEvento.id === 0) {\n setLoteId(0)\n }\n }, [selectedEvento])\n\n useEffect(() => {\n if (selectedEvento && selectedEvento.id > 0) {\n dispatch(loteAction.getLotesByEvento(selectedEvento.id))\n }\n }, [selectedEvento])\n\n return (\n \n \n {\n setSelectedEvento(newValue)\n }}\n getOptionLabel={(evento) =>\n evento.nome &&\n `${evento.nome} ${\n evento.dataHoraInicio\n ? ` - (${toLocalDateFormat(evento.dataHoraInicio)})`\n : ''\n }`\n }\n placeholder=\"Selecione o evento...\"\n onInputChange={(event, newInputValue) => {\n newInputValue !== null\n ? setEventoInputValue(newInputValue)\n : setEventoInputValue('')\n }}\n inputValue={eventoInputValue}\n renderInput={(params) => (\n \n {!isMobile && (\n \n <>\n {\n setShowPastEvents(event.target.checked)\n }}\n checked={showPastEvents}\n size=\"small\"\n inputProps={{\n 'aria-label': 'Listar eventos encerrados'\n }}\n />\n {\n setShowPastEvents(!showPastEvents)\n }}\n />\n >\n \n )}\n {params.InputProps.endAdornment}\n >\n )\n }}\n />\n )}\n />\n \n {selectedEvento && selectedEvento.id > 0 && lotes && lotes.length > 0 && (\n \n \n Filtrar por lote\n \n setLoteId(event.target.value)}\n fullWidth\n displayEmpty\n labelId=\"lote-select-label\"\n >\n {loteId === 0 ? (\n \n Selecione o lote... \n \n ) : (\n \n Limpar seleção \n \n )}\n {lotes &&\n lotes.length > 0 &&\n lotes.map((row) => (\n \n {row.tipoIngresso\n ? `${row.tipoIngresso.descricao} - ${row.descricao}`\n : row.descricao}\n \n ))}\n \n \n )}\n {isLoading ? (\n \n \n \n Carregando dados... \n \n \n \n \n \n \n ) : (\n \n )}\n \n )\n}\n\nexport default CuponsDescontoUtilizacao\n","import React from 'react'\nimport { Redirect, useParams } from 'react-router-dom'\nimport ListRoundedIcon from '@material-ui/icons/ListRounded'\nimport {\n Tabs,\n Tab,\n Divider,\n colors,\n makeStyles,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport AddCircleTwoToneIcon from '@material-ui/icons/AddCircleTwoTone'\nimport PieChartTwoToneIcon from '@material-ui/icons/PieChartTwoTone'\nimport EditTwoToneIcon from '@material-ui/icons/EditTwoTone'\nimport { Page, Header } from 'components'\nimport { CuponsDescontoList } from './CuponsDescontoList'\nimport CupomDescontoEdit from './CupomDescontoEdit'\nimport CuponsDescontoUtilizacao from './CuponsDescontoUtilizacao/CuponsDescontoUtilizacao'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: {\n marginTop: theme.spacing(3)\n },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst CuponsDesconto = (props) => {\n const { match, history } = props\n const { tab } = match.params\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const { idCupomDesconto, eventoId } = useParams()\n const handleTabsChange = (event, value) => {\n history.push(`/cupomDescontos/${value}`)\n }\n\n const tabs = [\n { value: 'lista', label: 'Lista', icon: },\n {\n value: 'cadastro',\n label: idCupomDesconto ? 'Editar' : 'Cadastrar',\n icon: idCupomDesconto ? : ,\n disabled: idCupomDesconto ? true : false\n },\n {\n value: 'utilizacao',\n label: 'Utilização',\n icon: \n }\n ]\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n \n \n \n {tabs.map((tab) => (\n \n ))}\n \n \n \n {tab === 'lista' && }\n {tab === 'cadastro' && }\n {tab === 'utilizacao' && }\n
\n \n )\n}\n\nexport default CuponsDesconto\n","import React, { useEffect } from 'react'\nimport { connect, useDispatch } from 'react-redux'\nimport { categoriaAction } from '../../_actions'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport AccessDenied from '../Errors/AccessDenied'\nimport { Page } from 'components'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nconst Categoria = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const { categoria } = props.categoria\n\n useEffect(() => {\n dispatch(categoriaAction.getCategoria())\n }, [dispatch])\n\n const handleClick = (id) => {\n confirm({\n title: 'Você deseja excluir este Categoria?',\n description:\n 'Confirmando essa operação, você não poderá cadastrar novos lotes com este tipo de categoria.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(categoriaAction.deleteCategoriaById(id))\n })\n }\n\n return (\n \n (\n \n {undefined !== categoria && categoria.length > 0 ? (\n
\n ) : (\n
\n )}\n
\n \n \n \n Descrição \n Ações \n \n \n \n {undefined !== categoria && categoria.length\n ? categoria.map((n) => {\n return (\n \n \n {n.descricao}\n \n \n (\n \n history.push(`/categoria/${n.id}`)\n }\n size=\"small\"\n >\n \n \n \n \n \n \n )}\n />\n (\n handleClick(n.id)}\n size=\"small\"\n >\n \n \n \n \n )}\n />\n \n \n )\n })\n : null}\n \n
\n \n
\n )}\n no={() => }\n />\n \n )\n}\nCategoria.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return {\n categoria: state.categoria\n }\n}\nconst connectedCategoriaPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Categoria))\n)\nexport { connectedCategoriaPage as Categoria }\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { withStyles } from '@material-ui/core/styles'\nimport Typography from '@material-ui/core/Typography'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n TextField,\n Grid\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { connect } from 'react-redux'\nimport { categoriaAction } from '../../_actions'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport { Page } from 'components'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nclass CategoriaEdit extends Component {\n handleChange = (prop) => (event) => {\n const { dispatch } = this.props\n dispatch(categoriaAction.onChangeProps(prop, event))\n }\n\n componentDidMount() {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n if (params.id) {\n dispatch(categoriaAction.getCategoriaById(params.id))\n } else {\n dispatch(categoriaAction.clear())\n }\n }\n\n handleSubmit(event) {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n\n let payload = {\n id: params.id,\n descricao: this.props.categoria.descricao\n }\n\n if (params.id) {\n dispatch(categoriaAction.editCategoriaInfo(params.id, payload))\n } else {\n dispatch(categoriaAction.createCategoria(payload))\n }\n }\n\n render() {\n const { classes } = this.props\n const {\n match: { params }\n } = this.props\n\n function InsertText() {\n return (\n \n {'Nova Categoria'} \n \n )\n }\n\n function EditText() {\n return (\n \n {'Editar Categoria'} \n \n )\n }\n function SegHeader() {\n if (params.id) {\n return \n }\n return \n }\n return (\n \n \n \n \n \n \n \n )\n }\n}\nCategoriaEdit.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return state\n}\n\nconst connectedCategoriaEditPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(CategoriaEdit))\n)\nexport { connectedCategoriaEditPage as CategoriaEdit }\n","import React, { useEffect, useState } from 'react'\nimport { connect, useDispatch, useSelector } from 'react-redux'\nimport { hashtagAction } from '../../_actions'\nimport PropTypes from 'prop-types'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport AccessDenied from '../Errors/AccessDenied'\nimport { Page } from 'components'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\n///////////////////////////////////////////////////////////////////////////////\n// material-ui imports\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n TextField,\n InputAdornment,\n Divider,\n Grid\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { useConfirm } from 'material-ui-confirm'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nconst Hashtag = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const { hashtag } = props.hashtag\n const [text, setText] = useState('')\n const { categoria } = useSelector((state) => state.categoria)\n\n const handleChangeText = (event) => {\n setText(event.target.value)\n }\n\n function searchForHashtag() {\n text !== '' && dispatch(hashtagAction.getHashtags('', '', text, '', ''))\n }\n\n const handleSubmitSearch = (event) => {\n event.preventDefault()\n searchForHashtag()\n }\n\n const handleDeleteClick = (id) => {\n confirm({\n title: 'Você deseja excluir esta Hashtag?',\n description:\n 'Confirmando essa operação, esta hashtag não estará mais disponível.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(hashtagAction.deleteHashtagById(id))\n searchForHashtag()\n })\n }\n\n const clearTextSearch = () => {\n setText('')\n dispatch(hashtagAction.getHashtags('', '', '', '', ''))\n }\n\n useDidMountEffect(() => {\n text === '' && searchForHashtag()\n }, [text])\n\n useEffect(() => {\n dispatch(hashtagAction.getHashtags('', '', '', '', ''))\n }, [dispatch])\n\n function getCategoriaName(categoriaId) {\n const categoriaItem = categoria.find((element) => element.id == categoriaId)\n if (categoriaItem !== (undefined && null)) {\n return categoriaItem.descricao\n }\n }\n\n return (\n \n (\n \n {undefined !== hashtag && hashtag.length > 0 ? (\n
\n ) : (\n
\n )}\n
\n \n \n \n \n
\n \n \n \n Nome \n Categoria \n Ações \n \n \n \n {undefined !== hashtag && hashtag.length\n ? hashtag.map((n) => {\n return (\n \n \n {n.descricao}\n \n \n {getCategoriaName(n.categoriaId)}\n \n \n (\n \n history.push(`/hashtag/${n.id}`)\n }\n size=\"small\"\n >\n \n \n \n \n \n \n )}\n />\n (\n handleDeleteClick(n.id)}\n size=\"small\"\n >\n \n \n \n \n )}\n />\n \n \n )\n })\n : null}\n \n
\n \n
\n )}\n no={() => }\n />\n \n )\n}\n\nHashtag.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return {\n hashtag: state.hashtag\n }\n}\n\nconst connectedHashtagPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Hashtag))\n)\n\nexport { connectedHashtagPage as Hashtag }\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'react-redux'\nimport { hashtagAction } from '../../_actions'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport { Page } from 'components'\n///////////////////////////////////////////////////////////////////////////////\n// material-ui imports\nimport { withStyles } from '@material-ui/core/styles'\nimport Typography from '@material-ui/core/Typography'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Grid,\n Button,\n MenuItem\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { UploadField } from 'components/Utils/Uploads'\nimport { toast } from 'react-toastify'\nimport constants from 'theme/constants'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nclass HashtagEdit extends Component {\n getURL = (prop) => (url) => {\n const { dispatch } = this.props\n dispatch(hashtagAction.onChangeProps(prop, url))\n }\n\n handleChange = (prop) => (event) => {\n const { dispatch } = this.props\n dispatch(hashtagAction.onChangeProps(prop, event))\n }\n\n componentDidMount() {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n if (params.id) {\n dispatch(hashtagAction.getHashtagById(params.id))\n } else {\n dispatch(hashtagAction.clear())\n }\n }\n\n handleSubmit(event) {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n\n if (this.props.hashtag.imagem === ('' || null)) {\n toast.error('Você precisa adicionar uma imagem para a hashtag!')\n } else {\n let payload = {\n id: params.id,\n descricao: this.props.hashtag.descricao,\n imagem: this.props.hashtag.imagem,\n banner: this.props.hashtag.banner,\n categoriaId: this.props.hashtag.categoriaId\n }\n\n if (params.id) {\n dispatch(hashtagAction.editHashtagInfo(params.id, payload))\n } else {\n dispatch(hashtagAction.createHashtag(payload))\n }\n }\n }\n\n render() {\n const { classes } = this.props\n const {\n match: { params }\n } = this.props\n const { categoria } = this.props.categoria\n\n function InsertText() {\n return (\n \n {'Nova Hashtag'} \n \n )\n }\n\n function EditText() {\n return (\n \n {'Editar Hashtag'} \n \n )\n }\n\n function HeaderSelection() {\n if (params.id) {\n return \n }\n return \n }\n\n return (\n \n \n \n \n \n \n \n )\n }\n}\n\nHashtagEdit.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return state\n}\n\nconst connectedHashtagEditPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(HashtagEdit))\n)\n\nexport { connectedHashtagEditPage as HashtagEdit }\n","import React, { useEffect, useState } from 'react'\nimport { connect, useDispatch } from 'react-redux'\nimport { conquistaAction } from '../../_actions'\nimport PropTypes from 'prop-types'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport AccessDenied from '../Errors/AccessDenied'\nimport { Page } from 'components'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\n///////////////////////////////////////////////////////////////////////////////\n// material-ui imports\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n TextField,\n InputAdornment,\n Divider,\n Grid,\n Typography\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { useConfirm } from 'material-ui-confirm'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\nimport FileCopyRoundedIcon from '@material-ui/icons/FileCopyRounded'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n }\n})\n\nconst Conquista = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const { conquista } = props.conquista\n const [textSearch, setTextSearch] = useState('')\n\n const handleChangeText = (event) => {\n setTextSearch(event.target.value)\n }\n\n function searchForConquista() {\n if (textSearch !== '') {\n dispatch(conquistaAction.findConquistas(textSearch))\n }\n }\n\n const handleSubmitSearch = (event) => {\n event.preventDefault()\n searchForConquista()\n }\n\n const handleDeleteClick = (id) => {\n confirm({\n title: 'Você deseja excluir esta Conquista?',\n description:\n 'Confirmando essa operação, esta conquista não estará mais disponível.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(conquistaAction.deleteConquistaById(id))\n dispatch(conquistaAction.getConquistas())\n })\n }\n\n const handleClickDuplicate = (id) => {\n confirm({\n title: 'Você deseja duplicar essa conquista?',\n description: (\n \n \n Todos os dados serão copiados e você só precisa realizar as\n alterações necessárias.\n \n
\n ),\n confirmationText: 'Sim, duplicar!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(conquistaAction.duplicateConquista(id))\n })\n }\n\n const clearTextSearch = () => {\n setTextSearch('')\n dispatch(conquistaAction.getConquistas())\n }\n\n useDidMountEffect(() => {\n textSearch === '' && searchForConquista()\n }, [textSearch])\n\n useEffect(() => {\n dispatch(conquistaAction.getConquistas())\n }, [dispatch])\n\n return (\n \n (\n \n {undefined !== conquista && conquista.length > 0 ? (\n
\n ) : (\n
\n )}\n
\n \n \n \n \n
\n \n \n \n Nome \n Descrição \n Experiêcia \n Ações \n \n \n \n {undefined !== conquista && conquista.length\n ? conquista.map((n) => {\n return (\n \n \n {n.nome}\n \n \n {n.descricao}\n \n \n {n.exp}\n \n \n (\n \n handleClickDuplicate(n.id)}\n >\n \n \n \n )}\n />\n (\n \n history.push(`/conquista/${n.id}`)\n }\n size=\"small\"\n >\n \n \n \n \n \n \n )}\n />\n (\n handleDeleteClick(n.id)}\n size=\"small\"\n >\n \n \n \n \n )}\n />\n \n \n )\n })\n : null}\n \n
\n \n
\n )}\n no={() => }\n />\n \n )\n}\n\nConquista.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return {\n conquista: state.conquista\n }\n}\n\nconst connectedHashtagPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Conquista))\n)\n\nexport { connectedHashtagPage as Conquista }\n","import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport { connect } from 'react-redux'\nimport { conquistaAction } from '../../_actions'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport { Page } from 'components'\nimport { toast } from 'react-toastify'\n///////////////////////////////////////////////////////////////////////////////\n// material-ui imports\nimport { withStyles } from '@material-ui/core/styles'\nimport Typography from '@material-ui/core/Typography'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Grid,\n Button\n} from '@material-ui/core'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport { UploadField } from 'components/Utils/Uploads'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(2)\n }\n})\n\nclass ConquistaEdit extends Component {\n getURL = (url) => {\n const { dispatch } = this.props\n dispatch(conquistaAction.onChangeProps('imagem', url))\n }\n\n handleChange = (prop) => (event) => {\n const { dispatch } = this.props\n dispatch(conquistaAction.onChangeProps(prop, event))\n }\n\n componentDidMount() {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n if (params.id) {\n dispatch(conquistaAction.getConquistaById(params.id))\n }\n }\n\n handleSubmit(event) {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n\n if (this.props.conquista.imagem === ('' || null)) {\n toast.error('Você precisa adicionar uma imagem para a conquista!')\n } else {\n let payload = {\n id: params.id,\n nome: this.props.conquista.nome,\n descricao: this.props.conquista.descricao,\n exp: this.props.conquista.experiencia,\n imagem: this.props.conquista.imagem\n }\n\n if (params.id) {\n dispatch(conquistaAction.editConquistaInfo(params.id, payload))\n } else {\n dispatch(conquistaAction.createConquista(payload))\n }\n }\n }\n\n handleCancel() {\n const { dispatch } = this.props\n history.push('/conquistas')\n dispatch(conquistaAction.clear())\n }\n\n render() {\n const { classes } = this.props\n const {\n match: { params }\n } = this.props\n\n function InsertText() {\n return (\n \n {'Nova Conquista'} \n \n )\n }\n\n function EditText() {\n return (\n \n {'Editar Conquista'} \n \n )\n }\n\n function HeaderSelection() {\n if (params.id) {\n return \n }\n return \n }\n\n return (\n \n \n \n \n \n \n \n )\n }\n}\n\nConquistaEdit.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nconst mapStateToProps = (state) => {\n return state\n}\n\nconst connectedHashtagEditPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(ConquistaEdit))\n)\n\nexport { connectedHashtagEditPage as ConquistaEdit }\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport {\n taxaAction,\n estabelecimentoAction,\n eventoAction,\n loteAction\n} from '../../_actions'\nimport PropTypes from 'prop-types'\nimport {\n makeStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { formatCurrency, history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport { Page } from 'components'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst Taxa = () => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const classes = useStyles()\n const { taxa } = useSelector((state) => state.taxa)\n const { estabelecimento } = useSelector((state) => state.estabelecimento)\n const { evento } = useSelector((state) => state.evento)\n const { lote } = useSelector((state) => state.lote)\n\n useEffect(() => {\n dispatch(taxaAction.getTaxa())\n dispatch(estabelecimentoAction.getEstabelecimento())\n dispatch(eventoAction.getAllEvents())\n dispatch(loteAction.getLote())\n }, [dispatch])\n\n const handleClick = (id) => {\n confirm({\n title: 'Você deseja excluir esta Taxa?',\n description: 'Confirmando essa operação, esta taxa não valerá mais.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(taxaAction.deleteTaxaById(id))\n })\n }\n\n function getEstabelecimentoNameById(estabelecimentoId) {\n let estabelecimentoObject = ''\n if (estabelecimento !== undefined) {\n estabelecimentoObject = estabelecimento.find(\n (element) => element.id == estabelecimentoId\n )\n if (estabelecimentoObject !== undefined) {\n return estabelecimentoObject.nome\n } else {\n return ''\n }\n } else {\n return ''\n }\n }\n\n function getEventoNameById(eventoId) {\n let eventoObject = ''\n if (evento !== undefined) {\n eventoObject = evento.find((element) => element.id == eventoId)\n if (eventoObject !== undefined) {\n return eventoObject.nome\n } else {\n return ''\n }\n } else {\n return ''\n }\n }\n\n function getLoteNameById(loteId) {\n let loteObject = ''\n if (lote !== undefined) {\n loteObject = lote.find((element) => element.id == loteId)\n if (loteObject !== undefined) {\n return loteObject.descricao\n } else {\n return ''\n }\n } else {\n return ''\n }\n }\n\n return (\n \n (\n \n {undefined !== taxa && taxa.length > 0 ? (\n
\n ) : (\n
\n )}\n
\n \n \n \n Código \n Percentual (%) \n Valor (R$) \n Estabelecimento \n Evento \n Lote \n Ações \n \n \n \n {taxa.map((n) => {\n return (\n \n \n {n.id}\n \n \n {n.percentual !== null && n.percentual !== ''\n ? `${n.percentual}%`\n : '-----'}\n \n \n {n.valor !== null && n.valor !== ''\n ? formatCurrency(n.valor)\n : '-----'}\n \n \n {getEstabelecimentoNameById(n.estabelecimentoId)}\n \n \n {getEventoNameById(n.eventoId)}\n \n \n {getLoteNameById(n.loteId)}\n \n \n (\n history.push(`/taxa/${n.id}`)}\n >\n \n \n \n \n )}\n />\n (\n handleClick(n.id)}\n >\n \n \n \n \n )}\n />\n \n \n )\n })}\n \n
\n \n
\n )}\n />\n \n )\n}\nTaxa.propTypes = {\n classes: PropTypes.object.isRequired\n}\n\nexport default Taxa\n","import React, { useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { eventoAction, estabelecimentoAction, loteAction } from '../../_actions'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n MenuItem,\n Grid,\n Tooltip,\n makeStyles\n} from '@material-ui/core'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { taxaAction } from '../../_actions'\nimport { history } from '../../utils'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { Page } from 'components'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n}))\n\nconst TaxaEdit = (props) => {\n const classes = useStyles()\n const {\n match: { params }\n } = props\n\n const { estabelecimento } = useSelector((state) => state.estabelecimento)\n const { evento, lote } = useSelector((state) => state.evento)\n const taxa = useSelector((state) => state.taxa)\n const dispatch = useDispatch()\n\n const handleChange = (prop) => (event) => {\n dispatch(taxaAction.onChangeProps(prop, event))\n }\n\n useEffect(() => {\n dispatch(estabelecimentoAction.getEstabelecimento())\n if (params.id) {\n dispatch(taxaAction.getTaxaById(params.id))\n } else {\n dispatch(taxaAction.clear())\n }\n return () => {\n dispatch(taxaAction.clear())\n }\n }, [])\n\n useDidMountEffect(() => {\n taxa.estabelecimentoId !== null &&\n taxa.estabelecimentoId !== undefined &&\n taxa.estabelecimentoId !== '' &&\n dispatch(eventoAction.getEventoByEstabelecimento(taxa.estabelecimentoId))\n }, [taxa.estabelecimentoId])\n\n useDidMountEffect(() => {\n taxa.eventoId !== null &&\n taxa.eventoId !== undefined &&\n taxa.eventoId !== '' &&\n dispatch(loteAction.getLotesByEvento(taxa.eventoId))\n }, [taxa.eventoId])\n\n const handleSubmit = (event) => {\n event.preventDefault()\n let payload = {\n id: taxa.id,\n percentual: taxa.percentual,\n valor: taxa.valor,\n estabelecimentoId: taxa.estabelecimentoId,\n eventoId: taxa.eventoId,\n loteId: taxa.loteId\n }\n\n if (params.id) {\n dispatch(taxaAction.editTaxaInfo(params.id, payload))\n } else {\n dispatch(taxaAction.createTaxa(payload))\n }\n }\n\n return (\n \n \n
\n \n handleSubmit(event)}\n >\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Estabelecimento * \n \n \n Limpar seleção \n \n {estabelecimento !== undefined &&\n estabelecimento.map((row) => (\n \n {row.nome + ' - ' + row.endereco}\n \n ))}\n \n \n \n 0 ? false : true}\n className={classes.textField}\n value={taxa.eventoId}\n onChange={handleChange('eventoId')}\n InputLabelProps={{\n shrink: true\n }}\n fullWidth\n displayEmpty\n labelId=\"eventoId\"\n >\n \n Evento \n \n \n Limpar seleção \n \n {evento !== undefined &&\n evento.map((row) => (\n \n {row.nome}\n \n ))}\n \n \n \n 0 ? false : true}\n className={classes.textField}\n value={taxa.loteId}\n onChange={handleChange('loteId')}\n InputLabelProps={{\n shrink: true\n }}\n fullWidth\n displayEmpty\n labelId=\"loteId\"\n >\n \n Lote \n \n \n Limpar seleção \n \n {lote !== undefined &&\n lote.map((row) => (\n \n {row.descricao}\n \n ))}\n \n \n \n \n \n \n history.push('/taxas')}\n variant=\"outlined\"\n >\n Cancelar\n \n \n {params.id ? 'Atualizar' : 'Salvar'}\n \n \n \n \n \n
\n \n )\n}\nTaxaEdit.propTypes = {\n classes: PropTypes.object.isRequired\n}\nexport default TaxaEdit\n","import React from 'react'\nimport { makeStyles } from '@material-ui/styles'\nimport { Button, Grid, Typography } from '@material-ui/core'\nimport Image from 'material-ui-image'\nimport { history } from 'utils'\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(6),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(3) },\n button: {\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstParametro = () => {\n const classes = useStyles()\n const handleClickParametro = () => {\n history.push(`/parametro`) //history.push(`/contaBancaria`)\n }\n return (\n \n \n \n \n Você ainda não cadastrou nenhum parâmetro\n \n \n \n \n Cadastrar agora!\n \n \n \n
\n )\n}\n\nexport default EmptyFirstParametro\n","import React, { useEffect } from 'react'\nimport { connect, useDispatch } from 'react-redux'\nimport { parametroAction } from '../../_actions'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport TitleContent from '../TitleContent'\nimport { Page } from 'components'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport CheckCircleTwoToneIcon from '@material-ui/icons/CheckCircleTwoTone'\nimport EmptyFirstParametro from './components/EmptyFirstParametro/EmptyFirstParametro'\nimport constants from 'theme/constants'\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n paper: {\n ...constants.shadowCard\n }\n})\n\nconst Parametro = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const { parametro } = props.parametro\n\n useEffect(() => {\n dispatch(parametroAction.getParametro())\n }, [dispatch])\n\n const handleClick = (id) => {\n confirm({\n title: 'Você deseja excluir esta Parâmetro?',\n description: 'Confirmando essa operação, este parâmetro não valerá mais.',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n dispatch(parametroAction.deleteParametroById(id))\n })\n }\n\n return (\n \n (\n \n {undefined !== parametro && parametro.length > 0 ? (\n
\n ) : (\n
\n )}\n {undefined !== parametro && parametro.length > 0 ? (\n
\n \n \n \n Chave \n Valor \n Descrição \n Ações \n \n \n \n {parametro.map((n) => {\n return (\n \n \n {n.chave}\n \n \n {n.valor}\n \n \n {n.descricao}\n \n \n (\n \n history.push(`/parametros/${n.id}`)\n }\n >\n \n \n \n \n )}\n />\n (\n handleClick(n.id)}\n >\n \n \n \n \n )}\n />\n \n \n )\n })}\n \n
\n \n ) : (\n
\n )}\n
\n )}\n />\n \n )\n}\nParametro.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return {\n parametro: state.parametro\n }\n}\nconst connectedParametroPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(Parametro))\n)\nexport { connectedParametroPage as Parametro }\n","import React, { Component, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { withStyles } from '@material-ui/core/styles'\nimport Typography from '@material-ui/core/Typography'\nimport { crudService } from '../../_services'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n Button,\n MenuItem,\n Checkbox,\n FormControlLabel,\n Grid\n} from '@material-ui/core'\nimport { connect } from 'react-redux'\nimport { parametroAction } from '../../_actions'\nimport { withRouter } from 'react-router-dom'\nimport { history } from '../../utils'\nimport { HelperToolTip } from 'components'\nimport { Page } from 'components'\nimport TextField from '@material-ui/core/TextField'\nimport Autocomplete from '@material-ui/lab/Autocomplete'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(2)\n }\n})\n\nclass ParametroEdit extends Component {\n constructor(props) {\n super(props)\n this.state = {}\n }\n\n handleChange = (prop) => (event) => {\n const { dispatch } = this.props\n dispatch(parametroAction.onChangeProps(prop, event))\n }\n\n componentDidMount() {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n if (params.id) {\n dispatch(parametroAction.getParametroById(params.id))\n } else {\n dispatch(parametroAction.clear())\n }\n }\n\n handleSubmit(event) {\n const {\n match: { params }\n } = this.props\n const { dispatch } = this.props\n\n let payload = {\n id: params.id,\n chave: this.props.parametro.chave,\n valor: this.props.parametro.valor,\n descricao: this.props.parametro.descricao\n }\n\n if (params.id) {\n dispatch(parametroAction.editParametroInfo(params.id, payload))\n } else {\n dispatch(parametroAction.createParametro(payload))\n }\n }\n\n render() {\n const { classes } = this.props\n const {\n match: { params }\n } = this.props\n\n function InsertText() {\n return (\n \n {'Novo Parâmetro'} \n \n )\n }\n\n function EditText() {\n return (\n \n {'Editar Parâmetro'} \n \n )\n }\n\n function SegHeader() {\n if (params.id) {\n return \n }\n return \n }\n return (\n \n \n \n this.handleSubmit(event)}\n >\n }\n />\n \n \n \n \n \n \n\n \n \n \n\n \n \n \n \n \n \n \n history.push('/parametros')}\n color=\"secondary\"\n variant=\"outlined\"\n >\n Cancelar\n \n \n {params.id ? 'Atualizar' : 'Salvar'}\n \n \n \n \n \n \n )\n }\n}\nParametroEdit.propTypes = {\n classes: PropTypes.object.isRequired\n}\nconst mapStateToProps = (state) => {\n return state\n}\n\nconst connectedParametroEditPage = withRouter(\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(ParametroEdit))\n)\nexport { connectedParametroEditPage as ParametroEdit }\n","import React from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\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 Paper from '@material-ui/core/Paper'\nimport PropTypes from 'prop-types'\nimport { Checkbox, Typography } from '@material-ui/core'\nimport LockOpenOutlinedIcon from '@material-ui/icons/LockOpenOutlined'\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined'\nvar pluralize = require('pluralize')\n\nconst useStyles = makeStyles((theme) => ({\n table: {},\n header: {\n paddingBottom: theme.spacing(1)\n }\n}))\n\nexport default function TablePermissoes(props) {\n const classes = useStyles()\n const { permissoes, onCheckedPermissao } = props\n\n return (\n <>\n \n {permissoes.length !== 0 && (\n \n {`${pluralize('permissões', permissoes.length, true)} ${pluralize(\n 'encontrada',\n permissoes.length\n )}:`}\n \n )}\n
\n \n \n \n \n Permissão \n Permitido \n \n \n \n {permissoes.map((row) => (\n \n \n {row.permissao.descricao}\n \n \n }\n checkedIcon={ }\n size=\"small\"\n checked={row.permitido}\n color=\"primary\"\n value={row.id}\n onChange={() => onCheckedPermissao(row.id)}\n inputProps={{ 'aria-label': 'secondary checkbox' }}\n />\n \n \n ))}\n \n
\n \n >\n )\n}\n\nTablePermissoes.propTypes = {\n permissoes: PropTypes.array.isRequired,\n onCheckedPermissao: PropTypes.func\n}\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport {\n permissaoTipoUsuarioAction,\n tipoUsuarioAction\n} from '../../../../_actions'\nimport {\n MenuItem,\n Grid,\n makeStyles,\n FormControl,\n Select,\n InputLabel,\n FormControlLabel,\n Checkbox,\n Button,\n useTheme,\n useMediaQuery,\n CircularProgress\n} from '@material-ui/core'\nimport { Page } from 'components'\nimport TablePermissoes from '../TablePermissoes/TablePermissoes'\nimport DoneRoundedIcon from '@material-ui/icons/DoneRounded'\nimport { AccessControl } from 'components/Utils/AccessControl'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2, 2, 2, 2)\n },\n formControl: {\n minWidth: 260\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n content: {\n marginBottom: theme.spacing(2)\n },\n buttonSubmit: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst PermissaoTipoUsuario = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { tipoUsuario, permissaoTipoUsuario } = useSelector((state) => state)\n const { tipoUsuarioId, isLoading } = permissaoTipoUsuario\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const isEmptyPermissaoTipoUsuario =\n permissaoTipoUsuario.permissaoTipoUsuario.length === 0 ? true : false\n\n useEffect(() => {\n dispatch(tipoUsuarioAction.getTipoUsuarioSelect())\n dispatch(permissaoTipoUsuarioAction.clear())\n }, [])\n\n useEffect(() => {\n dispatch(\n permissaoTipoUsuarioAction.handleCheckAllPermissaoTipoUsuario(\n permissaoTipoUsuario.checkedAll\n )\n )\n }, [permissaoTipoUsuario.checkedAll])\n\n const handleChangeSelected = () => (event) => {\n if (event.target.value && event.target.value > 0) {\n dispatch(\n permissaoTipoUsuarioAction.getPermissaoTipoUsuario(event.target.value)\n )\n } else {\n dispatch(permissaoTipoUsuarioAction.clear())\n }\n }\n\n const handleChangePermissaoTipoUsuario = (idPermissaoTipoUsuario) => {\n dispatch(\n permissaoTipoUsuarioAction.handleCheckedPermitido(idPermissaoTipoUsuario)\n )\n }\n\n const handleSubmitPermissaoTipoUsuario = () => {\n dispatch(\n permissaoTipoUsuarioAction.createPermissaoTipoUsuario(\n permissaoTipoUsuario.permissaoTipoUsuario\n )\n )\n }\n const handleChangeCheckedAll = () => {\n dispatch(permissaoTipoUsuarioAction.handleChangeCheckAll())\n }\n\n return (\n (\n \n \n \n \n \n Tipo de usuário\n \n \n \n Selecione... \n \n {tipoUsuario.tipoUsuario.map((row) => (\n \n {row.text}\n \n ))}\n \n \n \n \n \n }\n label=\"Marcar/desmarcar todos\"\n />\n \n \n {!isEmptyPermissaoTipoUsuario && (\n <>\n \n \n \n \n ) : (\n \n )\n }\n className={classes.buttonSubmit}\n variant=\"contained\"\n onClick={handleSubmitPermissaoTipoUsuario}\n color=\"primary\"\n >\n {isLoading ? 'Enviando informações...' : 'Salvar'}\n \n \n \n >\n )}\n \n )}\n > \n )\n}\n\nexport default PermissaoTipoUsuario\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { permissaoUsuarioAction, usuarioAction } from '../../../../_actions'\nimport {\n MenuItem,\n Grid,\n makeStyles,\n FormControl,\n Select,\n InputLabel,\n FormControlLabel,\n Checkbox,\n Button,\n useTheme,\n useMediaQuery,\n CircularProgress\n} from '@material-ui/core'\nimport { Page } from 'components'\nimport TablePermissoes from '../TablePermissoes/TablePermissoes'\nimport DoneRoundedIcon from '@material-ui/icons/DoneRounded'\nimport { AccessControl } from 'components/Utils/AccessControl'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(2, 2, 2, 2)\n },\n formControl: {\n minWidth: 260\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n content: {\n marginBottom: theme.spacing(2)\n },\n buttonSubmit: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst PermissaoUsuario = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { usuario, permissaoUsuario } = useSelector((state) => state)\n const { usuarioId, isLoading } = permissaoUsuario\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const isEmptyPermissaoUsuario =\n permissaoUsuario.permissaoUsuario.length === 0 ? true : false\n\n useEffect(() => {\n dispatch(usuarioAction.getUsuarioSelect())\n dispatch(permissaoUsuarioAction.clear())\n }, [])\n\n useEffect(() => {\n dispatch(\n permissaoUsuarioAction.handleCheckAllPermissaoUsuario(\n permissaoUsuario.checkedAll\n )\n )\n }, [permissaoUsuario.checkedAll])\n\n const handleChangeSelected = () => (event) => {\n if (event.target.value && event.target.value > 0) {\n dispatch(permissaoUsuarioAction.getPermissaoUsuario(event.target.value))\n } else {\n dispatch(permissaoUsuarioAction.clear())\n }\n }\n\n const handleChangePermissaoUsuario = (idPermissaoUsuario) => {\n dispatch(permissaoUsuarioAction.handleCheckedPermitido(idPermissaoUsuario))\n }\n\n const handleSubmitPermissaoUsuario = () => {\n dispatch(\n permissaoUsuarioAction.createPermissaoUsuario(\n permissaoUsuario.permissaoUsuario\n )\n )\n }\n const handleChangeCheckedAll = () => {\n dispatch(permissaoUsuarioAction.handleChangeCheckAll())\n }\n\n return (\n (\n \n \n \n \n Usuário \n \n \n Selecione... \n \n {usuario.usuario.map((row) => (\n \n {row.text}\n \n ))}\n \n \n \n \n \n }\n label=\"Marcar/desmarcar todos\"\n />\n \n \n {!isEmptyPermissaoUsuario && (\n <>\n \n \n \n \n ) : (\n \n )\n }\n className={classes.buttonSubmit}\n variant=\"contained\"\n onClick={handleSubmitPermissaoUsuario}\n color=\"primary\"\n >\n {isLoading ? 'Enviando informações...' : 'Salvar'}\n \n \n \n >\n )}\n \n )}\n > \n )\n}\n\nexport default PermissaoUsuario\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {\n Tabs,\n Tab,\n Divider,\n colors,\n useTheme,\n makeStyles,\n useMediaQuery\n} from '@material-ui/core'\nimport PeopleAltTwoToneIcon from '@material-ui/icons/PeopleAltTwoTone'\nimport PersonOutlineTwoToneIcon from '@material-ui/icons/PersonOutlineTwoTone'\nimport { Redirect } from 'react-router-dom'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport { Header, Page } from 'components'\nimport { PermissaoTipoUsuario, PermissaoUsuario } from './components'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: { paddingTop: theme.spacing(2) },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n}))\n\nconst Permissao = (props) => {\n const { match, history } = props\n const classes = useStyles()\n const { tab } = match.params\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n\n const handleTabsChange = (event, value) => {\n history.push(value)\n }\n\n const tabs = [\n {\n value: 'permissaoTipoUsuario',\n label: 'Permissão por tipo de usuário',\n icon: \n }\n ]\n {\n tabs.push({\n value: 'permissaoUsuario',\n label: 'Permissão por usuário',\n icon: \n })\n }\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n \n (\n <>\n \n \n {tabs.map((tab) => (\n \n ))}\n \n \n \n {tab === 'permissaoTipoUsuario' &&
}\n {tab === 'permissaoUsuario' &&
}\n
\n >\n )}\n > \n \n )\n}\n\nPermissao.propTypes = {\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired\n}\n\nexport default Permissao\n","import React, { useEffect, useState } from 'react'\nimport {\n Grid,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n makeStyles,\n TextField,\n InputAdornment,\n IconButton,\n Divider\n} from '@material-ui/core'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { eventoAction, avaliacaoAction, usuarioAction } from '_actions'\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\nimport { useParams } from 'react-router-dom'\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\nimport CloseIcon from '@material-ui/icons/Close'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n flexGrow: 1\n },\n formControl: {\n width: '100%'\n },\n selectEmpty: {\n marginTop: theme.spacing(2)\n },\n divider: {\n height: 28,\n margin: 4\n }\n}))\n\nconst SelectEvent = () => {\n const dispatch = useDispatch()\n const classes = useStyles()\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const eventos = useSelector((state) => state.evento.evento)\n const [eventoId, setEventoId] = useState('')\n const params = useParams()\n\n const handleChange = (event) => {\n setEventoId(event.target.value)\n setTexto('')\n }\n const [texto, setTexto] = useState('')\n\n const handleChangeTexto = (event) => {\n setTexto(event.target.value)\n }\n\n function search() {\n const payload = { EventoId: eventoId, SearchText: texto }\n eventoId > 0 &&\n dispatch(avaliacaoAction.searchAvaliacaoByEventId(payload, eventoId))\n }\n\n const handleSubmitSearch = (event) => {\n event.preventDefault()\n search()\n }\n\n const clearTextSearch = () => {\n setTexto('')\n }\n\n useDidMountEffect(() => {\n texto === '' && search()\n }, [texto])\n\n useEffect(() => {\n if (eventoId === '') {\n dispatch(avaliacaoAction.clearAll())\n }\n dispatch(eventoAction.getEventoByEstabelecimento(estabelecimentoId, true))\n dispatch(usuarioAction.getUsuario())\n }, [estabelecimentoId])\n\n useDidMountEffect(() => {\n setEventoId('')\n dispatch(avaliacaoAction.clearAll())\n setTexto('')\n }, [estabelecimentoId])\n\n useEffect(() => {\n !!params.eventoId && params.eventoId > 0 && setEventoId(params.eventoId)\n }, [params.eventoId])\n\n useDidMountEffect(() => {\n search()\n }, [eventoId])\n\n useEffect(() => {\n return () => {\n dispatch(avaliacaoAction.clearAll())\n }\n }, [])\n\n return (\n \n
\n \n \n \n Evento\n \n \n \n Selecione o evento... \n \n {eventos !== undefined &&\n eventos.map((row) => (\n \n {row.nome}\n \n ))}\n \n \n \n {eventoId > 0 && (\n <>\n \n \n \n >\n )}\n \n
\n )\n}\n\nexport default SelectEvent\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { avaliacaoAction, comentarioAction } from '_actions'\nimport { toLocalDateFormat, useDidMountEffect } from 'utils'\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n Button,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n Typography\n} from '@material-ui/core'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport ReportProblemRoundedIcon from '@material-ui/icons/ReportProblemRounded'\nimport FavoriteRoundedIcon from '@material-ui/icons/FavoriteRounded'\nimport FavoriteBorderRoundedIcon from '@material-ui/icons/FavoriteBorderRounded'\nimport DeleteForeverRoundedIcon from '@material-ui/icons/DeleteForeverRounded'\nimport { Rating } from '@material-ui/lab'\nimport { MessageData, SkeletonTable } from 'components'\n\nconst DetailAndComment = () => {\n const dispatch = useDispatch()\n const confirm = useConfirm()\n const { usuario } = useSelector((state) => state.usuario)\n const avaliacao = useSelector((state) => state.avaliacao)\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n const avaliacaoId = useSelector((state) => state.avaliacao.id)\n const { comentario } = useSelector((state) => state.comentario)\n const isLoading = useSelector((state) => state.comentario.isLoading)\n const reload = useSelector((state) => state.comentario.reload)\n\n const handleClose = () => {\n dispatch(avaliacaoAction.setDetailOpen(false, null))\n }\n\n const handleLikeComment = (commentId) => {\n dispatch(comentarioAction.likeComment(commentId, avaliacaoId))\n }\n\n const handleReportComment = () => {\n //dispatch(comentarioAction.reportComment(commentId))\n }\n\n const handleDeleteComment = (commentId) => {\n confirm({\n title: 'Você deseja excluir esse comentário?',\n description: (\n \n \n Confirmando essa operação, seu comentário será excluido.\n \n
\n ),\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(comentarioAction.deleteComment(commentId, reload))\n })\n }\n\n function getUsuarioNameById(usuarioId) {\n let user = ''\n user = usuario.find((element) => element.id == usuarioId)\n if (user !== (null || undefined)) {\n return user.nome\n } else {\n return ''\n }\n }\n\n useEffect(() => {\n dispatch(comentarioAction.getComentarioByAvaliacao(avaliacaoId))\n }, [dispatch, avaliacaoId])\n\n useDidMountEffect(() => {\n dispatch(comentarioAction.getComentarioByAvaliacao(avaliacaoId))\n }, [reload])\n\n return (\n \n \n Comentários da avaliação de {getUsuarioNameById(avaliacao.usuarioId)}\n \n \n \n {avaliacao.mensagem} \n <>\n {comentario !== undefined && comentario.length > 0 ? (\n \n \n {isLoading ? (\n
\n ) : (\n
\n \n \n Usuário \n Comentário \n Curtidas \n Data/Hora \n Ações \n \n \n \n {comentario.map((n) => {\n return (\n <>\n {n.comentario != (null || undefined) && (\n \n \n {getUsuarioNameById(n.comentario.usuarioId)}\n \n \n {n.comentario.mensagem}\n \n \n {n.numeroCurtidas}\n \n \n {toLocalDateFormat(n.comentario.dataHora)}\n \n \n (\n \n handleLikeComment(n.comentario.id)\n }\n disabled={\n n.comentario.usuarioId ===\n usuarioEstabelecimento.usuarioId\n }\n >\n <>\n {n.usuarioCurtiu ? (\n \n \n \n ) : (\n \n \n \n )}\n >\n \n )}\n />\n (\n \n handleReportComment(n.comentario.id)\n }\n disabled={\n n.comentario.usuarioId ===\n usuarioEstabelecimento.usuarioId\n }\n >\n \n \n \n \n )}*/\n />\n (\n \n handleDeleteComment(n.comentario.id)\n }\n disabled={\n n.comentario.usuarioId !==\n usuarioEstabelecimento.usuarioId\n }\n >\n \n \n \n \n )}\n />\n \n \n )}\n >\n )\n })}\n \n
\n )}\n
\n \n ) : (\n \n {isLoading ? (\n \n ) : (\n \n )}\n
\n )}\n >\n \n \n \n Fechar\n \n \n \n )\n}\n\nexport default DetailAndComment\n","import React from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { avaliacaoAction, comentarioAction } from '_actions'\nimport { getCurrentDateTime } from 'utils'\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n TextField,\n Button\n} from '@material-ui/core'\n\nconst AnswerRating = () => {\n const dispatch = useDispatch()\n const { usuario } = useSelector((state) => state.usuario)\n const avaliacao = useSelector((state) => state.avaliacao)\n const comentario = useSelector((state) => state.comentario)\n const usuarioEstabelecimento = useSelector(\n (state) => state.usuarioEstabelecimento\n )\n\n const handleClose = () => {\n dispatch(comentarioAction.changeAnswer(null, null))\n dispatch(avaliacaoAction.setAnswerRatingOpen(false, null))\n }\n\n function getUsuarioNameById(usuarioId) {\n let user = ''\n user = usuario.find((element) => element.id == usuarioId)\n if (user !== (null || undefined)) {\n return user.nome\n } else {\n return ''\n }\n }\n\n const handleSubmit = (event) => {\n event.preventDefault()\n let payload = {\n usuarioId: usuarioEstabelecimento.usuarioId,\n dataHora: getCurrentDateTime(),\n mensagem: comentario.mensagem,\n avaliacaoId: avaliacao.id\n }\n dispatch(comentarioAction.sendAnswer(payload))\n dispatch(avaliacaoAction.setAnswerRatingOpen(false, null))\n }\n\n const handleChange = (prop) => (event) => {\n dispatch(comentarioAction.changeAnswer(prop, event))\n }\n\n return (\n \n \n Responder avaliação de {getUsuarioNameById(avaliacao.usuarioId)}\n \n \n \n )\n}\n\nexport default AnswerRating\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n makeStyles\n} from '@material-ui/core'\nimport Rating from '@material-ui/lab/Rating'\nimport FavoriteRoundedIcon from '@material-ui/icons/FavoriteRounded'\nimport FavoriteBorderRoundedIcon from '@material-ui/icons/FavoriteBorderRounded'\nimport QuestionAnswerRoundedIcon from '@material-ui/icons/QuestionAnswerRounded'\nimport AspectRatioRoundedIcon from '@material-ui/icons/AspectRatioRounded'\nimport ReportProblemRoundedIcon from '@material-ui/icons/ReportProblemRounded'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport { toLocalDateFormat } from 'utils'\nimport { MessageData, SkeletonTable } from 'components'\nimport { avaliacaoAction, usuarioAction } from '_actions'\nimport DetailAndComment from 'views/Avaliacoes/components/DetailAndComment'\nimport AnswerRating from 'views/Avaliacoes/components/AnswerRating'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(4, 0, 4, 0)\n },\n card: {\n marginBottom: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n }\n}))\nconst TableEventRating = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { avaliacao: rating, isLoading, eventoId } = useSelector(\n (state) => state.avaliacao\n )\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const { usuario } = useSelector((state) => state.usuario)\n\n function getUsuarioNameById(usuarioId) {\n let user = ''\n user = usuario.find((element) => element.id == usuarioId)\n if (user !== (null || undefined)) {\n return user.nome\n } else {\n return ''\n }\n }\n\n const handleOpenAnswer = (avaliacao) => {\n dispatch(avaliacaoAction.setAnswerRatingOpen(true, avaliacao))\n }\n\n const handleOpenDetail = (avaliacao) => {\n dispatch(avaliacaoAction.setDetailOpen(true, avaliacao))\n }\n\n const handleLikeRating = (avaliacaoId) => {\n dispatch(avaliacaoAction.likeRating(avaliacaoId))\n }\n\n const handleReportComment = () => {\n //const handleReportComment = (commentId) => {\n //dispatch(avaliacaoAction.reportComment(commentId))\n }\n\n useEffect(() => {\n dispatch(usuarioAction.getUsuario())\n }, [dispatch, estabelecimentoId])\n\n return (\n <>\n {isLoading ? (\n \n ) : eventoId === 0 ? (\n \n ) : rating.length === 0 || rating[0].avaliacao === undefined ? (\n \n ) : (\n \n \n \n \n \n \n Nota \n Mensagem \n Usuário \n Curtidas \n Data/Hora \n Ações \n \n \n \n {rating.map((n) => {\n return (\n \n \n \n \n \n {n.avaliacao.mensagem}\n \n \n {getUsuarioNameById(n.avaliacao.usuarioId)}\n \n \n {n.numeroCurtidas}\n \n \n {toLocalDateFormat(n.avaliacao.dataHora)}\n \n \n (\n handleOpenAnswer(n.avaliacao)}\n >\n \n \n \n \n )}\n />\n (\n handleOpenDetail(n.avaliacao)}\n >\n \n \n \n \n )}\n />\n (\n handleLikeRating(n.avaliacao.id)}\n >\n <>\n {n.usuarioCurtiu ? (\n \n \n \n ) : (\n \n \n \n )}\n >\n \n )}\n />\n (\n handleReportComment(n.avaliacao.id)}\n >\n \n \n \n \n )}*/\n />\n \n \n )\n })}\n \n
\n \n )}\n >\n )\n}\n\nTableEventRating.propTypes = {\n className: PropTypes.string\n}\n\nexport default TableEventRating\n","import React from 'react'\nimport { SkeletonTable } from 'components'\nimport { Grid, makeStyles } from '@material-ui/core'\nimport { SelectEvent, TableEventRating } from './components'\nimport { useSelector } from 'react-redux'\nimport { AccessControl } from 'components/Utils/AccessControl'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n width: '100%',\n padding: theme.spacing(3, 2, 2, 2)\n },\n header: {\n paddingBottom: theme.spacing(2)\n }\n}))\n\nconst EventRating = () => {\n const classes = useStyles()\n const { avaliacao: ratings, isLoading } = useSelector(\n (state) => state.avaliacao\n )\n\n return (\n (\n \n
\n \n \n \n {isLoading ? (\n \n ) : (\n \n \n \n )}\n \n
\n )}\n />\n )\n}\n\nexport default EventRating\n","import React, { useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n makeStyles\n} from '@material-ui/core'\nimport FavoriteRoundedIcon from '@material-ui/icons/FavoriteRounded'\nimport FavoriteBorderRoundedIcon from '@material-ui/icons/FavoriteBorderRounded'\nimport QuestionAnswerRoundedIcon from '@material-ui/icons/QuestionAnswerRounded'\nimport AspectRatioRoundedIcon from '@material-ui/icons/AspectRatioRounded'\nimport ReportProblemRoundedIcon from '@material-ui/icons/ReportProblemRounded'\nimport Rating from '@material-ui/lab/Rating'\nimport { toLocalDateFormat } from 'utils'\nimport { MessageData, SkeletonTable } from 'components'\nimport { avaliacaoAction, usuarioAction } from '_actions'\nimport { AccessControl } from 'components/Utils/AccessControl'\nimport DetailAndComment from '../DetailAndComment'\nimport AnswerRating from '../AnswerRating'\nimport constants from 'theme/constants'\n\nconst useStyles = makeStyles((theme) => ({\n paper: {\n ...constants.shadowCard\n }\n}))\nconst PlaceRating = () => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const { avaliacao: rating, isLoading } = useSelector(\n (state) => state.avaliacao\n )\n const estabelecimentoId = useSelector(\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const { usuario } = useSelector((state) => state.usuario)\n\n function getUsuarioNameById(usuarioId) {\n let user = ''\n user = usuario.find((element) => element.id == usuarioId)\n if (user !== (null || undefined)) {\n return user.nome\n } else {\n return ''\n }\n }\n\n const handleOpenAnswer = (avaliacao) => {\n dispatch(avaliacaoAction.setAnswerRatingOpen(true, avaliacao))\n }\n\n const handleOpenDetail = (avaliacao) => {\n dispatch(avaliacaoAction.setDetailOpen(true, avaliacao))\n }\n\n const handleLikeRating = (avaliacaoId) => {\n dispatch(avaliacaoAction.likeRating(avaliacaoId))\n }\n\n const handleReportComment = () => {\n //const handleReportComment = (commentId) => {\n //dispatch(avaliacaoAction.reportComment(commentId))\n }\n\n useEffect(() => {\n dispatch(avaliacaoAction.getAvaliacaoByEstabelecimento(estabelecimentoId))\n dispatch(usuarioAction.getUsuario())\n }, [dispatch, estabelecimentoId])\n\n return (\n \n {isLoading ? (\n
\n ) : rating.length === 0 ? (\n
\n ) : (\n
\n \n \n \n \n \n Nota \n Mensagem \n Usuário \n Curtidas \n Data/Hora \n Ações \n \n \n \n {rating.map((n) => {\n return (\n \n \n \n \n \n {n.avaliacao.mensagem}\n \n \n {getUsuarioNameById(n.avaliacao.usuarioId)}\n \n \n {n.numeroCurtidas}\n \n \n {toLocalDateFormat(n.avaliacao.dataHora)}\n \n \n (\n handleOpenAnswer(n.avaliacao)}\n >\n \n \n \n \n )}\n />\n (\n handleOpenDetail(n.avaliacao)}\n >\n \n \n \n \n )}\n />\n (\n handleLikeRating(n.avaliacao.id)}\n >\n <>\n {n.usuarioCurtiu ? (\n \n \n \n ) : (\n \n \n \n )}\n >\n \n )}\n />\n (\n handleReportComment(n.avaliacao.id)}\n >\n \n \n \n \n )}*/\n />\n \n \n )\n })}\n \n
\n \n )}\n
\n )\n}\n\nPlaceRating.propTypes = {\n className: PropTypes.string\n}\n\nexport default PlaceRating\n","import React from 'react'\nimport { Grid, Typography } from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/styles'\nimport clsx from 'clsx'\n\nconst useStyles = makeStyles(() => ({\n root: {}\n}))\n\nconst TitleContentWithoutButton = (props) => {\n const { className, ...rest } = props\n const classes = useStyles()\n return (\n \n \n \n \n {props.subTitle}\n \n \n {props.title}\n \n \n \n \n {props.length !== undefined && props.length !== 0 && (\n \n \n Total de dados encontrados: {props.length} \n \n \n )}\n
\n )\n}\n\nTitleContentWithoutButton.propTypes = {\n title: PropTypes.string.isRequired,\n subTitle: PropTypes.string,\n buttonOnClick: PropTypes.object.isRequired,\n rule: PropTypes.string\n}\nexport default TitleContentWithoutButton\n","import React from 'react'\nimport { connect, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport { Tabs, Tab, useMediaQuery, useTheme } from '@material-ui/core'\nimport { Redirect } from 'react-router-dom'\nimport { withStyles } from '@material-ui/core/styles'\nimport { withRouter } from 'react-router-dom'\nimport EventAvailableTwoToneIcon from '@material-ui/icons/EventAvailableTwoTone'\nimport BusinessTwoToneIcon from '@material-ui/icons/BusinessTwoTone'\nimport { Page } from 'components'\nimport { PlaceRating, EventRating } from './components'\nimport TitleContentWithoutButton from 'components/Utils/TitleContentWithoutButton'\n\nconst styles = (theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: { marginBottom: theme.spacing(4) }\n})\n\nconst Avaliacoes = (props) => {\n const { classes, match, history } = props\n const { tab } = match.params\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const { avaliacao } = useSelector((state) => state.avaliacao)\n\n const handleTabsChange = (event, value) => {\n history.push(value)\n }\n\n const tabs = [\n {\n value: 'placeRating',\n label: 'Estabelecimento',\n icon: \n }\n ]\n {\n tabs.push({\n value: 'eventRating',\n label: 'Eventos',\n icon: \n })\n }\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n \n {undefined !== avaliacao && avaliacao.length > 0 ? (\n \n ) : (\n \n )}\n \n {tabs.map((tab) => (\n \n ))}\n \n \n {tab === 'placeRating' &&
}\n {tab === 'eventRating' &&
}\n
\n \n )\n}\n\nAvaliacoes.propTypes = {\n history: PropTypes.object.isRequired,\n match: PropTypes.object.isRequired,\n classes: PropTypes.object.isRequired\n}\n\nconst connectedEventoPage = withRouter(\n connect(null, null, null, {\n pure: false\n })(withStyles(styles)(Avaliacoes))\n)\n\nexport { connectedEventoPage as Avaliacoes }\n","import React from 'react'\nimport { Button, Grid, Typography, makeStyles } from '@material-ui/core'\nimport Image from 'material-ui-image'\n\n//? Own imports\nimport { history } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(6),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(3) },\n button: {\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstPhotoAlbum = () => {\n const classes = useStyles()\n\n const handleClickPhotoAlbum = () => {\n history.push(`/photoAlbum/cadastro`)\n }\n\n return (\n \n \n \n \n \n \n \n Você ainda não criou nenhum álbum de fotos!\n \n \n \n \n Criar álbum! 🎟\n \n \n \n
\n )\n}\n\nexport default EmptyFirstPhotoAlbum\n","import React, { useEffect } from 'react'\nimport { connect, useDispatch, useSelector } from 'react-redux'\nimport PropTypes from 'prop-types'\nimport {\n withStyles,\n Table,\n TableContainer,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Paper,\n IconButton,\n Tooltip,\n Typography,\n Avatar,\n Link\n} from '@material-ui/core'\nimport { Link as RouterLink } from 'react-router-dom'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport EditIcon from '@material-ui/icons/Edit'\nimport { withRouter } from 'react-router-dom'\nimport { getImageUrls, getInitials, history } from '../../utils'\nimport { useConfirm } from 'material-ui-confirm'\nimport { AccessControl } from '../../components/Utils/AccessControl'\nimport { Page, SkeletonTable } from 'components'\nimport EmptyFirstPhotoAlbum from './components/EmptyFirstPhotoAlbum/EmptyFirstPhotoAlbum'\nimport constants from 'theme/constants'\nimport { useMutationPhotoAlbumDelete, usePhotoAlbumList } from 'hooks-querys'\nimport { PhotoAlbum } from 'types/api'\nimport ShareIcon from '@material-ui/icons/Share'\nimport { toast } from 'react-toastify'\nimport { genericOnShare } from 'utils/genericOnShare'\n\nconst styles = () => ({\n root: {},\n paper: {\n ...constants.shadowCard\n },\n avatar: {\n width: 90,\n height: 55,\n borderRadius: 5\n }\n})\n\n// @ts-ignore\nconst PhotoAlbumList = (props) => {\n const confirm = useConfirm()\n const dispatch = useDispatch()\n const { classes } = props\n const mutationDeletePhotoAlbum = useMutationPhotoAlbumDelete()\n\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const { isLoading, data } = usePhotoAlbumList(estabelecimentoId)\n\n const handleDeleteClick = (idPhotoAlbum: number) => {\n confirm({\n title: 'Você deseja excluir esse álbum de fotos?',\n //description: 'Confirmando essa operação, álbum será excluido para sempre!',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n deletePhotoAlbum(idPhotoAlbum)\n })\n }\n\n const deletePhotoAlbum = (idPhotoAlbum: number) => {\n mutationDeletePhotoAlbum.mutate(idPhotoAlbum)\n }\n\n return (\n // @ts-ignore\n \n (\n \n {data && data.length > 0 ? (\n
\n Total de dados encontrados: {data.length} \n \n ) : null}\n {undefined !== data && data.length ? (\n
\n \n \n \n Capa \n Título \n Descrição \n Evento \n N° Fotos \n {/* Curtidas \n Comentários */}\n Ações \n \n \n \n {data.map((n: PhotoAlbum) => {\n return (\n \n \n \n \n {getInitials(n.evento?.nome)}\n \n \n \n \n {n.nome}\n \n \n {n.descricao}\n \n \n {n.evento?.nome}\n \n \n {n.totalFotos}\n \n {/* \n {n.curtidas}\n \n \n {n.comentarios}\n */}\n \n {\n const link = await genericOnShare(\n `https://corujasapp.com/event-photo-album/${n.id}`,\n n.nome || n.descricao || '',\n `Confira as fotos do álbum \"${n.nome}\" no Corujas App!`,\n n.fotoCapa?.imagem || n.evento?.imagem\n )\n navigator.clipboard.writeText(link)\n toast.success(\n 'Link para o álbum de fotos copiado com sucesso! 🎉',\n {\n autoClose: 4000\n }\n )\n }}\n >\n \n \n \n \n (\n \n history.push(`/photoAlbum/cadastro/${n.id}`)\n }\n >\n \n \n \n \n )}\n />\n (\n handleDeleteClick(n.id)}\n >\n \n \n \n \n )}\n />\n \n \n )\n })}\n \n
\n \n ) : (\n
\n )}\n
\n )}\n />\n \n )\n}\nPhotoAlbumList.propTypes = {\n classes: PropTypes.object.isRequired\n}\n// @ts-ignore\nconst mapStateToProps = (state) => {\n return {\n photoAlbum: state.photoAlbum,\n estabelecimentoId: state.usuarioEstabelecimento.estabelecimentoId\n }\n}\n\n// @ts-ignore\nconst connectedphotoAlbumPage = withRouter(\n // @ts-ignore\n connect(mapStateToProps, null, null, {\n pure: false\n })(withStyles(styles)(PhotoAlbumList))\n)\nexport { connectedphotoAlbumPage as PhotoAlbumList }\n","import { createGlobalStyle } from 'styled-components'\n\nexport default createGlobalStyle`\n * {\n margin: 0;\n padding: 0;\n outline: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, Helvetica, sans-serif;\n font-size: 14px;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n }\n\n html, body, #root {\n height: 100%;\n }\n`\n","//@ts-nocheck\nimport styled, { css } from 'styled-components'\n\nconst dragActive = css`\n border-color: #78e5d5;\n`\n\nconst dragReject = css`\n border-color: #e57878;\n`\n\nexport const DropContainer = styled.div.attrs({\n className: 'dropzone'\n})`\n border: 1px dashed #ddd;\n border-radius: 4px;\n cursor: pointer;\n min-height: 100px;\n display: flex;\n justify-content: center;\n align-items: center;\n transition: height 0.2s ease;\n\n ${(props) => props.isDragActive && dragActive};\n ${(props) => props.isDragReject && dragReject};\n`\n\nconst messageColors = {\n default: '#999',\n error: '#e57878',\n success: '#78e5d5'\n}\n\nexport const UploadMessage = styled.p`\n display: flex;\n color: ${(props) => messageColors[props.type || 'default']};\n justify-content: center;\n align-items: center;\n padding: 15px 0;\n`\n","import React from 'react'\nimport { MdFileUpload, MdError, MdDone } from 'react-icons/md'\nimport { useDropzone } from 'react-dropzone'\nimport { uniqueId } from 'lodash'\nimport filesize from 'filesize'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { toast } from 'react-toastify'\n\n//? Own imports\nimport { ImagePreviewClientSide } from '../../PhotoList'\nimport { DropContainer, UploadMessage } from './styles'\nimport { albumAction } from '_actions'\n\nvar pluralize = require('pluralize')\n\nfunction Upload() {\n const dispatch = useDispatch()\n const { foto }: { foto: ImagePreviewClientSide[] } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n const MAX_FOTOS = 300\n\n const onDrop = (acceptedFiles: File[]) => {\n if (foto.length + acceptedFiles.length <= MAX_FOTOS) {\n const files: ImagePreviewClientSide[] = acceptedFiles.map((file) => {\n var name = file.name.replaceAll('(', ' ')\n name = name.replaceAll(')', ' ')\n return {\n file,\n id: uniqueId('new'),\n name: name,\n readableSize: filesize(file.size),\n preview: URL.createObjectURL(file),\n progress: 0,\n uploaded: false,\n isError: false,\n url: null,\n retry: false\n }\n })\n dispatch(albumAction.addFoto(files))\n } else {\n toast.error(`O número máximo de fotos para cada álbum é de ${MAX_FOTOS}!`)\n }\n }\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isDragReject,\n draggedFiles\n } = useDropzone({\n onDrop,\n onDropRejected(fileRejections) {\n toast.error(\"Formato não suportado!\")\n toast.error(fileRejections.length > 1\n ? `${fileRejections.length} fotos foram rejeitadas!`\n : `${fileRejections.length} foto foi rejeitada!`)\n },\n accept: ['image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/tiff']\n })\n\n const renderDragMessage = (isDragActive: boolean, isDragReject: boolean) => {\n if (!isDragActive) {\n return (\n \n Clique ou arraste as imagens aqui...\n Formatos aceitos: JPEG, PNG, WebP, AVIF e TIFF\n \n \n )\n }\n\n if (isDragReject) {\n return (\n // @ts-ignore\n \n Arquivo não suportado!\n \n \n )\n }\n\n return (\n // @ts-ignore\n \n Solte as imagens aqui! \n {pluralize('arquivos', draggedFiles.length, true)}{' '}\n {pluralize('selecionados', draggedFiles.length)}\n \n )\n }\n\n return (\n \n \n {renderDragMessage(isDragActive, isDragReject)}\n \n )\n}\n\nexport default Upload\n","import React, { useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { albumAction } from '_actions'\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n TextField,\n Button,\n InputAdornment,\n Typography,\n Grid,\n FormControlLabel,\n Checkbox,\n useTheme,\n useMediaQuery,\n Box,\n makeStyles\n} from '@material-ui/core'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport SendIcon from '@material-ui/icons/Send'\nimport { ImagePreviewClientSide } from '../PhotoList/PhotoList'\nimport { useConfirm } from 'material-ui-confirm'\nimport { getImageUrls, useDidMountEffect } from 'utils'\n\ntype PhotoEditDialog = {\n openModal: boolean\n setOpenModal: (open: boolean) => void\n photo: ImagePreviewClientSide\n}\n\nconst useStyles = makeStyles((theme) => ({\n formDialog: {\n overflow: 'hidden',\n overflowY: 'hidden',\n overflowX: 'hidden'\n }\n}))\n\nexport default function PhotoEditDialog ({\n openModal,\n setOpenModal,\n photo\n}: PhotoEditDialog) {\n const dispatch = useDispatch()\n const confirm = useConfirm()\n const classes = useStyles()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'))\n const [title, setTitle] = useState(photo?.title)\n const [description, setDescription] = useState(photo?.description)\n const { fotoCapaId }: { fotoCapaId: Number } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n const [isCover, setCover] = useState(fotoCapaId == Number(photo.id) ? true : false)\n\n useDidMountEffect(() => {\n setCover(fotoCapaId == Number(photo.id) ? true : false)\n }, [fotoCapaId])\n\n const handleClose = () => {\n setOpenModal(false)\n setTitle(photo?.title)\n setDescription(photo?.description)\n setCover(fotoCapaId == Number(photo.id) ? true : false)\n }\n\n const handleDelete = () => {\n confirm({\n title: 'Você deseja mesmo excluir esta foto?',\n description: 'Confirmando essa operação, esta foto não aparecerá mais no álbum de fotos',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n if (fotoCapaId == Number(photo.id)) {\n dispatch(albumAction.setFotoCapaId(null))\n }\n dispatch(albumAction.deleteFoto(photo))\n })\n }\n\n const updateFile = (data: ImagePreviewClientSide) => {\n if (isCover) {\n dispatch(albumAction.setFotoCapaId(photo.id))\n } else if (fotoCapaId == Number(photo.id)) {\n dispatch(albumAction.setFotoCapaId(null))\n }\n\n dispatch(\n albumAction.updateFoto({\n ...photo,\n ...data\n })\n )\n }\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault()\n updateFile({\n ...photo,\n title: title,\n description: description,\n isCover: isCover\n })\n setOpenModal(false)\n }\n\n const handleChangeTitle = (value: string) => {\n setTitle(value)\n }\n\n const handleChangeDescription = (value: string) => {\n setDescription(value)\n }\n\n const handleFotoCapa = () => {\n setCover(!isCover)\n }\n\n return (\n \n \n Edição Foto\n \n \n \n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport axios from 'axios'\nimport {\n makeStyles,\n Tooltip,\n IconButton,\n Typography,\n CircularProgress,\n CircularProgressProps,\n Box\n} from '@material-ui/core'\nimport HighlightOffRoundedIcon from '@material-ui/icons/HighlightOffRounded'\nimport EditRoundedIcon from '@material-ui/icons/EditRounded'\nimport ReplayRoundedIcon from '@material-ui/icons/ReplayRounded'\nimport ErrorOutlineRoundedIcon from '@material-ui/icons/ErrorOutlineRounded'\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\n//? Own imports\nimport { ImagePreviewClientSide } from '../../PhotoList'\nimport { albumAction } from '_actions'\nimport config from 'config/config'\nimport PhotoEditDialog from 'views/PhotoAlbum/components/PhotoEditDialog'\nimport { useConfirm } from 'material-ui-confirm'\nimport el from 'date-fns/esm/locale/el/index.js'\nimport { useDidMountEffect } from 'utils'\n\nfunction CircularProgressWithLabel(\n props: CircularProgressProps & { value: number }\n) {\n const useStyles = makeStyles(() => ({\n textLoadingProgress: {\n color: '#fff',\n fontWeight: 'bold'\n }\n }))\n\n const classes = useStyles()\n return (\n \n \n \n {`${Math.round(props.value)}%`} \n \n \n )\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n '&:hover': {\n '& $actionsContainer': {\n visibility: 'visible'\n }\n },\n borderRadius: 5,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundPosition: '50% 50%',\n backgroundImage: ({ imageUrl }: { imageUrl: string | null | undefined }) =>\n imageUrl ? `url(\"${encodeURI(imageUrl)}\")` : undefined,\n width: '100%',\n height: 110,\n position: 'relative'\n },\n actionsContainer: {\n borderTopLeftRadius: 5,\n borderTopRightRadius: 5,\n padding: theme.spacing(1),\n visibility: 'hidden',\n justifyContent: 'space-between',\n alignContent: 'center',\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.25)'\n },\n deleteButton: {},\n editButton: {},\n textName: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n fontSize: 9,\n color: '#fff',\n margin: theme.spacing(0, 1)\n },\n loadingContainer: {\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: 110,\n justifyContent: 'center',\n borderRadius: 5,\n backgroundColor: 'rgba(0, 0, 0, 0.5)'\n },\n errorContainer: {\n position: 'absolute',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n height: 110,\n justifyContent: 'center',\n borderRadius: 5,\n backgroundColor: 'rgba(255, 148, 148, 0.5)'\n }\n}))\n\ntype Props = {\n imagePreview: ImagePreviewClientSide\n}\n\nconst ImageItem = ({ imagePreview }: Props) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging\n } = useSortable({ id: imagePreview.id })\n\n const classes = useStyles({ imageUrl: imagePreview.preview })\n const dispatch = useDispatch()\n const confirm = useConfirm()\n const [progress, setProgress] = useState(0)\n const [isLoading, setIsLoading] = useState(false)\n const [openEditModal, setOpenEditModal] = useState(false)\n const foto: ImagePreviewClientSide = useSelector((state) =>\n // @ts-ignore\n state.album.foto.find((item) => item.id === imagePreview.id)\n )\n const {\n fotoCapaId,\n enabledSortableContext\n }: { fotoCapaId: Number; enabledSortableContext: boolean } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n\n const handleClickDelete = () => {\n if (foto.file === null) {\n confirm({\n title: 'Você deseja mesmo excluir esta foto?',\n description:\n 'Confirmando essa operação, esta foto não aparecerá mais no álbum de fotos',\n confirmationText: 'Sim, excluir!',\n cancellationText: 'Nãããoo!'\n }).then(() => {\n if (fotoCapaId == Number(foto.id)) {\n dispatch(albumAction.setFotoCapaId(null))\n }\n dispatch(albumAction.deleteFoto(foto))\n })\n } else {\n if (fotoCapaId == Number(foto.id)) {\n dispatch(albumAction.setFotoCapaId(null))\n }\n dispatch(albumAction.deleteFoto(foto))\n }\n }\n\n const handleClickEdit = () => {\n setOpenEditModal(true)\n // dispatch(albumAction.updateFoto(foto))\n }\n\n useEffect(() => {\n if (foto.id && !foto.uploaded && !isLoading) {\n processUpload()\n }\n }, [])\n\n useDidMountEffect(() => {\n if (foto.id && !foto.uploaded && !isLoading && foto.retry) {\n processUpload()\n }\n }, [foto.retry])\n\n const updateFile = (data: ImagePreviewClientSide) => {\n dispatch(\n albumAction.updateFoto({\n ...foto,\n ...data\n })\n )\n }\n\n const processUpload = () => {\n const data = new FormData()\n data.append('file', imagePreview.file, imagePreview.name)\n setIsLoading(true)\n updateFile({\n ...foto,\n isError: false\n })\n axios\n .create({\n baseURL: config.baseUrl\n })\n .post('uploads/S3', data, {\n onUploadProgress: (event) => {\n const progress = Math.round((event.loaded * 100) / event.total)\n setProgress(progress)\n },\n headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }\n })\n .then((response) => {\n setIsLoading(false)\n updateFile({\n ...foto,\n uploaded: true,\n isError: false,\n url: response.data.url,\n retry: false\n })\n })\n .catch(() => {\n setIsLoading(false)\n setProgress(progress)\n updateFile({\n ...foto,\n isError: true,\n retry: false\n })\n })\n }\n\n return (\n <>\n {foto?.preview ? (\n \n {foto.isError && (\n
\n \n \n \n \n \n
\n )}\n {isLoading && (\n
\n \n
\n )}\n
\n {foto.isError ? (\n
\n \n \n \n \n ) : (\n
\n \n \n \n \n )}\n
\n {foto.title || foto.name}\n \n
\n \n \n \n \n
\n
\n
\n ) : null}\n >\n )\n}\n\nexport default ImageItem\n","import React, { useState } from 'react'\nimport { Box, Grid, makeStyles } from '@material-ui/core'\nimport GlobalStyle from './styles/global'\nimport Upload from './components/Upload'\nimport ImageItem from './components/ImageItem'\nimport { useDispatch, useSelector } from 'react-redux'\n\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragStartEvent,\n DragEndEvent\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n rectSortingStrategy\n} from '@dnd-kit/sortable'\nimport { albumAction } from '_actions'\n\nexport type ImagePreviewClientSide = {\n file: File\n id: string\n name: string\n title?: string\n description?: string\n isCover?: boolean\n readableSize: string\n preview: string\n uploaded: boolean\n isError: boolean\n url: string | null\n retry: boolean\n}\n\nconst useStyles = makeStyles((theme) => ({\n container: {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\n },\n content: {\n width: '100%'\n },\n listContainer: {\n marginTop: theme.spacing(1)\n }\n}))\n\nfunction PhotoList() {\n const classes = useStyles()\n const dispatch = useDispatch()\n // @ts-ignore\n const { enabledSortableContext } = useSelector((state) => state.album)\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 4\n }\n })\n // useSensor(KeyboardSensor, {\n // coordinateGetter: sortableKeyboardCoordinates\n // })\n )\n const handleDragStart = (event: DragStartEvent) => {}\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (over && active) {\n if (active.id !== over.id) {\n const oldIndex = foto.findIndex((item) => item.id === active.id)\n const newIndex = foto.findIndex((item) => item.id === over.id)\n dispatch(albumAction.shortFoto(arrayMove(foto, oldIndex, newIndex)))\n }\n }\n }\n\n const { foto }: { foto: ImagePreviewClientSide[] } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n\n return (\n \n \n \n \n \n \n {foto.map((imagePreview) => (\n \n \n \n ))}\n \n \n \n \n \n \n )\n}\n\nexport default PhotoList\n","import React, { useEffect, useState } from 'react'\nimport { albumAction } from '_actions'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n MenuItem,\n Button,\n Tooltip,\n Grid,\n Checkbox,\n FormControlLabel,\n InputAdornment,\n FormControl,\n useMediaQuery,\n TextField,\n CircularProgress,\n Switch,\n useTheme,\n Chip,\n Typography,\n makeStyles,\n Box,\n Fab,\n Link\n} from '@material-ui/core'\nimport { ValidatorForm, TextValidator } from 'react-material-ui-form-validator'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { toast } from 'react-toastify'\nimport { getImageUrls, toLocalDateFormat, useDidMountEffect } from 'utils'\nimport { history } from 'utils'\nimport { HelperToolTip, Page } from 'components'\nimport { useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\nimport { Autocomplete } from '@material-ui/lab'\nimport {\n useEvent,\n useEvents,\n useMutationPhotoAlbumCreate,\n useMutationPhotoAlbumEdit,\n usePhotoAlbumId\n} from 'hooks-querys'\nimport { Foto, PhotoAlbum } from 'types/api'\nimport { PhotoList } from './components'\nimport { ImagePreviewClientSide } from './components/PhotoList/PhotoList'\nimport { useConfirm } from 'material-ui-confirm'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n // padding: theme.spacing(2)\n },\n formControl: {\n width: '100%'\n },\n paper: {\n ...constants.shadowCard\n },\n containerPhotos: {\n ...constants.shadowCard,\n marginTop: theme.spacing(2)\n },\n fabButton: {\n width: '100%'\n },\n helperContainer: {\n display: 'flex',\n alignItems: 'center'\n }\n}))\n\n// @ts-ignore\nconst PhotoAlbumEdit = (props) => {\n const dispatch = useDispatch()\n const classes = useStyles()\n const confirm = useConfirm()\n const mutationCreatePhotoAlbum = useMutationPhotoAlbumCreate()\n const mutationEditPhotoAlbum = useMutationPhotoAlbumEdit()\n const theme = useTheme()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n const [eventoEditId, setEventoEditId] = useState()\n // @ts-ignore\n const [selectedEvento, setSelectedEvento] = useState({} as Evento)\n const [eventoInputValue, setEventoInputValue] = useState('')\n const [showPastEvents, setShowPastEvents] = useState(true)\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const {\n foto,\n enabledSortableContext\n }: {\n foto: ImagePreviewClientSide[]\n enabledSortableContext: boolean\n } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n\n // @ts-ignore\n const { eventoId, photoAlbumId } = useParams()\n const [title, setTitle] = useState('')\n const [description, setDescription] = useState('')\n const { fotoCapaId }: { fotoCapaId: Number } = useSelector(\n // @ts-ignore\n (state) => state.album\n )\n\n const {\n data: events,\n isLoading: isLoadingEvents,\n isFetching: isFetchingEvents\n } = useEvents(estabelecimentoId, showPastEvents, true)\n//} = useEvents(estabelecimentoId, showPastEvents, isMobile)\n\n // Past Events Shortcut\n const { data: eventQuery } = useEvent(Number(eventoEditId) | eventoId)\n\n // Edit Photo Album\n const { data: photoAlbumEdit } = usePhotoAlbumId(Number(photoAlbumId))\n\n useEffect(() => {\n return () => {\n dispatch(albumAction.deleteAllFoto())\n }\n }, [])\n\n const LoadEditDetails = () => {\n if (!!photoAlbumEdit && foto && foto.length === 0) {\n setTitle(photoAlbumEdit.nome)\n setDescription(photoAlbumEdit.descricao)\n setEventoEditId(photoAlbumEdit.eventoId)\n dispatch(albumAction.setFotoCapaId(photoAlbumEdit.fotoCapaId))\n const files: ImagePreviewClientSide[] = photoAlbumEdit.foto.map(\n (fotoEdit: Foto) => {\n return {\n file: null,\n id: fotoEdit.id,\n name: fotoEdit?.titulo,\n title: fotoEdit?.titulo,\n description: fotoEdit?.descricao,\n // readableSize: filesize(fotoEdit.size),\n preview: getImageUrls(fotoEdit.imagem)?.thumbnailUrl,\n uploaded: true,\n isError: false,\n url: getImageUrls(fotoEdit.imagem)?.originalUrl,\n isCover: fotoEdit.id === photoAlbumEdit.fotoCapaId && true,\n retry: false\n }\n }\n )\n dispatch(albumAction.addFoto(files))\n }\n }\n\n useEffect(() => {\n LoadEditDetails()\n }, [photoAlbumEdit])\n\n const toggleEnabledSortableContext = () => {\n dispatch(albumAction.toggleEnabledSortableContext())\n }\n const handleChangeTitle = (value: string) => {\n setTitle(value)\n }\n\n const handleChangeDescription = (value: string) => {\n setDescription(value)\n }\n\n const handleRetryAll = () => {\n foto.forEach((item) => {\n if (item.isError) {\n dispatch(\n albumAction.updateFoto({\n ...item,\n retry: true\n })\n )\n }\n })\n }\n\n const handleCancel = () => {\n if (!!title || !!description || selectedEvento?.id || eventQuery?.id) {\n confirm({\n title: !!photoAlbumId\n ? 'Você deseja cancelar a edição do álbum?'\n : 'Você deseja cancelar o cadastro do álbum?',\n // description: '',\n confirmationText: 'Sim, cancelar!',\n cancellationText: 'Não!'\n }).then(() => {\n dispatch(albumAction.deleteAllFoto())\n history.goBack()\n })\n } else {\n dispatch(albumAction.deleteAllFoto())\n history.goBack()\n }\n }\n\n const handleSubmit = () => {\n let hasNotUploaded = false\n let fotoPayload: Array = []\n\n foto.map((row) => {\n if (!row.uploaded) {\n hasNotUploaded = true\n }\n })\n\n if (title === '') {\n toast.error('Você precisa dar um titulo ao álbum!')\n } else if (!selectedEvento?.id && !eventQuery?.id) {\n toast.error('Você precisa selecionar um evento!')\n } else if (foto.length === 0) {\n toast.error('Você precisa adicionar ao menos uma foto!')\n } else {\n confirm({\n title: hasNotUploaded\n ? 'Há fotos com upload incompleto, deseja continuar?'\n : !!photoAlbumId\n ? `Atualizar álbum ${title}?`\n : `Salvar álbum ${title}?`,\n description:\n hasNotUploaded &&\n 'Se prosseguir essas fotos não aparecerão no álbum..',\n confirmationText: hasNotUploaded\n ? `Sim, salvar álbum mesmo assim!`\n : 'Sim!',\n cancellationText: 'Não!'\n }).then(() => {\n foto.forEach((item) => {\n if (item?.uploaded) {\n fotoPayload.push({\n id: item.file === null ? Number(item.id) : 0,\n albumId: !!photoAlbumId ? photoAlbumId : 0,\n titulo: !!item.title ? item?.title : '',\n descricao: item?.description,\n ordem: foto.indexOf(item) + 1,\n imagem: !!item.url ? item.url : '',\n capa: !!item.isCover ? item?.isCover : false,\n albumCapa: []\n })\n }\n })\n\n let payload = {\n id: !!photoAlbumId ? photoAlbumId : 0,\n nome: title,\n descricao: description,\n estabelecimentoId: estabelecimentoId,\n eventoId: selectedEvento?.id > 0 ? selectedEvento.id : eventQuery?.id,\n foto: fotoPayload\n }\n\n if (photoAlbumId) {\n editPhotoAlbum(payload)\n } else {\n createPhotoAlbum(payload)\n }\n })\n }\n }\n\n const createPhotoAlbum = (payload: PhotoAlbum) => {\n mutationCreatePhotoAlbum.mutateAsync(payload).then(() => {\n history.push('/photoAlbum/lista')\n dispatch(albumAction.deleteAllFoto())\n })\n }\n\n const editPhotoAlbum = (payload: PhotoAlbum) => {\n mutationEditPhotoAlbum.mutateAsync(payload).then(() => {\n history.push('/photoAlbum/lista')\n dispatch(albumAction.deleteAllFoto())\n })\n }\n\n return (\n \n \n \n \n \n \n \n \n \n Adicione as fotos para compor o álbum \n {isMobile && (\n \n }\n label={\n \n Habilitar ordenação \n \n Para organizar as fotos no álbum, basta segurá-las e\n arrastá-las para a posição desejada utilizando o\n recurso de arrastar e soltar (drag and drop).\n {' '}\n
\n }\n />\n )}\n >\n }\n title={'2 - Conteúdo do álbum'}\n action={\n !isMobile ? (\n \n }\n label={\n \n Habilitar ordenação \n \n Para organizar as fotos no álbum, basta segurá-las e\n arrastá-las para a posição desejada utilizando o recurso\n de arrastar e soltar (drag and drop).\n \n
\n }\n />\n ) : undefined\n }\n />\n \n \n \n Total de fotos: {foto.length}/300 \n {foto?.length > 0 && (\n <>\n \n Processadas:{' '}\n \n {foto.filter((foto) => foto.uploaded).length}/\n {foto.length}\n \n \n {foto.filter((foto) => !foto.uploaded && foto.isError)\n .length > 0 && (\n <>\n \n Falhas:{' '}\n \n {\n foto.filter((foto) => !foto.uploaded && foto.isError)\n .length\n }\n /{foto.length}\n \n \n \n Reprocessar todas as fotos com falhas\n \n >\n )}\n >\n )}\n \n \n \n \n \n \n \n 30 ? 'sticky' : 'initial',\n marginTop: theme.spacing(2),\n bottom: theme.spacing(2)\n }}\n >\n \n \n {photoAlbumId ? 'Cancelar' : 'Voltar'}\n \n \n \n \n {photoAlbumId ? 'Atualizar' : 'Salvar álbum'}\n \n \n \n \n )\n}\n\nexport default PhotoAlbumEdit\n","import React, { useEffect } from 'react'\nimport { Redirect, useParams } from 'react-router-dom'\nimport ListRoundedIcon from '@material-ui/icons/ListRounded'\nimport {\n Tabs,\n Tab,\n Divider,\n colors,\n makeStyles,\n useTheme,\n useMediaQuery\n} from '@material-ui/core'\nimport AddCircleTwoToneIcon from '@material-ui/icons/AddCircleTwoTone'\nimport EditTwoToneIcon from '@material-ui/icons/EditTwoTone'\nimport { Page, Header } from 'components'\nimport { PhotoAlbumList } from './PhotoAlbumList'\nimport PhotoAlbumEdit from './PhotoAlbumEdit'\nimport { useDispatch } from 'react-redux'\nimport { albumAction } from '_actions'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n padding: theme.spacing(3, 2, 2, 2)\n },\n tabs: {\n marginTop: theme.spacing(3)\n },\n divider: {\n backgroundColor: colors.grey[300]\n },\n content: {\n marginTop: theme.spacing(3)\n }\n}))\n\n// @ts-ignore\nconst PhotoAlbum = (props) => {\n const { match, history } = props\n const { tab } = match.params\n const classes = useStyles()\n const theme = useTheme()\n const dispatch = useDispatch()\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\n // @ts-ignore\n const { photoAlbumId, eventoId } = useParams()\n\n // @ts-ignore\n const handleTabsChange = (event, value) => {\n history.push(`/photoAlbum/${value}`)\n }\n\n const tabs = [\n { value: 'lista', label: 'Lista', icon: },\n {\n value: 'cadastro',\n label: photoAlbumId ? 'Editar' : 'Cadastrar',\n icon: photoAlbumId ? : ,\n disabled: photoAlbumId ? true : false\n }\n ]\n\n useEffect(() => {\n return () => {\n dispatch(albumAction.deleteAllFoto())\n }\n }, [])\n\n if (!tab) {\n return \n }\n\n if (!tabs.find((t) => t.value === tab)) {\n return \n }\n\n return (\n // @ts-ignore\n \n \n \n {tabs.map((tab) => (\n \n ))}\n \n \n \n {tab === 'lista' &&
}\n {tab === 'cadastro' &&
}\n
\n \n )\n}\n\nexport default PhotoAlbum\n","import React from 'react'\nimport { Button, Grid, Typography, makeStyles } from '@material-ui/core'\nimport Image from 'material-ui-image'\n\n//? Own imports\nimport { history } from 'utils'\n\nconst useStyles = makeStyles((theme) => ({\n root: {},\n noResultText: {\n paddingTop: theme.spacing(6),\n paddingBottom: theme.spacing(1),\n textAlign: 'center'\n },\n image: { marginTop: theme.spacing(3) },\n button: {\n '&:hover': {\n backgroundColor: theme.palette.primary.main,\n boxShadow: '0 9px 40px -14px #FFC20A',\n webkitTransition: ' all 300ms ease',\n transition: 'all 300ms ease',\n letterSpacing: '1.2px'\n }\n }\n}))\nconst EmptyFirstMembershipPlan = () => {\n const classes = useStyles()\n\n const handleClickMembershipPlan = () => {\n history.push(`/members/cadastroPlano`)\n }\n\n return (\n \n \n \n \n \n \n \n Você ainda não criou um plano!\n \n \n \n \n Criar plano! 🎟\n \n \n \n
\n )\n}\n\nexport default EmptyFirstMembershipPlan\n","import React, { useEffect } from 'react'\r\nimport { connect, useDispatch, useSelector } from 'react-redux'\r\nimport PropTypes from 'prop-types'\r\nimport {\r\n withStyles,\r\n Table,\r\n TableContainer,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n IconButton,\r\n Tooltip,\r\n Typography,\r\n Avatar,\r\n Link\r\n} from '@material-ui/core'\r\nimport { Link as RouterLink } from 'react-router-dom'\r\nimport DeleteIcon from '@material-ui/icons/Delete'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport { withRouter } from 'react-router-dom'\r\nimport {\r\n getImageUrls,\r\n getInitials,\r\n history,\r\n toLocalDateFormat\r\n} from '../../utils'\r\nimport { useConfirm } from 'material-ui-confirm'\r\nimport { AccessControl } from '../../components/Utils/AccessControl'\r\nimport { Page, SkeletonTable } from 'components'\r\nimport EmptyFirstMembershipPlan from './components/EmptyFirstMembershipPlan/EmptyFirstMembershipPlan'\r\nimport constants from 'theme/constants'\r\nimport {\r\n useMutationMembershipPlanDelete,\r\n useMembershipPlanList\r\n} from 'hooks-querys'\r\nimport { MembershipPlan } from 'types/api'\r\nimport ShareIcon from '@material-ui/icons/Share'\r\nimport { toast } from 'react-toastify'\r\nimport { genericOnShare } from 'utils/genericOnShare'\r\n\r\nconst styles = () => ({\r\n root: {},\r\n paper: {\r\n ...constants.shadowCard\r\n },\r\n avatar: {\r\n width: 90,\r\n height: 55,\r\n borderRadius: 5\r\n }\r\n})\r\n\r\n// @ts-ignore\r\nconst MembershipPlanList = (props) => {\r\n const confirm = useConfirm()\r\n const dispatch = useDispatch()\r\n const { classes } = props\r\n const mutationMembershipPlanDelete = useMutationMembershipPlanDelete()\r\n\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const { isLoading, data: membershipPlan } = useMembershipPlanList(\r\n estabelecimentoId\r\n )\r\n\r\n const handleDeleteClick = (idMembershipPlan: number) => {\r\n confirm({\r\n title: 'Você deseja excluir esse plano de membros?',\r\n //description: 'Confirmando essa operação, plano será excluido para sempre!',\r\n confirmationText: 'Sim, excluir!',\r\n cancellationText: 'Nãããoo!'\r\n }).then(() => {\r\n deleteMembershipPlan(idMembershipPlan)\r\n })\r\n }\r\n\r\n const deleteMembershipPlan = (idMembershipPlan: number) => {\r\n mutationMembershipPlanDelete.mutate(idMembershipPlan)\r\n }\r\n\r\n return (\r\n // @ts-ignore\r\n \r\n (\r\n \r\n {membershipPlan && membershipPlan.length > 0 ? (\r\n
\r\n Total de dados encontrados: {membershipPlan.length} \r\n \r\n ) : null}\r\n {undefined !== membershipPlan && membershipPlan.length ? (\r\n
\r\n \r\n \r\n \r\n Imagem \r\n Nome \r\n Descrição \r\n Data Início \r\n Data Fim \r\n N⁰ Ingressos \r\n \r\n Dia geração da cobrança\r\n \r\n Dias Inadimplência \r\n Membros \r\n {/* Check-In */}\r\n {/* Valor */}\r\n Ações \r\n \r\n \r\n \r\n {membershipPlan.map((n: MembershipPlan) => {\r\n return (\r\n \r\n \r\n \r\n \r\n {getInitials(n.nome)}\r\n \r\n \r\n \r\n \r\n {n.nome}\r\n \r\n \r\n {n.descricao}\r\n \r\n \r\n {toLocalDateFormat(n.dataHoraInicio)}\r\n \r\n \r\n {toLocalDateFormat(n.dataHoraFim)}\r\n \r\n \r\n {n.numeroIngressos}\r\n \r\n \r\n {n.diaVencimento}\r\n \r\n \r\n {n.diasInadimplencia}\r\n \r\n \r\n {n.totalMembros}/\r\n {n.limiteMembros ? n.limiteMembros : '-'}\r\n {/* {n.limiteMembros} */}\r\n \r\n {/* \r\n {n.checkIn}\r\n */}\r\n {/* \r\n {n.planoValor}\r\n */}\r\n \r\n (\r\n \r\n history.push(\r\n `/members/cadastroPlano/${n.id}`\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n handleDeleteClick(n.id)}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n })}\r\n \r\n
\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n )}\r\n />\r\n \r\n )\r\n}\r\nMembershipPlanList.propTypes = {\r\n classes: PropTypes.object.isRequired\r\n}\r\n// @ts-ignore\r\nconst mapStateToProps = (state) => {\r\n return {\r\n membershipPlan: state.membershipPlan,\r\n estabelecimentoId: state.usuarioEstabelecimento.estabelecimentoId\r\n }\r\n}\r\n\r\n// @ts-ignore\r\nconst connectedMembershipPlanPage = withRouter(\r\n // @ts-ignore\r\n connect(mapStateToProps, null, null, {\r\n pure: false\r\n })(withStyles(styles)(MembershipPlanList))\r\n)\r\nexport { connectedMembershipPlanPage as MembershipPlanList }\r\n","import React, { useEffect, useState } from 'react'\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Divider,\r\n MenuItem,\r\n Button,\r\n Tooltip,\r\n Grid,\r\n InputAdornment,\r\n Typography,\r\n TableContainer,\r\n Paper,\r\n Table,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n IconButton,\r\n CircularProgress\r\n} from '@material-ui/core'\r\nimport AddCircleTwoToneIcon from '@material-ui/icons/AddCircleTwoTone'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport {\r\n ValidatorForm,\r\n TextValidator,\r\n SelectValidator\r\n} from 'react-material-ui-form-validator'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { HelperToolTip, ValidatedDatePicker } from 'components/'\r\nimport { toast } from 'react-toastify'\r\nimport { history } from 'utils'\r\nimport { Page } from 'components'\r\nimport { makeStyles } from '@material-ui/styles'\r\nimport { useParams } from 'react-router-dom'\r\nimport constants from 'theme/constants'\r\nimport {\r\n useMembershipPlanId,\r\n useMutationMembershipPlanCreate,\r\n useMutationMembershipPlanEdit\r\n} from 'hooks-querys'\r\nimport { MembershipPlan, PlanPrice } from 'types/api'\r\nimport { UploadField } from 'components/Utils/Uploads'\r\nimport { AccessControl } from 'components/Utils'\r\nimport DeleteIcon from '@material-ui/icons/Delete'\r\nimport {\r\n useMutationPlanPriceCreate,\r\n useMutationPlanPriceDelete,\r\n useMutationPlanPriceEdit\r\n} from 'hooks-querys/members'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n // padding: theme.spacing(2)\r\n },\r\n paper: {\r\n ...constants.shadowCard\r\n },\r\n buttonAddPrice: {\r\n // width: \"100%\",\r\n height: 55\r\n }\r\n}))\r\n\r\n// @ts-ignore\r\nconst MembershipPlanEdit = (props) => {\r\n const dispatch = useDispatch()\r\n const classes = useStyles()\r\n // @ts-ignore\r\n const { params, membershipPlanId } = useParams()\r\n const { data: membershipPlanEdit } = useMembershipPlanId(\r\n Number(membershipPlanId)\r\n )\r\n const [name, setName] = useState()\r\n const [description, setDescription] = useState()\r\n const [image, setImage] = useState()\r\n const [startDate, setStartDate] = useState(null)\r\n const [endDate, setEndDate] = useState(null)\r\n // const [checkIn, setCheckIn] = useState(false)\r\n // const [hoursCheckIn, setHoursCheckIn] = useState(null)\r\n const [membersLimit, setMembersLimit] = useState(null)\r\n const [ticketsNumber, setTicketsNumber] = useState(null)\r\n const [billingDay, setBillingDay] = useState(null)\r\n const [paymentDeadlineDays, setPaymentDeadlineDays] = useState(\r\n null\r\n )\r\n const [daysOfDefault, setDaysOfDefault] = useState(null)\r\n const [periodicity, setPeriodicity] = useState<'M' | 'A' | null>(null)\r\n const [price, setPrice] = useState(null)\r\n const [planPrices, setPlanPrices] = useState([])\r\n const [isEditPlanPrice, setIsEditPlanPrice] = useState(false)\r\n const [planPriceEditIndex, setPlanPriceEditIndex] = useState(0)\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const mutationCreateMembershipPlan = useMutationMembershipPlanCreate()\r\n const mutationEditMembershipPlan = useMutationMembershipPlanEdit()\r\n const mutationEditPlanPrice = useMutationPlanPriceEdit()\r\n const mutationDeletePlanPrice = useMutationPlanPriceDelete()\r\n const mutationPlanPriceCreate = useMutationPlanPriceCreate()\r\n const isMutatingMembershipPlan =\r\n mutationCreateMembershipPlan.isLoading ||\r\n mutationEditMembershipPlan.isLoading\r\n\r\n const LoadEditDetails = () => {\r\n if (!!membershipPlanEdit) {\r\n setName(membershipPlanEdit.nome)\r\n setDescription(membershipPlanEdit.descricao)\r\n setImage(membershipPlanEdit.imagem)\r\n setStartDate(membershipPlanEdit.dataHoraInicio)\r\n setEndDate(membershipPlanEdit.dataHoraFim)\r\n setMembersLimit(membershipPlanEdit.limiteMembros)\r\n setTicketsNumber(membershipPlanEdit.numeroIngressos)\r\n setBillingDay(membershipPlanEdit.diaVencimento)\r\n setPaymentDeadlineDays(membershipPlanEdit.numeroDiasVencimento)\r\n setDaysOfDefault(membershipPlanEdit.diasInadimplencia)\r\n setPlanPrices(membershipPlanEdit.planoValor)\r\n // setCheckIn(membershipPlanEdit.checkIn)\r\n // setHoursCheckIn(membershipPlanEdit.hoursCheckIn)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n LoadEditDetails()\r\n }, [membershipPlanEdit])\r\n\r\n // const handleChangeCheckIn = () => {\r\n // setCheckIn(!checkIn)\r\n // }\r\n\r\n const cancelClick = () => {\r\n history.goBack()\r\n }\r\n\r\n const handleDeletePlanPrice = (planPriceItem: PlanPrice) => {\r\n let indexOfPlanPriceItem = planPrices.indexOf(planPriceItem)\r\n if (membershipPlanId) {\r\n mutationDeletePlanPrice.mutateAsync(planPriceItem.id).then(() => {\r\n setPlanPrices(membershipPlanEdit.planoValor)\r\n planPrices.splice(indexOfPlanPriceItem, 1)\r\n })\r\n } else {\r\n planPrices.splice(indexOfPlanPriceItem, 1)\r\n }\r\n }\r\n\r\n const handleEditPlanPrice = (planPriceItem: PlanPrice) => {\r\n let indexOfPlanPriceEdit = planPrices.indexOf(planPriceItem)\r\n setPeriodicity(planPrices[indexOfPlanPriceEdit].periodicidade)\r\n setPrice(planPrices[indexOfPlanPriceEdit].valor)\r\n setIsEditPlanPrice(true)\r\n setPlanPriceEditIndex(indexOfPlanPriceEdit)\r\n }\r\n\r\n const handleEditPlanPriceFinal = () => {\r\n let payload = {\r\n id: planPrices[planPriceEditIndex].id,\r\n periodicidade: periodicity,\r\n planoId: membershipPlanId,\r\n valor: Number(price)\r\n }\r\n\r\n if (membershipPlanId) {\r\n mutationEditPlanPrice.mutateAsync(payload).then(() => {\r\n setPlanPrices(membershipPlanEdit.planoValor)\r\n setPeriodicity(null)\r\n setPrice(null)\r\n setIsEditPlanPrice(false)\r\n setPlanPriceEditIndex(0)\r\n })\r\n } else {\r\n // @ts-ignore\r\n planPrices[planPriceEditIndex] = payload\r\n setPeriodicity(null)\r\n setPrice(null)\r\n setIsEditPlanPrice(false)\r\n setPlanPriceEditIndex(0)\r\n }\r\n }\r\n\r\n const handleAddPlanPrice = () => {\r\n if (!periodicity || !price) {\r\n toast.error('Informe uma periodicidade e valor!')\r\n } else {\r\n if (membershipPlanId) {\r\n let payload = {\r\n id: 0,\r\n periodicidade: periodicity,\r\n planoId: Number(membershipPlanId),\r\n valor: Number(price)\r\n }\r\n\r\n mutationPlanPriceCreate.mutateAsync(payload).then(() => {\r\n setPlanPrices(membershipPlanEdit.planoValor)\r\n setPeriodicity(null)\r\n setPrice(null)\r\n })\r\n } else {\r\n planPrices.push({\r\n id: planPrices ? planPrices.length : 0,\r\n periodicidade: periodicity,\r\n planoId: 0,\r\n valor: Number(price)\r\n })\r\n setPeriodicity(null)\r\n setPrice(null)\r\n }\r\n }\r\n }\r\n\r\n function preparePayload() {\r\n if (!!membershipPlanEdit) {\r\n planPrices.forEach((item) => {\r\n item.planoId === 0 ? (item.id = 0) : (item.id = item.id)\r\n item.planoId = Number(membershipPlanId)\r\n })\r\n } else {\r\n planPrices.forEach((item) => {\r\n item.id = 0\r\n })\r\n }\r\n\r\n let payload = {\r\n id: !!membershipPlanEdit ? membershipPlanId : 0,\r\n estabelecimentoId: !!membershipPlanEdit\r\n ? membershipPlanEdit.estabelecimentoId\r\n : estabelecimentoId,\r\n nome: name,\r\n descricao: description,\r\n imagem: image,\r\n // dataHoraInicio: !!startDate ? format(new Date(startDate), 'dd/MM/yyyy HH:mm') : null,\r\n dataHoraInicio: startDate,\r\n // dataHoraFim: !!endDate ? format(new Date(endDate), 'dd/MM/yyyy HH:mm') : null,\r\n dataHoraFim: endDate,\r\n limiteMembros: membersLimit,\r\n numeroIngressos: ticketsNumber,\r\n diaVencimento: billingDay,\r\n numeroDiasVencimento: paymentDeadlineDays,\r\n diasInadimplencia: daysOfDefault,\r\n planoValor: planPrices\r\n // checkIn: checkIn\r\n }\r\n\r\n return payload\r\n }\r\n\r\n const handleSubmit = () => {\r\n let payload\r\n\r\n if (planPrices.length < 1) {\r\n toast.error('Informe ao menos uma periodicidade e valor!')\r\n } else if (!!startDate) {\r\n if (!!endDate && endDate <= startDate) {\r\n toast.error('Fim não pode ser anterior ao início do plano!')\r\n } else {\r\n payload = preparePayload()\r\n\r\n if (membershipPlanEdit) {\r\n // @ts-ignore\r\n editMembershipPlan(payload)\r\n } else {\r\n // @ts-ignore\r\n createMembershipPlan(payload)\r\n }\r\n }\r\n } else {\r\n toast.error('Informe uma data de início para o plano!')\r\n }\r\n }\r\n\r\n const createMembershipPlan = (payload: MembershipPlan) => {\r\n mutationCreateMembershipPlan.mutateAsync(payload).then(() => {\r\n history.push('/members/listaPlano')\r\n })\r\n }\r\n\r\n const editMembershipPlan = (payload: MembershipPlan) => {\r\n mutationEditMembershipPlan.mutateAsync(payload).then(() => {\r\n history.push('/members/listaPlano')\r\n })\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default MembershipPlanEdit\r\n","import React, { useEffect, useState } from 'react'\r\nimport { useSelector } from 'react-redux'\r\n\r\nimport {\r\n Grid,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n InputLabel,\r\n makeStyles,\r\n TextField,\r\n InputAdornment,\r\n Tooltip,\r\n IconButton,\r\n Divider\r\n} from '@material-ui/core'\r\nimport SearchRoundedIcon from '@material-ui/icons/SearchRounded'\r\nimport CloseIcon from '@material-ui/icons/Close'\r\n\r\n//? Own imports\r\nimport { history, useSearchQuery } from 'utils'\r\nimport {\r\n useEstablishmentPlansSelect,\r\n useStatusMembroPlanoSelect\r\n} from 'hooks-querys'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1\r\n },\r\n formControl: {\r\n width: '100%'\r\n },\r\n selectEmpty: {\r\n marginTop: theme.spacing(2)\r\n },\r\n divider: {\r\n height: 28,\r\n margin: 4\r\n }\r\n}))\r\n\r\nconst Filters = () => {\r\n const classes = useStyles()\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const {\r\n data: statusMembroPlanoList,\r\n isLoading: isLoadingStatusMembroPlano\r\n } = useStatusMembroPlanoSelect()\r\n\r\n const {\r\n data: establishmentPlansSelectList,\r\n isLoading: isLoadingEstablishmentPlansSelect\r\n } = useEstablishmentPlansSelect(estabelecimentoId)\r\n\r\n const querySearch = useSearchQuery()\r\n const selectStatusMembroPlano = querySearch.get('statusId')\r\n const selectEstablishmentPlanId = querySearch.get('planoId')\r\n const textSearch = querySearch.get('busca') || ''\r\n const [searchText, setSearchText] = useState(textSearch || '')\r\n useEffect(() => {\r\n setSearchText(textSearch)\r\n }, [textSearch])\r\n\r\n const handleRemoveFilterSelectStatus = () => {\r\n querySearch.delete('statusId')\r\n }\r\n\r\n const handleChangeSelectStatus = (selectStatusMembroPlano: string) => {\r\n if (!selectStatusMembroPlano) {\r\n handleRemoveFilterSelectStatus()\r\n } else {\r\n querySearch.set('statusId', selectStatusMembroPlano)\r\n }\r\n history.push({ search: querySearch.toString() })\r\n }\r\n const handleRemoveFilterSelectEstablishmentPlan = () => {\r\n querySearch.delete('planoId')\r\n }\r\n\r\n const handleChangeSelectEstablishmentPlan = (\r\n selectEstablishmentPlan: string\r\n ) => {\r\n if (!selectEstablishmentPlan) {\r\n handleRemoveFilterSelectEstablishmentPlan()\r\n } else {\r\n querySearch.set('planoId', selectEstablishmentPlan)\r\n }\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n const clearTextSearch = () => {\r\n querySearch.delete('busca')\r\n history.push({ search: querySearch.toString() })\r\n }\r\n const handleSubmitSearch = (event: React.FormEvent) => {\r\n event.preventDefault()\r\n\r\n // Função para remover caracteres indesejados\r\n const sanitizeInput = (input: string) => input.replace(/[^\\w\\s@]/g, '')\r\n\r\n const sanitizedSearchText = sanitizeInput(searchText.trim())\r\n\r\n if (sanitizedSearchText) {\r\n querySearch.set('busca', sanitizedSearchText)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n Filtrar por status\r\n \r\n {\r\n handleChangeSelectStatus(event.target.value as string)\r\n }}\r\n label={\r\n isLoadingStatusMembroPlano\r\n ? 'Carregando...'\r\n : 'Filtrar por status'\r\n }\r\n >\r\n \r\n {!selectStatusMembroPlano ? (\r\n 'Filtrar por status'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n {Array.isArray(statusMembroPlanoList) &&\r\n statusMembroPlanoList?.map((selectItem) => (\r\n \r\n {selectItem?.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n Filtrar por plano \r\n {\r\n handleChangeSelectEstablishmentPlan(\r\n event.target.value as string\r\n )\r\n }}\r\n label={\r\n isLoadingEstablishmentPlansSelect\r\n ? 'Carregando...'\r\n : 'Filtrar por plano'\r\n }\r\n >\r\n \r\n {!selectEstablishmentPlanId ? (\r\n 'Filtrar por plano'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n {establishmentPlansSelectList?.map((establishmentPlanItem) => (\r\n \r\n {establishmentPlanItem?.text}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Filters\r\n","import React, { useRef } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport ReactToPrint from 'react-to-print'\r\nimport { CSVLink } from 'react-csv'\r\nimport { toast } from 'react-toastify'\r\nimport {\r\n TableContainer,\r\n TableHead,\r\n TableCell,\r\n Tooltip,\r\n Paper,\r\n TableRow,\r\n TableBody,\r\n Avatar,\r\n IconButton,\r\n colors,\r\n Table as TableMUI,\r\n makeStyles,\r\n Box,\r\n Typography,\r\n CircularProgress,\r\n TablePagination,\r\n Backdrop,\r\n Toolbar,\r\n TableSortLabel\r\n} from '@material-ui/core'\r\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\n\r\nimport { format } from 'date-fns'\r\n\r\n//? Own components\r\nimport { Label } from 'components'\r\nimport { AccessControl } from 'components/Utils'\r\nimport { Member } from 'types/api'\r\nimport {\r\n getImageUrls,\r\n getInitials,\r\n cpfCnpjMask,\r\n phoneMask,\r\n history,\r\n useSearchQuery\r\n} from 'utils'\r\nimport constants from 'theme/constants'\r\nimport { useMemberList } from 'hooks-querys'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n ...constants.shadowCard\r\n },\r\n nameCell: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n cursor: 'pointer'\r\n },\r\n avatar: {\r\n height: 42,\r\n width: 42,\r\n marginRight: theme.spacing(2)\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff'\r\n },\r\n rootToolbarStyles: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1)\r\n },\r\n titleToolbarStyles: {\r\n flex: '1 1 100%'\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1\r\n }\r\n}))\r\n\r\nconst prepareDataForCSV = (membersList: Member[]) => {\r\n return membersList.map((row) => ({\r\n matricula: !!row?.membroPlano\r\n ? row?.membroPlano[0]?.matricula\r\n ? row?.membroPlano[0]?.matricula\r\n : row?.membroPlano[0]?.id\r\n : '',\r\n nome: row?.nome,\r\n email: row?.email,\r\n cpfCnpj: cpfCnpjMask(row?.cpfCnpj),\r\n phone: phoneMask(row?.telefone),\r\n dataNascimento: row?.dataNascimento\r\n ? format(new Date(row?.dataNascimento), 'dd/MM/yyyy')\r\n : '',\r\n dataHoraInicio: row?.membroPlano\r\n ? format(new Date(row?.membroPlano[0]?.dataHoraInicio), 'dd/MM/yyyy')\r\n : '',\r\n plano: row?.membroPlano ? row?.membroPlano[0]?.plano?.nome : '',\r\n status: row?.membroPlano?.[0]?.statusMembroPlano?.descricao || 'INDEFINIDO'\r\n }))\r\n}\r\n\r\nconst headers = [\r\n { label: 'N.º de Matrícula', key: 'matricula' },\r\n { label: 'Nome', key: 'nome' },\r\n { label: 'Email', key: 'email' },\r\n { label: 'CPF/CNPJ', key: 'cpfCnpj' },\r\n { label: 'Telefone', key: 'phone' },\r\n { label: 'Data de Nascimento', key: 'dataNascimento' },\r\n { label: 'Data de Início', key: 'dataHoraInicio' },\r\n { label: 'Plano', key: 'plano' },\r\n { label: 'Status', key: 'status' }\r\n]\r\ntype Order = 'asc' | 'desc'\r\ninterface EnhancedTableProps {\r\n classes: ReturnType\r\n onRequestSort: (event: React.MouseEvent, property: string) => void\r\n order: Order\r\n orderBy: string\r\n}\r\ninterface HeadCell {\r\n id: string\r\n label: string\r\n align?: 'right' | 'left'\r\n enableSort: boolean\r\n}\r\n\r\nconst headCells: HeadCell[] = [\r\n {\r\n id: 'id',\r\n label: 'Matrícula',\r\n align: 'left',\r\n enableSort: true\r\n },\r\n { id: 'nome', label: 'Nome', enableSort: true },\r\n { id: 'cpfCnpj', label: 'CPF/CNPJ', enableSort: false },\r\n {\r\n id: 'plano',\r\n label: 'Plano',\r\n enableSort: true\r\n },\r\n { id: 'status', label: 'Status', enableSort: true },\r\n {\r\n id: 'actions',\r\n label: 'Ações',\r\n align: 'right',\r\n enableSort: false\r\n }\r\n]\r\n\r\nfunction EnhancedTableHead(props: EnhancedTableProps) {\r\n const { classes, order, orderBy, onRequestSort } = props\r\n const createSortHandler = (property: string) => (\r\n event: React.MouseEvent\r\n ) => {\r\n onRequestSort(event, property)\r\n }\r\n return (\r\n \r\n \r\n {headCells?.map((headCell) => (\r\n \r\n \r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n \r\n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n \r\n ) : null}\r\n \r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n\r\nconst Table = () => {\r\n const classes = useStyles()\r\n const estabelecimentoId = useSelector(\r\n // @ts-ignore: //ainda não foi tipado o redux state\r\n (state) => state.usuarioEstabelecimento.estabelecimentoId\r\n )\r\n const querySearch = useSearchQuery()\r\n\r\n const order = (querySearch.get('direction') || 'asc') as 'asc' | 'desc'\r\n const orderBy = querySearch.get('order') || 'nome'\r\n\r\n const { data, isLoading, isFetching } = useMemberList({\r\n estabelecimentoId: Number(estabelecimentoId || 0),\r\n planoId: querySearch.get('planoId'),\r\n statusMembroPlanoId: querySearch.get('statusId'),\r\n term: querySearch.get('busca') || undefined,\r\n limit: Number(querySearch.get('limit') || 15),\r\n page: Number(querySearch.get('page') || 0),\r\n order: orderBy,\r\n direction: order\r\n })\r\n\r\n const refTable = useRef(null)\r\n const csvData = prepareDataForCSV(data?.items || [])\r\n\r\n const handleDownload = () => {\r\n toast.success('Download concluído com sucesso! 👍', {\r\n position: 'top-right'\r\n })\r\n }\r\n\r\n const handleRequestSort = (\r\n event: React.MouseEvent,\r\n property: string\r\n ) => {\r\n const isAsc = orderBy === property && order === 'asc'\r\n querySearch.set('direction', isAsc ? 'desc' : 'asc')\r\n querySearch.set('order', property)\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n const handleChangePage = (event: unknown, newPage: number) => {\r\n querySearch.set('page', newPage?.toString())\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n const handleChangeRowsPerPage = (\r\n event: React.ChangeEvent\r\n ) => {\r\n querySearch.set('limit', event.target.value)\r\n querySearch.set('page', '0')\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n Carregando dados... \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {data && data?.totalRows > 0 ? (\r\n <>\r\n Total de dados encontrados: {data?.totalRows} \r\n >\r\n ) : (\r\n Nenhum dado encontrado. \r\n )}\r\n \r\n {data && data?.totalRows > 0 ? (\r\n \r\n \r\n \r\n Lista de membros\r\n \r\n {\r\n handleDownload()\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n content={() => refTable.current}\r\n />\r\n \r\n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\r\n \r\n {/* ------------------------------------------------------------>\t */}\r\n \r\n \r\n {/* @ts-ignore */}\r\n \r\n \r\n {data?.items?.map((n: Member) => {\r\n return (\r\n \r\n \r\n {!!n.membroPlano\r\n ? n.membroPlano[0].matricula\r\n ? n.membroPlano[0].matricula\r\n : n.membroPlano[0].id\r\n : ''}\r\n \r\n \r\n {n.nome ? (\r\n \r\n \r\n n.membroPlano &&\r\n history.push(\r\n `/members/memberPlanDetails/${n.membroPlano[0]?.id}`\r\n )\r\n }\r\n className={classes.nameCell}\r\n >\r\n
\r\n {getInitials(n?.nome)}\r\n \r\n
\r\n {n?.nome}\r\n
{n?.email}
\r\n
\r\n
\r\n \r\n ) : (\r\n 'Usuário não encontrado'\r\n )}\r\n \r\n \r\n {cpfCnpjMask(n.cpfCnpj)}\r\n \r\n {/* \r\n {phoneMask(n.telefone)}\r\n \r\n \r\n {n.dataNascimento\r\n ? format(new Date(n.dataNascimento), 'dd/MM/yyyy')\r\n : ''}\r\n \r\n \r\n {n.membroPlano\r\n ? format(\r\n new Date(n.membroPlano[0].dataHoraInicio),\r\n 'dd/MM/yyyy'\r\n )\r\n : ''}\r\n */}\r\n \r\n {n.membroPlano ? n.membroPlano[0].plano?.nome : ''}\r\n \r\n\r\n \r\n \r\n \r\n {n?.membroPlano?.[0]?.statusMembroPlano\r\n ?.descricao || 'INDEFINIDO'}\r\n \r\n
\r\n \r\n\r\n \r\n (\r\n \r\n history.push(`/members/cadastroMembro/${n.id}`)\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n \r\n n.membroPlano &&\r\n history.push(\r\n `/members/memberPlanDetails/${n.membroPlano[0]?.id}`\r\n )\r\n }\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n\r\nexport default Table\r\n","import React from 'react'\r\nimport { Box } from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { Page } from 'components'\r\nimport { AccessControl } from 'components/Utils'\r\nimport AccessDenied from 'views/Errors/AccessDenied'\r\nimport { Filters, Table } from './components'\r\n\r\nconst MemberList = () => {\r\n return (\r\n \r\n (\r\n \r\n \r\n \r\n \r\n )}\r\n // @ts-ignore\r\n no={() => }\r\n />\r\n \r\n )\r\n}\r\n\r\nexport default MemberList\r\n","import { useQuery } from 'react-query'\n\n//? Own imports\nimport { crudService } from '_services'\nimport { Cidade } from '../../types/api'\n\nconst getCityInfo = async (id: number) => {\n const { data } = await crudService.get(`cidades/${id}`)\n return data\n}\n\nexport default function useCityInfo(id: number) {\n return useQuery(['city-info', id], () => getCityInfo(id), {\n enabled: id > 0\n })\n}\n","import { useQuery } from 'react-query'\n\n//? Own imports\nimport { crudService } from '_services'\nimport { Estado } from '../../types/api'\n\nconst getCountryStateInfo = async (id: number) => {\n const { data } = await crudService.get(`estados/${id}`)\n return data\n}\n\nexport default function useCountryStateInfo(id: number) {\n return useQuery(\n ['countryState-info', id],\n () => getCountryStateInfo(id),\n {\n enabled: id > 0\n }\n )\n}\n","import { useQuery } from 'react-query'\n\nimport { crudService } from '_services'\nimport { Estado } from '../../types/api'\n\nconst getStates = async () => {\n const { data } = await crudService.get(`estados`)\n return data\n}\n\nexport default function useCountryStates() {\n return useQuery(['states-list'], () => getStates())\n}\n","import { useQuery } from 'react-query'\n\nimport { crudService } from '_services'\nimport { Cidade } from '../../types/api'\n\nconst getCities = async () => {\n const { data } = await crudService.get(`cidades`)\n return data\n}\n\nexport default function useCities() {\n return useQuery(['cities-list'], () => getCities())\n}\n","import { useQuery } from 'react-query'\n\nimport { crudService } from '_services'\nimport { Cidade } from '../../types/api'\n\nconst getCitiesByStateId = async (id: number) => {\n const { data } = await crudService.get(`cidades/estado/${id}`)\n return data\n}\n\nexport default function useCitiesByStateId(id: number, stateId: number | null) {\n return useQuery(\n ['citiesByStateId-list', stateId],\n () => getCitiesByStateId(id),\n {\n enabled: id > 0\n }\n )\n}\n\n","import React, { useEffect, useState } from 'react'\nimport {\n Card,\n CardHeader,\n CardContent,\n CardActions,\n Divider,\n MenuItem,\n Button,\n Tooltip,\n Grid,\n Checkbox,\n FormControlLabel,\n InputAdornment,\n Typography,\n FormControl,\n InputLabel,\n Select,\n Chip,\n Avatar,\n TextField,\n CircularProgress\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { cupomDescontoAction, eventoAction, loteAction } from '_actions'\nimport { HelperToolTip, ValidatedDatePicker } from 'components/'\nimport { toast } from 'react-toastify'\nimport {\n cepMask,\n cpfCnpjMask,\n getInitials,\n phoneMask,\n toISODateFormat,\n toLocalDateFormat,\n useDebouncedEffect,\n useDidMountEffect,\n validateDates\n} from 'utils'\nimport { history } from 'utils'\nimport { format, isValid } from 'date-fns'\nimport { Page } from 'components'\nimport { makeStyles } from '@material-ui/styles'\nimport { useParams } from 'react-router-dom'\nimport constants from 'theme/constants'\nimport {\n useFormaPagamentoSelect,\n useMemberById,\n useMembershipPlanId,\n useMembershipPlanList,\n useMutationMemberEdit,\n useMutationMembershipPlanCreate,\n useMutationMembershipPlanEdit,\n useUserInfo,\n useUserSearch\n} from 'hooks-querys'\nimport {\n FormaPagamento,\n Member,\n MembershipPlan,\n User,\n UserItem\n} from 'types/api'\nimport { Autocomplete } from '@material-ui/lab'\nimport { useCityInfo } from 'hooks-querys/city'\nimport { isEmpty } from 'lodash'\nimport {\n useCountryStateInfo,\n useCountryStates\n} from 'hooks-querys/countryState'\nimport useCities from 'hooks-querys/city/useCities'\nimport useCitiesByStateId from 'hooks-querys/city/useCitiesByStateId'\nimport { UploadField } from 'components/Utils/Uploads'\nimport useMutationMemberCreate from 'hooks-querys/members/useMutationMemberCreate'\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n // padding: theme.spacing(2)\n },\n paper: {\n ...constants.shadowCard\n },\n formControl: {\n width: '100%'\n },\n nameCell: {\n display: 'flex',\n alignItems: 'center'\n },\n avatar: {\n height: 40,\n width: 40,\n // @ts-ignore\n marginRight: theme.spacing(1)\n }\n}))\n\ntype MemberForm = {\n gender: 'M' | 'F' | 'U'\n}\n\n// @ts-ignore\nconst MemberEdit = (props) => {\n const dispatch = useDispatch()\n const classes = useStyles()\n // @ts-ignore\n const { params, membershipPlanId } = useParams()\n const memberId = membershipPlanId\n const { data: memberEdit } = useMemberById(Number(memberId))\n const [selectedUser, setSelectedUser] = useState([] as UserItem[])\n const [searchTextValue, setSearchTextValue] = useState('')\n const [searchTextValueToSubmit, setSearchTextValueToSubmit] = useState('')\n const [name, setName] = useState()\n const [email, setEmail] = useState()\n const [cpfCnpj, setCpfCnpj] = useState()\n const [image, setImage] = useState()\n const [phone, setPhone] = useState()\n const [birthDate, setBirthDate] = useState(null)\n const [cep, setCep] = useState()\n const [bairro, setBairro] = useState()\n const [cityId, setCityId] = useState(null)\n const [stateId, setStateId] = useState(null)\n const [complemento, setComplemento] = useState()\n const [address, setAddress] = useState()\n const [numberAddress, setNumberAddress] = useState()\n const [gender, setGender] = useState<'M' | 'F' | 'U' | null>()\n const [matricula, setMatricula] = useState(null)\n const [planId, setPlanId] = useState(null)\n const [planPriceId, setPlanPriceId] = useState(null)\n const [startDate, setStartDate] = useState(null)\n const [endDate, setEndDate] = useState(null)\n const [paymentMethod, setPaymentMethod] = useState(\n null\n )\n const [initialDatePayment, setInitialDatePayment] = useState(\n null\n )\n\n const estabelecimentoId = useSelector(\n // @ts-ignore: //ainda não foi tipado o redux state\n (state) => state.usuarioEstabelecimento.estabelecimentoId\n )\n const mutationMemberCreate = useMutationMemberCreate()\n const mutationEditMember = useMutationMemberEdit()\n\n const LoadEditMemberDetails = () => {\n if (!!memberEdit) {\n setName(memberEdit.membro.nome)\n setImage(memberEdit.membro.imagem)\n setEmail(memberEdit.membro.email)\n setCpfCnpj(memberEdit.membro.cpfCnpj)\n setImage(memberEdit.membro.imagem)\n setPhone(memberEdit.membro.telefone)\n setBirthDate(memberEdit.membro.dataNascimento)\n setCep(memberEdit.membro.cep)\n setBairro(memberEdit.membro.bairro)\n setCityId(memberEdit.membro.cidadeId)\n // setState(cityInfoForEdit?.estadoId)\n setComplemento(memberEdit.membro.complemento)\n setAddress(memberEdit.membro.endereco)\n setNumberAddress(memberEdit.membro.numero)\n setGender(memberEdit.membro.genero)\n setSelectedUser(memberEdit?.usuario ? [memberEdit?.usuario] : [])\n // setSelectedUser(userEditInfo)\n // setPlanId(memberEdit.planoId)\n // setPlanPriceId(memberEdit.planoValorId)\n // setPaymentMethod(memberEdit.formaPagamentoId)\n // setMatricula(memberEdit.matricula)\n // memberEdit.statusMembroPlanoId)\n // setInitialDatePayment(memberEdit.dataInicioCobranca)\n // setStartDate(memberEdit.dataHoraInicio)\n // setEndDate(memberEdit.dataHoraFim)\n }\n }\n\n useEffect(() => {\n LoadEditMemberDetails()\n }, [memberEdit])\n\n const { isLoading: isLoadingPlans, data: plans } = useMembershipPlanList(\n estabelecimentoId\n )\n\n const {\n isLoading: isLoadingPlanPrice,\n data: membershipPlan\n } = useMembershipPlanId(Number(planId))\n\n const {\n data: formaPagamentoSelect,\n isLoading: isLoadingFormaPagamentoSelect\n } = useFormaPagamentoSelect()\n\n const {\n data: resultUserSearch,\n isError: isErrorUserSearch,\n isLoading: isLoadingUserSearch\n } = useUserSearch(searchTextValueToSubmit)\n\n const { data: userInfo } = useUserInfo(selectedUser[0]?.id)\n\n // const {\n // data: userEditInfo\n // } = useUserInfo(memberEdit.usuarioId)\n\n const { data: cityInfo } = useCityInfo(\n userInfo?.cidadeId ? userInfo.cidadeId : 0\n )\n\n const { data: cityInfoForEdit } = useCityInfo(cityId ? cityId : 0)\n\n useDidMountEffect(() => {\n cityInfoForEdit?.estadoId && setStateId(cityInfoForEdit?.estadoId)\n }, [cityInfoForEdit])\n\n const { data: countryStateInfo } = useCountryStateInfo(\n cityInfo?.estadoId ? cityInfo?.estadoId : 0\n )\n\n const { data: states } = useCountryStates()\n\n const { data: citiesByStateId } = useCitiesByStateId(\n cityInfo?.estadoId ? cityInfo?.estadoId : stateId ? stateId : 0,\n stateId\n )\n\n const { data: cities } = useCities()\n\n useDebouncedEffect(\n () => {\n setSearchTextValueToSubmit(searchTextValue)\n },\n 500,\n [searchTextValue]\n )\n\n const handleAlreadyUser = () => {\n if (!!userInfo && !memberId) {\n userInfo.nome && setName(userInfo.nome)\n userInfo.email && setEmail(userInfo.email)\n userInfo.cpfCnpj && setCpfCnpj(userInfo.cpfCnpj)\n userInfo.imagem && setImage(userInfo.imagem)\n userInfo.telefone && setPhone(userInfo.telefone)\n userInfo.dataNascimento && setBirthDate(userInfo.dataNascimento)\n userInfo.cep && setCep(userInfo.cep)\n userInfo.bairro && setBairro(userInfo.bairro)\n userInfo.cidadeId && setCityId(userInfo.cidadeId)\n userInfo.cidade?.estadoId && setStateId(userInfo.cidade?.estadoId)\n userInfo.complemento && setComplemento(userInfo.complemento)\n userInfo.endereco && setAddress(userInfo.endereco)\n userInfo.numero && setNumberAddress(userInfo.numero)\n userInfo.genero && setGender(userInfo.genero)\n } else if (!memberId) {\n setName(null)\n setEmail(null)\n setCpfCnpj(null)\n setImage(null)\n setPhone(null)\n setBirthDate(null)\n setCep(null)\n setBairro(null)\n setCityId(null)\n setStateId(null)\n setComplemento(null)\n setAddress(null)\n setNumberAddress(null)\n setGender(null)\n }\n }\n\n useDidMountEffect(() => {\n handleAlreadyUser()\n }, [userInfo])\n\n const cancelClick = () => {\n history.goBack()\n }\n\n const handleSubmit = () => {\n if (memberEdit) {\n handleEdit()\n } else {\n // if (!!planId && !!planPriceId && !!startDate && !!paymentMethod && !!birthDate) {\n if (!!planId && !!planPriceId && !!startDate && !!paymentMethod) {\n let membroPlano = [\n {\n // id: null,\n // membroId: 0,\n planoId: planId,\n planoValorId: planPriceId,\n // dataHoraInicio: !!startDate ? format(new Date(startDate), 'dd/MM/yyyy HH:mm') : null,\n // dataHoraFim: !!endDate ? format(new Date(endDate), 'dd/MM/yyyy HH:mm') : null,\n dataHoraInicio: startDate,\n dataHoraFim: endDate,\n formaPagamentoId: Number(paymentMethod),\n matricula: matricula,\n statusMembroPlanoId: 1,\n dataInicioCobranca: initialDatePayment\n }\n ]\n\n let payload = {\n id: 0,\n nome: name,\n email: email,\n cpfCnpj: !!cpfCnpj\n ? cpfCnpj.split('.').join('').replace(/[-/.]/g, '')\n : null,\n imagem: image,\n telefone: !!phone ? phone.replace(/[^0-9]/g, '') : null,\n // qrcode\n // dataNascimento: format(Number(birthDate), 'yyyy-MM-dd'),\n dataNascimento: birthDate,\n usuarioId: userInfo?.id,\n cidadeId: cityId,\n genero: gender,\n endereco: address,\n bairro: bairro,\n numero: numberAddress,\n complemento: complemento,\n cep: !!cep ? cep.replace(/[^0-9]/g, '') : null,\n membroPlano: membroPlano\n }\n\n // @ts-ignore\n createMember(payload)\n console.error('payload', payload)\n } else {\n // toast.error('Informe a data de nascimento, um plano, um valor, data de início e forma de pagamento!')\n toast.error(\n 'Informe um plano, um valor, data de início e forma de pagamento!'\n )\n }\n }\n }\n\n const createMember = (payload: Member) => {\n mutationMemberCreate.mutateAsync(payload).then(() => {\n history.push('/members/listaMembro')\n // dispatch(albumAction.deleteAllFoto())\n })\n }\n\n const handleEdit = () => {\n let payload = {\n id: memberId,\n nome: name,\n email: email,\n cpfCnpj: !!cpfCnpj\n ? cpfCnpj.split('.').join('').replace(/[-/.]/g, '')\n : null,\n imagem: image,\n telefone: !!phone ? phone.replace(/[^0-9]/g, '') : null,\n dataNascimento: birthDate,\n usuarioId: selectedUser[0]?.id,\n cidadeId: cityId,\n genero: gender,\n endereco: address,\n bairro: bairro,\n numero: numberAddress,\n complemento: complemento,\n cep: !!cep ? cep.replace(/[^0-9]/g, '') : null\n // membroPlano: membroPlano\n }\n\n // @ts-ignore\n editMemberPlan(payload)\n }\n\n const editMemberPlan = (payload: Member) => {\n mutationEditMember.mutateAsync(payload).then(() => {\n history.push('/members/listaMembro')\n })\n }\n\n const handleOnChangeState = (event: any) => {\n setStateId(Number(event.target.value))\n setCityId(null)\n }\n\n return (\n \n \n \n \n \n \n \n )\n}\n\nexport default MemberEdit\n\n","import React, { useEffect, useState } from 'react'\r\nimport { Redirect, useParams } from 'react-router-dom'\r\nimport ListRoundedIcon from '@material-ui/icons/ListRounded'\r\nimport {\r\n Tabs,\r\n Tab,\r\n Divider,\r\n colors,\r\n makeStyles,\r\n useTheme,\r\n useMediaQuery,\r\n LinearProgress\r\n} from '@material-ui/core'\r\nimport AddCircleTwoToneIcon from '@material-ui/icons/AddCircleTwoTone'\r\nimport EditTwoToneIcon from '@material-ui/icons/EditTwoTone'\r\nimport { Page, Header } from 'components'\r\nimport { useDispatch } from 'react-redux'\r\nimport { albumAction } from '_actions'\r\nimport { MembershipPlanList } from './MembershipPlanList'\r\nimport MembershipPlanEdit from './MembershipPlanEdit'\r\nimport MemberList from './MemberList'\r\nimport MemberEdit from './MemberEdit'\r\nimport { AccessControl } from 'components/Utils'\r\nimport AccessDenied from 'views/Errors/AccessDenied'\r\nimport { useQueryClient } from 'react-query'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n padding: theme.spacing(3, 2, 2, 2)\r\n },\r\n tabs: {\r\n marginTop: theme.spacing(3)\r\n },\r\n divider: {\r\n backgroundColor: colors.grey[300]\r\n },\r\n content: {\r\n marginTop: theme.spacing(3)\r\n }\r\n}))\r\n\r\n// @ts-ignore\r\nconst Members = (props) => {\r\n const { match, history } = props\r\n const { tab } = match.params\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const dispatch = useDispatch()\r\n const queryClient = useQueryClient()\r\n const [refreshing, setRefreshing] = useState(false)\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n // @ts-ignore\r\n const { memberId, membershipPlanId, eventoId } = useParams()\r\n\r\n // @ts-ignore\r\n const handleTabsChange = (event, value) => {\r\n history.push(`/members/${value}`)\r\n }\r\n\r\n const tabs = [\r\n { value: 'listaPlano', label: 'Lista Plano', icon: },\r\n {\r\n value: 'cadastroPlano',\r\n label: membershipPlanId ? 'Editar Plano' : 'Cadastro Plano',\r\n icon: membershipPlanId ? : ,\r\n disabled: membershipPlanId ? true : false\r\n },\r\n { value: 'listaMembro', label: 'Lista Membro', icon: },\r\n {\r\n value: 'cadastroMembro',\r\n label: memberId ? 'Editar Membro' : 'Cadastro Membro',\r\n icon: memberId ? : ,\r\n disabled: memberId ? true : false\r\n }\r\n ]\r\n\r\n const onRefresh = async () => {\r\n setRefreshing(true)\r\n try {\r\n await queryClient.refetchQueries({ active: true })\r\n } finally {\r\n setRefreshing(false)\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatch(albumAction.deleteAllFoto())\r\n }\r\n }, [])\r\n\r\n if (!tab) {\r\n return \r\n }\r\n\r\n if (!tabs.find((t) => t.value === tab)) {\r\n return \r\n }\r\n\r\n return (\r\n (\r\n <>\r\n {refreshing && (\r\n \r\n )}\r\n {/* @ts-ignore */}\r\n \r\n \r\n \r\n {tabs.map((tab) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n {tab === 'listaPlano' && }\r\n {tab === 'cadastroPlano' && }\r\n {tab === 'listaMembro' && }\r\n {tab === 'cadastroMembro' && }\r\n
\r\n \r\n >\r\n )}\r\n // @ts-ignore\r\n no={() => }\r\n />\r\n )\r\n}\r\n\r\nexport default Members\r\n","import React, { useEffect, useState } from 'react'\nimport {\n Modal,\n Card,\n CardContent,\n CardActions,\n Grid,\n Typography,\n Button,\n makeStyles,\n Box,\n MenuItem\n} from '@material-ui/core'\nimport {\n ValidatorForm,\n TextValidator,\n SelectValidator\n} from 'react-material-ui-form-validator'\nimport { KeyboardDatePicker } from '@material-ui/pickers'\nimport { cnpj, cpf } from 'cpf-cnpj-validator'\n\n//? Own imports\nimport { Cidade, Estado, User } from 'types/api'\nimport { cepMask, cpfCnpjMask, phoneMask } from 'utils'\n\ntype UserEditProps = {\n user: User\n open: boolean\n onClose: () => void\n}\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n outline: 'none',\n boxShadow: theme.shadows[20],\n [theme.breakpoints.up('sm')]: {\n borderRadius: '8px',\n webkitBorderRadius: '8px',\n mozBorderRadius: '8px'\n },\n width: 700,\n maxHeight: '100%',\n overflowY: 'auto',\n maxWidth: '100%'\n },\n container: {\n marginTop: theme.spacing(3)\n },\n actions: {\n justifyContent: 'flex-end'\n }\n}))\n\ntype UserEditForm = {\n user: User\n nome: string\n cpfCnpj: string\n apelido?: string\n username: string\n dataNascimento?: Date\n telefone: string\n genero: 'M' | 'F' | 'U'\n cidadeId: number\n cep: string\n endereco: string\n numero: string\n complemento?: string\n bairro: string\n email: string\n}\n\nconst UserEdit = ({ open, onClose, user }: UserEditProps) => {\n const classes = useStyles()\n const [formState, setFormState] = useState({\n nome: user?.nome,\n cpfCnpj: user?.cpfCnpj,\n apelido: user?.apelido,\n username: user?.username,\n dataNascimento: user?.dataNascimento,\n telefone: user?.telefone,\n genero: user?.genero,\n cidadeId: user?.cidadeId,\n cep: user?.cep,\n endereco: user?.endereco,\n numero: user?.numero,\n complemento: user?.complemento,\n bairro: user?.bairro,\n email: user?.email\n })\n\n useEffect(() => {\n ValidatorForm.addValidationRule('isValidCpf', (value) => {\n if (value && value.length <= 14) {\n if (cpf.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n\n ValidatorForm.addValidationRule('isValidCnpj', (value) => {\n if (value && value.length >= 15) {\n if (cnpj.isValid(value)) {\n return true\n } else {\n return false\n }\n } else {\n return true\n }\n })\n ValidatorForm.addValidationRule('isValidPhone', (value) => {\n if (value && value !== null) {\n if (value.length > 0 && value.length < 14) {\n return false\n }\n return true\n }\n return true\n })\n ValidatorForm.addValidationRule('isValidCep', (value) => {\n if (value.length === 9) {\n return true\n } else {\n return false\n }\n })\n return () => {\n ValidatorForm.removeValidationRule('isValidCpf')\n ValidatorForm.removeValidationRule('isValidCnpj')\n ValidatorForm.removeValidationRule('isValidCep')\n ValidatorForm.removeValidationRule('isValidPhone')\n }\n }, [])\n\n const handleFieldChange = (event: React.ChangeEvent) => {\n event.persist()\n setFormState((formState: any) => ({\n ...formState,\n [event.target.name]:\n event.target.type === 'checkbox'\n ? event.target.checked\n : event.target.value\n }))\n }\n\n const handleSave = () => {\n console.log(formState)\n }\n if (!open) {\n return null\n }\n\n return (\n \n \n \n \n \n \n Editar usuário\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n // \n // generateUsername()}\n // >\n // \n // \n // \n // \n // ),\n startAdornment: @ \n }}\n // onFocus={() =>\n // (formState.username === '' ||\n // formState.username === null) &&\n // generateUsername()\n // }\n />\n \n \n handleFieldChange}\n InputAdornmentProps={{ position: 'start' }}\n />\n \n \n \n \n \n \n \n Sexo \n \n Masculino \n Feminino \n \n \n \n \n \n \n \n \n Estado * \n \n {/* {undefined !== estados && estados.length\n ? estados.map((row) => (\n \n {row.nome}\n \n ))\n : null} */}\n \n \n \n \n \n Cidade * \n \n {/* {cidades.map((row) => (\n \n {row.nome}\n \n ))} */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Cancelar\n \n \n Salvar\n \n \n \n \n \n )\n}\n\nUserEdit.displayName = 'UserEdit'\n\nexport default UserEdit\n","import { makeStyles } from '@material-ui/core/styles'\r\n\r\nexport const useStyles = makeStyles((theme) => ({\r\n dialogContent: {\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n display: 'flex',\r\n flexDirection: 'column'\r\n },\r\n card: {\r\n width: '5.4cm',\r\n height: '8.5cm',\r\n backgroundColor: theme.palette.background.paper,\r\n borderRadius: '0.45cm',\r\n overflow: 'hidden',\r\n border: `1px solid ${theme.palette.divider}`\r\n },\r\n avatar: {\r\n backgroundColor: theme.palette.background.paper,\r\n padding: '0.05cm',\r\n height: '1.5cm',\r\n width: '1.5cm'\r\n },\r\n header: {\r\n height: '2.5cm',\r\n backgroundColor: 'transparent',\r\n color: theme.palette.background.paper,\r\n padding: '0.2cm',\r\n textAlign: 'center',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center'\r\n },\r\n hole: {\r\n zIndex: 9999,\r\n width: '1cm',\r\n height: '0.3cm',\r\n marginBottom: '0.2cm',\r\n borderRadius: '0.2cm',\r\n backgroundColor: theme.palette.background.paper\r\n },\r\n content: {\r\n padding: '0.25cm'\r\n },\r\n title: {\r\n fontSize: '0.28cm'\r\n },\r\n subtitle: { fontSize: '0.28cm' },\r\n divider: {\r\n margin: '0.25cm 0'\r\n },\r\n logo: {\r\n height: '0.5cm',\r\n width: 'auto'\r\n }\r\n}))\r\n","import React, { useRef } from 'react'\r\nimport {\r\n Box,\r\n Typography,\r\n Divider,\r\n Paper,\r\n Dialog,\r\n Button,\r\n Slide,\r\n Avatar,\r\n DialogContent,\r\n useTheme\r\n} from '@material-ui/core'\r\nimport { TransitionProps } from '@material-ui/core/transitions'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\nimport ReactToPrint from 'react-to-print'\r\nimport { QRCodeSVG } from 'qrcode.react'\r\nimport { format } from 'date-fns'\r\n\r\n// Own imports\r\nimport { useStyles } from './styles'\r\nimport { MemberPlan } from 'types/api'\r\n\r\nconst Transition = React.forwardRef(function Transition(\r\n props: TransitionProps & { children?: React.ReactElement },\r\n ref: React.Ref\r\n) {\r\n return \r\n})\r\n\r\nexport type MembershipCardProps = {\r\n setOpenDialogMembershipCard: (open: boolean) => void\r\n openDialogMembershipCard: boolean\r\n memberPlan: MemberPlan\r\n}\r\n\r\nconst MembershipCard = ({\r\n setOpenDialogMembershipCard,\r\n openDialogMembershipCard,\r\n memberPlan\r\n}: MembershipCardProps) => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const refMembershipCard = useRef(null)\r\n const backgroundImage =\r\n memberPlan?.plano?.imagem || memberPlan?.plano?.estabelecimento?.imagem\r\n return (\r\n setOpenDialogMembershipCard(false)}\r\n >\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {memberPlan?.plano?.nome?.toUpperCase()}\r\n \r\n \r\n Matrícula:{' '}\r\n \r\n {/* @ts-ignore */}\r\n {memberPlan?.matricula}\r\n \r\n \r\n \r\n Nome:{' '}\r\n \r\n {memberPlan?.membro?.nome}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Válido até{' '}\r\n {memberPlan?.dataHoraInicio && (\r\n \r\n {format(new Date(memberPlan?.dataHoraInicio), 'dd/MM/yyyy')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n (\r\n }\r\n onClick={() => setOpenDialogMembershipCard(true)}\r\n >\r\n Imprimir/Salvar\r\n \r\n )}\r\n content={() => refMembershipCard.current}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default MembershipCard\r\n","import React, { useState } from 'react'\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n CardActions,\r\n Button,\r\n Divider,\r\n Table,\r\n TableBody,\r\n TableRow,\r\n TableCell,\r\n colors,\r\n makeStyles,\r\n Box\r\n} from '@material-ui/core'\r\nimport EditIcon from '@material-ui/icons/Edit'\r\nimport GetAppRoundedIcon from '@material-ui/icons/GetAppRounded'\r\n\r\n//? Own imports\r\nimport { Label } from 'components'\r\nimport { MembershipCard, UserEdit } from './components'\r\nimport { cepMask, cpfCnpjMask, getGenderFull, history, phoneMask } from 'utils'\r\nimport { MemberPlan } from 'types/api'\r\nimport constants from 'theme/constants'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n ...constants.shadowCard\r\n },\r\n content: {\r\n padding: 0\r\n },\r\n actions: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between'\r\n },\r\n label: {\r\n marginTop: theme.spacing(1)\r\n }\r\n}))\r\n\r\ntype UserInfoProps = {\r\n memberPlan: MemberPlan\r\n}\r\n\r\nconst UserInfo = ({ memberPlan }: UserInfoProps) => {\r\n const classes = useStyles()\r\n const [openEdit, setOpenEdit] = useState(false)\r\n const [openDialogMembershipCard, setOpenDialogMembershipCard] = useState(\r\n false\r\n )\r\n\r\n const handleEditOpen = () => {\r\n setOpenEdit(true)\r\n }\r\n\r\n const handleEditClose = () => {\r\n setOpenEdit(false)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Matrícula \r\n #{memberPlan.matricula\r\n ? memberPlan.matricula\r\n : memberPlan?.id}\r\n \r\n \r\n \r\n Nome \r\n \r\n {memberPlan?.membro?.nome}\r\n {memberPlan?.membro?.usuario && (\r\n \r\n \r\n {'POSSUI USUÁRIO VINCULADO'}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n CPF/CNPJ \r\n {cpfCnpjMask(memberPlan?.membro?.cpfCnpj)} \r\n \r\n \r\n Email \r\n {memberPlan?.membro?.email} \r\n \r\n \r\n Telefone \r\n \r\n {memberPlan?.membro?.telefone\r\n ? phoneMask(memberPlan?.membro?.telefone)\r\n : 'Não informado'}\r\n \r\n \r\n \r\n Data de nascimento \r\n \r\n {memberPlan?.membro?.dataNascimento\r\n ? `${memberPlan?.membro?.dataNascimento\r\n .toString()\r\n .split('-')[2]\r\n .substring(0, 2)}/${\r\n memberPlan?.membro?.dataNascimento\r\n .toString()\r\n .split('-')[1]\r\n }/${\r\n memberPlan?.membro?.dataNascimento\r\n .toString()\r\n .split('-')[0]\r\n }`\r\n : 'Não informada'}\r\n \r\n \r\n \r\n Endereço \r\n \r\n {memberPlan?.membro?.endereco\r\n ? `${memberPlan?.membro?.endereco}, ${\r\n memberPlan?.membro?.numero\r\n }${\r\n memberPlan?.membro?.complemento\r\n ? `, ${memberPlan?.membro?.complemento}`\r\n : ''\r\n } - ${memberPlan?.membro?.bairro} - ${cepMask(\r\n memberPlan?.membro?.cep\r\n )}`\r\n : 'Não informado'}\r\n \r\n \r\n \r\n Cidade \r\n \r\n {memberPlan &&\r\n memberPlan.membro?.cidade &&\r\n memberPlan?.membro?.cidade?.nome}{' '}\r\n -{' '}\r\n {memberPlan &&\r\n memberPlan.membro?.cidade &&\r\n memberPlan?.membro?.cidade?.estado?.uf}\r\n \r\n \r\n \r\n Pais \r\n \r\n {memberPlan?.membro?.cidade?.estado?.pais?.nomePt ||\r\n 'Não informado'}\r\n \r\n \r\n {memberPlan?.membro?.usuario && (\r\n <>\r\n \r\n Apelido \r\n \r\n {memberPlan?.membro?.usuario?.apelido\r\n ? memberPlan?.membro?.usuario?.apelido\r\n : 'Não informado'}\r\n \r\n \r\n \r\n Nome do usuário \r\n \r\n @{memberPlan?.membro?.usuario?.username}\r\n \r\n \r\n >\r\n )}\r\n \r\n Gênero \r\n {getGenderFull(memberPlan?.membro?.genero)} \r\n \r\n \r\n \r\n QRCode\r\n \r\n \r\n {memberPlan?.qrCode}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n }\r\n onClick={() =>\r\n history.push(`/members/cadastroMembro/${memberPlan?.membro?.id}`)\r\n }\r\n // disabled={true}\r\n >\r\n Editar\r\n \r\n }\r\n onClick={() => setOpenDialogMembershipCard(true)}\r\n >\r\n Gerar carteira em PDF\r\n \r\n \r\n {/* */}\r\n\r\n \r\n \r\n )\r\n}\r\n\r\nexport default UserInfo\r\n","import React from 'react'\r\nimport {\r\n Button,\r\n Card,\r\n CardActions,\r\n CardContent,\r\n CardHeader,\r\n Divider,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableRow,\r\n colors,\r\n makeStyles\r\n} from '@material-ui/core'\r\nimport {\r\n differenceInMonths,\r\n differenceInWeeks,\r\n format,\r\n formatRelative,\r\n parseISO\r\n} from 'date-fns'\r\nimport { useParams } from 'react-router-dom'\r\nimport brLocale from 'date-fns/locale/pt-BR'\r\nimport AccountBalanceRoundedIcon from '@material-ui/icons/AccountBalanceRounded'\r\nimport PeopleOutlineRoundedIcon from '@material-ui/icons/PeopleOutlineRounded'\r\n\r\n//? Own imports\r\nimport { Label } from 'components'\r\nimport { MemberPlan } from 'types/api'\r\nimport constants from 'theme/constants'\r\nimport { formatCurrency, getPeriodicityString, history } from 'utils'\r\n\r\nconst calculateMembershipTime = (startDate: string, endDate: string) => {\r\n const start = parseISO(startDate)\r\n const end = parseISO(endDate)\r\n\r\n const months = differenceInMonths(end, start)\r\n const weeks = differenceInWeeks(end, start) - months * 4\r\n\r\n if (months === 1 && weeks <= 3) {\r\n return `${months} mês e ${weeks} semanas`\r\n } else if (months > 1 && weeks <= 3) {\r\n return `${months} meses e ${weeks} semanas`\r\n } else if (months === 1 && weeks > 3) {\r\n return `${months + 1} meses`\r\n } else if (months > 1 && weeks > 3) {\r\n return `${months + 1} meses`\r\n } else if (months === 0 && weeks === 1) {\r\n return `${weeks} semana`\r\n } else if (months === 0 && weeks > 1) {\r\n return `${weeks} semanas`\r\n } else {\r\n return `${months} meses`\r\n }\r\n}\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {\r\n ...constants.shadowCard\r\n },\r\n actions: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between'\r\n },\r\n content: {\r\n padding: 0\r\n }\r\n}))\r\n\r\ntype ExtraInfoProps = {\r\n memberPlan: MemberPlan\r\n}\r\n\r\nconst ExtraInfo = ({ memberPlan }: ExtraInfoProps) => {\r\n const classes = useStyles()\r\n const { id: memberId } = useParams<{ tab: string; id: string }>()\r\n const { plano, planoValor } = memberPlan\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Plano \r\n {plano?.nome} \r\n \r\n \r\n Status \r\n \r\n \r\n \r\n {memberPlan?.statusMembroPlano ? memberPlan?.statusMembroPlano.descricao : 'INDEFINIDO'}\r\n \r\n
\r\n \r\n \r\n \r\n Periodicidade \r\n \r\n {getPeriodicityString(planoValor?.periodicidade || '')}\r\n \r\n \r\n \r\n Valor \r\n {formatCurrency(planoValor?.valor)} \r\n \r\n \r\n Data de início \r\n \r\n {memberPlan?.dataHoraInicio\r\n ? format(new Date(memberPlan.dataHoraInicio), 'dd/MM/yyyy')\r\n : 'Não informado'}\r\n \r\n \r\n \r\n Data de término \r\n \r\n {memberPlan?.dataHoraFim\r\n ? format(new Date(memberPlan.dataHoraFim), 'dd/MM/yyyy')\r\n : 'Não informado'}\r\n \r\n \r\n \r\n \r\n Tempo de associação \r\n \r\n {memberPlan?.dataHoraInicio\r\n ? calculateMembershipTime(\r\n memberPlan.dataHoraInicio,\r\n memberPlan.dataHoraFim || new Date()?.toISOString()\r\n )\r\n : 'Não informado'}\r\n \r\n \r\n \r\n Próxima cobrança \r\n \r\n {memberPlan && memberPlan?.dataHoraFim\r\n ? format(new Date(memberPlan?.dataHoraFim), 'dd/MM/yyyy')\r\n : 'Não informado'}\r\n \r\n \r\n \r\n
\r\n \r\n \r\n }\r\n disabled={true}\r\n // onClick={}\r\n >\r\n Ver plano\r\n \r\n }\r\n onClick={() =>\r\n history.push(`/members/memberPlanDetails/${memberId}/financeiro`)\r\n }\r\n >\r\n Financeiro\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default ExtraInfo\r\n","import React from 'react'\r\nimport {\r\n Card,\r\n CardHeader,\r\n CardContent,\r\n Button,\r\n Divider,\r\n Typography,\r\n makeStyles,\r\n Switch,\r\n Box,\r\n FormControlLabel,\r\n Tooltip\r\n} from '@material-ui/core'\r\nimport DeleteIcon from '@material-ui/icons/DeleteOutline'\r\nimport MailOutlineRoundedIcon from '@material-ui/icons/MailOutlineRounded'\r\nimport { useConfirm } from 'material-ui-confirm'\r\n\r\n//? Own imports\r\nimport { MemberPlan } from 'types/api'\r\nimport constants from 'theme/constants'\r\nimport { useMutationMemberPlanDelete } from 'hooks-querys'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n ...constants.shadowCard\r\n },\r\n mainActions: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'flex-start'\r\n },\r\n notice: {\r\n marginTop: theme.spacing(1)\r\n },\r\n deleteButton: {\r\n marginTop: theme.spacing(1),\r\n color: '#fff',\r\n backgroundColor: theme.palette.error.main,\r\n '&:hover': {\r\n backgroundColor: theme.palette.error.dark\r\n }\r\n },\r\n controlLabel: {\r\n padding: theme.spacing(1)\r\n }\r\n}))\r\n\r\ntype OtherActionsProps = {\r\n memberPlan: MemberPlan\r\n}\r\n\r\n\r\nconst OtherActions = ({ memberPlan }: OtherActionsProps) => {\r\n const classes = useStyles()\r\n const confirm = useConfirm()\r\n const mutationDeleteMemberPlan = useMutationMemberPlanDelete()\r\n\r\n const handleDeleteMemberPlanClick = (idMemberPlan: number) => {\r\n confirm({\r\n title: 'Você deseja excluir esse membro?',\r\n description: 'Confirmando essa operação, o membro será excluido para sempre!',\r\n confirmationText: 'Sim, excluir!',\r\n cancellationText: 'Não!'\r\n }).then(() => {\r\n deleteMemberPlan(idMemberPlan)\r\n })\r\n }\r\n\r\n const deleteMemberPlan = (idMemberPlan: number) => {\r\n mutationDeleteMemberPlan.mutate(idMemberPlan)\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Status de acesso \r\n \r\n Permitir ou bloquear acesso do membro\r\n \r\n \r\n \r\n \r\n }\r\n label={memberPlan?.ativo ? 'Permitido' : 'Bloqueado'}\r\n />\r\n \r\n } disabled={true}>\r\n Reenviar email de associação\r\n \r\n \r\n \r\n \r\n Remova os dados deste membro se ele solicitou, se não, por favor\r\n esteja ciente de que o que for excluído nunca poderá ser recuperado.\r\n \r\n }\r\n onClick={() => handleDeleteMemberPlanClick(memberPlan.id)}\r\n >\r\n Excluir membro\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default OtherActions\r\n","import React, { useState, useEffect } from 'react'\r\nimport {\r\n Box,\r\n CircularProgress,\r\n Grid,\r\n Typography,\r\n makeStyles\r\n} from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { UserInfo, ExtraInfo, OtherActions } from './components'\r\nimport { MemberPlan } from 'types/api'\r\nimport { useParams } from 'react-router-dom'\r\nimport { useMemberPlanDetails } from 'hooks-querys'\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {}\r\n}))\r\n\r\nconst Summary = () => {\r\n const classes = useStyles()\r\n const { id: memberPlanId } = useParams<{ tab: string; id: string }>()\r\n const {\r\n data: memberPlanDetails,\r\n isLoading,\r\n isFetching,\r\n refetch\r\n } = useMemberPlanDetails({ memberPlanId: Number(memberPlanId) })\r\n\r\n if (isLoading)\r\n return (\r\n \r\n \r\n \r\n Carregando dados... \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default Summary\r\n","import React from 'react'\r\nimport {\r\n TableRow,\r\n TableCell,\r\n Box,\r\n Typography,\r\n Table,\r\n TableHead,\r\n useTheme,\r\n TableBody,\r\n IconButton,\r\n Tooltip\r\n} from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { formatCurrency, toLocalDateFormat } from 'utils'\r\nimport { Label, SkeletonTable } from 'components'\r\nimport { useMembershipPayment } from 'hooks-querys'\r\nimport { AccessControl } from 'components/Utils'\r\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\r\nimport FileCopyRoundedIcon from '@material-ui/icons/FileCopyRounded'\r\nimport ShareIcon from '@material-ui/icons/Share'\r\nimport { toast } from 'react-toastify'\r\n\r\nconst RowTableMemberFinancial = ({\r\n membershipId\r\n}: {\r\n membershipId: number\r\n}) => {\r\n const theme = useTheme()\r\n const { data, isLoading } = useMembershipPayment({\r\n membershipId: membershipId\r\n })\r\n\r\n const handleOpenLinkBoleto = (url: string) => {\r\n window.open(url, \"_blank\", \"noreferrer\");\r\n }\r\n\r\n const handleCopyLinhaDigitavelBoleto = (link: string) => {\r\n navigator.clipboard.writeText(link)\r\n toast.success(\r\n 'Linha digitável do boleto copiada com sucesso!',\r\n {\r\n autoClose: 4000\r\n }\r\n )\r\n }\r\n\r\n\r\n\r\n if (!membershipId) return null\r\n\r\n const totalItems = data?.length\r\n return (\r\n \r\n \r\n Histórico de transações\r\n \r\n {isLoading ? (\r\n \r\n ) : totalItems && totalItems > 0 ? (\r\n \r\n \r\n \r\n Data criação \r\n Forma Pagamento \r\n Data validade \r\n Status \r\n Valor Total (R$) \r\n Ações \r\n \r\n \r\n \r\n {data?.map((payment) => (\r\n \r\n {toLocalDateFormat(payment.dataHora)} \r\n \r\n {payment?.formaPagamento?.descricao}\r\n \r\n \r\n {toLocalDateFormat(payment?.dataHoraValidade)}\r\n \r\n \r\n \r\n {payment?.statusPagamento?.descricao}\r\n \r\n \r\n\r\n \r\n {formatCurrency(payment?.valor)}\r\n \r\n \r\n (\r\n \r\n handleOpenLinkBoleto(payment.linkBoleto)\r\n }\r\n disabled={payment?.formaPagamento?.id != 2}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n (\r\n \r\n handleCopyLinhaDigitavelBoleto(payment.linhaDigitavelBoleto)\r\n }\r\n disabled={payment?.formaPagamento?.id != 2}\r\n >\r\n \r\n \r\n \r\n \r\n )}\r\n />\r\n \r\n \r\n ))}\r\n \r\n
\r\n ) : (\r\n \r\n Não há dados para essa subscrição \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default RowTableMemberFinancial\r\n","import React, { useState } from 'react'\r\nimport { Link as RouterLink } from 'react-router-dom'\r\nimport {\r\n TableRow,\r\n TableCell,\r\n Grid,\r\n Tooltip,\r\n IconButton,\r\n Link,\r\n makeStyles,\r\n Collapse,\r\n Box,\r\n Typography,\r\n Table,\r\n TableHead,\r\n useTheme,\r\n TableBody\r\n} from '@material-ui/core'\r\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'\r\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'\r\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp'\r\n\r\n//? Own imports\r\nimport { MembershipSubscription } from 'types/api'\r\nimport { formatCurrency, toLocalDateFormat } from 'utils'\r\nimport { Label } from 'components'\r\nimport { TableFinancialTransactionHistory } from './components'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n '& > *': {\r\n borderBottom: 'unset'\r\n }\r\n },\r\n nameCell: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n\r\nconst RowTableMemberFinancial = ({\r\n membershipItem\r\n}: {\r\n membershipItem: MembershipSubscription\r\n}) => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const [open, setOpen] = useState(false)\r\n\r\n if (!membershipItem) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n setOpen(!open)}\r\n >\r\n {open ? : }\r\n \r\n \r\n \r\n {membershipItem?.membroPlano?.plano?.nome} \r\n \r\n {membershipItem?.membroPlano?.planoValor?.valor\r\n ? formatCurrency(membershipItem?.membroPlano?.planoValor?.valor)\r\n : '----------'}\r\n \r\n \r\n {membershipItem?.dataHoraInicio\r\n ? toLocalDateFormat(membershipItem?.dataHoraInicio)\r\n : '----------'}\r\n \r\n \r\n {membershipItem?.dataHoraFim\r\n ? toLocalDateFormat(membershipItem?.dataHoraFim)\r\n : '----------'}\r\n \r\n\r\n \r\n {membershipItem ? (\r\n \r\n {membershipItem?.pago ? 'PAGO' : 'PAGAMENTO PENDENTE'}\r\n \r\n ) : (\r\n '----------'\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default RowTableMemberFinancial\r\n","import React from 'react'\r\nimport {\r\n TableBody,\r\n Table,\r\n makeStyles,\r\n TableCell,\r\n TableContainer,\r\n TableHead,\r\n TableRow,\r\n Paper,\r\n Typography,\r\n Toolbar,\r\n Tooltip,\r\n IconButton,\r\n Box,\r\n BoxProps\r\n} from '@material-ui/core'\r\nimport PrintRoundedIcon from '@material-ui/icons/PrintRounded'\r\nimport ReactToPrint from 'react-to-print'\r\n\r\n//? Own imports\r\nimport { MembershipSubscription } from 'types/api'\r\nimport { RowTableMemberFinancial } from './components'\r\nimport constants from 'theme/constants'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n table: {\r\n minWidth: 700\r\n },\r\n rootToolbarStyles: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1)\r\n },\r\n titleToolbarStyles: {\r\n flex: '1 1 100%'\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n ...constants.shadowCard\r\n }\r\n}))\r\n\r\ntype TableMemberFinancialProps = BoxProps & {\r\n items: MembershipSubscription[]\r\n}\r\n\r\nconst TableMemberFinancial = ({\r\n items,\r\n ...rest\r\n}: TableMemberFinancialProps) => {\r\n const classes = useStyles()\r\n const refTable = React.useRef(null)\r\n\r\n return (\r\n \r\n \r\n {items && items?.length > 0 ? (\r\n <>\r\n Total de dados encontrados: {items?.length} \r\n >\r\n ) : (\r\n Nenhum dado encontrado. \r\n )}\r\n \r\n {items && items?.length > 0 && (\r\n \r\n \r\n \r\n Lista de subscrições\r\n \r\n (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n content={() => refTable.current}\r\n />\r\n \r\n {/* usado para 'forçar' a orientação da pagina para 'paisagem' afim de imprimir mostrando todos os dados */}\r\n \r\n {/* ------------------------------------------------------------>\t */}\r\n \r\n {items !== undefined && items?.length > 0 && (\r\n \r\n \r\n \r\n \r\n Plano \r\n Valor (R$) \r\n Data Início \r\n Data Fim \r\n Status \r\n Ações \r\n \r\n \r\n \r\n {items?.map((membershipItem) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n
\r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default TableMemberFinancial\r\n","import React from 'react'\r\nimport {\r\n Grid,\r\n Select,\r\n MenuItem,\r\n FormControl,\r\n InputLabel,\r\n makeStyles\r\n} from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { history, useSearchQuery } from 'utils'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1\r\n },\r\n formControl: {\r\n width: '100%'\r\n },\r\n selectEmpty: {\r\n marginTop: theme.spacing(2)\r\n },\r\n divider: {\r\n height: 28,\r\n margin: 4\r\n }\r\n}))\r\n\r\nconst Filters = () => {\r\n const classes = useStyles()\r\n\r\n const querySearch = useSearchQuery()\r\n const selectValue = querySearch.get('Pago')\r\n\r\n const handleRemoveFilterSelectStatus = () => {\r\n querySearch.delete('Pago')\r\n }\r\n\r\n const handleChangeSelectStatus = (selectValue: string) => {\r\n if (!selectValue) {\r\n handleRemoveFilterSelectStatus()\r\n } else {\r\n querySearch.set('Pago', selectValue)\r\n }\r\n history.push({ search: querySearch.toString() })\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n Filtrar por status\r\n \r\n {\r\n handleChangeSelectStatus(event.target.value as string)\r\n }}\r\n label=\"Filtrar por status\"\r\n >\r\n \r\n {selectValue === '' ? (\r\n 'Filtrar por status'\r\n ) : (\r\n Limpar filtro \r\n )}\r\n \r\n \r\n Pago\r\n \r\n \r\n Pendente\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Filters\r\n","import React, { useEffect, useState } from 'react'\r\nimport {\r\n Typography,\r\n Grid,\r\n Button,\r\n ButtonGroup,\r\n Chip,\r\n makeStyles,\r\n useTheme,\r\n useMediaQuery\r\n} from '@material-ui/core'\r\nimport { DatePicker } from '@material-ui/pickers'\r\nimport {\r\n format,\r\n subDays,\r\n differenceInDays,\r\n isAfter,\r\n isBefore,\r\n endOfDay,\r\n startOfDay,\r\n startOfYesterday,\r\n endOfYesterday\r\n} from 'date-fns'\r\nimport CalendarTodayIcon from '@material-ui/icons/CalendarTodayOutlined'\r\nimport { useLocation, useParams } from 'react-router-dom'\r\n\r\n//? Own imports\r\nimport { history } from 'utils'\r\nimport { useDidMountEffect } from 'utils/useDidMountEffect'\r\nimport { Evento } from 'types/api'\r\nimport { useEvents } from 'hooks-querys'\r\nimport { useSelector } from 'react-redux'\r\n\r\ntype ChipType = {\r\n label: string\r\n value: string\r\n}\r\nconst chipOptions: ChipType[] = [\r\n { label: '7 dias', value: '7' },\r\n { label: '30 dias', value: '30' },\r\n { label: '90 dias', value: '90' },\r\n { label: '1 ano', value: '365' }\r\n]\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {},\r\n dates: {\r\n [theme.breakpoints.up('md')]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end'\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n '& > *': {\r\n margin: theme.spacing(0.5),\r\n marginBottom: theme.spacing(2)\r\n }\r\n }\r\n },\r\n calendarTodayIcon: {\r\n marginRight: theme.spacing(1)\r\n },\r\n chip: {\r\n marginRight: theme.spacing(1)\r\n },\r\n calendarTodayGroup: {\r\n [theme.breakpoints.up('md')]: {\r\n marginLeft: theme.spacing(1)\r\n },\r\n [theme.breakpoints.down('sm')]: {\r\n marginTop: theme.spacing(1)\r\n }\r\n }\r\n}))\r\n\r\nfunction useSearchQuery() {\r\n const { search } = useLocation()\r\n return React.useMemo(() => new URLSearchParams(search), [search])\r\n}\r\n\r\nconst Header = () => {\r\n const classes = useStyles()\r\n const querySearch = useSearchQuery()\r\n\r\n const { id: memberId } = useParams<{ tab: string; id: string }>()\r\n const [selectEdge, setSelectEdge] = useState(null)\r\n const [calendarDate, setCalendarDate] = useState(new Date())\r\n const [dateRange, setDateRange] = useState({\r\n startDate: startOfDay(subDays(new Date(), 30)),\r\n endDate: endOfDay(new Date()),\r\n value: '30'\r\n })\r\n const [filters, setFilters] = useState({\r\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\r\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '0',\r\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\r\n dataHoraFim: querySearch.get('DataHoraFim') || ''\r\n })\r\n\r\n const runQuery = (isInitialRender?: boolean) => {\r\n const url = `/members/memberPlanDetails/${memberId}/financeiro?StatusPedidoId=${\r\n filters.selectedStatusPedidoId\r\n }&FormaPagamentoId=${\r\n filters.selectedFormaPagamentoId ? filters.selectedFormaPagamentoId : 0\r\n }&DataHoraInicio=${format(\r\n dateRange.startDate,\r\n 'yyyy/MM/dd HH:mm:ss'\r\n )}&DataHoraFim=${format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss')}`\r\n if (isInitialRender) {\r\n history.replace(url)\r\n } else {\r\n history.push(url)\r\n }\r\n }\r\n const today = new Date()\r\n const yesterday = new Date(today)\r\n yesterday.setDate(yesterday.getDate() - 1)\r\n\r\n const handleCalendarOpen = (edge: string) => {\r\n setSelectEdge(edge as 'start' | 'end')\r\n }\r\n\r\n const handleCalendarChange = (date: Date) => {\r\n setCalendarDate(date)\r\n }\r\n\r\n const handleCalendarClose = () => {\r\n setCalendarDate(new Date())\r\n setSelectEdge(null)\r\n }\r\n\r\n const handleCalendarAccept = (date: Date) => {\r\n setCalendarDate(new Date())\r\n\r\n if (selectEdge === 'start') {\r\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\r\n\r\n if (isAfter(date, dateRange.endDate)) {\r\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\r\n }\r\n } else {\r\n setDateRange({ ...dateRange, endDate: endOfDay(date) })\r\n\r\n if (isBefore(date, dateRange.startDate)) {\r\n setDateRange({ ...dateRange, startDate: startOfDay(date) })\r\n }\r\n }\r\n\r\n setFilters((prev) => ({\r\n ...prev,\r\n dataHoraInicio: format(dateRange.startDate, 'yyyy/MM/dd HH:mm:ss'),\r\n dataHoraFim: format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss')\r\n }))\r\n setSelectEdge(null)\r\n }\r\n\r\n const handleRangeChangeChip = (item: ChipType) => {\r\n setDateRange({\r\n startDate: startOfDay(subDays(new Date(), Number(item.value))),\r\n endDate: endOfDay(new Date()),\r\n value: item.value\r\n })\r\n setFilters((prev) => ({\r\n ...prev,\r\n dataHoraInicio: format(dateRange.startDate, 'yyyy/MM/dd HH:mm:ss'),\r\n dataHoraFim: format(dateRange.endDate, 'yyyy/MM/dd HH:mm:ss')\r\n }))\r\n }\r\n\r\n const open = Boolean(selectEdge)\r\n\r\n useEffect(() => {\r\n runQuery(true)\r\n }, [])\r\n\r\n useDidMountEffect(() => {\r\n setFilters((prev) => ({\r\n ...prev,\r\n selectedStatusPedidoId: querySearch.get('StatusPedidoId') || '0',\r\n selectedFormaPagamentoId: querySearch.get('FormaPagamentoId') || '',\r\n textSearch: querySearch.get('Term') || '',\r\n dataHoraInicio: querySearch.get('DataHoraInicio') || '',\r\n dataHoraFim: querySearch.get('DataHoraFim') || ''\r\n }))\r\n }, [querySearch])\r\n\r\n useDidMountEffect(() => {\r\n runQuery()\r\n }, [dateRange.startDate, dateRange.endDate])\r\n\r\n return (\r\n \r\n \r\n \r\n {chipOptions &&\r\n chipOptions.length > 0 &&\r\n chipOptions.map((option) => (\r\n handleRangeChangeChip(option)}\r\n color={\r\n option.value != '0' &&\r\n differenceInDays(dateRange.endDate, dateRange.startDate) ===\r\n Number(option.value)\r\n ? 'primary'\r\n : 'default'\r\n }\r\n />\r\n ))}\r\n \r\n handleCalendarOpen('start')}>\r\n \r\n {dateRange && format(dateRange.startDate, 'dd/MM/yyyy')}\r\n \r\n handleCalendarOpen('end')}>\r\n \r\n {dateRange && format(dateRange.endDate, 'dd/MM/yyyy')}\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default Header\r\n","import React from 'react'\r\nimport {\r\n Box,\r\n Grid,\r\n makeStyles,\r\n useMediaQuery,\r\n useTheme\r\n} from '@material-ui/core'\r\nimport { useMemberSubscription } from 'hooks-querys'\r\n\r\n//? Own imports\r\nimport AccessDenied from 'views/Errors/AccessDenied'\r\nimport { Page, SkeletonTable } from 'components'\r\nimport { AccessControl } from 'components/Utils'\r\nimport { Filters, Header, TableMemberFinancial } from './components'\r\nimport { useSearchQuery } from 'utils'\r\nimport { useParams } from 'react-router-dom'\r\n\r\nconst useStyles = makeStyles(() => ({\r\n root: {}\r\n}))\r\nconst Financial = () => {\r\n const classes = useStyles()\r\n const theme = useTheme()\r\n const isMobile = useMediaQuery(theme.breakpoints.down('xs'))\r\n const { id: memberPlanId } = useParams<{ tab: string; id: string }>()\r\n const querySearch = useSearchQuery()\r\n\r\n const { data: memberSubscriptions, isLoading } = useMemberSubscription({\r\n membroPlanoId: Number(memberPlanId),\r\n pago: querySearch.get('Pago'),\r\n page: 1,\r\n limit: 9999\r\n })\r\n\r\n return (\r\n (\r\n \r\n \r\n \r\n \r\n \r\n {/* \r\n \r\n */}\r\n \r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )}\r\n // @ts-ignore\r\n no={() => }\r\n />\r\n )\r\n}\r\n\r\nexport default Financial\r\n","import React, { ChangeEvent } from 'react'\r\nimport { Redirect, useParams } from 'react-router-dom'\r\nimport {\r\n Tabs,\r\n Tab,\r\n Divider,\r\n colors,\r\n makeStyles,\r\n LinearProgress\r\n} from '@material-ui/core'\r\n\r\n//? Own imports\r\nimport { Page, Header } from 'components'\r\nimport { Info, Financial } from './components'\r\nimport { history, useSearchQuery } from 'utils'\r\nimport { AccessControl } from 'components/Utils'\r\nimport { useMemberPlanDetails, useMemberSubscription } from 'hooks-querys'\r\nimport AccessDenied from 'views/Errors/AccessDenied'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {},\r\n inner: {\r\n padding: theme.spacing(3, 2, 2, 2),\r\n [theme.breakpoints.down('sm')]: {\r\n padding: theme.spacing(3, 1, 1, 1)\r\n }\r\n },\r\n divider: {\r\n backgroundColor: colors.grey[300]\r\n },\r\n content: {\r\n marginTop: theme.spacing(3)\r\n },\r\n header: {\r\n marginBottom: theme.spacing(3)\r\n }\r\n}))\r\n\r\nconst MemberPlanDetails = () => {\r\n const classes = useStyles()\r\n const { tab, id: memberPlanId } = useParams<{ tab: string; id: string }>()\r\n const querySearch = useSearchQuery()\r\n\r\n const {\r\n isLoading: isLoadingMemberPlanDetails,\r\n isFetching: isFetchingMemberPlanDetails,\r\n refetch: refetchMemberPlanDetails\r\n } = useMemberPlanDetails(\r\n {\r\n memberPlanId: Number(memberPlanId)\r\n },\r\n {\r\n config: {\r\n enabled: !!(tab === 'informacoes')\r\n }\r\n }\r\n )\r\n\r\n const {\r\n isLoading: isLoadingMemberSubscriptions,\r\n isFetching: isFetchingMemberSubscriptions,\r\n refetch: refetchMemberSubscriptions\r\n } = useMemberSubscription(\r\n {\r\n membroPlanoId: Number(memberPlanId),\r\n pago: querySearch.get('Pago'),\r\n page: 1,\r\n limit: 9999\r\n },\r\n { config: { enabled: !!(tab === 'financeiro') } }\r\n )\r\n\r\n const isLoading =\r\n tab === 'informacoes'\r\n ? isLoadingMemberPlanDetails\r\n : tab === 'financeiro'\r\n ? isLoadingMemberSubscriptions\r\n : false\r\n\r\n const isFetching =\r\n tab === 'informacoes'\r\n ? isFetchingMemberPlanDetails\r\n : tab === 'financeiro'\r\n ? isFetchingMemberSubscriptions\r\n : false\r\n\r\n const refetch = () => {\r\n if (tab === 'informacoes') {\r\n refetchMemberPlanDetails()\r\n } else if (tab === 'financeiro') {\r\n refetchMemberSubscriptions()\r\n }\r\n }\r\n\r\n const handleTabsChange = (_event: ChangeEvent<{}>, value: string) => {\r\n history.push(value)\r\n }\r\n\r\n const tabs = [\r\n { value: 'informacoes', label: 'Informações' },\r\n { value: `financeiro`, label: 'Financeiro' }\r\n ]\r\n\r\n if (!tab) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n if (!tabs.find((t) => t.value === tab)) {\r\n return \r\n }\r\n\r\n return (\r\n // @ts-ignore\r\n (\r\n \r\n <>\r\n {isFetching && (\r\n \r\n )}\r\n \r\n >\r\n \r\n )}\r\n // @ts-ignore\r\n no={() => }\r\n />\r\n )\r\n}\r\n\r\nexport default MemberPlanDetails\r\n","import React from 'react'\nimport { Route, Switch, Redirect } from 'react-router-dom'\nimport { RouteWithLayout } from './components'\nimport { PrivateRouteWithLayout } from './components'\nimport { Main as MainLayout, Minimal as MinimalLayout } from './layouts'\n\nimport {\n Dashboard as DashboardView,\n Carteira as CarteiraView,\n Avaliacoes as AvaliacoesView,\n MovimentacoesFinanceiras as MovimentacoesFinanceirasView,\n OrderManagementList as OrderManagementListView,\n OrderManagementDetails as OrderManagementDetailsView,\n CancelamentosIngressos as CancelamentosIngressosView,\n OrderCancelDetails as OrderCancelDetailsView,\n EventoDashboard as EventoDashboardView,\n Settings as SettingsView,\n Error404 as Error404View,\n Login as LoginView,\n EmailVerification as EmailVerificationView,\n TipoIngresso as TipoIngressoView,\n TipoIngressoEdit as TipoIngressoEditView,\n EventoList as EventosView,\n EventoEdit as EventosEditView,\n EstabelecimentosList as EstabelecimentosListView,\n EstabelecimentoEdit as EstabelecimentoEditView,\n CustomerManagementDetails as CustomerManagementDetailsView,\n PasswordReset as PasswordResetView,\n CuponsDesconto as CupomDescontoView,\n // CupomDescontoEdit as CupomDescontoEditView,\n PhotoAlbum as PhotoAlbumView,\n Members as MembersView,\n Categoria as CategoriaView,\n CategoriaEdit as CategoriaEditView,\n Tickets as TicketsView,\n Hashtag as HashtagView,\n HashtagEdit as HashtagEditView,\n Conquista as ConquistaView,\n ConquistaEdit as ConquistaEditView,\n Taxa as TaxaView,\n TaxaEdit as TaxaEditView,\n Cadastro as CadastroView,\n Permissao as PermissaoView,\n // PermissaoTipoUsuario as PermissaoTipoUsuarioView,\n Parametro as ParametroView,\n ParametroEdit as ParametroEditView,\n Home as HomeView,\n Ajuda as AjudaView,\n DashboardAdmin as DashboardAdminView,\n CustomerManagementList as CustomerManagementListView,\n MemberPlanDetails as MemberPlanDetailsView\n} from './views'\n\nconst Routes = () => {\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 \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\nexport default Routes\n","import React, { useLayoutEffect } from 'react'\nimport { Router } from 'react-router-dom'\nimport { Chart } from 'react-chartjs-2'\nimport { ThemeProvider } from '@material-ui/styles'\nimport validate from 'validate.js'\nimport { ConfirmProvider } from 'material-ui-confirm'\nimport './App.css'\nimport { chartjs } from './utils'\nimport theme from './theme'\nimport './assets/scss/index.scss'\nimport validators from './common/validators'\nimport Routes from './Routes'\nimport Mensagens from './components/Utils'\nimport { authActions } from './_actions'\nimport { useDispatch } from 'react-redux'\nimport { history } from './utils'\nimport { QueryClient, QueryClientProvider } from 'react-query'\nimport { ReactQueryDevtools } from 'react-query/devtools'\n//importação para datas e time\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers'\nimport DateFnsUtils from '@date-io/date-fns'\nimport brLocale from 'date-fns/locale/pt-BR'\n\nChart.helpers.extend(Chart.elements.Rectangle.prototype, {\n draw: chartjs.draw\n})\n\nvalidate.validators = {\n ...validate.validators,\n ...validators\n}\n\nconst App = () => {\n const dispatch = useDispatch()\n const queryClient = new QueryClient()\n\n useLayoutEffect(() => {\n dispatch(authActions.refresh())\n }, [])\n\n return (\n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n )\n}\nexport default App\n","const initialState = {\n showValues: true,\n isVisibleButtonShowValues: false\n}\n\nexport function global(state = initialState, action) {\n switch (action.type) {\n case 'SET_SHOW_VALUES':\n return {\n ...state,\n showValues: !state.showValues\n }\n case 'SET_IS_VISIBLE_BUTTON_SHOW_VALUES':\n return {\n ...state,\n isVisibleButtonShowValues: action.isVisible\n }\n default:\n return state\n }\n}\n","let token = localStorage.getItem('token')\nlet expires = localStorage.getItem('expires')\nlet user = JSON.parse(localStorage.getItem('user'))\n\nconst initialState = user\n ? { refreshed: false, loggedIn: true, token, expires, user }\n : {}\n\nexport function authentication(state = initialState, action) {\n switch (action.type) {\n case 'LOGIN_REQUEST':\n return {\n ...state,\n loggingIn: true,\n user: action.user\n }\n case 'LOGIN_SUCCESS':\n return {\n ...state,\n loggedIn: true,\n loggingIn: false,\n user: action.user,\n token: action.token,\n expires: action.expires\n }\n case 'LOGIN_FAILURE':\n return {}\n case 'AUTHENTICATION_REFRESH_REQUEST':\n return {\n ...state,\n refreshed: false,\n token: action.token\n }\n case 'AUTHENTICATION_REFRESH_SUCCESS':\n return {\n ...state,\n loggedIn: true,\n refreshed: true,\n loggingIn: false,\n user: action.user\n }\n case 'AUTHENTICATION_REFRESH_FAILURE':\n return {\n ...state,\n refreshed: true,\n loggedIn: false,\n user: null,\n token: null,\n expires: null\n }\n case 'VERIFICATION_USER_SUCCESS':\n return {\n ...state,\n user: { ...state.user, emailVerificado: true }\n }\n case 'EDIT_USER_SUCCESS':\n return {\n ...state,\n user: {\n ...state.user,\n ...action.user\n }\n }\n case 'UPDATE_USER_DETAILS':\n return {\n ...state,\n user: action.user\n }\n default:\n return state\n }\n}\n","import { toLocalDateFormat } from 'utils'\n\nconst initialState = {\n evento: [],\n activeStep: 0,\n id: '',\n nome: '',\n estabelecimentoId: 0,\n eventoId: 0,\n detalhes: '',\n dataHoraInicio: null,\n dataHoraFim: null,\n imagem: '',\n cidadeId: 0,\n cidade: null,\n categoriaId: '',\n endereco: '',\n prioridadeExibicao: null,\n slug: '',\n cep: '',\n bairro: '',\n latLon: '',\n excluido: false,\n tipoLocalizacao: '',\n categoria: null,\n disponivel: true,\n estadoId: '',\n nomeLocal: '',\n complemento: '',\n numero: 0,\n estabelecimento: null,\n lote: [],\n cupomDesconto: [],\n isLoading: false,\n eventoHashtag: []\n}\n\nexport function evento(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_EVENTO':\n return {\n ...state,\n evento: action.evento\n }\n case 'FETCHED_ALL_LOTE_EVENTO':\n return {\n ...state,\n lote: action.lote\n }\n case 'DUPLICATE_EVENTO_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'NEXT_STEP_EVENTO_EDIT':\n return {\n ...state,\n activeStep: state.activeStep + 1\n }\n case 'PREV_STEP_EVENTO_EDIT':\n return {\n ...state,\n activeStep: state.activeStep - 1\n }\n case 'DUPLICATE_EVENTO_SUCCESS':\n return {\n ...state,\n id: 0,\n activeStep: 0,\n nome: action.event.evento.nome,\n slug: action.event.evento.slug,\n prioridadeExibicao: action.event.evento.prioridadeExibicao,\n estabelecimentoId: action.event.evento.estabelecimentoId,\n categoriaId: action.event.evento.categoriaId,\n detalhes: action.event.evento.detalhes,\n dataHoraInicio: toLocalDateFormat(action.event.evento.dataHoraInicio),\n dataHoraFim: toLocalDateFormat(action.event.evento.dataHoraFim),\n imagem: action.event.evento.imagem,\n cidadeId: action.event.evento.cidadeId,\n estadoId: action.event.estadoId,\n endereco: action.event.evento.endereco,\n latLon: action.event.evento.latLon,\n excluido: action.event.evento.excluido,\n categoria: action.event.evento.categoria,\n nomeLocal: action.event.evento.nomeLocal,\n complemento: action.event.evento.complemento,\n numero: action.event.evento.numero,\n tipoLocalizacao: action.event.evento.tipoLocalizacao,\n disponivel: action.event.evento.disponivel,\n cidade: action.event.evento.cidade,\n cep: action.event.evento.cep,\n bairro: action.event.evento.bairro,\n estabelecimento: action.event.evento.estabelecimento,\n lote: action.event.lote,\n cupomDesconto: action.event.cupomDesconto,\n eventoHashtag: action.event.eventoHashtag\n }\n case 'DUPLICATE_EVENTO_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'COPY_ESTABELECIMENTO_ADDRESS':\n return {\n ...state,\n nomeLocal: action.estabelecimento.nome,\n cidadeId: action.estabelecimento.cidadeId,\n estadoId: action.estabelecimento.cidade.estadoId,\n endereco: action.estabelecimento.endereco,\n cep: action.estabelecimento.cep,\n bairro: action.estabelecimento.bairro,\n complemento: action.estabelecimento.complemento,\n numero: action.estabelecimento.numero,\n latLon: action.estabelecimento.latLon,\n cidade: {\n ...state.cidade,\n ...action.estabelecimento.cidade\n }\n }\n case 'EVENTO_DETAIL':\n return {\n ...state,\n id: action.id,\n activeStep: 0,\n nome: action.nome,\n slug: action.slug,\n estabelecimentoId: action.estabelecimentoId,\n categoriaId: action.categoriaId,\n eventoId: action.eventoId,\n detalhes: action.detalhes,\n dataHoraInicio: toLocalDateFormat(action.dataHoraInicio),\n dataHoraFim: toLocalDateFormat(action.dataHoraFim),\n imagem: action.imagem,\n prioridadeExibicao: action.prioridadeExibicao,\n cidadeId: action.cidadeId,\n estadoId: action.estadoId,\n endereco: action.endereco,\n latLon: action.latLon,\n excluido: action.excluido,\n nomeLocal: action.nomeLocal,\n complemento: action.complemento,\n numero: action.numero,\n tipoLocalizacao: action.tipoLocalizacao,\n categoria: action.categoria,\n disponivel: action.disponivel,\n bairro: action.bairro,\n cidade: action.cidade,\n cep: action.cep,\n estabelecimento: action.estabelecimento,\n lote: action.lote,\n cupomDesconto: action.cupomDesconto,\n eventoHashtag: action.eventoHashtag\n }\n case 'EVENTO_CLEAR':\n return initialState\n case 'EVENTO_UPDATED':\n return state\n case 'ADD_LOTE':\n return {\n ...state,\n lote: [...state.lote, action.lote]\n }\n case 'EVENTO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'EVENTO_CREATED_SUCCESSFULLY':\n return {\n ...state,\n id: action.id\n }\n case 'CLEAR_ADDRESS':\n return {\n ...state,\n cidadeId: '',\n estadoId: '',\n endereco: '',\n cep: '',\n bairro: '',\n latLon: '',\n nomeLocal: '',\n complemento: '',\n numero: ''\n }\n case 'ADD_LOTE_LOCALE':\n return {\n ...state,\n lote: [...state.lote, action.lote]\n }\n case 'DELETE_LOTE_LOCALE':\n return {\n ...state,\n lote: state.lote.filter((item) => action.id !== item.id)\n }\n case 'EDIT_LOTE_LOCALE':\n return {\n ...state,\n lote: state.lote.map((lote) =>\n lote.id === action.id ? action.lote : lote\n )\n }\n case 'EVENTO_CHANGE_COORDINATES':\n return {\n ...state,\n latLon: action.latLon\n }\n case 'REQUEST_ALL_EVENTS_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'REQUEST_ALL_EVENTS_SUCCESS':\n return {\n ...state,\n isLoading: false,\n evento: action.events\n }\n case 'REQUEST_ALL_EVENTS_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'EVENTO_HANDLE_ON_CHANGE_HASHTAG':\n return {\n ...state,\n eventoHashtag: action.hashtags\n }\n case 'SET_STEP_EVENTO_EDIT':\n return {\n ...state,\n activeStep: action.step\n }\n default:\n return state\n }\n}\n","const initialState = {\n loading: false,\n usuario: [],\n open: false,\n id: '',\n email: '',\n nome: '',\n username: '',\n senha: '',\n telefone: '',\n emailVerificado: false,\n telefoneVerificado: false,\n emailVendas: false,\n openModalRequestPasswordReset: false\n}\n\nexport function usuario(state = initialState, action) {\n switch (action.type) {\n case 'CREATE_USER_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'CREATE_USER_SUCCESS':\n return {\n ...state,\n loading: false,\n id: action.user.id,\n email: action.user.email,\n nome: action.user.nome,\n username: action.user.username,\n senha: action.user.senha,\n telefone: action.user.telefone,\n telefoneVerificado: action.user.telefoneVerificado,\n emailVerificado: action.user.emailVerificado,\n emailVendas: action.user.emailVendas\n }\n case 'CREATE_USER_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'EDIT_USER_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'EDIT_USER_SUCCESS':\n return {\n ...state,\n loading: false,\n id: action.user.id,\n email: action.user.email,\n nome: action.user.nome,\n username: action.user.username,\n senha: action.user.senha,\n telefone: action.user.telefone,\n telefoneVerificado: action.user.telefoneVerificado,\n emailVerificado: action.user.emailVerificado,\n emailVendas: action.user.emailVendas\n }\n case 'EDIT_USER_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'REQUEST_RESET_PASSWORD_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'REQUEST_RESET_PASSWORD_SUCCESS':\n return {\n ...state,\n loading: false,\n openModalRequestPasswordReset: false\n }\n case 'REQUEST_RESET_PASSWORD_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'RESET_PASSWORD_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'RESET_PASSWORD_SUCCESS':\n return {\n ...state,\n loading: false\n }\n case 'RESET_PASSWORD_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'FETCHED_ALL_USUARIO':\n return {\n ...state,\n usuario: action.usuario\n }\n case 'USUARIO_DETAIL':\n return {\n ...state,\n id: action.id,\n email: action.email,\n nome: action.nome,\n username: action.username,\n senha: action.senha,\n telefone: action.telefone,\n telefoneVerificado: action.telefoneVerificado,\n emailVerificado: action.emailVerificado\n }\n case 'USUARIO_ESTABELECIMENTO_ADD_SUCCESS':\n return {\n ...state,\n usuario: [...state.usuario, action.data.usuario]\n }\n case 'USUARIO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'OPEN_MODAL_REQUEST_PASSWORD_RESET':\n return {\n ...state,\n openModalRequestPasswordReset: action.open\n }\n default:\n return state\n }\n}\n","const initialState = {\n tipoIngresso: [],\n isLoading: false,\n id: '',\n descricao: '',\n estabelecimentoId: 0,\n excluido: false\n}\n\nexport function tipoIngresso(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_TIPOINGRESSO':\n return {\n ...state,\n tipoIngresso: action.tipoIngresso\n }\n case 'FETCHED_ALL_TIPOINGRESSO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_ALL_TIPOINGRESSO_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'FETCHED_ALL_TIPOINGRESSO_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'TIPOINGRESSO_DETAIL':\n return {\n ...state,\n id: action.id,\n descricao: action.descricao,\n estabelecimentoId: action.estabelecimentoId,\n excluido: action.excluido,\n estabelecimento: action.estabelecimento,\n lote: action.lote\n }\n case 'TIPOINGRESSO_CREATED_SUCCESSFULLY':\n return {\n ...state,\n id: '',\n descricao: '',\n estabelecimentoId: 0,\n excluido: false,\n tipoIngresso: [...state.tipoIngresso, action.tipoIngresso]\n }\n case 'TIPOINGRESSO_UPDATED':\n return state\n case 'TIPOINGRESSO_CLEAR':\n return initialState\n case 'TIPOINGRESSO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n loading: false,\n isSearchingCep: false,\n estabelecimento: [],\n open: false,\n id: 0,\n nome: '',\n detalhes: '',\n cidadeId: '',\n estadoId: '',\n endereco: '',\n repassarTaxa: false,\n latLon: '',\n capacidade: '',\n cidade: null,\n imagem: null,\n banner: null,\n excluido: false,\n bairro: '',\n cep: '',\n numero: '',\n username: '',\n cpfCnpj: '',\n categoriaId: '',\n complemento: '',\n estabelecimentoHashtag: []\n}\n\nexport function estabelecimento(state = initialState, action) {\n switch (action.type) {\n case 'CREATE_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'CREATE_ESTABELECIMENTO_SUCCESS':\n return action.estabelecimento\n case 'CREATE_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'EDIT_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n loading: true\n }\n case 'EDIT_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n loading: false\n }\n case 'EDIT_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.error\n }\n case 'SET_UPLOAD_URL':\n return {\n ...state,\n imagem: action.value\n }\n case 'FETCHED_ALL_ESTABELECIMENTO':\n return {\n ...state,\n estabelecimento: action.estabelecimento\n }\n case 'ESTABELECIMENTO_DETAIL':\n return action.estabelecimento\n case 'SEARCH_ENDERECO_BY_CEP_REQUEST':\n return {\n ...state,\n isSearchingCep: true\n }\n case 'SEARCH_ENDERECO_BY_CEP_SUCCESS':\n return {\n ...state,\n isSearchingCep: false,\n endereco: action.endereco,\n complemento: action.complemento,\n bairro: action.bairro,\n ibge: action.ibge\n }\n case 'SEARCH_ENDERECO_BY_CEP_FAILURE':\n return {\n ...state,\n isSearchingCep: false,\n error: action.error\n }\n case 'ESTABELECIMENTO_ESTADO_DETAIL':\n return {\n ...state,\n estadoId: action.estadoId\n }\n case 'SEARCH_CIDADE_BY_IBGE_REQUEST':\n return {\n ...state,\n isSearchingCep: true\n }\n case 'SEARCH_CIDADE_BY_IBGE_SUCCESS':\n return {\n ...state,\n isSearchingCep: false,\n estadoId: action.estadoId,\n cidadeId: action.cidadeId,\n paisId: action.paisId\n }\n case 'SEARCH_CIDADE_BY_IBGE_FAILURE':\n return {\n ...state,\n isSearchingCep: false,\n error: action.error\n }\n case 'ESTABELECIMENTO_CHANGE_COORDINATES':\n return {\n ...state,\n latLon: action.latLon\n }\n case 'ESTABELECIMENTO_UPDATED':\n return state\n case 'ESTABELECIMENTO_CLEAR':\n return initialState\n case 'ESTABELECIMENTO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'ESTABELECIMENTO_HASHTAG_CHANGE':\n return {\n ...state,\n estabelecimentoHashtag: action.hashtags\n }\n default:\n return state\n }\n}\n","import { toLocalDateFormat } from 'utils'\nconst initialState = {\n anchor: 'left',\n cupomDesconto: [],\n open: false,\n id: '',\n codigo: '',\n percentualDesconto: '',\n valorDesconto: '',\n dataInicioValidade: null,\n dataTerminoValidade: null,\n quantidadeMinima: 1,\n quantidade: null,\n estabelecimentoId: '',\n promoterId: '',\n eventoId: '',\n loteId: '',\n excluido: false,\n validOnAllEventos: false,\n isLoading: false,\n utilizacaoCuponsDesconto: []\n}\n\nexport function cupomDesconto(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_CUPOMDESCONTO':\n return {\n ...state,\n cupomDesconto: action.cupomDesconto\n }\n case 'FETCHED_ALL_CUPOMDESCONTO_BY_EVENTO':\n return {\n ...state,\n cupomDesconto: action.cupomDesconto\n }\n case 'CUPOMDESCONTO_CLEAR':\n return initialState\n case 'CUPOMDESCONTO_DETAIL':\n return {\n ...state,\n id: action.id,\n codigo: action.codigo.toUpperCase(),\n percentualDesconto: action.percentualDesconto,\n valorDesconto: action.valorDesconto,\n dataInicioValidade: toLocalDateFormat(action.dataInicioValidade),\n dataTerminoValidade: toLocalDateFormat(action.dataTerminoValidade),\n estabelecimentoId: action.estabelecimentoId,\n quantidadeMinima: action.quantidadeMinima,\n quantidade: action.quantidade,\n promoterId: action.promoterId,\n eventoId: action.eventoId,\n loteId: action.loteId,\n excluido: action.excluido,\n validOnAllEventos:\n action.eventoId !== null && action.eventoId !== '' ? false : true\n }\n case 'CUPOMDESCONTO_UPDATED':\n return state\n case 'CUPOMDESCONTO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'REQUEST_UTILIZACAO_CUPOM_DESCONTO':\n return {\n ...state,\n isLoading: true\n }\n case 'REQUEST_UTILIZACAO_CUPOM_DESCONTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n utilizacaoCuponsDesconto: action.utilizacaoCuponsDesconto\n }\n case 'REQUEST_UTILIZACAO_CUPOM_DESCONTO_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'REQUEST_LISTA_CUPOM_DESCONTO':\n return {\n ...state,\n isLoading: true\n }\n case 'REQUEST_LISTA_CUPOM_DESCONTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n cupomDesconto: action.cupomDesconto\n }\n case 'REQUEST_LISTA_CUPOM_DESCONTO_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n default:\n return state\n }\n}\n","import { toLocalDateFormat } from 'utils'\r\nconst initialState = {\r\n anchor: 'left',\r\n lote: [],\r\n open: false,\r\n id: 0,\r\n descricao: '',\r\n tipoIngressoId: '',\r\n eventoId: 0,\r\n valor: '',\r\n quantidade: '',\r\n limiteQuantidadePedido: '',\r\n genero: '',\r\n repassarTaxa: false,\r\n dataHoraTermino: null,\r\n dataHoraInicio: null,\r\n disponivel: true,\r\n excluido: false,\r\n openModalTipoDeIngresso: false,\r\n checkIn: false,\r\n planoId: null\r\n}\r\n\r\nexport function lote(state = initialState, action) {\r\n switch (action.type) {\r\n case 'FETCHED_ALL_LOTE':\r\n return {\r\n ...state,\r\n lote: action.lote\r\n }\r\n case 'LOTE_DETAIL':\r\n return {\r\n ...state,\r\n id: action.id,\r\n descricao: action.descricao,\r\n tipoIngressoId: action.tipoIngressoId,\r\n eventoId: action.eventoId,\r\n valor: action.valor,\r\n quantidade: action.quantidade,\r\n limiteQuantidadePedido: action.limiteQuantidadePedido,\r\n genero: action.genero,\r\n repassarTaxa: action.repassarTaxa,\r\n dataHoraTermino: toLocalDateFormat(action.dataHoraTermino),\r\n dataHoraInicio: toLocalDateFormat(action.dataHoraInicio),\r\n disponivel: action.disponivel,\r\n checkIn: action.checkIn,\r\n excluido: action.excluido,\r\n planoId: action.planoId\r\n }\r\n case 'LOTE_UPDATED':\r\n return state\r\n case 'OPEN_MODAL_TIPO_DE_INGRESSO':\r\n return {\r\n ...state,\r\n openModalTipoDeIngresso: action.open\r\n }\r\n case 'LOTES_BY_EVENTO':\r\n return {\r\n ...state,\r\n lote: action.lotes\r\n }\r\n case 'LOTE_CLEAR':\r\n return { ...initialState, repassarTaxa: action.repassarTaxa }\r\n case 'LOTE_CLEAR_ALL':\r\n return {\r\n ...state,\r\n lote: []\r\n }\r\n case 'LOTE_HANDLE_ON_CHANGE':\r\n return {\r\n ...state,\r\n [action.props]: action.value\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","const initialState = {\n ingresso: [],\n ingressoALiberar: [],\n id: '',\n clienteId: '',\n loteId: '',\n dataHoraCompra: '',\n formaPagamentoId: '',\n status: '',\n dataHoraCancelamento: '',\n valor: '',\n validado: '',\n dataHoraValidacao: '',\n qrcode: '',\n cupomDescontoId: '',\n transacao: '',\n excluido: false,\n isLoading: false\n}\n\nexport function ingresso(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_INGRESSO':\n return {\n ...state,\n ingresso: action.ingresso\n }\n case 'FETCHED_INGRESSOS_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_INGRESSOS_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n ingresso: action.ingressosList\n }\n case 'FETCHED_INGRESSOS_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'GET_INGRESSOS_LIBERADOS_BY_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'GET_INGRESSOS_LIBERADOS_BY_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n ingresso: action.ingressos\n }\n case 'GET_INGRESSOS_LIBERADOS_BY_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'GET_INGRESSOS_NAO_LIBERADOS_BY_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'GET_INGRESSOS_NAO_LIBERADOS_BY_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n ingressoALiberar: action.ingressos\n }\n case 'GET_INGRESSOS_NAO_LIBERADOS_BY_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'SEARCH_INGRESSOS_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'SEARCH_INGRESSOS_SUCCESS':\n return {\n ...state,\n isLoading: false,\n ingresso: action.ingressosList\n }\n case 'INGRESSO_CLEAR_ALL':\n return initialState\n case 'SEARCH_INGRESSOS_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'INGRESSO_DETAIL':\n return {\n ...state,\n id: action.id,\n clienteId: action.clienteId,\n loteId: action.loteId,\n dataHoraCompra: action.dataHoraCompra,\n formaPagamentoId: action.formaPagamentoId,\n status: action.status,\n dataHoraCancelamento: action.dataHoraCancelamento,\n valor: action.valor,\n validado: action.validado,\n dataHoraValidacao: action.dataHoraValidacao,\n qrcode: action.qrcode,\n cupomDescontoId: action.cupomDescontoId,\n transacao: action.transacao,\n excluido: action.excluido\n }\n case 'INGRESSO_UPDATED':\n return state\n case 'INGRESSO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n categoria: [],\n open: false,\n id: 0,\n descricao: ''\n}\n\nexport function categoria(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_CATEGORIA':\n return {\n ...state,\n categoria: action.categoria\n }\n case 'CATEGORIA_DETAIL':\n return {\n ...state,\n id: action.id,\n descricao: action.descricao\n }\n case 'CATEGORIA_UPDATED':\n return state\n case 'CATEGORIA_CLEAR':\n return initialState\n case 'CATEGORIA_CLEAR_ALL':\n return {\n ...state,\n categoria: []\n }\n case 'CATEGORIA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n hashtag: [],\n open: false,\n id: 0,\n descricao: '',\n imagem: null,\n banner: null,\n categoriaId: ''\n}\n\nexport function hashtag(state = initialState, action) {\n switch (action.type) {\n case 'HASHTAG_FETCHED_ALL':\n return {\n ...state,\n hashtag: action.hashtag\n }\n case 'HASHTAG_DETAIL':\n return {\n ...state,\n id: action.id,\n descricao: action.descricao,\n imagem: action.imagem,\n banner: action.banner,\n categoriaId: action.categoriaId\n }\n case 'HASHTAG_UPDATED':\n return state\n case 'HASHTAG_CLEAR':\n return initialState\n case 'HASHTAG_CLEAR_ALL':\n return {\n ...state,\n hashtag: []\n }\n case 'HASHTAG_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n conquista: [],\n open: false,\n id: 0,\n nome: '',\n descricao: '',\n experiencia: null,\n imagem: null\n}\n\nexport function conquista(state = initialState, action) {\n switch (action.type) {\n case 'CONQUISTA_FETCHED_ALL':\n return {\n ...state,\n conquista: action.conquista\n }\n case 'CONQUISTA_DETAIL':\n return {\n ...state,\n id: action.id,\n nome: action.nome,\n descricao: action.descricao,\n experiencia: action.experiencia,\n imagem: action.imagem\n }\n case 'CONQUISTA_UPDATED':\n return state\n case 'CONQUISTA_CLEAR':\n return initialState\n case 'CONQUISTA_CLEAR_ALL':\n return {\n ...state,\n conquista: []\n }\n case 'CONQUISTA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'DUPLICATE_CONQUISTA_REQUEST':\n return {\n state\n }\n case 'DUPLICATE_CONQUISTA_SUCCESS':\n return {\n ...state,\n id: 0,\n nome: action.conquista.nome,\n descricao: action.conquista.descricao,\n experiencia: action.conquista.experiencia,\n imagem: action.conquista.imagem\n }\n case 'DUPLICATE_CONQUISTA_FAILURE':\n return {\n ...state,\n error: action.error\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n taxa: [],\n open: false,\n id: 0,\n percentual: '',\n valor: '',\n estabelecimentoId: '',\n eventoId: '',\n loteId: ''\n}\n\nexport function taxa(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_TAXA':\n return {\n ...state,\n taxa: action.taxa\n }\n case 'TAXA_DETAIL':\n return {\n ...state,\n id: action.id,\n percentual: action.percentual,\n valor: action.valor,\n estabelecimentoId: action.estabelecimentoId,\n eventoId: action.eventoId,\n loteId: action.loteId\n }\n case 'TAXA_UPDATED':\n return state\n case 'TAXA_CLEAR':\n return initialState\n case 'TAXA_CLEAR_ALL':\n return {\n ...state,\n taxa: []\n }\n case 'TAXA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n usuarioEstabelecimento: [],\n id: '',\n isLoading: false,\n usuarioId: '',\n estabelecimentoId: '',\n excluido: null,\n estabelecimento: {},\n categoriaId: 0,\n isAddPlace: false,\n backupId: '',\n listUserPlace: []\n}\n\nexport function usuarioEstabelecimento(state = initialState, action) {\n switch (action.type) {\n case 'CREATE_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n estabelecimentoId: '',\n usuarioEstabelecimento: [\n ...state.usuarioEstabelecimento,\n action.usuarioEstabelecimento\n ],\n isAddPlace: false,\n backupId: ''\n }\n case 'FETCHED_ALL_USUARIOESTABELECIMENTO':\n return {\n ...state,\n usuarioEstabelecimento: action.usuarioEstabelecimento\n }\n case 'FETCHED_ALL_USERPLACE':\n return {\n ...state,\n listUserPlace: action.listUserPlace\n }\n case 'USUARIOESTABELECIMENTO_DETAIL':\n return {\n ...state,\n id: action.id,\n usuarioId: action.usuarioId,\n estabelecimentoId: action.estabelecimentoId,\n excluido: action.excluido,\n estabelecimento: action.estabelecimento,\n categoriaId: action.categoriaId\n }\n case 'USUARIOESTABELECIMENTO_UPDATED':\n return state\n case 'USUARIO_ESTABELECIMENTO_ADD_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'USUARIO_ESTABELECIMENTO_ADD_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'USUARIO_ESTABELECIMENTO_ADD_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'USUARIO_ESTABELECIMENTO_DELETE_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'USUARIO_ESTABELECIMENTO_DELETE_SUCCESS':\n return {\n ...state,\n usuarioEstabelecimento:\n action.usuarioEstabelecimentoId == state.id\n ? []\n : [...state.usuarioEstabelecimento],\n listUserPlace: [\n ...state.listUserPlace.filter(\n (item) => item.id != action.usuarioEstabelecimentoId\n )\n ],\n isLoading: false\n }\n case 'USUARIO_ESTABELECIMENTO_DELETE_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'USUARIOESTABELECIMENTO_CLEAR':\n return initialState\n case 'USUARIOESTABELECIMENTO_CLEAR_ALL':\n return {\n ...state,\n usuarioEstabelecimento: []\n }\n case 'CHANGE_DETAILS_USUARIOESTABELECIMENTO':\n return {\n ...state,\n id: action.id,\n usuarioId: action.usuarioId,\n estabelecimentoId: action.estabelecimentoId,\n excluido: action.excluido,\n estabelecimento: action.estabelecimento\n }\n case 'AUTHENTICATION_REFRESH_SUCCESS':\n return {\n ...state,\n usuarioEstabelecimento: action.user.usuarioEstabelecimento\n }\n case 'LOGIN_SUCCESS':\n return {\n ...state,\n usuarioEstabelecimento: action.user.usuarioEstabelecimento\n }\n case 'SET_IS_ADD_PLACE':\n return {\n ...state,\n isAddPlace: action.isAddPlace,\n backupId: action.backupId\n }\n default:\n return state\n }\n}\n","const initialState = {\n contaBancaria: [],\n id: '',\n estabelecimentoId: 0,\n instituicaoBancaria: {},\n instituicaoBancariaId: 0,\n descricao: '',\n agencia: '',\n conta: '',\n cpfCnpjTitular: '',\n nomeTitular: '',\n chavePix: '',\n tipoChavePix: '',\n padrao: false,\n isFetching: false\n}\n\nexport function contaBancaria(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_CONTABANCARIA_BY_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isFetching: true\n }\n case 'FETCHED_CONTABANCARIA_BY_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n isFetching: false,\n contaBancaria: action.contaBancaria\n }\n case 'FETCHED_CONTABANCARIA_BY_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isFetching: false,\n error: action.error\n }\n case 'GET_CONTABANCARIA_BY_ID_REQUEST':\n return {\n ...state,\n isFetching: true\n }\n case 'GET_CONTABANCARIA_BY_ID_SUCCESS':\n return {\n ...state,\n isFetching: false\n }\n case 'GET_CONTABANCARIA_BY_ID_FAILURE':\n return {\n ...state,\n isFetching: false,\n error: action.error\n }\n case 'FETCHED_ALL_CONTABANCARIA':\n return {\n ...state,\n contaBancaria: action.contaBancaria\n }\n case 'CONTABANCARIA_DETAIL':\n return {\n ...state,\n id: action.id,\n estabelecimentoId: action.estabelecimentoId,\n instituicaoBancariaId: action.instituicaoBancariaId,\n instituicaoBancaria: action.instituicaoBancaria,\n descricao: action.descricao,\n agencia: action.agencia,\n conta: action.conta,\n cpfCnpjTitular: action.cpfCnpjTitular,\n nomeTitular: action.nomeTitular,\n chavePix: action.chavePix,\n tipoChavePix: action.tipoChavePix,\n padrao: action.padrao\n }\n case 'CONTABANCARIAO_UPDATED':\n return state\n case 'CONTABANCARIA_CLEAR':\n return initialState\n case 'CONTABANCARIA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n cidade: [],\n open: false,\n id: 0,\n nome: '',\n estadoId: '',\n ibge: '',\n latLon: '',\n estado: null\n}\n\nexport function cidade(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_CIDADE':\n return {\n ...state,\n cidade: action.cidade\n }\n case 'CIDADE_DETAIL':\n return {\n ...state,\n id: action.id,\n nome: action.nome,\n estadoId: action.estadoId,\n ibge: action.ibge,\n latLon: action.latLon,\n estado: action.estado\n }\n case 'CIDADE_UPDATED':\n return state\n case 'CIDADE_CLEAR':\n return initialState\n case 'CIDADE_CLEAR_ALL':\n return {\n ...state,\n cidade: []\n }\n case 'CIDADE_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n estado: [],\n open: false,\n id: '',\n nome: '',\n uf: '',\n ibge: '',\n paisId: '',\n ddd: '',\n pais: []\n}\n\nexport function estado(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_ESTADO':\n return {\n ...state,\n estado: action.estado\n }\n case 'ESTADO_DETAIL':\n return {\n ...state,\n id: action.id,\n nome: action.nome,\n uf: action.uf,\n ibge: action.ibge,\n paisId: action.paisId,\n ddd: action.ddd,\n pais: action.pais\n }\n case 'ESTADO_UPDATED':\n return state\n case 'HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n promoter: [],\n open: false,\n id: 0,\n usuarioId: '',\n excluido: false\n}\n\nexport function promoter(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_PROMOTER':\n return {\n ...state,\n promoter: action.promoter\n }\n case 'PROMOTER_DETAIL':\n return {\n ...state,\n id: action.id,\n usuarioId: action.usuarioId,\n excluido: action.excluido\n }\n case 'PROMOTER_UPDATED':\n return state\n case 'PROMOTER_CLEAR':\n return initialState\n case 'PROMOTER_CLEAR_ALL':\n return {\n ...state,\n promoter: []\n }\n case 'PROMOTER_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n dashboardHome: {\n quantidadePedidosPendentes: 0,\n quantidadePagamentos7Dias: 0,\n valorPagamentos7Dias: 0,\n eventosAtivos: 0\n },\n dashboardEstabelecimento: {\n quantidadeIngressosNaoTransferidos: 0,\n valorIngressosNaoTransferidos: 0,\n quantidadeIngressosTransferidos: 0,\n valorIngressosTransferidos: 0,\n eventosFuturos: 0,\n eventosPassados: 0,\n graficoIngressosEventos: { options: [], series: [] },\n graficoIngressosMes: {}\n },\n dashboardEvento: {\n quantidadePedidosPendentes: 0,\n valorPedidosPendentes: 0,\n quantidadeIngressos: 0,\n valorIngressos: 0,\n quantidadeIngressosDisponiveis: 0,\n quantidadeIngressosTotal: 0,\n cuponsAtivos: 0,\n graficoIngressosDia: { options: [], series: [] },\n graficoIngressosTipoIngresso: {},\n pedidos: []\n },\n dashboardAdmin: {\n receitaBruta: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n lucroLiquido: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n valorATranferir: 0,\n tarifaMedia: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n eventosRealizados: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n interacoesUsuarios: {\n totalInteracoes: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n totalComentarios: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n totalConexoes: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n totalAvaliacoes: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n novosUsuarios: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n usuariosAtivos: {\n valorAtual: 0,\n valorAnterior: 0,\n percentualComparativo: 0\n },\n atividades: []\n },\n graficoVendasPorFormaPagamento: { options: [], series: [] },\n graficoVendasPorPlataforma: { options: [], series: [] },\n graficoInteracoesPorTipo: { options: [], series: [] }\n },\n isLoading: false\n}\n\nexport function dashboard(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_DASHBOARD_ADMIN_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_DASHBOARD_ADMIN_SUCCESS':\n return {\n ...state,\n dashboardAdmin: action.dashboardAdmin,\n isLoading: false\n }\n case 'FETCHED_DASHBOARD_ADMIN_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'FETCHED_DASHBOARD_HOME_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_DASHBOARD_HOME_SUCCESS':\n return {\n ...state,\n isLoading: false,\n dashboardHome: action.dashboardHome\n }\n case 'FETCHED_DASHBOARD_HOME_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'FETCHED_DASHBOARD_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_DASHBOARD_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n dashboardEstabelecimento: action.dashboardEstabelecimento\n }\n case 'FETCHED_DASHBOARD_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'FETCHED_DASHBOARD_EVENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_DASHBOARD_EVENTO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n dashboardEvento: action.dashboardEvento\n }\n case 'FETCHED_DASHBOARD_EVENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n instituicaoBancaria: [],\n open: false,\n id: 0,\n codigo: '',\n nome: ''\n}\n\nexport function instituicaoBancaria(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_INSTITUICAOBANCARIA':\n return {\n ...state,\n instituicaoBancaria: action.instituicaoBancaria\n }\n case 'INSTITUICAOBANCARIA_DETAIL':\n return {\n ...state,\n id: action.id,\n codigo: action.codigo.toUpperCase(),\n nome: action.nome\n }\n case 'INSTITUICAOBANCARIA_UPDATED':\n return state\n case 'INSTITUICAOBANCARIA_CLEAR':\n return initialState\n case 'INSTITUICAOBANCARIA_CLEAR_ALL':\n return {\n ...state,\n instituicaoBancaria: []\n }\n case 'INSTITUICAOBANCARIA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n permissao: [],\n open: false,\n id: 0,\n nome: '',\n descricao: '',\n excluido: false\n}\n\nexport function permissao(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_PERMISSAO':\n return {\n ...state,\n permissao: action.permissao\n }\n case 'PERMISSAO_DETAIL':\n return {\n ...state,\n id: action.id,\n nome: action.nome,\n descricao: action.descricao,\n excluido: action.excluido\n }\n case 'PERMISSAO_UPDATED':\n return state\n case 'PERMISSAO_CLEAR':\n return initialState\n case 'PERMISSAO_CLEAR_ALL':\n return {\n ...state,\n permissao: []\n }\n case 'PERMISSAO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n permissaoTipoUsuario: [],\n open: false,\n id: 0,\n permissaoId: 0,\n tipoUsuarioId: 0,\n permitido: false,\n checkedAll: false,\n isLoading: false\n}\n\nexport function permissaoTipoUsuario(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_PERMISSAO_TIPO_USUARIO':\n return {\n ...state,\n permissaoTipoUsuario: action.permissaoTipoUsuario,\n tipoUsuarioId: action.tipoUsuarioId\n }\n case 'PERMISSAO_TIPO_USUARIO_DETAIL':\n return {\n ...state,\n id: action.id,\n permissaoId: action.permissaoId,\n tipoUsuarioId: action.tipoUsuarioId,\n permitido: action.permitido\n }\n case 'PERMISSAO_TIPO_USUARIO_CLEAR':\n return initialState\n case 'PERMISSAO_TIPO_USUARIO_CLEAR_ALL':\n return {\n ...state,\n permissaoTipoUsuario: []\n }\n case 'PERMISSAO_TIPO_USUARIO_CREATE_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'PERMISSAO_TIPO_USUARIO_CREATE_SUCCESS':\n return {\n ...state,\n isLoading: false,\n tipoUsuarioId: 0,\n checkedAll: false,\n permissaoTipoUsuario: []\n }\n case 'PERMISSAO_TIPO_USUARIO_CREATE_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'PERMISSAO_TIPO_USUARIO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'HANDLE_CHANGE_CHECK_ALL_PERMISSAO_TIPO_USUARIO':\n return {\n ...state,\n checkedAll: !state.checkedAll\n }\n case 'HANDLE_CHECKED_PERMITIDO_PERMISSAO_TIPO_USUARIO':\n return {\n ...state,\n permissaoTipoUsuario: state.permissaoTipoUsuario.map(\n (permissaoTipoUsuario) =>\n permissaoTipoUsuario.id === action.id\n ? {\n ...permissaoTipoUsuario,\n permitido: !permissaoTipoUsuario.permitido\n }\n : permissaoTipoUsuario\n )\n }\n case 'HANDLE_CHECK_ALL_PERMISSAO_TIPO_USUARIO':\n return {\n ...state,\n permissaoTipoUsuario: state.permissaoTipoUsuario.map(\n (permissaoTipoUsuario) => ({\n ...permissaoTipoUsuario,\n permitido: action.checked\n })\n )\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n permissaoUsuario: [],\n open: false,\n id: 0,\n permissaoId: 0,\n usuarioId: 0,\n permitido: false,\n checkedAll: false,\n isLoading: false\n}\n\nexport function permissaoUsuario(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_PERMISSAO_USUARIO':\n return {\n ...state,\n permissaoUsuario: action.permissaoUsuario,\n usuarioId: action.usuarioId\n }\n case 'PERMISSAO_USUARIO_DETAIL':\n return {\n ...state,\n id: action.id,\n permissaoId: action.permissaoId,\n usuarioId: action.usuarioId,\n permitido: action.permitido\n }\n case 'PERMISSAO_USUARIO_CLEAR':\n return initialState\n case 'PERMISSAO_USUARIO_CLEAR_ALL':\n return {\n ...state,\n permissaoUsuario: []\n }\n case 'PERMISSAO_USUARIO_CREATE_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'PERMISSAO_USUARIO_CREATE_SUCCESS':\n return {\n ...state,\n isLoading: false,\n usuarioId: 0,\n checkedAll: false,\n permissaoUsuario: []\n }\n case 'PERMISSAO_USUARIO_CREATE_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'PERMISSAO_USUARIO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n case 'HANDLE_CHANGE_CHECK_ALL_PERMISSAO_USUARIO':\n return {\n ...state,\n checkedAll: !state.checkedAll\n }\n case 'HANDLE_CHECKED_PERMITIDO_PERMISSAO_USUARIO':\n return {\n ...state,\n permissaoUsuario: state.permissaoUsuario.map((permissaoUsuario) =>\n permissaoUsuario.id === action.id\n ? {\n ...permissaoUsuario,\n permitido: !permissaoUsuario.permitido\n }\n : permissaoUsuario\n )\n }\n case 'HANDLE_CHECK_ALL_PERMISSAO_USUARIO':\n return {\n ...state,\n permissaoUsuario: state.permissaoUsuario.map((permissaoUsuario) => ({\n ...permissaoUsuario,\n permitido: action.checked\n }))\n }\n default:\n return state\n }\n}\n","const initialState = {\n anchor: 'left',\n tipoUsuario: [],\n open: false,\n id: 0,\n descricao: '',\n excluido: false\n}\n\nexport function tipoUsuario(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_TIPOUSUARIO':\n return {\n ...state,\n tipoUsuario: action.tipoUsuario\n }\n case 'TIPOUSUARIO_DETAIL':\n return {\n ...state,\n id: action.id,\n descricao: action.descricao,\n excluido: action.excluido\n }\n case 'TIPOUSUARIO_UPDATED':\n return state\n case 'TIPOUSUARIO_CLEAR':\n return initialState\n case 'TIPOUSUARIO_CLEAR_ALL':\n return {\n ...state,\n tipoUsuario: []\n }\n case 'TIPOUSUARIO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n parametro: [],\n isLoading: false,\n id: '',\n chave: '',\n valor: '',\n descricao: ''\n}\n\nexport function parametro(state = initialState, action) {\n switch (action.type) {\n case 'FETCHED_ALL_PARAMETRO':\n return {\n ...state,\n parametro: action.parametro\n }\n case 'FETCHED_ALL_PARAMETRO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'FETCHED_ALL_PARAMETRO_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'FETCHED_ALL_PARAMETRO_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'PARAMETRO_DETAIL':\n return {\n ...state,\n id: action.id,\n chave: action.chave,\n valor: action.valor,\n descricao: action.descricao\n }\n case 'PARAMETRO_CREATED_SUCCESSFULLY':\n return {\n ...state,\n id: '',\n chave: '',\n valor: '',\n descricao: '',\n parametro: [...state.parametro, action.parametro]\n }\n case 'PARAMETRO_UPDATED':\n return state\n case 'PARAMETRO_CLEAR':\n return initialState\n case 'PARAMETRO_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n id: 0,\n movimentacaoFinanceira: [],\n statusMovimentacaoFinanceiraId: 0,\n estabelecimentoId: 0,\n tipo: '',\n dataHora: '',\n dataHoraProcessamento: '',\n valor: '',\n contaBancariaId: 0,\n anexo: '',\n motivoCancelamento: '',\n estabelecimento: {},\n contaBancaria: {},\n statusMovimentacaoFinanceira: {},\n movimentacaoFinanceiraIngresso: [],\n isLoading: false\n}\n\nexport function movimentacaoFinanceira(state = initialState, action) {\n switch (action.type) {\n case 'MOVIMENTACAO_FINANCEIRA_CLEAR_ALL':\n return initialState\n case 'MOVIMENTACAO_FINANCEIRA_CREATE_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'MOVIMENTACAO_FINANCEIRA_CREATE_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'MOVIMENTACAO_FINANCEIRA_CREATE_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'MOVIMENTACAO_FINANCEIRA_FINISH_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'MOVIMENTACAO_FINANCEIRA_FINISH_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'MOVIMENTACAO_FINANCEIRA_FINISH_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'MOVIMENTACAO_FINANCEIRA_CANCEL_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'MOVIMENTACAO_FINANCEIRA_CANCEL_SUCCESS':\n return {\n ...state,\n isLoading: false\n }\n case 'MOVIMENTACAO_FINANCEIRA_CANCEL_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ESTABELECIMENTO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ESTABELECIMENTO_SUCCESS':\n return {\n ...state,\n movimentacaoFinanceira: action.movimentacaoFinanceira,\n isLoading: false\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ESTABELECIMENTO_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ID_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ID_SUCCESS':\n return {\n ...state,\n id: action.movimentacaoFinanceira.id,\n statusMovimentacaoFinanceiraId:\n action.movimentacaoFinanceira.statusMovimentacaoFinanceiraId,\n estabelecimentoId: action.movimentacaoFinanceira.estabelecimentoId,\n tipo: action.movimentacaoFinanceira.tipo,\n dataHora: action.movimentacaoFinanceira.dataHora,\n dataHoraProcessamento:\n action.movimentacaoFinanceira.dataHoraProcessamento,\n valor: action.movimentacaoFinanceira.valor,\n contaBancariaId: action.movimentacaoFinanceira.contaBancariaId,\n anexo: action.movimentacaoFinanceira.anexo,\n motivoCancelamento: action.movimentacaoFinanceira.motivoCancelamento,\n estabelecimento: action.movimentacaoFinanceira.estabelecimento,\n contaBancaria: action.movimentacaoFinanceira.contaBancaria,\n statusMovimentacaoFinanceira:\n action.movimentacaoFinanceira.statusMovimentacaoFinanceira,\n movimentacaoFinanceiraIngresso:\n action.movimentacaoFinanceira.movimentacaoFinanceiraIngresso,\n isLoading: false\n }\n case 'GET_MOVIMENTACAO_FINANCEIRA_BY_ID_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'GET_ALL_MOVIMENTACAO_FINANCEIRA_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'GET_ALL_MOVIMENTACAO_FINANCEIRA_SUCCESS':\n return {\n ...state,\n movimentacaoFinanceira: action.movimentacaoFinanceira,\n isLoading: false\n }\n case 'GET_ALL_MOVIMENTACAO_FINANCEIRA_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'MOVIMENTACAO_FINANCEIRA_DETAIL':\n return {\n ...state,\n id: action.movimentacaoFinanceira.id,\n statusMovimentacaoFinanceiraId:\n action.movimentacaoFinanceira.statusMovimentacaoFinanceiraId,\n estabelecimentoId: action.movimentacaoFinanceira.estabelecimentoId,\n tipo: action.movimentacaoFinanceira.tipo,\n dataHora: action.movimentacaoFinanceira.dataHora,\n dataHoraProcessamento:\n action.movimentacaoFinanceira.dataHoraProcessamento,\n valor: action.movimentacaoFinanceira.valor,\n contaBancariaId: action.movimentacaoFinanceira.contaBancariaId,\n anexo: action.movimentacaoFinanceira.anexo,\n motivoCancelamento: action.movimentacaoFinanceira.motivoCancelamento,\n estabelecimento: action.movimentacaoFinanceira.estabelecimento,\n contaBancaria: action.movimentacaoFinanceira.contaBancaria,\n statusMovimentacaoFinanceira:\n action.movimentacaoFinanceira.statusMovimentacaoFinanceira,\n movimentacaoFinanceiraIngresso:\n action.movimentacaoFinanceira.movimentacaoFinanceiraIngresso\n }\n case 'MOVIMENTACAO_FINANCEIRA_HANDLE_ON_CHANGE':\n return {\n ...state,\n [action.props]: action.value\n }\n default:\n return state\n }\n}\n","const initialState = {\n statusMovimentacaoFinanceira: [],\n statusMovimentacaoFinanceiraSelect: [],\n id: 0,\n descricao: '',\n solicitado: false,\n cancelado: false,\n finalizado: false,\n isFetching: false\n}\n\nexport function statusMovimentacaoFinanceira(state = initialState, action) {\n switch (action.type) {\n case 'STATUS_MOVIMENTACAO_FINANCEIRA_DETAIL':\n return {\n ...state,\n id: action.id,\n descricao: action.descricao,\n solicitado: action.solicitado,\n cancelado: action.cancelado,\n finalizado: action.finalizado\n }\n case 'STATUS_MOVIMENTACAO_FINANCEIRA_CLEAR_ALL':\n return initialState\n case 'STATUS_MOVIMENTACAO_FINANCEIRA_CLEAR_LIST':\n return {\n ...state,\n instituicaoBancaria: []\n }\n case 'FETCHED_STATUS_MOVIMENTACAO_FINANCEIRA_SELECT_REQUEST':\n return {\n ...state,\n isFetching: true\n }\n case 'FETCHED_STATUS_MOVIMENTACAO_FINANCEIRA_SELECT_SUCCESS':\n return {\n ...state,\n isFetching: false,\n statusMovimentacaoFinanceiraSelect:\n action.statusMovimentacaoFinanceiraSelect\n }\n case 'FETCHED_STATUS_MOVIMENTACAO_FINANCEIRA_SELECT_FAILURE':\n return {\n ...state,\n isFetching: false,\n error: action.error\n }\n default:\n return state\n }\n}\n","const initialState = {\n avaliacao: [],\n id: 0,\n usuarioId: 0,\n dataHora: null,\n nota: null,\n mensagem: '',\n estabelecimentoId: 0,\n eventoId: 0,\n privada: false,\n excluido: false,\n isLoading: false,\n answerOpen: false,\n detailOpen: false\n}\nexport function avaliacao(state = initialState, action) {\n const newRatingArray = []\n switch (action.type) {\n case 'REQUEST_ALL_AVALIACOES_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'REQUEST_ALL_AVALIACOES_SUCCESS':\n return {\n ...state,\n isLoading: false,\n avaliacao: action.avaliacoes\n }\n case 'REQUEST_ALL_AVALIACOES_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'SEARCH_AVALIACOES_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'SEARCH_AVALIACOES_SUCCESS':\n return {\n ...state,\n isLoading: false,\n avaliacao: action.avaliacoes,\n eventoId: action.eventoId\n }\n case 'SEARCH_AVALIACOES_FAILURE':\n return {\n ...state,\n isLoading: false,\n error: action.error\n }\n case 'AVALIACAO_CLEAR_ALL':\n return initialState\n case 'AVALIACAO_ANSWER_OPEN':\n return {\n ...state,\n answerOpen: action.answerOpen,\n usuarioId: action.usuarioId,\n mensagem: action.mensagem,\n id: action.id\n }\n case 'AVALIACAO_ANSWER_SUCCESS':\n return {\n ...state,\n answerOpen: false,\n usuarioId: 0,\n mensagem: '',\n id: 0\n }\n case 'AVALIACAO_DETAIL_OPEN':\n return {\n ...state,\n detailOpen: action.detailOpen,\n usuarioId: action.usuarioId,\n mensagem: action.mensagem,\n id: action.id,\n nota: action.nota\n }\n case 'LIKE_AVALIACOES_REQUEST':\n state.avaliacao.map((rating) => {\n rating.avaliacao.id === action.ratingId\n ? newRatingArray.push({\n ...rating,\n usuarioCurtiu: !rating.usuarioCurtiu,\n numeroCurtidas: rating.usuarioCurtiu\n ? --rating.numeroCurtidas\n : ++rating.numeroCurtidas\n })\n : newRatingArray.push(rating)\n })\n return {\n ...state,\n avaliacao: newRatingArray\n }\n case 'LIKE_AVALIACOES_SUCCESS':\n return {\n ...state\n }\n case 'LIKE_AVALIACOES_FAILURE':\n return {\n ...state\n }\n default:\n return state\n }\n}\n","const initialState = {\n comentario: [],\n id: 0,\n usuarioId: 0,\n dataHora: null,\n mensagem: '',\n comentarioId: 0,\n avaliacaoId: 0,\n privado: false,\n excluido: false,\n isLoading: false,\n reload: false\n}\n\nexport function comentario(state = initialState, action) {\n const newCommentsReview = []\n switch (action.type) {\n case 'COMENTARIO_CHANGE_ANSWER':\n return {\n ...state,\n mensagem: action.mensagem\n }\n case 'COMENTARIO_ANSWER_SUCCESS':\n return {\n ...state,\n usuarioId: 0,\n mensagem: ''\n }\n case 'REQUEST_ALL_COMENTARIOS_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'REQUEST_ALL_COMENTARIOS_SUCCESS':\n return {\n ...state,\n isLoading: false,\n comentario: action.comentarios\n }\n case 'REQUEST_ALL_COMENTARIOS_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'DELETE_COMENTARIO_REQUEST':\n return {\n ...state,\n isLoading: true\n }\n case 'DELETE_COMENTARIO_SUCCESS':\n return {\n ...state,\n isLoading: false,\n reload: !action.reload\n }\n case 'DELETE_COMENTARIO_FAILURE':\n return {\n ...state,\n isLoading: false\n }\n case 'LIKE_COMENTARIO_REQUEST':\n state.comentario.map((comment) => {\n comment.comentario.id === action.commentId\n ? newCommentsReview.push({\n ...comment,\n usuarioCurtiu: !comment.usuarioCurtiu,\n numeroCurtidas: comment.usuarioCurtiu\n ? --comment.numeroCurtidas\n : ++comment.numeroCurtidas\n })\n : newCommentsReview.push(comment)\n })\n return {\n ...state,\n comentario: newCommentsReview\n }\n case 'LIKE_COMENTARIO_SUCCESS':\n return {\n ...state\n }\n case 'LIKE_COMENTARIO_FAILURE':\n return {\n ...state\n }\n default:\n return state\n }\n}\n","const initialState = {\n foto: [],\n fotoCapaId: null,\n enabledSortableContext: false\n}\n\nexport function album(state = initialState, action) {\n switch (action.type) {\n case 'ADD_PHOTO':\n return {\n ...state,\n foto: [...state.foto, ...action.foto]\n }\n case 'SHORT_PHOTO':\n return {\n ...state,\n foto: [...action.foto]\n }\n case 'UPDATE_PHOTO':\n return {\n ...state,\n foto: state.foto.map((fotoItem) => {\n return action.data.id === fotoItem.id\n ? { ...fotoItem, ...action.data }\n : fotoItem\n })\n }\n case 'DELETE_PHOTO':\n return {\n ...state,\n foto: state.foto.filter((item) => action.foto.id !== item.id)\n }\n case 'DELETE_ALL_PHOTO':\n return initialState\n case 'SET_FOTO_CAPA_ID':\n return {\n ...state,\n foto: state.foto.map((fotoItem) => {\n return state.fotoCapaId === fotoItem.id\n ? { ...fotoItem, isCover: false }\n : fotoItem\n }),\n fotoCapaId: action.fotoCapaId\n }\n case 'TOGGLE_ENABLED_SORTABLE_CONTEXT':\n return {\n ...state,\n enabledSortableContext: !state.enabledSortableContext\n }\n default:\n return state\n }\n}\n","import { combineReducers } from 'redux'\nimport { global } from './global.reducer'\nimport { authentication } from './auth.reducer'\nimport { evento } from './evento.reducer'\nimport { usuario } from './usuario.reducer'\nimport { tipoIngresso } from './tipoIngresso.reducer'\nimport { estabelecimento } from './estabelecimento.reducer'\nimport { cupomDesconto } from './cupomDesconto.reducer'\nimport { lote } from './lote.reducer'\nimport { ingresso } from './ingresso.reducer'\nimport { categoria } from './categoria.reducer'\nimport { hashtag } from './hashtag.reducer'\nimport { conquista } from './conquista.reducer'\nimport { taxa } from './taxa.reducer'\nimport { usuarioEstabelecimento } from './usuarioEstabelecimento.reducer'\nimport { contaBancaria } from './contaBancaria.reducer'\nimport { cidade } from './cidade.reducer'\nimport { estado } from './estado.reducer'\nimport { promoter } from './promoter.reducer'\nimport { dashboard } from './dashboard.reducer'\nimport { instituicaoBancaria } from './instituicaoBancaria.reducer'\nimport { permissao } from './permissao.reducer'\nimport { permissaoTipoUsuario } from './permissaoTipoUsuario.reducer'\nimport { permissaoUsuario } from './permissaoUsuario.reducer'\nimport { tipoUsuario } from './tipoUsuario.reducer'\nimport { parametro } from './parametro.reducer'\nimport { movimentacaoFinanceira } from './movimentacaoFinanceira.reducer'\nimport { statusMovimentacaoFinanceira } from './statusMovimentacaoFinanceira.reducer'\nimport { reducer as formReducer } from 'redux-form'\nimport { avaliacao } from './avaliacao.reducer'\nimport { comentario } from './comentario.reducer'\nimport { album } from './album.reducer'\n\nconst appReducer = combineReducers({\n global,\n authentication,\n evento,\n tipoIngresso,\n estabelecimento,\n usuario,\n cupomDesconto,\n lote,\n ingresso,\n categoria,\n hashtag,\n conquista,\n taxa,\n usuarioEstabelecimento,\n contaBancaria,\n estado,\n cidade,\n promoter,\n dashboard,\n instituicaoBancaria,\n permissao,\n permissaoTipoUsuario,\n permissaoUsuario,\n tipoUsuario,\n parametro,\n movimentacaoFinanceira,\n statusMovimentacaoFinanceira,\n avaliacao,\n comentario,\n album,\n form: formReducer\n})\n\nconst rootReducer = (state, action) => {\n if (action.type === 'LOGOUT_SUCCESS') {\n const { routing } = state\n state = { routing }\n }\n return appReducer(state, action)\n}\nexport default rootReducer\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl)\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.')\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.')\n }\n }\n }\n }\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl)\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister()\n })\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport { createStore, applyMiddleware } from 'redux'\nimport { Provider } from 'react-redux'\nimport thunk from 'redux-thunk'\nimport multi from 'redux-multi'\nimport reducer from './_reducers'\nimport { unregister as unregisterServiceWorker } from './registerServiceWorker'\nimport { persistStore, persistReducer } from 'redux-persist'\nimport storage from 'redux-persist/lib/storage'\nimport { PersistGate } from 'redux-persist/integration/react'\nimport TagManager from 'react-gtm-module'\n\nconst tagManagerArgs = {\n gtmId: 'GTM-NXLCXWX'\n}\n\nTagManager.initialize(tagManagerArgs)\n\nconst persistConfig = {\n key: 'coruja-admin-root',\n storage,\n blacklist: ['authentication', 'album']\n}\nconst persistedReducer = persistReducer(persistConfig, reducer)\nconst devTools =\n window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()\n//Define a store do redux (agrupa todos reducers da aplicação, atravez do arquivo reducer from './_reducers';)\nconst store = applyMiddleware(thunk, multi)(createStore)(\n persistedReducer,\n devTools\n)\nconst persistor = persistStore(store)\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n)\nunregisterServiceWorker()\n","// eslint-disable-next-line no-undef\nmodule.exports = {\n headers: {\n accept: 'application/json'\n },\n //baseUrl: 'https://localhost:44393/api/'\n //baseUrl: 'https://staging.corujasapp.com/api/'\n baseUrl: 'https://organizador.corujasapp.com/api/'\n}\n","module.exports = __webpack_public_path__ + \"static/media/logo_progress.3419bf08.png\";"],"sourceRoot":""}