+ Through the rain, flickering neon lights spell out of{" "}
+ {" "}
+ and illuminate an entrance to nightclub.
+
+
+ A stunning light show cascades across a dance floor crowded by
+ partiers and adorned by dozens of video monitors.
+
+
+ WADE HARPER, an anxious businessman dressed in a black suit,
+ follows two burly bouncers up a flight of stairs toward the{" "}
+ {" "}
+ at the back of the warehouse.
+
+ Man, yes! Didn't I tell you not to question this man! I knew
+ he was going to come through for us!" Handsome Twin #1
+ gloats.
+
+
+ Handsome Twin #2 sighs in satisfaction. "
+
+ ," he says, his tense demeanor turning to relief.
+
+
+ Wade hands the device to Handsome Twin #2.
+
+
+ "You will find all of the credentials you need on the drive.
+ The shipment will arrive at the{" "}
+ tomorrow night,” Wade explains.
-
- >
- )
- }
- ];
+ But this man seemed untouched by such conventions, and that stood out to the pastor..."
+ link=""
+ />{" "}
+ tomorrow night," Wade explains.
+
+
+ >
+ ),
+ },
+ ];
- // Add this function to validate video sources
- const isValidVideoSrc = (src: string): boolean => {
- return Boolean(src && src.length > 0);
+ const handleNextPage = useCallback(() => {
+ if (transitioning) return;
+
+ setTransitioning(true);
+
+ if (currentPageIndex < pages.length - 1) {
+ setCurrentPageIndex((prev) => prev + 1);
+ } else {
+ setCurrentPageIndex(0);
+ }
+
+ setTimeout(() => {
+ setTransitioning(false);
+ }, 1000);
+ }, [currentPageIndex, transitioning, pages.length]);
+
+ // Add previous page handler
+ const handlePreviousPage = useCallback(() => {
+ if (transitioning) return;
+
+ setTransitioning(true);
+
+ if (currentPageIndex > 0) {
+ setCurrentPageIndex((prev) => prev - 1);
+ } else {
+ setCurrentPageIndex(pages.length - 1);
+ }
+
+ setTimeout(() => {
+ setTransitioning(false);
+ }, 1000);
+ }, [currentPageIndex, transitioning, pages.length]);
+
+ // Add wheel event handler
+ const handleWheel = useCallback(
+ (event: WheelEvent) => {
+ if (transitioning) return;
+
+ // Scroll down
+ if (event.deltaY > 0) {
+ handleNextPage();
+ }
+ // Scroll up
+ else if (event.deltaY < 0) {
+ handlePreviousPage();
+ }
+ },
+ [handleNextPage, handlePreviousPage, transitioning]
+ );
+
+ // Add useEffect for wheel event listener
+ useEffect(() => {
+ window.addEventListener("wheel", handleWheel);
+ return () => {
+ window.removeEventListener("wheel", handleWheel);
};
+ }, [currentPageIndex, transitioning, handleWheel]); // Add dependencies
- useEffect(() => {
- // Start playing the current video when the page changes
- if (videoRefs.current[currentPageIndex]) {
- videoRefs.current.forEach((video, index) => {
- if (index === currentPageIndex && video) {
- video.currentTime = 0;
- video.play().catch(err => console.error("Error playing video:", err));
- } else if (video) {
- video.pause();
- }
- });
+ // Add this function to validate video sources
+ const isValidVideoSrc = (src: string): boolean => {
+ return Boolean(src && src.length > 0);
+ };
+
+ useEffect(() => {
+ // Start playing the current video when the page changes
+ if (videoRefs.current[currentPageIndex]) {
+ videoRefs.current.forEach((video, index) => {
+ if (index === currentPageIndex && video) {
+ video.currentTime = 0;
+ video
+ .play()
+ .catch((err) => console.error("Error playing video:", err));
+ } else if (video) {
+ video.pause();
}
- }, [currentPageIndex]);
+ });
+ }
+ }, [currentPageIndex]);
- const handleNextPage = () => {
- if (transitioning) return;
+ return (
+