YAGNI: useWidget

This commit is contained in:
Alexander Brown
2026-02-04 12:25:06 -08:00
parent ea26a16bd2
commit 627ca0b3f9
2 changed files with 0 additions and 186 deletions

View File

@@ -1,136 +0,0 @@
import { createTestingPinia } from '@pinia/testing'
import { setActivePinia } from 'pinia'
import { beforeEach, describe, expect, it } from 'vitest'
import { ref } from 'vue'
import type { NodeId } from '@/lib/litegraph/src/LGraphNode'
import type { WidgetState } from '@/stores/widgetValueStore'
import { useWidgetValueStore } from '@/stores/widgetValueStore'
import { useWidget } from './useWidget'
function widget<T>(
nodeId: NodeId,
name: string,
type: string,
value: T,
extra: Partial<
Omit<WidgetState<T>, 'nodeId' | 'name' | 'type' | 'value'>
> = {}
): WidgetState<T> {
return { nodeId, name, type, value, options: {}, ...extra }
}
describe('useWidget', () => {
beforeEach(() => {
setActivePinia(createTestingPinia({ stubActions: false }))
})
it('returns undefined widget when not registered', () => {
const { widget, value, isHidden, isDisabled, isAdvanced, isPromoted } =
useWidget(1, 'test_widget')
expect(widget.value).toBeUndefined()
expect(value.value).toBeUndefined()
expect(isHidden.value).toBe(false)
expect(isDisabled.value).toBe(false)
expect(isAdvanced.value).toBe(false)
expect(isPromoted.value).toBe(false)
})
it('returns widget state when registered', () => {
const store = useWidgetValueStore()
store.registerWidget(
widget(1, 'test_widget', 'text', 'initial_value', {
hidden: true,
advanced: true,
label: 'Custom Label'
})
)
const {
widget: widgetState,
value,
isHidden,
isAdvanced,
label
} = useWidget(1, 'test_widget')
expect(widgetState.value).toBeDefined()
expect(value.value).toBe('initial_value')
expect(isHidden.value).toBe(true)
expect(isAdvanced.value).toBe(true)
expect(label.value).toBe('Custom Label')
})
it('allows setting value through writable computed', () => {
const store = useWidgetValueStore()
store.registerWidget(widget(1, 'test_widget', 'number', 42))
const { value } = useWidget(1, 'test_widget')
expect(value.value).toBe(42)
value.value = 100
expect(store.getWidget(1, 'test_widget')?.value).toBe(100)
})
it('reacts to nodeId ref changes', () => {
const store = useWidgetValueStore()
store.registerWidget(widget(1, 'shared_widget', 'text', 'node1_value'))
store.registerWidget(widget(2, 'shared_widget', 'text', 'node2_value'))
const nodeId = ref<NodeId>(1)
const { value } = useWidget(nodeId, 'shared_widget')
expect(value.value).toBe('node1_value')
nodeId.value = 2
expect(value.value).toBe('node2_value')
})
it('reacts to widgetName ref changes', () => {
const store = useWidgetValueStore()
store.registerWidget(widget(1, 'widget_a', 'text', 'value_a'))
store.registerWidget(widget(1, 'widget_b', 'text', 'value_b'))
const widgetName = ref('widget_a')
const { value } = useWidget(1, widgetName)
expect(value.value).toBe('value_a')
widgetName.value = 'widget_b'
expect(value.value).toBe('value_b')
})
it('reacts to store state changes', () => {
const store = useWidgetValueStore()
store.registerWidget(widget(1, 'test_widget', 'toggle', false))
const { value, isHidden } = useWidget(1, 'test_widget')
expect(value.value).toBe(false)
expect(isHidden.value).toBe(false)
store.getWidget(1, 'test_widget')!.value = true
expect(value.value).toBe(true)
store.getWidget(1, 'test_widget')!.hidden = true
expect(isHidden.value).toBe(true)
})
it('returns correct disabled and promoted states', () => {
const store = useWidgetValueStore()
store.registerWidget(
widget(1, 'test_widget', 'text', 'value', {
disabled: true,
promoted: true
})
)
const { isDisabled, isPromoted } = useWidget(1, 'test_widget')
expect(isDisabled.value).toBe(true)
expect(isPromoted.value).toBe(true)
})
})

View File

@@ -1,50 +0,0 @@
import type { MaybeRefOrGetter } from 'vue'
import { computed, toValue } from 'vue'
import type { NodeId } from '@/lib/litegraph/src/LGraphNode'
import type { WidgetState } from '@/stores/widgetValueStore'
import { useWidgetValueStore } from '@/stores/widgetValueStore'
/**
* Composable for reactive access to widget state by (nodeId, widgetName).
*
* Provides computed accessors for widget value and metadata flags.
* The value computed is writable, allowing direct assignment.
*
* @param nodeId - Node ID (can be ref or getter)
* @param widgetName - Widget name (can be ref or getter)
*/
export function useWidget(
nodeId: MaybeRefOrGetter<NodeId>,
widgetName: MaybeRefOrGetter<string>
) {
const store = useWidgetValueStore()
const widget = computed<WidgetState | undefined>(() =>
store.getWidget(toValue(nodeId), toValue(widgetName))
)
const value = computed({
get: () => widget.value?.value,
set: (v: unknown) => {
if (widget.value) widget.value.value = v
}
})
const isHidden = computed(() => widget.value?.hidden ?? false)
const isDisabled = computed(() => widget.value?.disabled ?? false)
const isAdvanced = computed(() => widget.value?.advanced ?? false)
const isPromoted = computed(() => widget.value?.promoted ?? false)
const label = computed(() => widget.value?.label)
return {
widget,
value,
isHidden,
isDisabled,
isAdvanced,
isPromoted,
label
}
}