Skip to content

Commit 0dec376

Browse files
committed
feat: step1: 코드리뷰 반영
1 parent 5689c6d commit 0dec376

20 files changed

+144
-119
lines changed

src/components/AddCard.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,25 @@ import {AddCardProps} from "../interface/AddCardProps.ts";
33
import CardContext from "../context/CardContext.tsx";
44
import {CardType} from "../type/CardType.ts";
55
import {useStepper} from "../context/StepperContext.tsx";
6+
import Display from "./Display.tsx";
7+
import Button from "./Button.tsx";
68

7-
const AddCard: React.FC<AddCardProps> = ({cardName, cardNumber, name, expireDate}) => {
8-
const {addCard} = useContext(CardContext)
9+
const AddCard: React.FC<AddCardProps> = ({cardCompanyName, cardNumber, userName, expireDate}) => {
10+
const {maxCardId, addCard} = useContext(CardContext)
911
const {setCurrentStep} = useStepper()
1012

1113
const handleClick = () => {
1214
const {month, year} = expireDate
1315
const cardExpireDate = `${month} / ${year}`
14-
const newCard: CardType = {cardName, cardNumber, name, cardExpireDate}
16+
const newCard: CardType = {id: maxCardId + 1 , cardCompanyName, cardNumber, userName, cardExpireDate}
1517
addCard(newCard)
1618
setCurrentStep("AddCardComplete")
1719
}
1820

1921
return (
20-
<div className="button-box">
21-
<span className="button-text" onClick={handleClick}>다음</span>
22-
</div>
22+
<Button onClick={handleClick}>
23+
<Display value={"다음"}/>
24+
</Button>
2325
)
2426
}
2527

src/components/AddCardComplete.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import {CardType} from "../type/CardType.ts";
44
import {useStepper} from "../context/StepperContext.tsx";
55
import {AddCardCompleteProps} from "../interface/AddCardCompleteProps.ts";
66

7-
const AddCardComplete: React.FC<AddCardCompleteProps> = ({cardName, cardNumber, name, cardExpireDate, cardAlias}) => {
7+
const AddCardComplete: React.FC<AddCardCompleteProps> = ({id, cardCompanyName, cardNumber, userName, cardExpireDate, cardAlias}) => {
88
const {modifyCard} = useContext(CardContext)
99
const {setCurrentStep} = useStepper()
1010

1111
const handleClick = () => {
12-
const card: CardType = {cardName, cardNumber, name, cardExpireDate, cardAlias}
12+
const card: CardType = {id, cardCompanyName, cardNumber, userName, cardExpireDate, cardAlias}
1313
modifyCard(card)
1414
setCurrentStep("CardList")
1515
}

src/components/App.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import AddCardForm from "../form/AddCardForm.tsx";
88
import {useStepper} from "../context/StepperContext.tsx";
99
import AddCardCompleteForm from "../form/AddCardCompleteForm.tsx";
1010
import {CardProvider} from "../context/CardContext.tsx";
11-
import CardListForm from "../form/CardList.tsx";
11+
import CardListForm from "../form/CardListForm.tsx";
1212

1313
function App() {
1414
const {step} = useStepper()
1515

1616
return (
1717
<CardProvider>
18-
{step === '/' && <AddCardForm/>}
18+
{step === 'AddCard' && <AddCardForm/>}
1919
{step === 'AddCardComplete' && <AddCardCompleteForm/>}
2020
{step === 'CardList' && <CardListForm/>}
2121
</CardProvider>

src/components/Button.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from "react";
2+
import {ButtonProps} from "../interface/ButtonProps.ts";
3+
4+
const Button: React.FC<ButtonProps> = ({onClick, children}) => {
5+
return (
6+
<button className={"button-box"} onClick={onClick}>
7+
{children}
8+
</button>
9+
)
10+
}
11+
12+
export default Button

src/components/Card.tsx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from "react"
22
import Display from "./Display.tsx"
33
import {CardProps} from "../interface/CardProps.ts"
44

5-
const Card: React.FC<CardProps> = ({cardName, cardNumber, name, cardExpireDate, onClick}) => {
5+
const Card: React.FC<CardProps> = ({cardCompanyName, cardNumber, userName, cardExpireDate, onClick}) => {
66

77
const formattedExpireDate = () => {
88
if (cardExpireDate) {
@@ -11,18 +11,14 @@ const Card: React.FC<CardProps> = ({cardName, cardNumber, name, cardExpireDate,
1111
}
1212
return ''
1313
}
14+
1415
const formattedCardNumber = () => {
1516
if (cardNumber) {
17+
const maskString = (input: string) => input.replace(/./g, '*')
1618
let {first, second, third, fourth} = cardNumber
17-
if (first.length > 0) {
18-
first = first + "-"
19-
}
20-
if (second.length > 0) {
21-
second = second + "-"
22-
}
23-
const thirdSecret = third.length === 4 ? "****-" : "*".repeat(third.length)
24-
const fourthSecret = fourth.length === 4 ? "****" : "*".repeat(fourth.length)
25-
return `${first}${second}${thirdSecret}${fourthSecret}`
19+
return [first, second, maskString(third), maskString(fourth)]
20+
.filter((value) => value.length >= 1)
21+
.join('-')
2622
}
2723
return ''
2824
}
@@ -31,7 +27,7 @@ const Card: React.FC<CardProps> = ({cardName, cardNumber, name, cardExpireDate,
3127
<div className={"card-box"} onClick={onClick}>
3228
<div className="empty-card">
3329
<div className={"card-top"}>
34-
<Display className={"card-text"} value={cardName}></Display>
30+
<Display className={"card-text"} value={cardCompanyName}></Display>
3531
</div>
3632
<div className={"card-middle"}>
3733
<div className={"small-card__chip"}></div>
@@ -41,7 +37,7 @@ const Card: React.FC<CardProps> = ({cardName, cardNumber, name, cardExpireDate,
4137
<Display className={"card-text"} value={formattedCardNumber()}></Display>
4238
</div>
4339
<div className={"card-bottom__info"}>
44-
<Display className={"card-text"} value={name} defaultValue={"NAME"}></Display>
40+
<Display className={"card-text"} value={userName} defaultValue={"NAME"}></Display>
4541
<Display className={"card-text"} value={formattedExpireDate()} defaultValue={"MM / YY"}></Display>
4642
</div>
4743
</div>

src/components/HeaderButton.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ export interface HeaderButtonProps {
55
tag: string
66
className: string
77
value?: string
8-
event?: () => void
8+
onClickHandler?: () => void
99
}
1010

11-
const HeaderButton: React.FC<HeaderButtonProps> = ({tag, className, value, event}) => {
11+
const HeaderButton: React.FC<HeaderButtonProps> = ({tag, className, value, onClickHandler}) => {
1212
const handleClickEvent = () => {
13-
event?.()
13+
onClickHandler?.()
1414
}
1515

1616
const Tag = tag as keyof IntrinsicElements;

src/components/Input.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ const Input: React.FC<InputProps> = ({onChange, ...rest}) => {
77
const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
88
const value = event.target.value
99
setInputValue(value)
10-
if (onChange) {
11-
onChange(event)
12-
}
10+
onChange?.(event)
1311
}
1412

1513
return (

src/components/Modal.tsx

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
11
import React from "react"
22
import {ModalProps} from "../interface/ModalProps.ts";
3-
import {CardType} from "../enums/CardType.ts";
3+
import {CardListType} from "../enums/CardListType.ts";
4+
import {CardModalType} from "../type/CardModalType.ts";
45

56
const Modal: React.FC<ModalProps> = ({isOpen, selectCard}) => {
6-
const cardNames = Object.keys(CardType);
7-
const chunkSize = 4;
8-
const chunkedCardNames: string[][] = [];
9-
for (let i = 0; i < cardNames.length; i += chunkSize) {
10-
chunkedCardNames.push(cardNames.slice(i, i + chunkSize));
11-
}
127
const cardSelect = (cardName: string) => {
138
selectCard(cardName)
149
}
10+
const cardModalArray = (): CardModalType[] => {
11+
let idCounter = 1
12+
return Object.values(CardListType).map((cardType) => ({
13+
id: idCounter++,
14+
cardListType: cardType
15+
}))
16+
}
17+
18+
const cardModalTypes = cardModalArray();
1519

1620
return (
1721
<div className="modal-dimmed" style={{display: isOpen ? "flex" : "none"}}>
1822
<div className="modal">
19-
{chunkedCardNames.map((chunk, index) => (
20-
<div key={index} className="flex-center">
21-
{chunk.map((key) => (
22-
<div className="modal-item-container"
23-
onClick={() => cardSelect(CardType[key as keyof typeof CardType])}>
24-
<div className="modal-item-dot"></div>
25-
<span
26-
className="modal-item-name">{CardType[key as keyof typeof CardType]}</span>
27-
</div>
28-
))}
23+
{cardModalTypes.map((card) => (
24+
<div key={card.id} className="modal-item-container" onClick={() => cardSelect(card.cardListType)}>
25+
<div className="modal-item-dot"></div>
26+
<span className="modal-item-name">{card.cardListType}</span>
2927
</div>
3028
))}
3129
</div>

src/context/CardContext.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,26 @@ import React, { createContext, useState } from 'react'
22
import {CardType} from "../type/CardType.ts";
33

44
interface CardContextType {
5+
maxCardId: number
56
cards: CardType[]
67
addCard: (newCard: CardType) => void
78
modifyCard: (newCard: CardType) => void
89
}
910

1011
const CardContext = createContext<CardContextType>({
12+
maxCardId: 0,
1113
cards: [],
1214
addCard: () => {},
1315
modifyCard: () => {}
1416
});
1517

1618
export const CardProvider: React.FC<{ children: React.ReactNode}> = ({ children }) => {
1719
const [cards, setCards] = useState<CardType[]>([])
20+
const [maxCardId, setMaxCardId] = useState<number>(0)
1821

1922
const addCard = (newCard: CardType) => {
20-
setCards(prevCards => [...prevCards, newCard]);
23+
setCards(prevCards => [...prevCards, newCard])
24+
setMaxCardId(prevMaxCardId => prevMaxCardId + 1)
2125
}
2226

2327
const modifyCard = (newCard: CardType) => {
@@ -28,7 +32,7 @@ export const CardProvider: React.FC<{ children: React.ReactNode}> = ({ children
2832
}
2933

3034
return (
31-
<CardContext.Provider value={{ cards, addCard, modifyCard }}>
35+
<CardContext.Provider value={{ maxCardId, cards, addCard, modifyCard }}>
3236
{children}
3337
</CardContext.Provider>
3438
)

src/context/StepperContext.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ interface StepperContextType {
66
}
77

88
const StepperContext = createContext<StepperContextType>({
9-
step: "/",
9+
step: "AddCard",
1010
setCurrentStep: () => {}
1111
});
1212

1313
export const StepperProvider: React.FC<{ children: React.ReactNode}> = ({ children }) => {
14-
const [step, setStep] = useState<string>("/")
14+
const [step, setStep] = useState<string>("AddCard")
1515

1616
const setCurrentStep = (step: string) => {
1717
setStep(step)

0 commit comments

Comments
 (0)