Index: components/admin/Complaints.jsx
===================================================================
--- components/admin/Complaints.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
+++ components/admin/Complaints.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
@@ -0,0 +1,143 @@
+import React from 'react'
+
+import { useEffect } from 'react';
+
+import { useSelector, useDispatch } from 'react-redux'
+
+import axios from 'axios';
+import { setAdminInformation } from '../../redux/reducers/adminInformationSlice';
+import { setAdmin } from '../../redux/reducers/adminSlice';
+import { setStyle } from '../../redux/reducers/styleSlice';
+
+const Complaints = () => {
+  const dispatch = useDispatch();
+
+  const styleState = useSelector(state => state.style);
+  const adminState = useSelector(state => state.admin);
+  const adminInformationState = useSelector(state => state.adminInformation);
+
+  useEffect(() => {
+    axios.get(`/api/postgre?action=get_complaints_as_admin&admin_id=${localStorage.CAESSINO_ADMIN_ID}`).then(res => {
+      if (res.data?.success) {
+        dispatch(setAdminInformation({
+          ...adminInformationState.adminInformation,
+          complaints: res.data?.complaints,
+        }))
+      }
+    })
+  }, [])
+  
+  function hideComplaintsScreen() {
+    dispatch(setAdmin({
+      ...adminState.admin,
+      displays: {
+        ...adminState.admin.displays,
+        complaintsScreen: false,
+      }
+    }))
+  }
+
+  function answerComplaint(idx) {
+    dispatch(setAdminInformation({
+      ...adminInformationState.adminInformation,
+      answeringComplaintIndex: idx,
+      answerForComplaint: '',
+    }))
+  }
+
+  function sendAnswer(complaint) {
+    axios.post(`/api/postgre`, {
+      action: 'send_complaint_answer_as_admin',
+      admin_id: localStorage.CAESSINO_ADMIN_ID,
+      complaint: {
+        ...complaint,
+        answer: adminInformationState.adminInformation.answerForComplaint,
+      }
+    }).then(res => {
+      if (res.data?.success) {
+        dispatch(setAdminInformation({
+          ...adminInformationState.adminInformation,
+          complaints: res.data?.complaints,
+          answerForComplaint: '',
+        }))
+
+        dispatch(setStyle({
+          ...styleState.style,
+          notification: {
+            show: true,
+            text: 'Answer sent successfully',
+            status: 'success',
+          },
+        }))
+      }
+    });
+  }
+
+  function onChangeAnswer(e) {
+    dispatch(setAdminInformation({
+      ...adminInformationState.adminInformation,
+      answerForComplaint: e.target.value,
+    }))
+  }
+
+  return (
+    <div className="fullscreen top-to-bottom-centered admin complaintsScreen">
+      <div>
+          <p className="link" onClick={() => hideComplaintsScreen()}>⬅ Go Back</p>
+
+          <h3>These are the complaints sent by players. You can answer them, and an email will be sent to the player so that he knows his complaint has been listened to.</h3>
+
+          { adminInformationState.adminInformation?.complaints?.map(function(complaint, complaintIndex) {
+            if (complaint.answered === "false") return (
+              <div className='complaint' key={complaint.by + complaint.description.substr(0, 20)}>
+                <div>
+                  <p>By: {complaint.by}</p>
+                  <p>Date: {new Date(complaint.date).toGMTString()}</p>
+                  <div>
+                    { adminInformationState.adminInformation.answeringComplaintIndex !== complaintIndex &&
+                      <button className='primaryButton' onClick={() => answerComplaint(complaintIndex)}>Answer Complaint</button>
+                    }
+                  </div>
+                </div>
+                <div>
+                  <textarea readOnly value={complaint.description}></textarea>
+                </div>
+                { adminInformationState.adminInformation.answeringComplaintIndex === complaintIndex && (
+                  <div className="answering">
+                    <p>Your answer:</p>
+                    <textarea value={adminInformationState.adminInformation.answerForComplaint} onChange={(e) => onChangeAnswer(e)} placeholder="Post your answer here admin."></textarea>
+                    <div>
+                      <button className='secondaryButton' onClick={() => sendAnswer(complaint)}>Send Your Answer</button>
+                    </div>
+                  </div>
+                )}
+              </div>
+            )}
+          )}
+
+          { adminInformationState.adminInformation?.complaints?.map(function(complaint, complaintIndex) {
+            if (complaint.answered === "true") return (
+              <div className='complaint' key={complaint.by + complaint.description.substr(0, 20)}>
+                <div>
+                  <p>By: {complaint.by}</p>
+                  <p>Date: {new Date(complaint.date).toGMTString()}</p>
+                  <div>
+                    <p>Answered</p>
+                  </div>
+                </div>
+                <div>
+                  <textarea readOnly value={complaint.description}></textarea>
+                </div>
+                <div className="answering">
+                  <p>Your answer:</p>
+                  <textarea readOnly value={complaint.answer}></textarea>
+                </div>
+              </div>
+            )}
+          )}
+      </div>
+    </div>
+  )
+}
+
+export default Complaints
Index: components/admin/Dashboard.jsx
===================================================================
--- components/admin/Dashboard.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
+++ components/admin/Dashboard.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
@@ -0,0 +1,46 @@
+import React from 'react'
+
+import { useDispatch, useSelector } from 'react-redux'
+import { setAdmin } from '../../redux/reducers/adminSlice';
+
+const Dashboard = () => {
+  const dispatch = useDispatch();
+
+  const adminState = useSelector(state => state.admin);
+
+  function seeComplaints() {
+    dispatch(setAdmin({
+      ...adminState.admin,
+      displays: {
+        ...adminState.admin.displays,
+        complaintsScreen: true,
+      }
+    }))
+  }
+
+  function seeLiveGames() {
+    dispatch(setAdmin({
+      ...adminState.admin,
+      displays: {
+        ...adminState.admin.displays,
+        liveGamesScreen: true,
+      }
+    }))
+  }
+
+  return (
+    <div className="fullscreen fs-centered admin dashboardScreen">
+        <div className="fs-inputs-container">
+            <div>
+                <span>Hello Admin</span>
+                <div>
+                  <button className="primaryButton" onClick={() => seeComplaints()}>See complaints</button>
+                  <button className="primaryButton" onClick={() => seeLiveGames()}>See live games</button>
+                </div>
+            </div>
+        </div>
+    </div>
+  )
+}
+
+export default Dashboard
Index: components/admin/LiveGames.jsx
===================================================================
--- components/admin/LiveGames.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
+++ components/admin/LiveGames.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
@@ -0,0 +1,56 @@
+import React from 'react'
+
+import { useEffect } from 'react';
+
+import { useSelector, useDispatch } from 'react-redux'
+
+import axios from 'axios';
+import { setAdminInformation } from '../../redux/reducers/adminInformationSlice';
+import { setAdmin } from '../../redux/reducers/adminSlice';
+
+const LiveGames = () => {
+  const dispatch = useDispatch();
+
+  const adminState = useSelector(state => state.admin);
+  const adminInformationState = useSelector(state => state.adminInformation);
+
+  useEffect(() => {
+    axios.get(`/api/postgre?action=get_live_games_as_admin&admin_id=${localStorage.CAESSINO_ADMIN_ID}`).then(res => {
+      if (res.data?.success) {
+        dispatch(setAdminInformation({
+          ...adminInformationState.adminInformation,
+          complaints: res.data?.complaints,
+        }))
+      }
+    })
+  }, [])
+  
+  function hideLiveGamesScreen() {
+    dispatch(setAdmin({
+      ...adminState.admin,
+      displays: {
+        ...adminState.admin.displays,
+        liveGamesScreen: false,
+      }
+    }))
+  }
+
+  return (
+    <div className="fullscreen top-to-bottom-centered admin complaintsScreen">
+      <div>
+          <p className="link" onClick={() => hideLiveGamesScreen()}>⬅ Go Back</p>
+
+          <h3>These are the current live games. You can click on one to see more details about it.</h3>
+
+          { adminInformationState.complaints?.map(complaint => (
+            <div key={complaint.by + complaint.description.substr(0, 20)}>
+              { complaint.by }
+              { complaint.description }
+            </div>
+          )) }
+      </div>
+    </div>
+  )
+}
+
+export default LiveGames
Index: components/admin/Login.jsx
===================================================================
--- components/admin/Login.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
+++ components/admin/Login.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
@@ -0,0 +1,119 @@
+import React from 'react'
+
+import { useSelector, useDispatch } from 'react-redux'
+
+import { useRef } from 'react'
+
+import { setAdmin } from '../../redux/reducers/adminSlice';
+import { setStyle } from '../../redux/reducers/styleSlice';
+
+import axios from 'axios';
+
+const Login = () => {
+    const ref = useRef(null);
+
+    const dispatch = useDispatch();
+
+    const adminState = useSelector(state => state.admin);
+    const styleState = useSelector(state => state.style);
+
+    setTimeout(() => {
+        if (adminState.admin.displays.setFocus) {
+            if (ref !== null && ref.current !== null) {
+                ref.current.focus();
+            }
+
+            dispatch(setAdmin({
+                ...adminState.admin,
+                displays: {
+                    ...adminState.admin.displays,
+                    setFocus: false
+                }
+            }))
+        }
+    }, 10);
+
+    function onChangeUsername(e) {
+        dispatch(setAdmin({
+            ...adminState.admin,
+            inputControls: {
+                ...adminState.admin.inputControls,
+                username: e.target.value,
+            }
+        }))
+    }
+
+    function onChangePassword(e) {
+        dispatch(setAdmin({
+            ...adminState.admin,
+            inputControls: {
+                ...adminState.admin.inputControls,
+                password: e.target.value,
+            }
+        }))
+    }
+
+    function keyUp(e) {
+        if (e.key === 'Enter') {
+            login();
+        }
+    }
+
+    function login() {
+        dispatch(setStyle({
+            ...styleState.style,
+            displayLoadingScreen: true,
+        }))
+
+        axios.post(`/api/postgre`, {
+            action: 'login_as_admin',
+            username: adminState.admin.inputControls.username,
+            password: adminState.admin.inputControls.password,
+        })
+            .then(res => {
+                if (res.data?.success) {
+                    localStorage.CAESSINO_ADMIN_ID = res.data?.session?.id;
+
+                    dispatch(setAdmin({
+                        ...adminState.admin,
+                        session_id: res.data?.session?.id,
+                        inlineAlertText: '',
+                        inputControls: {
+                            username: '',
+                            password: '',
+                        }
+                    }))                    
+                }
+                else {
+                    dispatch(setAdmin({
+                        ...adminState.admin,
+                        inlineAlertText: res.data?.message,
+                    }));
+                }
+                
+                dispatch(setStyle({
+                    ...styleState.style,
+                    displayLoadingScreen: false,
+                }))
+            })
+    }
+
+    return (
+        <div className="fullscreen fs-centered admin loginScreen">
+            <div className="fs-inputs-container">
+                <div>
+                    {adminState.admin.inlineAlertText.length > 0 && <span className="inlineAlert">{adminState.admin.inlineAlertText}</span>}
+                    <span>Username:</span>
+                    <input ref={ref} type="text" onChange={(e) => {onChangeUsername(e)}} onKeyUp={(e) => keyUp(e)} value={adminState.admin.inputControls.username} placeholder="admin"/>
+                    <span>Password:</span>
+                    <input type="password" onChange={(e) => {onChangePassword(e)}} onKeyUp={(e) => keyUp(e)} value={adminState.admin.inputControls.password} placeholder="****************"/>
+                    <div style={{width: '100%', display: 'flex', flexDirection: 'row', justifyContent: 'flex-end'}}>
+                        <button className="secondaryButton" onClick={() => login()}>Log In as Admin</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    )
+}
+
+export default Login
Index: components/blackjack/BlackjackHeader.jsx
===================================================================
--- components/blackjack/BlackjackHeader.jsx	(revision e007fcdfa1962fb2f1a22d233c554eec360f982b)
+++ components/blackjack/BlackjackHeader.jsx	(revision e90323425d07a533dfc916a6cd7c156c1cc2b8f6)
@@ -60,6 +60,4 @@
                     axios.get(`/api/blackjack?action=update_state&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(newRes => {
                         if (newRes.data?.success) {
-                            console.log(newRes.data);
-
                             dispatch(setBlackjackGame(newRes.data?.blackjackGame))
 
