123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 'use client'
- import type { FC } from 'react'
- import React, { useCallback, useRef, useState } from 'react'
- import { useTranslation } from 'react-i18next'
- import { PluginSource } from '../types'
- import { RiArrowRightUpLine, RiMoreFill } from '@remixicon/react'
- import ActionButton from '@/app/components/base/action-button'
- // import Button from '@/app/components/base/button'
- import {
- PortalToFollowElem,
- PortalToFollowElemContent,
- PortalToFollowElemTrigger,
- } from '@/app/components/base/portal-to-follow-elem'
- import cn from '@/utils/classnames'
- type Props = {
- source: PluginSource
- onInfo: () => void
- onCheckVersion: () => void
- onRemove: () => void
- detailUrl: string
- }
- const OperationDropdown: FC<Props> = ({
- source,
- detailUrl,
- onInfo,
- onCheckVersion,
- onRemove,
- }) => {
- const { t } = useTranslation()
- const [open, doSetOpen] = useState(false)
- const openRef = useRef(open)
- const setOpen = useCallback((v: boolean) => {
- doSetOpen(v)
- openRef.current = v
- }, [doSetOpen])
- const handleTrigger = useCallback(() => {
- setOpen(!openRef.current)
- }, [setOpen])
- return (
- <PortalToFollowElem
- open={open}
- onOpenChange={setOpen}
- placement='bottom-end'
- offset={{
- mainAxis: -12,
- crossAxis: 36,
- }}
- >
- <PortalToFollowElemTrigger onClick={handleTrigger}>
- <div>
- <ActionButton className={cn(open && 'bg-state-base-hover')}>
- <RiMoreFill className='w-4 h-4' />
- </ActionButton>
- </div>
- </PortalToFollowElemTrigger>
- <PortalToFollowElemContent className='z-50'>
- <div className='w-[160px] p-1 bg-components-panel-bg-blur rounded-xl border-[0.5px] border-components-panel-border shadow-lg'>
- {source === PluginSource.github && (
- <div
- onClick={() => {
- onInfo()
- handleTrigger()
- }}
- className='px-3 py-1.5 rounded-lg text-text-secondary system-md-regular cursor-pointer hover:bg-state-base-hover'
- >{t('plugin.detailPanel.operation.info')}</div>
- )}
- {source === PluginSource.github && (
- <div
- onClick={() => {
- onCheckVersion()
- handleTrigger()
- }}
- className='px-3 py-1.5 rounded-lg text-text-secondary system-md-regular cursor-pointer hover:bg-state-base-hover'
- >{t('plugin.detailPanel.operation.checkUpdate')}</div>
- )}
- {(source === PluginSource.marketplace || source === PluginSource.github) && (
- <a href={detailUrl} target='_blank' className='flex items-center px-3 py-1.5 rounded-lg text-text-secondary system-md-regular cursor-pointer hover:bg-state-base-hover'>
- <span className='grow'>{t('plugin.detailPanel.operation.viewDetail')}</span>
- <RiArrowRightUpLine className='shrink-0 w-3.5 h-3.5 text-text-tertiary' />
- </a>
- )}
- {(source === PluginSource.marketplace || source === PluginSource.github) && (
- <div className='my-1 h-px bg-divider-subtle'></div>
- )}
- <div
- onClick={() => {
- onRemove()
- handleTrigger()
- }}
- className='px-3 py-1.5 rounded-lg text-text-secondary system-md-regular cursor-pointer hover:text-text-destructive hover:bg-state-destructive-hover'
- >{t('plugin.detailPanel.operation.remove')}</div>
- </div>
- </PortalToFollowElemContent>
- </PortalToFollowElem>
- )
- }
- export default React.memo(OperationDropdown)
|