Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
4a8f5dc
chore: ESLint 와 Prettier 적용
dlsxjzld Apr 15, 2025
c695bd3
docs: 구현 기능 목록 작성
dlsxjzld Apr 15, 2025
c3e1046
chore: emotion 설치
dlsxjzld Apr 16, 2025
4a20877
docs: README.md에 컴포넌트 구조 및 상태 추가
dlsxjzld Apr 16, 2025
c516a68
feat: 공통 Input 컴포넌트 추가 및 스타일링
dlsxjzld Apr 16, 2025
0dbac9b
feat: Input 컴포넌트 스토리 생성
dlsxjzld Apr 16, 2025
7aafb18
feat: 카드 번호 입력을 위한 CardNumber 컴포넌트 추가
dlsxjzld Apr 16, 2025
0998a79
feat: CardNumber 스토리 추가
dlsxjzld Apr 16, 2025
ab1246c
style: Input 너비 속성 추가
dlsxjzld Apr 16, 2025
6f6ee9c
feat: CardNumberField 컴포넌트 추가
dlsxjzld Apr 16, 2025
6610553
feat: CardNumberField 스토리 생성
dlsxjzld Apr 16, 2025
eb03c6c
refactor: CardNumberField로 카드 번호 입력 컴포넌트 변경
dlsxjzld Apr 16, 2025
8e0da2e
feat: 카드 유효기간 입력을 위한 CardValidityPeriod 컴포넌트 추가
dlsxjzld Apr 16, 2025
db3e6a4
refactor: 일관성을 위해 카드 유효기간 컴포넌트 이름에 Field 접미사 추가
dlsxjzld Apr 16, 2025
b86e9cf
feat: CardValidityPeriodField 스토리 생성
dlsxjzld Apr 16, 2025
f508000
feat: CardCVCField 컴포넌트 추가
dlsxjzld Apr 16, 2025
700df53
refactor: 카드 정보 입력의 description 옵셔널로 변경
dlsxjzld Apr 16, 2025
16d144d
feat: CardCVCField 스토리 생성
dlsxjzld Apr 16, 2025
8355a97
refactor: 명확한 네이밍을 위해 CardNumber에서 CardInputSection으로 이름 변경
dlsxjzld Apr 16, 2025
dd596e4
refactor: 명확한 네이밍을 위해 cardInfo에서 cardInfoForm으로 이름 변경
dlsxjzld Apr 16, 2025
d5131a3
refactor: 카드 관련 필드의 value 타입을 string으로 변경
dlsxjzld Apr 16, 2025
dff1075
feat: CardPreview 컴포넌트 추가
dlsxjzld Apr 16, 2025
3296a29
refactor: CardCVC 기본값 빈 문자열로 변경 및 유효성 검사 조건 추가
dlsxjzld Apr 16, 2025
f3ab2ae
feat: CardPreview 스토리 생성
dlsxjzld Apr 16, 2025
e73ef4a
feat: 카드 입력 필드에 플레이스홀더 추가
dlsxjzld Apr 16, 2025
7056dd0
refactor: CVC 유효성 검사 로직 개선 및 min/max 속성 추가
dlsxjzld Apr 16, 2025
7e1068b
refactor: 카드 번호 min/max 속성 추가
dlsxjzld Apr 17, 2025
7d1121b
refactor: 카드 유효기간 min/max 속성 추가
dlsxjzld Apr 17, 2025
ce7436a
refactor: 카드 CVC 글자수 최대 3자리 제한 추가
dlsxjzld Apr 17, 2025
26e663e
refactor: CardCVCField의 상태 위로 올리기
dlsxjzld Apr 17, 2025
833d64c
refactor: 카드 유효기간 스토리의 month/year 값을 문자열로 변경
dlsxjzld Apr 17, 2025
9c9b6ba
refactor: CardCVCField 스토리에 상태 추가
dlsxjzld Apr 17, 2025
5b7c388
refactor: CardCVCField 스토리에 에러 스토리 추가
dlsxjzld Apr 17, 2025
50a6e79
refactor: 카드 입력 필드 스토리의 상태 문자열로 변경
dlsxjzld Apr 17, 2025
ce6ed9f
refactor: CardInputSection 스토리에서 기본 스토리 변경 및 카드 번호 스토리 추가
dlsxjzld Apr 17, 2025
093f180
refactor: CardInputSection 스토리에서 카드 유효기간 스토리 추가
dlsxjzld Apr 17, 2025
6c6f04f
refactor: CardInputSection 스토리에서 카드 CVC 스토리 추가
dlsxjzld Apr 17, 2025
d129dad
refactor: CardCVCField 스토리에서 글자수 최대 3자리 제한 로직 변경
dlsxjzld Apr 17, 2025
70e6fef
feat: App.tsx에 카드 입력 필드와 관련된 컴포넌트 추가
dlsxjzld Apr 17, 2025
a56510f
feat: reset.css 파일 추가 및 기본 스타일 리셋 적용
dlsxjzld Apr 17, 2025
7898bc4
style: input type number의 스핀 버튼 제거
dlsxjzld Apr 17, 2025
8299f98
remove: 안쓰는 파일 제거
dlsxjzld Apr 17, 2025
47a19e1
style: 카드 미리보기 가운데 정렬
dlsxjzld Apr 17, 2025
8d182e1
style: reset.css 파일로 스타일 초기화
dlsxjzld Apr 17, 2025
a0464a6
style: main과 form 태그 스타일 추가
dlsxjzld Apr 17, 2025
ec41691
fix: 언어 설정을 한국어로 변경
dlsxjzld Apr 17, 2025
e82ed53
refactor: useCardNumber 커스텀 훅으로 분리
dlsxjzld Apr 17, 2025
01575f0
refactor: useCardValidityPeriod 커스텀 훅으로 분리
dlsxjzld Apr 17, 2025
bd31cf4
refactor: useCardCVC 커스텀 훅으로 분리
dlsxjzld Apr 17, 2025
6bff04e
refactor: 카드 유효기간 검증 로직 간소화
dlsxjzld Apr 17, 2025
56528bf
feat: 카드 정보 입력 시 -+.eE 제한
dlsxjzld Apr 17, 2025
2f3bfa1
refactor: 불필요한 주석 제거
dlsxjzld Apr 17, 2025
e4cdf1e
refactor: 카드 번호 유효성 검사 로직 개선 및 오류 메시지 추가
dlsxjzld Apr 17, 2025
bd60095
feat: CVC 오류 메시지 상태 추가
dlsxjzld Apr 17, 2025
501a537
feat: 카드 유효기간 오류 메시지 상태 추가
dlsxjzld Apr 17, 2025
40e0d2d
refactor: 배포 이미지 경로 위해 수정
kimyou1102 Apr 17, 2025
b1774eb
chore: 배포 세팅
kimyou1102 Apr 17, 2025
10216c5
docs: 구현완료 사항 체크표시
kimyou1102 Apr 17, 2025
96a39ee
chore: 스토리북 배포 세팅
kimyou1102 Apr 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions .eslintrc.cjs

This file was deleted.

11 changes: 11 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"singleQuote": true,
"semi": true,
"useTabs": false,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 80,
"bracketSpacing": true,
"arrowParens": "always",
"endOfLine": "auto"
}
102 changes: 102 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,103 @@
# react-payments

## 🎯 구현 기능 목록

### 카드 번호 입력 및 식별

- [x] 카드 번호를 입력할 수 있다.
- [x] 입력은 숫자만 가능하다.
- [x] 0~9만 가능
- [x] 유효하지 않은 번호 입력 시 피드백을 제공한다.
- [x] 카드 번호를 실시간으로 파악한다.
- [x] 사용자가 입력하는 카드 번호에 따라 카드를 식별할 수 있다.
- Visa: 4로 시작하는 16자리 숫자
- MasterCard: 51~55로 시작하는 16자리 숫자

### 카드 유효기간 입력

- [x] 월 입력
- [x] 2자리 수 입력
- [x] 01 ~ 12 범위내만 가능
- [x] 년도 입력
- [x] 2자리 수 입력
- [x] 현재 년도 이후만 가능
- [x] ex) 25년이므로 25이상만 가능
- [x] 입력 제한을 두어 사용자가 숫자만 입력할 수 있도록 한다.
- [x] 유효하지 않은 번호 입력 시 피드백을 제공한다.
- [x] 입력은 숫자만 가능하다.
- [x] 0~9만 가능

### 실시간 프리뷰 업데이트

- [x] 사용자의 카드 정보 입력에 따라 카드 프리뷰를 동시에 업데이트한다.
- [x] Visa 해당 브랜드의 로고를 UI에 표시한다.
- [x] MasterCard 해당 브랜드의 로고를 UI에 표시한다.
- [x] 뒤에 8자리 숫자는 암호화해서 카드 프리뷰에 표시한다. ex) `1234 1234 **** ****`

### 주의 사항

- 사용자의 입력 input에 포커스를 자동으로 이동하는 부분을 1단계에서 고려하지 않는다.

### 💡 카드 브랜드 구분 로직 (Visa / MasterCard)

- Visa: 4로 시작하는 16자리 숫자
- MasterCard: 51~55로 시작하는 16자리 숫자

### 컴포넌트 구조 및 상태

- 공통 컴포넌트
- Input(common)
- 전체 레이아웃 컨테이너
- 카드 UI
- form 컴포넌트의 카드 번호와 같은 상태이므로 props로 받아서 보여준다.
- 로고 이미지
- 카드 번호
- 카드 유효기간
- form 컴포넌트
- 카드 번호
- title
- description
- label
- Input(common)
- error message
- 카드 유효기간
- title
- description
- label
- Input(common)
- error message
- cvc 번호
- title
- label
- Input(common)
- error message

### 전체 레이아웃 컨테이너 컴포넌트에 필요한 상태

- 카드 번호 16자리
- label
- Input(common) 4개
- 카드 유효기간
- 월 2자리
- label
- Input(common)
- 년도 2자리
- label
- Input(common)

### CVC 번호 컴포넌트에 필요한 상태 (자체적으로 상태 가짐)

- cvc번호
- 자체적으로 상태를 갖는 이유
- form 컴포넌트에서 formData로 가져올 수 있기 때문이다.
- 카드 프리뷰 에도 필요하지 않기 때문이다.

### 카드 UI 만들 때 필요한 상태 (상위에서 전달 받음)

- 카드 번호 16자리
- 카드 유효기간

## 폴더 구조

- 컴포넌트
- UI빼고 전부다 도메인?
53 changes: 53 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { defineConfig, globalIgnores } from 'eslint/config';
import { fixupConfigRules } from '@eslint/compat';
import reactRefresh from 'eslint-plugin-react-refresh';
import globals from 'globals';
import tsParser from '@typescript-eslint/parser';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import js from '@eslint/js';
import { FlatCompat } from '@eslint/eslintrc';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all,
});

export default defineConfig([
globalIgnores(['**/dist', '**/.eslintrc.cjs']),
{
extends: fixupConfigRules(
compat.extends(
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react-hooks/recommended',
'plugin:storybook/recommended',
),
),

plugins: {
'react-refresh': reactRefresh,
},

languageOptions: {
globals: {
...globals.browser,
},

parser: tsParser,
},

rules: {
'react-refresh/only-export-components': [
'warn',
{
allowConstantExport: true,
},
],
'max-depth': ['error', 2],
},
},
]);
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html lang="en">
<html lang="ko">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
Expand Down
Loading