import * as React from 'react'; import { DataGrid } from '@mui/x-data-grid'; import { GridColDef } from '@mui/x-data-grid'; import TextField from '@mui/material/TextField'; import { Alert, Button, CircularProgress, ImageList, ImageListItem, ListItem, Stack, Typography } from '@mui/material'; import CurrencyTextField from '@lupus-ai/mui-currency-textfield'; import { DateField } from '@mui/x-date-pickers/DateField'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; import Chip from '@mui/material/Chip'; import {ArrowBack, AssignmentLateOutlined, Check, Close, Download, Error, OpenInFull, OpenInNew, Refresh, Star, Upload, Warning } from '@mui/icons-material'; import PriceCheckIcon from '@mui/icons-material/PriceCheck'; import AssignmentTurnedInIcon from '@mui/icons-material/AssignmentTurnedIn'; import AssignmentLateIcon from '@mui/icons-material/AssignmentLate'; import ShoppingCartCheckoutIcon from '@mui/icons-material/ShoppingCartCheckout'; import { IconButton } from '@mui/material'; import Tooltip from '@mui/material/Tooltip'; import { Card, CardContent } from '@mui/material'; import Rating from '@mui/material/Rating'; import { Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, FormControl, InputLabel, Box } from '@mui/material'; import { Grid } from '@mui/material'; import { useRouter } from 'next/router'; import { withPageAuthRequired } from '@auth0/nextjs-auth0/client' import { useState, useEffect } from 'react'; import { UploadBoxOutline } from 'mdi-material-ui'; import AssetImage from '../../../components/dashboard/artist/AssetImage' import ReferenceImage from '../../../components/dashboard/artist/ReferenceImage' import Paper from '@mui/material/Paper'; const RequestDetails = () => { const [request, setRequest] = useState(null); const [references, setReferences] = useState([]); const [assets, setAssets] = useState([]); const router = useRouter(); const getData = async () => { if(router.query.requestId!=null){ const response = await fetch("/api/requests/"+router.query.requestId+"/details"); const data = await response.json(); setRequest(data); setRating(data.reviewRating) setReview(data.reviewMessage) setAlreadyReviewed(data.reviewed) const requestResponse = await fetch("/api/requests/"+router.query.requestId+"/references"); const requestJson = await requestResponse.json(); setReferences(requestJson); const assetsResponse = await fetch("/api/requests/"+router.query.requestId+"/assets"); const assetsJson = await assetsResponse.json(); setAssets(assetsJson); } } const handleReferenceUpload = async (event) =>{ const file = event.target.files[0]; const formData = new FormData(); formData.append('newImage', file); fetch('/api/requests/'+router.query.requestId+"/newreference", { method: 'POST', body: formData // Don't set Content-Type, FormData will handle it }) .then(response => response.json()) .then(data => { getData(); }) .catch(error => { console.error('Error uploading file:', error); // Handle error appropriately }); } useEffect(() => { getData() }, [router.query.requestId]); const [open, setOpen] = React.useState(false); const [rating, setRating] = React.useState(1); const [review, setReview] = React.useState(""); const [alreadyReviewed, setAlreadyReviewed] = React.useState(true); const handleReviewChange = (event) => { setReview(event.target.value); } const handleRatingChange = async (event) => { var rating = event.target.value; var response = await fetch('/api/requests/'+request.id+'/review', { method:"PUT", headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ rating: rating, message: review }) }); if(response.ok){ router.reload(); } else{ alert("Could not submit review!") } } const handlePay = async () => { var paymentUrlRequest = await fetch('/api/requests/'+request.id+'/payment') //console.log(paymentUrlRequest); var paymentUrlJson = await paymentUrlRequest.json(); var paymentUrl = paymentUrlJson.paymentUrl; window.open(paymentUrl); } let formattedTime = "" const date = new Date(request?.requestDate ?? ""); formattedTime = date.toLocaleTimeString('en-US', { month: 'long', day: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); // Example format return (<> {(request) ? ( {request.accepted ? ( You can no longer upload reference images, request is accepted! ):( (references.length > 0) ? ( There is a maximum of 10 reference images per request. ):( You need to add reference images to your request! ) )} {(references.map((reference) => ( )))} {(request.declined ? ( } label="Declined" variant="outlined" color="error" /> ):null)} {(!request.declined && !request.accepted && !request.paid && !request.completed ? ( } label="Pending" variant="outlined" color="secondary" /> ):null)} {(request.accepted && !request.completed ? ( } label="Accepted" variant="outlined" color="info" /> ):null)} {(request.paid && request.accepted ? ( } label="Paid" variant="outlined" color="success" /> ):null)} {(request.paid==false && request.accepted ? ( } label="Pending Payment" variant="outlined" color="warning" /> ):null)} {(request.completed ? ( } label="Completed" variant="outlined" color="success" /> ):null)} {router.push("/dashboard/requests")}} color="primary"> } severity="info"> Request submitted on {formattedTime} {request.completed ? ( Your success is complete and you can access your assets below! ):( When your request is completed your assets will appear below! )} {request.completed ? ( ): null} {(assets.map((asset) => ( )))} ) :( <> Loading... )} ); }; // Protected route, checking user authentication client-side.(CSR) export default withPageAuthRequired(RequestDetails);