@hh.ru/magritte-ui-chat-input 1.2.2 → 1.2.4

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 (66) hide show
  1. package/index.css +117 -117
  2. package/index.d.ts +10 -10
  3. package/index.js +1 -1
  4. package/index.mock.d.ts +9 -9
  5. package/index.mock.js +37 -36
  6. package/index.mock.js.map +1 -1
  7. package/internal/ChatInputContext.d.ts +1 -1
  8. package/internal/ChatInputContext.js.map +1 -1
  9. package/internal/ChatInputSlotButton.js +13 -13
  10. package/internal/ChatInputSlotButton.js.map +1 -1
  11. package/internal/FocusTarget.js +3 -10
  12. package/internal/FocusTarget.js.map +1 -1
  13. package/internal/ModeTransition.js +41 -11
  14. package/internal/ModeTransition.js.map +1 -1
  15. package/internal/TextInput.d.ts +1 -1
  16. package/internal/TextInput.js +146 -126
  17. package/internal/TextInput.js.map +1 -1
  18. package/internal/VoiceRecord.d.ts +1 -1
  19. package/internal/VoiceRecord.js +66 -24
  20. package/internal/VoiceRecord.js.map +1 -1
  21. package/internal/VoiceRecordIndicator.js +22 -9
  22. package/internal/VoiceRecordIndicator.js.map +1 -1
  23. package/internal/flattenFragments.js +9 -13
  24. package/internal/flattenFragments.js.map +1 -1
  25. package/internal/focusGroup.js +18 -28
  26. package/internal/focusGroup.js.map +1 -1
  27. package/internal/useHasSound.js +49 -64
  28. package/internal/useHasSound.js.map +1 -1
  29. package/internal/useObjectUrl.js +15 -21
  30. package/internal/useObjectUrl.js.map +1 -1
  31. package/internal/useRovingFocusGroup.js +102 -137
  32. package/internal/useRovingFocusGroup.js.map +1 -1
  33. package/internal/useSendOnEnter.js +44 -46
  34. package/internal/useSendOnEnter.js.map +1 -1
  35. package/internal/useVoiceRecordSession.d.ts +1 -1
  36. package/internal/useVoiceRecordSession.js +185 -219
  37. package/internal/useVoiceRecordSession.js.map +1 -1
  38. package/internal/voiceSlotRegistry.d.ts +1 -1
  39. package/internal/voiceSlotRegistry.js +3 -3
  40. package/internal/voiceSlotRegistry.js.map +1 -1
  41. package/package.json +17 -16
  42. package/public/ChatInput.d.ts +6 -6
  43. package/public/ChatInput.js +129 -73
  44. package/public/ChatInput.js.map +1 -1
  45. package/public/ChatInputChips.js +4 -4
  46. package/public/ChatInputChips.js.map +1 -1
  47. package/public/ChatInputFile.d.ts +1 -1
  48. package/public/ChatInputFile.js +107 -47
  49. package/public/ChatInputFile.js.map +1 -1
  50. package/public/ChatInputFiles.js +10 -3
  51. package/public/ChatInputFiles.js.map +1 -1
  52. package/public/ChatInputPreview.js +14 -9
  53. package/public/ChatInputPreview.js.map +1 -1
  54. package/public/ChatInputSendButton.d.ts +1 -1
  55. package/public/ChatInputSendButton.js +34 -23
  56. package/public/ChatInputSendButton.js.map +1 -1
  57. package/public/ChatInputVoiceButton.d.ts +1 -1
  58. package/public/ChatInputVoiceButton.js +87 -91
  59. package/public/ChatInputVoiceButton.js.map +1 -1
  60. package/public/getChatInputFileType.d.ts +1 -1
  61. package/public/getChatInputFileType.js +7 -10
  62. package/public/getChatInputFileType.js.map +1 -1
  63. package/styles-DofLkp5v.js +5 -0
  64. package/styles-DofLkp5v.js.map +1 -0
  65. package/styles-CHMi0EYL.js +0 -5
  66. package/styles-CHMi0EYL.js.map +0 -1
@@ -12,106 +12,102 @@ import '@hh.ru/magritte-common-use-disabled';
12
12
  import '@hh.ru/magritte-ui-icon';
13
13
  import '@hh.ru/magritte-internal-slot-registry';
14
14
 
15
- // Сколько ждём микрофон, прежде чем показать лоадер. Если доступ уже выдан, `getUserMedia`
16
- // резолвится почти мгновенно — показывать лоадер на такой срок значит мельтешить; порог оставляет
17
- // индикацию только для реального ожидания (диалог разрешения браузера, медленный старт устройства)
18
15
  const VOICE_START_LOADER_DELAY = 300;
19
- /**
20
- * Обёртка над колбэком из пропов со стабильной по ссылке идентичностью. Приложение обычно
21
- * пересоздаёт хендлеры на каждый рендер, а в slot-registry нужны стабильные ссылки (иначе конфиг
22
- * перерегистрируется на каждый рендер). Актуальную версию колбэка держим в рефе, наружу отдаём
23
- * фиксированную обёртку, которая зовёт последний ref. Возвращает `undefined` из вызова, если
24
- * исходный колбэк не передан.
25
- */
26
16
  const useStableFn = (fn) => {
27
- const fnRef = useRef(fn);
28
- fnRef.current = fn;
29
- return useCallback((...args) => fnRef.current?.(...args), []);
17
+ const fnRef = useRef(fn);
18
+ fnRef.current = fn;
19
+ return useCallback((...args) => fnRef.current?.(...args), []);
30
20
  };
31
- /**
32
- * Флаг с задержкой на подъём: `true`, только если исходный продержался `VOICE_START_LOADER_DELAY`
33
- * подряд; сброс — сразу. Повторное включение отсчитывает порог заново (таймер снимается в cleanup).
34
- */
35
21
  const useDelayedFlag = (value) => {
36
- const [delayed, setDelayed] = useState(false);
37
- useEffect(() => {
38
- if (!value) {
39
- setDelayed(false);
40
- return undefined;
41
- }
42
- const timeoutId = setTimeout(() => setDelayed(true), VOICE_START_LOADER_DELAY);
43
- return () => clearTimeout(timeoutId);
44
- }, [value]);
45
- return delayed;
22
+ const [delayed, setDelayed] = useState(false);
23
+ useEffect(() => {
24
+ if (!value) {
25
+ setDelayed(false);
26
+ return void 0;
27
+ }
28
+ const timeoutId = setTimeout(() => setDelayed(true), VOICE_START_LOADER_DELAY);
29
+ return () => clearTimeout(timeoutId);
30
+ }, [value]);
31
+ return delayed;
46
32
  };
47
- /**
48
- * Кнопка записи голоса для слота ChatInput. Несёт на себе конфигурацию записи (колбэки,
49
- * `maxDuration`, `processingLabel`) — она регистрируется в slot-registry и оттуда доезжает до
50
- * сессии в корне ChatInput. По клику запускает запись через контекст ChatInput. Если доступ к
51
- * микрофону не получен за `VOICE_START_LOADER_DELAY` — показывает лоадер (при уже выданном доступе
52
- * ожидание короче порога и лоадера нет); оформление (паддинги, цвет) берёт из дефолтов слота.
53
- * Вне ChatInput кнопка неактивна.
54
- */
55
- const ChatInputVoiceButton = ({ maxDuration, mimeType, processingLabel, onRecordStart, onComplete, onError, onCancel, completeButtonProps, cancelButtonProps, onClick, children, disabled = false, 'aria-label': ariaLabel, ...ariaProps }) => {
56
- const { startVoiceRecord, voiceRecordStatus } = useChatInputContext();
57
- const recordVoiceLabel = useTranslation('ChatInput', 'recordVoice');
58
- // кнопка неактивна и по собственному `disabled`, и вне ChatInput (нет startVoiceRecord)
59
- const isButtonDisabled = disabled || !startVoiceRecord;
60
- // лоадер только на затянувшемся ожидании микрофона; при уже выданном доступе статус `starting`
61
- // проскакивает быстрее порога, и лоадер не показывается вовсе
62
- const isLoading = useDelayedFlag(voiceRecordStatus === 'starting');
63
- // список mimeType приложение часто передаёт инлайн-массивом (новая ссылка на каждый рендер);
64
- // мемоизуем по стабильному строковому ключу, чтобы не перерегистрировать конфиг зря
65
- const mimeTypeKey = Array.isArray(mimeType) ? mimeType.join(',') : mimeType;
66
- // колбэки из пропов оборачиваем в стабильные ссылки, тогда конфиг для slot-registry
67
- // меняет идентичность только при смене примитивов (maxDuration/processingLabel), а не на
68
- // каждый рендер из-за инлайновых хендлеров приложения — регистрация не дёргается
69
- const stableRecordStart = useStableFn(onRecordStart);
70
- const stableComplete = useStableFn(onComplete);
71
- const stableError = useStableFn(onError);
72
- const stableCancel = useStableFn(onCancel);
73
- const config = useMemo(() => ({
74
- maxDuration,
75
- mimeType,
76
- processingLabel,
77
- onRecordStart: stableRecordStart,
78
- onComplete: stableComplete,
79
- onError: stableError,
80
- onCancel: stableCancel,
81
- completeButtonProps,
82
- cancelButtonProps,
83
- }),
33
+ const ChatInputVoiceButton = ({
34
+ maxDuration,
35
+ mimeType,
36
+ processingLabel,
37
+ onRecordStart,
38
+ onComplete,
39
+ onError,
40
+ onCancel,
41
+ completeButtonProps,
42
+ cancelButtonProps,
43
+ onClick,
44
+ children,
45
+ disabled = false,
46
+ "aria-label": ariaLabel,
47
+ ...ariaProps
48
+ }) => {
49
+ const { startVoiceRecord, voiceRecordStatus } = useChatInputContext();
50
+ const recordVoiceLabel = useTranslation("ChatInput", "recordVoice");
51
+ const isButtonDisabled = disabled || !startVoiceRecord;
52
+ const isLoading = useDelayedFlag(voiceRecordStatus === "starting");
53
+ const mimeTypeKey = Array.isArray(mimeType) ? mimeType.join(",") : mimeType;
54
+ const stableRecordStart = useStableFn(onRecordStart);
55
+ const stableComplete = useStableFn(onComplete);
56
+ const stableError = useStableFn(onError);
57
+ const stableCancel = useStableFn(onCancel);
58
+ const config = useMemo(
59
+ () => ({
60
+ maxDuration,
61
+ mimeType,
62
+ processingLabel,
63
+ onRecordStart: stableRecordStart,
64
+ onComplete: stableComplete,
65
+ onError: stableError,
66
+ onCancel: stableCancel,
67
+ completeButtonProps,
68
+ cancelButtonProps
69
+ }),
84
70
  // mimeType намеренно не в deps — его влияние учтено через стабильный mimeTypeKey
85
71
  // eslint-disable-next-line react-hooks/exhaustive-deps
86
72
  [
87
- maxDuration,
88
- mimeTypeKey,
89
- processingLabel,
90
- stableRecordStart,
91
- stableComplete,
92
- stableError,
93
- stableCancel,
94
- completeButtonProps,
95
- cancelButtonProps,
96
- ]);
97
- useRegisterVoiceConfig(config);
98
- const handleClick = (event) => {
99
- onClick?.(event);
100
- startVoiceRecord?.();
101
- };
102
- const iconProps = {
103
- // дефолтный data-qa до спреда — пользовательский data-qa из ariaProps его перекрывает
104
- 'data-qa': 'record',
105
- ...ariaProps,
106
- 'aria-label': ariaLabel ?? recordVoiceLabel,
107
- disabled: isButtonDisabled,
108
- loading: isLoading,
109
- onClick: handleClick,
110
- // цвета тут нет, потому что в ChatInput он уже пробрасывается на левый и правый слоты
111
- };
112
- return (jsx(FocusTarget, { priority: FOCUS_PRIORITY.voice, children: jsx(ChatInputSlotButton, { icon: jsx(MicOutlinedSize24, { ...iconProps }), iconProps: iconProps, disabled: isButtonDisabled, onClick: handleClick, children: children }) }));
73
+ maxDuration,
74
+ mimeTypeKey,
75
+ processingLabel,
76
+ stableRecordStart,
77
+ stableComplete,
78
+ stableError,
79
+ stableCancel,
80
+ completeButtonProps,
81
+ cancelButtonProps
82
+ ]
83
+ );
84
+ useRegisterVoiceConfig(config);
85
+ const handleClick = (event) => {
86
+ onClick?.(event);
87
+ startVoiceRecord?.();
88
+ };
89
+ const iconProps = {
90
+ // дефолтный data-qa до спреда — пользовательский data-qa из ariaProps его перекрывает
91
+ "data-qa": "record",
92
+ ...ariaProps,
93
+ "aria-label": ariaLabel ?? recordVoiceLabel,
94
+ disabled: isButtonDisabled,
95
+ loading: isLoading,
96
+ onClick: handleClick
97
+ // цвета тут нет, потому что в ChatInput он уже пробрасывается на левый и правый слоты
98
+ };
99
+ return /* @__PURE__ */ jsx(FocusTarget, { priority: FOCUS_PRIORITY.voice, children: /* @__PURE__ */ jsx(
100
+ ChatInputSlotButton,
101
+ {
102
+ icon: /* @__PURE__ */ jsx(MicOutlinedSize24, { ...iconProps }),
103
+ iconProps,
104
+ disabled: isButtonDisabled,
105
+ onClick: handleClick,
106
+ children
107
+ }
108
+ ) });
113
109
  };
114
- ChatInputVoiceButton.displayName = 'ChatInputVoiceButton';
110
+ ChatInputVoiceButton.displayName = "ChatInputVoiceButton";
115
111
 
116
112
  export { ChatInputVoiceButton };
117
113
  //# sourceMappingURL=ChatInputVoiceButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInputVoiceButton.js","sources":["src/public/ChatInputVoiceButton.tsx"],"sourcesContent":["import {\n type FC,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useChatInputContext } from '@hh.ru/magritte-ui-chat-input/internal/ChatInputContext';\nimport { ChatInputSlotButton } from '@hh.ru/magritte-ui-chat-input/internal/ChatInputSlotButton';\nimport { FocusTarget } from '@hh.ru/magritte-ui-chat-input/internal/FocusTarget';\nimport { FOCUS_PRIORITY } from '@hh.ru/magritte-ui-chat-input/internal/focusGroup';\nimport { useRegisterVoiceConfig } from '@hh.ru/magritte-ui-chat-input/internal/voiceSlotRegistry';\nimport { type ChatInputButtonAria, type ChatInputVoiceRecordConfig } from '@hh.ru/magritte-ui-chat-input/types';\nimport { MicOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\n\n// Сколько ждём микрофон, прежде чем показать лоадер. Если доступ уже выдан, `getUserMedia`\n// резолвится почти мгновенно — показывать лоадер на такой срок значит мельтешить; порог оставляет\n// индикацию только для реального ожидания (диалог разрешения браузера, медленный старт устройства)\nconst VOICE_START_LOADER_DELAY = 300;\n\n/**\n * Обёртка над колбэком из пропов со стабильной по ссылке идентичностью. Приложение обычно\n * пересоздаёт хендлеры на каждый рендер, а в slot-registry нужны стабильные ссылки (иначе конфиг\n * перерегистрируется на каждый рендер). Актуальную версию колбэка держим в рефе, наружу отдаём\n * фиксированную обёртку, которая зовёт последний ref. Возвращает `undefined` из вызова, если\n * исходный колбэк не передан.\n */\nconst useStableFn = <Args extends unknown[], Return>(\n fn: ((...args: Args) => Return) | undefined\n): ((...args: Args) => Return | undefined) => {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n return useCallback((...args: Args) => fnRef.current?.(...args), []);\n};\n\n/**\n * Флаг с задержкой на подъём: `true`, только если исходный продержался `VOICE_START_LOADER_DELAY`\n * подряд; сброс — сразу. Повторное включение отсчитывает порог заново (таймер снимается в cleanup).\n */\nconst useDelayedFlag = (value: boolean): boolean => {\n const [delayed, setDelayed] = useState(false);\n\n useEffect(() => {\n if (!value) {\n setDelayed(false);\n return undefined;\n }\n const timeoutId = setTimeout(() => setDelayed(true), VOICE_START_LOADER_DELAY);\n return () => clearTimeout(timeoutId);\n }, [value]);\n\n return delayed;\n};\n\nexport interface ChatInputVoiceButtonProps extends ChatInputButtonAria, ChatInputVoiceRecordConfig {\n /** Доп. обработчик клика — вызывается вместе со стартом записи, а не вместо него */\n onClick?: MouseEventHandler<HTMLButtonElement>;\n /**\n * Блокирует кнопку записи независимо от общего `disabled` компонента `ChatInput`.\n * Кнопка также неактивна сама по себе вне `ChatInput`\n * @default false\n */\n disabled?: boolean;\n /** Кастомный контент вместо иконки микрофона. Иконку в children оформляем как встроенную\n * (через IconDefaultPropsContext); клик по любому content ловится в любом случае */\n children?: ReactNode;\n}\n\n/**\n * Кнопка записи голоса для слота ChatInput. Несёт на себе конфигурацию записи (колбэки,\n * `maxDuration`, `processingLabel`) — она регистрируется в slot-registry и оттуда доезжает до\n * сессии в корне ChatInput. По клику запускает запись через контекст ChatInput. Если доступ к\n * микрофону не получен за `VOICE_START_LOADER_DELAY` — показывает лоадер (при уже выданном доступе\n * ожидание короче порога и лоадера нет); оформление (паддинги, цвет) берёт из дефолтов слота.\n * Вне ChatInput кнопка неактивна.\n */\nexport const ChatInputVoiceButton: FC<ChatInputVoiceButtonProps> = ({\n maxDuration,\n mimeType,\n processingLabel,\n onRecordStart,\n onComplete,\n onError,\n onCancel,\n completeButtonProps,\n cancelButtonProps,\n onClick,\n children,\n disabled = false,\n 'aria-label': ariaLabel,\n ...ariaProps\n}) => {\n const { startVoiceRecord, voiceRecordStatus } = useChatInputContext();\n const recordVoiceLabel = useTranslation('ChatInput', 'recordVoice');\n\n // кнопка неактивна и по собственному `disabled`, и вне ChatInput (нет startVoiceRecord)\n const isButtonDisabled = disabled || !startVoiceRecord;\n\n // лоадер только на затянувшемся ожидании микрофона; при уже выданном доступе статус `starting`\n // проскакивает быстрее порога, и лоадер не показывается вовсе\n const isLoading = useDelayedFlag(voiceRecordStatus === 'starting');\n\n // список mimeType приложение часто передаёт инлайн-массивом (новая ссылка на каждый рендер);\n // мемоизуем по стабильному строковому ключу, чтобы не перерегистрировать конфиг зря\n const mimeTypeKey = Array.isArray(mimeType) ? mimeType.join(',') : mimeType;\n\n // колбэки из пропов оборачиваем в стабильные ссылки, тогда конфиг для slot-registry\n // меняет идентичность только при смене примитивов (maxDuration/processingLabel), а не на\n // каждый рендер из-за инлайновых хендлеров приложения — регистрация не дёргается\n const stableRecordStart = useStableFn(onRecordStart);\n const stableComplete = useStableFn(onComplete);\n const stableError = useStableFn(onError);\n const stableCancel = useStableFn(onCancel);\n\n const config = useMemo<ChatInputVoiceRecordConfig>(\n () => ({\n maxDuration,\n mimeType,\n processingLabel,\n onRecordStart: stableRecordStart,\n onComplete: stableComplete,\n onError: stableError,\n onCancel: stableCancel,\n completeButtonProps,\n cancelButtonProps,\n }),\n // mimeType намеренно не в deps — его влияние учтено через стабильный mimeTypeKey\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n maxDuration,\n mimeTypeKey,\n processingLabel,\n stableRecordStart,\n stableComplete,\n stableError,\n stableCancel,\n completeButtonProps,\n cancelButtonProps,\n ]\n );\n useRegisterVoiceConfig(config);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n startVoiceRecord?.();\n };\n\n const iconProps = {\n // дефолтный data-qa до спреда — пользовательский data-qa из ariaProps его перекрывает\n 'data-qa': 'record',\n ...ariaProps,\n 'aria-label': ariaLabel ?? recordVoiceLabel,\n disabled: isButtonDisabled,\n loading: isLoading,\n onClick: handleClick,\n // цвета тут нет, потому что в ChatInput он уже пробрасывается на левый и правый слоты\n };\n\n return (\n <FocusTarget priority={FOCUS_PRIORITY.voice}>\n <ChatInputSlotButton\n icon={<MicOutlinedSize24 {...iconProps} />}\n iconProps={iconProps}\n disabled={isButtonDisabled}\n onClick={handleClick}\n >\n {children}\n </ChatInputSlotButton>\n </FocusTarget>\n );\n};\n\nChatInputVoiceButton.displayName = 'ChatInputVoiceButton';\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ChatInputVoiceButton.js","sources":["src/public/ChatInputVoiceButton.tsx"],"sourcesContent":["import {\n type FC,\n type MouseEvent,\n type MouseEventHandler,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useChatInputContext } from '@hh.ru/magritte-ui-chat-input/internal/ChatInputContext';\nimport { ChatInputSlotButton } from '@hh.ru/magritte-ui-chat-input/internal/ChatInputSlotButton';\nimport { FocusTarget } from '@hh.ru/magritte-ui-chat-input/internal/FocusTarget';\nimport { FOCUS_PRIORITY } from '@hh.ru/magritte-ui-chat-input/internal/focusGroup';\nimport { useRegisterVoiceConfig } from '@hh.ru/magritte-ui-chat-input/internal/voiceSlotRegistry';\nimport { type ChatInputButtonAria, type ChatInputVoiceRecordConfig } from '@hh.ru/magritte-ui-chat-input/types';\nimport { MicOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\n\n// Сколько ждём микрофон, прежде чем показать лоадер. Если доступ уже выдан, `getUserMedia`\n// резолвится почти мгновенно — показывать лоадер на такой срок значит мельтешить; порог оставляет\n// индикацию только для реального ожидания (диалог разрешения браузера, медленный старт устройства)\nconst VOICE_START_LOADER_DELAY = 300;\n\n/**\n * Обёртка над колбэком из пропов со стабильной по ссылке идентичностью. Приложение обычно\n * пересоздаёт хендлеры на каждый рендер, а в slot-registry нужны стабильные ссылки (иначе конфиг\n * перерегистрируется на каждый рендер). Актуальную версию колбэка держим в рефе, наружу отдаём\n * фиксированную обёртку, которая зовёт последний ref. Возвращает `undefined` из вызова, если\n * исходный колбэк не передан.\n */\nconst useStableFn = <Args extends unknown[], Return>(\n fn: ((...args: Args) => Return) | undefined\n): ((...args: Args) => Return | undefined) => {\n const fnRef = useRef(fn);\n fnRef.current = fn;\n return useCallback((...args: Args) => fnRef.current?.(...args), []);\n};\n\n/**\n * Флаг с задержкой на подъём: `true`, только если исходный продержался `VOICE_START_LOADER_DELAY`\n * подряд; сброс — сразу. Повторное включение отсчитывает порог заново (таймер снимается в cleanup).\n */\nconst useDelayedFlag = (value: boolean): boolean => {\n const [delayed, setDelayed] = useState(false);\n\n useEffect(() => {\n if (!value) {\n setDelayed(false);\n return undefined;\n }\n const timeoutId = setTimeout(() => setDelayed(true), VOICE_START_LOADER_DELAY);\n return () => clearTimeout(timeoutId);\n }, [value]);\n\n return delayed;\n};\n\nexport interface ChatInputVoiceButtonProps extends ChatInputButtonAria, ChatInputVoiceRecordConfig {\n /** Доп. обработчик клика — вызывается вместе со стартом записи, а не вместо него */\n onClick?: MouseEventHandler<HTMLButtonElement>;\n /**\n * Блокирует кнопку записи независимо от общего `disabled` компонента `ChatInput`.\n * Кнопка также неактивна сама по себе вне `ChatInput`\n * @default false\n */\n disabled?: boolean;\n /** Кастомный контент вместо иконки микрофона. Иконку в children оформляем как встроенную\n * (через IconDefaultPropsContext); клик по любому content ловится в любом случае */\n children?: ReactNode;\n}\n\n/**\n * Кнопка записи голоса для слота ChatInput. Несёт на себе конфигурацию записи (колбэки,\n * `maxDuration`, `processingLabel`) — она регистрируется в slot-registry и оттуда доезжает до\n * сессии в корне ChatInput. По клику запускает запись через контекст ChatInput. Если доступ к\n * микрофону не получен за `VOICE_START_LOADER_DELAY` — показывает лоадер (при уже выданном доступе\n * ожидание короче порога и лоадера нет); оформление (паддинги, цвет) берёт из дефолтов слота.\n * Вне ChatInput кнопка неактивна.\n */\nexport const ChatInputVoiceButton: FC<ChatInputVoiceButtonProps> = ({\n maxDuration,\n mimeType,\n processingLabel,\n onRecordStart,\n onComplete,\n onError,\n onCancel,\n completeButtonProps,\n cancelButtonProps,\n onClick,\n children,\n disabled = false,\n 'aria-label': ariaLabel,\n ...ariaProps\n}) => {\n const { startVoiceRecord, voiceRecordStatus } = useChatInputContext();\n const recordVoiceLabel = useTranslation('ChatInput', 'recordVoice');\n\n // кнопка неактивна и по собственному `disabled`, и вне ChatInput (нет startVoiceRecord)\n const isButtonDisabled = disabled || !startVoiceRecord;\n\n // лоадер только на затянувшемся ожидании микрофона; при уже выданном доступе статус `starting`\n // проскакивает быстрее порога, и лоадер не показывается вовсе\n const isLoading = useDelayedFlag(voiceRecordStatus === 'starting');\n\n // список mimeType приложение часто передаёт инлайн-массивом (новая ссылка на каждый рендер);\n // мемоизуем по стабильному строковому ключу, чтобы не перерегистрировать конфиг зря\n const mimeTypeKey = Array.isArray(mimeType) ? mimeType.join(',') : mimeType;\n\n // колбэки из пропов оборачиваем в стабильные ссылки, тогда конфиг для slot-registry\n // меняет идентичность только при смене примитивов (maxDuration/processingLabel), а не на\n // каждый рендер из-за инлайновых хендлеров приложения — регистрация не дёргается\n const stableRecordStart = useStableFn(onRecordStart);\n const stableComplete = useStableFn(onComplete);\n const stableError = useStableFn(onError);\n const stableCancel = useStableFn(onCancel);\n\n const config = useMemo<ChatInputVoiceRecordConfig>(\n () => ({\n maxDuration,\n mimeType,\n processingLabel,\n onRecordStart: stableRecordStart,\n onComplete: stableComplete,\n onError: stableError,\n onCancel: stableCancel,\n completeButtonProps,\n cancelButtonProps,\n }),\n // mimeType намеренно не в deps — его влияние учтено через стабильный mimeTypeKey\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n maxDuration,\n mimeTypeKey,\n processingLabel,\n stableRecordStart,\n stableComplete,\n stableError,\n stableCancel,\n completeButtonProps,\n cancelButtonProps,\n ]\n );\n useRegisterVoiceConfig(config);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n startVoiceRecord?.();\n };\n\n const iconProps = {\n // дефолтный data-qa до спреда — пользовательский data-qa из ariaProps его перекрывает\n 'data-qa': 'record',\n ...ariaProps,\n 'aria-label': ariaLabel ?? recordVoiceLabel,\n disabled: isButtonDisabled,\n loading: isLoading,\n onClick: handleClick,\n // цвета тут нет, потому что в ChatInput он уже пробрасывается на левый и правый слоты\n };\n\n return (\n <FocusTarget priority={FOCUS_PRIORITY.voice}>\n <ChatInputSlotButton\n icon={<MicOutlinedSize24 {...iconProps} />}\n iconProps={iconProps}\n disabled={isButtonDisabled}\n onClick={handleClick}\n >\n {children}\n </ChatInputSlotButton>\n </FocusTarget>\n );\n};\n\nChatInputVoiceButton.displayName = 'ChatInputVoiceButton';\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type ChatInputFileType } from '@hh.ru/magritte-ui-chat-input/public/ChatInputFile';
1
+ import { type ChatInputFileType } from '../public/ChatInputFile';
2
2
  /**
3
3
  * Тип `ChatInput.File` по MIME-типу файла: `image/*` — `image`, `video/*` — `video`, остальное — `doc`
4
4
  */
@@ -1,15 +1,12 @@
1
1
  import './../index.css';
2
- /**
3
- * Тип `ChatInput.File` по MIME-типу файла: `image/*` — `image`, `video/*` — `video`, остальное — `doc`
4
- */
5
2
  const getChatInputFileType = (file) => {
6
- if (file.type.startsWith('image/')) {
7
- return 'image';
8
- }
9
- if (file.type.startsWith('video/')) {
10
- return 'video';
11
- }
12
- return 'doc';
3
+ if (file.type.startsWith("image/")) {
4
+ return "image";
5
+ }
6
+ if (file.type.startsWith("video/")) {
7
+ return "video";
8
+ }
9
+ return "doc";
13
10
  };
14
11
 
15
12
  export { getChatInputFileType };
@@ -1 +1 @@
1
- {"version":3,"file":"getChatInputFileType.js","sources":["src/public/getChatInputFileType.ts"],"sourcesContent":["import { type ChatInputFileType } from '@hh.ru/magritte-ui-chat-input/public/ChatInputFile';\n\n/**\n * Тип `ChatInput.File` по MIME-типу файла: `image/*` — `image`, `video/*` — `video`, остальное — `doc`\n */\nexport const getChatInputFileType = (file: Blob): ChatInputFileType => {\n if (file.type.startsWith('image/')) {\n return 'image';\n }\n if (file.type.startsWith('video/')) {\n return 'video';\n }\n return 'doc';\n};\n"],"names":[],"mappings":"AAEA;;AAEG;AACU,MAAA,oBAAoB,GAAG,CAAC,IAAU,KAAuB;IAClE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAChC,QAAA,OAAO,OAAO,CAAC;KAClB;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAChC,QAAA,OAAO,OAAO,CAAC;KAClB;AACD,IAAA,OAAO,KAAK,CAAC;AACjB;;;;"}
1
+ {"version":3,"file":"getChatInputFileType.js","sources":["src/public/getChatInputFileType.ts"],"sourcesContent":["import { type ChatInputFileType } from '@hh.ru/magritte-ui-chat-input/public/ChatInputFile';\n\n/**\n * Тип `ChatInput.File` по MIME-типу файла: `image/*` — `image`, `video/*` — `video`, остальное — `doc`\n */\nexport const getChatInputFileType = (file: Blob): ChatInputFileType => {\n if (file.type.startsWith('image/')) {\n return 'image';\n }\n if (file.type.startsWith('video/')) {\n return 'video';\n }\n return 'doc';\n};\n"],"names":[],"mappings":"AAKa,MAAA,oBAAA,GAAuB,CAAC,IAAkC,KAAA;AACnE,EAAA,IAAI,IAAK,CAAA,IAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AAChC,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AACA,EAAA,IAAI,IAAK,CAAA,IAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AAChC,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AACA,EAAO,OAAA,KAAA,CAAA;AACX;;;;"}
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"chat-input":"magritte-chat-input___P69oN_1-2-4","chatInput":"magritte-chat-input___P69oN_1-2-4","no-background":"magritte-no-background___eiIY1_1-2-4","noBackground":"magritte-no-background___eiIY1_1-2-4","text-input-focused":"magritte-text-input-focused___TfyLu_1-2-4","textInputFocused":"magritte-text-input-focused___TfyLu_1-2-4","content-grid":"magritte-content-grid___g03sT_1-2-4","contentGrid":"magritte-content-grid___g03sT_1-2-4","preview":"magritte-preview___baXKi_1-2-4","left":"magritte-left___7JZYp_1-2-4","central":"magritte-central___zkguj_1-2-4","right":"magritte-right___-tGcO_1-2-4","scrollbar-cell":"magritte-scrollbar-cell___--M2x_1-2-4","scrollbarCell":"magritte-scrollbar-cell___--M2x_1-2-4","text-input":"magritte-text-input___3AFO4_1-2-4","textInput":"magritte-text-input___3AFO4_1-2-4","layout-vertical":"magritte-layout-vertical___mVTr-_1-2-4","layoutVertical":"magritte-layout-vertical___mVTr-_1-2-4","has-central":"magritte-has-central___VRZik_1-2-4","hasCentral":"magritte-has-central___VRZik_1-2-4","no-left-controls":"magritte-no-left-controls___7r6yy_1-2-4","noLeftControls":"magritte-no-left-controls___7r6yy_1-2-4","no-right-controls":"magritte-no-right-controls___HBSag_1-2-4","noRightControls":"magritte-no-right-controls___HBSag_1-2-4","chips":"magritte-chips___gLao5_1-2-4","chips-container":"magritte-chips-container___-bS5O_1-2-4","chipsContainer":"magritte-chips-container___-bS5O_1-2-4","preview-block":"magritte-preview-block___iiPdS_1-2-4","previewBlock":"magritte-preview-block___iiPdS_1-2-4","preview-side":"magritte-preview-side___ymR-u_1-2-4","previewSide":"magritte-preview-side___ymR-u_1-2-4","preview-content":"magritte-preview-content___ZgyBD_1-2-4","previewContent":"magritte-preview-content___ZgyBD_1-2-4","preview-title":"magritte-preview-title___SkFeZ_1-2-4","previewTitle":"magritte-preview-title___SkFeZ_1-2-4","preview-subtitle":"magritte-preview-subtitle___58qfR_1-2-4","previewSubtitle":"magritte-preview-subtitle___58qfR_1-2-4","files-container":"magritte-files-container___zOkRK_1-2-4","filesContainer":"magritte-files-container___zOkRK_1-2-4","files":"magritte-files___j2q5K_1-2-4","file":"magritte-file___lz9Ll_1-2-4","file-card":"magritte-file-card___hn5C9_1-2-4","fileCard":"magritte-file-card___hn5C9_1-2-4","file-tile":"magritte-file-tile___OVlh3_1-2-4","fileTile":"magritte-file-tile___OVlh3_1-2-4","file-card-removable":"magritte-file-card-removable___GkxUe_1-2-4","fileCardRemovable":"magritte-file-card-removable___GkxUe_1-2-4","file-tile-placeholder":"magritte-file-tile-placeholder___yxLuR_1-2-4","fileTilePlaceholder":"magritte-file-tile-placeholder___yxLuR_1-2-4","file-tile-image":"magritte-file-tile-image___cZFgL_1-2-4","fileTileImage":"magritte-file-tile-image___cZFgL_1-2-4","file-remove":"magritte-file-remove___S0WB9_1-2-4","fileRemove":"magritte-file-remove___S0WB9_1-2-4","file-name":"magritte-file-name___L03-O_1-2-4","fileName":"magritte-file-name___L03-O_1-2-4","file-name-base":"magritte-file-name-base___ojdp6_1-2-4","fileNameBase":"magritte-file-name-base___ojdp6_1-2-4","file-name-extension":"magritte-file-name-extension___3QZtS_1-2-4","fileNameExtension":"magritte-file-name-extension___3QZtS_1-2-4","text-input-wrapper":"magritte-text-input-wrapper___TPbwC_1-2-4","textInputWrapper":"magritte-text-input-wrapper___TPbwC_1-2-4","with-top-fade":"magritte-with-top-fade___okgqo_1-2-4","withTopFade":"magritte-with-top-fade___okgqo_1-2-4","with-bottom-fade":"magritte-with-bottom-fade___82gr8_1-2-4","withBottomFade":"magritte-with-bottom-fade___82gr8_1-2-4","measure":"magritte-measure___xNKc0_1-2-4","voice-record":"magritte-voice-record___p64PV_1-2-4","voiceRecord":"magritte-voice-record___p64PV_1-2-4","voice-record-left":"magritte-voice-record-left___njEt-_1-2-4","voiceRecordLeft":"magritte-voice-record-left___njEt-_1-2-4","voice-record-right":"magritte-voice-record-right___UTv-U_1-2-4","voiceRecordRight":"magritte-voice-record-right___UTv-U_1-2-4","voice-processing":"magritte-voice-processing___C0xnX_1-2-4","voiceProcessing":"magritte-voice-processing___C0xnX_1-2-4","voice-record-indicator":"magritte-voice-record-indicator___V8ybb_1-2-4","voiceRecordIndicator":"magritte-voice-record-indicator___V8ybb_1-2-4","voice-record-indicator-bar":"magritte-voice-record-indicator-bar___jgyqz_1-2-4","voiceRecordIndicatorBar":"magritte-voice-record-indicator-bar___jgyqz_1-2-4","voice-record-indicator-wave":"magritte-voice-record-indicator-wave___4VsyE_1-2-4","voiceRecordIndicatorWave":"magritte-voice-record-indicator-wave___4VsyE_1-2-4","voice-record-indicator-has-sound":"magritte-voice-record-indicator-has-sound___67t5g_1-2-4","voiceRecordIndicatorHasSound":"magritte-voice-record-indicator-has-sound___67t5g_1-2-4","mode-container":"magritte-mode-container___nATVD_1-2-4","modeContainer":"magritte-mode-container___nATVD_1-2-4","voice-overlay":"magritte-voice-overlay___LbxAI_1-2-4","voiceOverlay":"magritte-voice-overlay___LbxAI_1-2-4"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=styles-DofLkp5v.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-DofLkp5v.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,5 +0,0 @@
1
- import './index.css';
2
- var styles = {"chat-input":"magritte-chat-input___P69oN_1-2-2","chatInput":"magritte-chat-input___P69oN_1-2-2","no-background":"magritte-no-background___eiIY1_1-2-2","noBackground":"magritte-no-background___eiIY1_1-2-2","text-input-focused":"magritte-text-input-focused___TfyLu_1-2-2","textInputFocused":"magritte-text-input-focused___TfyLu_1-2-2","content-grid":"magritte-content-grid___g03sT_1-2-2","contentGrid":"magritte-content-grid___g03sT_1-2-2","preview":"magritte-preview___baXKi_1-2-2","left":"magritte-left___7JZYp_1-2-2","central":"magritte-central___zkguj_1-2-2","right":"magritte-right___-tGcO_1-2-2","scrollbar-cell":"magritte-scrollbar-cell___--M2x_1-2-2","scrollbarCell":"magritte-scrollbar-cell___--M2x_1-2-2","text-input":"magritte-text-input___3AFO4_1-2-2","textInput":"magritte-text-input___3AFO4_1-2-2","layout-vertical":"magritte-layout-vertical___mVTr-_1-2-2","layoutVertical":"magritte-layout-vertical___mVTr-_1-2-2","has-central":"magritte-has-central___VRZik_1-2-2","hasCentral":"magritte-has-central___VRZik_1-2-2","no-left-controls":"magritte-no-left-controls___7r6yy_1-2-2","noLeftControls":"magritte-no-left-controls___7r6yy_1-2-2","no-right-controls":"magritte-no-right-controls___HBSag_1-2-2","noRightControls":"magritte-no-right-controls___HBSag_1-2-2","chips":"magritte-chips___gLao5_1-2-2","chips-container":"magritte-chips-container___-bS5O_1-2-2","chipsContainer":"magritte-chips-container___-bS5O_1-2-2","preview-block":"magritte-preview-block___iiPdS_1-2-2","previewBlock":"magritte-preview-block___iiPdS_1-2-2","preview-side":"magritte-preview-side___ymR-u_1-2-2","previewSide":"magritte-preview-side___ymR-u_1-2-2","preview-content":"magritte-preview-content___ZgyBD_1-2-2","previewContent":"magritte-preview-content___ZgyBD_1-2-2","preview-title":"magritte-preview-title___SkFeZ_1-2-2","previewTitle":"magritte-preview-title___SkFeZ_1-2-2","preview-subtitle":"magritte-preview-subtitle___58qfR_1-2-2","previewSubtitle":"magritte-preview-subtitle___58qfR_1-2-2","files-container":"magritte-files-container___zOkRK_1-2-2","filesContainer":"magritte-files-container___zOkRK_1-2-2","files":"magritte-files___j2q5K_1-2-2","file":"magritte-file___lz9Ll_1-2-2","file-card":"magritte-file-card___hn5C9_1-2-2","fileCard":"magritte-file-card___hn5C9_1-2-2","file-tile":"magritte-file-tile___OVlh3_1-2-2","fileTile":"magritte-file-tile___OVlh3_1-2-2","file-card-removable":"magritte-file-card-removable___GkxUe_1-2-2","fileCardRemovable":"magritte-file-card-removable___GkxUe_1-2-2","file-tile-placeholder":"magritte-file-tile-placeholder___yxLuR_1-2-2","fileTilePlaceholder":"magritte-file-tile-placeholder___yxLuR_1-2-2","file-tile-image":"magritte-file-tile-image___cZFgL_1-2-2","fileTileImage":"magritte-file-tile-image___cZFgL_1-2-2","file-remove":"magritte-file-remove___S0WB9_1-2-2","fileRemove":"magritte-file-remove___S0WB9_1-2-2","file-name":"magritte-file-name___L03-O_1-2-2","fileName":"magritte-file-name___L03-O_1-2-2","file-name-base":"magritte-file-name-base___ojdp6_1-2-2","fileNameBase":"magritte-file-name-base___ojdp6_1-2-2","file-name-extension":"magritte-file-name-extension___3QZtS_1-2-2","fileNameExtension":"magritte-file-name-extension___3QZtS_1-2-2","text-input-wrapper":"magritte-text-input-wrapper___TPbwC_1-2-2","textInputWrapper":"magritte-text-input-wrapper___TPbwC_1-2-2","with-top-fade":"magritte-with-top-fade___okgqo_1-2-2","withTopFade":"magritte-with-top-fade___okgqo_1-2-2","with-bottom-fade":"magritte-with-bottom-fade___82gr8_1-2-2","withBottomFade":"magritte-with-bottom-fade___82gr8_1-2-2","measure":"magritte-measure___xNKc0_1-2-2","voice-record":"magritte-voice-record___p64PV_1-2-2","voiceRecord":"magritte-voice-record___p64PV_1-2-2","voice-record-left":"magritte-voice-record-left___njEt-_1-2-2","voiceRecordLeft":"magritte-voice-record-left___njEt-_1-2-2","voice-record-right":"magritte-voice-record-right___UTv-U_1-2-2","voiceRecordRight":"magritte-voice-record-right___UTv-U_1-2-2","voice-processing":"magritte-voice-processing___C0xnX_1-2-2","voiceProcessing":"magritte-voice-processing___C0xnX_1-2-2","voice-record-indicator":"magritte-voice-record-indicator___V8ybb_1-2-2","voiceRecordIndicator":"magritte-voice-record-indicator___V8ybb_1-2-2","voice-record-indicator-bar":"magritte-voice-record-indicator-bar___jgyqz_1-2-2","voiceRecordIndicatorBar":"magritte-voice-record-indicator-bar___jgyqz_1-2-2","voice-record-indicator-wave":"magritte-voice-record-indicator-wave___4VsyE_1-2-2","voiceRecordIndicatorWave":"magritte-voice-record-indicator-wave___4VsyE_1-2-2","voice-record-indicator-has-sound":"magritte-voice-record-indicator-has-sound___67t5g_1-2-2","voiceRecordIndicatorHasSound":"magritte-voice-record-indicator-has-sound___67t5g_1-2-2","mode-container":"magritte-mode-container___nATVD_1-2-2","modeContainer":"magritte-mode-container___nATVD_1-2-2","voice-overlay":"magritte-voice-overlay___LbxAI_1-2-2","voiceOverlay":"magritte-voice-overlay___LbxAI_1-2-2"};
3
-
4
- export { styles as s };
5
- //# sourceMappingURL=styles-CHMi0EYL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"styles-CHMi0EYL.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}