Skip to content
This repository was archived by the owner on Mar 3, 2020. It is now read-only.

Commit ac5e34e

Browse files
committed
Implements series editing feature
1 parent 148431b commit ac5e34e

File tree

5 files changed

+76
-9
lines changed

5 files changed

+76
-9
lines changed

velog-frontend/src/components/series/SeriesEditor/SeriesEditor.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import './SeriesEditor.scss';
1010

1111
type Props = {
1212
series: SeriesData,
13+
onCancel: () => void,
14+
onUpdate: (data: { name: string, posts: any[] }) => Promise<any>,
1315
};
1416

1517
type State = {
@@ -43,6 +45,17 @@ class SeriesEditor extends Component<Props, State> {
4345
});
4446
};
4547

48+
onSave = () => {
49+
const converted = this.state.tempPosts.map((tp, i) => ({
50+
id: tp.id,
51+
index: i + 1,
52+
}));
53+
this.props.onUpdate({
54+
name: this.state.name,
55+
posts: converted,
56+
});
57+
};
58+
4659
reorder = (oldIndex: number, newIndex: number) => {
4760
const nextPosts = [...this.state.tempPosts];
4861
const temp = nextPosts[oldIndex];
@@ -71,7 +84,7 @@ class SeriesEditor extends Component<Props, State> {
7184
}
7285

7386
render() {
74-
const { series } = this.props;
87+
const { onCancel } = this.props;
7588
return (
7689
<div className="SeriesEditor">
7790
<TextareaAutosize
@@ -81,8 +94,10 @@ class SeriesEditor extends Component<Props, State> {
8194
onKeyPress={this.onKeyPress}
8295
/>
8396
<div className="buttons-wrapper">
84-
<Button cancel>취소</Button>
85-
<Button>적용</Button>
97+
<Button cancel onClick={onCancel}>
98+
취소
99+
</Button>
100+
<Button onClick={this.onSave}>적용</Button>
86101
</div>
87102
<div className="list" ref={this.list}>
88103
{this.state.tempPosts.map(post => (

velog-frontend/src/components/series/SeriesTemplate/SeriesTemplate.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
@import 'utils';
22
.SeriesTemplate {
33
margin-top: 4rem;
4+
margin-bottom: 4rem;
45
color: $oc-gray-9;
56
@include media('<medium') {
67
margin-top: 0;

velog-frontend/src/containers/series/SeriesContainer.js

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,48 @@ type Props = {
1515
} & ContextRouter;
1616

1717
class SeriesContainer extends Component<Props> {
18-
initialize = () => {
18+
initialize = async () => {
1919
const { username, urlSlug } = this.props.match.params;
2020
if (!username || !urlSlug) return;
21-
SeriesActions.getSeries({
22-
username,
23-
urlSlug,
24-
});
21+
try {
22+
await SeriesActions.getSeries({
23+
username,
24+
urlSlug,
25+
});
26+
} catch (e) {
27+
console.log(e);
28+
}
2529
};
2630

2731
enableEditing = () => {
2832
SeriesActions.enableEditing();
2933
};
34+
35+
cancelEditing = () => {
36+
SeriesActions.disableEditing();
37+
};
38+
39+
updateSeries = async (data: { name: string, posts: any[] }) => {
40+
const { username, urlSlug } = this.props.match.params;
41+
if (!username || !urlSlug) return;
42+
try {
43+
await SeriesActions.updateSeries({
44+
username,
45+
urlSlug,
46+
data: {
47+
...data,
48+
description: '',
49+
thumbnail: null,
50+
url_slug: urlSlug,
51+
},
52+
});
53+
await this.initialize();
54+
SeriesActions.disableEditing();
55+
} catch (e) {
56+
console.log(e);
57+
}
58+
};
59+
3060
componentDidMount() {
3161
this.initialize();
3262
}
@@ -38,7 +68,11 @@ class SeriesContainer extends Component<Props> {
3868
return (
3969
<SeriesTemplate user={series.user}>
4070
{editing ? (
41-
<SeriesEditor series={series} />
71+
<SeriesEditor
72+
series={series}
73+
onCancel={this.cancelEditing}
74+
onUpdate={this.updateSeries}
75+
/>
4276
) : (
4377
<SeriesViewer series={series} onEnableEditing={this.enableEditing} />
4478
)}

velog-frontend/src/lib/api/series.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,12 @@ export type GetSeriesParams = {
1919
};
2020
export const getSeries = ({ username, urlSlug }: GetSeriesParams) =>
2121
axios.get(`/series/${username}/${urlSlug}`);
22+
23+
export type UpdateSeriesPayload = {
24+
urlSlug: string,
25+
username: string,
26+
data: CreateSeriesPayload,
27+
};
28+
29+
export const updateSeries = (payload: UpdateSeriesPayload) =>
30+
axios.patch(`/series/${payload.username}/${payload.urlSlug}`, payload.data);

velog-frontend/src/store/modules/series.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@ import * as SeriesAPI from 'lib/api/series';
77
const GET_SERIES = 'series/GET_SERIES';
88
const INITIALIZE = 'series/INITIALIZE';
99
const ENABLE_EDITING = 'series/ENABLE_EDITING';
10+
const DISABLE_EDITING = 'series/DISABLE_EDITING';
11+
const UPDATE_SERIES = 'series/UPDATE_SERIES';
1012

1113
export const actionCreators = {
1214
getSeries: createAction(GET_SERIES, SeriesAPI.getSeries),
1315
initialize: createAction(INITIALIZE),
1416
enableEditing: createAction(ENABLE_EDITING),
17+
disableEditing: createAction(DISABLE_EDITING),
18+
updateSeries: createAction(UPDATE_SERIES, SeriesAPI.updateSeries),
1519
};
1620

1721
export type SeriesPostData = {
@@ -62,6 +66,10 @@ const reducer = handleActions(
6266
...state,
6367
editing: true,
6468
}),
69+
[DISABLE_EDITING]: state => ({
70+
...state,
71+
editing: false,
72+
}),
6573
},
6674
initialState,
6775
);

0 commit comments

Comments
 (0)