Skip to content
This repository was archived by the owner on Jul 8, 2024. It is now read-only.

Commit 23ca2e2

Browse files
authored
fix: 프로그래머스 문제 api가 변경되어 fetch방법 수정 (#83)
* fix: 프로그래머스 문제 api가 변경되어 fetch방법 수정 * fix: 나의 문제 tab 생성 및 문제 제출시마다 성공한 문제를 fetch하도록 수정 * fix: 로그인이 안 된 상태일 때 나의 문제 tab을 생성하지 못하게끔 변경
1 parent ff217ff commit 23ca2e2

File tree

7 files changed

+62
-79
lines changed

7 files changed

+62
-79
lines changed

src/components/box/RefreshRequestBox.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import styled from 'styled-components';
22
import { theme } from '../../styles/theme';
33

44
type BoxProps = {
5+
children: React.ReactNode;
56
backgroundColor?: string;
67
color?: string;
78
};
89

9-
const RefreshRequestBox = ({ backgroundColor, color }: BoxProps) => {
10+
const RefreshRequestBox = ({ children, backgroundColor, color }: BoxProps) => {
1011
return (
1112
<BoxStyle backgroundColor={backgroundColor} color={color}>
12-
새로고침을 해주세요!
13+
{children}
1314
</BoxStyle>
1415
);
1516
};

src/components/button/CreateSolutionsButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const CreateSolutionsButton = (href: ButtonProps) => {
2626
return (
2727
<>
2828
<Modal isOpen={isModalOpen} closeModal={() => setIsModalOpen(false)}>
29-
<RefreshRequestBox />
29+
<RefreshRequestBox>새로고침을 해주세요!</RefreshRequestBox>
3030
</Modal>
3131
<ButtonStyle onClick={createSolutionTab}>저장된 모든 풀이</ButtonStyle>
3232
</>

src/constants/url.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ const PROBLEM_URL =
66

77
const SOLVING_PROBLEM_URL = 'https://school.programmers.co.kr/learn/courses/30/lessons/';
88

9-
export { ALL_PROBLEM_URL, PROBLEM_URL, SOLVING_PROBLEM_URL };
9+
const USER_INFO_URL = 'https://school.programmers.co.kr/api/v1/users/current';
10+
11+
export { ALL_PROBLEM_URL, PROBLEM_URL, SOLVING_PROBLEM_URL, USER_INFO_URL };
Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { fetchRequest } from '../../utils/fetchRequest';
22
import { PROBLEM_URL } from '../../constants/url';
3-
import { Message } from '../../types/global';
43

54
const getSuccessProblemIdList = async () => {
6-
const lastPage = await getEndPageNumber();
7-
const promisedFetchedDataList = [...new Array(lastPage)].map((_, idx) =>
5+
const { totalPages } = await fetchRequest({ url: PROBLEM_URL + 1 });
6+
7+
const promisedFetchedDataList = [...new Array(totalPages)].map((_, idx) =>
88
fetchProblemPageList(idx + 1),
99
);
10-
const fetchedDataList = await Promise.all(promisedFetchedDataList);
1110

11+
const fetchedDataList = await Promise.all(promisedFetchedDataList);
1212
return fetchedDataList
1313
.reduce((prev, curr) => [...prev, ...curr], [])
1414
.map(({ id }: { id: string }) => id);
@@ -18,51 +18,3 @@ export { getSuccessProblemIdList };
1818

1919
const fetchProblemPageList = async (pageNum: number) =>
2020
(await fetchRequest({ url: PROBLEM_URL + pageNum })).result;
21-
22-
const getEndPageNumber = async () => {
23-
const end = await initEndPageNum();
24-
return binarySearch({ start: end / 2, end });
25-
};
26-
27-
const initEndPageNum = async () => {
28-
let pageNum = 1;
29-
30-
while (true) {
31-
const isProblemListEmpty = await checkProblemListEmpty(pageNum);
32-
33-
if (isProblemListEmpty) {
34-
break;
35-
}
36-
pageNum *= 2;
37-
}
38-
39-
return pageNum;
40-
};
41-
42-
const checkProblemListEmpty = async (pageNum: number) => {
43-
const problemPageList = await fetchProblemPageList(pageNum);
44-
return problemPageList.length === 0;
45-
};
46-
47-
type binarySearchType = {
48-
start: number;
49-
end: number;
50-
};
51-
const binarySearch = async ({ start, end }: binarySearchType) => {
52-
while (start <= end) {
53-
let mid = Math.floor((start + end) / 2);
54-
const isMidPageEmpty = (await fetchProblemPageList(mid)).length;
55-
56-
if (isMidPageEmpty) {
57-
start = mid + 1;
58-
continue;
59-
}
60-
61-
const isPrevMidPageEmpty = (await fetchProblemPageList(mid - 1)).length;
62-
63-
if (isPrevMidPageEmpty) {
64-
return mid - 1;
65-
}
66-
end = mid - 1;
67-
}
68-
};

src/pages/background/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,16 @@ import { postCurrentSolution } from './postCurrentSolution';
22
import { getAllSolutions } from './getAllSolutions';
33
import { createSolutionsTab } from './createSolutionsTab';
44
import { createSuccessProblemTab } from './createSuccessProblemTab';
5-
import { getSuccessProblemIdList } from './getSuccessProblems';
5+
import { setSolvedProblems } from './setSolvedProblems';
66

77
export const createChromeTab = (url: string) =>
88
chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
99
const tabIndex = tabs[0]!.index;
1010
chrome.tabs.create({ url, index: tabIndex + 1 });
1111
});
1212

13-
chrome.runtime.onInstalled.addListener(details => {
14-
chrome.storage.local.get(['solvedProblem'], async response => {
15-
const { solvedProblem } = response;
16-
chrome.storage.local.set({
17-
solvedProblem: 'solvedProblem' in response ? solvedProblem : await getSuccessProblemIdList(),
18-
});
19-
});
20-
});
21-
2213
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
14+
setSolvedProblems();
2315
const message = { request, sender, sendResponse };
2416

2517
if (request.method === 'postCurrentSolution') {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { getSuccessProblemIdList } from './getSuccessProblems';
2+
3+
const setSolvedProblems = () => {
4+
chrome.storage.local.get(['solvedProblem'], async response => {
5+
chrome.storage.local.set({
6+
solvedProblem: await getSuccessProblemIdList(),
7+
});
8+
});
9+
};
10+
11+
export { setSolvedProblems };

src/pages/content/problemPage.tsx

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,57 @@ import { theme } from '../../styles/theme';
66
import Profile from '../../../assets/icons/Profile.svg';
77
import Modal from '../../components/modal/Modal';
88
import RefreshRequestBox from '../../components/box/RefreshRequestBox';
9+
import { USER_INFO_URL as url } from '../../constants/url';
10+
import { fetchRequest } from '../../utils/fetchRequest';
911

1012
const OpenSuccessTabButton = () => {
1113
const [isModalOpen, setIsModalOpen] = React.useState(false);
14+
const [isLoggedIn, setIsLoggedIn] = React.useState(false);
1215

13-
const createSuccessProblemTab = () => {
14-
if (chrome.runtime?.id === undefined) {
15-
setIsModalOpen(true);
16-
return;
17-
}
18-
19-
chrome.runtime.sendMessage({
20-
method: 'createSuccessProblemTab',
21-
});
22-
};
16+
React.useEffect(() => {
17+
(async () => {
18+
const { isLoggedIn } = await fetchRequest({ url });
19+
setIsLoggedIn(isLoggedIn);
20+
})();
21+
}, []);
2322

2423
return (
2524
<>
2625
<Modal isOpen={isModalOpen} closeModal={() => setIsModalOpen(false)}>
27-
<RefreshRequestBox backgroundColor={theme.color.jetBlack} color={theme.color.white} />
26+
<RefreshRequestBox backgroundColor={theme.color.jetBlack} color={theme.color.white}>
27+
새로고침을 해주세요!
28+
</RefreshRequestBox>
2829
</Modal>
29-
<ButtonStyle onClick={createSuccessProblemTab}>
30-
<ToolTipStyle>나의 풀이 바로가기</ToolTipStyle>
30+
<ButtonStyle onClick={() => createSuccessProblemTab({ isLoggedIn, setIsLoggedIn })}>
31+
{isLoggedIn && <ToolTipStyle>나의 풀이 바로가기</ToolTipStyle>}
32+
{isLoggedIn || <ToolTipStyle>로그인을 해주세요!</ToolTipStyle>}
3133
<Profile />
3234
</ButtonStyle>
3335
</>
3436
);
3537
};
3638

39+
type ProblemTabType = {
40+
isLoggedIn: boolean;
41+
setIsLoggedIn: (isModalOpen: boolean) => void;
42+
};
43+
44+
const createSuccessProblemTab = ({ isLoggedIn, setIsLoggedIn }: ProblemTabType) => {
45+
if (!isLoggedIn) {
46+
alert(`프로그래머스에 로그아웃이 된 상태입니다.\n로그인을 해주세요!`);
47+
return;
48+
}
49+
50+
if (chrome.runtime?.id === undefined) {
51+
setIsLoggedIn(true);
52+
return;
53+
}
54+
55+
chrome.runtime.sendMessage({
56+
method: 'createSuccessProblemTab',
57+
});
58+
};
59+
3760
const ButtonStyle = styled.button`
3861
display: flex;
3962
justify-content: space-between;
@@ -42,6 +65,8 @@ const ButtonStyle = styled.button`
4265
top: 85%;
4366
right: 5%;
4467
z-index: 10000;
68+
border: none;
69+
background: none;
4570
svg {
4671
filter: drop-shadow(#707373 0px 5px 5px);
4772
transition: all 0.2s linear;

0 commit comments

Comments
 (0)