From ba47943934dd3797d64b1a2b72c9c7095287fd98 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 22 Jun 2019 17:43:40 +0200 Subject: [PATCH] Rename resources module => data, add look up tag, add polyfill for flat() --- components/Sidebar.vue | 2 +- pages/_category.vue | 2 +- store/data.js | 46 ++++++++++++++++++++++++++++++++++++++++++ store/resources.js | 21 ------------------- 4 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 store/data.js delete mode 100644 store/resources.js diff --git a/components/Sidebar.vue b/components/Sidebar.vue index 3aa6d40..7050961 100644 --- a/components/Sidebar.vue +++ b/components/Sidebar.vue @@ -14,7 +14,7 @@ export default { } }, created() { - this.categories = this.$store.state.resources.map(({ title, slug }) => ({ title, slug })) + this.categories = this.$store.state.data.resources.map(({ title, slug }) => ({ title, slug })) } } diff --git a/pages/_category.vue b/pages/_category.vue index 2a1526e..b280e0a 100644 --- a/pages/_category.vue +++ b/pages/_category.vue @@ -12,7 +12,7 @@ import Card from '../components/Card' export default { data () { return { - category: this.$store.getters['resources/findResources'](this.$route.params.category), + category: this.$store.getters['data/findResources'](this.$route.params.category), } }, components: { Card }, diff --git a/store/data.js b/store/data.js new file mode 100644 index 0000000..669d938 --- /dev/null +++ b/store/data.js @@ -0,0 +1,46 @@ +import resources from '../resources' + +// Polyfill for flat +if (!Array.prototype.flat) { + Object.defineProperty(Array.prototype, 'flat', { + configurable: true, + value: function flat () { + var depth = isNaN(arguments[0]) ? 1 : Number(arguments[0]); + + return depth ? Array.prototype.reduce.call(this, function (acc, cur) { + if (Array.isArray(cur)) { + acc.push.apply(acc, flat.call(cur, depth - 1)); + } else { + acc.push(cur); + } + + return acc; + }, []) : Array.prototype.slice.call(this); + }, + writable: true + }); +} + +/** + * Check if list 2 has an element of list 1. + * includesElOf(list1, list2) -> read as list1 includesElOf list2. + * @param {any[]} list1 + * @param {any[]} list2 + */ +const includesElOf = (list1, list2) => list1.some(element => list2.includes(element)) + +export const state = () => ({ + resources, + // List of all tags, duplicates removed + tags: [...new Set(resources.map(resource => resource.resources).flat().map(resource => resource.tags).flat())] +}) + +export const getters = { + findResources: state => title => { + return state.resources.find(resource => resource.title.toLowerCase() === title.toLowerCase()) + }, + findByTags: state => tags => { + const flat = state.resources.map(category => category.resources).flat() + return flat.filter(resource => resource.tags && includesElOf(resource.tags, tags)) + } +} \ No newline at end of file diff --git a/store/resources.js b/store/resources.js deleted file mode 100644 index b4a3c12..0000000 --- a/store/resources.js +++ /dev/null @@ -1,21 +0,0 @@ -import resources from '../resources/' - -/** - * Check if list 2 has an element of list 1. - * includesElOf(list1, list2) -> read as list1 includesElOf list2. - * @param {any[]} list1 - * @param {any[]} list2 - */ -const includesElOf = (list1, list2) => list1.some(element => list2.includes(element)) - -export const state = () => resources - -export const getters = { - findResources: state => title => { - return state.find(resource => resource.title.toLowerCase() === title.toLowerCase()) - }, - findByTags: state => tags => { - const flat = state.map(category => category.resources).flat() - return flat.filter(resource => resource.tags && includesElOf(resource.tags, tags)) - } -} \ No newline at end of file