Skip to content

Commit 26bf280

Browse files
committed
add: abstraigo logica del manejo del listener a un custom hook y lo consumo por el header y el button para el tema de los leidos
1 parent f21b9d5 commit 26bf280

3 files changed

Lines changed: 44 additions & 22 deletions

File tree

‎app/components/ButtonRead.jsx‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use client'
22

3-
import { useState, useEffect } from 'react'
3+
import { useState, useEffect, useCallback } from 'react'
4+
import { useEventListener } from '../../hooks/useEventListener'
45

56
export function ButtonRead ({ title }) {
67
const [isFavorite, setIsRead] = useState(false)
@@ -10,18 +11,17 @@ export function ButtonRead ({ title }) {
1011
setIsRead(readStorage.includes(title))
1112
}, [title])
1213

13-
useEffect(() => {
14-
window.addEventListener('storage', (event) => {
15-
if (event.key === 'read') {
16-
setIsRead(JSON.parse(event.newValue).includes(title))
17-
}
18-
})
19-
20-
return () => {
21-
window.removeEventListener('storage', () => {})
14+
const handlerStorageListener = useCallback((event) => {
15+
if (event.key === 'read') {
16+
setIsRead(JSON.parse(event.newValue).includes(title))
2217
}
2318
}, [title])
2419

20+
useEventListener({
21+
eventName: 'storage',
22+
handler: handlerStorageListener
23+
})
24+
2525
const handleSetRead = (title) => {
2626
if (title) {
2727
const read = JSON.parse(localStorage.getItem('read') || [])

‎app/components/Header.jsx‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { SearchIcon } from './SearchIcon.jsx'
1212
import { Title } from './Title.jsx'
1313
import { Stars } from './Stars.jsx'
1414
import ThemeToggle from './ThemeToggle'
15+
import { useEventListener } from '../../hooks/useEventListener'
1516

1617
export function Header ({ stars }) {
1718
const pathname = usePathname()
@@ -34,6 +35,17 @@ export function Header ({ stars }) {
3435
[]
3536
)
3637

38+
const handlerStorageListener = useCallback((event) => {
39+
if (event.key === 'read') {
40+
setRead(JSON.parse(event.newValue).length)
41+
}
42+
}, [])
43+
44+
useEventListener({
45+
eventName: 'storage',
46+
handler: handlerStorageListener
47+
})
48+
3749
useEffect(() => {
3850
setOpen(false)
3951
setResults([])
@@ -44,18 +56,6 @@ export function Header ({ stars }) {
4456
setRead(readStorage.length)
4557
}, [])
4658

47-
useEffect(() => {
48-
window.addEventListener('storage', (event) => {
49-
if (event.key === 'read') {
50-
setRead(JSON.parse(event.newValue).length)
51-
}
52-
})
53-
54-
return () => {
55-
window.removeEventListener('storage', () => {})
56-
}
57-
}, [])
58-
5959
const handleSelect = (result) => {
6060
if (result) router.push(`/${result.id}/#content`)
6161
}

‎hooks/useEventListener.ts‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { useEffect } from 'react'
2+
3+
type UseEventListenerProps = {
4+
eventName: string;
5+
handler: (event: Event) => void;
6+
};
7+
export const useEventListener = ({
8+
eventName,
9+
handler
10+
}: UseEventListenerProps) => {
11+
useEffect(() => {
12+
window.addEventListener(eventName, (event) => {
13+
handler(event)
14+
})
15+
16+
return () => {
17+
window.removeEventListener(eventName, () => {})
18+
}
19+
}, [eventName, handler])
20+
21+
return null
22+
}

0 commit comments

Comments
 (0)