Skip to content

Commit 2b5b164

Browse files
committed
Added second implementation (custom hooks)
1 parent 8be2c48 commit 2b5b164

3 files changed

Lines changed: 63 additions & 4 deletions

File tree

src/App.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// React
22
import { 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'
56
import ComponentToRender from './components/ComponentToRender'
67
// Utils
78
import { 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
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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+
}

0 commit comments

Comments
 (0)