Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/hooks.client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { handleApiError } from '$lib/errorhandling/apiErrorHandling';
import { initializeSignalR } from '$lib/signalr';
import { initializeSignalR } from '$lib/signalr/index.svelte';
import { backendMetadata } from '$lib/state/BackendMetadata.svelte';
import { initializeDarkModeStore } from '$lib/stores/ColorSchemeStore.svelte';
import { initializeSerialPortsStore } from '$lib/stores/SerialPortsStore';
Expand Down
7 changes: 4 additions & 3 deletions src/lib/components/ControlModules/ClassicControlModule.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
ControlIntensityDefault,
ControlIntensityProps,
} from '$lib/constants/ControlConstants';
import { SignalR_Connection } from '$lib/signalr';
import { getConnection } from '$lib/signalr/index.svelte';
import { ControlType } from '$lib/signalr/models/ControlType';
import { serializeControlMessages } from '$lib/signalr/serializers/Control';
import ControlListener from './ControlListener.svelte';
Expand All @@ -26,8 +26,9 @@
let active = $state<ControlType | null>(null);

function ctrl(type: ControlType) {
if (!$SignalR_Connection) return;
serializeControlMessages($SignalR_Connection, [{ id: shocker.id, type, intensity, duration }]);
const conn = getConnection();
if (!conn) return;
serializeControlMessages(conn, [{ id: shocker.id, type, intensity, duration }]);
}
</script>

Expand Down
7 changes: 4 additions & 3 deletions src/lib/components/ControlModules/MapControlModule.svelte
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<script lang="ts">
import type { ShockerResponse } from '$lib/api/internal/v1';
import { ControlDurationDefault, ControlIntensityDefault } from '$lib/constants/ControlConstants';
import { SignalR_Connection } from '$lib/signalr';
import { getConnection } from '$lib/signalr/index.svelte';
import type { ControlType } from '$lib/signalr/models/ControlType';
import { serializeControlMessages } from '$lib/signalr/serializers/Control';
import { onMount } from 'svelte';
Expand All @@ -10,14 +10,15 @@
shockers: ShockerResponse[];
}

let { shockers }: Props = $props();

Check warning on line 13 in src/lib/components/ControlModules/MapControlModule.svelte

View workflow job for this annotation

GitHub Actions / build-and-test

'shockers' is assigned a value but never used

let intensity: number = ControlIntensityDefault;
let duration: number = ControlDurationDefault;

function ctrl(type: ControlType) {

Check warning on line 18 in src/lib/components/ControlModules/MapControlModule.svelte

View workflow job for this annotation

GitHub Actions / build-and-test

'ctrl' is defined but never used
if (!$SignalR_Connection) return;
serializeControlMessages($SignalR_Connection, [{ id: '', type, intensity, duration }]);
const conn = getConnection();
if (!conn) return;
serializeControlMessages(conn, [{ id: '', type, intensity, duration }]);
}

let canvas: HTMLCanvasElement;
Expand Down
7 changes: 4 additions & 3 deletions src/lib/components/ControlModules/RichControlModule.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
ControlIntensityDefault,
ControlIntensityProps,
} from '$lib/constants/ControlConstants';
import { SignalR_Connection } from '$lib/signalr';
import { getConnection } from '$lib/signalr/index.svelte';
import { ControlType } from '$lib/signalr/models/ControlType';
import { serializeControlMessages } from '$lib/signalr/serializers/Control';
import ControlListener from './ControlListener.svelte';
Expand All @@ -25,8 +25,9 @@
let active = $state<ControlType | null>(null);

function ctrl(type: ControlType) {
if (!$SignalR_Connection) return;
serializeControlMessages($SignalR_Connection, [{ id: shocker.id, type, intensity, duration }]);
const conn = getConnection();
if (!conn) return;
serializeControlMessages(conn, [{ id: shocker.id, type, intensity, duration }]);
}
</script>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
ControlIntensityDefault,
ControlIntensityProps,
} from '$lib/constants/ControlConstants';
import { SignalR_Connection } from '$lib/signalr';
import { getConnection } from '$lib/signalr/index.svelte';
import { ControlType } from '$lib/signalr/models/ControlType';
import { serializeControlMessages } from '$lib/signalr/serializers/Control';
import ControlListener from './ControlListener.svelte';
Expand Down Expand Up @@ -42,8 +42,9 @@
const clampedDuration = $derived(Math.min(duration, maxDurationSeconds));

function ctrl(type: ControlType) {
if (!$SignalR_Connection) return;
serializeControlMessages($SignalR_Connection, [
const conn = getConnection();
if (!conn) return;
serializeControlMessages(conn, [
{
id: shocker.id,
type,
Expand Down
7 changes: 4 additions & 3 deletions src/lib/components/ControlModules/SimpleControlModule.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script lang="ts">
import type { ShockerResponse } from '$lib/api/internal/v1';
import { SignalR_Connection } from '$lib/signalr';
import { getConnection } from '$lib/signalr/index.svelte';
import { ControlType } from '$lib/signalr/models/ControlType';
import { serializeControlMessages } from '$lib/signalr/serializers/Control';
import ControlListener from './ControlListener.svelte';
Expand Down Expand Up @@ -37,8 +37,9 @@
return;
}

if (!$SignalR_Connection) return;
serializeControlMessages($SignalR_Connection, [{ id: shocker.id, type, intensity, duration }]);
const conn = getConnection();
if (!conn) return;
serializeControlMessages(conn, [{ id: shocker.id, type, intensity, duration }]);
}
</script>

Expand Down
55 changes: 0 additions & 55 deletions src/lib/components/confirm-dialog/dialog-confirm.svelte

This file was deleted.

25 changes: 0 additions & 25 deletions src/lib/components/confirm-dialog/dialog-manager.svelte

This file was deleted.

21 changes: 21 additions & 0 deletions src/lib/components/dialog-manager/dialog-alert-content.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<script lang="ts">
import { Button } from '$lib/components/ui/button';
import * as Dialog from '$lib/components/ui/dialog';
import type { AlertProps } from './types';

let { title, desc, buttonText = 'OK', resolve }: AlertProps = $props();

function handleAcknowledge() {
resolve();
}
</script>

<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
{#if desc}
<Dialog.Description>{desc}</Dialog.Description>
{/if}
</Dialog.Header>
<Dialog.Footer>
<Button onclick={handleAcknowledge}>{buttonText}</Button>
</Dialog.Footer>
45 changes: 45 additions & 0 deletions src/lib/components/dialog-manager/dialog-confirm-content.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<script lang="ts" generics="T">
import { LoaderCircle } from '@lucide/svelte';
import { Button } from '$lib/components/ui/button';
import * as Dialog from '$lib/components/ui/dialog';
import type { ConfirmProps } from './types.ts';

let {
title,
desc,
data,
confirmButtonText = 'Confirm',
cancelButtonText = 'Cancel',
descSnippet,
resolve,
close,
}: ConfirmProps<T> = $props();

let loading = $state(false);

function handleConfirm() {
loading = true;
resolve({ confirmed: true, data: data as T });
}

function handleCancel() {
close();
}
</script>

<Dialog.Header>
<Dialog.Title>{title}</Dialog.Title>
<Dialog.Description>
{desc}
{#if descSnippet}
{@render descSnippet(data as T)}
{/if}
</Dialog.Description>
</Dialog.Header>
<Dialog.Footer>
<Button variant="outline" onclick={handleCancel}>{cancelButtonText}</Button>
<Button disabled={loading} variant="destructive" onclick={handleConfirm}>
{#if loading}<LoaderCircle class="animate-spin" />{/if}
{confirmButtonText}
</Button>
</Dialog.Footer>
16 changes: 16 additions & 0 deletions src/lib/components/dialog-manager/dialog-custom-content.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<script lang="ts" generics="T, R">
import type { CustomProps, DialogRenderProps } from './types.ts';

let { data: initialData, contentSnippet, resolve, close }: CustomProps<T, R> = $props();

// svelte-ignore state_referenced_locally -- intentionally captures initial value as own reactive copy
let data: T = $state(initialData as T);

const renderProps: DialogRenderProps<T, R> = $derived({
data,
resolve,
close,
});
</script>

{@render contentSnippet(renderProps)}
35 changes: 35 additions & 0 deletions src/lib/components/dialog-manager/dialog-manager.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<script lang="ts">
import * as Dialog from '$lib/components/ui/dialog';
import { getOldestDialog } from './dialog-store.svelte.ts';
Copy link

Copilot AI Mar 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Importing ./dialog-store.svelte.ts is inconsistent with the rest of the codebase, which imports .svelte.ts modules via the .svelte specifier (e.g. $lib/stores/HubsStore.svelte, $lib/components/dialog-manager/dialog-store.svelte). Consider switching this to ./dialog-store.svelte for consistency and to avoid resolver/tooling edge cases.

Suggested change
import { getOldestDialog } from './dialog-store.svelte.ts';
import { getOldestDialog } from './dialog-store.svelte';

Copilot uses AI. Check for mistakes.

let entry = $derived(getOldestDialog());
let dialogId = $derived(entry?.[0]);
let ctx = $derived(entry?.[1]);

let open = $state(true);

// Reset open when dialog changes
$effect(() => {
if (dialogId) {
open = true;
}
});

function handleOpenChange(isOpen: boolean) {
if (!isOpen && ctx) {
// Dialog was closed (escape, overlay click, etc.) - call close handler
(ctx.props as { close?: () => void }).close?.();
}
open = isOpen;
}
</script>

{#if dialogId && ctx}
{#key dialogId}
<Dialog.Root bind:open={() => open, handleOpenChange}>
<Dialog.Content>
<ctx.content {...ctx.props} />
</Dialog.Content>
</Dialog.Root>
{/key}
{/if}
Loading
Loading