Skip to content

Commit

Permalink
chore(slider): fix story tests (#4464)
Browse files Browse the repository at this point in the history
* chore(slider): fix story tests

* fix: watch setter
  • Loading branch information
m0ksem authored Jan 31, 2025
1 parent c33a9f7 commit bac09fd
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
4 changes: 2 additions & 2 deletions packages/ui/src/components/va-slider/VaSlider.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ import { VaSlider } from './'

function getSlider () {
return {
slider: getStoryId('slider'),
slider: getStoryId('slider').querySelector('[role="slider"]') as HTMLElement,
sliderTrack: getStorySelector('.va-slider__track'),
sliderThumb: getStorySelector('.va-slider__handler'),
}
}

function getSliderAll () {
return {
slider: getStoryIdAll('slider'),
slider: [...getStoryIdAll('slider')].map((el) => el.querySelector('[role="slider"]') as HTMLElement),
sliderTrack: getStorySelectorAll('.va-slider__track:not([class*=" "])'),
sliderThumb: getStorySelectorAll('.va-slider__handler'),
}
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/src/components/va-slider/VaSlider.vue
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ const sliderAriaAttributes = (value: number, order: 0 | 1) => {
role: 'slider',
'aria-valuemin': minComputed.value,
'aria-valuemax': maxComputed.value,
'aria-valuenow:': value,
'aria-valuenow': value,
'aria-valuetext': String(value),
'aria-label': props.range
? order === 0
Expand Down
23 changes: 15 additions & 8 deletions packages/ui/src/utils/watch-setter.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { ComputedRef, Ref } from 'vue'

const isComputedRef = <T>(value: Ref<T>): value is ComputedRef<any> & { _setter: (v: T) => void} => {
return typeof value === 'object' && '_setter' in value
}
import { Ref } from 'vue'
import { warn } from './console'

// TODO: Maybe it is better to tweak useStateful
/**
Expand All @@ -12,10 +9,20 @@ const isComputedRef = <T>(value: Ref<T>): value is ComputedRef<any> & { _setter:
* @notice you likely want to watch when value is changed, not setter is called.
*/
export const watchSetter = <T>(ref: Ref<T>, cb: (newValue: T) => void) => {
if (!isComputedRef(ref)) { return }
const originalSetter = ref._setter
let key: 'setter' | '_setter'

if ('_setter' in ref) {
key = '_setter' as const
} else if ('setter' in ref) {
key = 'setter' as const
} else {
warn('watchSetter', 'Ref does not have setter', ref)
return
}

const originalSetter = (ref as any)[key]

ref._setter = (newValue: T) => {
;(ref as any)[key] = (newValue: T) => {
cb(newValue)
originalSetter(newValue)
}
Expand Down

0 comments on commit bac09fd

Please sign in to comment.