From 148974ab7db3e8500e236e312dd546d39e5c322b Mon Sep 17 00:00:00 2001 From: muerwre Date: Thu, 22 Aug 2019 21:08:42 +0700 Subject: [PATCH] node api --- src/constants/errors.ts | 4 ++++ src/containers/dialogs/EditorDialog/index.tsx | 9 +++++++-- src/redux/node/actions.ts | 12 ++++++++++++ src/redux/node/api.ts | 10 +++++----- src/redux/node/constants.ts | 5 +++++ src/redux/node/handlers.ts | 9 ++++++++- src/redux/node/sagas.ts | 14 +++++++++++++- src/redux/types.ts | 2 ++ 8 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 src/constants/errors.ts create mode 100644 src/redux/node/actions.ts diff --git a/src/constants/errors.ts b/src/constants/errors.ts new file mode 100644 index 00000000..70e772f2 --- /dev/null +++ b/src/constants/errors.ts @@ -0,0 +1,4 @@ +export const ERRORS = { + NOT_AN_EMAIL: 'Not_An_Email', + TOO_SHIRT: 'Is_Too_Shirt', +}; diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 5077bf0b..cf8eaf6d 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -19,6 +19,7 @@ import { EditorPanel } from '~/components/editors/EditorPanel'; import { moveArrItem } from '~/utils/fn'; import { IFile, IFileWithUUID } from '~/redux/types'; import * as UPLOAD_ACTIONS from '~/redux/uploads/actions'; +import * as NODE_ACTIONS from '~/redux/node/actions'; import { selectUploads } from '~/redux/uploads/selectors'; import { UPLOAD_TARGETS, UPLOAD_TYPES, UPLOAD_SUBJECTS } from '~/redux/uploads/constants'; @@ -31,6 +32,7 @@ const mapStateToProps = (state) => { const mapDispatchToProps = { uploadUploadFiles: UPLOAD_ACTIONS.uploadUploadFiles, + nodeSave: NODE_ACTIONS.nodeSave, }; type IProps = IDialogProps & ReturnType & typeof mapDispatchToProps & {}; @@ -38,9 +40,11 @@ type IProps = IDialogProps & ReturnType & typeof mapDisp const EditorDialogUnconnected: FC = ({ onRequestClose, editor, - uploadUploadFiles, files, statuses, + + uploadUploadFiles, + nodeSave, }) => { const [data, setData] = useState(editor); const eventPreventer = useCallback(event => event.preventDefault(), []); @@ -139,8 +143,9 @@ const EditorDialogUnconnected: FC = ({ const onSubmit = useCallback((event: FormEvent) => { event.preventDefault(); + nodeSave(data); console.log({ data }); - }, [data]); + }, [data, nodeSave]); const buttons = ( diff --git a/src/redux/node/actions.ts b/src/redux/node/actions.ts new file mode 100644 index 00000000..4498a279 --- /dev/null +++ b/src/redux/node/actions.ts @@ -0,0 +1,12 @@ +import { INode, IValidationErrors } from '../types'; +import { NODE_ACTIONS } from './constants'; + +export const nodeSave = (node: INode) => ({ + node, + type: NODE_ACTIONS.SAVE, +}); + +export const nodeSetSaveErrors = (errors: IValidationErrors) => ({ + errors, + type: NODE_ACTIONS.SET_SAVE_ERRORS, +}); diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts index b242b094..289a774f 100644 --- a/src/redux/node/api.ts +++ b/src/redux/node/api.ts @@ -1,15 +1,15 @@ import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils/api'; -import { INode } from '../types'; +import { INode, IResultWithStatus } from '../types'; import { API } from '~/constants/api'; export const postNode = ({ access, - data, + node, }: { access: string, - data: INode, -}) => ( - api.post(API.NODE.SAVE, { data }, configWithToken(access)) + node: INode, +}): Promise> => ( + api.post(API.NODE.SAVE, { node }, configWithToken(access)) .then(resultMiddleware) .catch(errorMiddleware) ); diff --git a/src/redux/node/constants.ts b/src/redux/node/constants.ts index 331c2934..9d485985 100644 --- a/src/redux/node/constants.ts +++ b/src/redux/node/constants.ts @@ -1,5 +1,10 @@ import { IBlock, INode } from '../types'; +export const NODE_ACTIONS = { + SAVE: 'NODE.SAVE', + SET_SAVE_ERRORS: 'NODE.SET_SAVE_ERRORS', +}; + export const EMPTY_BLOCK: IBlock = { type: null, files: [], diff --git a/src/redux/node/handlers.ts b/src/redux/node/handlers.ts index bcb6c72a..3f2a05fa 100644 --- a/src/redux/node/handlers.ts +++ b/src/redux/node/handlers.ts @@ -1,3 +1,10 @@ -export const NODE_HANDLERS = { +import assocPath from 'ramda/es/assocPath'; +import { NODE_ACTIONS } from './constants'; +import { nodeSetSaveErrors } from './actions'; +import { INodeState } from './reducer'; +const setSaveErrors = (state: INodeState, { errors }: ReturnType) => assocPath(['errors'], errors, state); + +export const NODE_HANDLERS = { + [NODE_ACTIONS.SAVE]: setSaveErrors, }; diff --git a/src/redux/node/sagas.ts b/src/redux/node/sagas.ts index e5c431c8..c3f4972e 100644 --- a/src/redux/node/sagas.ts +++ b/src/redux/node/sagas.ts @@ -1,3 +1,15 @@ -export default function* nodeSaga() { +import { takeLatest, call } from 'redux-saga/effects'; +import { NODE_ACTIONS } from './constants'; +import { nodeSave } from './actions'; +import { postNode } from './api'; +import { reqWrapper } from '../auth/sagas'; +function* onNodeSave({ node }: ReturnType) { + const { data, errors } = yield call(reqWrapper, postNode, { node }); + + console.log({ data, errors }); +} + +export default function* nodeSaga() { + yield takeLatest(NODE_ACTIONS.SAVE, onNodeSave); } diff --git a/src/redux/types.ts b/src/redux/types.ts index e9589ea5..2a2972e3 100644 --- a/src/redux/types.ts +++ b/src/redux/types.ts @@ -1,5 +1,6 @@ import { DetailedHTMLProps, InputHTMLAttributes } from 'react'; import { DIALOGS } from '~/redux/modal/constants'; +import { ERRORS } from '~/constants/errors'; export interface ITag { title: string; @@ -113,3 +114,4 @@ export interface INode { } export type IUploadProgressHandler = (current: number, total: number) => void; +export type IValidationErrors = Record;