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