Skip to content

Commit

Permalink
Merge pull request #1369 from SocialGouv/feat/us-2593-acceder-message…
Browse files Browse the repository at this point in the history
…-post-recherche

Feat/us 2593 acceder message post recherche
  • Loading branch information
arthurlbrjc committed Jun 11, 2024
2 parents d8c682d + 8320f89 commit 27f0bcc
Show file tree
Hide file tree
Showing 8 changed files with 593 additions and 102 deletions.
62 changes: 42 additions & 20 deletions clients/firebase.client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ export async function updateMessage(
status: data.status,
}
const historyEntry = {
date: Timestamp.fromDate(data.date.toJSDate()),
date: toTimestamp(data.date),
previousContent: data.oldMessage,
}

Expand Down Expand Up @@ -493,6 +493,28 @@ export async function rechercherMessages(
)
}

export async function getMessagesPeriode(
idChat: string,
debut: DateTime,
fin: DateTime
): Promise<Message[]> {
const chatRef = getChatReference(idChat)
const querySnapshots: QuerySnapshot<FirebaseMessage, FirebaseMessage> =
await getDocs(
query<FirebaseMessage, FirebaseMessage>(
collection(chatRef, 'messages') as CollectionReference<
FirebaseMessage,
FirebaseMessage
>,
where('creationDate', '>=', toTimestamp(debut)),
where('creationDate', '<=', toTimestamp(fin)),
orderBy('creationDate', 'asc')
)
)

return querySnapshots.docs.map(docSnapshotToMessage)
}

function retrieveApp() {
const appAlreadyInitialized: number = getApps().length
if (!appAlreadyInitialized) {
Expand Down Expand Up @@ -600,7 +622,7 @@ function createFirebaseMessage(
iv,
conseillerId: data.idConseiller,
sentBy: UserType.CONSEILLER.toLowerCase(),
creationDate: Timestamp.fromMillis(data.date.toMillis()),
creationDate: toTimestamp(data.date),
type,
}

Expand Down Expand Up @@ -632,8 +654,8 @@ function createFirebaseMessageImportant(
content: encryptedText,
iv,
idConseiller: data.idConseiller,
dateDebut: Timestamp.fromMillis(data.dateDebut.toMillis()),
dateFin: Timestamp.fromMillis(data.dateFin.toMillis()),
dateDebut: toTimestamp(data.dateDebut),
dateFin: toTimestamp(data.dateFin),
}

return firebaseMessage
Expand Down Expand Up @@ -706,22 +728,18 @@ export function chatToFirebase(chat: Partial<Chat>): Partial<FirebaseChat> {
firebaseChatToUpdate.lastMessageContent = chat.lastMessageContent
}
if (chat.lastMessageSentAt) {
firebaseChatToUpdate.lastMessageSentAt = Timestamp.fromMillis(
chat.lastMessageSentAt.toMillis()
)
firebaseChatToUpdate.lastMessageSentAt = toTimestamp(chat.lastMessageSentAt)
}
if (chat.lastMessageSentBy) {
firebaseChatToUpdate.lastMessageSentBy = chat.lastMessageSentBy
}
if (chat.lastConseillerReading) {
firebaseChatToUpdate.lastConseillerReading = Timestamp.fromMillis(
chat.lastConseillerReading.toMillis()
firebaseChatToUpdate.lastConseillerReading = toTimestamp(
chat.lastConseillerReading
)
}
if (chat.lastJeuneReading) {
firebaseChatToUpdate.lastJeuneReading = Timestamp.fromMillis(
chat.lastJeuneReading.toMillis()
)
firebaseChatToUpdate.lastJeuneReading = toTimestamp(chat.lastJeuneReading)
}
if (chat.lastMessageIv) {
firebaseChatToUpdate.lastMessageIv = chat.lastMessageIv
Expand All @@ -734,6 +752,13 @@ export function chatToFirebase(chat: Partial<Chat>): Partial<FirebaseChat> {
return firebaseChatToUpdate
}

export function docSnapshotToMessage(
docSnapshot: QueryDocumentSnapshot<FirebaseMessage>
): Message {
const firebaseMessage = docSnapshot.data()
return firebaseMessageToMessage(firebaseMessage, docSnapshot.id)
}

function chatFromFirebase(chatId: string, firebaseChat: FirebaseChat): Chat {
return {
chatId: chatId,
Expand All @@ -755,14 +780,7 @@ function chatFromFirebase(chatId: string, firebaseChat: FirebaseChat): Chat {
}
}

export function docSnapshotToMessage(
docSnapshot: QueryDocumentSnapshot<FirebaseMessage>
): Message {
const firebaseMessage = docSnapshot.data()
return firebaseMessageToMessage(firebaseMessage, docSnapshot.id)
}

export function firebaseMessageToMessage(
function firebaseMessageToMessage(
firebaseMessage: FirebaseMessage,
id: string
): Message {
Expand Down Expand Up @@ -865,3 +883,7 @@ function firebaseToMessageType(
return TypeMessage.MESSAGE
}
}

function toTimestamp(date: DateTime): Timestamp {
return Timestamp.fromDate(date.toJSDate())
}
51 changes: 40 additions & 11 deletions components/chat/DisplayMessageBeneficiaire.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,27 @@ import LienSessionMilo from 'components/chat/LienSessionMilo'
import TexteAvecLien from 'components/chat/TexteAvecLien'
import { SpinningLoader } from 'components/ui/SpinningLoader'
import { isDeleted, isEdited, Message, TypeMessage } from 'interfaces/message'
import { toFrenchTime, toShortDate } from 'utils/date'
import { toFrenchTime, toLongMonthDate, toShortDate } from 'utils/date'

interface DisplayMessageBeneficiaireProps {
type MessageBeneficiaireProps = {
message: Message
beneficiaireNomComplet: string
estResultatDeRecherche?: boolean
}

export default function DisplayMessageBeneficiaire({
message,
beneficiaireNomComplet,
estResultatDeRecherche,
}: DisplayMessageBeneficiaireProps) {
type ResultatRechercheProps = MessageBeneficiaireProps & {
estResultatDeRecherche: true
onAllerAuMessage: () => void
}

type DisplayMessageBeneficiaireProps =
| MessageBeneficiaireProps
| ResultatRechercheProps

export default function DisplayMessageBeneficiaire(
props: DisplayMessageBeneficiaireProps
) {
const { message, beneficiaireNomComplet } = props

return (
<li className='mb-5' id={message.id} data-testid={message.id}>
{isDeleted(message) && (
Expand Down Expand Up @@ -68,9 +76,21 @@ export default function DisplayMessageBeneficiaire({
infoEvenementEmploi={message.infoEvenementEmploi}
/>
)}

{isResultatRecherche(props) && (
<button
className='underline pt-4 text-base-medium'
onClick={props.onAllerAuMessage}
>
Aller au message
<span className='sr-only'>
du {toLongMonthDate(message.creationDate)}
</span>
</button>
)}
</div>
<div className='text-xs-medium text-content text-left'>
{!estResultatDeRecherche && (
{!isResultatRecherche(props) && (
<>
<span className='sr-only'>Envoyé à </span>
<span
Expand All @@ -83,8 +103,11 @@ export default function DisplayMessageBeneficiaire({
{isEdited(message) && ' · Modifié'}
</>
)}
{estResultatDeRecherche && (
<span>Le {toShortDate(message.creationDate)}</span>

{isResultatRecherche(props) && (
<span aria-label={`Le ${toLongMonthDate(message.creationDate)}`}>
Le {toShortDate(message.creationDate)}
</span>
)}
</div>
</>
Expand Down Expand Up @@ -142,3 +165,9 @@ function MessagePJ({
return <SpinningLoader className='w-6 h-6 mr-2 fill-primary_lighten' />
}
}

function isResultatRecherche(
props: DisplayMessageBeneficiaireProps
): props is ResultatRechercheProps {
return Object.prototype.hasOwnProperty.call(props, 'estResultatDeRecherche')
}
77 changes: 43 additions & 34 deletions components/chat/DisplayMessageConseiller.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,37 +10,40 @@ import TexteAvecLien from 'components/chat/TexteAvecLien'
import IconComponent, { IconName } from 'components/ui/IconComponent'
import { SpinningLoader } from 'components/ui/SpinningLoader'
import { isDeleted, isEdited, Message, TypeMessage } from 'interfaces/message'
import { toFrenchDateTime, toFrenchTime, toShortDate } from 'utils/date'
import {
toFrenchDateTime,
toFrenchTime,
toLongMonthDate,
toShortDate,
} from 'utils/date'

type DisplayMessageConseillerProps = ResultatRecherche | MessageConseillerProps

interface ResultatRecherche {
type Base = {
message: Message
conseillerNomComplet: string | undefined
isConseillerCourant: boolean
}

type ResultatRechercheProps = Base & {
isEnCoursDeModification: false
estResultatDeRecherche: true
onAllerAuMessage: () => void
}

interface MessageConseillerProps {
message: Message
conseillerNomComplet: string | undefined
type MessageConseillerProps = Base & {
lastSeenByJeune: DateTime | undefined
isConseillerCourant: boolean
onSuppression: () => Promise<void>
onModification: () => void
isEnCoursDeModification: boolean
}

type DisplayMessageConseillerProps =
| ResultatRechercheProps
| MessageConseillerProps

export default function DisplayMessageConseiller(
props: DisplayMessageConseillerProps
) {
const {
message,
conseillerNomComplet,
isConseillerCourant,
isEnCoursDeModification,
} = props
const { message } = props

const [editionEnCours, setEditionEnCours] = useState<boolean>(false)

Expand All @@ -67,12 +70,7 @@ export default function DisplayMessageConseiller(

{!isDeleted(message) && (
<>
<MessageConseiller
message={message}
conseillerNomComplet={conseillerNomComplet}
isConseillerCourant={isConseillerCourant}
isEnCoursDeModification={isEnCoursDeModification}
/>
<MessageConseiller {...props} />

{!isResultatRecherche(props) && (
<FooterMessage
Expand All @@ -85,7 +83,10 @@ export default function DisplayMessageConseiller(
)}

{isResultatRecherche(props) && (
<span className='flex justify-end text-xs-medium text-content'>
<span
className='flex justify-end text-xs-medium text-content'
aria-label={`Le ${toLongMonthDate(message.creationDate)}`}
>
Le {toShortDate(message.creationDate)}
</span>
)}
Expand All @@ -105,18 +106,14 @@ function MessageSupprime() {
)
}

function MessageConseiller({
message,
conseillerNomComplet,
isConseillerCourant,
isEnCoursDeModification,
}: Pick<
DisplayMessageConseillerProps,
| 'message'
| 'conseillerNomComplet'
| 'isConseillerCourant'
| 'isEnCoursDeModification'
>) {
function MessageConseiller(props: DisplayMessageConseillerProps) {
const {
message,
conseillerNomComplet,
isConseillerCourant,
isEnCoursDeModification,
} = props

return (
<div
className={`text-base-regular break-words max-w-[90%] p-4 rounded-base w-max text-left bg-blanc mt-0 mr-0 mb-1 ml-auto ${
Expand Down Expand Up @@ -160,6 +157,18 @@ function MessageConseiller({
className='fill-primary'
/>
))}

{isResultatRecherche(props) && (
<button
className='underline pt-4 text-base-medium'
onClick={props.onAllerAuMessage}
>
Aller au message
<span className='sr-only'>
du {toLongMonthDate(message.creationDate)}
</span>
</button>
)}
</div>
)
}
Expand Down Expand Up @@ -270,6 +279,6 @@ function FooterMessage({

function isResultatRecherche(
props: DisplayMessageConseillerProps
): props is ResultatRecherche {
): props is ResultatRechercheProps {
return Object.prototype.hasOwnProperty.call(props, 'estResultatDeRecherche')
}
Loading

0 comments on commit 27f0bcc

Please sign in to comment.