import * as React from "react"; import { addMinutes } from "date-fns"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/src/components/ui/select"; import { dashboardDateRangeAggregationSettings, DASHBOARD_AGGREGATION_PLACEHOLDER, type DashboardDateRangeOptions, type TableDateRangeOptions, DASHBOARD_AGGREGATION_OPTIONS, type DashboardDateRange, TABLE_AGGREGATION_OPTIONS, getDateFromOption, isTableDataRangeOptionAvailable, isDashboardDateRangeOptionAvailable, getAbbreviatedTimeRange, getTimeRangeLabel, } from "@/src/utils/date-range-utils"; import { useEntitlementLimit } from "@/src/features/entitlements/hooks"; import { useMemo } from "react"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/src/components/ui/hover-card"; import { HoverCardPortal } from "@radix-ui/react-hover-card"; type BaseDateRangeDropdownProps = { selectedOption: T; options: readonly T[]; limitedOptions?: readonly T[]; onSelectionChange: (value: T) => void; }; const BaseDateRangeDropdown = ({ selectedOption, options, limitedOptions, onSelectionChange, }: BaseDateRangeDropdownProps) => { return ( ); }; type DashboardDateRangeDropdownProps = { selectedOption: DashboardDateRangeOptions; setDateRangeAndOption: ( option: DashboardDateRangeOptions, date?: DashboardDateRange, ) => void; }; export const DashboardDateRangeDropdown: React.FC< DashboardDateRangeDropdownProps > = ({ selectedOption, setDateRangeAndOption }) => { const lookbackLimit = useEntitlementLimit("data-access-days"); const disabledOptions = useMemo(() => { return DASHBOARD_AGGREGATION_OPTIONS.filter( (option) => !isDashboardDateRangeOptionAvailable({ option, limitDays: lookbackLimit, }), ); }, [lookbackLimit]); const onDropDownSelection = (value: DashboardDateRangeOptions) => { if (value === DASHBOARD_AGGREGATION_PLACEHOLDER) { setDateRangeAndOption(DASHBOARD_AGGREGATION_PLACEHOLDER, undefined); return; } const setting = dashboardDateRangeAggregationSettings[ value as keyof typeof dashboardDateRangeAggregationSettings ]; setDateRangeAndOption(value, { from: addMinutes(new Date(), -setting!.minutes!), to: new Date(), }); }; const options = selectedOption === DASHBOARD_AGGREGATION_PLACEHOLDER ? [...DASHBOARD_AGGREGATION_OPTIONS, DASHBOARD_AGGREGATION_PLACEHOLDER] : [...DASHBOARD_AGGREGATION_OPTIONS]; return ( ); }; type TableDateRangeDropdownProps = { selectedOption: TableDateRangeOptions; setDateRangeAndOption: ( option: TableDateRangeOptions, date?: DashboardDateRange, ) => void; }; export const TableDateRangeDropdown: React.FC = ({ selectedOption, setDateRangeAndOption, }) => { const lookbackLimit = useEntitlementLimit("data-access-days"); const disabledOptions = useMemo(() => { return TABLE_AGGREGATION_OPTIONS.filter( (option) => !isTableDataRangeOptionAvailable({ option, limitDays: lookbackLimit }), ); }, [lookbackLimit]); const onDropDownSelection = (value: TableDateRangeOptions) => { // Handle "custom" placeholder case if (value === "custom") { setDateRangeAndOption(value, undefined); return; } const dateFromOption = getDateFromOption({ filterSource: "TABLE", option: value, }); const initialDateRange = !!dateFromOption ? { from: dateFromOption, to: new Date() } : undefined; setDateRangeAndOption(value, initialDateRange); }; return ( ); };