From c989d50277c4f614e0d2aba2a5ed5c5e5363ba1d Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Mon, 16 Mar 2020 17:44:01 +0700 Subject: [PATCH] sort category tags before others --- src/components/node/NodePanelInner/index.tsx | 124 ++++++++++--------- src/components/node/Tags/index.tsx | 65 +++++----- 2 files changed, 96 insertions(+), 93 deletions(-) diff --git a/src/components/node/NodePanelInner/index.tsx b/src/components/node/NodePanelInner/index.tsx index a4623c71..98d24999 100644 --- a/src/components/node/NodePanelInner/index.tsx +++ b/src/components/node/NodePanelInner/index.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react'; +import React, { FC, memo } from 'react'; import * as styles from './styles.scss'; import { Group } from '~/components/containers/Group'; import { Filler } from '~/components/containers/Filler'; @@ -24,77 +24,79 @@ interface IProps { onLock: () => void; } -const NodePanelInner: FC = ({ - node: { title, user, is_liked, is_heroic, deleted_at, created_at }, - stack, +const NodePanelInner: FC = memo( + ({ + node: { title, user, is_liked, is_heroic, deleted_at, created_at }, + stack, - can_star, - can_edit, - can_like, + can_star, + can_edit, + can_like, - is_loading, + is_loading, - onStar, - onEdit, - onLike, - onLock, -}) => { - return ( -
-
- - -
- {is_loading ? : title || '...'} -
- {user && user.username && ( -
- {is_loading ? ( - + onStar, + onEdit, + onLike, + onLock, + }) => { + return ( +
+
+ + +
+ {is_loading ? : title || '...'} +
+ {user && user.username && ( +
+ {is_loading ? ( + + ) : ( + `~${user.username}, ${getPrettyDate(created_at)}` + )} +
+ )} +
+
+ +
+ {can_star && ( +
+ {is_heroic ? ( + ) : ( - `~${user.username}, ${getPrettyDate(created_at)}` + )}
)} - - -
- {can_star && ( -
- {is_heroic ? ( - - ) : ( - - )} -
- )} + {can_edit && ( + <> +
+ +
- {can_edit && ( - <> -
- +
+ +
+ + )} + + {can_like && ( +
+ {is_liked ? ( + + ) : ( + + )}
- -
- -
- - )} - - {can_like && ( -
- {is_liked ? ( - - ) : ( - - )} -
- )} + )} +
-
- ); -}; + ); + } +); export { NodePanelInner }; diff --git a/src/components/node/Tags/index.tsx b/src/components/node/Tags/index.tsx index 8af67240..ced5bd78 100644 --- a/src/components/node/Tags/index.tsx +++ b/src/components/node/Tags/index.tsx @@ -6,12 +6,13 @@ import React, { useEffect, KeyboardEvent, ChangeEvent, - useRef -} 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"; + useRef, + useMemo, +} 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: Partial[]; @@ -19,16 +20,21 @@ type IProps = HTMLAttributes & { onTagsChange?: (tags: string[]) => void; }; -export const Tags: FC = ({ - tags, - is_editable, - onTagsChange, - ...props -}) => { - const [input, setInput] = useState(""); +export const Tags: FC = ({ tags, is_editable, onTagsChange, ...props }) => { + const [input, setInput] = useState(''); const [data, setData] = useState([]); const timer = useRef(null); + const [catTags, ordinaryTags] = useMemo( + () => + tags.reduce( + (obj, tag) => + tag.title.substr(0, 1) === '/' ? [[...obj[0], tag], obj[1]] : [obj[0], [...obj[1], tag]], + [[], []] + ), + [] + ); + const onInput = useCallback( ({ target: { value } }: ChangeEvent) => { clearTimeout(timer.current); @@ -39,17 +45,17 @@ export const Tags: FC = ({ const onKeyUp = useCallback( ({ key }: KeyboardEvent) => { - if (key === "Backspace" && input === "" && data.length) { + if (key === 'Backspace' && input === '' && data.length) { setData(data.slice(0, data.length - 1)); setInput(data[data.length - 1].title); } - if (key === "Enter" || key === "," || key === "Comma") { + if (key === 'Enter' || key === ',' || key === 'Comma') { setData( uniq([ ...data, ...input - .split(",") + .split(',') .map((title: string) => title .trim() @@ -59,11 +65,11 @@ export const Tags: FC = ({ .filter(el => el.length > 0) .filter(el => !tags.some(tag => tag.title.trim() === el.trim())) .map(title => ({ - title - })) + title, + })), ]) ); - setInput(""); + setInput(''); } }, [input, setInput, data, setData] @@ -75,21 +81,21 @@ export const Tags: FC = ({ if (!items.length) return; setData(items); - setInput(""); + setInput(''); onTagsChange(uniq([...tags, ...items]).map(tag => tag.title)); }, [tags, data, onTagsChange, input, setInput]); useEffect(() => { - setData( - data.filter( - ({ title }) => !tags.some(tag => tag.title.trim() === title.trim()) - ) - ); + setData(data.filter(({ title }) => !tags.some(tag => tag.title.trim() === title.trim()))); }, [tags]); return ( - {tags.map(tag => ( + {catTags.map(tag => ( + + ))} + + {ordinaryTags.map(tag => ( ))} @@ -98,12 +104,7 @@ export const Tags: FC = ({ ))} {is_editable && ( - + )} );