diff --git a/api/be1.js b/api/be1.js deleted file mode 100644 index 13e0ea6..0000000 --- a/api/be1.js +++ /dev/null @@ -1,8 +0,0 @@ -const { proxyRequest } = require('./_proxy'); - -module.exports = function handler(request, response) { - return proxyRequest(request, response, { - envName: 'BE1_PROXY_TARGET_URL', - pathQueryParam: 'path', - }); -}; diff --git a/api/be3.js b/api/be3.js deleted file mode 100644 index b014c05..0000000 --- a/api/be3.js +++ /dev/null @@ -1,8 +0,0 @@ -const { proxyRequest } = require('./_proxy'); - -module.exports = function handler(request, response) { - return proxyRequest(request, response, { - envName: 'BE3_PROXY_TARGET_URL', - pathQueryParam: 'path', - }); -}; diff --git a/package.json b/package.json index 871edaf..239e4ce 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "lodash": "^4.18.1", "picomatch@^2.3.1": "^2.3.2", "picomatch@^4.0.3": "^4.0.4", + "postcss": "^8.5.10", "yaml": "^2.8.3" } }, @@ -64,7 +65,7 @@ "@tanstack/react-router": "^1.166.3", "@vanilla-extract/css": "^1.18.0", "antd": "^6.3.2", - "axios": "1.15.1", + "axios": "1.15.2", "react": "^19.1.1", "react-dom": "^19.1.1", "zustand": "5.0.12" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bf6b0a7..ddbf624 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ overrides: lodash: ^4.18.1 picomatch@^2.3.1: ^2.3.2 picomatch@^4.0.3: ^4.0.4 + postcss: ^8.5.10 yaml: ^2.8.3 importers: @@ -26,8 +27,8 @@ importers: specifier: ^6.3.2 version: 6.3.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) axios: - specifier: 1.15.1 - version: 1.15.1 + specifier: 1.15.2 + version: 1.15.2 react: specifier: ^19.1.1 version: 19.2.4 @@ -1875,10 +1876,10 @@ packages: } engines: { node: '>= 0.4' } - axios@1.15.1: + axios@1.15.2: resolution: { - integrity: sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==, + integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==, } balanced-match@1.0.2: @@ -3610,10 +3611,10 @@ packages: } engines: { node: '>= 0.4' } - postcss@8.5.8: + postcss@8.5.14: resolution: { - integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==, + integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==, } engines: { node: ^10 || ^12 || >=14 } @@ -5863,7 +5864,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios@1.15.1: + axios@1.15.2: dependencies: follow-redirects: 1.16.0 form-data: 4.0.5 @@ -6914,7 +6915,7 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.8: + postcss@8.5.14: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -7450,7 +7451,7 @@ snapshots: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.8 + postcss: 8.5.14 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: diff --git a/src/features/scan-url/api/uploadErrors.test.ts b/src/features/scan-url/api/uploadErrors.test.ts index 15256c1..aa65ace 100644 --- a/src/features/scan-url/api/uploadErrors.test.ts +++ b/src/features/scan-url/api/uploadErrors.test.ts @@ -40,7 +40,7 @@ describe('isCaptchaRequiredUploadError', () => { expect(isCaptchaRequiredUploadError(error)).toBe(false); }); - it('returns false for 429 responses without captcha markers', () => { + it('returns true for plain 429 upload responses', () => { const error = new ApiError({ data: { message: 'Too many requests.', @@ -49,6 +49,6 @@ describe('isCaptchaRequiredUploadError', () => { statusCode: 429, }); - expect(isCaptchaRequiredUploadError(error)).toBe(false); + expect(isCaptchaRequiredUploadError(error)).toBe(true); }); }); diff --git a/src/features/scan-url/api/uploadErrors.ts b/src/features/scan-url/api/uploadErrors.ts index 10cd544..607cc21 100644 --- a/src/features/scan-url/api/uploadErrors.ts +++ b/src/features/scan-url/api/uploadErrors.ts @@ -1,26 +1,5 @@ import { isApiError } from '@/shared/api/errors/apiError'; -import { pickString } from '@/shared/api/responseAccess/payloadAccess'; - -function normalizeValue(value: string | null | undefined): string { - return value?.trim().toLowerCase() ?? ''; -} export function isCaptchaRequiredUploadError(error: unknown): boolean { - if (!isApiError(error) || error.statusCode !== 429) { - return false; - } - - const errorCode = normalizeValue( - pickString(error.data, ['error_code', 'errorCode', 'code', 'status']), - ); - const payloadMessage = pickString(error.data, [ - 'message', - 'detail', - 'error', - 'error_description', - 'description', - ]); - const message = normalizeValue([error.message, payloadMessage].filter(Boolean).join(' ')); - - return errorCode.includes('captcha') || message.includes('captcha') || message.includes('캡차'); + return isApiError(error) && error.statusCode === 429; } diff --git a/src/pages/QRScan/QRScanPage.tsx b/src/pages/QRScan/QRScanPage.tsx index 517d3f7..61404c4 100644 --- a/src/pages/QRScan/QRScanPage.tsx +++ b/src/pages/QRScan/QRScanPage.tsx @@ -203,7 +203,12 @@ export default function QRScanPage() { {isCapturing ? '촬영 중...' : 'QR 스캔하기'} -