Skip to content

Commit 69bbeda

Browse files
authored
refactor: split up library context (#1539)
Split the library context into smaller contexts: * LibraryContext * ComponentPickerContext * SidebarContext
1 parent c7e2bf9 commit 69bbeda

54 files changed

Lines changed: 764 additions & 656 deletions

Some content is hidden

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

src/library-authoring/EmptyStates.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
import { Add } from '@openedx/paragon/icons';
77
import { ClearFiltersButton } from '../search-manager';
88
import messages from './messages';
9-
import { useLibraryContext } from './common/context';
9+
import { useLibraryContext } from './common/context/LibraryContext';
1010

1111
export const NoComponents = ({
1212
infoText = messages.noComponents,

src/library-authoring/LibraryAuthoringPage.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,25 @@ import {
3737
} from '../search-manager';
3838
import LibraryContent, { ContentType } from './LibraryContent';
3939
import { LibrarySidebar } from './library-sidebar';
40-
import { SidebarBodyComponentId, useLibraryContext } from './common/context';
40+
import { useComponentPickerContext } from './common/context/ComponentPickerContext';
41+
import { useLibraryContext } from './common/context/LibraryContext';
42+
import { SidebarBodyComponentId, useSidebarContext } from './common/context/SidebarContext';
43+
4144
import messages from './messages';
4245

4346
const HeaderActions = () => {
4447
const intl = useIntl();
48+
49+
const { readOnly } = useLibraryContext();
50+
4551
const {
46-
componentPickerMode,
4752
openAddContentSidebar,
4853
openInfoSidebar,
4954
closeLibrarySidebar,
5055
sidebarComponentInfo,
51-
readOnly,
52-
} = useLibraryContext();
56+
} = useSidebarContext();
57+
58+
const { componentPickerMode } = useComponentPickerContext();
5359

5460
const infoSidebarIsOpen = () => (
5561
sidebarComponentInfo?.type === SidebarBodyComponentId.Info
@@ -94,7 +100,8 @@ const HeaderActions = () => {
94100
const SubHeaderTitle = ({ title }: { title: string }) => {
95101
const intl = useIntl();
96102

97-
const { readOnly, componentPickerMode } = useLibraryContext();
103+
const { readOnly } = useLibraryContext();
104+
const { componentPickerMode } = useComponentPickerContext();
98105

99106
const showReadOnlyBadge = readOnly && !componentPickerMode;
100107

@@ -127,16 +134,14 @@ const LibraryAuthoringPage = ({ returnToLibrarySelection }: LibraryAuthoringPage
127134
librariesV2Enabled,
128135
} = useStudioHome();
129136

137+
const { componentPickerMode, restrictToLibrary } = useComponentPickerContext();
130138
const {
131139
libraryId,
132140
libraryData,
133141
isLoadingLibraryData,
134-
componentPickerMode,
135-
restrictToLibrary,
136142
showOnlyPublished,
137-
sidebarComponentInfo,
138-
openInfoSidebar,
139143
} = useLibraryContext();
144+
const { openInfoSidebar, sidebarComponentInfo } = useSidebarContext();
140145

141146
const [activeKey, setActiveKey] = useState<ContentType | undefined>(ContentType.home);
142147

src/library-authoring/LibraryContent.test.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { getContentSearchConfigUrl } from '../search-manager/data/api';
1010
import { mockContentLibrary } from './data/api.mocks';
1111
import mockEmptyResult from '../search-modal/__mocks__/empty-search-result.json';
12-
import { LibraryProvider } from './common/context';
12+
import { LibraryProvider } from './common/context/LibraryContext';
1313
import LibraryContent from './LibraryContent';
1414
import { libraryComponentsMock } from './__mocks__';
1515

@@ -56,7 +56,9 @@ const clipboardBroadcastChannelMock = {
5656

5757
const withLibraryId = (libraryId: string) => ({
5858
extraWrapper: ({ children }: { children: React.ReactNode }) => (
59-
<LibraryProvider libraryId={libraryId}>{children}</LibraryProvider>
59+
<LibraryProvider libraryId={libraryId}>
60+
{children}
61+
</LibraryProvider>
6062
),
6163
});
6264

src/library-authoring/LibraryContent.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { useEffect } from 'react';
22
import { LoadingSpinner } from '../generic/Loading';
33
import { useSearchContext } from '../search-manager';
44
import { NoComponents, NoSearchResults } from './EmptyStates';
5-
import { useLibraryContext } from './common/context';
5+
import { useLibraryContext } from './common/context/LibraryContext';
6+
import { useSidebarContext } from './common/context/SidebarContext';
67
import CollectionCard from './components/CollectionCard';
78
import ComponentCard from './components/ComponentCard';
89
import { useLoadOnScroll } from '../hooks';
@@ -37,7 +38,8 @@ const LibraryContent = ({ contentType = ContentType.home }: LibraryContentProps)
3738
isFiltered,
3839
usageKey,
3940
} = useSearchContext();
40-
const { openAddContentSidebar, openComponentInfoSidebar, openCreateCollectionModal } = useLibraryContext();
41+
const { openCreateCollectionModal } = useLibraryContext();
42+
const { openAddContentSidebar, openComponentInfoSidebar } = useSidebarContext();
4143

4244
useEffect(() => {
4345
if (usageKey) {

src/library-authoring/LibraryLayout.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import {
66
} from 'react-router-dom';
77

88
import LibraryAuthoringPage from './LibraryAuthoringPage';
9-
import { LibraryProvider } from './common/context';
9+
import { LibraryProvider } from './common/context/LibraryContext';
10+
import { SidebarProvider } from './common/context/SidebarContext';
1011
import { CreateCollectionModal } from './create-collection';
11-
import { LibraryTeamModal } from './library-team';
1212
import LibraryCollectionPage from './collections/LibraryCollectionPage';
1313
import { ComponentPicker } from './component-picker';
1414
import { ComponentEditorModal } from './components/ComponentEditorModal';
@@ -27,6 +27,8 @@ const LibraryLayout = () => {
2727

2828
return (
2929
<LibraryProvider
30+
/** We need to pass the collectionId as key to the LibraryProvider to force a re-render
31+
* when we navigate to a collection page. */
3032
key={collectionId}
3133
libraryId={libraryId}
3234
collectionId={collectionId}
@@ -36,19 +38,20 @@ const LibraryLayout = () => {
3638
* Sidebar > AddContentContainer > ComponentPicker */
3739
componentPicker={ComponentPicker}
3840
>
39-
<Routes>
40-
<Route
41-
path="collection/:collectionId"
42-
element={<LibraryCollectionPage />}
43-
/>
44-
<Route
45-
path="*"
46-
element={<LibraryAuthoringPage />}
47-
/>
48-
</Routes>
49-
<CreateCollectionModal />
50-
<ComponentEditorModal />
51-
<LibraryTeamModal />
41+
<SidebarProvider>
42+
<Routes>
43+
<Route
44+
path="collection/:collectionId"
45+
element={<LibraryCollectionPage />}
46+
/>
47+
<Route
48+
path="*"
49+
element={<LibraryAuthoringPage />}
50+
/>
51+
</Routes>
52+
<CreateCollectionModal />
53+
<ComponentEditorModal />
54+
</SidebarProvider>
5255
</LibraryProvider>
5356
);
5457
};

src/library-authoring/add-content/AddContentContainer.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
getContentLibraryApiUrl, getCreateLibraryBlockUrl, getLibraryCollectionComponentApiUrl, getLibraryPasteClipboardUrl,
1313
} from '../data/api';
1414
import { mockBroadcastChannel, mockClipboardEmpty, mockClipboardHtml } from '../../generic/data/api.mock';
15-
import { LibraryProvider } from '../common/context';
15+
import { LibraryProvider } from '../common/context/LibraryContext';
1616
import AddContentContainer from './AddContentContainer';
1717
import { ComponentEditorModal } from '../components/ComponentEditorModal';
1818
import editorCmsApi from '../../editors/data/services/cms/api';

src/library-authoring/add-content/AddContentContainer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { ToastContext } from '../../generic/toast-context';
2525
import { useCopyToClipboard } from '../../generic/clipboard';
2626
import { getCanEdit } from '../../course-unit/data/selectors';
2727
import { useCreateLibraryBlock, useLibraryPasteClipboard, useAddComponentsToCollection } from '../data/apiHooks';
28-
import { useLibraryContext } from '../common/context';
28+
import { useLibraryContext } from '../common/context/LibraryContext';
2929
import { canEditComponent } from '../components/ComponentEditorModal';
3030
import { PickLibraryContentModal } from './PickLibraryContentModal';
3131

src/library-authoring/add-content/PickLibraryContentModal.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { studioHomeMock } from '../../studio-home/__mocks__';
1010
import { getStudioHomeApiUrl } from '../../studio-home/data/api';
1111
import mockResult from '../__mocks__/library-search.json';
12-
import { LibraryProvider } from '../common/context';
12+
import { LibraryProvider } from '../common/context/LibraryContext';
1313
import { ComponentPicker } from '../component-picker';
1414
import * as api from '../data/api';
1515
import {

src/library-authoring/add-content/PickLibraryContentModal.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import { FormattedMessage, useIntl } from '@edx/frontend-platform/i18n';
33
import { ActionRow, Button, StandardModal } from '@openedx/paragon';
44

55
import { ToastContext } from '../../generic/toast-context';
6-
import { type SelectedComponent, useLibraryContext } from '../common/context';
6+
import { useLibraryContext } from '../common/context/LibraryContext';
7+
import type { SelectedComponent } from '../common/context/ComponentPickerContext';
78
import { useAddComponentsToCollection } from '../data/apiHooks';
89
import messages from './messages';
910

src/library-authoring/collections/CollectionDetails.test.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import {
1010
waitFor,
1111
within,
1212
} from '../../testUtils';
13-
import { LibraryProvider, SidebarBodyComponentId } from '../common/context';
13+
import { LibraryProvider } from '../common/context/LibraryContext';
14+
import { SidebarBodyComponentId, SidebarProvider } from '../common/context/SidebarContext';
1415
import * as api from '../data/api';
1516
import { mockContentLibrary, mockGetCollectionMetadata } from '../data/api.mocks';
1617
import CollectionDetails from './CollectionDetails';
@@ -30,14 +31,15 @@ const library = mockContentLibrary.libraryData;
3031

3132
const render = () => baseRender(<CollectionDetails />, {
3233
extraWrapper: ({ children }) => (
33-
<LibraryProvider
34-
libraryId={library.id}
35-
initialSidebarComponentInfo={{
36-
id: collectionId,
37-
type: SidebarBodyComponentId.CollectionInfo,
38-
}}
39-
>
40-
{ children }
34+
<LibraryProvider libraryId={library.id}>
35+
<SidebarProvider
36+
initialSidebarComponentInfo={{
37+
id: collectionId,
38+
type: SidebarBodyComponentId.CollectionInfo,
39+
}}
40+
>
41+
{ children }
42+
</SidebarProvider>
4143
</LibraryProvider>
4244
),
4345
});

0 commit comments

Comments
 (0)