From 2f84cb65db8e96cc185c3f766af1e2149e671b04 Mon Sep 17 00:00:00 2001 From: Ota Prokopec Date: Thu, 23 Mar 2023 22:21:34 +0100 Subject: [PATCH] fix --- src/lib/utils/database/experience.ts | 22 ++++++++++++++--- src/routes/game/Forms/Renderer.svelte | 29 ++++++++++++++--------- src/routes/game/experience.svelte | 34 +++++++++++++++------------ 3 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/lib/utils/database/experience.ts b/src/lib/utils/database/experience.ts index 5ca2b3a..d9c0972 100644 --- a/src/lib/utils/database/experience.ts +++ b/src/lib/utils/database/experience.ts @@ -1,5 +1,5 @@ import { databases, user as userStore } from '$lib/appwrite' -import { Account, Permission, Query, Role } from 'appwrite' +import { Account, Models, Permission, Query, Role } from 'appwrite' import database from 'svelte-appwrite-client/src/lib/database' import { getLocationDataFromLatAndLong } from '../locations' import { writable } from 'svelte/store' @@ -57,17 +57,17 @@ export const answer = async (experienceId: string, checkPointId: string, answer: if (CPType === 'CHECKBOX') correct = JSON.stringify(answer) === JSON.stringify(correctAnswer) if (CPType === 'RADIO' || CPType === 'NUMBER' || CPType === 'TEXT') correct = answer === correctAnswer[0] - //await saveAnswerIntoDatabase(experienceId, checkPointId, correct) + await saveAnswerIntoDatabase(experienceId, checkPointId, correct) return correct } catch (error) { + throw new Error(error) //operation only for sveltekit 401, 500, 403 } } const saveAnswerIntoDatabase = async (experienceId: string, checkPointId: string, correct: boolean) => { const previousAttemptDocument = await getUserAnswer(user.$id, checkPointId) - console.log(previousAttemptDocument) if (!(previousAttemptDocument?.attemptCount === 2)) { if (previousAttemptDocument) { @@ -87,6 +87,10 @@ const saveAnswerIntoDatabase = async (experienceId: string, checkPointId: string [Permission.read(Role.user(user.$id)), Permission.update(Role.user(user.$id))], ) } + } else { + const err = new Error('User has already answered.') + err['code'] = '409' + throw err } } @@ -126,4 +130,16 @@ export const getExperiencesAsStore = () => { return [store, loading] as const } +export const getUserProgress = async (experienceId: string) => { + const { documents } = await databases.listDocuments('63cef30d6da945dd4250', 'users-answers', [Query.equal('userId', user.$id), Query.equal('experience', experienceId)]) + return documents +} +export const getUserProgressAsStore = (experienceId: string) => { + const store = writable([]) + getUserProgress(experienceId).then((documents) => { + store.set(documents) + }) + return [store] as const +} + // !pridat trideni podle kategorie! export const getExperiencesByCategory = async (category: string) => {} diff --git a/src/routes/game/Forms/Renderer.svelte b/src/routes/game/Forms/Renderer.svelte index 130a7b6..a25ec80 100644 --- a/src/routes/game/Forms/Renderer.svelte +++ b/src/routes/game/Forms/Renderer.svelte @@ -16,6 +16,7 @@ import { user } from '$lib/appwrite' import Button from '$lib/components/Buttons/Button.svelte' import LayoutImg from '$lib/components/Layouts/LayoutImg.svelte' + import { Models } from 'appwrite' const components = { TEXT: TextForm, @@ -30,10 +31,11 @@ export let control: AnswerState = null let view: 'question' | 'map' | 'end' | 'start' | 'start-map' = 'start-map' export let gameData: Experience //data + export let userProgress: Models.Document[] let client = { //user data about game - pos: 0, + pos: userProgress.length, end: gameData.checkPoints.length - 1, //kolik otázek points: 0, //body possiblePointsToSeize: gameData.checkPoints.length * 2, @@ -63,19 +65,24 @@ $: checkPoint = gameData.checkPoints[client.pos] let myAnswer: string | string[] + let clear: boolean = false const checkAnswer = async () => { - const res = await answer(gameData.$id, checkPoint.$id, myAnswer) - if (res) { - control = 'correct' - client.points += 2 - } else if (control === null) { - control = 'wrong-firstTime' - clear = true - } else control = 'wrong-secondTime' - setTimeout(() => (clear = false), 400) + try { + const res = await answer(gameData.$id, checkPoint.$id, myAnswer) + + if (res) { + control = 'correct' + client.points += 2 + } else if (control === null) { + control = 'wrong-firstTime' + clear = true + } else control = 'wrong-secondTime' + setTimeout(() => (clear = false), 400) + } catch (error) { + console.log(error) + } } - let clear: boolean = false diff --git a/src/routes/game/experience.svelte b/src/routes/game/experience.svelte index ba2f901..98f0fe2 100644 --- a/src/routes/game/experience.svelte +++ b/src/routes/game/experience.svelte @@ -12,16 +12,20 @@ import Renderer from './Forms/Renderer.svelte' import Marker from '../../lib/components/Map/Marker.svelte' import { onMount } from 'svelte' - import { load } from '$lib/utils/database/experience' + import { getUserProgressAsStore, load } from '$lib/utils/database/experience' import { getLocationDataFromLatAndLong } from '$lib/utils/locations' import { navigate } from '$lib/router' + import { Experience } from '$lib/TStypes/experiences' export let params: { gameurl: string } + let gameData: Experience // + $: [userProgress] = gameData ? getUserProgressAsStore(gameData?.$id) : [] + $: console.log($userProgress) onMount(async () => { try { - $data = await load(params.gameurl, 1, (preview) => { - $data = preview + gameData = await load(params.gameurl, 2, (preview) => { + gameData = preview view = 'experience-preview' }) } catch (error) { @@ -29,7 +33,7 @@ } }) - /*$: assets = $data?.questions + /*$: assets = gameData?.questions ?.filter((q) => q.thumbnail !== null) ?.slice(0, 8) ?.map((q) => q.thumbnail)*/ @@ -38,7 +42,7 @@ //is user already in game //const userInGame = JSON.parse(localStorage.getItem(location.pathname)) - //$: if ($data && userInGame) view = 'game-play' + //$: if (gameData && userInGame) view = 'game-play' {#if view === 'experience-loading'} @@ -47,27 +51,27 @@ {:else if view === 'experience-preview'} - +
- {$data.ExpName} + {gameData.ExpName}
- {$data.rating} + {'gameData.rating'} - {#await getLocationDataFromLatAndLong($data.ExpLocation[0], $data.ExpLocation[1]) then { city }} + {#await getLocationDataFromLatAndLong(gameData.ExpLocation[0], gameData.ExpLocation[1]) then { city }} {city} {/await}
- {#if $data.ExpIntroduction} + {#if gameData.ExpIntroduction}
- {@html $data.ExpIntroduction} + {@html gameData.ExpIntroduction}
{/if} @@ -82,20 +86,20 @@
- - {#each $data.checkPoints as { CPLocation: [lat, lng] }} + + {#each gameData.checkPoints as { CPLocation: [lat, lng] }} {/each}
- {#if $data.checkPoints.length} + {#if gameData.checkPoints.length} {/if}
{:else if view === 'experience-play'} - + {/if}