Skip to content

Commit bca0078

Browse files
committed
convert tablists to functional components
1 parent 052d0eb commit bca0078

File tree

2 files changed

+151
-160
lines changed

2 files changed

+151
-160
lines changed

src/pages/Sidebar/containers/TabsList/Tab/Tab.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@
169169
}
170170

171171
.blink {
172-
animation: blinker 0.8s linear infinite;
172+
animation: blinker 1.2s linear infinite;
173173
}
174174

175175
@keyframes blinker {
Lines changed: 150 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { Component } from 'react';
1+
import React, { useState, useEffect, useCallback } from 'react';
22
import classNames from 'classnames';
33
import DarkModeContext from '../../context/dark-mode-context';
44

@@ -10,78 +10,74 @@ import './react-contextmenu.css';
1010

1111
import './TabsList.css';
1212

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) => {
2329
if (toStatus === false) {
24-
this.setState({
25-
contextMenuShow: false,
26-
contextMenuShowPrev: true,
27-
});
30+
_setContextMenuShow(false);
31+
_setContextMenuShowPrev(true);
2832
}
2933
};
3034

31-
clearContextMenuShow = () => {
32-
this.setState({
33-
contextMenuShow: false,
34-
contextMenuShowPrev: null,
35-
});
35+
const clearContextMenuShow = () => {
36+
_setContextMenuShow(false);
37+
_setContextMenuShowPrev(null);
3638
};
3739

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+
);
4254

43-
componentDidMount() {
44-
document.addEventListener('keydown', this.keyPressListener, false);
55+
useEffect(() => {
56+
document.addEventListener('keydown', keyPressHandler, false);
4557

4658
chrome.runtime.getPlatformInfo((info) => {
47-
this.setState({
48-
platformInfo: info,
49-
});
59+
_setPlatformInfo(info);
5060
});
51-
}
52-
53-
componentWillUnmount() {
54-
document.removeEventListener('keydown', this.keyPressListener, false);
55-
}
5661

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]);
6866

69-
handleSearchBarInputText = (event) => {
67+
const handleSearchBarInputText = (event) => {
7068
let inputText = event.target.value;
71-
this.setState({
72-
searchBarInputText: inputText,
73-
});
69+
_setSearchBarInputText(inputText);
7470
};
7571

76-
clearSearchBoxInputText = () => {
77-
this.setState({ searchBarInputText: '' });
72+
const clearSearchBoxInputText = () => {
73+
_setSearchBarInputText('');
7874
};
7975

80-
openNewTabClickedHandler = (e) => {
76+
const openNewTabClickedHandler = (e) => {
8177
chrome.tabs.create({});
8278
};
8379

84-
renderTab = (tabOrder, idx) => {
80+
const renderTab = (tabOrder, idx) => {
8581
return (
8682
<Tab
8783
key={tabOrder.id}
@@ -97,129 +93,124 @@ class TabsList extends Component {
9793
title={tabOrder.title}
9894
url={tabOrder.url}
9995
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}
111107
/>
112108
);
113109
};
114110

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+
});
132123
}
133-
});
134-
135-
if (tabOrdersCopy.length > 0) {
136-
this.firstTab = tabOrdersCopy[0];
137-
} else {
138-
this.firstTab = null;
139124
}
125+
});
140126

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+
}
143132

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+
)}
189164

165+
{pinnedTabs.length > 0 && unpinnedTabs.length > 0 && (
190166
<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+
>
192191
<div
193192
className={classNames({
194-
NewTabButtonContainer: true,
193+
NewTabButton: true,
195194
Dark: isDark,
196195
})}
197-
title="Open a new tab"
196+
onClick={(e) => openNewTabClickedHandler(e)}
198197
>
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+
)}
215206
</div>
216207
</div>
217208
</div>
218-
);
219-
}}
220-
</DarkModeContext.Consumer>
221-
);
222-
}
223-
}
209+
</div>
210+
);
211+
}}
212+
</DarkModeContext.Consumer>
213+
);
214+
};
224215

225216
export default TabsList;

0 commit comments

Comments
 (0)