Skip to content

Commit cd27096

Browse files
committed
Add tracking events for user interactions and modal displays
1 parent c8c9cde commit cd27096

13 files changed

Lines changed: 86 additions & 9 deletions

src/lib/components/AlgorithmSelector.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import type { AlgorithmDefinition } from '../sort-algorithms/types';
77
import ArrowRight from './algorithm-selector/ArrowRight.svelte';
88
import ArrowLeft from './algorithm-selector/ArrowLeft.svelte';
9+
import { trackEvent } from '../umami';
910
1011
const click = (algo: AlgorithmDefinition) => () => {
1112
selectAlgorithm(algo);
13+
trackEvent('algorithm-selected', { algorithm: algo.name });
1214
};
1315
</script>
1416

src/lib/components/ControlButtons.svelte

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,23 @@
55
66
import { arrayToSort, running } from '../../states';
77
import { generateArray, shuffle } from '../randomized-array-generator';
8+
import { trackEvent } from '../umami';
89
9-
const start = () => ($running = !$running);
10+
const start = () => {
11+
$running = !$running;
12+
trackEvent('sort-control', { action: $running ? 'start' : 'stop' });
13+
};
1014
1115
const reverse = () => {
1216
$arrayToSort = generateArray(size).reverse();
1317
reset();
18+
trackEvent('array-pattern', { pattern: 'reverse' });
1419
};
1520
1621
const shuffleClick = () => {
1722
$arrayToSort = shuffle(generateArray(size));
1823
reset();
24+
trackEvent('array-pattern', { pattern: 'shuffle' });
1925
};
2026
2127
const oddsEvens = () =>
@@ -34,13 +40,20 @@
3440
$arrayToSort = [...odds.reverse(), ...evens];
3541
3642
reset();
43+
trackEvent('array-pattern', { pattern: 'valley' });
3744
};
3845
3946
const mountain = () => {
4047
const [odds, evens] = oddsEvens();
4148
$arrayToSort = [...odds, ...evens.reverse()];
4249
4350
reset();
51+
trackEvent('array-pattern', { pattern: 'mountain' });
52+
};
53+
54+
const stepClick = () => {
55+
step();
56+
trackEvent('sort-control', { action: 'step' });
4457
};
4558
</script>
4659

@@ -52,7 +65,7 @@
5265
: 'btn-primary'} lg:btn-lg lg:w-24"
5366
on:click={start}>{$running ? 'Stop' : 'Start'}</button
5467
>
55-
<button class="btn join-item lg:btn-lg lg:w-24" on:click={step}>Step</button
68+
<button class="btn join-item lg:btn-lg lg:w-24" on:click={stepClick}>Step</button
5669
>
5770
</div>
5871
<button class="btn lg:btn-lg" on:click={shuffleClick}>Shuffle</button>

src/lib/components/Footer.svelte

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
1+
<script lang="ts">
2+
import { trackEvent } from '../umami';
3+
4+
const handleGitHubClick = () => {
5+
trackEvent('external-link', { destination: 'github-profile' });
6+
};
7+
</script>
8+
19
<footer class="footer items-center p-4 bg-base-200">
210
<aside class="items-center grid-flow-col">
311
<p class="text-xs lg:text-sm">
412
Built with ☕️ and ❤️ by <a
513
class="link"
614
href="https://github.com/mszula"
7-
target="_blank">mszula</a
15+
target="_blank"
16+
on:click={handleGitHubClick}>mszula</a
817
>
918
using Svelte.
1019
<span class="text-xs opacity-30"

src/lib/components/HeaderGitHubButton.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1+
<script lang="ts">
2+
import { trackEvent } from '../umami';
3+
4+
const handleClick = () => {
5+
trackEvent('external-link', { destination: 'github-repo' });
6+
};
7+
</script>
8+
19
<a
210
class="lg:btn lg:btn-square lg:btn-ghost"
311
href="https://github.com/mszula/visual-sorting"
412
target="_blank"
13+
on:click={handleClick}
514
>
615
<svg
716
class="w-[24px] h-[24px]"

src/lib/components/HeaderSoundControl.svelte

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { customOscillatorTypes } from 'web-audio-oscillators';
33
import { type OscillatorType } from '../sound';
44
import { handleMenuOutsideClick } from './menu-outside-click-handler';
5+
import { trackEvent } from '../umami';
56
67
export let oscillatorType: OscillatorType;
78
@@ -15,6 +16,11 @@
1516
);
1617
};
1718
19+
const changeSound = (type: OscillatorType) => {
20+
oscillatorType = type;
21+
trackEvent('sound-changed', { type: type || 'none' });
22+
};
23+
1824
let ref: HTMLDetailsElement;
1925
</script>
2026

@@ -67,17 +73,15 @@
6773
<button
6874
class={!oscillatorType ? 'btn-active' : ''}
6975
data-sound-select
70-
on:click={() => (oscillatorType = null)}>None</button
76+
on:click={() => changeSound(null)}>None</button
7177
>
7278
</li>
7379
{#each customOscillatorTypes as osc}
7480
<li>
7581
<button
7682
class={osc === oscillatorType ? 'btn-active' : ''}
7783
data-sound-select
78-
on:click={() => {
79-
oscillatorType = osc;
80-
}}>{getOscillatorName(osc)}</button
84+
on:click={() => changeSound(osc)}>{getOscillatorName(osc)}</button
8185
>
8286
</li>
8387
{/each}

src/lib/components/HeaderThemeControl.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import themes from '../../themes.js';
33
import { handleMenuOutsideClick } from './menu-outside-click-handler';
4+
import { trackEvent } from '../umami';
45
56
export let selectedTheme: string;
67
@@ -14,6 +15,7 @@
1415
selectedTheme = e.currentTarget.dataset.setTheme || 'dim';
1516
1617
document.documentElement.setAttribute('data-theme', selectedTheme);
18+
trackEvent('theme-changed', { theme: selectedTheme });
1719
};
1820
</script>
1921

src/lib/components/KoFiSupportModal.svelte

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { onMount } from 'svelte';
33
import { running } from '../../states';
4+
import { trackEvent } from '../umami';
45
56
let ref: HTMLDialogElement;
67
let timedOut = false;
@@ -19,16 +20,19 @@
1920
$: if (!$running && timedOut && !showed) {
2021
ref.showModal();
2122
showed = true;
23+
trackEvent('modal-shown', { modal: 'kofi-support' });
2224
}
2325
2426
const handleClick = () => {
2527
localStorage.setItem('kofi-support-shown', 'true');
2628
ref.close();
29+
trackEvent('modal-action', { modal: 'kofi-support', action: 'kofi-clicked' });
2730
};
2831
2932
const handleDismiss = () => {
3033
localStorage.setItem('kofi-support-shown', 'true');
3134
ref.close();
35+
trackEvent('modal-action', { modal: 'kofi-support', action: 'maybe-later' });
3236
};
3337
</script>
3438

src/lib/components/LeaveAStarModal.svelte

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script lang="ts">
22
import { onMount } from 'svelte';
33
import { running } from '../../states';
4+
import { trackEvent } from '../umami';
45
56
let ref: HTMLDialogElement;
67
let timedOut = false;
@@ -19,11 +20,17 @@
1920
$: if (!$running && timedOut && !showed) {
2021
ref.showModal();
2122
showed = true;
23+
trackEvent('modal-shown', { modal: 'github-star' });
2224
}
2325
2426
const click = () => {
2527
localStorage.setItem('leaved-a-star', 'yup');
2628
ref.close();
29+
trackEvent('modal-action', { modal: 'github-star', action: 'star-clicked' });
30+
};
31+
32+
const dismiss = () => {
33+
trackEvent('modal-action', { modal: 'github-star', action: 'maybe-later' });
2734
};
2835
</script>
2936

@@ -53,7 +60,7 @@
5360
⭐️ Star on GitHub
5461
</a>
5562
<form method="dialog">
56-
<button class="btn">Maybe Later</button>
63+
<button class="btn" on:click={dismiss}>Maybe Later</button>
5764
</form>
5865
</div>
5966
</div>

src/lib/components/RangeArraySize.svelte

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
export let size: number;
33
44
import { running } from '../../states';
5+
import { trackEvent } from '../umami';
6+
7+
const handleChange = () => {
8+
trackEvent('array-size-changed', { size });
9+
};
510
</script>
611

712
<label class="form-control w-full mb-2">
@@ -18,5 +23,6 @@
1823
min="2"
1924
type="range"
2025
bind:value={size}
26+
on:change={handleChange}
2127
/>
2228
</label>

src/lib/components/RangeArraySizePowerOfTwo.svelte

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
export let size: number;
33
44
import { running } from '../../states';
5+
import { trackEvent } from '../umami';
56
67
const steps = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024];
78
@@ -11,6 +12,10 @@
1112
Math.abs(curr - size) < Math.abs(prev - size) ? curr : prev
1213
);
1314
}
15+
16+
const handleChange = () => {
17+
trackEvent('array-size-changed', { size, type: 'power-of-two' });
18+
};
1419
</script>
1520

1621
<label class="form-control w-full mb-2">
@@ -28,6 +33,7 @@
2833
type="radio"
2934
{value}
3035
bind:group={size}
36+
on:change={handleChange}
3137
/>
3238
{/each}
3339
</div>

0 commit comments

Comments
 (0)