linguabot commited on
Commit
9bc6c74
·
verified ·
1 Parent(s): 236b1c8

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. client/src/components/Refinity.tsx +51 -21
client/src/components/Refinity.tsx CHANGED
@@ -26,8 +26,8 @@ const mockTasks: Task[] = [
26
 
27
  const Refinity: React.FC = () => {
28
  const [stage, setStage] = React.useState<Stage>('task');
29
- const [tasks, setTasks] = React.useState<Task[]>(mockTasks);
30
- const [selectedTaskId, setSelectedTaskId] = React.useState<string>(mockTasks[0]?.id || '');
31
  const [versions, setVersions] = React.useState<Version[]>([]);
32
  const [currentVersionId, setCurrentVersionId] = React.useState<string | null>(null);
33
  const [username] = React.useState<string>(() => {
@@ -53,6 +53,34 @@ const Refinity: React.FC = () => {
53
 
54
  const task = React.useMemo(() => tasks.find(t => t.id === selectedTaskId) || tasks[0], [tasks, selectedTaskId]);
55
  const taskVersions = React.useMemo(() => versions.filter(v => v.taskId === (task?.id || '')), [versions, task?.id]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
  const focusedIndex = React.useMemo(() => {
58
  const idx = taskVersions.findIndex(v => v.id === currentVersionId);
@@ -69,15 +97,12 @@ const Refinity: React.FC = () => {
69
  const data = await resp.json().catch(()=>({}));
70
  if (!resp.ok) throw new Error(data?.error || 'Failed to parse document');
71
  const baseText = String(data?.text || '').trim() || `Uploaded translation by ${username}`;
72
- const nextVersionNumber = (taskVersions[taskVersions.length - 1]?.versionNumber || 0) + 1;
73
- const newVersion: Version = {
74
- id: `v_${Date.now()}`,
75
- taskId: task?.id || 't1',
76
- originalAuthor: username,
77
- revisedBy: undefined,
78
- versionNumber: nextVersionNumber,
79
- content: baseText,
80
- };
81
  setVersions(prev => [...prev, newVersion]);
82
  setCurrentVersionId(newVersion.id);
83
  setStage('flow');
@@ -101,17 +126,23 @@ const Refinity: React.FC = () => {
101
  }
102
  };
103
 
104
- const saveNewTask = () => {
105
  const title = newTaskTitle.trim();
106
  const src = newTaskSource.trim();
107
  if (!title || !src) return;
108
- const id = `t_${Date.now()}`;
109
- const t: Task = { id, title, sourceText: src };
110
- setTasks(prev => [...prev, t]);
111
- setSelectedTaskId(id);
112
- setShowAddTask(false);
113
- setNewTaskTitle('');
114
- setNewTaskSource('');
 
 
 
 
 
 
115
  };
116
 
117
  const assignRandom = () => {
@@ -159,8 +190,7 @@ const Refinity: React.FC = () => {
159
  {stage === 'task' && (
160
  <div>
161
  <div className="mb-6">
162
- <h2 className="text-2xl font-semibold text-black">Refinity</h2>
163
- <p className="text-gray-700">Infinite peer-based translation revision</p>
164
  </div>
165
  <div className="grid grid-cols-1 md:grid-cols-3 gap-6 items-end">
166
  <div className="md:col-span-1">
 
26
 
27
  const Refinity: React.FC = () => {
28
  const [stage, setStage] = React.useState<Stage>('task');
29
+ const [tasks, setTasks] = React.useState<Task[]>([]);
30
+ const [selectedTaskId, setSelectedTaskId] = React.useState<string>('');
31
  const [versions, setVersions] = React.useState<Version[]>([]);
32
  const [currentVersionId, setCurrentVersionId] = React.useState<string | null>(null);
33
  const [username] = React.useState<string>(() => {
 
53
 
54
  const task = React.useMemo(() => tasks.find(t => t.id === selectedTaskId) || tasks[0], [tasks, selectedTaskId]);
55
  const taskVersions = React.useMemo(() => versions.filter(v => v.taskId === (task?.id || '')), [versions, task?.id]);
56
+ // Load tasks
57
+ React.useEffect(() => {
58
+ (async () => {
59
+ try {
60
+ const base = ((api.defaults as any)?.baseURL as string || '').replace(/\/$/, '');
61
+ const resp = await fetch(`${base}/api/refinity/tasks`);
62
+ const data: any[] = await resp.json().catch(()=>[]);
63
+ const normalized: Task[] = Array.isArray(data) ? data.map(d => ({ id: d._id, title: d.title, sourceText: d.sourceText })) : [];
64
+ setTasks(normalized);
65
+ if (normalized.length && !selectedTaskId) setSelectedTaskId(normalized[0].id);
66
+ } catch {}
67
+ })();
68
+ }, []);
69
+
70
+ // Load versions when task changes
71
+ React.useEffect(() => {
72
+ (async () => {
73
+ if (!task?.id) { setVersions([]); return; }
74
+ try {
75
+ const base = ((api.defaults as any)?.baseURL as string || '').replace(/\/$/, '');
76
+ const resp = await fetch(`${base}/api/refinity/tasks/${encodeURIComponent(task.id)}/versions`);
77
+ const data: any[] = await resp.json().catch(()=>[]);
78
+ const normalized: Version[] = Array.isArray(data) ? data.map(d => ({ id: d._id, taskId: d.taskId, originalAuthor: d.originalAuthor, revisedBy: d.revisedBy, versionNumber: d.versionNumber, content: d.content, parentVersionId: d.parentVersionId })) : [];
79
+ setVersions(normalized);
80
+ setCurrentVersionId(normalized.length ? normalized[normalized.length-1].id : null);
81
+ } catch { setVersions([]); }
82
+ })();
83
+ }, [task?.id]);
84
 
85
  const focusedIndex = React.useMemo(() => {
86
  const idx = taskVersions.findIndex(v => v.id === currentVersionId);
 
97
  const data = await resp.json().catch(()=>({}));
98
  if (!resp.ok) throw new Error(data?.error || 'Failed to parse document');
99
  const baseText = String(data?.text || '').trim() || `Uploaded translation by ${username}`;
100
+ // Persist as new version
101
+ const base2 = ((api.defaults as any)?.baseURL as string || '').replace(/\/$/, '');
102
+ const resp2 = await fetch(`${base2}/api/refinity/tasks/${encodeURIComponent(task?.id || '')}/versions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ originalAuthor: username, revisedBy: undefined, content: baseText }) });
103
+ const saved = await resp2.json().catch(()=>({}));
104
+ if (!resp2.ok) throw new Error(saved?.error || 'Failed to save version');
105
+ const newVersion: Version = { id: saved._id, taskId: saved.taskId, originalAuthor: saved.originalAuthor, revisedBy: saved.revisedBy, versionNumber: saved.versionNumber, content: saved.content, parentVersionId: saved.parentVersionId };
 
 
 
106
  setVersions(prev => [...prev, newVersion]);
107
  setCurrentVersionId(newVersion.id);
108
  setStage('flow');
 
126
  }
127
  };
128
 
129
+ const saveNewTask = async () => {
130
  const title = newTaskTitle.trim();
131
  const src = newTaskSource.trim();
132
  if (!title || !src) return;
133
+ try {
134
+ const base = ((api.defaults as any)?.baseURL as string || '').replace(/\/$/, '');
135
+ const body = { title, sourceText: src, createdBy: username };
136
+ const resp = await fetch(`${base}/api/refinity/tasks`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
137
+ const saved = await resp.json().catch(()=>({}));
138
+ if (!resp.ok) throw new Error(saved?.error || 'Save failed');
139
+ const t: Task = { id: saved._id, title: saved.title, sourceText: saved.sourceText };
140
+ setTasks(prev => [...prev, t]);
141
+ setSelectedTaskId(t.id);
142
+ setShowAddTask(false);
143
+ setNewTaskTitle('');
144
+ setNewTaskSource('');
145
+ } catch {}
146
  };
147
 
148
  const assignRandom = () => {
 
190
  {stage === 'task' && (
191
  <div>
192
  <div className="mb-6">
193
+ <p className="text-gray-700">A peer-based revision platform.</p>
 
194
  </div>
195
  <div className="grid grid-cols-1 md:grid-cols-3 gap-6 items-end">
196
  <div className="md:col-span-1">