Поле ввода для чата с ассистентом. Текстовое поле растёт вместе с сообщением до 200 px, а в вебе Enter отправляет и Shift+Enter переносит строку. Скрепка открывает меню вложений, а кнопка с названием модели — список моделей; оба меню появляются на пружине и закрываются нажатием снаружи, а в вебе ещё и по Escape.
После отправки кнопка превращается в «стоп», а вокруг поля загорается размытое радужное свечение в палитре Apple — оно рисуется через Skia. Без внешнего управления ответ имитируется сам и гаснет через simulatedStreamMs; с пропом streaming состоянием управляете вы. При «Уменьшении движения» меню и свечение появляются без анимации. Работает на iOS, Android и в вебе.
Поставьте зависимости:
npm install @shopify/react-native-skia react-native-reanimated react-native-svg react-native-workletspnpm add @shopify/react-native-skia react-native-reanimated react-native-svg react-native-workletsyarn add @shopify/react-native-skia react-native-reanimated react-native-svg react-native-workletsbun add @shopify/react-native-skia react-native-reanimated react-native-svg react-native-workletsСкопируйте эти файлы в src/shared/components/organisms/ai-prompt-composer/:
Код доступен по подпискеPro
Исходник «Поле ввода для ИИ» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
Проверьте алиас путей. Импорты в коде выше записаны так, как их пишет astra-rn add: @/shared/components, @/shared/utils и @/shared/hooks. Нужен алиас "@/*": ["./src/*"] в tsconfig.json — или поправьте импорты под свои пути.
Код доступен по подпискеPro
Исходник «Поле ввода для ИИ» открывается с подпиской Pro. Уже оформили? Войдите в аккаунт.
onSubmit получает текст и id выбранной модели.
onSubmit?Тип (text: string, modelId: string) => void
onStop?Тип () => void
streaming?Тип boolean
models?Тип readonly IComposerModel[]
defaultModel?Тип string
placeholder?Тип string
value?Тип string
onValueChange?Тип (value: string) => void
glow?Тип boolean
glowOpacity?Тип number
simulatedStreamMs?Тип number
radius?Тип number
theme?Тип TComposerTheme
style?Тип StyleProp<ViewStyle>