hiento09 86f0ffc7d1
Chore/disable submodule (#56)
* Chore disable git submodule for web-client and app-backend

* Chore add newest source code of app-backend and web-client

---------

Co-authored-by: Hien To <tominhhien97@gmail.com>
2023-09-05 16:29:07 +07:00

147 lines
4.1 KiB
TypeScript

import SendButton from "../SendButton";
import { ChangeEvent, useEffect, useState } from "react";
import { useStore } from "@/_models/RootStore";
import { AiModelType } from "@/_models/Product";
import Image from "next/image";
import { observer } from "mobx-react-lite";
import useGetCurrentUser from "@/_hooks/useGetCurrentUser";
import useSignIn from "@/_hooks/useSignIn";
import { useMutation } from "@apollo/client";
import {
CreateMessageDocument,
CreateMessageMutation,
GenerateImageMutation,
GenerateImageDocument,
} from "@/graphql";
type Props = {
prefillPrompt: string;
};
export const InputToolbar: React.FC<Props> = observer(({ prefillPrompt }) => {
const { historyStore } = useStore();
const [text, setText] = useState(prefillPrompt);
const { user } = useGetCurrentUser();
const { signInWithKeyCloak } = useSignIn();
const [createMessageMutation] = useMutation<CreateMessageMutation>(
CreateMessageDocument
);
const [imageGenerationMutation] = useMutation<GenerateImageMutation>(
GenerateImageDocument
);
useEffect(() => {
setText(prefillPrompt);
}, [prefillPrompt]);
const handleMessageChange = (event: any) => {
setText(event.target.value);
};
const onSubmitClick = () => {
if (!user) {
signInWithKeyCloak();
return;
}
if (text.trim().length === 0) return;
historyStore.sendMessage(
createMessageMutation,
imageGenerationMutation,
text,
user.id,
user.displayName,
user.avatarUrl
);
setText("");
};
const handleKeyDown = (event: any) => {
if (event.key === "Enter") {
if (!event.shiftKey) {
event.preventDefault();
onSubmitClick();
}
}
};
let shouldDisableSubmitButton = false;
if (historyStore.getActiveConversation()?.isWaitingForModelResponse) {
shouldDisableSubmitButton = true;
}
if (text.length === 0) {
shouldDisableSubmitButton = true;
}
const onAdvancedPrompt = () => {
historyStore.toggleAdvancedPrompt();
};
const handleResize = (event: ChangeEvent<HTMLTextAreaElement>) => {
event.target.style.height = "auto";
event.target.style.height = event.target.scrollHeight + "px";
};
const shouldShowAdvancedPrompt =
historyStore.getActiveConversation()?.product?.type ===
AiModelType.ControlNet ?? false;
return (
<div
className={`${
historyStore.showAdvancedPrompt ? "hidden" : "block"
} mb-3 flex-none overflow-hidden w-full shadow-sm ring-1 ring-inset ring-gray-300 rounded-lg dark:bg-gray-800`}
>
<div className="overflow-hidden">
<label htmlFor="comment" className="sr-only">
Add your comment
</label>
<textarea
onKeyDown={handleKeyDown}
value={text}
onChange={handleMessageChange}
onInput={handleResize}
rows={2}
name="comment"
id="comment"
className="block w-full scroll resize-none border-0 bg-transparent py-1.5 text-gray-900 transition-height duration-200 placeholder:text-gray-400 sm:text-sm sm:leading-6 dark:text-white"
placeholder="Add your comment..."
/>
</div>
<div
style={{
backgroundColor: "#F8F8F8",
borderWidth: 1,
borderColor: "#D1D5DB",
}}
className="flex justify-between py-2 pl-3 pr-2 rounded-b-lg"
>
{shouldShowAdvancedPrompt && (
<button
onClick={onAdvancedPrompt}
className="flex items-center gap-1 py-[1px]"
>
<Image
src={"/icons/ic_setting.svg"}
width={20}
height={20}
alt=""
/>
<span className="text-sm leading-5 text-gray-600">Advanced</span>
</button>
)}
<div className="flex justify-end items-center space-x-1 w-full pr-3" />
<div className="flex-shrink-0">
{!shouldShowAdvancedPrompt && (
<SendButton
onClick={onSubmitClick}
disabled={shouldDisableSubmitButton}
/>
)}
</div>
</div>
</div>
);
});