11<script setup lang="ts">
2- import { ref , reactive , onBeforeMount , onMounted , onUnmounted , computed , watch } from ' vue' ;
2+ import { ref , reactive , onBeforeMount , onMounted , onUnmounted , computed , watch , nextTick } from ' vue' ;
33import { Guess } from ' @/guess' ;
44import { encodeShareCode , decodeShareCode } from ' @/encoding' ;
55import type { ShareData } from ' @/encoding' ;
@@ -246,15 +246,20 @@ function guessClicked(guess?: Guess) {
246246}
247247
248248// Load answer, date, guesses in share-code
249- function loadFromShareCode(shareCode : string ) {
249+ function loadFromShareCode(shareCode : string ): boolean {
250+ loading = true ;
251+ nextTick (() => { loading = false ; });
252+
250253 let shareData: ShareData | undefined ;
251254 try {
252255 shareData = decodeShareCode (shareCode );
253256 } catch (e ) {
254257 console .error (" Invalid shareCode" , shareCode , e );
255- return ;
258+ return false ;
256259 }
257260
261+ console .log (" Decoded share code" , shareCode , shareData );
262+
258263 // Remove existing guesses
259264 resetGuesses ();
260265
@@ -274,68 +279,108 @@ function loadFromShareCode(shareCode: string) {
274279 for (let word of shareData .words ) {
275280 appendWord (word );
276281 }
282+
283+ return true ;
277284}
278285
279- function loadFromWindowLocation() {
286+ function loadFromWindowLocation(): boolean {
280287 if (window .location .hash != " " ) {
281288 let shareCode = window .location .hash ;
282289 if (shareCode .slice (0 , 1 ) == " #" ) {
283290 shareCode = shareCode .slice (1 );
284291 }
292+ console .log (" Found share code in hash" , shareCode );
285293
286- loadFromShareCode (shareCode );
294+ return loadFromShareCode (shareCode );
287295 }
296+
297+ return false ;
288298}
289299
290- // If there is a hash in the URL, try to load it as a share code
300+ function loadPuzzleFromStorage(): boolean {
301+ loading = true ;
302+ nextTick (() => { loading = false ; });
303+
304+ if (puzzleDate .value ) {
305+ const puzzleState = loadPuzzleByDate (puzzleDate .value );
306+ if (puzzleState ) {
307+ console .log (" Loading share code" , puzzleState .shareCode , " for date" , puzzleDate .value );
308+ return loadFromShareCode (puzzleState .shareCode );
309+ } else {
310+ resetGuesses ();
311+ console .log (" No share code found for date" , puzzleDate .value , dateIndex (puzzleDate .value ));
312+ return false ;
313+ }
314+ } else if (puzzleAnswer .value ) {
315+ const puzzleState = loadPuzzleByAnswer (puzzleAnswer .value );
316+ if (puzzleState ) {
317+ console .log (" Loading share code" , puzzleState .shareCode , " for answer" , puzzleAnswer .value );
318+ return loadFromShareCode (puzzleState .shareCode );
319+ } else {
320+ resetGuesses ();
321+ console .log (" No share code found for answer" , puzzleAnswer .value );
322+ return false ;
323+ }
324+ } else {
325+ console .log (" No puzzle answer or date set, resetting guesses" );
326+ resetGuesses ();
327+ return false ;
328+ }
329+ }
330+
331+ // If there is a hash in the URL, try to load it as a share code, otherwise try to load from localStorage
291332onBeforeMount (() => {
292- loadFromWindowLocation ();
293- loading = false ;
333+ let loaded = false ;
334+
335+ // Try loading from a hash in the URL
336+ loaded = loadFromWindowLocation ();
337+
338+ // If that didn't work, set the puzzleDate to today and try loading from localStorage
339+ // NOTE: We don't set the puzzleAnswer, as that will be done by AnswerPicker
340+ if (! loaded ) {
341+ puzzleDate .value = new Date ();
342+ loaded = loadPuzzleFromStorage ();
343+ }
344+
345+ // If that didn't work, reset the guesses
346+ if (! loaded ) {
347+ resetGuesses ();
348+ }
294349});
295350
296351// Update the URL bar when the shareURL changes
297352watch (shareURL , (newShareURL , oldShareURL ) => {
298- if (loading ) return ;
299- // console.log(`replaceState ${oldShareURL} -> ${newShareURL}`);
300- history .replaceState (null , " " , newShareURL );
353+ // if (loading) return;
354+ if (newShareURL !== window .location .toString ()) {
355+ console .log (` replaceState ${window .location } -> ${newShareURL } ` );
356+ history .replaceState (null , " " , newShareURL );
357+ }
301358})
302359
303360// Detect if the URL hash changes and attempt to load it as a share code
304361window .addEventListener (" popstate" , (e ) => {
305- loading = true ;
362+ console . log ( " popstate " , window . location ) ;
306363 loadFromWindowLocation ();
307- loading = false ;
308364});
309365
310- // If the answer changes attempt to load the list of guesses from local storage, or else just reset the list
311- watch (puzzleAnswer , () => {
366+ // When the user interacts with the AnswerPicker, attempt to load the list of guesses from local storage,
367+ // or else just reset the list
368+ function answerPickerUpdated(answer : string , date ? : Date ) {
369+ console .log (" AnswerPicker updated" , answer , date )
370+ puzzleAnswer .value = answer ;
371+ puzzleDate .value = date ;
312372 if (! loading ) {
313- loading = true ;
314- if (puzzleDate .value ) {
315- const puzzleState = loadPuzzleByDate (puzzleDate .value );
316- if (puzzleState ) {
317- loadFromShareCode (puzzleState .shareCode );
318- console .log (" Loaded share code" , puzzleState .shareCode , " for date" , puzzleDate .value );
319- } else {
320- resetGuesses ();
321- console .log (" No share code found for date" , puzzleDate .value );
322- }
323- } else if (puzzleAnswer .value ) {
324- const puzzleState = loadPuzzleByAnswer (puzzleAnswer .value );
325- if (puzzleState ) {
326- loadFromShareCode (puzzleState .shareCode );
327- console .log (" Loaded share code" , puzzleState .shareCode , " for answer" , puzzleAnswer .value );
328- } else {
329- resetGuesses ();
330- console .log (" No share code found for answer" , puzzleAnswer .value );
331- }
332- } else {
333- console .log (" No puzzle answer or date set, resetting guesses" );
334- resetGuesses ();
335- }
336- loading = false ;
373+ loadPuzzleFromStorage ();
337374 }
338- });
375+ }
376+
377+ // watch(puzzleDate, (newPuzzleDate, oldPuzzleDate) => {
378+ // console.log(`puzzleDate changed ${oldPuzzleDate} -> ${newPuzzleDate} puzzleAnswer: ${puzzleAnswer.value}`);
379+ // });
380+
381+ // watch(puzzleAnswer, (newPuzzleAnswer, oldPuzzleAnswer) => {
382+ // console.log(`puzzleAnswer changed ${oldPuzzleAnswer} -> ${newPuzzleAnswer} puzzleDate: ${puzzleDate.value}`);
383+ // });
339384
340385// Change title when the puzzleDate or puzzleAnswer change
341386const title = computed (() => {
@@ -352,6 +397,17 @@ watch(title, (newTitle) => {
352397 document .title = newTitle ;
353398});
354399
400+ // Debug stuff
401+ const puzzleDebug = ref (false );
402+
403+ onMounted (() => {
404+ window .addEventListener (' keyup' , (e ) => {
405+ if (e .key == " ?" ) {
406+ puzzleDebug .value = ! puzzleDebug .value ;
407+ }
408+ })
409+ });
410+
355411 </script >
356412
357413<template >
@@ -367,12 +423,17 @@ watch(title, (newTitle) => {
367423 <div class =" page input-page" :class =" { show: isInputPage }"
368424 :style =" { transform: inputPageTransform, transition: dragTransition }" >
369425 <div class =" tools" >
370- <AnswerPicker v-model :date =" puzzleDate" v-model :answer =" puzzleAnswer" />
426+ <AnswerPicker :date =" puzzleDate" :answer =" puzzleAnswer" @updated = " answerPickerUpdated " />
371427 <button class =" button icon px-3" @click.stop =" resetGuesses" title =" Reset" >
372428 <IconTrashCanUndo />
373429 </button >
374430 </div >
375431
432+ <div v-if =" puzzleDebug" class =" puzzle-debug" >
433+ puzzleAnswer: {{ puzzleAnswer }}<br />
434+ puzzleDate: {{ puzzleDate }}<br />
435+ </div >
436+
376437 <PuzzleInput v-if =" puzzleAnswer" :guesses =" guesses" :selectedGuess =" selectedGuess" :puzzleAnswer =" puzzleAnswer || ''"
377438 :puzzleDate =" puzzleDate" @appendGuess =" appendGuess" @removeGuess =" removeGuess"
378439 @guessClicked =" guessClicked" :shareCode =" shareCode" :shareURL =" shareURL" />
@@ -398,6 +459,12 @@ watch(title, (newTitle) => {
398459 background : var (--color-background );
399460 }
400461
462+ .puzzle-debug {
463+ background : var (--gray-5 );
464+ padding : .5em ;
465+ margin-bottom : 1em ;
466+ }
467+
401468 .tools {
402469 display : flex ;
403470 flex-direction : row ;
0 commit comments