|
2 | 2 | import { SliderComponent } from "obsidian"; |
3 | 3 | import type { CSSObject } from "src/types/CSSObject"; |
4 | 4 | import extractStylesFromObj from "src/utility/extractStylesFromObj"; |
5 | | - import { afterUpdate, createEventDispatcher, onMount } from "svelte"; |
| 5 | + import { createEventDispatcher, onDestroy, onMount } from "svelte"; |
6 | 6 |
|
7 | 7 | export let value: number; |
8 | 8 | export let limits: [min: number, max: number] | [min: number, max: number, step: number]; |
|
13 | 13 | const dispatch = createEventDispatcher(); |
14 | 14 |
|
15 | 15 | let slider: SliderComponent; |
16 | | - let styles: CSSObject; |
| 16 | + let styles: CSSObject = {}; |
| 17 | + let changeHandler: ((event: Event) => void) | null = null; |
17 | 18 |
|
18 | 19 | // This is not a complete implementation. I implemented what I needed. |
19 | 20 |
|
20 | 21 | onMount(() => { |
21 | 22 | slider = new SliderComponent(sliderRef); |
22 | 23 |
|
23 | | - updateSliderAttributes(slider); |
| 24 | + changeHandler = (event: Event) => { |
| 25 | + const newValue = Number((event.target as HTMLInputElement).value); |
| 26 | + dispatch("change", { value: newValue }); |
| 27 | + }; |
| 28 | +
|
| 29 | + slider.sliderEl.addEventListener("input", changeHandler); |
24 | 30 | }); |
25 | 31 |
|
26 | | - afterUpdate(() => { |
27 | | - updateSliderAttributes(slider); |
| 32 | + onDestroy(() => { |
| 33 | + if (slider?.sliderEl && changeHandler) { |
| 34 | + slider.sliderEl.removeEventListener("input", changeHandler); |
| 35 | + } |
28 | 36 | }); |
29 | 37 |
|
30 | | - function updateSliderAttributes(sldr: SliderComponent) { |
31 | | - if (value !== undefined) sldr.setValue(value); |
32 | | - if (limits) { |
33 | | - if (limits.length === 2) { |
34 | | - sldr.setLimits(limits[0], limits[1], 1); |
| 38 | + $: if (slider) { |
| 39 | + updateSliderAttributes(slider, value, limits, styles); |
| 40 | + } |
| 41 | +
|
| 42 | + function updateSliderAttributes( |
| 43 | + sldr: SliderComponent, |
| 44 | + currentValue: number, |
| 45 | + currentLimits: [min: number, max: number] | [min: number, max: number, step: number], |
| 46 | + currentStyles: CSSObject |
| 47 | + ) { |
| 48 | + if (currentValue !== undefined) sldr.setValue(currentValue); |
| 49 | + if (currentLimits) { |
| 50 | + if (currentLimits.length === 2) { |
| 51 | + sldr.setLimits(currentLimits[0], currentLimits[1], 1); |
35 | 52 | } else { |
36 | | - sldr.setLimits(limits[0], limits[1], limits[2]); |
| 53 | + sldr.setLimits(currentLimits[0], currentLimits[1], currentLimits[2]); |
37 | 54 | } |
38 | 55 | } |
39 | | - if (styles) { |
40 | | - sldr.sliderEl.setAttr("style", extractStylesFromObj(styles)); |
| 56 | + if (currentStyles) { |
| 57 | + sldr.sliderEl.setAttr("style", extractStylesFromObj(currentStyles)); |
41 | 58 | } |
42 | | -
|
43 | | - sldr.onChange((value: number) => { |
44 | | - dispatch("change", { value }); |
45 | | - }); |
46 | 59 | } |
47 | 60 | </script> |
48 | 61 |
|
|
0 commit comments