UNPKG

scratcha-sdk

Version:

Scratcha SDK for React applications with canvas, image processing, and API communication

397 lines (305 loc) 9.64 kB
# Scratcha SDK React 애플리케이션을 위한 Scratcha SDK입니다. 캔버스 기반 이미지 처리, 캡차 시스템, API 통신 기능을 제공합니다. ## 🚀 설치 ```bash npm install scratcha-sdk ``` ## 📦 주요 기능 - **캔버스 기반 이미지 처리**: 스크래치 기능이 있는 캔버스 컴포넌트 - **캡차 시스템**: 이미지 기반 캡차 및 정답 검증 - **API 통신**: 캡차 문제 요청 및 정답 검증 - **토큰 관리**: 5분 유효한 캡차 토큰 시스템 - **데모 모드**: 내부 데이터로 테스트 가능 - **반응형 UI**: 순수 CSS 기반 모던한 디자인 - **CORS 지원**: 외부 이미지 로딩 지원 - **로딩 상태**: 이미지 로딩 및 API 요청 상태 표시 - **환경변수 지원**: Vite 환경변수로 설정 관리 ## 🎯 빠른 시작 ### 기본 사용법 (데모 모드) ```jsx import React from "react"; import { ScratchaWidget } from "scratcha-sdk"; function App() { const handleSuccess = (result) => { console.log("성공:", result); // result.result.selectedAnswer로 선택한 답안에 접근 alert(`성공! 선택한 답안: ${result.result.selectedAnswer}`); }; const handleError = (error) => { console.error("오류:", error); alert(`오류: ${error.message || "알 수 없는 오류"}`); }; return ( <div className="App"> <ScratchaWidget mode="demo" onSuccess={handleSuccess} onError={handleError} /> </div> ); } export default App; ``` ### 실제 API 사용 (직접 설정) ```jsx import React from "react"; import { ScratchaWidget } from "scratcha-sdk"; function App() { const handleSuccess = (result) => { console.log("성공:", result); alert(`성공! 선택한 답안: ${result.result.selectedAnswer}`); }; const handleError = (error) => { console.error("오류:", error); alert(`오류: ${error.message || "알 수 없는 오류"}`); }; return ( <ScratchaWidget apiKey="your-api-key" endpoint="https://api.your-domain.com" mode="normal" onSuccess={handleSuccess} onError={handleError} /> ); } ``` ## 🔧 Props ### ScratchaWidget Props | Prop | 타입 | 기본값 | 설명 | | ----------- | ----------------------- | ---------- | ---------------------------- | | `apiKey` | `string` | - | API 인증 키 | | `endpoint` | `string` | - | API 엔드포인트 URL | | `mode` | `'demo' \| 'normal'` | `'normal'` | 데모 모드 또는 실제 API 모드 | | `onSuccess` | `(result: any) => void` | - | 성공 시 콜백 | | `onError` | `(error: any) => void` | - | 오류 시 콜백 | ## 🔐 토큰 관리 시스템 SDK는 캡차 인증 성공 시 자동으로 5분 유효한 토큰을 생성합니다. ## 📡 API 응답 구조 ### 성공 응답 (정답) ```javascript { success: true, result: { clientToken: "token-123", selectedAnswer: "사과", // 사용자가 선택한 답안 isCorrect: true, timestamp: 1234567890, processingTime: 750 }, message: "정답입니다!" } ``` ### 실패 응답 (오답) ```javascript { success: false, result: { clientToken: "token-123", selectedAnswer: "바나나", // 사용자가 선택한 답안 isCorrect: false, timestamp: 1234567890, processingTime: 750 }, message: "오답입니다. 다시 시도해주세요." } ``` ### 캡차 문제 요청 응답 ```javascript { clientToken: "token-123", imageUrl: "https://example.com/image.jpg", prompt: "화면을 스크래치하여 정답을 선택해주세요.", options: ["사과", "바나나", "오렌지", "포도"] } ``` ## ⚠️ 에러 처리 가이드 ### 에러 타입별 처리 ```jsx const handleError = (error) => { console.error("Scratcha 에러:", error); // API 연결 에러 (네트워크 문제) if (error.message && !error.result) { console.log("API 연결 에러"); // 서버 연결 실패, 네트워크 문제 등 alert("서버와의 연결에 문제가 발생했습니다. 잠시 후 다시 시도해주세요."); return; } // 캡차 검증 실패 (오답) if (error.result && !error.success) { console.log("캡차 검증 실패"); console.log("선택한 답안:", error.result.selectedAnswer); console.log("정답 여부:", error.result.isCorrect); alert( `캡차 인증에 실패했습니다. 선택한 답안: ${error.result.selectedAnswer}` ); return; } // 기타 에러 alert(`알 수 없는 오류가 발생했습니다: ${error.message || "Unknown error"}`); }; ``` ### 일반적인 에러 상황 1. **네트워크 에러**: 인터넷 연결 문제 또는 서버 다운 2. **API 키 에러**: 잘못된 API 키 또는 권한 문제 3. **캡차 실패**: 사용자가 잘못된 답안 선택 4. **CORS 에러**: 도메인 설정 문제 ## 🎨 컴포넌트 ### ScratchaWidget 메인 위젯 컴포넌트로, 전체 캡차 서비스를 제공합니다. ```jsx import { ScratchaWidget } from "scratcha-sdk"; <ScratchaWidget mode="demo" onSuccess={handleSuccess} onError={handleError} />; ``` ### Canvas 스크래치 기능이 있는 캔버스 컴포넌트입니다. ```jsx import { Canvas } from "scratcha-sdk"; <Canvas width={300} height={300} enableScratch={true} onImageLoad={(url) => console.log("이미지 로드됨:", url)} />; ``` ### Button 재사용 가능한 버튼 컴포넌트입니다. ```jsx import { Button } from "scratcha-sdk"; <Button onClick={handleClick} variant="primary" size="medium" disabled={false}> 클릭하세요 </Button>; ``` ### TextDisplay 데이터를 표시하는 컴포넌트입니다. ```jsx import { TextDisplay } from "scratcha-sdk"; <TextDisplay data={{ message: "Hello World", status: "success" }} />; ``` ## 🔌 API 훅 ### useScratchaAPI API 통신을 위한 커스텀 훅입니다. ```jsx import { useScratchaAPI } from "scratcha-sdk"; function MyComponent() { const { isLoading, getCaptchaProblem, verifyAnswer } = useScratchaAPI({ apiKey: import.meta.env.VITE_SCRATCHA_API_KEY, endpoint: import.meta.env.VITE_SCRATCHA_ENDPOINT, mode: "normal", }); const handleGetProblem = async () => { try { const problem = await getCaptchaProblem(); console.log("캡차 문제:", problem); } catch (error) { console.error("문제 가져오기 실패:", error); } }; const handleVerify = async (clientToken, answer) => { try { const result = await verifyAnswer(clientToken, answer); console.log("검증 결과:", result); } catch (error) { console.error("검증 실패:", error); } }; return ( <div> <p>로딩 상태: {isLoading ? "로딩 중..." : "완료"}</p> <button onClick={handleGetProblem}>문제 가져오기</button> </div> ); } ``` ## 🛠️ 유틸리티 함수 ### 캡차 관련 함수 ```jsx import { getRandomQuiz, generateQuizAnswerOptions, getCoverImagePath, getLogoImagePath, getQuizImagePath, } from "scratcha-sdk"; // 랜덤 퀴즈 가져오기 const quiz = getRandomQuiz(); // 답안 옵션 생성 const options = generateQuizAnswerOptions(quiz); // 이미지 경로 가져오기 const coverImage = getCoverImagePath(); const logoImage = getLogoImagePath(); const quizImage = getQuizImagePath(quiz.image_url); ``` ## 🎯 데모 모드 데모 모드에서는 실제 API 없이도 SDK를 테스트할 수 있습니다. ```jsx <ScratchaWidget mode="demo" onSuccess={(result) => { console.log("데모 성공:", result); // result.result.selectedAnswer로 접근 console.log("선택한 답안:", result.result.selectedAnswer); }} /> ``` ## 🔧 고급 기능 ### 이미지 로딩 상태 관리 ```jsx // normal 모드에서 이미지 로딩 중에는 상호작용이 차단됩니다 <ScratchaWidget mode="normal" apiKey={import.meta.env.VITE_SCRATCHA_API_KEY} endpoint={import.meta.env.VITE_SCRATCHA_ENDPOINT} onSuccess={handleSuccess} onError={handleError} /> ``` ### CORS 이미지 로딩 SDK는 자동으로 CORS 문제를 해결하여 외부 이미지를 로딩합니다. ### 콘솔 로깅 개발 모드에서 이미지 로딩 시간과 API 응답 결과가 콘솔에 표시됩니다. ## 📁 파일 구조 ``` scratcha-sdk/ ├── dist/ # 빌드된 파일들 │ ├── index.js # ES 모듈 번들 │ ├── index.umd.cjs # UMD 번들 │ └── vite.svg # 빌드 아이콘 ├── src/ │ ├── components/ # React 컴포넌트들 │ │ ├── ScratchaWidget.jsx │ │ ├── Canvas.jsx │ │ ├── Button.jsx │ │ └── TextDisplay.jsx │ ├── hooks/ # 커스텀 훅들 │ │ └── useScratchaAPI.js │ ├── utils/ # 유틸리티 함수들 │ │ ├── captchaData.js │ │ ├── demoData.js │ │ ├── helpers.js │ │ ├── imageAssets.js │ │ └── imageUtils.js │ ├── index.js # 메인 진입점 (CSS 포함) │ └── index.css # 스타일 정의 └── package.json ``` ## 🚀 빌드 SDK를 빌드하려면: ```bash npm run build:lib ``` ## 📦 배포 npm에 배포하려면: ```bash npm publish ``` ## 🔧 개발 개발 서버 실행: ```bash npm run dev ``` 린트 검사: ```bash npm run lint ```