create-sveltekit-electron-app
Version:
Createk Desktop app with Sveltekit and Electron.
70 lines (55 loc) • 1.87 kB
text/typescript
import { fail } from '@sveltejs/kit'
import type { Actions, PageServerLoad } from './$types'
import { Game } from './game'
export const load = (({ cookies }) => {
const game = new Game(cookies.get('sverdle'))
return {
/**
* The player's guessed words so far
*/
guesses: game.guesses,
/**
* An array of strings like '__x_c' corresponding to the guesses, where 'x' means
* an exact match, and 'c' means a close match (right letter, wrong place)
*/
answers: game.answers,
/**
* The correct answer, revealed if the game is over
*/
answer: game.answers.length >= 6 ? game.answer : null,
}
}) satisfies PageServerLoad
export const actions = {
/**
* Modify game state in reaction to a keypress. If client-side JavaScript
* is available, this will happen in the browser instead of here
*/
update: async ({ request, cookies }) => {
const game = new Game(cookies.get('sverdle'))
const data = await request.formData()
const key = data.get('key')
const i = game.answers.length
if (key === 'backspace') {
game.guesses[i] = game.guesses[i].slice(0, -1)
} else {
game.guesses[i] += key
}
cookies.set('sverdle', game.toString(), { path: '/' })
},
/**
* Modify game state in reaction to a guessed word. This logic always runs on
* the server, so that people can't cheat by peeking at the JavaScript
*/
enter: async ({ request, cookies }) => {
const game = new Game(cookies.get('sverdle'))
const data = await request.formData()
const guess = data.getAll('guess') as string[]
if (!game.enter(guess)) {
return fail(400, { badGuess: true })
}
cookies.set('sverdle', game.toString(), { path: '/' })
},
restart: async ({ cookies }) => {
cookies.delete('sverdle', { path: '/' })
},
} satisfies Actions