Skip to content

Commit 07ea38f

Browse files
authored
Merge pull request Next-Room#83 from Next-Room/feat/hint-qa-finish
Feat/hint qa finish
2 parents aefd78d + 535574f commit 07ea38f

File tree

19 files changed

+78
-68
lines changed

19 files changed

+78
-68
lines changed

app/(shared)/(ThemeTextField)/Container.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export default function ThemeTextField({
2323
inputRef,
2424
handleInputChange,
2525
handleInputBlur,
26-
} = useTextField({ id, content, checkErrorText });
26+
} = useTextField({ id, content, inputType, checkErrorText });
2727

2828
return (
2929
<div tabIndex={isFocus ? -1 : tabIndex} onFocus={() => setIsFocus(true)}>
@@ -54,7 +54,7 @@ export default function ThemeTextField({
5454
className={classNames("theme-textfield-input", {
5555
error: errorText,
5656
})}
57-
type={inputType}
57+
type="text"
5858
value={inputValue}
5959
placeholder={inputPlaceholder}
6060
onChange={handleInputChange}

app/(shared)/(ThemeTextField)/TextFieldType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export type ThemeInfoTextFieldType = {
66
title?: string;
77
content: string;
88
infoText?: string;
9-
inputType?: string;
9+
inputType?: "text" | "number";
1010
inputPlaceholder?: string;
1111
checkErrorText?: ValidationFunction<unknown>;
1212
};

app/(shared)/(ThemeTextField)/useTextField.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ThemeInfoTextFieldType } from "./TextFieldType";
88
const useTextField = ({
99
id,
1010
content,
11+
inputType,
1112
checkErrorText,
1213
}: ThemeInfoTextFieldType) => {
1314
const [inputValue, setInputValue] = useState<string>(content || "");
@@ -39,9 +40,11 @@ const useTextField = ({
3940

4041
const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {
4142
const cur = e.target.value;
42-
if (cur.length > 1 && cur.length === cur.split("0").length - 1) {
43-
setInputValue("0");
44-
return;
43+
if (inputType === "number") {
44+
if (cur.length > 1 && cur.length === cur.split("0").length - 1) {
45+
setInputValue("0");
46+
return;
47+
}
4548
}
4649
const error = checkErrorText ? checkErrorText(cur) : "";
4750
if (error) {

app/admin-new/(components)/CreateTheme/createTheme.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export const timeTextFieldProps: ThemeInfoTextFieldType = {
5656
title: "탈출 제한 시간(분)",
5757
content: "",
5858
infoText: "",
59-
inputType: "text",
59+
inputType: "number",
6060
inputPlaceholder: "분 단위 숫자로 입력해 주세요",
6161
checkErrorText: timeValidations,
6262
};
@@ -67,7 +67,7 @@ export const hintCountTextFieldProps: ThemeInfoTextFieldType = {
6767
title: "사용 가능한 힌트 수",
6868
content: "",
6969
infoText: "",
70-
inputType: "text",
70+
inputType: "number",
7171
inputPlaceholder: "숫자로 입력해 주세요",
7272
checkErrorText: hintValidations,
7373
};

app/admin-new/(components)/Sidebar.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getSelectedThemeId,
1515
getStatus,
1616
removeAccessToken,
17+
removeThemeId,
1718
} from "@/utils/localStorage";
1819
import { useSelectedThemeReset } from "@/components/atoms/selectedTheme.atom";
1920
import { useIsLoggedInWrite } from "@/components/atoms/account.atom";
@@ -64,7 +65,13 @@ export default function Sidebar(props: Props) {
6465
};
6566
const handleSelectTheme = (theme: Theme) => {
6667
if (drawer.isOpen && !drawer.isSameHint) {
67-
open(HintDialog, { type: "put", fn: () => handleClickSelected(theme) });
68+
open(HintDialog, {
69+
type: "put",
70+
fn: () => {
71+
handleClickSelected(theme);
72+
setDrawer({ ...drawer, isOpen: false });
73+
},
74+
});
6875
} else {
6976
setDrawer({ ...drawer, isOpen: false });
7077
handleClickSelected(theme);
@@ -75,6 +82,7 @@ export default function Sidebar(props: Props) {
7582
if (drawer.isOpen && !drawer.isSameHint) {
7683
open(HintDialog, { type: "put", fn: navigateToNewTheme });
7784
} else {
85+
removeThemeId();
7886
setDrawer({ ...drawer, isOpen: false });
7987
navigateToNewTheme();
8088
}

app/admin-new/(components)/ThemeDrawer/Container.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,7 @@ import {
1414
import { DrawerType } from "./types/themeDrawerTypes";
1515
import useEditHint from "./hooks/useEditHint";
1616

17-
const ThemeDrawer = ({
18-
onCloseDrawer,
19-
hintType,
20-
handleHintCreate,
21-
}: DrawerType) => {
17+
const ThemeDrawer = ({ hintType, handleHintCreate }: DrawerType) => {
2218
const [selectedHint] = useSelectedHint();
2319
const {
2420
handleSubmit,
@@ -31,7 +27,7 @@ const ThemeDrawer = ({
3127
isImcomplete,
3228
deleteHintBtn,
3329
handleOpenHintModal,
34-
} = useEditHint({ onCloseDrawer, hintType, handleHintCreate });
30+
} = useEditHint({ hintType, handleHintCreate });
3531

3632
return (
3733
<form
@@ -116,4 +112,4 @@ const ThemeDrawer = ({
116112
</form>
117113
);
118114
};
119-
export default ThemeDrawer;
115+
export default ThemeDrawer;

app/admin-new/(components)/ThemeDrawer/consts/themeDrawerProps.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const rateTextFieldProps: ThemeInfoTextFieldType = {
2222
title: "문제 진행률(%)",
2323
content: "",
2424
infoText: "",
25-
inputType: "text",
25+
inputType: "number",
2626
inputPlaceholder: "",
2727
checkErrorText: progressValidations,
2828
};

app/admin-new/(components)/ThemeDrawer/helpers/textFieldHelpers.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ export const codeValidations = (value: unknown) => {
88
) {
99
return "숫자로 입력해 주세요.";
1010
}
11+
if (strValue.length > 4) {
12+
return "네자리만 사용할 수 있습니다.";
13+
}
1114
if (numValue > 9999) {
1215
return "네자리만 사용할 수 있습니다.";
1316
}

app/admin-new/(components)/ThemeDrawer/hooks/useEditHint.ts

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
InitialSelectedHint,
66
SelectedHintType,
77
useSelectedHint,
8+
useSelectedHintReset,
89
} from "@/components/atoms/selectedHint.atom";
910
import { useSelectedThemeValue } from "@/components/atoms/selectedTheme.atom";
1011
import { useCreateHint } from "@/components/atoms/createHint.atom";
@@ -17,11 +18,7 @@ import { useDrawerState } from "@/components/atoms/drawer.atom";
1718

1819
import { DrawerType } from "../types/themeDrawerTypes";
1920

20-
const useEditHint = ({
21-
onCloseDrawer,
22-
hintType,
23-
handleHintCreate,
24-
}: DrawerType) => {
21+
const useEditHint = ({ hintType, handleHintCreate }: DrawerType) => {
2522
const { id: themeId } = useSelectedThemeValue();
2623

2724
const selectedTheme = useSelectedThemeValue();
@@ -32,6 +29,7 @@ const useEditHint = ({
3229
const [answerImages, setAnswerImages] = useState<File[]>([]);
3330

3431
const [isDisabled, setIsDisabled] = useState<boolean>(true);
32+
const resetSelectedHint = useSelectedHintReset();
3533

3634
const drawerRef = useRef<HTMLFormElement>(null);
3735

@@ -53,6 +51,16 @@ const useEditHint = ({
5351
createHint.answer
5452
);
5553

54+
const onCloseDrawer = () => {
55+
const element = document.querySelector(".theme-info-modal.delete");
56+
if (element) {
57+
setDrawer({ ...drawer, isOpen: true });
58+
} else {
59+
setDrawer({ ...drawer, isOpen: false });
60+
resetSelectedHint();
61+
}
62+
};
63+
5664
const isSameHint =
5765
String(createHint.hintCode) === String(selectedHint.hintCode) &&
5866
Number(createHint.progress) === Number(selectedHint.progress) &&
@@ -66,23 +74,11 @@ const useEditHint = ({
6674
Boolean(!answerImages.length);
6775

6876
useEffect(() => {
69-
const isSameHint =
70-
String(createHint.hintCode) === String(selectedHint.hintCode) &&
71-
Number(createHint.progress) === Number(selectedHint.progress) &&
72-
String(createHint.contents) === String(selectedHint.contents) &&
73-
String(createHint.answer) === String(selectedHint.answer) &&
74-
// 서버에 올라간 사진 삭제 여부를 비교
75-
createHint.hintImageUrlList === selectedHint.hintImageUrlList &&
76-
createHint.answerImageUrlList === selectedHint.answerImageUrlList &&
77-
// 로컬 업로드 사진 하나라도 있으면 변경된 것
78-
Boolean(!hintImages.length) &&
79-
Boolean(!answerImages.length);
80-
8177
setDrawer((prevDrawer) => ({
8278
...prevDrawer,
8379
isSameHint,
8480
}));
85-
}, [createHint, selectedHint]);
81+
}, [isSameHint, createHint, selectedHint]);
8682

8783
useEffect(() => {
8884
if (drawer.hintType === "Add") {
@@ -112,10 +108,8 @@ const useEditHint = ({
112108
...prev,
113109
contents: selectedHint.contents,
114110
answer: selectedHint.answer,
115-
answerImageUrlList: selectedHint.answerImageUrlList,
116-
hintImageUrlList: selectedHint.hintImageUrlList,
117111
}));
118-
}, [hintType, selectedHint]);
112+
}, [hintType, selectedHint, setCreateHint]);
119113

120114
const { handleProcess } = useHintUpload();
121115
const handleSubmit = async (e: FormEvent) => {
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
export interface OnCloseDrawerType {
2-
onCloseDrawer: () => void;
3-
}
4-
51
type HintType = {
62
hintType: string;
73
handleHintCreate: (type: string) => void;
84
};
95

10-
export type DrawerType = OnCloseDrawerType & HintType;
6+
export type DrawerType = HintType;

0 commit comments

Comments
 (0)