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
75 lines
2.6 KiB
TypeScript
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>
|
|
)
|
|
}
|