1- import React , { useState , useMemo } from 'react' ;
1+ import React , { useState , useMemo , Suspense } from 'react' ;
2+ import { ErrorBoundary } from 'react-error-boundary' ;
23import ProjectHeader from '../components/project/ProjectHeader' ;
34import ProjectStats from '../components/project/ProjectStats' ;
45import ProjectFilters from '../components/project/ProjectFilters' ;
56import ProjectList from '../components/project/ProjectList' ;
67import ProjectModal from '../components/project/ProjectModal' ;
78import { useProjects , useCreateProject , useUpdateProject , useDeleteProject } from '../hooks/useProjectQueries' ;
89import { useMemberQueries } from '../hooks/useMemberQueries' ;
10+ import { ProjectCardSkeleton , ErrorFallback } from '../components/common/loading/LoadingComponents' ;
911/** 작성자: 김대호, 백승준 */
1012const statusMap = {
1113 planning : 'TODO' ,
@@ -35,8 +37,8 @@ function ProjectManager() {
3537 sortBy : sortBy ,
3638 } ) , [ searchTerm , filters , sortBy ] ) ;
3739
38- const { data : projectData , isLoading : projectsLoading , isError : projectsError } = useProjects ( apiFilters ) ;
39- const { members : allMembers , loading : membersLoading , error : membersError } = useMemberQueries ( ) ;
40+ const { data : projectData } = useProjects ( apiFilters ) ;
41+ const { members : allMembers } = useMemberQueries ( ) ;
4042
4143 const createProjectMutation = useCreateProject ( ) ;
4244 const updateProjectMutation = useUpdateProject ( ) ;
@@ -58,33 +60,25 @@ function ProjectManager() {
5860 onViewTypeChange = { setViewType }
5961 />
6062
61- { projectsLoading || membersLoading ? (
62- < div > 데이터를 불러오는 중...</ div >
63- ) : projectsError || membersError ? (
64- < div > 에러가 발생했습니다.</ div >
65- ) : (
66- < >
67- < ProjectStats
68- total = { projectData . total }
69- stats = { projectData . statusCounts }
70- delayed = { projectData . delayed }
71- />
72-
73- < ProjectFilters
74- filters = { filters }
75- onFiltersChange = { setFilters }
76- sortBy = { sortBy }
77- onSortChange = { setSortBy }
78- />
79-
80- < ProjectList
81- projects = { projectData . projects }
82- viewType = { viewType }
83- onProjectSelect = { setSelectedProject }
84- onProjectDelete = { handleDeleteProject }
85- />
86- </ >
87- ) }
63+ < ProjectStats
64+ total = { projectData . total }
65+ stats = { projectData . statusCounts }
66+ delayed = { projectData . delayed }
67+ />
68+
69+ < ProjectFilters
70+ filters = { filters }
71+ onFiltersChange = { setFilters }
72+ sortBy = { sortBy }
73+ onSortChange = { setSortBy }
74+ />
75+
76+ < ProjectList
77+ projects = { projectData . projects }
78+ viewType = { viewType }
79+ onProjectSelect = { setSelectedProject }
80+ onProjectDelete = { handleDeleteProject }
81+ />
8882
8983 { isCreateModalOpen && (
9084 < ProjectModal
@@ -125,4 +119,21 @@ function ProjectManager() {
125119 )
126120}
127121
128- export default ProjectManager ;
122+ function ProjectManagerWithSuspense ( ) {
123+ return (
124+ < ErrorBoundary
125+ FallbackComponent = { ( { error, resetErrorBoundary } ) => (
126+ < ErrorFallback
127+ error = { error }
128+ onRetry = { resetErrorBoundary }
129+ />
130+ ) }
131+ >
132+ < Suspense fallback = { < ProjectCardSkeleton count = { 8 } /> } >
133+ < ProjectManager />
134+ </ Suspense >
135+ </ ErrorBoundary >
136+ ) ;
137+ }
138+
139+ export default ProjectManagerWithSuspense ;
0 commit comments