diff --git a/backend/main.go b/backend/main.go index 3f04e3d..56584eb 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/base64" "encoding/json" "fmt" @@ -134,6 +135,10 @@ func main() { r.Get("/image", func(w http.ResponseWriter, r *http.Request) { userId := r.Header.Get("userId") + w.Header().Add("Access-Control-Allow-Origin", "*") + w.Header().Add("Access-Control-Allow-Credentials", "*") + w.Header().Add("Access-Control-Allow-Headers", "*") + images, err := models.GetUserImages(userId) if err != nil { log.Println(err) @@ -156,6 +161,10 @@ func main() { r.Get("/image/{id}", func(w http.ResponseWriter, r *http.Request) { imageId := r.PathValue("id") + w.Header().Add("Access-Control-Allow-Origin", "*") + w.Header().Add("Access-Control-Allow-Credentials", "*") + w.Header().Add("Access-Control-Allow-Headers", "*") + // TODO: really need authorization here! image, err := models.GetImage(imageId) if err != nil { @@ -188,17 +197,42 @@ func main() { return } - bodyData, err := io.ReadAll(r.Body) - // TODO: check headers - contentType := r.Header.Get("Content-Type") + log.Println(contentType) + + // TODO: length checks on body + // TODO: extract this shit out image := make([]byte, 0) if contentType == "application/base64" { - base64.StdEncoding.Decode(image, bodyData) + decoder := base64.NewDecoder(base64.StdEncoding, r.Body) + buf := &bytes.Buffer{} + + decodedIamge, err := io.Copy(buf, decoder) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "bruh, base64 aint decoding") + return + } + + fmt.Println(string(image)) + fmt.Println(decodedIamge) + + image = buf.Bytes() } else if contentType == "application/oclet-stream" { + bodyData, err := io.ReadAll(r.Body) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "bruh, binary aint binaring") + return + } + // TODO: check headers + image = bodyData } else { + log.Println("bad stuff?") w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, "Bruh, you need oclet stream or base64") return diff --git a/frontend/bun.lockb b/frontend/bun.lockb index e402c1c..e34de90 100755 Binary files a/frontend/bun.lockb and b/frontend/bun.lockb differ diff --git a/frontend/package.json b/frontend/package.json index a904fae..6214062 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,11 +16,13 @@ "dependencies": { "@kobalte/core": "^0.13.9", "@kobalte/tailwindcss": "^0.9.0", + "@solidjs/router": "^0.15.3", "@tabler/icons-solidjs": "^3.30.0", "@tauri-apps/api": "^2", "@tauri-apps/plugin-dialog": "~2", "@tauri-apps/plugin-opener": "^2", "clsx": "^2.1.1", + "fuse.js": "^7.1.0", "solid-js": "^1.9.3", "tailwind-scrollbar-hide": "^2.0.0", "valibot": "^1.0.0-rc.2" diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 007d8b5..fba1292 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,46 +5,52 @@ import clsx from "clsx"; import { ImageViewer } from "./components/ImageViewer"; import { getUserImages } from "./network"; import { image } from "@tauri-apps/api"; +import { A, useNavigate } from "@solidjs/router"; +import Fuse from "fuse.js"; -type Emoji = { - emoji: string; - name: string; -}; +type UserImages = Awaited>; function App() { - const [options, setOptions] = createSignal([]); - const [emoji, setEmoji] = createSignal(null); + const [searchResults, setSearchResults] = createSignal([]); const [images] = createResource(getUserImages); + const nav = useNavigate(); + + let fuze = new Fuse([], { keys: ["Text.ImageText"] }); + + // TODO: there's probably a better way? createEffect(() => { - console.log(images()?.map(image => image.ID)) + const userImages = images(); + if (userImages == null) { + return; + } + + fuze = new Fuse(userImages, { keys: ["Text.ImageText"] }); }); - const emojiData: Emoji[] = [ - { emoji: "😀", name: "Grinning Face" }, - { emoji: "😃", name: "Grinning Face with Big Eyes" }, - { emoji: "😄", name: "Grinning Face with Smiling Eyes" }, - { emoji: "😁", name: "Beaming Face with Smiling Eyes" }, - { emoji: "😆", name: "Grinning Squinting Face" }, - ]; - - const queryEmojiData = (query: string) => { - return emojiData.filter((emoji) => - emoji.name.toLowerCase().includes(query.toLowerCase()), - ); - }; + const onInputChange = (query: string) => { + const searched = fuze.search(query).flatMap(s => s.item).flatMap(s => s.Text ?? []); + setSearchResults(searched); + } return (
setOptions(queryEmojiData(query))} - onChange={(result) => setEmoji(result)} - optionValue="name" - optionLabel="name" + options={searchResults() ?? []} + onInputChange={onInputChange} + onChange={(item) => { + if (item?.ImageID == null) { + console.error("ImageID was null"); + return; + } + + nav(`/image/${item.ImageID}`); + }} + optionValue="ID" + optionLabel="ImageText" placeholder="Search for stuff..." itemComponent={(props) => ( - {props.item.rawValue.emoji} + {props.item.rawValue.ImageText ?? ''} )} @@ -107,7 +113,7 @@ function App() {
{(image) => ( - + )}
diff --git a/frontend/src/ImagePage.tsx b/frontend/src/ImagePage.tsx new file mode 100644 index 0000000..2173ef7 --- /dev/null +++ b/frontend/src/ImagePage.tsx @@ -0,0 +1,36 @@ +import { A, useParams } from "@solidjs/router" +import { createEffect, createResource, For, Suspense } from "solid-js" +import { getUserImages } from "./network" + +export function ImagePage() { + const { imageId } = useParams<{ imageId: string }>() + + const [image] = createResource(async () => { + const userImages = await getUserImages(); + + const currentImage = userImages.find(image => image.ID === imageId); + if (currentImage == null) { + // TODO: this error handling. + throw new Error("must be valid"); + } + + return currentImage; + }); + + createEffect(() => { + console.log(image()); + }) + + return (Loading...}> + Back +

{image()?.Image.ImageName}

+ +
+ + {(tag) => ( +
{tag.Tag}
+ )} +
+
+
) +} diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index e02db44..13e8ce0 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -2,5 +2,12 @@ import { render } from "solid-js/web"; import App from "./App"; import "./index.css"; +import { Route, Router } from "@solidjs/router"; +import { ImagePage } from "./ImagePage"; -render(() => , document.getElementById("root") as HTMLElement); +render(() => ( + + + + +), document.getElementById("root") as HTMLElement);