addons/isl/src/HighlightedCommits.tsxblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import type {CommitInfo, Hash} from './types';
b69ab319
b69ab3110import {atom, useSetAtom} from 'jotai';
b69ab3111import {useEffect, useState} from 'react';
b69ab3112import {atomFamilyWeak} from './jotaiUtils';
b69ab3113
b69ab3114export const highlightedCommits = atom<Set<Hash>>(new Set<Hash>());
b69ab3115
b69ab3116export const isHighlightedCommit = atomFamilyWeak((hash: Hash) =>
b69ab3117 atom(get => get(highlightedCommits).has(hash)),
b69ab3118);
b69ab3119
b69ab3120export function HighlightCommitsWhileHovering({
b69ab3121 toHighlight,
b69ab3122 children,
b69ab3123 ...rest
b69ab3124}: {
b69ab3125 toHighlight: Array<CommitInfo | Hash>;
b69ab3126 children: React.ReactNode;
b69ab3127} & React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>) {
b69ab3128 const setHighlighted = useSetAtom(highlightedCommits);
b69ab3129 const [isSourceOfHighlight, setIsSourceOfHighlight] = useState(false);
b69ab3130
b69ab3131 useEffect(() => {
b69ab3132 return () => {
b69ab3133 if (isSourceOfHighlight) {
b69ab3134 // if we started the highlight, make sure to unhighlight when unmounting
b69ab3135 setHighlighted(new Set());
b69ab3136 }
b69ab3137 };
b69ab3138 }, [isSourceOfHighlight, setHighlighted]);
b69ab3139
b69ab3140 return (
b69ab3141 <div
b69ab3142 {...rest}
b69ab3143 onMouseOver={() => {
b69ab3144 setHighlighted(
b69ab3145 new Set(
b69ab3146 toHighlight.map(commitOrHash =>
b69ab3147 typeof commitOrHash === 'string' ? commitOrHash : commitOrHash.hash,
b69ab3148 ),
b69ab3149 ),
b69ab3150 );
b69ab3151 setIsSourceOfHighlight(true);
b69ab3152 }}
b69ab3153 onMouseOut={() => {
b69ab3154 setHighlighted(new Set());
b69ab3155 setIsSourceOfHighlight(false);
b69ab3156 }}>
b69ab3157 {children}
b69ab3158 </div>
b69ab3159 );
b69ab3160}