diff --git a/app/src/pages/RagCalculatorPage.jsx b/app/src/pages/RagCalculatorPage.jsx new file mode 100644 index 0000000..ea3b9f3 --- /dev/null +++ b/app/src/pages/RagCalculatorPage.jsx @@ -0,0 +1,129 @@ +import { useState } from 'react'; +import { useNav, useToast } from '../../teknav-ui.jsx'; +import { LegalPage } from './shared.jsx'; + +export function RagCalculatorPage() { + const { navigate } = useNav(); + const toast = useToast(); + const [text, setText] = useState(''); + const [chunkSize, setChunkSize] = useState(500); + const [overlap, setOverlap] = useState(50); + const [chunks, setChunks] = useState([]); + + const handleCalculate = () => { + if (!text.trim()) { + toast('لطفاً ابتدا متنی را برای چانک‌بندی وارد کنید', 'error'); + return; + } + if (chunkSize <= 0 || overlap < 0 || overlap >= chunkSize) { + toast('اندازه چانک یا همپوشانی نامعتبر است', 'error'); + return; + } + + const t = text.trim(); + const result = []; + let start = 0; + + while (start < t.length) { + let end = start + chunkSize; + if (end > t.length) end = t.length; + + const content = t.substring(start, end); + const estimatedTokens = Math.round(content.length / 3.8); + + result.push({ + id: result.length + 1, + content, + charCount: content.length, + tokenCount: estimatedTokens, + range: [start, end], + }); + + start += (chunkSize - overlap); + if (start >= t.length || end === t.length) break; + } + + setChunks(result); + toast(`تکه‌بندی با موفقیت انجام شد (${result.length} چانک)`, 'success'); + }; + + const copyToClipboard = (val) => { + if (!val) return; + navigator.clipboard.writeText(val); + toast('کپی شد!', 'success'); + }; + + return ( + +
+
+ +