Index: frontend/src/Auth/Confirm.js
===================================================================
--- frontend/src/Auth/Confirm.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ frontend/src/Auth/Confirm.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,47 @@
+import React, {useEffect, useState} from 'react'
+import {Header} from "../Header";
+import {Modal, notification, Spin} from "antd";
+import {useLocation} from "react-router";
+import {useNavigate, useSearchParams} from "react-router-dom";
+import axios from "axios";
+import env from "../env";
+
+const Confirm = ({setUser, user}) => {
+
+    const history = useNavigate()
+    const [result, setResult] = useState("")
+    const [searchParams, setSearchParams] = useSearchParams();
+
+    useEffect(()=>{
+        const param = searchParams.get("id");
+        if(param==null){
+            setResult("Invalid key");
+            return;
+        }
+        axios.post(env.api+"Users/confirmed?validityString="+param,{},{headers:{Authorization:localStorage.getItem('Auth')}}).then(el => {
+            setResult("Успешно потврдена емаил адреса. Ќе бидете редиректирани за 3 секунди")
+            setUser(user => {return {...user,isConfirmed: true}})
+            setTimeout(()=>{
+                history('/login')
+            },3000)
+        }).catch(er=>{
+            if(er.response.data.includes("Invalid check")){
+                setResult("Невалиден линк")
+            }
+            if(er.response.data.includes("Link expired")){
+                setResult("Линкот е стар. Ве молиме обновете го.")
+            }
+        });
+
+    },[])
+
+    return (
+        <div>
+            <Header/>
+            <div style={{textAlign:'center',margin:'50px'}}>
+                {result == "" ? <Spin/> : <h2>{result}</h2>}
+            </div>
+        </div>
+    )
+}
+export default Confirm;
Index: frontend/src/Auth/Reset.js
===================================================================
--- frontend/src/Auth/Reset.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ frontend/src/Auth/Reset.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,82 @@
+import React, {useEffect, useState} from 'react';
+import {Header} from "../Header";
+import {Button, Form, Input, Modal, notification, Spin} from "antd";
+import axios from "axios";
+import '../App.css'
+import env from "../env";
+import {useNavigate, useSearchParams} from "react-router-dom";
+
+const Reset = () => {
+
+    const [loading, setLoading] = useState(false);
+    const [searchParams, setSearchParams] = useSearchParams();
+
+    const history = useNavigate()
+    const resetPassword = (data) => {
+        setLoading(true)
+        const param = searchParams.get("id");
+        if(param==null){
+            Modal.error({
+                title: 'Невалиден линк',
+            });
+            return;
+        }
+        axios.post(env.api+"Users/reseted",{}, {
+            params: {
+                validityString: param,
+                newPassword: data.password
+            }}).then(el => {
+            setLoading(false)
+            Modal.success({
+                title: 'Успешно потврдена сменета лозинка. Ќе бидете редиректирани за 3 секунди',
+            });
+            setTimeout(()=>{
+                history('/login')
+            },3000)
+        }).catch(er=>{
+            setLoading(false)
+            if(er.response.data.includes("Invalid check")){
+                Modal.error({
+                    title: 'Невалиден линк',
+                });
+            }
+            if(er.response.data.includes("Link expired")){
+                Modal.error({
+                    title: 'Линкот е стар. Ве молиме обновете го.',
+                });
+            }
+        });
+    }
+
+    return (
+        <div>
+            <div style={{width:'100vw',height:'100vh', textAlign:'center',backgroundColor:'#F2F2F2'}}>
+                <div className='center' style={{backgroundColor:'white',padding:'40px', borderRadius:'20px'}}>
+                    <h1 style={{marginBottom:'40px'}}>Ресетирајте ја вашата лозинка</h1>
+                    <Form onFinish={resetPassword}
+                          onFinishFailed={() => Modal.error({title: "Ве молиме пополнете ги задолжителните полиња"})}>
+                        <Form.Item
+                            label="Нова лозинка"
+                            name="password"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Ве молиме внесете ја новата лозинка!',
+                                },
+                            ]}
+                        >
+                            <Input type={'password'}/>
+                        </Form.Item>
+                        <Form.Item>
+                            <Button type="primary" htmlType="submit" loading={loading}>
+                                Прати
+                            </Button>
+                        </Form.Item>
+                    </Form>
+                </div>
+            </div>
+        </div>
+    )
+}
+
+export default Reset;
Index: frontend/src/Auth/SendConfirm.js
===================================================================
--- frontend/src/Auth/SendConfirm.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ frontend/src/Auth/SendConfirm.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,46 @@
+import React, {useEffect} from 'react';
+import {Header} from "../Header";
+import {Button, Spin} from "antd";
+import axios from "axios";
+import env from "../env";
+
+const SendConfirm = ({setUser, user}) => {
+    const logout = () => {
+        localStorage.removeItem('Auth');
+        setUser(false)
+    }
+
+    const sendConfirmationEmail = () => {
+        axios.post(env.api + "Users/confirm", {}, {headers: {Authorization: localStorage.getItem('Auth')}}).then(el => {
+            console.log("sent")
+        }).catch(er => {
+            console.log(er);
+        });
+    }
+    useEffect(()=>{
+        console.log("once")
+        if(user && !user.isConfirmed) {
+            sendConfirmationEmail()
+        }
+    },[])
+
+    return (
+        <div>
+            <Header onClickButton={() => logout()} buttonText={'Одјави се'}/>
+            {!user.isConfirmed ?
+                <div style={{textAlign:'center',margin:'50px'}}>
+                    <h2>За да го користите овој вебсајт потребно е да го потврдите вашиот профил. Мејл за потврда на вашиот профил е пратен на вашата емаил адреса.</h2>
+                    <Button type='primary' onClick={sendConfirmationEmail}>
+                        Прати повторно
+                    </Button>
+                </div>
+                :
+                <div style={{textAlign:'center',margin:'50px'}}>
+                    <h2>Вашиот емаил е веќе потврден.</h2>
+                </div>
+            }
+        </div>
+    )
+}
+
+export default SendConfirm;
Index: frontend/src/Auth/SendReset.js
===================================================================
--- frontend/src/Auth/SendReset.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ frontend/src/Auth/SendReset.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,59 @@
+import React, {useEffect, useState} from 'react';
+import {Header} from "../Header";
+import {Button, Form, Input, Modal, notification, Spin} from "antd";
+import axios from "axios";
+import '../App.css'
+import env from "../env";
+
+const SendReset = () => {
+
+    const [loading, setLoading] = useState(false);
+
+    const sendResetEmail = (data) => {
+        setLoading(true)
+        axios.post(env.api + "Users/reset?email="+data.email, {}).then(el => {
+            setLoading(false);
+            Modal.success({
+                title: 'Инструкции за ресетирање на вашата лозинка се испратени на вашиот мејл',
+            });
+        }).catch(er => {
+            setLoading(false);
+            Modal.error({
+                title: 'Се случи проблем',
+            });
+            console.log(er);
+        });
+    }
+
+    return (
+        <div>
+            <div style={{width:'100vw',height:'100vh', textAlign:'center',backgroundColor:'#F2F2F2'}}>
+                <div className='center' style={{backgroundColor:'white',padding:'40px', borderRadius:'20px'}}>
+                    <h1 style={{marginBottom:'40px'}}>Ресетирајте ја вашата лозинка</h1>
+                    <Form onFinish={sendResetEmail}
+                          onFinishFailed={() => Modal.error({title: "Ве молиме пополнете ги задолжителните полиња"})}>
+                        <Form.Item
+                            label="Емаил"
+                            name="email"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Ве молиме внесете емаил!',
+                                },
+                            ]}
+                        >
+                            <Input/>
+                        </Form.Item>
+                        <Form.Item>
+                            <Button type="primary" htmlType="submit" loading={loading}>
+                                Прати
+                            </Button>
+                        </Form.Item>
+                    </Form>
+                </div>
+            </div>
+        </div>
+    )
+}
+
+export default SendReset;
Index: frontend/src/Auth/auth.js
===================================================================
--- frontend/src/Auth/auth.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
+++ frontend/src/Auth/auth.js	(revision a26f6a1dc0314af7fc65fdabb78f1acbaca506a0)
@@ -0,0 +1,178 @@
+import React, {useState} from 'react'
+import {useNavigate} from "react-router-dom";
+import {Button, Card, Form, Input, Modal, notification} from "antd";
+import { UserOutlined, LockOutlined } from '@ant-design/icons';
+import axios from "axios";
+import '../App.css'
+import env from "../env";
+
+const setAuthCookie = (token) => {
+    localStorage.setItem('Auth','Bearer '+token)
+}
+
+const Login = ({setUser}) => {
+    const history = useNavigate()
+
+    const [loading, setLoading] = useState(false)
+
+    const login = (attr) => {
+        setLoading(true)
+        axios.post(env.api+'Users/login',{email: attr.email, password: attr.password}).then(res => {
+            setAuthCookie(res.data.token)
+            console.log(res.data.token)
+            setUser(res.data)
+            setLoading(false)
+            history(res.data.isAdmin ? '/dashboard' : '/')
+        }).catch(el => {
+            Modal.error({
+                title: 'Погрешен мејл или лозинка',
+            });
+            setLoading(false)
+        })
+    }
+
+    return(
+        <div style={{width:'100vw',height:'100vh', textAlign:'center',backgroundColor:'#F2F2F2'}}>
+            <div className='center'>
+                <Card style={{backgroundColor:'white', width:'100%', borderRadius:'20px'}} className='center'>
+                    <h1>Најави се</h1>
+                    <Form
+                        name="normal_login"
+                        onFinish={res=>login(res)}
+                    >
+                        <Form.Item
+                            name="email"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Внесете мејл',
+                                },
+                                {
+                                    type: 'email',
+                                    message: 'Внесете валиден мејл',
+                                },
+                            ]}
+                        >
+                            <Input prefix={<UserOutlined className="site-form-item-icon" />} placeholder="Email" />
+                        </Form.Item>
+                        <Form.Item
+                            name="password"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Внесете лозинка!',
+                                }
+                            ]}
+                        >
+                            <Input
+                                prefix={<LockOutlined className="site-form-item-icon" />}
+                                type="password"
+                                placeholder="Password"
+                            />
+                        </Form.Item>
+
+                        <Form.Item style={{margin:'0px'}}>
+                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading}>
+                                Log in
+                            </Button>
+                            <div>
+                                Или <a href={"/register"}>регистрирај се!</a>
+                            </div>
+                        </Form.Item>
+                    </Form>
+                </Card>
+            </div>
+        </div>
+    )
+}
+
+const Register = ({setUser}) => {
+
+    const [loading, setLoading] = useState(false)
+    const history = useNavigate()
+    const register = (attr) => {
+        if (attr.password !== attr.confirm) {
+            Modal.error({
+                title: 'Лозинките не се исти',
+            });
+            return;
+        }
+        setLoading(true)
+        axios.post(env.api+'Users/register',{email: attr.email, password: attr.password}).then(res => {
+            setAuthCookie(res.data.token)
+            setUser(res.data)
+            setLoading(false)
+            history('/confirm-email')
+        })
+    }
+    return(
+        <div style={{width:'100vw',height:'100vh', textAlign:'center', backgroundColor:'#F2F2F2'}}>
+            <div className='center'>
+                <Card style={{backgroundColor:'white', width:'100%', borderRadius:'20px'}} className='center'>
+                    <h1>Регистрирај се</h1>
+                    <Form
+                        name="normal_login"
+                        onFinish={(attr)=>register(attr)}
+                    >
+                        <Form.Item
+                            name="email"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Внесете мејл',
+                                },
+                                {
+                                    type: 'email',
+                                    message: 'Внесете валиден мејл',
+                                },
+                            ]}
+                        >
+                            <Input prefix={<UserOutlined className="site-form-item-icon" />} placeholder="Email" />
+                        </Form.Item>
+                        <Form.Item
+                            name="password"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Внесете лозинка!',
+                                },
+                            ]}
+                        >
+                            <Input
+                                prefix={<LockOutlined className="site-form-item-icon" />}
+                                type="password"
+                                placeholder="Password"
+                            />
+                        </Form.Item>
+                        <Form.Item
+                            name="confirm"
+                            rules={[
+                                {
+                                    required: true,
+                                    message: 'Потврдете лозинка!',
+                                },
+                            ]}
+                        >
+                            <Input
+                                prefix={<LockOutlined className="site-form-item-icon" />}
+                                type="password"
+                                placeholder="Confirm password"
+                            />
+                        </Form.Item>
+
+                        <Form.Item style={{margin:'0px'}}>
+                            <Button type="primary" htmlType="submit" className="login-form-button" loading={loading}>
+                                Register
+                            </Button>
+                            <div>
+                                Или <a href={"/login"}>најави се!</a>
+                            </div>
+                        </Form.Item>
+                    </Form>
+                </Card>
+            </div>
+        </div>
+    )
+}
+
+export {Login,Register};
