From 7fa5c17def78f6467e30e287fc1d5c64466f1869 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Wed, 9 Oct 2019 14:56:12 +0700 Subject: [PATCH] setting tags --- src/components/node/Tag/index.tsx | 13 +++++++-- src/components/node/Tags/index.tsx | 46 +++++++++++++++++++++++++++--- src/redux/auth/sagas.ts | 4 +-- 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/components/node/Tag/index.tsx b/src/components/node/Tag/index.tsx index 6b1e84be..8d339ecb 100644 --- a/src/components/node/Tag/index.tsx +++ b/src/components/node/Tag/index.tsx @@ -1,4 +1,10 @@ -import React, { FC, ReactElement, ChangeEvent, ChangeEventHandler } from 'react'; +import React, { + FC, + ReactElement, + ChangeEvent, + ChangeEventHandler, + KeyboardEventHandler, +} from 'react'; import * as styles from './styles.scss'; import { ITag } from '~/redux/types'; @@ -10,6 +16,7 @@ interface IProps { is_hoverable?: boolean; onInput?: ChangeEventHandler; + onKeyUp?: KeyboardEventHandler; } const Tag: FC = ({ @@ -18,6 +25,7 @@ const Tag: FC = ({ is_hoverable, onInput, + onKeyUp, }) => (
@@ -27,10 +35,11 @@ const Tag: FC = ({ )}
diff --git a/src/components/node/Tags/index.tsx b/src/components/node/Tags/index.tsx index 013e7d66..7da014eb 100644 --- a/src/components/node/Tags/index.tsx +++ b/src/components/node/Tags/index.tsx @@ -1,7 +1,16 @@ -import React, { FC, HTMLAttributes, useState, useCallback, ChangeEvent } from 'react'; +import React, { + FC, + HTMLAttributes, + useState, + useCallback, + useEffect, + KeyboardEvent, + ChangeEvent, +} from 'react'; import { TagField } from '~/components/containers/TagField'; import { ITag } from '~/redux/types'; import { Tag } from '~/components/node/Tag'; +import uniq from 'ramda/es/uniq'; type IProps = HTMLAttributes & { tags: ITag[]; @@ -10,7 +19,8 @@ type IProps = HTMLAttributes & { }; export const Tags: FC = ({ tags, is_editable, onChange, ...props }) => { - const [input, setInput] = useState('asdasdasdasdasdasdasdasdasdasdasasdasdasdasdasdasdasda'); + const [input, setInput] = useState(''); + const [data, setData] = useState(tags); const onInput = useCallback( ({ target: { value } }: ChangeEvent) => { @@ -19,13 +29,41 @@ export const Tags: FC = ({ tags, is_editable, onChange, ...props }) => { [setInput] ); + const onKeyUp = useCallback( + ({ key }: KeyboardEvent) => { + if (key === 'Backspace' && input === '' && data.length) { + setData(data.slice(0, data.length - 1)); + setInput(data[data.length - 1].title); + } + + if (key === 'Enter' || key === ',') { + setData( + uniq([ + ...data, + ...input + .split(',') + .map((title: string) => title.trim().substr(0, 32)) + .filter(el => el.length > 0) + .map(title => ({ + title, + })), + ]) + ); + setInput(''); + } + }, + [input, setInput, data, setData] + ); + + useEffect(() => setData(tags), [tags]); + return ( - {tags.map(tag => ( + {data.map(tag => ( ))} - {is_editable && } + {is_editable && } ); }; diff --git a/src/redux/auth/sagas.ts b/src/redux/auth/sagas.ts index e21a0638..742dc018 100644 --- a/src/redux/auth/sagas.ts +++ b/src/redux/auth/sagas.ts @@ -62,9 +62,9 @@ function* checkUserSaga({ key }: RehydrateAction) { yield put(authSetUser({ ...user, is_user: true })); } -function* mySaga() { +function* authSaga() { yield takeLatest(REHYDRATE, checkUserSaga); yield takeLatest(AUTH_USER_ACTIONS.SEND_LOGIN_REQUEST, sendLoginRequestSaga); } -export default mySaga; +export default authSaga;