Browse Source

feat: Added Button/Modal functionality.

master
Denis Thiessen 5 months ago
parent
commit
3303c4c282
  1. 18
      src/components/PopupModal.jsx
  2. 135
      src/components/ScrollableTab.jsx
  3. 60
      src/pages/study_site_2/StartPage2.jsx
  4. 45
      src/pages/study_site_2/TourOperators.jsx

18
src/components/PopupModal.jsx

@ -0,0 +1,18 @@
import React from "react";
import { Modal } from "@geist-ui/core";
function PopupModal({ visible, closeHandler }) {
return (
<Modal visible={visible} onClose={closeHandler}>
<Modal.Title>Modal</Modal.Title>
<Modal.Content>
<p>Some content contained within the modal.</p>
</Modal.Content>
<Modal.Action passive onClick={closeHandler}>
Close
</Modal.Action>
</Modal>
);
}
export default PopupModal;

135
src/components/ScrollableTab.jsx

@ -1,30 +1,58 @@
import React from "react";
import React, { useState } from "react";
import ReactDOM from "react-dom";
import { Tabs, Tab } from "react-tabs-scrollable"; import { Tabs, Tab } from "react-tabs-scrollable";
import "react-tabs-scrollable/dist/rts.css"; import "react-tabs-scrollable/dist/rts.css";
import { Modal } from "@geist-ui/core";
import PopupModal from "./PopupModal";
var amountTabs = 0; var amountTabs = 0;
var reachedEndValue = false; var reachedEndValue = false;
var rightSideEnd = true; var rightSideEnd = true;
var endElement = amountTabs; var endElement = amountTabs;
export default class ScrollableTab extends React.Component {
//extends AudioPlayer {
constructor(props) {
super(props);
this.state = {
activeTab: 1,
};
}
function ScrollableTab({ children }) {
const [activeTab, setActiveTab] = useState(1);
const [modalVisible, setModalVisible] = useState(false);
// define a onClick function to bind the value on tab click // define a onClick function to bind the value on tab click
onTabClick(e, index) {
this.setState({ activeTab: index });
}
const onTabClick = (e, index) => {
const buttonAttributes = e.target.attributes;
console.log(buttonAttributes);
const actionType = buttonAttributes["actionType"]
? buttonAttributes.getNamedItem("actionType").value
: "";
const redirectLoc = buttonAttributes["redirectLoc"]
? buttonAttributes.getNamedItem("redirectLoc").value
: "";
console.log(actionType);
console.log(redirectLoc);
if (actionType === "button") {
window.location.href = redirectLoc;
} else if (actionType === "modal") {
setModalVisible(true);
}
setActiveTab(index);
};
/*
const onTabClick = (index, type, action) => {
if (type === "button" && action) {
action();
} else if (type === "modal") {
setModalVisible(true);
}
setActiveTab(index);
};
*/
onHoverElement() {}
const closeModal = () => {
setModalVisible(false);
};
onHoverTab(key) {
const onHoverElement = () => {};
const onHoverTab = (key) => {
const clamp = (num, min, max) => Math.min(Math.max(num, min), max); const clamp = (num, min, max) => Math.min(Math.max(num, min), max);
const panVal = rightSideEnd const panVal = rightSideEnd
? clamp(3 * ((-1 / amountTabs) * key + 1) - 2, -1, 1) ? clamp(3 * ((-1 / amountTabs) * key + 1) - 2, -1, 1)
@ -33,7 +61,7 @@ export default class ScrollableTab extends React.Component {
const frequencyVal = rightSideEnd const frequencyVal = rightSideEnd
? Math.round((key / amountTabs) * key + 6) ? Math.round((key / amountTabs) * key + 6)
: Math.round(((key - amountTabs) / amountTabs) * (key - amountTabs) + 6); : Math.round(((key - amountTabs) / amountTabs) * (key - amountTabs) + 6);
var endValueVisible = this.isVisible(document.getElementById(endElement));
var endValueVisible = isVisible(document.getElementById(endElement));
if (endValueVisible) { if (endValueVisible) {
reachedEndValue = true; reachedEndValue = true;
@ -52,13 +80,13 @@ export default class ScrollableTab extends React.Component {
//this.playChordSound(panVal, frequencyVal); //this.playChordSound(panVal, frequencyVal);
//this.playPitchSound(panVal, 200 + 10*key); //this.playPitchSound(panVal, 200 + 10*key);
} }
}
};
// didReachEnd is bad... That is why, I have my own function... :) // 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... // 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... // 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... // Not really necessary, since the user already "knows", that this is the end...
isVisible(el) {
const isVisible = (el) => {
var rect = el.getBoundingClientRect(); var rect = el.getBoundingClientRect();
return ( return (
@ -67,41 +95,44 @@ export default class ScrollableTab extends React.Component {
rect.left < (window.innerWidth || document.documentElement.clientWidth) && rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
rect.top < (window.innerHeight || document.documentElement.clientHeight) rect.top < (window.innerHeight || document.documentElement.clientHeight)
); );
}
render() {
//var keys = Array.from({ length: amountTabs }, (_, i) => i + 1);
// onFocus as an additional thingy?
var tabId = 0;
amountTabs = this.props.children.length;
endElement = amountTabs;
var tabs = this.props.children.map((k) => {
tabId += 1;
return (
<Tab
id={tabId}
onTouchStart={() => this.onHoverTab(k)}
onMouseOver={() => this.onHoverTab(k)}
key={tabId}
>
{k.props.children}
</Tab>
);
});
const tabsStyle = {};//{position: "fixed", bottom: "0"};
};
//var keys = Array.from({ length: amountTabs }, (_, i) => i + 1);
// onFocus as an additional thingy?
var tabId = 0;
amountTabs = children.length;
endElement = amountTabs;
var tabs = children.map((k) => {
tabId += 1;
return ( return (
<div style={tabsStyle}>
<Tabs
onMouseOver={() => this.onHoverElement()}
activeTab={this.state.activeTab}
onTabClick={(e, index) => this.onTabClick(e, index)}
>
{tabs}
</Tabs>
</div>
<Tab
id={tabId}
onTouchStart={() => onHoverTab(k)}
onMouseOver={() => onHoverTab(k)}
key={tabId}
actionType={k.props.actionType}
redirectLoc={k.props.redirectLoc}
>
{k.props.children}
<PopupModal visible={modalVisible} closeHandler={closeModal} />
</Tab>
); );
}
});
const tabsStyle = {}; //{position: "fixed", bottom: "0"};
return (
<div style={tabsStyle}>
<Tabs
onMouseOver={() => onHoverElement()}
activeTab={activeTab}
onTabClick={(e, index) => onTabClick(e, index)}
>
{tabs}
</Tabs>
</div>
);
} }
export default ScrollableTab;

60
src/pages/study_site_2/StartPage2.jsx

@ -44,54 +44,54 @@ function StartPage2({ redirectLoc }) {
<h4>Hotel Le Laboratoire</h4> <h4>Hotel Le Laboratoire</h4>
<Spacer h={2} /> <Spacer h={2} />
<ScrollableTab> <ScrollableTab>
<Tab>
<Flag viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<Flag viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Features Features
</Tab> </Tab>
<Tab>
<Home viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="button" redirectLoc={redirectLoc}>
<Home viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Facilities Facilities
</Tab> </Tab>
<Tab>
<MapPin viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<MapPin viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Location Location
</Tab> </Tab>
<Tab>
<ArrowUpRight viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<ArrowUpRight viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Flights Flights
</Tab> </Tab>
<Tab>
<Key viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<Key viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Rooms Rooms
</Tab> </Tab>
<Tab>
<Emoji viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<Emoji viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Catering Catering
</Tab> </Tab>
<Tab>
<User viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<User viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Tour Operators Tour Operators
</Tab> </Tab>
<Tab>
<Map viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<Map viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Map Map
</Tab> </Tab>
<Tab>
<Star viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<Star viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Ratings Ratings
</Tab> </Tab>
<Tab>
<HelpCircle viewBox="0 -8 24 32" size={18}/>
<Spacer inline w={.35} />
<Tab actionType="modal">
<HelpCircle viewBox="0 -8 24 32" size={18} />
<Spacer inline w={0.35} />
Useful Information Useful Information
</Tab> </Tab>
</ScrollableTab> </ScrollableTab>

45
src/pages/study_site_2/TourOperators.jsx

@ -46,53 +46,70 @@ function TourOperators({ redirectLoc }) {
<Card> <Card>
<Card.Content> <Card.Content>
<Text b my={0}> <Text b my={0}>
Haphazard Holidays
Haphazard Holidays
</Text> </Text>
</Card.Content> </Card.Content>
<Divider h="1px" my={0} /> <Divider h="1px" my={0} />
<Card.Content> <Card.Content>
<Text> <Text>
Ever thought, how the best experiences in life happen, when you just stumble upon them? That is the goal with Haphazard Holidays.
Ever thought, how the best experiences in life happen, when you just
stumble upon them? That is the goal with Haphazard Holidays.
</Text> </Text>
<ul> <ul>
<li><a href="">Prices</a></li>
<li><a href="mailto:haphazard.holidays@example.com">Contact</a></li>
<li>
<a href="">Prices</a>
</li>
<li>
<a href="mailto:haphazard.holidays@example.com">Contact</a>
</li>
</ul> </ul>
</Card.Content> </Card.Content>
</Card> </Card>
<Card> <Card>
<Card.Content> <Card.Content>
<Text b my={0}> <Text b my={0}>
Misguided Getaways
Misguided Getaways
</Text> </Text>
</Card.Content> </Card.Content>
<Divider h="1px" my={0} /> <Divider h="1px" my={0} />
<Card.Content> <Card.Content>
<Text> <Text>
We at Misguided Getaways are specialized in hotels and tours, not captured by conventional tour operators to "mis"guide you into your perfect vacation.
We at Misguided Getaways are specialized in hotels and tours, not
captured by conventional tour operators to "mis"guide you into your
perfect vacation.
</Text> </Text>
<ul> <ul>
<li><a href="">Prices</a></li>
<li><a href="mailto:misguided.getaways@example.com">Contact</a></li>
<li>
<a href="">Prices</a>
</li>
<li>
<a href="mailto:misguided.getaways@example.com">Contact</a>
</li>
</ul> </ul>
</Card.Content> </Card.Content>
</Card> </Card>
<Card> <Card>
<Card.Content> <Card.Content>
<Text b my={0}> <Text b my={0}>
Lost & Found Excursions
Lost & Found Excursions
</Text> </Text>
</Card.Content> </Card.Content>
<Divider h="1px" my={0} /> <Divider h="1px" my={0} />
<Card.Content> <Card.Content>
<Text> <Text>
Here at Lost & Found Excursions try to capture the same feeling, when you find something precious again by chance but we don't let luck decide upon your perfect holiday or trip.
Here at Lost & Found Excursions try to capture the same feeling,
when you find something precious again by chance but we don't let
luck decide upon your perfect holiday or trip.
</Text> </Text>
<Text> <Text>
<ul>
<li><a href="">Prices</a></li>
<li><a href="mailto:l_f_excursions@example.com">Contact</a></li>
</ul>
<ul>
<li>
<a href="">Prices</a>
</li>
<li>
<a href="mailto:l_f_excursions@example.com">Contact</a>
</li>
</ul>
</Text> </Text>
</Card.Content> </Card.Content>
</Card> </Card>

Loading…
Cancel
Save