File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11// React
22import { ChangeEvent , useState } from 'react'
33// Components
4- import TimeBasedWrapper from './components/v1/TimeBasedWrapper'
4+ import TimeBasedWrapper_V1 from './components/v1/TimeBasedWrapper'
5+ import TimeBasedWrapper_V2 from './components/v2/TimeBasedWrapper'
56import ComponentToRender from './components/ComponentToRender'
67// Utils
78import { getCurrentDateFromTime } from './utils/date'
@@ -34,9 +35,15 @@ const App = () => {
3435 </ div >
3536 </ div >
3637 { startDate && endDate && (
37- < TimeBasedWrapper startDate = { startDate } endDate = { endDate } >
38- < ComponentToRender version = 'v1' />
39- </ TimeBasedWrapper >
38+ < >
39+ < TimeBasedWrapper_V1 startDate = { startDate } endDate = { endDate } >
40+ < ComponentToRender version = 'v1 contains normal implementation' />
41+ </ TimeBasedWrapper_V1 >
42+ < br />
43+ < TimeBasedWrapper_V2 startDate = { startDate } endDate = { endDate } >
44+ < ComponentToRender version = 'v2 contains implementation as a custom hook' />
45+ </ TimeBasedWrapper_V2 >
46+ </ >
4047 ) }
4148 </ div >
4249 )
Original file line number Diff line number Diff line change 1+ // Custom Hooks
2+ import { useTimeBasedRendering } from './hooks/useTimeBasedRendering'
3+ // Models
4+ import { TimeBasedRenderingProps as Props } from '../models/props'
5+
6+ const TimeBasedWrapper = ( { startDate, endDate, children } : Props ) => {
7+ const canRender = useTimeBasedRendering ( startDate , endDate )
8+
9+ return < div > { canRender && children } </ div >
10+ }
11+
12+ export default TimeBasedWrapper
Original file line number Diff line number Diff line change 1+ import { useEffect , useState } from 'react'
2+
3+ export const useTimeBasedRendering = ( startDate : Date , endDate : Date ) => {
4+ const [ canRender , setCanRender ] = useState ( false )
5+
6+ useEffect ( ( ) => {
7+ const currentDate = new Date ( )
8+ let startRenderingTimeOut : NodeJS . Timeout | undefined = undefined
9+ let stopRenderingTimeOut : NodeJS . Timeout | undefined = undefined
10+
11+ const shouldRenderNow = currentDate . getTime ( ) >= startDate . getTime ( ) && currentDate . getTime ( ) <= endDate . getTime ( )
12+
13+ if ( shouldRenderNow ) {
14+ // Start rendering
15+ setCanRender ( true )
16+
17+ // Set timeout to stop rendering at end date
18+ const isCurrentDateAheadOfStartDate = currentDate . getTime ( ) > startDate . getTime ( )
19+ const renderingStartDate = isCurrentDateAheadOfStartDate ? currentDate . getTime ( ) : startDate . getTime ( )
20+ const timeToStopRendering = endDate . getTime ( ) - renderingStartDate
21+ stopRenderingTimeOut = setTimeout ( ( ) => setCanRender ( false ) , timeToStopRendering )
22+ } else {
23+ // Stop rendering
24+ setCanRender ( false )
25+
26+ // Set timeouts to start rendering at start date and end rendering at end date
27+ const timeToStartRendering = startDate . getTime ( ) - currentDate . getTime ( )
28+ const timeToStopRendering = endDate . getTime ( ) - currentDate . getTime ( )
29+ startRenderingTimeOut = setTimeout ( ( ) => setCanRender ( true ) , timeToStartRendering )
30+ stopRenderingTimeOut = setTimeout ( ( ) => setCanRender ( false ) , timeToStopRendering )
31+ }
32+
33+ return ( ) => {
34+ clearTimeout ( startRenderingTimeOut )
35+ clearTimeout ( stopRenderingTimeOut )
36+ }
37+ } , [ startDate , endDate ] )
38+
39+ return canRender
40+ }
You can’t perform that action at this time.
0 commit comments