Bin
2025-12-16 9e0b2ba2c317b1a86212f24cbae3195ad1f3dbfa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { type FC, type MouseEvent, useCallback, useMemo } from "react";
import { cn } from "../../utils/bem";
import { IconCross } from "@humansignal/icons";
import "./HeidiTip.scss";
import { Button } from "@humansignal/ui";
import { HeidiSpeaking } from "../../assets/images";
import type { HeidiTipProps, Tip } from "./types";
import { createURL } from "./utils";
 
const HeidiLink: FC<{ link: Tip["link"]; onClick: () => void }> = ({ link, onClick }) => {
  const url = useMemo(() => {
    const params = link.params ?? {};
    /* if needed, add server ID here */
 
    return createURL(link.url, params);
  }, [link]);
 
  return (
    <a
      className={cn("heidy-tip").elem("link").toClassName()}
      href={url}
      target="_blank"
      onClick={onClick}
      rel="noreferrer"
    >
      {link.label}
    </a>
  );
};
 
export const HeidiTip: FC<HeidiTipProps> = ({ tip, onDismiss, onLinkClick }) => {
  const handleClick = useCallback((event: MouseEvent) => {
    event.preventDefault();
    event.stopPropagation();
    onDismiss();
  }, []);
 
  return (
    <div className={cn("heidy-tip").toClassName()}>
      <div className={cn("heidy-tip").elem("content").toClassName()}>
        <div className={cn("heidy-tip").elem("header").toClassName()}>
          <div className={cn("heidy-tip").elem("title").toClassName()}>{tip.title}</div>
          {tip.closable && (
            <Button tooltip="Don't show" look="string" size="small" onClick={handleClick} className="!p-0">
              <IconCross />
            </Button>
          )}
        </div>
        <div className={cn("heidy-tip").elem("text").toClassName()}>
          {tip.content}
          <HeidiLink link={tip.link} onClick={onLinkClick} />
        </div>
      </div>
      <div className={cn("heidy-tip").elem("heidi").toClassName()}>
        <HeidiSpeaking />
      </div>
    </div>
  );
};