0.1.6Updated a month ago
// import { useSignal } from "@preact/signals";
// import { customRangeEnd, customRangeStart, rangeMode, rangeValue, type RangeMode } from "./state/summary.ts";
// import { Minus, Plus } from "lucide-preact";
// import { useEffect } from "preact/hooks";

// interface RangeOption {
//   prefix: string;
//   mode: RangeMode;
//   default: number;
//   step: number;
//   min: number;
//   max: number;
// }

// function parseDateSafe(input: string | null): Date | null {
//   if (!input) return null;
//   const parsed = new Date(input);
//   return isNaN(parsed.getTime()) ? null : parsed;
// }

// useEffect(() => {
//   const params = new URLSearchParams(location.search);
//   const mode = params.get("range") as RangeMode;
//   const value = parseInt(params.get("value") || "", 10);

//   if (mode === "custom") {
//     const start = parseDateSafe(params.get("start"));
//     const end = parseDateSafe(params.get("end"));
//     if (start && end) {
//       rangeMode.value = "custom";
//       customRangeStart.value = start;
//       customRangeEnd.value = end;
//     }
//   } else if (["minutes", "hours", "days", "weeks", "months"].includes(mode)) {
//     rangeMode.value = mode;
//     if (!isNaN(value)) rangeValue.value = value;
//   }
// }, []);

// const rangeOptions: RangeOption[] = [
//   {
//     prefix: "Past",
//     mode: "minutes",
//     default: 15,
//     step: 5,
//     min: 5,
//     max: 60,
//   },
//   {
//     prefix: "Past",
//     mode: "hours",
//     default: 6,
//     step: 3,
//     min: 1,
//     max: 24,
//   },
//   {
//     prefix: "Past",
//     mode: "days",
//     default: 7,
//     step: 1,
//     min: 1,
//     max: 60,
//   },
//   {
//     prefix: "Past",
//     mode: "weeks",
//     default: 2,
//     step: 1,
//     min: 1,
//     max: 4,
//   },
//   {
//     prefix: "Past",
//     mode: "months",
//     default: 3,
//     step: 1,
//     min: 1,
//     max: 36,
//   },
// ];

// function DateRangeDropdownOption({ rangeOption, applyRange, active }: {rangeOption: RangeOption, active: boolean, applyRange: (mode: RangeMode, value: number) => void}) {
//   const localValue = useSignal(rangeOption.default);

//   return (
//     <li class={"flex flex-row items-center cursor-pointer " + (active ? "bg-base-200" : "")} onClick={(_) => {
//       applyRange(rangeOption.mode, localValue.value);
//     }}>
//       { rangeOption.prefix }
//       <button
//         type="button"
//         class="btn btn-xs btn-outline text-sm ms-2"
//         onClick={(e) => {
//           e.stopPropagation();
//           if(localValue.value - rangeOption.step >= rangeOption.min) {
//             localValue.value -= rangeOption.step;
//           } else {
//             localValue.value = rangeOption.min;
//           }
//         }}
//       >
//         <Minus size={12} />
//       </button>
//       <span class="w-8 text-center block p-0">{ localValue.value }</span>
//       <button
//         type="button"
//         class="btn btn-xs btn-outline text-sm me-2"
//         onClick={(e) => {
//           e.stopPropagation();
//           if(rangeOption.step > 1 && localValue.value == rangeOption.min) {
//             localValue.value += rangeOption.step - (rangeOption.min % rangeOption.step);
//           } else if(localValue.value + rangeOption.step <= rangeOption.max) {
//             localValue.value += rangeOption.step;
//           } else {
//             localValue.value = rangeOption.max;
//           }
//         }}
//       >
//         <Plus size={12} />
//       </button>
//       { rangeOption.mode }
//     </li>
//   )
// }

// export default function DateRangeDropdown() {
//   const applyRange = (mode: RangeMode, value: number) => {
//     rangeMode.value = mode;
//     rangeValue.value = value;
//   };

//   // const applyCustomRange = (start: Date, end: Date) => {
//   //   rangeMode.value = 'custom';
//   //   customRangeStart.value = start;
//   //   customRangeEnd.value = end;
//   // };

//   return (<>
//     <div class="dropdown">
//       <label tabIndex={0} class="btn btn-sm">
//         Date Range
//       </label>
//       <ul
//         tabIndex={0}
//         class="dropdown-content z-[1] menu p-2 shadow bg-base-100 rounded-box w-60"
//       >
//         {rangeOptions.map((opt) => {
//           const isActive = rangeMode.value === opt.mode;

//           return <DateRangeDropdownOption active={isActive} rangeOption={opt} applyRange={applyRange} key={opt.mode} />;
//         })}

//         <li
//           class={rangeMode.value === "custom" ? "bg-base-200 font-semibold" : ""}
//           onClick={() => applyRange("custom", 0)}
//         >
//           <span>Custom...</span>
//         </li>
//       </ul>
//     </div>
//     { rangeMode.value === "custom" && <>
//       <input class="input" type="date"  ></input>
//     </> }
//   </>);
// }