Ajout de ProfileInfo dans les messages du chat

This commit is contained in:
Bilal Dieumegard 2024-12-09 17:42:56 +01:00
parent 14f2e5f5c9
commit 2d4cea3c4e
4 changed files with 77 additions and 47 deletions

View file

@ -1,14 +1,17 @@
<script lang="ts"> <script lang="ts">
import * as Card from "$lib/components/ui/card"; import * as Card from "$lib/components/ui/card";
import { formatDistanceToNow } from "$lib/utils/date.js"; import { formatDistanceToNow } from "$lib/utils/date.js";
import { onMount, onDestroy } from "svelte"; import { onMount } from "svelte";
import ProfileInfo from "$lib/components/ui/ProfileInfo.svelte"; // Importer le composant ProfileInfo
export let username: string; export let myMessage: boolean; // Si c'est le message de l'utilisateur courant
export let messageContent: string;
export let profilePicture: string | null; // Peut être null export let user = null; // Infos utilisateur
export let createdAt: string; // Date de création du message export let messageContent = ""; // Contenu du message
export let createdAt = new Date(); // Date de création du message
let defaultProfilePicture = "/images/default-profile.png"; let defaultProfilePicture = "/images/default-profile.png";
let showProfileInfo = false; // Contrôle la visibilité des informations de profil
// Temps écoulé (calculé périodiquement) // Temps écoulé (calculé périodiquement)
let timeElapsed: string; let timeElapsed: string;
@ -30,32 +33,45 @@
</script> </script>
<Card.Root class="relative"> <Card.Root class="relative">
<Card.Header class="flex items-center flex-row justify-between"> <Card.Header
<!-- Image de profil collée à gauche --> class="flex items-center justify-between {myMessage ? 'flex-row' : 'flex-row-reverse'}"
<div class="flex flex-row gap-3 items-center"> >
<img <!-- Conteneur pour la date -->
src={'http://localhost:5173/' + profilePicture}
alt="Profile Picture"
class="h-10 w-10 rounded-full border border-gray-300"
/>
<!-- Section contenant le pseudo -->
<div class="flex flex-col">
<Card.Title class="text-gray-800 text-sm sm:text-base md:text-lg truncate">
{username}
</Card.Title>
</div>
</div>
<!-- Temps depuis la création -->
<span class="text-xs sm:text-sm md:text-base text-gray-500 items-top"> <span class="text-xs sm:text-sm md:text-base text-gray-500 items-top">
{timeElapsed} {timeElapsed}
</span> </span>
<!-- Conteneur pour l'image et le nom d'utilisateur -->
<div class="flex items-center gap-3 {myMessage ? 'flex-row-reverse' : 'flex-row'}">
<div
class="relative"
on:mouseenter={() => (showProfileInfo = true)}
on:mouseleave={() => (showProfileInfo = false)}
>
<!-- Image de profil -->
<img
src={user.profilePicture ? `http://localhost:5173/${user.profilePicture}` : defaultProfilePicture}
alt="Profile Picture"
class="h-10 w-10 rounded-full border border-gray-300"
/>
<!-- Infos du profil (affichées au survol) -->
<ProfileInfo user={user} show={showProfileInfo} position={myMessage ? "right" : "left"} />
</div>
<div class="flex flex-col text-right {myMessage ? 'text-right' : 'text-left'}">
<Card.Title
class="text-gray-800 text-sm sm:text-base md:text-lg truncate {myMessage ? 'font-black' : ''}"
>
{myMessage ? "(Moi)" : ""} {user.username}
</Card.Title>
</div>
</div>
</Card.Header> </Card.Header>
<!-- Contenu du message --> <!-- Contenu du message -->
<Card.Content> <Card.Content class="text-sm sm:text-base md:text-lg text-gray-700">
<p class="text-sm sm:text-base md:text-lg text-gray-700"> <p>{messageContent}</p>
{messageContent}
</p>
</Card.Content> </Card.Content>
</Card.Root> </Card.Root>
@ -63,4 +79,16 @@
img { img {
object-fit: cover; /* Assure un bon rendu des images */ object-fit: cover; /* Assure un bon rendu des images */
} }
.flex-row-reverse {
flex-direction: row-reverse;
}
.text-right {
text-align: right;
}
.text-left {
text-align: left;
}
</style> </style>

View file

@ -1,34 +1,37 @@
<script> <script>
export let user = { pseudo: '', prenom: '', nom: '', description: '' }; // Infos utilisateur export let user; // Infos utilisateur
export let position = 'right'; // Position de la photo de profil: 'left' ou 'right' export let position = 'right'; // Position de la photo de profil: 'left' ou 'right'
export let show = false; // Afficher ou masquer les infos utilisateur
</script> </script>
<div class="user-info" style="left: {position === 'left' ? 'auto' : '0'}; right: {position === 'right' ? '0' : 'auto'};"> {#if show}
<div class="user-info" style="left: {position === 'left' ? 'auto' : '0'}; right: {position === 'right' ? '0' : 'auto'};">
<h3>{user.pseudo}</h3> <h3>{user.pseudo}</h3>
<p>{user.prenom} {user.nom}</p> <p>{user.name} {user.surname}</p>
<p>{user.description}</p> <p>{user.description}</p>
</div> </div>
{/if}
<style> <style>
.user-info { .user-info {
position: absolute; position: absolute;
top: 50%; top: 0; /* Aligner en haut */
transform: translateY(-50%); left: auto;
background: rgba(255, 255, 255, 0.9); right: auto;
padding: 10px; width: 200px; /* Largeur appropriée */
border-radius: 5px; background: rgba(255, 255, 255, 0.95); /* Fond semi-transparent */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); padding: 15px;
max-width: 200px; border-radius: 8px;
transition: all 0.3s ease; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
z-index: 10; /* Gérer les priorités d'affichage */
} }
.user-info h3 { .user-info.left {
margin: 0; right: 110%; /* Position à gauche avec un espace */
font-size: 18px;
} }
.user-info p { .user-info.right {
margin: 5px 0; left: 110%; /* Position à droite avec un espace */
font-size: 14px;
} }
</style> </style>

View file

@ -7,7 +7,6 @@ export async function load({ fetch, params, locals }) {
} }
}); });
const messages = await res.json(); const messages = await res.json();
console.log(messages);
return { return {
messages, messages,
channelId: params.id, channelId: params.id,

View file

@ -144,7 +144,7 @@
<!-- Afficher les messages (mock d'un utilisateur sélectionné ou aucun message par défaut) --> <!-- Afficher les messages (mock d'un utilisateur sélectionné ou aucun message par défaut) -->
{#if messages !== undefined && messages.length > 0} {#if messages !== undefined && messages.length > 0}
{#each messages as message} {#each messages as message}
<Message profilePicture={message.user.profilePicture} username={message.user.username} messageContent={message.text} createdAt={message.createdAt} /> <Message myMessage={data.userId == message.user.id} user={message.user} messageContent={message.text} createdAt={message.createdAt} />
{/each} {/each}
{:else} {:else}
<div class="text-center text-gray-500 mt-10">Sélectionnez un message le chat est vide.</div> <div class="text-center text-gray-500 mt-10">Sélectionnez un message le chat est vide.</div>