@guiwzh/small-design 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +230 -0
- package/dist/index.css +979 -0
- package/dist/index.d.mts +215 -0
- package/dist/index.d.ts +215 -0
- package/dist/index.js +1193 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1143 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Button/button.tsx","../src/components/Menu/menu.tsx","../src/components/Menu/subMenu.tsx","../src/components/Icon/icon.tsx","../src/components/Transition/transition.tsx","../src/components/Menu/menuItem.tsx","../src/components/Menu/index.tsx","../src/components/AutoComplete/autoComplete.tsx","../src/components/Input/input.tsx","../src/hooks/useDebounce.tsx","../src/hooks/useClickOutside.tsx","../src/components/Upload/upload.tsx","../src/components/Progress/progress.tsx","../src/components/Upload/uploadList.tsx","../src/components/Upload/dragger.tsx","../src/components/Signature/signature.tsx","../src/components/VirtualList/virtualList.tsx","../src/components/LazyLoad/lazyLoad.tsx","../src/components/Keepalive/Keepalive.tsx"],"sourcesContent":["import React from 'react';\r\nimport classNames from 'classnames';\r\n\r\n\r\nexport type ButtonSize='lg' | 'sm';\r\nexport type ButtonType = 'primary' | 'default' | 'danger' | 'link';\r\n\r\ninterface BaseButtonProps {\r\n className ?: string;\r\n disabled?: boolean;\r\n size?: ButtonSize;\r\n btnType?: ButtonType;\r\n href?: string;\r\n}\r\n\r\ntype NativeButtonProps = React.ButtonHTMLAttributes<HTMLElement>\r\ntype AnchorButtonProps = React.AnchorHTMLAttributes<HTMLElement>\r\ntype ButtonProps = Partial<NativeButtonProps & AnchorButtonProps> & BaseButtonProps;\r\n\r\nexport const Button: React.FC<ButtonProps> = (props) => {\r\n\r\n const { className, disabled=false, size, btnType='default', href, children,...restProps} = props;\r\n const classes = classNames('btn', className, {\r\n [`btn-${btnType}`]: btnType,\r\n [`btn-${size}`]: size,\r\n 'disabled': disabled,\r\n });\r\n if(btnType === 'link' && href) {\r\n return (\r\n <a className={classes} href={href} {...restProps}>\r\n {children}\r\n </a>\r\n )\r\n } else {\r\n return (\r\n <button className={classes} disabled={disabled} {...restProps}>\r\n {children}\r\n </button>\r\n )\r\n }\r\n}\r\nButton.displayName = 'Button';\r\nexport default Button;","import React, { useState,createContext,Children } from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { MenuItemProps } from \"./menuItem\";\r\n\r\n\r\ntype Menumode = \"horizontal\" | \"vertical\";\r\ntype SelectCallback=(Index: string,e:React.MouseEvent) => void;\r\nexport interface MenuProps {\r\n defaultIndex?: string; /**默认 active 的菜单项的索引值 */\r\n className?: string;\r\n mode?: Menumode;\r\n style?: React.CSSProperties;\r\n onSelect?:SelectCallback;\r\n children?: React.ReactNode;\r\n defaultOpenSubMenus?: string[]; /**设置子菜单的默认打开 只在纵向模式下生效 */\r\n}\r\n\r\ninterface ImenuContext {\r\n index: string;\r\n onSelect?:SelectCallback;\r\n mode?: Menumode;\r\n defaultOpenSubMenus?: string[];\r\n}\r\n\r\nexport const MenuContext = createContext<ImenuContext>({ index: \"0\" });\r\nexport const Menu: React.FC<MenuProps> = (props) => {\r\n const { className, mode=\"horizontal\" ,style, children,defaultIndex=\"0\",onSelect,defaultOpenSubMenus=[] } = props;\r\n const [currentActive, setActive]=useState(defaultIndex);\r\n\r\n const handleClick = (index: string,e:React.MouseEvent,) =>{\r\n setActive(index)\r\n if(onSelect){\r\n onSelect(index,e)\r\n }\r\n }\r\n const passedContext: ImenuContext = { \r\n index: currentActive, \r\n onSelect: handleClick,\r\n mode,\r\n defaultOpenSubMenus\r\n };//通过useContext将当前菜单的index、onSelect、mode、defaultOpenSubMenus传递给子组件\r\n const renderChildren = () => {\r\n return Children.map(children, (child,index) => { \r\n const childElement = child as React.FunctionComponentElement<MenuItemProps>;\r\n if (typeof child !== 'object' || child === null) {\r\n console.error(\"Warning: Menu has a child which is not a MenuItem component\")\r\n return null\r\n }\r\n const displayName = childElement.type?.displayName\r\n if(displayName === \"MenuItem\" || displayName === \"SubMenu\"){\r\n return React.cloneElement(childElement, {\r\n index: index.toString()\r\n })\r\n }else{\r\n console.error(\"Warning: Menu has a child which is not a MenuItem component\")\r\n }\r\n \r\n });\r\n }\r\n const classes = classNames(\"viking-menu\", className, {\r\n \"menu-vertical\": mode === \"vertical\",\r\n \"menu-horizontal\": mode !== \"vertical\",\r\n });\r\n return (\r\n <ul className={classes} style={style} role=\"menubar\">\r\n <MenuContext.Provider value={passedContext}>\r\n {renderChildren()}\r\n </MenuContext.Provider>\r\n </ul>\r\n );\r\n}\r\n\r\nexport default Menu;","import React,{ FC, useContext, useState, useRef, FunctionComponentElement, ReactNode } from 'react'\r\nimport classNames from 'classnames'\r\nimport { MenuContext } from './menu'\r\nimport { MenuItemProps } from './menuItem'\r\nimport Icon from '../Icon/icon';\r\nimport Transition from '../Transition/transition';\r\nexport interface SubMenuProps {\r\n index?: string;\r\n /**下拉菜单选项的文字 */\r\n title: string;\r\n /**下拉菜单选型的扩展类名 */\r\n className?: string;\r\n children?: ReactNode;\r\n}\r\n\r\nexport const SubMenu: FC<SubMenuProps> = ({ index, title, children, className}) => {\r\n const context = useContext(MenuContext)\r\n const openedSubMenus = context.defaultOpenSubMenus as Array<string>\r\n \r\n const isOpend = (index && context.mode === 'vertical') ? openedSubMenus.includes(index) : false\r\n const [ menuOpen, setOpen ] = useState(isOpend) //控制下拉菜单的展开\r\n const classes = classNames('menu-item submenu-item', className, {\r\n 'is-active': context.index === index,\r\n 'is-opened': menuOpen,\r\n 'is-vertical': context.mode === 'vertical'\r\n })\r\n const handleClick = (e: React.MouseEvent) => {\r\n e.preventDefault()\r\n setOpen(!menuOpen)\r\n }\r\n const timer = useRef<ReturnType<typeof setTimeout>>()\r\n const handleMouse = (e: React.MouseEvent, toggle: boolean) => {\r\n clearTimeout(timer.current)\r\n e.preventDefault()\r\n timer.current = setTimeout(() => {\r\n setOpen(toggle)\r\n }, 300)\r\n }\r\n const clickEvents = context.mode === 'vertical' ? {\r\n onClick: handleClick\r\n } : {}//仅有水平模式才支持点击展开\r\n const hoverEvents = context.mode !== 'vertical' ? {\r\n onMouseEnter: (e: React.MouseEvent) => { handleMouse(e, true)},\r\n onMouseLeave: (e: React.MouseEvent) => { handleMouse(e, false)}\r\n } : {}//仅有水平模式才支持鼠标移入移出展开\r\n \r\n const renderChildren = () => {\r\n \r\n const childrenComponent = React.Children.map(children, (child, i) => {\r\n const childElement = child as FunctionComponentElement<MenuItemProps>\r\n if (childElement.type.displayName === 'MenuItem' || childElement.type.displayName === 'SubMenu') {\r\n return React.cloneElement(childElement, {\r\n index: `${index}-${i}`\r\n })\r\n } else {\r\n console.error(\"Warning: SubMenu has a child which is not a MenuItem component\")\r\n }\r\n })\r\n return (\r\n <Transition\r\n in={menuOpen}\r\n timeout={300}\r\n animation=\"zoom-in-top\"\r\n >\r\n <ul className='viking-submenu'>\r\n {childrenComponent}\r\n </ul>\r\n </Transition>\r\n )\r\n }\r\n return (\r\n <li key={index} className={classes} {...hoverEvents}>\r\n <div className=\"submenu-title\" {...clickEvents} >\r\n {title}\r\n <Icon icon=\"angle-down\" className=\"arrow-icon\"/>\r\n </div>\r\n {renderChildren()}\r\n </li>\r\n )\r\n}\r\n\r\nSubMenu.displayName = 'SubMenu'\r\nexport default SubMenu;","import React, { FC } from 'react'\r\nimport classNames from 'classnames'\r\nimport { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome'\r\n\r\n\r\nexport type ThemeProps = 'primary' | 'secondary' | 'success' | 'info' | 'warning' | 'danger' | 'light' | 'dark'\r\n\r\nexport interface IconProps extends FontAwesomeIconProps {\r\n /** 支持框架主题 根据主题显示不同的颜色 */\r\n theme? : ThemeProps\r\n}\r\n\r\n/**\r\n * 提供了一套常用的图标集合 基于 react-fontawesome。\r\n * \r\n * 支持 react-fontawesome的所有属性 可以在这里查询 https://github.com/FortAwesome/react-fontawesome#basic\r\n * \r\n * 支持 fontawesome 所有 free-solid-icons,可以在这里查看所有图标 https://fontawesome.com/icons?d=gallery&s=solid&m=free\r\n * ### 引用方法\r\n * \r\n * ~~~js\r\n * import { Icon } from 'vikingship'\r\n * ~~~\r\n */\r\nexport const Icon: FC<IconProps> = (props) => {\r\n // icon-primary\r\n const { className, theme, ...restProps } = props\r\n const classes = classNames('viking-icon', className, {\r\n [`icon-${theme}`]: theme\r\n })\r\n return (\r\n <FontAwesomeIcon className={classes} {...restProps} />\r\n )\r\n}\r\n\r\nexport default Icon;","import React, { ReactNode } from 'react'\r\nimport { CSSTransition } from 'react-transition-group'\r\nimport { CSSTransitionProps } from 'react-transition-group/CSSTransition'\r\n\r\ntype AnimationName = 'zoom-in-top' | 'zoom-in-left' | 'zoom-in-bottom' | 'zoom-in-right'\r\n\r\ntype TransitionProps = CSSTransitionProps & {\r\n animation?: AnimationName,\r\n wrapper?: boolean,//通过wrapper添加一层div标签,解决重复设置transform,导致动画效果消失的问题\r\n children?: ReactNode\r\n}\r\n\r\nconst Transition: React.FC<TransitionProps> = (props) => {\r\n const {\r\n children,\r\n classNames,\r\n animation,\r\n wrapper,\r\n unmountOnExit=true,//该属性可以根据in属性的true和false实现子节点的挂载与卸载,从而无需自行添加display:none与block的转换\r\n appear=true,\r\n ...restProps\r\n } = props\r\n return (\r\n <CSSTransition\r\n classNames = { classNames ? classNames : animation}\r\n unmountOnExit={unmountOnExit}\r\n appear={appear}\r\n {...restProps}\r\n >\r\n {wrapper ? <div>{children}</div> : children}\r\n </CSSTransition>\r\n )\r\n}\r\n\r\nexport default Transition","import React,{useContext} from \"react\";\r\nimport classNames from \"classnames\";\r\nimport { MenuContext } from \"./menu\";\r\n\r\nexport interface MenuItemProps {\r\n index?:string;\r\n disabled?:boolean;\r\n className?:string;\r\n style?:React.CSSProperties;\r\n children?:React.ReactNode;\r\n}\r\n\r\nconst MenuItem: React.FC<MenuItemProps> = (props) => {\r\n const { index, disabled, className, style, children } = props;\r\n\r\n const context = useContext(MenuContext);\r\n const classes = classNames('menu-item', className, {\r\n 'is-disabled': disabled,\r\n 'is-active': context.index === index\r\n })\r\n\r\n const handleClick = (e:React.MouseEvent) => {\r\n if (context.onSelect && !disabled && index){\r\n context.onSelect(index,e)\r\n }\r\n }\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n if (context.onSelect && !disabled && index){\r\n context.onSelect(index, e as unknown as React.MouseEvent)\r\n }\r\n }\r\n }\r\n return (\r\n <li\r\n className={classes}\r\n style={style}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n role=\"menuitem\"\r\n tabIndex={disabled ? -1 : 0}\r\n aria-disabled={disabled}\r\n >\r\n {children}\r\n </li>\r\n)\r\n}\r\nMenuItem.displayName = 'MenuItem'\r\nexport default MenuItem","import { FC } from 'react'\r\nimport Menu, { MenuProps } from './menu'\r\nimport SubMenu, { SubMenuProps } from './subMenu'\r\nimport MenuItem, { MenuItemProps } from './menuItem'\r\n\r\n\r\nexport type IMenuComponent = FC<MenuProps> & {\r\n Item: FC<MenuItemProps>,\r\n SubMenu: FC<SubMenuProps>\r\n}\r\nconst TransMenu = Menu as IMenuComponent\r\n\r\nTransMenu.Item = MenuItem\r\nTransMenu.SubMenu = SubMenu\r\nexport { default as MenuItem } from './menuItem'\r\nexport { default as SubMenu } from './subMenu'\r\nexport default TransMenu;","import React, {FC,useState,ChangeEvent ,ReactElement, useEffect, useRef} from 'react'\r\nimport Input,{InputProps} from '../Input/input'\r\nimport Icon from '../Icon/icon';\r\nimport useDebounce from '../../hooks/useDebounce';\r\nimport classNames from 'classnames';\r\nimport useClickOutside from '../../hooks/useClickOutside';\r\nexport interface DataSourceType {\r\n value: string;\r\n [key: string]: unknown;\r\n }\r\n// export type DataSourceType<T = {}> = T & DataSourceObject\r\n\r\nexport interface AutoCompletProps extends Omit<InputProps,'onSelect' | 'onChange' | 'value'> {\r\n value?: string;\r\n fetchSuggestions: (string: string) => DataSourceType[] | Promise<DataSourceType[]>;\r\n onSelect?: (item: DataSourceType) => void;\r\n onChange?: (str:string) => void;\r\n onEnterDown?: (item: DataSourceType) => void;\r\n onError?: (error: unknown) => void;\r\n renderOption?: (item: DataSourceType) => ReactElement;\r\n debounceTime?: number;\r\n expireTime?: number;\r\n}\r\n\r\nexport const AutoComplete: FC<AutoCompletProps> = (props) => {\r\n const {value,fetchSuggestions,onSelect,onChange,onEnterDown,onError,renderOption,style,debounceTime=300,expireTime=3600000,...restprops} = props;\r\n\r\n const [inputValue,setInputValue] = useState(value || '');\r\n const [suggestions,setSuggestions] = useState<DataSourceType[]>([]);\r\n const [loading, setloading] = useState(false);\r\n const [highlightIndex,sethighlightIndex]= useState(-1);\r\n const [isFocus,setisFocus] = useState(true);\r\n\r\n const componentRef = useRef<HTMLDivElement>(null);\r\n const triggerSearch = useRef(false);\r\n const fetchId = useRef(0);\r\n const intialInputvalue = useRef(value || '');//记录当前输入框不是通过Arraydown与Arrayup方法改变时的值\r\n const debouncedValue = useDebounce(inputValue,debounceTime);//使用该hooks,将inputValue的值进行防抖处理\r\n useClickOutside(componentRef,()=>{setisFocus(false)});//使用该hooks,使得点击组件外部时,将suggestions清空\r\n useEffect(()=>{\r\n function getData(){\r\n \r\n async function fetchData(){\r\n fetchId.current++;\r\n if(debouncedValue){\r\n const Id=fetchId.current;\r\n setloading(true)\r\n setSuggestions([])\r\n try{\r\n const results = await fetchSuggestions(debouncedValue);\r\n \r\n if( Id === fetchId.current && results){\r\n setloading(false)\r\n setSuggestions(results)\r\n const item = {\r\n value: results, // 实际数据\r\n expiry: Date.now() + expireTime, // 当前时间加上1小时的过期时间 (单位毫秒)\r\n };\r\n localStorage.setItem(debouncedValue, JSON.stringify(item))\r\n }\r\n }catch (e){\r\n onError?.(e)\r\n setloading(false)\r\n setSuggestions([])\r\n }\r\n }else{\r\n setloading(false)\r\n setSuggestions([])\r\n }\r\n }\r\n if (triggerSearch.current){\r\n \r\n if(localStorage.getItem(debouncedValue)){\r\n const item = JSON.parse(localStorage.getItem(debouncedValue) as string);\r\n if(item.expiry > new Date().getTime()){\r\n fetchId.current++;\r\n setloading(false)\r\n setSuggestions(item.value)\r\n }else{\r\n localStorage.removeItem(debouncedValue)\r\n fetchData()\r\n }\r\n }else{\r\n fetchData()\r\n }\r\n sethighlightIndex(-1)\r\n }\r\n }\r\n getData()\r\n \r\n },[debouncedValue, fetchSuggestions, expireTime, onError])\r\n\r\n const handleChange = (e:ChangeEvent<HTMLInputElement>)=>{\r\n const value= e.target.value.trim();\r\n setInputValue(value)\r\n onChange?.(value)\r\n \r\n intialInputvalue.current=value\r\n triggerSearch.current=true\r\n };\r\n\r\n const handleSelect = (item:DataSourceType) => {\r\n setInputValue(item.value)\r\n intialInputvalue.current=item.value\r\n setSuggestions([]);\r\n onSelect?.(item);\r\n \r\n triggerSearch.current=false\r\n }\r\n const handleUpDown = (item:DataSourceType) => {\r\n setInputValue(item.value)\r\n triggerSearch.current=false\r\n }\r\n const handleArrowDown = () => {\r\n if(highlightIndex+1>suggestions.length-1){\r\n sethighlightIndex(-1)\r\n \r\n setInputValue(intialInputvalue.current);\r\n triggerSearch.current=false\r\n \r\n }else{\r\n sethighlightIndex(highlightIndex+1)\r\n if(suggestions[highlightIndex+1])handleUpDown(suggestions[highlightIndex+1])\r\n }\r\n }\r\n const handleArrowUp = () => {\r\n if(highlightIndex-1===-1){\r\n sethighlightIndex(highlightIndex-1)\r\n setInputValue(intialInputvalue.current);\r\n triggerSearch.current=false\r\n }else if(highlightIndex-1<-1){\r\n sethighlightIndex(suggestions.length-1)\r\n if(suggestions[suggestions.length-1])handleUpDown(suggestions[suggestions.length-1])\r\n }else{\r\n sethighlightIndex(highlightIndex-1)\r\n handleUpDown(suggestions[highlightIndex-1])\r\n }\r\n }\r\n const handleKeyDown = (e:React.KeyboardEvent<HTMLInputElement>) => {\r\n switch(e.key){\r\n case 'Enter':\r\n if (suggestions[highlightIndex]){\r\n handleSelect(suggestions[highlightIndex])\r\n onEnterDown?.(suggestions[highlightIndex])\r\n }else{\r\n onEnterDown?.({value:intialInputvalue.current})\r\n }\r\n break\r\n case 'ArrowDown':\r\n handleArrowDown()\r\n break\r\n case 'ArrowUp':\r\n handleArrowUp()\r\n break\r\n case 'Escape':\r\n setisFocus(false)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n const handleClick = (e: React.MouseEvent<HTMLInputElement>) => {\r\n setisFocus(true)\r\n }\r\n const generateDropdown = () => {\r\n return (\r\n <ul className=\"viking-suggestion-list\" role=\"listbox\" id=\"suggestion-listbox\">\r\n {suggestions.map((item,index)=>{\r\n const cnames= classNames('suggestion-item',{\r\n 'item-highlighted':index===highlightIndex\r\n })\r\n return (\r\n <li key={index} \r\n onClick={()=>handleSelect(item)}\r\n className={cnames}\r\n role=\"option\"\r\n id={`suggestion-item-${index}`}\r\n aria-selected={index===highlightIndex}\r\n >\r\n {renderOption ? renderOption(item) : item.value}\r\n </li>\r\n )\r\n }\r\n )}\r\n </ul>\r\n )\r\n };\r\n const showSuggestions = isFocus && suggestions.length > 0;\r\n return (\r\n <div className='viking-auto-complete' style={style} ref={componentRef}>\r\n <Input \r\n value={inputValue} \r\n onChange={handleChange}\r\n {...restprops}\r\n onKeyDown={handleKeyDown} \r\n onClick={handleClick}\r\n aria-expanded={showSuggestions}\r\n aria-autocomplete=\"list\"\r\n aria-controls={showSuggestions ? \"suggestion-listbox\" : undefined}\r\n aria-activedescendant={highlightIndex >= 0 ? `suggestion-item-${highlightIndex}` : undefined}\r\n role=\"combobox\"\r\n />\r\n {isFocus && loading && <ul><Icon icon=\"spinner\" spin></Icon>loading...</ul>}\r\n {showSuggestions && generateDropdown()}\r\n </div>\r\n )\r\n}\r\n\r\nexport default AutoComplete\r\n","import React, { ReactElement, InputHTMLAttributes, forwardRef } from 'react'\r\nimport classNames from 'classnames'\r\nimport { IconProp } from '@fortawesome/fontawesome-svg-core'\r\nimport Icon from '../Icon/icon'\r\n\r\ntype InputSize = 'lg' | 'sm'\r\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLElement>, 'size' > {\r\n /**是否禁用 Input */\r\n disabled?: boolean;\r\n /**设置 input 大小,支持 lg 或者是 sm */\r\n size?: InputSize;\r\n /**添加图标,在右侧悬浮添加一个图标,用于提示 */\r\n icon?: IconProp;\r\n /**添加前缀 用于配置一些固定组合 */\r\n prepend?: string | ReactElement;\r\n /**添加后缀 用于配置一些固定组合 */\r\n append?: string | ReactElement;\r\n // onChange? : (e: ChangeEvent<HTMLInputElement>) => void;\r\n}\r\n\r\n/**\r\n * Input 输入框 通过鼠标或键盘输入内容,是最基础的表单域的包装。\r\n * \r\n * ~~~js\r\n * // 这样引用\r\n * import { Input } from 'vikingship'\r\n * ~~~\r\n * \r\n * 支持 HTMLInput 的所有基本属性\r\n */\r\nexport const Input = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\r\n const {\r\n disabled,\r\n size,\r\n icon,\r\n prepend,\r\n append,\r\n style,\r\n ...restProps\r\n } = props\r\n const cnames = classNames('viking-input-wrapper', {\r\n [`input-size-${size}`]: size,\r\n 'is-disabled': disabled,\r\n 'input-group': prepend || append,\r\n 'input-group-append': !!append,\r\n 'input-group-prepend': !!prepend\r\n })\r\n const fixControlledValue = (value: any) => {\r\n if (typeof value === 'undefined' || value === null) {\r\n return ''\r\n }\r\n return value\r\n }\r\n if('value' in props) {\r\n delete restProps.defaultValue\r\n restProps.value = fixControlledValue(props.value)\r\n }\r\n return (\r\n <div className={cnames} style={style}>\r\n {prepend && <div className=\"viking-input-group-prepend\">{prepend}</div>}\r\n {icon && <div className=\"icon-wrapper\"><Icon icon={icon} title={`title-${icon}`}/></div>}\r\n <input\r\n ref={ref}\r\n className=\"viking-input-inner\"\r\n disabled={disabled}\r\n {...restProps}\r\n />\r\n {append && <div className=\"viking-input-group-append\">{append}</div>}\r\n </div>\r\n )\r\n})\r\n\r\nexport default Input;","import { useState, useEffect } from 'react'\r\n\r\nfunction useDebounce<T>(value: T, delay = 300): T {\r\n const [debouncedValue, setDebouncedValue] = useState<T>(value)\r\n useEffect(() => {\r\n const handler = setTimeout(() => {\r\n setDebouncedValue(value)\r\n }, delay)\r\n return () => {\r\n clearTimeout(handler)\r\n }\r\n }, [value, delay])\r\n return debouncedValue\r\n}\r\n\r\nexport default useDebounce;","import { RefObject, useEffect } from \"react\";\r\n\r\nfunction useClickOutside(ref: RefObject<HTMLElement>, handler: (event: MouseEvent) => void) {\r\n useEffect(() => {\r\n const listener = (event: MouseEvent) => {\r\n if (!ref.current || ref.current.contains(event.target as HTMLElement)) {\r\n return\r\n }\r\n handler(event)\r\n }\r\n document.addEventListener('click', listener)\r\n return () => {\r\n document.removeEventListener('click', listener)\r\n }\r\n }, [ref, handler])\r\n}\r\n\r\nexport default useClickOutside","import { ChangeEvent, FC, ReactNode, useRef, useState } from \"react\";\r\nimport axios from \"axios\";\r\n\r\nimport UploadList from \"../Upload/uploadList\";\r\nimport Button from \"../Button/button\";\r\nimport Dragger from \"./dragger\";\r\n\r\nexport interface UploadFile {\r\n uid: string;\r\n size: number;\r\n name: string;\r\n status?: \"ready\" | \"error\" | \"success\" | \"uploading\";\r\n raw?: File;\r\n response?: any;\r\n percent?: number;\r\n error?: any;\r\n}\r\nexport interface AbortControllerDict {\r\n [key: string]: AbortController;\r\n}\r\n\r\nexport interface UploadProps {\r\n action: string;\r\n beforeUpload?: (file: File) => boolean | Promise<File>;\r\n onprogress?: (percentage: number, file: UploadFile) => void;\r\n onSuccess?: (data: any, file: UploadFile) => void;\r\n onError?: (err: any, file: UploadFile) => void;\r\n onChange?: (file: UploadFile) => void;\r\n onRemove?: (file: UploadFile) => void;\r\n onExceed?: (message: string) => void;\r\n headers?: Record<string, string>;\r\n name?: string;\r\n data?: Record<string, string | Blob>;\r\n withCredentials?: boolean;\r\n accept?: string;\r\n multiple?: boolean;\r\n children?: ReactNode;\r\n drag?: boolean;\r\n maxsize?: number;\r\n maxnum?: number;\r\n failednums?: number;\r\n styleDrag?: React.CSSProperties;\r\n styleButton?: React.CSSProperties;\r\n styleUploadList?: React.CSSProperties;\r\n limit?: number;\r\n}\r\n\r\nexport const Upload: FC<UploadProps> = (props) => {\r\n const {\r\n action,\r\n beforeUpload,\r\n onprogress,\r\n onSuccess,\r\n onError,\r\n onChange,\r\n onRemove,\r\n onExceed,\r\n name = \"file\",\r\n headers,\r\n data,\r\n withCredentials,\r\n accept,\r\n multiple,\r\n children,\r\n drag,\r\n maxsize,\r\n maxnum,\r\n styleButton,\r\n styleDrag,\r\n styleUploadList,\r\n failednums = 0,\r\n limit = Infinity,\r\n } = props;\r\n\r\n const fileInput = useRef<HTMLInputElement>(null);\r\n const abortRecord = useRef<AbortControllerDict>({});\r\n const FileRecord = useRef(new Set<string>()); //记录需要上传的文件名\r\n const [fileList, setFileList] = useState<UploadFile[]>([]);\r\n\r\n const handleClick = () => {\r\n fileInput.current?.click();\r\n };\r\n\r\n const uploadFiles = (files: FileList) => {\r\n if (maxnum && files.length > maxnum) {\r\n onExceed?.(`文件数量不能超过${maxnum}`);\r\n return;\r\n }\r\n\r\n let concurrency = 0;\r\n const queue: Array<[() => void, string]> = [];\r\n function AskTask(task: [() => Promise<any>, string]) {\r\n return new Promise(() => {\r\n const executeRequest = () => {\r\n concurrency++;\r\n task[0]().then(() => {\r\n concurrency--;\r\n nextTask();\r\n });\r\n };\r\n if (concurrency < limit) {\r\n executeRequest();\r\n } else {\r\n queue.push([executeRequest, task[1]]);\r\n }\r\n });\r\n }\r\n function nextTask() {\r\n if (concurrency < limit && queue.length > 0) {\r\n while (queue.length > 0) {\r\n const [task, fileName] = queue.shift()!;\r\n\r\n if (FileRecord.current.has(fileName)) {\r\n //判断该文件的上传需求是否已被取消\r\n task();\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n let uidCounter = 0;\r\n function dealFile(file: File): [UploadFile, FormData, AbortController] {\r\n let _file: UploadFile = {\r\n uid: `upload-file-${Date.now()}-${uidCounter++}`,\r\n size: file.size,\r\n name: file.name,\r\n percent: 0,\r\n status: \"ready\",\r\n raw: file,\r\n };\r\n setFileList((prevList) => {\r\n let isSame = false;\r\n for (let i = 0; i < prevList.length; i++) {\r\n if (prevList[i].name === _file.name) {\r\n prevList[i] = _file;\r\n isSame = true;\r\n }\r\n }\r\n if (isSame) return prevList;\r\n return [_file, ...prevList];\r\n });\r\n\r\n const formData = new FormData();\r\n formData.append(name || \"file\", file);\r\n data &&\r\n Object.keys(data).forEach((key) => formData.append(key, data[key]));\r\n const controller = new AbortController();\r\n abortRecord.current = { ...abortRecord.current, [_file.uid]: controller };\r\n\r\n return [_file, formData, controller];\r\n }\r\n const post = (\r\n _file: UploadFile,\r\n formData: FormData,\r\n controller: AbortController,\r\n try_nums: number\r\n ): Promise<string> => {\r\n return new Promise((resolve) => {\r\n axios\r\n .post(action, formData, {\r\n headers: {\r\n ...headers,\r\n \"Content-Type\": \"multipart/form-data\",\r\n },\r\n withCredentials,\r\n signal: controller.signal,\r\n onUploadProgress: (e) => {\r\n let percentage = Math.floor((e.loaded * 100) / e.total! || 0);\r\n if (percentage < 100) {\r\n updateFileList(_file, {\r\n percent: percentage,\r\n status: \"uploading\",\r\n });\r\n _file.status = \"uploading\";\r\n _file.percent = percentage;\r\n onprogress?.(percentage, _file);\r\n }\r\n },\r\n })\r\n .then((res) => {\r\n updateFileList(_file, { status: \"success\", response: res.data });\r\n _file.status = \"success\";\r\n _file.response = res.data;\r\n onSuccess?.(res.data, _file);\r\n onChange?.(_file);\r\n resolve(\"success\");\r\n })\r\n .catch((err) => {\r\n if (axios.isCancel(err)) {\r\n resolve(\"cancel\");\r\n } else {\r\n if (try_nums < failednums) {\r\n const [_file_new, formData, controller] = dealFile(_file.raw!);\r\n AskTask([\r\n () => post(_file_new, formData, controller, try_nums + 1),\r\n _file.name,\r\n ]);\r\n }\r\n updateFileList(_file, { status: \"error\", error: err });\r\n _file.status = \"error\";\r\n _file.error = err;\r\n onError?.(err, _file);\r\n onChange?.(_file);\r\n\r\n resolve(\"failed\");\r\n }\r\n });\r\n });\r\n };\r\n let postFiles = Array.from(files);\r\n postFiles.forEach((file) => {\r\n if (maxsize && file.size > maxsize * 1024 * 1024) {\r\n onExceed?.(`文件大小不能超过${maxsize}Mb`);\r\n return;\r\n }\r\n\r\n FileRecord.current.add(file.name);\r\n if (!beforeUpload) {\r\n const [_file, formData, source] = dealFile(file);\r\n AskTask([() => post(_file, formData, source, 0), file.name]);\r\n } else {\r\n const result = beforeUpload(file);\r\n if (result && result instanceof Promise) {\r\n result.then((processedFile) => {\r\n const [_file, formData, source] = dealFile(file);\r\n AskTask([() => post(_file, formData, source, 0), file.name]);\r\n });\r\n } else if (result) {\r\n const [_file, formData, source] = dealFile(file);\r\n AskTask([() => post(_file, formData, source, 0), file.name]);\r\n }\r\n }\r\n });\r\n };\r\n const updateFileList = (\r\n updateFile: UploadFile,\r\n uploadobj: Partial<UploadFile>\r\n ) => {\r\n setFileList((prevList) => {\r\n return prevList.map((file) =>\r\n file.uid === updateFile.uid ? { ...file, ...uploadobj } : file\r\n );\r\n });\r\n };\r\n\r\n const handleFileChange = (e: ChangeEvent<HTMLInputElement>) => {\r\n const files = e.target.files;\r\n if (files) {\r\n uploadFiles(files);\r\n if (fileInput.current) {\r\n fileInput.current.value = \"\"; //上传完清空文件\r\n }\r\n }\r\n };\r\n const handleRemove = (file: UploadFile) => {\r\n setFileList((prevList) => {\r\n return prevList.filter((item) => item.uid !== file.uid);\r\n });\r\n abortRecord.current[file.uid]?.abort();\r\n delete abortRecord.current[file.uid];\r\n FileRecord.current.delete(file.name);\r\n onRemove?.(file);\r\n };\r\n return (\r\n <div className=\"viking-upload-component\">\r\n {drag ? (\r\n <Dragger\r\n style={styleDrag}\r\n onFile={(files) => {\r\n uploadFiles(files);\r\n }}\r\n >\r\n {children}\r\n </Dragger>\r\n ) : (\r\n <Button btnType=\"default\" onClick={handleClick} style={styleButton}>\r\n {children}\r\n </Button>\r\n )}\r\n <input\r\n type=\"file\"\r\n className=\"viking-file-input\"\r\n style={{ display: \"none\" }}\r\n ref={fileInput}\r\n onChange={handleFileChange}\r\n accept={accept}\r\n multiple={multiple}\r\n />\r\n <UploadList\r\n style={styleUploadList}\r\n fileList={fileList}\r\n onRemove={handleRemove}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default Upload;\r\n","import React, { FC } from 'react'\r\nimport { ThemeProps } from '../Icon/icon'\r\nexport interface ProgressProps {\r\n percent: number;\r\n strokeHeight?: number;\r\n showText?: boolean;\r\n style?: React.CSSProperties;\r\n theme?: ThemeProps;\r\n}\r\n\r\nconst Progress: FC<ProgressProps> = (props) => {\r\n const {\r\n percent,\r\n strokeHeight=15,\r\n showText=true,\r\n style,\r\n theme='primary',\r\n } = props\r\n return (\r\n <div className=\"viking-progress-bar\" style={style}>\r\n <div className=\"viking-progress-bar-outer\" style={{ height: `${strokeHeight}px`}}>\r\n <div \r\n className={`viking-progress-bar-inner color-${theme}`}\r\n style={{width: `${percent}%`}}\r\n >\r\n {showText && <span className=\"inner-text\">{`${percent}%`}</span>}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Progress;\r\n","import React, { FC } from 'react'\r\nimport { UploadFile } from './upload'\r\nimport Icon from '../Icon/icon'\r\nimport Progress from '../Progress/progress'\r\ninterface UploadListProps {\r\n fileList: UploadFile[];\r\n onRemove: (_file: UploadFile) => void;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nexport const UploadList: FC<UploadListProps> = (props) => {\r\n const {\r\n fileList,\r\n onRemove,\r\n style\r\n } = props\r\n return (\r\n <ul className=\"viking-upload-list\" style={style}>\r\n {fileList.map(item => {\r\n return (\r\n <li className=\"viking-upload-list-item\" key={item.uid}>\r\n <span className={`file-name file-name-${item.status}`}>\r\n <Icon icon=\"file-alt\" theme=\"secondary\" />\r\n {item.name}\r\n </span>\r\n <span className=\"file-status\">\r\n {(item.status === 'uploading' || item.status === 'ready') && <Icon icon=\"spinner\" spin theme=\"primary\" />}\r\n {item.status === 'success' && <Icon icon=\"check-circle\" theme=\"success\" />}\r\n {item.status === 'error' && <Icon icon=\"times-circle\" theme=\"danger\" />}\r\n </span>\r\n <span className=\"file-actions\">\r\n <Icon icon=\"times\" onClick={() => { onRemove(item)}}/>\r\n </span>\r\n {item.status === 'uploading' && \r\n <Progress \r\n percent={item.percent || 0}\r\n />\r\n }\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n\r\n}\r\n\r\nexport default UploadList;","import React, { FC, useState, DragEvent, ReactNode, useRef } from 'react'\r\nimport classNames from 'classnames'\r\n\r\ninterface DraggerProps {\r\n onFile: (files: FileList) => void;\r\n children?: ReactNode;\r\n style?:React.CSSProperties\r\n}\r\n\r\nexport const Dragger: FC<DraggerProps> = (props) => {\r\n const { onFile, children, style} = props\r\n const [ dragOver, setDragOver ] = useState(false)\r\n const fileInput = useRef<HTMLInputElement>(null)\r\n const klass = classNames('viking-uploader-dragger', {\r\n 'is-dragover': dragOver\r\n })\r\n const handleDrop = (e: DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n setDragOver(false)\r\n onFile(e.dataTransfer.files)\r\n }\r\n const handleDrag = (e: DragEvent<HTMLElement>, over: boolean) => {\r\n e.preventDefault()\r\n setDragOver(over)\r\n }\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault()\r\n fileInput.current?.click()\r\n }\r\n }\r\n return (\r\n <div \r\n className={klass}\r\n onDragOver={e => { handleDrag(e, true)}}\r\n onDragLeave={e => { handleDrag(e, false)}}\r\n onDrop={handleDrop}\r\n style={style}\r\n role=\"button\"\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n aria-label=\"拖拽上传区域\"\r\n >\r\n <input\r\n type=\"file\"\r\n ref={fileInput}\r\n style={{ display: 'none' }}\r\n onChange={(e) => {\r\n if (e.target.files) {\r\n onFile(e.target.files)\r\n e.target.value = ''\r\n }\r\n }}\r\n />\r\n {children}\r\n </div>\r\n )\r\n}\r\n\r\nexport default Dragger;","import { useState, FC, useRef, useEffect } from \"react\";\r\n\r\ninterface SignatureProps {\r\n width?: number;\r\n height?: number;\r\n style?: React.CSSProperties;\r\n onSave?: (dataUrl: string | undefined) => void;\r\n}\r\nconst Signature: FC<SignatureProps> = ({\r\n width = 400,\r\n height = 200,\r\n style,\r\n onSave,\r\n}) => {\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [strokeStyle, setStrokeStyle] = useState(\"pen\");\r\n const [points, setPoints] = useState<{ x: number; y: number }>({\r\n x: 0,\r\n y: 0,\r\n });\r\n\r\n const canvas = useRef<HTMLCanvasElement>(null);\r\n const ctx = useRef<CanvasRenderingContext2D>();\r\n\r\n useEffect(() => {\r\n ctx.current = canvas.current?.getContext(\"2d\") as CanvasRenderingContext2D;\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!ctx.current) return;\r\n if (strokeStyle === \"pen\") {\r\n ctx.current.lineWidth = 2;\r\n ctx.current.lineCap = \"round\";\r\n } else if (strokeStyle === \"brush\") {\r\n ctx.current.lineWidth = 5;\r\n ctx.current.lineCap = \"round\";\r\n }\r\n }, [strokeStyle]);\r\n\r\n const startDrawing = (\r\n e: React.MouseEvent<HTMLCanvasElement> & React.TouchEvent<HTMLCanvasElement>\r\n ) => {\r\n // e.preventDefault();\r\n setIsDrawing(true);\r\n ctx.current?.beginPath();\r\n const { offsetX, offsetY } = getEventPosition(e);\r\n\r\n setPoints({ x: offsetX, y: offsetY });\r\n ctx.current?.moveTo(offsetX, offsetY); // 移动画笔到初始位置\r\n };\r\n\r\n const draw = (\r\n e: React.MouseEvent<HTMLCanvasElement> & React.TouchEvent<HTMLCanvasElement>\r\n ) => {\r\n // e.preventDefault(); // 阻止默认行为,避免页面滚动\r\n if (!isDrawing) return; // 如果不是在绘制,直接返回\r\n\r\n // 获取当前触点位置\r\n const { offsetX, offsetY } = getEventPosition(e);\r\n // 使用贝塞尔曲线进行平滑过渡绘制\r\n ctx.current?.quadraticCurveTo(\r\n points[\"x\"],\r\n points[\"y\"],\r\n (points[\"x\"] + offsetX) / 2,\r\n (points[\"y\"] + offsetY) / 2\r\n );\r\n ctx.current?.stroke(); // 实际绘制路径\r\n\r\n // 更新上一个点的位置\r\n setPoints({ x: offsetX, y: offsetY });\r\n };\r\n\r\n const stopDrawing = (\r\n e: React.TouchEvent<HTMLCanvasElement> & React.MouseEvent<HTMLCanvasElement>\r\n ) => {\r\n // e.preventDefault(); // 阻止默认行为\r\n setIsDrawing(false); // 结束绘制状态\r\n };\r\n\r\n const getEventPosition = (\r\n e: React.MouseEvent<HTMLCanvasElement> & React.TouchEvent<HTMLCanvasElement>\r\n ) => {\r\n const offsetX =\r\n e.nativeEvent.offsetX ??\r\n e.touches[0].clientX - canvas.current!.offsetLeft;\r\n const offsetY =\r\n e.nativeEvent.offsetY ?? e.touches[0].clientY - canvas.current!.offsetTop;\r\n return { offsetX, offsetY };\r\n };\r\n\r\n const handleStrokeStyle = (e: React.ChangeEvent<HTMLSelectElement>) => {\r\n setStrokeStyle(e.target.value);\r\n };\r\n const handleSave = () => {\r\n const dataURL = canvas.current?.toDataURL();\r\n // 在此处可以将 dataURL 发送到服务器或进行其他操作\r\n onSave?.(dataURL);\r\n };\r\n return (\r\n <>\r\n <canvas\r\n ref={canvas}\r\n onMouseDown={startDrawing}\r\n onMouseUp={stopDrawing}\r\n onMouseMove={draw}\r\n onMouseOut={stopDrawing}\r\n onTouchStart={startDrawing}\r\n onTouchEnd={stopDrawing}\r\n onTouchMove={draw}\r\n onTouchCancel={stopDrawing}\r\n style={{ border: \"1px solid black\", ...style }}\r\n width={width}\r\n height={height}\r\n className=\"viking-signature\"\r\n aria-label=\"签名画布\"\r\n role=\"img\"\r\n ></canvas>\r\n\r\n <div className=\"controls\" style={{ width }}>\r\n <label htmlFor=\"stroke-style-select\">笔触样式</label>\r\n <select id=\"stroke-style-select\" onChange={handleStrokeStyle}>\r\n <option value=\"pen\">钢笔</option>\r\n <option value=\"brush\">毛笔</option>\r\n </select>\r\n <button\r\n type=\"button\"\r\n onClick={() =>\r\n ctx.current!.clearRect(\r\n 0,\r\n 0,\r\n canvas.current!.width,\r\n canvas.current!.height\r\n )\r\n }\r\n >\r\n 清空\r\n </button>\r\n <button type=\"button\" onClick={handleSave}>保存</button>\r\n </div>\r\n </>\r\n );\r\n};\r\n\r\nexport default Signature;\r\n","import { useState, FC, Children, cloneElement } from \"react\";\r\n\r\ninterface VirtualListProps {\r\n containerHeight: number;\r\n itemHeight: number;\r\n itemCount: number;\r\n children: JSX.Element;\r\n}\r\nconst VirtualList: FC<VirtualListProps> = ({\r\n containerHeight,\r\n itemHeight,\r\n itemCount,\r\n children,\r\n}) => {\r\n // children 语义不好,赋值给 Component\r\n if (Children.count(children) > 1) {\r\n throw new Error(\"VirtualList only accept one child\");\r\n }\r\n\r\n const contentHeight = itemHeight * itemCount; // 内容高度\r\n const [scrollTop, setScrollTop] = useState<number>(0); // 滚动高度\r\n\r\n // 继续需要渲染的 item 索引有哪些\r\n let startIdx = Math.floor(scrollTop / itemHeight);\r\n let endIdx = Math.floor((scrollTop + containerHeight) / itemHeight);\r\n\r\n // 上下额外多渲染几个 item,解决滚动时来不及加载元素出现短暂的空白区域的问题\r\n const paddingCount = 2;\r\n startIdx = Math.max(startIdx - paddingCount, 0); // 处理越界情况\r\n endIdx = Math.min(endIdx + paddingCount, itemCount - 1);\r\n\r\n const top = itemHeight * startIdx; // 第一个渲染 item 到顶部距离\r\n\r\n // 需要渲染的 items\r\n const items = [];\r\n for (let i = startIdx; i <= endIdx; i++) {\r\n items.push(\r\n cloneElement(children, {\r\n index: i,\r\n style: { height: itemHeight },\r\n })\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n style={{ height: containerHeight, overflow: \"auto\" }}\r\n onScroll={(e) => {\r\n setScrollTop((e.target as HTMLDivElement).scrollTop);\r\n }}\r\n >\r\n <div style={{ height: contentHeight }}>\r\n <div style={{ transform: `translate3d(0px, ${top}px, 0` }}>{items}</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default VirtualList;\r\n","import {\r\n CSSProperties,\r\n FC,\r\n ReactNode,\r\n useEffect,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\ninterface LazyloadProps {\r\n className?: string;\r\n style?: CSSProperties;\r\n placeholder?: ReactNode;\r\n offset?: string | number;\r\n width?: number | string;\r\n height?: string | number;\r\n onContentVisible?: () => void;\r\n children: ReactNode;\r\n}\r\n\r\nconst Lazyload: FC<LazyloadProps> = (props) => {\r\n const {\r\n className = \"\",\r\n style,\r\n offset = 0,\r\n width,\r\n onContentVisible,\r\n placeholder,\r\n height,\r\n children,\r\n } = props;\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [visible, setVisible] = useState(false);\r\n\r\n const elementObserver = useRef<IntersectionObserver>();\r\n\r\n useEffect(() => {\r\n function lazyLoadHandler(entries: IntersectionObserverEntry[]) {\r\n const [entry] = entries;\r\n const { isIntersecting } = entry;\r\n\r\n if (isIntersecting) {\r\n setVisible(true);\r\n onContentVisible?.();\r\n\r\n const node = containerRef.current;\r\n if (node && node instanceof HTMLElement) {\r\n elementObserver.current?.unobserve(node);\r\n }\r\n }\r\n }\r\n\r\n const options = {\r\n rootMargin: typeof offset === \"number\" ? `${offset}px` : offset || \"0px\",\r\n threshold: 0,\r\n };\r\n\r\n elementObserver.current = new IntersectionObserver(\r\n lazyLoadHandler,\r\n options\r\n );\r\n\r\n const node = containerRef.current;\r\n\r\n if (node instanceof HTMLElement) {\r\n elementObserver.current.observe(node);\r\n }\r\n return () => {\r\n if (node && node instanceof HTMLElement) {\r\n elementObserver.current?.unobserve(node);\r\n }\r\n };\r\n }, [offset, onContentVisible]);\r\n\r\n const styles = { height, width, ...style };\r\n\r\n return (\r\n <div ref={containerRef} className={className} style={styles}>\r\n {visible ? children : placeholder}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Lazyload;\r\n","import React, { createContext, useContext, useEffect, useRef, useState } from \"react\";\r\nimport { useOutlet, useLocation, matchPath } from \"react-router-dom\";\r\nimport type { FC, PropsWithChildren, ReactNode } from \"react\";\r\n\r\ninterface KeepAliveLayoutProps extends PropsWithChildren {\r\n keepPaths: Array<string | RegExp>;\r\n keepElements?: Record<string, ReactNode>;\r\n dropByPath?: (path: string) => void;\r\n}\r\n\r\ntype KeepAliveContextType = Omit<Required<KeepAliveLayoutProps>, \"children\">;\r\n\r\nexport const KeepAliveContext = createContext<KeepAliveContextType>({\r\n keepPaths: [],\r\n keepElements: {},\r\n dropByPath() {},\r\n});\r\n\r\nconst isKeepPath = (keepPaths: Array<string | RegExp>, path: string) => {\r\n for (let i = 0; i < keepPaths.length; i++) {\r\n let item = keepPaths[i];\r\n if (item === path) return true;\r\n if (item instanceof RegExp && item.test(path)) return true;\r\n if (typeof item === \"string\" && item.toLowerCase() === path) return true;\r\n }\r\n return false;\r\n};\r\n\r\nexport function useKeepOutlet() {\r\n const location = useLocation();\r\n const element = useOutlet();\r\n\r\n const { keepElements, keepPaths } = useContext(KeepAliveContext);\r\n const isKeep = isKeepPath(keepPaths, location.pathname);\r\n\r\n const keepElementsRef = useRef(keepElements);\r\n keepElementsRef.current = keepElements;\r\n\r\n useEffect(() => {\r\n if (isKeep && element) {\r\n keepElementsRef.current[location.pathname] = element;\r\n }\r\n });\r\n\r\n return (\r\n <>\r\n {Object.entries(keepElements).map(([pathname, el]) => (\r\n <div\r\n key={pathname}\r\n style={{\r\n height: \"100%\",\r\n width: \"100%\",\r\n position: \"relative\",\r\n overflow: \"hidden auto\",\r\n }}\r\n className=\"keep-alive-page\"\r\n hidden={!matchPath(location.pathname, pathname)}\r\n >\r\n {el}\r\n </div>\r\n ))}\r\n {!isKeep && element}\r\n </>\r\n );\r\n}\r\n\r\nconst KeepAliveLayout: FC<KeepAliveLayoutProps> = (props) => {\r\n const { keepPaths, children } = props;\r\n\r\n const [keepElements] = useState<Record<string, ReactNode>>({});\r\n\r\n const dropByPath = (path: string) => {\r\n delete keepElements[path];\r\n };\r\n\r\n return (\r\n <KeepAliveContext.Provider value={{ keepPaths, keepElements, dropByPath }}>\r\n {children}\r\n </KeepAliveContext.Provider>\r\n );\r\n};\r\n\r\nexport default KeepAliveLayout;\r\n"],"mappings":"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","names":["classNames","jsx","React","useState","classNames","classNames","jsx","jsx","classNames","jsx","useState","classNames","React","useContext","classNames","jsx","useContext","classNames","useState","useEffect","useRef","classNames","jsx","jsxs","classNames","useState","classNames","useEffect","jsx","jsxs","useState","useRef","useEffect","value","classNames","useRef","useState","jsx","jsx","jsxs","useState","useRef","classNames","jsx","jsxs","jsx","jsxs","useRef","useState","formData","controller","useState","useRef","useEffect","jsx","jsxs","useState","Children","jsx","useEffect","useRef","useState","jsx","node","createContext","useContext","useEffect","useRef","useState","Fragment","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@guiwzh/small-design",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A lightweight React component library",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": {
|
|
11
|
+
"types": "./dist/index.d.mts",
|
|
12
|
+
"default": "./dist/index.mjs"
|
|
13
|
+
},
|
|
14
|
+
"require": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.cjs"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"./dist/index.css": "./dist/index.css"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": [
|
|
25
|
+
"dist/**/*.css"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"start": "react-scripts start",
|
|
29
|
+
"build": "tsup && sass ./src/styles/index.scss ./dist/index.css --no-source-map",
|
|
30
|
+
"test": "react-scripts test",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"react",
|
|
35
|
+
"component",
|
|
36
|
+
"ui",
|
|
37
|
+
"library",
|
|
38
|
+
"typescript"
|
|
39
|
+
],
|
|
40
|
+
"author": "guiwz",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"peerDependencies": {
|
|
43
|
+
"react": ">=18.0.0",
|
|
44
|
+
"react-dom": ">=18.0.0",
|
|
45
|
+
"axios": ">=1.0.0",
|
|
46
|
+
"react-router-dom": ">=6.0.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"axios": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"react-router-dom": {
|
|
53
|
+
"optional": true
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"classnames": "^2.5.1",
|
|
58
|
+
"react-transition-group": "^4.4.5",
|
|
59
|
+
"@fortawesome/fontawesome-svg-core": "^6.6.0",
|
|
60
|
+
"@fortawesome/free-solid-svg-icons": "^6.6.0",
|
|
61
|
+
"@fortawesome/react-fontawesome": "^0.2.2"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@testing-library/jest-dom": "^5.17.0",
|
|
65
|
+
"@testing-library/react": "^13.4.0",
|
|
66
|
+
"@testing-library/user-event": "^13.5.0",
|
|
67
|
+
"@types/jest": "^27.5.2",
|
|
68
|
+
"@types/node": "^16.18.103",
|
|
69
|
+
"@types/react": "^18.3.3",
|
|
70
|
+
"@types/react-dom": "^18.3.0",
|
|
71
|
+
"@types/react-transition-group": "^4.4.10",
|
|
72
|
+
"axios": "^1.7.2",
|
|
73
|
+
"react": "^18.3.1",
|
|
74
|
+
"react-dom": "^18.3.1",
|
|
75
|
+
"react-router-dom": "^6.26.2",
|
|
76
|
+
"react-scripts": "5.0.1",
|
|
77
|
+
"sass": "^1.77.8",
|
|
78
|
+
"tsup": "^8.5.1",
|
|
79
|
+
"typescript": "^4.9.5"
|
|
80
|
+
},
|
|
81
|
+
"eslintConfig": {
|
|
82
|
+
"extends": [
|
|
83
|
+
"react-app",
|
|
84
|
+
"react-app/jest"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"browserslist": {
|
|
88
|
+
"production": [
|
|
89
|
+
">0.2%",
|
|
90
|
+
"not dead",
|
|
91
|
+
"not op_mini all"
|
|
92
|
+
],
|
|
93
|
+
"development": [
|
|
94
|
+
"last 1 chrome version",
|
|
95
|
+
"last 1 firefox version",
|
|
96
|
+
"last 1 safari version"
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
}
|