@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.
- package/index.css +117 -117
- package/index.d.ts +10 -10
- package/index.js +1 -1
- package/index.mock.d.ts +9 -9
- package/index.mock.js +37 -36
- package/index.mock.js.map +1 -1
- package/internal/ChatInputContext.d.ts +1 -1
- package/internal/ChatInputContext.js.map +1 -1
- package/internal/ChatInputSlotButton.js +13 -13
- package/internal/ChatInputSlotButton.js.map +1 -1
- package/internal/FocusTarget.js +3 -10
- package/internal/FocusTarget.js.map +1 -1
- package/internal/ModeTransition.js +41 -11
- package/internal/ModeTransition.js.map +1 -1
- package/internal/TextInput.d.ts +1 -1
- package/internal/TextInput.js +146 -126
- package/internal/TextInput.js.map +1 -1
- package/internal/VoiceRecord.d.ts +1 -1
- package/internal/VoiceRecord.js +66 -24
- package/internal/VoiceRecord.js.map +1 -1
- package/internal/VoiceRecordIndicator.js +22 -9
- package/internal/VoiceRecordIndicator.js.map +1 -1
- package/internal/flattenFragments.js +9 -13
- package/internal/flattenFragments.js.map +1 -1
- package/internal/focusGroup.js +18 -28
- package/internal/focusGroup.js.map +1 -1
- package/internal/useHasSound.js +49 -64
- package/internal/useHasSound.js.map +1 -1
- package/internal/useObjectUrl.js +15 -21
- package/internal/useObjectUrl.js.map +1 -1
- package/internal/useRovingFocusGroup.js +102 -137
- package/internal/useRovingFocusGroup.js.map +1 -1
- package/internal/useSendOnEnter.js +44 -46
- package/internal/useSendOnEnter.js.map +1 -1
- package/internal/useVoiceRecordSession.d.ts +1 -1
- package/internal/useVoiceRecordSession.js +185 -219
- package/internal/useVoiceRecordSession.js.map +1 -1
- package/internal/voiceSlotRegistry.d.ts +1 -1
- package/internal/voiceSlotRegistry.js +3 -3
- package/internal/voiceSlotRegistry.js.map +1 -1
- package/package.json +17 -16
- package/public/ChatInput.d.ts +6 -6
- package/public/ChatInput.js +129 -73
- package/public/ChatInput.js.map +1 -1
- package/public/ChatInputChips.js +4 -4
- package/public/ChatInputChips.js.map +1 -1
- package/public/ChatInputFile.d.ts +1 -1
- package/public/ChatInputFile.js +107 -47
- package/public/ChatInputFile.js.map +1 -1
- package/public/ChatInputFiles.js +10 -3
- package/public/ChatInputFiles.js.map +1 -1
- package/public/ChatInputPreview.js +14 -9
- package/public/ChatInputPreview.js.map +1 -1
- package/public/ChatInputSendButton.d.ts +1 -1
- package/public/ChatInputSendButton.js +34 -23
- package/public/ChatInputSendButton.js.map +1 -1
- package/public/ChatInputVoiceButton.d.ts +1 -1
- package/public/ChatInputVoiceButton.js +87 -91
- package/public/ChatInputVoiceButton.js.map +1 -1
- package/public/getChatInputFileType.d.ts +1 -1
- package/public/getChatInputFileType.js +7 -10
- package/public/getChatInputFileType.js.map +1 -1
- package/styles-DofLkp5v.js +5 -0
- package/styles-DofLkp5v.js.map +1 -0
- package/styles-CHMi0EYL.js +0 -5
- 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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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 =
|
|
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 '
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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":"
|
|
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":";;;;"}
|
package/styles-CHMi0EYL.js
DELETED
|
@@ -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
|
package/styles-CHMi0EYL.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"styles-CHMi0EYL.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|