Skip to content

Commit

Permalink
Merge pull request #163 from SCCapstone/dev
Browse files Browse the repository at this point in the history
Merge dev
  • Loading branch information
epadams authored Dec 7, 2023
2 parents 52c2196 + 187626f commit e236ce2
Show file tree
Hide file tree
Showing 8 changed files with 160 additions and 8 deletions.
4 changes: 2 additions & 2 deletions FU.API/FU.API/Services/PostService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public async Task JoinPost(int postId, ApplicationUser user)
var userId = user.UserId;

// Check that the post is not full
if (post.MaxPlayers >= chat.Members.Count)
if (post.MaxPlayers <= chat.Members.Count)
{
throw new PostException("Post is full");
}
Expand Down Expand Up @@ -134,4 +134,4 @@ public async Task LeavePost(int postId, ApplicationUser user)

return;
}
}
}
20 changes: 18 additions & 2 deletions FU.SPA/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,38 @@ import SignUp from './components/pages/SignUp';
import Chat from './components/pages/Chat';

import { Route, Routes } from 'react-router-dom';
import { ProtectedRoute } from './components/ProtectedRoute';
import UserProvider from './context/userProvider';


function App() {

return (
<>
<UserProvider>
<Navbar />
<div className="container">
<Routes>
<Route index element={<Home />} />
<Route path="/" element={<Home />} />
<Route path="/discover" element={<Discover />} />
<Route path="/social" element={<Social />} />
<Route path="/create" element={<Create />} />
<Route path="/social" element={
<ProtectedRoute >
<Social />
</ProtectedRoute>
} />
<Route path="/create" element={
<ProtectedRoute >
<Create />
</ProtectedRoute>
} />
<Route path="/signup" element={<SignUp />} />
<Route path="/signin" element={<SignIn />} />
<Route path="/chat/:chatId" element={<Chat />} />
<Route path="*" element={<NoPage />} />
</Routes>
</div>
</UserProvider>
</>
);
}
Expand Down
31 changes: 29 additions & 2 deletions FU.SPA/src/components/Navbar.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
import { Link, useMatch, useResolvedPath } from 'react-router-dom';
import UserContext from '../context/userContext';
import { useNavigate } from 'react-router-dom';
import { useContext } from 'react';


export default function Navbar() {
const { user, logout } = useContext(UserContext);
const navigate = useNavigate();

const renderTabContent = () => {
if (user) {
return (
<>
<p>{user.name}</p>
<button onClick={logout}>Logout</button>
</>
);
} else {
return (
<>
<CustomLink to="/SignIn">Sign In</CustomLink>
<CustomLink to="/SignUp">Sign Up</CustomLink>
</>
);
}
};

return (
<nav className="nav">
<div className="left-content">
Expand All @@ -16,14 +41,16 @@ export default function Navbar() {
</div>
<div className="right-content">
<ul>
<CustomLink to="/SignIn">Sign In</CustomLink>
<CustomLink to="/SignUp">Sign Up</CustomLink>
{renderTabContent()}
</ul>
</div>
</nav>
);
}




function CustomLink({ to, children, ...props }) {
const resolvedPath = useResolvedPath(to);
const isActive = useMatch({ path: resolvedPath.pathname, end: true });
Expand Down
14 changes: 14 additions & 0 deletions FU.SPA/src/components/ProtectedRoute.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React, { useContext } from 'react';
import { Navigate, Outlet } from "react-router-dom";
import UserContext from '../context/userContext';

export const ProtectedRoute = ( { children} ) => {
const { user } = useContext(UserContext);

console.log('user')
console.log(user);
return (

user ? children : <Navigate to='/signin'/>
)
}
14 changes: 12 additions & 2 deletions FU.SPA/src/components/pages/SignIn.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ import {
} from '@mui/material';
import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; // Replace with logo eventually
import AuthService from '../../services/authService';
import UserContext from '../../context/userContext';
import { startConnection } from '../../services/signalrService';
import React, { useContext } from 'react';
import { useNavigate } from 'react-router-dom';

export default function SignIn() {
const { login } = useContext(UserContext);
const navigate = useNavigate();

const handleSubmit = (event) => {
event.preventDefault();
const data = new FormData(event.currentTarget);
Expand All @@ -22,8 +28,12 @@ export default function SignIn() {
password: data.get('password'),
};

AuthService.signIn(creds);
startConnection();
AuthService.signIn(creds).then(response => {
login(response.token);
});

navigate('/');

};

// Creates and returns signin form
Expand Down
10 changes: 10 additions & 0 deletions FU.SPA/src/context/userContext.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { createContext } from 'react';

const UserContext = createContext({
user: null,
token: null,
login: () => {},
logout: () => {},
});

export default UserContext;
61 changes: 61 additions & 0 deletions FU.SPA/src/context/userProvider.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import UserContext from './userContext';
import UserService from '../services/userService';
import { startConnection, stopConnection } from '../services/signalrService';


const UserProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [token, setToken] = useState(localStorage.getItem('token') || null);
const navigate = useNavigate();

useEffect(() => {
const fetchCurrentUser = async () => {
try {
if (token) {
const currentUser = await UserService.getUserprofile('current');
console.log(currentUser);
setUser(currentUser);
} else {
setUser(null);
}
} catch (error) {
console.error("Error fetching current user:", error.message);
setUser(null);
}
};

fetchCurrentUser();
}, [token]);

const login = (newToken) => {
console.log('token');
console.log(newToken);
setToken(newToken);
localStorage.setItem('token', newToken);
startConnection();
};

const logout = () => {
setToken(null);
localStorage.removeItem('token');
stopConnection();
};

// useEffect(() => {
// // Redirect to home page if the user is not null
// if (user) {
// navigate('/home');
// }
// }, [user, navigate]);

return (
<UserContext.Provider value={{ user, token, login, logout }}>
{children}
</UserContext.Provider>
);
};

export default UserProvider;

14 changes: 14 additions & 0 deletions FU.SPA/src/services/userService.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,23 @@ const getConnectedPlayers = async () => {
return await response.json();
};

const getUserprofile = async (userString) => {
const response = await fetch(
`${API_BASE_URL}/users/${userString}`,
{ headers: { ...AuthService.getAuthHeader() } },
);

if (!response.ok) {
throw new Error('Error getting groups');
}

return await response.json();
};

const UserService = {
getConnectedPosts,
getConnectedGroups,
getConnectedPlayers,
getUserprofile,
};
export default UserService;

0 comments on commit e236ce2

Please sign in to comment.