import { Chip } from '@heroui/chip'; import { Tooltip } from '@heroui/tooltip'; import { motion } from 'motion/react'; import React, { useState } from 'react'; import toast from 'react-hot-toast'; import { TbSquareRoundedChevronRightFilled } from 'react-icons/tb'; import type { LiteralValue, ParsedSchema } from '@/utils/zod'; interface DisplayStructProps { schema: ParsedSchema | ParsedSchema[] } const SchemaType = ({ type, value, }: { type: string value?: LiteralValue }) => { let name = type; switch (type) { case 'union': name = '联合类型'; break; case 'value': name = '固定值'; break; } let chipColor: 'primary' | 'success' | 'primary' | 'warning' | 'secondary' = 'primary'; switch (type) { case 'enum': chipColor = 'warning'; break; case 'union': chipColor = 'secondary'; break; case 'array': chipColor = 'primary'; break; case 'object': chipColor = 'success'; break; } return ( {name} {type === 'value' && ( {value} )} ); }; const SchemaLabel: React.FC<{ schema: ParsedSchema }> = ({ schema }) => ( <> {Array.isArray(schema.type) ? ( schema.type.map((type) => ( )) ) : ( )} {schema.optional && ( 可选 )} {schema.description && ( {schema.description} )} ); const SchemaContainer: React.FC<{ schema: ParsedSchema children: React.ReactNode }> = ({ schema, children }) => { const [expanded, setExpanded] = useState(false); const toggleExpand = () => setExpanded(!expanded); return (
{ e.stopPropagation(); navigator.clipboard.writeText(schema.name || ''); toast.success('已复制'); }} > {schema.name}
{children}
); }; const RenderSchema: React.FC<{ schema: ParsedSchema }> = ({ schema }) => { if (schema.type === 'object') { return ( {schema.children && schema.children.length > 0 ? ( schema.children.map((child, i) => ( )) ) : (
{'{}'}
)}
); } if (schema.type === 'array' || schema.type === 'union') { return ( {schema.children?.map((child, i) => ( ))} ); } if (schema.type === 'enum' && Array.isArray(schema.enum)) { return (
{schema.enum?.map((value, i) => ( {value?.toString()} ))}
); } return (
{ e.stopPropagation(); navigator.clipboard.writeText(schema.name || ''); toast.success('已复制'); }} > {schema.name}
); }; const DisplayStruct: React.FC = ({ schema }) => { return (
{Array.isArray(schema) ? ( schema.map((s, i) => ) ) : ( )}
); }; export default DisplayStruct;