/* * @Author: ZhaoYing * @Date: 2026-02-03 16:34:12 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-04-16 11:19:20 */ import React, { useState, useEffect, useMemo, type MouseEvent } from 'react'; import { useTranslation } from 'react-i18next'; import { App, Flex, Row, Col, Space } from 'antd'; import clsx from 'clsx'; import type { MySharedOutItem } from './types'; import { mySharedOutList, cancelShare, cancelSpaceShare } from '@/api/application' import BodyWrapper from '@/components/Empty/BodyWrapper' import RbCard from '@/components/RbCard/Card' import RbDescriptions from '@/components/RbDescriptions' import Tag from '@/components/Tag' const MySharing: React.FC = () => { const { t } = useTranslation(); const { modal } = App.useApp(); const [loading, setLoading] = useState(false) const [data, setData] = useState([]) useEffect(() => { getList() }, []) const getList = () => { setLoading(true) mySharedOutList() .then(res => setData(res as MySharedOutItem[])) .finally(() => setLoading(false)) } /** Group items by target_workspace_id */ const grouped = useMemo(() => { const map = new Map, items: MySharedOutItem[] }>(); data.forEach(item => { if (!map.has(item.target_workspace_id)) { map.set(item.target_workspace_id, { workspace: { target_workspace_id: item.target_workspace_id, target_workspace_name: item.target_workspace_name, target_workspace_icon: item.target_workspace_icon, }, items: [], }); } map.get(item.target_workspace_id)!.items.push(item); }); return Array.from(map.values()); }, [data]); const handleAllCancel = (workspace: { target_workspace_name: string; target_workspace_id: string; }) => { modal.confirm({ title: t('application.confirmWorkspaceCancelShareDesc', { workspace: workspace.target_workspace_name }), okText: t('common.confirm'), cancelText: t('common.cancel'), okType: 'danger', onOk: () => { cancelSpaceShare(workspace.target_workspace_id) .then(() => { getList(); }) } }); }; const handleCancelOne = (item: MySharedOutItem, e: MouseEvent) => { e.stopPropagation() modal.confirm({ title: t('application.confirmAppCancelShareDesc', { app: item.source_app_name, workspace: item.target_workspace_name }), okText: t('common.confirm'), cancelText: t('common.cancel'), okType: 'danger', onOk: () => { cancelShare(item.source_app_id, item.target_workspace_id) .then(() => { getList(); }) } }); }; /** Navigate to application configuration page */ const handleEdit = (item: MySharedOutItem) => { let url = `/#/application/config/${item.source_app_id}` window.open(url); } const [selectedWorkspace, setSelectedWorkspace] = useState(null) const [appList, setAppList] = useState([]) useEffect(() => { if (grouped.length === 0) { setSelectedWorkspace(null) setAppList([]) return } const current = grouped.find(g => g.workspace.target_workspace_id === selectedWorkspace) if (current) { setAppList(current.items) } else { setSelectedWorkspace(grouped[0].workspace.target_workspace_id) setAppList(grouped[0].items) } }, [grouped, selectedWorkspace]) const handleSelectWorkspace = async (target_workspace_id: string) => { if (target_workspace_id === selectedWorkspace) return setSelectedWorkspace(target_workspace_id); const filterWorkspace = grouped.find(item => item.workspace.target_workspace_id === target_workspace_id); setAppList(filterWorkspace?.items || []) }; return ( {grouped.map(({ workspace, items }) => ( handleSelectWorkspace(workspace.target_workspace_id)} > {workspace.target_workspace_icon ? {workspace.target_workspace_icon} :
{workspace.target_workspace_name[0]}
}
{workspace.target_workspace_name}
{t('application.appCount', { count: items.length })}
{ e.stopPropagation(); handleAllCancel(workspace); }} >
))}
{appList.map(item => ( {item.source_app_name.trim()[0]}} subTitle={ {t(`application.${item.source_app_type}`)} {item.source_app_is_active ? t('application.sourceActive') : t('application.sourceInactive')} } extra={
handleCancelOne(item, e)} >
} bodyClassName="rb:py-6! rb:px-4!" className="rb:cursor-pointer" onClick={() => handleEdit(item)} > {t(`application.${item.permission}`)} }, ]} />
))}
) }; export default MySharing;