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'use client'
22
3- import { useState , useEffect } from 'react'
3+ import { useState , useEffect , useCallback } from 'react'
4+ import { useEventListener } from '../../hooks/useEventListener'
45
56export 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' ) || [ ] )
Original file line number Diff line number Diff line change @@ -12,6 +12,7 @@ import { SearchIcon } from './SearchIcon.jsx'
1212import { Title } from './Title.jsx'
1313import { Stars } from './Stars.jsx'
1414import ThemeToggle from './ThemeToggle'
15+ import { useEventListener } from '../../hooks/useEventListener'
1516
1617export 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 }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments