Skip to content

Commit 3cf3379

Browse files
committed
Upgrade typescript and react-spring
1 parent 9a69926 commit 3cf3379

18 files changed

+451
-116
lines changed

package.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"@loadable/babel-plugin": "^5.13.2",
1313
"@loadable/component": "^5.15.0",
1414
"@loadable/server": "^5.15.1",
15+
"@react-spring/web": "^9.4.2",
1516
"@reduxjs/toolkit": "^1.2.2",
1617
"@sentry/browser": "^5.11.1",
1718
"@svgr/webpack": "4.3.3",
@@ -48,8 +49,8 @@
4849
"@types/sanitize-html": "^1.20.2",
4950
"@types/styled-components": "^5.1.21",
5051
"@types/throttle-debounce": "^2.1.0",
51-
"@typescript-eslint/eslint-plugin": "^2.8.0",
52-
"@typescript-eslint/parser": "^2.8.0",
52+
"@typescript-eslint/eslint-plugin": "^4.1.1",
53+
"@typescript-eslint/parser": "^4.1.1",
5354
"apollo-boost": "^0.4.7",
5455
"apollo-link": "^1.2.13",
5556
"aws-lambda": "^1.0.4",
@@ -119,7 +120,7 @@
119120
"react-outside-click-handler": "^1.3.0",
120121
"react-redux": "^7.1.3",
121122
"react-router-dom": "^5.1.2",
122-
"react-spring": "^8.0.27",
123+
"react-spring": "^9.4.2",
123124
"react-textarea-autosize": "^7.1.2",
124125
"react-toastify": "^5.5.0",
125126
"react-use": "^13.12.2",
@@ -150,7 +151,7 @@
150151
"throttle-debounce": "^2.1.0",
151152
"ts-pnp": "1.1.5",
152153
"typesafe-actions": "^5.1.0",
153-
"typescript": "~3.7.2",
154+
"typescript": "^4.5.5",
154155
"unist-util-visit": "^2.0.1",
155156
"url-loader": "2.3.0",
156157
"webpack": "4.41.2",

src/components/base/Header.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Link } from 'react-router-dom';
1111
import media from '../../lib/styles/media';
1212
import HeaderLogo from './HeaderLogo';
1313
import { themedPalette } from '../../lib/styles/themes';
14+
import ThemeToggleButton from './ThemeToggleButton';
1415

1516
export type MainHeaderProps = {};
1617

@@ -43,6 +44,7 @@ function Header(props: MainHeaderProps) {
4344

4445
{user ? (
4546
<Right>
47+
<ThemeToggleButton />
4648
<SearchButton to={urlForSearch}>
4749
<SearchIcon2 />
4850
</SearchButton>
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React, { useState } from 'react';
2+
import styled from 'styled-components';
3+
import { themedPalette } from '../../lib/styles/themes';
4+
import { MoonIcon } from '../../static/svg';
5+
6+
interface Props {}
7+
8+
function ThemeToggleButton(props: Props) {
9+
const [theme, setTheme] = useState('light');
10+
11+
return (
12+
<IconButton>
13+
<MoonIcon />
14+
</IconButton>
15+
);
16+
}
17+
18+
const IconButton = styled.button`
19+
background: none;
20+
border: none;
21+
cursor: pointer;
22+
border-radius: 50%;
23+
width: 2.5rem;
24+
height: 2.5rem;
25+
margin-right: 0.75rem;
26+
color: white;
27+
28+
&:hover {
29+
background: ${themedPalette.slight_layer};
30+
}
31+
`;
32+
33+
export default ThemeToggleButton;

src/components/home/HomeMobileHeadExtra.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export type MainMobileHeadExtraProps = {
1212
};
1313

1414
function MainMobileHeadExtra({ visible, onClose }: MainMobileHeadExtraProps) {
15-
const transition = useTransition(visible, null, {
15+
const transition = useTransition(visible, {
1616
from: {
1717
opacity: 0,
1818
transform: 'scale(0.8)',
@@ -33,11 +33,11 @@ function MainMobileHeadExtra({ visible, onClose }: MainMobileHeadExtraProps) {
3333

3434
return (
3535
<>
36-
{transition.map(({ item, key, props }) =>
36+
{transition((styles, item) =>
3737
item ? (
38-
<Aligner key={key}>
39-
<OutsideClickHandler onOutsideClick={onClose} key={key}>
40-
<Block style={props}>
38+
<Aligner>
39+
<OutsideClickHandler onOutsideClick={onClose}>
40+
<Block style={styles}>
4141
<ul>
4242
<li>
4343
<Link to="/@velog">공지사항</Link>

src/components/home/TimeframePicker.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export type TimeframePickerProps = {
1313
};
1414

1515
function TimeframePicker({ visible, onClose }: TimeframePickerProps) {
16-
const transition = useTransition(visible, null, {
16+
const transition = useTransition(visible, {
1717
from: {
1818
opacity: 0,
1919
transform: 'scale(0.8)',
@@ -36,11 +36,11 @@ function TimeframePicker({ visible, onClose }: TimeframePickerProps) {
3636

3737
return (
3838
<>
39-
{transition.map(({ item, key, props }) =>
39+
{transition((styles, item) =>
4040
item ? (
41-
<Aligner key={key}>
42-
<OutsideClickHandler onOutsideClick={onClose} key={key}>
43-
<Block style={props} onClick={onClose}>
41+
<Aligner>
42+
<OutsideClickHandler onOutsideClick={onClose}>
43+
<Block style={styles} onClick={onClose}>
4444
<ul>
4545
{timeframes.map(([value, text]) => (
4646
<li

src/components/write/TagInput.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ const TagInput: React.FC<TagInputProps> = ({ onChange, tags: initialTags }) => {
117117
};
118118

119119
function Help({ focus }: { focus: boolean }) {
120-
const transitions = useTransition(focus, null, {
120+
const transitions = useTransition(focus, {
121121
from: { opacity: 0, transform: 'translateY(-1rem)' },
122122
enter: { opacity: 1, transform: 'translateY(0rem)' },
123123
leave: { opacity: 0, transform: 'translateY(-1rem)' },
@@ -129,9 +129,9 @@ function Help({ focus }: { focus: boolean }) {
129129

130130
return (
131131
<HelpBlock>
132-
{transitions.map(({ item, key, props }) =>
132+
{transitions((styles, item) =>
133133
item ? (
134-
<animated.div className="inside" style={props} key={key}>
134+
<animated.div className="inside" style={styles}>
135135
쉼표 혹은 엔터를 입력하여 태그를 등록 할 수 있습니다.
136136
<br />
137137
등록된 태그를 클릭하면 삭제됩니다.

src/containers/register/RegisterFormContainer.tsx

+7-8
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ const RegisterFormContainer: React.FC<RegisterFormContainerProps> = ({
3434
null,
3535
);
3636

37-
const [onGetRegisterToken, , registerToken] = useRequest<
38-
GetRegisterTokenResponse
39-
>((code: string) => getRegisterToken(code));
37+
const [onGetRegisterToken, , registerToken] =
38+
useRequest<GetRegisterTokenResponse>((code: string) =>
39+
getRegisterToken(code),
40+
);
4041

4142
const [onLocalRegister] = useRequest<AuthResponse>(localEmailRegister);
4243

@@ -79,9 +80,7 @@ const RegisterFormContainer: React.FC<RegisterFormContainerProps> = ({
7980
},
8081
shortBio: (text: string) => {
8182
if (text.length > 140) {
82-
return `한 줄 소개는 140자 미만으로 입력해주세요. (현재 ${
83-
text.length
84-
}자)`;
83+
return `한 줄 소개는 140자 미만으로 입력해주세요. (현재 ${text.length}자)`;
8584
}
8685
},
8786
};
@@ -100,7 +99,7 @@ const RegisterFormContainer: React.FC<RegisterFormContainerProps> = ({
10099
try {
101100
if (query.code) {
102101
// local email register
103-
const formWithoutEmail = { ...form };
102+
const formWithoutEmail = { ...form } as Partial<RegisterFormType>;
104103
delete formWithoutEmail.email;
105104
await onLocalRegister({
106105
registerToken: registerToken && registerToken.register_token,
@@ -115,7 +114,7 @@ const RegisterFormContainer: React.FC<RegisterFormContainerProps> = ({
115114
});
116115
}
117116
} catch (e) {
118-
if (e.response.status === 409) {
117+
if ((e as any).response.status === 409) {
119118
setError('이미 존재하는 아이디입니다.');
120119
return;
121120
}

src/containers/write/PublishSeriesConfig.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { toast } from 'react-toastify';
1919

2020
export interface PublishSeriesConfigProps {}
2121

22-
const PublishSeriesConfig: React.FC<PublishSeriesConfigProps> = props => {
22+
const PublishSeriesConfig: React.FC<PublishSeriesConfigProps> = (props) => {
2323
const user = useUser();
2424
const selectedSeries = useSelector(
2525
(state: RootState) => state.write.selectedSeries,
@@ -46,7 +46,7 @@ const PublishSeriesConfig: React.FC<PublishSeriesConfigProps> = props => {
4646
if (dateA > dateB) return 1;
4747
return 0;
4848
})
49-
.map(series => ({
49+
.map((series) => ({
5050
id: series.id,
5151
text: series.name,
5252
}));
@@ -83,7 +83,7 @@ const PublishSeriesConfig: React.FC<PublishSeriesConfigProps> = props => {
8383
const lastItem = items.item(items.length - 1);
8484
lastItem.scrollIntoView();
8585
} catch (e) {
86-
if ((e?.message as string).includes('URL Slug already exists')) {
86+
if (((e as any)?.message as string).includes('URL Slug already exists')) {
8787
toast.error('이미 존재하는 URL입니다.');
8888
return;
8989
}
@@ -98,7 +98,7 @@ const PublishSeriesConfig: React.FC<PublishSeriesConfigProps> = props => {
9898
const onConfirm = () => {
9999
if (!seriesList.data || !seriesList.data.seriesList) return;
100100
const selectedSeries = seriesList.data.seriesList.find(
101-
series => series.id === selectedId,
101+
(series) => series.id === selectedId,
102102
);
103103
if (!selectedSeries || !selectedId) return;
104104
dispatch(

src/lib/detectIOS.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ export default function detectIOS() {
33

44
// checkAgent for Chrome Developer Menu
55
const checkAgent =
6-
/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
6+
/iPad|iPhone|iPod/.test(navigator.userAgent) && !(window as any).MSStream;
77

88
const checkPlatform =
99
(/iPad|iPhone|iPod/.test(navigator.platform) ||
1010
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&
11-
!window.MSStream;
11+
!(window as any).MSStream;
1212

1313
return checkAgent || checkPlatform;
1414
}

src/lib/hooks/useRequest.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type UseRequestReturnType<R> = [
88
boolean,
99
R | null,
1010
Error | null,
11-
() => void
11+
() => void,
1212
];
1313

1414
export default function useRequest<R = any>(
@@ -25,7 +25,7 @@ export default function useRequest<R = any>(
2525
const response = await promiseCreator(...params);
2626
setData(response.data);
2727
} catch (e) {
28-
setError(e);
28+
setError(e as any);
2929
throw e;
3030
}
3131
setLoading(false);

src/lib/hooks/useS3Upload.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ const useS3Upload = () => {
3737
headers: {
3838
'Content-Type': file.type,
3939
},
40-
onUploadProgress: e => {
40+
onUploadProgress: (e) => {
4141
console.log(Math.round((e.loaded / e.total) * 100));
4242
setProgress(Math.round((e.loaded / e.total) * 100));
4343
},
4444
});
4545
setImage(image_path);
4646
return image_path;
4747
} catch (e) {
48-
setError(e);
48+
setError(e as any);
4949
}
5050
},
5151
[setProgress],
@@ -54,7 +54,7 @@ const useS3Upload = () => {
5454
return [s3Upload, image, error] as [
5555
typeof s3Upload,
5656
typeof image,
57-
typeof error
57+
typeof error,
5858
];
5959
};
6060

src/lib/utils.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ export function safe<T>(callback: () => T) {
8686
}
8787

8888
export function sleep(ms: number) {
89-
return new Promise(resolve => setTimeout(resolve, ms));
89+
return new Promise((resolve) => setTimeout(resolve, ms));
9090
}
9191

9292
export function loadScript(url: string) {
9393
return new Promise((resolve, reject) => {
9494
const script = document.createElement('script');
9595
script.onload = function onload() {
96-
resolve();
96+
resolve(null);
9797
};
9898
script.onerror = function onerror() {
9999
reject();

src/lib/waitUntil.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const waitUntil = (
2929

3030
const check = () => {
3131
if (conditionCallback()) {
32-
return resolve();
32+
return resolve(null);
3333
}
3434
timeoutId = setTimeout(check, interval);
3535
};

src/server/serverRender.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ const serverRender = async ({ url, loggedIn, cookie }: SSROption) => {
101101
);
102102
if (notFound) store.dispatch(error.actions.showNotFound());
103103
}
104-
console.log(e.name);
105-
console.log(e.message);
104+
console.log((e as any).name);
105+
console.log((e as any).message);
106106
console.log(JSON.stringify(e));
107107
}
108108

src/server/ssrMiddleware.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const ssrMiddleware: Middleware = async (ctx, next) => {
1616
ctx.body = result.html;
1717
ctx.status = result.statusCode;
1818
} catch (e) {
19-
ctx.throw(500, e);
19+
ctx.throw(500, e as any);
2020
}
2121
};
2222

src/static/svg/icon-moon.svg

+3
Loading

src/static/svg/icon-sun.svg

+1
Loading

0 commit comments

Comments
 (0)