Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions frontend/src/App.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import EditEscapeRoom from './pages/EditEscapeRoom'
import EscapeRoomDetails from './pages/EscapeRoomDetails'

import Girls from './pages/Girls';
import CreateGirl from './pages/CreateGirl';
import EditGirl from './pages/EditGirl';

import UnderConstruction from './pages/UnderConstruction'
import UserProfileView from './pages/UserProfieView'
Expand Down Expand Up @@ -79,6 +81,8 @@ function App() {
<Route path="/escape-rooms/:escapeRoomId" element={<ProtectedRoute><EscapeRoomDetails /></ProtectedRoute>} />
<Route path="/computer-club" element={<ProtectedRoute><UnderConstruction /></ProtectedRoute>} />
<Route path="/strip-club" element={<ProtectedRoute><Girls /></ProtectedRoute>} />
<Route path="/girls/create" element={<ProtectedRoute><CreateGirl /></ProtectedRoute>} />
<Route path="/girls/edit/:girlId" element={<ProtectedRoute><EditGirl /></ProtectedRoute>} />
<Route path="/marketplace" element={<ProtectedRoute><UnderConstruction /></ProtectedRoute>} />
<Route path="/bet-zone" element={<ProtectedRoute><BetZone /></ProtectedRoute>} />
<Route path="/user-profile" element={<ProtectedRoute><UserProfileView /></ProtectedRoute>} />
Expand Down
6 changes: 4 additions & 2 deletions frontend/src/components/Girl.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@ import { useNavigate, Link } from "react-router-dom"

import api from "../api"

export default function Girl({ girl }) {
export default function Girl({ girl, onDeleteGirl }) {
const navigate = useNavigate();
const onDelete = async (id) => {

api.delete(`/api/girls/${id}/`)
.then(response => {
if (response.status === 204) {
console.log("Girl deleted successfully!");
navigate('/girls/', { replace: true });
console.log(id);
onDeleteGirl(id);
// navigate('/girls/', { replace: true });
} else {
console.log("Girl was not deleted!");
}
Expand Down
5 changes: 2 additions & 3 deletions frontend/src/components/Service.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import api from '../api';
import { useNavigate } from "react-router-dom";

export default function Service({ service }) {
export default function Service({ service, onDeleteService }) {

const navigate = useNavigate();

Expand All @@ -10,8 +10,7 @@ export default function Service({ service }) {
.then((res) => {
if (res.status === 204) {
console.log("Service deleted successfully!");
// This app should have been SPA, but in some cases it's easier to reload pages
navigate('/services/', { replace: true });
onDeleteService(id);
} else {
console.log("Service was not deleted!");
}
Expand Down
138 changes: 138 additions & 0 deletions frontend/src/pages/CreateGirl.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
import { useNavigate } from 'react-router-dom';
import api from '../api';
import { useState } from 'react';

export default function CreateGirl() {
const [image, setImage] = useState("");
const [name, setName] = useState("");
const [bio, setBio] = useState("");
const [age, setAge] = useState("");
const [height, setHeight] = useState("");
const [skinColor, setSkinColor] = useState("");
const [hairColor, setHairColor] = useState("");
const [eyeColor, setEyeColor] = useState("");
const navigate = useNavigate();

const createEvent = async (e) => {
e.preventDefault();
api.post("/api/girls/create/", { image, name, bio, age, skin_color: skinColor, hair_color: hairColor, eye_color: eyeColor, height })
.then((res) => {
if (res.status === 201) {
console.log("Girl addes successfully!");
navigate('/strip-club/');

} else {
console.log("Girl was not added!");
}

})
.catch((error) => console.error(`Error: ${error}`));

}

return (
<div>
<h2 className="crud-title">Create Girl</h2>
<form className="form-container" onSubmit={createEvent}>
<label htmlFor="imageUrl">Image URL:</label>
<input
className="form-input"
type="text"
id="imageUrl"
name="imageUrl"
required
onChange={(e) => setImage(e.target.value)}
value={image}
/>
{/^https?:\/\/\S+$/.test(image) ? '' : <small className="error">Enter a valid web address. It should start with http:// or https://</small>}
<label htmlFor="name">Name:</label>
<input
className="form-input"
type="text"
id="name"
name="name"
required
onChange={(e) => setName(e.target.value)}
value={name}
/>
{(name) ? null : <small className="error">This field is required</small>}
<label htmlFor="description">Bio:</label>
<textarea
className="form-input"
id="bio"
name="bio"
required
onChange={(e) => setBio(e.target.value)}
value={bio}
/>
{(bio) ? null : <small className="error">This field is required</small>}
<label htmlFor="age">Age:</label>
<input
type="number"
className="form-input"
id="age"
name="age"
required
onChange={(e) => setAge(e.target.value)}
value={age}
min="18"
max="70"
/>
{/* if (age < 18) {
<small className="error">The minimum age is 18</small>
} else if (age > 70) {
<small className="error">The maximum age is 70</small>
} else {
null
} */}
{(age) ? null : <small className="error">This field is required</small>}
<label htmlFor="height">Height:</label>
<input
type="number"
className="form-input"
id="height"
name="height"
required
onChange={(e) => setHeight(e.target.value)}
value={height}
/>
{(height) ? null : <small className="error">This field is required</small>}
<label htmlFor="skinColor">Skin Color:</label>
<input
type="text"
className="form-input"
id="skinColor"
name="skinColor"
required
onChange={(e) => setSkinColor(e.target.value)}
value={skinColor}
/>
{(skinColor) ? null : <small className="error">This field is required</small>}
<label htmlFor="hairColor">Hair Color:</label>
<input
type="text"
className="form-input"
id="hairColor"
name="hairColor"
required
onChange={(e) => setHairColor(e.target.value)}
value={hairColor}
/>
{(hairColor) ? null : <small className="error">This field is required</small>}
<label htmlFor="eyeColor">Eye Color:</label>
<input
type="text"
className="form-input"
id="eyeColor"
name="eyeColor"
required
onChange={(e) => setEyeColor(e.target.value)}
value={eyeColor}
/>
{(eyeColor) ? null : <small className="error">This field is required</small>}

<input type="submit" value="Submit" />
</form>
</div>
)
}
167 changes: 167 additions & 0 deletions frontend/src/pages/EditGirl.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
import { useParams, useNavigate } from 'react-router-dom';
import api from '../api';
import { useState, useEffect } from 'react';


export default function EditEscapeRoom() {
const { girlId } = useParams();
const [girls, setGirls] = useState([]);

const [image, setImage] = useState("");
const [name, setName] = useState("");
const [bio, setBio] = useState("");
const [age, setAge] = useState("");
const [height, setHeight] = useState("");
const [skinColor, setSkinColor] = useState("");
const [hairColor, setHairColor] = useState("");
const [eyeColor, setEyeColor] = useState("");
const navigate = useNavigate();

const getGirls = async () => {
api.get("/api/girls/")
.then((response) => {
setGirls(response.data);
})
.catch((error) => console.error(`Error: ${error}`));;
}

useEffect(() => {
getGirls();
}, []);

useEffect(() => {
const girlToUpdate = girls.find(girl => girl.id == girlId);
if (girlToUpdate) {
setImage(girlToUpdate.image);
setName(girlToUpdate.name);
setBio(girlToUpdate.bio);
setAge(girlToUpdate.age);
setHeight(girlToUpdate.height);
setSkinColor(girlToUpdate.skin_color);
setHairColor(girlToUpdate.hair_color);
setEyeColor(girlToUpdate.eye_color);
}
}, [girls, girlId]);

const editGirl = async (e) => {
e.preventDefault();
const requestData = { image, name, bio, age, skin_color: skinColor, hair_color: hairColor, eye_color: eyeColor, height };
console.log("Request Data:", requestData);
api.put(`/api/girls/${girlId}/`, requestData)
.then((res) => {
if (res.status === 200) {
console.log("Girl updated successfully!");
navigate('/strip-club/');
} else {
console.log("Girl was not updated!");
}
})
.catch((error) => console.error(`Error: ${error}`));
}

return (
<div>
<h2 className="crud-title">Edit Girl</h2>
<form className="form-container" onSubmit={editGirl}>
<label htmlFor="imageUrl">Image URL:</label>
<input
className="form-input"
type="text"
id="imageUrl"
name="imageUrl"
required
onChange={(e) => setImage(e.target.value)}
value={image}
/>
{/^https?:\/\/\S+$/.test(image) ? '' : <small className="error">Enter a valid web address. It should start with http:// or https://</small>}
<label htmlFor="name">Name:</label>
<input
className="form-input"
type="text"
id="name"
name="name"
required
onChange={(e) => setName(e.target.value)}
value={name}
/>
{(name) ? null : <small className="error">This field is required</small>}
<label htmlFor="description">Bio:</label>
<textarea
className="form-input"
id="bio"
name="bio"
required
onChange={(e) => setBio(e.target.value)}
value={bio}
/>
{(bio) ? null : <small className="error">This field is required</small>}
<label htmlFor="age">Age:</label>
<input
type="number"
className="form-input"
id="age"
name="age"
required
onChange={(e) => setAge(e.target.value)}
value={age}
min="18"
max="70"
/>
{/* if (age < 18) {
<small className="error">The minimum age is 18</small>
} else if (age > 70) {
<small className="error">The maximum age is 70</small>
} else {
null
} */}
{(age) ? null : <small className="error">This field is required</small>}
<label htmlFor="height">Height:</label>
<input
type="number"
className="form-input"
id="height"
name="height"
required
onChange={(e) => setHeight(e.target.value)}
value={height}
/>
{(height) ? null : <small className="error">This field is required</small>}
<label htmlFor="skinColor">Skin Color:</label>
<input
type="text"
className="form-input"
id="skinColor"
name="skinColor"
required
onChange={(e) => setSkinColor(e.target.value)}
value={skinColor}
/>
{(skinColor) ? null : <small className="error">This field is required</small>}
<label htmlFor="hairColor">Hair Color:</label>
<input
type="text"
className="form-input"
id="hairColor"
name="hairColor"
required
onChange={(e) => setHairColor(e.target.value)}
value={hairColor}
/>
{(hairColor) ? null : <small className="error">This field is required</small>}
<label htmlFor="eyeColor">Eye Color:</label>
<input
type="text"
className="form-input"
id="eyeColor"
name="eyeColor"
required
onChange={(e) => setEyeColor(e.target.value)}
value={eyeColor}
/>
{(eyeColor) ? null : <small className="error">This field is required</small>}

<input type="submit" value="Submit" />
</form>
</div>
)
}
Loading