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

Commit 5ae49dc

Browse files
authored
refactor: new oss upload (#1185)
* refactor(uploader): use new FC version * refactor(user-profile): banner pad align adjust * refactor(oss-uploader): add upload icon effect * refactor(oss uploader): add turbo loading effect * refactor(oss-uploader): user avatar works * refactor(works-editor): cover done
1 parent 9fbfee0 commit 5ae49dc

File tree

32 files changed

+1650
-427
lines changed

32 files changed

+1650
-427
lines changed

package-lock.json

Lines changed: 1307 additions & 26 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
"@tippyjs/react": "4.2.5",
5151
"@zeit/next-source-maps": "0.0.4-canary.1",
5252
"accepts": "^1.3.4",
53+
"ali-oss": "^5.3.2",
5354
"babel-plugin-add-react-displayname": "^0.0.5",
5455
"babel-plugin-styled-components": "^1.12.0",
5556
"cacheable-response": "^2.0.9",

src/containers/digest/ArticleDigest/DesktopView/WorksLayout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ const WorksLayout: FC<TProps> = ({ metric = METRIC.ARTICLE, article, tab }) => {
5151
<Fragment>
5252
<Main metric={metric}>
5353
<WorksWrapper>
54-
<Cover src="https://avatars.githubusercontent.com/u/2041385?s=64&v=4" />
54+
<Cover src={article.cover} />
5555
<Intro>
5656
<Title>
5757
<WorkName>{title}</WorkName>

src/containers/editor/AccountEditor/index.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import { closeDrawer } from '@/utils/helper'
1212

1313
import SubmitButton from '@/widgets/Buttons/SubmitButton'
1414
import Tooltip from '@/widgets/Tooltip'
15-
import { Divider, SpaceGrow } from '@/widgets/Common'
15+
import { Divider, SpaceGrow, Br } from '@/widgets/Common'
16+
import OSSUploader from '@/widgets/OSSUploader'
1617

1718
import SexInputer from './SexInputer'
1819
import SocialInputer from './SocialInputer'
@@ -52,7 +53,12 @@ const AccountEditorContainer: FC<TProps> = ({ accountEditor: store }) => {
5253

5354
return (
5455
<Wrapper className="normal-form">
55-
{profile.avatar && <AvatarPic src={profile.avatar} />}
56+
<OSSUploader onUploadDone={(url) => inputOnChange(url, 'avatar')}>
57+
{profile.avatar && <AvatarPic src={profile.avatar} />}
58+
</OSSUploader>
59+
60+
<Br bottom={50} />
61+
5662
<FormsWrapper>
5763
<LoginSection>
5864
<Label>登入名称</Label>

src/containers/editor/AccountEditor/styles/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ export const AvatarPic = styled(Img)`
2525
border-radius: 42%;
2626
border: 4px solid;
2727
border-color: #043443;
28-
margin-bottom: 50px;
2928
margin-left: -5px;
3029
`
3130
export const FormsWrapper = styled.div`

src/containers/editor/WorksEditor/Content/BasicInfoPart/CoverUploader.tsx

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,38 @@
11
import { FC, memo } from 'react'
22

3-
import { ICON } from '@/config'
3+
import OSSUploader from '@/widgets/OSSUploader'
4+
import { nilOrEmpty } from '@/utils/validator'
45

56
import {
67
Wrapper,
7-
IntroImgHolder,
8+
HolderWrapper,
89
HolderIcon,
10+
RealCover,
911
Section,
1012
Title,
1113
Desc,
1214
} from '../../styles/content/basic_info_part/cover_uploader'
15+
import { inputOnChange } from '../../logic'
1316

14-
const CoverUploader: FC = () => {
17+
type TProps = {
18+
cover?: string | null
19+
}
20+
21+
const CoverUploader: FC<TProps> = ({ cover }) => {
1522
return (
1623
<Wrapper>
17-
<IntroImgHolder>
18-
<HolderIcon src={`${ICON}/shape/add-square.svg`} />
19-
</IntroImgHolder>
24+
<OSSUploader onUploadDone={(url) => inputOnChange(url, 'cover')}>
25+
{nilOrEmpty(cover) ? (
26+
<HolderWrapper>
27+
<HolderIcon />
28+
</HolderWrapper>
29+
) : (
30+
<RealCover src={cover} />
31+
)}
32+
</OSSUploader>
2033
<Section>
21-
<Title>介绍图片</Title>
22-
<Desc>上传图片或输入图片URL,请确保图片比例为 1:1,上限 300 KB</Desc>
34+
<Title>封面图片</Title>
35+
<Desc>展示图片的比例为 1:1, 最大不超过 300 KB, 支持常见图片格式。</Desc>
2336
</Section>
2437
</Wrapper>
2538
)

src/containers/editor/WorksEditor/Content/BasicInfoPart/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type TProps = {
5757

5858
const BasicInfoPart: FC<TProps> = ({ inputData, socialOptions }) => {
5959
const {
60+
cover,
6061
title,
6162
homeLink,
6263
desc,
@@ -70,7 +71,7 @@ const BasicInfoPart: FC<TProps> = ({ inputData, socialOptions }) => {
7071
return (
7172
<Wrapper>
7273
<Section>
73-
<CoverUploader />
74+
<CoverUploader cover={cover} />
7475
</Section>
7576
<Section>
7677
<Label>主页地址</Label>

src/containers/editor/WorksEditor/schema.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import { P } from '@/schemas'
33

44
const createWorks = gql`
55
mutation (
6+
$cover: String!
67
$title: String!
8+
$homeLink: String!
9+
$desc: String
710
$body: String
811
$communityId: ID!
912
$profitMode: ProfitMode
@@ -15,7 +18,10 @@ const createWorks = gql`
1518
$articleTags: [Id]
1619
) {
1720
createWorks(
21+
cover: $cover
1822
title: $title
23+
desc: $desc
24+
homeLink: $homeLink
1925
body: $body
2026
communityId: $communityId
2127
profitMode: $profitMode
@@ -36,6 +42,7 @@ const updateWorks = gql`
3642
mutation (
3743
$id: ID!
3844
$title: String
45+
$cover: String
3946
$desc: String
4047
$homeLink: String
4148
$body: String
@@ -50,6 +57,7 @@ const updateWorks = gql`
5057
updateWorks(
5158
id: $id
5259
title: $title
60+
cover: $cover
5361
desc: $desc
5462
homeLink: $homeLink
5563
body: $body

src/containers/editor/WorksEditor/spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export type TSocialInfo = {
99

1010
export type TInputData = {
1111
title: string
12+
cover: string
1213
desc: string
1314
body: string
1415
homeLink: string

src/containers/editor/WorksEditor/store.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const WorksEditor = T.model('WorksEditor', {
5050
community: T.optional(Community, {}),
5151

5252
id: T.maybeNull(T.string),
53+
cover: T.maybeNull(T.string),
5354
title: T.maybeNull(T.string),
5455
body: T.optional(T.string, '{}'),
5556
desc: T.optional(T.string, ''),
@@ -90,7 +91,7 @@ const WorksEditor = T.model('WorksEditor', {
9091
get previewData(): TWorks {
9192
const slf = self as TStore
9293
const { techCommunities } = slf
93-
const basic = pick(['title', 'desc'], slf)
94+
const basic = pick(['cover', 'title', 'desc'], slf)
9495

9596
const { lang, framework, database, devOps, design } = techCommunities
9697

@@ -128,7 +129,15 @@ const WorksEditor = T.model('WorksEditor', {
128129
const slf = self as TStore
129130
const { socialInfo, cities, techstacks, teammates, community } = slf
130131
const basic = pick(
131-
['title', 'desc', 'body', 'homeLink', 'profitMode', 'workingMode'],
132+
[
133+
'cover',
134+
'title',
135+
'desc',
136+
'body',
137+
'homeLink',
138+
'profitMode',
139+
'workingMode',
140+
],
132141
slf,
133142
)
134143

@@ -184,9 +193,9 @@ const WorksEditor = T.model('WorksEditor', {
184193
return !nilOrEmpty(self.title)
185194
},
186195
get isBasicInfoValid(): boolean {
187-
const { homeLink, desc } = self
196+
const { cover, homeLink, desc } = self
188197

189-
return !nilOrEmpty(desc) && isURL(homeLink)
198+
return !nilOrEmpty(cover) && !nilOrEmpty(desc) && isURL(homeLink)
190199
},
191200
get isTechStackValid(): boolean {
192201
const slf = self as TStore
@@ -308,6 +317,7 @@ const WorksEditor = T.model('WorksEditor', {
308317

309318
reset(): void {
310319
self.mode = 'publish'
320+
self.cover = null
311321
self.title = ''
312322
self.body = '{}'
313323

src/containers/editor/WorksEditor/styles/content/basic_info_part/cover_uploader.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import Img from '@/Img'
55
import { theme } from '@/utils/themes'
66
import css from '@/utils/css'
77

8+
import WorksHolderSVG from '@/icons/WorksHolder'
9+
810
export const Wrapper = styled.div.attrs(({ testid }: TTestable) => ({
911
'data-test-id': testid,
1012
}))<TTestable>`
@@ -14,21 +16,24 @@ export const Wrapper = styled.div.attrs(({ testid }: TTestable) => ({
1416
padding: 0 10px;
1517
margin-bottom: 20px;
1618
`
17-
export const IntroImgHolder = styled.div`
19+
export const RealCover = styled(Img)`
20+
${css.size(70)};
21+
border-radius: 6px;
22+
`
23+
export const HolderWrapper = styled.div`
1824
${css.size(70)};
1925
${css.flex('align-both')};
20-
border-radius: 5px;
26+
border-radius: 6px;
2127
background-color: #03343f;
22-
cursor: pointer;
2328
`
24-
export const HolderIcon = styled(Img)`
25-
${css.size(30)};
29+
export const HolderIcon = styled(WorksHolderSVG)`
30+
${css.size(48)};
2631
fill: ${theme('thread.articleDigest')};
27-
opacity: 0.4;
32+
opacity: 0.3;
2833
transform: rotate(90deg);
2934
30-
${IntroImgHolder}:hover & {
31-
opacity: 0.6;
35+
${HolderWrapper}:hover & {
36+
opacity: 0;
3237
}
3338
transition: all 0.2s;
3439
`

src/containers/editor/WorksEditor/styles/content/name_part.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export const Input = styled(BaseInput)`
2828
padding: 3px 15px;
2929
height: 45px;
3030
width: calc(100% - 70px);
31-
margin-left: 35px;
3231
font-size: 18px;
3332
margin-top: 10px;
3433
margin-bottom: 6px;

0 commit comments

Comments
 (0)