1- import React , { useState , useMemo } from "react" ;
1+ import React , { useState , useMemo , useCallback } from "react" ;
22import { Loading } from "../components/loading" ;
33import { BreweryMap } from "../components/map" ;
44import { useParams } from "react-router-dom" ;
5- import { useBreweryByIdQuery } from "../graphql/autogenerate/hooks" ;
5+ import {
6+ useBreweryByIdQuery ,
7+ useCreateReviewMutation ,
8+ } from "../graphql/autogenerate/hooks" ;
69import { Brewery } from "../graphql/autogenerate/schemas" ;
710import { Card } from "../components/card" ;
811import { ExternalLink } from "heroicons-react" ;
9- import { Modal } from "../components/modal" ;
12+ import { Modal , ModalProps } from "../components/modal" ;
13+ import { uuid } from "uuidv4" ;
1014
1115const BreweryCard = ( { brewery } : { brewery : Brewery } ) => {
1216 const [ markedAsFavorite , setMarkedAsFavorite ] = useState ( false ) ;
@@ -69,10 +73,68 @@ const BreweryCard = ({ brewery }: { brewery: Brewery }) => {
6973 ) ;
7074} ;
7175
76+ type ReviewModalProps = Omit < ModalProps , "title" > & { breweryId : string } ;
77+
78+ const ReviewModal = ( props : ReviewModalProps ) => {
79+ const [ title , setTitle ] = useState < string > ( "" ) ;
80+ const [ review , setReview ] = useState < string > ( "" ) ;
81+ const [ createReview ] = useCreateReviewMutation ( ) ;
82+
83+ const handleSubmitAction = useCallback ( async ( ) => {
84+ await createReview ( {
85+ variables : {
86+ createReviewInput : {
87+ clientMutationId : uuid ( ) ,
88+ subject : title ,
89+ body : review ,
90+ breweryId : props . breweryId ,
91+ } ,
92+ } ,
93+ } ) ;
94+
95+ setTitle ( "" ) ;
96+ setReview ( "" ) ;
97+ } , [ createReview , props . breweryId , title , review , setTitle , setReview ] ) ;
98+
99+ const newProps = {
100+ ...props ,
101+ onAction : async ( ) => {
102+ await handleSubmitAction ( ) ;
103+
104+ if ( props . onAction ) {
105+ props . onAction ( ) ;
106+ }
107+ } ,
108+ } ;
109+
110+ return (
111+ < Modal title = "Add a Review!!!" { ...newProps } >
112+ < div className = "mb-4" >
113+ < label className = "block text-sm font-bold" > Title</ label >
114+ < input
115+ className = "block w-full p-1 border border-gray-400 rounded-md shadow-inner"
116+ type = "text"
117+ value = { title }
118+ onChange = { ( e ) => setTitle ( e . target . value ) }
119+ />
120+
121+ < label className = "block mt-2 text-sm font-bold" > Review</ label >
122+ < textarea
123+ value = { review }
124+ className = "block w-full h-12 p-1 border border-gray-400 rounded-md shadow-inner"
125+ onChange = { ( e ) => setReview ( e . target . value ) }
126+ />
127+ </ div >
128+ </ Modal >
129+ ) ;
130+ } ;
131+
72132const BreweryReviews = ( {
133+ id,
73134 brewery_id,
74135 reviews,
75136} : {
137+ id : string ;
76138 brewery_id : string ;
77139 reviews ?: string [ ] ;
78140} ) => {
@@ -90,13 +152,12 @@ const BreweryReviews = ({
90152 </ button >
91153 </ div >
92154 </ Card >
93- < Modal
94- title = "Add a Review!!!"
155+ < ReviewModal
156+ breweryId = { id }
95157 showModal = { showModal }
96158 onAction = { ( ) => setShowModal ( false ) }
97- onClose = { ( ) => setShowModal ( false ) } >
98- < div > Add a review</ div >
99- </ Modal >
159+ onClose = { ( ) => setShowModal ( false ) }
160+ />
100161 </ React . Fragment >
101162 ) ;
102163} ;
@@ -149,7 +210,7 @@ export const BreweryPage = () => {
149210 < div className = "flex" >
150211 < div className = "flex-none pr-4 lg:w-1/4 xl:w-1/5" >
151212 < BreweryCard brewery = { brewery } />
152- < BreweryReviews brewery_id = { brewery_id } />
213+ < BreweryReviews id = { brewery . id } brewery_id = { brewery_id } />
153214 < NearbyBreweries breweries = { brewery . nearby as Brewery [ ] } />
154215 </ div >
155216 < div className = "flex-grow" >
0 commit comments