try for better ocr puzzle

This commit is contained in:
2025-10-30 14:29:50 +01:00
parent 8960f551e6
commit 15de496501
15 changed files with 649 additions and 88 deletions
+36 -43
View File
@@ -3,16 +3,19 @@ import { ref, onMounted, computed } from 'vue'
import PuzzleCard from './components/PuzzleCard.vue'
import SubmissionForm from './components/SubmissionForm.vue'
import AdminPanel from './components/AdminPanel.vue'
import { puzzleHelpers, submissionHelpers, errorHelpers, apiService } from './services/apiService'
import type { SteamCollection, SteamCollectionItem, Submission, PuzzleResponse, UserInfo } from './types'
import { apiService, errorHelpers } from './services/apiService'
import { usePuzzlesStore } from './stores/puzzles'
import { useSubmissionsStore } from './stores/submissions'
import type { SteamCollection, PuzzleResponse, UserInfo } from './types'
// API data
// Pinia stores
const puzzlesStore = usePuzzlesStore()
const submissionsStore = useSubmissionsStore()
// Local state
const collections = ref<SteamCollection[]>([])
const puzzles = ref<SteamCollectionItem[]>([])
const submissions = ref<Submission[]>([])
const userInfo = ref<UserInfo | null>(null)
const isLoading = ref(true)
const showSubmissionModal = ref(false)
const error = ref<string>('')
// Mock data removed - using API data only
@@ -25,7 +28,7 @@ const isSuperuser = computed(() => {
// Computed property to get responses grouped by puzzle
const responsesByPuzzle = computed(() => {
const grouped: Record<number, PuzzleResponse[]> = {}
submissions.value.forEach(submission => {
submissionsStore.submissions.forEach(submission => {
submission.responses.forEach(response => {
// Handle both number and object types for puzzle field
const puzzleId = typeof response.puzzle === 'number' ? response.puzzle : response.puzzle.id
@@ -55,21 +58,20 @@ onMounted(async () => {
console.warn('User info error:', userResponse.error)
}
// Load puzzles from API
// Load puzzles from API using store
console.log('Loading puzzles...')
const loadedPuzzles = await puzzleHelpers.loadPuzzles()
puzzles.value = loadedPuzzles
console.log('Puzzles loaded:', loadedPuzzles.length)
await puzzlesStore.loadPuzzles()
console.log('Puzzles loaded:', puzzlesStore.puzzles.length)
// Create mock collection from loaded puzzles for display
if (loadedPuzzles.length > 0) {
if (puzzlesStore.puzzles.length > 0) {
collections.value = [{
id: 1,
steam_id: '3479142989',
title: 'PolyLAN 41',
description: 'Puzzle collection for PolyLAN 41 fil rouge',
author_name: 'Flame Legrems',
total_items: loadedPuzzles.length,
total_items: puzzlesStore.puzzles.length,
unique_visitors: 31,
current_favorites: 1,
created_at: new Date().toISOString(),
@@ -78,11 +80,10 @@ onMounted(async () => {
console.log('Collection created')
}
// Load existing submissions
// Load existing submissions using store
console.log('Loading submissions...')
const loadedSubmissions = await submissionHelpers.loadSubmissions()
submissions.value = loadedSubmissions
console.log('Submissions loaded:', loadedSubmissions.length)
await submissionsStore.loadSubmissions()
console.log('Submissions loaded:', submissionsStore.submissions.length)
console.log('Data load complete!')
@@ -104,32 +105,24 @@ const handleSubmission = async (submissionData: {
isLoading.value = true
error.value = ''
// Create submission via API
const response = await submissionHelpers.createFromFiles(
// Create submission via store
const submission = await submissionsStore.createSubmission(
submissionData.files,
puzzles.value,
submissionData.notes,
submissionData.manualValidationRequested
)
if (response.error) {
error.value = response.error
alert(`Submission failed: ${response.error}`)
return
}
if (response.data) {
// Add to local submissions list
submissions.value.unshift(response.data)
// Show success message
const puzzleNames = response.data.responses.map(r => r.puzzle_name).join(', ')
// Show success message
if (submission) {
const puzzleNames = submission.responses.map(r => r.puzzle_name).join(', ')
alert(`Solutions submitted successfully for puzzles: ${puzzleNames}`)
// Close modal
showSubmissionModal.value = false
} else {
alert('Submission created successfully!')
}
// Close modal
submissionsStore.closeSubmissionModal()
} catch (err) {
const errorMessage = errorHelpers.getErrorMessage(err)
error.value = errorMessage
@@ -141,16 +134,16 @@ const handleSubmission = async (submissionData: {
}
const openSubmissionModal = () => {
showSubmissionModal.value = true
submissionsStore.openSubmissionModal()
}
const closeSubmissionModal = () => {
showSubmissionModal.value = false
submissionsStore.closeSubmissionModal()
}
// Function to match puzzle name from OCR to actual puzzle
const findPuzzleByName = (ocrPuzzleName: string): SteamCollectionItem | null => {
return puzzleHelpers.findPuzzleByName(puzzles.value, ocrPuzzleName)
const findPuzzleByName = (ocrPuzzleName: string) => {
return puzzlesStore.findPuzzleByName(ocrPuzzleName)
}
const reloadPage = () => {
@@ -237,7 +230,7 @@ const reloadPage = () => {
<!-- Puzzles Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<PuzzleCard
v-for="puzzle in puzzles"
v-for="puzzle in puzzlesStore.puzzles"
:key="puzzle.id"
:puzzle="puzzle"
:responses="responsesByPuzzle[puzzle.id] || []"
@@ -245,7 +238,7 @@ const reloadPage = () => {
</div>
<!-- Empty State -->
<div v-if="puzzles.length === 0" class="text-center py-12">
<div v-if="puzzlesStore.puzzles.length === 0" class="text-center py-12">
<div class="text-6xl mb-4">🧩</div>
<h3 class="text-xl font-bold mb-2">No Puzzles Available</h3>
<p class="text-base-content/70">Check back later for new puzzle collections!</p>
@@ -254,7 +247,7 @@ const reloadPage = () => {
</div>
<!-- Submission Modal -->
<div v-if="showSubmissionModal" class="modal modal-open">
<div v-if="submissionsStore.isSubmissionModalOpen" class="modal modal-open">
<div class="modal-box max-w-4xl">
<div class="flex justify-between items-center mb-4">
<h3 class="font-bold text-lg">Submit Solution</h3>
@@ -267,7 +260,7 @@ const reloadPage = () => {
</div>
<SubmissionForm
:puzzles="puzzles"
:puzzles="puzzlesStore.puzzles"
:find-puzzle-by-name="findPuzzleByName"
@submit="handleSubmission"
/>