diff --git a/login.go b/login.go
index 216cb97..f09506d 100644
--- a/login.go
+++ b/login.go
@@ -8,6 +8,7 @@ import (
"fmt"
"io"
"net/http"
+ "time"
"github.com/gofiber/fiber/v2"
)
@@ -15,6 +16,7 @@ import (
const EDGEDB_AUTH_BASE_URL = "http://127.0.0.1:10700/db/main/ext/auth"
func generatePKCE() (string, string) {
+ fmt.Println("Generating PKCE")
verifier := make([]byte, 32)
_, err := rand.Read(verifier)
if err != nil {
@@ -22,7 +24,16 @@ func generatePKCE() (string, string) {
}
challenge := sha256.Sum256(verifier)
- return base64.RawURLEncoding.EncodeToString(verifier), base64.RawURLEncoding.EncodeToString(challenge[:])
+
+ var URLEncoding = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_")
+ var RawURLEncoding = URLEncoding.WithPadding(base64.NoPadding)
+ encodedVerifier := RawURLEncoding.EncodeToString(verifier)
+ encodedChallenge := RawURLEncoding.EncodeToString(challenge[:])
+
+ fmt.Println("verifier: " + encodedVerifier)
+ fmt.Println("challenge: " + encodedChallenge)
+
+ return encodedVerifier, encodedChallenge
}
func handleUiSignIn(c *fiber.Ctx) error {
@@ -31,18 +42,13 @@ func handleUiSignIn(c *fiber.Ctx) error {
fmt.Println("handleUiSignIn verifier: " + verifier)
fmt.Println("handleUiSignIn challenge: " + challenge)
- redirectURL := fmt.Sprintf("%s/ui/signin?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge)
+ cookie := new(fiber.Cookie)
+ cookie.Name = "jade-edgedb-pkce-verifier"
+ cookie.Value = verifier
+ cookie.Expires = time.Now().Add(10 * time.Minute)
+ c.Cookie(cookie)
- c.Cookie(&fiber.Cookie{
- Name: "jade-edgedb-pkce-verifier",
- Value: verifier,
- HTTPOnly: true,
- Path: "/",
- Secure: true,
- SameSite: "Strict",
- })
-
- return c.Redirect(redirectURL, fiber.StatusMovedPermanently)
+ return c.Redirect(fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge), fiber.StatusTemporaryRedirect)
}
func handleUiSignUp(c *fiber.Ctx) error {
@@ -51,30 +57,13 @@ func handleUiSignUp(c *fiber.Ctx) error {
fmt.Println("handleUiSignUp verifier: " + verifier)
fmt.Println("handleUiSignUp challenge: " + challenge)
- redirectURL := fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge)
+ cookie := new(fiber.Cookie)
+ cookie.Name = "jade-edgedb-pkce-verifier"
+ cookie.Value = verifier
+ cookie.Expires = time.Now().Add(10 * time.Minute)
+ c.Cookie(cookie)
- c.Cookie(&fiber.Cookie{
- Name: "jade-edgedb-pkce-verifier",
- Value: verifier,
- HTTPOnly: true,
- Path: "/",
- Secure: true,
- SameSite: "Strict",
- })
-
- return c.Redirect(redirectURL, fiber.StatusMovedPermanently)
-}
-
-func handleCallbackSignup(c *fiber.Ctx) error {
- code := c.Query("code")
- fmt.Println("Callback signup code: " + code)
-
- verifier := c.Cookies("jade-edgedb-pkce-verifier")
- if verifier == "" {
- return c.Status(fiber.StatusBadRequest).SendString("Could not find 'verifier' in the cookie store. Is this the same user agent/browser that started the authorization flow?")
- }
-
- return c.SendString("OK")
+ return c.Redirect(fmt.Sprintf("%s/ui/signup?challenge=%s", EDGEDB_AUTH_BASE_URL, challenge), fiber.StatusTemporaryRedirect)
}
func handleCallback(c *fiber.Ctx) error {
@@ -93,6 +82,7 @@ func handleCallback(c *fiber.Ctx) error {
fmt.Println("handleCallback verifier: " + verifier)
codeExchangeURL := fmt.Sprintf("%s/token?code=%s&verifier=%s", EDGEDB_AUTH_BASE_URL, code, verifier)
+ fmt.Println("codeExchangeURL: " + codeExchangeURL)
resp, err := http.Get(codeExchangeURL)
if err != nil {
return c.Status(fiber.StatusBadRequest).SendString(fmt.Sprintf("Error from the auth server: %s", err.Error()))
diff --git a/main.go b/main.go
index 1d27929..9bf8d42 100644
--- a/main.go
+++ b/main.go
@@ -42,10 +42,9 @@ func main() {
app.Get("/generateMultipleMessages", GenerateMultipleMessages) // Generate multiple messages
app.Get("/messageContent", GetMessageContentHandler)
- app.Get("/auth/ui/signin", handleUiSignIn)
- app.Get("/auth/ui/signup", handleUiSignUp)
- app.Get("/auth/callback", handleCallback)
- app.Get("/auth/callbackSignup", handleCallbackSignup)
+ app.Get("/signin", handleUiSignIn)
+ app.Get("/signup", handleUiSignUp)
+ app.Get("/callback", handleCallback)
app.Get("test", func(c *fiber.Ctx) error {
fmt.Println("test")
diff --git a/static/animations.css b/static/animations.css
new file mode 100644
index 0000000..349d15e
--- /dev/null
+++ b/static/animations.css
@@ -0,0 +1,17 @@
+.message-bot.htmx-added {
+ opacity: 0;
+}
+
+.message-bot {
+ opacity: 1;
+ transition: opacity 1s ease-out;
+}
+
+.message-user.htmx-added {
+ opacity: 0;
+}
+
+.message-user {
+ opacity: 1;
+ transition: opacity 1s ease-out;
+}
\ No newline at end of file
diff --git a/static/style.css b/static/style.css
new file mode 100644
index 0000000..3a511f3
--- /dev/null
+++ b/static/style.css
@@ -0,0 +1,109 @@
+.my-indicator {
+ display: none;
+}
+
+.htmx-request .my-indicator {
+ display: inline;
+}
+
+.htmx-request.my-indicator {
+ display: inline;
+}
+
+svg text {
+ font-family: 'Russo One', sans-serif;
+ text-transform: uppercase;
+ fill: #000;
+ stroke: #000;
+ font-size: 240px;
+}
+
+.message-content {
+ background-color: #303030;
+ border-radius: 5px;
+ padding: 10px;
+}
+
+#chat-messages .message-content pre {
+ overflow-x: auto;
+ white-space: pre;
+ max-width: 662px;
+}
+
+#chat-messages .message-content pre code {
+ display: inline-block;
+ min-width: 100%;
+ white-space: inherit;
+}
+
+.content {
+ font-size: 14px;
+ line-height: 1.5;
+ color: #ffffff;
+}
+
+.content pre {
+ font-family: monospace;
+ background-color: #363636 !important;
+ border-radius: 3px;
+}
+
+#chat-messages {
+ max-width: 780px;
+ margin: auto;
+ width: 95%;
+ margin-bottom: 180px;
+}
+
+#chat-input-form {
+ max-width: 900px;
+ margin: auto;
+ width: 98%;
+}
+
+:root {
+ --bulma-body-background-color: #202020;
+ --bulma-primary: #126d0f;
+}
+
+body,
+html {
+ height: 100%;
+ margin: 0;
+}
+
+.chat-input-container {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ position: fixed;
+ bottom: 10px;
+ left: 0;
+ right: 0;
+ padding: 10px;
+ max-width: 800px;
+ margin: 0 auto;
+ z-index: 1;
+}
+
+.textarea-wrapper {
+ position: relative;
+ width: 100%;
+}
+
+.textarea {
+ width: 100%;
+ padding-right: 140px;
+ /* Adjust this value based on the button and dropdown width */
+ box-sizing: border-box;
+}
+
+.button-group {
+ position: absolute;
+ bottom: 10px;
+ right: 10px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
\ No newline at end of file
diff --git a/utils.go b/utils.go
index f0433b0..39918ca 100644
--- a/utils.go
+++ b/utils.go
@@ -18,6 +18,7 @@ func markdownToHTML(markdownText string) string {
if err := md.Convert([]byte(markdownText), &buf); err != nil {
panic(err) // Handle the error appropriately
}
+
return buf.String()
}
diff --git a/views/chat.html b/views/chat.html
index d7bd512..c1a69b5 100644
--- a/views/chat.html
+++ b/views/chat.html
@@ -2,7 +2,6 @@