<template> <div class="networks"> <div class="content-inner"> <SearchBar :placeholder="`Search ${channelCount} channels in ${entities.length} networks`" :eager="true" /> <span v-if="done && entities.length === 0" class="empty" >No results for "{{ $route.query.query }}"</span> <template v-else> <h2 class="heading">Popular</h2> <div class="entity-tiles" > <Entity v-for="entity in popularEntities" :key="entity.parent ? `entity-tile-${entity.parent.slug}-${entity.slug}` : `entity-tile-${entity.slug}`" :entity="entity" /> </div> <h2 class="heading">All networks</h2> <div class="entity-tiles" > <Entity v-for="entity in entities" :key="entity.parent ? `entity-tile-${entity.parent.slug}-${entity.slug}` : `entity-tile-${entity.slug}`" :entity="entity" /> </div> </template> </div> <Footer /> </div> </template> <script> import Entity from '../entities/tile.vue'; import SearchBar from '../search/bar.vue'; async function fetchEntities() { if (this.$route.query.query) { await this.searchEntities(); return; } this.done = false; this.entities = await this.$store.dispatch('fetchEntities', { type: 'network', entitySlugs: [], }); this.done = true; } async function searchEntities() { this.done = false; this.entities = await this.$store.dispatch('searchEntities', { query: this.$route.query.query, limit: 20, }); this.done = true; } function popularEntities() { const entitiesBySlug = Object.fromEntries(this.entities.map((entity) => [entity.slug, entity])); return [ '21sextury', 'adulttime', 'amateurallure', 'analvids', 'bamvisions', 'bang', 'bangbros', 'blowpass', 'brazzers', 'burningangel', 'digitalplayground', 'dogfartnetwork', 'dorcel', 'elegantangel', 'evilangel', 'fakehub', 'girlsway', 'hookuphotshot', 'hussiepass', 'insex', 'julesjordan', 'kellymadison', 'kink', 'mofos', 'naughtyamerica', 'newsensations', 'pervcity', 'pornpros', 'private', 'realitykings', 'teamskeet', 'twistys', 'vixen', 'xempire', ].map((slug) => entitiesBySlug[slug]).filter(Boolean); } async function mounted() { this.pageTitle = 'Channels'; await this.fetchEntities(); } function channelCount() { return this.entities.reduce((acc, entity) => acc + entity.childrenTotal, 0); } export default { components: { Entity, SearchBar, }, data() { return { done: false, pageTitle: null, entities: [], }; }, computed: { channelCount, popularEntities, }, watch: { $route: fetchEntities, }, mounted, methods: { fetchEntities, searchEntities, }, }; </script> <style lang="scss" scoped> @import 'theme'; .networks { display: flex; flex-direction: column; flex-grow: 1; } .content-inner { padding: 0 1rem; } .search { margin: 1rem 0 0 0; } .entity-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); grid-gap: .5rem; padding: 1rem 0; .tile { height: 6rem; } } .empty { display: block; margin: 1rem 0; color: var(--shadow); font-size: 1.25rem; font-weight: bold; } .heading { margin: 1rem 0 0 0; } @media(max-width: $breakpoint2) { .entity-tiles { grid-gap: .5rem; } } @media(max-width: $breakpoint0) { .entity-tiles { grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); } } </style>