{"version":3,"sources":["webpack:///./src/libs/utils.ts","webpack:///./src/reducers/configReducer.ts","webpack:///./src/locale/locale.ts","webpack:///./src/selectors/articleSelectors.ts","webpack:///./src/variants/drawerPosition.ts","webpack:///./src/variants/premiumLabel.ts","webpack:///./src/variants/menuTypes.ts","webpack:///./src/reducers/variantReducer.ts","webpack:///./src/reducers/rootReducer.ts","webpack:///./src/reducers/articleReducer.ts","webpack:///./src/reducers/editionReducer.ts","webpack:///./src/store/storeConfig.ts","webpack:///./src/services/storeState.ts","webpack:///./src/index.tsx","webpack:///./src/libs/ErrorBoundary.tsx","webpack:///./src/services/content/contentProxy.ts"],"names":["getQueryParams","setQueryParams","params","replace","paramString","Object","entries","map","k","v","JSON","stringify","join","newUrl","length","window","history","replaceState","pushState","cleanPunctuation","text","handleEnterKeyPress","fn","event","key","__webpack_require__","d","__webpack_exports__","Areas","ViewModes","Themes","configReducer","actions_ConfigActions__WEBPACK_IMPORTED_MODULE_0__","configInitialState","activeArticle","undefined","activeSection","activeEdition","area","EDITION","checkingOfflineStatus","isDrawerOpen","isOffline","theme","viewMode","INDEX","state","action","type","IS_OFFLINE","assign","payload","VIEW_MODE","SET_AREA","SET_ACTIVE_ARTICLE","SET_ACTIVE_SECTION","SET_ACTIVE_EDITION","TOGGLE_SIDE_DRAWER","SET_THEME","locale","store_storeConfig__WEBPACK_IMPORTED_MODULE_0__","localeEn","DRAWER_EDIT","DRAWER_MENU","DRAWER_SETTINGS","PREMIUM","COMMON_SUBSCRIBE","previousLocale","subscribe","getState","selected","variants","localeVariant","data","selectArticles","memoize_one__WEBPACK_IMPORTED_MODULE_0__","articleIds","articles","reduce","acc","id","push","ids","oldIds","oldArticles","keys","queryParams","utils","drawerPosition","options","defaultSelected","title","PremiumOptions","premiumLabel_queryParams","premiumCopyVariant","[object Object]","MENU_CHOICES","menuTypes_queryParams","menuTypes","GRID","CAROUSEL","COMPRESSED_CAROUSEL","ONE_COL","THREE_COL","SINGLE_TOUCH","initialState","premiumLabel","rootReducer","redux","ArticleActions","ADD_STORY","IMPORT_SECTION_ARTICLES","stateClone","forEach","article","FETCH_ARTICLE","articleId","isPartial","isFetching","config","variantActions","UPDATE_VARIANT","RESET_VARIANTS","editions","edition_state","EditionActions","FETCHING_SECTION_CONTENT","editionId","sections","sectionId","fetching","RECEIVED_SECTION_CONTENT","loaded","ADD_PACKAGES","packages","pack","pak","store","logger","redux_logger","collapsed","diff","es","this","subId","variantValues","getVariantValues","values","updateLocationOnVariantChange","storeConfig","fastclick_default","a","attach","document","body","react_dom","react_default","createElement","Component","props","super","hasError","error","info","setState","console","log","children","setLocation","wouter","route","areaParam","dlv_umd_default","urlState","settingId","activityId","searchQuery","isSearchOpen","isSingleArticle","invalidLocation","includes","warn","SETTINGS","ACTIVITY","react","App","querySelector","CONTENT_TYPES","PROXY_KEY","PROXY_BASE_URL","fetchProxyContent","query","url","URL","searchParams","append","res","fetch","href","method","mode","status","Error","json","getArticle","isSpoofed","getSection","getSearchResults","resultJSON","err","message"],"mappings":"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","file":"main~970f9218.bundle.js","sourcesContent":["import { KeyboardEventHandler } from \"react\";\n\n/** Hash a string into 32bit number  */\nexport function hashCode(str: string): number {\n  let hash = 0;\n  if (str.length == 0) {\n    return hash;\n  }\n  for (let i = 0; i < str.length; i++) {\n    let char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash = hash & hash;\n  }\n  return hash;\n}\n\n/** Generate simple hash ID from string */\nexport function hashId(str: string, prefix: string = \"id_\"): string {\n  const hash = Math.abs(hashCode(str)).toString();\n  return `${prefix}${hash}`;\n}\n\nexport function checkIfOnline(targetUrl?: string): Promise<boolean> {\n  const TIMEOUT = 2000;\n  const url =\n    targetUrl ||\n    \"https://lab-api-preprod.api-platforms-preprod.telegraph.co.uk/top-stories\";\n  const abortController = new AbortController();\n  const signal = abortController.signal;\n  let timeoutId: undefined | number = undefined;\n\n  return new Promise((resolve): void => {\n    fetch(url, { signal })\n      .then((response): void => {\n        clearTimeout(timeoutId);\n        if (response.ok) {\n          return resolve(false);\n        } else {\n          resolve(true);\n        }\n      })\n      .catch((): void => {\n        clearTimeout(timeoutId);\n        resolve(true);\n      });\n\n    timeoutId = window.setTimeout((): void => {\n      abortController.abort();\n    }, TIMEOUT);\n  });\n}\n\nexport function getQueryParams(): { [k: string]: string } {\n  // return window.location.search\n  //   .replace(/^\\?/, \"\")\n  //   .split(\"&\")\n  //   .reduce((acc: { [k: string]: string }, param: string): {\n  //     [k: string]: string;\n  //   } => {\n  //     const [key, val] = param.split(\"=\");\n  //     if (key.length > 0) {\n  //       acc[key] = JSON.parse(decodeURIComponent(val));\n  //     }\n  //     return acc;\n  //   }, {});\n  return {};\n}\n\n// Update query param in URL\nexport function setQueryParams(params: {}, replace: boolean = true): void {\n  const paramString = Object.entries(params)\n    .map(([k, v]): string => `${k}=${JSON.stringify(v)}`)\n    .join(\"&\");\n  const newUrl = paramString.length > 0 ? \"?\" + paramString : \"/\";\n\n  replace\n    ? window.history.replaceState({}, \"\", newUrl)\n    : window.history.pushState({}, \"\", newUrl);\n}\n\n/**\n *  Clean text by using correct punctuation\n *\n * Additional rules taken from https://github.com/bevacqua/beautify-text\n */\nexport function cleanPunctuation(text: string): string {\n  return text\n    .replace(/&nbsp;/g, \" \")\n    .replace(/>\"/g, \">“\")\n    .replace(': \"', \": “\")\n    .replace('.\"', \".”\")\n    .replace(/\\+-/gm, \"±\")\n    .replace(/\\.{2,}/gm, \"…\") // .., ..., ....... -> …\n    .replace(/([?!])…/gm, \"$1..\") // ?..... & !..... -> ?.. & !..\n    .replace(/([?!]){4,}/gm, \"$1$1$1\")\n    .replace(/,{2,}/gm, \",\")\n    .replace(/(^|[^-])---([^-]|$)/gm, \"$1\\u2014$2\") // em-dash\n    .replace(/(^|\\s)--(\\s|$)/gm, \"$1\\u2013$2\") // en-dash\n    .replace(/(^|[^-\\s])--([^-\\s]|$)/gm, \"$1\\u2013$2\"); // en-dash\n}\n\nexport function handleEnterKeyPress(fn: Function): KeyboardEventHandler {\n  return function(event): void {\n    const { key } = event;\n    if (key === \"Enter\") {\n      fn();\n    }\n  };\n}\n","import {\n  ConfigActionInterfaces,\n  CONFIG_ACTION_TYPES\n} from \"actions/ConfigActions\";\n\nexport enum Areas {\n  EDITION = \"EDITION\",\n  LIVE = \"EDITION/LIVE_EDITION\",\n  SEARCH = \"SEARCH\",\n  ACTIVITY = \"ACTIVITY\",\n  DEBUG = \"DEBUG\",\n  LOADING = \"LOADING\",\n  SETTINGS = \"SETTINGS\"\n}\n\nexport type AreasTypes = keyof typeof Areas;\n\nexport enum ViewModes {\n  INDEX = \"INDEX\",\n  ARTICLE = \"ARTICLE\",\n  ARTICLE_SINGLE = \"ARTICLE_SINGLE\",\n  NEWS_STAND = \"NEWS_STAND\",\n  NAVIGATION = \"NAVIGATION\",\n  BLANK = \"BLANK\"\n}\nexport type ViewModesType = keyof typeof ViewModes;\n\nexport enum Themes {\n  TELEGRAPH = \"TELEGRAPH\",\n  GREY = \"GREY\"\n}\nexport type ThemeTypes = keyof typeof Themes;\n\nexport interface ConfigInterface {\n  activeArticle: string | undefined;\n  activeSection: string | undefined;\n  activeEdition: string;\n  area: AreasTypes;\n  isDrawerOpen: boolean;\n  isOffline: boolean;\n  checkingOfflineStatus: boolean;\n  theme: ThemeTypes;\n  viewMode: ViewModesType;\n}\n\nexport const configInitialState: ConfigInterface = {\n  activeArticle: undefined,\n  activeSection: \"news-lv0\",\n  activeEdition: \"LIVE_EDITION\",\n  area: Areas.EDITION,\n  checkingOfflineStatus: true,\n  isDrawerOpen: false,\n  isOffline: false,\n  theme: \"GREY\",\n  viewMode: ViewModes.INDEX\n};\n\nexport function configReducer(\n  state = configInitialState,\n  action: ConfigActionInterfaces\n): ConfigInterface {\n  switch (action.type) {\n    case CONFIG_ACTION_TYPES.IS_OFFLINE:\n      return {\n        ...state,\n        isOffline: action.payload,\n        checkingOfflineStatus: false\n      };\n\n    case CONFIG_ACTION_TYPES.VIEW_MODE:\n      return {\n        ...state,\n        viewMode: action.payload\n      };\n\n    case CONFIG_ACTION_TYPES.SET_AREA:\n      return {\n        ...state,\n        area: action.payload\n      };\n\n    case CONFIG_ACTION_TYPES.SET_ACTIVE_ARTICLE:\n      return {\n        ...state,\n        activeArticle: action.payload\n      };\n\n    case CONFIG_ACTION_TYPES.SET_ACTIVE_SECTION:\n      return {\n        ...state,\n        activeSection: action.payload\n      };\n\n    case CONFIG_ACTION_TYPES.SET_ACTIVE_EDITION:\n      return {\n        ...state,\n        activeEdition: action.payload,\n        activeSection: undefined\n      };\n\n    case CONFIG_ACTION_TYPES.TOGGLE_SIDE_DRAWER:\n      return { ...state, isDrawerOpen: !state.isDrawerOpen };\n\n    case CONFIG_ACTION_TYPES.SET_THEME:\n      return {\n        ...state,\n        theme: action.payload\n      };\n\n    default:\n      return state;\n  }\n}\n","import { store } from \"store/storeConfig\";\n\nconst localeEn = {\n  DRAWER_EDIT: \"Edit\",\n  DRAWER_MENU: \"Menu\",\n  DRAWER_SETTINGS: \"Settings\",\n  PREMIUM: \"Premium\",\n  COMMON_SUBSCRIBE: \"Subscribe\"\n};\n\nexport let locale = { ...localeEn };\n\n// VARIANT: Listen for changes to locale and update copy\nlet previousLocale = \"\";\n\nfunction handleVariantStateChange(): void {\n  const state = store.getState();\n  const { selected } = state.variants[\"premiumLabel\"];\n  if (previousLocale === selected) {\n    return;\n  }\n\n  previousLocale = selected;\n  const localeVariant = state.variants[\"premiumLabel\"].data[selected];\n  locale = {\n    ...localeEn,\n    ...localeVariant\n  };\n}\n\nstore.subscribe(handleVariantStateChange);\n\nexport default locale;\n","import memoizeOne from \"memoize-one\";\nimport { ArticleType } from \"reducers/articleReducer\";\n\nfunction getArticles(\n  articleIds: string[],\n  articles: { [id: string]: ArticleType }\n): ArticleType[] {\n  return articleIds.reduce((acc: ArticleType[], id): ArticleType[] => {\n    if (articles[id]) {\n      acc.push(articles[id]);\n    }\n    return acc;\n  }, []);\n}\n\n/**\n * Cache section article selection\n */\nexport const selectArticles = memoizeOne(\n  getArticles,\n  ([ids, articles], [oldIds, oldArticles]): boolean => {\n    if (ids.join() !== oldIds.join()) {\n      return false;\n    }\n    if (Object.keys(articles).join() !== Object.keys(oldArticles).join()) {\n      return false;\n    }\n\n    return true;\n  }\n);\n","import { DrawerProps } from \"antd-mobile/lib/drawer/PropsType\";\nimport { getQueryParams } from \"libs/utils\";\n\nexport interface DrawerPositionVariant {\n  id: \"drawerPosition\";\n  options: DrawerProps[\"position\"][];\n  selected: DrawerProps[\"position\"];\n  defaultSelected: DrawerProps[\"position\"];\n  title: string;\n}\n\nconst queryParams = getQueryParams();\n\nexport const drawerPosition: DrawerPositionVariant = {\n  id: \"drawerPosition\",\n  options: [\"left\", \"right\"],\n  selected: queryParams[\"drawerPosition\"]\n    ? (queryParams[\"drawerPosition\"] as DrawerProps[\"position\"])\n    : \"right\",\n  defaultSelected: \"right\",\n  title: \"Drawer position\"\n};\n","import { getQueryParams } from \"libs/utils\";\n\nexport interface PremiumCopyVariantInterface {\n  id: \"premiumLabel\";\n  title: string;\n  defaultSelected: string;\n  selected: string;\n  options: string[];\n  data?: {\n    [id: string]: string | number | {};\n  };\n}\n\nexport enum PremiumOptions {\n  PREMIUM = \"Premium\",\n  AWESOME = \"Awesome\",\n  EXCLUSIVE = \"Exclusive\",\n  SUBSCRIBER = \"Subscriber\"\n}\n\nexport const DEFAULT_SELECTED = \"PREMIUM\";\n\ntype PremiumOptionsType = keyof typeof PremiumOptions;\n\nconst queryParams = getQueryParams();\n\nexport const premiumCopyVariant: PremiumCopyVariantInterface = {\n  id: \"premiumLabel\",\n  title: \"Alternative premium copy\",\n  options: Object.keys(PremiumOptions),\n  defaultSelected: DEFAULT_SELECTED,\n  selected: queryParams[\"premiumLabel\"]\n    ? queryParams[\"premiumLabel\"]\n    : DEFAULT_SELECTED,\n  data: Object.keys(PremiumOptions).reduce((acc: {}, k): {} => {\n    return {\n      ...acc,\n      [k]: { PREMIUM: PremiumOptions[k as PremiumOptionsType] }\n    };\n  }, {})\n};\n","import { getQueryParams } from \"libs/utils\";\n\nexport enum MENU_CHOICES {\n  GRID = \"GRID\",\n  CAROUSEL = \"CAROUSEL\",\n  COMPRESSED_CAROUSEL = \"COMPRESSED_CAROUSEL\",\n  ONE_COL = \"ONE_COL\",\n  THREE_COL = \"THREE_COL\",\n  SINGLE_TOUCH = \"SINGLE_TOUCH\"\n}\n\nexport type MenuChoicesTypes = keyof typeof MENU_CHOICES;\n\nexport interface MenuTypesInterface {\n  id: \"menuTypes\";\n  options: MenuChoicesTypes[];\n  selected: MenuChoicesTypes;\n  defaultSelected: MenuChoicesTypes;\n  title: string;\n}\n\nconst queryParams = getQueryParams();\n\nexport const menuTypes: MenuTypesInterface = {\n  id: \"menuTypes\",\n  options: [\n    MENU_CHOICES.GRID,\n    MENU_CHOICES.CAROUSEL,\n    MENU_CHOICES.COMPRESSED_CAROUSEL,\n    MENU_CHOICES.ONE_COL,\n    MENU_CHOICES.THREE_COL,\n    MENU_CHOICES.SINGLE_TOUCH\n  ],\n  selected: queryParams[\"menuType\"]\n    ? (queryParams[\"menuType\"] as MenuChoicesTypes)\n    : MENU_CHOICES.GRID,\n  defaultSelected: MENU_CHOICES.GRID,\n  title: \"Menu type\"\n};\n","import { DrawerPositionVariant, drawerPosition } from \"variants/drawerPosition\";\nimport { premiumCopyVariant } from \"variants/premiumLabel\";\nimport { menuTypes, MenuTypesInterface } from \"variants/menuTypes\";\nimport {\n  UpdateVariantActionType,\n  VariantActions\n} from \"actions/variantActions\";\n\nexport interface VariantInterface {\n  id: string;\n  title: string;\n  selected: string | number | DrawerPositionVariant[\"selected\"];\n  defaultSelected: string | number | DrawerPositionVariant[\"selected\"];\n  options: (DrawerPositionVariant[\"selected\"] | number | string)[];\n}\n\nexport interface VariantState {\n  [id: string]: VariantInterface;\n  [drawerPosition.id]: DrawerPositionVariant;\n  [premiumCopyVariant.id]: VariantInterface;\n  [menuTypes.id]: MenuTypesInterface;\n}\n\nconst initialState: VariantState = {\n  drawerPosition: drawerPosition,\n  premiumLabel: premiumCopyVariant,\n  menuTypes: menuTypes\n};\n\nexport function variantReducer(\n  state: VariantState = initialState,\n  action: UpdateVariantActionType\n): VariantState {\n  switch (action.type) {\n    case VariantActions.UPDATE_VARIANT:\n      return {\n        ...state,\n        [action.payload.id]: {\n          ...state[action.payload.id],\n          ...action.payload\n        }\n      };\n    case VariantActions.RESET_VARIANTS:\n      return Object.keys(state).reduce(\n        (acc, key): VariantState => ({\n          ...acc,\n          [key]: {\n            ...acc[key],\n            selected: acc[key].defaultSelected\n          }\n        }),\n        { ...state }\n      );\n    default:\n      return state;\n  }\n}\n","import { combineReducers } from \"redux\";\nimport {\n  articleReducer,\n  ArticleCollectionInterface\n} from \"reducers/articleReducer\";\nimport { configReducer, ConfigInterface } from \"reducers/configReducer\";\nimport { variantReducer, VariantState } from \"reducers/variantReducer\";\nimport { editionReducer, EditionStateInterface } from \"reducers/editionReducer\";\n\nexport interface StateInterface {\n  config: ConfigInterface;\n  articles: ArticleCollectionInterface;\n  variants: VariantState;\n  editions: EditionStateInterface;\n}\n\nexport const rootReducer = combineReducers({\n  articles: articleReducer,\n  config: configReducer,\n  variants: variantReducer,\n  editions: editionReducer\n});\n","import { ArticleActionsInterface, ActionTypeKey } from \"actions/ArticleActions\";\nimport { ArticleResponseInterface } from \"services/content/contentProxy\";\n\nexport interface ArticleType extends ArticleResponseInterface {\n  isFetching: boolean;\n  hasRead: boolean;\n}\n\nexport interface ArticleCollectionInterface {\n  [id: string]: ArticleType;\n}\n\nexport function articleReducer(\n  state: ArticleCollectionInterface = {},\n  action: ArticleActionsInterface\n): ArticleCollectionInterface {\n  switch (action.type) {\n    case ActionTypeKey.ADD_STORY: {\n      const { id } = action.payload;\n      return {\n        ...state,\n        [id]: {\n          ...state[id],\n          ...action.payload\n        }\n      };\n    }\n\n    case ActionTypeKey.IMPORT_SECTION_ARTICLES: {\n      const stateClone = { ...state };\n      // Merge articles into state\n      Object.entries(action.payload).forEach(([id, article]): void => {\n        let currentArticle = stateClone[id];\n        if (!currentArticle) {\n          stateClone[id] = { ...article };\n        }\n      });\n      return stateClone;\n    }\n\n    case ActionTypeKey.FETCH_ARTICLE: {\n      const { articleId: id, data } = action.payload;\n      const article = {\n        ...state[id],\n        ...data,\n        isPartial: false,\n        isFetching: false\n      };\n\n      return {\n        ...state,\n        [id]: article\n      };\n    }\n\n    default:\n      return state;\n  }\n}\n","import {\n  EditionActionsInterfaces,\n  EditionActionsTypes,\n  EditionInterface,\n  PackageInterface\n} from \"actions/EditionActions\";\nimport { editionState } from \"data/edition_state\";\n\nexport interface EditionStateInterface {\n  readonly [id: string]: EditionInterface;\n}\n\nexport function editionReducer(\n  state = editionState as EditionStateInterface,\n  action: EditionActionsInterfaces\n): EditionStateInterface {\n  switch (action.type) {\n    case EditionActionsTypes.FETCHING_SECTION_CONTENT: {\n      const { payload } = action;\n      return {\n        ...state,\n        [payload.editionId]: {\n          ...state[payload.editionId],\n          sections: {\n            ...state[payload.editionId].sections,\n            [payload.sectionId]: {\n              ...state[payload.editionId].sections[payload.sectionId],\n              fetching: true\n            }\n          }\n        }\n      };\n    }\n\n    case EditionActionsTypes.RECEIVED_SECTION_CONTENT: {\n      const { payload } = action;\n      return {\n        ...state,\n        [payload.editionId]: {\n          ...state[payload.editionId],\n          sections: {\n            ...state[payload.editionId].sections,\n            [payload.sectionId]: {\n              ...state[payload.editionId].sections[payload.sectionId],\n              fetching: false,\n              loaded: true,\n              articles: payload.articleIds || []\n            }\n          }\n        }\n      };\n    }\n\n    case EditionActionsTypes.ADD_PACKAGES: {\n      const {\n        payload: { editionId, sectionId, packages }\n      } = action;\n\n      return {\n        ...state,\n        [editionId]: {\n          ...state[editionId],\n          packages: {\n            ...state[editionId].packages,\n            ...packages.reduce(\n              (acc, pack): { [id: string]: PackageInterface } => ({\n                ...acc,\n                [pack.id]: pack\n              }),\n              {}\n            )\n          },\n          sections: {\n            ...state[editionId].sections,\n            [sectionId]: {\n              ...state[editionId].sections[sectionId],\n              packages: packages.map((pak): string => pak.id)\n            }\n          }\n        }\n      };\n    }\n\n    default:\n      return state;\n  }\n}\n","import { createStore, Store, applyMiddleware } from \"redux\";\nimport thunkMiddleware from \"redux-thunk\";\n//@ts-ignore\nimport { createLogger } from \"redux-logger\";\nimport { rootReducer } from \"reducers/rootReducer\";\n\nconst logger = createLogger({\n  collapsed: true,\n  diff: true\n});\n\nfunction configureStore(): Store {\n  return createStore(rootReducer, applyMiddleware(thunkMiddleware, logger));\n}\n\nexport const store = configureStore();\n","import { store } from \"store/storeConfig\";\nimport { StateInterface } from \"reducers/rootReducer\";\nimport { setQueryParams } from \"libs/utils\";\nimport { Unsubscribe } from \"redux\";\n\nclass StoreState {\n  public constructor() {\n    const initialState: StateInterface = store.getState();\n    if (\"variants\" in initialState === false) {\n      return;\n    }\n\n    this.variantValues = this.getVariantValues(initialState.variants);\n    this.subId = store.subscribe(this.updateLocationOnVariantChange);\n  }\n\n  private subId: undefined | Unsubscribe = undefined;\n  private variantValues: undefined | string = undefined;\n\n  private getVariantValues = (variants: StateInterface[\"variants\"]): string =>\n    Object.values(variants).reduce(\n      (acc: string, v): string => acc + v.selected,\n      \"\"\n    );\n\n  private updateLocationOnVariantChange = (): void => {\n    const { variants }: StateInterface = store.getState();\n    const variantValues = this.getVariantValues(variants);\n\n    if (variantValues === this.variantValues) {\n      return;\n    }\n\n    this.variantValues = variantValues;\n\n    let params: { [id: string]: string | number | undefined } = {};\n    for (const k in variants) {\n      params[k] = variants[k].selected;\n    }\n\n    setQueryParams(params);\n  };\n}\n\nconst storeState = new StoreState();\n\nexport default storeState;\n","import React, { useEffect } from \"react\";\nimport FastClick from \"fastclick\";\nimport dlv from \"dlv\";\nimport App from \"./App\";\nimport { render } from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { useRoute, useLocation } from \"wouter\";\nimport { ErrorBoundary } from \"libs/ErrorBoundary\";\nimport { store } from \"store/storeConfig\";\nimport { Areas, AreasTypes } from \"reducers/configReducer\";\nimport \"services/storeState\";\nimport \"antd-mobile/dist/antd-mobile.css\";\n\n// @ts-ignore\nFastClick.attach(document.body);\n\ninterface UrlStateInt {\n  area: null | AreasTypes;\n  searchQuery: null | string;\n  activeArticle: null | string;\n  activeSection: null | string;\n  activeEdition: null | string;\n  settingId: null | string;\n  activityId: null | string;\n  isSearchOpen: boolean;\n  isSingleArticle: boolean;\n  viewMode: null | string;\n}\n\nfunction Router(): JSX.Element | null {\n  const [, setLocation] = useLocation();\n  const route = useRoute(\"/:area?/:param1?/:param2?/:param3?\");\n  const areaParam = dlv(route, \"1.area\");\n\n  let urlState: UrlStateInt = {\n    area: areaParam,\n    activeArticle: null,\n    activeSection: null,\n    activeEdition: null,\n    settingId: null,\n    activityId: null,\n    searchQuery: null,\n    isSearchOpen: false,\n    isSingleArticle: false,\n    viewMode: null\n  };\n\n  let invalidLocation = false;\n\n  // Main routing switcher\n  switch (areaParam) {\n    case Areas.EDITION:\n      const activeEdition = dlv(route, \"1.param1\");\n      const state = store.getState();\n\n      // Ensdure valid edition ID\n      if (\n        activeEdition &&\n        !Object.keys(state.editions).includes(activeEdition)\n      ) {\n        console.warn(\"Invaid Edition ID\");\n        invalidLocation = true;\n        break;\n      }\n\n      const isSearchOpen = dlv(route, \"1.param2\") === \"search\";\n      const isSingleArticle = dlv(route, \"1.param2\") === \"article\";\n      const activeSection = !isSearchOpen && dlv(route, \"1.param2\");\n      const sections = dlv(state.editions, `${activeEdition}.sections`, []);\n\n      console.log(Object.keys(sections).includes(activeSection), activeSection);\n\n      // Ensdure valid section ID\n      if (\n        activeEdition &&\n        !isSearchOpen &&\n        !isSingleArticle &&\n        !Object.keys(sections).includes(activeSection)\n      ) {\n        console.warn(\"Invaid Section ID\");\n        invalidLocation = true;\n        break;\n      }\n\n      urlState = {\n        ...urlState,\n        activeEdition,\n        activeSection,\n        activeArticle: !isSearchOpen && dlv(route, \"1.param3\"),\n        isSearchOpen,\n        isSingleArticle,\n        searchQuery: isSearchOpen && dlv(route, \"1.param2\")\n      };\n      break;\n\n    case Areas.SETTINGS:\n      urlState = {\n        ...urlState,\n        settingId: dlv(route, \"1.param1\")\n      };\n      break;\n\n    case Areas.ACTIVITY:\n      urlState = {\n        ...urlState,\n        activityId: dlv(route, \"1.param1\")\n      };\n      break;\n\n    default:\n      invalidLocation = true;\n  }\n\n  useEffect((): void => {\n    if (invalidLocation) {\n      console.warn(\"Re-routing\");\n      setLocation(\"/EDITION/LIVE_EDITION/news-lv0/\");\n    }\n  });\n\n  // @ts-ignore - React-redux connect wrapper issue\n  // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/16990#issue-233875315\n  return <App {...urlState} />;\n}\n\nrender(\n  <Provider store={store}>\n    <ErrorBoundary>\n      <Router />\n    </ErrorBoundary>\n  </Provider>,\n  document.querySelector(\"#app\")\n);\n","import React, { ErrorInfo } from \"react\";\n\nexport class ErrorBoundary extends React.Component<\n  { children: JSX.Element },\n  { hasError: boolean }\n> {\n  public constructor(props: { children: JSX.Element }) {\n    super(props);\n    this.state = { hasError: false };\n  }\n\n  public componentDidCatch(error: Error, info: ErrorInfo): void {\n    // Display fallback UI\n    this.setState({ hasError: true });\n    // You can also log the error to an error reporting service\n    console.log(error, info);\n  }\n\n  public render(): JSX.Element {\n    if (this.state.hasError) {\n      // You can render any custom fallback UI\n      return <h1>Something went wrong.</h1>;\n    }\n    return this.props.children;\n  }\n}\n","export interface SectionResponseInterface {\n  url: string;\n  id: string;\n  title: string;\n  packages: PackagesItemInterface[];\n  articles: KeyedArticleResponseInterface;\n}\n\nexport interface PackagesItemInterface {\n  id: string;\n  title: null | string;\n  url: null | string;\n  articles: string[];\n}\n\nexport interface KeyedArticleResponseInterface {\n  [id: string]: ArticleResponseInterface;\n}\n\nexport interface ArticleResponseInterface {\n  id: string;\n  title: string;\n  url: string;\n  ampUrl: string;\n  premium: boolean;\n  preview: boolean;\n  snippet: string | null;\n  datePublished: string;\n  contentType: \"story\" | \"video\" | \"live\" | null;\n  leadAsset: LeadAsset;\n  authors: AuthorsItem[];\n  body: BodyItem[];\n}\ninterface LeadAsset {\n  type: string;\n  url: string;\n  alt: string;\n}\ninterface AuthorsItem {\n  image: null;\n  name: string | null;\n  title: null;\n}\nexport interface BodyItem {\n  type: BodyTypes;\n  text?: string;\n  src?: string;\n  alt?: string;\n}\n\nexport type BodyTypes = \"text\" | \"image\" | \"tweet\" | \"video\";\n\nenum CONTENT_TYPES {\n  article = \"article\",\n  section = \"section\",\n  search = \"search\"\n}\n\ntype ContentTypes = keyof typeof CONTENT_TYPES;\n\nconst PROXY_KEY = \"PROTO_DEV\";\nconst PROXY_BASE_URL = `https://tmg-proxy.am-telegraph.now.sh/`;\n\nasync function fetchProxyContent(\n  type: ContentTypes,\n  query: string\n): Promise<{} | []> {\n  const url = new URL(PROXY_BASE_URL);\n  url.searchParams.append(\"api\", \"1\");\n  url.searchParams.append(\"route\", type);\n  url.searchParams.append(\"key\", PROXY_KEY);\n  url.searchParams.append(\"id\", query);\n\n  const res = await fetch(url.href, {\n    method: \"GET\",\n    mode: \"cors\"\n  });\n\n  if (res.status !== 200) {\n    throw new Error(`Error from search API. ${res.status}`);\n  }\n\n  return res.json();\n}\n\nexport async function getArticle(\n  query: string,\n  isSpoofed?: boolean\n): Promise<ArticleResponseInterface> {\n  return (await fetchProxyContent(\n    \"article\",\n    query\n  )) as ArticleResponseInterface;\n}\n\nexport async function getSection(\n  query: string,\n  isSpoofed?: boolean\n): Promise<SectionResponseInterface> {\n  return (await fetchProxyContent(\n    \"section\",\n    query\n  )) as SectionResponseInterface;\n}\n\nexport interface SearchResultsInterface {\n  suggestedSections: string[];\n  results: KeyedArticleResponseInterface;\n}\n\nexport async function getSearchResults(\n  query: string\n): Promise<SearchResultsInterface> {\n  const resultJSON = await fetchProxyContent(\"search\", query);\n  try {\n    return resultJSON as SearchResultsInterface;\n  } catch (err) {\n    throw new Error(`Problem parsing search results. ${err && err.message}`);\n  }\n}\n"],"sourceRoot":""}