mirror of
https://github.com/hpware/news-analyze.git
synced 2025-06-23 13:04:23 +00:00
157 lines
4.8 KiB
Vue
157 lines
4.8 KiB
Vue
<script setup lang="ts">
|
|
interface chatInterface {
|
|
index: number;
|
|
id: string;
|
|
message: string;
|
|
user: boolean;
|
|
}
|
|
|
|
import {
|
|
History,
|
|
Plus,
|
|
Send,
|
|
Square,
|
|
User,
|
|
BotMessageSquare,
|
|
} from "lucide-vue-next";
|
|
import { Input } from "~/components/ui/input";
|
|
import blurPageBeforeLogin from "~/components/blurPageBeforeLogin.vue";
|
|
import { v4 as uuidv4 } from "uuid";
|
|
const { t } = useI18n();
|
|
const cookie = useCookie("lastChatId");
|
|
const cookieChatId = cookie.value;
|
|
const chatId = ref();
|
|
const inputMessage = ref();
|
|
const messages = ref<chatInterface[]>([]);
|
|
const messageIndex = ref();
|
|
const aiGenerating = ref(false);
|
|
|
|
// Great, there are now no errors ig
|
|
const emit = defineEmits(["windowopener", "error", "loadValue"]);
|
|
const props = defineProps<{
|
|
values?: string;
|
|
}>();
|
|
|
|
const sendChatData = (event?: KeyboardEvent) => {
|
|
if (event?.shiftKey) return;
|
|
if (inputMessage.value === "") return;
|
|
const userMessage = inputMessage.value;
|
|
inputMessage.value = "";
|
|
messages.value.push({
|
|
index: messageIndex.value,
|
|
id: uuidv4(),
|
|
message: userMessage,
|
|
user: true,
|
|
});
|
|
aiGenerating.value = true;
|
|
setTimeout(() => {
|
|
aiGenerating.value = false;
|
|
}, 3000);
|
|
};
|
|
|
|
const stopChatGenerate = () => {
|
|
aiGenerating.value = false;
|
|
};
|
|
|
|
/*onMounted(async () => {
|
|
console.log(cookieChatId);
|
|
if (cookieChatId) {
|
|
} else {
|
|
const { data: checkUserChatId } = await useFetch(
|
|
"/api/ai/chat/actions/findUserChatId",
|
|
{
|
|
method: "POST",
|
|
body: {
|
|
userid: "393393",
|
|
},
|
|
},
|
|
);
|
|
cookieChatId.value = checkUserChatId.value;
|
|
}
|
|
});*/
|
|
onMounted(async () => {
|
|
/*const {
|
|
data: getData,
|
|
pending,
|
|
error,
|
|
} = useFetch(`/api/ai/chat/${chatId.value}`);*/
|
|
});
|
|
</script>
|
|
<template>
|
|
<blurPageBeforeLogin>
|
|
<div class="flex flex-col h-full">
|
|
<div>
|
|
<div
|
|
class="justify-center align-center text-center flex flex-col sticky top-0 pt-2 min-h-0 border rounded-2xl gray-500/80 backdrop-blur-sm"
|
|
>
|
|
<div class="flex flex-row justify-between p-2">
|
|
<h2 class="text-xl ml-4 text-bold">Chat Name</h2>
|
|
<div class="flex flex-row justify-center align-center text-center">
|
|
<div
|
|
class="flex flex-row justify-center align-center text-center gap-2"
|
|
>
|
|
<button
|
|
class="p-2 rounded-xl hover:bg-gray-300 transition-all duration-400"
|
|
>
|
|
<History class="h-4 w-4" />
|
|
</button>
|
|
<button
|
|
class="p-2 rounded-xl hover:bg-gray-300 transition-all duration-400"
|
|
>
|
|
<Plus class="h-4 w-4" />
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div
|
|
ref="chatContainerRef"
|
|
class="flex-1 overflow-y-auto p-4 space-y-4"
|
|
>
|
|
<div
|
|
v-for="message in messages"
|
|
class="max-w-[80%] rounded-lg p-3 bg-gray-300/70 rounded-xl"
|
|
>
|
|
<div v-if="message.user" class="flex flex-row gap-2">
|
|
<User class="w-5 h-5" />{{ message.message }}
|
|
</div>
|
|
<div v-else class="flex flex-row gap-2">
|
|
<BotMessageSquare class="w-5 h-5" />{{ message.message }}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div
|
|
class="space-x-2 sticky bottom-0 border-t p-2 min-h-0 border rounded-xl gray-500/80 backdrop-blur-sm"
|
|
>
|
|
<div class="text-black w-full flex flex-row">
|
|
<Input
|
|
class="flex-1 rounded-xl"
|
|
placeholder="Type a message..."
|
|
v-model="inputMessage"
|
|
@keyup.enter="sendChatData($event)"
|
|
:disabled="aiGenerating"
|
|
/>
|
|
<button
|
|
class="pl-2 pr-2 mr-1 ml-1 bg-black text-white rounded-full hover:bg-gray-700 hover:translate-y-[-4px] transition-all duration-300 disabled:cursor-not-allowed disabled:hover:translate-y-0 disabled:bg-color-500"
|
|
:disabled="!inputMessage?.trim()"
|
|
@click="sendChatData()"
|
|
v-if="!aiGenerating"
|
|
>
|
|
<Send class="w-5 h-5" />
|
|
</button>
|
|
<button
|
|
class="pl-2 pr-2 mr-1 ml-1 bg-black text-white rounded-full hover:bg-gray-700 hover:translate-y-[-4px] transition-all duration-300 disabled:cursor-not-allowed disabled:hover:translate-y-0 disabled:bg-color-500"
|
|
@click="stopChatGenerate"
|
|
v-else
|
|
>
|
|
<Square class="w-5 h-5" />
|
|
</button>
|
|
</div>
|
|
<span class="text-xs text-center justify-center align-center w-full"
|
|
>Note: AI might create imbalanced views.</span
|
|
>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</blurPageBeforeLogin>
|
|
</template>
|