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/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 new file mode 100644 index 00000000..289a774f --- /dev/null +++ b/src/redux/node/api.ts @@ -0,0 +1,15 @@ +import { api, configWithToken, resultMiddleware, errorMiddleware } from '~/utils/api'; +import { INode, IResultWithStatus } from '../types'; +import { API } from '~/constants/api'; + +export const postNode = ({ + access, + node, +}: { + access: string, + 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 214820f1..1555971e 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; @@ -112,4 +113,9 @@ export interface INode { updatedAt?: string; } +<<<<<<< HEAD export type IUploadProgressHandler = (progressEvent: any) => void; +======= +export type IUploadProgressHandler = (current: number, total: number) => void; +export type IValidationErrors = Record; +>>>>>>> 148974ab7db3e8500e236e312dd546d39e5c322b diff --git a/src/redux/uploads/api.ts b/src/redux/uploads/api.ts index 23361f58..836c9964 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 = ({ @@ -21,5 +24,7 @@ export const postUploadFile = ({ API.USER.UPLOAD(target, type), data, configWithToken(access, { onUploadProgress: onProgress }) + .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__/**/*"] }