1
+ import { useState , useEffect } from 'react' ;
2
+ import { useDispatch , useSelector } from 'react-redux' ;
3
+ import { Link } from 'react-router-dom' ;
4
+ import moment from 'moment' ;
5
+ import Header from '../../Header' ;
6
+ import Sidebar from '../../Sidebar' ;
7
+ import Footer from '../../Footer' ;
8
+ import { getOrderDetails , deliverOrder } from '../../../redux/actions/OrderActions' ;
9
+ import { ORDER_UPDATE_RESET } from "../../../redux/constants/OrderConstants" ;
10
+ import { toast } from "react-toastify" ;
11
+ import { ToastObjects } from '../../../redux/actions/toastObject' ;
12
+ import './order.css' ;
13
+
14
+ const EditOrder = ( { match} ) => {
15
+ const orderId = match . params . id ;
16
+ const [ submitted , setSubmitted ] = useState ( false ) ;
17
+ const dispatch = useDispatch ( ) ;
18
+
19
+ const { userLogin : { userInfo :{ data} } } = useSelector ( ( state ) => state ) ;
20
+ const orderDetails = useSelector ( ( state ) => state . orderDetails ) ;
21
+ const { loading, error, order } = orderDetails ;
22
+
23
+ console . log ( "order" , order )
24
+
25
+ useEffect ( ( ) => {
26
+ if ( order . _id !== orderId ) {
27
+ dispatch ( getOrderDetails ( orderId ) ) ;
28
+ }
29
+ } , [ order , dispatch , orderId ] ) ;
30
+
31
+ const deliverHandler = ( e ) => {
32
+ e . preventDefault ( ) ;
33
+ dispatch ( deliverOrder ( orderId ) ) ;
34
+ } ;
35
+
36
+ return (
37
+ < >
38
+ < div className = "container-scroller" >
39
+ < Header />
40
+ < div className = "container-fluid page-body-wrapper" >
41
+ < Sidebar />
42
+ < div className = "main-panel" >
43
+ < div className = "content-wrapper" >
44
+ < div className = "row" >
45
+ < div className = "col-12 grid-margin" >
46
+ < div className = "card" >
47
+ < div className = "card-body" >
48
+ < div className = "clearfix mb-4" >
49
+ < h4 className = "float-left" > Order Details</ h4 >
50
+ < Link to = "/orders" className = "btn btn-outline-primary float-right" > Back to Orders</ Link >
51
+ </ div >
52
+ < form className = "form-sample clear-fix" >
53
+ < div className = "card" >
54
+ < h5 className = "card-header" >
55
+ < div className = "float-left" >
56
+ < span >
57
+ < i className = "fa fa-calendar" > </ i >
58
+ < b > { moment ( order . createdAt ) . format ( 'llll' ) } </ b >
59
+ </ span >
60
+ < br />
61
+ < small >
62
+ Order ID: { order . _id }
63
+ </ small >
64
+ </ div >
65
+ < div className = "float-right" >
66
+ { order . isDelivered ? (
67
+ < span className = "btn btn-success me-2 cursor-auto" > Delivered on { moment ( order . deliveredAt ) . format ( 'llll' ) } </ span >
68
+ ) : (
69
+ < >
70
+ {
71
+ loading ?
72
+ ""
73
+ :
74
+ < button className = "btn btn-primary me-2" onClick = { deliverHandler } > Mark as Delivered</ button >
75
+ }
76
+ </ >
77
+ ) }
78
+
79
+ </ div >
80
+ </ h5 >
81
+
82
+ < div className = "card-body" >
83
+ < div className = "row" >
84
+ < div className = "col-sm-4" >
85
+ < div className = "card" >
86
+ < div className = "card-body main-lable" >
87
+ < article className = "icontext align-items-start" >
88
+ < span className = "icon icon-sm rounded-circle alert-success" > < i className = "text-success fa fa-user" /> </ span >
89
+ < div className = "text" >
90
+ < h5 className = "card-title mb-2" > Customer</ h5 >
91
+ < p className = "mb-1" > { order . shippingAddress && order . shippingAddress . customer_name } < br /> < a href = "mailto:{data[0].email}" > { data [ 0 ] . email } </ a > </ p >
92
+ </ div >
93
+ </ article >
94
+ </ div >
95
+ </ div >
96
+ </ div >
97
+ < div className = "col-sm-4" >
98
+ < div className = "card" >
99
+ < div className = "card-body main-lable" >
100
+ < article className = "icontext align-items-start" >
101
+ < span className = "icon icon-sm rounded-circle alert-success" > < i className = "text-success fa fa-truck" /> </ span >
102
+ < div className = "text" >
103
+ < h5 className = "card-title mb-2" > Order info</ h5 >
104
+ < p className = "mb-1" >
105
+ Pay method: { order . paymentMethod }
106
+ </ p >
107
+ < p className = "mb-1" >
108
+ Status: { order . isPaid ? < span className = "badge badge-pill badge-success" > Paid</ span > : < span className = "badge badge-pill badge-danger" > Not Paid</ span > }
109
+ </ p >
110
+ </ div >
111
+ </ article >
112
+ </ div >
113
+ </ div >
114
+ </ div >
115
+ < div className = "col-sm-4" >
116
+ < div className = "card" >
117
+ < div className = "card-body main-lable" >
118
+ < article className = "icontext align-items-start" >
119
+ < span className = "icon icon-sm rounded-circle alert-success" > < i className = "text-success fa fa-map-marker" /> </ span >
120
+ < div className = "text" >
121
+ < h5 className = "card-title mb-2" > Deliver to</ h5 >
122
+ < p className = "mb-1 card-text" >
123
+ { order . shippingAddress && order . shippingAddress . street1 } < br />
124
+ { order . shippingAddress && order . shippingAddress . street2 ? order . shippingAddress . street2 + < br /> : "" }
125
+ { order . shippingAddress && order . shippingAddress . city } , { order . shippingAddress && order . shippingAddress . state } { order . shippingAddress && order . shippingAddress . zip } < br />
126
+ { order . shippingAddress && order . shippingAddress . country } < br />
127
+ </ p >
128
+ </ div >
129
+ </ article >
130
+ </ div >
131
+ </ div >
132
+ </ div >
133
+ </ div >
134
+ < div className = "row mt-4" >
135
+ {
136
+ ( order . orderItems && order . orderItems . length ) > 0 ?
137
+ (
138
+ < div className = "col-sm-12" >
139
+ < table className = "table" >
140
+ < thead className = "thead-light" >
141
+ < tr >
142
+ < th scope = "col" > Product</ th >
143
+ < th scope = "col" > Unit Price</ th >
144
+ < th scope = "col" > Quantity</ th >
145
+ < th scope = "col" className = "text-end" > Total</ th >
146
+ </ tr >
147
+ </ thead >
148
+ < tbody >
149
+ { order . orderItems . map ( ( item ) => (
150
+ < tr key = { item . _id } >
151
+ < td >
152
+ < div className = "itemside" >
153
+ < div className = "left" >
154
+ < img src = { item . image } alt = { item . name } className = "img-xs" />
155
+ </ div >
156
+ < div className = "info" > { item . name } </ div >
157
+ </ div >
158
+ </ td >
159
+ < td > ${ item . price } </ td >
160
+ < td > { item . qty } </ td >
161
+ < td className = "text-end" > ${ item . price * item . qty } </ td >
162
+ </ tr >
163
+ ) ) }
164
+ < tr >
165
+ < td colSpan = "4" >
166
+ < article className = "float-right" >
167
+ < dl className = "dlist" >
168
+ < dt > Subtotal:</ dt >
169
+ < dd > ${ ( order . itemsPrice ) . toFixed ( 2 ) } </ dd >
170
+ </ dl >
171
+ < dl className = "dlist" >
172
+ < dt > Shipping cost:</ dt >
173
+ < dd > ${ ( order . shippingPrice ) . toFixed ( 2 ) } </ dd >
174
+ </ dl >
175
+ < dl className = "dlist" >
176
+ < dt > Tax:</ dt >
177
+ < dd > ${ ( order . taxPrice ) . toFixed ( 2 ) } </ dd >
178
+ </ dl >
179
+ < dl className = "dlist" >
180
+ < dt > Grand total:</ dt >
181
+ < dd > < b className = "h5" > ${ ( ( order . totalPrice ) / 100 ) . toFixed ( 2 ) } </ b > </ dd >
182
+ </ dl >
183
+ </ article >
184
+ </ td >
185
+ </ tr >
186
+ </ tbody >
187
+ </ table >
188
+ </ div >
189
+ ) : (
190
+ < div className = "text-center" > No Item Available</ div >
191
+ )
192
+ }
193
+
194
+ </ div >
195
+ </ div >
196
+ </ div >
197
+ </ form >
198
+ </ div >
199
+ </ div >
200
+ </ div >
201
+ </ div >
202
+ </ div >
203
+ < Footer />
204
+ </ div >
205
+ </ div >
206
+ </ div >
207
+ </ >
208
+ )
209
+ }
210
+
211
+ export default EditOrder ;
0 commit comments