| 'use client' | |
| import React, { useRef } from 'react' | |
| import { useRouter } from 'next/navigation' | |
| import { useHover } from 'ahooks' | |
| import s from './style.module.css' | |
| import cn from '@/utils/classnames' | |
| import ItemOperation from '@/app/components/explore/item-operation' | |
| import AppIcon from '@/app/components/base/app-icon' | |
| import type { AppIconType } from '@/types/app' | |
| export type IAppNavItemProps = { | |
| isMobile: boolean | |
| name: string | |
| id: string | |
| icon_type: AppIconType | null | |
| icon: string | |
| icon_background: string | |
| icon_url: string | |
| isSelected: boolean | |
| isPinned: boolean | |
| togglePin: () => void | |
| uninstallable: boolean | |
| onDelete: (id: string) => void | |
| } | |
| export default function AppNavItem({ | |
| isMobile, | |
| name, | |
| id, | |
| icon_type, | |
| icon, | |
| icon_background, | |
| icon_url, | |
| isSelected, | |
| isPinned, | |
| togglePin, | |
| uninstallable, | |
| onDelete, | |
| }: IAppNavItemProps) { | |
| const router = useRouter() | |
| const url = `/explore/installed/${id}` | |
| const ref = useRef(null) | |
| const isHovering = useHover(ref) | |
| return ( | |
| <div | |
| ref={ref} | |
| key={id} | |
| className={cn( | |
| s.item, | |
| isSelected ? s.active : 'hover:bg-gray-200', | |
| 'flex h-8 items-center justify-between mobile:justify-center px-2 mobile:px-1 rounded-lg text-sm font-normal', | |
| )} | |
| onClick={() => { | |
| router.push(url) // use Link causes popup item always trigger jump. Can not be solved by e.stopPropagation(). | |
| }} | |
| > | |
| {isMobile && <AppIcon size='tiny' iconType={icon_type} icon={icon} background={icon_background} imageUrl={icon_url} />} | |
| {!isMobile && ( | |
| <> | |
| <div className='flex items-center space-x-2 w-0 grow'> | |
| <AppIcon size='tiny' iconType={icon_type} icon={icon} background={icon_background} imageUrl={icon_url} /> | |
| <div className='overflow-hidden text-ellipsis whitespace-nowrap' title={name}>{name}</div> | |
| </div> | |
| <div className='shrink-0 h-6' onClick={e => e.stopPropagation()}> | |
| <ItemOperation | |
| isPinned={isPinned} | |
| isItemHovering={isHovering} | |
| togglePin={togglePin} | |
| isShowDelete={!uninstallable && !isSelected} | |
| onDelete={() => onDelete(id)} | |
| /> | |
| </div> | |
| </> | |
| )} | |
| </div> | |
| ) | |
| } | |