feat(front): add podcast channel button to podcasts header
This commit is contained in:
parent
7592cc739f
commit
81cf009f96
|
@ -15,7 +15,7 @@ import { useModal } from '~/ui/composables/useModal.ts'
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import RemoteSearchForm from '~/components/RemoteSearchForm.vue'
|
import RemoteSearchForm from '~/components/RemoteSearchForm.vue'
|
||||||
import Card from '~/components/ui/Card.vue'
|
import ChannelForm from '~/components/audio/ChannelForm.vue'
|
||||||
import ArtistCard from '~/components/artist/Card.vue'
|
import ArtistCard from '~/components/artist/Card.vue'
|
||||||
|
|
||||||
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
import useSharedLabels from '~/composables/locale/useSharedLabels'
|
||||||
|
@ -23,17 +23,20 @@ import useOrdering from '~/composables/navigation/useOrdering'
|
||||||
import useErrorHandler from '~/composables/useErrorHandler'
|
import useErrorHandler from '~/composables/useErrorHandler'
|
||||||
import usePage from '~/composables/navigation/usePage'
|
import usePage from '~/composables/navigation/usePage'
|
||||||
import useLogger from '~/composables/useLogger'
|
import useLogger from '~/composables/useLogger'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
import { useTags } from '~/ui/composables/useTags.ts'
|
import { useTags } from '~/ui/composables/useTags.ts'
|
||||||
|
|
||||||
import Pagination from '~/components/ui/Pagination.vue'
|
|
||||||
import Layout from '~/components/ui/Layout.vue'
|
import Layout from '~/components/ui/Layout.vue'
|
||||||
|
import Spacer from '~/components/ui/Spacer.vue'
|
||||||
|
import Loader from '~/components/ui/Loader.vue'
|
||||||
import Header from '~/components/ui/Header.vue'
|
import Header from '~/components/ui/Header.vue'
|
||||||
|
import Card from '~/components/ui/Card.vue'
|
||||||
import Button from '~/components/ui/Button.vue'
|
import Button from '~/components/ui/Button.vue'
|
||||||
import Input from '~/components/ui/Input.vue'
|
import Input from '~/components/ui/Input.vue'
|
||||||
import Alert from '~/components/ui/Alert.vue'
|
import Alert from '~/components/ui/Alert.vue'
|
||||||
import Spacer from '~/components/ui/Spacer.vue'
|
|
||||||
import Pills from '~/components/ui/Pills.vue'
|
import Pills from '~/components/ui/Pills.vue'
|
||||||
import Loader from '~/components/ui/Loader.vue'
|
import Pagination from '~/components/ui/Pagination.vue'
|
||||||
import Modal from '~/components/ui/Modal.vue'
|
import Modal from '~/components/ui/Modal.vue'
|
||||||
|
|
||||||
interface Props extends OrderingProps {
|
interface Props extends OrderingProps {
|
||||||
|
@ -50,6 +53,12 @@ const props = withDefaults(defineProps<Props>(), {
|
||||||
|
|
||||||
const page = usePage()
|
const page = usePage()
|
||||||
|
|
||||||
|
const createForm = ref()
|
||||||
|
const step = ref(1)
|
||||||
|
const category = ref('podcast')
|
||||||
|
const modalContent = ref()
|
||||||
|
const submittable = ref(false)
|
||||||
|
|
||||||
const tags = useRouteQuery<string[]>('tag', [])
|
const tags = useRouteQuery<string[]>('tag', [])
|
||||||
|
|
||||||
const tagList = useTags(tags)
|
const tagList = useTags(tags)
|
||||||
|
@ -70,6 +79,7 @@ const orderingOptions: [OrderingField, keyof typeof sharedLabels.filters][] = [
|
||||||
['name', 'name']
|
['name', 'name']
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
const logger = useLogger()
|
const logger = useLogger()
|
||||||
const sharedLabels = useSharedLabels()
|
const sharedLabels = useSharedLabels()
|
||||||
|
|
||||||
|
@ -110,7 +120,7 @@ const fetchData = async () => {
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
watch(() => store.state.moderation.lastUpdate, fetchData)
|
watch(() => store.state.moderation.lastUpdate, fetchData)
|
||||||
watch([page, tags, q], fetchData)
|
watch([page, tags, q, ordering, orderingDirection], fetchData)
|
||||||
fetchData()
|
fetchData()
|
||||||
|
|
||||||
const search = () => {
|
const search = () => {
|
||||||
|
@ -132,6 +142,7 @@ const labels = computed(() => ({
|
||||||
const paginateOptions = computed(() => sortedUniq([12, 30, 50, paginateBy.value].sort((a, b) => a - b)))
|
const paginateOptions = computed(() => sortedUniq([12, 30, 50, paginateBy.value].sort((a, b) => a - b)))
|
||||||
|
|
||||||
const { isOpen: subscribeIsOpen, to: subscribe } = useModal('subscribe')
|
const { isOpen: subscribeIsOpen, to: subscribe } = useModal('subscribe')
|
||||||
|
const { isOpen: channelIsOpen, to: channel } = useModal('channel')
|
||||||
const { to: upload } = useModal('upload')
|
const { to: upload } = useModal('upload')
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -143,6 +154,12 @@ const { to: upload } = useModal('upload')
|
||||||
<Header
|
<Header
|
||||||
page-heading
|
page-heading
|
||||||
:h1="t('components.library.Podcasts.header.browse')"
|
:h1="t('components.library.Podcasts.header.browse')"
|
||||||
|
:action="{
|
||||||
|
text: t('views.channels.SubscriptionsList.link.addNew'),
|
||||||
|
onClick: ()=> channelIsOpen = true,
|
||||||
|
icon: 'bi-plus',
|
||||||
|
primary: true
|
||||||
|
}"
|
||||||
/>
|
/>
|
||||||
<Layout
|
<Layout
|
||||||
form
|
form
|
||||||
|
@ -321,5 +338,61 @@ const { to: upload } = useModal('upload')
|
||||||
</Button>
|
</Button>
|
||||||
</template>
|
</template>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<Modal
|
||||||
|
v-model="channelIsOpen"
|
||||||
|
:title="
|
||||||
|
step === 1
|
||||||
|
? t('views.auth.ProfileOverview.modal.createChannel.header')
|
||||||
|
: category === 'podcast'
|
||||||
|
? t('views.auth.ProfileOverview.modal.createChannel.podcast.header')
|
||||||
|
: t('views.auth.ProfileOverview.modal.createChannel.artist.header')
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<channel-form
|
||||||
|
ref="createForm"
|
||||||
|
:object="null"
|
||||||
|
:step="step"
|
||||||
|
@loading="isLoading = $event"
|
||||||
|
@submittable="submittable = $event"
|
||||||
|
@category="category = $event"
|
||||||
|
@errored="modalContent.scrollTop = 0"
|
||||||
|
@created="router.push({name: 'channels.detail', params: {id: $event.actor.preferred_username}})"
|
||||||
|
/>
|
||||||
|
<template #actions>
|
||||||
|
<Button
|
||||||
|
secondary
|
||||||
|
autofocus
|
||||||
|
@click="channelIsOpen = false"
|
||||||
|
>
|
||||||
|
{{ t('views.auth.ProfileOverview.button.cancel') }}
|
||||||
|
</Button>
|
||||||
|
<Spacer grow />
|
||||||
|
<Button
|
||||||
|
v-if="step > 1"
|
||||||
|
secondary
|
||||||
|
@click.stop.prevent="step -= 1"
|
||||||
|
>
|
||||||
|
{{ t('views.auth.ProfileOverview.button.previous') }}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
v-if="step === 1"
|
||||||
|
primary
|
||||||
|
@click.stop.prevent="step += 1"
|
||||||
|
>
|
||||||
|
{{ t('views.auth.ProfileOverview.button.next') }}
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
v-if="step === 2"
|
||||||
|
primary
|
||||||
|
type="submit"
|
||||||
|
:disabled="!submittable && !isLoading"
|
||||||
|
:is-loading="isLoading"
|
||||||
|
@click.prevent.stop="createForm.submit"
|
||||||
|
>
|
||||||
|
{{ t('views.auth.ProfileOverview.button.createChannel') }}
|
||||||
|
</Button>
|
||||||
|
</template>
|
||||||
|
</Modal>
|
||||||
</Layout>
|
</Layout>
|
||||||
</template>
|
</template>
|
||||||
|
|
Loading…
Reference in New Issue