Commit 3c447e4f by Manivasagam S

code changes

parent 40192bec
...@@ -14,8 +14,15 @@ ...@@ -14,8 +14,15 @@
"phoneNumber": "9361775481", "phoneNumber": "9361775481",
"name": "mani", "name": "mani",
"reservedSeats": [ "reservedSeats": [
"F2", "D2",
"B3" "E2",
"A4",
"B8",
"C8",
"D8",
"A5",
"D5",
"D6"
] ]
}, },
{ {
...@@ -180,6 +187,25 @@ ...@@ -180,6 +187,25 @@
"email": "mani@gmail.com", "email": "mani@gmail.com",
"phoneNumber": "2134567809", "phoneNumber": "2134567809",
"reservedSeats": [] "reservedSeats": []
},
{
"id": "0f1d",
"name": "mani",
"email": "kani@gmail.com",
"phoneNumber": "3214567891",
"reservedSeats": []
},
{
"id": "9ce4",
"name": "Test",
"email": "test@krds.fr",
"phoneNumber": "9999999999",
"reservedSeats": [
"F5",
"E5",
"E6",
"E7"
]
} }
] ]
} }
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -9,7 +9,8 @@ ...@@ -9,7 +9,8 @@
"lint": "eslint .", "lint": "eslint .",
"preview": "vite preview", "preview": "vite preview",
"storybook": "storybook dev -p 6006", "storybook": "storybook dev -p 6006",
"build-storybook": "storybook build" "build-storybook": "storybook build",
"start:server": "node server.cjs"
}, },
"dependencies": { "dependencies": {
"axios": "^1.9.0", "axios": "^1.9.0",
...@@ -43,7 +44,7 @@ ...@@ -43,7 +44,7 @@
"eslint-plugin-react-refresh": "^0.4.19", "eslint-plugin-react-refresh": "^0.4.19",
"eslint-plugin-storybook": "^0.12.0", "eslint-plugin-storybook": "^0.12.0",
"globals": "^16.0.0", "globals": "^16.0.0",
"json-server": "^1.0.0-beta.3", "json-server": "^0.17.3",
"playwright": "^1.52.0", "playwright": "^1.52.0",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"storybook": "^8.6.14", "storybook": "^8.6.14",
......
const jsonServer = require('json-server');
const server = jsonServer.create();
const router = jsonServer.router('db.json');
const middlewares = jsonServer.defaults();
server.use(middlewares);
server.use(jsonServer.bodyParser);
server.get('/reserved-seats', (req, res) => {
const users = router.db.get('users').value();
const filtered = users.map(({ id, reservedSeats }) => ({
id,
reservedSeats,
}));
res.json(filtered);
});
server.use(router);
const PORT = 3000;
server.listen(PORT, () => {
console.log(`JSON Server running at http://localhost:${PORT}`);
});
import axios from "axios"; import axios from "axios";
const API_URL = "http://192.168.1.59:3000/users"; const API_URL = "http://localhost:3000/users";
export const getAllUsers = () => axios.get(API_URL); export const getReservedSeatsOnly = () =>
axios.get("http://localhost:3000/reserved-seats");
export const getAllUsers = () => axios.get(`${API_URL}`);
export const getUserByPhone = (phoneNumber) => export const getUserByPhone = (phoneNumber) =>
axios.get(`${API_URL}?phoneNumber=${phoneNumber}`); axios.get(`${API_URL}?phoneNumber=${phoneNumber}`);
...@@ -10,6 +13,6 @@ export const getUserByPhone = (phoneNumber) => ...@@ -10,6 +13,6 @@ export const getUserByPhone = (phoneNumber) =>
export const updateUserReservedSeats = (userId, reservedSeats) => export const updateUserReservedSeats = (userId, reservedSeats) =>
axios.patch(`${API_URL}/${userId}`, { reservedSeats }); axios.patch(`${API_URL}/${userId}`, { reservedSeats });
export const postUser=async(userData)=>{ export const postUser = async (userData) => {
return await axios.post(API_URL,userData); return await axios.post(API_URL, userData);
} };
\ No newline at end of file
import { useEffect, useState, useRef } from "react"; import { useEffect, useState, useRef } from "react";
import { getAllUsers, updateUserReservedSeats } from "@/Api/Api"; import {
getReservedSeatsOnly,
getUserByPhone,
updateUserReservedSeats,
} from "@/Api/Api";
import { Button } from "@/Components/Base/Buttons/Button"; import { Button } from "@/Components/Base/Buttons/Button";
import { Legend } from "@/Components/Top-level/Seat-legend/Legend"; import { Legend } from "@/Components/Top-level/Seat-legend/Legend";
import { SeatLayout } from "@/Components/Top-level/SeatLayout/SeatLayout"; import { SeatLayout } from "@/Components/Top-level/SeatLayout/SeatLayout";
...@@ -11,6 +15,7 @@ import { Modal } from "@/Components/Base/Modal/Modal"; ...@@ -11,6 +15,7 @@ import { Modal } from "@/Components/Base/Modal/Modal";
import { SeatSelectForm } from "@/Components/Form/SeatSelectForm/SeatSelectForm"; import { SeatSelectForm } from "@/Components/Form/SeatSelectForm/SeatSelectForm";
import { Screen } from "@/Components/Shared/Screen/Screen"; import { Screen } from "@/Components/Shared/Screen/Screen";
import { AiOutlineLogout } from "react-icons/ai"; import { AiOutlineLogout } from "react-icons/ai";
import { useNavigate } from "react-router-dom";
export const Selectseat = ({ onLogout }) => { export const Selectseat = ({ onLogout }) => {
const [selectedSeats, setSelectedSeats] = useState([]); const [selectedSeats, setSelectedSeats] = useState([]);
...@@ -19,39 +24,45 @@ export const Selectseat = ({ onLogout }) => { ...@@ -19,39 +24,45 @@ export const Selectseat = ({ onLogout }) => {
const [seatCount, setSeatCount] = useState(1); const [seatCount, setSeatCount] = useState(1);
const [availableSeats, setAvailableSeats] = useState(0); const [availableSeats, setAvailableSeats] = useState(0);
const [showSelect, setShowSelect] = useState(true); const [showSelect, setShowSelect] = useState(true);
const hasWelcomed = useRef(false); const hasWelcomed = useRef(false);
const navigate = useNavigate();
useEffect(() => { useEffect(() => {
getAllUsers() const currentUser = getCurrentUser();
if (!currentUser || !currentUser.phoneNumber) {
toast.error("No user found");
return;
}
getUserByPhone(currentUser.phoneNumber)
.then((res) => { .then((res) => {
const users = res.data; const user = res.data?.[0];
const loggedUser = getCurrentUser(); const userReserved = user?.reservedSeats || [];
const totalSeats = 60;
return getReservedSeatsOnly().then((response) => {
const currentUser = users.find( const allReserved = response.data.flatMap(
(u) => u.phoneNumber === loggedUser.phoneNumber (u) => u.reservedSeats || []
); );
const userReserved = currentUser?.reservedSeats || []; const othersReserved = allReserved.filter(
const allReserved = users.flatMap((u) => u.reservedSeats || []); (seat) => !userReserved.includes(seat)
const othersReserved = allReserved.filter( );
(seat) => !userReserved.includes(seat)
); const totalSeats = 60;
setUserSeats(userReserved);
setUserSeats(userReserved); setSelectedSeats(userReserved);
setSelectedSeats(userReserved); setReservedSeats(othersReserved);
setReservedSeats(othersReserved); setSeatCount(userReserved.length);
setSeatCount(userReserved.length); setAvailableSeats(totalSeats - allReserved.length);
setAvailableSeats(totalSeats - allReserved.length); setShowSelect(true);
setShowSelect(true);
if (user?.name && !hasWelcomed.current) {
if (currentUser?.name && !hasWelcomed.current) { toast.success(`Welcome 😊, ${user.name}`);
toast.success(`Welcome 😊, ${currentUser.name}`); hasWelcomed.current = true;
hasWelcomed.current = true; }
} });
}) })
.catch((err) => { .catch((err) => {
console.error("Error fetching users", err); console.error("Error fetching seats", err);
toast.error("Failed to load seat data."); toast.error("Failed to load seat data.");
}); });
}, []); }, []);
...@@ -76,55 +87,51 @@ export const Selectseat = ({ onLogout }) => { ...@@ -76,55 +87,51 @@ export const Selectseat = ({ onLogout }) => {
) { ) {
toast.error( toast.error(
`You unselected ${unselectedMine.length} seat(s), select ${unselectedMine.length} new.` `You unselected ${unselectedMine.length} seat(s), select ${unselectedMine.length} new.`
); );
hasWelcomed.current = true;
return; return;
} }
if (selectedSeats.length !== seatCount) { if (selectedSeats.length !== seatCount) {
toast.error(`You must select exactly ${seatCount} seat(s).`); toast.error(`You must select exactly ${seatCount} seat(s).`);
hasWelcomed.current = true;
return; return;
} }
getAllUsers() getUserByPhone(user.phoneNumber)
.then((res) => { .then((res) => {
const users = res.data; const currentUser = res.data?.[0];
const currentUser = users.find(
(u) => u.phoneNumber === user.phoneNumber
);
if (!currentUser) { if (!currentUser) {
toast.error("User not found"); toast.error("User not found");
return; return;
} }
const latestOthersReserved = users return getReservedSeatsOnly().then((response) => {
.flatMap((u) => u.reservedSeats || []) const latestOthersReserved = response.data
.filter((seat) => !currentUser.reservedSeats.includes(seat)); .flatMap((u) => u.reservedSeats || [])
.filter((seat) => !currentUser.reservedSeats.includes(seat));
const conflict = selectedSeats.filter((seat) => const conflict = selectedSeats.filter((seat) =>
latestOthersReserved.includes(seat) latestOthersReserved.includes(seat)
); );
if (conflict.length > 0) {
toast.error(`These seats were just taken: ${conflict.join(", ")}`); if (conflict.length > 0) {
return; toast.error(`These seats were just taken: ${conflict.join(", ")}`);
} return;
}
return updateUserReservedSeats(currentUser.id, selectedSeats); return updateUserReservedSeats(currentUser.id, selectedSeats);
});
}) })
.then((res) => { .then((res) => {
if (res) { if (res) {
toast.success("Seats booked!"); toast.success("Seats booked!");
hasWelcomed.current = true;
localStorage.setItem("bookedSeats", JSON.stringify(selectedSeats)); localStorage.setItem("bookedSeats", JSON.stringify(selectedSeats));
setTimeout(() => window.location.replace("/success"), 1000); setTimeout(() => navigate("/success"), 1000);
} }
}) })
.catch((err) => { .catch((err) => {
console.error("Error confirming seats", err); console.error("Error confirming seats", err);
toast.error("Failed to confirm seats."); toast.error("Failed to confirm seats.");
setTimeout(() => window.location.replace("/error"), 1000); setTimeout(() => navigate("/error"), 1000);
}); });
}; };
......
...@@ -3,16 +3,18 @@ import { SignUp } from "@/Components/Form/SignUp/SignUp"; ...@@ -3,16 +3,18 @@ import { SignUp } from "@/Components/Form/SignUp/SignUp";
import { toast } from "react-toastify"; import { toast } from "react-toastify";
import { Auth } from "@/Components/Auth/Auth.jsx"; import { Auth } from "@/Components/Auth/Auth.jsx";
import { getUserByPhone,postUser } from "@/Api/Api.js"; import { getUserByPhone,postUser } from "@/Api/Api.js";
import { useNavigate } from "react-router-dom";
export const AuthPage = () => { export const AuthPage = () => {
const navigate=useNavigate();
const handleLogin = async (phoneNumber) => { const handleLogin = async (phoneNumber) => {
try { try {
const response = await fetch(`http://192.168.1.59:3000/users?phoneNumber=${phoneNumber}`); const response = await fetch(`http://localhost:3000/users?phoneNumber=${phoneNumber}`);
const users = await response.json(); const users = await response.json();
if (users.length > 0) { if (users.length > 0) {
const user = users[0]; const user = users[0];
localStorage.setItem("user", JSON.stringify(user)); localStorage.setItem("user", JSON.stringify(user));
window.location.replace("/booking"); navigate("/booking");
} else { } else {
toast.warn("User not found. Please register or check the number."); toast.warn("User not found. Please register or check the number.");
} }
...@@ -30,7 +32,6 @@ const handleSignUp = async (formData) => { ...@@ -30,7 +32,6 @@ const handleSignUp = async (formData) => {
return; return;
} }
// ✅ Check if phone number already exists
const response = await getUserByPhone(formData.phoneNumber); const response = await getUserByPhone(formData.phoneNumber);
if (response.data.length > 0) { if (response.data.length > 0) {
toast.warn("📱 Phone number already registered."); toast.warn("📱 Phone number already registered.");
......
import { Selectseat } from "@/Components/Top-level/Seatselect/Selectseat"; import { Selectseat } from "@/Components/Top-level/Seatselect/Selectseat";
import { logout } from "@/lib/authService"; import { logout } from "@/lib/authService";
import { useNavigate } from "react-router-dom";
export const Bookingpage = () => { export const Bookingpage = () => {
const navigate=useNavigate();
const onLogout = () => { const onLogout = () => {
navigate("/");
logout(); logout();
}; };
......
...@@ -2,9 +2,11 @@ import { Success } from "@/Components/Top-level/Response/Success/Success"; ...@@ -2,9 +2,11 @@ import { Success } from "@/Components/Top-level/Response/Success/Success";
import { logout } from "@/lib/authService"; import { logout } from "@/lib/authService";
import { AiOutlineLogout } from "react-icons/ai"; import { AiOutlineLogout } from "react-icons/ai";
import "@/index.css"; import "@/index.css";
import { useNavigate } from "react-router-dom";
export const SuccessPage = () => { export const SuccessPage = () => {
const navigate=useNavigate();
const onLogout = () => { const onLogout = () => {
navigate("/");
logout(); logout();
}; };
......
export const login = async (phoneNumber) => { export const login = async (phoneNumber) => {
const response = await fetch(`http://localhost:3000/users?phoneNumber=${phoneNumber}`); const response = await fetch(`http://localhost:3000/users?phoneNumber=${phoneNumber}`);
const users = await response.json(); const users = await response.json();
...@@ -18,6 +19,5 @@ export const getCurrentUser = () => { ...@@ -18,6 +19,5 @@ export const getCurrentUser = () => {
export const logout = () => { export const logout = () => {
localStorage.removeItem("user"); localStorage.removeItem("user");
localStorage.removeItem("bookedSeats"); localStorage.removeItem("bookedSeats");
window.location.replace('/');
return; return;
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment