Skip to content

Commit

Permalink
feat: 영수증 정보 수정 페이지 focus, disabled 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
sikkzz committed Feb 1, 2025
1 parent 2e098e9 commit eb3178c
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 25 deletions.
5 changes: 3 additions & 2 deletions src/components/ReceiptEdit/ReceiptEdit.module.scss
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@
.Top {
z-index: 1;

& > h1 {
.TitleBox {
display: flex;
justify-content: center;
margin-top: 2.5rem;
white-space: pre-line;
}
}

Expand Down
59 changes: 52 additions & 7 deletions src/components/ReceiptEdit/ReceiptEdit.tsx
Original file line number Diff line number Diff line change
@@ -1,28 +1,73 @@
import { useState } from "react";

import styles from "@/components/ReceiptEdit/ReceiptEdit.module.scss";
import Button from "@/components/ui/Button/Button";
import Input from "@/components/ui/Input/Input";
import Text from "@/components/ui/Text/Text";

import { useFocus } from "@/hooks/common/useFocus";

const ReceiptEdit = () => {
const placeName = "청담커피 앤 토스트";
const [placeName, setPlaceName] = useState("청담커피 앤 토스트");
const [foodName, setFoodName] = useState("카야토스트+음료세트");

const { isFocus: isPlaceFocus, onFocus: handlePlaceFocus, onBlur: handlePlaceBlur } = useFocus();
const { isFocus: isFoodFocus, onFocus: handleFoodFocus, onBlur: handleFoodBlur } = useFocus();

return (
<div className={styles.ReceiptEdit}>
<div className={styles.Top}>
<Text variant="titleM" color="primary" align="center" as="h1">
{`${placeName}에\n다녀오셨네요!`}
<div className={styles.TitleBox}>
<Text variant="titleM" color="primary" as="h1" truncated>
{placeName}
</Text>
<Text variant="titleM" color="primary" as="h1">
</Text>
</div>
<Text variant="titleM" color="primary" as="h1" align="center">
다녀오셨네요!
</Text>

<div className={styles.InfoList}>
<div className={styles.InfoItem}>
<p>가게명</p>
<Input placeholder="가게 이름" />
<Text variant="bodyXsm" color="secondary">
가게명
</Text>
<Input
placeholder="가게 이름"
value={placeName}
onChange={(e) => setPlaceName(e.target.value)}
onFocus={handlePlaceFocus}
onBlur={handlePlaceBlur}
isFocus={isPlaceFocus}
/>
</div>
<div className={styles.InfoItem}>
<Text variant="bodyXsm" color="secondary">
음식명
</Text>
<Input
placeholder="음식 이름"
value={foodName}
onChange={(e) => setFoodName(e.target.value)}
onFocus={handleFoodFocus}
onBlur={handleFoodBlur}
isFocus={isFoodFocus}
/>
</div>
</div>
</div>

<div className={styles.Bottom}>
<Button text="다시 스캔하기" variant="secondary" />
<Button text="정보가 맞아요" />
{isPlaceFocus || isFoodFocus ? (
<Button text="수정하기" disabled={!placeName || !foodName} />
) : (
<>
<Button text="다시 스캔하기" variant="secondary" />
<Button text="정보가 맞아요" disabled={!placeName || !foodName} />
</>
)}
</div>
</div>
);
Expand Down
20 changes: 4 additions & 16 deletions src/components/ui/Input/Input.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,19 @@
import { useState, forwardRef } from "react";
import { forwardRef } from "react";

import classNames from "classnames";

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

const Input = forwardRef<HTMLInputElement, InputProps>(
({ className, type, variant = "primary", ...props }, ref) => {
const [isFocused, setIsFocused] = useState(false);

const handleFocus = () => setIsFocused(true);
const handleBlur = () => setIsFocused(false);

({ className, type, variant = "primary", isFocus, ...props }, ref) => {
return (
<div
className={classNames(styles.InputWrapper, styles[`style-${variant}`], {
[styles.Focused]: isFocused,
[styles.Focused]: isFocus,
})}
>
<input
type={type}
ref={ref}
className={classNames(styles.Input, className)}
onFocus={handleFocus}
onBlur={handleBlur}
{...props}
/>
<input type={type} ref={ref} className={classNames(styles.Input, className)} {...props} />
{variant === "primary" && <button>수정</button>}
</div>
);
Expand Down
1 change: 1 addition & 0 deletions src/components/ui/Input/Input.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ type InputFieldVariant = "primary" | "secondary";

export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
variant?: InputFieldVariant;
isFocus?: boolean;
}
15 changes: 15 additions & 0 deletions src/hooks/common/useFocus.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { useState } from "react";

export const useFocus = () => {
const [isFocus, setIsFocus] = useState(false);

const onFocus = () => {
setIsFocus(true);
};

const onBlur = () => {
setIsFocus(false);
};

return { isFocus, onFocus, onBlur };
};

0 comments on commit eb3178c

Please sign in to comment.