diff --git a/src/renderer/store/modules/utils.js b/src/renderer/store/modules/utils.js
index e62cbb5f..788c081d 100644
--- a/src/renderer/store/modules/utils.js
+++ b/src/renderer/store/modules/utils.js
@@ -3,6 +3,8 @@ import FtToastEvents from '../../components/ft-toast/ft-toast-events'
const state = {
isSideNavOpen: false,
sessionSearchHistory: [],
+ popularCache: null,
+ trendingCache: null,
searchSettings: {
sortBy: 'relevance',
time: '',
@@ -42,6 +44,14 @@ const getters = {
return state.sessionSearchHistory
},
+ getPopularCache () {
+ return state.popularCache
+ },
+
+ getTrendingCache () {
+ return state.trendingCache
+ },
+
getSearchSettings () {
return state.searchSettings
}
@@ -261,6 +271,14 @@ const mutations = {
}
},
+ setPopularCache (state, value) {
+ state.popularCache = value
+ },
+
+ setTrendingCache (state, value) {
+ state.trendingCache = value
+ },
+
setSearchSortBy (state, value) {
state.searchSettings.sortBy = value
},
diff --git a/src/renderer/views/Popular/Popular.css b/src/renderer/views/Popular/Popular.css
index c6ad6abd..4255d98b 100644
--- a/src/renderer/views/Popular/Popular.css
+++ b/src/renderer/views/Popular/Popular.css
@@ -4,6 +4,12 @@
margin-bottom: 60px;
}
+.floatingTopButton {
+ position: absolute;
+ top: 70px;
+ right: 10px;
+}
+
@media only screen and (max-width: 680px) {
.card {
width: 90%;
diff --git a/src/renderer/views/Popular/Popular.js b/src/renderer/views/Popular/Popular.js
index dc8979d4..e45b4a9c 100644
--- a/src/renderer/views/Popular/Popular.js
+++ b/src/renderer/views/Popular/Popular.js
@@ -2,13 +2,15 @@ import Vue from 'vue'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
import FtCard from '../../components/ft-card/ft-card.vue'
import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
+import FtIconButton from '../../components/ft-icon-button/ft-icon-button.vue'
export default Vue.extend({
name: 'Popular',
components: {
'ft-loader': FtLoader,
'ft-card': FtCard,
- 'ft-element-list': FtElementList
+ 'ft-element-list': FtElementList,
+ 'ft-icon-button': FtIconButton
},
data: function () {
return {
@@ -16,35 +18,42 @@ export default Vue.extend({
shownResults: []
}
},
+ computed: {
+ popularCache: function () {
+ return this.$store.getters.getPopularCache
+ }
+ },
mounted: function () {
- this.getTrendingInfo()
+ this.shownResults = this.popularCache
+ if (!this.shownResults || this.shownResults.length < 1) {
+ this.fetchPopularInfo()
+ }
},
methods: {
- getTrendingInfo: function () {
- this.isLoading = true
-
+ fetchPopularInfo: async function () {
const searchPayload = {
resource: 'popular',
id: '',
params: {}
}
- this.$store.dispatch('invidiousAPICall', searchPayload).then((result) => {
- if (!result) {
- return
- }
-
- console.log(result)
-
- const returnData = result.filter((item) => {
- return item.type === 'video' || item.type === 'shortVideo' || item.type === 'channel' || item.type === 'playlist'
- })
-
- this.shownResults = this.shownResults.concat(returnData)
- this.isLoading = false
- }).catch((err) => {
+ this.isLoading = true
+ const result = await this.$store.dispatch('invidiousAPICall', searchPayload).catch((err) => {
console.log(err)
})
+
+ if (!result) {
+ this.isLoading = false
+ return
+ }
+
+ console.log(result)
+
+ this.shownResults = result.filter((item) => {
+ return item.type === 'video' || item.type === 'shortVideo' || item.type === 'channel' || item.type === 'playlist'
+ })
+ this.isLoading = false
+ this.$store.commit('setPopularCache', this.shownResults)
}
}
})
diff --git a/src/renderer/views/Popular/Popular.vue b/src/renderer/views/Popular/Popular.vue
index c148cd79..b133588f 100644
--- a/src/renderer/views/Popular/Popular.vue
+++ b/src/renderer/views/Popular/Popular.vue
@@ -13,6 +13,13 @@
:data="shownResults"
/>
+
diff --git a/src/renderer/views/Trending/Trending.css b/src/renderer/views/Trending/Trending.css
index c6ad6abd..4255d98b 100644
--- a/src/renderer/views/Trending/Trending.css
+++ b/src/renderer/views/Trending/Trending.css
@@ -4,6 +4,12 @@
margin-bottom: 60px;
}
+.floatingTopButton {
+ position: absolute;
+ top: 70px;
+ right: 10px;
+}
+
@media only screen and (max-width: 680px) {
.card {
width: 90%;
diff --git a/src/renderer/views/Trending/Trending.js b/src/renderer/views/Trending/Trending.js
index e576ea8c..45023c12 100644
--- a/src/renderer/views/Trending/Trending.js
+++ b/src/renderer/views/Trending/Trending.js
@@ -2,6 +2,7 @@ import Vue from 'vue'
import FtCard from '../../components/ft-card/ft-card.vue'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
import FtElementList from '../../components/ft-element-list/ft-element-list.vue'
+import FtIconButton from '../../components/ft-icon-button/ft-icon-button.vue'
import ytrend from 'yt-trending-scraper'
@@ -10,7 +11,8 @@ export default Vue.extend({
components: {
'ft-card': FtCard,
'ft-loader': FtLoader,
- 'ft-element-list': FtElementList
+ 'ft-element-list': FtElementList,
+ 'ft-icon-button': FtIconButton
},
data: function () {
return {
@@ -30,23 +32,34 @@ export default Vue.extend({
},
invidiousInstance: function () {
return this.$store.getters.getInvidiousInstance
+ },
+ trendingCache () {
+ return this.$store.getters.getTrendingCache
}
},
mounted: function () {
- if (!this.usingElectron) {
- this.getVideoInformationInvidious()
+ if (this.trendingCache && this.trendingCache.length > 0) {
+ this.shownResults = this.trendingCache
} else {
- switch (this.backendPreference) {
- case 'local':
- this.getTrendingInfoLocal()
- break
- case 'invidious':
- this.getTrendingInfoInvidious()
- break
- }
+ this.getTrendingInfo()
}
},
methods: {
+ getTrendingInfo () {
+ if (!this.usingElectron) {
+ this.getVideoInformationInvidious()
+ } else {
+ switch (this.backendPreference) {
+ case 'local':
+ this.getTrendingInfoLocal()
+ break
+ case 'invidious':
+ this.getTrendingInfoInvidious()
+ break
+ }
+ }
+ },
+
getTrendingInfoLocal: function () {
this.isLoading = true
@@ -59,6 +72,7 @@ export default Vue.extend({
this.shownResults = this.shownResults.concat(returnData)
this.isLoading = false
+ this.$store.commit('setTrendingCache', this.shownResults)
}).catch((err) => {
console.log(err)
const errorMessage = this.$t('Local API Error (Click to copy)')
@@ -102,6 +116,7 @@ export default Vue.extend({
this.shownResults = this.shownResults.concat(returnData)
this.isLoading = false
+ this.$store.commit('setTrendingCache', this.shownResults)
}).catch((err) => {
console.log(err)
const errorMessage = this.$t('Invidious API Error (Click to copy)')
diff --git a/src/renderer/views/Trending/Trending.vue b/src/renderer/views/Trending/Trending.vue
index 54eef065..eed230d6 100644
--- a/src/renderer/views/Trending/Trending.vue
+++ b/src/renderer/views/Trending/Trending.vue
@@ -13,6 +13,13 @@
:data="shownResults"
/>
+