import { useLazyQuery } from '@apollo/react-hooks' import { makeStyles, ClickAwayListener } from '@material-ui/core' import classnames from 'classnames' import FileSaver from 'file-saver' import moment from 'moment' import * as R from 'ramda' import React, { useState, useCallback } from 'react' import { FeatureButton, Link } from 'src/components/buttons' import { ReactComponent as Arrow } from 'src/styling/icons/arrow/download_logs.svg' import { ReactComponent as DownloadInverseIcon } from 'src/styling/icons/button/download/white.svg' import { ReactComponent as Download } from 'src/styling/icons/button/download/zodiac.svg' import { primaryColor, offColor, zircon } from 'src/styling/variables' import { formatDate } from 'src/utils/timezones' import Popper from './Popper' import DateRangePicker from './date-range-picker/DateRangePicker' import { RadioGroup } from './inputs' import typographyStyles from './typography/styles' const { info1, label1, label2, h4 } = typographyStyles const dateContainerStyles = { wrapper: { height: 46, width: 99 }, container: { display: 'flex' }, monthWeekDayContainer: { display: 'flex', flexDirection: 'column' }, label: { extend: label1, lineHeight: 1.33, color: primaryColor }, bigNumber: { extend: info1, lineHeight: 1, marginRight: 7 }, monthYear: { extend: label2, lineHeight: 1.17, color: primaryColor }, weekDay: { extend: label1, lineHeight: 1.33, color: offColor } } const dateContainerUseStyles = makeStyles(dateContainerStyles) const DateContainer = ({ date, children, ...props }) => { const classes = dateContainerUseStyles() return (
{children}
{date && ( <>
{date.format('D')}
{`${date.format( 'MMM' )} ${date.format('YYYY')}`} {date.format('dddd')}
)}
) } const styles = { popoverContent: { width: 280 }, popoverHeader: { extend: h4, padding: [[15, 15, 0, 15]] }, radioButtonsContainer: { padding: [[5, 15, 5, 15]] }, radioButtons: { display: 'flex', justifyContent: 'space-between', flexDirection: 'row', color: primaryColor }, dateRangePickerShowing: { display: 'block', height: '100%' }, dateRangePickerHidden: { display: 'none', height: 0 }, download: { padding: [[10, 15]] }, dateContainerWrapper: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', position: 'relative', backgroundColor: zircon, padding: [[0, 15]], minHeight: 70 }, arrowContainer: { position: 'absolute', left: 125, top: 26 }, arrow: { margin: 'auto' } } const useStyles = makeStyles(styles) const ALL = 'all' const RANGE = 'range' const ADVANCED = 'advanced' const SIMPLIFIED = 'simplified' const LogsDownloaderPopover = ({ name, query, args, title, getLogs, timezone, simplified }) => { 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 classes = useStyles() const dateRangePickerClasses = { [classes.dateRangePickerShowing]: selectedRadio === RANGE, [classes.dateRangePickerHidden]: 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 } }) } if (!range || !range.from) return if (range.from && !range.until) range.until = moment() if (moment(range.from).isSame(range.until, 'day')) range.until = moment() if (selectedRadio === RANGE) { fetchLogs({ variables: { ...args, from: range.from, until: range.until, simplified: selectedAdvancedRadio === SIMPLIFIED } }) } } 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