mirror of
https://github.com/hanzo-apps/dataroom.git
synced 2026-10-30 14:47:36 +00:00
171 lines
4.0 KiB
TypeScript
171 lines
4.0 KiB
TypeScript
import { useEffect, useRef } from "react";
|
|
|
|
import { useSafePageViewTracker } from "@/lib/tracking/safe-page-view-tracker";
|
|
import { getTrackingOptions } from "@/lib/tracking/tracking-config";
|
|
|
|
import Nav, { TNavData } from "../nav";
|
|
import { AwayPoster } from "./away-poster";
|
|
|
|
export default function AdvancedExcelViewer({
|
|
file,
|
|
versionNumber,
|
|
navData,
|
|
}: {
|
|
file: string;
|
|
versionNumber: number;
|
|
navData: TNavData;
|
|
}) {
|
|
const { linkId, documentId, viewId, isPreview, dataroomId, brand } = navData;
|
|
const pageNumber = 1;
|
|
|
|
const startTimeRef = useRef(Date.now());
|
|
const visibilityRef = useRef<boolean>(true);
|
|
|
|
const {
|
|
trackPageViewSafely,
|
|
resetTrackingState,
|
|
startIntervalTracking,
|
|
stopIntervalTracking,
|
|
getActiveDuration,
|
|
isInactive,
|
|
updateActivity,
|
|
} = useSafePageViewTracker({
|
|
...getTrackingOptions(),
|
|
externalStartTimeRef: startTimeRef,
|
|
});
|
|
|
|
// Start interval tracking when component mounts
|
|
useEffect(() => {
|
|
const trackingData = {
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
};
|
|
|
|
startIntervalTracking(trackingData);
|
|
|
|
return () => {
|
|
stopIntervalTracking();
|
|
};
|
|
}, [
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
startIntervalTracking,
|
|
stopIntervalTracking,
|
|
]);
|
|
|
|
useEffect(() => {
|
|
const handleVisibilityChange = () => {
|
|
if (document.visibilityState === "visible") {
|
|
visibilityRef.current = true;
|
|
resetTrackingState();
|
|
const trackingData = {
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
};
|
|
startIntervalTracking(trackingData);
|
|
} else {
|
|
visibilityRef.current = false;
|
|
stopIntervalTracking();
|
|
const duration = getActiveDuration();
|
|
if (duration > 0) {
|
|
trackPageViewSafely(
|
|
{
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
duration,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
},
|
|
true,
|
|
);
|
|
}
|
|
}
|
|
};
|
|
|
|
const handleBeforeUnload = () => {
|
|
stopIntervalTracking();
|
|
const duration = getActiveDuration();
|
|
if (duration > 0) {
|
|
trackPageViewSafely(
|
|
{
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
duration,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
},
|
|
true,
|
|
);
|
|
}
|
|
};
|
|
|
|
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
window.addEventListener("beforeunload", handleBeforeUnload);
|
|
|
|
return () => {
|
|
document.removeEventListener("visibilitychange", handleVisibilityChange);
|
|
window.removeEventListener("beforeunload", handleBeforeUnload);
|
|
};
|
|
}, [
|
|
linkId,
|
|
documentId,
|
|
viewId,
|
|
pageNumber,
|
|
versionNumber,
|
|
dataroomId,
|
|
isPreview,
|
|
trackPageViewSafely,
|
|
resetTrackingState,
|
|
startIntervalTracking,
|
|
stopIntervalTracking,
|
|
getActiveDuration,
|
|
]);
|
|
|
|
return (
|
|
<>
|
|
<Nav type="sheet" navData={navData} />
|
|
<div
|
|
style={{ height: "calc(100dvh - 64px)" }}
|
|
className="relative mx-2 flex h-screen flex-col sm:mx-6 lg:mx-8"
|
|
>
|
|
<iframe
|
|
className="h-full w-full"
|
|
src={`https://view.officeapps.live.com/op/embed.aspx?src=${file}&wdPrint=0&action=embedview&wdAllowInteractivity=False`}
|
|
></iframe>
|
|
<div
|
|
className="absolute bottom-0 left-0 right-0 z-50 h-[26px] bg-gray-950"
|
|
style={{
|
|
background: brand?.accentColor || "rgb(3, 7, 18)",
|
|
}}
|
|
/>
|
|
</div>
|
|
<AwayPoster
|
|
isVisible={isInactive}
|
|
inactivityThreshold={getTrackingOptions().inactivityThreshold}
|
|
onDismiss={updateActivity}
|
|
/>
|
|
</>
|
|
);
|
|
}
|