diff --git a/src/states/Auth/Auth.jsx b/src/states/Auth/Auth.jsx
new file mode 100644
index 0000000..8d6974a
--- /dev/null
+++ b/src/states/Auth/Auth.jsx
@@ -0,0 +1,56 @@
+import "./styles.sass";
+import SheepstarImage from "@/common/images/sheepstar.png";
+import Button from "@/common/components/Button";
+import {useEffect, useState} from "react";
+import {AUTH_URL} from "@/App.jsx";
+import {postRequest} from "@/common/util/RequestUtil.js";
+import {Navigate} from "react-router-dom";
+
+export const Auth = () => {
+ const [externalPopup, setExternalPopup] = useState(null);
+ const [redirect, setRedirect] = useState(false);
+
+ const connectClick = () => {
+ const popup = window.open(AUTH_URL, "Sheepstar - Discord Login", `width=500,height=800`);
+ popup.focus();
+
+ setExternalPopup(popup);
+ }
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ if (localStorage.getItem("code")) {
+ externalPopup?.close();
+ clearInterval(interval);
+ const code = localStorage.getItem("code");
+
+ localStorage.removeItem("code");
+
+ postRequest("/session/create", {code}).then(res => res.json()).then(res => {
+ if (!res.token) return console.error("No token received");
+
+ localStorage.setItem("token", res.token);
+
+ setRedirect(true);
+ });
+ }
+ }, 500);
+
+ return () => {
+ clearInterval(interval);
+ }
+ }, [externalPopup]);
+
+ if (redirect || localStorage.getItem("token")) return
Please login to continue
+ +