@@ -19,7 +19,7 @@ import FullScreenLoader from '@ui/components/AuthContext/LoadingScreen';
1919import { AuthGuard } from '@ui/components/AuthGuard' ;
2020import { useApi } from '@ui/util/api' ;
2121import { AppRoles } from '@common/roles' ;
22- import App from '@ui/App ' ;
22+ import { ItemPostData } from '@common/types/tickets ' ;
2323
2424const baseItemMetadata = z . object ( {
2525 itemId : z . string ( ) . min ( 1 ) ,
@@ -106,31 +106,29 @@ const SelectTicketsPage: React.FC = () => {
106106 const [ reversedSort , setReversedSort ] = useState ( false ) ;
107107 const api = useApi ( 'core' ) ;
108108 const navigate = useNavigate ( ) ;
109-
109+ const fetchItems = async ( ) => {
110+ try {
111+ setLoading ( true ) ;
112+ const response = await api . get ( '/api/v1/tickets/' ) ;
113+ const parsed = listItemsResponseSchema . parse ( response . data ) ;
114+ setItems ( {
115+ tickets : parsed . tickets ,
116+ merch : parsed . merch ,
117+ } ) ;
118+ handleSort ( 'status' ) ;
119+ } catch ( error ) {
120+ console . error ( 'Error fetching items:' , error ) ;
121+ notifications . show ( {
122+ title : 'Error fetching items' ,
123+ message : 'Failed to load available items. Please try again later.' ,
124+ color : 'red' ,
125+ } ) ;
126+ } finally {
127+ setLoading ( false ) ;
128+ }
129+ } ;
110130 useEffect ( ( ) => {
111- const fetchItems = async ( ) => {
112- try {
113- setLoading ( true ) ;
114- const response = await api . get ( '/api/v1/tickets/' ) ;
115- const parsed = listItemsResponseSchema . parse ( response . data ) ;
116- setItems ( {
117- tickets : parsed . tickets ,
118- merch : parsed . merch ,
119- } ) ;
120- } catch ( error ) {
121- console . error ( 'Error fetching items:' , error ) ;
122- notifications . show ( {
123- title : 'Error fetching items' ,
124- message : 'Failed to load available items. Please try again later.' ,
125- color : 'red' ,
126- } ) ;
127- } finally {
128- setLoading ( false ) ;
129- }
130- } ;
131-
132131 fetchItems ( ) ;
133- handleSort ( 'status' ) ;
134132 } , [ ] ) ;
135133
136134 const handleSort = ( field : SortBy ) => {
@@ -170,6 +168,37 @@ const SelectTicketsPage: React.FC = () => {
170168 return < FullScreenLoader /> ;
171169 }
172170
171+ const handleToggleSales = async ( item : ItemMetadata | TicketItemMetadata ) => {
172+ let newIsActive = false ;
173+ if ( isTicketItem ( item ) ) {
174+ newIsActive = ! ( getTicketStatus ( item ) . color === 'green' ) ;
175+ } else {
176+ newIsActive = ! ( getMerchStatus ( item ) . color === 'green' ) ;
177+ }
178+ try {
179+ setLoading ( true ) ;
180+ const data : ItemPostData = {
181+ itemSalesActive : newIsActive ,
182+ type : isTicketItem ( item ) ? 'ticket' : 'merch' ,
183+ } ;
184+ await api . patch ( `/api/v1/tickets/${ item . itemId } ` , data ) ;
185+ await fetchItems ( ) ;
186+ notifications . show ( {
187+ title : 'Changes saved' ,
188+ message : `Sales for ${ item . itemName } are ${ newIsActive ? 'enabled' : 'disabled' } !` ,
189+ } ) ;
190+ } catch ( error ) {
191+ console . error ( 'Error setting new status:' , error ) ;
192+ notifications . show ( {
193+ title : 'Error setting status' ,
194+ message : 'Failed to set status. Please try again later.' ,
195+ color : 'red' ,
196+ } ) ;
197+ } finally {
198+ setLoading ( false ) ;
199+ }
200+ } ;
201+
173202 const handleManageClick = ( itemId : string ) => {
174203 navigate ( `/tickets/manage/${ itemId } ` ) ;
175204 } ;
@@ -253,12 +282,19 @@ const SelectTicketsPage: React.FC = () => {
253282 resourceDef = { { service : 'core' , validRoles : [ AppRoles . TICKETS_MANAGER ] } }
254283 >
255284 < Button
256- variant = "outline "
285+ variant = "primary "
257286 onClick = { ( ) => handleManageClick ( item . itemId ) }
258287 id = { `merch-${ item . itemId } -manage` }
259288 >
260289 View Sales
261290 </ Button >
291+ < Button
292+ color = { getMerchStatus ( item ) . color === 'green' ? 'red' : 'green' }
293+ onClick = { ( ) => handleToggleSales ( item ) }
294+ id = { `tickets-${ item . itemId } -toggle-status` }
295+ >
296+ { getMerchStatus ( item ) . color === 'green' ? 'Disable' : 'Enable' } Sales
297+ </ Button >
262298 </ AuthGuard >
263299 </ Group >
264300 </ Table . Td >
@@ -330,13 +366,22 @@ const SelectTicketsPage: React.FC = () => {
330366 isAppShell = { false }
331367 resourceDef = { { service : 'core' , validRoles : [ AppRoles . TICKETS_MANAGER ] } }
332368 >
333- < Button
334- variant = "outline"
335- onClick = { ( ) => handleManageClick ( ticket . itemId ) }
336- id = { `tickets-${ ticket . itemId } -manage` }
337- >
338- View Sales
339- </ Button >
369+ < Group >
370+ < Button
371+ variant = "primary"
372+ onClick = { ( ) => handleManageClick ( ticket . itemId ) }
373+ id = { `tickets-${ ticket . itemId } -manage` }
374+ >
375+ View Sales
376+ </ Button >
377+ < Button
378+ color = { getTicketStatus ( ticket ) . color === 'green' ? 'red' : 'green' }
379+ onClick = { ( ) => handleToggleSales ( ticket ) }
380+ id = { `tickets-${ ticket . itemId } -toggle-status` }
381+ >
382+ { getTicketStatus ( ticket ) . color === 'green' ? 'Disable' : 'Enable' } Sales
383+ </ Button >
384+ </ Group >
340385 </ AuthGuard >
341386 </ Group >
342387 </ Table . Td >
0 commit comments