import React from 'react';
import { useRef } from 'react';
import gsap from 'gsap';
import { useGSAP } from '@gsap/react';
import { ScrollTrigger } from 'gsap/ScrollTrigger';
gsap.registerPlugin(useGSAP);
export default function Apps() {
const sectionsRef = useRef([]);
const section2BoxRef = useRef(null);
useGSAP(() => {
const viewportWidth = window.innerWidth;
if (viewportWidth >= 1024) {
let visualTimeline = gsap.timeline({
scrollTrigger: {
trigger: sectionsRef.current[1],
start: 'top+=1000px top',
end: 'center 50%',
invalidateOnRefresh: true,
pinnedContainer: sectionsRef.current[1],
markers: true,
toggleActions: 'play none none reverse',
},
});
visualTimeline.add(() => {}, '0.1');
visualTimeline
.to(section2BoxRef.current, {
width: '100%',
height: '100%',
borderRadius: '0',
ease: 'none',
top: '352px',
})
.to(section2BoxRef.current, {
position: 'absolute',
top: '0',
height: '100vh',
})
.to(section2BoxRef.current, {
scale: 1,
});
ScrollTrigger.create({
trigger: sectionsRef.current[1],
start: 'top top',
end: 'bottom+=2500px top',
pin: true,
});
}
});
return (
<main>
<section
className="section section1"
ref={(el) => (sectionsRef.current[0] = el)}
>
<h2>
Lorem Ipsum is ~
</h2>
</section>
<section
className="section section2"
ref={(el) => (sectionsRef.current[1] = el)}
>
<h2>pinned text</h2>
<div className="boxWrapper">
<div className="box" ref={section2BoxRef}>
box
</div>
</div>
</section>
<section
className="section section3"
ref={(el) => (sectionsRef.current[2] = el)}
>
<h2>
Lorem Ipsum is ~
</h2>
</section>
</main>
);
}
Im declaring a constant named viewportWidth and assigning it the value of the current inner width of the window.
However, this code is only working when refreshing on mobile.
I don't see any React examples for 'matchMedia()', is it possible to use it in React?