broadfield-dev commited on
Commit
5a64e8d
·
verified ·
1 Parent(s): 2829a83

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +40 -14
templates/index.html CHANGED
@@ -87,32 +87,58 @@
87
  }
88
  }
89
 
90
- // Handle Add Memory
91
  document.getElementById('addForm').addEventListener('submit', async (e) => {
92
  e.preventDefault();
93
  const formData = new FormData(e.target);
94
  const status = document.getElementById('addStatus');
95
  const btn = e.target.querySelector('button');
96
 
 
97
  btn.disabled = true;
98
- btn.textContent = "Committing...";
 
 
99
 
100
  try {
101
- const res = await fetch('/add', { method: 'POST', body: formData });
102
- const data = await res.json();
103
 
104
- status.classList.remove('hidden');
105
- if (data.success) {
106
- status.textContent = "✅ " + data.message;
107
- status.className = "mt-4 text-sm text-center text-green-400";
108
- e.target.reset();
109
- setTimeout(() => status.classList.add('hidden'), 4000);
110
- } else {
111
- status.textContent = "❌ " + data.error;
112
- status.className = "mt-4 text-sm text-center text-red-400";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113
  }
114
  } catch (err) {
115
- status.textContent = "❌ Connection Error";
116
  status.className = "mt-4 text-sm text-center text-red-400";
117
  } finally {
118
  btn.disabled = false;
 
87
  }
88
  }
89
 
90
+ // Handle Add Memory (Streaming Version)
91
  document.getElementById('addForm').addEventListener('submit', async (e) => {
92
  e.preventDefault();
93
  const formData = new FormData(e.target);
94
  const status = document.getElementById('addStatus');
95
  const btn = e.target.querySelector('button');
96
 
97
+ // UI Reset
98
  btn.disabled = true;
99
+ status.classList.remove('hidden');
100
+ status.textContent = "Starting stream...";
101
+ status.className = "mt-4 text-sm text-center text-indigo-400 animate-pulse";
102
 
103
  try {
104
+ const response = await fetch('/add', { method: 'POST', body: formData });
 
105
 
106
+ // Reader to handle the stream
107
+ const reader = response.body.getReader();
108
+ const decoder = new TextDecoder();
109
+
110
+ while (true) {
111
+ const { done, value } = await reader.read();
112
+ if (done) break;
113
+
114
+ // Decode chunk and split by newline (NDJSON)
115
+ const chunk = decoder.decode(value, { stream: true });
116
+ const lines = chunk.split('\n').filter(line => line.trim() !== '');
117
+
118
+ for (const line of lines) {
119
+ try {
120
+ const data = JSON.parse(line);
121
+
122
+ if (data.status === 'processing') {
123
+ // Show progress
124
+ status.textContent = "⏳ " + data.message;
125
+ } else if (data.status === 'success') {
126
+ // Success state
127
+ status.textContent = "✅ " + data.message;
128
+ status.className = "mt-4 text-sm text-center text-green-400";
129
+ e.target.reset();
130
+ setTimeout(() => status.classList.add('hidden'), 4000);
131
+ } else if (data.status === 'error') {
132
+ // Error state
133
+ throw new Error(data.message);
134
+ }
135
+ } catch (err) {
136
+ console.error("Stream parse error:", err);
137
+ }
138
+ }
139
  }
140
  } catch (err) {
141
+ status.textContent = "❌ " + err.message;
142
  status.className = "mt-4 text-sm text-center text-red-400";
143
  } finally {
144
  btn.disabled = false;