import React, { useState } from "react"; import { Tabs, Tab } from "react-tabs-scrollable"; import "react-tabs-scrollable/dist/rts.css"; import { getHeatmapData } from "./webpage_container/StudySite"; import { pushToMouseLog } from "../core/log/SensorLogger"; import { playTabEarconSonification, playTabModelSonification, } from "../core/audio/AudioHandler"; import { Divider } from "@geist-ui/core"; var reachedEndValue = false; var rightSideEnd = true; var endElement = 0; var type = ""; function ScrollableTab({ onActiveTabChange, sonificationType, children }) { const [activeTab, setActiveTab] = useState(0); const [amountTabs, setAmountTabs] = useState(children.length); endElement = amountTabs; type = sonificationType; const saveMouseLog = function () { pushToMouseLog(getHeatmapData()); }; // define a onClick function to bind the value on tab click const onTabClick = (e, index) => { const buttonAttributes = e.target.attributes; const actionType = buttonAttributes["actionType"] ? buttonAttributes.getNamedItem("actionType").value : ""; const redirectLoc = buttonAttributes["redirectLoc"] ? buttonAttributes.getNamedItem("redirectLoc").value : ""; if (actionType === "button") { saveMouseLog(); window.location.href = redirectLoc; } setActiveTab(index); onActiveTabChange(index); }; const onHoverElement = () => {}; const onHoverTab = (key) => { const clamp = (num, min, max) => Math.min(Math.max(num, min), max); const panVal = rightSideEnd ? clamp(3 * ((-1 / amountTabs) * key + 1) - 2, -1, 1) : clamp(2 * ((-1 / amountTabs) * -1 * key + 1) - 4, -1, 1); // ((-1 / amountTabs) * key + 1); const frequencyVal = rightSideEnd ? Math.round((key / amountTabs) * key + 6) : Math.round(((key - amountTabs) / amountTabs) * (key - amountTabs) + 6); var endValueVisible = isVisible(document.getElementById(endElement)); if (endValueVisible) { reachedEndValue = true; } if (type === "model") { playTabModelSonification(panVal, frequencyVal, !rightSideEnd); } else if (type === "earcon") { playTabEarconSonification(!rightSideEnd, key, amountTabs); } if (reachedEndValue && endValueVisible) { // Chord End sound play... :) if (rightSideEnd) { endElement = 1; rightSideEnd = false; } else { endElement = amountTabs; rightSideEnd = true; } } else if (!endValueVisible) { //this.playChordSound(panVal, frequencyVal); //this.playPitchSound(panVal, 200 + 10*key); } }; // didReachEnd is bad... That is why, I have my own function... :) // This sets it to "visible", if at least some part is visible... But maybe I want to have a percentage-based thing... // If whole viewport is necessary, this makes it also bad, since a scroll all the way is required... // Not really necessary, since the user already "knows", that this is the end... const isVisible = (el) => { var rect = el.getBoundingClientRect(); return ( rect.bottom > 0 && rect.right > 0 && rect.left < (window.innerWidth || document.documentElement.clientWidth) && rect.top < (window.innerHeight || document.documentElement.clientHeight) ); }; //var keys = Array.from({ length: amountTabs }, (_, i) => i + 1); // onFocus as an additional thingy? var tabId = 0; var tabs = children.map((k) => { tabId += 1; return ( onHoverTab(tabId)} //onMouseOver={() => onHoverTab(tabId)} key={tabId} actionType={k.props.actionType} redirectLoc={k.props.redirectLoc} > {k.props.children} ); }); const tabsStyle = { position: "fixed", bottom: "0", width: "100vw", zIndex: "998", backgroundColor: "white", }; return (
{}} onTouchStart={(event) => { const eventElement = event.target; if (eventElement.nodeName === "BUTTON") { onHoverTab(eventElement.id); } }} > onHoverElement()} activeTab={activeTab} onTabClick={(e, index) => onTabClick(e, index)} > {tabs}
); } export default ScrollableTab;