{"version":3,"file":"javascripts/chunks/08e29ab3680aa84fae94.860.js","mappings":"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","sources":["webpack:///./javascripts/dom/select.js","webpack:///./javascripts/helpers/baseModule.js","webpack:///./store/watchlist.js"],"sourcesContent":["/**\n * This methods selects Elements from a specific context by a selector\n * @param {string} selector Selector of the element to find\n * @param {Element|HTMLDocument} [element] Context of the selectable\n * @returns {Array} Am array with selected Elements\n */\nexport default (selector, element = window.document) =>\n [].slice.call(element.querySelectorAll(selector));\n","import select from '../dom/select';\n\nclass BaseModule {\n constructor(element, id) {\n this.id = id;\n this.elements = {\n self: element\n };\n\n this.setInitialized();\n }\n\n setInitialized() {\n if (this.elements.self) {\n this.elements.self.setAttribute('data-js-module-initialized', true);\n }\n }\n\n setUnInitialized() {\n if (this.elements.self) {\n this.elements.self.removeAttribute('data-js-module-initialized');\n }\n }\n\n /**\n * Selects DOMElements of a module with a specific data attribute (`data-js-element=\"${module}__${selector}\"`)\n * Receives an object where the id param is the key in the elements cache\n * The selector param of the config is the selector part in the query-selector described above\n * @param {Object} config Configuration object in a key value format\n * @returns {void}\n */\n getElements(config) {\n const elementsConfig = config.map((elementConfig) => ({\n ...elementConfig,\n selector: `${this.id}__${elementConfig.selector}`\n }));\n\n const domElements = select('[data-js-element]', this.elements.self);\n\n for (let i = 0; i < domElements.length; i += 1) {\n const domElement = domElements[i];\n const elementConfigCandidates = elementsConfig.filter(\n (singleConfig) =>\n domElement.getAttribute('data-js-element') === singleConfig.selector\n );\n\n const [elementConfig] = elementConfigCandidates;\n\n if (elementConfig) {\n if (typeof this.elements[elementConfig.id] === 'undefined') {\n this.elements[elementConfig.id] = domElement;\n } else {\n if (typeof this.elements[elementConfig.id].push === 'undefined') {\n this.elements[elementConfig.id] = [this.elements[elementConfig.id]];\n }\n this.elements[elementConfig.id].push(domElement);\n }\n }\n }\n\n /*\n * Append a attribute \"asList\" to each element/s in this.elements\n * which is always an array no matter if element/s is an array\n * or a single HTMLElement\n */\n\n const asList = (obj) => (typeof obj.push === 'undefined' ? [obj] : obj);\n Object.values(this.elements).forEach((obj) => {\n obj.asList = asList(obj); // eslint-disable-line no-param-reassign\n });\n }\n}\n\nexport default BaseModule;\n","import create from 'zustand/vanilla';\n\nconst watchlist = create(() => ({\n /**\n * API Url to use for watchlist requests\n */\n apiUrl: '',\n\n /**\n * Loading state for watchlist requests\n */\n loading: true,\n\n /**\n * Watchlist items notification count for navigation\n */\n notificationCount: window.sessionStorage.getItem('watchlist-notifications')\n ? window.sessionStorage.getItem('watchlist-notifications')\n : 0,\n\n /**\n * Raw storage of the watchlist items.\n */\n storage: window.localStorage.getItem('watchlist')\n ? JSON.parse(window.localStorage.getItem('watchlist'))\n : [],\n\n /**\n * Items to be displayed in the watchlist\n */\n items: window.localStorage.getItem('watchlist')\n ? JSON.parse(window.localStorage.getItem('watchlist'))\n : [],\n\n /**\n * Update api url\n * @param {string} url url to use for watchlist requests\n * @return {void}\n */\n updateApiUrl: (url) => {\n const { setState } = watchlist;\n setState({ apiUrl: url });\n },\n\n /**\n * Update notification count\n * @param {number} count new count\n * @return {void}\n */\n updateNotificationCount: (count) => {\n const { setState } = watchlist;\n window.sessionStorage.setItem('watchlist-notifications', count);\n setState({ notificationCount: count });\n },\n\n /**\n * Reset notification count\n * @return {void}\n */\n resetNotificationCount: () => {\n const { setState } = watchlist;\n window.sessionStorage.removeItem('watchlist-notifications');\n setState({ notificationCount: 0 });\n },\n\n updateStorage: () => {\n const { setState } = watchlist;\n\n setState({\n storage: window.localStorage.getItem('watchlist')\n ? JSON.parse(window.localStorage.getItem('watchlist'))\n : []\n });\n },\n /**\n * Update localStorage based on the current state\n * @returns {void}\n */\n updateLocalStorage: () => {\n const { items } = watchlist.getState();\n\n /**\n * Filter out unnecessary keys from the items array\n */\n const storage = items.map((i) => ({\n dateAdded: i.dateAdded,\n id: i.id,\n type: i.type\n }));\n\n window.localStorage.setItem('watchlist', JSON.stringify(storage));\n watchlist.setState({ storage });\n },\n\n /**\n * Fetch all items based on localstorage\n * @returns {void}\n */\n getItems: async () => {\n const { getState, setState } = watchlist;\n const { updateLocalStorage, storage, filter, updateFilter, apiUrl } =\n getState();\n\n if (!apiUrl) return;\n\n try {\n setState({ loading: true });\n\n const response = await fetch(apiUrl, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n watchlist: storage\n })\n });\n\n const data = await response.json();\n\n if (data.items) {\n const mergedItems = data.items.map((i) => {\n const storageItem = storage.find((s) => s.id === i.id);\n\n return {\n ...i,\n dateAdded: storageItem ? storageItem.dateAdded : null\n };\n });\n\n setState({\n items: mergedItems,\n loading: false\n });\n }\n\n updateFilter(filter);\n } catch (error) {\n setState({ loading: false });\n console.error(error);\n }\n\n updateLocalStorage();\n },\n\n /**\n * Add item to watchlist\n * @param {{type: string, id: number}} item Pass item type and id\n * @returns {void}\n */\n addItem: async (item) => {\n const { getState, setState } = watchlist;\n const {\n items,\n updateLocalStorage,\n notificationCount,\n updateNotificationCount,\n updateFilter,\n filter,\n apiUrl\n } = getState();\n\n if (!apiUrl) return;\n\n try {\n setState({ loading: true });\n\n const response = await fetch(\n `${apiUrl}?type=${item.type}&id=${item.id}`,\n {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n }\n );\n\n const data = await response.json();\n\n if (data.item) {\n const addedItem = {\n type: item.type,\n id: item.id,\n dateAdded: new Date().toISOString(),\n ...data.item\n };\n\n setState({\n loading: false,\n items: [...items, addedItem]\n });\n }\n\n updateNotificationCount(notificationCount + 1);\n updateFilter(filter);\n updateLocalStorage();\n } catch (error) {\n setState({ loading: false });\n console.error(error);\n }\n },\n\n /**\n * Remove item from watchlist\n * @param {number} id Id of item to remove\n * @returns {void}\n */\n removeItem: async (id) => {\n const { getState, setState } = watchlist;\n const { apiUrl, items, updateLocalStorage, filter, updateFilter } =\n getState();\n\n if (!apiUrl) return;\n\n try {\n const newItems = items.filter((i) => i.id !== id);\n setState({ items: newItems });\n\n updateFilter(filter);\n updateLocalStorage();\n\n await fetch(`${apiUrl}?id=${id}`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json'\n }\n });\n } catch (error) {\n setState({ loading: false });\n console.error(error);\n }\n },\n\n /**\n * Current filter type, defaults to 'all'\n * Possible values: 'all', 'articles', 'events', 'contacts'\n * @type {string}\n */\n filter: 'all',\n\n /**\n * Filtered Items to be displayed in the watchlist\n */\n filteredItems: [],\n\n /**\n * Update filter type\n * @param {string} filter Filter type\n * @return {void}\n */\n updateFilter: (filter) => {\n const { getState, setState } = watchlist;\n const { items } = getState();\n\n if (filter === 'all') {\n return setState({\n filter,\n filteredItems: items.sort(\n (a, b) => new Date(b.dateAdded) - new Date(a.dateAdded)\n )\n });\n }\n\n if (['contacts', 'members'].includes(filter)) {\n return setState({\n filter,\n filteredItems: items\n .filter((i) => i.type === 'contacts' || i.type === 'members')\n .sort((a, b) => new Date(a.dateAdded) - new Date(b.dateAdded))\n });\n }\n\n return setState({\n filter,\n filteredItems: items\n .filter((i) => i.type === filter)\n .sort((a, b) => new Date(a.dateAdded) - new Date(b.dateAdded))\n });\n }\n}));\n\nexport default watchlist;\n"],"names":["selector","element","window","document","slice","call","querySelectorAll","BaseModule","id","this","elements","self","setInitialized","setAttribute","removeAttribute","config","elementsConfig","map","elementConfig","domElements","select","i","domElement","filter","singleConfig","getAttribute","push","length","Object","values","forEach","obj","asList","watchlist","create","apiUrl","loading","notificationCount","sessionStorage","getItem","storage","localStorage","JSON","parse","items","updateApiUrl","url","setState","updateNotificationCount","count","setItem","resetNotificationCount","removeItem","updateStorage","updateLocalStorage","getState","dateAdded","type","stringify","getItems","updateFilter","fetch","method","headers","Accept","body","response","json","data","mergedItems","storageItem","find","s","console","error","addItem","item","addedItem","Date","toISOString","newItems","filteredItems","sort","a","b","includes"],"sourceRoot":""}