Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 3x 2x 2x 1x 1x 3x 1x 2x 7x 5x 2x 1x 1x 7x 7x | import { Dispatch, useReducer } from "react"; function dateReduction(prev: Date, next: Date | number): Date { let nextDateTime: number; let nextDate: Date; if (typeof next === "number") { nextDateTime = next; nextDate = new Date(next); } else { nextDateTime = next.getTime(); nextDate = next; } if (prev.getTime() === nextDateTime) { return prev; } else { return nextDate; } } /** * This simulates the logic of useState but the input is a Date or a number representing the instant. * It will always provide a Date and may NOT be null. However, the initial state if it is a function must * be return a Date. * * Since null is not a supported value, designate a constant like `Date(0)` to represent an undefined state. */ export function useDateState( initialState: Date | number | (() => Date) ): [Date, Dispatch<Date | number>] { let theInitialState: Date; if (typeof initialState === "number") { theInitialState = new Date(initialState); } else if (typeof initialState === "function") { theInitialState = null as unknown as Date; } else { theInitialState = initialState; } const initialStateIsFunction = typeof initialState === "function"; return useReducer( dateReduction, initialStateIsFunction ? (null as unknown as Date) : theInitialState, initialStateIsFunction ? (initialState as () => Date) : (undefined as unknown as () => Date) ); } |