@@ -7,6 +7,8 @@ import classNames from "classnames/bind";
77import { Flex , Typography } from "@permit/design-system" ;
88import { useGuestTicketDoorValidationQuery } from "@/data/tickets/getGuestTicketDoorValidation/queries" ;
99import { useTicketDoorValidationQuery } from "@/data/tickets/getTicketDoorValidation/queries" ;
10+ import { useGuestTicketCameraConfirmMutation } from "@/data/tickets/postStaffGuestTicketDoorConfirm/mutation" ;
11+ import { useUserTicketCameraConfirmMutation } from "@/data/tickets/postStaffTicketDoorConfirm/mutation" ;
1012import { isAxiosErrorResponse } from "@/shared/types/axioxError" ;
1113
1214import styles from "./index.module.scss" ;
@@ -143,6 +145,9 @@ export const TicketAuthorizationClient = () => {
143145 const qrCodeRef = useRef < any > ( null ) ;
144146 const scanningRef = useRef ( false ) ;
145147
148+ const { mutateAsync : userTicketCameraMutate } = useUserTicketCameraConfirmMutation ( ) ;
149+ const { mutateAsync : guestTicketCameraMutate } = useGuestTicketCameraConfirmMutation ( ) ;
150+
146151 // html5-qrcode 스타일 주입
147152 useEffect ( ( ) => {
148153 const styleId = "qr-reader-styles" ;
@@ -278,48 +283,47 @@ export const TicketAuthorizationClient = () => {
278283
279284 // 검증 결과 처리
280285 useEffect ( ( ) => {
281- console . log ( scannedTicketCode , scanningRef . current ) ;
282-
283- if ( ! scannedTicketCode || ! scanningRef . current ) {
284- return ;
285- }
286-
287- // staff 권한으로 ticketCode 에 대해서 입장 가능하다는 API 를 쏘면 해당 티켓 체크
288-
289- // if (error) {
290- // if (isAxiosErrorResponse(error)) {
291- // let message = "티켓 검증에 실패했습니다.";
292-
293- // if (error.code === NO_ENTRY_TIME) {
294- // message = "해당 티켓의 유효 시간이 아닙니다.";
295- // } else if (error.code === ALREADY_USED_TICKET) {
296- // message = "이미 사용한 티켓입니다.";
297- // } else if (error.code === CANCELED_TICKET) {
298- // message = "취소된 티켓입니다.";
299- // } else if (error.message) {
300- // message = error.message;
301- // }
302-
303- // showToast(message, "error");
304- // } else {
305- // showToast("티켓 검증에 실패했습니다.", "error");
306- // }
286+ if ( ! scannedTicketCode || ! scanningRef . current ) return ;
307287
308- // 검증 실패 후 스캔 재개
309- setTimeout ( ( ) => {
310- scanningRef . current = false ;
311- setScannedTicketCode ( null ) ;
312- } , 2000 ) ;
313-
314- showToast ( `확인되었습니다.` , "success" ) ;
288+ const verifyTicket = async ( ) => {
289+ try {
290+ if ( isGuest ) {
291+ await guestTicketCameraMutate ( { ticketCode : scannedTicketCode } ) ;
292+ } else {
293+ await userTicketCameraMutate ( { ticketCode : scannedTicketCode } ) ;
294+ }
295+
296+ // ✅ 성공
297+ showToast ( "확인되었습니다." , "success" ) ;
298+ } catch ( error ) {
299+ // ❌ 실패
300+ let message = "티켓 검증에 실패했습니다." ;
301+
302+ if ( isAxiosErrorResponse ( error ) ) {
303+ if ( error . code === NO_ENTRY_TIME ) {
304+ message = "해당 티켓의 유효 시간이 아닙니다." ;
305+ } else if ( error . code === ALREADY_USED_TICKET ) {
306+ message = "이미 사용한 티켓입니다." ;
307+ } else if ( error . code === CANCELED_TICKET ) {
308+ message = "취소된 티켓입니다." ;
309+ } else if ( error . message ) {
310+ message = error . message ;
311+ }
312+ }
313+
314+ showToast ( message , "error" ) ;
315+ } finally {
316+ // 🔄 성공/실패 상관없이 스캔 재개
317+ setTimeout ( ( ) => {
318+ scanningRef . current = false ;
319+ setScannedTicketCode ( null ) ;
320+ setLastScannedCode ( null ) ;
321+ } , 2000 ) ;
322+ }
323+ } ;
315324
316- // 검증 성공 후 스캔 재개
317- setTimeout ( ( ) => {
318- scanningRef . current = false ;
319- setScannedTicketCode ( null ) ;
320- setLastScannedCode ( null ) ;
321- } , 2000 ) ;
322- } , [ scannedTicketCode , isGuest ] ) ;
325+ verifyTicket ( ) ;
326+ } , [ scannedTicketCode , isGuest , guestTicketCameraMutate , userTicketCameraMutate ] ) ;
323327
324328 return (
325329 < div className = { cx ( "container" ) } >
0 commit comments