Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 7 additions & 1 deletion src/pages/SignInPage/PasswordInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,21 @@ import TextField from "@components/TextField";
interface Props {
password: string;
handleChangePassword: React.ChangeEventHandler<HTMLInputElement>;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

const PasswordInput = ({ password, handleChangePassword }: Props) => {
const PasswordInput = ({
password,
handleChangePassword,
onKeyDown,
}: Props) => {
return (
<TextField
label="비밀번호"
type="password"
value={password}
onChange={handleChangePassword}
onKeyDown={onKeyDown}
/>
);
};
Expand Down
8 changes: 8 additions & 0 deletions src/pages/SignInPage/SignInPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ const SignInPage = () => {
});
};

const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === "Enter" && !isSignInButtonDisabled) {
handleClickSignInButton();
}
};

return (
<div className="h-screen bg-gray-50">
<div className="h-full flex">
Expand Down Expand Up @@ -71,10 +77,12 @@ const SignInPage = () => {
<UserIdInput
userId={userId}
handleChangeUserId={handleChangeUserId}
onKeyDown={handleKeyDown}
/>
<PasswordInput
password={password}
handleChangePassword={handleChangePassword}
onKeyDown={handleKeyDown}
/>
</div>

Expand Down
10 changes: 8 additions & 2 deletions src/pages/SignInPage/UserIdInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@ import TextField from "@components/TextField";
interface Props {
userId: string;
handleChangeUserId: React.ChangeEventHandler<HTMLInputElement>;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

const UserIdInput = ({ userId, handleChangeUserId }: Props) => {
const UserIdInput = ({ userId, handleChangeUserId, onKeyDown }: Props) => {
return (
<TextField label="아이디" value={userId} onChange={handleChangeUserId} />
<TextField
label="아이디"
value={userId}
onChange={handleChangeUserId}
onKeyDown={onKeyDown}
/>
);
};

Expand Down
6 changes: 5 additions & 1 deletion src/pages/SignUpPage/EmailInput.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { ChangeEvent } from "react";
import { TextField, Tooltip } from "@mui/material";
import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
import TextFieldComponent from "@components/TextField";

export interface EmailInputProps {
email: string;
handleChangeEmail: (e: ChangeEvent<HTMLInputElement>) => void;
error?: boolean;
helperText?: string;
onBlur?: () => void;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

const isValidEmail = (email: string) =>
Expand All @@ -19,6 +21,7 @@ const EmailInput = ({
error,
helperText,
onBlur,
onKeyDown,
}: EmailInputProps) => {
const isError = error || (email && !isValidEmail(email));
const errorMessage =
Expand All @@ -27,11 +30,12 @@ const EmailInput = ({

return (
<div style={{ position: "relative" }}>
<TextField
<TextFieldComponent
label="이메일"
value={email}
onChange={handleChangeEmail}
onBlur={onBlur}
onKeyDown={onKeyDown}
fullWidth
required
variant="outlined"
Expand Down
6 changes: 5 additions & 1 deletion src/pages/SignUpPage/NameInput.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { ChangeEvent } from "react";
import { TextField, Tooltip } from "@mui/material";
import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
import TextFieldComponent from "@components/TextField";

export interface NameInputProps {
name: string;
handleChangeName: (e: ChangeEvent<HTMLInputElement>) => void;
error?: boolean;
helperText?: string;
onBlur?: () => void;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

const isValidName = (name: string) => {
Expand All @@ -20,6 +22,7 @@ const NameInput = ({
error,
helperText,
onBlur,
onKeyDown,
}: NameInputProps) => {
const isError = error || (name && !isValidName(name));
const errorMessage =
Expand All @@ -30,13 +33,14 @@ const NameInput = ({

return (
<div style={{ position: "relative" }}>
<TextField
<TextFieldComponent
fullWidth
required
label="이름"
value={name}
onChange={handleChangeName}
onBlur={onBlur}
onKeyDown={onKeyDown}
error={isError}
placeholder="2자 이상 20자 이하로 입력해주세요"
InputProps={{
Expand Down
9 changes: 7 additions & 2 deletions src/pages/SignUpPage/PasswordInput.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ChangeEvent } from "react";
import { TextField, Tooltip } from "@mui/material";
import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
import TextFieldComponent from "@components/TextField";

export interface PasswordInputProps {
password: string;
Expand All @@ -10,6 +11,7 @@ export interface PasswordInputProps {
error?: boolean;
helperText?: string;
onBlur?: () => void;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

const isValidPassword = (pw: string) =>
Expand All @@ -25,6 +27,7 @@ const PasswordInput = ({
error,
helperText,
onBlur,
onKeyDown,
}: PasswordInputProps) => {
const isPasswordError = error || (password && !isValidPassword(password));
const isPasswordCheckError =
Expand All @@ -45,7 +48,7 @@ const PasswordInput = ({
return (
<>
<div style={{ position: "relative" }}>
<TextField
<TextFieldComponent
fullWidth
required
type="password"
Expand All @@ -62,10 +65,11 @@ const PasswordInput = ({
</Tooltip>
),
}}
onKeyDown={onKeyDown}
/>
</div>
<div style={{ position: "relative" }}>
<TextField
<TextFieldComponent
fullWidth
required
type="password"
Expand All @@ -86,6 +90,7 @@ const PasswordInput = ({
</Tooltip>
),
}}
onKeyDown={onKeyDown}
/>
</div>
</>
Expand Down
21 changes: 16 additions & 5 deletions src/pages/SignUpPage/PhoneNumberInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@ export interface PhoneNumberInputProps {
error?: boolean;
helperText?: string;
onBlur?: () => void;
onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}


const isValidPhoneNumber = (phone: string) => {
return /^01[0|1|6|7|8|9]-\d{3,4}-\d{4}$/.test(phone) && (phone.length === 12 || phone.length === 13);
}
return (
/^01[0|1|6|7|8|9]-\d{3,4}-\d{4}$/.test(phone) &&
(phone.length === 12 || phone.length === 13)
);
};

const formatPhoneNumber = (input: string): string => {
const cleanedInput = input.replace(/[^0-9]/g, "");
Expand All @@ -25,7 +28,10 @@ const formatPhoneNumber = (input: string): string => {
} else if (cleanedInput.length <= 6) {
formattedNumber = cleanedInput.replace(/^(\d{2})(\d{0,4})/, "$1-$2");
} else {
formattedNumber = cleanedInput.replace(/^(\d{2})(\d{4})(\d{4})/, "$1-$2-$3");
formattedNumber = cleanedInput.replace(
/^(\d{2})(\d{4})(\d{4})/,
"$1-$2-$3"
);
}
if (formattedNumber.length > 11) {
formattedNumber = formattedNumber.slice(0, 11);
Expand All @@ -36,7 +42,10 @@ const formatPhoneNumber = (input: string): string => {
} else if (cleanedInput.length <= 7) {
formattedNumber = cleanedInput.replace(/^(\d{3})(\d{0,4})/, "$1-$2");
} else {
formattedNumber = cleanedInput.replace(/^(\d{3})(\d{4})(\d{4})/, "$1-$2-$3");
formattedNumber = cleanedInput.replace(
/^(\d{3})(\d{4})(\d{4})/,
"$1-$2-$3"
);
}
if (formattedNumber.length > 13) {
formattedNumber = formattedNumber.slice(0, 13);
Expand All @@ -52,6 +61,7 @@ const PhoneNumberInput = ({
error,
helperText,
onBlur,
onKeyDown,
}: PhoneNumberInputProps) => {
const isError = error || (phoneNumber && !isValidPhoneNumber(phoneNumber));
const errorMessage =
Expand Down Expand Up @@ -80,6 +90,7 @@ const PhoneNumberInput = ({
value={phoneNumber}
onChange={handleChange}
onBlur={onBlur}
onKeyDown={onKeyDown}
placeholder="010-1234-5678"
type="tel"
fullWidth
Expand Down
28 changes: 28 additions & 0 deletions src/pages/SignUpPage/SignUpPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,27 @@ const SignUpPage = () => {
}
};

const handleKeyDown = (e: React.KeyboardEvent) => {
if (
e.key === "Enter" &&
name &&
userId &&
email &&
password &&
passwordCheck &&
phoneNumber &&
questionAnswer &&
isValidName(name) &&
isValidUserId(userId) &&
isValidEmail(email) &&
isValidPassword(password) &&
isValidPhoneNumber(phoneNumber) &&
password === passwordCheck
) {
handleClickSignUpButton();
}
};

const handleClickSignUpButton = () => {
if (!isValidName(name)) {
toast.error("이름을 올바르게 입력해주세요.");
Expand Down Expand Up @@ -166,27 +187,32 @@ const SignUpPage = () => {
name={name}
handleChangeName={handleChangeName}
onBlur={() => handleBlur("name", name)}
onKeyDown={handleKeyDown}
/>
<UserIdInput
userId={userId}
handleChangeUserId={handleChangeUserId}
onBlur={() => handleBlur("userId", userId)}
onKeyDown={handleKeyDown}
/>
<EmailInput
email={email}
handleChangeEmail={handleChangeEmail}
onBlur={() => handleBlur("email", email)}
onKeyDown={handleKeyDown}
/>
<PasswordInput
password={password}
passwordCheck={passwordCheck}
handleChangePassword={handleChangePassword}
handleChangePasswordCheck={handleChangePasswordCheck}
onKeyDown={handleKeyDown}
/>
<PhoneNumberInput
phoneNumber={phoneNumber}
handleChangePhoneNumber={handleChangePhoneNumber}
onBlur={() => handleBlur("phoneNumber", phoneNumber)}
onKeyDown={handleKeyDown}
/>

{/* Password Question Fields */}
Expand All @@ -196,6 +222,7 @@ const SignUpPage = () => {
value={passwordQuestionUid}
onChange={(e) => setPasswordQuestionUid(e.target.value)}
label="비밀번호 찾기 질문"
onKeyDown={handleKeyDown}
>
{PASSWORD_QUESTIONS.map((q) => (
<MenuItem key={q.uid} value={q.uid}>
Expand All @@ -212,6 +239,7 @@ const SignUpPage = () => {
value={questionAnswer}
onChange={(e) => setQuestionAnswer(e.target.value)}
placeholder="질문에 대한 답변을 입력해주세요"
onKeyDown={handleKeyDown}
/>
</div>

Expand Down