1
- import React , { Component } from 'react' ;
1
+ import React , { useState , useEffect , useCallback } from 'react' ;
2
2
import classNames from 'classnames' ;
3
3
import DarkModeContext from '../../context/dark-mode-context' ;
4
4
@@ -10,78 +10,74 @@ import './react-contextmenu.css';
10
10
11
11
import './TabsList.css' ;
12
12
13
- class TabsList extends Component {
14
- state = {
15
- searchBarInputText : '' ,
16
- contextMenuShow : false ,
17
- contextMenuShowPrev : null ,
18
-
19
- platformInfo : null ,
20
- } ;
21
-
22
- setContextMenuShow = ( toStatus ) => {
13
+ const TabsList = ( {
14
+ tabOrders,
15
+ tabsDict,
16
+ activeTab,
17
+ displayTabInFull,
18
+ moveTab,
19
+ setTabAsLoading,
20
+ } ) => {
21
+ let firstTab = null ;
22
+
23
+ const [ searchBarInputText , _setSearchBarInputText ] = useState ( '' ) ;
24
+ const [ contextMenuShow , _setContextMenuShow ] = useState ( false ) ;
25
+ const [ contextMenuShowPrev , _setContextMenuShowPrev ] = useState ( null ) ;
26
+ const [ platformInfo , _setPlatformInfo ] = useState ( null ) ;
27
+
28
+ const setContextMenuShow = ( toStatus ) => {
23
29
if ( toStatus === false ) {
24
- this . setState ( {
25
- contextMenuShow : false ,
26
- contextMenuShowPrev : true ,
27
- } ) ;
30
+ _setContextMenuShow ( false ) ;
31
+ _setContextMenuShowPrev ( true ) ;
28
32
}
29
33
} ;
30
34
31
- clearContextMenuShow = ( ) => {
32
- this . setState ( {
33
- contextMenuShow : false ,
34
- contextMenuShowPrev : null ,
35
- } ) ;
35
+ const clearContextMenuShow = ( ) => {
36
+ _setContextMenuShow ( false ) ;
37
+ _setContextMenuShowPrev ( null ) ;
36
38
} ;
37
39
38
- constructor ( props ) {
39
- super ( props ) ;
40
- this . keyPressListener = this . keyPressHandler . bind ( this ) ;
41
- }
40
+ const keyPressHandler = useCallback (
41
+ ( event ) => {
42
+ if ( event . key === 'Enter' ) {
43
+ // enter key
44
+ if ( searchBarInputText . length > 0 ) {
45
+ if ( firstTab ) {
46
+ chrome . tabs . update ( firstTab . id , { active : true } ) ;
47
+ clearSearchBoxInputText ( ) ;
48
+ }
49
+ }
50
+ }
51
+ } ,
52
+ [ searchBarInputText , firstTab ]
53
+ ) ;
42
54
43
- componentDidMount ( ) {
44
- document . addEventListener ( 'keydown' , this . keyPressListener , false ) ;
55
+ useEffect ( ( ) => {
56
+ document . addEventListener ( 'keydown' , keyPressHandler , false ) ;
45
57
46
58
chrome . runtime . getPlatformInfo ( ( info ) => {
47
- this . setState ( {
48
- platformInfo : info ,
49
- } ) ;
59
+ _setPlatformInfo ( info ) ;
50
60
} ) ;
51
- }
52
-
53
- componentWillUnmount ( ) {
54
- document . removeEventListener ( 'keydown' , this . keyPressListener , false ) ;
55
- }
56
61
57
- keyPressHandler ( event ) {
58
- if ( event . keyCode === 13 ) {
59
- // enter key
60
- if ( this . state . searchBarInputText . length > 0 ) {
61
- if ( this . firstTab ) {
62
- chrome . tabs . update ( this . firstTab . id , { active : true } ) ;
63
- this . clearSearchBoxInputText ( ) ;
64
- }
65
- }
66
- }
67
- }
62
+ return ( ) => {
63
+ document . removeEventListener ( 'keydown' , keyPressHandler , false ) ;
64
+ } ;
65
+ } , [ keyPressHandler ] ) ;
68
66
69
- handleSearchBarInputText = ( event ) => {
67
+ const handleSearchBarInputText = ( event ) => {
70
68
let inputText = event . target . value ;
71
- this . setState ( {
72
- searchBarInputText : inputText ,
73
- } ) ;
69
+ _setSearchBarInputText ( inputText ) ;
74
70
} ;
75
71
76
- clearSearchBoxInputText = ( ) => {
77
- this . setState ( { searchBarInputText : '' } ) ;
72
+ const clearSearchBoxInputText = ( ) => {
73
+ _setSearchBarInputText ( '' ) ;
78
74
} ;
79
75
80
- openNewTabClickedHandler = ( e ) => {
76
+ const openNewTabClickedHandler = ( e ) => {
81
77
chrome . tabs . create ( { } ) ;
82
78
} ;
83
79
84
- renderTab = ( tabOrder , idx ) => {
80
+ const renderTab = ( tabOrder , idx ) => {
85
81
return (
86
82
< Tab
87
83
key = { tabOrder . id }
@@ -97,129 +93,124 @@ class TabsList extends Component {
97
93
title = { tabOrder . title }
98
94
url = { tabOrder . url }
99
95
status = { tabOrder . status }
100
- activeTab = { this . props . activeTab }
101
- displayTabInFull = { this . props . displayTabInFull }
102
- contextMenuShow = { this . state . contextMenuShow }
103
- contextMenuShowPrev = { this . state . contextMenuShowPrev }
104
- moveTab = { this . props . moveTab }
105
- setTabAsLoading = { this . props . setTabAsLoading }
106
- clearSearchBoxInputText = { this . clearSearchBoxInputText }
107
- isSearching = { this . state . searchBarInputText . length > 0 }
108
- setContextMenuShow = { this . setContextMenuShow }
109
- clearContextMenuShow = { this . clearContextMenuShow }
110
- openNewTabClickedHandler = { this . openNewTabClickedHandler }
96
+ activeTab = { activeTab }
97
+ displayTabInFull = { displayTabInFull }
98
+ contextMenuShow = { contextMenuShow }
99
+ contextMenuShowPrev = { contextMenuShowPrev }
100
+ moveTab = { moveTab }
101
+ setTabAsLoading = { setTabAsLoading }
102
+ clearSearchBoxInputText = { clearSearchBoxInputText }
103
+ isSearching = { searchBarInputText . length > 0 }
104
+ setContextMenuShow = { setContextMenuShow }
105
+ clearContextMenuShow = { clearContextMenuShow }
106
+ openNewTabClickedHandler = { openNewTabClickedHandler }
111
107
/>
112
108
) ;
113
109
} ;
114
110
115
- render ( ) {
116
- const { tabOrders, tabsDict } = this . props ;
117
- const { searchBarInputText, platformInfo } = this . state ;
118
-
119
- const inputText = searchBarInputText . toLowerCase ( ) ;
120
-
121
- const tabOrdersCopy = [ ] ;
122
- tabOrders . forEach ( ( tabOrder ) => {
123
- const { id } = tabOrder ;
124
- if ( tabsDict [ id ] !== undefined ) {
125
- const { combinedText } = tabsDict [ id ] ;
126
- if ( combinedText . includes ( inputText ) ) {
127
- tabOrdersCopy . push ( {
128
- ...tabOrder ,
129
- ...tabsDict [ id ] ,
130
- } ) ;
131
- }
111
+ const inputText = searchBarInputText . toLowerCase ( ) ;
112
+
113
+ const tabOrdersCopy = [ ] ;
114
+ tabOrders . forEach ( ( tabOrder ) => {
115
+ const { id } = tabOrder ;
116
+ if ( tabsDict [ id ] !== undefined ) {
117
+ const { combinedText } = tabsDict [ id ] ;
118
+ if ( combinedText . includes ( inputText ) ) {
119
+ tabOrdersCopy . push ( {
120
+ ...tabOrder ,
121
+ ...tabsDict [ id ] ,
122
+ } ) ;
132
123
}
133
- } ) ;
134
-
135
- if ( tabOrdersCopy . length > 0 ) {
136
- this . firstTab = tabOrdersCopy [ 0 ] ;
137
- } else {
138
- this . firstTab = null ;
139
124
}
125
+ } ) ;
140
126
141
- const pinnedTabs = tabOrdersCopy . filter ( ( item ) => item . pinned ) ;
142
- const unpinnedTabs = tabOrdersCopy . filter ( ( item ) => ! item . pinned ) ;
127
+ if ( tabOrdersCopy . length > 0 ) {
128
+ firstTab = tabOrdersCopy [ 0 ] ;
129
+ } else {
130
+ firstTab = null ;
131
+ }
143
132
144
- return (
145
- < DarkModeContext . Consumer >
146
- { ( { isDark } ) => {
147
- return (
148
- < div style = { { margin : 0 , padding : '48px 0px 0px 0px' } } >
149
- < SearchBar
150
- searchBarInputText = { searchBarInputText }
151
- handleSearchBarInputText = { this . handleSearchBarInputText }
152
- searchCount = { tabOrdersCopy . length }
153
- />
154
-
155
- < div style = { { margin : 0 , padding : 0 } } >
156
- { pinnedTabs . length > 0 && (
157
- < div className = "PinnedTabsContainer" >
158
- { pinnedTabs . map ( ( tabOrder , idx ) => {
159
- if ( tabsDict [ tabOrder . id ] === undefined ) {
160
- return null ;
161
- }
162
-
163
- // let tab = { ...tabsDict[tabOrder.id] };
164
- return (
165
- < React . Fragment key = { idx } >
166
- { this . renderTab ( tabOrder , idx ) }
167
- </ React . Fragment >
168
- ) ;
169
- } ) }
170
- </ div >
171
- ) }
172
-
173
- { pinnedTabs . length > 0 && unpinnedTabs . length > 0 && (
174
- < div className = "PinnedUnpinnedDivider" > </ div >
175
- ) }
176
-
177
- { unpinnedTabs . map ( ( tabOrder , idx ) => {
178
- if ( tabsDict [ tabOrder . id ] === undefined ) {
179
- return null ;
180
- }
181
-
182
- // let tab = { ...tabsDict[tabOrder.id] };
183
- return (
184
- < React . Fragment key = { idx } >
185
- { this . renderTab ( tabOrder , idx + pinnedTabs . length ) }
186
- </ React . Fragment >
187
- ) ;
188
- } ) }
133
+ const pinnedTabs = tabOrdersCopy . filter ( ( item ) => item . pinned ) ;
134
+ const unpinnedTabs = tabOrdersCopy . filter ( ( item ) => ! item . pinned ) ;
135
+
136
+ return (
137
+ < DarkModeContext . Consumer >
138
+ { ( { isDark } ) => {
139
+ return (
140
+ < div style = { { margin : 0 , padding : '48px 0px 0px 0px' } } >
141
+ < SearchBar
142
+ searchBarInputText = { searchBarInputText }
143
+ handleSearchBarInputText = { handleSearchBarInputText }
144
+ searchCount = { tabOrdersCopy . length }
145
+ />
146
+
147
+ < div style = { { margin : 0 , padding : 0 } } >
148
+ { pinnedTabs . length > 0 && (
149
+ < div className = "PinnedTabsContainer" >
150
+ { pinnedTabs . map ( ( tabOrder , idx ) => {
151
+ if ( tabsDict [ tabOrder . id ] === undefined ) {
152
+ return null ;
153
+ }
154
+
155
+ // let tab = { ...tabsDict[tabOrder.id] };
156
+ return (
157
+ < React . Fragment key = { tabOrder . id } >
158
+ { renderTab ( tabOrder , idx ) }
159
+ </ React . Fragment >
160
+ ) ;
161
+ } ) }
162
+ </ div >
163
+ ) }
189
164
165
+ { pinnedTabs . length > 0 && unpinnedTabs . length > 0 && (
190
166
< div className = "PinnedUnpinnedDivider" > </ div >
191
-
167
+ ) }
168
+
169
+ { unpinnedTabs . map ( ( tabOrder , idx ) => {
170
+ if ( tabsDict [ tabOrder . id ] === undefined ) {
171
+ return null ;
172
+ }
173
+
174
+ // let tab = { ...tabsDict[tabOrder.id] };
175
+ return (
176
+ < React . Fragment key = { tabOrder . id } >
177
+ { renderTab ( tabOrder , idx + pinnedTabs . length ) }
178
+ </ React . Fragment >
179
+ ) ;
180
+ } ) }
181
+
182
+ < div className = "PinnedUnpinnedDivider" > </ div >
183
+
184
+ < div
185
+ className = { classNames ( {
186
+ NewTabButtonContainer : true ,
187
+ Dark : isDark ,
188
+ } ) }
189
+ title = "Open a new tab"
190
+ >
192
191
< div
193
192
className = { classNames ( {
194
- NewTabButtonContainer : true ,
193
+ NewTabButton : true ,
195
194
Dark : isDark ,
196
195
} ) }
197
- title = "Open a new tab"
196
+ onClick = { ( e ) => openNewTabClickedHandler ( e ) }
198
197
>
199
- < div
200
- className = { classNames ( {
201
- NewTabButton : true ,
202
- Dark : isDark ,
203
- } ) }
204
- onClick = { ( e ) => this . openNewTabClickedHandler ( e ) }
205
- >
206
- < MdAdd size = { '22px' } style = { { marginRight : 3 } } />
207
- New Tab
208
- < div style = { { flex : 1 } } > </ div >
209
- { platformInfo && platformInfo . os && (
210
- < div className = "ShortcutName" >
211
- { platformInfo . os === 'mac' ? `⌘T` : `Ctrl+T` }
212
- </ div >
213
- ) }
214
- </ div >
198
+ < MdAdd size = { '22px' } style = { { marginRight : 3 } } />
199
+ New Tab
200
+ < div style = { { flex : 1 } } > </ div >
201
+ { platformInfo && platformInfo . os && (
202
+ < div className = "ShortcutName" >
203
+ { platformInfo . os === 'mac' ? `⌘T` : `Ctrl+T` }
204
+ </ div >
205
+ ) }
215
206
</ div >
216
207
</ div >
217
208
</ div >
218
- ) ;
219
- } }
220
- </ DarkModeContext . Consumer >
221
- ) ;
222
- }
223
- }
209
+ </ div >
210
+ ) ;
211
+ } }
212
+ </ DarkModeContext . Consumer >
213
+ ) ;
214
+ } ;
224
215
225
216
export default TabsList ;
0 commit comments