();
+
+ useEffect(() => {
+ const token = localStorage.getItem("token")
+ if (token) {
+ axios.post("/api/auth/me", {
+ token: token
+ }).then((res) => {
+ setUser(res.data)
+ }).catch((err) => {
+ console.error(err)
+ })
+ }
+
+ axios.get("/api/channels").then((res) => {
+ setChannels(res.data)
+ }).catch((err) => {
+ console.error(err)
+ })
+ }, [])
+
return (
Home
+ {user ? (
+
+
Welcome {user.username}
+
+
+ ) : (
+
+ Login
+ Register
+
+ )}
+
Channels
+
+ {channels?.map((channel) => (
+ -
+ {channel.name}
+
+ ))}
+
)
}
\ No newline at end of file
diff --git a/front/src/pages/Login.tsx b/front/src/pages/Login.tsx
new file mode 100644
index 0000000..4379897
--- /dev/null
+++ b/front/src/pages/Login.tsx
@@ -0,0 +1,45 @@
+import axios from "axios";
+import { useState } from "react";
+import { useNavigate, Link } from "react-router-dom";
+
+export default function Login() {
+ const [username, setUsername] = useState("");
+ const [password, setPassword] = useState("");
+ const navigate = useNavigate();
+
+ function handleSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ axios
+ .post("/api/auth/login", { username, password })
+ .then((res) => {
+ localStorage.setItem("token", res.data.token);
+ navigate("/");
+ })
+ .catch((err) => {
+ alert(err.response.data.message);
+ });
+ }
+
+ return (
+
+ Home
+
Login
+
+ Register
+
+ );
+}
\ No newline at end of file
diff --git a/front/src/pages/Register.tsx b/front/src/pages/Register.tsx
new file mode 100644
index 0000000..31f7a9a
--- /dev/null
+++ b/front/src/pages/Register.tsx
@@ -0,0 +1,47 @@
+import axios from "axios";
+import { useState } from "react";
+import { useNavigate, Link } from "react-router-dom";
+
+export default function Register () {
+ const [username, setUsername] = useState("");
+ const [password, setPassword] = useState("");
+ const navigate = useNavigate();
+
+ function handleSubmit(e: React.FormEvent) {
+ e.preventDefault();
+ axios.post("/api/auth/register", { username, password });
+ axios
+ .post("/api/auth/login", { username, password })
+ .then((res) => {
+ localStorage.setItem("token", res.data.token);
+ navigate("/");
+ })
+ .catch((err) => {
+ alert(err.response.data.message);
+ }
+ );
+ }
+
+ return (
+
+ Home
+
Register
+
+ Login
+
+ );
+}
\ No newline at end of file
diff --git a/front/src/types.tsx b/front/src/types.tsx
new file mode 100644
index 0000000..02a2d8c
--- /dev/null
+++ b/front/src/types.tsx
@@ -0,0 +1,22 @@
+export type Channel_type ={
+ id: number,
+ name: string
+ description: string
+}
+
+export type Channels = Channel_type[]
+
+export type Message = {
+ id: number,
+ user_id: number,
+ username: string,
+ content: string,
+ date: number
+}
+
+export type Messages = Message[]
+
+export type User = {
+ id: number,
+ username: string
+}