28 lines
		
	
	
		
			770 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			770 B
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import clsx from "clsx";
 | |
| import { ReactNode } from "react";
 | |
| import { useClient } from "#hooks";
 | |
| import { LoadingIcon } from "../loading/loading_icon";
 | |
| 
 | |
| interface IProps {
 | |
|   time: string;
 | |
|   isRelative?: boolean;
 | |
|   className?: string;
 | |
|   children?: ReactNode;
 | |
| }
 | |
| 
 | |
| export function Timestamp({ time, isRelative, className, children }: IProps) {
 | |
|   if (time === null) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   const isClient = useClient();
 | |
|   let dateTime = new Date(time);
 | |
|   let formatted = `${dateTime.getFullYear()}-${(dateTime.getMonth() + 1).toString().padStart(2, "0")}-${dateTime.getDate().toString().padStart(2, "0")}`;
 | |
| 
 | |
|   return (
 | |
|     <time className={clsx("timestamp", className)} dateTime={time} title={time}>
 | |
|       {!isClient ? <LoadingIcon /> : children ?? formatted}
 | |
|     </time>
 | |
|   );
 | |
| }
 |