/ src / hooks / use-time-filter.ts
use-time-filter.ts
 1  import assert from 'assert';
 2  import { useParams } from 'react-router-dom';
 3  
 4  // the timestamp the last time the user visited
 5  const lastVisitTimestamp = localStorage.getItem('plebchanLastVisitTimestamp');
 6  
 7  // update the last visited timestamp every n seconds
 8  setInterval(() => {
 9    localStorage.setItem('plebchanLastVisitTimestamp', Date.now().toString());
10  }, 60 * 1000);
11  
12  const timeFilterNamesToSeconds: Record<string, number | undefined> = {
13    '1h': 60 * 60,
14    '12h': 60 * 60 * 12,
15    '24h': 60 * 60 * 24,
16    '48h': 60 * 60 * 24 * 2,
17    '1w': 60 * 60 * 24 * 7,
18    '1m': 60 * 60 * 24 * 30,
19    '1y': 60 * 60 * 24 * 365,
20    all: undefined,
21  };
22  
23  // calculate the last visit timeFilterNamesToSeconds
24  const secondsSinceLastVisit = lastVisitTimestamp ? (Date.now() - parseInt(lastVisitTimestamp, 10)) / 1000 : Infinity;
25  const day = 24 * 60 * 60;
26  let lastVisitTimeFilterName: string | undefined;
27  if (secondsSinceLastVisit > 30 * day) {
28    lastVisitTimeFilterName = '1m';
29    timeFilterNamesToSeconds[lastVisitTimeFilterName] = timeFilterNamesToSeconds['1m'];
30  } else if (secondsSinceLastVisit > 7 * day) {
31    const weeks = Math.ceil(secondsSinceLastVisit / day / 7);
32    lastVisitTimeFilterName = `${weeks}w`;
33    timeFilterNamesToSeconds[lastVisitTimeFilterName] = 60 * 60 * 24 * 7 * weeks;
34  } else if (secondsSinceLastVisit > day) {
35    const days = Math.ceil(secondsSinceLastVisit / day);
36    lastVisitTimeFilterName = `${days}d`;
37    timeFilterNamesToSeconds[lastVisitTimeFilterName] = 60 * 60 * 24 * days;
38  } else {
39    lastVisitTimeFilterName = '24h';
40    timeFilterNamesToSeconds[lastVisitTimeFilterName] = timeFilterNamesToSeconds['24h'];
41  }
42  
43  export const timeFilterNames = [lastVisitTimeFilterName, '1h', '12h', '24h', '48h', '1w', '1m', '1y', 'all'];
44  
45  const useTimeFilter = () => {
46    const params = useParams();
47    let timeFilterName = params.timeFilterName;
48  
49    // the default time filter is the last visit time filter
50    if (!timeFilterName) {
51      timeFilterName = lastVisitTimeFilterName;
52    }
53  
54    assert(!timeFilterName || typeof timeFilterName === 'string', `useTimeFilter timeFilterName argument '${timeFilterName}' not a string`);
55    const timeFilterSeconds = timeFilterNamesToSeconds[timeFilterName as keyof typeof timeFilterNamesToSeconds];
56    assert(!timeFilterName || timeFilterName === 'all' || timeFilterSeconds !== undefined, `useTimeFilter no filter for timeFilterName '${timeFilterName}'`);
57    return { timeFilterSeconds, timeFilterNames, timeFilterName };
58  };
59  
60  export default useTimeFilter;