Skip to content

Commit 6ebd447

Browse files
committed
feat: 영수증 정보 수정 페이지 focus, disabled 추가
1 parent abb1a7f commit 6ebd447

File tree

5 files changed

+75
-25
lines changed

5 files changed

+75
-25
lines changed

src/components/ReceiptEdit/ReceiptEdit.module.scss

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727
.Top {
2828
z-index: 1;
2929

30-
& > h1 {
30+
.TitleBox {
31+
display: flex;
32+
justify-content: center;
3133
margin-top: 2.5rem;
32-
white-space: pre-line;
3334
}
3435
}
3536

src/components/ReceiptEdit/ReceiptEdit.tsx

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,73 @@
1+
import { useState } from "react";
2+
13
import styles from "@/components/ReceiptEdit/ReceiptEdit.module.scss";
24
import Button from "@/components/ui/Button/Button";
35
import Input from "@/components/ui/Input/Input";
46
import Text from "@/components/ui/Text/Text";
57

8+
import { useFocus } from "@/hooks/common/useFocus";
9+
610
const ReceiptEdit = () => {
7-
const placeName = "청담커피 앤 토스트";
11+
const [placeName, setPlaceName] = useState("청담커피 앤 토스트");
12+
const [foodName, setFoodName] = useState("카야토스트+음료세트");
13+
14+
const { isFocus: isPlaceFocus, onFocus: handlePlaceFocus, onBlur: handlePlaceBlur } = useFocus();
15+
const { isFocus: isFoodFocus, onFocus: handleFoodFocus, onBlur: handleFoodBlur } = useFocus();
816

917
return (
1018
<div className={styles.ReceiptEdit}>
1119
<div className={styles.Top}>
12-
<Text variant="titleM" color="primary" align="center" as="h1">
13-
{`${placeName}에\n다녀오셨네요!`}
20+
<div className={styles.TitleBox}>
21+
<Text variant="titleM" color="primary" as="h1" truncated>
22+
{placeName}
23+
</Text>
24+
<Text variant="titleM" color="primary" as="h1">
25+
26+
</Text>
27+
</div>
28+
<Text variant="titleM" color="primary" as="h1" align="center">
29+
다녀오셨네요!
1430
</Text>
31+
1532
<div className={styles.InfoList}>
1633
<div className={styles.InfoItem}>
17-
<p>가게명</p>
18-
<Input placeholder="가게 이름" />
34+
<Text variant="bodyXsm" color="secondary">
35+
가게명
36+
</Text>
37+
<Input
38+
placeholder="가게 이름"
39+
value={placeName}
40+
onChange={(e) => setPlaceName(e.target.value)}
41+
onFocus={handlePlaceFocus}
42+
onBlur={handlePlaceBlur}
43+
isFocus={isPlaceFocus}
44+
/>
45+
</div>
46+
<div className={styles.InfoItem}>
47+
<Text variant="bodyXsm" color="secondary">
48+
음식명
49+
</Text>
50+
<Input
51+
placeholder="음식 이름"
52+
value={foodName}
53+
onChange={(e) => setFoodName(e.target.value)}
54+
onFocus={handleFoodFocus}
55+
onBlur={handleFoodBlur}
56+
isFocus={isFoodFocus}
57+
/>
1958
</div>
2059
</div>
2160
</div>
2261

2362
<div className={styles.Bottom}>
24-
<Button text="다시 스캔하기" variant="secondary" />
25-
<Button text="정보가 맞아요" />
63+
{isPlaceFocus || isFoodFocus ? (
64+
<Button text="수정하기" disabled={!placeName || !foodName} />
65+
) : (
66+
<>
67+
<Button text="다시 스캔하기" variant="secondary" />
68+
<Button text="정보가 맞아요" disabled={!placeName || !foodName} />
69+
</>
70+
)}
2671
</div>
2772
</div>
2873
);

src/components/ui/Input/Input.tsx

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,19 @@
1-
import { useState, forwardRef } from "react";
1+
import { forwardRef } from "react";
22

33
import classNames from "classnames";
44

55
import styles from "@/components/ui/Input/Input.module.scss";
66
import type { InputProps } from "@/components/ui/Input/Input.types";
77

88
const Input = forwardRef<HTMLInputElement, InputProps>(
9-
({ className, type, variant = "primary", ...props }, ref) => {
10-
const [isFocused, setIsFocused] = useState(false);
11-
12-
const handleFocus = () => setIsFocused(true);
13-
const handleBlur = () => setIsFocused(false);
14-
9+
({ className, type, variant = "primary", isFocus, ...props }, ref) => {
1510
return (
1611
<div
1712
className={classNames(styles.InputWrapper, styles[`style-${variant}`], {
18-
[styles.Focused]: isFocused,
13+
[styles.Focused]: isFocus,
1914
})}
2015
>
21-
<input
22-
type={type}
23-
ref={ref}
24-
className={classNames(styles.Input, className)}
25-
onFocus={handleFocus}
26-
onBlur={handleBlur}
27-
{...props}
28-
/>
16+
<input type={type} ref={ref} className={classNames(styles.Input, className)} {...props} />
2917
{variant === "primary" && <button>수정</button>}
3018
</div>
3119
);

src/components/ui/Input/Input.types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ type InputFieldVariant = "primary" | "secondary";
22

33
export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
44
variant?: InputFieldVariant;
5+
isFocus?: boolean;
56
}

src/hooks/common/useFocus.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useState } from "react";
2+
3+
export const useFocus = () => {
4+
const [isFocus, setIsFocus] = useState(false);
5+
6+
const onFocus = () => {
7+
setIsFocus(true);
8+
};
9+
10+
const onBlur = () => {
11+
setIsFocus(false);
12+
};
13+
14+
return { isFocus, onFocus, onBlur };
15+
};

0 commit comments

Comments
 (0)