PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / dashboard / hooks / useDateRangePicker.js
presto-player / src / admin / dashboard / hooks Last commit date
test 3 weeks ago useCompleteOnboarding.js 3 weeks ago useDateRangePicker.js 1 month ago useEmail.ts 1 month ago useEngagementChartData.js 1 month ago useLicenseSettings.js 1 month ago useLink.js 1 month ago useMediaDetail.js 1 month ago useMediaLibrary.js 1 month ago useMediaList.ts 1 month ago usePerformanceSettings.js 1 month ago useRegisterActivePage.js 1 month ago useSettingOption.js 1 month ago useSimpleSettingsPage.js 1 month ago useTopPerforming.js 1 month ago useTopVideosPaginated.js 1 month ago useUpgradeCTA.js 1 month ago useUserDetail.js 1 month ago
useDateRangePicker.js
73 lines
1 import { useState, useEffect, useRef, useCallback } from "@wordpress/element";
2
3 /**
4 * Encapsulates date range picker state, handlers, and side-effects
5 * used by analytics detail pages.
6 *
7 * @param {Function} refetchFn - Called with (from, to) when dates change, or with no args on clear.
8 */
9 const useDateRangePicker = (refetchFn) => {
10 const [selectedDates, setSelectedDates] = useState({ from: null, to: null });
11 const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
12 const datePickerRef = useRef(null);
13
14 const handleDateApply = useCallback((dates) => {
15 const { from, to } = dates;
16 if (from && to) {
17 const fromDate = new Date(from);
18 const toDate = new Date(to);
19 setSelectedDates(fromDate > toDate ? { from: to, to: from } : dates);
20 } else if (from && !to) {
21 setSelectedDates({ from, to: from });
22 } else {
23 setSelectedDates({ from: null, to: null });
24 }
25 setIsDatePickerOpen(false);
26 }, []);
27
28 const handleDateCancel = useCallback(() => {
29 setIsDatePickerOpen(false);
30 }, []);
31
32 const handleClearFilters = useCallback(() => {
33 setSelectedDates({ from: null, to: null });
34 refetchFn();
35 }, [refetchFn]);
36
37 // Refetch when date range changes
38 useEffect(() => {
39 if (selectedDates.from && selectedDates.to) {
40 refetchFn(selectedDates.from, selectedDates.to);
41 }
42 }, [selectedDates.from, selectedDates.to, refetchFn]);
43
44 // Close on click outside
45 useEffect(() => {
46 if (!isDatePickerOpen) return;
47
48 function handleClickOutside(event) {
49 if (
50 datePickerRef.current &&
51 !datePickerRef.current.contains(event.target)
52 ) {
53 setIsDatePickerOpen(false);
54 }
55 }
56
57 document.addEventListener("mousedown", handleClickOutside);
58 return () => document.removeEventListener("mousedown", handleClickOutside);
59 }, [isDatePickerOpen]);
60
61 return {
62 selectedDates,
63 isDatePickerOpen,
64 setIsDatePickerOpen,
65 datePickerRef,
66 handleDateApply,
67 handleDateCancel,
68 handleClearFilters,
69 };
70 };
71
72 export default useDateRangePicker;
73