fix: Set display theme on cover swiper slide click

This commit is contained in:
sethburkart123
2024-09-15 08:39:31 +10:00
parent b8c99baf0c
commit 6885ae2d08
4 changed files with 55 additions and 46 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
import browser from 'webextension-polyfill' import browser from 'webextension-polyfill'
import { CustomTheme, DownloadedTheme, ThemeList } from '../../types/CustomThemes'; import type { CustomTheme, DownloadedTheme, ThemeList } from '../../types/CustomThemes';
import localforage from 'localforage'; import localforage from 'localforage';
export const setTheme = async (themeID: string) => { export const setTheme = async (themeID: string) => {
@@ -4,7 +4,7 @@
import type { Theme } from '@/svelte-interface/types/Theme'; import type { Theme } from '@/svelte-interface/types/Theme';
import { register, type SwiperContainer } from 'swiper/element/bundle'; import { register, type SwiperContainer } from 'swiper/element/bundle';
let { coverThemes } = $props<{ coverThemes: Theme[] }>(); let { coverThemes, setDisplayTheme } = $props<{ coverThemes: Theme[], setDisplayTheme: (theme: Theme) => void }>();
let swiperEl = $state<SwiperContainer | undefined>(); let swiperEl = $state<SwiperContainer | undefined>();
@@ -20,7 +20,13 @@
<div class="relative w-full transition-opacity rounded-xl overflow-clip" transition:fade> <div class="relative w-full transition-opacity rounded-xl overflow-clip" transition:fade>
<swiper-container bind:this={swiperEl} slides-per-view="1" space-between="20" loop="true" autoplay="true" disable-on-interaction="false" pause-on-mouse-enter="true" class="w-full aspect-[8/3]"> <swiper-container bind:this={swiperEl} slides-per-view="1" space-between="20" loop="true" autoplay="true" disable-on-interaction="false" pause-on-mouse-enter="true" class="w-full aspect-[8/3]">
{#each coverThemes as theme, index (index)} {#each coverThemes as theme, index (index)}
<swiper-slide class="relative cursor-pointer rounded-xl overflow-clip"> <swiper-slide
onkeydown={(e: any) => { if (e.key === 'Enter') setDisplayTheme(theme) }}
onclick={() => setDisplayTheme(theme)}
role="button"
tabindex="0"
class="relative cursor-pointer rounded-xl overflow-clip"
>
<img src={theme.marqueeImage} alt="Theme Preview" class="object-cover w-full h-full" /> <img src={theme.marqueeImage} alt="Theme Preview" class="object-cover w-full h-full" />
<div class='absolute bottom-0 left-0 p-8 z-[1]'> <div class='absolute bottom-0 left-0 p-8 z-[1]'>
<h2 class='text-4xl font-bold text-white'>{theme.name}</h2> <h2 class='text-4xl font-bold text-white'>{theme.name}</h2>
@@ -1,47 +1,40 @@
<script lang="ts"> <script lang="ts">
import type { Theme } from '@/svelte-interface/types/Theme' import type { Theme } from '@/svelte-interface/types/Theme'
import ThemeCard from './ThemeCard.svelte'; import ThemeCard from './ThemeCard.svelte';
import ThemeModal from './ThemeModal.svelte';
import { StoreDownloadTheme } from '@/seqta/ui/themes/downloadTheme'
import { setTheme } from '@/seqta/ui/themes/setTheme';
let { themes, searchTerm } = $props<{ themes: Theme[]; searchTerm: string }>();
let displayTheme = $state<Theme | null>();
let { themes, searchTerm, setDisplayTheme } = $props<{ themes: Theme[]; searchTerm: string, setDisplayTheme: (theme: Theme) => void }>();
let filteredThemes = $derived(themes.filter((theme: Theme) => let filteredThemes = $derived(themes.filter((theme: Theme) =>
theme.name.toLowerCase().includes(searchTerm.toLowerCase()) || theme.description.toLowerCase().includes(searchTerm.toLowerCase()) theme.name.toLowerCase().includes(searchTerm.toLowerCase()) || theme.description.toLowerCase().includes(searchTerm.toLowerCase())
)); ));
</script> </script>
<div class="grid grid-cols-1 gap-4 py-12 mx-auto sm:grid-cols-2 lg:grid-cols-3"> <div class="relative" >
{#each filteredThemes as theme (theme.id)} <div class="grid grid-cols-1 gap-4 py-12 mx-auto sm:grid-cols-2 lg:grid-cols-3">
<ThemeCard theme={theme} onClick={() => displayTheme = theme} /> {#each filteredThemes as theme (theme.id)}
{/each} <ThemeCard theme={theme} onClick={() => setDisplayTheme(theme)} />
{/each}
<!-- "Got a Theme Idea?" card -->
<a href="https://betterseqta.gitbook.io/betterseqta-docs" class='w-full cursor-pointer'> {#if filteredThemes.length !== 0}
<div class="bg-zinc-50 h-48 w-full transition-all hover:scale-105 duration-500 relative justify-center items-center group group/card flex flex-col hover:shadow-2xl dark:hover:shadow-white/[0.1] hover:shadow-white/[0.8] dark:bg-zinc-800 dark:border-white/[0.1] rounded-xl overflow-clip border"> <a href="https://betterseqta.gitbook.io/betterseqta-docs" class='w-full cursor-pointer'>
<div class="text-2xl font-IconFamily">{'\uecb3'}</div> <div class="bg-zinc-50 h-48 w-full transition-all hover:scale-105 duration-500 relative justify-center items-center group group/card flex flex-col hover:shadow-2xl dark:hover:shadow-white/[0.1] hover:shadow-white/[0.8] dark:bg-zinc-800 dark:border-white/[0.1] rounded-xl overflow-clip border">
<div class="text-xl font-bold text-center transition-all duration-500 dark:text-white"> <div class="text-2xl font-IconFamily">{'\uecb3'}</div>
Got a Theme Idea? <div class="text-xl font-bold text-center transition-all duration-500 dark:text-white">
<p class="text-lg font-light subtitle">Transform it into a stunning theme!</p> Got a Theme Idea?
</div> <p class="text-lg font-light subtitle">Transform it into a stunning theme!</p>
</div> </div>
</a> </div>
</a>
{/if}
</div>
{#if filteredThemes.length === 0} {#if filteredThemes.length === 0}
<div class="flex flex-col items-center justify-center w-full text-center h-96"> <div class="absolute top-0 flex flex-col items-center justify-center w-full text-center h-96">
<h1 class="mt-4 text-3xl font-bold tracking-tight text-zinc-900 dark:text-zinc-100 sm:text-5xl">That doesn't exist! 😭😭😭</h1> <h1 class="mt-4 text-3xl font-bold tracking-tight text-zinc-900 dark:text-zinc-100 sm:text-5xl">That doesn't exist! 😭😭😭</h1>
<p class="mt-6 text-lg leading-7 text-zinc-600 dark:text-zinc-300">Sorry, we couldn't find the theme you're looking for. Maybe... you could create it?</p> <p class="mt-6 text-lg leading-7 text-zinc-600 dark:text-zinc-300">Sorry, we couldn't find the theme you're looking for. Maybe... you could create it?</p>
<a href="https://betterseqta.gitbook.io/betterseqta-docs" class='p-2 px-3 mt-4 transition rounded-md cursor-pointer dark:text-white bg-zinc-500/10 hover:scale-105'>
Show me how!
</a>
</div> </div>
{/if} {/if}
</div> </div>
{#if displayTheme}
<ThemeModal theme={displayTheme} onClose={() => displayTheme = null} onInstall={() => {
StoreDownloadTheme({themeContent: displayTheme as Theme}).then(() => {
setTheme((displayTheme as Theme).id);
displayTheme = null;
});
}} onRemove={() => {}} />
{/if}
+20 -10
View File
@@ -8,6 +8,9 @@
import { settingsState } from '@/seqta/utils/listeners/SettingsState' import { settingsState } from '@/seqta/utils/listeners/SettingsState'
import type { Theme } from '../types/Theme' import type { Theme } from '../types/Theme'
import browser from 'webextension-polyfill' import browser from 'webextension-polyfill'
import ThemeModal from '../components/store/ThemeModal.svelte'
import { StoreDownloadTheme } from '@/seqta/ui/themes/downloadTheme'
import { setTheme } from '@/seqta/ui/themes/setTheme'
// State variables // State variables
let searchTerm = $state<string>(''); let searchTerm = $state<string>('');
@@ -15,6 +18,11 @@
let coverThemes = $state<Theme[]>([]); let coverThemes = $state<Theme[]>([]);
let loading = $state<boolean>(true); let loading = $state<boolean>(true);
let darkMode = $state<boolean>(false); let darkMode = $state<boolean>(false);
let displayTheme = $state<Theme | null>(null);
const setDisplayTheme = (theme: Theme) => {
displayTheme = theme;
};
// Fetch themes and initialize app // Fetch themes and initialize app
const fetchThemes = async () => { const fetchThemes = async () => {
@@ -50,8 +58,8 @@
)); ));
</script> </script>
<div class="w-screen h-screen overflow-y-scroll bg-white {darkMode ? 'dark' : ''}"> <div class="w-screen h-screen bg-white {darkMode ? 'dark' : ''}">
<div class="bg-zinc-200/50 dark:bg-zinc-900 dark:text-white pt-[4.25rem] h-full px-12"> <div class="bg-zinc-200/50 dark:bg-zinc-900 dark:text-white pt-[4.25rem] h-full px-12 overflow-y-scroll">
<!-- Search Input (optional) --> <!-- Search Input (optional) -->
<div class="px-8 py-4"> <div class="px-8 py-4">
@@ -71,19 +79,21 @@
{:else} {:else}
{#if searchTerm === ''} {#if searchTerm === ''}
<CoverSwiper coverThemes={coverThemes} /> <CoverSwiper coverThemes={coverThemes} setDisplayTheme={setDisplayTheme} />
{/if} {/if}
<!-- ThemeGrid to display filtered themes --> <!-- ThemeGrid to display filtered themes -->
<ThemeGrid themes={filteredThemes} searchTerm={searchTerm} /> <ThemeGrid themes={filteredThemes} searchTerm={searchTerm} setDisplayTheme={setDisplayTheme} />
{#if filteredThemes.length === 0 && !loading} {#if displayTheme}
<div class="flex flex-col items-center justify-center w-full text-center h-96"> <ThemeModal theme={displayTheme} onClose={() => displayTheme = null} onInstall={() => {
<h1 class="mt-4 text-3xl font-bold tracking-tight text-zinc-900 dark:text-zinc-100 sm:text-5xl">No results! 😭</h1> StoreDownloadTheme({themeContent: displayTheme as Theme}).then(() => {
<p class="mt-6 text-lg leading-7 text-zinc-600 dark:text-zinc-300">Sorry, no themes match your search. Maybe create one?</p> setTheme((displayTheme as Theme).id);
</div> displayTheme = null;
});
}} onRemove={() => {}} />
{/if} {/if}
{/if} {/if}
</div> </div>
</div> </div>