Files
upstream-tldraw/packages/commenting/src/ui/reactions.tsx
upstream-mirror a774ac673a
Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
snapshot of https://github.com/tldraw/tldraw.git (main, 2026-09-23; blobs > 131072B omitted)
2026-09-23 16:12:52 +05:00

75 lines
2.6 KiB
TypeScript

import { ComponentType } from 'react'
import { Reaction, ReactionTooltipProps, RenderReaction } from './reaction'
/** One person who reacted with a given emoji, for the hover list. @public */
export interface ReactionReactor {
/** Display name of the person who reacted. */
name: string
/** True for the current user. */
you: boolean
}
/** One emoji's reactions on a comment, already tallied. @public */
export interface ReactionSummary {
emoji: string
/** How many people reacted with this emoji. */
count: number
/** True when the current user is one of them — renders the pill highlighted. */
active: boolean
/** Who reacted with this emoji, in reaction order — shown in the hover list. */
reactors: ReactionReactor[]
}
/** @public */
export interface ReactionsProps {
/** The comment's reactions, grouped by emoji. Empty renders nothing. */
reactions: ReactionSummary[]
/** Toggles the current user's reaction for an emoji. */
onToggle?(emoji: string): void
/** Whether the current user may react. False makes the pills inert (e.g. a signed-out
* viewer, or a read-only thread) while still showing counts. */
canReact?: boolean
/** Whether hovering a pill shows its reactor list. Pass false to suppress it — e.g. while
* another popup menu on the comment is open. Defaults to true. */
enableHoverList?: boolean
/** How to draw each emoji token. Defaults to the token string (OS emoji font). */
renderReaction?: RenderReaction
/** The tooltip naming who reacted, shown when a pill is hovered. Defaults to an inline sentence
* (`DefaultReactionTooltip`). Swap it to render the reactor list however you like. */
ReactionTooltip?: ComponentType<ReactionTooltipProps>
}
/**
* The row of tallied reactions under a comment. Presentational — the host supplies the summaries
* and owns what toggling does. Hovering a pill lists who reacted (see `Reaction`).
*
* The add-reaction affordance is a separate component (`ReactionPicker`) so it can live outside
* this row — on a comment card it sits with the card's hover actions, which keeps its position
* fixed as reactions are added here.
* @public @react
*/
export function Reactions({
reactions,
onToggle,
canReact = true,
enableHoverList = true,
renderReaction,
ReactionTooltip,
}: ReactionsProps) {
if (reactions.length === 0) return null
return (
<div className="tlui-cmt-reactions">
{reactions.map((reaction) => (
<Reaction
key={reaction.emoji}
{...reaction}
enableHoverList={enableHoverList}
renderReaction={renderReaction}
ReactionTooltip={ReactionTooltip}
onClick={canReact ? () => onToggle?.(reaction.emoji) : undefined}
/>
))}
</div>
)
}