From 3df94526b007f9664896d9cac2b0aec067db502d Mon Sep 17 00:00:00 2001 From: diced Date: Fri, 28 Oct 2022 17:28:15 -0700 Subject: [PATCH] feat: add more info to cards & relative time --- src/components/File.tsx | 7 ++++--- src/components/pages/Files/index.tsx | 9 ++++++++- src/components/pages/Invites.tsx | 22 +++++++++++++++++----- src/components/pages/Urls/URLCard.tsx | 18 ++++++++++++++++-- src/lib/utils/client.ts | 20 ++++++++++---------- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/components/File.tsx b/src/components/File.tsx index 112f21f..3fdeccb 100644 --- a/src/components/File.tsx +++ b/src/components/File.tsx @@ -133,14 +133,15 @@ export default function File({ image, updateImages, disableMediaPreview }) { )} {image.expires_at && ( {favoritePages.isSuccess && favoritePages.data.length ? ( - + ({ + content: { backgroundColor: t.colorScheme === 'dark' ? t.colors.dark[7] : t.colors.gray[0] }, + control: { backgroundColor: t.colorScheme === 'dark' ? t.colors.dark[7] : t.colors.gray[0] }, + })} + > Favorite Files diff --git a/src/components/pages/Invites.tsx b/src/components/pages/Invites.tsx index be7ce38..9e24fad 100644 --- a/src/components/pages/Invites.tsx +++ b/src/components/pages/Invites.tsx @@ -11,6 +11,7 @@ import { Skeleton, Stack, Title, + Tooltip, } from '@mantine/core'; import { useClipboard } from '@mantine/hooks'; import { useForm } from '@mantine/form'; @@ -21,6 +22,7 @@ import MutedText from 'components/MutedText'; import useFetch from 'hooks/useFetch'; import { useRouter } from 'next/router'; import { useEffect, useState } from 'react'; +import { relativeTime } from 'lib/utils/client'; const expires = ['30m', '1h', '6h', '12h', '1d', '3d', '5d', '7d', 'never']; @@ -117,7 +119,7 @@ function CreateInviteModal({ open, setOpen, updateInvites }) { ); } -export default function Users() { +export default function Uz2sers() { const router = useRouter(); const modals = useModals(); const clipboard = useClipboard(); @@ -198,10 +200,20 @@ export default function Users() { {invite.code} {invite.used && <> (Used)} - Created: {new Date(invite.created_at).toLocaleString()} - - Expires: {invite.expires_at ? new Date(invite.expires_at).toLocaleString() : 'Never'} - + +
+ + Created: {relativeTime(new Date(invite.created_at))} + +
+
+ +
+ + Expires: {relativeTime(new Date(invite.expires_at))} + +
+
diff --git a/src/components/pages/Urls/URLCard.tsx b/src/components/pages/Urls/URLCard.tsx index 9341f78..c7ab1a7 100644 --- a/src/components/pages/Urls/URLCard.tsx +++ b/src/components/pages/Urls/URLCard.tsx @@ -1,9 +1,12 @@ -import { ActionIcon, Card, Group, LoadingOverlay, Title } from '@mantine/core'; +import { ActionIcon, Card, Group, LoadingOverlay, Stack, Title, Tooltip } from '@mantine/core'; import { useClipboard } from '@mantine/hooks'; import { showNotification } from '@mantine/notifications'; import { CopyIcon, CrossIcon, DeleteIcon, ExternalLinkIcon } from 'components/icons'; import TrashIcon from 'components/icons/TrashIcon'; +import Link from 'components/Link'; +import MutedText from 'components/MutedText'; import { URLResponse, useURLDelete } from 'lib/queries/url'; +import { relativeTime } from 'lib/utils/client'; export default function URLCard({ url }: { url: URLResponse }) { const clipboard = useClipboard(); @@ -46,7 +49,18 @@ export default function URLCard({ url }: { url: URLResponse }) { - {url.vanity ?? url.id} + + {url.vanity ?? url.id} + +
+ Created: {relativeTime(new Date(url.created_at))} +
+
+ {url.vanity && ID: {url.id}} + + URL: {url.destination} + +
diff --git a/src/lib/utils/client.ts b/src/lib/utils/client.ts index ce0dea0..8b4c1b1 100644 --- a/src/lib/utils/client.ts +++ b/src/lib/utils/client.ts @@ -1,5 +1,10 @@ import type { Image, User } from '@prisma/client'; +import dayjs from 'dayjs'; +import duration from 'dayjs/plugin/duration'; +import dayjsRelativeTime from 'dayjs/plugin/relativeTime'; import ms, { StringValue } from 'ms'; +dayjs.extend(duration); +dayjs.extend(dayjsRelativeTime); export function parse(str: string, image: Image, user: User) { if (!str) return null; @@ -34,17 +39,12 @@ export const units = { }; export function relativeTime(to: Date, from: Date = new Date()) { - const time = new Date(to.getTime() - from.getTime()); + if (!to) return null; - const rtf = new Intl.RelativeTimeFormat('en', { style: 'long' }); - - for (const unit in units) { - if (time > units[unit]) { - return rtf.format( - Math.floor(Math.round(time.getTime() / units[unit])), - (unit as Intl.RelativeTimeFormatUnit) || 'second' - ); - } + if (to.getTime() < from.getTime()) { + return dayjs(to).from(from); + } else { + return dayjs(from).to(to); } }