@azure/communication-react 1.27.0-alpha-202504170018 → 1.27.0-alpha-202504180018

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.
Files changed (38) hide show
  1. package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-CWVvEmtx.js → ChatMessageComponentAsRichTextEditBox-DR7XjnJF.js} +2 -2
  2. package/dist/dist-cjs/communication-react/{ChatMessageComponentAsRichTextEditBox-CWVvEmtx.js.map → ChatMessageComponentAsRichTextEditBox-DR7XjnJF.js.map} +1 -1
  3. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-CnQSHZxD.js → RichTextSendBoxWrapper-Bd2aXECs.js} +2 -2
  4. package/dist/dist-cjs/communication-react/{RichTextSendBoxWrapper-CnQSHZxD.js.map → RichTextSendBoxWrapper-Bd2aXECs.js.map} +1 -1
  5. package/dist/dist-cjs/communication-react/{index-OR3tZ44p.js → index-DotDEcZQ.js} +43 -31
  6. package/dist/dist-cjs/communication-react/index-DotDEcZQ.js.map +1 -0
  7. package/dist/dist-cjs/communication-react/index.js +1 -1
  8. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js +1 -1
  9. package/dist/dist-esm/acs-ui-common/src/telemetryVersion.js.map +1 -1
  10. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js +1 -0
  11. package/dist/dist-esm/react-components/src/components/RichTextEditor/RichTextEditor.js.map +1 -1
  12. package/dist/dist-esm/react-components/src/localization/locales/ar-SA/strings.json +10 -0
  13. package/dist/dist-esm/react-components/src/localization/locales/cs-CZ/strings.json +10 -0
  14. package/dist/dist-esm/react-components/src/localization/locales/cy-GB/strings.json +10 -0
  15. package/dist/dist-esm/react-components/src/localization/locales/de-DE/strings.json +10 -0
  16. package/dist/dist-esm/react-components/src/localization/locales/en-GB/strings.json +10 -0
  17. package/dist/dist-esm/react-components/src/localization/locales/es-ES/strings.json +10 -0
  18. package/dist/dist-esm/react-components/src/localization/locales/es-MX/strings.json +10 -0
  19. package/dist/dist-esm/react-components/src/localization/locales/fi-FI/strings.json +10 -0
  20. package/dist/dist-esm/react-components/src/localization/locales/fr-CA/strings.json +10 -0
  21. package/dist/dist-esm/react-components/src/localization/locales/fr-FR/strings.json +10 -0
  22. package/dist/dist-esm/react-components/src/localization/locales/he-IL/strings.json +10 -0
  23. package/dist/dist-esm/react-components/src/localization/locales/it-IT/strings.json +10 -0
  24. package/dist/dist-esm/react-components/src/localization/locales/ja-JP/strings.json +10 -0
  25. package/dist/dist-esm/react-components/src/localization/locales/ko-KR/strings.json +10 -0
  26. package/dist/dist-esm/react-components/src/localization/locales/nb-NO/strings.json +10 -0
  27. package/dist/dist-esm/react-components/src/localization/locales/nl-NL/strings.json +10 -0
  28. package/dist/dist-esm/react-components/src/localization/locales/pl-PL/strings.json +10 -0
  29. package/dist/dist-esm/react-components/src/localization/locales/pt-BR/strings.json +10 -0
  30. package/dist/dist-esm/react-components/src/localization/locales/ru-RU/strings.json +10 -0
  31. package/dist/dist-esm/react-components/src/localization/locales/sv-SE/strings.json +10 -0
  32. package/dist/dist-esm/react-components/src/localization/locales/tr-TR/strings.json +10 -0
  33. package/dist/dist-esm/react-components/src/localization/locales/zh-CN/strings.json +10 -0
  34. package/dist/dist-esm/react-components/src/localization/locales/zh-TW/strings.json +10 -0
  35. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js +15 -2
  36. package/dist/dist-esm/react-composites/src/composites/common/Drawer/MoreDrawer.js.map +1 -1
  37. package/package.json +6 -6
  38. package/dist/dist-cjs/communication-react/index-OR3tZ44p.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-OR3tZ44p.js');
3
+ var index = require('./index-DotDEcZQ.js');
4
4
  require('react');
5
5
  require('@fluentui/react');
6
6
  require('@fluentui/react-components');
@@ -2,5 +2,5 @@
2
2
  // Copyright (c) Microsoft Corporation.
3
3
  // Licensed under the MIT License.
4
4
  // GENERATED FILE. DO NOT EDIT MANUALLY.
5
- module.exports = '1.27.0-alpha-202504170018';
5
+ module.exports = '1.27.0-alpha-202504180018';
6
6
  //# sourceMappingURL=telemetryVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.27.0-alpha-202504170018';\n"]}
1
+ {"version":3,"file":"telemetryVersion.js","sourceRoot":"","sources":["../../../../../acs-ui-common/src/telemetryVersion.js"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;AAElC,wCAAwC;AAExC,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n// GENERATED FILE. DO NOT EDIT MANUALLY.\n\nmodule.exports = '1.27.0-alpha-202504180018';\n"]}
@@ -288,6 +288,7 @@ export const RichTextEditor = React.forwardRef((props, ref) => {
288
288
  const initialModel = createEditorInitialModel(initialContent, contentModel);
289
289
  if (editorDiv.current) {
290
290
  editor.current = new Editor(editorDiv.current, {
291
+ generateColorKey: (color) => color, // Needed to ensure override of text color in dark mode.
291
292
  inDarkMode: isDarkThemed(theme),
292
293
  // doNotAdjustEditorColor is used to disable default color and background color for Rooster component
293
294
  doNotAdjustEditorColor: true,
@@ -1 +1 @@
1
- {"version":3,"file":"RichTextEditor.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/RichTextEditor/RichTextEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { richTextEditorWrapperStyle, richTextEditorStyle } from '../styles/RichTextEditor.styles';\nimport { useTheme } from '../../theming';\nimport { RichTextStrings } from './RichTextSendBox';\nimport { isDarkThemed } from '../../theming/themeUtils';\nimport CopyPastePlugin from './Plugins/CopyPastePlugin';\nimport type {\n ContentModelDocument,\n ContentModelParagraph,\n EditorPlugin,\n IEditor,\n ReadonlyContentModelBlockGroup,\n ShallowMutableContentModelDocument,\n KnownAnnounceStrings\n} from 'roosterjs-content-model-types';\nimport { createModelFromHtml, Editor, exportContent } from 'roosterjs-content-model-core';\nimport {\n createBr,\n createEmptyModel,\n createParagraph,\n createSelectionMarker,\n setSelection\n} from 'roosterjs-content-model-dom';\nimport { KeyboardInputPlugin } from './Plugins/KeyboardInputPlugin';\nimport {\n AutoFormatPlugin,\n EditPlugin,\n PastePlugin,\n ShortcutPlugin,\n DefaultSanitizers\n} from 'roosterjs-content-model-plugins';\nimport { UpdateContentPlugin, UpdateEvent } from './Plugins/UpdateContentPlugin';\nimport { RichTextToolbar } from './Toolbar/RichTextToolbar';\nimport { RichTextToolbarPlugin } from './Plugins/RichTextToolbarPlugin';\nimport { ContextMenuPlugin } from './Plugins/ContextMenuPlugin';\nimport { TableEditContextMenuProvider } from './Plugins/TableEditContextMenuProvider';\nimport { borderApplier, dataSetApplier } from '../utils/RichTextEditorUtils';\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\nimport {\n getPreviousInlineImages,\n getRemovedInlineImages,\n removeLocalBlobs,\n cleanAllLocalBlobs\n} from '../utils/RichTextEditorUtils';\nimport { ContextualMenu, IContextualMenuItem, IContextualMenuProps, Theme } from '@fluentui/react';\nimport { PlaceholderPlugin } from './Plugins/PlaceholderPlugin';\nimport { getFormatState, setDirection } from 'roosterjs-content-model-api';\nimport UndoRedoPlugin from './Plugins/UndoRedoPlugin';\n\n/**\n * Style props for {@link RichTextEditor}.\n *\n * @private\n */\nexport interface RichTextEditorStyleProps {\n minHeight: string;\n maxHeight: string;\n}\n\n/**\n * Props for {@link RichTextEditor}.\n *\n * @private\n */\nexport interface RichTextEditorProps {\n // the initial content of editor that is set when editor is created (e.g. when editing a message)\n initialContent?: string;\n onChange: (\n newValue?: string,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages?: Record<string, string>[]\n ) => void;\n onKeyDown?: (ev: KeyboardEvent) => void;\n // OnKeyDown aren't called for composition events, so we need to handle them separately\n onCompositionUpdate?: () => void;\n // update the current content of the rich text editor\n onContentModelUpdate?: (contentModel: ContentModelDocument | undefined) => void;\n contentModel?: ContentModelDocument | undefined;\n placeholderText?: string;\n strings: Partial<RichTextStrings>;\n showRichTextEditorFormatting: boolean;\n styles: RichTextEditorStyleProps;\n autoFocus?: 'sendBoxTextField';\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onPaste?: (event: { content: DocumentFragment }) => void;\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onInsertInlineImage?: (imageAttributes: Record<string, string>) => void;\n}\n\n/**\n * Represents a reference to the RichTextEditor component.\n */\nexport interface RichTextEditorComponentRef {\n /**\n * Sets focus on the RichTextEditor component.\n */\n focus: () => void;\n\n /**\n * Sets the content of the RichTextEditor component to an empty string.\n */\n setEmptyContent: () => void;\n\n /**\n * Retrieves the plain text content of the RichTextEditor component.\n * @returns The plain text content of the RichTextEditor component, or undefined if the editor isn't available.\n */\n getPlainContent: () => string | undefined;\n}\n\n/**\n * A component to wrap RoosterJS Rich Text Editor.\n *\n * @beta\n */\nexport const RichTextEditor = React.forwardRef<RichTextEditorComponentRef, RichTextEditorProps>((props, ref) => {\n const {\n initialContent,\n onChange,\n placeholderText,\n strings,\n showRichTextEditorFormatting,\n autoFocus,\n onKeyDown,\n onCompositionUpdate,\n onContentModelUpdate,\n contentModel,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onPaste,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onInsertInlineImage\n } = props;\n const editor = useRef<IEditor | null>(null);\n const editorDiv = useRef<HTMLDivElement>(null);\n const theme = useTheme();\n const [contextMenuProps, setContextMenuProps] = useState<IContextualMenuProps | null>(null);\n const previousThemeDirection = useRef(themeDirection(theme));\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n // This will be set when the editor is initialized and when the content is updated.\n const [previousInlineImages, setPreviousInlineImages] = useState<Record<string, string>[]>([]);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n const [inlineImageLocalBlobs, setInlineImageLocalBlobs] = useState<Record<string, string>>({});\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n return () => {\n // Cleanup Local Blob URLs when the component is unmounted\n cleanAllLocalBlobs(inlineImageLocalBlobs);\n };\n // This effect should only run once when the component is unmounted, so we don't need to add any dependencies\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (editor.current) {\n if (!showRichTextEditorFormatting) {\n editor.current?.focus();\n }\n }\n }, [showRichTextEditorFormatting]);\n\n useImperativeHandle(ref, () => {\n return {\n focus() {\n if (editor.current) {\n editor.current.focus();\n }\n },\n setEmptyContent() {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages([]);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n cleanAllLocalBlobs(inlineImageLocalBlobs);\n\n if (editor.current) {\n // remove all content from the editor and update the model\n // ContentChanged event will be sent by RoosterJS automatically\n editor.current.formatContentModel((model: ShallowMutableContentModelDocument): boolean => {\n // Create a new empty paragraph with selection marker\n // this is needed for correct processing of images after the content is deleted\n const newModel = createEmptyModel();\n model.blocks = newModel.blocks;\n return true;\n });\n //reset content model\n onContentModelUpdate && onContentModelUpdate(editor.current.getContentModelCopy('disconnected'));\n }\n },\n getPlainContent() {\n if (editor.current) {\n return exportContent(editor.current, 'PlainTextFast');\n } else {\n return undefined;\n }\n }\n };\n }, [/* @conditional-compile-remove(rich-text-editor-image-upload) */ inlineImageLocalBlobs, onContentModelUpdate]);\n\n const toolbarPlugin = React.useMemo(() => {\n return new RichTextToolbarPlugin();\n }, []);\n\n const placeholderPlugin = useMemo(() => {\n const textColor = theme.palette?.neutralSecondary;\n return new PlaceholderPlugin(\n '',\n textColor\n ? {\n textColor: textColor\n }\n : undefined\n );\n }, [theme]);\n\n useEffect(() => {\n if (placeholderText !== undefined) {\n placeholderPlugin.updatePlaceholder(placeholderText);\n }\n }, [placeholderPlugin, placeholderText]);\n\n const toolbar = useMemo(() => {\n return <RichTextToolbar plugin={toolbarPlugin} strings={strings} />;\n }, [strings, toolbarPlugin]);\n\n const updatePlugin = useMemo(() => {\n return new UpdateContentPlugin();\n }, []);\n\n const copyPastePlugin = useMemo(() => {\n return new CopyPastePlugin();\n }, []);\n\n const onChangeContent = useCallback(\n (/* @conditional-compile-remove(rich-text-editor-image-upload) */ shouldUpdateInlineImages?: boolean) => {\n if (editor.current === null) {\n return;\n }\n const content = exportContent(editor.current);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n let removedInlineImages: Record<string, string>[] = [];\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n if (shouldUpdateInlineImages) {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n removedInlineImages = getRemovedInlineImages(content, previousInlineImages);\n }\n\n onChange &&\n onChange(content, /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(getPreviousInlineImages(content));\n },\n [onChange, /* @conditional-compile-remove(rich-text-editor-image-upload) */ previousInlineImages]\n );\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n updatePlugin.onUpdate = (\n event: string,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ shouldRemoveInlineImages?: boolean\n ) => {\n if (editor.current === null) {\n return;\n }\n if (event === UpdateEvent.Blur || event === UpdateEvent.Dispose) {\n onContentModelUpdate && onContentModelUpdate(editor.current.getContentModelCopy('disconnected'));\n } else {\n const content = exportContent(editor.current);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n let removedInlineImages: Record<string, string>[] = [];\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n if (shouldRemoveInlineImages) {\n removedInlineImages = getRemovedInlineImages(content, previousInlineImages);\n if (removedInlineImages.length > 0) {\n removeLocalBlobs(inlineImageLocalBlobs, removedInlineImages);\n }\n }\n\n onChange &&\n onChange(content, /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(getPreviousInlineImages(content));\n }\n };\n }, [\n onChange,\n onContentModelUpdate,\n updatePlugin,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ previousInlineImages,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ inlineImageLocalBlobs\n ]);\n\n const undoRedoPlugin = useMemo(() => {\n return new UndoRedoPlugin();\n }, []);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n if (onInsertInlineImage) {\n copyPastePlugin.onInsertInlineImage = (imageAttributes: Record<string, string>) => {\n const { id, src } = imageAttributes;\n setInlineImageLocalBlobs((prev) => {\n if (!id || !src) {\n return prev;\n }\n return { ...prev, [id]: src };\n });\n onInsertInlineImage(imageAttributes);\n };\n } else {\n copyPastePlugin.onInsertInlineImage = undefined;\n }\n undoRedoPlugin.onInsertInlineImage = onInsertInlineImage;\n }, [copyPastePlugin, onInsertInlineImage, undoRedoPlugin]);\n\n useEffect(() => {\n undoRedoPlugin.onUpdateContent = () => {\n onChangeContent(/* @conditional-compile-remove(rich-text-editor-image-upload) */ true);\n };\n }, [onChangeContent, undoRedoPlugin]);\n\n const keyboardInputPlugin = useMemo(() => {\n return new KeyboardInputPlugin();\n }, []);\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n keyboardInputPlugin.onKeyDown = onKeyDown;\n }, [keyboardInputPlugin, onKeyDown]);\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n keyboardInputPlugin.onCompositionUpdate = onCompositionUpdate;\n }, [keyboardInputPlugin, onCompositionUpdate]);\n\n const tableContextMenuPlugin = useMemo(() => {\n return new TableEditContextMenuProvider();\n }, []);\n\n useEffect(() => {\n tableContextMenuPlugin.updateStrings(strings);\n }, [tableContextMenuPlugin, strings]);\n\n const onContextMenuRender = useCallback(\n (container: HTMLElement, items: IContextualMenuItem[], onDismiss: () => void): void => {\n setContextMenuProps({\n items: items,\n target: container,\n onDismiss: onDismiss\n });\n },\n []\n );\n\n const onContextMenuDismiss = useCallback((): void => {\n setContextMenuProps(null);\n }, []);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n copyPastePlugin.onPaste = onPaste;\n }, [copyPastePlugin, onPaste]);\n\n const plugins: EditorPlugin[] = useMemo(() => {\n const contentEdit = new EditPlugin({ handleTabKey: false });\n // AutoFormatPlugin previously was a part of the edit plugin\n const autoFormatPlugin = new AutoFormatPlugin({ autoBullet: true, autoNumbering: true, autoLink: true });\n const roosterPastePlugin = new PastePlugin(false, {\n additionalDisallowedTags: ['head', '!doctype', '!cdata', '#comment'],\n additionalAllowedTags: [],\n styleSanitizers: DefaultSanitizers,\n attributeSanitizers: {}\n });\n\n const shortcutPlugin = new ShortcutPlugin();\n const contextMenuPlugin = new ContextMenuPlugin(onContextMenuRender, onContextMenuDismiss);\n return [\n placeholderPlugin,\n keyboardInputPlugin,\n contentEdit,\n autoFormatPlugin,\n updatePlugin,\n copyPastePlugin,\n roosterPastePlugin,\n toolbarPlugin,\n shortcutPlugin,\n // contextPlugin and tableEditMenuProvider allow to show insert/delete menu for the table\n contextMenuPlugin,\n tableContextMenuPlugin,\n undoRedoPlugin\n ];\n }, [\n onContextMenuRender,\n onContextMenuDismiss,\n placeholderPlugin,\n keyboardInputPlugin,\n updatePlugin,\n copyPastePlugin,\n toolbarPlugin,\n tableContextMenuPlugin,\n undoRedoPlugin\n ]);\n\n const announcerStringGetter = useCallback(\n (key: KnownAnnounceStrings): string => {\n switch (key) {\n case 'announceListItemBullet':\n return strings.richTextNewBulletedListItemAnnouncement ?? '';\n case 'announceListItemNumbering':\n return strings.richTextNewNumberedListItemAnnouncement ?? '';\n case 'announceOnFocusLastCell':\n return '';\n }\n },\n [strings.richTextNewBulletedListItemAnnouncement, strings.richTextNewNumberedListItemAnnouncement]\n );\n\n useEffect(() => {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n const prevInlineImage = getPreviousInlineImages(initialContent);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(prevInlineImage);\n\n const initialModel = createEditorInitialModel(initialContent, contentModel);\n if (editorDiv.current) {\n editor.current = new Editor(editorDiv.current, {\n inDarkMode: isDarkThemed(theme),\n // doNotAdjustEditorColor is used to disable default color and background color for Rooster component\n doNotAdjustEditorColor: true,\n imageSelectionBorderColor: theme.palette.themePrimary,\n tableCellSelectionBackgroundColor: theme.palette.neutralLight,\n plugins: plugins,\n initialModel: initialModel,\n defaultModelToDomOptions: {\n formatApplierOverride: {\n // apply border and dataset formats for table\n border: borderApplier,\n dataset: dataSetApplier\n }\n },\n announcerStringGetter: announcerStringGetter\n });\n }\n\n if (autoFocus === 'sendBoxTextField') {\n editor.current?.focus();\n }\n\n return () => {\n if (editor.current) {\n editor.current.dispose();\n editor.current = null;\n }\n };\n // don't update the editor on deps update as everything is handled in separate hooks or plugins\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, plugins, announcerStringGetter]);\n\n useEffect(() => {\n const themeDirectionValue = themeDirection(theme);\n // check that editor exists and theme was actually changed\n // as format.direction will be undefined if setDirection is not called\n if (editor.current && previousThemeDirection.current !== themeDirectionValue) {\n const format = getFormatState(editor.current);\n if (format.direction !== themeDirectionValue) {\n // should be set after the hook where editor is created as the editor might be null\n // setDirection will cause the focus change back to the editor and this might not be what we want to do (autoFocus prop)\n // that's why it's not part of the create editor hook\n setDirection(editor.current, theme.rtl ? 'rtl' : 'ltr');\n }\n previousThemeDirection.current = themeDirectionValue;\n }\n }, [theme]);\n\n return (\n <div data-testid={'rich-text-editor-wrapper'}>\n {showRichTextEditorFormatting && toolbar}\n <div className={richTextEditorWrapperStyle(theme)}>\n {/* div that is used by Rooster JS as a parent of the editor */}\n <div\n id=\"richTextSendBox\"\n ref={editorDiv}\n tabIndex={0}\n role=\"textbox\"\n aria-multiline=\"true\"\n data-testid={'rooster-rich-text-editor'}\n className={richTextEditorStyle(props.styles)}\n aria-label={placeholderText}\n />\n </div>\n {contextMenuProps && <ContextualMenu {...contextMenuProps} calloutProps={{ isBeakVisible: false }} />}\n </div>\n );\n});\n\nconst createEditorInitialModel = (\n initialContent?: string,\n contentModel?: ContentModelDocument\n): ContentModelDocument | undefined => {\n if (contentModel) {\n // contentModel is the current content of the editor\n return contentModel;\n } else {\n const initialContentValue = initialContent;\n const initialModel =\n initialContentValue && initialContentValue.length > 0 ? createModelFromHtml(initialContentValue) : undefined;\n if (initialModel && initialModel.blocks.length > 0) {\n // lastBlock should have blockType = paragraph, otherwise add a new paragraph\n // to set focus to the end of the content\n const lastBlock = initialModel.blocks[initialModel.blocks.length - 1];\n if (lastBlock?.blockType === 'Paragraph') {\n // now lastBlock is paragraph\n setSelectionAfterLastSegment(initialModel, lastBlock);\n } else {\n const block = createParagraph(false);\n initialModel.blocks.push(block);\n setSelectionAfterLastSegment(initialModel, block);\n // add content to the paragraph, otherwise height might be calculated incorrectly\n block.segments.push(createBr());\n }\n }\n return initialModel;\n }\n};\n\nconst setSelectionAfterLastSegment = (model: ReadonlyContentModelBlockGroup, block: ContentModelParagraph): void => {\n //selection marker should have the same format as the last segment if any\n const format = block.segments.length > 0 ? block.segments[block.segments.length - 1]?.format : undefined;\n const marker = createSelectionMarker(format);\n block.segments.push(marker);\n setSelection(model, marker);\n};\n\nconst themeDirection = (theme: Theme): 'rtl' | 'ltr' => {\n return theme.rtl ? 'rtl' : 'ltr';\n};\n"]}
1
+ {"version":3,"file":"RichTextEditor.js","sourceRoot":"","sources":["../../../../../../../react-components/src/components/RichTextEditor/RichTextEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { richTextEditorWrapperStyle, richTextEditorStyle } from '../styles/RichTextEditor.styles';\nimport { useTheme } from '../../theming';\nimport { RichTextStrings } from './RichTextSendBox';\nimport { isDarkThemed } from '../../theming/themeUtils';\nimport CopyPastePlugin from './Plugins/CopyPastePlugin';\nimport type {\n ContentModelDocument,\n ContentModelParagraph,\n EditorPlugin,\n IEditor,\n ReadonlyContentModelBlockGroup,\n ShallowMutableContentModelDocument,\n KnownAnnounceStrings\n} from 'roosterjs-content-model-types';\nimport { createModelFromHtml, Editor, exportContent } from 'roosterjs-content-model-core';\nimport {\n createBr,\n createEmptyModel,\n createParagraph,\n createSelectionMarker,\n setSelection\n} from 'roosterjs-content-model-dom';\nimport { KeyboardInputPlugin } from './Plugins/KeyboardInputPlugin';\nimport {\n AutoFormatPlugin,\n EditPlugin,\n PastePlugin,\n ShortcutPlugin,\n DefaultSanitizers\n} from 'roosterjs-content-model-plugins';\nimport { UpdateContentPlugin, UpdateEvent } from './Plugins/UpdateContentPlugin';\nimport { RichTextToolbar } from './Toolbar/RichTextToolbar';\nimport { RichTextToolbarPlugin } from './Plugins/RichTextToolbarPlugin';\nimport { ContextMenuPlugin } from './Plugins/ContextMenuPlugin';\nimport { TableEditContextMenuProvider } from './Plugins/TableEditContextMenuProvider';\nimport { borderApplier, dataSetApplier } from '../utils/RichTextEditorUtils';\n/* @conditional-compile-remove(rich-text-editor-image-upload) */\nimport {\n getPreviousInlineImages,\n getRemovedInlineImages,\n removeLocalBlobs,\n cleanAllLocalBlobs\n} from '../utils/RichTextEditorUtils';\nimport { ContextualMenu, IContextualMenuItem, IContextualMenuProps, Theme } from '@fluentui/react';\nimport { PlaceholderPlugin } from './Plugins/PlaceholderPlugin';\nimport { getFormatState, setDirection } from 'roosterjs-content-model-api';\nimport UndoRedoPlugin from './Plugins/UndoRedoPlugin';\n\n/**\n * Style props for {@link RichTextEditor}.\n *\n * @private\n */\nexport interface RichTextEditorStyleProps {\n minHeight: string;\n maxHeight: string;\n}\n\n/**\n * Props for {@link RichTextEditor}.\n *\n * @private\n */\nexport interface RichTextEditorProps {\n // the initial content of editor that is set when editor is created (e.g. when editing a message)\n initialContent?: string;\n onChange: (\n newValue?: string,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages?: Record<string, string>[]\n ) => void;\n onKeyDown?: (ev: KeyboardEvent) => void;\n // OnKeyDown aren't called for composition events, so we need to handle them separately\n onCompositionUpdate?: () => void;\n // update the current content of the rich text editor\n onContentModelUpdate?: (contentModel: ContentModelDocument | undefined) => void;\n contentModel?: ContentModelDocument | undefined;\n placeholderText?: string;\n strings: Partial<RichTextStrings>;\n showRichTextEditorFormatting: boolean;\n styles: RichTextEditorStyleProps;\n autoFocus?: 'sendBoxTextField';\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onPaste?: (event: { content: DocumentFragment }) => void;\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onInsertInlineImage?: (imageAttributes: Record<string, string>) => void;\n}\n\n/**\n * Represents a reference to the RichTextEditor component.\n */\nexport interface RichTextEditorComponentRef {\n /**\n * Sets focus on the RichTextEditor component.\n */\n focus: () => void;\n\n /**\n * Sets the content of the RichTextEditor component to an empty string.\n */\n setEmptyContent: () => void;\n\n /**\n * Retrieves the plain text content of the RichTextEditor component.\n * @returns The plain text content of the RichTextEditor component, or undefined if the editor isn't available.\n */\n getPlainContent: () => string | undefined;\n}\n\n/**\n * A component to wrap RoosterJS Rich Text Editor.\n *\n * @beta\n */\nexport const RichTextEditor = React.forwardRef<RichTextEditorComponentRef, RichTextEditorProps>((props, ref) => {\n const {\n initialContent,\n onChange,\n placeholderText,\n strings,\n showRichTextEditorFormatting,\n autoFocus,\n onKeyDown,\n onCompositionUpdate,\n onContentModelUpdate,\n contentModel,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onPaste,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n onInsertInlineImage\n } = props;\n const editor = useRef<IEditor | null>(null);\n const editorDiv = useRef<HTMLDivElement>(null);\n const theme = useTheme();\n const [contextMenuProps, setContextMenuProps] = useState<IContextualMenuProps | null>(null);\n const previousThemeDirection = useRef(themeDirection(theme));\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n // This will be set when the editor is initialized and when the content is updated.\n const [previousInlineImages, setPreviousInlineImages] = useState<Record<string, string>[]>([]);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n const [inlineImageLocalBlobs, setInlineImageLocalBlobs] = useState<Record<string, string>>({});\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n return () => {\n // Cleanup Local Blob URLs when the component is unmounted\n cleanAllLocalBlobs(inlineImageLocalBlobs);\n };\n // This effect should only run once when the component is unmounted, so we don't need to add any dependencies\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (editor.current) {\n if (!showRichTextEditorFormatting) {\n editor.current?.focus();\n }\n }\n }, [showRichTextEditorFormatting]);\n\n useImperativeHandle(ref, () => {\n return {\n focus() {\n if (editor.current) {\n editor.current.focus();\n }\n },\n setEmptyContent() {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages([]);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n cleanAllLocalBlobs(inlineImageLocalBlobs);\n\n if (editor.current) {\n // remove all content from the editor and update the model\n // ContentChanged event will be sent by RoosterJS automatically\n editor.current.formatContentModel((model: ShallowMutableContentModelDocument): boolean => {\n // Create a new empty paragraph with selection marker\n // this is needed for correct processing of images after the content is deleted\n const newModel = createEmptyModel();\n model.blocks = newModel.blocks;\n return true;\n });\n //reset content model\n onContentModelUpdate && onContentModelUpdate(editor.current.getContentModelCopy('disconnected'));\n }\n },\n getPlainContent() {\n if (editor.current) {\n return exportContent(editor.current, 'PlainTextFast');\n } else {\n return undefined;\n }\n }\n };\n }, [/* @conditional-compile-remove(rich-text-editor-image-upload) */ inlineImageLocalBlobs, onContentModelUpdate]);\n\n const toolbarPlugin = React.useMemo(() => {\n return new RichTextToolbarPlugin();\n }, []);\n\n const placeholderPlugin = useMemo(() => {\n const textColor = theme.palette?.neutralSecondary;\n return new PlaceholderPlugin(\n '',\n textColor\n ? {\n textColor: textColor\n }\n : undefined\n );\n }, [theme]);\n\n useEffect(() => {\n if (placeholderText !== undefined) {\n placeholderPlugin.updatePlaceholder(placeholderText);\n }\n }, [placeholderPlugin, placeholderText]);\n\n const toolbar = useMemo(() => {\n return <RichTextToolbar plugin={toolbarPlugin} strings={strings} />;\n }, [strings, toolbarPlugin]);\n\n const updatePlugin = useMemo(() => {\n return new UpdateContentPlugin();\n }, []);\n\n const copyPastePlugin = useMemo(() => {\n return new CopyPastePlugin();\n }, []);\n\n const onChangeContent = useCallback(\n (/* @conditional-compile-remove(rich-text-editor-image-upload) */ shouldUpdateInlineImages?: boolean) => {\n if (editor.current === null) {\n return;\n }\n const content = exportContent(editor.current);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n let removedInlineImages: Record<string, string>[] = [];\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n if (shouldUpdateInlineImages) {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n removedInlineImages = getRemovedInlineImages(content, previousInlineImages);\n }\n\n onChange &&\n onChange(content, /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(getPreviousInlineImages(content));\n },\n [onChange, /* @conditional-compile-remove(rich-text-editor-image-upload) */ previousInlineImages]\n );\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n updatePlugin.onUpdate = (\n event: string,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ shouldRemoveInlineImages?: boolean\n ) => {\n if (editor.current === null) {\n return;\n }\n if (event === UpdateEvent.Blur || event === UpdateEvent.Dispose) {\n onContentModelUpdate && onContentModelUpdate(editor.current.getContentModelCopy('disconnected'));\n } else {\n const content = exportContent(editor.current);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n let removedInlineImages: Record<string, string>[] = [];\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n if (shouldRemoveInlineImages) {\n removedInlineImages = getRemovedInlineImages(content, previousInlineImages);\n if (removedInlineImages.length > 0) {\n removeLocalBlobs(inlineImageLocalBlobs, removedInlineImages);\n }\n }\n\n onChange &&\n onChange(content, /* @conditional-compile-remove(rich-text-editor-image-upload) */ removedInlineImages);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(getPreviousInlineImages(content));\n }\n };\n }, [\n onChange,\n onContentModelUpdate,\n updatePlugin,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ previousInlineImages,\n /* @conditional-compile-remove(rich-text-editor-image-upload) */ inlineImageLocalBlobs\n ]);\n\n const undoRedoPlugin = useMemo(() => {\n return new UndoRedoPlugin();\n }, []);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n if (onInsertInlineImage) {\n copyPastePlugin.onInsertInlineImage = (imageAttributes: Record<string, string>) => {\n const { id, src } = imageAttributes;\n setInlineImageLocalBlobs((prev) => {\n if (!id || !src) {\n return prev;\n }\n return { ...prev, [id]: src };\n });\n onInsertInlineImage(imageAttributes);\n };\n } else {\n copyPastePlugin.onInsertInlineImage = undefined;\n }\n undoRedoPlugin.onInsertInlineImage = onInsertInlineImage;\n }, [copyPastePlugin, onInsertInlineImage, undoRedoPlugin]);\n\n useEffect(() => {\n undoRedoPlugin.onUpdateContent = () => {\n onChangeContent(/* @conditional-compile-remove(rich-text-editor-image-upload) */ true);\n };\n }, [onChangeContent, undoRedoPlugin]);\n\n const keyboardInputPlugin = useMemo(() => {\n return new KeyboardInputPlugin();\n }, []);\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n keyboardInputPlugin.onKeyDown = onKeyDown;\n }, [keyboardInputPlugin, onKeyDown]);\n\n useEffect(() => {\n // don't set callback in plugin constructor to update callback without plugin recreation\n keyboardInputPlugin.onCompositionUpdate = onCompositionUpdate;\n }, [keyboardInputPlugin, onCompositionUpdate]);\n\n const tableContextMenuPlugin = useMemo(() => {\n return new TableEditContextMenuProvider();\n }, []);\n\n useEffect(() => {\n tableContextMenuPlugin.updateStrings(strings);\n }, [tableContextMenuPlugin, strings]);\n\n const onContextMenuRender = useCallback(\n (container: HTMLElement, items: IContextualMenuItem[], onDismiss: () => void): void => {\n setContextMenuProps({\n items: items,\n target: container,\n onDismiss: onDismiss\n });\n },\n []\n );\n\n const onContextMenuDismiss = useCallback((): void => {\n setContextMenuProps(null);\n }, []);\n\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n useEffect(() => {\n copyPastePlugin.onPaste = onPaste;\n }, [copyPastePlugin, onPaste]);\n\n const plugins: EditorPlugin[] = useMemo(() => {\n const contentEdit = new EditPlugin({ handleTabKey: false });\n // AutoFormatPlugin previously was a part of the edit plugin\n const autoFormatPlugin = new AutoFormatPlugin({ autoBullet: true, autoNumbering: true, autoLink: true });\n const roosterPastePlugin = new PastePlugin(false, {\n additionalDisallowedTags: ['head', '!doctype', '!cdata', '#comment'],\n additionalAllowedTags: [],\n styleSanitizers: DefaultSanitizers,\n attributeSanitizers: {}\n });\n\n const shortcutPlugin = new ShortcutPlugin();\n const contextMenuPlugin = new ContextMenuPlugin(onContextMenuRender, onContextMenuDismiss);\n return [\n placeholderPlugin,\n keyboardInputPlugin,\n contentEdit,\n autoFormatPlugin,\n updatePlugin,\n copyPastePlugin,\n roosterPastePlugin,\n toolbarPlugin,\n shortcutPlugin,\n // contextPlugin and tableEditMenuProvider allow to show insert/delete menu for the table\n contextMenuPlugin,\n tableContextMenuPlugin,\n undoRedoPlugin\n ];\n }, [\n onContextMenuRender,\n onContextMenuDismiss,\n placeholderPlugin,\n keyboardInputPlugin,\n updatePlugin,\n copyPastePlugin,\n toolbarPlugin,\n tableContextMenuPlugin,\n undoRedoPlugin\n ]);\n\n const announcerStringGetter = useCallback(\n (key: KnownAnnounceStrings): string => {\n switch (key) {\n case 'announceListItemBullet':\n return strings.richTextNewBulletedListItemAnnouncement ?? '';\n case 'announceListItemNumbering':\n return strings.richTextNewNumberedListItemAnnouncement ?? '';\n case 'announceOnFocusLastCell':\n return '';\n }\n },\n [strings.richTextNewBulletedListItemAnnouncement, strings.richTextNewNumberedListItemAnnouncement]\n );\n\n useEffect(() => {\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n const prevInlineImage = getPreviousInlineImages(initialContent);\n /* @conditional-compile-remove(rich-text-editor-image-upload) */\n setPreviousInlineImages(prevInlineImage);\n\n const initialModel = createEditorInitialModel(initialContent, contentModel);\n if (editorDiv.current) {\n editor.current = new Editor(editorDiv.current, {\n generateColorKey: (color) => color, // Needed to ensure override of text color in dark mode.\n inDarkMode: isDarkThemed(theme),\n // doNotAdjustEditorColor is used to disable default color and background color for Rooster component\n doNotAdjustEditorColor: true,\n imageSelectionBorderColor: theme.palette.themePrimary,\n tableCellSelectionBackgroundColor: theme.palette.neutralLight,\n plugins: plugins,\n initialModel: initialModel,\n defaultModelToDomOptions: {\n formatApplierOverride: {\n // apply border and dataset formats for table\n border: borderApplier,\n dataset: dataSetApplier\n }\n },\n announcerStringGetter: announcerStringGetter\n });\n }\n\n if (autoFocus === 'sendBoxTextField') {\n editor.current?.focus();\n }\n\n return () => {\n if (editor.current) {\n editor.current.dispose();\n editor.current = null;\n }\n };\n // don't update the editor on deps update as everything is handled in separate hooks or plugins\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [theme, plugins, announcerStringGetter]);\n\n useEffect(() => {\n const themeDirectionValue = themeDirection(theme);\n // check that editor exists and theme was actually changed\n // as format.direction will be undefined if setDirection is not called\n if (editor.current && previousThemeDirection.current !== themeDirectionValue) {\n const format = getFormatState(editor.current);\n if (format.direction !== themeDirectionValue) {\n // should be set after the hook where editor is created as the editor might be null\n // setDirection will cause the focus change back to the editor and this might not be what we want to do (autoFocus prop)\n // that's why it's not part of the create editor hook\n setDirection(editor.current, theme.rtl ? 'rtl' : 'ltr');\n }\n previousThemeDirection.current = themeDirectionValue;\n }\n }, [theme]);\n\n return (\n <div data-testid={'rich-text-editor-wrapper'}>\n {showRichTextEditorFormatting && toolbar}\n <div className={richTextEditorWrapperStyle(theme)}>\n {/* div that is used by Rooster JS as a parent of the editor */}\n <div\n id=\"richTextSendBox\"\n ref={editorDiv}\n tabIndex={0}\n role=\"textbox\"\n aria-multiline=\"true\"\n data-testid={'rooster-rich-text-editor'}\n className={richTextEditorStyle(props.styles)}\n aria-label={placeholderText}\n />\n </div>\n {contextMenuProps && <ContextualMenu {...contextMenuProps} calloutProps={{ isBeakVisible: false }} />}\n </div>\n );\n});\n\nconst createEditorInitialModel = (\n initialContent?: string,\n contentModel?: ContentModelDocument\n): ContentModelDocument | undefined => {\n if (contentModel) {\n // contentModel is the current content of the editor\n return contentModel;\n } else {\n const initialContentValue = initialContent;\n const initialModel =\n initialContentValue && initialContentValue.length > 0 ? createModelFromHtml(initialContentValue) : undefined;\n if (initialModel && initialModel.blocks.length > 0) {\n // lastBlock should have blockType = paragraph, otherwise add a new paragraph\n // to set focus to the end of the content\n const lastBlock = initialModel.blocks[initialModel.blocks.length - 1];\n if (lastBlock?.blockType === 'Paragraph') {\n // now lastBlock is paragraph\n setSelectionAfterLastSegment(initialModel, lastBlock);\n } else {\n const block = createParagraph(false);\n initialModel.blocks.push(block);\n setSelectionAfterLastSegment(initialModel, block);\n // add content to the paragraph, otherwise height might be calculated incorrectly\n block.segments.push(createBr());\n }\n }\n return initialModel;\n }\n};\n\nconst setSelectionAfterLastSegment = (model: ReadonlyContentModelBlockGroup, block: ContentModelParagraph): void => {\n //selection marker should have the same format as the last segment if any\n const format = block.segments.length > 0 ? block.segments[block.segments.length - 1]?.format : undefined;\n const marker = createSelectionMarker(format);\n block.segments.push(marker);\n setSelection(model, marker);\n};\n\nconst themeDirection = (theme: Theme): 'rtl' | 'ltr' => {\n return theme.rtl ? 'rtl' : 'ltr';\n};\n"]}
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "تم إنهاء وضع التجميع",
649
649
  "dismissButtonAriaLabel": "إغلاق"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "حدث خطأ ما أثناء كتابة الحديث.",
653
+ "message": "تم إيقاف كتابة الحديث. الرجاء المحاولة مرة أخرى لاحقا",
654
+ "dismissButtonAriaLabel": "إغلاق"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "بدأت كتابة الحديث.",
658
+ "message": "تم البدء بواسطتك. اسمح للجميع بمعرفة أنها تتم كتابة حدثيهم.",
659
+ "dismissButtonAriaLabel": "إغلاق"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Režim Togethermode skončil",
649
649
  "dismissButtonAriaLabel": "Zavřít"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Při přepisu došlo k nějaké chybě.",
653
+ "message": "Přepis se zastavil, zkuste to prosím znovu později",
654
+ "dismissButtonAriaLabel": "Zavřít"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Přepis se spustil.",
658
+ "message": "Spuštěno vámi. Dejte všem vědět, že se přepisují.",
659
+ "dismissButtonAriaLabel": "Zavřít"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Mae Togethermode wedi dod i ben",
649
649
  "dismissButtonAriaLabel": "Cau"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Aeth rhywbeth o’i le gyda’r trawsgrifiad.",
653
+ "message": "Wedi stopio trawsgrifio. rhowch gynnig arall arni rywbryd eto",
654
+ "dismissButtonAriaLabel": "Cau"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Wedi dechrau trawsgrifio.",
658
+ "message": "Dechreuwyd gennych chi. Rhowch wybod i bawb eu bod yn cael eu trawsgrifio.",
659
+ "dismissButtonAriaLabel": "Cau"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Der Togethermode wurde beendet",
649
649
  "dismissButtonAriaLabel": "Schließen"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Bei der Transkription ist ein Fehler aufgetreten.",
653
+ "message": "Die Transkription wurde gestoppt. Bitte versuchen Sie es später erneut.",
654
+ "dismissButtonAriaLabel": "Schließen"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Die Transkription wurde gestartet.",
658
+ "message": "Von Ihnen gestartet. Teilen Sie allen mit, dass sie transkribiert werden.",
659
+ "dismissButtonAriaLabel": "Schließen"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode has ended",
649
649
  "dismissButtonAriaLabel": "Close"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Something went wrong with transcription.",
653
+ "message": "Transcription has stopped. please try again later",
654
+ "dismissButtonAriaLabel": "Close"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transcription has started.",
658
+ "message": "Started by you. Let everyone know they are being transcribed.",
659
+ "dismissButtonAriaLabel": "Close"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "El modo de colaboración ha finalizado",
649
649
  "dismissButtonAriaLabel": "Cerrar"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Se ha producido un error con la transcripción.",
653
+ "message": "La transcripción se ha detenido. Inténtelo de nuevo más tarde",
654
+ "dismissButtonAriaLabel": "Cerrar"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "La transcripción se ha iniciado.",
658
+ "message": "Iniciado por usted. Informar a todos de que se les está transcribiendo.",
659
+ "dismissButtonAriaLabel": "Cerrar"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "El modo de colaboración finalizó",
649
649
  "dismissButtonAriaLabel": "Cerrar"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Se produjo un error con la transcripción.",
653
+ "message": "La transcripción se detuvo. Inténtalo de nuevo más tarde",
654
+ "dismissButtonAriaLabel": "Cerrar"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "La transcripción se inició.",
658
+ "message": "Iniciado por ti. Informar a todos de que se les está transcribiendo.",
659
+ "dismissButtonAriaLabel": "Cerrar"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Yhdessä-tila on päättynyt",
649
649
  "dismissButtonAriaLabel": "Sulje"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Transkriptiossa tapahtui virhe.",
653
+ "message": "Transkriptio on pysäytetty. Yritä myöhemmin uudelleen",
654
+ "dismissButtonAriaLabel": "Sulje"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transkriptio on aloitettu.",
658
+ "message": "Sinun aloittamasi. Kerro kaikille, että heidän puheensa muunnetaan tekstiksi.",
659
+ "dismissButtonAriaLabel": "Sulje"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode est terminé",
649
649
  "dismissButtonAriaLabel": "Fermez"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Désolé, une erreur s’est produite lors de la transcription.",
653
+ "message": "Désolé, la transcription a été arrêtée. Veuillez réessayer plus tard",
654
+ "dismissButtonAriaLabel": "Fermer"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "La transcription a démarré.",
658
+ "message": "Démarrée par vous. Faites savoir à tout le monde qu'ils sont transcrits.",
659
+ "dismissButtonAriaLabel": "Fermer"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode est terminé",
649
649
  "dismissButtonAriaLabel": "Fermez"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Désolé, une erreur s’est produite lors de la transcription.",
653
+ "message": "Désolé, la transcription a été arrêtée. Veuillez réessayer plus tard",
654
+ "dismissButtonAriaLabel": "Fermer"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "La transcription a démarré.",
658
+ "message": "Démarrée par vous. Faites savoir à tout le monde qu'ils sont transcrits.",
659
+ "dismissButtonAriaLabel": "Fermer"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode הסתיים",
649
649
  "dismissButtonAriaLabel": "סגור"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "משהו השתבש בתהליך התמלול.",
653
+ "message": "התמלול הופסק. נסה שוב מאוחר יותר",
654
+ "dismissButtonAriaLabel": "סגור"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "התמלול התחיל.",
658
+ "message": "הופעל על-ידך. עדכן את כולם שמבוצע תמלול של השיחה.",
659
+ "dismissButtonAriaLabel": "סגור"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode è terminato",
649
649
  "dismissButtonAriaLabel": "Chiudi"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Si è verificato un errore con la trascrizione.",
653
+ "message": "La trascrizione è stata interrotta. Riprova più tardi",
654
+ "dismissButtonAriaLabel": "Chiudi"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "La trascrizione è stata avviata.",
658
+ "message": "Avviato da te. Informa tutti che la chiamata viene trascritta.",
659
+ "dismissButtonAriaLabel": "Chiudi"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode が終了しました",
649
649
  "dismissButtonAriaLabel": "閉じる"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "文字起こしに問題が発生しました。",
653
+ "message": "文字起こしが停止しました。後でもう一度お試しください",
654
+ "dismissButtonAriaLabel": "閉じる"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "文字起こしが開始しました。",
658
+ "message": "あなたが開始しました。文字起こしが行われていることを全員に知らせてください。",
659
+ "dismissButtonAriaLabel": "閉じる"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode가 종료되었습니다.",
649
649
  "dismissButtonAriaLabel": "닫기"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "대화 내용 기록에 문제가 발생했습니다.",
653
+ "message": "대화 내용 기록이 중단되었습니다. 나중에 다시 시도하세요.",
654
+ "dismissButtonAriaLabel": "닫기"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "대화 내용 기록을 시작했습니다.",
658
+ "message": "사용자가 시작했습니다. 모든 사람들에게 대화가 기록되고 있다는 것을 알리세요.",
659
+ "dismissButtonAriaLabel": "닫기"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Sammenmodus er avsluttet",
649
649
  "dismissButtonAriaLabel": "Lukk"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Noe gikk galt med transkripsjonen.",
653
+ "message": "Transkripsjonen er stoppet. Prøv på nytt senere",
654
+ "dismissButtonAriaLabel": "Lukk"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transkripsjon er startet.",
658
+ "message": "Startet av deg. Sørg for at alle vet at de blir transkribert.",
659
+ "dismissButtonAriaLabel": "Lukk"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode is beëindigd",
649
649
  "dismissButtonAriaLabel": "Sluiten"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Er is iets misgegaan met de transcriptie.",
653
+ "message": "Transcriptie is gestopt. Probeer het later opnieuw",
654
+ "dismissButtonAriaLabel": "Sluiten"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transcriptie is gestart.",
658
+ "message": "Gestart door jou. Laat iedereen weten dat ze worden getranscribeerd.",
659
+ "dismissButtonAriaLabel": "Sluiten"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Tryb Togethermode został zakończony",
649
649
  "dismissButtonAriaLabel": "Zamknij"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Wystąpił problem z transkrypcją.",
653
+ "message": "Transkrypcja została zatrzymana. Spróbuj ponownie później",
654
+ "dismissButtonAriaLabel": "Zamknij"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Rozpoczęto transkrypcję.",
658
+ "message": "Rozpoczęte przez Ciebie. Poinformuj wszystkich, że są transkrybowani.",
659
+ "dismissButtonAriaLabel": "Zamknij"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "O modo Togethermode foi encerrado",
649
649
  "dismissButtonAriaLabel": "Fechar"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Algo deu errado com a transcrição.",
653
+ "message": "A transcrição foi interrompida. Tente novamente mais tarde",
654
+ "dismissButtonAriaLabel": "Fechar"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "A transcrição foi iniciada.",
658
+ "message": "Iniciado por você. Informe a todos que eles estão sendo transcritos.",
659
+ "dismissButtonAriaLabel": "Fechar"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Режим \"Вместе\" завершен",
649
649
  "dismissButtonAriaLabel": "Закрыть"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "При транскрибировании произошла ошибка.",
653
+ "message": "Транскрибирование остановлено. Повторите попытку позже.",
654
+ "dismissButtonAriaLabel": "Закрыть"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Транскрибирование началось.",
658
+ "message": "Начато вами. Сообщите всем участникам, что их слова транскрибируются.",
659
+ "dismissButtonAriaLabel": "Закрыть"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Tillsammans-läge har avslutats",
649
649
  "dismissButtonAriaLabel": "Stäng"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Ett fel uppstod med transkriptionen.",
653
+ "message": "Transkriptionen har stoppats. Försök igen senare",
654
+ "dismissButtonAriaLabel": "Stäng"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transkriptionen har startat.",
658
+ "message": "Startades av dig. Berätta för alla att de transkriberas.",
659
+ "dismissButtonAriaLabel": "Stäng"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode sona erdi",
649
649
  "dismissButtonAriaLabel": "Kapat"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "Transkripsiyonla ilgili bir sorun oluştu.",
653
+ "message": "Transkripsiyon durduruldu. Lütfen daha sonra yeniden deneyin",
654
+ "dismissButtonAriaLabel": "Kapat"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "Transkripsiyon başlatıldı.",
658
+ "message": "Siz başlattınız. Transkripsiyon yapıldığını herkese bildirin.",
659
+ "dismissButtonAriaLabel": "Kapat"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "Togethermode 已结束",
649
649
  "dismissButtonAriaLabel": "关闭"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "听录出现问题。",
653
+ "message": "听录已停止。请稍后重试",
654
+ "dismissButtonAriaLabel": "关闭"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "听录已开始。",
658
+ "message": "已由你启动。告知所有人正在听录他们所说的内容。",
659
+ "dismissButtonAriaLabel": "关闭"
650
660
  }
651
661
  },
652
662
  "videoGallery": {
@@ -647,6 +647,16 @@
647
647
  "togetherModeEnded": {
648
648
  "title": "[在一起模式] 已結束",
649
649
  "dismissButtonAriaLabel": "關閉"
650
+ },
651
+ "transcriptionError": {
652
+ "title": "謄寫發生錯誤。",
653
+ "message": "已停止謄寫。請稍後再試",
654
+ "dismissButtonAriaLabel": "關閉"
655
+ },
656
+ "transcriptionStartedByYou": {
657
+ "title": "已開始謄寫。",
658
+ "message": "由您啟動。讓所有人知道他們正在被謄寫。",
659
+ "dismissButtonAriaLabel": "關閉"
650
660
  }
651
661
  },
652
662
  "videoGallery": {