diff options
| author | crupest <crupest@outlook.com> | 2020-09-03 23:09:03 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-03 23:09:03 +0800 |
| commit | 1966351eb2046b9edfb3f9ccb50cb8921f1a08dc (patch) | |
| tree | 792ee4899e7e00d518ea37d6ddd68555a83ac51e /Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx | |
| parent | 3e7e533016b04df4993df66842409cf5857983ee (diff) | |
| parent | 5a0adf596988efe8c3e49efcba7594f134a9cb0d (diff) | |
| download | timeline-1966351eb2046b9edfb3f9ccb50cb8921f1a08dc.tar.gz timeline-1966351eb2046b9edfb3f9ccb50cb8921f1a08dc.tar.bz2 timeline-1966351eb2046b9edfb3f9ccb50cb8921f1a08dc.zip | |
Merge pull request #159 from crupest/dev
Development on front end.
Diffstat (limited to 'Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx')
| -rw-r--r-- | Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx b/Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx new file mode 100644 index 00000000..fd051d45 --- /dev/null +++ b/Timeline/ClientApp/src/app/views/timeline-common/Timeline.tsx @@ -0,0 +1,84 @@ +import React from "react"; +import clsx from "clsx"; + +import { TimelinePostInfo } from "@/services/timeline"; + +import TimelineItem from "./TimelineItem"; + +export interface TimelinePostInfoEx extends TimelinePostInfo { + deletable: boolean; +} + +export type TimelineDeleteCallback = (index: number, id: number) => void; + +export interface TimelineProps { + className?: string; + posts: TimelinePostInfoEx[]; + onDelete: TimelineDeleteCallback; + onResize?: () => void; + containerRef?: React.Ref<HTMLDivElement>; +} + +const Timeline: React.FC<TimelineProps> = (props) => { + const { posts, onDelete, onResize } = props; + + const [indexShowDeleteButton, setIndexShowDeleteButton] = React.useState< + number + >(-1); + + const onItemClick = React.useCallback(() => { + setIndexShowDeleteButton(-1); + }, []); + + const onToggleDelete = React.useMemo(() => { + return posts.map((post, i) => { + return post.deletable + ? () => { + setIndexShowDeleteButton((oldIndexShowDeleteButton) => { + return oldIndexShowDeleteButton !== i ? i : -1; + }); + } + : undefined; + }); + }, [posts]); + + const onItemDelete = React.useMemo(() => { + return posts.map((post, i) => { + return () => { + onDelete(i, post.id); + }; + }); + }, [posts, onDelete]); + + return ( + <div ref={props.containerRef} className={clsx("timeline", props.className)}> + {(() => { + const length = posts.length; + return posts.map((post, i) => { + const toggleMore = onToggleDelete[i]; + + return ( + <TimelineItem + post={post} + key={post.id} + current={length - 1 === i} + more={ + toggleMore + ? { + isOpen: indexShowDeleteButton === i, + toggle: toggleMore, + onDelete: onItemDelete[i], + } + : undefined + } + onClick={onItemClick} + onResize={onResize} + /> + ); + }); + })()} + </div> + ); +}; + +export default Timeline; |
