import { DetailedHTMLProps, HTMLAttributes, MouseEvent } from 'react' import VanillaTilt, { TiltOptions } from 'vanilla-tilt' import protocolCheck from 'custom-protocol-check' import Icon from '@ant-design/icons' import '@/assets/css/components/tools/store-card.scss' import { COLOR_BACKGROUND, COLOR_MAIN, COLOR_PRODUCTION } from '@/constants/common.constants' import { checkDesktop, omitText } from '@/util/common' import { getLoginStatus, getUserId } from '@/util/auth' import { navigateToLogin, navigateToSource, navigateToStore, navigateToView } from '@/util/navigation' import { r_tool_add_favorite, r_tool_remove_favorite } from '@/services/tool' import Card from '@/components/common/Card' import FlexBox from '@/components/common/FlexBox' import DragHandle from '@/components/dnd/DragHandle' import Draggable from '@/components/dnd/Draggable' interface StoreCardProps extends DetailedHTMLProps, HTMLDivElement> { icon: string toolName: string toolId: string toolDesc: string options?: TiltOptions author: UserWithInfoVo showAuthor?: boolean ver: string platform: Platform supportPlatform: Platform[] favorite: boolean } const StoreCard = ({ style, // eslint-disable-next-line @typescript-eslint/no-unused-vars ref, icon, toolName, toolId, toolDesc, options = { reverse: true, max: 8, glare: true, ['max-glare']: 0.3, scale: 1.03 }, author, showAuthor = true, ver, platform, supportPlatform, favorite, ...props }: StoreCardProps) => { const navigate = useNavigate() const [modal, contextHolder] = AntdModal.useModal() const cardRef = useRef(null) const [favorite_, setFavorite_] = useState(favorite) const [userId, setUserId] = useState('') useEffect(() => { cardRef.current && VanillaTilt.init(cardRef.current, options) if (getLoginStatus()) { void getUserId().then((value) => setUserId(value)) } }, [options]) const handleCardOnClick = () => { if (!checkDesktop() && platform === 'DESKTOP') { void message.warning('此应用需要桌面端环境,请在桌面端打开') return } if (platform === 'ANDROID') { void modal.info({ icon: , title: 'Android 端', centered: true, maskClosable: true, content: ( 请使用手机端扫描上方二维码 ) }) return } navigateToView(navigate, author.username, toolId, platform) } const handleOnClickAuthor = (e: MouseEvent) => { e.stopPropagation() navigateToStore(navigate, author.username) } const handleOnSourceBtnClick = (e: MouseEvent) => { e.stopPropagation() navigateToSource(navigate, author.username, toolId, platform) } const handleOnStarBtnClick = (e: MouseEvent) => { e.stopPropagation() if (!getLoginStatus()) { navigateToLogin(navigate, undefined, `${location.pathname}${location.search}`) return } if (favorite_) { void r_tool_remove_favorite({ authorId: author.id, toolId: toolId, platform: platform }).then((res) => { const response = res.data if (response.success) { setFavorite_(false) } else { void message.error('取消收藏失败,请稍后重试') } }) } else { void r_tool_add_favorite({ authorId: author.id, toolId: toolId, platform: platform }).then((res) => { const response = res.data if (response.success) { setFavorite_(true) } else { void message.error('收藏失败,请稍后重试') } }) } } const handleOnAndroidBtnClick = (e: MouseEvent) => { e.stopPropagation() void modal.info({ icon: , title: 'Android 端', centered: true, maskClosable: true, content: ( 请使用手机端扫描上方二维码 ) }) } const handleOnDesktopBtnClick = (e: MouseEvent) => { e.stopPropagation() if (!checkDesktop()) { void message.loading({ content: '启动桌面端中……', key: 'LOADING', duration: 0 }) protocolCheck( `oxygen://openurl/view/${author.username}/${toolId}`, () => { void message.warning('打开失败,此应用需要桌面端环境,请安装桌面端后重试') void message.destroy('LOADING') }, () => { void message.destroy('LOADING') }, 2000, () => { void message.warning('打开失败,此应用需要桌面端环境,请安装桌面端后重试') void message.destroy('LOADING') } ) return } navigateToView(navigate, author.username, toolId, platform) } const handleOnWebBtnClick = (e: MouseEvent) => { e.stopPropagation() navigateToView(navigate, author.username, toolId, platform) } return ( <>
{platform.slice(0, 1)}-{ver}
{platform !== 'ANDROID' && supportPlatform.includes('ANDROID') && ( )} {platform === 'DESKTOP' && supportPlatform.includes('WEB') && ( )} {platform === 'WEB' && supportPlatform.includes('DESKTOP') && ( )} {author.id !== userId && ( )}
{'Icon'}
{toolName}
{`ID: ${toolId}`}
{toolDesc && (
{`简介:${omitText(toolDesc, 18)}`}
)}
{showAuthor && (
} style={{ background: COLOR_BACKGROUND }} />
{author.userInfo.nickname}
)}
{contextHolder} ) } export default StoreCard