{"mappings":"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","sources":["src/Articles/ArticleSection.tsx","src/Articles/ArticleFrontPage.tsx","src/Articles/ArticleNavigation.tsx","src/Articles/ArticleListPage.tsx","src/Articles/ArticleCard.tsx","src/Articles/ArticleOrMainCategoryPage.tsx","src/Articles/ArticlePage.tsx","src/Articles/getCategoriesForArticle.tsx","src/Articles/articleTelemetry.ts","src/Articles/MainCategoryPage.tsx"],"sourcesContent":["import React from 'react';\nimport { useUiLanguage } from '../hooks/useUiLanguage';\nimport { Route, Routes } from 'react-router-dom';\nimport ArticleFrontPage from './ArticleFrontPage';\nimport ArticleListPage from './ArticleListPage';\nimport ArticleOrMainCategoryPage from './ArticleOrMainCategoryPage';\nimport { articleRoutes } from './articleRoutes';\nimport NotFoundPage from '../Common/NotFoundPage';\n\nexport default function ArticleSection() {\n\tconst lang = useUiLanguage();\n\treturn (\n\t\t<Routes>\n\t\t\t<Route path={articleRoutes.articleFrontPage[lang]} element={<ArticleFrontPage />} />\n\t\t\t<Route path={articleRoutes.articleListPage(undefined)[lang]} element={<ArticleListPage />} />\n\t\t\t<Route\n\t\t\t\tpath={articleRoutes.articleOrMainCategory(undefined)[lang]}\n\t\t\t\telement={<ArticleOrMainCategoryPage />}\n\t\t\t/>\n\t\t\t<Route path=\"/*\" element={<NotFoundPage />} />\n\t\t</Routes>\n\t);\n}\n","import React, { useEffect } from 'react';\nimport * as QueryString from 'query-string';\nimport { Language } from '../Common/interfaces/language';\nimport { LayoutDispatchProps, layoutActions } from '../Common/Layout/layoutActions';\nimport { ILumoOneAppState } from '../boot/configureStore';\nimport { connect, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport { LoadingSpinner } from '../Components/LoadingSpinner';\nimport { articleActions, IFrontPageRequest } from './articleActions';\nimport {\n\tisAlreadyRequested,\n\tApiOperationState,\n\tOperationState,\n\tisOperationSuccess,\n} from '../Common/Api/ApiOperationState';\nimport PageMeta, { PageMetaFields } from '../Common/Layout/PageMeta';\nimport { pageViewTelemetryActions } from '../Telemetry/pageViewTelemetryActions';\nimport { IContentPageAM } from '../ContentPages/ContentPageAM';\nimport { IArticleMainCategoryAM } from './ArticleAM';\nimport { addMinutes } from 'date-fns/addMinutes';\nimport { ArticleBlocks } from '../ContentPages/blockParsing';\nimport { ArticleNavigation } from './ArticleNavigation';\nimport { areDeepEqual } from '../Components/objectUtils';\nimport { useResource } from '../Components/ResourceText';\nimport { OperationStateWithTimeStamp } from './ArticleState';\nimport { requireForSsr } from '../SSR/ssrDispatchWrapper';\nimport { useRunOnce } from '../SSR/inlineRenderDispatchHelper';\nimport { useCurrentUrl } from '../boot/LumoRouterContext';\nimport { routeFromRoot, routes } from '../Common/routes';\n\ninterface ReduxProps {\n\tlanguage: Language;\n\tcategoriesRequest: OperationState<IArticleMainCategoryAM[]> | undefined;\n\tfrontPageRequest: OperationStateWithTimeStamp<IContentPageAM, IFrontPageRequest> | undefined;\n}\n\nexport type DispatchProps = LayoutDispatchProps & {\n\tgetCategories: typeof articleActions.getCategories.request;\n\tgetFrontPage: typeof articleActions.getFrontPage.request;\n\tsetLayoutValues: typeof layoutActions.setValues;\n\tpageComplete: typeof pageViewTelemetryActions.pageComplete;\n};\n\ntype Props = ReduxProps & DispatchProps;\n\nfunction ArticleFrontPage(props: Props) {\n\tconst currentUrl = useCurrentUrl();\n\tconst { getResourceImageUrlByKey } = useResource();\n\tconst dispatch = useDispatch();\n\n\tfunction buildApiRequest(): IFrontPageRequest {\n\t\tconst match = useLocation();\n\t\tconst queryParams = QueryString.parse(match.search);\n\t\tconst draftId =\n\t\t\t!!queryParams.draft_id &&\n\t\t\ttypeof queryParams.draft_id == 'string' &&\n\t\t\tparseInt(queryParams.draft_id as string);\n\t\tconst hash = typeof queryParams.hash == 'string' && queryParams.hash;\n\t\treturn draftId && hash ? { draftId, hash } : {};\n\t}\n\tconst request = buildApiRequest();\n\n\tconst categories = isOperationSuccess(props.categoriesRequest) ? props.categoriesRequest.result : undefined;\n\n\tuseRunOnce(() => {\n\t\tif (!isAlreadyRequested(props.categoriesRequest)) {\n\t\t\trequireForSsr(dispatch, articleActions.getCategories);\n\t\t\tprops.getCategories();\n\t\t}\n\n\t\tif (\n\t\t\t!isAlreadyRequested(props.frontPageRequest, request, areDeepEqual) ||\n\t\t\t(isOperationSuccess(props.frontPageRequest) &&\n\t\t\t\tprops.frontPageRequest.lastRequested < addMinutes(new Date(), -3))\n\t\t) {\n\t\t\trequireForSsr(dispatch, articleActions.getFrontPage);\n\t\t\tprops.getFrontPage(request);\n\t\t}\n\n\t\tprops.setLayoutValues({\n\t\t\tbreadcrumbCurrentName: { key: 'BreadCrumb_Articles_Home', defaultValue: 'Lumo-elämää' },\n\t\t\tbreadcrumbParents: [],\n\t\t\ttranslateUrl: routeFromRoot(routes.articlesRoot),\n\t\t});\n\t});\n\n\tuseEffect(() => {\n\t\tif (!!categories && isOperationSuccess(props.frontPageRequest, request, areDeepEqual)) {\n\t\t\tprops.pageComplete({ pageType: 'articleFrontPage' });\n\t\t}\n\t}, [props.frontPageRequest, categories]);\n\n\tif (\n\t\t!props.frontPageRequest ||\n\t\tprops.frontPageRequest.status === ApiOperationState.Requested ||\n\t\t!props.categoriesRequest ||\n\t\tprops.categoriesRequest.status === ApiOperationState.Requested\n\t) {\n\t\treturn <LoadingSpinner />;\n\t}\n\n\tif (!isOperationSuccess(props.frontPageRequest, request, areDeepEqual)) {\n\t\treturn <ArticleNavigation allCategories={categories} />;\n\t}\n\n\tconst frontPage = props.frontPageRequest.result;\n\n\tconst meta: PageMetaFields = {\n\t\tshareTitle: frontPage.metaTitle || frontPage.title,\n\t\tdescription: frontPage.metaDescription,\n\t\tshareUrl: currentUrl,\n\t\tshareImageUrl: getResourceImageUrlByKey('ArticleSection_GenericShareImage'),\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<PageMeta title={frontPage.title} meta={meta} />\n\t\t\t<ArticleNavigation allCategories={categories} />\n\t\t\t<ArticleBlocks content={frontPage.content} />\n\t\t</>\n\t);\n}\n\nconst mapStateToProps = ({ language, articles }: ILumoOneAppState): ReduxProps => ({\n\tlanguage: language.currentLanguage,\n\tcategoriesRequest: articles.categoriesRequest,\n\tfrontPageRequest: articles.frontPageRequest,\n});\n\nexport default connect<ReduxProps, DispatchProps>(mapStateToProps, {\n\tgetCategories: articleActions.getCategories.request,\n\tgetFrontPage: articleActions.getFrontPage.request,\n\tsetLayoutValues: layoutActions.setValues,\n\tpageComplete: pageViewTelemetryActions.pageComplete,\n})(ArticleFrontPage);\n","import React from 'react';\nimport { IUseResourceTexts, ResourceText, withResourceTextSupport } from '../Components/ResourceText';\nimport { IArticleMainCategoryAM } from './ArticleAM';\nimport { Link } from 'react-router-dom';\nimport { useUiLanguage } from '../hooks/useUiLanguage';\nimport { articleRoutes } from './articleRoutes';\nimport { routeFromRoot, routes } from '../Common/routes';\n\ninterface Params {\n\tallCategories: IArticleMainCategoryAM[] | undefined;\n\tselectedCategory?: IArticleMainCategoryAM;\n}\n\ntype Props = Params & IUseResourceTexts;\n\nexport const ArticleNavigation = withResourceTextSupport(function (props: Props) {\n\tconst { allCategories, selectedCategory } = props;\n\tconst language = useUiLanguage();\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"mod-articleNav\">\n\t\t\t\t<div className=\"mod-articleNav__wrapper\">\n\t\t\t\t\t<Link className=\"mod-articleNav__home\" to={routeFromRoot(routes.articlesRoot)[language]}>\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" height=\"24\" width=\"24\">\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tfill=\"#002663\"\n\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t\t\td=\"M1.875 12.625C1.875 12.2108 2.21079 11.875 2.625 11.875H7.625C8.03921 11.875 8.375 12.2108 8.375 12.625V18.875C8.375 20.6705 6.92046 22.125 5.125 22.125C3.32954 22.125 1.875 20.6705 1.875 18.875V12.625ZM3.375 13.375V18.875C3.375 19.842 4.15796 20.625 5.125 20.625C6.09204 20.625 6.875 19.842 6.875 18.875V13.375H3.375Z\"\n\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tfill=\"#002663\"\n\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t\t\td=\"M6.875 2.625C6.875 2.21079 7.21079 1.875 7.625 1.875H21.375C21.7892 1.875 22.125 2.21079 22.125 2.625V18.875C22.125 20.6705 20.6705 22.125 18.875 22.125H5.125C4.71079 22.125 4.375 21.7892 4.375 21.375C4.375 20.9608 4.71079 20.625 5.125 20.625H18.875C19.842 20.625 20.625 19.842 20.625 18.875V3.375H8.375V12.625C8.375 13.0392 8.03921 13.375 7.625 13.375C7.21079 13.375 6.875 13.0392 6.875 12.625V2.625Z\"\n\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tfill=\"#002663\"\n\t\t\t\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\t\t\t\td=\"M10.625 5.625H18.375V7.125H10.625V5.625zM10.625 9.375H18.375V10.875H10.625V9.375zM10.625 13.125H18.375V14.625H10.625V13.125zM10.625 16.875H14.625V18.375H10.625V16.875z\"\n\t\t\t\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<h1>\n\t\t\t\t\t\t\t<ResourceText resourceKey=\"ArticleNavigation_H1\" defaultText=\"Selaa artikkeleita\" />\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</Link>\n\t\t\t\t\t<nav className=\"mod-articleNav__nav\">\n\t\t\t\t\t\t{allCategories &&\n\t\t\t\t\t\t\tallCategories.map((c, i) => (\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\tkey={i}\n\t\t\t\t\t\t\t\t\tto={articleRoutes.articleOrMainCategory(c.slug)[language]}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tselectedCategory && c.id === selectedCategory.id ? 'selected' : undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{c.name}\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</nav>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n});\n","import React from 'react';\nimport * as QueryString from 'query-string';\nimport { Language } from '../Common/interfaces/language';\nimport { layoutActions } from '../Common/Layout/layoutActions';\nimport { ILumoOneAppState } from '../boot/configureStore';\nimport { connect } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport { withSsrSupport, IDefineSsrRequirements } from '../SSR/ssrDispatchWrapper';\nimport { ArticleCard } from './ArticleCard';\nimport { articleActions, IArticleListRequest, IArticleFilter, getArticleFilterString } from './articleActions';\nimport { isOperationSuccess, isAlreadyRequested } from '../Common/Api/ApiOperationState';\nimport { ArticleState } from './ArticleState';\nimport { LoadingSpinner } from '../Components/LoadingSpinner';\nimport { IArticleListAM, IArticleMainCategoryAM, IArticleSubCategoryAM } from './ArticleAM';\nimport { ArticleNavigation } from './ArticleNavigation';\nimport { ResourceText, ResourceTextInline, useResource } from '../Components/ResourceText';\nimport { areDeepEqual } from '../Components/objectUtils';\nimport { useUiLanguage } from '../hooks/useUiLanguage';\nimport { articleListPageCategoryParameter, articleListPageTagParameter, articleRoutes } from './articleRoutes';\nimport PageMeta, { PageMetaFields } from '../Common/Layout/PageMeta';\nimport { pageViewTelemetryActions } from '../Telemetry/pageViewTelemetryActions';\nimport { useCurrentUrl } from '../boot/LumoRouterContext';\nimport { routeFromRoot, routes } from '../Common/routes';\n\ninterface ReduxProps {\n\tlanguage: Language;\n\tarticleData: ArticleState['articleListData'];\n\tarticleListOperations: ArticleState['articleListOperations'];\n\tcategoriesRequest: ArticleState['categoriesRequest'];\n\tshownArticleCount: ArticleState['articleListVisibleArticleCount'];\n}\n\nconst dispatchProps = {\n\tsetLayoutValues: layoutActions.setValues,\n\tgetArticleList: articleActions.getArticleList.request,\n\tgetCategories: articleActions.getCategories.request,\n\tsetShownArticleCount: articleActions.setArticleListArticleCount,\n\tpageComplete: pageViewTelemetryActions.pageComplete,\n};\n\ntype DispatchProps = typeof dispatchProps;\n\ntype Props = ReduxProps & DispatchProps & IDefineSsrRequirements;\n\nconst initialPageArticleCount = 20;\nconst consecutivePageArticleCount = 20;\n\nconst filtersEqual = (a: IArticleListRequest, b: IArticleListRequest) => areDeepEqual(a.filter, b.filter);\n\nfunction ArticleListPage(props: Props) {\n\tconst language = useUiLanguage();\n\tconst { getResourceImageUrlByKey, getResourceText } = useResource();\n\tconst currentUrl = useCurrentUrl();\n\n\tconst match = useLocation();\n\tconst categoriesQuery = QueryString.parse(match.search)[articleListPageCategoryParameter[language]];\n\tconst tagsQuery = QueryString.parse(match.search)[articleListPageTagParameter[language]];\n\n\tconst filter: IArticleFilter = {\n\t\tcategorySlugs: categoriesQuery\n\t\t\t? Array.isArray(categoriesQuery)\n\t\t\t\t? (categoriesQuery.filter((category) => category !== null) as string[])\n\t\t\t\t: [categoriesQuery]\n\t\t\t: undefined,\n\t\ttagSlugs: tagsQuery\n\t\t\t? Array.isArray(tagsQuery)\n\t\t\t\t? (tagsQuery.filter((tag) => tag !== null) as string[])\n\t\t\t\t: [tagsQuery]\n\t\t\t: undefined,\n\t};\n\n\tconst mainCategories = isOperationSuccess(props.categoriesRequest) ? props.categoriesRequest.result : undefined;\n\tconst requestStateKey = getArticleFilterString(filter);\n\tconst articleFetchOp = props.articleListOperations[requestStateKey];\n\tconst articles = props.articleData[requestStateKey];\n\n\tif (!isAlreadyRequested(props.categoriesRequest)) {\n\t\tprops.requireForSsr(articleActions.getCategories);\n\t\tprops.getCategories();\n\t}\n\tif (!isAlreadyRequested(articleFetchOp, { filter }, filtersEqual)) {\n\t\tprops.requireForSsr(articleActions.getArticleList);\n\t\tprops.getArticleList({ filter: filter, take: initialPageArticleCount });\n\t}\n\n\tReact.useEffect(() => {\n\t\tconst loadedArticleCount = articles ? articles.items.length : 0;\n\t\tif (props.shownArticleCount && loadedArticleCount > 0) {\n\t\t\tprops.getArticleList({\n\t\t\t\tfilter,\n\t\t\t\ttake: consecutivePageArticleCount,\n\t\t\t\tskip: loadedArticleCount,\n\t\t\t});\n\t\t}\n\t}, [props.shownArticleCount]);\n\n\tconst getTerms = (): string[] => {\n\t\tif (!articles) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst terms: string[] = [];\n\t\tif (articles.mainCategories) {\n\t\t\tterms.push(...articles.mainCategories.map((c) => c.name));\n\t\t}\n\t\tif (articles.subCategories) {\n\t\t\tterms.push(...articles.subCategories.map((c) => c.name));\n\t\t}\n\t\tif (articles.tags) {\n\t\t\tterms.push(...articles.tags.map((t) => t.name));\n\t\t}\n\n\t\treturn terms;\n\t};\n\n\tReact.useEffect(() => {\n\t\tprops.setLayoutValues({\n\t\t\tbreadcrumbCurrentName: getTerms().join(', '),\n\t\t\tbreadcrumbParents: [\n\t\t\t\t{\n\t\t\t\t\tname: { key: 'BreadCrumb_Articles_Home', defaultValue: 'Lumo-elämää' },\n\t\t\t\t\tpath: routeFromRoot(routes.articlesRoot)[language],\n\t\t\t\t},\n\t\t\t],\n\t\t\ttranslateUrl: getTranslations(currentUrl, props.language, articles),\n\t\t});\n\n\t\tprops.pageComplete({\n\t\t\tpageType: 'articleList',\n\t\t\tdata: {\n\t\t\t\tcategorySlugs: filter.categorySlugs ? filter.categorySlugs.join(',') : undefined,\n\t\t\t\tkeywordSlugs: filter.tagSlugs ? filter.tagSlugs.join(',') : undefined,\n\t\t\t},\n\t\t});\n\t}, [articles]);\n\n\tif (!mainCategories) {\n\t\treturn <LoadingSpinner />;\n\t}\n\n\tconst meta: PageMetaFields = {\n\t\tdescription: getResourceText('ArticleListPage_MetaDescription'),\n\t\tshareUrl: currentUrl,\n\t\tshareImageUrl: getResourceImageUrlByKey('ArticleSection_GenericShareImage') || undefined,\n\t};\n\n\tconst termsString = getTerms().join(', ');\n\n\treturn (\n\t\t<>\n\t\t\t<PageMeta title={termsString} meta={meta} />\n\t\t\t<ArticleNavigation allCategories={mainCategories} />\n\t\t\t<div className=\"mod-articleListing\">\n\t\t\t\t<h1 className=\"mod-articleListing__heading\">\n\t\t\t\t\t<ResourceTextInline\n\t\t\t\t\t\tresourceKey=\"ArticleListPage_Heading\"\n\t\t\t\t\t\tdefaultText=\"Näytetään artikkelit aiheista:\"\n\t\t\t\t\t/>{' '}\n\t\t\t\t\t<strong>{termsString}</strong>\n\t\t\t\t</h1>\n\n\t\t\t\t{articles ? (\n\t\t\t\t\tarticles.items.length ? (\n\t\t\t\t\t\t<div className=\"mod-articleListing__wrapper\">\n\t\t\t\t\t\t\t<ArticleList\n\t\t\t\t\t\t\t\tarticles={articles}\n\t\t\t\t\t\t\t\tlanguage={props.language}\n\t\t\t\t\t\t\t\tonLoadMore={(val) => props.setShownArticleCount(val)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"-alignCenter\">\n\t\t\t\t\t\t\t<ResourceText\n\t\t\t\t\t\t\t\ttextType=\"Markdown\"\n\t\t\t\t\t\t\t\tresourceKey=\"ArticleListPage_NoArticlesFound\"\n\t\t\t\t\t\t\t\tdefaultText=\"Valitettavasti yhtään artikkelia ei löytynyt annetuilla ehdoilla. [Lumo-elämää -pääsivulle](/lumo-elamaa)\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<LoadingSpinner />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nfunction ArticleList(props: { articles: IArticleListAM; language: Language; onLoadMore: (skip: number) => void }) {\n\treturn (\n\t\t<>\n\t\t\t<ul className=\"mod-articleListing__articleList\">\n\t\t\t\t{props.articles.items.map((a) => (\n\t\t\t\t\t<ArticleCard key={a.slug} article={a} showPublishDate={true} language={props.language} />\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t\t{props.articles.hasMore && (\n\t\t\t\t<div className=\"mod-articleListing__cta\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclassName=\"atom-button\"\n\t\t\t\t\t\tonClick={() => props.onLoadMore(props.articles.items.length + consecutivePageArticleCount)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ResourceTextInline resourceKey=\"ArticleListPage_ShowMore\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\nfunction getTranslations(currentUrl: string, language: Language, articles?: IArticleListAM) {\n\tif (!articles) {\n\t\treturn {\n\t\t\ten: currentUrl,\n\t\t\tfi: currentUrl,\n\t\t};\n\t}\n\n\tconst categories: (IArticleMainCategoryAM | IArticleSubCategoryAM)[] = [];\n\tif (articles.mainCategories) {\n\t\tcategories.push(...articles.mainCategories);\n\t}\n\tif (articles.subCategories) {\n\t\tcategories.push(...articles.subCategories);\n\t}\n\n\treturn language === 'en'\n\t\t? {\n\t\t\t\ten: currentUrl,\n\t\t\t\tfi: articleRoutes.articleListPage(\n\t\t\t\t\tcategories.map((c) => c.translationSlugs.fi),\n\t\t\t\t\tarticles.tags ? articles.tags.map((t) => t.translationSlugs.fi) : undefined,\n\t\t\t\t).fi,\n\t\t\t}\n\t\t: {\n\t\t\t\ten: articleRoutes.articleListPage(\n\t\t\t\t\tcategories.map((c) => c.translationSlugs.en),\n\t\t\t\t\tarticles.tags ? articles.tags.map((t) => t.translationSlugs.en) : undefined,\n\t\t\t\t).en,\n\t\t\t\tfi: currentUrl,\n\t\t\t};\n}\n\nexport default withSsrSupport(\n\tconnect<ReduxProps, DispatchProps, Record<string, never>, ILumoOneAppState>(\n\t\t({ language, articles }) => ({\n\t\t\tlanguage: language.currentLanguage,\n\t\t\tarticleData: articles.articleListData,\n\t\t\tarticleListOperations: articles.articleListOperations,\n\t\t\tcategoriesRequest: articles.categoriesRequest,\n\t\t\tshownArticleCount: articles.articleListVisibleArticleCount,\n\t\t}),\n\t\tdispatchProps,\n\t)(ArticleListPage),\n);\n","import React from 'react';\nimport { Link } from 'react-router-dom';\nimport { formatBasicDateString } from '../DateUtils';\nimport { IArticleCardAM } from './ArticleAM';\nimport { Language } from '../Common/interfaces/language';\nimport { articleRoutes } from './articleRoutes';\nimport { ArticleMainImage, VideoThumbnailSize } from './ArticleMainImage';\n\ninterface ArticleCardProps {\n\tarticle: IArticleCardAM;\n\tlanguage: Language;\n\tshowPublishDate: boolean;\n}\n\nexport function ArticleCard({ article, language, showPublishDate }: ArticleCardProps) {\n\treturn (\n\t\t<li className=\"mod-articleListing__article\">\n\t\t\t<Link\n\t\t\t\tto={articleRoutes.articleOrMainCategory(article.slug)[language]}\n\t\t\t\tclassName=\"mod-articleListing__articleLink\"\n\t\t\t>\n\t\t\t\t<div className=\"mod-articleListing__imageWrapper\">\n\t\t\t\t\t<ArticleMainImage\n\t\t\t\t\t\tarticle={article}\n\t\t\t\t\t\tclassName=\"mod-articleListing__articleImage\"\n\t\t\t\t\t\tpreset=\"700x375-article-mainimage\"\n\t\t\t\t\t\tvideoThumbnailSize={VideoThumbnailSize.Medium}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<span className=\"atom-articleCategory\">\n\t\t\t\t\t{showPublishDate && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className=\"timeStamp\">{formatBasicDateString(article.published)}</span>{' '}\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{article.subCategoryName}\n\t\t\t\t</span>\n\t\t\t\t<h2 className=\"mod-articleListing__articleHeading\">{article.title}</h2>\n\t\t\t</Link>\n\t\t</li>\n\t);\n}\n","import React, { useEffect } from 'react';\nimport * as QueryString from 'query-string';\nimport { connect } from 'react-redux';\nimport { addMinutes } from 'date-fns/addMinutes';\nimport { useLocation, useMatch } from 'react-router-dom';\n\nimport { Language } from '../Common/interfaces/language';\nimport { ILumoOneAppState } from '../boot/configureStore';\nimport NotFoundPage from '../Common/NotFoundPage';\nimport { LoadingSpinner } from '../Components/LoadingSpinner';\nimport { articleActions, IArticleReqest } from './articleActions';\nimport { IUseResourceTexts, useLanguage, withResourceTextSupport } from '../Components/ResourceText';\nimport { withSsrSupport, IDefineSsrRequirements } from '../SSR/ssrDispatchWrapper';\nimport {\n\tisAlreadyRequested,\n\tApiOperationState,\n\tOperationState,\n\tisOperationSuccess,\n} from '../Common/Api/ApiOperationState';\nimport { pageViewTelemetryActions } from '../Telemetry/pageViewTelemetryActions';\nimport { IArticleMainCategoryAM, IArticleFullAM } from './ArticleAM';\nimport ArticlePage from './ArticlePage';\nimport MainCategoryPage from './MainCategoryPage';\nimport { areDeepEqual } from '../Components/objectUtils';\nimport { articleRoutes } from './articleRoutes';\nimport { routeFromRoot, routes } from '../Common/routes';\nimport { useRunOnce } from '../SSR/inlineRenderDispatchHelper';\n\ninterface ReduxProps {\n\tlanguage: Language;\n\tcategoriesRequest: OperationState<IArticleMainCategoryAM[]> | undefined;\n\tarticleRequest: OperationState<IArticleFullAM, IArticleReqest> | undefined;\n\tarticleLastFetched: Date | undefined;\n}\n\ninterface DispatchProps {\n\tgetCategories: typeof articleActions.getCategories.request;\n\tgetArticleBySlug: typeof articleActions.getArticle.request;\n\tpageComplete: typeof pageViewTelemetryActions.pageComplete;\n}\n\ntype Props = ReduxProps & DispatchProps & IDefineSsrRequirements & IUseResourceTexts;\n\nfunction ArticleOrMainCategoryPage(props: Props) {\n\tconst language = useLanguage();\n\tconst match = useMatch<'slug', string>(\n\t\t`${routeFromRoot(routes.articlesRoot)[language]}${articleRoutes.articleOrMainCategory(undefined)[language]}`,\n\t);\n\tconst slug = match?.params.slug as string;\n\tconst categories = isOperationSuccess(props.categoriesRequest) ? props.categoriesRequest.result : undefined;\n\tconst mainCategory = categories && categories.find((c) => c.slug === slug);\n\tconst isMainCategoryPage = !!mainCategory;\n\t// Can only tell it's an article after categories have been loaded\n\tconst isArticlePage = categories && !isMainCategoryPage;\n\n\tconst location = useLocation();\n\n\tconst fetchArticleIfNeeded = () => {\n\t\tif (isArticlePage) {\n\t\t\tconst request = getApiRequest();\n\t\t\tconst isSuccess = isOperationSuccess(props.articleRequest, request, areDeepEqual);\n\t\t\tconst isArticleFetchedRecently = isSuccess && props.articleLastFetched! < addMinutes(new Date(), -1);\n\t\t\tconst isRequested = isAlreadyRequested(props.articleRequest, request, areDeepEqual);\n\n\t\t\tif (!isArticleFetchedRecently && !isRequested) {\n\t\t\t\tprops.requireForSsr(articleActions.getArticle);\n\t\t\t\tprops.getArticleBySlug(request);\n\t\t\t}\n\t\t}\n\t};\n\n\tuseRunOnce(() => {\n\t\tif (!isAlreadyRequested(props.categoriesRequest)) {\n\t\t\tprops.requireForSsr(articleActions.getCategories);\n\t\t\tprops.getCategories();\n\t\t}\n\t\tfetchArticleIfNeeded();\n\t});\n\n\tuseEffect(() => {\n\t\tif (!isAlreadyRequested(props.categoriesRequest)) {\n\t\t\tprops.getCategories();\n\t\t}\n\t\tfetchArticleIfNeeded();\n\t}, [slug, isArticlePage]);\n\n\tfunction getApiRequest() {\n\t\tconst queryParams = QueryString.parse(location.search);\n\t\t// Article preview support if url contains draft_id and hash query params\n\t\tconst draftId =\n\t\t\t!!queryParams.draft_id &&\n\t\t\ttypeof queryParams.draft_id == 'string' &&\n\t\t\tparseInt(queryParams.draft_id as string);\n\t\tconst hash = typeof queryParams.hash == 'string' && queryParams.hash;\n\t\tconst request: IArticleReqest = draftId && hash ? { slug, draftId, hash } : { slug };\n\t\treturn request;\n\t}\n\n\tuseEffect(() => {\n\t\tif (categories && props.articleRequest && props.articleRequest.status === ApiOperationState.Failed) {\n\t\t\tprops.pageComplete({ pageType: 'notFound' });\n\t\t}\n\t}, [props.articleRequest, categories]);\n\n\tif (isMainCategoryPage) {\n\t\treturn <MainCategoryPage category={mainCategory!} allCategories={categories!} />;\n\t}\n\n\tif (props.articleRequest && props.articleRequest.status === ApiOperationState.Failed) {\n\t\treturn <NotFoundPage />;\n\t}\n\n\tif (\n\t\t!props.articleRequest ||\n\t\tprops.articleRequest.status === ApiOperationState.Requested ||\n\t\t!isOperationSuccess(props.articleRequest, getApiRequest(), areDeepEqual)\n\t) {\n\t\treturn <LoadingSpinner />;\n\t}\n\n\treturn <ArticlePage article={props.articleRequest.result} />;\n}\n\nexport default withResourceTextSupport(\n\twithSsrSupport(\n\t\t// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n\t\tconnect<ReduxProps, DispatchProps, {}, ILumoOneAppState>(\n\t\t\t({ language, articles }: ILumoOneAppState): ReduxProps => ({\n\t\t\t\tlanguage: language.currentLanguage,\n\t\t\t\tcategoriesRequest: articles.categoriesRequest,\n\t\t\t\tarticleRequest: articles.articleRequest,\n\t\t\t\tarticleLastFetched: articles.articleLastFetched,\n\t\t\t}),\n\t\t\t{\n\t\t\t\tgetCategories: articleActions.getCategories.request,\n\t\t\t\tgetArticleBySlug: articleActions.getArticle.request,\n\t\t\t\tpageComplete: pageViewTelemetryActions.pageComplete,\n\t\t\t},\n\t\t)(ArticleOrMainCategoryPage),\n\t),\n);\n","import React, { useEffect, useState } from 'react';\nimport { Language } from '../Common/interfaces/language';\nimport { LayoutDispatchProps, layoutActions } from '../Common/Layout/layoutActions';\nimport { ILumoOneAppState } from '../boot/configureStore';\nimport { connect } from 'react-redux';\nimport { IUseResourceTexts, ResourceTextInline, withResourceTextSupport } from '../Components/ResourceText';\nimport PageMeta, { PageMetaFields } from '../Common/Layout/PageMeta';\nimport { pageViewTelemetryActions } from '../Telemetry/pageViewTelemetryActions';\nimport { Helmet } from 'react-helmet-async';\nimport {\n\tIArticleCardAM,\n\tIArticleMainCategoryAM,\n\tIArticleSubCategoryAM,\n\tIArticleTagAM,\n\tIArticleFullAM,\n} from './ArticleAM';\nimport { ArticleNavigation } from './ArticleNavigation';\nimport { Link } from 'react-router-dom';\nimport { isOperationSuccess } from '../Common/Api/ApiOperationState';\nimport { BreadCrumbItem } from '../Common/Layout/layoutState';\nimport { LoadingSpinner } from '../Components/LoadingSpinner';\nimport { formatBasicDateString } from '../DateUtils';\nimport { getContentMediaUrl } from '../Components/ContentMedia';\nimport { useUiLanguage } from '../hooks/useUiLanguage';\nimport { YoutubeEmbed } from '../Components/YoutubeEmbed';\nimport { ArticleBlocks } from '../ContentPages/blockParsing';\nimport { ArticleCard } from './ArticleCard';\nimport { getCategoriesForArticle } from './getCategoriesForArticle';\nimport { articleRoutes } from './articleRoutes';\nimport SocialShareIcons from '../Common/SocialShareIcons';\nimport DynamicBanner from '../Components/DynamicBanners/DynamicBanner';\nimport { SocialShareContext } from '../Telemetry/TelemetryManager';\nimport { isSameDay } from 'date-fns/isSameDay';\nimport { getArticleTelemetryData, IArticleTelemetry } from './articleTelemetry';\nimport { ArticleMainImage, VideoThumbnailSize } from './ArticleMainImage';\nimport { ScrollToHash } from '../Components/ScrollToHash';\nimport { GA4EventAction } from '../Telemetry/TelemetryGA4';\nimport { useCurrentUrl } from '../boot/LumoRouterContext';\nimport { routeFromRoot, routes } from '../Common/routes';\nimport { useRunOnce } from '../SSR/inlineRenderDispatchHelper';\n\ninterface Params {\n\tarticle: IArticleFullAM;\n}\n\ninterface ReduxProps {\n\tlanguage: Language;\n\tallCategories: IArticleMainCategoryAM[] | undefined;\n\tcommonUiRoot: string;\n}\n\nexport type DispatchProps = LayoutDispatchProps & {\n\tsetLayoutValues: typeof layoutActions.setValues;\n\tpageComplete: typeof pageViewTelemetryActions.pageComplete;\n};\n\ntype Props = Params & ReduxProps & DispatchProps & IUseResourceTexts;\n\nfunction ArticlePage(props: Props) {\n\tconst { article, allCategories, language } = props;\n\tconst currentUrl = useCurrentUrl();\n\n\tconst { mainCategory, subCategory } = allCategories\n\t\t? getCategoriesForArticle(article, allCategories)\n\t\t: { mainCategory: undefined, subCategory: undefined };\n\n\tconst [telemetryData, setTelemetryData] = useState<IArticleTelemetry>();\n\n\tconst getBreadcrumbParents = () => {\n\t\tconst breadcrumb: BreadCrumbItem[] = [\n\t\t\t{\n\t\t\t\tname: { key: 'BreadCrumb_Articles_Home', defaultValue: 'Lumo-elämää' },\n\t\t\t\tpath: routeFromRoot(routes.articlesRoot)[language],\n\t\t\t},\n\t\t];\n\n\t\tif (mainCategory) {\n\t\t\tbreadcrumb.push({\n\t\t\t\tname: mainCategory.name,\n\t\t\t\tpath: articleRoutes.articleOrMainCategory(mainCategory.slug)[language],\n\t\t\t});\n\t\t}\n\t\tif (subCategory) {\n\t\t\tbreadcrumb.push({\n\t\t\t\tname: subCategory.name,\n\t\t\t\tpath: articleRoutes.articleListPage([subCategory.slug])[language],\n\t\t\t});\n\t\t}\n\n\t\treturn breadcrumb;\n\t};\n\n\tconst setLayoutValues = () => {\n\t\tprops.setLayoutValues({\n\t\t\tbreadcrumbCurrentName: article.title,\n\t\t\tbreadcrumbParents: getBreadcrumbParents(),\n\t\t\ttranslateUrl: getTranslationsForArticle(currentUrl, language, article),\n\t\t});\n\t};\n\tuseRunOnce(setLayoutValues);\n\tuseEffect(() => {\n\t\tsetLayoutValues();\n\t\tif (!mainCategory) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst telemetryData = getArticleTelemetryData(article, mainCategory.name);\n\t\tprops.pageComplete({\n\t\t\tpageType: 'article',\n\t\t\tdata: telemetryData,\n\t\t});\n\t\tsetTelemetryData(telemetryData);\n\t}, [article, mainCategory]);\n\n\tconst meta: PageMetaFields = {\n\t\tshareTitle: article.metaTitle || article.title,\n\t\tdescription: article.metaDescription || article.ingress,\n\t\tshareImageUrl: article.mainImageUrl ? getContentMediaUrl(article.mainImageUrl, props.commonUiRoot) : undefined,\n\t\tshareVideoUrl: article.mainVideoId ? `https://www.youtube.com/watch?v=${article.mainVideoId}` : undefined,\n\t\tshareUrl: currentUrl,\n\t};\n\n\tif (!allCategories || !mainCategory || !subCategory) {\n\t\treturn <LoadingSpinner />;\n\t}\n\n\treturn (\n\t\t<ScrollToHash>\n\t\t\t<PageMeta title={article.title} meta={meta} noIndex={article.hideFromSearchEngines} />\n\t\t\t<ArticleNavigation allCategories={allCategories} />\n\t\t\t<article className=\"view-singleArticle\">\n\t\t\t\t<div className=\"view-singleArticle__headerWrapper\">\n\t\t\t\t\t<ArticleBreadcrumb mainCategory={mainCategory} subCategory={subCategory} language={language} />\n\t\t\t\t\t<ArticleHeader article={article} subCategory={subCategory} language={language} />\n\t\t\t\t</div>\n\n\t\t\t\t<section className=\"view-singleArticle__contentWrapper\">\n\t\t\t\t\t<ArticleSocialShare shareText={article.title} />\n\t\t\t\t\t<div className=\"view-singleArticle__content\">\n\t\t\t\t\t\t<ArticleBlocks content={article.content} telemetryData={telemetryData} />\n\t\t\t\t\t</div>\n\t\t\t\t</section>\n\n\t\t\t\t<footer className=\"view-singleArticle__footer\">\n\t\t\t\t\t<div className=\"view-singleArticle__footerWrapper\">\n\t\t\t\t\t\t{article.tags && <ArticleTags tags={article.tags} />}\n\t\t\t\t\t\t<ArticleDetails article={article} />\n\t\t\t\t\t\t<ArticleSocialShare shareText={article.title} />\n\t\t\t\t\t</div>\n\t\t\t\t</footer>\n\n\t\t\t\t<MightAlsoInterest article={article} language={language} />\n\t\t\t</article>\n\t\t\t<DynamicBanner name=\"articleSection\" telemetryId={GA4EventAction.ArticlePage_DynamicBannerCTA} />\n\t\t\t<Helmet>\n\t\t\t\t<script\n\t\t\t\t\ttype=\"application/json\"\n\t\t\t\t\tid=\"valu-search\"\n\t\t\t\t>{` {\"created\":\"${article.published.toISOString()}\", \"modified\":\"${article.lastModified.toISOString()}\" } `}</script>\n\t\t\t</Helmet>\n\t\t</ScrollToHash>\n\t);\n}\n\nfunction getTranslationsForArticle(currentUrl: string, language: Language, articleCard: IArticleCardAM) {\n\tif (articleCard.translationSlugs && Object.keys(articleCard.translationSlugs).length) {\n\t\treturn language === 'en'\n\t\t\t? {\n\t\t\t\t\ten: currentUrl,\n\t\t\t\t\tfi: articleRoutes.articleOrMainCategory(articleCard.translationSlugs['fi']).fi,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ten: articleRoutes.articleOrMainCategory(articleCard.translationSlugs['en']).en,\n\t\t\t\t\tfi: currentUrl,\n\t\t\t\t};\n\t} else {\n\t\treturn {\n\t\t\ten: currentUrl,\n\t\t\tfi: currentUrl,\n\t\t};\n\t}\n}\n\ninterface ArticleBreadcrumbProps {\n\tmainCategory: IArticleMainCategoryAM;\n\tsubCategory: IArticleSubCategoryAM;\n\tlanguage: Language;\n}\n\nfunction ArticleBreadcrumb({ mainCategory, subCategory, language }: ArticleBreadcrumbProps) {\n\treturn (\n\t\t<nav className=\"atom-breadcrumb\">\n\t\t\t<ol className=\"atom-breadcrumb__list\">\n\t\t\t\t<li className=\"atom-breadcrumb__link\">\n\t\t\t\t\t<Link to=\"..\">\n\t\t\t\t\t\t<ResourceTextInline resourceKey=\"ArticlePage_Breadcrumb_ArticleFrontPage\" />\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t\t<li className=\"atom-breadcrumb__link\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t\t\t<path d=\"M16 3A13 13 0 113 16 13 13 0 0116 3m0-1a14 14 0 1014 14A14 14 0 0016 2z\"></path>\n\t\t\t\t\t\t<path d=\"M13.3 20.6a.6.6 0 01-.3-1.2l6.4-3.4-6.4-3.4a.6.6 0 01.6-1.1l7.5 4a.6.6 0 010 1l-7.5 4a.6.6 0 01-.3.1z\"></path>\n\t\t\t\t\t</svg>\n\n\t\t\t\t\t<Link to={articleRoutes.articleOrMainCategory(mainCategory.slug)[language]}>\n\t\t\t\t\t\t{mainCategory.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</li>\n\t\t\t\t<li className=\"atom-breadcrumb__current\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\">\n\t\t\t\t\t\t<path d=\"M16 3A13 13 0 113 16 13 13 0 0116 3m0-1a14 14 0 1014 14A14 14 0 0016 2z\"></path>\n\t\t\t\t\t\t<path d=\"M13.3 20.6a.6.6 0 01-.3-1.2l6.4-3.4-6.4-3.4a.6.6 0 01.6-1.1l7.5 4a.6.6 0 010 1l-7.5 4a.6.6 0 01-.3.1z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<Link to={articleRoutes.articleListPage([subCategory.slug])[language]}>{subCategory.name}</Link>\n\t\t\t\t</li>\n\t\t\t</ol>\n\t\t</nav>\n\t);\n}\n\ninterface ArticleHeaderProps {\n\tarticle: IArticleCardAM;\n\tsubCategory: IArticleSubCategoryAM;\n\tlanguage: Language;\n}\n\nfunction ArticleHeader({ article, subCategory }: ArticleHeaderProps) {\n\treturn (\n\t\t<header className=\"view-singleArticle__header\">\n\t\t\t<div className=\"view-singleArticle__headerText\">\n\t\t\t\t<span className=\"view-singleArticle__category\">{subCategory.name}</span>\n\t\t\t\t<h1 className=\"view-singleArticle__title\">{article.title}</h1>\n\t\t\t\t<p className=\"view-singleArticle__ingress\" dangerouslySetInnerHTML={{ __html: article.ingress }} />\n\t\t\t\t<img className=\"illo\" src=\"/images/corner-illustration-right-alt-2.svg\" alt=\"235x174\" />\n\t\t\t</div>\n\n\t\t\t{article.mainVideoId ? (\n\t\t\t\t<div className=\"view-singleArticle__headerVideo\">\n\t\t\t\t\t<YoutubeEmbed videoId={article.mainVideoId} />\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<ArticleMainImage\n\t\t\t\t\tarticle={article}\n\t\t\t\t\tclassName=\"view-singleArticle__headerImage\"\n\t\t\t\t\tpreset=\"1400x750-article-mainimage\"\n\t\t\t\t\talternativePresets={[{ path: '700x375-article-mainimage', maxWidth: 640 }]}\n\t\t\t\t\tvideoThumbnailSize={VideoThumbnailSize.Medium}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</header>\n\t);\n}\n\nfunction ArticleSocialShare({ shareText }: { shareText: string }) {\n\treturn <SocialShareIcons shareText={shareText} context={SocialShareContext.ArticlePage} />;\n}\n\nfunction ArticleTags({ tags }: { tags: IArticleTagAM[] }) {\n\tconst language = useUiLanguage();\n\tif (tags.length === 0) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<ul className=\"atom-articleTags\">\n\t\t\t{tags.map((t, i) => (\n\t\t\t\t<li className=\"atom-articleTags__tag\" key={i}>\n\t\t\t\t\t<Link to={articleRoutes.articleListPage(undefined, [t.slug])[language]}>{t.name}</Link>\n\t\t\t\t</li>\n\t\t\t))}\n\t\t</ul>\n\t);\n}\n\ninterface ArticleDetailsProps {\n\tarticle: IArticleFullAM;\n}\nfunction ArticleDetails({ article }: ArticleDetailsProps) {\n\treturn (\n\t\t<div className=\"view-singleArticle__details\">\n\t\t\t<p className=\"time\">\n\t\t\t\t{formatBasicDateString(article.published)}\n\t\t\t\t{!isSameDay(article.published, article.lastModified) && (\n\t\t\t\t\t<span className=\"editTime\">\n\t\t\t\t\t\t<ResourceTextInline\n\t\t\t\t\t\t\tresourceKey=\"ArticlePage_LastModified\"\n\t\t\t\t\t\t\tparameters={[formatBasicDateString(article.lastModified)]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</p>\n\t\t\t<p className=\"author\">\n\t\t\t\t<ResourceTextInline resourceKey=\"ArticlePage_Writer\" defaultText=\"Teksti\" />{' '}\n\t\t\t\t<strong>{article.author}</strong>\n\t\t\t</p>\n\t\t\t{!!article.photographer && (\n\t\t\t\t<p className=\"photos\">\n\t\t\t\t\t<ResourceTextInline resourceKey=\"ArticlePage_ImagesBy\" defaultText=\"Kuvat\" />{' '}\n\t\t\t\t\t<strong>{article.photographer}</strong>\n\t\t\t\t</p>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\ninterface MightAlsoInterestProps {\n\tarticle: IArticleFullAM;\n\tlanguage: Language;\n}\nfunction MightAlsoInterest({ article, language }: MightAlsoInterestProps) {\n\tif (!article.suggestions || !article.suggestions.length) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"mod-articleListing\">\n\t\t\t<h2 className=\"mod-articleListing__heading\">\n\t\t\t\t<ResourceTextInline\n\t\t\t\t\tresourceKey=\"ArticlePage_MightAlsoInterest_Heading\"\n\t\t\t\t\tdefaultText=\"Myös nämä voisivat kiinnostaa sinua\"\n\t\t\t\t/>\n\t\t\t</h2>\n\n\t\t\t<div className=\"mod-articleListing__wrapper\">\n\t\t\t\t<ul className=\"mod-articleListing__articleList\">\n\t\t\t\t\t{article.suggestions.map((a, i) => (\n\t\t\t\t\t\t<ArticleCard key={i} article={a} language={language} showPublishDate={false} />\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t\t<div className=\"mod-articleListing__cta\">\n\t\t\t\t\t<Link to={routeFromRoot(routes.articlesRoot)[language]} className=\"button atom-button\">\n\t\t\t\t\t\t<ResourceTextInline\n\t\t\t\t\t\t\tresourceKey=\"ArticlePage_MightAlsoInterest_SeeAll\"\n\t\t\t\t\t\t\tdefaultText=\"Katso kaikki artikkelit\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Link>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default withResourceTextSupport(\n\t// eslint-disable-next-line @typescript-eslint/no-empty-object-type\n\tconnect<ReduxProps, DispatchProps, {}, ILumoOneAppState>(\n\t\t({ language, articles, settings }) => {\n\t\t\treturn {\n\t\t\t\tlanguage: language.currentLanguage,\n\t\t\t\tallCategories: isOperationSuccess(articles.categoriesRequest)\n\t\t\t\t\t? articles.categoriesRequest.result\n\t\t\t\t\t: undefined,\n\t\t\t\tcommonUiRoot: settings.settings!.commonUiRoot,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\tsetLayoutValues: layoutActions.setValues,\n\t\t\tpageComplete: pageViewTelemetryActions.pageComplete,\n\t\t},\n\t)(ArticlePage),\n);\n","import { IArticleCardAM, IArticleMainCategoryAM } from './ArticleAM';\nexport function getCategoriesForArticle(article: IArticleCardAM, allCategories: IArticleMainCategoryAM[]) {\n\tconst mainCategory = allCategories && allCategories.find((c) => c.id === article.mainCategoryId)!;\n\tconst subCategory = mainCategory.subCategories.find((c) => c.id === article.subCategoryId)!;\n\treturn { mainCategory, subCategory };\n}\n","import { IArticleFullAM } from './ArticleAM';\n\nexport interface IArticleTelemetry {\n\tarticleMainCategory: string;\n\tarticleSubCategory: string;\n\tarticleKeyword: string;\n\tarticleAuthor: string;\n\tarticlePhotographer: string | undefined;\n\tarticlePublished: Date;\n\tarticleEdited: Date;\n}\n\nexport function getArticleTelemetryData(article: IArticleFullAM, mainCategoryName: string): IArticleTelemetry {\n\treturn {\n\t\tarticleMainCategory: mainCategoryName,\n\t\tarticleSubCategory: article.subCategoryName,\n\t\tarticleKeyword: article.tags.map((t) => t.name).join(','),\n\t\tarticleAuthor: article.author,\n\t\tarticlePhotographer: article.photographer,\n\t\tarticlePublished: article.published,\n\t\tarticleEdited: article.lastModified,\n\t};\n}\n","import React, { useEffect } from 'react';\nimport { Helmet } from 'react-helmet-async';\n\nimport { Language } from '../Common/interfaces/language';\nimport { layoutActions, LayoutDispatchProps } from '../Common/Layout/layoutActions';\nimport { ILumoOneAppState } from '../boot/configureStore';\nimport { connect } from 'react-redux';\nimport { IUseResourceTexts, withResourceTextSupport } from '../Components/ResourceText';\nimport PageMeta, { PageMetaFields } from '../Common/Layout/PageMeta';\nimport { pageViewTelemetryActions } from '../Telemetry/pageViewTelemetryActions';\nimport { IArticleMainCategoryAM } from './ArticleAM';\nimport { ArticleNavigation } from './ArticleNavigation';\nimport CategoryHighlightsBlock from '../ContentPages/Blocks/CategoryHighlightsBlock';\nimport DynamicBanner from '../Components/DynamicBanners/DynamicBanner';\nimport { articleRoutes } from './articleRoutes';\nimport { GA4EventAction } from '../Telemetry/TelemetryGA4';\nimport { useCurrentUrl } from '../boot/LumoRouterContext';\nimport { routeFromRoot, routes } from '../Common/routes';\nimport { useRunOnce } from '../SSR/inlineRenderDispatchHelper';\n\ninterface Params {\n\tcategory: IArticleMainCategoryAM;\n\tallCategories: IArticleMainCategoryAM[];\n}\n\ninterface ReduxProps {\n\tlanguage: Language;\n\tcommonUiRoot: string;\n}\n\nexport type DispatchProps = LayoutDispatchProps & {\n\tsetLayoutValues: typeof layoutActions.setValues;\n\tpageComplete: typeof pageViewTelemetryActions.pageComplete;\n};\n\ntype Props = Params & ReduxProps & DispatchProps & IUseResourceTexts;\n\nfunction MainCategoryPage(props: Props) {\n\tconst { category, allCategories, language } = props;\n\tconst currentUrl = useCurrentUrl();\n\n\tuseRunOnce(() =>\n\t\tprops.setLayoutValues({\n\t\t\tbreadcrumbCurrentName: category.name,\n\t\t\tbreadcrumbParents: [\n\t\t\t\t{\n\t\t\t\t\tname: { key: 'BreadCrumb_Articles_Home', defaultValue: 'Lumo-elämää' },\n\t\t\t\t\tpath: routeFromRoot(routes.articlesRoot)[language],\n\t\t\t\t},\n\t\t\t],\n\t\t\ttranslateUrl: getTranslationsForCategory(currentUrl, language, category),\n\t\t}),\n\t);\n\n\tuseEffect(() => {\n\t\tprops.pageComplete({\n\t\t\tpageType: 'articleMainCategory',\n\t\t\tdata: { category: '' },\n\t\t});\n\t}, [category]);\n\n\tconst meta: PageMetaFields = {\n\t\tshareTitle: category.name,\n\t\tdescription: props.getResourceText('ArticleMainCategoryPage_MetaDescription', undefined, {\n\t\t\tparameters: [category.name],\n\t\t}),\n\t\tshareUrl: currentUrl,\n\t\tshareImageUrl: props.getResourceImageUrlByKey(props.commonUiRoot, 'ArticleSection_GenericShareImage'),\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Helmet>\n\t\t\t\t<body className=\"main-category-page\" />\n\t\t\t</Helmet>\n\t\t\t<PageMeta title={category.name} meta={meta} />\n\t\t\t<ArticleNavigation allCategories={allCategories} selectedCategory={category} />\n\t\t\t<CategoryHeader category={category} />\n\t\t\t{category.subCategories.map((sc, i) => (\n\t\t\t\t<CategoryHighlightsBlock\n\t\t\t\t\tkey={i}\n\t\t\t\t\tcategory={sc.id}\n\t\t\t\t\timagePosition={i % 2 ? 'Right' : 'Left'}\n\t\t\t\t\tuseWhiteBackground={i % 2 === 0}\n\t\t\t\t/>\n\t\t\t))}\n\t\t\t<DynamicBanner name=\"articleSection\" telemetryId={GA4EventAction.MainCategoryPage_DynamicBannerCTA} />;\n\t\t</>\n\t);\n}\n\nfunction getTranslationsForCategory(currentUrl: string, language: Language, category: IArticleMainCategoryAM) {\n\treturn language === 'en'\n\t\t? {\n\t\t\t\ten: currentUrl,\n\t\t\t\tfi: articleRoutes.articleOrMainCategory(category.translationSlugs['fi']).fi,\n\t\t\t}\n\t\t: {\n\t\t\t\ten: articleRoutes.articleOrMainCategory(category.translationSlugs['en']).en,\n\t\t\t\tfi: currentUrl,\n\t\t\t};\n}\n\ninterface CategoryHeaderProps {\n\tcategory: IArticleMainCategoryAM;\n}\n\nfunction CategoryHeader({ category }: CategoryHeaderProps) {\n\treturn (\n\t\t<div className=\"mod-articleHeading\">\n\t\t\t<h1 className=\"mod-articleHeading__heading\">{category.name}</h1>\n\t\t</div>\n\t);\n}\n\nexport default withResourceTextSupport(\n\tconnect<ReduxProps, DispatchProps, Params, ILumoOneAppState>(\n\t\t({ language, settings }) => {\n\t\t\treturn {\n\t\t\t\tlanguage: language.currentLanguage,\n\t\t\t\tcommonUiRoot: settings.settings!.commonUiRoot,\n\t\t\t};\n\t\t},\n\t\t{\n\t\t\tsetLayoutValues: layoutActions.setValues,\n\t\t\tpageComplete: pageViewTelemetryActions.pageComplete,\n\t\t},\n\t)(MainCategoryPage),\n);\n"],"names":["$ed3kz","parcelRequire","$a028e90571e6d7b7$export$2e2bcd8739ae039","lang","useUiLanguage","jsxs","$iffFd","Routes","jsx","Route","path","articleRoutes","articleFrontPage","element","$bfEEj","default","articleListPage","undefined","$fhnDS","articleOrMainCategory","$2OjxZ","$iK1dW","$aab6d281e673c32e$export$2e2bcd8739ae039","connect","mapStateToProps","language","articles","currentLanguage","categoriesRequest","frontPageRequest","getCategories","articleActions","request","getFrontPage","setLayoutValues","layoutActions","setValues","pageComplete","pageViewTelemetryActions","props","currentUrl","useCurrentUrl","getResourceImageUrlByKey","useResource","dispatch","useDispatch","match","useLocation","queryParams","QueryString","search","draftId","draft_id","parseInt","hash","buildApiRequest","categories","isOperationSuccess","result","useRunOnce","isAlreadyRequested","requireForSsr","areDeepEqual","lastRequested","addMinutes","Date","breadcrumbCurrentName","key","defaultValue","breadcrumbParents","translateUrl","routeFromRoot","routes","articlesRoot","useEffect","pageType","status","ApiOperationState","Requested","$fQt7u","LoadingSpinner","$h7wv6","ArticleNavigation","allCategories","frontPage","meta","shareTitle","metaTitle","title","description","metaDescription","shareUrl","shareImageUrl","Fragment","$2LBWb","$kGnYy","ArticleBlocks","content","withResourceTextSupport","selectedCategory","className","Link","to","xmlns","fill","viewBox","height","width","fillRule","d","clipRule","$jjuiK","ResourceText","resourceKey","defaultText","map","c","i","slug","id","name","dispatchProps","getArticleList","setShownArticleCount","setArticleListArticleCount","consecutivePageArticleCount","filtersEqual","a","b","filter","ArticleList","items","$cUKwN","ArticleCard","article","showPublishDate","hasMore","onClick","onLoadMore","length","ResourceTextInline","getTranslations","en","fi","mainCategories","push","subCategories","translationSlugs","tags","t","$d815d1294a8e33e4$export$2e2bcd8739ae039","withSsrSupport","articleData","articleListData","articleListOperations","shownArticleCount","articleListVisibleArticleCount","getResourceText","categoriesQuery","articleListPageCategoryParameter","tagsQuery","articleListPageTagParameter","categorySlugs","Array","isArray","category","tagSlugs","tag","requestStateKey","getArticleFilterString","articleFetchOp","take","React","loadedArticleCount","skip","getTerms","terms","join","data","keywordSlugs","termsString","$d815d1294a8e33e4$var$ArticleList","val","textType","$1vZTf","ArticleMainImage","preset","videoThumbnailSize","VideoThumbnailSize","Medium","formatBasicDateString","published","subCategoryName","$83712363d3b1de89$export$2e2bcd8739ae039","articleRequest","articleLastFetched","getArticleBySlug","getArticle","useLanguage","useMatch","params","mainCategory","find","isMainCategoryPage","isArticlePage","location","fetchArticleIfNeeded","getApiRequest","isArticleFetchedRecently","isRequested","Failed","$khJjL","$ezTX7","getTranslationsForArticle","articleCard","Object","keys","ArticleBreadcrumb","subCategory","ArticleHeader","dangerouslySetInnerHTML","__html","ingress","src","alt","mainVideoId","$etTbp","YoutubeEmbed","videoId","alternativePresets","maxWidth","ArticleSocialShare","shareText","$1l21R","context","SocialShareContext","ArticlePage","ArticleTags","ArticleDetails","isSameDay","lastModified","parameters","author","photographer","MightAlsoInterest","suggestions","$01fa90a4bf716172$export$2e2bcd8739ae039","settings","commonUiRoot","getCategoriesForArticle","telemetryData","setTelemetryData","useState","getBreadcrumbParents","breadcrumb","getArticleTelemetryData","mainImageUrl","getContentMediaUrl","shareVideoUrl","$eesM2","ScrollToHash","noIndex","hideFromSearchEngines","$01fa90a4bf716172$var$ArticleBreadcrumb","$01fa90a4bf716172$var$ArticleHeader","$01fa90a4bf716172$var$ArticleSocialShare","$01fa90a4bf716172$var$ArticleTags","$01fa90a4bf716172$var$ArticleDetails","$01fa90a4bf716172$var$MightAlsoInterest","$alhHG","telemetryId","GA4EventAction","ArticlePage_DynamicBannerCTA","$jM2Er","Helmet","type","toISOString","mainCategoryId","subCategoryId","mainCategoryName","articleMainCategory","articleSubCategory","articleKeyword","articleAuthor","articlePhotographer","articlePublished","articleEdited","getTranslationsForCategory","CategoryHeader","$765887195a9e492c$export$2e2bcd8739ae039","$765887195a9e492c$var$CategoryHeader","sc","$kGXZP","imagePosition","useWhiteBackground","MainCategoryPage_DynamicBannerCTA"],"version":3,"file":"ArticleSection.42ffd6d9.js.map"}