@prezly/theme-kit-nextjs 1.18.1 → 2.0.0-0

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 (261) hide show
  1. package/build/adapter-nextjs/api-handlers/fetchGalleries.js +3 -7
  2. package/build/adapter-nextjs/api-handlers/fetchGalleries.js.map +1 -1
  3. package/build/adapter-nextjs/api-handlers/fetchStories.js +3 -7
  4. package/build/adapter-nextjs/api-handlers/fetchStories.js.map +1 -1
  5. package/build/adapter-nextjs/api-handlers/index.js +2 -7
  6. package/build/adapter-nextjs/api-handlers/index.js.map +1 -1
  7. package/build/adapter-nextjs/getNewsroomServerSideProps.js +3 -7
  8. package/build/adapter-nextjs/getNewsroomServerSideProps.js.map +1 -1
  9. package/build/adapter-nextjs/getNewsroomStaticProps.js +3 -7
  10. package/build/adapter-nextjs/getNewsroomStaticProps.js.map +1 -1
  11. package/build/adapter-nextjs/index.js +6 -22
  12. package/build/adapter-nextjs/index.js.map +1 -1
  13. package/build/adapter-nextjs/page-props/category.d.ts +2 -2
  14. package/build/adapter-nextjs/page-props/category.js +19 -25
  15. package/build/adapter-nextjs/page-props/category.js.map +1 -1
  16. package/build/adapter-nextjs/page-props/gallery.js +13 -18
  17. package/build/adapter-nextjs/page-props/gallery.js.map +1 -1
  18. package/build/adapter-nextjs/page-props/galleryAlbum.js +13 -19
  19. package/build/adapter-nextjs/page-props/galleryAlbum.js.map +1 -1
  20. package/build/adapter-nextjs/page-props/home.d.ts +2 -2
  21. package/build/adapter-nextjs/page-props/home.js +13 -18
  22. package/build/adapter-nextjs/page-props/home.js.map +1 -1
  23. package/build/adapter-nextjs/page-props/index.js +8 -41
  24. package/build/adapter-nextjs/page-props/index.js.map +1 -1
  25. package/build/adapter-nextjs/page-props/lib/types.js +1 -2
  26. package/build/adapter-nextjs/page-props/search.js +10 -15
  27. package/build/adapter-nextjs/page-props/search.js.map +1 -1
  28. package/build/adapter-nextjs/page-props/sitemap/SitemapBuilder.js +1 -5
  29. package/build/adapter-nextjs/page-props/sitemap/SitemapBuilder.js.map +1 -1
  30. package/build/adapter-nextjs/page-props/sitemap/createPaths.js +1 -5
  31. package/build/adapter-nextjs/page-props/sitemap/createPaths.js.map +1 -1
  32. package/build/adapter-nextjs/page-props/sitemap/getServerSideProps.js +7 -11
  33. package/build/adapter-nextjs/page-props/sitemap/getServerSideProps.js.map +1 -1
  34. package/build/adapter-nextjs/page-props/sitemap/index.js +4 -24
  35. package/build/adapter-nextjs/page-props/sitemap/index.js.map +1 -1
  36. package/build/adapter-nextjs/page-props/sitemap/types.js +1 -2
  37. package/build/adapter-nextjs/page-props/story.js +17 -23
  38. package/build/adapter-nextjs/page-props/story.js.map +1 -1
  39. package/build/adapter-nextjs/page-props/storyPreview.js +7 -11
  40. package/build/adapter-nextjs/page-props/storyPreview.js.map +1 -1
  41. package/build/adapter-nextjs/processRequest.js +5 -9
  42. package/build/adapter-nextjs/processRequest.js.map +1 -1
  43. package/build/adapter-nextjs/processStaticRequest.js +1 -5
  44. package/build/adapter-nextjs/processStaticRequest.js.map +1 -1
  45. package/build/components-nextjs/PageSeo/PageSeo.js +25 -29
  46. package/build/components-nextjs/PageSeo/PageSeo.js.map +1 -1
  47. package/build/components-nextjs/PageSeo/index.js +2 -20
  48. package/build/components-nextjs/PageSeo/index.js.map +1 -1
  49. package/build/components-nextjs/PageSeo/lib/getAbsoluteUrl.js +1 -5
  50. package/build/components-nextjs/PageSeo/lib/getAbsoluteUrl.js.map +1 -1
  51. package/build/components-nextjs/PageSeo/lib/types.js +1 -2
  52. package/build/components-nextjs/StorySeo/StorySeo.js +8 -12
  53. package/build/components-nextjs/StorySeo/StorySeo.js.map +1 -1
  54. package/build/components-nextjs/StorySeo/index.js +1 -5
  55. package/build/components-nextjs/StorySeo/index.js.map +1 -1
  56. package/build/components-nextjs/document.js +8 -35
  57. package/build/components-nextjs/document.js.map +1 -1
  58. package/build/components-nextjs/index.js +3 -9
  59. package/build/components-nextjs/index.js.map +1 -1
  60. package/build/data-fetching/api/PrezlyApi.d.ts +4 -5
  61. package/build/data-fetching/api/PrezlyApi.js +39 -44
  62. package/build/data-fetching/api/PrezlyApi.js.map +1 -1
  63. package/build/data-fetching/api/getPrezlyApi.js +5 -9
  64. package/build/data-fetching/api/getPrezlyApi.js.map +1 -1
  65. package/build/data-fetching/api/index.js +1 -17
  66. package/build/data-fetching/api/index.js.map +1 -1
  67. package/build/data-fetching/api/queries.js +5 -13
  68. package/build/data-fetching/api/queries.js.map +1 -1
  69. package/build/data-fetching/index.js +3 -19
  70. package/build/data-fetching/index.js.map +1 -1
  71. package/build/data-fetching/lib/getAlgoliaSettings.js +3 -7
  72. package/build/data-fetching/lib/getAlgoliaSettings.js.map +1 -1
  73. package/build/data-fetching/lib/getEnvVariables.js +3 -10
  74. package/build/data-fetching/lib/getEnvVariables.js.map +1 -1
  75. package/build/data-fetching/lib/index.js +4 -11
  76. package/build/data-fetching/lib/index.js.map +1 -1
  77. package/build/data-fetching/lib/isSdkError.js +1 -5
  78. package/build/data-fetching/lib/isSdkError.js.map +1 -1
  79. package/build/data-fetching/lib/isUuid.js +1 -5
  80. package/build/data-fetching/lib/isUuid.js.map +1 -1
  81. package/build/data-fetching/types.js +1 -2
  82. package/build/index.js +9 -25
  83. package/build/index.js.map +1 -1
  84. package/build/infinite-loading/index.js +4 -24
  85. package/build/infinite-loading/index.js.map +1 -1
  86. package/build/infinite-loading/types.js +1 -2
  87. package/build/infinite-loading/useInfiniteGalleriesLoading.js +3 -7
  88. package/build/infinite-loading/useInfiniteGalleriesLoading.js.map +1 -1
  89. package/build/infinite-loading/useInfiniteLoading.js +9 -13
  90. package/build/infinite-loading/useInfiniteLoading.js.map +1 -1
  91. package/build/infinite-loading/useInfiniteStoriesLoading.d.ts +2 -2
  92. package/build/infinite-loading/useInfiniteStoriesLoading.js +7 -11
  93. package/build/infinite-loading/useInfiniteStoriesLoading.js.map +1 -1
  94. package/build/intl/index.d.ts +1 -1
  95. package/build/intl/index.js +4 -25
  96. package/build/intl/index.js.map +1 -1
  97. package/build/intl/languages.d.ts +1 -1
  98. package/build/intl/languages.js +23 -37
  99. package/build/intl/languages.js.map +1 -1
  100. package/build/intl/locale.js +11 -17
  101. package/build/intl/locale.js.map +1 -1
  102. package/build/intl/localeConfig.d.ts +1 -2
  103. package/build/intl/localeConfig.js +3 -4
  104. package/build/intl/localeConfig.js.map +1 -1
  105. package/build/intl/localeList.d.ts +4 -2
  106. package/build/intl/localeList.js +1 -2
  107. package/build/intl/localeList.js.map +1 -1
  108. package/build/intl/localeObject.js +3 -10
  109. package/build/intl/localeObject.js.map +1 -1
  110. package/build/newsroom-context/context.js +7 -11
  111. package/build/newsroom-context/context.js.map +1 -1
  112. package/build/newsroom-context/hooks/index.js +11 -27
  113. package/build/newsroom-context/hooks/index.js.map +1 -1
  114. package/build/newsroom-context/hooks/useAlgoliaSettings.js +3 -7
  115. package/build/newsroom-context/hooks/useAlgoliaSettings.js.map +1 -1
  116. package/build/newsroom-context/hooks/useCategories.js +3 -7
  117. package/build/newsroom-context/hooks/useCategories.js.map +1 -1
  118. package/build/newsroom-context/hooks/useCompanyInformation.js +3 -7
  119. package/build/newsroom-context/hooks/useCompanyInformation.js.map +1 -1
  120. package/build/newsroom-context/hooks/useCurrentCategory.js +3 -7
  121. package/build/newsroom-context/hooks/useCurrentCategory.js.map +1 -1
  122. package/build/newsroom-context/hooks/useCurrentLocale.js +3 -7
  123. package/build/newsroom-context/hooks/useCurrentLocale.js.map +1 -1
  124. package/build/newsroom-context/hooks/useCurrentStory.js +3 -7
  125. package/build/newsroom-context/hooks/useCurrentStory.js.map +1 -1
  126. package/build/newsroom-context/hooks/useGetLinkLocaleSlug.js +10 -14
  127. package/build/newsroom-context/hooks/useGetLinkLocaleSlug.js.map +1 -1
  128. package/build/newsroom-context/hooks/useGetTranslationUrl.js +24 -31
  129. package/build/newsroom-context/hooks/useGetTranslationUrl.js.map +1 -1
  130. package/build/newsroom-context/hooks/useLanguages.js +3 -7
  131. package/build/newsroom-context/hooks/useLanguages.js.map +1 -1
  132. package/build/newsroom-context/hooks/useNewsroom.js +3 -7
  133. package/build/newsroom-context/hooks/useNewsroom.js.map +1 -1
  134. package/build/newsroom-context/hooks/useNewsroomContext.js +4 -8
  135. package/build/newsroom-context/hooks/useNewsroomContext.js.map +1 -1
  136. package/build/newsroom-context/index.js +2 -21
  137. package/build/newsroom-context/index.js.map +1 -1
  138. package/build/sentry/client.js +3 -7
  139. package/build/sentry/client.js.map +1 -1
  140. package/build/sentry/common.js +1 -5
  141. package/build/sentry/common.js.map +1 -1
  142. package/build/sentry/index.js +2 -7
  143. package/build/sentry/index.js.map +1 -1
  144. package/build/sentry/server.js +3 -7
  145. package/build/sentry/server.js.map +1 -1
  146. package/build/tsconfig.tsbuildinfo +1 -1
  147. package/build/types.d.ts +2 -2
  148. package/build/types.js +1 -2
  149. package/build/utils/boilerplate.js +3 -9
  150. package/build/utils/boilerplate.js.map +1 -1
  151. package/build/utils/constants.js +3 -6
  152. package/build/utils/constants.js.map +1 -1
  153. package/build/utils/getAssetsUrl.js +3 -7
  154. package/build/utils/getAssetsUrl.js.map +1 -1
  155. package/build/utils/getDataRequestLink.js +3 -7
  156. package/build/utils/getDataRequestLink.js.map +1 -1
  157. package/build/utils/getLocalizedCategoryData.js +3 -9
  158. package/build/utils/getLocalizedCategoryData.js.map +1 -1
  159. package/build/utils/getNewsroomLogoUrl.js +5 -10
  160. package/build/utils/getNewsroomLogoUrl.js.map +1 -1
  161. package/build/utils/getPrivacyPortalUrl.js +1 -5
  162. package/build/utils/getPrivacyPortalUrl.js.map +1 -1
  163. package/build/utils/getStoryPublicationDate.js +1 -5
  164. package/build/utils/getStoryPublicationDate.js.map +1 -1
  165. package/build/utils/getUploadcareGroupUrl.js +3 -7
  166. package/build/utils/getUploadcareGroupUrl.js.map +1 -1
  167. package/build/utils/index.js +10 -26
  168. package/build/utils/index.js.map +1 -1
  169. package/build/utils/isEmbargoStory.js +1 -5
  170. package/build/utils/isEmbargoStory.js.map +1 -1
  171. package/package.json +17 -17
  172. package/src/@types/global.d.ts +0 -7
  173. package/src/__mocks__/languages.ts +0 -417
  174. package/src/__mocks__/story.ts +0 -351
  175. package/src/adapter-nextjs/api-handlers/fetchGalleries.ts +0 -24
  176. package/src/adapter-nextjs/api-handlers/fetchStories.ts +0 -26
  177. package/src/adapter-nextjs/api-handlers/index.ts +0 -2
  178. package/src/adapter-nextjs/getNewsroomServerSideProps.ts +0 -29
  179. package/src/adapter-nextjs/getNewsroomStaticProps.ts +0 -29
  180. package/src/adapter-nextjs/index.ts +0 -6
  181. package/src/adapter-nextjs/page-props/category.ts +0 -157
  182. package/src/adapter-nextjs/page-props/gallery.ts +0 -114
  183. package/src/adapter-nextjs/page-props/galleryAlbum.ts +0 -89
  184. package/src/adapter-nextjs/page-props/home.ts +0 -113
  185. package/src/adapter-nextjs/page-props/index.ts +0 -26
  186. package/src/adapter-nextjs/page-props/lib/types.ts +0 -8
  187. package/src/adapter-nextjs/page-props/search.ts +0 -53
  188. package/src/adapter-nextjs/page-props/sitemap/SitemapBuilder.ts +0 -56
  189. package/src/adapter-nextjs/page-props/sitemap/createPaths.ts +0 -21
  190. package/src/adapter-nextjs/page-props/sitemap/getServerSideProps.ts +0 -43
  191. package/src/adapter-nextjs/page-props/sitemap/index.ts +0 -5
  192. package/src/adapter-nextjs/page-props/sitemap/types.ts +0 -5
  193. package/src/adapter-nextjs/page-props/story.ts +0 -94
  194. package/src/adapter-nextjs/page-props/storyPreview.ts +0 -33
  195. package/src/adapter-nextjs/processRequest.ts +0 -49
  196. package/src/adapter-nextjs/processStaticRequest.ts +0 -32
  197. package/src/components-nextjs/PageSeo/PageSeo.tsx +0 -131
  198. package/src/components-nextjs/PageSeo/index.ts +0 -2
  199. package/src/components-nextjs/PageSeo/lib/getAbsoluteUrl.ts +0 -7
  200. package/src/components-nextjs/PageSeo/lib/types.ts +0 -4
  201. package/src/components-nextjs/StorySeo/StorySeo.tsx +0 -80
  202. package/src/components-nextjs/StorySeo/index.ts +0 -1
  203. package/src/components-nextjs/document.tsx +0 -38
  204. package/src/components-nextjs/index.ts +0 -3
  205. package/src/data-fetching/api/PrezlyApi.ts +0 -302
  206. package/src/data-fetching/api/getPrezlyApi.ts +0 -24
  207. package/src/data-fetching/api/index.ts +0 -1
  208. package/src/data-fetching/api/queries.ts +0 -51
  209. package/src/data-fetching/index.ts +0 -3
  210. package/src/data-fetching/lib/getAlgoliaSettings.ts +0 -29
  211. package/src/data-fetching/lib/getEnvVariables.ts +0 -46
  212. package/src/data-fetching/lib/index.ts +0 -4
  213. package/src/data-fetching/lib/isSdkError.ts +0 -5
  214. package/src/data-fetching/lib/isUuid.ts +0 -5
  215. package/src/data-fetching/types.ts +0 -14
  216. package/src/index.ts +0 -9
  217. package/src/infinite-loading/index.ts +0 -4
  218. package/src/infinite-loading/types.ts +0 -5
  219. package/src/infinite-loading/useInfiniteGalleriesLoading.ts +0 -53
  220. package/src/infinite-loading/useInfiniteLoading.ts +0 -66
  221. package/src/infinite-loading/useInfiniteStoriesLoading.ts +0 -81
  222. package/src/intl/index.ts +0 -4
  223. package/src/intl/languages.test.ts +0 -232
  224. package/src/intl/languages.ts +0 -233
  225. package/src/intl/locale.test.ts +0 -94
  226. package/src/intl/locale.ts +0 -140
  227. package/src/intl/localeConfig.js +0 -23
  228. package/src/intl/localeList.js +0 -110
  229. package/src/intl/localeObject.test.ts +0 -81
  230. package/src/intl/localeObject.ts +0 -99
  231. package/src/newsroom-context/context.tsx +0 -115
  232. package/src/newsroom-context/hooks/index.ts +0 -11
  233. package/src/newsroom-context/hooks/useAlgoliaSettings.ts +0 -7
  234. package/src/newsroom-context/hooks/useCategories.ts +0 -7
  235. package/src/newsroom-context/hooks/useCompanyInformation.ts +0 -7
  236. package/src/newsroom-context/hooks/useCurrentCategory.ts +0 -7
  237. package/src/newsroom-context/hooks/useCurrentLocale.ts +0 -7
  238. package/src/newsroom-context/hooks/useCurrentStory.ts +0 -7
  239. package/src/newsroom-context/hooks/useGetLinkLocaleSlug.ts +0 -37
  240. package/src/newsroom-context/hooks/useGetTranslationUrl.ts +0 -96
  241. package/src/newsroom-context/hooks/useLanguages.ts +0 -7
  242. package/src/newsroom-context/hooks/useNewsroom.ts +0 -7
  243. package/src/newsroom-context/hooks/useNewsroomContext.ts +0 -15
  244. package/src/newsroom-context/index.ts +0 -2
  245. package/src/sentry/client.ts +0 -7
  246. package/src/sentry/common.ts +0 -27
  247. package/src/sentry/index.ts +0 -2
  248. package/src/sentry/server.ts +0 -7
  249. package/src/types.ts +0 -51
  250. package/src/utils/boilerplate.ts +0 -27
  251. package/src/utils/constants.ts +0 -3
  252. package/src/utils/getAssetsUrl.test.ts +0 -9
  253. package/src/utils/getAssetsUrl.ts +0 -9
  254. package/src/utils/getDataRequestLink.ts +0 -14
  255. package/src/utils/getLocalizedCategoryData.ts +0 -47
  256. package/src/utils/getNewsroomLogoUrl.ts +0 -22
  257. package/src/utils/getPrivacyPortalUrl.ts +0 -25
  258. package/src/utils/getStoryPublicationDate.tsx +0 -15
  259. package/src/utils/getUploadcareGroupUrl.ts +0 -13
  260. package/src/utils/index.ts +0 -10
  261. package/src/utils/isEmbargoStory.ts +0 -10
@@ -1,51 +0,0 @@
1
- const publishedAndAccessible = [
2
- { lifecycle_status: { $in: ['published', 'embargo'] } },
3
- { visibility: { $in: ['public', 'private', 'embargo'] } },
4
- ];
5
-
6
- const publishedAndPublic = [
7
- { lifecycle_status: { $in: ['published'] } },
8
- { visibility: { $in: ['public'] } },
9
- ];
10
-
11
- export function getSlugQuery(newsroomUuid: string, slug: string) {
12
- return {
13
- $and: [
14
- { 'newsroom.uuid': { $in: [newsroomUuid] } },
15
- { slug: { $eq: slug } },
16
- ...publishedAndAccessible,
17
- ],
18
- };
19
- }
20
-
21
- export function getStoriesQuery(newsroomUuid: string, categoryId?: number, localeCode?: string) {
22
- const query: any = {
23
- $and: [...publishedAndPublic, { 'newsroom.uuid': { $in: [newsroomUuid] } }],
24
- };
25
-
26
- if (categoryId) {
27
- query.$and.push({ 'category.id': { $any: [categoryId] } });
28
- }
29
-
30
- if (localeCode) {
31
- query.$and.push({ locale: { $in: [localeCode] } });
32
- }
33
-
34
- return query;
35
- }
36
-
37
- export function getSortByPublishedDate(order: 'asc' | 'desc') {
38
- return order === 'desc' ? '-published_at' : 'published_at';
39
- }
40
-
41
- export function getGalleriesQuery() {
42
- return {
43
- $and: [{ status: { $eq: 'public' } }, { images_number: { $gt: 0 } }],
44
- };
45
- }
46
-
47
- export function getContactsQuery() {
48
- return {
49
- $and: [{ is_featured: { $eq: true } }],
50
- };
51
- }
@@ -1,3 +0,0 @@
1
- export * from './api';
2
- export * from './lib';
3
- export * from './types';
@@ -1,29 +0,0 @@
1
- import type { IncomingMessage } from 'http';
2
-
3
- import type { AlgoliaSettings } from '../types';
4
-
5
- import { getEnvVariables } from './getEnvVariables';
6
-
7
- export function getAlgoliaSettings(req?: IncomingMessage): AlgoliaSettings {
8
- if (typeof window !== 'undefined') {
9
- throw new Error('"getAlgoliaSettings" should only be used on back-end side.');
10
- }
11
-
12
- // `getEnvVariables` handles both cases for envs parsing - .env and request headers
13
- const {
14
- ALGOLIA_API_KEY = '',
15
- ALGOLIA_APP_ID = 'UI4CNRAHQB',
16
- ALGOLIA_INDEX = 'public_stories_prod',
17
- } = getEnvVariables(req);
18
-
19
- if (!ALGOLIA_API_KEY) {
20
- // eslint-disable-next-line no-console
21
- console.error('"ALGOLIA_API_KEY" is not set in env variables. Search will not be enabled');
22
- }
23
-
24
- return {
25
- ALGOLIA_API_KEY,
26
- ALGOLIA_APP_ID,
27
- ALGOLIA_INDEX,
28
- };
29
- }
@@ -1,46 +0,0 @@
1
- import type { IncomingMessage } from 'http';
2
- import parseDataUrl from 'parse-data-url';
3
-
4
- import type { PrezlyEnv } from '../types';
5
-
6
- function decodeJson(json: string): Record<string, any> {
7
- try {
8
- const decoded = JSON.parse(json);
9
- if (decoded && typeof decoded === 'object') {
10
- return decoded;
11
- }
12
- } catch {
13
- // passthru
14
- }
15
- return {};
16
- }
17
-
18
- function decodeHttpEnv(header: string): Record<string, any> {
19
- if (header.startsWith('data:')) {
20
- const parsed = parseDataUrl(header);
21
- if (parsed && parsed.contentType === 'application/json') {
22
- const data = parsed.toBuffer().toString('utf-8');
23
- return decodeJson(data);
24
- }
25
- return {}; // unsupported data-uri
26
- }
27
- return decodeJson(header);
28
- }
29
-
30
- export function getEnvVariables<EnvType extends PrezlyEnv = PrezlyEnv>(
31
- req?: IncomingMessage,
32
- ): NodeJS.ProcessEnv & EnvType {
33
- if (typeof window !== 'undefined') {
34
- throw new Error('"getEnvVariables" should only be used on back-end side.');
35
- }
36
-
37
- const headerName = (process.env.HTTP_ENV_HEADER || '').toLowerCase();
38
-
39
- if (headerName && req) {
40
- const header = req.headers[headerName] as string | undefined;
41
- const httpEnv = decodeHttpEnv(header || '');
42
- return { ...process.env, ...httpEnv } as NodeJS.ProcessEnv & EnvType;
43
- }
44
-
45
- return { ...process.env } as NodeJS.ProcessEnv & EnvType;
46
- }
@@ -1,4 +0,0 @@
1
- export { getAlgoliaSettings } from './getAlgoliaSettings';
2
- export { getEnvVariables } from './getEnvVariables';
3
- export { isSdkError } from './isSdkError';
4
- export { isUuid } from './isUuid';
@@ -1,5 +0,0 @@
1
- import type { SdkError } from '../../types';
2
-
3
- export function isSdkError(error: any): error is SdkError {
4
- return 'payload' in error;
5
- }
@@ -1,5 +0,0 @@
1
- const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
2
-
3
- export function isUuid(input: string) {
4
- return UUID_REGEX.test(input);
5
- }
@@ -1,14 +0,0 @@
1
- export interface AlgoliaSettings {
2
- ALGOLIA_API_KEY: string;
3
- ALGOLIA_APP_ID: string;
4
- ALGOLIA_INDEX: string;
5
- }
6
-
7
- export interface PrezlyNewsroomEnv {
8
- PREZLY_ACCESS_TOKEN: string;
9
- PREZLY_NEWSROOM_UUID: string;
10
- PREZLY_THEME_UUID?: string;
11
- PREZLY_MODE?: 'preview';
12
- }
13
-
14
- export interface PrezlyEnv extends PrezlyNewsroomEnv, AlgoliaSettings {}
package/src/index.ts DELETED
@@ -1,9 +0,0 @@
1
- export * from './adapter-nextjs';
2
- export * from './components-nextjs';
3
- export * from './data-fetching';
4
- export * from './infinite-loading';
5
- export * from './intl';
6
- export * from './newsroom-context';
7
- export * from './sentry';
8
- export * from './types';
9
- export * from './utils';
@@ -1,4 +0,0 @@
1
- export { useInfiniteLoading } from './useInfiniteLoading';
2
- export { useInfiniteStoriesLoading } from './useInfiniteStoriesLoading';
3
- export { useInfiniteGalleriesLoading } from './useInfiniteGalleriesLoading';
4
- export * from './types';
@@ -1,5 +0,0 @@
1
- export interface PaginationProps {
2
- itemsTotal: number;
3
- currentPage: number;
4
- pageSize: number;
5
- }
@@ -1,53 +0,0 @@
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
- }
@@ -1,66 +0,0 @@
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
- }
@@ -1,81 +0,0 @@
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 DELETED
@@ -1,4 +0,0 @@
1
- export * from './languages';
2
- export * from './locale';
3
- export { default as localeConfig } from './localeConfig';
4
- export * from './localeObject';
@@ -1,232 +0,0 @@
1
- import { LANGUAGES } from '../__mocks__/languages';
2
- import { STORY } from '../__mocks__/story';
3
-
4
- import {
5
- getCompanyInformation,
6
- getDefaultLanguage,
7
- getLanguageByExactLocaleCode,
8
- getLanguageByNeutralLocaleCode,
9
- getLanguageByShortRegionCode,
10
- getLanguageDisplayName,
11
- getLanguageFromNextLocaleIsoCode,
12
- getLanguageFromStory,
13
- getShortestLocaleCode,
14
- getUsedLanguages,
15
- } from './languages';
16
- import { DUMMY_DEFAULT_LOCALE } from './locale';
17
- import { LocaleObject } from './localeObject';
18
-
19
- const ALL_LANGUAGES = Object.values(LANGUAGES);
20
-
21
- describe('getLanguageDisplayName', () => {
22
- it('returns shortened name when language is the only culture', () => {
23
- const languages = [LANGUAGES.en, LANGUAGES.fr];
24
-
25
- expect(getLanguageDisplayName(LANGUAGES.en, languages)).toBe('English');
26
- expect(getLanguageDisplayName(LANGUAGES.fr, languages)).toBe('Français');
27
- });
28
-
29
- it('returns full name when language is NOT the only culture', () => {
30
- const languages = [LANGUAGES.nl_BE, LANGUAGES.nl_NL];
31
-
32
- expect(getLanguageDisplayName(LANGUAGES.nl_BE, languages)).toBe('Nederlands (België)');
33
- expect(getLanguageDisplayName(LANGUAGES.nl_NL, languages)).toBe('Nederlands (Nederland)');
34
- });
35
- });
36
-
37
- describe('getDefaultLanguage', () => {
38
- it('returns the actual default language', () => {
39
- const languages = [LANGUAGES.en, LANGUAGES.fr];
40
-
41
- expect(getDefaultLanguage(languages)).toEqual(LANGUAGES.en);
42
- });
43
-
44
- it('returns the first language if no default language is set', () => {
45
- const languages = [LANGUAGES.nl_BE, LANGUAGES.nl_NL];
46
-
47
- expect(getDefaultLanguage(languages)).toEqual(LANGUAGES.nl_BE);
48
- });
49
- });
50
-
51
- describe('getUsedLanguages', () => {
52
- it('filters out languages with no published stories', () => {
53
- const languages = Object.values(LANGUAGES);
54
- const usedLanguages = getUsedLanguages(languages);
55
-
56
- expect(usedLanguages).toHaveLength(3);
57
- expect(usedLanguages.every(({ public_stories_count }) => public_stories_count > 0)).toBe(
58
- true,
59
- );
60
- });
61
- });
62
-
63
- describe('getLanguageByExactLocaleCode', () => {
64
- const languages = [LANGUAGES.nl_BE, LANGUAGES.en];
65
-
66
- it('returns a languages by its exact locale code', () => {
67
- expect(getLanguageByExactLocaleCode(languages, LocaleObject.fromAnyCode('nl-BE'))).toEqual(
68
- LANGUAGES.nl_BE,
69
- );
70
- expect(getLanguageByExactLocaleCode(languages, LocaleObject.fromAnyCode('en'))).toEqual(
71
- LANGUAGES.en,
72
- );
73
- });
74
-
75
- it('returns undefined when there is no langauge with exact locale code', () => {
76
- expect(getLanguageByExactLocaleCode(languages, LocaleObject.fromAnyCode('nl'))).toBe(
77
- undefined,
78
- );
79
- });
80
- });
81
-
82
- describe('getLanguageByNeutralLocaleCode', () => {
83
- it('prefers default language', () => {
84
- const languages = [LANGUAGES.en_US, LANGUAGES.en];
85
-
86
- expect(getLanguageByNeutralLocaleCode(languages, LocaleObject.fromAnyCode('en'))).toEqual(
87
- LANGUAGES.en,
88
- );
89
- });
90
-
91
- it('prefers used cultures', () => {
92
- const languages = [
93
- LANGUAGES.en,
94
- { ...LANGUAGES.nl_BE, public_stories_count: 0, stories_count: 0 },
95
- LANGUAGES.nl_NL,
96
- ];
97
-
98
- expect(getLanguageByNeutralLocaleCode(languages, LocaleObject.fromAnyCode('nl'))).toEqual(
99
- LANGUAGES.nl_NL,
100
- );
101
- });
102
-
103
- it('returns first fitting culture from unused cultures', () => {
104
- const languages = [
105
- LANGUAGES.en,
106
- { ...LANGUAGES.nl_BE, public_stories_count: 0, stories_count: 0 },
107
- { ...LANGUAGES.nl_NL, public_stories_count: 0, stories_count: 0 },
108
- ];
109
-
110
- expect(getLanguageByNeutralLocaleCode(languages, LocaleObject.fromAnyCode('nl'))).toEqual(
111
- languages[1],
112
- );
113
- });
114
- });
115
-
116
- describe('getLanguageByShortRegionCode', () => {
117
- it('prefers default language', () => {
118
- const languages = [LANGUAGES.nl_BE, { ...LANGUAGES.fr_BE, is_default: true }];
119
-
120
- expect(getLanguageByShortRegionCode(languages, LocaleObject.fromAnyCode('be'))).toEqual(
121
- languages[1],
122
- );
123
- });
124
-
125
- it('prefers used cultures', () => {
126
- const languages = [LANGUAGES.en, LANGUAGES.nl_BE, LANGUAGES.fr_BE];
127
-
128
- expect(getLanguageByShortRegionCode(languages, LocaleObject.fromAnyCode('be'))).toEqual(
129
- LANGUAGES.nl_BE,
130
- );
131
- });
132
-
133
- it('returns first fitting culture from unused cultures', () => {
134
- const languages = [
135
- LANGUAGES.en,
136
- LANGUAGES.fr_BE,
137
- { ...LANGUAGES.nl_BE, public_stories_count: 0, stories_count: 0 },
138
- ];
139
-
140
- expect(getLanguageByShortRegionCode(languages, LocaleObject.fromAnyCode('be'))).toEqual(
141
- LANGUAGES.fr_BE,
142
- );
143
- });
144
- });
145
-
146
- describe('getLanguageFromNextLocaleIsoCode', () => {
147
- it('returns default language when no locale code provided or when dummy locale provided', () => {
148
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES)).toEqual(LANGUAGES.en);
149
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES, DUMMY_DEFAULT_LOCALE)).toEqual(
150
- LANGUAGES.en,
151
- );
152
- });
153
-
154
- it('returns language by exact code first', () => {
155
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES, 'en')).toEqual(LANGUAGES.en);
156
- });
157
-
158
- it('returns language by region code second', () => {
159
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES, 'be')).toEqual(LANGUAGES.nl_BE);
160
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES, 'nl')).toEqual(LANGUAGES.nl_NL);
161
- });
162
-
163
- it('returns language by neutral code thrid', () => {
164
- expect(
165
- getLanguageFromNextLocaleIsoCode(
166
- ALL_LANGUAGES.filter(({ code }) => code !== 'fr'),
167
- 'fr',
168
- ),
169
- ).toEqual(LANGUAGES.fr_BE);
170
- });
171
-
172
- it('returns undefined when no language found', () => {
173
- expect(getLanguageFromNextLocaleIsoCode(ALL_LANGUAGES, 'zh-Hant')).toEqual(undefined);
174
- });
175
- });
176
-
177
- describe('getLanguageFromStory', () => {
178
- it('correctly returns language from a story', () => {
179
- expect(getLanguageFromStory(ALL_LANGUAGES, STORY)).toEqual(LANGUAGES.en);
180
- });
181
- });
182
-
183
- describe('getCompanyInformation', () => {
184
- it('returns company information from target language', () => {
185
- expect(getCompanyInformation(ALL_LANGUAGES, LocaleObject.fromAnyCode('nl-BE'))).toEqual(
186
- LANGUAGES.nl_BE.company_information,
187
- );
188
- });
189
-
190
- it('returns company information from default language if target not found', () => {
191
- expect(getCompanyInformation(ALL_LANGUAGES, LocaleObject.fromAnyCode('de-DE'))).toEqual(
192
- LANGUAGES.en.company_information,
193
- );
194
- });
195
- });
196
-
197
- describe('getShortestLocaleCode', () => {
198
- it('returns false for default language', () => {
199
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('en'))).toBe(false);
200
- });
201
-
202
- it('returns neutral language code if it is the only culture with that language', () => {
203
- expect(
204
- getShortestLocaleCode(
205
- ALL_LANGUAGES.filter(({ code }) => code !== 'es_419'),
206
- LocaleObject.fromAnyCode('es-ES'),
207
- ),
208
- ).toBe('es');
209
- });
210
-
211
- it('returns region code if it is the only culture with that region', () => {
212
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('en-US'))).toBe('US');
213
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('en-GB'))).toBe('GB');
214
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('nl-NL'))).toBe('NL');
215
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('fr'))).toBe('FR');
216
- });
217
-
218
- it('returns full code if it can not be shortened', () => {
219
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('fr-BE'))).toBe(
220
- 'fr_BE',
221
- );
222
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('nl-BE'))).toBe(
223
- 'nl_BE',
224
- );
225
- });
226
-
227
- it('returns full code when trying to shorten to region code for es-419', () => {
228
- expect(getShortestLocaleCode(ALL_LANGUAGES, LocaleObject.fromAnyCode('es-419'))).toBe(
229
- 'es_419',
230
- );
231
- });
232
- });