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;