import { useLazyQuery } from '@apollo/client' import ClickAwayListener from '@mui/material/ClickAwayListener' import classnames from 'classnames' import { format, set } from 'date-fns/fp' import FileSaver from 'file-saver' import * as R from 'ramda' import React, { useState, useCallback } from 'react' import Arrow from '../styling/icons/arrow/download_logs.svg?react' import DownloadInverseIcon from '../styling/icons/button/download/white.svg?react' import Download from '../styling/icons/button/download/zodiac.svg?react' import { FeatureButton, Link } from './buttons' import { formatDate } from '../utils/timezones' import Popper from './Popper' import DateRangePicker from './date-range-picker/DateRangePicker' import { RadioGroup } from './inputs' import { H4, Info1, Label1, Label2 } from './typography/index.jsx' const DateContainer = ({ date, children }) => { return (
{children} {date && ( <>
{format('d', date)}
{`${format( 'MMM', date, )} ${format('yyyy', date)}`} {format('EEEE', date)}
)}
) } const ALL = 'all' const RANGE = 'range' const ADVANCED = 'advanced' const SIMPLIFIED = 'simplified' const LogsDownloaderPopover = ({ name, query, args, title, getLogs, timezone, simplified, className, }) => { const [selectedRadio, setSelectedRadio] = useState(ALL) const [selectedAdvancedRadio, setSelectedAdvancedRadio] = useState(ADVANCED) const [range, setRange] = useState({ from: null, until: null }) const [anchorEl, setAnchorEl] = useState(null) const [fetchLogs] = useLazyQuery(query, { onCompleted: data => createLogsFile(getLogs(data), range), }) const dateRangePickerClasses = { 'block h-full': selectedRadio === RANGE, hidden: selectedRadio === ALL, } const handleRadioButtons = evt => { const selectedRadio = R.path(['target', 'value'])(evt) setSelectedRadio(selectedRadio) if (selectedRadio === ALL) setRange({ from: null, until: null }) } const handleAdvancedRadioButtons = evt => { const selectedAdvancedRadio = R.path(['target', 'value'])(evt) setSelectedAdvancedRadio(selectedAdvancedRadio) } const handleRangeChange = useCallback( (from, until) => { setRange({ from, until }) }, [setRange], ) const downloadLogs = (range, args) => { if (selectedRadio === ALL) { fetchLogs({ variables: { ...args, simplified: selectedAdvancedRadio === SIMPLIFIED, excludeTestingCustomers: true, }, }) } if (!range || !range.from) return if (range.from && !range.until) range.until = new Date() if (selectedRadio === RANGE) { fetchLogs({ variables: { ...args, from: range.from, until: range.until, simplified: selectedAdvancedRadio === SIMPLIFIED, excludeTestingCustomers: true, }, }) } } const createLogsFile = (logs, range) => { const formatDateFile = date => { return formatDate(date, timezone, 'yyyy-MM-dd_HH-mm') } const blob = new window.Blob([logs], { type: 'text/plain;charset=utf-8', }) FileSaver.saveAs( blob, selectedRadio === ALL ? `${formatDateFile(new Date())}_${name}.csv` : `${formatDateFile(range.from)}_${formatDateFile( range.until, )}_${name}.csv`, ) } const handleOpenRangePicker = event => { setAnchorEl(anchorEl ? null : event.currentTarget) } const handleClickAway = () => { setAnchorEl(null) } const radioButtonOptions = [ { display: 'All logs', code: ALL }, { display: 'Date range', code: RANGE }, ] const advancedRadioButtonOptions = [ { display: 'Advanced logs', code: ADVANCED }, { display: 'Simplified logs', code: SIMPLIFIED }, ] const open = Boolean(anchorEl) const id = open ? 'date-range-popover' : undefined return (

{title}

{selectedRadio === RANGE && (
{range && ( <> From
To )}
)} {simplified && (
)}
downloadLogs(range, args)}> Download
) } export default LogsDownloaderPopover