1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-25 04:46:40 +07:00

setting tags

This commit is contained in:
Fedor Katurov 2019-10-09 14:56:12 +07:00
parent f9330000c2
commit 7fa5c17def
3 changed files with 55 additions and 8 deletions

View file

@ -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 * as styles from './styles.scss';
import { ITag } from '~/redux/types'; import { ITag } from '~/redux/types';
@ -10,6 +16,7 @@ interface IProps {
is_hoverable?: boolean; is_hoverable?: boolean;
onInput?: ChangeEventHandler<HTMLInputElement>; onInput?: ChangeEventHandler<HTMLInputElement>;
onKeyUp?: KeyboardEventHandler;
} }
const Tag: FC<IProps> = ({ const Tag: FC<IProps> = ({
@ -18,6 +25,7 @@ const Tag: FC<IProps> = ({
is_hoverable, is_hoverable,
onInput, onInput,
onKeyUp,
}) => ( }) => (
<div className={classNames(styles.tag, feature, { is_hoverable, input: !!onInput })}> <div className={classNames(styles.tag, feature, { is_hoverable, input: !!onInput })}>
<div className={styles.hole} /> <div className={styles.hole} />
@ -27,10 +35,11 @@ const Tag: FC<IProps> = ({
<input <input
type="text" type="text"
value={title} value={title}
onChange={onInput}
size={1} size={1}
placeholder="Добавить" placeholder="Добавить"
maxLength={24} maxLength={24}
onChange={onInput}
onKeyUp={onKeyUp}
/> />
)} )}
</div> </div>

View file

@ -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 { TagField } from '~/components/containers/TagField';
import { ITag } from '~/redux/types'; import { ITag } from '~/redux/types';
import { Tag } from '~/components/node/Tag'; import { Tag } from '~/components/node/Tag';
import uniq from 'ramda/es/uniq';
type IProps = HTMLAttributes<HTMLDivElement> & { type IProps = HTMLAttributes<HTMLDivElement> & {
tags: ITag[]; tags: ITag[];
@ -10,7 +19,8 @@ type IProps = HTMLAttributes<HTMLDivElement> & {
}; };
export const Tags: FC<IProps> = ({ tags, is_editable, onChange, ...props }) => { export const Tags: FC<IProps> = ({ tags, is_editable, onChange, ...props }) => {
const [input, setInput] = useState('asdasdasdasdasdasdasdasdasdasdasasdasdasdasdasdasdasda'); const [input, setInput] = useState('');
const [data, setData] = useState(tags);
const onInput = useCallback( const onInput = useCallback(
({ target: { value } }: ChangeEvent<HTMLInputElement>) => { ({ target: { value } }: ChangeEvent<HTMLInputElement>) => {
@ -19,13 +29,41 @@ export const Tags: FC<IProps> = ({ tags, is_editable, onChange, ...props }) => {
[setInput] [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 ( return (
<TagField {...props}> <TagField {...props}>
{tags.map(tag => ( {data.map(tag => (
<Tag key={tag.title} title={tag.title} feature={tag.feature} /> <Tag key={tag.title} title={tag.title} feature={tag.feature} />
))} ))}
{is_editable && <Tag title={input} onInput={onInput} />} {is_editable && <Tag title={input} onInput={onInput} onKeyUp={onKeyUp} />}
</TagField> </TagField>
); );
}; };

View file

@ -62,9 +62,9 @@ function* checkUserSaga({ key }: RehydrateAction) {
yield put(authSetUser({ ...user, is_user: true })); yield put(authSetUser({ ...user, is_user: true }));
} }
function* mySaga() { function* authSaga() {
yield takeLatest(REHYDRATE, checkUserSaga); yield takeLatest(REHYDRATE, checkUserSaga);
yield takeLatest(AUTH_USER_ACTIONS.SEND_LOGIN_REQUEST, sendLoginRequestSaga); yield takeLatest(AUTH_USER_ACTIONS.SEND_LOGIN_REQUEST, sendLoginRequestSaga);
} }
export default mySaga; export default authSaga;