mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
YAGNI: useWidget
This commit is contained in:
@@ -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)
|
||||
})
|
||||
})
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user