@parhelia/localization 0.3.12814 → 0.3.12816

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.
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizeItemDialog.d.ts","sourceRoot":"","sources":["../src/LocalizeItemDialog.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,eAAe,CAAC;AAmEvB,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,GAAG,WAAW,CAAC,uBAAuB,CAAC,+BA8gBtE"}
1
+ {"version":3,"file":"LocalizeItemDialog.d.ts","sourceRoot":"","sources":["../src/LocalizeItemDialog.tsx"],"names":[],"mappings":"AA8BA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,eAAe,CAAC;AAmEvB,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,uBAAuB,GAAG,WAAW,CAAC,uBAAuB,CAAC,+BA4hBtE"}
@@ -218,7 +218,14 @@ export function LocalizeItemDialog(props) {
218
218
  }, [executeTranslation]);
219
219
  // Stable setData wrapper to prevent infinite loops
220
220
  // Use refs to access current values without creating dependencies
221
- const setWizardDataStable = useCallback((newData) => {
221
+ const setWizardDataStable = useCallback((update) => {
222
+ // Resolve functional updates against the synchronously maintained ref. Two
223
+ // child effects can publish in the same React batch (for example, an async
224
+ // batch-name suggestion and a prompt-checkbox click); using the last render's
225
+ // object for both would make the later write discard the earlier one.
226
+ const newData = typeof update === "function"
227
+ ? update(latestWizardDataRef.current)
228
+ : update;
222
229
  // Create a stable key from the data to detect actual changes
223
230
  // Only compare the fields that matter for re-renders
224
231
  const serviceCustomDataKey = newData.serviceCustomData
@@ -266,6 +273,7 @@ export function LocalizeItemDialog(props) {
266
273
  return;
267
274
  }
268
275
  lastSetWizardDataRef.current = dataKey;
276
+ latestWizardDataRef.current = newData;
269
277
  setWizardData(newData);
270
278
  }, []); // No dependencies - use refs to access current values
271
279
  // Simplified step completion handler - steps pass their stepIndex via closure
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderStep.d.ts","sourceRoot":"","sources":["../../src/steps/ProviderStep.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAUf,OAAO,EAAE,oBAAoB,EAAyB,MAAM,SAAS,CAAC;AAQtE,wBAAgB,YAAY,CAAC,EAC3B,QAAe,EACf,IAAI,EACJ,OAAO,EACP,eAAe,EACf,WAAW,GACZ,EAAE,oBAAoB,qBAqXtB"}
1
+ {"version":3,"file":"ProviderStep.d.ts","sourceRoot":"","sources":["../../src/steps/ProviderStep.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAUf,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAQ/C,wBAAgB,YAAY,CAAC,EAC3B,QAAe,EACf,IAAI,EACJ,OAAO,EACP,eAAe,EACf,WAAW,GACZ,EAAE,oBAAoB,qBAqYtB"}
@@ -22,7 +22,9 @@ export function ProviderStep({ isActive = true, data, setData, onStepCompleted,
22
22
  useEffect(() => {
23
23
  if ((dataRef.current.batchName ?? "") === batchName)
24
24
  return;
25
- setData({ ...dataRef.current, batchName });
25
+ setData((current) => (current.batchName ?? "") === batchName
26
+ ? current
27
+ : { ...current, batchName });
26
28
  }, [batchName, setData]);
27
29
  // Auto-suggest a name when the step becomes active and the user hasn't
28
30
  // already provided/edited one. Fires once per item+language combination so
@@ -131,71 +133,78 @@ export function ProviderStep({ isActive = true, data, setData, onStepCompleted,
131
133
  }, [data.translationProvider, isActive, onStepCompleted]);
132
134
  const handleProviderChange = (e) => {
133
135
  const newProvider = e.target.value;
134
- const newServiceCustomData = new Map();
135
- data.serviceCustomData?.forEach((value, key) => {
136
- if (key !== "AI" || newProvider === "AI") {
137
- newServiceCustomData.set(key, value);
138
- }
136
+ setData((current) => {
137
+ const newServiceCustomData = new Map();
138
+ current.serviceCustomData?.forEach((value, key) => {
139
+ if (key !== "AI" || newProvider === "AI") {
140
+ newServiceCustomData.set(key, value);
141
+ }
142
+ });
143
+ return {
144
+ ...current,
145
+ translationProvider: newProvider,
146
+ serviceCustomData: newServiceCustomData,
147
+ };
139
148
  });
140
- const newData = {
141
- ...data,
142
- translationProvider: newProvider,
143
- serviceCustomData: newServiceCustomData,
144
- };
145
- setData(newData);
146
149
  };
147
150
  const handleCustomPromptToggle = (enabled) => {
148
- const newServiceCustomData = new Map(data.serviceCustomData || new Map());
151
+ const prompt = defaultPrompt || "";
149
152
  if (enabled) {
150
- const prompt = defaultPrompt || "";
151
153
  setCustomPrompt(prompt);
152
- newServiceCustomData.set(data.translationProvider, {
153
- enableCustomPrompt: true,
154
- customPrompt: prompt.trim(),
155
- promptCustomizationType: PROMPT_CUSTOMIZATION_TYPE,
156
- });
157
- }
158
- else {
159
- newServiceCustomData.delete(data.translationProvider);
160
154
  }
161
- setData({
162
- ...data,
163
- serviceCustomData: newServiceCustomData,
155
+ setData((current) => {
156
+ const newServiceCustomData = new Map(current.serviceCustomData || new Map());
157
+ if (enabled) {
158
+ newServiceCustomData.set(current.translationProvider, {
159
+ enableCustomPrompt: true,
160
+ customPrompt: prompt.trim(),
161
+ promptCustomizationType: PROMPT_CUSTOMIZATION_TYPE,
162
+ });
163
+ }
164
+ else {
165
+ newServiceCustomData.delete(current.translationProvider);
166
+ }
167
+ return {
168
+ ...current,
169
+ serviceCustomData: newServiceCustomData,
170
+ };
164
171
  });
165
172
  };
166
173
  const handleResetPrompt = () => {
167
174
  setCustomPrompt(defaultPrompt || "");
168
175
  };
169
176
  const updateParentData = useCallback(() => {
170
- if (!data.translationProvider)
171
- return;
172
177
  const trimmedCustomPrompt = customPromptRef.current.trim();
173
- const newServiceCustomData = new Map(data.serviceCustomData || new Map());
174
- const currentServiceData = data.serviceCustomData?.get(data.translationProvider);
175
- if (enableCustomPrompt) {
176
- const nextServiceData = {
177
- enableCustomPrompt: true,
178
- customPrompt: trimmedCustomPrompt,
179
- promptCustomizationType: PROMPT_CUSTOMIZATION_TYPE,
178
+ setData((current) => {
179
+ if (!current.translationProvider)
180
+ return current;
181
+ const newServiceCustomData = new Map(current.serviceCustomData || new Map());
182
+ const currentServiceData = current.serviceCustomData?.get(current.translationProvider);
183
+ const isEnabled = currentServiceData?.enableCustomPrompt === true;
184
+ if (isEnabled) {
185
+ const nextServiceData = {
186
+ enableCustomPrompt: true,
187
+ customPrompt: trimmedCustomPrompt,
188
+ promptCustomizationType: PROMPT_CUSTOMIZATION_TYPE,
189
+ };
190
+ const isSame = (currentServiceData.customPrompt || "") === trimmedCustomPrompt &&
191
+ currentServiceData.promptCustomizationType ===
192
+ PROMPT_CUSTOMIZATION_TYPE;
193
+ if (isSame)
194
+ return current;
195
+ newServiceCustomData.set(current.translationProvider, nextServiceData);
196
+ }
197
+ else {
198
+ if (!currentServiceData)
199
+ return current;
200
+ newServiceCustomData.delete(current.translationProvider);
201
+ }
202
+ return {
203
+ ...current,
204
+ serviceCustomData: newServiceCustomData,
180
205
  };
181
- const isSame = currentServiceData?.enableCustomPrompt === true &&
182
- (currentServiceData.customPrompt || "") === trimmedCustomPrompt &&
183
- currentServiceData.promptCustomizationType ===
184
- PROMPT_CUSTOMIZATION_TYPE;
185
- if (isSame)
186
- return;
187
- newServiceCustomData.set(data.translationProvider, nextServiceData);
188
- }
189
- else {
190
- if (!currentServiceData)
191
- return;
192
- newServiceCustomData.delete(data.translationProvider);
193
- }
194
- setData({
195
- ...data,
196
- serviceCustomData: newServiceCustomData,
197
206
  });
198
- }, [data, enableCustomPrompt, setData]);
207
+ }, [setData]);
199
208
  useEffect(() => {
200
209
  if (!isActive || !supportsPromptCustomization)
201
210
  return;
@@ -67,7 +67,7 @@ export type TranslationStepProps = {
67
67
  stepIndex: number;
68
68
  isActive?: boolean;
69
69
  data: TranslationWizardData;
70
- setData: (data: TranslationWizardData) => void;
70
+ setData: (update: TranslationWizardData | ((current: TranslationWizardData) => TranslationWizardData)) => void;
71
71
  editContext: EditContextType;
72
72
  onStepCompleted: (completed: boolean) => void;
73
73
  setBeforeNextCallback?: (callback: (() => Promise<boolean>) | null) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/steps/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/steps/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parhelia/localization",
3
- "version": "0.3.12814",
3
+ "version": "0.3.12816",
4
4
  "type": "module",
5
5
  "publishConfig": {
6
6
  "access": "public"