diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.electron.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.electron.tsx index bffb08e2f..937dc597c 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.electron.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.electron.tsx @@ -1,11 +1,4 @@ -import { ScrollArea } from "@follow/components/ui/scroll-area/index.js" -import { - HoverCard, - HoverCardContent, - HoverCardPortal, - HoverCardTrigger, -} from "@radix-ui/react-hover-card" -import clsx from "clsx" +import { AvatarGroup } from "@follow/components/ui/avatar-group/index.js" import { useWhoami } from "~/atoms/user" import { useAuthQuery } from "~/hooks/common" @@ -13,7 +6,7 @@ import { useAppLayoutGridContainerWidth } from "~/providers/app-grid-layout-cont import { Queries } from "~/queries" import { useEntryReadHistory } from "~/store/entry" -import { EntryUser, EntryUserRow, getLimit } from "./EntryReadHistory.shared" +import { EntryUser, getLimit } from "./EntryReadHistory.shared" export const EntryReadHistory: Component<{ entryId: string }> = ({ entryId }) => { const me = useWhoami() @@ -37,64 +30,27 @@ export const EntryReadHistory: Component<{ entryId: string }> = ({ entryId }) => className="animate-in fade-in @md:flex hidden items-center duration-200" data-hide-in-print > - {entryHistory.userIds - .filter((id) => id !== me?.id) - .slice(0, LIMIT) + + {entryHistory.userIds + .filter((id) => id !== me?.id) + .slice(0, LIMIT) - .map((userId, i) => ( - - ))} + .map((userId) => ( + + ))} + - {!!totalCount && totalCount > LIMIT && ( - - - - - - {totalCount > LIMIT && ( - - - -
    - {entryHistory.userIds - .filter((id) => id !== me?.id) - .slice(LIMIT) - .map((userId) => ( - - ))} -
-
-
-
- )} -
- )} +
+ + +{Math.min(totalCount - LIMIT, 99)} + +
) } diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.shared.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.shared.tsx index 8b226fe3f..276807e1a 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.shared.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/components/EntryReadHistory.shared.tsx @@ -1,11 +1,5 @@ import { Avatar, AvatarFallback, AvatarImage } from "@follow/components/ui/avatar/index.jsx" -import { - Tooltip, - TooltipContent, - TooltipPortal, - TooltipTrigger, -} from "@follow/components/ui/tooltip/index.jsx" -import { EllipsisHorizontalTextWithTooltip } from "@follow/components/ui/typography/index.js" +import { TooltipContent, TooltipPortal } from "@follow/components/ui/tooltip/index.jsx" import { FeedViewType } from "@follow/constants" import { getNameInitials } from "@follow/utils/cjk" import { m } from "motion/react" @@ -36,74 +30,37 @@ export const getLimit = (width: number): number => { return 5 } -export const EntryUserRow: Component<{ userId: string }> = memo(({ userId }) => { - const user = useUserById(userId) - const presentUserProfile = usePresentUserProfileModal("drawer") - if (!user) return null - - return ( -
  • { - presentUserProfile(userId) - }} - role="button" - tabIndex={0} - className="cursor-button hover:bg-theme-selection-hover hover:text-theme-selection-foreground relative flex min-w-0 max-w-[50ch] shrink-0 items-center gap-2 truncate rounded-md p-1 px-2" - > - - - {getNameInitials(user.name || "")} - - - {user.name && ( - - {user.name} - - )} -
  • - ) -}) - export const EntryUser: Component<{ userId: string - i: number -}> = memo(({ userId, i }) => { + ref?: React.Ref +}> = memo(({ userId, ref }) => { const user = useUserById(userId) const { t } = useTranslation() const presentUserProfile = usePresentUserProfileModal("drawer") if (!user) return null return ( - - + { + presentUserProfile(userId) }} - asChild > - { - presentUserProfile(userId) - }} - > - - - {getNameInitials(user.name || "")} - - - + + + {getNameInitials(user.name || "")} + + {t("entry_actions.recent_reader")} {user.name} - + ) }) diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/index.electron.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/index.electron.tsx index 6be78a6a7..a44ffe380 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/index.electron.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/index.electron.tsx @@ -148,6 +148,7 @@ export const EntryContent: Component = ({ /> + {/* Indicator for the entry */}
    = ({ <>
    { EventBus.dispatch(COMMAND_ID.timeline.switchToPrevious) }} @@ -167,7 +169,7 @@ export const EntryContent: Component = ({
    { EventBus.dispatch(COMMAND_ID.timeline.switchToNext) }} diff --git a/packages/internal/components/src/ui/avatar-group/index.tsx b/packages/internal/components/src/ui/avatar-group/index.tsx new file mode 100644 index 000000000..4c1d25802 --- /dev/null +++ b/packages/internal/components/src/ui/avatar-group/index.tsx @@ -0,0 +1,74 @@ +import { Spring } from "@follow/components/constants/spring" +import { cn } from "@follow/utils/utils" +import type { Transition } from "motion/react" +import { m as motion } from "motion/react" +import * as React from "react" + +import { Tooltip, TooltipTrigger } from "../tooltip" + +type AvatarProps = { + children: React.ReactNode + zIndex: number + transition: Transition + translate: string | number +} + +const AvatarContainer = React.memo(({ children, zIndex, transition, translate }: AvatarProps) => { + return ( + + + + {children} + + + + ) +}) + +type AvatarGroupProps = Omit, "translate"> & { + children: React.ReactElement[] + transition?: Transition + translate?: string | number +} + +function AvatarGroup({ + ref, + children, + className, + transition = Spring.presets.smooth, + translate = "-30%", + + ...props +}: AvatarGroupProps) { + return ( +
    + {children?.map((child, index) => ( + + + {child} + + + ))} +
    + ) +} + +export { AvatarGroup, type AvatarGroupProps }