import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useDispatch, useSelector } from 'react-redux'; import { showNotification } from '../../store/notification.slice'; import { fetchKnowledgeBases, searchKnowledgeBases, createKnowledgeBase, } from '../../store/knowledgeBase/knowledgeBase.thunks'; import { resetSearchState } from '../../store/knowledgeBase/knowledgeBase.slice'; import SvgIcon from '../../components/SvgIcon'; // 导入拆分的组件 import SearchBar from './components/SearchBar'; import Pagination from './components/Pagination'; import CreateKnowledgeBaseModal from './components/CreateKnowledgeBaseModal'; import KnowledgeBaseList from './components/KnowledgeBaseList'; export default function KnowledgeBase() { const dispatch = useDispatch(); const navigate = useNavigate(); const [showCreateModal, setShowCreateModal] = useState(false); const [showAccessRequestModal, setShowAccessRequestModal] = useState(false); const [formErrors, setFormErrors] = useState({}); const [accessRequestErrors, setAccessRequestErrors] = useState({}); const [accessRequestData, setAccessRequestData] = useState({ id: '', title: '', accessType: '只读访问', duration: '一周', projectInfo: '', reason: '', }); const [newKnowledgeBase, setNewKnowledgeBase] = useState({ name: '', desc: '', }); // Search state const [searchKeyword, setSearchKeyword] = useState(''); const [isSearching, setIsSearching] = useState(false); // Pagination state const [pagination, setPagination] = useState({ page: 1, page_size: 10, }); // Get knowledge bases from Redux store const { items: knowledgeBases, total, status, error } = useSelector((state) => state.knowledgeBase.list); const { items: searchResults, total: searchTotal, status: searchStatus, error: searchError, keyword: storeKeyword, } = useSelector((state) => state.knowledgeBase.search); const { status: operationStatus, error: operationError } = useSelector((state) => state.knowledgeBase.operations); // Determine which data to display based on search state const displayData = isSearching ? searchResults : knowledgeBases; const displayTotal = isSearching ? searchTotal : total; const displayStatus = isSearching ? searchStatus : status; const displayError = isSearching ? searchError : error; // Fetch knowledge bases when component mounts or pagination changes useEffect(() => { if (!isSearching) { dispatch(fetchKnowledgeBases(pagination)); } else if (searchKeyword.trim()) { dispatch( searchKnowledgeBases({ keyword: searchKeyword, page: pagination.page, page_size: pagination.page_size, }) ); } }, [dispatch, pagination.page, pagination.page_size, isSearching, searchKeyword]); // Handle search input change const handleSearchInputChange = (e) => { setSearchKeyword(e.target.value); }; // Handle search submit const handleSearch = (e) => { e.preventDefault(); if (searchKeyword.trim()) { setIsSearching(true); setPagination((prev) => ({ ...prev, page: 1 })); // Reset to first page dispatch( searchKnowledgeBases({ keyword: searchKeyword, page: 1, page_size: pagination.page_size, }) ); } else { // If search is empty, reset to normal list view handleClearSearch(); } }; // Handle clear search const handleClearSearch = () => { setSearchKeyword(''); setIsSearching(false); setPagination((prev) => ({ ...prev, page: 1 })); // Reset to first page dispatch(resetSearchState()); }; // Show loading state while fetching data const isLoading = displayStatus === 'loading'; // Show error notification if fetch fails useEffect(() => { if (displayStatus === 'failed' && displayError) { dispatch( showNotification({ message: `获取知识库列表失败: ${displayError.message || displayError}`, type: 'danger', }) ); } }, [displayStatus, displayError, dispatch]); // Show notification for operation status useEffect(() => { if (operationStatus === 'succeeded') { dispatch( showNotification({ message: '操作成功', type: 'success', }) ); // Refresh the list after successful operation if (isSearching && searchKeyword.trim()) { dispatch( searchKnowledgeBases({ keyword: searchKeyword, page: pagination.page, page_size: pagination.page_size, }) ); } else { dispatch(fetchKnowledgeBases(pagination)); } } else if (operationStatus === 'failed' && operationError) { dispatch( showNotification({ message: `操作失败: ${operationError.message || operationError}`, type: 'danger', }) ); } }, [operationStatus, operationError, dispatch, pagination, isSearching, searchKeyword]); // Handle pagination change const handlePageChange = (newPage) => { setPagination((prev) => ({ ...prev, page: newPage, })); }; // Handle page size change const handlePageSizeChange = (newPageSize) => { setPagination({ page: 1, // Reset to first page when changing page size page_size: newPageSize, }); }; const handleInputChange = (e) => { const { name, value } = e.target; setNewKnowledgeBase((prev) => ({ ...prev, [name]: value, })); // Clear error when user types if (formErrors[name]) { setFormErrors((prev) => ({ ...prev, [name]: '', })); } }; const handleAccessRequestInputChange = (e) => { const { name, value } = e.target; setAccessRequestData((prev) => ({ ...prev, [name]: value, })); // Clear error when user types if (accessRequestErrors[name]) { setAccessRequestErrors((prev) => ({ ...prev, [name]: '', })); } }; const validateCreateForm = () => { const errors = {}; if (!newKnowledgeBase.name.trim()) { errors.name = '请输入知识库名称'; } if (!newKnowledgeBase.desc.trim()) { errors.desc = '请输入知识库描述'; } setFormErrors(errors); return Object.keys(errors).length === 0; }; const validateAccessRequestForm = () => { const errors = {}; if (!accessRequestData.projectInfo.trim()) { errors.projectInfo = '请输入项目信息'; } if (!accessRequestData.reason.trim()) { errors.reason = '请输入申请原因'; } setAccessRequestErrors(errors); return Object.keys(errors).length === 0; }; const handleCreateKnowledgeBase = () => { // Validate form if (!validateCreateForm()) { return; } // Dispatch create knowledge base action dispatch( createKnowledgeBase({ name: newKnowledgeBase.name, desc: newKnowledgeBase.desc, type: 'private', // Default type }) ); // Reset form and close modal setNewKnowledgeBase({ name: '', desc: '' }); setFormErrors({}); setShowCreateModal(false); }; // Handle card click to navigate to knowledge base detail const handleCardClick = (id) => { navigate(`/knowledge-base/${id}/datasets`); }; const handleRequestAccess = (id, title) => { setAccessRequestData((prev) => ({ ...prev, id, title, })); setAccessRequestErrors({}); setShowAccessRequestModal(true); }; const handleSubmitAccessRequest = () => { // Validate form if (!validateAccessRequestForm()) { return; } // Here you would typically call an API to submit the access request dispatch( showNotification({ message: '权限申请已提交', type: 'success', }) ); // Reset form and close modal setAccessRequestData((prev) => ({ ...prev, projectInfo: '', reason: '', })); setAccessRequestErrors({}); setShowAccessRequestModal(false); }; // Calculate total pages const totalPages = Math.ceil(displayTotal / pagination.page_size); return (
{isSearching && (
搜索结果: "{storeKeyword}" - 找到 {displayTotal} 个知识库
)} {isLoading ? (
加载中...
) : ( <> {/* Pagination */} {totalPages > 1 && ( )} )} {/* 新建知识库弹窗 */} setShowCreateModal(false)} onChange={handleInputChange} onSubmit={handleCreateKnowledgeBase} /> {/* 申请权限弹窗 */} {showAccessRequestModal && (
申请访问权限
{accessRequestErrors.projectInfo && (
{accessRequestErrors.projectInfo}
)}
{accessRequestErrors.reason && (
{accessRequestErrors.reason}
)}
)}
); }