Skip to content

Commit 47b99e9

Browse files
authored
Refactor: type import, unused import 제거 eslint 설정 등 리팩토링 (#152)
* chore: onSuccess 제거 * refactor: 불필요한 h-full 제거 * chore: onSuccess 제거 * fix: sentry 설정을 instrumentation에서 수행 ref : getsentry/sentry-javascript#12044 * feat: GTM 추가 ref : https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries * refactor: 불필요한 속성 및 컴포넌트 제거 * docs: 주석으로 코드에 대한 설명 추가 * refactor: InitSentryUserInfo 컴포넌트 이동 * feat: eslint-plugin-unused-imports 설치 및 세팅 * refactor: 네이밍 앞에 -Memo-` prefix로 통일 * refactor: Header를 주로 사용하는 측인 layout/[lng]에 위치 * refactor: 불필요한 파일 제거 * refactor: 불필요한 함수 래퍼 제거 및 변수명 수정 * refactor: handleRequestAppend 함수 분리 * refactor: `groupKey` 기본값 설정 * refactor: 불필요한 단언문(!) 제거 * chore: sentry의 silent옵션 제거 * refactor: `ExtensionDialog` 이동 * fix: 확장 프로그램이 설치된 경우에만 가이드 실행 * refactor: ExtensionInstallCheckDialog 분리 * feat: ExtensionInstallCheckDialog 동적 import * refactor: 기명 함수로 수정 * chore: placeholder 시간 최소화 * refactor: 변수명, 함수명을 직관적으로 수정 * refactor: queries와 mutations 분리 * feat: 공통 훅을 shared폴더로 묶기 * refactor: 순서 변경 * refactor: 불필요한 훅 제거 * refactor: `useKeyboardBind`를 isMetaKey도 받을 수 있도록 확장 * fix: 메타키 이슈 해결 * chore: type import * refactor: 사용하지 않는 타입 제거 * refactor: 컨벤션에 맞는 폴더로 이동 * refactor: 폴더 구조 컨벤션에 맞게 수정 * refactor: 불필요한 컴포넌트 depth 제거 * refactor: Header를 공통 컴포넌트로 이동 * refactor: container에서 section 네이밍으로 통일 * refactor: 컴포넌트 파일을 재 역할에 맞는 폴더로 이동 * refactor: server.ts와 client.ts에 `util`을 앞에 붙여주기 * refactor: 불필요한 import 및 컴포넌트 제거 * chore: type imports eslint rules 추가 * style: type import eslint 적용 * chore: web의 eslintl 제거 * fix: eslint-import-resolver-typescript로 eslint typescript resolve ref : import-js/eslint-plugin-import#2969 (comment) * fix: fix the lint * fix: 잘못된 import경로 수정
1 parent a7dd914 commit 47b99e9

File tree

150 files changed

+776
-1008
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+776
-1008
lines changed

.eslintrc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,34 @@
2121
"sourceType": "module",
2222
},
2323
"plugins": [
24+
"unused-imports",
2425
"prettier",
2526
"simple-import-sort",
2627
"react",
2728
"@typescript-eslint",
2829
"react-hooks",
2930
"import",
3031
"jsx-a11y",
31-
"turbo",
3232
],
3333
"settings": {
3434
"react": {
3535
"version": "detect",
3636
},
37+
"import/resolver": {
38+
"typescript": {
39+
"alwaysTryTypes": true,
40+
"project": "./tsconfig.json",
41+
},
42+
},
3743
},
3844
"rules": {
45+
"@typescript-eslint/consistent-type-imports": "error",
3946
"react/react-in-jsx-scope": "off",
4047
"import/no-unresolved": "off",
4148
"react/prop-types": "off",
4249
"simple-import-sort/imports": "error",
4350
"simple-import-sort/exports": "error",
51+
"unused-imports/no-unused-imports": "error",
4452
},
4553
"globals": {
4654
"chrome": "readonly",

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,14 @@
8585
"eslint": "8.57.0",
8686
"eslint-config-airbnb-typescript": "18.0.0",
8787
"eslint-config-prettier": "9.1.0",
88+
"eslint-import-resolver-typescript": "^3.7.0",
8889
"eslint-plugin-import": "2.29.1",
8990
"eslint-plugin-jsx-a11y": "6.10.0",
9091
"eslint-plugin-prettier": "5.2.1",
9192
"eslint-plugin-react": "7.35.0",
9293
"eslint-plugin-react-hooks": "4.6.2",
9394
"eslint-plugin-simple-import-sort": "^12.1.1",
95+
"eslint-plugin-unused-imports": "^4.1.4",
9496
"husky": "^9.1.5",
9597
"lint-staged": "^15.2.7",
9698
"overlay-kit": "^1.4.1",
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export { default as useDidMount } from './useDidMount';
2+
export { default as useError } from './useError';
3+
export { default as useFetch } from './useFetch';
4+
export { default as useKeyboardBind } from './useKeyboardBind';
5+
export { default as useThrottle } from './useThrottle';
6+
export { default as useUserPreferDarkMode } from './useUserPreferDarkMode';
7+
export { default as useDebounce } from './useDebounce';
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { useEffect } from 'react';
2+
3+
type KeyboardEventKey = 'Backspace' | 'Escape' | 's';
4+
5+
interface UseKeyboardBindProps {
6+
key: KeyboardEventKey;
7+
callback: () => void;
8+
isMetaKey?: boolean;
9+
}
10+
11+
export default function useKeyboardBind({ key, callback, isMetaKey = false }: UseKeyboardBindProps) {
12+
useEffect(
13+
function keyboardBind() {
14+
const handleKeyDown = (event: KeyboardEvent) => {
15+
const metaKey = isMetaKey ? event.metaKey : true;
16+
if (metaKey && event.key === key) {
17+
event.preventDefault();
18+
19+
callback();
20+
}
21+
};
22+
23+
window.addEventListener('keydown', handleKeyDown);
24+
return () => window.removeEventListener('keydown', handleKeyDown);
25+
},
26+
[key, callback],
27+
);
28+
}

packages/shared/src/hooks/index.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
11
export * from './supabase';
2-
3-
export { default as useDidMount } from './useDidMount';
4-
export { default as useError } from './useError';
5-
export { default as useFetch } from './useFetch';
6-
export { default as useKeyboardBind } from './useKeyboardBind';
7-
export { default as useThrottle } from './useThrottle';
8-
export { default as useUserPreferDarkMode } from './useUserPreferDarkMode';
9-
export { default as useDebounce } from './useDebounce';
10-
export { useRAF } from './useRAF';
2+
export * from './common';
3+
export * from './extension';
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,2 @@
1-
export { default as useCategoryDeleteMutation } from './useCategoryDeleteMutation';
2-
export { default as useCategoryPatchMutation } from './useCategoryPatchMutation';
3-
export { default as useCategoryPostMutation } from './useCategoryPostMutation';
4-
export { default as useCategoryQuery } from './useCategoryQuery';
5-
export { default as useCategoryUpsertMutation } from './useCategoryUpsertMutation';
6-
export { default as useDeleteMemosMutation } from './useDeleteMemosMutation';
7-
export { default as useMemoPatchMutation } from './useMemoPatchMutation';
8-
export { default as useMemoPostMutation } from './useMemoPostMutation';
9-
export { default as useMemoQuery } from './useMemoQuery';
10-
export { default as useMemosQuery } from './useMemosQuery';
11-
export { default as useMemosUpsertMutation } from './useMemosUpsertMutation';
12-
export { default as useSupabaseUser } from './useSupabaseUser';
13-
export { default as useSignoutMutation } from './useSignoutMutation';
14-
export { default as useFeedbackMutation } from './useFeedbackMutation';
1+
export * from './queries';
2+
export * from './mutations';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export { default as useCategoryDeleteMutation } from './useCategoryDeleteMutation';
2+
export { default as useCategoryPatchMutation } from './useCategoryPatchMutation';
3+
export { default as useCategoryPostMutation } from './useCategoryPostMutation';
4+
export { default as useCategoryUpsertMutation } from './useCategoryUpsertMutation';
5+
export { default as useDeleteMemosMutation } from './useDeleteMemosMutation';
6+
export { default as useMemoPatchMutation } from './useMemoPatchMutation';
7+
export { default as useMemoPostMutation } from './useMemoPostMutation';
8+
export { default as useMemosUpsertMutation } from './useMemosUpsertMutation';
9+
export { default as useSignoutMutation } from './useSignoutMutation';
10+
export { default as useFeedbackMutation } from './useFeedbackMutation';

packages/shared/src/hooks/supabase/useCategoryDeleteMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useCategoryDeleteMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { QUERY_KEY } from '@src/constants';
22
import { CategoryService } from '@src/utils';
33
import { useMutation, useQueryClient } from '@tanstack/react-query';
44

5-
import useSupabaseClientQuery from './useSupabaseClientQuery';
5+
import { useSupabaseClientQuery } from '../queries';
66

77
export default function useCategoryDeleteMutation() {
88
const queryClient = useQueryClient();

packages/shared/src/hooks/supabase/useCategoryPatchMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useCategoryPatchMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { QUERY_KEY } from '@src/constants';
22
import { CategoryService } from '@src/utils';
33
import { useMutation, useQueryClient } from '@tanstack/react-query';
44

5-
import useSupabaseClientQuery from './useSupabaseClientQuery';
5+
import { useSupabaseClientQuery } from '../queries';
66

77
export default function useCategoryPatchMutation() {
88
const queryClient = useQueryClient();

packages/shared/src/hooks/supabase/useCategoryPostMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useCategoryPostMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { QUERY_KEY } from '@src/constants';
22
import { CategoryService } from '@src/utils';
33
import { useMutation, useQueryClient } from '@tanstack/react-query';
44

5-
import useSupabaseClientQuery from './useSupabaseClientQuery';
5+
import { useSupabaseClientQuery } from '../queries';
66

77
export default function useCategoryPostMutation() {
88
const queryClient = useQueryClient();

packages/shared/src/hooks/supabase/useCategoryUpsertMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useCategoryUpsertMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { QUERY_KEY } from '@src/constants';
22
import { CategoryService } from '@src/utils';
33
import { useMutation, useQueryClient } from '@tanstack/react-query';
44

5-
import useSupabaseClientQuery from './useSupabaseClientQuery';
5+
import { useSupabaseClientQuery } from '../queries';
66

77
export default function useCategoryUpsertMutation() {
88
const queryClient = useQueryClient();

packages/shared/src/hooks/supabase/useDeleteMemosMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useDeleteMemosMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { MemoSupabaseResponse } from '@src/types';
33
import { MemoService } from '@src/utils';
44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

6-
import useSupabaseClientQuery from './useSupabaseClientQuery';
6+
import { useSupabaseClientQuery } from '../queries';
77

88
export default function useDeleteMemosMutation() {
99
const queryClient = useQueryClient();

packages/shared/src/hooks/supabase/useFeedbackMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useFeedbackMutation.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { FeedbackService } from '@src/utils';
22
import { useMutation } from '@tanstack/react-query';
3-
4-
import useSupabaseFeedbackClientQuery from './useSupabaseFeedbackClientQuery';
3+
import { useSupabaseFeedbackClientQuery } from '../queries';
54

65
export default function useFeedbackMutation() {
76
const { data: supabaseClient } = useSupabaseFeedbackClientQuery();

packages/shared/src/hooks/supabase/useMemoPatchMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useMemoPatchMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { MemoRow, MemoSupabaseResponse, MemoTable } from '@src/types';
33
import { MemoService } from '@src/utils';
44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

6-
import useSupabaseClientQuery from './useSupabaseClientQuery';
6+
import { useSupabaseClientQuery } from '../queries';
77

88
type MutationVariables = {
99
id: MemoRow['id'];

packages/shared/src/hooks/supabase/useMemoPostMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useMemoPostMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { MemoSupabaseResponse, MemoTable } from '@src/types';
33
import { MemoService } from '@src/utils';
44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

6-
import useSupabaseClientQuery from './useSupabaseClientQuery';
6+
import { useSupabaseClientQuery } from '../queries';
77

88
type MutationError = Error;
99

packages/shared/src/hooks/supabase/useMemosUpsertMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useMemosUpsertMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { MemoRow, MemoSupabaseResponse, MemoTable } from '@src/types';
33
import { MemoService } from '@src/utils';
44
import { useMutation, useQueryClient } from '@tanstack/react-query';
55

6-
import useSupabaseClientQuery from './useSupabaseClientQuery';
6+
import { useSupabaseClientQuery } from '../queries';
77

88
type MutationVariables = MemoTable['Insert'][];
99
type MutationData = Awaited<ReturnType<MemoService['upsertMemos']>>;

packages/shared/src/hooks/supabase/useSignoutMutation.ts renamed to packages/shared/src/hooks/supabase/mutations/useSignoutMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useMutation } from '@tanstack/react-query';
2-
import useSupabaseClientQuery from './useSupabaseClientQuery';
2+
import { useSupabaseClientQuery } from '../queries';
33
import { AuthService } from '@src/utils/Supabase';
44

55
export default function useSignoutMutation() {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export { default as useMemosQuery } from './useMemosQuery';
2+
export { default as useMemoQuery } from './useMemoQuery';
3+
export { default as useCategoryQuery } from './useCategoryQuery';
4+
export { default as useSupabaseUserQuery } from './useSupabaseUserQuery';
5+
export { default as useSupabaseClientQuery } from './useSupabaseClientQuery';
6+
export { default as useSupabaseFeedbackClientQuery } from './useSupabaseFeedbackClientQuery';

packages/shared/src/hooks/supabase/useSupabaseUser.ts renamed to packages/shared/src/hooks/supabase/queries/useSupabaseUserQuery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useSuspenseQuery } from '@tanstack/react-query';
55

66
import useSupabaseClientQuery from './useSupabaseClientQuery';
77

8-
export default function useSupabaseUser() {
8+
export default function useSupabaseUserQuery() {
99
const { data: supabaseClient } = useSupabaseClientQuery();
1010

1111
const query = useSuspenseQuery<UserResponse, Error>({

packages/shared/src/hooks/useKeyboardBind.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

packages/shared/src/hooks/useRAF.ts

Lines changed: 0 additions & 25 deletions
This file was deleted.

packages/shared/src/modules/chrome-storage/ChromeSyncStorage.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { StorageKeyType } from '@src/modules/chrome-storage';
2-
3-
import { I18n } from '../../utils/extension/module/I18n';
2+
import { I18n } from '@src/utils/extension';
43

54
export default class ChromeSyncStorage {
65
static async get<T>(key: StorageKeyType): Promise<T> {

packages/shared/src/modules/extension-bridge/ExtensionBridge.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ export default class ExtensionBridge {
192192
try {
193193
chrome.runtime.sendMessage(EXTENSION.id, { type: BRIDGE_MESSAGE_TYPES.GET_EXTENSION_MANIFEST }, callbackFn);
194194
} catch (error) {
195-
console.log('여기서 에러가 발생했습니다.');
196195
throw new ExtensionError('Failed to request extension manifest', ExtensionErrorCode.RUNTIME_ERROR, error);
197196
}
198197
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export * from './constant';
21
export { default as ExtensionBridge } from './ExtensionBridge';
2+
export * from './constant';
33
export * from './type';
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export * from './constant';
21
export { default as LocalStorage } from './LocalStorage';
2+
export * from './constant';
33
export * from './type';
44
export * from './util';

packages/web/next.config.mjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,4 @@ export default withSentryConfig(nextConfig, {
2020
org: 'guesung',
2121
project: 'web-memo',
2222
authToken: CONFIG.sentryAuthToken,
23-
silent: process.env.NODE_ENV === 'production',
2423
});

packages/web/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
"analyze": "ANALYZE=true next build",
99
"start": "next start",
1010
"type-check": "tsc --noEmit",
11-
"tsc-watch": "tsc-watch"
11+
"tsc-watch": "tsc-watch",
12+
"lint": "eslint . --fix"
1213
},
1314
"dependencies": {
1415
"@egjs/react-infinitegrid": "^4.12.0",
@@ -31,7 +32,6 @@
3132
"accept-language": "^3.0.20",
3233
"class-variance-authority": "^0.7.0",
3334
"clsx": "^2.1.1",
34-
"eslint": "9.9.1",
3535
"eslint-config-next": "14.2.7",
3636
"i18next": "^23.16.8",
3737
"i18next-browser-languagedetector": "^8.0.0",
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use client';
2+
3+
import { URL } from '@extension/shared/constants';
4+
import { checkLocalStorageTrue, setLocalStorageTrue } from '@extension/shared/modules/local-storage';
5+
import {
6+
Button,
7+
Dialog,
8+
DialogContent,
9+
DialogDescription,
10+
DialogFooter,
11+
DialogHeader,
12+
DialogTitle,
13+
} from '@src/components/ui';
14+
import { useGetExtensionManifest } from '@src/hooks';
15+
import type { LanguageType } from '@src/modules/i18n';
16+
import useTranslation from '@src/modules/i18n/util.client';
17+
import { useEffect, useState } from 'react';
18+
19+
interface ExtensionInstallCheckDialogProps extends LanguageType {}
20+
export default function ExtensionInstallCheckDialog({ lng }: ExtensionInstallCheckDialogProps) {
21+
const [open, setOpen] = useState(false);
22+
const manifest = useGetExtensionManifest();
23+
24+
const { t } = useTranslation(lng);
25+
26+
const closeDialog = () => {
27+
setOpen(false);
28+
};
29+
30+
const handleOkClick = () => {
31+
window.open(URL.chromeStore, '_blank', 'noopener,noreferrer');
32+
closeDialog();
33+
};
34+
35+
const handleCancelClick = () => {
36+
setLocalStorageTrue('install');
37+
};
38+
39+
useEffect(() => {
40+
const isInstalled = typeof manifest === 'object';
41+
42+
if (!isInstalled && !checkLocalStorageTrue('install')) setOpen(true);
43+
}, [manifest]);
44+
45+
return (
46+
<Dialog open={open} onOpenChange={setOpen}>
47+
<DialogContent onClose={closeDialog}>
48+
<DialogHeader>
49+
<DialogTitle>{t('dialogInstall.title')}</DialogTitle>
50+
<DialogDescription>{t('dialogInstall.description')}</DialogDescription>
51+
</DialogHeader>
52+
<DialogFooter>
53+
<Button onClick={handleCancelClick} variant="secondary">
54+
{t('dialogInstall.cancel')}
55+
</Button>
56+
<Button onClick={handleOkClick}>{t('dialogInstall.ok')}</Button>
57+
</DialogFooter>
58+
</DialogContent>
59+
</Dialog>
60+
);
61+
}

0 commit comments

Comments
 (0)