stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
59 lines (47 loc) • 1.52 kB
text/typescript
import { useEffect, useState } from 'react';
import { AIState, Channel, Event } from 'stream-chat';
import { useChatContext } from '../../../contexts';
export const AIStates = {
Error: 'AI_STATE_ERROR',
ExternalSources: 'AI_STATE_EXTERNAL_SOURCES',
Generating: 'AI_STATE_GENERATING',
Idle: 'AI_STATE_IDLE',
Thinking: 'AI_STATE_THINKING',
};
/**
* A hook that returns the current state of the AI.
* @param {Channel} channel - The channel for which we want to know the AI state.
* @returns {{ aiState: AIState }} The current AI state for the given channel.
*/
export const useAIState = (channel?: Channel): { aiState: AIState } => {
const { isOnline } = useChatContext();
const [aiState, setAiState] = useState<AIState>(AIStates.Idle);
useEffect(() => {
if (!isOnline) {
setAiState(AIStates.Idle);
}
}, [isOnline]);
useEffect(() => {
if (!channel) {
return;
}
const indicatorChangedListener = channel.on('ai_indicator.update', (event: Event) => {
const { cid } = event;
const state = event.ai_state as AIState;
if (channel.cid === cid) {
setAiState(state);
}
});
const indicatorClearedListener = channel.on('ai_indicator.clear', (event) => {
const { cid } = event;
if (channel.cid === cid) {
setAiState(AIStates.Idle);
}
});
return () => {
indicatorChangedListener.unsubscribe();
indicatorClearedListener.unsubscribe();
};
}, [channel]);
return { aiState };
};