Creator news summary - presentation design
This commit is contained in:
@@ -21,6 +21,7 @@ import PostContent from "@/views/contents/PostContent.vue";
|
|||||||
import Explorer from "@/views/explorer/explorer.vue";
|
import Explorer from "@/views/explorer/explorer.vue";
|
||||||
import {useAuthStore} from "@/stores/authStore.js";
|
import {useAuthStore} from "@/stores/authStore.js";
|
||||||
import ForYouPage from "@/views/profile/ForYouPage.vue";
|
import ForYouPage from "@/views/profile/ForYouPage.vue";
|
||||||
|
import CreatorPresentation from "@/views/creators/CreatorPresentation.vue";
|
||||||
|
|
||||||
const routes = [
|
const routes = [
|
||||||
{
|
{
|
||||||
@@ -28,6 +29,11 @@ const routes = [
|
|||||||
component: Home,
|
component: Home,
|
||||||
meta: { hideSideBar: true }
|
meta: { hideSideBar: true }
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/presentation/@:creator',
|
||||||
|
component: CreatorPresentation,
|
||||||
|
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/browse',
|
path: '/browse',
|
||||||
component: CreatorList
|
component: CreatorList
|
||||||
|
|||||||
79
src/views/creators/CreatorPresentation.vue
Normal file
79
src/views/creators/CreatorPresentation.vue
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<div :style="{ backgroundColor: '#2D2728' }">
|
||||||
|
<div class="mt-10" v-if="creator && creator.id">
|
||||||
|
<div class="max-w-[1500px] mx-auto">
|
||||||
|
<creator-banner :creator="creator"
|
||||||
|
@content-posted="contentPosted"
|
||||||
|
></creator-banner>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="loading">
|
||||||
|
<v-progress-linear indeterminate></v-progress-linear>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<v-card>
|
||||||
|
<v-card-text style="text-align: center;">
|
||||||
|
Aucun créateur au nom de {{ route.params.creator }}
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--reator presentation-->
|
||||||
|
<div class="flex flex-row max-w-[1500px] mx-auto justify-center mt-8">
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<!-- Actualité feed-->
|
||||||
|
<div class="flex flex-column px-2 max-w-80">
|
||||||
|
<div>
|
||||||
|
<Creatornewssummary :creator="creator"></Creatornewssummary>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="min-w-[875px]"></div>
|
||||||
|
<div class="bg-fuchsia-800 flex-grow">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script async setup>
|
||||||
|
import {watch, ref, onBeforeMount} from 'vue';
|
||||||
|
import {useRoute} from 'vue-router';
|
||||||
|
import {useClient} from "@/plugins/api.js";
|
||||||
|
import CreatorBanner from "@/views/creators/CreatorBanner.vue";
|
||||||
|
import Creatornewssummary from "@/views/creators/banner/Creatornewssummary.vue";
|
||||||
|
|
||||||
|
const creator = ref(null)
|
||||||
|
const loading = ref(true)
|
||||||
|
const contents = ref([])
|
||||||
|
|
||||||
|
const client = useClient()
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
function contentPosted(content) {
|
||||||
|
contents.value.unshift(content)
|
||||||
|
}
|
||||||
|
|
||||||
|
onBeforeMount(async () => await fetchCreatorData(route.params.creator))
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => route.params.creator,
|
||||||
|
async () => await fetchCreatorData(route.params.creator)
|
||||||
|
)
|
||||||
|
|
||||||
|
const fetchCreatorData = async (creatorAlias) => {
|
||||||
|
try {
|
||||||
|
loading.value = true
|
||||||
|
const response = await client.get(`/api/creators/@${creatorAlias}`)
|
||||||
|
creator.value = response.data
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Error fetching content: ${error}`)
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
85
src/views/creators/banner/Creatornewssummary.vue
Normal file
85
src/views/creators/banner/Creatornewssummary.vue
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<div class="flex justify-center mb-2">
|
||||||
|
<v-btn height="42" @click="scrollUp">
|
||||||
|
<v-icon size="40">mdi-arrow-up-drop-circle-outline</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text-center text-white rounded-t-lg text-xl" :style="{ backgroundColor: creator.colors.bannerTop, letterSpacing: '5px' }">Actualité</div>
|
||||||
|
|
||||||
|
<div class="flex flex-column">
|
||||||
|
<div v-for="(item, index) in visibleCards" :key="index" class="my-1 text-white" :style="{ backgroundColor: creator.colors.bannerTop }">
|
||||||
|
<div class="flex justify-between items-center border-b-2 border-white p-3 mx-2">
|
||||||
|
<p v-if="item.type === 'nouvelle'" class="text-xl" :style="{ letterSpacing: '8px' }">Nouvelle</p>
|
||||||
|
<p v-if="item.type === 'contenu'" class="text-xl" :style="{ letterSpacing: '8px' }">Contenu</p>
|
||||||
|
<p class="text-xs">{{ item.date }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="p-3">
|
||||||
|
<div class="text-lg" style="letter-spacing: 2px">{{ item.title }}</div>
|
||||||
|
<p v-if="item.description" class="text-gray-300 text-sm text-justify mt-1 py-1">{{ item.description }}</p>
|
||||||
|
|
||||||
|
<div v-if="item.rating" class="stars flex justify-end">
|
||||||
|
{{ item.rating }} ★
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<img v-if="item.photo" :src="item.photo" class="w-full h-auto my-2" />
|
||||||
|
|
||||||
|
<div class="flex justify-evenly">
|
||||||
|
<v-btn icon variant="plain"><v-icon>mdi-thumb-up</v-icon></v-btn>
|
||||||
|
<v-btn icon variant="plain"><v-icon>mdi-comment-outline</v-icon></v-btn>
|
||||||
|
<v-btn icon variant="plain"><v-icon>mdi-gift-outline</v-icon></v-btn>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<video v-if="item.video" controls :src="item.video" class="w-full h-auto my-2"></video>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex justify-center mt-2">
|
||||||
|
<v-btn height="42" @click="scrollDown">
|
||||||
|
<v-icon size="40">mdi-arrow-down-drop-circle-outline</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { ref, computed, defineProps } from 'vue';
|
||||||
|
|
||||||
|
// Define props to receive creator
|
||||||
|
const props = defineProps({
|
||||||
|
creator: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Simulate JSON data (replace with your actual data)
|
||||||
|
const actualites = ref([
|
||||||
|
{ type: 'nouvelle', title: 'La visite du studio', description: 'Je suis fier de vous montrer les installations sur lesquelles nous avons travaillé si fort.', photo: '/images/usersmedia/HutopyProfile/profilepictures/profileHutopyProfile01.png', video: null, rating: null, date: '2024-09-19' },
|
||||||
|
{ type: 'contenu', title: 'Éditer comme un pro!', description: 'Ceci est la description du contenu.', photo: null, video: null, rating: 4.5, date: '2024-09-18' },
|
||||||
|
{ type: 'nouvelle', title: 'Le studio', description: 'Nous sommes dans les derniers préparatifs, mais demain nous allons vous dévoiler la première partie du studio qui est complétée.', photo: null, video: null, rating: null, date: '2024-09-17' },
|
||||||
|
{ type: 'contenu', title: 'Contenu 2', description: 'Deuxième contenu avec description.', photo: null, video: null, rating: 5.0, date: '2024-09-16' },
|
||||||
|
]);
|
||||||
|
|
||||||
|
// Control card visibility
|
||||||
|
const startIndex = ref(0);
|
||||||
|
const cardsPerPage = 3;
|
||||||
|
|
||||||
|
const endIndex = computed(() => startIndex.value + cardsPerPage);
|
||||||
|
const visibleCards = computed(() => actualites.value.slice(startIndex.value, endIndex.value));
|
||||||
|
|
||||||
|
function scrollDown() {
|
||||||
|
if (endIndex.value < actualites.value.length) {
|
||||||
|
startIndex.value += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scrollUp() {
|
||||||
|
if (startIndex.value > 0) {
|
||||||
|
startIndex.value -= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -63,16 +63,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="absolute bottom-6 right-24 z-30 shadow-2xl rounded-2xl text-white"
|
<div class="absolute bottom-6 right-24 z-30 shadow-2xl rounded-md text-white"
|
||||||
:style="{ backgroundColor: creator.colors.bannerTop}">
|
:style="{ backgroundColor: creator.colors.bannerTop}">
|
||||||
|
|
||||||
<div class="w-96 h-28 flex flex-col">
|
<div class="w-96 h-28 flex flex-col">
|
||||||
<!-- Section 3 et 4 - Prend 2/3 de la hauteur -->
|
<!-- Section 3 et 4 - Prend 2/3 de la hauteur -->
|
||||||
<div class="flex flex-row flex-grow-[2] min-h-20">
|
<div class="flex flex-row flex-grow-[2] min-h-20">
|
||||||
<div class="rounded-tl-xl w-1/2 flex items-center justify-center"
|
<div class="rounded-tl-md w-1/2 flex items-center justify-center"
|
||||||
:style="{ backgroundColor: creator.colors.bannerBottom, opacity: 0.20 }">
|
:style="{ backgroundColor: creator.colors.bannerBottom, opacity: 0.20 }">
|
||||||
</div>
|
</div>
|
||||||
<div class="rounded-tr-xl w-1/2 bg-cyan-100 flex items-center justify-center text-xl"
|
<div class="rounded-tr-md w-1/2 bg-cyan-100 flex items-center justify-center text-xl"
|
||||||
:style="{ backgroundColor: creator.colors.bannerBottom}">
|
:style="{ backgroundColor: creator.colors.bannerBottom}">
|
||||||
<div class="absolute left-1">
|
<div class="absolute left-1">
|
||||||
<div class="flex flex-row items-center justify-center space-x-5">
|
<div class="flex flex-row items-center justify-center space-x-5">
|
||||||
@@ -105,15 +105,15 @@
|
|||||||
</v-btn>
|
</v-btn>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- Section 1 - Prend 1/3 de la hauteur -->
|
|
||||||
<div class="flex-grow bg-gray-300 flex items-center justify-center rounded-b-2xl"
|
<div class="flex-grow bg-gray-300 flex items-center justify-center rounded-b-md"
|
||||||
:style="{ backgroundColor: creator.colors.bannerBottom,opacity: 0.80 }">
|
:style="{ backgroundColor: creator.colors.bannerBottom,opacity: 0.80 }">
|
||||||
|
|
||||||
<textarea
|
<textarea
|
||||||
|
|
||||||
rows="1"
|
rows="1"
|
||||||
placeholder="Message facultatif"
|
placeholder="Message facultatif"
|
||||||
class="w-full p-2 border border-gray-300 rounded-b-2xl resize-none"
|
class="w-full p-2 border border-gray-300 rounded-b-md resize-none"
|
||||||
style="max-height: 300px; overflow-y: hidden; outline: none;"
|
style="max-height: 300px; overflow-y: hidden; outline: none;"
|
||||||
oninput="this.style.height = ''; this.style.height = Math.min(this.scrollHeight, 300) + 'px'"></textarea>
|
oninput="this.style.height = ''; this.style.height = Math.min(this.scrollHeight, 300) + 'px'"></textarea>
|
||||||
|
|
||||||
@@ -122,61 +122,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- <div class="flex flex-row ml-auto space-x-2.5">-->
|
|
||||||
<!-- <donation-button-banner-->
|
|
||||||
<!-- :color-border="creator.colors.menu"-->
|
|
||||||
<!-- :color-accent="creator.colors.accent"-->
|
|
||||||
<!-- :creator-id="creator.id"-->
|
|
||||||
<!-- :creator-name="creator.name"-->
|
|
||||||
<!-- :creator-logo="creator.images.logo"-->
|
|
||||||
<!-- iconColorClass="text-white">-->
|
|
||||||
<!-- </donation-button-banner>-->
|
|
||||||
<!-- <div class="flex flex-column">-->
|
|
||||||
<!-- <!– Bouton abonnement affiché seulement si non abonné –>-->
|
|
||||||
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- -->
|
|
||||||
|
|
||||||
<!-- <!– Conteneur sticky –>-->
|
|
||||||
<!-- <div v-show="isSticky" class=" sticky-header fixed top-14 left-0 right-0 w-full z-20"-->
|
|
||||||
<!-- :style="{ backgroundColor: creator.colors.bannerBottom || '#A30E79', borderBottom: '5px inset' + (creator.colors.menu || '#000') }">-->
|
|
||||||
<!-- <div class="shadow-3xl flex flex-row items-center py-2 px-2">-->
|
|
||||||
<!-- <div>-->
|
|
||||||
<!-- <img-->
|
|
||||||
<!-- class="max-w-[40px] max-h-[40px] ml-5 rounded-full"-->
|
|
||||||
<!-- :src="creator.images.logo ? creator.images.logo : '/images/placeholders/logo.png'"-->
|
|
||||||
<!-- alt="Profile Picture"-->
|
|
||||||
<!-- :style="{ borderColor: creator.colors.accent || '#A30E79', height: '190px'}"-->
|
|
||||||
<!-- />-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div class="ml-5 text-white">-->
|
|
||||||
<!-- <p class="capitalize text-2xl font-bold">{{ creator.name }}</p>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- <div class="ml-auto flex flex-row space-x-2.5 mr-3 ">-->
|
|
||||||
<!-- -->
|
|
||||||
<!-- <donation-button-banner-slim -->
|
|
||||||
<!-- class=""-->
|
|
||||||
<!-- :color-border="creator.colors.menu"-->
|
|
||||||
<!-- :color-accent="creator.colors.accent"-->
|
|
||||||
<!-- :creator-id="creator.id"-->
|
|
||||||
<!-- :creator-name="creator.name"-->
|
|
||||||
<!-- :creator-logo="creator.images.logo"-->
|
|
||||||
<!-- >-->
|
|
||||||
<!-- </donation-button-banner-slim>-->
|
|
||||||
|
|
||||||
<!-- <!– Afficher le bouton d'abonnement seulement si l'utilisateur n'est pas abonné –>-->
|
|
||||||
<!-- <subscribe-button-slim-->
|
|
||||||
<!-- v-if="!isSubscribed"-->
|
|
||||||
<!-- :creator="creator"-->
|
|
||||||
<!-- :color-border="creator.colors.menu">-->
|
|
||||||
<!-- </subscribe-button-slim>-->
|
|
||||||
<!-- -->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
<!-- </div>-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="rounded-b-2xl min-h-10 px-36 flex flex-col items-center justify-center"
|
<div class="rounded-b-2xl min-h-10 px-36 flex flex-col items-center justify-center"
|
||||||
|
|||||||
Reference in New Issue
Block a user