import { t, Trans } from "@lingui/macro" import { Group, Indicator, MultiSelect, Popover } from "@mantine/core" import { useMediaQuery } from "@mantine/hooks" import { Constants } from "app/constants" import { markEntriesUpToEntry, markEntry, starEntry, tagEntry } from "app/slices/entries" import { useAppDispatch, useAppSelector } from "app/store" import { Entry } from "app/types" import { ActionButton } from "components/ActionButtton" import { ButtonToolbar } from "components/ButtonToolbar" import { useEffect, useState } from "react" import { TbArrowBarToDown, TbExternalLink, TbEyeCheck, TbEyeOff, TbShare, TbStar, TbStarOff, TbTag } from "react-icons/tb" import { throttle } from "throttle-debounce" import { ShareButtons } from "./ShareButtons" interface FeedEntryFooterProps { entry: Entry } export function FeedEntryFooter(props: FeedEntryFooterProps) { const [scrollPosition, setScrollPosition] = useState(0) const sharingSettings = useAppSelector(state => state.user.settings?.sharingSettings) const tags = useAppSelector(state => state.user.tags) const mobile = !useMediaQuery(`(min-width: ${Constants.layout.mobileBreakpoint})`) const dispatch = useAppDispatch() const showSharingButtons = sharingSettings && Object.values(sharingSettings).some(v => v) const readStatusButtonClicked = () => dispatch(markEntry({ entry: props.entry, read: !props.entry.read })) const onTagsChange = (values: string[]) => dispatch( tagEntry({ entryId: +props.entry.id, tags: values, }) ) useEffect(() => { const scrollArea = document.getElementById(Constants.dom.mainScrollAreaId) const listener = () => setScrollPosition(scrollArea ? scrollArea.scrollTop : 0) const throttledListener = throttle(100, listener) scrollArea?.addEventListener("scroll", throttledListener) return () => scrollArea?.removeEventListener("scroll", throttledListener) }, []) return ( {props.entry.markable && ( : } label={props.entry.read ? Keep unread : Mark as read} onClick={readStatusButtonClicked} /> )} : } label={props.entry.starred ? Unstar : Star} onClick={() => dispatch(starEntry({ entry: props.entry, starred: !props.entry.starred }))} /> {showSharingButtons && ( } label={Share} /> )} {tags && ( } label={Tags} /> t`Create tag: ${query}`} value={props.entry.tags} onChange={onTagsChange} /> )} } label={Open link} /> } label={Mark as read up to here} onClick={() => dispatch(markEntriesUpToEntry(props.entry))} /> ) }