format phone number and clamp message preview to 2 lines in conversations list
This commit is contained in:
parent
1c93ac00ef
commit
5e9aa2e5a4
@ -1,4 +1,7 @@
|
|||||||
import { Link, useQuery, Routes } from "blitz";
|
import { Link, useQuery, Routes } from "blitz";
|
||||||
|
import { DateTime } from "luxon";
|
||||||
|
import { faChevronRight } from "@fortawesome/pro-regular-svg-icons";
|
||||||
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
|
||||||
import getConversationsQuery from "../queries/get-conversations";
|
import getConversationsQuery from "../queries/get-conversations";
|
||||||
|
|
||||||
@ -14,7 +17,7 @@ export default function ConversationsList() {
|
|||||||
{Object.entries(conversations).map(([recipient, messages]) => {
|
{Object.entries(conversations).map(([recipient, messages]) => {
|
||||||
const lastMessage = messages[messages.length - 1]!;
|
const lastMessage = messages[messages.length - 1]!;
|
||||||
return (
|
return (
|
||||||
<li key={recipient} className="py-2">
|
<li key={recipient} className="py-2 p-4">
|
||||||
<Link
|
<Link
|
||||||
href={Routes.ConversationPage({
|
href={Routes.ConversationPage({
|
||||||
recipient: encodeURIComponent(recipient),
|
recipient: encodeURIComponent(recipient),
|
||||||
@ -23,9 +26,12 @@ export default function ConversationsList() {
|
|||||||
<a className="flex flex-col">
|
<a className="flex flex-col">
|
||||||
<div className="flex flex-row justify-between">
|
<div className="flex flex-row justify-between">
|
||||||
<strong>{recipient}</strong>
|
<strong>{recipient}</strong>
|
||||||
<div>{new Date(lastMessage.sentAt).toLocaleString("fr-FR")}</div>
|
<div className="text-gray-700 flex flex-row gap-x-1">
|
||||||
|
{formatMessageDate(lastMessage.sentAt)}
|
||||||
|
<FontAwesomeIcon className="w-4 h-4 my-auto" icon={faChevronRight} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>{lastMessage.content}</div>
|
<div className="line-clamp-2 text-gray-700">{lastMessage.content}</div>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
@ -34,3 +40,20 @@ export default function ConversationsList() {
|
|||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatMessageDate(date: Date): string {
|
||||||
|
const messageDate = DateTime.fromJSDate(date);
|
||||||
|
const diff = messageDate.diffNow("days");
|
||||||
|
|
||||||
|
const isToday = diff.days > -1;
|
||||||
|
if (isToday) {
|
||||||
|
return messageDate.toFormat("HH:mm", { locale: "fr-FR" });
|
||||||
|
}
|
||||||
|
|
||||||
|
const isDuringLastWeek = diff.days > -8;
|
||||||
|
if (isDuringLastWeek) {
|
||||||
|
return messageDate.weekdayLong;
|
||||||
|
}
|
||||||
|
|
||||||
|
return messageDate.toFormat("dd/MM/yyyy", { locale: "fr-FR" });
|
||||||
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { resolver, NotFoundError } from "blitz";
|
import { resolver, NotFoundError } from "blitz";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
import PhoneNumber from "awesome-phonenumber";
|
||||||
|
|
||||||
import db, { Direction, Message, Prisma } from "../../../db";
|
import db, { Direction, Message, Prisma } from "../../../db";
|
||||||
import { decrypt } from "../../../db/_encryption";
|
import { decrypt } from "../../../db/_encryption";
|
||||||
@ -33,6 +34,8 @@ export default resolver.pipe(
|
|||||||
} else {
|
} else {
|
||||||
recipient = message.from;
|
recipient = message.from;
|
||||||
}
|
}
|
||||||
|
const parsedPhoneNumber = new PhoneNumber(recipient);
|
||||||
|
recipient = parsedPhoneNumber.getNumber("international");
|
||||||
|
|
||||||
if (!conversations[recipient]) {
|
if (!conversations[recipient]) {
|
||||||
conversations[recipient] = [];
|
conversations[recipient] = [];
|
||||||
|
29
package-lock.json
generated
29
package-lock.json
generated
@ -3955,6 +3955,11 @@
|
|||||||
"mini-svg-data-uri": "^1.2.3"
|
"mini-svg-data-uri": "^1.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@tailwindcss/line-clamp": {
|
||||||
|
"version": "0.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.2.1.tgz",
|
||||||
|
"integrity": "sha512-Hq2KJY1+T2v7jw/mnT3mnC7CKbp5kj1XTqzSb2xbEt1j+JkxIR6N3ijsN/WevZtsKJfVE1KOejA/3IRKuhZEsQ=="
|
||||||
|
},
|
||||||
"@tailwindcss/typography": {
|
"@tailwindcss/typography": {
|
||||||
"version": "0.4.1",
|
"version": "0.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.1.tgz",
|
||||||
@ -4340,6 +4345,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
|
||||||
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
|
"integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
|
||||||
},
|
},
|
||||||
|
"@types/luxon": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-EqwKd+cuzQ6Jz/zsFYOofHzSfZSh1x3eBBj9+2IYk5vF3I1JnysPFK/I0YnkJ0artgvVY3jJYf2fGdIzoK0UIA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/mdast": {
|
"@types/mdast": {
|
||||||
"version": "3.0.8",
|
"version": "3.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.8.tgz",
|
||||||
@ -5227,6 +5238,11 @@
|
|||||||
"queue-microtask": "^1.1.2"
|
"queue-microtask": "^1.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"awesome-phonenumber": {
|
||||||
|
"version": "2.57.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/awesome-phonenumber/-/awesome-phonenumber-2.57.0.tgz",
|
||||||
|
"integrity": "sha512-RWrCCQpnmkYeL3AGFdlUOpWkpkTauZm7FE9kgDz6xJG6PNUiiIm+rKI95wnre0TSV01PHvgFFwQZhDixPCM9ZA=="
|
||||||
|
},
|
||||||
"axe-core": {
|
"axe-core": {
|
||||||
"version": "4.3.2",
|
"version": "4.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.2.tgz",
|
||||||
@ -7241,6 +7257,13 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"is-nan": "^1.3.2",
|
"is-nan": "^1.3.2",
|
||||||
"luxon": "^1.26.0"
|
"luxon": "^1.26.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"luxon": {
|
||||||
|
"version": "1.28.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
|
||||||
|
"integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ=="
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cross-fetch": {
|
"cross-fetch": {
|
||||||
@ -13424,9 +13447,9 @@
|
|||||||
"integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
|
"integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0="
|
||||||
},
|
},
|
||||||
"luxon": {
|
"luxon": {
|
||||||
"version": "1.28.0",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/luxon/-/luxon-2.0.2.tgz",
|
||||||
"integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ=="
|
"integrity": "sha512-ZRioYLCgRHrtTORaZX1mx+jtxKtKuI5ZDvHNAmqpUzGqSrR+tL4FVLn/CUGMA3h0+AKD1MAxGI5GnCqR5txNqg=="
|
||||||
},
|
},
|
||||||
"lz-string": {
|
"lz-string": {
|
||||||
"version": "1.4.4",
|
"version": "1.4.4",
|
||||||
|
@ -49,12 +49,15 @@
|
|||||||
"@prisma/client": "2.29.1",
|
"@prisma/client": "2.29.1",
|
||||||
"@react-aria/interactions": "3.5.1",
|
"@react-aria/interactions": "3.5.1",
|
||||||
"@tailwindcss/forms": "0.3.3",
|
"@tailwindcss/forms": "0.3.3",
|
||||||
|
"@tailwindcss/line-clamp": "0.2.1",
|
||||||
"@tailwindcss/typography": "0.4.1",
|
"@tailwindcss/typography": "0.4.1",
|
||||||
"@twilio/voice-sdk": "2.0.1",
|
"@twilio/voice-sdk": "2.0.1",
|
||||||
|
"awesome-phonenumber": "2.57.0",
|
||||||
"blitz": "0.38.6",
|
"blitz": "0.38.6",
|
||||||
"clsx": "1.1.1",
|
"clsx": "1.1.1",
|
||||||
"got": "11.8.2",
|
"got": "11.8.2",
|
||||||
"jotai": "1.3.0",
|
"jotai": "1.3.0",
|
||||||
|
"luxon": "2.0.2",
|
||||||
"next-pwa": "5.3.1",
|
"next-pwa": "5.3.1",
|
||||||
"pino": "6.13.0",
|
"pino": "6.13.0",
|
||||||
"pino-pretty": "5.1.3",
|
"pino-pretty": "5.1.3",
|
||||||
@ -73,6 +76,7 @@
|
|||||||
"zod": "3.7.3"
|
"zod": "3.7.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/luxon": "2.0.1",
|
||||||
"@types/pino": "6.3.11",
|
"@types/pino": "6.3.11",
|
||||||
"@types/preview-email": "2.0.1",
|
"@types/preview-email": "2.0.1",
|
||||||
"@types/react": "17.0.19",
|
"@types/react": "17.0.19",
|
||||||
|
@ -146,6 +146,6 @@ module.exports = {
|
|||||||
translate: ["group-hover"],
|
translate: ["group-hover"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [require("@tailwindcss/forms"), require("@tailwindcss/typography")],
|
plugins: [require("@tailwindcss/line-clamp"), require("@tailwindcss/forms"), require("@tailwindcss/typography")],
|
||||||
purge: ["{pages,app}/**/*.{js,ts,jsx,tsx}"],
|
purge: ["{pages,app}/**/*.{js,ts,jsx,tsx}"],
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user