Skip to content

Commit 039acaa

Browse files
committed
refactor: reorganize project structure into feature/shared modules
- Group Home and repo image viewer into feature-based directories - Split RepoView logic into grid/viewer/filter/download/repo submodules - Move shared UI components, layout, hooks, and utils into shared directory - Update import paths to match the new folder structure
1 parent d8e9408 commit 039acaa

File tree

98 files changed

+380
-439
lines changed

Some content is hidden

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

98 files changed

+380
-439
lines changed

.prettierignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ yarn.lock
2828

2929
# shadcn/ui
3030
components.json
31-
src/components/ui
32-
src/lib/utils.ts
31+
src/shared/components/ui
32+
src/shared/utils/index.ts

components.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
"prefix": ""
1212
},
1313
"aliases": {
14-
"components": "@/components",
15-
"utils": "@/utils",
16-
"ui": "@/components/ui",
17-
"lib": "@/lib",
18-
"hooks": "@/hooks"
14+
"components": "@/shared/components",
15+
"utils": "@/shared/utils",
16+
"ui": "@/shared/components/ui",
17+
"lib": "@/shared/lib",
18+
"hooks": "@/shared/hooks"
1919
},
2020
"iconLibrary": "lucide"
2121
}

src/App.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {Suspense, lazy, useEffect, useMemo} from 'react'
22
import {BrowserRouter as Router, Routes, Route} from 'react-router-dom'
3-
import {useSettingStore} from '@/stores/settingStore'
3+
import {useSettingStore} from '@/shared/stores/settingStore'
44

5-
const BaseLayout = lazy(() => import('@/layout/BaseLayout'))
6-
const Home = lazy(() => import('@/pages/Home'))
7-
const RepoView = lazy(() => import('@/pages/RepoView'))
5+
const BaseLayout = lazy(() => import('@/shared/components/layout/BaseLayout'))
6+
const HomePage = lazy(() => import('@/features/home/HomePage'))
7+
const RepoPage = lazy(() => import('@/features/repo/RepoPage'))
88

99
/**
1010
* Apply theme to document root
@@ -32,8 +32,8 @@ function App() {
3232
<Router>
3333
<Routes>
3434
<Route element={<BaseLayout />}>
35-
<Route path="/" element={<Home />} />
36-
<Route path="/*" element={<RepoView />} />
35+
<Route path="/" element={<HomePage />} />
36+
<Route path="/*" element={<RepoPage />} />
3737
</Route>
3838
</Routes>
3939
</Router>

src/components/ui/button.tsx

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

src/components/ui/card.tsx

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import {useCallback, useState} from 'react'
22
import {RefreshCw} from 'lucide-react'
33

4-
import {Button} from '@/components/ui/button'
5-
import {RepoInput} from '@/components/RepoInput'
4+
import {Button} from '@/shared/components/ui/button'
5+
import {RepoInput} from '@/features/home/components/RepoInput'
66

7-
import {useTargetRepository} from '@/hooks/useTargetRepository'
8-
import {cn, pickByPartialFisherYates} from '@/utils'
9-
import {exampleRepositories} from '@/utils/example-repositories'
7+
import {useTargetRepository} from '@/shared/hooks/useTargetRepository'
8+
import {cn, pickByPartialFisherYates} from '@/shared/utils'
9+
import {exampleRepositories} from '@/shared/utils/example-repositories'
1010

1111
const EXAMPLE_REPO_COUNT = 5
1212
const REROLL_ANIMATION_DURATION_MS = 200
1313

14-
export default function Home() {
14+
export default function HomePage() {
1515
const [, setTargetRepository] = useTargetRepository()
1616
const [shuffledExampleRepositories, setShuffledExampleRepositories] =
1717
useState(exampleRepositories.slice(0, EXAMPLE_REPO_COUNT))

src/components/RepoInput.tsx renamed to src/features/home/components/RepoInput.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {SendHorizonal, X as XIcon} from 'lucide-react'
2-
import {Input} from '@/components/ui/input'
3-
import {Button} from '@/components/ui/button'
2+
import {Input} from '@/shared/components/ui/input'
3+
import {Button} from '@/shared/components/ui/button'
44

5-
import {useInputRef} from '@/hooks/features/form/useInputRef'
6-
import {useRepoSetting} from '@/hooks/features/repo/useRepoSetting'
7-
import {cn, parseGithubUrl} from '@/utils'
5+
import {useInputRef} from '@/shared/hooks/form/useInputRef'
6+
import {useRepoSetting} from '@/features/home/components/useRepoSetting'
7+
import {cn, parseGithubUrl} from '@/shared/utils'
88

99
export function RepoInput({className, ...props}: React.ComponentProps<'div'>) {
1010
const {inputRef, clearInput, getValue} = useInputRef()

src/hooks/features/repo/useRepoSetting.ts renamed to src/features/home/components/useRepoSetting.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {useCallback} from 'react'
2-
import {useTargetRepository} from '@/hooks/useTargetRepository'
3-
import type {GithubRepo} from '@/utils'
2+
import {useTargetRepository} from '@/shared/hooks/useTargetRepository'
3+
import type {GithubRepo} from '@/shared/utils'
44

55
/**
66
* Hook for setting repository
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
import {
22
VirtualizedFlexGrid,
33
type RenderData,
4-
} from '@/components/VitualizedFlexGrid'
5-
import {ImageCell} from '@/components/ImageCell'
6-
import {FilterToolbar} from '@/components/FilterToolbar'
7-
import {FilterInput} from '@/components/FilterInput'
8-
import {Button} from '@/components/ui/button'
9-
import {ImageViewer} from '@/components/ImageViewer'
4+
} from '@/shared/components/VitualizedFlexGrid'
5+
import {ImageCell} from '@/features/repo/image-cell/ImageCell'
6+
import {FilterToolbar} from '@/features/repo/filter/FilterToolbar'
7+
import {FilterInput} from '@/features/repo/filter/FilterInput'
8+
import {Button} from '@/shared/components/ui/button'
9+
import {ImageViewer} from '@/features/repo/viewer/ImageViewer'
1010

11-
import {generateNoImagesMessage} from '@/utils/randomMessages'
12-
import {RandomMessageLoader} from '@/components/RandomMessageLoader'
13-
import {useDisplaySettings} from '@/stores/settingStore'
14-
import {useRepoStore} from '@/stores/repoStore'
15-
import {useRepoSync} from '@/hooks/features/repo-view/useRepoSync'
16-
import {useFilterSync} from '@/hooks/features/repo-view/useFilterSync'
17-
import {useRepoLoading} from '@/hooks/features/repo-view/useRepoLoading'
18-
import {useImageClickHandler} from '@/hooks/features/repo-view/useImageClickHandler'
19-
import {cn} from '@/utils'
11+
import {generateNoImagesMessage} from '@/shared/utils/randomMessages'
12+
import {RandomMessageLoader} from '@/shared/components/RandomMessageLoader'
13+
import {useDisplaySettings} from '@/shared/stores/settingStore'
14+
import {useRepoStore} from '@/shared/stores/repoStore'
15+
import {useRepoSync} from '@/features/repo/useRepoSync'
16+
import {useFilterSync} from '@/features/repo/filter/useFilterSync'
17+
import {useRepoLoading} from '@/features/repo/useRepoLoading'
18+
import {useImageClickHandler} from '@/features/repo/useImageClickHandler'
19+
import {cn} from '@/shared/utils'
2020
import {Loader as LoaderIcon} from 'lucide-react'
2121

22-
export default function RepoView() {
22+
export default function RepoPage() {
2323
const {gridBackground, columnCount, pixelated} = useDisplaySettings()
2424
const repo = useRepoStore(state => state.repo)
2525

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
import {memo, useCallback} from 'react'
22

33
import {Filter as FilterIcon, HelpCircle, X as XIcon} from 'lucide-react'
4-
import {Input} from '@/components/ui/input'
5-
import {Button} from '@/components/ui/button'
6-
import {Popover, PopoverContent, PopoverTrigger} from '@/components/ui/popover'
4+
import {Input} from '@/shared/components/ui/input'
5+
import {Button} from '@/shared/components/ui/button'
6+
import {
7+
Popover,
8+
PopoverContent,
9+
PopoverTrigger,
10+
} from '@/shared/components/ui/popover'
711

8-
import {useFilterState} from '@/hooks/features/filter/useFilterState'
9-
import {useFilterActions} from '@/hooks/features/filter/useFilterActions'
10-
import {useInputSync} from '@/hooks/features/form/useInputSync'
11-
import {useInputRef} from '@/hooks/features/form/useInputRef'
12-
import {cn} from '@/utils'
12+
import {useFilterState} from '@/features/repo/filter/useFilterState'
13+
import {useFilterActions} from '@/features/repo/filter/useFilterActions'
14+
import {useInputSync} from '@/shared/hooks/form/useInputSync'
15+
import {useInputRef} from '@/shared/hooks/form/useInputRef'
16+
import {cn} from '@/shared/utils'
1317

1418
const FilterHelpPopover = memo(function FilterHelpPopover() {
1519
return (

0 commit comments

Comments
 (0)