Gluing together the frontend and backend
This commit is contained in:
parent
4554ddab6d
commit
d0d1a1dfaa
3 changed files with 56 additions and 10 deletions
|
@ -1,11 +1,9 @@
|
|||
import { useState } from "react";
|
||||
import reactLogo from "./assets/react.svg";
|
||||
import viteLogo from "/vite.svg";
|
||||
import "./App.css";
|
||||
import { CountButton } from "./Components/CountButton";
|
||||
|
||||
function App(): JSX.Element {
|
||||
const [count, setCount] = useState(0);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
|
@ -18,13 +16,7 @@ function App(): JSX.Element {
|
|||
</div>
|
||||
<h1>Vite + React</h1>
|
||||
<div className="card">
|
||||
<button
|
||||
onClick={() => {
|
||||
setCount((count): number => count + 1);
|
||||
}}
|
||||
>
|
||||
count is {count}
|
||||
</button>
|
||||
<CountButton />
|
||||
<p>
|
||||
Edit <code>src/App.tsx</code> and save to test HMR
|
||||
</p>
|
||||
|
|
39
frontend/src/Components/CountButton.tsx
Normal file
39
frontend/src/Components/CountButton.tsx
Normal file
|
@ -0,0 +1,39 @@
|
|||
import { useState, useEffect } from "react";
|
||||
|
||||
// Interface for the response from the server
|
||||
// This should eventually reside in a dedicated file
|
||||
interface CountResponse {
|
||||
pressCount: number;
|
||||
}
|
||||
|
||||
// Some constants for the button
|
||||
const BUTTON_ENDPOINT = "/api/button";
|
||||
|
||||
// A simple button that counts how many times it's been pressed
|
||||
export function CountButton(): JSX.Element {
|
||||
const [count, setCount] = useState<number>(NaN);
|
||||
|
||||
// useEffect with a [] dependency array runs only once
|
||||
useEffect(() => {
|
||||
async function getCount(): Promise<void> {
|
||||
const response = await fetch(BUTTON_ENDPOINT);
|
||||
const data = (await response.json()) as CountResponse;
|
||||
setCount(data.pressCount);
|
||||
}
|
||||
void getCount();
|
||||
}, []);
|
||||
|
||||
// This is what runs on every button click
|
||||
function press(): void {
|
||||
async function pressPost(): Promise<void> {
|
||||
await fetch(BUTTON_ENDPOINT, { method: "POST" });
|
||||
const response = await fetch(BUTTON_ENDPOINT);
|
||||
const data = (await response.json()) as CountResponse;
|
||||
setCount(data.pressCount);
|
||||
}
|
||||
void pressPost();
|
||||
}
|
||||
|
||||
// Return some JSX with the button and associated handler
|
||||
return <button onClick={press}>count is {count}</button>;
|
||||
}
|
|
@ -4,4 +4,19 @@ import react from "@vitejs/plugin-react-swc";
|
|||
// https://vitejs.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
// build: {
|
||||
// outDir: '../server/public' // Override default outDir('dist')
|
||||
// },
|
||||
server: {
|
||||
port: 3000,
|
||||
open: true,
|
||||
proxy: {
|
||||
"/api": {
|
||||
target: "http://localhost:8080/api",
|
||||
changeOrigin: true,
|
||||
secure: false,
|
||||
rewrite: (path): string => path.replace(/^\/api/, ""),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue