@prezly/theme-kit-nextjs 1.6.3 → 1.6.4-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/README.md +30 -0
  2. package/build/adapter-nextjs/getNewsroomServerSideProps.js +9 -63
  3. package/build/adapter-nextjs/getNewsroomServerSideProps.js.map +1 -1
  4. package/build/adapter-nextjs/index.js +2 -14
  5. package/build/adapter-nextjs/index.js.map +1 -1
  6. package/build/adapter-nextjs/processRequest.js +10 -25
  7. package/build/adapter-nextjs/processRequest.js.map +1 -1
  8. package/build/components-nextjs/PageSeo/PageSeo.d.ts +12 -0
  9. package/build/components-nextjs/PageSeo/PageSeo.js +74 -0
  10. package/build/components-nextjs/PageSeo/PageSeo.js.map +1 -0
  11. package/build/components-nextjs/PageSeo/index.d.ts +2 -0
  12. package/build/components-nextjs/PageSeo/index.js +3 -0
  13. package/build/components-nextjs/PageSeo/index.js.map +1 -0
  14. package/build/components-nextjs/PageSeo/lib/getAbsoluteUrl.d.ts +1 -0
  15. package/build/components-nextjs/PageSeo/lib/getAbsoluteUrl.js +7 -0
  16. package/build/components-nextjs/PageSeo/lib/getAbsoluteUrl.js.map +1 -0
  17. package/build/components-nextjs/PageSeo/lib/types.d.ts +4 -0
  18. package/build/components-nextjs/PageSeo/lib/types.js +2 -0
  19. package/build/components-nextjs/PageSeo/lib/types.js.map +1 -0
  20. package/build/components-nextjs/Sitemap/SitemapBuilder.d.ts +11 -0
  21. package/build/components-nextjs/Sitemap/SitemapBuilder.js +47 -0
  22. package/build/components-nextjs/Sitemap/SitemapBuilder.js.map +1 -0
  23. package/build/components-nextjs/Sitemap/createPaths.d.ts +2 -0
  24. package/build/components-nextjs/Sitemap/createPaths.js +15 -0
  25. package/build/components-nextjs/Sitemap/createPaths.js.map +1 -0
  26. package/build/components-nextjs/Sitemap/getInitialProps.d.ts +2 -0
  27. package/build/components-nextjs/Sitemap/getInitialProps.js +26 -0
  28. package/build/components-nextjs/Sitemap/getInitialProps.js.map +1 -0
  29. package/build/components-nextjs/Sitemap/index.d.ts +4 -0
  30. package/build/components-nextjs/Sitemap/index.js +5 -0
  31. package/build/components-nextjs/Sitemap/index.js.map +1 -0
  32. package/build/components-nextjs/Sitemap/types.d.ts +5 -0
  33. package/build/components-nextjs/Sitemap/types.js +2 -0
  34. package/build/components-nextjs/Sitemap/types.js.map +1 -0
  35. package/build/components-nextjs/StorySeo/StorySeo.d.ts +11 -0
  36. package/build/components-nextjs/StorySeo/StorySeo.js +39 -0
  37. package/build/components-nextjs/StorySeo/StorySeo.js.map +1 -0
  38. package/build/components-nextjs/StorySeo/index.d.ts +1 -0
  39. package/build/components-nextjs/StorySeo/index.js +2 -0
  40. package/build/components-nextjs/StorySeo/index.js.map +1 -0
  41. package/build/components-nextjs/index.d.ts +3 -0
  42. package/build/components-nextjs/index.js +4 -0
  43. package/build/components-nextjs/index.js.map +1 -0
  44. package/build/data-fetching/api/PrezlyApi.js +132 -297
  45. package/build/data-fetching/api/PrezlyApi.js.map +1 -1
  46. package/build/data-fetching/api/getPrezlyApi.js +5 -9
  47. package/build/data-fetching/api/getPrezlyApi.js.map +1 -1
  48. package/build/data-fetching/api/index.js +2 -14
  49. package/build/data-fetching/api/index.js.map +1 -1
  50. package/build/data-fetching/api/languages.js +43 -85
  51. package/build/data-fetching/api/languages.js.map +1 -1
  52. package/build/data-fetching/api/queries.js +13 -45
  53. package/build/data-fetching/api/queries.js.map +1 -1
  54. package/build/data-fetching/constants.js +2 -5
  55. package/build/data-fetching/constants.js.map +1 -1
  56. package/build/data-fetching/getAssetsUrl.js +3 -7
  57. package/build/data-fetching/getAssetsUrl.js.map +1 -1
  58. package/build/data-fetching/getLocalizedCategoryData.js +15 -32
  59. package/build/data-fetching/getLocalizedCategoryData.js.map +1 -1
  60. package/build/data-fetching/getNewsroomLogoUrl.js +6 -12
  61. package/build/data-fetching/getNewsroomLogoUrl.js.map +1 -1
  62. package/build/data-fetching/getPrivacyPortalUrl.js +3 -7
  63. package/build/data-fetching/getPrivacyPortalUrl.js.map +1 -1
  64. package/build/data-fetching/getStoryPublicationDate.js +2 -6
  65. package/build/data-fetching/getStoryPublicationDate.js.map +1 -1
  66. package/build/data-fetching/getUploadcareGroupUrl.js +3 -7
  67. package/build/data-fetching/getUploadcareGroupUrl.js.map +1 -1
  68. package/build/data-fetching/index.js +10 -22
  69. package/build/data-fetching/index.js.map +1 -1
  70. package/build/data-fetching/lib/getAlgoliaSettings.js +6 -10
  71. package/build/data-fetching/lib/getAlgoliaSettings.js.map +1 -1
  72. package/build/data-fetching/lib/getEnvVariables.js +11 -29
  73. package/build/data-fetching/lib/getEnvVariables.js.map +1 -1
  74. package/build/data-fetching/lib/index.js +1 -5
  75. package/build/data-fetching/lib/index.js.map +1 -1
  76. package/build/data-fetching/types.js +1 -2
  77. package/build/index.d.ts +2 -0
  78. package/build/index.js +7 -17
  79. package/build/index.js.map +1 -1
  80. package/build/infinite-loading/apiHandlers/fetchGalleries.d.ts +2 -0
  81. package/build/infinite-loading/apiHandlers/fetchGalleries.js +19 -0
  82. package/build/infinite-loading/apiHandlers/fetchGalleries.js.map +1 -0
  83. package/build/infinite-loading/apiHandlers/fetchStories.d.ts +2 -0
  84. package/build/infinite-loading/apiHandlers/fetchStories.js +21 -0
  85. package/build/infinite-loading/apiHandlers/fetchStories.js.map +1 -0
  86. package/build/infinite-loading/apiHandlers/index.d.ts +2 -0
  87. package/build/infinite-loading/apiHandlers/index.js +3 -0
  88. package/build/infinite-loading/apiHandlers/index.js.map +1 -0
  89. package/build/infinite-loading/index.d.ts +5 -0
  90. package/build/infinite-loading/index.js +6 -0
  91. package/build/infinite-loading/index.js.map +1 -0
  92. package/build/infinite-loading/types.d.ts +5 -0
  93. package/build/infinite-loading/types.js +2 -0
  94. package/build/infinite-loading/types.js.map +1 -0
  95. package/build/infinite-loading/useInfiniteGalleriesLoading.d.ts +13 -0
  96. package/build/infinite-loading/useInfiniteGalleriesLoading.js +40 -0
  97. package/build/infinite-loading/useInfiniteGalleriesLoading.js.map +1 -0
  98. package/build/infinite-loading/useInfiniteLoading.d.ts +16 -0
  99. package/build/infinite-loading/useInfiniteLoading.js +39 -0
  100. package/build/infinite-loading/useInfiniteLoading.js.map +1 -0
  101. package/build/infinite-loading/useInfiniteStoriesLoading.d.ts +13 -0
  102. package/build/infinite-loading/useInfiniteStoriesLoading.js +53 -0
  103. package/build/infinite-loading/useInfiniteStoriesLoading.js.map +1 -0
  104. package/build/intl/index.d.ts +2 -1
  105. package/build/intl/index.js +5 -21
  106. package/build/intl/index.js.map +1 -1
  107. package/build/intl/lang.js +4 -11
  108. package/build/intl/lang.js.map +1 -1
  109. package/build/intl/locale.js +21 -27
  110. package/build/intl/locale.js.map +1 -1
  111. package/build/intl/localeConfig.d.ts +1 -2
  112. package/build/intl/localeConfig.js +8 -30
  113. package/build/intl/localeConfig.js.map +1 -1
  114. package/build/intl/localeList.d.ts +4 -56
  115. package/build/intl/localeList.js +1 -2
  116. package/build/intl/localeList.js.map +1 -1
  117. package/build/intl/localeObject.js +30 -49
  118. package/build/intl/localeObject.js.map +1 -1
  119. package/build/newsroom-context/context.js +18 -34
  120. package/build/newsroom-context/context.js.map +1 -1
  121. package/build/newsroom-context/hooks/index.js +11 -23
  122. package/build/newsroom-context/hooks/index.js.map +1 -1
  123. package/build/newsroom-context/hooks/useAlgoliaSettings.js +3 -7
  124. package/build/newsroom-context/hooks/useAlgoliaSettings.js.map +1 -1
  125. package/build/newsroom-context/hooks/useCategories.js +3 -7
  126. package/build/newsroom-context/hooks/useCategories.js.map +1 -1
  127. package/build/newsroom-context/hooks/useCompanyInformation.js +3 -7
  128. package/build/newsroom-context/hooks/useCompanyInformation.js.map +1 -1
  129. package/build/newsroom-context/hooks/useCurrentCategory.js +3 -7
  130. package/build/newsroom-context/hooks/useCurrentCategory.js.map +1 -1
  131. package/build/newsroom-context/hooks/useCurrentLocale.js +3 -7
  132. package/build/newsroom-context/hooks/useCurrentLocale.js.map +1 -1
  133. package/build/newsroom-context/hooks/useCurrentStory.js +3 -7
  134. package/build/newsroom-context/hooks/useCurrentStory.js.map +1 -1
  135. package/build/newsroom-context/hooks/useGetLinkLocaleSlug.js +11 -15
  136. package/build/newsroom-context/hooks/useGetLinkLocaleSlug.js.map +1 -1
  137. package/build/newsroom-context/hooks/useGetTranslationUrl.js +15 -24
  138. package/build/newsroom-context/hooks/useGetTranslationUrl.js.map +1 -1
  139. package/build/newsroom-context/hooks/useLanguages.js +3 -7
  140. package/build/newsroom-context/hooks/useLanguages.js.map +1 -1
  141. package/build/newsroom-context/hooks/useNewsroom.js +3 -7
  142. package/build/newsroom-context/hooks/useNewsroom.js.map +1 -1
  143. package/build/newsroom-context/hooks/useNewsroomContext.js +4 -8
  144. package/build/newsroom-context/hooks/useNewsroomContext.js.map +1 -1
  145. package/build/newsroom-context/index.js +2 -17
  146. package/build/newsroom-context/index.js.map +1 -1
  147. package/build/types.js +1 -2
  148. package/package.json +6 -3
  149. package/src/components-nextjs/PageSeo/PageSeo.tsx +123 -0
  150. package/src/components-nextjs/PageSeo/index.ts +2 -0
  151. package/src/components-nextjs/PageSeo/lib/getAbsoluteUrl.ts +7 -0
  152. package/src/components-nextjs/PageSeo/lib/types.ts +4 -0
  153. package/src/components-nextjs/Sitemap/SitemapBuilder.ts +56 -0
  154. package/src/components-nextjs/Sitemap/createPaths.ts +21 -0
  155. package/src/components-nextjs/Sitemap/getInitialProps.ts +37 -0
  156. package/src/components-nextjs/Sitemap/index.ts +5 -0
  157. package/src/components-nextjs/Sitemap/types.ts +5 -0
  158. package/src/components-nextjs/StorySeo/StorySeo.tsx +68 -0
  159. package/src/components-nextjs/StorySeo/index.ts +1 -0
  160. package/src/components-nextjs/index.ts +3 -0
  161. package/src/index.ts +2 -0
  162. package/src/infinite-loading/apiHandlers/fetchGalleries.ts +24 -0
  163. package/src/infinite-loading/apiHandlers/fetchStories.ts +26 -0
  164. package/src/infinite-loading/apiHandlers/index.ts +2 -0
  165. package/src/infinite-loading/index.ts +5 -0
  166. package/src/infinite-loading/types.ts +5 -0
  167. package/src/infinite-loading/useInfiniteGalleriesLoading.ts +53 -0
  168. package/src/infinite-loading/useInfiniteLoading.ts +66 -0
  169. package/src/infinite-loading/useInfiniteStoriesLoading.ts +81 -0
  170. package/src/intl/index.ts +2 -1
  171. package/src/intl/{localeConfig.js → localeConfig.ts} +3 -3
  172. package/src/intl/{localeList.js → localeList.ts} +1 -1
  173. package/src/intl/localeObject.ts +1 -1
@@ -0,0 +1,26 @@
1
+ import type { NextApiRequest, NextApiResponse } from 'next';
2
+
3
+ import { getPrezlyApi } from '../../data-fetching';
4
+
5
+ export async function fetchStories(req: NextApiRequest, res: NextApiResponse) {
6
+ if (req.method !== 'POST') {
7
+ res.status(405);
8
+ return;
9
+ }
10
+
11
+ const { page, pageSize, category, include, localeCode } = req.body;
12
+
13
+ try {
14
+ const api = getPrezlyApi(req);
15
+
16
+ const { stories } = await (category
17
+ ? api.getStoriesFromCategory(category, { page, pageSize, include, localeCode })
18
+ : api.getStories({ page, pageSize, include, localeCode }));
19
+
20
+ res.status(200).json({ stories });
21
+ } catch (error) {
22
+ res.status(500).send({
23
+ message: (error as Error).message,
24
+ });
25
+ }
26
+ }
@@ -0,0 +1,2 @@
1
+ export { fetchGalleries } from './fetchGalleries';
2
+ export { fetchStories } from './fetchStories';
@@ -0,0 +1,5 @@
1
+ export { useInfiniteLoading } from './useInfiniteLoading';
2
+ export { useInfiniteStoriesLoading } from './useInfiniteStoriesLoading';
3
+ export { useInfiniteGalleriesLoading } from './useInfiniteGalleriesLoading';
4
+ export * from './apiHandlers';
5
+ export * from './types';
@@ -0,0 +1,5 @@
1
+ export interface PaginationProps {
2
+ itemsTotal: number;
3
+ currentPage: number;
4
+ pageSize: number;
5
+ }
@@ -0,0 +1,53 @@
1
+ import type { NewsroomGallery } from '@prezly/sdk';
2
+
3
+ import type { PaginationProps } from './types';
4
+ import { useInfiniteLoading } from './useInfiniteLoading';
5
+
6
+ async function fetchGalleries(
7
+ page: number,
8
+ pageSize: number,
9
+ ): Promise<{ galleries: NewsroomGallery[] }> {
10
+ const result = await fetch('/api/fetch-galleries', {
11
+ method: 'POST',
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ body: JSON.stringify({
16
+ page,
17
+ pageSize,
18
+ }),
19
+ });
20
+
21
+ if (!result.ok) {
22
+ const { message } = await result.json();
23
+ throw new Error(message);
24
+ }
25
+
26
+ return result.json();
27
+ }
28
+
29
+ /**
30
+ * NOTE: This hook depends on the presence of a Next API route (/api/fetch-galleries)!
31
+ * The handler for this route is exported from `apiHandlers/fetchGalleries.ts` file.
32
+ * See https://github.com/prezly/theme-nextjs-bea/blob/d381e9878187ca98815d240d3ffdf10a75993c14/pages/media/index.tsx#L23 for usage example
33
+ */
34
+ export function useInfiniteGalleriesLoading(
35
+ initialGalleries: NewsroomGallery[],
36
+ pagination: PaginationProps,
37
+ ) {
38
+ const { canLoadMore, data, isLoading, loadMore } = useInfiniteLoading<NewsroomGallery>({
39
+ fetchingFn: async (nextPage, pageSize) => {
40
+ const { galleries } = await fetchGalleries(nextPage, pageSize);
41
+ return galleries;
42
+ },
43
+ initialData: initialGalleries,
44
+ pagination,
45
+ });
46
+
47
+ return {
48
+ canLoadMore,
49
+ galleries: data,
50
+ isLoading,
51
+ loadMoreGalleries: loadMore,
52
+ };
53
+ }
@@ -0,0 +1,66 @@
1
+ import { useAsync } from '@react-hookz/web';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+
4
+ import type { PaginationProps } from './types';
5
+
6
+ interface Parameters<T> {
7
+ fetchingFn: (page: number, pageSize: number) => Promise<T[]>;
8
+ initialData: T[];
9
+ pagination: PaginationProps;
10
+ }
11
+
12
+ interface State<T> {
13
+ canLoadMore: boolean;
14
+ currentPage: number;
15
+ data: T[];
16
+ isLoading: boolean;
17
+ loadMore: () => void;
18
+ resetData: () => void;
19
+ }
20
+
21
+ export function useInfiniteLoading<T>({
22
+ fetchingFn,
23
+ initialData,
24
+ pagination,
25
+ }: Parameters<T>): State<T> {
26
+ const [data, setData] = useState<T[]>(initialData);
27
+ const [currentPage, setCurrentPage] = useState(pagination.currentPage);
28
+
29
+ const { itemsTotal, pageSize } = pagination;
30
+ const pagesTotal = Math.ceil(itemsTotal / pageSize);
31
+ const canLoadMore = currentPage < pagesTotal;
32
+
33
+ const [{ error, status }, { execute: loadMoreFn }] = useAsync(async () => {
34
+ const nextPage = currentPage + 1;
35
+ const newData = await fetchingFn(nextPage, pageSize);
36
+ setCurrentPage(nextPage);
37
+ setData((currentData) => [...currentData, ...newData]);
38
+ });
39
+
40
+ const loadMore = useCallback(() => {
41
+ if (canLoadMore) {
42
+ loadMoreFn();
43
+ }
44
+ }, [canLoadMore, loadMoreFn]);
45
+
46
+ const resetData = useCallback(() => {
47
+ setData(initialData);
48
+ setCurrentPage(pagination.currentPage);
49
+ }, [pagination.currentPage, initialData]);
50
+
51
+ useEffect(() => {
52
+ if (error) {
53
+ // eslint-disable-next-line no-console
54
+ console.error(error);
55
+ }
56
+ }, [error]);
57
+
58
+ return {
59
+ canLoadMore,
60
+ currentPage,
61
+ data,
62
+ isLoading: status === 'loading',
63
+ loadMore,
64
+ resetData,
65
+ };
66
+ }
@@ -0,0 +1,81 @@
1
+ import type { Category, ExtraStoryFields, Story } from '@prezly/sdk';
2
+ import { useEffect } from 'react';
3
+
4
+ import type { LocaleObject } from '../intl';
5
+ import { useCurrentLocale } from '../newsroom-context';
6
+
7
+ import type { PaginationProps } from './types';
8
+ import { useInfiniteLoading } from './useInfiniteLoading';
9
+
10
+ async function fetchStories<T extends Story = Story>(
11
+ page: number,
12
+ pageSize: number,
13
+ category?: Category,
14
+ locale?: LocaleObject,
15
+ include?: (keyof ExtraStoryFields)[],
16
+ ): Promise<{ stories: T[] }> {
17
+ const result = await fetch('/api/fetch-stories', {
18
+ method: 'POST',
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ },
22
+ body: JSON.stringify({
23
+ page,
24
+ pageSize,
25
+ category,
26
+ include,
27
+ ...(locale && {
28
+ localeCode: locale.toUnderscoreCode(),
29
+ }),
30
+ }),
31
+ });
32
+
33
+ if (!result.ok) {
34
+ const { message } = await result.json();
35
+ throw new Error(message);
36
+ }
37
+
38
+ return result.json();
39
+ }
40
+
41
+ /**
42
+ * NOTE: This hook depends on the presence of a Next API route (/api/fetch-stories)!
43
+ * The handler for this route is exported from `apiHandlers/fetchStories.ts` file.
44
+ * See https://github.com/prezly/theme-nextjs-bea/blob/d381e9878187ca98815d240d3ffdf10a75993c14/pages/index.tsx#L24 for usage example
45
+ */
46
+ export function useInfiniteStoriesLoading<T extends Story = Story>(
47
+ initialStories: T[],
48
+ pagination: PaginationProps,
49
+ category?: Category,
50
+ include?: (keyof ExtraStoryFields)[],
51
+ ) {
52
+ const currentLocale = useCurrentLocale();
53
+
54
+ const { canLoadMore, data, isLoading, loadMore, resetData } = useInfiniteLoading<T>({
55
+ fetchingFn: async (nextPage, pageSize) => {
56
+ const { stories } = await fetchStories<T>(
57
+ nextPage,
58
+ pageSize,
59
+ category,
60
+ currentLocale,
61
+ include,
62
+ );
63
+ return stories;
64
+ },
65
+ initialData: initialStories,
66
+ pagination,
67
+ });
68
+
69
+ useEffect(() => {
70
+ if (category?.id) {
71
+ resetData();
72
+ }
73
+ }, [category?.id, resetData]);
74
+
75
+ return {
76
+ canLoadMore,
77
+ isLoading,
78
+ loadMoreStories: loadMore,
79
+ stories: data,
80
+ };
81
+ }
package/src/intl/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './lang';
2
2
  export * from './locale';
3
- export { default as localeConfig } from './localeConfig';
3
+ export { localeConfig } from './localeConfig';
4
+ export { localeList } from './localeList';
4
5
  export * from './localeObject';
@@ -3,9 +3,9 @@
3
3
  * Together with permutation performed lower in the code,
4
4
  * the exported list represents all of the possible locale codes that Next.js theme application might accept.
5
5
  */
6
- const supportedLocales = require('./localeList');
6
+ import { localeList } from './localeList';
7
7
 
8
- const lowercaseLocales = supportedLocales.map((l) => l.toLowerCase());
8
+ const lowercaseLocales = localeList.map((l) => l.toLowerCase());
9
9
 
10
10
  // Get all permutations for the shorter locale codes supported by Prezly (e.g. short region codes and neutral language codes)
11
11
  const lowercaseLocalPermutations = Array.from(
@@ -16,4 +16,4 @@ const lowercaseLocalPermutations = Array.from(
16
16
  ]),
17
17
  ).sort();
18
18
 
19
- module.exports = lowercaseLocalPermutations;
19
+ export const localeConfig = lowercaseLocalPermutations;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * This list is pulled from the main Prezly application. The underscores are replaced with dashes.
3
3
  */
4
- module.exports = [
4
+ export const localeList = [
5
5
  'af-ZA',
6
6
  'ar',
7
7
  'ar-AE',
@@ -1,4 +1,4 @@
1
- import localeConfig from './localeConfig';
1
+ import { localeConfig } from './localeConfig';
2
2
 
3
3
  /**
4
4
  * This class is created to simplify working with locales and transforming between different locale code formats.