Spaces:
Running
Running
update
Browse files- frontend/src/app/page.tsx +39 -20
- frontend/src/lib/api.ts +24 -2
frontend/src/app/page.tsx
CHANGED
|
@@ -11,22 +11,8 @@ import { isAuthenticated as checkIsAuthenticated, getStoredToken } from '@/lib/a
|
|
| 11 |
import type { Message, Language, CodeGenerationRequest } from '@/types';
|
| 12 |
|
| 13 |
export default function Home() {
|
| 14 |
-
//
|
| 15 |
-
const [messages, setMessages] = useState<Message[]>(
|
| 16 |
-
if (typeof window !== 'undefined') {
|
| 17 |
-
const saved = localStorage.getItem('anycoder_messages');
|
| 18 |
-
if (saved) {
|
| 19 |
-
try {
|
| 20 |
-
const parsed = JSON.parse(saved);
|
| 21 |
-
console.log('[localStorage] Loaded messages from localStorage:', parsed.length, 'messages');
|
| 22 |
-
return parsed;
|
| 23 |
-
} catch (e) {
|
| 24 |
-
console.error('[localStorage] Failed to parse saved messages:', e);
|
| 25 |
-
}
|
| 26 |
-
}
|
| 27 |
-
}
|
| 28 |
-
return [];
|
| 29 |
-
});
|
| 30 |
|
| 31 |
const [generatedCode, setGeneratedCode] = useState('');
|
| 32 |
const [selectedLanguage, setSelectedLanguage] = useState<Language>('html');
|
|
@@ -39,9 +25,25 @@ export default function Home() {
|
|
| 39 |
// Mobile view state: 'chat', 'editor', or 'settings'
|
| 40 |
const [mobileView, setMobileView] = useState<'chat' | 'editor' | 'settings'>('editor');
|
| 41 |
|
| 42 |
-
//
|
| 43 |
useEffect(() => {
|
| 44 |
if (typeof window !== 'undefined') {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
localStorage.setItem('anycoder_messages', JSON.stringify(messages));
|
| 46 |
console.log('[localStorage] Saved', messages.length, 'messages to localStorage');
|
| 47 |
}
|
|
@@ -182,6 +184,11 @@ export default function Home() {
|
|
| 182 |
};
|
| 183 |
|
| 184 |
const handleDeploy = async () => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 185 |
if (!generatedCode) {
|
| 186 |
alert('No code to publish! Generate some code first.');
|
| 187 |
return;
|
|
@@ -313,10 +320,13 @@ export default function Home() {
|
|
| 313 |
existing_repo_id: deployRequest.existing_repo_id,
|
| 314 |
space_name: deployRequest.space_name,
|
| 315 |
language: deployRequest.language,
|
| 316 |
-
has_code: !!deployRequest.code
|
|
|
|
| 317 |
});
|
|
|
|
| 318 |
|
| 319 |
const response = await apiClient.deploy(deployRequest);
|
|
|
|
| 320 |
|
| 321 |
if (response.success) {
|
| 322 |
// Update current repo ID if we got one back
|
|
@@ -356,8 +366,17 @@ export default function Home() {
|
|
| 356 |
} else {
|
| 357 |
alert(`Deployment failed: ${response.message}`);
|
| 358 |
}
|
| 359 |
-
} catch (error) {
|
| 360 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 361 |
}
|
| 362 |
};
|
| 363 |
|
|
|
|
| 11 |
import type { Message, Language, CodeGenerationRequest } from '@/types';
|
| 12 |
|
| 13 |
export default function Home() {
|
| 14 |
+
// Initialize messages as empty array (will load from localStorage in useEffect)
|
| 15 |
+
const [messages, setMessages] = useState<Message[]>([]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
const [generatedCode, setGeneratedCode] = useState('');
|
| 18 |
const [selectedLanguage, setSelectedLanguage] = useState<Language>('html');
|
|
|
|
| 25 |
// Mobile view state: 'chat', 'editor', or 'settings'
|
| 26 |
const [mobileView, setMobileView] = useState<'chat' | 'editor' | 'settings'>('editor');
|
| 27 |
|
| 28 |
+
// Load messages from localStorage on mount (client-side only to avoid hydration issues)
|
| 29 |
useEffect(() => {
|
| 30 |
if (typeof window !== 'undefined') {
|
| 31 |
+
const saved = localStorage.getItem('anycoder_messages');
|
| 32 |
+
if (saved) {
|
| 33 |
+
try {
|
| 34 |
+
const parsed = JSON.parse(saved);
|
| 35 |
+
console.log('[localStorage] Loaded messages from localStorage:', parsed.length, 'messages');
|
| 36 |
+
setMessages(parsed);
|
| 37 |
+
} catch (e) {
|
| 38 |
+
console.error('[localStorage] Failed to parse saved messages:', e);
|
| 39 |
+
}
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
}, []); // Empty deps = run once on mount
|
| 43 |
+
|
| 44 |
+
// Save messages to localStorage whenever they change (CRITICAL FOR PERSISTENCE!)
|
| 45 |
+
useEffect(() => {
|
| 46 |
+
if (typeof window !== 'undefined' && messages.length > 0) {
|
| 47 |
localStorage.setItem('anycoder_messages', JSON.stringify(messages));
|
| 48 |
console.log('[localStorage] Saved', messages.length, 'messages to localStorage');
|
| 49 |
}
|
|
|
|
| 184 |
};
|
| 185 |
|
| 186 |
const handleDeploy = async () => {
|
| 187 |
+
console.log('[Deploy] π¬ handleDeploy called');
|
| 188 |
+
console.log('[Deploy] generatedCode exists?', !!generatedCode);
|
| 189 |
+
console.log('[Deploy] generatedCode length:', generatedCode?.length);
|
| 190 |
+
console.log('[Deploy] generatedCode preview:', generatedCode?.substring(0, 200));
|
| 191 |
+
|
| 192 |
if (!generatedCode) {
|
| 193 |
alert('No code to publish! Generate some code first.');
|
| 194 |
return;
|
|
|
|
| 320 |
existing_repo_id: deployRequest.existing_repo_id,
|
| 321 |
space_name: deployRequest.space_name,
|
| 322 |
language: deployRequest.language,
|
| 323 |
+
has_code: !!deployRequest.code,
|
| 324 |
+
code_length: deployRequest.code?.length
|
| 325 |
});
|
| 326 |
+
console.log('[Deploy] Full request object:', JSON.stringify(deployRequest, null, 2).substring(0, 500));
|
| 327 |
|
| 328 |
const response = await apiClient.deploy(deployRequest);
|
| 329 |
+
console.log('[Deploy] β
Response received:', response);
|
| 330 |
|
| 331 |
if (response.success) {
|
| 332 |
// Update current repo ID if we got one back
|
|
|
|
| 366 |
} else {
|
| 367 |
alert(`Deployment failed: ${response.message}`);
|
| 368 |
}
|
| 369 |
+
} catch (error: any) {
|
| 370 |
+
console.error('[Deploy] Full error object:', error);
|
| 371 |
+
console.error('[Deploy] Error response:', error.response);
|
| 372 |
+
console.error('[Deploy] Error data:', error.response?.data);
|
| 373 |
+
|
| 374 |
+
const errorMessage = error.response?.data?.detail
|
| 375 |
+
|| error.response?.data?.message
|
| 376 |
+
|| error.message
|
| 377 |
+
|| 'Unknown error';
|
| 378 |
+
|
| 379 |
+
alert(`Deployment error: ${errorMessage}\n\nCheck console for details.`);
|
| 380 |
}
|
| 381 |
};
|
| 382 |
|
frontend/src/lib/api.ts
CHANGED
|
@@ -247,8 +247,30 @@ class ApiClient {
|
|
| 247 |
}
|
| 248 |
|
| 249 |
async deploy(request: DeploymentRequest): Promise<DeploymentResponse> {
|
| 250 |
-
|
| 251 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
}
|
| 253 |
|
| 254 |
async importProject(url: string, preferLocal: boolean = false): Promise<any> {
|
|
|
|
| 247 |
}
|
| 248 |
|
| 249 |
async deploy(request: DeploymentRequest): Promise<DeploymentResponse> {
|
| 250 |
+
console.log('[API Client] Deploy request:', {
|
| 251 |
+
endpoint: '/api/deploy',
|
| 252 |
+
method: 'POST',
|
| 253 |
+
baseURL: API_URL,
|
| 254 |
+
hasToken: !!this.token,
|
| 255 |
+
language: request.language,
|
| 256 |
+
code_length: request.code?.length,
|
| 257 |
+
space_name: request.space_name,
|
| 258 |
+
existing_repo_id: request.existing_repo_id,
|
| 259 |
+
});
|
| 260 |
+
|
| 261 |
+
try {
|
| 262 |
+
const response = await this.client.post<DeploymentResponse>('/api/deploy', request);
|
| 263 |
+
console.log('[API Client] Deploy response:', response.status, response.data);
|
| 264 |
+
return response.data;
|
| 265 |
+
} catch (error: any) {
|
| 266 |
+
console.error('[API Client] Deploy error:', {
|
| 267 |
+
status: error.response?.status,
|
| 268 |
+
statusText: error.response?.statusText,
|
| 269 |
+
data: error.response?.data,
|
| 270 |
+
message: error.message,
|
| 271 |
+
});
|
| 272 |
+
throw error;
|
| 273 |
+
}
|
| 274 |
}
|
| 275 |
|
| 276 |
async importProject(url: string, preferLocal: boolean = false): Promise<any> {
|