Upload folder using huggingface_hub
Browse files
client/src/components/Refinity.tsx
CHANGED
|
@@ -51,6 +51,7 @@ const Refinity: React.FC = () => {
|
|
| 51 |
const addTaskFileRef = React.useRef<HTMLInputElement | null>(null);
|
| 52 |
const [addingSourceUploading, setAddingSourceUploading] = React.useState<boolean>(false);
|
| 53 |
const [taskMenuOpen, setTaskMenuOpen] = React.useState<boolean>(false);
|
|
|
|
| 54 |
|
| 55 |
const task = React.useMemo(() => tasks.find(t => t.id === selectedTaskId) || tasks[0], [tasks, selectedTaskId]);
|
| 56 |
const taskVersions = React.useMemo(() => versions.filter(v => v.taskId === (task?.id || '')), [versions, task?.id]);
|
|
@@ -154,6 +155,22 @@ const Refinity: React.FC = () => {
|
|
| 154 |
setStage('editor');
|
| 155 |
};
|
| 156 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
const selectManual = (id: string) => {
|
| 158 |
setCurrentVersionId(id);
|
| 159 |
setStage('editor');
|
|
@@ -230,6 +247,13 @@ const Refinity: React.FC = () => {
|
|
| 230 |
</button>
|
| 231 |
{uploading && <span className="text-sm text-gray-600">Uploading…</span>}
|
| 232 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
</div>
|
| 234 |
</div>
|
| 235 |
|
|
|
|
| 51 |
const addTaskFileRef = React.useRef<HTMLInputElement | null>(null);
|
| 52 |
const [addingSourceUploading, setAddingSourceUploading] = React.useState<boolean>(false);
|
| 53 |
const [taskMenuOpen, setTaskMenuOpen] = React.useState<boolean>(false);
|
| 54 |
+
const [pastedTranslation, setPastedTranslation] = React.useState<string>('');
|
| 55 |
|
| 56 |
const task = React.useMemo(() => tasks.find(t => t.id === selectedTaskId) || tasks[0], [tasks, selectedTaskId]);
|
| 57 |
const taskVersions = React.useMemo(() => versions.filter(v => v.taskId === (task?.id || '')), [versions, task?.id]);
|
|
|
|
| 155 |
setStage('editor');
|
| 156 |
};
|
| 157 |
|
| 158 |
+
const submitPastedTranslation = async () => {
|
| 159 |
+
const text = (pastedTranslation || '').trim();
|
| 160 |
+
if (!text) return;
|
| 161 |
+
try {
|
| 162 |
+
const base = ((api.defaults as any)?.baseURL as string || '').replace(/\/$/, '');
|
| 163 |
+
const resp = await fetch(`${base}/api/refinity/tasks/${encodeURIComponent(task?.id || '')}/versions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ originalAuthor: username, revisedBy: undefined, content: text }) });
|
| 164 |
+
const saved = await resp.json().catch(()=>({}));
|
| 165 |
+
if (!resp.ok) throw new Error(saved?.error || 'Failed to save version');
|
| 166 |
+
const newVersion: Version = { id: saved._id, taskId: saved.taskId, originalAuthor: saved.originalAuthor, revisedBy: saved.revisedBy, versionNumber: saved.versionNumber, content: saved.content, parentVersionId: saved.parentVersionId };
|
| 167 |
+
setVersions(prev => [...prev, newVersion]);
|
| 168 |
+
setCurrentVersionId(newVersion.id);
|
| 169 |
+
setPastedTranslation('');
|
| 170 |
+
setStage('flow');
|
| 171 |
+
} catch {}
|
| 172 |
+
};
|
| 173 |
+
|
| 174 |
const selectManual = (id: string) => {
|
| 175 |
setCurrentVersionId(id);
|
| 176 |
setStage('editor');
|
|
|
|
| 247 |
</button>
|
| 248 |
{uploading && <span className="text-sm text-gray-600">Uploading…</span>}
|
| 249 |
</div>
|
| 250 |
+
<div className="mt-4">
|
| 251 |
+
<label className="block text-sm text-gray-700 mb-1">Or paste translation</label>
|
| 252 |
+
<textarea value={pastedTranslation} onChange={(e)=>setPastedTranslation(e.target.value)} rows={3} className="relative z-10 w-full px-4 py-3 border border-ui-border rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500 bg-white" placeholder="Paste translation text here…" />
|
| 253 |
+
<div className="mt-2">
|
| 254 |
+
<button onClick={submitPastedTranslation} className="relative overflow-hidden inline-flex items-center justify-center gap-2 px-3 py-1.5 text-sm font-medium rounded-2xl text-white ring-1 ring-inset ring-white/50 backdrop-blur-md backdrop-brightness-110 backdrop-saturate-150 bg-indigo-600/70 active:translate-y-0.5 transition-all duration-200">Use pasted text</button>
|
| 255 |
+
</div>
|
| 256 |
+
</div>
|
| 257 |
</div>
|
| 258 |
</div>
|
| 259 |
|