fix proxy + file upload

This commit is contained in:
grngxd 2025-06-08 10:05:05 +01:00
parent db68058d5b
commit 5453d49c92
4 changed files with 92 additions and 9 deletions

View file

@ -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",
}),
],
};
});

View file

@ -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",

View file

@ -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,
})
);
};

View file

@ -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<StereoFile[]>([]);
const loaded = useSignal(false);
const uploadingFile = useSignal<NoSerialize<File> | 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 (
<>
<Controlbar />
<a href={OAUTH_LINK}>oauth</a>
<input
onChange$={(e: Event) => {
const target = e.target as HTMLInputElement;
console.log("File input changed:", target.files![0]);
uploadingFile.value = noSerialize(target.files![0]);
}}
type="file"
/>
<button
onClick$={uploadFile}
>
upload
</button>
<div class="grid grid-cols-3 gap-4 p-4">
{/* TODO: make ts better :broken_heart: */}