Skip to content

Commit 26dc76d

Browse files
committed
Merge branch 'master' into develop
2 parents c0f4dca + 72f1ca3 commit 26dc76d

11 files changed

+63
-14
lines changed

src/components/base/HeaderUserIcon.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { CurrentUser } from '../../lib/graphql/user';
44
import { MdArrowDropDown } from 'react-icons/md';
55
import { userThumbnail } from '../../static/images';
66
import palette from '../../lib/styles/palette';
7+
import optimizeImage from '../../lib/optimizeImage';
78

89
const HeaderUserIconBlock = styled.div`
910
cursor: pointer;
@@ -44,7 +45,10 @@ export interface HeaderUserIconProps {
4445
const HeaderUserIcon: React.FC<HeaderUserIconProps> = ({ onClick, user }) => {
4546
return (
4647
<HeaderUserIconBlock onClick={onClick}>
47-
<img src={user.profile.thumbnail || userThumbnail} alt="thumbnail" />
48+
<img
49+
src={optimizeImage(user.profile.thumbnail || userThumbnail, 120)}
50+
alt="thumbnail"
51+
/>
4852
<MdArrowDropDown />
4953
</HeaderUserIconBlock>
5054
);

src/components/common/PostCard.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import SkeletonTexts from './SkeletonTexts';
1212
import RatioImage from './RatioImage';
1313
import media from '../../lib/styles/media';
1414
import PrivatePostLabel from './PrivatePostLabel';
15+
import optimizeImage from '../../lib/optimizeImage';
1516

1617
const PostCardBlock = styled.div`
1718
padding-top: 4rem;
@@ -149,7 +150,10 @@ const PostCard = ({ post, hideUser }: PostCardProps) => {
149150
<div className="user-info">
150151
<Link to={velogUrl}>
151152
<img
152-
src={post.user.profile.thumbnail || userThumbnail}
153+
src={optimizeImage(
154+
post.user.profile.thumbnail || userThumbnail,
155+
120,
156+
)}
153157
alt="thumbnail"
154158
/>
155159
</Link>
@@ -161,7 +165,7 @@ const PostCard = ({ post, hideUser }: PostCardProps) => {
161165
{post.thumbnail && (
162166
<Link to={url}>
163167
<RatioImage
164-
src={post.thumbnail}
168+
src={optimizeImage(post.thumbnail, 768)}
165169
alt="post-thumbnail"
166170
widthRatio={1.91}
167171
heightRatio={1}

src/components/common/UserProfile.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Skeleton from './Skeleton';
1414
import SkeletonTexts from './SkeletonTexts';
1515
import { Link } from 'react-router-dom';
1616
import media from '../../lib/styles/media';
17+
import optimizeImage from '../../lib/optimizeImage';
1718

1819
const UserProfileBlock = styled.div`
1920
${media.medium} {
@@ -164,7 +165,10 @@ const UserProfile: React.FC<UserProfileProps> = ({
164165
<UserProfileBlock className={className} style={style}>
165166
<Section>
166167
<Link to={velogUrl}>
167-
<img src={thumbnail || userThumbnail} alt="profile" />
168+
<img
169+
src={optimizeImage(thumbnail || userThumbnail, 240)}
170+
alt="profile"
171+
/>
168172
</Link>
169173
<UserInfo>
170174
<div className="name">

src/components/post/PostCommentItem.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import PostEditComment from '../../containers/post/PostEditComment';
1212
import media from '../../lib/styles/media';
1313
import { Link } from 'react-router-dom';
1414
import MarkdownRender from '../common/MarkdownRender';
15+
import optimizeImage from '../../lib/optimizeImage';
1516

1617
const PostCommentItemBlock = styled.div`
1718
padding-top: 1.5rem;
@@ -166,7 +167,10 @@ const PostCommentItem: React.FC<PostCommentItemProps> = ({
166167
<div className="profile">
167168
<Link to={velogLink}>
168169
<img
169-
src={(user && user.profile.thumbnail) || userThumbnail}
170+
src={optimizeImage(
171+
(user && user.profile.thumbnail) || userThumbnail,
172+
120,
173+
)}
170174
alt="comment-user-thumbnail"
171175
/>
172176
</Link>

src/components/post/PostContent.tsx

+23-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useState, useEffect, useMemo } from 'react';
22
import styled from 'styled-components';
33
import MarkdownRender from '../common/MarkdownRender';
44
import PostHtmlContent from './PostHtmlContent';
@@ -24,19 +24,40 @@ export interface PostContentProps {
2424
body: string;
2525
}
2626

27+
function optimizeImagesFromPost(markdown: string) {
28+
const matches = markdown.match(
29+
/(?:!\[(.*?)\]\(https:\/\/images.velog.io\/(.*?)\))/g,
30+
);
31+
if (!matches) return markdown;
32+
const replacers = matches.map(match => [
33+
match,
34+
match.replace('https://images.', 'https://img.').replace(/\)$/, '?w=1024)'),
35+
]);
36+
return replacers.reduce((acc, [original, optimized]) => {
37+
return acc.replace(original, optimized);
38+
}, markdown);
39+
}
40+
2741
const PostContent: React.FC<PostContentProps> = ({ isMarkdown, body }) => {
2842
const [html, setHtml] = useState(isMarkdown ? null : body);
2943
const dispatch = usePostViewerDispatch();
44+
const imageOptimizedPost = useMemo(() => optimizeImagesFromPost(body), [
45+
body,
46+
]);
3047

3148
useEffect(() => {
3249
if (!html) return;
3350
const toc = parseHeadings(html);
3451
dispatch({ type: 'SET_TOC', payload: toc });
3552
}, [dispatch, html]);
53+
3654
return (
3755
<PostContentBlock>
3856
{isMarkdown ? (
39-
<MarkdownRender markdown={body} onConvertFinish={setHtml} />
57+
<MarkdownRender
58+
markdown={imageOptimizedPost}
59+
onConvertFinish={setHtml}
60+
/>
4061
) : (
4162
<PostHtmlContent html={body} />
4263
)}

src/components/post/PostHead.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import TagList from '../common/TagList';
1212
import { Link } from 'react-router-dom';
1313
import { LockIcon } from '../../static/svg';
1414
import PrivatePostLabel from '../common/PrivatePostLabel';
15+
import optimizeImage from '../../lib/optimizeImage';
1516

1617
const PostHeadBlock = styled(VelogResponsive)`
1718
margin-top: 5.5rem;
@@ -194,7 +195,7 @@ const PostHead: React.FC<PostHeadProps> = ({
194195
)}
195196
</div>
196197
{!hideThumbnail && thumbnail && (
197-
<Thumbnail src={thumbnail} alt="post-thumbnail" />
198+
<Thumbnail src={optimizeImage(thumbnail, 1024)} alt="post-thumbnail" />
198199
)}
199200
<PopupOKCancel
200201
visible={askRemove}

src/components/setting/SettingUserProfile.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useToggle from '../../lib/hooks/useToggle';
88
import SettingInput from './SettingInput';
99
import useInputs from '../../lib/hooks/useInputs';
1010
import media from '../../lib/styles/media';
11+
import optimizeImage from '../../lib/optimizeImage';
1112

1213
export type SettingUserProfileProps = {
1314
onUpload: () => void;
@@ -40,7 +41,10 @@ function SettingUserProfile({
4041
return (
4142
<Section>
4243
<div className="thumbnail-area">
43-
<img src={thumbnail || userThumbnail} alt="profile" />
44+
<img
45+
src={optimizeImage(thumbnail || userThumbnail, 400)}
46+
alt="profile"
47+
/>
4448
<Button onClick={onUpload}>이미지 업로드</Button>
4549
<Button color="transparent" onClick={onClearThumbnail}>
4650
이미지 제거

src/components/velog/SeriesItem.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import PlainLink from '../common/PlainLink';
99
import Skeleton from '../common/Skeleton';
1010
import SkeletonTexts from '../common/SkeletonTexts';
1111
import media from '../../lib/styles/media';
12+
import optimizeImage from '../../lib/optimizeImage';
1213

1314
const StyledLink = styled(PlainLink)`
1415
display: block;
@@ -84,7 +85,7 @@ const SeriesItem: React.FC<SeriesItemProps> = ({
8485
<SeriesItemBlock>
8586
<StyledLink to={url}>
8687
<RatioImage
87-
src={thumbnail || seriesThumbnail}
88+
src={optimizeImage(thumbnail || seriesThumbnail, 768)}
8889
widthRatio={1.9}
8990
heightRatio={1}
9091
/>

src/components/velog/SeriesPostItem.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import PostLink from '../common/PostLink';
77
import SkeletonTexts from '../common/SkeletonTexts';
88
import Skeleton from '../common/Skeleton';
99
import media from '../../lib/styles/media';
10+
import optimizeImage from '../../lib/optimizeImage';
1011

1112
const SeriesPostItemBlock = styled.div<{ edit?: boolean }>`
1213
/* font-family: 'Spoqa Han Sans', -apple-system, BlinkMacSystemFont,
@@ -142,11 +143,14 @@ const SeriesPostItem: React.FC<SeriesPostItemProps> = ({
142143
</h2>
143144
<section>
144145
{edit ? (
145-
<img src={thumbnail || emptyThumbnail} alt="post-thumbnail" />
146+
<img
147+
src={optimizeImage(thumbnail || emptyThumbnail, 768)}
148+
alt="post-thumbnail"
149+
/>
146150
) : (
147151
<PostLink username={username} urlSlug={urlSlug}>
148152
<img
149-
src={thumbnail || emptyThumbnail}
153+
src={optimizeImage(thumbnail || emptyThumbnail, 768)}
150154
alt="post-thumbnail"
151155
className={thumbnail ? '' : 'empty-thumbnail'}
152156
/>

src/containers/main/TrendingPosts.tsx

-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ const TrendingPosts: React.FC<TrendingPostsProps> = props => {
4242
post => !idMap[post.id],
4343
);
4444

45-
console.log(uniquePosts);
46-
4745
return {
4846
trendingPosts: [...prev.trendingPosts, ...uniquePosts],
4947
};

src/lib/optimizeImage.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default function optimizeImage(url: string, width: number) {
2+
if (!url.includes('https://images.velog.io')) return url;
3+
return url.replace('://images', '://img').concat(`?w=${width}`);
4+
}

0 commit comments

Comments
 (0)