Z ZPI 文档 v0.3.8
介绍页

源码

packages/ui/src/components/DraftGreeting.tsx

tsx55 行查看原文
import { useEffect, useLayoutEffect, useRef, useState } from "react";

// ZCode ConversationDraftEmptyState greeting and responsive typography.
export function DraftGreeting() {
  const [hour, setHour] = useState(() => new Date().getHours());
  useEffect(() => {
    const timer = window.setInterval(() => setHour(new Date().getHours()), 60000);
    return () => window.clearInterval(timer);
  }, []);
  const greeting =
    hour >= 5 && hour < 9
      ? "早上好呀,新的一天开始啦"
      : hour < 12 && hour >= 9
        ? "上午好呀,有什么想让我帮忙的吗"
        : hour < 14 && hour >= 12
          ? "中午好呀,要不要先休息一下"
          : hour < 18 && hour >= 14
            ? "下午好呀,接下来交给我吧"
            : hour < 23 && hour >= 18
              ? "晚上好呀,今天辛苦啦"
              : "夜深啦,别忘了照顾好自己哦";
  const container = useRef<HTMLHeadingElement>(null);
  const measurement = useRef<HTMLSpanElement>(null);
  const [fontSize, setFontSize] = useState(30);
  useLayoutEffect(() => {
    const heading = container.current;
    const text = measurement.current;
    if (!heading || !text) return;
    const measure = () => {
      const style = getComputedStyle(heading);
      const width =
        heading.getBoundingClientRect().width -
        Number.parseFloat(style.paddingLeft) -
        Number.parseFloat(style.paddingRight);
      const naturalWidth = text.getBoundingClientRect().width;
      setFontSize(
        naturalWidth > 0 ? Math.max(20, Math.min(30, Math.floor((30 * width) / naturalWidth))) : 30,
      );
    };
    measure();
    const observer = new ResizeObserver(measure);
    observer.observe(heading);
    observer.observe(text);
    return () => observer.disconnect();
  }, [greeting]);
  return (
    <h1 ref={container} className="draft-greeting" style={{ fontSize }}>
      <span ref={measurement} className="draft-greeting-measurement" aria-hidden="true">
        {greeting}
      </span>
      <span>{greeting}</span>
    </h1>
  );
}