diff --git a/packages/docusaurus-plugin-content-showcase/src/client/index.ts b/packages/docusaurus-plugin-content-showcase/src/client/index.ts index 065578ba69..823f0a6840 100644 --- a/packages/docusaurus-plugin-content-showcase/src/client/index.ts +++ b/packages/docusaurus-plugin-content-showcase/src/client/index.ts @@ -19,8 +19,6 @@ import type { ShowcaseItem, } from '@docusaurus/plugin-content-showcase'; -export const clientShowcase = 42; - export function filterUsers({ users, tags, diff --git a/packages/docusaurus-theme-classic/src/theme-classic.d.ts b/packages/docusaurus-theme-classic/src/theme-classic.d.ts index ba9ed213db..d28dc02df0 100644 --- a/packages/docusaurus-theme-classic/src/theme-classic.d.ts +++ b/packages/docusaurus-theme-classic/src/theme-classic.d.ts @@ -280,13 +280,7 @@ declare module '@theme/Showcase/ShowcaseCard' { } declare module '@theme/Showcase/ShowcaseCards' { - import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase'; - - export interface Props { - readonly users: ShowcaseItem[]; - } - - export default function ShowcaseCards(props: Props): JSX.Element; + export default function ShowcaseCards(): JSX.Element; } declare module '@theme/Showcase/ShowcaseTooltip' { export interface Props { @@ -318,13 +312,7 @@ declare module '@theme/Showcase/ShowcaseFilterToggle' { } declare module '@theme/Showcase/ShowcaseFilters' { - import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase'; - - export interface Props { - readonly users: ShowcaseItem[]; - } - - export default function ShowcaseFilters(props: Props): JSX.Element; + export default function ShowcaseFilters(): JSX.Element; } declare module '@theme/Showcase/OperatorButton' { diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx index ccd0d64502..08d5cd663d 100644 --- a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseCards/index.tsx @@ -12,10 +12,10 @@ import { useFilteredUsers, sortUsers, } from '@docusaurus/plugin-content-showcase/client'; +import {useShowcase} from '@docusaurus/theme-common/internal'; import Heading from '@theme/Heading'; import FavoriteIcon from '@theme/Showcase/FavoriteIcon'; import ShowcaseCard from '@theme/Showcase/ShowcaseCard'; -import type {Props} from '@theme/Showcase/ShowcaseCards'; import type {ShowcaseItem} from '@docusaurus/plugin-content-showcase'; import styles from './styles.module.css'; @@ -74,14 +74,16 @@ function NoResultSection() { ); } -export default function ShowcaseCards(props: Props): JSX.Element { - const filteredUsers = useFilteredUsers(props.users); +export default function ShowcaseCards(): JSX.Element { + const users = useShowcase().items; + + const filteredUsers = useFilteredUsers(users); if (filteredUsers.length === 0) { return ; } - const sortedUsers = sortUsers(props.users); + const sortedUsers = sortUsers(users); const favoriteUsers = sortedUsers.filter((user: ShowcaseItem) => user.tags.includes('favorite'), diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx index 19c9cd7ae8..d07971cae0 100644 --- a/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Showcase/ShowcaseFilters/index.tsx @@ -14,12 +14,12 @@ import { Tags, TagList, } from '@docusaurus/plugin-content-showcase/client'; +import {useShowcase} from '@docusaurus/theme-common/internal'; import FavoriteIcon from '@theme/Showcase/FavoriteIcon'; import Heading from '@theme/Heading'; import ShowcaseTagSelect from '@theme/Showcase/ShowcaseTagSelect'; import OperatorButton from '@theme/Showcase/OperatorButton'; import ClearAllButton from '@theme/Showcase/ClearAllButton'; -import type {Props} from '@theme/Showcase/ShowcaseFilters'; import type {TagType} from '@docusaurus/plugin-content-showcase'; import styles from './styles.module.css'; @@ -74,8 +74,9 @@ function ShowcaseTagList() { ); } -function HeadingText(props: Props) { - const filteredUsers = useFilteredUsers(props.users); +function HeadingText() { + const users = useShowcase().items; + const filteredUsers = useFilteredUsers(users); const siteCountPlural = useSiteCountPlural(); return (
@@ -96,19 +97,19 @@ function HeadingButtons() { ); } -function HeadingRow(props: Props) { +function HeadingRow() { return (
- +
); } -export default function ShowcaseFilters(props: Props): ReactNode { +export default function ShowcaseFilters(): ReactNode { return (
- +
); diff --git a/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx b/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx index 0f2b304f88..5a25d69bf1 100644 --- a/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/Showcase/index.tsx @@ -8,7 +8,7 @@ import Translate, {translate} from '@docusaurus/Translate'; import Link from '@docusaurus/Link'; -import {clientShowcase} from '@docusaurus/plugin-content-showcase/client'; +import {ShowcaseProvider} from '@docusaurus/theme-common/internal'; import Layout from '@theme/Layout'; import Heading from '@theme/Heading'; @@ -40,19 +40,19 @@ function ShowcaseHeader() { export default function Showcase(props: Props): JSX.Element { const users = props.content; return ( - - {/* eslint-disable-next-line @docusaurus/prefer-docusaurus-heading, @docusaurus/no-untranslated-text */} -

Client showcase API: {clientShowcase}

-
- - -
- -
- -
-
+ + +
+ + +
+ +
+ +
+
+
); } diff --git a/packages/docusaurus-theme-common/src/contexts/showcase.tsx b/packages/docusaurus-theme-common/src/contexts/showcase.tsx new file mode 100644 index 0000000000..85ffe61c90 --- /dev/null +++ b/packages/docusaurus-theme-common/src/contexts/showcase.tsx @@ -0,0 +1,40 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React, {useMemo, type ReactNode, useContext} from 'react'; +import {ReactContextError} from '../utils/reactUtils'; +import type {ShowcaseItems} from '@docusaurus/plugin-content-showcase'; + +const Context = React.createContext(null); + +function useContextValue(content: ShowcaseItems): ShowcaseItems { + return useMemo( + () => ({ + items: content.items, + }), + [content], + ); +} + +export function ShowcaseProvider({ + children, + content, +}: { + children: ReactNode; + content: ShowcaseItems; +}): JSX.Element { + const contextValue = useContextValue(content); + return {children}; +} + +export function useShowcase(): ShowcaseItems { + const showcase = useContext(Context); + if (showcase === null) { + throw new ReactContextError('ShowcaseProvider'); + } + return showcase; +} diff --git a/packages/docusaurus-theme-common/src/internal.ts b/packages/docusaurus-theme-common/src/internal.ts index 31f081a621..e9382398ff 100644 --- a/packages/docusaurus-theme-common/src/internal.ts +++ b/packages/docusaurus-theme-common/src/internal.ts @@ -26,6 +26,7 @@ export {DocsVersionProvider, useDocsVersion} from './contexts/docsVersion'; export {DocsSidebarProvider, useDocsSidebar} from './contexts/docsSidebar'; export {DocProvider, useDoc, type DocContextValue} from './contexts/doc'; +export {ShowcaseProvider, useShowcase} from './contexts/showcase'; export { BlogPostProvider, useBlogPost,