'use client'; import { getTutorial } from '@/utils/tutorial'; import { useQuery } from '@tanstack/react-query'; import { buttonVariants } from '@workspace/airo-ui/components/AiroButton'; import { Avatar, AvatarFallback, AvatarImage } from '@workspace/airo-ui/components/avatar'; import { Markdown } from '@workspace/airo-ui/custom-components/markdown'; import { useOutsideClick } from '@workspace/airo-ui/hooks/use-outside-click'; import { cn } from '@workspace/airo-ui/lib/utils'; import { formatDate } from '@workspace/airo-ui/utils'; import { AnimatePresence, motion } from 'framer-motion'; import { useTranslations } from 'next-intl'; import { RefObject, useEffect, useId, useRef, useState } from 'react'; import { CloseIcon } from './close-icon'; interface Item { path: string; title: string; updated_at?: string; icon?: string; download?: string; } export function TutorialButton({ items }: { items: Item[] }) { const t = useTranslations('document'); const [active, setActive] = useState(null); const id = useId(); const ref = useRef(null); const { data } = useQuery({ enabled: !!(active as Item)?.path, queryKey: ['getTutorial', (active as Item)?.path], queryFn: async () => { const markdown = await getTutorial((active as Item)?.path); return markdown; }, }); useEffect(() => { function onKeyDown(event: KeyboardEvent) { if (event.key === 'Escape') { setActive(false); } } if (active && typeof active === 'object') { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = 'auto'; } window.addEventListener('keydown', onKeyDown); return () => window.removeEventListener('keydown', onKeyDown); }, [active]); useOutsideClick(ref as RefObject, () => setActive(null)); function openPopupWindow(item) { // features 字符串用于控制窗口的特性 const pageWidth = 600; // 弹出窗口的宽度 const pageHeight = 550; // 弹出窗口的高度 const { availLeft, // 返回浏览器可用空间左边距离屏幕(系统桌面)左边界的距离。 availHeight, // 浏览器在显示屏上的可用高度,即当前屏幕高度 availWidth, // 浏览器在显示屏上的可用宽度,即当前屏幕宽度 } = window.screen; const pageTop = (availHeight - pageHeight) / 2; // 窗口的垂直位置 let pageLeft = (availWidth - pageWidth) / 2; // 窗口的水平位置; pageLeft += availLeft; // 加上屏幕偏移值 const features = `width=${pageWidth},height=${pageHeight},left=${pageLeft},top=${pageTop},toolbar=no,location=no,menubar=no`; console.log(features); window.open(item.download, item.title, features); } return ( <> {active && typeof active === 'object' && ( )} {active && typeof active === 'object' ? (
setActive(null)} > { return ( // eslint-disable-next-line @next/next/no-img-element ); }, }} > {data?.content || ''}
) : null}
    {items.map((item, index) => (
    {item.title.split('')[0]}
    {item.title} {item.updated_at && ( {formatDate(new Date(item.updated_at), false)} )}
    {item.download ? ( ) : null} setActive(item)} className={cn( buttonVariants({ variant: 'primary', }), 'min-w-0 px-3 sm:min-w-[80px]', )} > {t('read')}
    ))}
); }