1. 타이머
// Timer 컴포넌트
const Timer = ({ type }) => {
const [date, setDate] = useState(new Date());
useEffect(() => {
const timer = setInterval(() => {
setDate(new Date());
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
return (
<Wrapper type={type}>
<h2>{dateLocalFunc(date, type)}</h2>
</Wrapper>
);
};
//utils/constant.js
export const DATE_LOCAL_OPTIONS_KR = {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
timeZone: 'Asia/seoul',
};
//utils/date.js
export const dateLocalFunc = (date, type) =>
type === 'KR'
? date.toLocaleString('ko-KR', DATE_LOCAL_OPTIONS_KR)
: date.toLocaleString('en-US', DATE_LOCAL_OPTIONS_KR);
2. 입력
//utils/regex.js
export const inputRegEx = /^(([0-9])+[\s]?,[\s]?)*([0-9]+)$/;
const inputValidator = (str) => setInputError(!inputRegEx.test(str));
const onInputChange = (e) => {
setInputTxt(e.target.value);
inputValidator(e.target.value);
};
const onInputKeyPress = (e) => {
if (e.key === 'Enter') {
onSort();
}
};
//생략..
//jsx 부분
<InputNums
value={inputTxt}
ref={inputRef}
onChange={onInputChange}
onKeyPress={onInputKeyPress}
/>
<Error isError={inputError && inputTxt} />
3. 시작 버튼 및 결과
//utils/stringToArray.js
export const stringToArray = (str) =>
str
.trim()
.split(',')
.map((str) => parseInt(str));
const onSort = () => {
const target = stringToArray(inputTxt);
setAscend('Loading...');
setDescend('Loading...');
new Promise((resolve, _reject) => {
setAscend(bubbleSort(target, 'asc').join(', '));
btnRef.current.disabled = true;
inputRef.current.disabled = true;
setTimeout(() => {
resolve();
}, 3000);
}).then(() => {
setDescend(bubbleSort(target, 'desc').join(', '));
btnRef.current.disabled = false;
inputRef.current.disabled = false;
});
};
//생략..
//jsx 부분
<StartButton
type="button"
ref={btnRef}
disabled={inputError}
onClick={onSort}>
시작 버튼
</StartButton>
//utils/constant.js
export const SORT = {
ASC: 'asc',
DESC: 'desc',
};
export const bubbleSort = (arr, sortType) => {
let result = [...arr];
for (let i = 0; i < result.length - 1; i++) {
for (let j = 0; j < result.length - i; j++) {
if (
sortType === SORT.ASC
? result[j] > result[j + 1]
: result[j] < result[j + 1]
) {
[result[j], result[j + 1]] = [result[j + 1], result[j]];
}
}
}
return result;
};