101 lines
2.4 KiB
TypeScript
101 lines
2.4 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import type { Submission, SubmissionFile } from '@/types'
|
|
import { submissionHelpers } from '@/services/apiService'
|
|
import { usePuzzlesStore } from './puzzles'
|
|
|
|
export const useSubmissionsStore = defineStore('submissions', () => {
|
|
// State
|
|
const submissions = ref<Submission[]>([])
|
|
const isLoading = ref(false)
|
|
const error = ref<string>('')
|
|
const isSubmissionModalOpen = ref(false)
|
|
|
|
// Actions
|
|
const loadSubmissions = async (limit = 20, offset = 0) => {
|
|
try {
|
|
isLoading.value = true
|
|
error.value = ''
|
|
|
|
const loadedSubmissions = await submissionHelpers.loadSubmissions(limit, offset)
|
|
|
|
if (offset === 0) {
|
|
submissions.value = loadedSubmissions
|
|
} else {
|
|
submissions.value.push(...loadedSubmissions)
|
|
}
|
|
} catch (err) {
|
|
error.value = 'Failed to load submissions'
|
|
console.error('Error loading submissions:', err)
|
|
} finally {
|
|
isLoading.value = false
|
|
}
|
|
}
|
|
|
|
const createSubmission = async (
|
|
files: SubmissionFile[],
|
|
notes?: string,
|
|
manualValidationRequested?: boolean
|
|
): Promise<Submission | undefined> => {
|
|
try {
|
|
isLoading.value = true
|
|
error.value = ''
|
|
|
|
const puzzlesStore = usePuzzlesStore()
|
|
|
|
const response = await submissionHelpers.createFromFiles(
|
|
files,
|
|
puzzlesStore.puzzles,
|
|
notes,
|
|
manualValidationRequested
|
|
)
|
|
|
|
if (response.error) {
|
|
error.value = response.error
|
|
throw new Error(response.error)
|
|
}
|
|
|
|
if (response.data) {
|
|
// Add to local submissions list
|
|
submissions.value.unshift(response.data)
|
|
return response.data
|
|
}
|
|
|
|
return undefined
|
|
} catch (err) {
|
|
error.value = err instanceof Error ? err.message : 'Failed to create submission'
|
|
throw err
|
|
} finally {
|
|
isLoading.value = false
|
|
}
|
|
}
|
|
|
|
const openSubmissionModal = () => {
|
|
isSubmissionModalOpen.value = true
|
|
}
|
|
|
|
const closeSubmissionModal = () => {
|
|
isSubmissionModalOpen.value = false
|
|
}
|
|
|
|
const refreshSubmissions = async () => {
|
|
submissions.value = []
|
|
await loadSubmissions()
|
|
}
|
|
|
|
return {
|
|
// State
|
|
submissions,
|
|
isLoading,
|
|
error,
|
|
isSubmissionModalOpen,
|
|
|
|
// Actions
|
|
loadSubmissions,
|
|
createSubmission,
|
|
openSubmissionModal,
|
|
closeSubmissionModal,
|
|
refreshSubmissions
|
|
}
|
|
})
|