Skip to content

Commit 869a508

Browse files
authored
Merge pull request #1304 from prezly/feature/dev-20547-check-meilisearch-token-and-enable-search-in-hub-sites
[DEV-20547] Feature - Add support for search in hub sites
2 parents 47c913d + 9868fc0 commit 869a508

36 files changed

+521
-235
lines changed

app/[localeCode]/layout.tsx

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { analytics, app, generateRootMetadata, themeSettings } from '@/adapters/
77
import { CategoryImageFallbackProvider } from '@/components/CategoryImage';
88
import { PreviewPageMask } from '@/components/PreviewPageMask';
99
import { ScrollToTopButton } from '@/components/ScrollToTopButton';
10-
import { StoryImageFallbackProvider } from '@/components/StoryImage';
1110
import { WindowScrollListener } from '@/components/WindowScrollListener';
1211
import { Analytics } from '@/modules/Analytics';
1312
import { Boilerplate } from '@/modules/Boilerplate';
@@ -135,25 +134,20 @@ async function AppContext(props: { children: ReactNode; localeCode: Locale.Code
135134
<BroadcastStoryProvider>
136135
<BroadcastGalleryProvider>
137136
<CookieConsentProvider trackingPolicy={newsroom.tracking_policy}>
138-
<StoryImageFallbackProvider
137+
<CategoryImageFallbackProvider
139138
image={newsroom.newsroom_logo}
140139
text={brandName}
141140
>
142-
<CategoryImageFallbackProvider
143-
image={newsroom.newsroom_logo}
144-
text={brandName}
145-
>
146-
<ThemeSettingsProvider settings={settings}>
147-
<BroadcastPageTypesProvider>
148-
<BroadcastNotificationsProvider>
149-
<BroadcastTranslationsProvider>
150-
{children}
151-
</BroadcastTranslationsProvider>
152-
</BroadcastNotificationsProvider>
153-
</BroadcastPageTypesProvider>
154-
</ThemeSettingsProvider>
155-
</CategoryImageFallbackProvider>
156-
</StoryImageFallbackProvider>
141+
<ThemeSettingsProvider settings={settings}>
142+
<BroadcastPageTypesProvider>
143+
<BroadcastNotificationsProvider>
144+
<BroadcastTranslationsProvider>
145+
{children}
146+
</BroadcastTranslationsProvider>
147+
</BroadcastNotificationsProvider>
148+
</BroadcastPageTypesProvider>
149+
</ThemeSettingsProvider>
150+
</CategoryImageFallbackProvider>
157151
</CookieConsentProvider>
158152
</BroadcastGalleryProvider>
159153
</BroadcastStoryProvider>

app/[localeCode]/search/page.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Newsroom } from '@prezly/sdk';
12
import type { Locale } from '@prezly/theme-kit-nextjs';
23
import { translations } from '@prezly/theme-kit-nextjs';
34
import type { Metadata } from 'next';
@@ -32,6 +33,7 @@ export default async function SearchPage(props: Props) {
3233
const settings = await app().themeSettings();
3334
const themeSettings = parsePreviewSearchParams(searchParams, settings);
3435
const newsroom = await app().newsroom();
36+
const memberNewsrooms = await getMemberNewsrooms(newsroom);
3537

3638
if (!searchSettings || newsroom.is_hub) {
3739
notFound();
@@ -42,12 +44,23 @@ export default async function SearchPage(props: Props) {
4244
<BroadcastTranslations routeName="search" />
4345
<BroadcastPageType pageType="search" />
4446
<Search
45-
settings={searchSettings}
4647
localeCode={params.localeCode}
48+
newsrooms={[newsroom, ...memberNewsrooms]}
49+
newsroomUuid={newsroom.uuid}
50+
settings={searchSettings}
4751
showDate={themeSettings.show_date}
4852
showSubtitle={themeSettings.show_subtitle}
4953
storyCardVariant={themeSettings.story_card_variant}
5054
/>
5155
</>
5256
);
5357
}
58+
59+
async function getMemberNewsrooms(newsroom: Newsroom) {
60+
if (newsroom.is_hub) {
61+
const members = await app().client.newsroomHub.list(newsroom.uuid);
62+
return members.map((member) => member.newsroom);
63+
}
64+
65+
return [];
66+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@playwright/test": "^1.50.1",
3434
"@prezly/analytics-nextjs": "4.2.8",
3535
"@prezly/content-renderer-react-js": "0.41.1",
36-
"@prezly/sdk": "23.14.0",
36+
"@prezly/sdk": "23.17.0",
3737
"@prezly/story-content-format": "0.68.0",
3838
"@prezly/theme-kit-nextjs": "10.2.3",
3939
"@prezly/uploadcare": "2.5.0",

pnpm-lock.yaml

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/CategoriesList/CategoriesList.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ import type { TranslatedCategory } from '@prezly/sdk';
44
import classNames from 'classnames';
55
import { Fragment, useMemo, useState } from 'react';
66

7+
import type { ExternalNewsroomUrl } from '@/types';
8+
79
import { CategoryLink } from '../CategoryLink';
810

911
import styles from './CategoriesList.module.scss';
1012

1113
type Props = {
1214
categories: TranslatedCategory[];
1315
className?: string;
16+
external: ExternalNewsroomUrl;
1417
isStatic?: boolean;
1518
showAllCategories?: boolean;
1619
withBadges?: boolean;
@@ -21,6 +24,7 @@ const MAX_CATEGORIES_CHARACTER_LENGTH = 50;
2124
export function CategoriesList({
2225
categories,
2326
className,
27+
external,
2428
isStatic,
2529
showAllCategories = false,
2630
withBadges = false,
@@ -68,6 +72,7 @@ export function CategoriesList({
6872
<CategoryLink
6973
category={category}
7074
className={styles.categoryLink}
75+
external={external}
7176
withBadge={withBadges}
7277
/>
7378
</Fragment>

src/components/CategoryLink/CategoryLink.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import type { TranslatedCategory } from '@prezly/sdk';
22
import classNames from 'classnames';
33

44
import { Link } from '@/components/Link';
5+
import type { ExternalNewsroomUrl } from '@/types';
6+
import { ensureTrailingSlash } from '@/utils';
57

68
import { Badge } from '../Badge';
79

@@ -10,10 +12,11 @@ import styles from './CategoryLink.module.scss';
1012
type Props = {
1113
category: TranslatedCategory;
1214
className?: string;
15+
external: ExternalNewsroomUrl;
1316
withBadge?: boolean;
1417
};
1518

16-
export function CategoryLink({ category, className, withBadge = false }: Props) {
19+
export function CategoryLink({ category, className, external, withBadge = false }: Props) {
1720
const content = withBadge ? (
1821
<Badge variant="outline" size="small">
1922
{category.name}
@@ -22,14 +25,15 @@ export function CategoryLink({ category, className, withBadge = false }: Props)
2225
<span>{category.name}</span>
2326
);
2427

28+
const href = external
29+
? `${ensureTrailingSlash(external.newsroomUrl)}${category.locale}/category/${category.slug}`
30+
: ({
31+
routeName: 'category',
32+
params: { slug: category.slug, localeCode: category.locale },
33+
} satisfies Link.Props['href']);
34+
2535
return (
26-
<Link
27-
href={{
28-
routeName: 'category',
29-
params: { slug: category.slug, localeCode: category.locale },
30-
}}
31-
className={classNames(styles.link, className)}
32-
>
36+
<Link href={href} className={classNames(styles.link, className)}>
3337
{content}
3438
</Link>
3539
);

src/components/StoryCards/HighlightedStoryCard.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use client';
22

3+
import type { UploadedImage } from '@prezly/sdk';
34
import { Category } from '@prezly/sdk';
45
import classNames from 'classnames';
56

@@ -16,18 +17,33 @@ import styles from './HighlightedStoryCard.module.scss';
1617

1718
type Props = {
1819
fullWidth: boolean;
20+
newsroomLogo: UploadedImage | null;
21+
newsroomName: string;
1922
rounded: boolean;
2023
showDate: boolean;
2124
showSubtitle: boolean;
2225
story: ListStory;
2326
};
2427

25-
export function HighlightedStoryCard({ fullWidth, rounded, showDate, showSubtitle, story }: Props) {
28+
export function HighlightedStoryCard({
29+
fullWidth,
30+
newsroomLogo,
31+
newsroomName,
32+
rounded,
33+
showDate,
34+
showSubtitle,
35+
story,
36+
}: Props) {
2637
const locale = useLocale();
2738
const { categories, published_at, slug, subtitle } = story;
2839

2940
const translatedCategories = Category.translations(categories, locale);
3041

42+
const fallback = {
43+
image: newsroomLogo,
44+
text: newsroomName,
45+
};
46+
3147
if (fullWidth) {
3248
return (
3349
<div
@@ -36,8 +52,10 @@ export function HighlightedStoryCard({ fullWidth, rounded, showDate, showSubtitl
3652
})}
3753
>
3854
<StoryImage
55+
fallback={fallback}
3956
size="full-width"
4057
className={styles.image}
58+
placeholder={{}}
4159
placeholderClassName={styles.placeholder}
4260
thumbnailImage={story.thumbnail_image}
4361
title={story.title}
@@ -89,8 +107,10 @@ export function HighlightedStoryCard({ fullWidth, rounded, showDate, showSubtitl
89107
return (
90108
<StoryCard
91109
key={story.uuid}
92-
isExternal={false}
110+
external={false}
111+
fallback={fallback}
93112
layout="horizontal"
113+
placeholder={{}}
94114
publishedAt={story.published_at}
95115
showDate={showDate}
96116
showSubtitle={showSubtitle}
@@ -101,7 +121,6 @@ export function HighlightedStoryCard({ fullWidth, rounded, showDate, showSubtitl
101121
title={story.title}
102122
titleAsString={story.title}
103123
translatedCategories={translatedCategories}
104-
url={story.links.newsroom_view!}
105124
/>
106125
);
107126
}

0 commit comments

Comments
 (0)