jabb-astro-components
Version:
UI Components for web development
66 lines (56 loc) • 2.05 kB
text/typescript
import { useState, useEffect } from "react";
function useTransitionSides(
ref: React.RefObject<HTMLElement | null>,
rev: boolean
) {
const [isVisible, setIsVisible] = useState(false);
const [hasTransitioned, setHasTransitioned] = useState(false);
useEffect(() => {
if (!hasTransitioned && ref.current) {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true);
setHasTransitioned(true);
observer.disconnect();
}
});
observer.observe(ref.current);
return () => observer.disconnect();
}
}, [ref, rev, hasTransitioned]);
const transitionClasses = `relative transition-all duration-700 ${
isVisible
? rev
? "left-[0%]"
: "right-[0%]"
: rev
? "left-[-50%]"
: "right-[-50%]"
} opacity-${isVisible ? 100 : 0}`;
return transitionClasses;
}
function useTransitionUp(ref: React.RefObject<HTMLElement | null>) {
const [isVisible, setIsVisible] = useState(false);
const [hasTransitioned, setHasTransitioned] = useState(false);
useEffect(() => {
if (!hasTransitioned && ref.current) {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setIsVisible(true);
setHasTransitioned(true);
observer.disconnect();
}
});
observer.observe(ref.current);
return () => observer.disconnect();
}
}, [ref, hasTransitioned]);
const transitionClasses = `relative transition-all duration-700 ${
isVisible ? "mt-0" : "mt-10"
} opacity-${isVisible ? 100 : 0}`;
return transitionClasses;
}
export default {
useTransitionSides,
useTransitionUp,
};