From a662256221dc5a54a8fc439d19d916d2012bbaf5 Mon Sep 17 00:00:00 2001 From: muerwre Date: Thu, 22 Aug 2019 20:43:21 +0700 Subject: [PATCH 1/2] node api --- src/constants/api.ts | 3 +++ src/redux/node/api.ts | 15 +++++++++++++++ src/redux/uploads/api.ts | 10 ++++++++-- tsconfig.json | 2 +- 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/redux/node/api.ts diff --git a/src/constants/api.ts b/src/constants/api.ts index 064898bc..46994588 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -5,4 +5,7 @@ export const API = { ME: '/auth/me', // UPLOAD: (target, type) => `/upload/${target}/${type}`, }, + NODE: { + SAVE: '/node/', + }, }; diff --git a/src/redux/node/api.ts b/src/redux/node/api.ts new file mode 100644 index 00000000..b242b094 --- /dev/null +++ b/src/redux/node/api.ts @@ -0,0 +1,15 @@ +import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils/api'; +import { INode } from '../types'; +import { API } from '~/constants/api'; + +export const postNode = ({ + access, + data, +}: { + access: string, + data: INode, +}) => ( + api.post(API.NODE.SAVE, { data }, configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware) +); diff --git a/src/redux/uploads/api.ts b/src/redux/uploads/api.ts index a5c7aa23..f8e702ad 100644 --- a/src/redux/uploads/api.ts +++ b/src/redux/uploads/api.ts @@ -1,7 +1,10 @@ import { IResultWithStatus, IFile, IUploadProgressHandler, IFileWithUUID, } from '~/redux/types'; -import { api, configWithToken } from '~/utils/api'; +import { + api, configWithToken, resultMiddleware, errorMiddleware, +} from '~/utils/api'; + import { API } from '~/constants/api'; export const postUploadFile = ({ @@ -16,5 +19,8 @@ export const postUploadFile = ({ const data = new FormData(); data.append('file', file); - return api.post(API.USER.UPLOAD(target, type), data, configWithToken(access)); + return api + .post(API.USER.UPLOAD(target, type), data, configWithToken(access)) + .then(resultMiddleware) + .catch(errorMiddleware); }; diff --git a/tsconfig.json b/tsconfig.json index 3b6d8e22..351b0b61 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,6 @@ "~/*": ["src/*"] } }, - "include": ["./src/index.tsx", "./custom.d.ts"], + "include": ["./src/**/*", "./custom.d.ts"], "exclude": ["./__tests__/**/*"] } From 148974ab7db3e8500e236e312dd546d39e5c322b Mon Sep 17 00:00:00 2001 From: muerwre Date: Thu, 22 Aug 2019 21:08:42 +0700 Subject: [PATCH 2/2] 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;