diff --git a/src/composables/functional/useChainCallback.ts b/src/composables/functional/useChainCallback.ts index 40ae6a1fd..266e0a952 100644 --- a/src/composables/functional/useChainCallback.ts +++ b/src/composables/functional/useChainCallback.ts @@ -9,8 +9,8 @@ export const useChainCallback = void>( originalCallback: T | undefined, ...callbacks: ((...args: Parameters) => void)[] ) => { - return (...args: Parameters) => { - originalCallback?.(...args) - callbacks.forEach((callback) => callback(...args)) + return function (this: unknown, ...args: Parameters) { + originalCallback?.call(this, ...args) + callbacks.forEach((callback) => callback.call(this, ...args)) } } diff --git a/tests-ui/tests/composables/functional/useChainCallback.test.ts b/tests-ui/tests/composables/functional/useChainCallback.test.ts new file mode 100644 index 000000000..a42a05e39 --- /dev/null +++ b/tests-ui/tests/composables/functional/useChainCallback.test.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from 'vitest' + +import { useChainCallback } from '@/composables/functional/useChainCallback' + +describe('useChainCallback', () => { + it('preserves "this" context in original callback and chained callbacks', () => { + class TestClass { + value = 'test' + + constructor() { + this.method = useChainCallback(this.method, function (this: TestClass) { + expect(this.value).toBe('test') + }) + } + + method() { + expect(this.value).toBe('test') + } + } + + const instance = new TestClass() + instance.method() + }) + + it('handles undefined original callback', () => { + const context = { value: 'test' } + const chainedFn = useChainCallback( + undefined, + function (this: typeof context) { + expect(this.value).toBe('test') + } + ) + + chainedFn.call(context) + }) + + it('passes arguments to all callbacks', () => { + const originalCalls: number[] = [] + const chainedCalls: number[] = [] + + const original = function (this: unknown, num: number) { + originalCalls.push(num) + } + + const chained = function (this: unknown, num: number) { + chainedCalls.push(num) + } + + const chainedFn = useChainCallback(original, chained) + chainedFn(42) + + expect(originalCalls).toEqual([42]) + expect(chainedCalls).toEqual([42]) + }) +})