-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Expand file tree
/
Copy pathmain.ts
More file actions
117 lines (98 loc) · 3.65 KB
/
main.ts
File metadata and controls
117 lines (98 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { initializeApp } from "firebase/app";
import { firebaseConfig, RECAPTCHA_ENTERPRISE_SITE_KEY } from "./config";
import {
initializeAppCheck,
ReCaptchaEnterpriseProvider,
} from "firebase/app-check";
import {
getFunctions,
httpsCallable,
connectFunctionsEmulator,
} from "firebase/functions";
// Set to true to test in emulator.
const testMode = true;
// Use showdown to convert Gemini-provided Markdown to HTML
import { Converter } from "showdown";
const converter = new Converter();
// Set up output elements.
const outputDiv = document.createElement("div");
document.body.appendChild(outputDiv);
// Initialize Firebase app.
const app = initializeApp(firebaseConfig);
// Initialize App Check.
initializeAppCheck(app, {
provider: new ReCaptchaEnterpriseProvider(RECAPTCHA_ENTERPRISE_SITE_KEY),
});
// Define callVertexWithRC as a call to the callVertexWithRC function.
const callVertexWithRC = httpsCallable(getFunctions(), "callVertexWithRC", {
limitedUseAppCheckTokens: true,
});
// Enable emulator so that it can be used in test mode.
const functions = getFunctions(app, "us-central1"); // Replace with your region
if (testMode) {
connectFunctionsEmulator(functions, "localhost", 5001);
}
// Generate body for index.html.
document.body.innerHTML += `
<div id="waitingMessage"></div>
<div id="generatedText"></div>
<div id="errorMessage"></div>
<br/>
<form id="promptForm">
<label for="promptInput">Ask Gemini a question!</label><br>
<input type="text" id="promptInput" name="prompt"><br><br>
<input type="submit" value="Submit">
</form>
`;
const promptForm = document.getElementById("promptForm") as HTMLFormElement;
promptForm.addEventListener("submit", async (event) => {
event.preventDefault();
const promptInput = document.getElementById(
"promptInput"
) as HTMLInputElement;
const prompt = promptInput.value;
const waitingMessageElement = document.getElementById("waitingMessage");
// Define a variable to keep track of the number of dots
let dotCount = 0;
// Set interval to add dots every second
const intervalId = setInterval(() => {
// Increment dotCount
dotCount = (dotCount + 1) % 7;
const dots = ".".repeat(dotCount);
waitingMessageElement.textContent = "Waiting for response" + dots;
}, 1000);
const errorMessageElement = document.getElementById("errorMessage");
errorMessageElement.textContent = "";
try {
const { data } = await callVertexWithRC({ prompt });
const generatedTextElement = document.getElementById("generatedText"); // Access the element
const htmlContent = converter.makeHtml(data);
if (!generatedTextElement) {
throw new Error("Missing generated text.");
}
generatedTextElement.innerHTML = htmlContent; // Set the element's content
waitingMessageElement.textContent = "";
errorMessageElement.textContent = "";
} catch (error) {
errorMessageElement.textContent = "Error calling function: " + error.message;
waitingMessageElement.textContent = "";
}
// Clear welcome dots.
clearInterval(intervalId);
});