Skip to content

Commit 8d14d6d

Browse files
committed
do translation outside Components as that is needed by all components. Allows the code to stay DRY
1 parent ec61647 commit 8d14d6d

File tree

6 files changed

+75
-36
lines changed

6 files changed

+75
-36
lines changed

packages/features/form-builder/Components.tsx

+3-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
} from "@calcom/ui";
2424

2525
import { ComponentForField } from "./FormBuilderField";
26-
import { getAndUpdateNormalizedValues } from "./FormBuilderField";
2726
import { propsTypes } from "./propsTypes";
2827
import type { fieldSchema, FieldType, variantsConfigSchema } from "./schema";
2928
import { preprocessNameFieldDataWithVariant } from "./utils";
@@ -111,9 +110,8 @@ export const Components: Record<FieldType, Component> = {
111110
name: {
112111
propsType: propsTypes.name,
113112
// Keep special "name" type field and later build split(FirstName and LastName) variant of it.
114-
factory: function NameInput(props) {
113+
factory: (props) => {
115114
const { variant: variantName = "fullName" } = props;
116-
const { t } = useLocale();
117115
const onChange = (name: string, value: string) => {
118116
let currentValue = props.value;
119117
if (typeof currentValue !== "object") {
@@ -141,13 +139,12 @@ export const Components: Record<FieldType, Component> = {
141139
}
142140
const variant = props.variants[variantName];
143141
const variantField = variant.fields[0];
144-
const { placeholder, label } = getAndUpdateNormalizedValues(variantField, t);
145142
return (
146143
<InputField
147144
name="name"
148145
showAsteriskIndicator={true}
149-
placeholder={placeholder}
150-
label={label}
146+
placeholder={variantField.placeholder}
147+
label={variantField.label}
151148
containerClassName="w-full"
152149
readOnly={props.readOnly}
153150
value={value}

packages/features/form-builder/FormBuilder.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import {
3030
import { fieldTypesConfigMap } from "./fieldTypes";
3131
import { fieldsThatSupportLabelAsSafeHtml } from "./fieldsThatSupportLabelAsSafeHtml";
3232
import type { fieldsSchema } from "./schema";
33-
import { getVariantsConfig } from "./utils";
3433
import { getFieldIdentifier } from "./utils/getFieldIdentifier";
34+
import { getConfig as getVariantsConfig } from "./utils/variantsConfig";
3535

3636
type RhfForm = {
3737
fields: z.infer<typeof fieldsSchema>;

packages/features/form-builder/FormBuilderField.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Components, isValidValueProp } from "./Components";
1111
import { fieldTypesConfigMap } from "./fieldTypes";
1212
import { fieldsThatSupportLabelAsSafeHtml } from "./fieldsThatSupportLabelAsSafeHtml";
1313
import type { fieldsSchema } from "./schema";
14-
import { getVariantsConfig } from "./utils";
14+
import { getTranslatedConfig as getTranslatedVariantsConfig } from "./utils/variantsConfig";
1515

1616
type RhfForm = {
1717
fields: z.infer<typeof fieldsSchema>;
@@ -179,7 +179,7 @@ export function getAndUpdateNormalizedValues(field: RhfFormFields[number], t: TF
179179
throw new Error(`${field.name}:${field.type} type must have labelAsSafeHtml set`);
180180
}
181181

182-
const label = noLabel ? "" : field.labelAsSafeHtml || t(field.label || "") || t(field.defaultLabel || "");
182+
const label = noLabel ? "" : field.labelAsSafeHtml || field.label || t(field.defaultLabel || "");
183183
const placeholder = field.placeholder || t(field.defaultPlaceholder || "");
184184

185185
if (field.variantsConfig?.variants) {
@@ -211,6 +211,7 @@ export const ComponentForField = ({
211211
} & ValueProps) => {
212212
const fieldType = field.type || "text";
213213
const componentConfig = Components[fieldType];
214+
const { t } = useLocale();
214215

215216
const isValueOfPropsType = (val: unknown, propsType: typeof componentConfig.propsType) => {
216217
const isValid = isValidValueProp[propsType](val);
@@ -333,8 +334,8 @@ export const ComponentForField = ({
333334
}
334335

335336
if (componentConfig.propsType === "variants") {
336-
const variantsConfig = getVariantsConfig(field);
337-
if (!variantsConfig) {
337+
const translatedVariantsConfig = getTranslatedVariantsConfig(field, t);
338+
if (!translatedVariantsConfig) {
338339
return null;
339340
}
340341

@@ -346,7 +347,7 @@ export const ComponentForField = ({
346347
variant={field.variant}
347348
value={value as { value: string; optionValue: string }}
348349
setValue={setValue as (arg: Record<string, string> | string) => void}
349-
variants={variantsConfig.variants}
350+
variants={translatedVariantsConfig.variants}
350351
/>
351352
);
352353
}

packages/features/form-builder/schema.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { z } from "zod";
33
import { getValidRhfFieldName } from "@calcom/lib/getValidRhfFieldName";
44

55
import { fieldTypesConfigMap } from "./fieldTypes";
6-
import { getVariantsConfig, preprocessNameFieldDataWithVariant } from "./utils";
6+
import { preprocessNameFieldDataWithVariant } from "./utils";
7+
import { getConfig as getVariantsConfig } from "./utils/variantsConfig";
78

89
const nonEmptyString = () => z.string().refine((value: string) => value.trim().length > 0);
910

packages/features/form-builder/utils.ts

-23
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
import type z from "zod";
2-
3-
import { fieldTypesConfigMap } from "./fieldTypes";
4-
import type { fieldSchema } from "./schema";
5-
61
export const preprocessNameFieldDataWithVariant = (
72
variantName: "fullName" | "firstAndLastName",
83
value: string | Record<"firstName" | "lastName", string> | undefined
@@ -53,21 +48,3 @@ function getFirstAndLastName(value: string | Record<"firstName" | "lastName", st
5348
}
5449
return newValue;
5550
}
56-
57-
/**
58-
* Get's the field's variantsConfig and if not available, then it will get the default variantsConfig from the fieldTypesConfigMap
59-
*/
60-
export const getVariantsConfig = (field: Pick<z.infer<typeof fieldSchema>, "variantsConfig" | "type">) => {
61-
const fieldVariantsConfig = field.variantsConfig;
62-
const fieldTypeConfig = fieldTypesConfigMap[field.type as keyof typeof fieldTypesConfigMap];
63-
64-
if (!fieldTypeConfig) throw new Error(`Invalid field.type ${field.type}}`);
65-
66-
const defaultVariantsConfig = fieldTypeConfig?.variantsConfig?.defaultValue;
67-
const variantsConfig = fieldVariantsConfig || defaultVariantsConfig;
68-
69-
if (fieldTypeConfig.propsType === "variants" && !variantsConfig) {
70-
throw new Error(`propsType variants must have variantsConfig`);
71-
}
72-
return variantsConfig;
73-
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import type z from "zod";
2+
3+
import type { useLocale } from "@calcom/lib/hooks/useLocale";
4+
5+
import { fieldTypesConfigMap } from "../fieldTypes";
6+
import type { fieldSchema } from "../schema";
7+
8+
type ConfigVariants = NonNullable<ReturnType<typeof getConfig>>["variants"];
9+
10+
function getTranslatedConfigVariants(
11+
configVariants: ConfigVariants,
12+
translate: ReturnType<typeof useLocale>["t"]
13+
) {
14+
return Object.entries(configVariants).reduce((variantsConfigVariants, [variantName, variant]) => {
15+
const translatedFields = variant.fields.map((field) => {
16+
const label = field.label ?? "";
17+
const placeholder = field.placeholder ?? "";
18+
return {
19+
...field,
20+
label: translate(label),
21+
placeholder: translate(placeholder),
22+
};
23+
});
24+
variantsConfigVariants[variantName] = {
25+
...variant,
26+
fields: translatedFields,
27+
};
28+
29+
return variantsConfigVariants;
30+
}, {} as typeof configVariants);
31+
}
32+
33+
/**
34+
* Get's the field's variantsConfig and if not available, then it will get the default variantsConfig from the fieldTypesConfigMap
35+
*/
36+
export const getConfig = (field: Pick<z.infer<typeof fieldSchema>, "variantsConfig" | "type">) => {
37+
const fieldVariantsConfig = field.variantsConfig;
38+
const fieldTypeConfig = fieldTypesConfigMap[field.type as keyof typeof fieldTypesConfigMap];
39+
40+
if (!fieldTypeConfig) throw new Error(`Invalid field.type ${field.type}}`);
41+
42+
const defaultVariantsConfig = fieldTypeConfig?.variantsConfig?.defaultValue;
43+
const variantsConfig = fieldVariantsConfig || defaultVariantsConfig;
44+
45+
if (fieldTypeConfig.propsType === "variants" && !variantsConfig) {
46+
throw new Error(`propsType variants must have variantsConfig`);
47+
}
48+
return variantsConfig;
49+
};
50+
51+
export const getTranslatedConfig = (
52+
field: Parameters<typeof getConfig>[0],
53+
translate: ReturnType<typeof useLocale>["t"]
54+
) => {
55+
const variantsConfig = getConfig(field);
56+
if (!variantsConfig) return variantsConfig;
57+
const newVariantsConfigVariants = getTranslatedConfigVariants(variantsConfig.variants, translate);
58+
59+
return {
60+
...variantsConfig,
61+
variants: newVariantsConfigVariants,
62+
};
63+
};

0 commit comments

Comments
 (0)