typescript #149 #152
@ -6,7 +6,7 @@
|
|||||||
:size="256"
|
:size="256"
|
||||||
:url="episode.image" />
|
:url="episode.image" />
|
||||||
<h2>{{ episode.name }}</h2>
|
<h2>{{ episode.name }}</h2>
|
||||||
<SafeHtml :source="episode.description" />
|
<SafeHtml :source="episode.description || ''" />
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<NcButton v-if="episode.link" :href="episode.link" target="_blank">
|
<NcButton v-if="episode.link" :href="episode.link" target="_blank">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
@ -32,6 +32,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { NcAvatar, NcButton } from '@nextcloud/vue'
|
import { NcAvatar, NcButton } from '@nextcloud/vue'
|
||||||
import DownloadIcon from 'vue-material-design-icons/Download.vue'
|
import DownloadIcon from 'vue-material-design-icons/Download.vue'
|
||||||
|
import type { EpisodeInterface } from '../../utils/types.ts'
|
||||||
import OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'
|
import OpenInNewIcon from 'vue-material-design-icons/OpenInNew.vue'
|
||||||
import SafeHtml from './SafeHtml.vue'
|
import SafeHtml from './SafeHtml.vue'
|
||||||
import { filenameFromUrl } from '../../utils/url.ts'
|
import { filenameFromUrl } from '../../utils/url.ts'
|
||||||
@ -49,7 +50,7 @@ export default {
|
|||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
episode: {
|
episode: {
|
||||||
type: Object,
|
type: Object as () => EpisodeInterface,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -72,6 +72,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(useSubscriptions, ['fetch']),
|
...mapActions(useSubscriptions, ['fetch']),
|
||||||
|
t,
|
||||||
async addSubscription() {
|
async addSubscription() {
|
||||||
try {
|
try {
|
||||||
await axios.post(
|
await axios.post(
|
||||||
@ -85,14 +86,12 @@ export default {
|
|||||||
console.error(e)
|
console.error(e)
|
||||||
showError(t('repod', 'Error while adding the feed'))
|
showError(t('repod', 'Error while adding the feed'))
|
||||||
}
|
}
|
||||||
|
|
||||||
this.fetch()
|
this.fetch()
|
||||||
},
|
},
|
||||||
copyFeed() {
|
copyFeed() {
|
||||||
window.navigator.clipboard.writeText(this.url)
|
window.navigator.clipboard.writeText(this.url)
|
||||||
showSuccess(t('repod', 'Link copied to the clipboard'))
|
showSuccess(t('repod', 'Link copied to the clipboard'))
|
||||||
},
|
},
|
||||||
t,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -165,10 +165,10 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapActions(usePlayer, ['load']),
|
...mapActions(usePlayer, ['load']),
|
||||||
|
filenameFromUrl,
|
||||||
formatLocaleDate,
|
formatLocaleDate,
|
||||||
hasEnded,
|
hasEnded,
|
||||||
isListening,
|
isListening,
|
||||||
filenameFromUrl,
|
|
||||||
t,
|
t,
|
||||||
isCurrentEpisode(episode: EpisodeInterface) {
|
isCurrentEpisode(episode: EpisodeInterface) {
|
||||||
return this.playerEpisode?.url === episode.url
|
return this.playerEpisode?.url === episode.url
|
||||||
|
@ -43,15 +43,12 @@ export default {
|
|||||||
if (!this.filters.listened && this.hasEnded(episode)) {
|
if (!this.filters.listened && this.hasEnded(episode)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.filters.listening && this.isListening(episode)) {
|
if (!this.filters.listening && this.isListening(episode)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.filters.unlistened && !this.isListening(episode)) {
|
if (!this.filters.unlistened && !this.isListening(episode)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import App from './App.vue'
|
import App from './App.vue'
|
||||||
import { createApp } from 'vue'
|
import { createApp } from 'vue'
|
||||||
import { createPinia } from 'pinia'
|
import { createPinia } from 'pinia'
|
||||||
import router from './router'
|
import router from './router.ts'
|
||||||
|
|
||||||
const Vue = createApp(App)
|
const Vue = createApp(App)
|
||||||
const pinia = createPinia()
|
const pinia = createPinia()
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { EpisodeActionInterface, EpisodeInterface } from '../utils/types'
|
import type { EpisodeActionInterface, EpisodeInterface } from '../utils/types.ts'
|
||||||
import axios from '@nextcloud/axios'
|
import axios from '@nextcloud/axios'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { formatEpisodeTimestamp } from '../utils/time'
|
import { formatEpisodeTimestamp } from '../utils/time.ts'
|
||||||
import { generateUrl } from '@nextcloud/router'
|
import { generateUrl } from '@nextcloud/router'
|
||||||
|
|
||||||
const audio = new Audio()
|
const audio = new Audio()
|
||||||
@ -86,18 +86,15 @@ export const usePlayer = defineStore('player', {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.episode = {
|
this.episode.action = {
|
||||||
...this.episode,
|
podcast: this.podcastUrl,
|
||||||
action: {
|
episode: this.episode.url,
|
||||||
podcast: this.podcastUrl,
|
guid: this.episode.guid,
|
||||||
episode: this.episode.url,
|
action: 'play',
|
||||||
guid: this.episode.guid,
|
timestamp: formatEpisodeTimestamp(new Date()),
|
||||||
action: 'play',
|
started: Math.round(this.started),
|
||||||
timestamp: formatEpisodeTimestamp(new Date()),
|
position: Math.round(audio.currentTime),
|
||||||
started: Math.round(this.started),
|
total: Math.round(audio.duration),
|
||||||
position: Math.round(audio.currentTime),
|
|
||||||
total: Math.round(audio.duration),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
axios.post(generateUrl('/apps/gpoddersync/episode_action/create'), [
|
axios.post(generateUrl('/apps/gpoddersync/episode_action/create'), [
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { getCookie, setCookie } from '../utils/cookies'
|
import { getCookie, setCookie } from '../utils/cookies.ts'
|
||||||
import type { FiltersInterface } from '../utils/types'
|
import type { FiltersInterface } from '../utils/types.ts'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
|
|
||||||
export const useSettings = defineStore('settings', {
|
export const useSettings = defineStore('settings', {
|
||||||
|
@ -2,8 +2,8 @@ import type {
|
|||||||
PersonalSettingsMetricsInterface,
|
PersonalSettingsMetricsInterface,
|
||||||
PodcastDataInterface,
|
PodcastDataInterface,
|
||||||
SubscriptionInterface,
|
SubscriptionInterface,
|
||||||
} from '../utils/types'
|
} from '../utils/types.ts'
|
||||||
import { getCookie, setCookie } from '../utils/cookies'
|
import { getCookie, setCookie } from '../utils/cookies.ts'
|
||||||
import axios from '@nextcloud/axios'
|
import axios from '@nextcloud/axios'
|
||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { generateUrl } from '@nextcloud/router'
|
import { generateUrl } from '@nextcloud/router'
|
||||||
@ -26,6 +26,7 @@ export const useSubscriptions = defineStore('subscriptions', {
|
|||||||
const metrics = await axios.get<PersonalSettingsMetricsInterface>(
|
const metrics = await axios.get<PersonalSettingsMetricsInterface>(
|
||||||
generateUrl('/apps/gpoddersync/personal_settings/metrics'),
|
generateUrl('/apps/gpoddersync/personal_settings/metrics'),
|
||||||
)
|
)
|
||||||
|
|
||||||
this.subs = [...metrics.data.subscriptions]
|
this.subs = [...metrics.data.subscriptions]
|
||||||
.sort((a, b) => b.listenedSeconds - a.listenedSeconds)
|
.sort((a, b) => b.listenedSeconds - a.listenedSeconds)
|
||||||
.map((sub) => ({
|
.map((sub) => ({
|
||||||
|
Loading…
Reference in New Issue
Block a user