Untitled
Anonymous
plain_text
07/29/2024 1:24 PM
9.5 KB
31
Indexable
// Customizable Area Start
import { IBlock } from '../../../framework/src/IBlock';
import { Message } from '../../../framework/src/Message';
import { BlockComponent } from '../../../framework/src/BlockComponent';
import MessageEnum, {
getName,
} from '../../../framework/src/Messages/MessageEnum';
import { runEngine } from '../../../framework/src/RunEngine';
import { GiftedChat } from 'react-native-gifted-chat';
import { v4 as uuidv4 } from 'uuid';
import { ActionCable, Cable } from '@kesha-antonov/react-native-action-cable';
import { getStorageData } from '../../../framework/src/Utilities';
// Customizable Area Start
interface MessageArray {
id: number;
message: string;
isUser: boolean;
}
interface RespData {
warning: string;
id: string;
object: string;
created: number;
model: string;
choices: [
{
text: ' Hello there! How can I help you?';
index: 0;
logprobs: null;
finish_reason: 'stop';
}
];
usage: { prompt_tokens: 7; completion_tokens: 9; total_tokens: 16 };
}
interface IMessage {
_id: string | number;
text: string;
createdAt: Date | number;
user: User;
image?: string;
video?: string;
audio?: string;
system?: boolean;
sent?: boolean;
received?: boolean;
pending?: boolean;
quickReplies?: QuickReplies;
}
interface User {
_id: string | number;
name: string;
avatar: string;
}
interface QuickReplies {
type: 'radio' | 'checkbox';
values: Reply[];
keepIt?: boolean;
}
interface Reply {
title: string;
value: string;
messageId?: any;
}
// Customizable Area End
export const configJSON = require('./config');
export interface Props {
navigation: any;
id: string;
// Customizable Area Start
// Customizable Area End
}
interface S {
txtInputValue: string;
txtSavedValue: string;
enableField: boolean;
// Customizable Area Start
messages: IMessage[];
input: string;
isLoading: boolean;
data: string;
ws: any;
// Customizable Area End
}
interface SS {
id: any;
// Customizable Area Start
// Customizable Area End
}
export default class ChatgptController extends BlockComponent<Props, S, SS> {
// Customizable Area Start
openApiID: string = '';
actionCable: any;
// Customizable Area End
constructor(props: Props) {
super(props);
this.receive = this.receive.bind(this);
this.subScribedMessages = [
getName(MessageEnum.AccoutLoginSuccess),
// Customizable Area Start
getName(MessageEnum.RestAPIResponceMessage),
getName(MessageEnum.RestAPIRequestMessage),
getName(MessageEnum.RestAPIResponceEndPointMessage),
getName(MessageEnum.RestAPIRequestBodyMessage),
getName(MessageEnum.RestAPIRequestHeaderMessage),
getName(MessageEnum.RestAPIRequestMethodMessage),
// Customizable Area End
];
this.state = {
txtInputValue: '',
txtSavedValue: 'A',
enableField: false,
// Customizable Area Start
messages: [],
input: '',
isLoading: false,
data: '',
ws: null,
// Customizable Area End
};
runEngine.attachBuildingBlock(this as IBlock, this.subScribedMessages);
// Customizable Area Start
// Customizable Area End
}
async receive(from: string, message: Message) {
runEngine.debugLog('Message Recived', message);
// Customizable Area Start
// Customizable Area End
}
// Customizable Area Start
onSend = (messages: any) => {
const { ws } = this.state;
if (ws && ws.readyState === WebSocket.OPEN) {
// Send the message content through WebSocket
const messageContent = messages.text; // Assuming you send one message at a time
ws.send(JSON.stringify({ text: messageContent }));
console.log('Sent message:', messageContent);
}
// GiftedChat.append(prevState.messages, messages)
this.setState((prevState) => ({
messages: GiftedChat.append(prevState.messages, messages),
}));
};
async componentDidMount(): Promise<void> {
// Create a WebSocket connection
this.chatDetailsActioncable();
// const ws = new WebSocket('ws://localhost:9000'); // Replace with your WebSocket server URL
// ws.onopen = () => {
// console.log('WebSocket connected');
// };
// ws.onmessage = (event: MessageEvent) => {
// const response = JSON.parse(event.data);
// console.log('Message from server:', response.id);
// if (response.id != 1) {
// const message = response.choices.map((choice: any) => ({
// _id: uuidv4(), // Ensure unique ID
// text: response.choices[0].message.content,
// createdAt: new Date(), // Use current date as message timestamp
// user: {
// _id: 2, // Replace with the assistant's user ID
// name: 'Assistant', // Replace with assistant's name if needed
// },
// }));
// this.setState((prevState) => ({
// messages: GiftedChat.append(prevState.messages, message),
// }));
// }
// // Transform the server response to GiftedChat messages
// // const message: IMessage[] = response.choices.map((choice: any) => ({
// // _id: uuidv4(), // Ensure unique ID
// // text: choice.message.content,
// // createdAt: new Date(), // Use current date as message timestamp
// // user: {
// // _id: 2, // Replace with the assistant's user ID
// // name: 'Assistant', // Replace with assistant's name if needed
// // },
// // }));
// // console.log(messages, 'AssistantAssistant');
// // this.setState({ messages: [message, ...this.state.messages] });
// // Append the messages to the chat
// // this.setState((prevState) => ({
// // messages: GiftedChat.append(prevState.messages, messages),
// // }));
// };
// ws.onerror = (error: Event) => {
// console.error('WebSocket error:', error);
// };
// ws.onclose = () => {
// console.log('WebSocket closed');
// };
// this.setState({ ws });
}
chatDetailsActioncable = async () => {
const configFrameWork = require('../../../framework/src/config.js');
const hostUrl = configFrameWork.baseURL.substring(8);
let value = await getStorageData('usertoken');
let token = JSON.parse(value);
this.actionCable = ActionCable.createConsumer(`wss://${hostUrl}/cable`, {
headers: {
token,
},
});
console.log('chatDetailsActioncable', this.actionCable);
const cable = new Cable({
channel: `ChatGptChannel`,
});
const channel = cable.setChannel(
`ChatGptChannel`,
this.actionCable.subscriptions.create({
channel: `ChatGptChannel`,
})
);
channel
.on('received', (event: any) => {
this._onRecieved(event);
})
.on('connected', () => {
console.log('connectedconnectedconnected');
})
.on('disconnected', () => {
this.actionCable.disconnect();
});
};
async componentWillUnmount() {
// Clean up the WebSocket connection when the component unmounts
// if (this.state.ws) {
// this.state.ws.close();
// }
}
// Customizable Area End
}
// Customizable Area End
Editor is loading...
Leave a Comment