Browse Source

feat: Added Button/Modal functionality.

master
Denis Thiessen 5 months ago
parent
commit
3303c4c282
  1. 18
      src/components/PopupModal.jsx
  2. 83
      src/components/ScrollableTab.jsx
  3. 40
      src/pages/study_site_2/StartPage2.jsx
  4. 35
      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;

83
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 "react-tabs-scrollable/dist/rts.css";
import { Modal } from "@geist-ui/core";
import PopupModal from "./PopupModal";
var amountTabs = 0;
var reachedEndValue = false;
var rightSideEnd = true;
var endElement = amountTabs;
export default class ScrollableTab extends React.Component {
//extends AudioPlayer {
function ScrollableTab({ children }) {
const [activeTab, setActiveTab] = useState(1);
const [modalVisible, setModalVisible] = useState(false);
constructor(props) {
super(props);
this.state = {
activeTab: 1,
};
// define a onClick function to bind the value on tab click
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);
};
// define a onClick function to bind the value on tab click
onTabClick(e, index) {
this.setState({ activeTab: index });
/*
const onTabClick = (index, type, action) => {
if (type === "button" && action) {
action();
} else if (type === "modal") {
setModalVisible(true);
}
setActiveTab(index);
};
*/
const closeModal = () => {
setModalVisible(false);
};
onHoverElement() {}
const onHoverElement = () => {};
onHoverTab(key) {
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)
@ -33,7 +61,7 @@ export default class ScrollableTab extends React.Component {
const frequencyVal = rightSideEnd
? Math.round((key / amountTabs) * key + 6)
: Math.round(((key - amountTabs) / amountTabs) * (key - amountTabs) + 6);
var endValueVisible = this.isVisible(document.getElementById(endElement));
var endValueVisible = isVisible(document.getElementById(endElement));
if (endValueVisible) {
reachedEndValue = true;
@ -52,13 +80,13 @@ export default class ScrollableTab extends React.Component {
//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...
isVisible(el) {
const isVisible = (el) => {
var rect = el.getBoundingClientRect();
return (
@ -67,25 +95,27 @@ export default class ScrollableTab extends React.Component {
rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
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;
amountTabs = children.length;
endElement = amountTabs;
var tabs = this.props.children.map((k) => {
var tabs = children.map((k) => {
tabId += 1;
return (
<Tab
id={tabId}
onTouchStart={() => this.onHoverTab(k)}
onMouseOver={() => this.onHoverTab(k)}
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>
);
});
@ -95,13 +125,14 @@ export default class ScrollableTab extends React.Component {
return (
<div style={tabsStyle}>
<Tabs
onMouseOver={() => this.onHoverElement()}
activeTab={this.state.activeTab}
onTabClick={(e, index) => this.onTabClick(e, index)}
onMouseOver={() => onHoverElement()}
activeTab={activeTab}
onTabClick={(e, index) => onTabClick(e, index)}
>
{tabs}
</Tabs>
</div>
);
}
}
export default ScrollableTab;

40
src/pages/study_site_2/StartPage2.jsx

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

35
src/pages/study_site_2/TourOperators.jsx

@ -52,11 +52,16 @@ function TourOperators({ redirectLoc }) {
<Divider h="1px" my={0} />
<Card.Content>
<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>
<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>
</Card.Content>
</Card>
@ -69,11 +74,17 @@ function TourOperators({ redirectLoc }) {
<Divider h="1px" my={0} />
<Card.Content>
<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>
<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>
</Card.Content>
</Card>
@ -86,12 +97,18 @@ function TourOperators({ redirectLoc }) {
<Divider h="1px" my={0} />
<Card.Content>
<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>
<ul>
<li><a href="">Prices</a></li>
<li><a href="mailto:l_f_excursions@example.com">Contact</a></li>
<li>
<a href="">Prices</a>
</li>
<li>
<a href="mailto:l_f_excursions@example.com">Contact</a>
</li>
</ul>
</Text>
</Card.Content>

Loading…
Cancel
Save