diff --git a/adapters/static/vite.config.ts b/adapters/static/vite.config.ts new file mode 100644 index 0000000..691408e --- /dev/null +++ b/adapters/static/vite.config.ts @@ -0,0 +1,19 @@ +import { staticAdapter } from "@builder.io/qwik-city/adapters/static/vite"; +import { extendConfig } from "@builder.io/qwik-city/vite"; +import baseConfig from "../../vite.config"; + +export default extendConfig(baseConfig, () => { + return { + build: { + ssr: true, + rollupOptions: { + input: ["@qwik-city-plan"], + }, + }, + plugins: [ + staticAdapter({ + origin: "https://yoursite.qwik.dev", + }), + ], + }; +}); diff --git a/package.json b/package.json index 347affb..4783e19 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "build": "qwik build", "build.client": "vite build", "build.preview": "vite build --ssr src/entry.preview.tsx", + "build.server": "vite build -c adapters/static/vite.config.ts", "build.types": "tsc --incremental --noEmit", "deploy": "echo 'Run \"npm run qwik add\" to install a server adapter'", "dev": "vite --mode ssr", diff --git a/src/routes/api/[path]/index.tsx b/src/routes/api/[path]/index.tsx index 34c113b..033f1d0 100644 --- a/src/routes/api/[path]/index.tsx +++ b/src/routes/api/[path]/index.tsx @@ -4,20 +4,24 @@ const proxy = async ({ send, url, pathname, request }: RequestEvent) => { const targetUrl = new URL(`http://localhost:8081${pathname}`, url); const headers = new Headers(request.headers); - const backendResponse = await fetch(targetUrl, { + const fetchOptions: RequestInit = { method: request.method, headers, - body: request.method !== 'GET' && request.method !== 'HEAD' ? request.body : undefined, redirect: 'manual', - }); + }; - console.log(`Proxying ${request.method} request to: ${targetUrl.href}`); + if (request.method !== 'GET' && request.method !== 'HEAD') { + fetchOptions.body = request.body; + (fetchOptions as any).duplex = 'half'; + } + + const res = await fetch(targetUrl, fetchOptions); send( - new Response(backendResponse.body, { - status: backendResponse.status, - statusText: backendResponse.statusText, - headers: backendResponse.headers, + new Response(res.body, { + status: res.status, + statusText: res.statusText, + headers: res.headers, }) ); }; diff --git a/src/routes/index.tsx b/src/routes/index.tsx index 928a264..c2ca541 100644 --- a/src/routes/index.tsx +++ b/src/routes/index.tsx @@ -1,4 +1,4 @@ -import { component$, useSignal, useVisibleTask$ } from "@builder.io/qwik"; +import { $, component$, noSerialize, NoSerialize, useSignal, useTask$, useVisibleTask$ } from "@builder.io/qwik"; import type { DocumentHead } from "@builder.io/qwik-city"; import ky from "ky"; import Controlbar from "~/components/Controlbar"; @@ -11,6 +11,9 @@ import { StereoFile } from "~/lib/types"; export default component$(() => { const files = useSignal([]); const loaded = useSignal(false); + + const uploadingFile = useSignal | undefined>(); + useVisibleTask$(async () => { const res: StereoFile[] | undefined = await ky.get("/api/list", { @@ -23,10 +26,66 @@ export default component$(() => { loaded.value = true; }) + useTask$(({ track }) => { + track(() => uploadingFile.value); + console.log("File input changed:", uploadingFile.value); + }); + + const uploadFile = $( + async () => { + if (!uploadingFile.value) { + console.error("No file selected for upload."); + return; + } + + const formData = new FormData(); + formData.append("file", uploadingFile.value as File); + + try { + const response = await ky.post("/api/upload", { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}` + }, + body: formData + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const res: StereoFile = await response.json(); + files.value.push(res); + + loaded.value = false; + files.value = await ky.get("/api/list", { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}` + } + }).json(); + loaded.value = true; + + } catch (e) { console.error(e) } + } + ) + return ( <> oauth + { + const target = e.target as HTMLInputElement; + console.log("File input changed:", target.files![0]); + uploadingFile.value = noSerialize(target.files![0]); + }} + type="file" + /> + +
{/* TODO: make ts better :broken_heart: */}