first-update
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
'use client';
|
||||
|
||||
import { useState, useCallback } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { toast } from 'sonner';
|
||||
|
||||
/**
|
||||
* 文本块管理的自定义Hook
|
||||
* @param {string} projectId - 项目ID
|
||||
* @param {string} [currentFilter='all'] - 当前筛选条件
|
||||
* @returns {Object} - 文本块状态和操作方法
|
||||
*/
|
||||
export default function useChunks(projectId, currentFilter = 'all') {
|
||||
const { t } = useTranslation();
|
||||
const [chunks, setChunks] = useState([]);
|
||||
const [tocData, setTocData] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
/**
|
||||
* 获取文本块列表
|
||||
* @param {string} filter - 筛选条件
|
||||
*/
|
||||
const fetchChunks = useCallback(
|
||||
async (filter = 'all') => {
|
||||
try {
|
||||
setLoading(true);
|
||||
const response = await fetch(`/api/projects/${projectId}/split?filter=${filter}`);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json();
|
||||
throw new Error(errorData.error || t('textSplit.fetchChunksFailed'));
|
||||
}
|
||||
|
||||
const data = await response.json();
|
||||
setChunks(data.chunks || []);
|
||||
|
||||
// 如果有文件结果,处理详细信息
|
||||
if (data.toc) {
|
||||
console.log(t('textSplit.fileResultReceived'), data.fileResult);
|
||||
// 如果有目录结构,设置目录数据
|
||||
setTocData(data.toc);
|
||||
}
|
||||
} catch (error) {
|
||||
toast.error(error.message);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[projectId, t, setLoading, setChunks, setTocData]
|
||||
);
|
||||
|
||||
/**
|
||||
* 处理删除文本块
|
||||
* @param {string} chunkId - 文本块ID
|
||||
*/
|
||||
const handleDeleteChunk = useCallback(
|
||||
async chunkId => {
|
||||
try {
|
||||
const response = await fetch(`/api/projects/${projectId}/chunks/${encodeURIComponent(chunkId)}`, {
|
||||
method: 'DELETE'
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json();
|
||||
throw new Error(errorData.error || t('textSplit.deleteChunkFailed'));
|
||||
}
|
||||
|
||||
// 更新文本块列表
|
||||
setChunks(prev => prev.filter(chunk => chunk.id !== chunkId));
|
||||
} catch (error) {
|
||||
toast.error(error.message);
|
||||
}
|
||||
},
|
||||
[projectId, t]
|
||||
);
|
||||
|
||||
/**
|
||||
* 处理文本块编辑
|
||||
* @param {string} chunkId - 文本块ID
|
||||
* @param {string} newContent - 新内容
|
||||
*/
|
||||
const handleEditChunk = useCallback(
|
||||
async (chunkId, newContent) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
|
||||
const response = await fetch(`/api/projects/${projectId}/chunks/${encodeURIComponent(chunkId)}`, {
|
||||
method: 'PATCH',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ content: newContent })
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json();
|
||||
throw new Error(errorData.error || t('textSplit.editChunkFailed'));
|
||||
}
|
||||
|
||||
// 更新成功后使用当前筛选条件刷新文本块列表
|
||||
// 直接从 URL 获取当前筛选参数,确保获取到的是最新的值
|
||||
const url = new URL(window.location.href);
|
||||
const filterParam = url.searchParams.get('filter') || 'all';
|
||||
await fetchChunks(filterParam);
|
||||
|
||||
toast.success(t('textSplit.editChunkSuccess'));
|
||||
} catch (error) {
|
||||
toast.error(error.message);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
},
|
||||
[projectId, t, fetchChunks]
|
||||
);
|
||||
|
||||
/**
|
||||
* 设置文本块列表
|
||||
* @param {Array} data - 新的文本块列表
|
||||
*/
|
||||
const updateChunks = useCallback(data => {
|
||||
setChunks(data);
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 添加新的文本块
|
||||
* @param {Array} newChunks - 新的文本块列表
|
||||
*/
|
||||
const addChunks = useCallback(newChunks => {
|
||||
setChunks(prev => {
|
||||
const updatedChunks = [...prev];
|
||||
newChunks.forEach(chunk => {
|
||||
if (!updatedChunks.find(c => c.id === chunk.id)) {
|
||||
updatedChunks.push(chunk);
|
||||
}
|
||||
});
|
||||
return updatedChunks;
|
||||
});
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* 设置TOC数据
|
||||
* @param {string} toc - TOC数据
|
||||
*/
|
||||
const updateTocData = useCallback(toc => {
|
||||
if (toc) {
|
||||
setTocData(toc);
|
||||
}
|
||||
}, []);
|
||||
|
||||
return {
|
||||
chunks,
|
||||
tocData,
|
||||
loading,
|
||||
fetchChunks,
|
||||
handleDeleteChunk,
|
||||
handleEditChunk,
|
||||
updateChunks,
|
||||
addChunks,
|
||||
updateTocData,
|
||||
setLoading
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user