Skip to content

Commit c596859

Browse files
authored
Merge pull request #940 from IQSS/UseCollectionRepository
Avoid prop-drilling for collection repository
2 parents 30d96a0 + 3e0def0 commit c596859

103 files changed

Lines changed: 1477 additions & 1416 deletions

File tree

Some content is hidden

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

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
2929
- Renamed dataset template fetch/create use cases and DTOs to `getTemplatesByCollectionId` and `CreateTemplateDTO` for API alignment, and added new `getTemplate` and `deleteTemplate` use cases for retrieving a single template by ID and deleting templates.
3030
- Added disclaimer text and custom popup text to Publish Dataset modal for better communication of the implications of publishing a dataset. The text can be configured through the runtime configuration.
3131
- Dataset page Terms tab title now depends on permissions: users with dataset update permission see `Terms and Guestbook`, and read-only users see `Terms`.
32+
- Avoided prop-drilling for collection repository, so used context to share epository instances.
3233

3334
### Fixed
3435

packages/design-system/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"forceConsistentCasingInFileNames": true,
1212
"noFallthroughCasesInSwitch": true,
1313
"module": "esnext",
14-
"moduleResolution": "node",
14+
"moduleResolution": "bundler",
1515
"resolveJsonModule": true,
1616
"isolatedModules": true,
1717
"noEmit": true,

src/alert/domain/models/Alert.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import { AlertVariant } from '@iqss/dataverse-design-system/dist/components/alert/AlertVariant'
1+
import { ComponentProps } from 'react'
2+
import { Alert as DesignSystemAlert } from '@iqss/dataverse-design-system'
3+
4+
type AlertVariant = ComponentProps<typeof DesignSystemAlert>['variant']
25

36
export enum AlertMessageKey {
47
DRAFT_VERSION = 'draftVersion',

src/sections/account/Account.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useSearchParams } from 'react-router-dom'
44
import { Tabs } from '@iqss/dataverse-design-system'
55
import { AccountHelper, AccountPanelTabKey } from './AccountHelper'
66
import { UserJSDataverseRepository } from '@/users/infrastructure/repositories/UserJSDataverseRepository'
7-
import { CollectionRepository } from '@/collection/domain/repositories/CollectionRepository'
87
import { NotificationRepository } from '@/notifications/domain/repositories/NotificationRepository'
98
import { ApiTokenSection } from './api-token-section/ApiTokenSection'
109
import { AccountInfoSection } from './account-info-section/AccountInfoSection'
@@ -19,15 +18,13 @@ const tabsKeys = AccountHelper.ACCOUNT_PANEL_TABS_KEYS
1918
interface AccountProps {
2019
defaultActiveTabKey: AccountPanelTabKey
2120
userRepository: UserJSDataverseRepository
22-
collectionRepository: CollectionRepository
2321
roleRepository: RoleJSDataverseRepository
2422
notificationRepository: NotificationRepository
2523
}
2624

2725
export const Account = ({
2826
defaultActiveTabKey,
2927
userRepository,
30-
collectionRepository,
3128
roleRepository,
3229
notificationRepository
3330
}: AccountProps) => {
@@ -54,10 +51,7 @@ export const Account = ({
5451
<Tabs activeKey={defaultActiveTabKey} onSelect={updateSearchParamTabKeyOnSelect}>
5552
<Tabs.Tab eventKey={tabsKeys.myData} title={t('tabs.myData')}>
5653
<div className={styles['tab-container']}>
57-
<MyDataItemsPanel
58-
roleRepository={roleRepository}
59-
collectionRepository={collectionRepository}
60-
/>
54+
<MyDataItemsPanel roleRepository={roleRepository} />
6155
</div>
6256
</Tabs.Tab>
6357
<Tabs.Tab eventKey={tabsKeys.notifications} title={t('tabs.notifications')}>

src/sections/account/AccountFactory.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { UserJSDataverseRepository } from '@/users/infrastructure/repositories/U
66
import { CollectionJSDataverseRepository } from '@/collection/infrastructure/repositories/CollectionJSDataverseRepository'
77
import { RoleJSDataverseRepository } from '@/roles/infrastructure/repositories/RoleJSDataverseRepository'
88
import { NotificationJSDataverseRepository } from '@/notifications/infrastructure/repositories/NotificationJSDataverseRepository'
9+
import { RepositoriesProvider } from '@/shared/contexts/repositories/RepositoriesProvider'
910

1011
const userRepository = new UserJSDataverseRepository()
1112
const collectionRepository = new CollectionJSDataverseRepository()
@@ -23,12 +24,13 @@ function AccountWithSearchParams() {
2324
const defaultActiveTabKey = AccountHelper.defineSelectedTabKey(searchParams)
2425

2526
return (
26-
<Account
27-
defaultActiveTabKey={defaultActiveTabKey}
28-
userRepository={userRepository}
29-
collectionRepository={collectionRepository}
30-
roleRepository={roleRepository}
31-
notificationRepository={notificationRepository}
32-
/>
27+
<RepositoriesProvider collectionRepository={collectionRepository}>
28+
<Account
29+
defaultActiveTabKey={defaultActiveTabKey}
30+
userRepository={userRepository}
31+
roleRepository={roleRepository}
32+
notificationRepository={notificationRepository}
33+
/>
34+
</RepositoriesProvider>
3335
)
3436
}

src/sections/account/my-data-section/MyDataItemsPanel.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useEffect, useRef, useState } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import { Alert, Stack } from '@iqss/dataverse-design-system'
4-
import { CollectionRepository } from '@/collection/domain/repositories/CollectionRepository'
54
import { CollectionItemsPaginationInfo } from '@/collection/domain/models/CollectionItemsPaginationInfo'
65
import { CollectionItemType } from '@/collection/domain/models/CollectionItemType'
76
import {
@@ -22,9 +21,9 @@ import { UserNameSearch } from '@/sections/account/my-data-section/user-name-sea
2221
import styles from './MyDataItemsPanel.module.scss'
2322
import { RoleRepository } from '@/roles/domain/repositories/RoleRepository'
2423
import { useSelectableRoles } from '@/sections/account/my-data-section/useSelectableRoles'
24+
import { useCollectionRepositories } from '@/shared/contexts/repositories/RepositoriesProvider'
2525

2626
interface MyDataItemsPanelProps {
27-
collectionRepository: CollectionRepository
2827
roleRepository: RoleRepository
2928
}
3029

@@ -37,10 +36,8 @@ interface MyDataItemsPanelProps {
3736
* 4. When the user changes the item types, roles or publication statuses in the filter panel
3837
*/
3938

40-
export const MyDataItemsPanel = ({
41-
collectionRepository,
42-
roleRepository
43-
}: MyDataItemsPanelProps) => {
39+
export const MyDataItemsPanel = ({ roleRepository }: MyDataItemsPanelProps) => {
40+
const { collectionRepository } = useCollectionRepositories()
4441
const { user } = useSession()
4542
const { t } = useTranslation('account')
4643
const [roleIds, setRoleIds] = useState<number[]>([])

src/sections/advanced-search/AdvancedSearch.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useEffect, useState } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import { Alert } from '@iqss/dataverse-design-system'
4-
import { CollectionRepository } from '@/collection/domain/repositories/CollectionRepository'
54
import { MetadataBlockInfoRepository } from '@/metadata-block-info/domain/repositories/MetadataBlockInfoRepository'
65
import { useGetCollectionMetadataBlocksInfo } from '@/shared/hooks/useGetCollectionMetadataBlocksInfo'
76
import { useCollection } from '../collection/useCollection'
@@ -16,20 +15,20 @@ import {
1615
} from './advanced-search-form/AdvancedSearchForm'
1716
import { MetadataFieldsHelper } from '../shared/form/DatasetMetadataForm/MetadataFieldsHelper'
1817
import { AdvancedSearchHelper } from './AdvancedSearchHelper'
18+
import { useCollectionRepositories } from '@/shared/contexts/repositories/RepositoriesProvider'
1919

2020
interface AdvancedSearchProps {
2121
collectionId: string
22-
collectionRepository: CollectionRepository
2322
metadataBlockInfoRepository: MetadataBlockInfoRepository
2423
collectionFilterQueries?: string
2524
}
2625

2726
export const AdvancedSearch = ({
2827
collectionId,
29-
collectionRepository,
3028
metadataBlockInfoRepository,
3129
collectionFilterQueries
3230
}: AdvancedSearchProps) => {
31+
const { collectionRepository } = useCollectionRepositories()
3332
const { t } = useTranslation('advancedSearch')
3433
const { setIsLoading } = useLoading()
3534
const [previousAdvancedSearchFormData, setPreviousAdvancedSearchFormData] =

src/sections/advanced-search/AdvancedSearchFactory.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { CollectionJSDataverseRepository } from '@/collection/infrastructure/rep
44
import { MetadataBlockInfoJSDataverseRepository } from '@/metadata-block-info/infrastructure/repositories/MetadataBlockInfoJSDataverseRepository'
55
import { CollectionItemsQueryParams } from '@/collection/domain/models/CollectionItemsQueryParams'
66
import { AdvancedSearch } from './AdvancedSearch'
7+
import { RepositoriesProvider } from '@/shared/contexts/repositories/RepositoriesProvider'
78

89
const collectionRepository = new CollectionJSDataverseRepository()
910
const metadataBlockInfoRepository = new MetadataBlockInfoJSDataverseRepository()
@@ -23,11 +24,12 @@ function AdvancedSearchWithSearchParams() {
2324
searchParams.get(CollectionItemsQueryParams.FILTER_QUERIES) ?? undefined
2425

2526
return (
26-
<AdvancedSearch
27-
collectionId={collectionId}
28-
collectionRepository={collectionRepository}
29-
metadataBlockInfoRepository={metadataBlockInfoRepository}
30-
collectionFilterQueries={collectionPageCurrentFilterQueries}
31-
/>
27+
<RepositoriesProvider collectionRepository={collectionRepository}>
28+
<AdvancedSearch
29+
collectionId={collectionId}
30+
metadataBlockInfoRepository={metadataBlockInfoRepository}
31+
collectionFilterQueries={collectionPageCurrentFilterQueries}
32+
/>
33+
</RepositoriesProvider>
3234
)
3335
}

src/sections/collection/Collection.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ButtonGroup, Col, Row } from '@iqss/dataverse-design-system'
2-
import { CollectionRepository } from '../../collection/domain/repositories/CollectionRepository'
32
import { useCollection } from './useCollection'
43
import { useScrollTop } from '../../shared/hooks/useScrollTop'
54
import { useGetCollectionUserPermissions } from '../../shared/hooks/useGetCollectionUserPermissions'
@@ -23,10 +22,10 @@ import { ContactRepository } from '@/contact/domain/repositories/ContactReposito
2322
import { NotFoundPage } from '../not-found-page/NotFoundPage'
2423
import { LinkCollectionDropdown } from './link-collection-dropdown/LinkCollectionDropdown'
2524
import { useSession } from '../session/SessionContext'
25+
import { useCollectionRepositories } from '@/shared/contexts/repositories/RepositoriesProvider'
2626
import styles from './Collection.module.scss'
2727

2828
interface CollectionProps {
29-
collectionRepository: CollectionRepository
3029
collectionIdFromParams: string | undefined
3130
created: boolean
3231
collectionQueryParams: UseCollectionQueryParamsReturnType
@@ -37,12 +36,12 @@ interface CollectionProps {
3736

3837
export function Collection({
3938
collectionIdFromParams,
40-
collectionRepository,
4139
created,
4240
collectionQueryParams,
4341
contactRepository,
4442
accountCreated
4543
}: CollectionProps) {
44+
const { collectionRepository } = useCollectionRepositories()
4645
useScrollTop()
4746
const { previousPath } = useHistoryTracker()
4847
const previousPathIsHomepage = previousPath === Route.HOME
@@ -91,7 +90,6 @@ export function Collection({
9190
collection.hierarchy
9291
) ? /* istanbul ignore next */ null : (
9392
<FeaturedItems
94-
collectionRepository={collectionRepository}
9593
collectionId={collection.id}
9694
className={styles['featured-items-spacing']}
9795
withLoadingSkeleton={false}
@@ -125,15 +123,13 @@ export function Collection({
125123
<LinkCollectionDropdown
126124
collectionId={collection.id}
127125
collectionName={collection.name}
128-
collectionRepository={collectionRepository}
129126
/>
130127
)}
131128

132129
{canUserEditCollection && (
133130
<EditCollectionDropdown
134131
collection={collection}
135132
canUserDeleteCollection={canUserDeleteCollection}
136-
collectionRepository={collectionRepository}
137133
/>
138134
)}
139135
</ButtonGroup>
@@ -144,7 +140,6 @@ export function Collection({
144140
<CollectionItemsPanel
145141
key={collection.id}
146142
collectionId={collection.id}
147-
collectionRepository={collectionRepository}
148143
collectionQueryParams={collectionQueryParams}
149144
addDataSlot={
150145
showAddDataActions ? (

src/sections/collection/CollectionFactory.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Collection } from './Collection'
66
import { INFINITE_SCROLL_ENABLED } from './config'
77
import { useGetCollectionQueryParams } from './useGetCollectionQueryParams'
88
import { ACCOUNT_CREATED_SESSION_STORAGE_KEY } from './AccountCreatedAlert'
9+
import { RepositoriesProvider } from '@/shared/contexts/repositories/RepositoriesProvider'
910

1011
const collectionRepository = new CollectionJSDataverseRepository()
1112
const contactRepository = new ContactJSDataverseRepository()
@@ -31,14 +32,15 @@ function CollectionWithSearchParams() {
3132
Boolean(sessionStorage.getItem(ACCOUNT_CREATED_SESSION_STORAGE_KEY)) ?? false
3233

3334
return (
34-
<Collection
35-
collectionRepository={collectionRepository}
36-
collectionIdFromParams={collectionId}
37-
created={created}
38-
collectionQueryParams={collectionQueryParams}
39-
accountCreated={accountCreated}
40-
infiniteScrollEnabled={INFINITE_SCROLL_ENABLED}
41-
contactRepository={contactRepository}
42-
/>
35+
<RepositoriesProvider collectionRepository={collectionRepository}>
36+
<Collection
37+
collectionIdFromParams={collectionId}
38+
created={created}
39+
collectionQueryParams={collectionQueryParams}
40+
accountCreated={accountCreated}
41+
infiniteScrollEnabled={INFINITE_SCROLL_ENABLED}
42+
contactRepository={contactRepository}
43+
/>
44+
</RepositoriesProvider>
4345
)
4446
}

0 commit comments

Comments
 (0)