@ehfuse/forma 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/FieldStore.js +3 -3
- package/dist/esm/core/FieldStore.js +3 -3
- package/dist/esm/hooks/useFormaState.d.ts +9 -0
- package/dist/esm/hooks/useFormaState.d.ts.map +1 -1
- package/dist/esm/hooks/useFormaState.js +41 -14
- package/dist/esm/hooks/useFormaState.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/hooks/useFormaState.d.ts +9 -0
- package/dist/hooks/useFormaState.d.ts.map +1 -1
- package/dist/hooks/useFormaState.js +42 -14
- package/dist/hooks/useFormaState.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/core/FieldStore.js
CHANGED
|
@@ -267,7 +267,7 @@ class FieldStore {
|
|
|
267
267
|
*/
|
|
268
268
|
removeField(path) {
|
|
269
269
|
const currentValues = this.getValues();
|
|
270
|
-
const pathParts = path.split(
|
|
270
|
+
const pathParts = path.split(".");
|
|
271
271
|
if (pathParts.length === 1) {
|
|
272
272
|
// 루트 레벨 필드 제거 / Remove root level field
|
|
273
273
|
delete currentValues[pathParts[0]];
|
|
@@ -275,10 +275,10 @@ class FieldStore {
|
|
|
275
275
|
}
|
|
276
276
|
else {
|
|
277
277
|
// 중첩된 필드 제거 / Remove nested field
|
|
278
|
-
const parentPath = pathParts.slice(0, -1).join(
|
|
278
|
+
const parentPath = pathParts.slice(0, -1).join(".");
|
|
279
279
|
const fieldName = pathParts[pathParts.length - 1];
|
|
280
280
|
const parent = (0, dotNotation_1.getNestedValue)(currentValues, parentPath);
|
|
281
|
-
if (parent && typeof parent ===
|
|
281
|
+
if (parent && typeof parent === "object") {
|
|
282
282
|
if (Array.isArray(parent)) {
|
|
283
283
|
const index = parseInt(fieldName, 10);
|
|
284
284
|
if (!isNaN(index) && index >= 0 && index < parent.length) {
|
|
@@ -264,7 +264,7 @@ export class FieldStore {
|
|
|
264
264
|
*/
|
|
265
265
|
removeField(path) {
|
|
266
266
|
const currentValues = this.getValues();
|
|
267
|
-
const pathParts = path.split(
|
|
267
|
+
const pathParts = path.split(".");
|
|
268
268
|
if (pathParts.length === 1) {
|
|
269
269
|
// 루트 레벨 필드 제거 / Remove root level field
|
|
270
270
|
delete currentValues[pathParts[0]];
|
|
@@ -272,10 +272,10 @@ export class FieldStore {
|
|
|
272
272
|
}
|
|
273
273
|
else {
|
|
274
274
|
// 중첩된 필드 제거 / Remove nested field
|
|
275
|
-
const parentPath = pathParts.slice(0, -1).join(
|
|
275
|
+
const parentPath = pathParts.slice(0, -1).join(".");
|
|
276
276
|
const fieldName = pathParts[pathParts.length - 1];
|
|
277
277
|
const parent = getNestedValue(currentValues, parentPath);
|
|
278
|
-
if (parent && typeof parent ===
|
|
278
|
+
if (parent && typeof parent === "object") {
|
|
279
279
|
if (Array.isArray(parent)) {
|
|
280
280
|
const index = parseInt(fieldName, 10);
|
|
281
281
|
if (!isNaN(index) && index >= 0 && index < parent.length) {
|
|
@@ -54,6 +54,15 @@ export interface UseFormaStateReturn<T extends Record<string, any>> {
|
|
|
54
54
|
/** Direct access to the internal store for advanced usage | 고급 사용을 위한 내부 스토어 직접 접근 */
|
|
55
55
|
_store: FieldStore<T>;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Hook for subscribing to a specific field in a FieldStore
|
|
59
|
+
* FieldStore의 특정 필드를 구독하기 위한 Hook
|
|
60
|
+
*
|
|
61
|
+
* @param store FieldStore 인스턴스
|
|
62
|
+
* @param path 필드 경로 (dot notation)
|
|
63
|
+
* @returns 필드의 현재 값
|
|
64
|
+
*/
|
|
65
|
+
export declare function useFieldSubscription<T = any>(store: FieldStore<any>, path: string): T;
|
|
57
66
|
/**
|
|
58
67
|
* Advanced state management hook with individual field subscriptions
|
|
59
68
|
* 개별 필드 구독을 통한 고급 상태 관리 훅
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormaState.d.ts","sourceRoot":"","sources":["../../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/D,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAE/B,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mFAAmF;IACnF,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC9D,gFAAgF;IAChF,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;IAE7C,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1D,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnB,6CAA6C;IAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAExC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,4DAA4D;IAC5D,YAAY,EAAE,CACV,KAAK,EAAE,KAAK,CAAC,WAAW,CACpB,gBAAgB,GAAG,mBAAmB,GAAG,iBAAiB,CAC7D,KACA,IAAI,CAAC;IAEV,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAEpC,6CAA6C;IAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,sEAAsE;IACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IAEhC,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAEzD,sFAAsF;IACtF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"useFormaState.d.ts","sourceRoot":"","sources":["../../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/D,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAE/B,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mFAAmF;IACnF,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC9D,gFAAgF;IAChF,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;IAE7C,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1D,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnB,6CAA6C;IAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAExC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,4DAA4D;IAC5D,YAAY,EAAE,CACV,KAAK,EAAE,KAAK,CAAC,WAAW,CACpB,gBAAgB,GAAG,mBAAmB,GAAG,iBAAiB,CAC7D,KACA,IAAI,CAAC;IAEV,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAEpC,6CAA6C;IAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,sEAAsE;IACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IAEhC,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAEzD,sFAAsF;IACtF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACzB;AA0BD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,GAAG,EACxC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EACtB,IAAI,EAAE,MAAM,GACb,CAAC,CAEH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,wBAAgB,aAAa,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrD,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAGhF,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,aAAa,EAAE,CAAC,EAChB,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAClC,mBAAmB,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -11,8 +11,12 @@ import { useRef, useCallback, useState, useEffect } from "react";
|
|
|
11
11
|
import { FieldStore } from "../core/FieldStore";
|
|
12
12
|
import { setNestedValue } from "../utils/dotNotation";
|
|
13
13
|
/**
|
|
14
|
-
* Individual field subscription for useFormaState
|
|
15
|
-
* 개별 필드
|
|
14
|
+
* Individual field subscription hook for useFormaState
|
|
15
|
+
* useFormaState를 위한 개별 필드 구독 훅
|
|
16
|
+
*
|
|
17
|
+
* @param store FieldStore 인스턴스
|
|
18
|
+
* @param fieldName 구독할 필드 이름 (dot notation 지원)
|
|
19
|
+
* @returns 필드의 현재 값
|
|
16
20
|
*/
|
|
17
21
|
function useFieldValue(store, fieldName) {
|
|
18
22
|
const [value, setValue] = useState(() => store.getValue(fieldName));
|
|
@@ -23,9 +27,20 @@ function useFieldValue(store, fieldName) {
|
|
|
23
27
|
setValue(newValue);
|
|
24
28
|
});
|
|
25
29
|
return unsubscribe;
|
|
26
|
-
}, [fieldName]); // store
|
|
30
|
+
}, [fieldName]); // store는 참조가 변경되지 않는다고 가정하고 의존성에서 제거
|
|
27
31
|
return value;
|
|
28
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Hook for subscribing to a specific field in a FieldStore
|
|
35
|
+
* FieldStore의 특정 필드를 구독하기 위한 Hook
|
|
36
|
+
*
|
|
37
|
+
* @param store FieldStore 인스턴스
|
|
38
|
+
* @param path 필드 경로 (dot notation)
|
|
39
|
+
* @returns 필드의 현재 값
|
|
40
|
+
*/
|
|
41
|
+
export function useFieldSubscription(store, path) {
|
|
42
|
+
return useFieldValue(store, path);
|
|
43
|
+
}
|
|
29
44
|
export function useFormaState(initialValues = {}, options = {}) {
|
|
30
45
|
const { onChange, deepEquals = false, _externalStore } = options;
|
|
31
46
|
// Create or use external field store instance (persists across renders)
|
|
@@ -48,41 +63,49 @@ export function useFormaState(initialValues = {}, options = {}) {
|
|
|
48
63
|
// Update initial values when they change (only for non-external stores)
|
|
49
64
|
// 초기값이 변경되면 업데이트 (외부 스토어가 아닌 경우에만)
|
|
50
65
|
const initialValuesRef = useRef(initialValues);
|
|
66
|
+
const initialValuesStringRef = useRef(JSON.stringify(initialValues));
|
|
51
67
|
useEffect(() => {
|
|
52
|
-
|
|
68
|
+
const currentInitialValuesString = JSON.stringify(initialValues);
|
|
69
|
+
if (!_externalStore &&
|
|
70
|
+
store &&
|
|
71
|
+
initialValuesStringRef.current !== currentInitialValuesString) {
|
|
53
72
|
store.setInitialValues(initialValues);
|
|
54
73
|
initialValuesRef.current = initialValues;
|
|
74
|
+
initialValuesStringRef.current = currentInitialValuesString;
|
|
55
75
|
}
|
|
56
|
-
}, [initialValues,
|
|
76
|
+
}, [initialValues, _externalStore]); // store 의존성 제거
|
|
57
77
|
// Subscribe to a specific field value with dot notation
|
|
58
78
|
// dot notation으로 특정 필드 값 구독
|
|
59
79
|
const useValue = useCallback((path) => {
|
|
60
80
|
return useFieldValue(store, path);
|
|
61
|
-
}, [store
|
|
81
|
+
}, [] // store 의존성 제거 - storeRef.current는 안정적인 참조
|
|
82
|
+
);
|
|
62
83
|
// Set a specific field value with dot notation
|
|
63
84
|
// dot notation으로 특정 필드 값 설정
|
|
64
85
|
const setValue = useCallback((path, value) => {
|
|
65
86
|
const currentValues = store.getValues();
|
|
66
87
|
const newValues = setNestedValue(currentValues, path, value);
|
|
67
88
|
store.setValues(newValues);
|
|
68
|
-
}, [store
|
|
89
|
+
}, [] // store 의존성 제거
|
|
90
|
+
);
|
|
69
91
|
// Get all current values (non-reactive)
|
|
70
92
|
// 모든 현재 값 가져오기 (반응형 아님)
|
|
71
93
|
const getValues = useCallback(() => {
|
|
72
94
|
return store.getValues();
|
|
73
|
-
}, [
|
|
95
|
+
}, []); // store 의존성 제거
|
|
74
96
|
// Set all values at once
|
|
75
97
|
// 모든 값을 한 번에 설정
|
|
76
98
|
const setValues = useCallback((values) => {
|
|
77
99
|
const currentValues = store.getValues();
|
|
78
100
|
const newValues = { ...currentValues, ...values };
|
|
79
101
|
store.setValues(newValues);
|
|
80
|
-
}, [store
|
|
102
|
+
}, [] // store 의존성 제거
|
|
103
|
+
);
|
|
81
104
|
// Reset to initial values
|
|
82
105
|
// 초기값으로 재설정
|
|
83
106
|
const reset = useCallback(() => {
|
|
84
107
|
store.setValues(initialValuesRef.current);
|
|
85
|
-
}, [
|
|
108
|
+
}, []); // store 의존성 제거
|
|
86
109
|
// Handle standard input change events
|
|
87
110
|
// 표준 입력 변경 이벤트 처리
|
|
88
111
|
const handleChange = useCallback((event) => {
|
|
@@ -111,16 +134,20 @@ export function useFormaState(initialValues = {}, options = {}) {
|
|
|
111
134
|
handleChange,
|
|
112
135
|
hasField: useCallback((path) => {
|
|
113
136
|
return store.hasField(path);
|
|
114
|
-
}, [store
|
|
137
|
+
}, [] // store 의존성 제거
|
|
138
|
+
),
|
|
115
139
|
removeField: useCallback((path) => {
|
|
116
140
|
store.removeField(path);
|
|
117
|
-
}, [store
|
|
141
|
+
}, [] // store 의존성 제거
|
|
142
|
+
),
|
|
118
143
|
getValue: useCallback((path) => {
|
|
119
144
|
return store.getValue(path);
|
|
120
|
-
}, [store
|
|
145
|
+
}, [] // store 의존성 제거
|
|
146
|
+
),
|
|
121
147
|
subscribe: useCallback((callback) => {
|
|
122
148
|
return store.subscribeToAll(callback);
|
|
123
|
-
}, [store
|
|
149
|
+
}, [] // store 의존성 제거
|
|
150
|
+
),
|
|
124
151
|
_store: store,
|
|
125
152
|
};
|
|
126
153
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormaState.js","sourceRoot":"","sources":["../../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAqEtE
|
|
1
|
+
{"version":3,"file":"useFormaState.js","sourceRoot":"","sources":["../../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAkB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAqEtE;;;;;;;GAOG;AACH,SAAS,aAAa,CAAI,KAAsB,EAAE,SAAiB;IAC/D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpE,SAAS,CAAC,GAAG,EAAE;QACX,6BAA6B;QAC7B,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC3C,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACvB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,qCAAqC;IAEtD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAChC,KAAsB,EACtB,IAAY;IAEZ,OAAO,aAAa,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AA4CD,MAAM,UAAU,aAAa,CACzB,gBAAmB,EAAO,EAC1B,UAAmC,EAAE;IAErC,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IAEjE,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IACpD,IAAI,cAAc,EAAE,CAAC;QACjB,QAAQ,CAAC,OAAO,GAAG,cAAc,CAAC;IACtC,CAAC;SAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC3B,QAAQ,CAAC,OAAO,GAAG,IAAI,UAAU,CAAI,aAAa,CAAC,CAAC;QAEpD,4CAA4C;QAC5C,yBAAyB;QACzB,IAAI,QAAQ,EAAE,CAAC;YACX,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE;gBAClC,QAAQ,CAAC,QAAQ,CAAC,OAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE/B,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAErE,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,0BAA0B,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACjE,IACI,CAAC,cAAc;YACf,KAAK;YACL,sBAAsB,CAAC,OAAO,KAAK,0BAA0B,EAC/D,CAAC;YACC,KAAK,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACtC,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;YACzC,sBAAsB,CAAC,OAAO,GAAG,0BAA0B,CAAC;QAChE,CAAC;IACL,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,eAAe;IAEpD,wDAAwD;IACxD,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,WAAW,CACxB,CAAmB,IAAO,EAAE,EAAE;QAC1B,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,EACD,EAAE,CAAC,2CAA2C;KACjD,CAAC;IAEF,+CAA+C;IAC/C,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,WAAW,CACxB,CAAmB,IAAO,EAAE,KAAU,EAAE,EAAE;QACtC,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7D,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,EACD,EAAE,CAAC,eAAe;KACrB,CAAC;IAEF,wCAAwC;IACxC,wBAAwB;IACxB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;IAEvB,yBAAyB;IACzB,gBAAgB;IAChB,MAAM,SAAS,GAAG,WAAW,CACzB,CAAC,MAAkB,EAAE,EAAE;QACnB,MAAM,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;QAClD,KAAK,CAAC,SAAS,CAAC,SAAc,CAAC,CAAC;IACpC,CAAC,EACD,EAAE,CAAC,eAAe;KACrB,CAAC;IAEF,0BAA0B;IAC1B,YAAY;IACZ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe;IAEvB,sCAAsC;IACtC,kBAAkB;IAClB,MAAM,YAAY,GAAG,WAAW,CAC5B,CACI,KAEC,EACH,EAAE;QACA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CACR,wEAAwE,CAC3E,CAAC;YACF,OAAO;QACX,CAAC;QAED,IAAI,cAAc,GAAQ,KAAK,CAAC;QAEhC,+BAA+B;QAC/B,eAAe;QACf,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,cAAc,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,cAAc,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;QAED,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACnC,CAAC,EACD,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO;QACH,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,SAAS;QACT,KAAK;QACL,YAAY;QACZ,QAAQ,EAAE,WAAW,CACjB,CAAC,IAAY,EAAE,EAAE;YACb,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,EACD,EAAE,CAAC,eAAe;SACrB;QACD,WAAW,EAAE,WAAW,CACpB,CAAC,IAAY,EAAE,EAAE;YACb,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,EACD,EAAE,CAAC,eAAe;SACrB;QACD,QAAQ,EAAE,WAAW,CACjB,CAAC,IAAY,EAAE,EAAE;YACb,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,EACD,EAAE,CAAC,eAAe;SACrB;QACD,SAAS,EAAE,WAAW,CAClB,CAAC,QAA6B,EAAE,EAAE;YAC9B,OAAO,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC,EACD,EAAE,CAAC,eAAe;SACrB;QACD,MAAM,EAAE,KAAK;KAChB,CAAC;AACN,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
export { useForm } from "./hooks/useForm";
|
|
30
30
|
export { useGlobalForm } from "./hooks/useGlobalForm";
|
|
31
31
|
export { useRegisterGlobalForm } from "./hooks/useRegisterGlobalForm";
|
|
32
|
-
export { useFormaState } from "./hooks/useFormaState";
|
|
32
|
+
export { useFormaState, useFieldSubscription } from "./hooks/useFormaState";
|
|
33
33
|
export { GlobalFormContext, GlobalFormProvider, } from "./contexts/GlobalFormContext";
|
|
34
34
|
export { FieldStore } from "./core/FieldStore";
|
|
35
35
|
export { getNestedValue, setNestedValue } from "./utils/dotNotation";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EACH,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrE,YAAY,EACR,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,eAAe,GAClB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACR,oBAAoB,EACpB,mBAAmB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACR,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,GAClC,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;CAejB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
export { useForm } from "./hooks/useForm";
|
|
31
31
|
export { useGlobalForm } from "./hooks/useGlobalForm";
|
|
32
32
|
export { useRegisterGlobalForm } from "./hooks/useRegisterGlobalForm";
|
|
33
|
-
export { useFormaState } from "./hooks/useFormaState";
|
|
33
|
+
export { useFormaState, useFieldSubscription } from "./hooks/useFormaState";
|
|
34
34
|
// ===== Context & Providers =====
|
|
35
35
|
export { GlobalFormContext, GlobalFormProvider, } from "./contexts/GlobalFormContext";
|
|
36
36
|
// ===== Core Classes =====
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,yBAAyB;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,yBAAyB;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE5E,kCAAkC;AAClC,OAAO,EACH,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,2BAA2B;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,gCAAgC;AAChC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAgCrE;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,aAAa;IACtB,WAAW,EAAE,8CAA8C;IAC3D,MAAM,EAAE,+BAA+B;IACvC,KAAK,EAAE,kBAAkB;IACzB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE;QACN,4DAA4D;QAC5D,kDAAkD;QAClD,wCAAwC;QACxC,8BAA8B;QAC9B,6BAA6B;QAC7B,qCAAqC;KACxC;CACK,CAAC"}
|
|
@@ -54,6 +54,15 @@ export interface UseFormaStateReturn<T extends Record<string, any>> {
|
|
|
54
54
|
/** Direct access to the internal store for advanced usage | 고급 사용을 위한 내부 스토어 직접 접근 */
|
|
55
55
|
_store: FieldStore<T>;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Hook for subscribing to a specific field in a FieldStore
|
|
59
|
+
* FieldStore의 특정 필드를 구독하기 위한 Hook
|
|
60
|
+
*
|
|
61
|
+
* @param store FieldStore 인스턴스
|
|
62
|
+
* @param path 필드 경로 (dot notation)
|
|
63
|
+
* @returns 필드의 현재 값
|
|
64
|
+
*/
|
|
65
|
+
export declare function useFieldSubscription<T = any>(store: FieldStore<any>, path: string): T;
|
|
57
66
|
/**
|
|
58
67
|
* Advanced state management hook with individual field subscriptions
|
|
59
68
|
* 개별 필드 구독을 통한 고급 상태 관리 훅
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormaState.d.ts","sourceRoot":"","sources":["../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/D,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAE/B,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mFAAmF;IACnF,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC9D,gFAAgF;IAChF,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;IAE7C,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1D,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnB,6CAA6C;IAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAExC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,4DAA4D;IAC5D,YAAY,EAAE,CACV,KAAK,EAAE,KAAK,CAAC,WAAW,CACpB,gBAAgB,GAAG,mBAAmB,GAAG,iBAAiB,CAC7D,KACA,IAAI,CAAC;IAEV,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAEpC,6CAA6C;IAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,sEAAsE;IACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IAEhC,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAEzD,sFAAsF;IACtF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"useFormaState.d.ts","sourceRoot":"","sources":["../../hooks/useFormaState.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC/D,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAE/B,qFAAqF;IACrF,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,mFAAmF;IACnF,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC9D,gFAAgF;IAChF,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC;IAE7C,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1D,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnB,6CAA6C;IAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAExC,0CAA0C;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,4DAA4D;IAC5D,YAAY,EAAE,CACV,KAAK,EAAE,KAAK,CAAC,WAAW,CACpB,gBAAgB,GAAG,mBAAmB,GAAG,iBAAiB,CAC7D,KACA,IAAI,CAAC;IAEV,4CAA4C;IAC5C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAEpC,6CAA6C;IAC7C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC,sEAAsE;IACtE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IAEhC,oDAAoD;IACpD,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAEzD,sFAAsF;IACtF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACzB;AA0BD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,GAAG,EACxC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,EACtB,IAAI,EAAE,MAAM,GACb,CAAC,CAEH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,wBAAgB,aAAa,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrD,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAGhF,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,aAAa,EAAE,CAAC,EAChB,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAClC,mBAAmB,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -9,13 +9,18 @@
|
|
|
9
9
|
* @license MIT License
|
|
10
10
|
*/
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.useFieldSubscription = useFieldSubscription;
|
|
12
13
|
exports.useFormaState = useFormaState;
|
|
13
14
|
const react_1 = require("react");
|
|
14
15
|
const FieldStore_1 = require("../core/FieldStore");
|
|
15
16
|
const dotNotation_1 = require("../utils/dotNotation");
|
|
16
17
|
/**
|
|
17
|
-
* Individual field subscription for useFormaState
|
|
18
|
-
* 개별 필드
|
|
18
|
+
* Individual field subscription hook for useFormaState
|
|
19
|
+
* useFormaState를 위한 개별 필드 구독 훅
|
|
20
|
+
*
|
|
21
|
+
* @param store FieldStore 인스턴스
|
|
22
|
+
* @param fieldName 구독할 필드 이름 (dot notation 지원)
|
|
23
|
+
* @returns 필드의 현재 값
|
|
19
24
|
*/
|
|
20
25
|
function useFieldValue(store, fieldName) {
|
|
21
26
|
const [value, setValue] = (0, react_1.useState)(() => store.getValue(fieldName));
|
|
@@ -26,9 +31,20 @@ function useFieldValue(store, fieldName) {
|
|
|
26
31
|
setValue(newValue);
|
|
27
32
|
});
|
|
28
33
|
return unsubscribe;
|
|
29
|
-
}, [fieldName]); // store
|
|
34
|
+
}, [fieldName]); // store는 참조가 변경되지 않는다고 가정하고 의존성에서 제거
|
|
30
35
|
return value;
|
|
31
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Hook for subscribing to a specific field in a FieldStore
|
|
39
|
+
* FieldStore의 특정 필드를 구독하기 위한 Hook
|
|
40
|
+
*
|
|
41
|
+
* @param store FieldStore 인스턴스
|
|
42
|
+
* @param path 필드 경로 (dot notation)
|
|
43
|
+
* @returns 필드의 현재 값
|
|
44
|
+
*/
|
|
45
|
+
function useFieldSubscription(store, path) {
|
|
46
|
+
return useFieldValue(store, path);
|
|
47
|
+
}
|
|
32
48
|
function useFormaState(initialValues = {}, options = {}) {
|
|
33
49
|
const { onChange, deepEquals = false, _externalStore } = options;
|
|
34
50
|
// Create or use external field store instance (persists across renders)
|
|
@@ -51,41 +67,49 @@ function useFormaState(initialValues = {}, options = {}) {
|
|
|
51
67
|
// Update initial values when they change (only for non-external stores)
|
|
52
68
|
// 초기값이 변경되면 업데이트 (외부 스토어가 아닌 경우에만)
|
|
53
69
|
const initialValuesRef = (0, react_1.useRef)(initialValues);
|
|
70
|
+
const initialValuesStringRef = (0, react_1.useRef)(JSON.stringify(initialValues));
|
|
54
71
|
(0, react_1.useEffect)(() => {
|
|
55
|
-
|
|
72
|
+
const currentInitialValuesString = JSON.stringify(initialValues);
|
|
73
|
+
if (!_externalStore &&
|
|
74
|
+
store &&
|
|
75
|
+
initialValuesStringRef.current !== currentInitialValuesString) {
|
|
56
76
|
store.setInitialValues(initialValues);
|
|
57
77
|
initialValuesRef.current = initialValues;
|
|
78
|
+
initialValuesStringRef.current = currentInitialValuesString;
|
|
58
79
|
}
|
|
59
|
-
}, [initialValues,
|
|
80
|
+
}, [initialValues, _externalStore]); // store 의존성 제거
|
|
60
81
|
// Subscribe to a specific field value with dot notation
|
|
61
82
|
// dot notation으로 특정 필드 값 구독
|
|
62
83
|
const useValue = (0, react_1.useCallback)((path) => {
|
|
63
84
|
return useFieldValue(store, path);
|
|
64
|
-
}, [store
|
|
85
|
+
}, [] // store 의존성 제거 - storeRef.current는 안정적인 참조
|
|
86
|
+
);
|
|
65
87
|
// Set a specific field value with dot notation
|
|
66
88
|
// dot notation으로 특정 필드 값 설정
|
|
67
89
|
const setValue = (0, react_1.useCallback)((path, value) => {
|
|
68
90
|
const currentValues = store.getValues();
|
|
69
91
|
const newValues = (0, dotNotation_1.setNestedValue)(currentValues, path, value);
|
|
70
92
|
store.setValues(newValues);
|
|
71
|
-
}, [store
|
|
93
|
+
}, [] // store 의존성 제거
|
|
94
|
+
);
|
|
72
95
|
// Get all current values (non-reactive)
|
|
73
96
|
// 모든 현재 값 가져오기 (반응형 아님)
|
|
74
97
|
const getValues = (0, react_1.useCallback)(() => {
|
|
75
98
|
return store.getValues();
|
|
76
|
-
}, [
|
|
99
|
+
}, []); // store 의존성 제거
|
|
77
100
|
// Set all values at once
|
|
78
101
|
// 모든 값을 한 번에 설정
|
|
79
102
|
const setValues = (0, react_1.useCallback)((values) => {
|
|
80
103
|
const currentValues = store.getValues();
|
|
81
104
|
const newValues = { ...currentValues, ...values };
|
|
82
105
|
store.setValues(newValues);
|
|
83
|
-
}, [store
|
|
106
|
+
}, [] // store 의존성 제거
|
|
107
|
+
);
|
|
84
108
|
// Reset to initial values
|
|
85
109
|
// 초기값으로 재설정
|
|
86
110
|
const reset = (0, react_1.useCallback)(() => {
|
|
87
111
|
store.setValues(initialValuesRef.current);
|
|
88
|
-
}, [
|
|
112
|
+
}, []); // store 의존성 제거
|
|
89
113
|
// Handle standard input change events
|
|
90
114
|
// 표준 입력 변경 이벤트 처리
|
|
91
115
|
const handleChange = (0, react_1.useCallback)((event) => {
|
|
@@ -114,16 +138,20 @@ function useFormaState(initialValues = {}, options = {}) {
|
|
|
114
138
|
handleChange,
|
|
115
139
|
hasField: (0, react_1.useCallback)((path) => {
|
|
116
140
|
return store.hasField(path);
|
|
117
|
-
}, [store
|
|
141
|
+
}, [] // store 의존성 제거
|
|
142
|
+
),
|
|
118
143
|
removeField: (0, react_1.useCallback)((path) => {
|
|
119
144
|
store.removeField(path);
|
|
120
|
-
}, [store
|
|
145
|
+
}, [] // store 의존성 제거
|
|
146
|
+
),
|
|
121
147
|
getValue: (0, react_1.useCallback)((path) => {
|
|
122
148
|
return store.getValue(path);
|
|
123
|
-
}, [store
|
|
149
|
+
}, [] // store 의존성 제거
|
|
150
|
+
),
|
|
124
151
|
subscribe: (0, react_1.useCallback)((callback) => {
|
|
125
152
|
return store.subscribeToAll(callback);
|
|
126
|
-
}, [store
|
|
153
|
+
}, [] // store 의존성 제거
|
|
154
|
+
),
|
|
127
155
|
_store: store,
|
|
128
156
|
};
|
|
129
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormaState.js","sourceRoot":"","sources":["../../hooks/useFormaState.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;
|
|
1
|
+
{"version":3,"file":"useFormaState.js","sourceRoot":"","sources":["../../hooks/useFormaState.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
export { useForm } from "./hooks/useForm";
|
|
30
30
|
export { useGlobalForm } from "./hooks/useGlobalForm";
|
|
31
31
|
export { useRegisterGlobalForm } from "./hooks/useRegisterGlobalForm";
|
|
32
|
-
export { useFormaState } from "./hooks/useFormaState";
|
|
32
|
+
export { useFormaState, useFieldSubscription } from "./hooks/useFormaState";
|
|
33
33
|
export { GlobalFormContext, GlobalFormProvider, } from "./contexts/GlobalFormContext";
|
|
34
34
|
export { FieldStore } from "./core/FieldStore";
|
|
35
35
|
export { getNestedValue, setNestedValue } from "./utils/dotNotation";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG5E,OAAO,EACH,iBAAiB,EACjB,kBAAkB,GACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrE,YAAY,EACR,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,eAAe,GAClB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACR,oBAAoB,EACpB,mBAAmB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACR,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,GAClC,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;CAejB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* SOFTWARE.
|
|
29
29
|
*/
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.FORMA_METADATA = exports.FORMA_VERSION = exports.setNestedValue = exports.getNestedValue = exports.FieldStore = exports.GlobalFormProvider = exports.GlobalFormContext = exports.useFormaState = exports.useRegisterGlobalForm = exports.useGlobalForm = exports.useForm = void 0;
|
|
31
|
+
exports.FORMA_METADATA = exports.FORMA_VERSION = exports.setNestedValue = exports.getNestedValue = exports.FieldStore = exports.GlobalFormProvider = exports.GlobalFormContext = exports.useFieldSubscription = exports.useFormaState = exports.useRegisterGlobalForm = exports.useGlobalForm = exports.useForm = void 0;
|
|
32
32
|
// ===== Core Hooks =====
|
|
33
33
|
var useForm_1 = require("./hooks/useForm");
|
|
34
34
|
Object.defineProperty(exports, "useForm", { enumerable: true, get: function () { return useForm_1.useForm; } });
|
|
@@ -38,6 +38,7 @@ var useRegisterGlobalForm_1 = require("./hooks/useRegisterGlobalForm");
|
|
|
38
38
|
Object.defineProperty(exports, "useRegisterGlobalForm", { enumerable: true, get: function () { return useRegisterGlobalForm_1.useRegisterGlobalForm; } });
|
|
39
39
|
var useFormaState_1 = require("./hooks/useFormaState");
|
|
40
40
|
Object.defineProperty(exports, "useFormaState", { enumerable: true, get: function () { return useFormaState_1.useFormaState; } });
|
|
41
|
+
Object.defineProperty(exports, "useFieldSubscription", { enumerable: true, get: function () { return useFormaState_1.useFieldSubscription; } });
|
|
41
42
|
// ===== Context & Providers =====
|
|
42
43
|
var GlobalFormContext_1 = require("./contexts/GlobalFormContext");
|
|
43
44
|
Object.defineProperty(exports, "GlobalFormContext", { enumerable: true, get: function () { return GlobalFormContext_1.GlobalFormContext; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAEH,yBAAyB;AACzB,2CAA0C;AAAjC,kGAAA,OAAO,OAAA;AAChB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,uEAAsE;AAA7D,8HAAA,qBAAqB,OAAA;AAC9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;;;AAEH,yBAAyB;AACzB,2CAA0C;AAAjC,kGAAA,OAAO,OAAA;AAChB,uDAAsD;AAA7C,8GAAA,aAAa,OAAA;AACtB,uEAAsE;AAA7D,8HAAA,qBAAqB,OAAA;AAC9B,uDAA4E;AAAnE,8GAAA,aAAa,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAE5C,kCAAkC;AAClC,kEAGsC;AAFlC,sHAAA,iBAAiB,OAAA;AACjB,uHAAA,kBAAkB,OAAA;AAGtB,2BAA2B;AAC3B,gDAA+C;AAAtC,wGAAA,UAAU,OAAA;AAEnB,gCAAgC;AAChC,mDAAqE;AAA5D,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAgCvC;;GAEG;AACU,QAAA,aAAa,GAAG,OAAO,CAAC;AAErC;;GAEG;AACU,QAAA,cAAc,GAAG;IAC1B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,qBAAa;IACtB,WAAW,EAAE,8CAA8C;IAC3D,MAAM,EAAE,+BAA+B;IACvC,KAAK,EAAE,kBAAkB;IACzB,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE;QACN,4DAA4D;QAC5D,kDAAkD;QAClD,wCAAwC;QACxC,8BAA8B;QAC9B,6BAA6B;QAC7B,qCAAqC;KACxC;CACK,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ehfuse/forma",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"description": "Advanced React state management library with individual field subscriptions - supports both forms and general state management with useFormaState",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|