Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit 2b0fa1d

Browse files
authored
refactor(sidebar): convert to TS (#1106)
* refactor(sidebar): convert to TS * refactor(sidebar): missing opt * refactor(sidebar): missing doc * chore(sidebar): clean up unused code
1 parent 97b24b7 commit 2b0fa1d

File tree

23 files changed

+212
-189
lines changed

23 files changed

+212
-189
lines changed

src/components/Input/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@ type TProps = {
3333
disabled?: boolean
3434
autoFocus?: boolean
3535

36+
onFocus?: (e) => void | null
3637
onChange?: (e) => void | null
3738
}
3839

3940
const Input: FC<TProps> = ({
4041
behavior = 'default',
4142
onChange = null,
43+
onFocus = null,
4244
prefixIcon = null,
4345
prefixActive = false,
4446
suffixIcon = null,
@@ -47,6 +49,7 @@ const Input: FC<TProps> = ({
4749
...restProps
4850
}) => {
4951
const handleOnChange = useCallback((e) => onChange && onChange(e), [onChange])
52+
const handleOnFocus = useCallback((e) => onFocus && onFocus(e), [onFocus])
5053
const validProps = pickBy((v) => v !== null, restProps)
5154

5255
return behavior === 'default' ? (
@@ -56,6 +59,7 @@ const Input: FC<TProps> = ({
5659
</PrefixWrapper>
5760
<InputWrapper
5861
onChange={handleOnChange}
62+
onFocus={handleOnFocus}
5963
spellcheck="false"
6064
// prefix={false}
6165
hasPrefix={!nilOrEmpty(prefixIcon)}

src/components/TabBar/spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ReactNode } from 'react'
22

33
export type TTabItem = {
44
title?: string
5-
raw?: string
5+
raw: string
66
alias?: string
77
icon?: string | ReactNode
88
localIcon?: string

src/containers/unit/Sidebar/Footer.js renamed to src/containers/unit/Sidebar/Footer.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import { FC, memo } from 'react'
22

33
import { ICON_CMD, ISSUE_ADDR } from '@/config'
44

@@ -17,10 +17,15 @@ import {
1717

1818
import { sortBtnOnClick } from './logic'
1919

20-
const Footer = ({ pin, sortOptActive }) => {
20+
type TProps = {
21+
pin: boolean
22+
sortOptActive: boolean
23+
}
24+
25+
const Footer: FC<TProps> = ({ pin, sortOptActive }) => {
2126
return (
22-
<Wrapper pin={pin}>
23-
<InnerWrapper pin={pin}>
27+
<Wrapper>
28+
<InnerWrapper>
2429
<OptionWrapper pin={pin}>
2530
<OptionItem active={sortOptActive} onClick={() => sortBtnOnClick()}>
2631
<OptionIcon src={`${ICON_CMD}/sidebar_drag.svg`} />
@@ -42,4 +47,4 @@ const Footer = ({ pin, sortOptActive }) => {
4247
)
4348
}
4449

45-
export default React.memo(Footer)
50+
export default memo(Footer)

src/containers/unit/Sidebar/Header.js renamed to src/containers/unit/Sidebar/Header.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import { FC, memo } from 'react'
22

33
import { ICON } from '@/config'
44

@@ -15,12 +15,17 @@ import {
1515
} from './styles/header'
1616
import { searchOnFocus, searchCommunityValueOnChange, setPin } from './logic'
1717

18-
const Header = ({ pin, searchCommunityValue }) => (
19-
<Wrapper pin={pin}>
18+
type TProps = {
19+
pin: boolean
20+
searchCommunityValue: string
21+
}
22+
23+
const Header: FC<TProps> = ({ pin, searchCommunityValue }) => (
24+
<Wrapper>
2025
<InnerWrapper>
2126
{!pin ? (
2227
<HeaderFuncs>
23-
<MenuWrapper pin={pin} onClick={setPin}>
28+
<MenuWrapper onClick={setPin}>
2429
<MenuLogo src={`${ICON}/sidebar-menu.svg`} pin={pin} />
2530
</MenuWrapper>
2631
</HeaderFuncs>
@@ -37,7 +42,7 @@ const Header = ({ pin, searchCommunityValue }) => (
3742
/>
3843
</SearchContent>
3944
</SearchWrapper>
40-
<MenuWrapper pin={pin} onClick={setPin}>
45+
<MenuWrapper onClick={setPin}>
4146
<MenuLogo src={`${ICON}/sidebar-menu.svg`} pin={pin} />
4247
</MenuWrapper>
4348
</HeaderFuncs>
@@ -46,4 +51,4 @@ const Header = ({ pin, searchCommunityValue }) => (
4651
</Wrapper>
4752
)
4853

49-
export default React.memo(Header)
54+
export default memo(Header)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import React from 'react'
1+
import { FC, memo } from 'react'
22

33
import { range } from 'ramda'
44
import { Wrapper, Block } from './styles/loading_blocks'
55

6-
const LoadingBlocks = () => {
6+
const LoadingBlocks: FC = () => {
77
return (
88
<Wrapper>
99
{range(0, 14).map((num) => (
@@ -13,4 +13,4 @@ const LoadingBlocks = () => {
1313
)
1414
}
1515

16-
export default React.memo(LoadingBlocks)
16+
export default memo(LoadingBlocks)
Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import React, { useCallback } from 'react'
1+
import { FC, memo, useCallback } from 'react'
22
import { toLower } from 'ramda'
33

4+
import type { TCommunity } from '@/spec'
45
import { ICON_CMD } from '@/config'
5-
// import { uid } from '@/utils'
66

77
import TrendLine from '@/components/TrendLine'
88

@@ -19,44 +19,42 @@ import {
1919

2020
import { onCommunitySelect } from '../logic'
2121

22-
const MenuBar = ({ pin, sortOptActive, item, activeRaw, forceRerender }) => {
23-
const handleSelect = useCallback(() => {
24-
onCommunitySelect(item)
25-
}, [item])
22+
type TProps = {
23+
item: TCommunity
24+
pin: boolean
25+
sortOptActive?: boolean
26+
activeRaw: string
27+
}
28+
29+
const MenuBar: FC<TProps> = ({
30+
pin,
31+
sortOptActive = false,
32+
item,
33+
activeRaw,
34+
}) => {
35+
const handleSelect = useCallback(() => onCommunitySelect(item), [item])
2636

2737
return (
2838
<Wrapper onClick={handleSelect}>
29-
<ActiveBar
30-
pin={pin}
31-
active={!sortOptActive && activeRaw === toLower(item.raw)}
32-
/>
39+
<ActiveBar active={!sortOptActive && activeRaw === toLower(item.raw)} />
3340
<DragIcon src={`${ICON_CMD}/drag.svg`} show={sortOptActive} />
3441
<MenuItemBar>
35-
<MenuRow
36-
pin={pin}
37-
sortOptActive={sortOptActive}
38-
active={!sortOptActive && activeRaw === toLower(item.raw)}
39-
>
42+
<MenuRow sortOptActive={sortOptActive}>
4043
<MenuItemIcon
4144
key={item.raw}
4245
active={activeRaw === toLower(item.raw)}
4346
raw={item.raw}
4447
src={item.logo}
4548
/>
4649
{/* eslint-disable jsx-a11y/anchor-is-valid */}
47-
<MenuItemTitle
48-
pin={pin}
49-
active={activeRaw === toLower(item.raw)}
50-
forceRerender={forceRerender}
51-
>
50+
<MenuItemTitle pin={pin} active={activeRaw === toLower(item.raw)}>
5251
{item.title}
5352
</MenuItemTitle>
5453

5554
<MiniChartWrapper pin={pin}>
5655
<TrendLine
5756
key={item.raw}
5857
data={item.contributesDigest}
59-
duration={300}
6058
radius={15}
6159
width={7}
6260
/>
@@ -67,4 +65,4 @@ const MenuBar = ({ pin, sortOptActive, item, activeRaw, forceRerender }) => {
6765
)
6866
}
6967

70-
export default React.memo(MenuBar)
68+
export default memo(MenuBar)
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
1-
import React from 'react'
1+
import { FC, memo } from 'react'
22

3+
import type { TCommunity } from '@/spec'
34
import CustomScroller from '@/components/CustomScroller'
45
import MenuBar from './MenuBar'
56

6-
const NormalMenuList = ({ communities, pin, activeRaw, forceRerender }) => {
7+
type TProps = {
8+
communities: TCommunity[]
9+
pin: boolean
10+
activeRaw: string
11+
}
12+
13+
const NormalMenuList: FC<TProps> = ({ communities, pin, activeRaw }) => {
714
const scrollHeight = !pin ? 'calc(100vh - 88px)' : 'calc(100vh - 140px)'
8-
const barSize = !pin ? 'none' : 'small'
915

1016
return (
1117
<CustomScroller
1218
direction="vertical"
1319
height={scrollHeight}
14-
barSize={barSize}
20+
barSize="small"
1521
withBorder
1622
autoHide
1723
>
1824
<div>
1925
{communities.map((item) => (
20-
<MenuBar
21-
key={item.raw}
22-
pin={pin}
23-
item={item}
24-
activeRaw={activeRaw}
25-
forceRerender={forceRerender}
26-
/>
26+
<MenuBar key={item.raw} pin={pin} item={item} activeRaw={activeRaw} />
2727
))}
2828
<br />
2929
</div>
3030
</CustomScroller>
3131
)
3232
}
3333

34-
export default React.memo(NormalMenuList)
34+
export default memo(NormalMenuList)

src/containers/unit/Sidebar/MenuList/SortableMenuList.js

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { ComponentClass } from 'react'
2+
import {
3+
SortableContainer,
4+
SortableElement,
5+
SortableElementProps,
6+
SortableContainerProps,
7+
} from 'react-sortable-hoc'
8+
9+
import type { TCommunity } from '@/spec'
10+
import CustomScroller from '@/components/CustomScroller'
11+
import MenuBar from './MenuBar'
12+
13+
type TMenuBar = {
14+
item: TCommunity
15+
pin: boolean
16+
activeRaw: string
17+
sortOptActive: boolean
18+
} & SortableElementProps
19+
20+
const SortableMenuBar: ComponentClass<TMenuBar> = SortableElement(
21+
({ pin, sortOptActive, item, activeRaw }) => {
22+
return (
23+
<MenuBar
24+
pin={pin}
25+
sortOptActive={sortOptActive}
26+
item={item}
27+
activeRaw={activeRaw}
28+
/>
29+
)
30+
},
31+
)
32+
33+
type TProps = {
34+
communities: TCommunity[]
35+
pin: boolean
36+
activeRaw: string
37+
sortOptActive: boolean
38+
// see: https://github.com/clauderic/react-sortable-hoc/blob/master/types/index.d.ts
39+
} & SortableContainerProps
40+
41+
const SortableMenuList: ComponentClass<TProps> = SortableContainer(
42+
({ communities, pin, sortOptActive, activeRaw }) => {
43+
return (
44+
<CustomScroller direction="vertical" height="84vh" withBorder autoHide>
45+
<div>
46+
{communities.map((item: TCommunity, index: number) => (
47+
<SortableMenuBar
48+
index={index}
49+
key={item.raw}
50+
pin={pin}
51+
sortOptActive={sortOptActive}
52+
item={item}
53+
activeRaw={activeRaw}
54+
/>
55+
))}
56+
<br />
57+
</div>
58+
</CustomScroller>
59+
)
60+
},
61+
)
62+
63+
export default SortableMenuList

0 commit comments

Comments
 (0)