Adding media query plugin for showing skeletons and lazy image loading plugin.

This commit is contained in:
Bradley Shellnut 2022-11-10 14:08:57 -06:00
parent 87b8e5c073
commit 704ae0a541
11 changed files with 40 additions and 22 deletions

View file

@ -45,6 +45,7 @@
"@types/feather-icons": "^4.7.0", "@types/feather-icons": "^4.7.0",
"cookie": "^0.5.0", "cookie": "^0.5.0",
"feather-icons": "^4.29.0", "feather-icons": "^4.29.0",
"svelte-lazy-loader": "^1.0.0",
"svelte-media-query-store": "^1.0.0", "svelte-media-query-store": "^1.0.0",
"zod": "^3.19.1", "zod": "^3.19.1",
"zod-to-json-schema": "^3.18.1" "zod-to-json-schema": "^3.18.1"

View file

@ -26,6 +26,7 @@ specifiers:
sass: ^1.56.0 sass: ^1.56.0
svelte: ^3.52.0 svelte: ^3.52.0
svelte-check: ^2.9.2 svelte-check: ^2.9.2
svelte-lazy-loader: ^1.0.0
svelte-media-query-store: ^1.0.0 svelte-media-query-store: ^1.0.0
svelte-preprocess: ^4.10.7 svelte-preprocess: ^4.10.7
tslib: ^2.4.1 tslib: ^2.4.1
@ -42,6 +43,7 @@ dependencies:
'@types/feather-icons': 4.7.0 '@types/feather-icons': 4.7.0
cookie: 0.5.0 cookie: 0.5.0
feather-icons: 4.29.0 feather-icons: 4.29.0
svelte-lazy-loader: 1.0.0
svelte-media-query-store: 1.0.0 svelte-media-query-store: 1.0.0
zod: 3.19.1 zod: 3.19.1
zod-to-json-schema: 3.18.1_zod@3.19.1 zod-to-json-schema: 3.18.1_zod@3.19.1
@ -2281,6 +2283,10 @@ packages:
svelte: 3.52.0 svelte: 3.52.0
dev: true dev: true
/svelte-lazy-loader/1.0.0:
resolution: {integrity: sha512-AZD6R60vksyojn21FgXLglmBiBB9K5Dkdu0hdGrLbCaRCYT68IsWkZfRUqKhMx1IfzqWcZQ8X9y/f+Ih0oNQkQ==}
dev: false
/svelte-media-query-store/0.0.3: /svelte-media-query-store/0.0.3:
resolution: {integrity: sha512-LxM2AEyE4BqVHNdEb8aZOwcSf5oyJcZWSRlSkQPxnQyp6ytGwQs3gsmaZ1udEBeL7jHldWwNrbaFwAG5W7eTXw==} resolution: {integrity: sha512-LxM2AEyE4BqVHNdEb8aZOwcSf5oyJcZWSRlSkQPxnQyp6ytGwQs3gsmaZ1udEBeL7jHldWwNrbaFwAG5W7eTXw==}
dev: false dev: false

View file

@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import { createEventDispatcher } from 'svelte'; import { createEventDispatcher } from 'svelte';
import { Image } from 'svelte-lazy-loader';
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import { MinusCircleIcon, PlusCircleIcon } from '@rgossiaux/svelte-heroicons/outline'; import { MinusCircleIcon, PlusCircleIcon } from '@rgossiaux/svelte-heroicons/outline';
import type { GameType, SavedGameType } from '$lib/types'; import type { GameType, SavedGameType } from '$lib/types';
@ -46,8 +47,14 @@
<article class="game-container" transition:fade> <article class="game-container" transition:fade>
<h2>{game.name}</h2> <h2>{game.name}</h2>
<a class="thumbnail" href={`/game/${game.id}`}> <a
<img src={game.thumb_url} alt={`Image of ${game.name}`} /> class="thumbnail"
href={`/game/${game.id}`}
title={`View ${game.name}`}
data-sveltekit-prefetch
>
<Image src={game.thumb_url} alt={`Image of ${game.name}`} />
<!-- <img src={game.thumb_url} alt={`Image of ${game.name}`} /> -->
<!-- loading="lazy" decoding="async" --> <!-- loading="lazy" decoding="async" -->
</a> </a>

View file

@ -3,7 +3,6 @@
import { boredState } from '$lib/stores/boredState'; import { boredState } from '$lib/stores/boredState';
export let form: ActionData; export let form: ActionData;
console.log('advanced search form data', form);
let submitting = $boredState?.loading; let submitting = $boredState?.loading;
let minAge = +form?.minAge || 1; let minAge = +form?.minAge || 1;
let minPlayers = +form?.minPlayers || 1; let minPlayers = +form?.minPlayers || 1;
@ -78,9 +77,7 @@
{/if} {/if}
</div> </div>
</fieldset> </fieldset>
<!-- <button type="submit" disabled={submitting}>Submit</button> -->
<!-- </form> -->
<style lang="scss"> <style lang="scss">
fieldset { fieldset {
display: grid; display: grid;

View file

@ -35,7 +35,6 @@
boredState.update((n) => ({ ...n, loading: true })); boredState.update((n) => ({ ...n, loading: true }));
return async ({ result }) => { return async ({ result }) => {
boredState.update((n) => ({ ...n, loading: false })); boredState.update((n) => ({ ...n, loading: false }));
// console.log('result main page search', result);
// `result` is an `ActionResult` object // `result` is an `ActionResult` object
if (result.type === 'success') { if (result.type === 'success') {
// console.log('In success'); // console.log('In success');

View file

@ -4,6 +4,7 @@
import { fade } from 'svelte/transition'; import { fade } from 'svelte/transition';
import { Disclosure, DisclosureButton, DisclosurePanel } from '@rgossiaux/svelte-headlessui'; import { Disclosure, DisclosureButton, DisclosurePanel } from '@rgossiaux/svelte-headlessui';
import { ChevronRightIcon } from '@rgossiaux/svelte-heroicons/solid'; import { ChevronRightIcon } from '@rgossiaux/svelte-heroicons/solid';
import { xl, md } from '$lib/stores/mediaQueryStore';
import { boredState } from '$lib/stores/boredState'; import { boredState } from '$lib/stores/boredState';
import AdvancedSearch from '$lib/components/search/advancedSearch/index.svelte'; import AdvancedSearch from '$lib/components/search/advancedSearch/index.svelte';
import { applyAction, enhance } from '$app/forms'; import { applyAction, enhance } from '$app/forms';
@ -34,13 +35,25 @@
let pageSize = 10; let pageSize = 10;
let page = +form?.data?.page || 1; let page = +form?.data?.page || 1;
let totalItems = form?.totalCount || data?.totalCount || 0; let totalItems = form?.totalCount || data?.totalCount || 0;
let submitting = $boredState?.loading;
let name = form?.name || '';
let disclosureOpen = false;
$: skip = (page - 1) * pageSize; $: skip = (page - 1) * pageSize;
$: console.log('submit button', submitButton); $: console.log('submit button', submitButton);
$: showPagination = $gameStore?.length > 1; $: showPagination = $gameStore?.length > 1;
let submitting = $boredState?.loading; if ($xl) {
let name = form?.name || ''; numberOfGameSkeleton = 8;
let disclosureOpen = false; } else if ($md) {
numberOfGameSkeleton = 3;
} else {
numberOfGameSkeleton = 1;
}
let placeholderList = [...Array(numberOfGameSkeleton).keys()];
console.log(placeholderList);
if (form?.error) { if (form?.error) {
disclosureOpen = true; disclosureOpen = true;
} }
@ -95,6 +108,7 @@
action="/search" action="/search"
method="post" method="post"
use:enhance={() => { use:enhance={() => {
gameStore.removeAll();
boredState.update((n) => ({ ...n, loading: true })); boredState.update((n) => ({ ...n, loading: true }));
return async ({ result }) => { return async ({ result }) => {
boredState.update((n) => ({ ...n, loading: false })); boredState.update((n) => ({ ...n, loading: false }));
@ -200,7 +214,7 @@
<div class="games"> <div class="games">
<h1>Games Found:</h1> <h1>Games Found:</h1>
<div class="games-list"> <div class="games-list">
{#each [...Array(numberOfGameSkeleton).keys()] as game, i} {#each placeholderList as game, i}
<SkeletonPlaceholder <SkeletonPlaceholder
style="width: 100%; height: 500px; border-radius: var(--borderRadius);" style="width: 100%; height: 500px; border-radius: var(--borderRadius);"
/> />

View file

@ -6,13 +6,6 @@
export let data: PageData; export let data: PageData;
export let form: ActionData; export let form: ActionData;
// if ($xl) {
// numberOfGameSkeleton = 8;
// } else if ($md) {
// numberOfGameSkeleton = 3;
// } else {
// numberOfGameSkeleton = 1;
// }
</script> </script>
<svelte:head> <svelte:head>

View file

@ -55,7 +55,6 @@
} }
async function handlePerPageEvent(event: CustomEvent) { async function handlePerPageEvent(event: CustomEvent) {
console.log('Per Page Event called', event.detail);
page = 1; page = 1;
pageSize = event.detail.pageSize; pageSize = event.detail.pageSize;
await tick(); await tick();

View file

@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import { fade, fly } from 'svelte/transition'; import { fade, fly } from 'svelte/transition';
import { Image } from 'svelte-lazy-loader';
import { import {
ExternalLinkIcon, ExternalLinkIcon,
MinusCircleIcon, MinusCircleIcon,
@ -57,7 +58,8 @@
<section class="game"> <section class="game">
<div> <div>
<a class="thumbnail" href={game.url}> <a class="thumbnail" href={game.url}>
<img src={game.image_url} alt={`Image of ${game.name}`} /> <Image src={game.thumb_url} alt={`Image of ${game.name}`} />
<!-- <img src={game.image_url} alt={`Image of ${game.name}`} /> -->
</a> </a>
</div> </div>
<div style="display: grid; place-items: center; gap: 2rem;"> <div style="display: grid; place-items: center; gap: 2rem;">

View file

@ -58,9 +58,10 @@ export const actions: Actions = {
if (minPlayers && maxPlayers) { if (minPlayers && maxPlayers) {
if (+minPlayers > +maxPlayers) { if (+minPlayers > +maxPlayers) {
return invalid(400, { minPlayers, error: { id: 'minPlayers', message: 'Min must be less than max' } }); return invalid(400, { minPlayers, error: { id: 'minPlayers', message: 'Min must be less than max' } });
} else if (maxPlayers < minPlayers) {
return invalid(400, { maxPlayers, error: { id: 'maxPlayers', message: 'Max must be greater than min' } });
} }
// else if (+maxPlayers < +minPlayers) {
// return invalid(400, { maxPlayers, error: { id: 'maxPlayers', message: 'Max must be greater than min' } });
// }
if (exactMinPlayers) { if (exactMinPlayers) {
queryParams.min_players = +minPlayers; queryParams.min_players = +minPlayers;
} else { } else {

View file

@ -51,7 +51,6 @@
} }
async function handlePerPageEvent(event: CustomEvent) { async function handlePerPageEvent(event: CustomEvent) {
console.log('Per Page Event called', event.detail);
page = 1; page = 1;
pageSize = event.detail.pageSize; pageSize = event.detail.pageSize;
await tick(); await tick();