Files
5chan/src/hooks/use-time-filter.ts
T

57 lines
2.0 KiB
TypeScript

import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import {
getEffectiveTimeFilterName,
getEffectiveTimeFilterSeconds,
getStableLastVisitTimeFilterName,
getSelectedTimeFilterValue,
getTimeFilterOptionValues,
touchLastVisitTimestamp,
} from '../lib/utils/time-filter-utils';
declare global {
interface Window {
_5chanLastVisitTimestampIntervalId?: number;
_5chanLastVisitTimestampSubscribers?: number;
}
}
const ensureLastVisitTimestampTracking = (): (() => void) => {
if (typeof window === 'undefined') {
return () => {};
}
touchLastVisitTimestamp();
window._5chanLastVisitTimestampSubscribers = (window._5chanLastVisitTimestampSubscribers || 0) + 1;
if (!window._5chanLastVisitTimestampIntervalId) {
window._5chanLastVisitTimestampIntervalId = window.setInterval(() => {
touchLastVisitTimestamp();
}, 60 * 1000);
}
return () => {
window._5chanLastVisitTimestampSubscribers = Math.max((window._5chanLastVisitTimestampSubscribers || 1) - 1, 0);
if (window._5chanLastVisitTimestampSubscribers === 0 && window._5chanLastVisitTimestampIntervalId) {
window.clearInterval(window._5chanLastVisitTimestampIntervalId);
delete window._5chanLastVisitTimestampIntervalId;
}
};
};
const useTimeFilter = (timeFilterNameOverride?: string) => {
const location = useLocation();
useEffect(() => ensureLastVisitTimestampTracking(), []);
const lastVisitTimeFilterName = getStableLastVisitTimeFilterName();
const timeFilterValue = timeFilterNameOverride || getSelectedTimeFilterValue(location.search);
const timeFilterName = timeFilterNameOverride || getEffectiveTimeFilterName(location.search, lastVisitTimeFilterName);
const timeFilterSeconds = getEffectiveTimeFilterSeconds('', timeFilterName);
const timeFilterValues = getTimeFilterOptionValues(lastVisitTimeFilterName);
return { timeFilterSeconds, timeFilterName, timeFilterValue, timeFilterValues, lastVisitTimeFilterName };
};
export default useTimeFilter;