Skip to content

Commit

Permalink
refactored and cleanedup most svelte components
Browse files Browse the repository at this point in the history
  • Loading branch information
GitPaulo committed Jan 5, 2025
1 parent e466554 commit 0722264
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 155 deletions.
1 change: 0 additions & 1 deletion src/app.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<!doctype html>
<html lang="en">
<head>
<title>FFXIV Journey</title>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
Expand Down
27 changes: 12 additions & 15 deletions src/lib/components/ActionBar.svelte
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
<script lang="ts">
import { createEventDispatcher } from "svelte";
import { slide } from "svelte/transition";
import {
autoMode,
toggleAutoMode,
showToggleTooltip,
enableToggleTooltip,
disableToggleTooltip,
showScrollToTop,
} from "$lib/stores/actionBarStore";
import Tooltip from "./Tooltip.svelte";
const dispatch = createEventDispatcher();
Expand All @@ -23,21 +22,20 @@
dispatch("scrollToLastQuest");
}
let tooltipTarget: HTMLElement | null = null;
export let lastCheckedQuestId: number | null = null;
</script>

<div
transition:slide
id="action-bar"
class="fixed md:absolute top-1 sm:top-2 mt-2 bg-white rounded-lg p-1 sm:p-2 shadow flex items-center justify-between z-50"
>
<!-- Toggle Button -->
<div class="flex items-center">
<div bind:this={tooltipTarget} class="flex items-center">
<button
on:click={toggleAutoMode}
on:mouseover={enableToggleTooltip}
on:mouseleave={disableToggleTooltip}
on:focus={enableToggleTooltip}
on:blur={disableToggleTooltip}
class={`w-10 h-5 sm:w-12 sm:h-6 flex items-center rounded-full p-1 transition-colors duration-300 ${
$autoMode ? "bg-gray-300" : "bg-blue-500"
}`}
Expand All @@ -50,13 +48,12 @@
</button>

<!-- Tooltip for Auto/Manual Mode -->
{#if $showToggleTooltip}
<div
class="ml-2 bg-gray-800 text-white text-xs rounded py-1 px-2 shadow-lg"
>
{$autoMode ? "Autochecking Quests" : "Manual Quest Checking"}
</div>
{/if}
<Tooltip
targetElement={tooltipTarget}
text={$autoMode ? "Autochecking Quests" : "Manual Quest Checking"}
inlineMode={true}
offsetX={5}
></Tooltip>
</div>

<!-- Share progress generate -->
Expand Down
7 changes: 5 additions & 2 deletions src/lib/components/Progress.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<script lang="ts">
import { onMount } from "svelte";
import { fade } from "svelte/transition";
import { progress } from "$lib/stores/progressStore";
import type { ExpansionProgress } from "$lib/stores/questsStore";
import { onMount } from "svelte";
let progressData: Record<string, ExpansionProgress> = {};
Expand All @@ -14,11 +16,12 @@
</script>

<div
transition:fade
class="mb-6 grid grid-cols-1 md:grid-cols-2 gap-4 bg-white rounded-lg p-4 shadow"
>
{#each Object.entries(progressData) as [name, { completed, total, percent }] (name)}
<div class="flex flex-col items-center">
<!-- Expansion Name with Progress Stats -->
<!-- Expansion Name -->
<p class="font-semibold text-gray-700">
{name}
<span class="inline sm:hidden ml-1">({completed}/{total})</span>
Expand Down
3 changes: 2 additions & 1 deletion src/lib/components/Search.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script lang="ts">
import { createEventDispatcher, onMount, onDestroy } from "svelte";
import { fade } from "svelte/transition";
export let placeholder: string = "Search...";
export let value: string = ""; // Bound to the parent component
Expand Down Expand Up @@ -40,7 +41,7 @@
});
</script>

<div class="mb-6 flex relative">
<div transition:fade class="mb-6 flex relative">
<input
type="text"
bind:value={inputValue}
Expand Down
46 changes: 2 additions & 44 deletions src/lib/components/Title.svelte
Original file line number Diff line number Diff line change
@@ -1,56 +1,14 @@
<script>
import { slide } from "svelte/transition";
import { loading } from "../stores/questsStore";
import {
showHideTooltip,
enableHideTooltip,
disableHideTooltip,
} from "$lib/stores/titleStore";
</script>

{#if $loading}
<div
class="relative flex flex-col mb-8 justify-center items-center"
transition:slide
class="relative flex flex-col mb-8 justify-center items-center"
>
<div class="bg-white rounded-lg p-2 shadow max-w-xl w-full relative">
<!-- Hide Button -->
<button
on:mouseover={enableHideTooltip}
on:focus={enableHideTooltip}
on:mouseleave={disableHideTooltip}
on:blur={disableHideTooltip}
class="absolute top-2 right-2 p-3 group"
>
<svg
fill="currentColor"
height="14px"
width="14px"
viewBox="0 0 330 330"
xml:space="preserve"
class="text-gray-300 group-hover:text-blue-500 transition-colors duration-200"
>
<path
d="M325.607,304.394l-63.479-63.479c38.57-29.035,63.522-64.92,65.247-67.437c3.501-5.11,3.501-11.846,0-16.956
c-2.925-4.269-72.659-104.544-162.371-104.544c-25.872,0-50.075,8.345-71.499,20.313L25.607,4.394
c-5.857-5.858-15.355-5.858-21.213,0c-5.858,5.858-5.858,15.355,0,21.213l63.478,63.478C29.299,118.12,4.35,154.006,2.625,156.523
c-3.5,5.109-3.5,11.845,0,16.955c2.925,4.268,72.65,104.546,162.378,104.546c25.868,0,50.069-8.345,71.493-20.314l67.897,67.898
C307.323,328.536,311.161,330,315,330c3.839,0,7.678-1.464,10.606-4.394C331.465,319.749,331.465,310.252,325.607,304.394z
M165.003,81.977c60.26,0,113.408,60.338,131.257,83.022c-9.673,12.294-29.705,35.629-55.609,54.439L115.673,94.461
C131.079,86.902,147.736,81.977,165.003,81.977z M165.003,248.023c-60.285,0-113.439-60.364-131.273-83.037
c9.651-12.303,29.652-35.658,55.574-54.47l124.99,124.99C198.884,243.084,182.236,248.023,165.003,248.023z"
/>
</svg>
{#if showHideTooltip}
<!-- Tooltip for Hide Button -->
<div
class="absolute top-full mt-1 right-0 bg-gray-800 text-white text-xs rounded py-1 px-2 shadow-lg"
>
Hide!
</div>
{/if}
</button>

<div class="text-center">
<img src="logo.png" alt="FFXIV Journey" class="h-16 mx-auto" />
<h1 class="text-3xl font-bold text-blue-600 mt-2">
Expand All @@ -66,7 +24,7 @@
</div>
</div>
{:else}
<div class="flex justify-end my-2">
<div transition:slide class="flex justify-end my-2">
<div
class="group flex items-center p-3 bg-white rounded-lg shadow relative transition-all duration-300"
>
Expand Down
99 changes: 99 additions & 0 deletions src/lib/components/Tooltip.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<script lang="ts">
import { fade } from "svelte/transition";
import { onDestroy } from "svelte";
export let text: string;
export let targetElement: HTMLElement | null = null;
export let offsetX: number = 0;
export let offsetY: number = 0;
export let orientation: "top" | "bottom" | "left" | "right" = "top";
export let inlineMode: boolean = false;
let tooltipElement: HTMLElement | null = null;
let showTooltip = false;
let style = "";
function handleMouseOver() {
showTooltip = true;
}
function handleMouseLeave() {
showTooltip = false;
}
// Attach and detach event listeners dynamically when `targetElement` changes
let currentTarget: HTMLElement | null = null;
$: {
// Detach event listeners from the previous target
if (currentTarget) {
console.log(
"Removing event listeners from currentTarget:",
currentTarget
);
currentTarget.removeEventListener("mouseover", handleMouseOver);
currentTarget.removeEventListener("mouseleave", handleMouseLeave);
}
// Attach event listeners to the new target
if (targetElement) {
console.log("Attaching event listeners to targetElement:", targetElement);
targetElement.addEventListener("mouseover", handleMouseOver);
targetElement.addEventListener("mouseleave", handleMouseLeave);
currentTarget = targetElement; // Track the current target for cleanup
}
}
onDestroy(() => {
if (currentTarget) {
currentTarget.removeEventListener("mouseover", handleMouseOver);
currentTarget.removeEventListener("mouseleave", handleMouseLeave);
}
});
// Dynamically calculate tooltip position
$: if (!inlineMode && targetElement && tooltipElement) {
const rect = targetElement.getBoundingClientRect();
const tooltipRect = tooltipElement.getBoundingClientRect();
switch (orientation) {
case "top":
style = `top: ${rect.top + window.scrollY - tooltipRect.height - offsetY}px;
left: ${rect.left + window.scrollX + rect.width / 2 - tooltipRect.width / 2 + offsetX}px;`;
break;
case "bottom":
style = `top: ${rect.bottom + window.scrollY + offsetY}px;
left: ${rect.left + window.scrollX + rect.width / 2 - tooltipRect.width / 2 + offsetX}px;`;
break;
case "left":
style = `top: ${rect.top + window.scrollY + rect.height / 2 - tooltipRect.height / 2 + offsetY}px;
left: ${rect.left + window.scrollX - tooltipRect.width - offsetX}px;`;
break;
case "right":
style = `top: ${rect.top + window.scrollY + rect.height / 2 - tooltipRect.height / 2 + offsetY}px;
left: ${rect.right + window.scrollX + offsetX}px;`;
break;
}
}
</script>

{#if showTooltip}
{#if inlineMode}
<span
transition:fade
class="bg-gray-800 text-white text-xs rounded px-2 py-1 shadow-lg z-50"
style="margin-top: {offsetY}px; margin-left: {offsetX}px;"
>
{text}
</span>
{:else}
<div
transition:fade
bind:this={tooltipElement}
class="bg-gray-800 text-white text-xs rounded px-2 py-1 shadow-lg z-50 fixed"
{style}
>
{text}
</div>
{/if}
{/if}
9 changes: 0 additions & 9 deletions src/lib/stores/actionBarStore.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,12 @@
import { writable } from "svelte/store";

export const autoMode = writable(true);
export const showToggleTooltip = writable(false);
export const showScrollToTop = writable(false);

export function toggleAutoMode() {
autoMode.update((value) => !value);
}

export function enableToggleTooltip() {
showToggleTooltip.set(true);
}

export function disableToggleTooltip() {
showToggleTooltip.set(false);
}

export function enableScrollToTop() {
showScrollToTop.set(true);
}
Expand Down
16 changes: 0 additions & 16 deletions src/lib/stores/titleStore.ts

This file was deleted.

Loading

0 comments on commit 0722264

Please sign in to comment.