{"version":3,"sources":["jsdelivr-header.js","/npm/sanity-plugin-google-translate-aadgrant@2.0.1/src/GoogleTranslateInput.tsx"],"names":[],"mappings":"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","file":"/npm/sanity-plugin-google-translate-aadgrant@2.0.1/lib/GoogleTranslateInput.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/sanity-plugin-google-translate-aadgrant@2.0.1/lib/GoogleTranslateInput.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/* eslint-disable react/display-name */\n\n// @ts-ignore\nimport sanityClient from 'part:@sanity/base/client'\n// @ts-ignore\nimport {withDocument} from 'part:@sanity/form-builder'\n\nimport React, {useState, useCallback} from 'react'\nimport {useToast} from '@sanity/ui'\nimport {useUnsetInputComponent, NestedFormBuilder} from '@nrk/sanity-plugin-nrkno-odd-utils'\n\nimport {PatchEvent, set, unset} from '@sanity/form-builder/PatchEvent'\n\nimport Feedback from './Feedback'\nimport FieldInput from './FieldInput'\nimport {htmlDecode} from './helpers/htmlDecode'\nimport {extractLanguageFromCode} from './helpers/extractLanguageFromCode'\n\ntype FieldNameLangPair = {\n  fieldName: string\n  fieldLang: string\n}\n\ntype TranslationConfig = {\n  language: string\n  baseLanguage: string\n  content: string\n}\n\nconst GoogleTranslateInput = React.forwardRef((props, ref) => {\n  const {onChange} = props\n\n  const toast = useToast()\n  const [isTranslating, setIsTranslating] = useState(false)\n\n  // Prevention of infinite loop in <FormBuilderInput />\n  const type = useUnsetInputComponent(props.type)\n\n  const handleTranslation = useCallback(\n    async (config: TranslationConfig) => {\n      // Get all unique language field names and codes\n      // TODO: Remove hidden/filtered-out fields as this currently will write to all fields\n      let allLanguageFields: FieldNameLangPair[] = Array.from(\n        new Set(\n          type.fields\n            .map((field) => ({\n              fieldName: field.name,\n              fieldLang: extractLanguageFromCode(field.name),\n            }))\n            .filter((field) => field.fieldName !== baseLanguage)\n        )\n      )\n\n      // If this isn't a \"translate all\" operation, just target the passed-in language\n      if (config.language !== config.baseLanguage) {\n        allLanguageFields = allLanguageFields.filter((code) => code.fieldName === config.language)\n      }\n\n      if (!config?.content) {\n        return toast.push({\n          title: `No content to translate`,\n          status: `warning`,\n        })\n      }\n\n      setIsTranslating(true)\n\n      const url = new URL(`https://translation.googleapis.com/language/translate/v2`)\n      const {format} = type?.options ?? {}\n      if (format) url.searchParams.set(`format`, format)\n      url.searchParams.set(`key`, apiKey)\n      url.searchParams.set(`q`, config.content)\n\n      // Language code might be a country/language pair like en_US\n      const target = extractLanguageFromCode(config.language)\n      const source = extractLanguageFromCode(config.baseLanguage)\n      url.searchParams.set(`source`, source)\n\n      if (allLanguageFields.length === 1 && target === source) {\n        return toast.push({\n          title: `Bad language pair`,\n          status: `warning`,\n          description: `Cannot translate from \"${source}\" to \"${target}\"`,\n        })\n      }\n\n      const translations = allLanguageFields.map((item) => {\n        url.searchParams.set(`target`, item.fieldLang)\n\n        if (item.fieldLang === source) {\n          return null\n        }\n\n        return fetch(url.toString())\n          .then((res) => res.json())\n          .then((res) => {\n            if (res.error) {\n              toast.push({\n                title: `Error`,\n                status: `error`,\n                description: res.error.message,\n              })\n            } else {\n              toast.push({\n                title: `Translation Complete`,\n                status: `success`,\n                description: `Translated from \"${source}\" to \"${item.fieldLang}\"`,\n              })\n\n              const {data} = res\n\n              if (data?.translations?.length) {\n                data.translations.forEach(({translatedText}) => {\n                  // Convert html entities returned in translation to a string\n                  const decoded = htmlDecode(translatedText)\n\n                  // Write translation into the correct language field\n                  // TODO: Move this into the Promise.all as a batch operation?\n                  onChange(\n                    PatchEvent.from(\n                      translatedText ? set(decoded, [item.fieldName]) : unset([item.fieldName])\n                    )\n                  )\n                })\n              }\n            }\n          })\n          .catch((err) => {\n            console.error(err)\n          })\n      })\n\n      Promise.all(translations).then(() => setIsTranslating(false))\n    },\n    [props.type]\n  )\n\n  if (type.jsonType !== 'object' || type.name === 'object') {\n    return (\n      <Feedback>\n        <code>GoogleTranslateInput</code> can only be used as an Input for{' '}\n        <a\n          href=\"https://www.sanity.io/help/schema-lift-anonymous-object-type\"\n          target=\"_blank\"\n          rel=\"noopener\"\n        >\n          schema registered object fields\n        </a>\n        .\n      </Feedback>\n    )\n  }\n\n  const {apiKey} = type?.options ?? {}\n\n  if (!apiKey) {\n    return (\n      <Feedback>\n        No API Key passed into the input. Set <code>options.apiKey</code> of this field in the\n        schema.\n      </Feedback>\n    )\n  }\n\n  const baseLanguage = type.fieldsets.find((fieldset) => fieldset.single)?.field?.name ?? ``\n\n  const inputProps = {\n    handleTranslation,\n    baseLanguage,\n    isTranslating,\n  }\n\n  // Decorate individual fields with another input component\n  const fieldsetsWithInputs = type.fieldsets.map((fieldset) => {\n    if (fieldset.single) {\n      return {\n        ...fieldset,\n        field: {\n          ...fieldset.field,\n          type: {\n            ...fieldset.field.type,\n            inputComponent: React.forwardRef((props, ref) => (\n              <FieldInput ref={ref} {...props} {...inputProps} language={fieldset.field.name} />\n            )),\n          },\n        },\n      }\n    }\n\n    const fieldsetWithInputs = {\n      ...fieldset,\n      fields: fieldset.fields.map((field) => ({\n        ...field,\n        type: {\n          ...field.type,\n          inputComponent: React.forwardRef((props, ref) => (\n            <FieldInput ref={ref} {...props} {...inputProps} language={field.name} />\n          )),\n        },\n      })),\n    }\n\n    return fieldsetWithInputs\n  })\n\n  const typeCombined = React.useMemo(\n    () => ({...type, fieldsets: fieldsetsWithInputs}),\n    [props.type]\n  )\n\n  return <NestedFormBuilder {...props} type={typeCombined} ref={ref} />\n})\n\nexport default withDocument(GoogleTranslateInput)\n"]}