From 28a4073b0c09d1ea608d2a0792927f112fab01b2 Mon Sep 17 00:00:00 2001 From: Yeyusin Date: Tue, 6 Aug 2024 03:59:37 +0200 Subject: [PATCH] implement all Issues logics in app create components to respective issue page #257 --- .../sergio-oca\303\261a/project/api/index.js" | 35 +++ .../project/api/logic/index.js" | 2 + .../api/logic/retrieveCinemaIssues.js" | 9 +- .../logic/retrieveRoomsFromCinemaCustomer.js" | 41 ++++ .../retrieveRoomsFromCinemaCustomer.test.js" | 14 ++ .../project/api/logic/retrieveUserIssues.js" | 8 +- .../project/app/src/App.jsx" | 9 +- .../app/src/components/CreateIssue.jsx" | 205 ++++++++++++++++++ .../app/src/components/CreateRoom.jsx" | 2 +- .../project/app/src/components/Footer.jsx" | 4 +- .../app/src/components/FormCinema.jsx" | 13 +- .../project/app/src/components/Issue.jsx" | 29 +++ .../app/src/components/RadioButton.jsx" | 4 + .../project/app/src/components/index.js" | 4 +- .../project/app/src/logic/closeIssue.js" | 2 +- .../project/app/src/logic/createIssue.js" | 6 +- .../project/app/src/logic/index.js" | 14 +- .../project/app/src/logic/retrieveCinema.js" | 2 +- .../project/app/src/logic/retrieveCinemas.js" | 2 +- .../logic/retrieveRoomsFromCinemaCustomer.js" | 29 +++ .../project/app/src/pages/Home.jsx" | 2 - .../project/app/src/pages/Issue.jsx" | 6 - .../project/app/src/pages/Issues.jsx" | 104 +++++++++ .../project/app/src/pages/RouteFooter.jsx" | 4 +- .../project/com/validate.js" | 6 +- 25 files changed, 516 insertions(+), 40 deletions(-) create mode 100644 "staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.js" create mode 100644 "staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.test.js" create mode 100644 "staff/sergio-oca\303\261a/project/app/src/components/CreateIssue.jsx" create mode 100644 "staff/sergio-oca\303\261a/project/app/src/components/Issue.jsx" create mode 100644 "staff/sergio-oca\303\261a/project/app/src/components/RadioButton.jsx" create mode 100644 "staff/sergio-oca\303\261a/project/app/src/logic/retrieveRoomsFromCinemaCustomer.js" delete mode 100644 "staff/sergio-oca\303\261a/project/app/src/pages/Issue.jsx" create mode 100644 "staff/sergio-oca\303\261a/project/app/src/pages/Issues.jsx" diff --git "a/staff/sergio-oca\303\261a/project/api/index.js" "b/staff/sergio-oca\303\261a/project/api/index.js" index 5ee97370..450e133f 100644 --- "a/staff/sergio-oca\303\261a/project/api/index.js" +++ "b/staff/sergio-oca\303\261a/project/api/index.js" @@ -424,6 +424,41 @@ mongoose.connect(MONGO_URL) } }) + server.get('/rooms/customer/:cinemaId', (req, res) => { + try { + const { authorization } = req.headers + + const token = authorization.slice(7) + + const { sub: userId } = jwt.verify(token, JWT_SECRET) + + const { cinemaId } = req.params + + logic.retrieveRoomsFromCinemaCustomer(userId, cinemaId) + .then(rooms => res.json(rooms)) + .catch(error => { + + let status = 500 + + if (error instanceof MatchError) + status = 404 + + res.status(status).json({ error: error.constructor.name, message: error.message }) + }) + } catch (error) { + let status = 500 + + if (error instanceof TypeError || error instanceof RangeError || error instanceof ContentError) + status = 400 + else if (error instanceof JsonWebTokenError || error instanceof TokenExpiredError) { + status = 401 + + error = new MatchError(error.message) + } + res.status(status).json({ error: error.constructor.name, message: error.message }) + } + }) + server.patch('/rooms/:cinemaId/:roomId', jsonBodyParser, (req, res) => { try { const { authorization } = req.headers diff --git "a/staff/sergio-oca\303\261a/project/api/logic/index.js" "b/staff/sergio-oca\303\261a/project/api/logic/index.js" index f7530e03..ae1de6ea 100644 --- "a/staff/sergio-oca\303\261a/project/api/logic/index.js" +++ "b/staff/sergio-oca\303\261a/project/api/logic/index.js" @@ -17,6 +17,7 @@ import retrieveCinemaIssues from './retrieveCinemaIssues.js' import retrieveUserIssues from './retrieveUserIssues.js' import deleteIssue from './deleteIssue.js' import closeIssue from './closeIssue.js' +import retrieveRoomsFromCinemaCustomer from './retrieveRoomsFromCinemaCustomer.js' const logic = { authenticateUser, @@ -33,6 +34,7 @@ const logic = { updateRoom, deleteRoom, retrieveRoomsFromCinema, + retrieveRoomsFromCinemaCustomer, createIssue, retrieveCinemaIssues, retrieveUserIssues, diff --git "a/staff/sergio-oca\303\261a/project/api/logic/retrieveCinemaIssues.js" "b/staff/sergio-oca\303\261a/project/api/logic/retrieveCinemaIssues.js" index ab15ae82..a3e8786f 100644 --- "a/staff/sergio-oca\303\261a/project/api/logic/retrieveCinemaIssues.js" +++ "b/staff/sergio-oca\303\261a/project/api/logic/retrieveCinemaIssues.js" @@ -3,7 +3,6 @@ import { validate, errors } from 'com' const { MatchError, SystemError } = errors - function retrieveCinemaIssues(userId) { validate.id(userId) @@ -21,7 +20,7 @@ function retrieveCinemaIssues(userId) { .then(cinema => { if (!cinema) throw new MatchError('Cinema not found') - return Issue.find({ $and: [{ status: 'open' }, { cinema: cinemaId }] }).populate('author', 'name').sort({ date: -1 }).select('-__v ').lean() + return Issue.find({ cinema: cinemaId }).populate([{ path: 'author', select: 'name' }, { path: 'cinema', select: 'name' }]).sort({ date: -1 }).select('-__v ').lean() .catch(error => { throw new SystemError(error.message) }) .then(issues => { issues.forEach(issue => { @@ -36,15 +35,17 @@ function retrieveCinemaIssues(userId) { delete issue.author._id } + if (issue.cinema._id) { + issue.cinema.id = issue.cinema._id.toString() - if (typeof issue.cinema === 'object') issue.cinema = issue.cinema.toString() + delete issue.cinema._id + } if ('room' in issue) if (typeof issue.room === 'object') issue.room = issue.room.toString() }) return issues }) - }) }) } diff --git "a/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.js" "b/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.js" new file mode 100644 index 00000000..dd3b0231 --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.js" @@ -0,0 +1,41 @@ +import { User, Cinema, Room } from '../data/index.js' + +import { validate, errors } from 'com' + +const { SystemError, MatchError } = errors + +function retrieveRoomsFromCinemaCustomer(userId, cinemaId) { + validate.id(userId) + validate.id(cinemaId, 'cinemaId') + + return User.findById(userId) + .catch(error => { throw new SystemError(error.message) }) + .then(user => { + if (!user) throw new MatchError('User not found') + + return Cinema.findById(cinemaId) + .catch(error => { throw new SystemError(error.message) }) + .then(cinema => { + if (!cinema) throw new MatchError('Cinema not found') + + return Room.find({ cinema: cinemaId }).select('-__v -temperature').sort({ name: 1 }).lean() + .catch(error => { throw new SystemError(error.message) }) + .then(rooms => { + rooms.forEach(room => { + if (room._id) { + room.id = room._id.toString() + + delete room._id + } + if (typeof room.cinema === 'object') + room.cinema = room.cinema.toString() + }) + + return rooms + }) + + }) + }) +} + +export default retrieveRoomsFromCinemaCustomer diff --git "a/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.test.js" "b/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.test.js" new file mode 100644 index 00000000..d06cbdec --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/api/logic/retrieveRoomsFromCinemaCustomer.test.js" @@ -0,0 +1,14 @@ +import retrieveRoomsFromCinema from './retrieveRoomsFromCinema.js' + +import mongoose from 'mongoose' + +mongoose.connect('mongodb://localhost:27017/project') + .then(() => { + try { + retrieveRoomsFromCinema('669e3f9f595f14db65b23a19', '66a8b2fca7a3e4552fedf3f4') + .then((rooms) => console.log(rooms)) + .catch(error => console.error(error.message)) + } catch (error) { + console.error(error) + } + }) \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/api/logic/retrieveUserIssues.js" "b/staff/sergio-oca\303\261a/project/api/logic/retrieveUserIssues.js" index f144a409..a292ffbd 100644 --- "a/staff/sergio-oca\303\261a/project/api/logic/retrieveUserIssues.js" +++ "b/staff/sergio-oca\303\261a/project/api/logic/retrieveUserIssues.js" @@ -14,7 +14,7 @@ function retrieveUserIssues(userId) { if (user.role !== 'customer') throw new MatchError('only customers could search his issues') - return Issue.find({ author: userId }).sort({ date: -1 }).select('-__v -author').lean() + return Issue.find({ author: userId }).sort({ date: -1 }).populate('cinema', 'name').select('-__v -author').lean() .catch(error => { throw new SystemError(error.message) }) .then(issues => { issues.forEach(issue => { @@ -24,7 +24,11 @@ function retrieveUserIssues(userId) { delete issue._id } - if (typeof issue.cinema === 'object') issue.cinema = issue.cinema.toString() + if (issue.cinema._id) { + issue.cinema.id = issue.cinema._id.toString() + + delete issue.cinema._id + } if ('room' in issue) if (typeof issue.room === 'object') issue.room = issue.room.toString() }) diff --git "a/staff/sergio-oca\303\261a/project/app/src/App.jsx" "b/staff/sergio-oca\303\261a/project/app/src/App.jsx" index d6bf2fc0..6873197f 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/App.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/App.jsx" @@ -6,7 +6,7 @@ import RegisterCustomer from './pages/RegisterCustomer' import RegisterManager from './pages/RegisterManager' import Home from './pages/Home' import RouteFooter from './pages/RouteFooter' -import Issue from './pages/Issue' +import Issues from './pages/Issues' const login = "/login" const register = "/register" @@ -15,6 +15,7 @@ const home = "/" const issue = "/issue" function App() { + const navigate = useNavigate() const handleUserRegistered = () => navigate(login) @@ -29,13 +30,15 @@ function App() { const handleHomeButton = () => navigate(home) + const handleIssueButton = () => navigate(issue) + return : } /> : } /> : } /> - }> + }> : } /> - : } /> + : } /> diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/CreateIssue.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/CreateIssue.jsx" new file mode 100644 index 00000000..50ad041b --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/app/src/components/CreateIssue.jsx" @@ -0,0 +1,205 @@ +import { HTag, Form, LabelInput, Button } from './index' +import { useEffect, useState } from 'react' +import logic from '../logic' +import { errors } from 'com' + +const { MatchError, ContentError } = errors + + +function CreateIssue({ handleCancelButtonIssue, handleCreatedIssue }) { + const [step, setStep] = useState(0) + const [cinemas, setCinemas] = useState(null) + const [cinemaId, setCinemaId] = useState(null) + const [rooms, setRooms] = useState(null) + const [isLocationRoom, setIsLocationRoom] = useState(false) + const [location, setLocation] = useState(null) + const [roomId, setRoomId] = useState(null) + const [type, setType] = useState(null) + + const errorHandler = error => { + console.error(error) + + let feedback = error.message + + if (error instanceof TypeError || error instanceof RangeError || error instanceof ContentError) + feedback = `${feedback}, please correct it` + else if (error instanceof MatchError) + feedback = `${feedback}, please try to relog again` + else feedback = 'sorry, there was an error, please try again later' + + alert(feedback) + } + + useEffect(() => { + try { + logic.retrieveCinemas() + .then(cinemas => setCinemas(cinemas)) + .catch(error => errorHandler(error)) + } catch (error) { + errorHandler(error) + } + }, []) + + const searchCinemaRooms = () => { + try { + logic.retrieveRoomsFromCinemaCustomer(cinemaId) + .then(rooms => setRooms(rooms)) + .catch(error => errorHandler(error)) + } catch (error) { + errorHandler(error) + } + } + + const handleSelectedCinema = (cinemaId) => { + setCinemaId(cinemaId) + setStep(1) + } + + const handleYesButton = () => { + searchCinemaRooms() + + setStep(2) + + setIsLocationRoom(true) + } + + const handleNoButton = () => setStep(2) + + const handleSelectedRoom = (roomId, roomName) => { + setStep(3) + + setLocation(roomName) + + setRoomId(roomId) + } + + const onSubmitLocation = (event) => { + event.preventDefault() + + const form = event.target + + const locationForm = form.location.value + + if (locationForm.length === 0) return + + setLocation(locationForm) + + setStep(3) + } + + const handleTemperatureButton = () => { + setStep(4) + + setType('temperature') + } + + const handleSoundButton = () => { + setStep(4) + + setType('sound') + } + + const handleFilmButton = () => { + setStep(4) + + setType('film') + } + + const handleCleaningButton = () => { + setStep(4) + + setType('cleaning') + } + + const onSubmitDescription = (event) => { + event.preventDefault() + + const form = event.target + + const description = form.description.value + + if (description.length === 0) return + + try { + logic.createIssue(cinemaId, location, type, description, roomId) + .then(() => handleCreatedIssue()) + .catch(error => errorHandler(error)) + } catch (error) { + errorHandler(error) + } + } + + return <> + {cinemas && step === 0 && <> + Select Cinema + + + } + + {step === 1 && <> + Is the issue related to a room? + +
+ + + +
+ } + + {step === 2 && rooms && isLocationRoom && <> + Select Room + + + } + + {step === 2 && !isLocationRoom && <> + Tell us where the issue happened + +
+ + + + + + } + + {step === 3 && <> + Is the issue related to a room? + +
+ + + + + + + +
+ } + + + {step === 4 && <> + Tell us what happened + +
+ + + + + + } + + +} export default CreateIssue \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/CreateRoom.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/CreateRoom.jsx" index 579dff19..c9d126b5 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/components/CreateRoom.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/components/CreateRoom.jsx" @@ -23,7 +23,7 @@ function CreateRoom({ handleCancelButtonRoom, handleCreateRoom }) {
- +
diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/Footer.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/Footer.jsx" index 86c1fabb..a6d2eb80 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/components/Footer.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/components/Footer.jsx" @@ -1,10 +1,10 @@ import { Button } from './index' -function Footer({ onHomeClick }) { +function Footer({ onHomeClick, onIssueClick }) { return
- +
diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/FormCinema.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/FormCinema.jsx" index b15d818a..3497525f 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/components/FormCinema.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/components/FormCinema.jsx" @@ -66,13 +66,12 @@ function FormCinema({ onAsignedCinema }) { {cinemas ? cinemas.map(cinema => { const isCinemaSelected = selectedCinema === cinema.id - return ( -
  • isCinemaSelected ? unselectCinema() : selectCinema(cinema.id)} key={cinema.id}> - {cinema.name} -
  • - ) + return
  • isCinemaSelected ? unselectCinema() : selectCinema(cinema.id)} key={cinema.id}> + {cinema.name} +
  • + }) :

    Loading...

    } {cinemas?.length === 0 &&

    Create your first cinema

    } diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/Issue.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/Issue.jsx" new file mode 100644 index 00000000..25b20021 --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/app/src/components/Issue.jsx" @@ -0,0 +1,29 @@ +import { Button, HTag } from './index' +import logic from '../logic' + +function Issue({ issue, onCloseIssueButton, onDeleteIssueButton, onCommentButtonClick }) { + const isIssueOpen = issue.status === 'open' + + return
    +
    + {issue.id} +

    {issue.status}

    +
    +

    {issue.cinema.name}

    +

    {issue.type}

    +

    {issue.description}

    + {logic.IsManagerUserLoggedIn() &&

    {issue.author.name}

    } +
    +
    + + {logic.IsManagerUserLoggedIn() && <> + + + + } +
    + +
    +
    + +} export default Issue \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/RadioButton.jsx" "b/staff/sergio-oca\303\261a/project/app/src/components/RadioButton.jsx" new file mode 100644 index 00000000..1ff40b76 --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/app/src/components/RadioButton.jsx" @@ -0,0 +1,4 @@ +function RadioButton({ OnRadioButtonClick }) { + return + +} export default RadioButton \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/components/index.js" "b/staff/sergio-oca\303\261a/project/app/src/components/index.js" index 40fd16ec..a909ac94 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/components/index.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/components/index.js" @@ -3,11 +3,13 @@ import LabelInput from './LabelInput' import HTag from './HTag' import Form from './Form' import Header from './Header' +import RadioButton from './RadioButton' export { Button, LabelInput, HTag, Form, - Header + Header, + RadioButton, } \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/closeIssue.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/closeIssue.js" index 4b3af5dd..a8dfe55b 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/logic/closeIssue.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/closeIssue.js" @@ -12,7 +12,7 @@ function closeIssue(issueId) { }) .catch(error => { throw new SystemError(error.message) }) .then(res => { - if (res.status === 204) return + if (res.status === 200) return return res.json() .catch(error => { throw new SystemError(error.message) }) diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/createIssue.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/createIssue.js" index 6f9d9b90..e5db6997 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/logic/createIssue.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/createIssue.js" @@ -2,12 +2,12 @@ import { errors, validate } from 'com' const { SystemError } = errors -function createIssue(cinemaId, location, type, description, roomId = null) { +function createIssue(cinemaId, location, type, description, roomId) { validate.token(sessionStorage.token, 'customer') validate.id(cinemaId, 'cinemaId') - validate.text(location) + validate.text(location, 'location') validate.type(type) - validate.text(description) + validate.text(description, 'description') let url = `${import.meta.env.VITE_API_URL}/issues/${cinemaId}` diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/index.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/index.js" index 51bb5391..db15bd2c 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/logic/index.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/index.js" @@ -13,8 +13,14 @@ import deleteCinema from './deleteCinema' import createCinema from './createCinema' import createRoom from './createRoom' import retrieveRoomsFromCinema from './retrieveRoomsFromCinema' +import retrieveRoomsFromCinemaCustomer from './retrieveRoomsFromCinemaCustomer' import updateRoom from './updateRoom' import deleteRoom from './deleteRoom' +import createIssue from './createIssue' +import retrieveUserIssues from './retrieveUserIssues' +import retrieveCinemaIssues from './retrieveCinemaIssues' +import closeIssue from './closeIssue' +import deleteIssue from './deleteIssue' const logic = { @@ -33,8 +39,14 @@ const logic = { deleteCinema, createRoom, retrieveRoomsFromCinema, + retrieveRoomsFromCinemaCustomer, updateRoom, - deleteRoom + deleteRoom, + createIssue, + retrieveUserIssues, + retrieveCinemaIssues, + closeIssue, + deleteIssue, } export default logic \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinema.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinema.js" index 65ad26ef..f521531f 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinema.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinema.js" @@ -3,7 +3,7 @@ import { errors, validate } from 'com' const { SystemError } = errors function retrieveCinema(cinemaId) { - validate.token(sessionStorage.token, 'manager') + validate.token(sessionStorage.token) validate.id(cinemaId, 'cinemaId') diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinemas.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinemas.js" index ea4eab1c..e88a167f 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinemas.js" +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveCinemas.js" @@ -3,7 +3,7 @@ import { validate, errors } from 'com' const { SystemError } = errors function retrieveCinemas() { - validate.token(sessionStorage.token, 'manager') + validate.token(sessionStorage.token) return fetch(`${import.meta.env.VITE_API_URL}/cinemas`, { method: 'GET', diff --git "a/staff/sergio-oca\303\261a/project/app/src/logic/retrieveRoomsFromCinemaCustomer.js" "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveRoomsFromCinemaCustomer.js" new file mode 100644 index 00000000..cb6db05c --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/app/src/logic/retrieveRoomsFromCinemaCustomer.js" @@ -0,0 +1,29 @@ +import { errors, validate } from 'com' + +const { SystemError } = errors + +function retrieveRoomsFromCinemaCustomer(cinemaId) { + validate.token(sessionStorage.token, 'customer') + validate.id(cinemaId, 'cinemaId') + + return fetch(`${import.meta.env.VITE_API_URL}/rooms/customer/${cinemaId}`, { + method: 'GET', + headers: { Authorization: `Bearer ${sessionStorage.token}` } + }) + .catch(error => { throw new SystemError(error.message) }) + .then(res => { + if (res.status === 200) return res.json() + + return res.json() + .catch(error => { throw new SystemError(error.message) }) + .then(body => { + const { error, message } = body + + const constructor = errors[error] + + throw new constructor(message) + }) + }) +} + +export default retrieveRoomsFromCinemaCustomer \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/pages/Home.jsx" "b/staff/sergio-oca\303\261a/project/app/src/pages/Home.jsx" index be9d5cb2..b93eb3d7 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/pages/Home.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/pages/Home.jsx" @@ -67,8 +67,6 @@ function Home({ onLogoutClick }) { {showFormCinema === 1 && !user?.cinema && } {user && !logic.IsManagerUserLoggedIn() &&

    Customer

    } - - } export default Home \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/pages/Issue.jsx" "b/staff/sergio-oca\303\261a/project/app/src/pages/Issue.jsx" deleted file mode 100644 index c259ce45..00000000 --- "a/staff/sergio-oca\303\261a/project/app/src/pages/Issue.jsx" +++ /dev/null @@ -1,6 +0,0 @@ -import { HTag } from "../components"; - -function Issues() { - return Issues - -} export default Issues \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/pages/Issues.jsx" "b/staff/sergio-oca\303\261a/project/app/src/pages/Issues.jsx" new file mode 100644 index 00000000..5c780cb5 --- /dev/null +++ "b/staff/sergio-oca\303\261a/project/app/src/pages/Issues.jsx" @@ -0,0 +1,104 @@ +import { useEffect, useState } from 'react' +import { Button, HTag, RadioButton } from '../components' +import Issue from '../components/Issue' +import logic from '../logic' +import CreateIssue from '../components/CreateIssue' +import { errors } from 'com' +import IsManagerUserLoggedIn from '../logic/IsManagerUserLoggedIn' + +const { MatchError, ContentError } = errors + + +function Issues({ routeStamp }) { + const [issues, setIssues] = useState(null) + const [status, setStatus] = useState('open') + const [view, setView] = useState(null) + const [timeStamp, setTimeStamp] = useState(Date.now()) + + const errorHandler = error => { + console.error(error) + + let feedback = error.message + + if (error instanceof TypeError || error instanceof RangeError || error instanceof ContentError) + feedback = `${feedback}, please correct it` + else if (error instanceof MatchError) + feedback = `${feedback}, please try to relog again` + else feedback = 'sorry, there was an error, please try again later' + + alert(feedback) + } + + useEffect(() => { + try { + const promise = logic.IsManagerUserLoggedIn() ? logic.retrieveCinemaIssues() : logic.retrieveUserIssues() + + promise + .then(issues => { + setIssues(issues) + }) + .catch(error => { + errorHandler(error) + }) + } catch (error) { + errorHandler(error) + } + }, [timeStamp, routeStamp]) + + const handleRadioButtonClick = () => { + let change = 'closed' + + if (status === change) + change = 'open' + + setStatus(change) + } + const handleCreateView = () => setView(true) + + const handleCancelButtonIssue = () => setView(false) + + const handleCreatedIssue = () => { + setView(false) + + setTimeStamp(Date.now()) + } + + const handleCommentButton = () => { } + + const handleCloseIssueButton = issueId => { + try { + logic.closeIssue(issueId) + .then(() => setTimeStamp(Date.now())) + .catch(error => errorHandler(error)) + } catch (error) { + errorHandler(error) + } + } + + const handleDeleteIssueButton = issueId => { + try { + logic.deleteIssue(issueId) + .then(() => setTimeStamp(Date.now())) + .catch(error => errorHandler(error)) + } catch (error) { + errorHandler(error) + } + } + + + return
    +
    + Issues + +
    + + {issues ? issues?.filter(issue => issue.status === status).map(issue => { + return + }) :

    We are happy not issues avalaible to see

    } + + + {!IsManagerUserLoggedIn() && } + {view && } +
    + +} export default Issues \ No newline at end of file diff --git "a/staff/sergio-oca\303\261a/project/app/src/pages/RouteFooter.jsx" "b/staff/sergio-oca\303\261a/project/app/src/pages/RouteFooter.jsx" index 3882ef7d..33f78302 100644 --- "a/staff/sergio-oca\303\261a/project/app/src/pages/RouteFooter.jsx" +++ "b/staff/sergio-oca\303\261a/project/app/src/pages/RouteFooter.jsx" @@ -1,10 +1,10 @@ import { Outlet } from 'react-router-dom' import Footer from '../components/Footer' -function RouteFooter({ onHomeClick }) { +function RouteFooter({ onHomeClick, onIssueClick }) { return <> -