Skip to content

Commit 7597c71

Browse files
authored
Merge pull request #59 from hs-shell/develop
refactor: fix unused variable warnings and apply lint rules
2 parents 2869a08 + f495454 commit 7597c71

29 files changed

+457
-156
lines changed

package-lock.json

Lines changed: 370 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@
2626
"@radix-ui/react-tabs": "^1.1.2",
2727
"@radix-ui/react-toast": "^1.2.4",
2828
"@radix-ui/react-tooltip": "^1.1.7",
29+
"@types/gapi.client.calendar": "^3.0.12",
2930
"axios": "^1.12.0",
3031
"class-variance-authority": "^0.7.1",
3132
"clsx": "^2.1.1",
3233
"date-fns": "^4.1.0",
3334
"framer-motion": "^12.0.6",
3435
"glob": "^11.0.1",
36+
"googleapis": "^160.0.0",
3537
"lucide-react": "^0.471.2",
3638
"node-fetch": "^3.3.2",
3739
"react": "^18.3.1",

src/background.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ chrome.alarms.onAlarm.addListener((alarm) => {
7979
/**
8080
* 메시지를 통해 알람 예약 및 취소 요청을 처리하는 리스너
8181
*/
82-
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
82+
chrome.runtime.onMessage.addListener((message, _, sendResponse) => {
8383
if (message.action === 'scheduleAlarm') {
8484
const { alarmId, dateTime, title, message: alarmMessage } = message;
8585
schedulePreEventAlarm(alarmId, dateTime, title, alarmMessage);

src/content/App.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/popover
22
import { useEffect, useMemo, useState } from 'react';
33
import icon from '@/assets/icon.png';
44
import exit from '@/assets/exit.png';
5-
import { Assign, Filters, Quiz, TAB_TYPE, Vod } from './types';
5+
import { Assign, CourseBase, Filters, Quiz, TAB_TYPE, Vod } from './types';
66
import { ListFilter, OctagonAlert, RefreshCw, Search } from 'lucide-react';
77
import filter from '@/assets/filter.svg';
88
import PopoverFooter from './components/PopoverFooter';
@@ -29,18 +29,19 @@ const submitOptions = [
2929

3030
export default function App() {
3131
const { courses } = useGetCourses();
32+
const typeCourses: CourseBase[] = courses;
3233

3334
// 데이터 관련 상태를 useCourseData 커스텀 훅으로 관리
34-
const { vods, assigns, quizes, isPending, remainingTime, refreshTime, isError, updateData, setIsPending } =
35-
useCourseData(courses);
35+
const { vods, assigns, quizes, isPending, remainingTime, isError, updateData, setIsPending } =
36+
useCourseData(typeCourses);
3637

3738
// activeTab의 타입을 TAB_TYPE으로 지정
3839
const [activeTab, setActiveTab] = useState<TAB_TYPE>(TAB_TYPE.VIDEO);
3940
const [isOpen, setIsOpen] = useState(false);
4041
const [searchTerm, setSearchTerm] = useState('');
41-
const [vodSortBy, setVodSortBy] = useState<keyof Vod>('isAttendance');
42-
const [assignSortBy, setAssignSortBy] = useState<keyof Assign>('isSubmit');
43-
const [quizSortBy, setQuizSortBy] = useState<keyof Quiz>('dueDate');
42+
const [vodSortBy] = useState<keyof Vod>('isAttendance');
43+
const [assignSortBy] = useState<keyof Assign>('isSubmit');
44+
const [quizSortBy] = useState<keyof Quiz>('dueDate');
4445
const [isFilterOpen, setIsFilterOpen] = useState(false);
4546

4647
// 필터 상태 관리 - Record을 사용하여 TAB_TYPE을 키로 지정

src/content/components/PendingDialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useState, useEffect } from 'react';
22
import ReactDOM from 'react-dom';
3-
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
3+
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
44
import { Button } from '@/components/ui/button';
55
import { Loader2 } from 'lucide-react';
66
import styles from '@/styles/shadow.css?inline';

src/content/components/Video.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,13 @@ export default function Video({ courseData }: Props) {
158158
</div>
159159
<div className="font-light text-zinc-500 text-ellipsis line-clamp-1" style={{ fontSize: 10 }}>
160160
{formatDateString(vod.range)},{' '}
161-
<span
162-
className={`font-medium ${vod.isAttendance.toLowerCase() === 'o' ? 'text-green-500' : 'text-amber-500'} `}
163-
>
161+
<span
162+
className={`font-medium ${
163+
vod.isAttendance.toLowerCase().trim() === 'o'
164+
? 'text-green-500'
165+
: 'text-amber-500'
166+
} !text-amber-500`}
167+
>
164168
{vod.length}
165169
</span>
166170
</div>

src/hooks/useCardData.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import { useState, useEffect } from 'react';
2-
import { startOfDay } from 'date-fns';
32
import { loadDataFromStorage } from '@/lib/storage';
4-
import { removeSquareBrackets } from '@/lib/utils';
53
import { Vod, Assign, Quiz } from '@/content/types';
64

75
export type CardData = {
@@ -57,7 +55,7 @@ function useCardData() {
5755
);
5856

5957
let done = 0;
60-
Object.entries(groupedData).forEach(([_, vodItems]) => {
58+
Object.values(groupedData).forEach((vodItems) => {
6159
if (vodItems[0].weeklyAttendance.toLowerCase() === 'o') {
6260
done += 1;
6361
}
@@ -97,8 +95,7 @@ function useCardData() {
9795
'quiz',
9896
(quizzes) => {
9997
const total = quizzes.length;
100-
let done = 0;
101-
// quiz에 대한 done 로직이 있다면 여기에 추가합니다.
98+
const done = 0;
10299
return [
103100
{
104101
type: 'quiz',

src/hooks/useCourseData.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useState, useEffect, useCallback } from 'react';
2-
import { Vod, Assign, Quiz } from '@/content/types';
2+
import { Vod, Assign, Quiz, CourseBase } from '@/content/types';
33
import { loadDataFromStorage, saveDataToStorage } from '@/lib/storage';
44
import { requestData } from '@/lib/fetchCourseData';
55
import { isCurrentDateByDate, isCurrentDateInRange } from '@/lib/utils';
@@ -8,7 +8,7 @@ const makeVodKey = (courseId: string, title: string, week: number) => `${courseI
88
const makeAssignKey = (courseId: string, title: string, dueDate: string) => `${courseId}-${title}-${dueDate}`;
99
const makeQuizKey = (courseId: string, title: string, dueDate: string) => `${courseId}-${title}-${dueDate}`;
1010

11-
export function useCourseData(courses: any[]) {
11+
export function useCourseData(courses: CourseBase[]) {
1212
const [vods, setVods] = useState<Vod[]>([]);
1313
const [assigns, setAssigns] = useState<Assign[]>([]);
1414
const [quizes, setQuizes] = useState<Quiz[]>([]);
@@ -29,8 +29,8 @@ export function useCourseData(courses: any[]) {
2929
const tempQuizes: Quiz[] = [...quizes];
3030

3131
const vodSet = new Set(tempVods.map((v) => makeVodKey(v.courseId, v.title, v.week)));
32-
const assignSet = new Set(tempAssigns.map((a) => makeAssignKey(a.courseId, a.title, a.dueDate)));
33-
const quizSet = new Set(tempQuizes.map((q) => makeQuizKey(q.courseId, q.title, q.dueDate)));
32+
const assignSet = new Set(tempAssigns.map((a) => makeAssignKey(a.courseId, a.title, a.dueDate ? a.dueDate : '')));
33+
const quizSet = new Set(tempQuizes.map((q) => makeQuizKey(q.courseId, q.title, q.dueDate ? q.dueDate : '')));
3434

3535
await Promise.all(
3636
courses.map(async (course) => {
@@ -61,7 +61,11 @@ export function useCourseData(courses: any[]) {
6161
});
6262

6363
result.assignDataArray.forEach((assignData) => {
64-
const assignKey = makeAssignKey(course.courseId, assignData.title, assignData.dueDate);
64+
const assignKey = makeAssignKey(
65+
course.courseId,
66+
assignData.title,
67+
assignData.dueDate ? assignData.dueDate : ''
68+
);
6569
if (!assignSet.has(assignKey)) {
6670
console.info(assignKey);
6771
assignSet.add(assignKey);
@@ -79,7 +83,7 @@ export function useCourseData(courses: any[]) {
7983
});
8084

8185
result.quizDataArray.forEach((quizData) => {
82-
const quizKey = makeQuizKey(course.courseId, quizData.title, quizData.dueDate);
86+
const quizKey = makeQuizKey(course.courseId, quizData.title, quizData.dueDate ? quizData.dueDate : '');
8387
if (!quizSet.has(quizKey)) {
8488
console.info(quizKey);
8589
quizSet.add(quizKey);
@@ -112,6 +116,7 @@ export function useCourseData(courses: any[]) {
112116

113117
setIsPending(false);
114118
} catch (error) {
119+
console.warn(error);
115120
localStorage.removeItem('lastRequestTime');
116121
setIsError(true);
117122
setIsPending(false);

src/hooks/useGetCourse.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ import { saveDataToStorage } from '@/lib/storage';
33
import { removeSquareBrackets } from '@/lib/utils';
44
import { useState, useEffect } from 'react';
55

6-
interface UseCouresResult {
6+
export interface UseCourseResult {
77
courses: CourseBase[];
88
}
99

10-
export const useGetCourses = (): UseCouresResult => {
10+
export const useGetCourses = (): UseCourseResult => {
1111
const [courses, setCourses] = useState<CourseBase[]>([]);
1212
useEffect(() => {
1313
if (!document) return;

src/lib/fetchAssign.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export const fetchAssign = async (link: string) => {
3636
row.querySelector(headerMap.title)?.textContent?.trim() ||
3737
row.querySelector(headerMap.assign)?.textContent?.trim() ||
3838
null;
39-
let sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || '';
39+
const sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || '';
4040
const url = (row.querySelector(headerMap.url) as HTMLAnchorElement)?.href || null;
4141
const dueDate = row.querySelector(headerMap.dueDate)?.textContent?.trim() || null;
4242
const isSubmit = row.querySelector(headerMap.isSubmit)?.textContent?.trim() === '미제출' ? false : true;

0 commit comments

Comments
 (0)