{"version":3,"sources":["webpack:///./src/components/AuthorsElement/AuthorsElement.tsx","webpack:///./src/components/Header/Header.tsx","webpack:///./src/components/GlobalNavigation/GlobalNavigation.tsx","webpack:///./src/components/EditionCover/EditionCover.tsx","webpack:///./src/components/Card/Card.tsx","webpack:///./src/components/DateElement/DateElement.tsx","webpack:///./src/components/ArticleContentBlock/ArticleContentBlock.tsx","webpack:///./src/components/Article/Article.tsx"],"names":["__webpack_require__","d","__webpack_exports__","AuthorsElement","react__WEBPACK_IMPORTED_MODULE_0__","react__WEBPACK_IMPORTED_MODULE_0___default","n","props","authors","validAuthors","filter","name","length","a","createElement","className","map","title","fullName","join","Header","antd_mobile__WEBPACK_IMPORTED_MODULE_1__","showButton","editionId","showEditionInfo","menuAction","mode","rightContent","onClick","GlobalNavigation","views_SettingsView_SettingsView__WEBPACK_IMPORTED_MODULE_1__","views_ActivityView_ActivityView__WEBPACK_IMPORTED_MODULE_2__","views_NewsStandView_NewsStandView__WEBPACK_IMPORTED_MODULE_3__","components_SectionList_SectionList__WEBPACK_IMPORTED_MODULE_4__","react_icons_fi__WEBPACK_IMPORTED_MODULE_5__","antd_mobile__WEBPACK_IMPORTED_MODULE_6__","reducers_configReducer__WEBPACK_IMPORTED_MODULE_7__","[object Object]","this","handleClick","area","history","pushState","_TINT_COLOUR","tabAreas","activeEdition","activeSection","ACTIVITY","SETTINGS","EDITION","icon","key","content","selected","hidden","tintColor","prerenderingSiblingsNumber","tabArea","Item","onPress","selectedIcon","EditionCover","libs_utils__WEBPACK_IMPORTED_MODULE_1__","date","handleSelect","dayDisplay","Date","toUTCString","onKeyDown","Object","dateTime","Card","locale_locale__WEBPACK_IMPORTED_MODULE_2__","components_ImageElement_ImageElement__WEBPACK_IMPORTED_MODULE_3__","components_AuthorsElement_AuthorsElement__WEBPACK_IMPORTED_MODULE_4__","id","premium","leadAsset","contentType","url","imageUrl","alt","size","role","PREMIUM","src","altText","isFullWidth","dateTemplate","tinytime_default","DateElement","dateText","render","react_default","ArticleContentBlock","contentBlock","type","ImageElement","caption","text","es","state","ownProps","isOffline","config","articleData","articles","fetchArticle","ArticleActions","react","preview","body","datePublished","cleanedHeadline","utils","bodyContent","Skeleton","count","isAnimated","i"],"mappings":"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","file":"main~e73b60ec.bundle.js","sourcesContent":["import React from \"react\";\nimport { ArticleType } from \"reducers/articleReducer\";\n\nexport function AuthorsElement(\n  props: Pick<ArticleType, \"authors\">\n): JSX.Element | null {\n  const { authors } = props;\n  const validAuthors = authors.filter(({ name }): boolean => name !== null);\n  if (validAuthors.length < 1) return null;\n\n  return (\n    <p className=\"card_authors\">\n      By{\" \"}\n      {validAuthors\n        .map(({ name, title }): string => {\n          let fullName = \"\";\n          if (name) fullName += name;\n          return title ? (fullName += `, ${title}`) : fullName;\n        })\n        .join(\" and \")}\n    </p>\n  );\n}\n","import React from \"react\";\nimport { NavBar } from \"antd-mobile\";\nimport \"./Header.css\";\n\ninterface Props {\n  showEditionInfo: boolean;\n  showButton?: boolean;\n  menuAction: () => void;\n  editionId: string | null;\n  title?: string;\n}\n\nexport function Header(props: Props): JSX.Element {\n  const {\n    title,\n    showButton = false,\n    editionId,\n    showEditionInfo,\n    menuAction\n  } = props;\n\n  return (\n    <NavBar\n      className=\"header\"\n      mode=\"dark\"\n      rightContent={showButton && <button onClick={menuAction}>Menu</button>}\n    >\n      <h1 className=\"header__title\">{title}</h1>\n      {showEditionInfo && <p className=\"header__edition\">{editionId}</p>}\n    </NavBar>\n  );\n}\n","import React, { PureComponent, ReactElement } from \"react\";\nimport { SettingsView } from \"views/SettingsView/SettingsView\";\nimport ActivityView from \"views/ActivityView/ActivityView\";\nimport NewsStandView from \"views/NewsStandView/NewsStandView\";\nimport SectionList from \"components/SectionList/SectionList\";\nimport { FiBook, FiRss, FiUser, FiSettings } from \"react-icons/fi\";\nimport { TabBar } from \"antd-mobile\";\nimport { Areas, AreasTypes } from \"reducers/configReducer\";\nimport { ArticleType } from \"reducers/articleReducer\";\n\ninterface PropsInterface {\n  area: AreasTypes;\n  activeEdition: null | string;\n  activeSection: null | string;\n}\n\ninterface TabAreaType {\n  icon: ReactElement;\n  key: AreasTypes | string;\n  title: string;\n  content: ReactElement;\n  selected: boolean;\n}\n\nexport class GlobalNavigation extends PureComponent<PropsInterface> {\n  private handleClick = (area: AreasTypes | string): void => {\n    history.pushState(null, \"\", `/${area}`);\n  };\n\n  private readonly _TINT_COLOUR = \"#f00\";\n\n  private readonly tabAreas = (): TabAreaType[] => {\n    const { area, activeEdition, activeSection } = this.props;\n    const { ACTIVITY, SETTINGS, EDITION } = Areas;\n\n    return [\n      {\n        icon: <FiBook />,\n        key: EDITION,\n        title: \"Edition\",\n        content: activeEdition ? (\n          <SectionList\n            activeSection={activeSection}\n            activeEdition={activeEdition}\n          />\n        ) : (\n          <NewsStandView />\n        ),\n        selected: area === EDITION && activeEdition !== \"LIVE_EDITION\"\n      },\n      {\n        icon: <FiRss />,\n        key: \"EDITION/LIVE_EDITION/news-lv0\",\n        title: \"Live\",\n        content: (\n          <SectionList\n            activeSection={activeSection}\n            activeEdition={activeEdition}\n          />\n        ),\n        selected: area === EDITION && activeEdition === \"LIVE_EDITION\"\n      },\n      {\n        icon: <FiUser />,\n        key: ACTIVITY,\n        title: \"Activity\",\n        content: <ActivityView />,\n        selected: area === ACTIVITY\n      },\n      {\n        icon: <FiSettings />,\n        key: SETTINGS,\n        title: \"Settings\",\n        content: <SettingsView />,\n        selected: area === SETTINGS\n      }\n    ];\n  };\n\n  public render(): JSX.Element {\n    return (\n      <TabBar\n        hidden={false}\n        tintColor={this._TINT_COLOUR}\n        prerenderingSiblingsNumber={0}\n      >\n        {this.tabAreas().map(\n          (tabArea): JSX.Element => (\n            <TabBar.Item\n              icon={tabArea.icon}\n              key={tabArea.key}\n              onPress={(): void => this.handleClick(tabArea.key)}\n              selected={tabArea.selected}\n              selectedIcon={tabArea.icon}\n              title={tabArea.title}\n            >\n              {tabArea.content}\n            </TabBar.Item>\n          )\n        )}\n      </TabBar>\n    );\n  }\n}\n","import React, { ReactEventHandler } from \"react\";\nimport { handleEnterKeyPress } from \"libs/utils\";\nimport \"./EditionCover.css\";\n\ninterface Props {\n  date: string;\n  handleSelect: ReactEventHandler;\n}\n\nexport function EditionCover(props: Props): JSX.Element {\n  const { date, handleSelect } = props;\n  const day = new Date(date);\n  const dayDisplay = day.toUTCString();\n  return (\n    <button\n      className=\"edition_cover\"\n      onClick={handleSelect}\n      onKeyDown={handleEnterKeyPress(handleSelect)}\n    >\n      {/* <h1 className=\"edition_cover__title\">Edition title</h1> */}\n      <figure className=\"edition_cover__thumb_wrapper\">\n        <span className=\"edition_cover__thumb\" />\n      </figure>\n      <time className=\"edition_cover__date\" dateTime={dayDisplay}>\n        {dayDisplay}\n      </time>\n    </button>\n  );\n}\n","import React, { MouseEventHandler } from \"react\";\nimport { WingBlank } from \"antd-mobile\";\nimport { locale } from \"locale/locale\";\nimport { ImageElement } from \"components/ImageElement/ImageElement\";\nimport { AuthorsElement } from \"components/AuthorsElement/AuthorsElement\";\nimport { ArticleType } from \"reducers/articleReducer\";\nimport \"./Card.css\";\n\ninterface CardInterface extends ArticleType {\n  handleClick: MouseEventHandler;\n}\n\nexport function Card(props: CardInterface): JSX.Element {\n  const {\n    authors,\n    title,\n    id,\n    premium,\n    leadAsset,\n    contentType,\n    handleClick\n  } = props;\n\n  const { url: imageUrl, alt } = leadAsset;\n\n  return (\n    <WingBlank key={id} size=\"md\">\n      <div\n        className={`card ${\n          premium ? \"card--premium\" : \"\"\n        } card--${contentType}`}\n        onClick={handleClick}\n        role=\"presentation\"\n      >\n        {premium && (\n          <div className=\"card_premium\">\n            <p className=\"card_premium_text\">{locale.PREMIUM}</p>\n          </div>\n        )}\n        <h2 className=\"card_headline\">{title}</h2>\n        {authors && <AuthorsElement authors={authors} />}\n        <div className=\"card_share\">\n          <button className=\"socialBtn socialBtn--small socialBtn_follow\">\n            Follow\n          </button>\n          <button className=\"socialBtn socialBtn--small socialBtn_save\">\n            Save\n          </button>\n        </div>\n        {imageUrl && (\n          <ImageElement src={imageUrl} altText={alt} isFullWidth={true} />\n        )}\n      </div>\n    </WingBlank>\n  );\n}\n","import React from \"react\";\n//@ts-ignore\nimport tinytime from \"tinytime\";\n\ninterface PropsInterface {\n  date: string;\n}\n\nconst dateTemplate = tinytime(`{Do} {MMMM} {YYYY}, {H}:{mm}`);\n\nexport function DateElement(props: PropsInterface): JSX.Element {\n  const { date } = props;\n  const dateText: string = dateTemplate.render(new Date(date));\n\n  return (\n    <time className=\"article__date\" dateTime={date}>\n      {dateText}\n    </time>\n  );\n}\n","import React from \"react\";\nimport { ImageElement } from \"components/ImageElement/ImageElement\";\nimport { VideoElement } from \"components/VideoElement/VideoElement\";\nimport { EmbedElement } from \"components/EmbedElement/EmbedElement\";\nimport { BodyItem } from \"services/content/contentProxy\";\n\ninterface PropsInterface {\n  content: BodyItem;\n}\n\nexport function ArticleContentBlock(props: PropsInterface): JSX.Element | null {\n  const { content: contentBlock } = props;\n\n  switch (contentBlock.type) {\n    case \"image\":\n      return (\n        <ImageElement\n          altText={contentBlock.alt}\n          caption={contentBlock.alt}\n          src={contentBlock.src || \"\"}\n          isFullWidth={true}\n        />\n      );\n\n    case \"text\":\n      return <p> {contentBlock.text}</p>;\n\n    // case \"video\":\n    //   const rendition = contentBlock.renditions.find((rendition): boolean => {\n    //     return rendition.url !== undefined;\n    //   });\n\n    //   return (\n    //     <VideoElement\n    //       isFullWidth={true}\n    //       poster={rendition ? rendition.url : \"\"}\n    //       videoId={contentBlock.videoEmbedId}\n    //     />\n    //   );\n\n    // case \"tweet\":\n    //   return (\n    //     <EmbedElement\n    //       url={`https://twitter.com/x/status/${contentBlock.tweetId}`}\n    //     />\n    //   );\n  }\n\n  return null;\n}\n","import React, { PureComponent } from \"react\";\nimport { connect } from \"react-redux\";\nimport { ImageElement } from \"components/ImageElement/ImageElement\";\nimport { DateElement } from \"components/DateElement/DateElement\";\nimport { AuthorsElement } from \"components/AuthorsElement/AuthorsElement\";\nimport { ArticleContentBlock } from \"components/ArticleContentBlock/ArticleContentBlock\";\nimport { cleanPunctuation } from \"libs/utils\";\nimport { fetchArticle } from \"actions/ArticleActions\";\nimport { ArticleType } from \"reducers/articleReducer\";\nimport { StateInterface } from \"reducers/rootReducer\";\nimport { Skeleton } from \"components/Skeleton/Skeleton\";\nimport \"./Article.css\";\n\ninterface PropsInterface {\n  id: string;\n}\n\ninterface DispatchProps {\n  fetchArticle: typeof fetchArticle;\n}\n\nclass ArticleView extends PureComponent<\n  PropsInterface & MapStatePropsInterface & DispatchProps\n> {\n  public componentDidMount(): void {\n    const {\n      articleData: { url, preview },\n      id,\n      fetchArticle,\n      isOffline\n    } = this.props;\n\n    if (preview) {\n      fetchArticle(id, url, isOffline);\n    }\n  }\n\n  public render(): JSX.Element {\n    const {\n      title,\n      authors,\n      body = [],\n      leadAsset,\n      datePublished\n    } = this.props.articleData;\n    const { url: imageUrl, alt } = leadAsset;\n\n    const cleanedHeadline = cleanPunctuation(title);\n\n    const bodyContent =\n      body.length === 0 ? (\n        <Skeleton count={5} isAnimated />\n      ) : (\n        body.map(\n          (content, i: number): JSX.Element => (\n            <ArticleContentBlock content={content} key={`el-${i}`} />\n          )\n        )\n      );\n\n    return (\n      <article className=\"article__wrapper\">\n        <h1 className=\"article__headline\">{cleanedHeadline}</h1>\n        {imageUrl && (\n          <ImageElement isFullWidth={true} src={imageUrl} altText={alt} />\n        )}\n        {authors && <AuthorsElement authors={authors} />}\n        {datePublished && <DateElement date={datePublished} />}\n        {bodyContent}\n      </article>\n    );\n  }\n}\n\ninterface MapStatePropsInterface {\n  isOffline: boolean;\n  articleData: ArticleType;\n}\n\nfunction mapStateToProps(\n  state: StateInterface,\n  ownProps: PropsInterface\n): MapStatePropsInterface {\n  const { isOffline } = state.config;\n  const { id } = ownProps;\n  const articleData = state.articles[id];\n\n  return {\n    articleData,\n    isOffline\n  };\n}\n\nexport default connect(\n  mapStateToProps,\n  { fetchArticle }\n)(ArticleView);\n"],"sourceRoot":""}