This commit is contained in:
2025-12-01 17:21:38 +08:00
parent 32fee2b8ab
commit fab8c13cb3
7511 changed files with 996300 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
import type { Meta, StoryObj } from '@storybook/nextjs'
import LinkedAppsPanel from '.'
import type { RelatedApp } from '@/models/datasets'
import { AppModeEnum } from '@/types/app'
const mockRelatedApps: RelatedApp[] = [
{
id: 'app-cx',
name: 'Customer Support Assistant',
mode: AppModeEnum.CHAT,
icon_type: 'emoji',
icon: '\u{1F4AC}',
icon_background: '#EEF2FF',
icon_url: '',
},
{
id: 'app-ops',
name: 'Ops Workflow Orchestrator',
mode: AppModeEnum.WORKFLOW,
icon_type: 'emoji',
icon: '\u{1F6E0}\u{FE0F}',
icon_background: '#ECFDF3',
icon_url: '',
},
{
id: 'app-research',
name: 'Research Synthesizer',
mode: AppModeEnum.ADVANCED_CHAT,
icon_type: 'emoji',
icon: '\u{1F9E0}',
icon_background: '#FDF2FA',
icon_url: '',
},
]
const meta = {
title: 'Base/Feedback/LinkedAppsPanel',
component: LinkedAppsPanel,
parameters: {
layout: 'centered',
docs: {
description: {
component: 'Shows a curated list of related applications, pairing each app icon with quick navigation links.',
},
},
},
args: {
relatedApps: mockRelatedApps,
isMobile: false,
},
argTypes: {
isMobile: {
control: 'boolean',
},
},
tags: ['autodocs'],
} satisfies Meta<typeof LinkedAppsPanel>
export default meta
type Story = StoryObj<typeof meta>
export const Desktop: Story = {}
export const Mobile: Story = {
args: {
isMobile: true,
},
parameters: {
viewport: {
defaultViewport: 'mobile2',
},
},
}

View File

@@ -0,0 +1,60 @@
'use client'
import type { FC } from 'react'
import React from 'react'
import Link from 'next/link'
import { RiArrowRightUpLine } from '@remixicon/react'
import cn from '@/utils/classnames'
import AppIcon from '@/app/components/base/app-icon'
import type { RelatedApp } from '@/models/datasets'
import { AppModeEnum } from '@/types/app'
type ILikedItemProps = {
appStatus?: boolean
detail: RelatedApp
isMobile: boolean
}
const appTypeMap = {
[AppModeEnum.CHAT]: 'Chatbot',
[AppModeEnum.COMPLETION]: 'Completion',
[AppModeEnum.AGENT_CHAT]: 'Agent',
[AppModeEnum.ADVANCED_CHAT]: 'Chatflow',
[AppModeEnum.WORKFLOW]: 'Workflow',
}
const LikedItem = ({
detail,
isMobile,
}: ILikedItemProps) => {
return (
<Link className={cn('group/link-item flex h-8 w-full cursor-pointer items-center justify-between rounded-lg px-2 hover:bg-state-base-hover', isMobile && 'justify-center')} href={`/app/${detail?.id}/overview`}>
<div className='flex items-center'>
<div className={cn('relative h-6 w-6 rounded-md')}>
<AppIcon size='tiny' iconType={detail.icon_type} icon={detail.icon} background={detail.icon_background} imageUrl={detail.icon_url} />
</div>
{!isMobile && <div className={cn(' system-sm-medium ml-2 truncate text-text-primary')}>{detail?.name || '--'}</div>}
</div>
<div className='system-2xs-medium-uppercase shrink-0 text-text-tertiary group-hover/link-item:hidden'>{appTypeMap[detail.mode]}</div>
<RiArrowRightUpLine className='hidden h-4 w-4 text-text-tertiary group-hover/link-item:block' />
</Link>
)
}
type Props = {
relatedApps: RelatedApp[]
isMobile: boolean
}
const LinkedAppsPanel: FC<Props> = ({
relatedApps,
isMobile,
}) => {
return (
<div className='w-[320px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur p-1 shadow-lg backdrop-blur-[5px]'>
{relatedApps.map((item, index) => (
<LikedItem key={index} detail={item} isMobile={isMobile} />
))}
</div>
)
}
export default React.memo(LinkedAppsPanel)