import React, { useState, useEffect } from 'react'; import SolutionNavigator from '../components/SolutionNavigator'; function CustomPuzzlePage() { // Custom puzzle input const [customPuzzleText, setCustomPuzzleText] = useState(""); const [sysContent, setSysContent] = useState(""); // Results const [solutions, setSolutions] = useState([]); const [currentSolutionIndex, setCurrentSolutionIndex] = useState(0); const [generatedCode, setGeneratedCode] = useState(""); const [isSolving, setIsSolving] = useState(false); const [solutionStatus, setSolutionStatus] = useState(""); // "success", "no_solution", "error" const [errorMessage, setErrorMessage] = useState(""); // UI state const [currentStep, setCurrentStep] = useState(1); const [expandedSections, setExpandedSections] = useState({ puzzle: true, sysContent: false, result: false }); // Load default system content useEffect(() => { fetch(`/default_sys_content_multi`) .then(res => res.json()) .then(data => { if(data.success) { setSysContent(data.sysContent); } }) .catch(e => console.error(e)); }, []); const handleSolveCustom = () => { if(!customPuzzleText.trim()) { alert("Please enter a puzzle text"); return; } const payload = { puzzle: customPuzzleText, sys_content: sysContent, custom: true }; setIsSolving(true); setCurrentStep(3); setExpandedSections({puzzle: false, sysContent: false, result: true}); setSolutions([]); setCurrentSolutionIndex(0); setSolutionStatus(""); setErrorMessage(""); fetch(`/solve_custom`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }) .then(res => res.json()) .then(data => { if(!data.success) { setErrorMessage("Backend error: " + data.error); setSolutionStatus("error"); return; } const result = data.result; setGeneratedCode(result.generatedCode || ""); if (result.solutions && result.solutions.length > 0) { setSolutions(result.solutions); setSolutionStatus("success"); setCurrentSolutionIndex(0); } else if (result.no_solution) { setSolutionStatus("no_solution"); setErrorMessage(result.message || "No solution found for this puzzle"); } else { setSolutionStatus("error"); setErrorMessage(result.error || "Unknown error occurred"); } }) .catch(e => { console.error(e); setErrorMessage("Network error: " + e.message); setSolutionStatus("error"); }) .finally(() => { setIsSolving(false); }); }; const toggleSection = (section) => { setExpandedSections({ ...expandedSections, [section]: !expandedSections[section] }); }; const nextStep = () => { if (currentStep < 3) { setCurrentStep(currentStep + 1); if (currentStep === 1) { setExpandedSections({puzzle: false, sysContent: true, result: false}); } else if (currentStep === 2) { setExpandedSections({puzzle: false, sysContent: false, result: true}); } } }; const prevStep = () => { if (currentStep > 1) { setCurrentStep(currentStep - 1); if (currentStep === 2) { setExpandedSections({puzzle: true, sysContent: false, result: false}); } else if (currentStep === 3) { setExpandedSections({puzzle: false, sysContent: true, result: false}); } } }; return ( <> {/* Progress Steps */}
= 1 ? 'active' : ''}`}>
1
Create Puzzle
= 2 ? 'active' : ''}`}>
2
Configure System
= 3 ? 'active' : ''}`}>
3
Solve & Results
{/* Step 1: Custom Puzzle Input */}
toggleSection('puzzle')}>

✏️ Custom Puzzle Creation

{expandedSections.puzzle ? '▼' : '▶'}
{expandedSections.puzzle && (

📝 Puzzle Description

Enter your custom zebra puzzle. Include categories, items, and constraints: