@@ -2,7 +2,7 @@ import { GlobeAltIcon, GlobeAmericasIcon } from "@heroicons/react/20/solid";
22import { useRouteLoaderData } from "@remix-run/react" ;
33import { formatDistanceToNow } from "date-fns" ;
44import { Laptop } from "lucide-react" ;
5- import { memo , type ReactNode , useMemo , useSyncExternalStore } from "react" ;
5+ import { memo , type ReactNode , useEffect , useMemo , useState , useSyncExternalStore } from "react" ;
66import { CopyButton } from "./CopyButton" ;
77import { useLocales } from "./LocaleProvider" ;
88import { Paragraph } from "./Paragraph" ;
@@ -363,15 +363,30 @@ type RelativeDateTimeProps = {
363363 timeZone ?: string ;
364364} ;
365365
366+ function getRelativeText ( date : Date ) : string {
367+ const text = formatDistanceToNow ( date , { addSuffix : true } ) ;
368+ return text . charAt ( 0 ) . toUpperCase ( ) + text . slice ( 1 ) ;
369+ }
370+
366371export const RelativeDateTime = ( { date, timeZone } : RelativeDateTimeProps ) => {
367372 const locales = useLocales ( ) ;
368373 const userTimeZone = useUserTimeZone ( ) ;
369374
370375 const realDate = useMemo ( ( ) => ( typeof date === "string" ? new Date ( date ) : date ) , [ date ] ) ;
371376
372- const relativeText = useMemo ( ( ) => {
373- const text = formatDistanceToNow ( realDate , { addSuffix : true } ) ;
374- return text . charAt ( 0 ) . toUpperCase ( ) + text . slice ( 1 ) ;
377+ const [ relativeText , setRelativeText ] = useState ( "" ) ;
378+
379+ // Every 60s refresh
380+ useEffect ( ( ) => {
381+ const interval = setInterval ( ( ) => {
382+ setRelativeText ( getRelativeText ( realDate ) ) ;
383+ } , 60_000 ) ;
384+ return ( ) => clearInterval ( interval ) ;
385+ } , [ realDate ] ) ;
386+
387+ // On first render
388+ useEffect ( ( ) => {
389+ setRelativeText ( getRelativeText ( realDate ) ) ;
375390 } , [ realDate ] ) ;
376391
377392 return (
0 commit comments