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 { Button, CardHeader, CircularProgress, 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, Check, Close, Download, OpenInFull, OpenInNew, Refresh, Star, Upload } 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 { Alert } from '@mui/material'; import { ImageList } from '@mui/material'; import AssetImage from '../../../../components/dashboard/artist/AssetImage' import ReferenceImage from '../../../../components/dashboard/artist/ReferenceImage' import { UploadBoxOutline } from 'mdi-material-ui'; const ArtistRequestDetails = () => { const [references, setReferences] = useState([]); const [assets, setAssets] = useState([]); const [request, setRequest] = useState(null); 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.requestRating) setReview(data.reviewMessage) const requestResponse = await fetch("/api/artist/requests/"+router.query.requestId+"/references"); const requestJson = await requestResponse.json(); setReferences(requestJson); const assetResponse = await fetch("/api/artist/requests/"+router.query.requestId+"/assets"); const assetJson = await assetResponse.json(); setAssets(assetJson); } } const acceptRequest = async () => { let response = await fetch('/api/artist/requests/'+request["id"]+"/accept", { method: 'PUT' }) if(response.status === 200){ router.reload() } else{ alert("Error accepting request.") } } const viewRequest = async () => { } const denyRequest = async () => { let response = await fetch('/api/artist/requests/'+request["id"]+"/deny", { method: 'PUT' }) if(response.status === 200){ router.reload() } else{ alert("Error accepting request.") } } const completeRequest = async () => { let response = await fetch('/api/artist/requests/'+request["id"]+"/complete", { method: 'PUT' }) if(response.status === 200){ router.reload() } else{ alert("Error accepting request.") } } const handleReferenceUpload = async (event) =>{ const file = event.target.files[0]; const formData = new FormData(); formData.append('newImage', file); fetch('/api/artist/requests/'+router.query.requestId+"/newasset", { 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 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) ? ( {(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/artist/requests")}} color="primary"> } severity="info"> Request submitted on {formattedTime} {request.paid ? ( <> The request has been paid for, start working on it! {assets.length>0 ? ( Your uploaded assets will appear below! ): ( You have not uploaded any assets! )} ):( The request is not paid for do not work on the request! )} {(assets.map((asset) => ( )))} ) :( <> Loading... )} ); }; // Protected route, checking user authentication client-side.(CSR) export default withPageAuthRequired(ArtistRequestDetails);