Skip to content

Commit

Permalink
adding messages
Browse files Browse the repository at this point in the history
  • Loading branch information
IslemMedjahdi committed Feb 1, 2023
1 parent 967e702 commit adcc429
Show file tree
Hide file tree
Showing 18 changed files with 518 additions and 61 deletions.
2 changes: 1 addition & 1 deletion next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
const nextConfig = {
reactStrictMode: true,
images: {
domains: [process.env.NEXT_PUBLIC_BACKEND_HOSTNAME],
domains: [process.env.NEXT_PUBLIC_BACKEND_HOSTNAME, "api.dicebear.com"],
},
};

Expand Down
1 change: 1 addition & 0 deletions public/discussions.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const AllAnouncementsIndex: React.FC = () => {
<div className="container sm:px-4">
<div className="flex flex-col items-center justify-center gap-y-2 px-4 py-10">
<h1 className="relative z-10 w-fit text-center font-serif text-3xl font-semibold text-gray-900 after:absolute after:top-full after:left-0 after:h-2 after:w-full after:origin-left after:skew-y-1 after:animate-reveal after:bg-blue-primary">
Rechercher une offre
Rechercher un offre
</h1>
</div>
<div className="flex w-full flex-col divide-y bg-white shadow">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import dynamic from "next/dynamic";
import { useRouter } from "next/router";
import React, { useEffect, useState } from "react";
import { ROUTES } from "../../../constants/routes";
import useAuth from "../../../hooks/useAuth";
import AnnouncementService from "../../../services/annoucement.service";
import { Announcement } from "../../../typings/announcement";
import Loading from "../../shared/Loading";
Expand All @@ -20,6 +21,8 @@ const announcementService = AnnouncementService.getInstance();
const AnnouncementPreviewIndex: React.FC = () => {
const router = useRouter();

const { currentUser } = useAuth();

const [annoucement, setAnnouncement] =
useState<Announcement.Announcement | null>(null);
const [loading, setLoading] = useState(true);
Expand Down Expand Up @@ -77,7 +80,12 @@ const AnnouncementPreviewIndex: React.FC = () => {
annoucement.date_publication
).toUTCString()}
/>
<PriceInfo price={annoucement.prix} />
<PriceInfo
price={annoucement.prix}
showSendMessage={
annoucement.auteur.email !== currentUser?.email
}
/>
<Description text={annoucement.description || ""} />
{annoucement.latitude && annoucement.longitude && (
<MapView
Expand All @@ -91,7 +99,9 @@ const AnnouncementPreviewIndex: React.FC = () => {
</div>
<div className="lg:col-span-2">
<div className="w-full gap-y-4 rounded-sm bg-blue-light shadow lg:col-span-2">
<ContactForm AnnouncementId={annoucement.id} />
{annoucement.auteur.email !== currentUser?.email && (
<ContactForm AnnouncementId={annoucement.id} />
)}
<hr />
<PosterInfo
email={annoucement.auteur.email}
Expand Down
14 changes: 8 additions & 6 deletions src/components/announcements/preview-annoucement/PosterInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ const PosterInfo: React.FC<Props> = ({ email, firstName, lastName, phone }) => {
Annonceur Info
</p>
<div className="flex flex-col items-center gap-y-2">
<div className="flex h-20 w-20 items-center justify-center rounded-full bg-blue-primary">
<div>
<p className="text-lg font-medium uppercase text-white">
{firstName[0]} {lastName[0]}
</p>
</div>
<div className="flex h-20 w-20 items-center justify-center rounded-full bg-blue-hover p-1">
<img
src={`https://api.dicebear.com/5.x/bottts/svg?seed=${
firstName + lastName + email
}`}
alt="avatar"
className="h-full w-full rounded-full"
/>
</div>
<div className="flex flex-col items-center">
<p className="text-center font-serif font-bold ">
Expand Down
21 changes: 12 additions & 9 deletions src/components/announcements/preview-annoucement/PriceInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ import React from "react";

type Props = {
price: number;
showSendMessage?: boolean;
};

const PriceInfo: React.FC<Props> = ({ price }) => {
const PriceInfo: React.FC<Props> = ({ price, showSendMessage = true }) => {
return (
<div className="flex w-full flex-wrap items-center justify-between gap-2 rounded-sm bg-blue-light p-4">
<div className="flex flex-col">
Expand All @@ -13,14 +14,16 @@ const PriceInfo: React.FC<Props> = ({ price }) => {
{price} DZD
</p>
</div>
<div>
<button
onClick={() => document.getElementById("message")?.focus()}
className="rounded-sm bg-blue-primary px-3 py-1.5 text-sm text-white transition duration-200 hover:bg-blue-hover"
>
Envoyer un Message
</button>
</div>
{showSendMessage && (
<div>
<button
onClick={() => document.getElementById("message")?.focus()}
className="rounded-sm bg-blue-primary px-3 py-1.5 text-sm text-white transition duration-200 hover:bg-blue-hover"
>
Envoyer un Message
</button>
</div>
)}
</div>
);
};
Expand Down
10 changes: 8 additions & 2 deletions src/components/layout/header/ProfileMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,14 @@ const ProfileMenu = () => {
return <></>;
}
const ProfileImage = () => (
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-blue-primary text-sm font-medium text-white">
{currentUser.prenom[0]} {currentUser.nom[0]}
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-blue-hover p-1 text-sm font-medium text-white">
<img
src={`https://api.dicebear.com/5.x/bottts/svg?seed=${
currentUser.nom + currentUser.prenom + currentUser.email
}`}
alt="avatar"
className="h-full w-full rounded-full"
/>
</div>
);

Expand Down
49 changes: 49 additions & 0 deletions src/components/messages/DiscussionList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import useMessage from "../../hooks/useMessages";
import DiscussionListItem from "./DiscussionListItem";

type Props = {
selectedDiscussionId?: number;
onSelectDiscussion: (id: number) => void;
};

const DiscussionList: React.FC<Props> = ({
selectedDiscussionId,
onSelectDiscussion,
}) => {
const { discussions, loading } = useMessage();

return (
<div className="hidden h-full w-full divide-y overflow-y-auto border bg-white shadow lg:block">
{loading &&
!discussions &&
[1, 2, 3, 4, 5, 6, 7, 8, 9].map((_) => (
<div
key={_}
className="flex h-20 w-full animate-pulse cursor-pointer items-center gap-x-2 bg-blue-light px-2 py-3 transition hover:bg-opacity-50"
>
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-blue-hover text-sm font-medium text-white" />
<div className="flex flex-col gap-y-2">
<div className="h-1.5 w-40 bg-gray-300" />
<div className="h-2 w-32 bg-gray-300" />
<div className="h-1.5 w-24 bg-gray-300" />
</div>
</div>
))}
{!loading &&
discussions &&
discussions.map(({ annonce, annonceur, demandeur, id, messages }) => (
<DiscussionListItem
key={id}
annonce={annonce}
annonceur={annonceur}
demandeur={demandeur}
lastMessage={messages[messages.length - 1].contenu}
onClick={() => onSelectDiscussion(id)}
selected={selectedDiscussionId === id}
/>
))}
</div>
);
};

export default DiscussionList;
69 changes: 69 additions & 0 deletions src/components/messages/DiscussionListItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import React from "react";
import useAuth from "../../hooks/useAuth";
import { Announcement } from "../../typings/announcement";
import { Auth } from "../../typings/user";

type Props = {
onClick: () => void;
selected: boolean;
annonceur: Auth.User;
demandeur: Auth.User;
lastMessage: string;
annonce: Omit<
Announcement.Announcement,
"auteur" | "fans" | "photos" | "localisation"
>;
};

const DiscussionListItem: React.FC<Props> = ({
onClick,
selected,
annonceur,
demandeur,
lastMessage,
annonce,
}) => {
const { currentUser } = useAuth();
return (
<div
onClick={onClick}
className={`flex cursor-pointer ${
selected ? "bg-blue-light" : ""
} items-center gap-2 px-2 py-3 transition duration-300 last:!border-b hover:bg-blue-light`}
>
<div>
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-blue-hover p-1 text-sm font-medium text-white">
<img
src={`https://api.dicebear.com/5.x/bottts/svg?seed=${
annonceur.email === currentUser?.email
? demandeur.nom + demandeur.prenom + demandeur.email
: annonceur.nom + annonceur.prenom + annonceur.email
}`}
alt="avatar"
className="h-full w-full rounded-full"
/>
</div>
</div>
<div className="flex w-full flex-col gap-y-1">
<p className="w-fit text-sm font-medium text-blue-primary">
<span className="underline">
{annonceur.email === currentUser?.email && "Mon "}
Annonce:
</span>{" "}
{annonce.titre.substring(0, 40)} {annonce.titre.length > 40 && "..."}{" "}
</p>
<p className="text-sm font-medium text-slate-800">
<span className="underline">Avec:</span>{" "}
{annonceur.email === currentUser?.email
? demandeur.nom + " " + demandeur.prenom
: annonceur.nom + " " + annonceur.prenom}
</p>
<p className="text-xs text-slate-600">
{lastMessage.substring(0, 40)} {lastMessage.length > 40 && "..."}
</p>
</div>
</div>
);
};

export default DiscussionListItem;
Loading

0 comments on commit adcc429

Please sign in to comment.