| 
                        1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | 
                        - 'use client'
 - 
 - import { useContext, useContextSelector } from 'use-context-selector'
 - import Link from 'next/link'
 - import type { MouseEventHandler } from 'react'
 - import { useCallback, useState } from 'react'
 - import { useTranslation } from 'react-i18next'
 - import style from '../list.module.css'
 - import AppModeLabel from './AppModeLabel'
 - import type { App } from '@/types/app'
 - import Confirm from '@/app/components/base/confirm'
 - import { ToastContext } from '@/app/components/base/toast'
 - import { deleteApp } from '@/service/apps'
 - import AppIcon from '@/app/components/base/app-icon'
 - import AppsContext from '@/context/app-context'
 - 
 - export type AppCardProps = {
 -   app: App
 -   onDelete?: () => void
 - }
 - 
 - const AppCard = ({
 -   app,
 -   onDelete
 - }: AppCardProps) => {
 -   const { t } = useTranslation()
 -   const { notify } = useContext(ToastContext)
 - 
 -   const mutateApps = useContextSelector(AppsContext, state => state.mutateApps)
 - 
 -   const [showConfirmDelete, setShowConfirmDelete] = useState(false)
 -   const onDeleteClick: MouseEventHandler = useCallback((e) => {
 -     e.preventDefault()
 -     setShowConfirmDelete(true)
 -   }, [])
 -   const onConfirmDelete = useCallback(async () => {
 -     try {
 -       await deleteApp(app.id)
 -       notify({ type: 'success', message: t('app.appDeleted') })
 -       if (onDelete)
 -         onDelete()
 -       mutateApps()
 -     }
 -     catch (e: any) {
 -       notify({ type: 'error', message: `${t('app.appDeleteFailed')}${'message' in e ? `: ${e.message}` : ''}` })
 -     }
 -     setShowConfirmDelete(false)
 -   }, [app.id])
 - 
 -   return (
 -     <>
 -       <Link href={`/app/${app.id}/overview`} className={style.listItem}>
 -         <div className={style.listItemTitle}>
 -           <AppIcon size='small' icon={app.icon} background={app.icon_background} />
 -           <div className={style.listItemHeading}>
 -             <div className={style.listItemHeadingContent}>{app.name}</div>
 -           </div>
 -           <span className={style.deleteAppIcon} onClick={onDeleteClick} />
 -         </div>
 -         <div className={style.listItemDescription}>{app.model_config?.pre_prompt}</div>
 -         <div className={style.listItemFooter}>
 -           <AppModeLabel mode={app.mode} />
 -         </div>
 - 
 -         {showConfirmDelete && (
 -           <Confirm
 -             title={t('app.deleteAppConfirmTitle')}
 -             content={t('app.deleteAppConfirmContent')}
 -             isShow={showConfirmDelete}
 -             onClose={() => setShowConfirmDelete(false)}
 -             onConfirm={onConfirmDelete}
 -             onCancel={() => setShowConfirmDelete(false)}
 -           />
 -         )}
 -       </Link>
 -     </>
 -   )
 - }
 - 
 - export default AppCard
 
 
  |