Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

extract shared code into DocumentList #275

Merged
merged 23 commits into from
Feb 2, 2024
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5223a16
extract shared code into DocumentModels
kkuepper Jan 24, 2024
7921634
refactor
kkuepper Jan 24, 2024
516f062
add empty pages for browse pages
kkuepper Jan 25, 2024
99863c0
Merge branch 'main' into feature/document-models
kkuepper Jan 25, 2024
bb70e9c
style chapter header
kkuepper Jan 25, 2024
afbbb5d
introduce DocumentList to be used by multiple pages
kkuepper Jan 25, 2024
88c4561
use SPA link instead of navigation to new site
kkuepper Jan 25, 2024
7b617e0
Merge commit 'dc210750660c9252a03bb81b526902ae2063e4b8' into feature/…
kkuepper Jan 29, 2024
a560307
review fixes
kkuepper Jan 29, 2024
714bdb5
update bmm-sdk to fix typing error
kkuepper Feb 1, 2024
a8c0e33
implement /featured route
kkuepper Feb 1, 2024
449ad12
use title from response
kkuepper Feb 1, 2024
f353b72
send UiLanguage as header
kkuepper Feb 1, 2024
9be0dc3
no longer send the language since the UiLanguage header takes care of…
kkuepper Feb 1, 2024
4fb6313
fix lint
kkuepper Feb 1, 2024
596e62d
review fixes
kkuepper Feb 2, 2024
c72d5dc
Reset changes in pnpm about vite
SimonSimCity Feb 2, 2024
1461129
remove typing
kkuepper Feb 2, 2024
0345896
Refactored `DocumentList` to just be a component and reused it
SimonSimCity Feb 2, 2024
6d721d5
Merged document-list and document-model - added note for empty list
SimonSimCity Feb 2, 2024
5403960
Fix reloading of api requests if language is changed
SimonSimCity Feb 2, 2024
0015771
Remove remaining console.log()
SimonSimCity Feb 2, 2024
2e2f536
Fixed linter
SimonSimCity Feb 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions components/DocumentList.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<script setup lang="ts">
import type {
DocumentListIAllDocumentModels,
IAllDocumentModels,
} from "@bcc-code/bmm-sdk-fetch";

const props = defineProps<{
list: DocumentListIAllDocumentModels | null;
pending: boolean;
}>();

watch(
props,
() => {
toolbarTitleStore().setToolbarTitle(props.list?.title ?? " ");
Copy link
Collaborator

@SimonSimCity SimonSimCity Feb 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do all pages who use this for listing set the title here? My suggestion is that the title should rather be handled by the page than by a component.

Copy link
Member Author

@kkuepper kkuepper Feb 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what you mean. If the server returns a DocumentList it also provides the title.

To make it obvious on the page that the title will be set, I could create a method SetTitleFromDocumentList() or so.

Copy link
Collaborator

@SimonSimCity SimonSimCity Feb 2, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well... I'd rather put these lines into each page... For me, the title is a part of the page and should not be controlled by a component. By this, you can use this component at more pages, also on one page multiple times.

},
{ immediate: true },
);
</script>

<template>
<div>
<template v-if="props.pending">
<ul>
<li
v-for="index in 5"
:key="index"
class="my-6 h-11 w-full animate-pulse rounded-lg bg-background-2"
></li>
</ul>
</template>
<template v-else>
<DocumentModels
v-if="
list !== null &&
list !== undefined &&
list.items !== null &&
list.items !== undefined
"
:models="list.items as IAllDocumentModels[]"
></DocumentModels>
</template>
</div>
</template>
149 changes: 149 additions & 0 deletions components/DocumentModels.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<script setup lang="ts">
import type { IAllDocumentModels, TrackModel } from "@bcc-code/bmm-sdk-fetch";
import type { IDiscoverableGroup } from "~/composables/discover";
import { breakpointsTailwind, useBreakpoints } from "@vueuse/core";

const { t } = useI18n();

const props = defineProps<{
models: IAllDocumentModels[];
}>();

const convertModels = (models: IAllDocumentModels[]) => {
let currentSection: IDiscoverableGroup["items"] = [];
const result: IDiscoverableGroup[] = [];
models.forEach((el, i) => {
if (el.type === "section_header") {
currentSection = [];
result.push({
header: el,
items: currentSection,
});
} else if (i === 0) {
currentSection = [el];
result.push({
header: null,
items: currentSection,
});
} else {
currentSection.push(el);
}
});
return result;
};

const { setQueue } = useNuxtApp().$mediaPlayer;

const playItem = (item: TrackModel, group: IDiscoverableGroup) => {
const items = group.items.filter((c): c is TrackModel => c.type === "track");
setQueue(
items,
items.findIndex((track) => track.id === item.id),
);
};

// We remove the hostname so that we use SPA links (without full page refresh)
const parseLink = (link: string) => {
const url = new URL(link);
return url.pathname + url.search + url.hash;
};

const breakpoints = useBreakpoints(breakpointsTailwind);
const isSmallScreen = breakpoints.smallerOrEqual("lg");
</script>

<template>
<template
v-for="group in convertModels(props.models)"
:key="group.header?.id || 0"
>
<PageHeading v-if="group.header" :level="3">
<div class="flex items-center justify-between">
<div>
<NuxtLink
v-if="typeof group.header.link === 'string'"
:to="parseLink(group.header.link)"
>
{{ group.header.title }}
</NuxtLink>
<span v-else>{{ group.header.title }}</span>
</div>
<NuxtLink v-if="group.header.link" :to="parseLink(group.header.link)">
<ButtonStyled intent="secondary" size="small">
<span class="whitespace-nowrap">
{{ t("home.list.see-all") }}
</span>
</ButtonStyled>
</NuxtLink>
</div>
</PageHeading>
<div
v-if="group.header?.useCoverCarousel"
class="flex flex-row flex-wrap gap-6"
>
<template
v-for="item in group.items.slice(0, isSmallScreen ? 4 : 6)"
:key="item.id"
>
<NuxtLink
v-if="item.type === 'album'"
:to="{ name: 'album-id', params: { id: item.id } }"
>
<ItemCard :item="item" />
</NuxtLink>
<NuxtLink
v-else-if="item.type === 'playlist'"
:to="{ name: 'playlist-curated-id', params: { id: item.id } }"
>
<ItemCard :item="item" />
</NuxtLink>
<NuxtLink
v-else-if="item.type === 'podcast'"
:to="{ name: 'playlist-podcast-id', params: { id: item.id } }"
>
<ItemCard :item="item" />
</NuxtLink>
<div
v-else
class="grid w-52 flex-shrink-0 basis-52 gap-4"
style="background-color: rgba(255, 0, 0, 0.4); color: red"
>
"{{ item.type }}" is not yet implemented ...
</div>
</template>
</div>
<ol
v-else
class="w-full divide-y divide-label-separator grid grid-cols-tracklist"
>
<template v-for="item in group.items" :key="item.id">
<h2
v-if="item.type === 'chapter_header'"
class="text-2xl font-extrabold pt-10 pb-4"
>
{{ item.title }}
</h2>
<TrackItem
v-else-if="item.type === 'track'"
:track="item"
:is-track-type-known="true"
show-thumbnail
@play-track="playItem(item, group)"
></TrackItem>
<ContributorListItem
v-else-if="item.type === 'contributor'"
:contributor="item"
></ContributorListItem>
<AlbumItem v-else-if="item.type === 'album'" :album="item" />
<PlaylistItem v-else-if="item.type === 'playlist'" :playlist="item" />
<PodcastItem v-else-if="item.type === 'podcast'" :podcast="item" />
<li v-else>
<div style="background-color: rgba(255, 0, 0, 0.4); color: red">
"{{ item.type }}" is not yet implemented ...
{{ console.log("not implemented", item) }}
</div>
</li>
</template>
</ol>
</template>
</template>
24 changes: 24 additions & 0 deletions composables/browse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,27 @@ export function useBrowse() {
useLazyAsyncData("browse", () => new BrowseApi().browseGet()),
);
}

export function useBrowseEvents() {
return reactiveApi(
useLazyAsyncData("browse", () => new BrowseApi().browseEventsGet()),
);
}

export function useBrowseAudiobooks() {
return reactiveApi(
useLazyAsyncData("browse", () => new BrowseApi().browseAudiobooksGet()),
);
}

export function useBrowseMusic() {
return reactiveApi(
useLazyAsyncData("browse", () => new BrowseApi().browseMusicGet()),
);
}

export function useBrowsePodcast() {
return reactiveApi(
useLazyAsyncData("browse", () => new BrowseApi().browsePodcastsGet()),
);
}
17 changes: 1 addition & 16 deletions composables/discover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,7 @@ export type IDiscoverableGroup = {
export function useDiscover(requestParameters: DiscoverGetRequest) {
return reactiveApi(
useLazyAsyncData("discover", () =>
new DiscoverApi().discoverGet(requestParameters).then((d) => {
let currentSection: IDiscoverableGroup["items"] = [];
const result: IDiscoverableGroup[] = [];
d.forEach((el) => {
if (el.type === "section_header") {
currentSection = [];
result.push({
header: el,
items: currentSection,
});
} else {
currentSection.push(el);
}
});
return result;
}),
new DiscoverApi().discoverGet(requestParameters),
),
);
}
8 changes: 8 additions & 0 deletions composables/playlist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,11 @@ export function useCuratedPlaylists() {
useLazyAsyncData("playlists", () => new PlaylistApi().playlistGet()),
);
}

export function useFeaturedPlaylists() {
return reactiveApi(
useLazyAsyncData("playlists-featured", () =>
new PlaylistApi().playlistDocumentsGet(),
),
);
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
},
"dependencies": {
"@auth0/auth0-vue": "^2.3.3",
"@bcc-code/bmm-sdk-fetch": "^7.1.0",
"@bcc-code/bmm-sdk-fetch": "^7.3.0",
"@headlessui/vue": "^1.7.17",
"@microsoft/applicationinsights-web": "^3.0.7",
"@pinia/nuxt": "^0.5.1",
Expand Down
12 changes: 12 additions & 0 deletions pages/browse/audiobooks.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<script lang="ts" setup>
import type { DocumentListIAllDocumentModels } from "@bcc-code/bmm-sdk-fetch";

const { data: models, pending } = useBrowseAudiobooks();
</script>

<template>
<DocumentList
:list="models as DocumentListIAllDocumentModels"
:pending="pending"
></DocumentList>
</template>
12 changes: 12 additions & 0 deletions pages/browse/events.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<script lang="ts" setup>
import type { DocumentListIAllDocumentModels } from "@bcc-code/bmm-sdk-fetch";

const { data: models, pending } = useBrowseEvents();
</script>

<template>
<DocumentList
:list="models as DocumentListIAllDocumentModels"
:pending="pending"
></DocumentList>
</template>
37 changes: 4 additions & 33 deletions pages/browse/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
const { t } = useI18n();
toolbarTitleStore().setReactiveToolbarTitle(() => t("nav.browse"));

const { data: browseSections, pending } = useBrowse();
const { data: models, pending } = useBrowse();
</script>

<template>
<div>
<PageHeading class="mb-6">{{ $t("nav.browse") }}</PageHeading>
<template v-if="pending">
<ul>
<li
Expand All @@ -17,36 +16,8 @@ const { data: browseSections, pending } = useBrowse();
></li>
</ul>
</template>
<ul v-else>
<template v-for="section in browseSections" :key="section.id || 0">
<PageHeading v-if="section.type === 'section_header'" :level="3">
<div class="flex items-center justify-between">
<div>
<a v-if="typeof section.link === 'string'" :href="section.link">
{{ section.title }}
</a>
<span v-else>{{ section.title }}</span>
</div>
<a v-if="section.link" :href="section.link">
<ButtonStyled intent="secondary" size="small">
<span class="whitespace-nowrap">
{{ t("home.list.see-all") }}
</span>
</ButtonStyled>
</a>
</div>
</PageHeading>
<AlbumItem v-else-if="section.type === 'album'" :album="section" />
<PlaylistItem
v-else-if="section.type === 'playlist'"
:playlist="section"
/>
<PodcastItem
v-else-if="section.type === 'podcast'"
:podcast="section"
/>
<p v-else style="color: red">This is not implemented yet</p>
</template>
</ul>
<template v-else>
<DocumentModels v-if="models !== null" :models="models"></DocumentModels>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use the component DocumentList here?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the question

</template>
</div>
</template>
11 changes: 10 additions & 1 deletion pages/browse/music.vue
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
<script lang="ts" setup>
import type { DocumentListIAllDocumentModels } from "@bcc-code/bmm-sdk-fetch";

const { data: models, pending } = useBrowseMusic();
</script>

<template>
<h1>The route {{ useRoute().name }} has not been implemented yet.</h1>
<DocumentList
:list="models as DocumentListIAllDocumentModels"
:pending="pending"
></DocumentList>
</template>
11 changes: 10 additions & 1 deletion pages/browse/podcasts.vue
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
<script lang="ts" setup>
import type { DocumentListIAllDocumentModels } from "@bcc-code/bmm-sdk-fetch";

const { data: models, pending } = useBrowsePodcast();
</script>

<template>
<h1>The route {{ useRoute().name }} has not been implemented yet.</h1>
<DocumentList
:list="models as DocumentListIAllDocumentModels"
:pending="pending"
></DocumentList>
</template>
11 changes: 10 additions & 1 deletion pages/featured.vue
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
<script lang="ts" setup>
import type { DocumentListIAllDocumentModels } from "@bcc-code/bmm-sdk-fetch";

const { data: models, pending } = useFeaturedPlaylists();
</script>

<template>
<h1>The route {{ useRoute().name }} has not been implemented yet.</h1>
<DocumentList
:list="models as DocumentListIAllDocumentModels"
:pending="pending"
></DocumentList>
</template>
Loading
Loading