Skip to content

Commit 6bc9369

Browse files
committed
useSyncFormTranslations: update to typescript and add unit test
1 parent 7075ffb commit 6bc9369

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React, { useRef, useState, useEffect } from 'react';
2+
import { render } from '@testing-library/react';
3+
import useSyncFormTranslations from './useSyncFormTranslations';
4+
5+
describe('useSyncFormTranslations', () => {
6+
it('resets and re-applies non-empty form values on language change', () => {
7+
const reset = jest.fn();
8+
const change = jest.fn();
9+
const getState = jest.fn().mockReturnValue({
10+
values: {
11+
name: 'Alice',
12+
13+
emptyField: ''
14+
}
15+
});
16+
17+
const formMock = { getState, reset, change };
18+
19+
function TestComponent({ language }: { language: string }) {
20+
const formRef = useRef<any>(formMock);
21+
useSyncFormTranslations(formRef, language);
22+
23+
return null;
24+
}
25+
26+
const { rerender } = render(<TestComponent language="en" />);
27+
rerender(<TestComponent language="fr" />); // simulate language change
28+
29+
expect(reset).toHaveBeenCalled();
30+
31+
expect(change).toHaveBeenCalledWith('name', 'Alice');
32+
expect(change).toHaveBeenCalledWith('email', '[email protected]');
33+
expect(change).not.toHaveBeenCalledWith('emptyField', '');
34+
});
35+
36+
it('does nothing if formRef.current is null', () => {
37+
function TestComponent({ language }: { language: string }) {
38+
const formRef = useRef<any>(null);
39+
useSyncFormTranslations(formRef, language);
40+
return null;
41+
}
42+
43+
render(<TestComponent language="en" />);
44+
// No error = pass
45+
});
46+
});

client/common/useSyncFormTranslations.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
1-
import { useEffect } from 'react';
1+
import { useEffect, MutableRefObject } from 'react';
22

3-
// Usage: useSyncFormTranslations(formRef, language)
4-
// This hook ensures that form values are preserved when the language changes.
5-
// Pass a ref to the form instance and the current language as arguments.
6-
const useSyncFormTranslations = (formRef, language) => {
3+
export interface FormLike {
4+
getState(): { values: Record<string, unknown> };
5+
reset(): void;
6+
change(field: string, value: unknown): void;
7+
}
8+
9+
/**
10+
* This hook ensures that form values are preserved when the language changes.
11+
* @param formRef
12+
* @param language
13+
*/
14+
const useSyncFormTranslations = (
15+
formRef: MutableRefObject<FormLike>,
16+
language: string
17+
) => {
718
useEffect(() => {
819
const form = formRef.current;
920
if (!form) return;

0 commit comments

Comments
 (0)