zcash-grant-system/frontend/client/components/DraftList/index.tsx

162 lines
4.4 KiB
TypeScript
Raw Normal View History

2018-11-13 08:07:09 -08:00
import React from 'react';
import { connect } from 'react-redux';
import { Link } from 'react-router-dom';
2018-11-15 08:02:16 -08:00
import { List, Button, Divider, Spin, Popconfirm, message } from 'antd';
import Placeholder from 'components/Placeholder';
import { ProposalDraft } from 'types';
2018-11-15 08:02:16 -08:00
import { fetchDrafts, createDraft, deleteDraft } from 'modules/create/actions';
import { AppState } from 'store/reducers';
import './style.less';
2018-11-13 08:07:09 -08:00
interface StateProps {
drafts: AppState['create']['drafts'];
isFetchingDrafts: AppState['create']['isFetchingDrafts'];
fetchDraftsError: AppState['create']['fetchDraftsError'];
isCreatingDraft: AppState['create']['isCreatingDraft'];
createDraftError: AppState['create']['createDraftError'];
2018-11-15 08:02:16 -08:00
isDeletingDraft: AppState['create']['isDeletingDraft'];
deleteDraftError: AppState['create']['deleteDraftError'];
}
interface DispatchProps {
fetchDrafts: typeof fetchDrafts;
createDraft: typeof createDraft;
2018-11-15 08:02:16 -08:00
deleteDraft: typeof deleteDraft;
}
interface OwnProps {
createIfNone?: boolean;
}
type Props = StateProps & DispatchProps & OwnProps;
2018-11-15 08:02:16 -08:00
interface State {
deletingId: number | null;
}
class DraftList extends React.Component<Props, State> {
state: State = {
deletingId: null,
};
componentWillMount() {
this.props.fetchDrafts();
}
componentDidUpdate(prevProps: Props) {
2018-11-15 08:02:16 -08:00
const {
drafts,
createIfNone,
isDeletingDraft,
deleteDraftError,
createDraftError,
} = this.props;
if (createIfNone && drafts && !prevProps.drafts && !drafts.length) {
this.createDraft();
}
2018-11-15 08:02:16 -08:00
if (prevProps.isDeletingDraft && !isDeletingDraft) {
this.setState({ deletingId: null });
}
if (deleteDraftError && prevProps.deleteDraftError !== deleteDraftError) {
message.error('Failed to delete draft', 3);
}
if (createDraftError && prevProps.createDraftError !== createDraftError) {
message.error('Failed to create draft', 3);
}
}
render() {
2018-11-15 08:02:16 -08:00
const { drafts, isCreatingDraft } = this.props;
const { deletingId } = this.state;
2018-11-15 08:02:16 -08:00
if (!drafts || isCreatingDraft) {
return <Spin />;
}
2018-11-15 08:02:16 -08:00
let draftsEl;
if (drafts.length) {
draftsEl = (
<List
itemLayout="horizontal"
dataSource={drafts}
renderItem={(d: ProposalDraft) => {
const actions = [
<Link key="edit" to={`/proposals/${d.proposalId}/edit`}>
Edit
</Link>,
2018-11-15 08:02:16 -08:00
<Popconfirm
key="delete"
title="Are you sure?"
onConfirm={() => this.deleteDraft(d.proposalId)}
>
<a>Delete</a>
</Popconfirm>,
];
return (
2018-11-15 08:02:16 -08:00
<Spin tip="deleting..." spinning={deletingId === d.proposalId}>
<List.Item actions={actions}>
<List.Item.Meta
title={d.title || <em>Untitled proposal</em>}
description={d.brief || <em>No description</em>}
/>
</List.Item>
</Spin>
);
}}
/>
2018-11-15 08:02:16 -08:00
);
} else {
draftsEl = (
<Placeholder
title="You have no drafts"
subtitle="Why not make one now? Click below to start."
/>
);
}
return (
<div className="DraftList">
<h2 className="DraftList-title">Your drafts</h2>
{draftsEl}
<Divider>or</Divider>
<Button
className="DraftList-create"
type="primary"
size="large"
block
onClick={this.createDraft}
loading={isCreatingDraft}
>
Create a new Proposal
</Button>
</div>
);
}
private createDraft = () => {
this.props.createDraft({ redirect: true });
};
2018-11-15 08:02:16 -08:00
private deleteDraft = (proposalId: number) => {
this.props.deleteDraft(proposalId);
this.setState({ deletingId: proposalId });
};
}
export default connect<StateProps, DispatchProps, OwnProps, AppState>(
state => ({
drafts: state.create.drafts,
isFetchingDrafts: state.create.isFetchingDrafts,
fetchDraftsError: state.create.fetchDraftsError,
isCreatingDraft: state.create.isCreatingDraft,
createDraftError: state.create.createDraftError,
2018-11-15 08:02:16 -08:00
isDeletingDraft: state.create.isDeletingDraft,
deleteDraftError: state.create.deleteDraftError,
}),
{
fetchDrafts,
createDraft,
2018-11-15 08:02:16 -08:00
deleteDraft,
},
)(DraftList);