Add 'frontend/' from commit 'c070c0315d66a44154ab7d9f9ea6c211a15f4dba'

git-subtree-dir: frontend
git-subtree-mainline: 205a3bd14b
git-subtree-split: c070c0315d
This commit is contained in:
2025-01-15 15:24:17 -05:00
318 changed files with 29301 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
<template>
<h2 class="text-2xl font-semibold mb-4 flex justify-center">
Bannière
</h2>
<img
:src="fileUrl || fallbackUrl"
class="mb-5 w-full transition duration-200 ease-in-out transform"
alt="Aperçu de la bannière"
>
<v-file-input
v-model="selectedFile"
variant="outlined"
accept="image/*"
label="Votre bannière"
@change="onFileSelected"
></v-file-input>
<div class="flex justify-end space-x-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="publish">Enregistrer</v-btn>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useClient } from '@/plugins/api.js'
const props = defineProps({
creator: {
required: true
}
})
const emits = defineEmits(['closeRequested'])
const selectedFile = ref({})
const fileUrl = ref(props.creator.images.banner)
const fallbackUrl = '/images/hutopymedia/banners/hutopyul.png'
const onFileSelected = () => {
if (selectedFile.value) {
const reader = new FileReader()
reader.onload = (event) => {
fileUrl.value = event.target.result
}
reader.readAsDataURL(selectedFile.value)
} else {
fileUrl.value = null
}
}
const client = useClient()
const publish = async () => {
try {
const formData = new FormData()
formData.append('file', selectedFile.value)
await client.post(
`/api/creators/${props.creator.id}/banner`,
formData
)
props.creator.images.banner = fileUrl
emits('closeRequested')
} catch (error) {
console.error(error)
}
}
const cancel = () => {
emits('closeRequested')
}
</script>

View File

@@ -0,0 +1,59 @@
<script setup>
import { useClient } from '@/plugins/api.js';
import { ref } from 'vue';
const props = defineProps({
creator: {
required: true,
},
});
const emits = defineEmits(['closeRequested']);
const stripeId = ref(props.creator.stripeId);
const client = useClient();
const save = async () => {
try {
await client.post(`/api/membership/stripe-account`, {
stripeAccountId: stripeId.value,
});
props.creator.stripeId = stripeId.value;
emits('closeRequested');
} catch (error) {
console.error('Error saving stripe id:', error);
}
};
const cancel = () => {
emits('closeRequested');
};
</script>
<template>
<div class="pb-5 text-2xl">Modifier le id Stripe</div>
<div class="flex flex-col space-y-4">
<v-text-field
variant="outlined"
v-model="stripeId"
label="Stripe Id"
outlined
></v-text-field>
<div class="flex justify-end space-x-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="save">Enregistrer</v-btn>
</div>
</div>
</template>
<style scoped>
.flex {
display: flex;
}
.space-y-4 > * + * {
margin-top: 1rem;
}
</style>

View File

@@ -0,0 +1,62 @@
<script setup>
import { ref } from 'vue';
import { useClient } from '@/plugins/api.js';
const props = defineProps({
creator: {
required: true
}
});
const emits = defineEmits(['closeRequested']);
const title = ref(props.creator.title);
const client = useClient();
const save = async () => {
try {
await client.post(
`/api/creators/${props.creator.id}/title`,
{
title: title.value
}
);
props.creator.title = title.value;
emits('closeRequested');
} catch (error) {
console.error('Error saving title:', error);
}
};
const cancel = () => {
emits('closeRequested');
};
</script>
<template>
<div class="pb-5 text-2xl">Modifier le Titre</div>
<div class="flex flex-col space-y-4">
<v-text-field
variant="outlined"
v-model="title"
label="Titre"
outlined
></v-text-field>
<div class="flex justify-end space-x-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="save">Enregistrer</v-btn>
</div>
</div>
</template>
<style scoped>
.flex {
display: flex;
}
.space-y-4 > * + * {
margin-top: 1rem;
}
</style>

View File

@@ -0,0 +1,250 @@
<script setup>
import {ref, computed} from 'vue';
import {useClient} from "@/plugins/api.js";
const props = defineProps({
creator: {
required: true
}
});
const emits = defineEmits(['closeRequested']);
const primaryColor = ref(props.creator.colors.primary)
const secondaryColor = ref(props.creator.colors.secondary)
const backgroundColor = ref(props.creator.colors.background)
const errorColor = ref(props.creator.colors.error)
const surfaceColor = ref(props.creator.colors.surface)
const onPrimaryColor = ref(props.creator.colors.onPrimary)
const onSecondaryColor = ref(props.creator.colors.onSecondary)
const onBackgroundColor = ref(props.creator.colors.onBackground)
const onErrorColor = ref(props.creator.colors.onError)
const onSurfaceColor = ref(props.creator.colors.onSurface)
const selectedColorName = ref('primary');
const selectedBackgroundColor = computed({
get() {
switch (selectedColorName.value) {
case 'primary':
return primaryColor.value
case 'secondary':
return secondaryColor.value
case 'background':
return backgroundColor.value
case 'error':
return errorColor.value
case 'surface':
return surfaceColor.value
default:
return '#e42aad';
}
},
set(value) {
switch (selectedColorName.value) {
case 'primary':
primaryColor.value = value
break
case 'secondary':
secondaryColor.value = value
break
case 'background':
backgroundColor.value = value
break
case 'error':
errorColor.value = value
break
case 'surface':
surfaceColor.value = value
break
}
}
})
const selectedTextColor = computed({
get() {
switch (selectedColorName.value) {
case 'primary':
return onPrimaryColor.value
case 'secondary':
return onSecondaryColor.value
case 'background':
return onBackgroundColor.value
case 'error':
return onErrorColor.value
case 'surface':
return onSurfaceColor.value
default:
return '#e42aad';
}
},
set(value) {
switch (selectedColorName.value) {
case 'primary':
onPrimaryColor.value = value
break
case 'secondary':
onSecondaryColor.value = value
break
case 'background':
onBackgroundColor.value = value
break
case 'error':
onErrorColor.value = value
break
case 'surface':
onSurfaceColor.value = value
break
}
}
})
const selectColor = (colorName) => {
selectedColorName.value = colorName;
};
const client = useClient();
const save = async () => {
try {
await client.post(
`/api/creators/${props.creator.id}/colors`,
{
'primary': primaryColor.value,
'secondary': secondaryColor.value,
'background': backgroundColor.value,
'error': errorColor.value,
'surface': surfaceColor.value,
'onPrimary': onPrimaryColor.value,
'onSecondary': onSecondaryColor.value,
'onBackground': onBackgroundColor.value,
'onError': onErrorColor.value,
'onSurface': onSurfaceColor.value,
});
props.creator.colors.primary = primaryColor.value
props.creator.colors.secondary = secondaryColor.value
props.creator.colors.background = backgroundColor.value
props.creator.colors.error = errorColor.value
props.creator.colors.surface = surfaceColor.value
props.creator.colors.onPrimary = onPrimaryColor.value
props.creator.colors.onSecondary = onSecondaryColor.value
props.creator.colors.onBackground = onBackgroundColor.value
props.creator.colors.onError = onErrorColor.value
props.creator.colors.onSurface = onSurfaceColor.value
emits('closeRequested');
} catch (error) {
console.error(error);
}
};
const cancel = () => {
emits('closeRequested');
};
</script>
<template>
<h2 class="text-2xl font-semibold mb-4 flex justify-center">
Palette de Couleurs
</h2>
<div class="flex flex-column gap-6 justify-center items-start mt-5">
<div class="grid grid-cols-5 grid-rows-1 gap-4">
<div
class="color-square"
:class="{ selected: selectedColorName === 'primary' }"
:style="{ backgroundColor: primaryColor }"
@click="selectColor('primary')"
>
<span class="color-name"
:style="{ color: onPrimaryColor }">
Primary
</span>
</div>
<div
class="color-square"
:class="{ selected: selectedColorName === 'secondary' }"
:style="{ backgroundColor: secondaryColor }"
@click="selectColor('secondary')"
>
<span class="color-name"
:style="{ color: onSecondaryColor }">
Secondary
</span>
</div>
<div
class="color-square"
:class="{ selected: selectedColorName === 'surface' }"
:style="{ backgroundColor: surfaceColor }"
@click="selectColor('surface')"
>
<span class="color-name"
:style="{ color: onSurfaceColor }">
Surface
</span>
</div>
<div
class="color-square"
:class="{ selected: selectedColorName === 'background' }"
:style="{ backgroundColor: backgroundColor }"
@click="selectColor('background')"
>
<span class="color-name"
:style="{ color: onBackgroundColor }">
Background
</span>
</div>
<div
class="color-square"
:class="{ selected: selectedColorName === 'error' }"
:style="{ backgroundColor: errorColor }"
@click="selectColor('error')"
>
<span class="color-name"
:style="{ color: onErrorColor }"
>
Error
</span>
</div>
</div>
<div class="flex row justify-center space-x-12 mx-auto">
<div class="flex flex-col items-center">
<span class="mb-2 font-weight-bold">Text</span>
<v-color-picker v-model="selectedTextColor"></v-color-picker>
</div>
<div class="flex flex-col items-center">
<span class="mb-2 font-weight-bold">Background</span>
<v-color-picker v-model="selectedBackgroundColor"></v-color-picker>
</div>
</div>
</div>
<div class="flex justify-end space-x-4 mt-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="save">Enregistrer</v-btn>
</div>
</template>
<style scoped>
.color-square {
@apply w-[150px] h-[150px];
@apply flex rounded-md cursor-pointer relative;
@apply items-center justify-center;
@apply font-bold text-2xl;
}
.color-square.selected {
@apply border-4 border-solid border-[crimson];
}
.color-name {
text-align: center;
}
</style>

View File

@@ -0,0 +1,84 @@
<script setup>
import {ref} from 'vue'
import {useUserProfileStore} from "@/stores/userProfileStore.js";
import {useCreatorProfileStore} from "@/stores/creatorProfileStore.js";
import {useClient} from "@/plugins/api.js";
import {useRouter} from "vue-router";
const creatorName = ref('');
const errorMessage = ref('');
const isLoading = ref(false);
const router = useRouter();
const creatorProfileStore = useCreatorProfileStore();
const userProfileStore = useUserProfileStore();
async function createAccount() {
const client = useClient();
try {
errorMessage.value = '';
isLoading.value = true;
const normalizedCreatorName = creatorName.value.toLowerCase();
await client.post('/api/creators', {
creatorId: userProfileStore.user.id,
name: normalizedCreatorName,
});
await creatorProfileStore.fetchCurrentCreatorProfile();
await router.push(`/@${normalizedCreatorName}`);
} catch (error) {
if (error?.response?.data?.errors) {
errorMessage.value = error.response.data.errors[0]?.['reason'] || 'An unexpected error occurred.';
} else {
errorMessage.value = error?.response?.data?.message || error.message || 'An unexpected error occurred.';
}
} finally {
isLoading.value = false;
}
}
</script>
<template>
<div>
<div class="create-creator-card">
<div class="py-2 text-3xl font-bold">
<div class="text-center mb-10">Créez votre Hutopy.</div>
</div>
<div class="flex flex-column justify-end gap-2">
<v-alert
v-if="!!errorMessage"
dense
outlined
text
type="error"
>
{{ errorMessage }}
</v-alert>
<v-text-field
variant="outlined"
v-model="creatorName"
label="Nom de la page"
outlined
></v-text-field>
<div class="flex flex-row justify-end gap-2">
<v-btn
:disabled="isLoading"
variant="outlined"
@click="createAccount"
:style="{ borderColor: 'rgb(159, 76, 173)', color: 'rgb(159, 76, 173)' }"
>
Créer
</v-btn>
</div>
</div>
</div>
</div>
</template>
<style scoped>
.create-creator-card {
@apply text-center max-w-[1000px] mx-auto p-10 bg-white shadow-2xl rounded mt-16 ;
}
</style>

View File

@@ -0,0 +1,312 @@
<script setup>
import XIcon from '@/assets/icons/x.svg';
import { useCreatorProfileStore } from '@/stores/creatorProfileStore.js';
import ChangeStripeID from '@/views/profile/creators/ChangeStripeID.vue';
import ChangeTitle from '@/views/profile/creators/ChangeTitle.vue';
import { computed, ref } from 'vue';
import BannerPicker from './BannerPicker.vue';
import ColorsPicker from './ColorsPicker.vue';
import LogoPicker from './LogoPicker.vue';
import Socials from './Socials.vue';
const creatorProfileStore = useCreatorProfileStore();
console.log(creatorProfileStore.creator);
const imageBanner = computed(
() =>
creatorProfileStore.creator.images.banner ||
'/images/placeholders/banner.png'
);
const imageLogo = computed(
() =>
creatorProfileStore.creator.images.logo || '/images/placeholders/logo.png'
);
const dialog = ref(false);
const currentComponent = ref('');
const componentsMap = {
BannerPicker,
LogoPicker,
Socials,
ColorsPicker,
ChangeTitle,
ChangeStripeID,
};
function requestCancel() {
currentComponent.value = null;
dialog.value = false;
}
const openDialog = (component) => {
currentComponent.value = componentsMap[component];
dialog.value = true;
};
const closeDialog = () => {
currentComponent.value = null;
dialog.value = false;
};
</script>
<template>
<v-dialog v-model="dialog" max-width="800px">
<v-card
:style="{ borderRadius: '25px', border: '3px solid rgb(159, 76, 173)' }"
>
<v-card-text>
<component
:is="currentComponent"
:creator="creatorProfileStore.creator"
@closeRequested="closeDialog"
@requestAccept="requestAccept"
@requestCancel="requestCancel"
></component>
</v-card-text>
</v-card>
</v-dialog>
<!-- Lorsque l'utilisateur n'a pas de creator name-->
<div class="flex flex-col items-center w-full">
<h1 class="uppercase pb-5 text-2xl">
<v-icon class="mr-2">mdi-file-edit-outline</v-icon>
{{ $t('creatorinfopage.pageinformation') }}
</h1>
<div v-if="creatorProfileStore.hasCreator" class="w-full max-w-[800px]">
<div class="my-10 border rounded bg-white">
<div class="py-5 uppercase ml-4">
{{ $t('creatorinfopage.informations') }}
</div>
<div class="flex flex-col w-full">
<button
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-none pa-2 min-w-32 text-left">{{
$t('creatorinfopage.name')
}}</span>
<span class="flex-auto text-left pr-6 capitalize">{{
creatorProfileStore.creator.name
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
</div>
<div class="flex flex-col w-full">
<button
@click="openDialog('ChangeTitle')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-none pa-2 min-w-32 text-left">{{
$t('creatorinfopage.title')
}}</span>
<span class="flex-auto text-left pr-6 capitalize">{{
creatorProfileStore.creator.title
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
</div>
<div class="flex flex-col w-full">
<button
@click="openDialog('ChangeStripeID')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full rounded-b"
>
<span class="flex-none pa-2 min-w-32 text-left"
>Stripe Account ID</span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.stripeId
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
</div>
</div>
<div class="border rounded bg-white">
<div class="py-5 uppercase ml-4">
{{ $t('creatorinfopage.banner&profile') }}
</div>
<div class="flex flex-col w-full gap-4">
<button
@click="openDialog('ColorsPicker')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-auto text-left pr-6 capitalize">
Choisissez votre palette de couleurs.
</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button>
<img
@click="openDialog('BannerPicker')"
:src="imageBanner"
class="w-full transition duration-200 ease-in-out transform hover:brightness-125"
alt="Tutorial Banner"
/>
</button>
<button class="flex justify-center my-5">
<img
@click="openDialog('LogoPicker')"
class="custom-border hover:brightness-125 active:bg-gray-600 shadow flex items-center transition duration-200 ease-in-out w-48 h-48 rounded-full"
:src="imageLogo"
alt="Profile Image"
/>
</button>
</div>
</div>
<div class="mt-10 border rounded bg-white">
<div class="py-5 uppercase ml-4">
{{ $t('creatorinfopage.socialnetwork') }}
</div>
<div class="flex flex-col w-full ">
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="pa-2 min-w-32 text-left"
><v-icon>mdi-facebook</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.facebookUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-none pa-2 min-w-32 text-left">
<v-icon>mdi-instagram</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.instagramUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-none pa-2 w-9 h-9 text-left ml-0.5">
<XIcon></XIcon>
</span>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.xUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="pa-2 min-w-32 text-left"
><v-icon>mdi-linkedin</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.linkedInUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="flex-none pa-2 min-w-32 text-left">
<XIcon class="w-5 h-5"></XIcon>
</span>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.tikTokUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="pa-2 min-w-32 text-left"
><v-icon>mdi-youtube</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.youtubeUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full"
>
<span class="pa-2 min-w-32 text-left"
><v-icon>mdi-reddit</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.redditUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
<button
@click="openDialog('Socials')"
class="HoverBtn active:bg-gray-300 py-2 px-4 border-gray-400 shadow flex items-center transition duration-200 ease-in-out w-full rounded-b"
>
<span class="pa-2 min-w-32 text-left"
><v-icon>mdi-web</v-icon></span
>
<span class="flex-auto text-left pr-6">{{
creatorProfileStore.creator.socials.websiteUrl
}}</span>
<span class="flex-none">
<v-icon>mdi-chevron-right</v-icon>
</span>
</button>
</div>
</div>
</div>
</div>
</template>
<style>
.HoverBtn:hover {
@apply bg-[#A6147D] text-white;
@apply hover:opacity-90;
}
.custom-border {
border: 3px solid;
}
</style>

View File

@@ -0,0 +1,78 @@
<template>
<h2 class="text-2xl font-semibold mb-4 flex justify-center">
Logo
</h2>
<div class="flex justify-center mb-5">
<img
:src="fileUrl || fallbackUrl"
class="w-full transition duration-200 ease-in-out transform max-w-[400px]"
alt="Aperçu du logo"
/>
</div>
<v-file-input
v-model="selectedFile"
variant="outlined"
accept="image/*"
label="Votre logo"
@change="onFileSelected"
></v-file-input>
<div class="flex justify-end space-x-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="publish">Enregistrer</v-btn>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useClient } from '@/plugins/api.js'
const props = defineProps({
creator: {
required: true
}
})
const emits = defineEmits(['closeRequested'])
const selectedFile = ref("")
const fileUrl = ref(props.creator.images.logo)
const fallbackUrl = '/images/usersmedia/HutopyProfile/profilepictures/profileHutopyProfile01.png' // Chemin de votre image de secours
const onFileSelected = () => {
if (selectedFile.value) {
const reader = new FileReader()
reader.onload = (event) => {
fileUrl.value = event.target.result
}
reader.readAsDataURL(selectedFile.value)
} else {
fileUrl.value = null
}
}
const client = useClient()
const publish = async () => {
try {
const formData = new FormData();
formData.append('file', selectedFile.value)
await client.post(
`/api/creators/${props.creator.id}/logo`,
formData)
props.creator.images.logo = fileUrl.value;
emits('closeRequested');
} catch (error) {
console.error(error)
}
}
const cancel = () => {
emits('closeRequested')
}
</script>

View File

@@ -0,0 +1,161 @@
<script setup>
import XIcon from '@/assets/icons/x.svg'
import {ref} from 'vue'
import {useClient} from "@/plugins/api.js";
const props = defineProps({
creator: {
required: true
}
})
const emits = defineEmits(['closeRequested'])
const facebookUrl = ref(props.creator.socials.facebookUrl)
const instagramUrl = ref(props.creator.socials.instagramUrl)
const linkedInUrl = ref(props.creator.socials.linkedInUrl)
const redditUrl = ref(props.creator.socials.redditUrl)
const tikTokUrl = ref(props.creator.socials.tikTokUrl)
const websiteUrl = ref(props.creator.socials.websiteUrl)
const xUrl = ref(props.creator.socials.xUrl)
const youtubeUrl = ref(props.creator.socials.youtubeUrl)
const client = useClient()
const save = async () => {
try {
await client.post(
`/api/creators/${props.creator.id}/socials`,
{
"facebookUrl": facebookUrl.value || null,
"instagramUrl": instagramUrl.value || null,
"linkedInUrl": linkedInUrl.value || null,
"redditUrl": redditUrl.value || null,
"tikTokUrl": tikTokUrl.value || null,
"websiteUrl": websiteUrl.value || null,
"xUrl": xUrl.value || null,
"youtubeUrl": youtubeUrl.value || null,
})
props.creator.socials.facebookUrl = facebookUrl
props.creator.socials.instagramUrl = instagramUrl
props.creator.socials.linkedInUrl = linkedInUrl
props.creator.socials.redditUrl = redditUrl
props.creator.socials.tikTokUrl = tikTokUrl
props.creator.socials.websiteUrl = websiteUrl
props.creator.socials.xUrl = xUrl
props.creator.socials.youtubeUrl = youtubeUrl
emits('closeRequested')
} catch (error) {
console.error(error)
}
}
const cancel = () => {
emits('closeRequested')
}
</script>
<style scoped>
.icon {
width: 28px;
height: 30px;
fill: #000000;
}
</style>
<template>
<div class="pb-5 text-2xl">Reseaux Sociaux</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-facebook</v-icon>
<v-text-field
variant="outlined"
v-model="facebookUrl"
label="Lien Facebook"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-instagram</v-icon>
<v-text-field
variant="outlined"
v-model="instagramUrl"
label="Lien Instagram"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-linkedin</v-icon>
<v-text-field
variant="outlined"
v-model="linkedInUrl"
label="Lien LinkedIn"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-reddit</v-icon>
<v-text-field
variant="outlined"
v-model="redditUrl"
label="Lien Reddit"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<div class="w-6 h-6 mb-5 mr-2">
<XIcon></XIcon>
</div>
<v-text-field
variant="outlined"
v-model="tikTokUrl"
label="Lien TikTok"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-web</v-icon>
<v-text-field
variant="outlined"
v-model="websiteUrl"
label="Lien site web"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<div class="w-6 h-6 mb-5 mr-2">
<XIcon class="icon"></XIcon>
</div>
<v-text-field
variant="outlined"
v-model="xUrl"
label="Lien X"
outlined
></v-text-field>
</div>
<div class="flex flex-row align-center">
<v-icon class="mb-5 mr-2">mdi-youtube</v-icon>
<v-text-field
variant="outlined"
v-model="youtubeUrl"
label="Lien Youtube"
outlined
></v-text-field>
</div>
<div class="flex justify-end space-x-4">
<v-btn color="black" variant="text" @click="cancel">Annuler</v-btn>
<v-btn color="#A6147D" @click="save">Enregistrer</v-btn>
</div>
</template>