mirror of https://github.com/MaxLeiter/Drift
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
import { Badge, Tooltip } from "@geist-ui/core";
 | 
						|
import { timeUntil } from "@lib/time-ago";
 | 
						|
import { useCallback, useEffect, useMemo, useState } from "react";
 | 
						|
 | 
						|
const ExpirationBadge = ({
 | 
						|
    postExpirationDate,
 | 
						|
    onExpires
 | 
						|
}: {
 | 
						|
    postExpirationDate: Date | string | null
 | 
						|
    onExpires?: () => void
 | 
						|
}) => {
 | 
						|
    const expirationDate = useMemo(() => postExpirationDate ? new Date(postExpirationDate) : null, [postExpirationDate])
 | 
						|
    const [timeUntilString, setTimeUntil] = useState<string | null>(expirationDate ? timeUntil(expirationDate) : null);
 | 
						|
 | 
						|
    useEffect(() => {
 | 
						|
        let interval: NodeJS.Timer | null = null;
 | 
						|
        if (expirationDate) {
 | 
						|
            interval = setInterval(() => {
 | 
						|
                if (expirationDate) {
 | 
						|
                    setTimeUntil(timeUntil(expirationDate))
 | 
						|
                }
 | 
						|
            }, 1000)
 | 
						|
        }
 | 
						|
 | 
						|
        return () => {
 | 
						|
            if (interval) {
 | 
						|
                clearInterval(interval)
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }, [expirationDate])
 | 
						|
 | 
						|
    const isExpired = useMemo(() => {
 | 
						|
        return timeUntilString && timeUntilString === "in 0 seconds"
 | 
						|
    }, [timeUntilString])
 | 
						|
 | 
						|
    useEffect(() => {
 | 
						|
        // check if expired every 
 | 
						|
        if (isExpired) {
 | 
						|
            if (onExpires) {
 | 
						|
                onExpires();
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }, [isExpired, onExpires])
 | 
						|
 | 
						|
    if (!expirationDate) {
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    return (
 | 
						|
        <Badge type={isExpired ? "error" : "warning"}>
 | 
						|
            <Tooltip
 | 
						|
                text={`${expirationDate.toLocaleDateString()} ${expirationDate.toLocaleTimeString()}`}>
 | 
						|
                {isExpired ? "Expired" : `Expires ${timeUntilString}`}
 | 
						|
            </Tooltip>
 | 
						|
        </Badge>
 | 
						|
    )
 | 
						|
}
 | 
						|
 | 
						|
export default ExpirationBadge |