Geovation/photos

View on GitHub
src/components/common/SwipeTutorialPage.js

Summary

Maintainability
A
0 mins
Test Coverage
import React, { useRef, useState } from "react";
import ReactSwipe from "react-swipe";

import { Card, CardContent } from "@material-ui/core";
import { makeStyles } from "@material-ui/core/styles";

import PageWrapper from "components/PageWrapper";
import NavDots from "components/common/NavDots";

const swipeConfig = { continuous: false, widthOfSiblingSlidePreview: 0 };

const useStyles = makeStyles({
  card: {
    border: "none !important",
  },
  cardContent: {
    color: "rgba(0, 0, 0, 0.54)",
    textAlign: "center",
    backgroundColor: "#f3f3f3",
    borderRadius: "8px",
    margin: "10px 10px",
    padding: "15px",
    boxShadow: "0 0 8px #cccccc",
  },
  container: {
    backgroundColor: "white",
  },
});

const TutorialPage = ({ steps, handleClose, label, hasLogo }) => {
  const reactSwipeEl = useRef();
  const [navDotActiveIndex, setNavDotActiveIndex] = useState(0);

  const handleNavdotClick = (index) => {
    setNavDotActiveIndex(index);
    reactSwipeEl.current && reactSwipeEl.current.slide(index);
  };

  const onSwipe = (index) => {
    setNavDotActiveIndex(index);
  };

  const classes = useStyles();
  return (
    <PageWrapper
      label={label}
      handleClose={handleClose}
      hasLogo={hasLogo}
      classes={{ container: classes.container }}
    >
      <ReactSwipe
        swipeOptions={{
          ...swipeConfig,
          callback: onSwipe,
          startSlide: navDotActiveIndex,
        }}
        ref={(el) => (reactSwipeEl.current = el)}
      >
        {Object.values(steps).map((value, index) => (
          <div key={index}>
            <Card variant="outlined" classes={{ root: classes.card }}>
              <CardContent classes={{ root: classes.cardContent }}>
                {value.topImg && <div>{value.topImg}</div>}
                {value.title && <h3>{value.title}</h3>}
                {value.topText && <p>{value.topText}</p>}
                {value.img && <div>{value.img}</div>}
                {value.bottomText && <p>{value.bottomText}</p>}
              </CardContent>
            </Card>
          </div>
        ))}
      </ReactSwipe>
      <NavDots
        numberOfDots={Object.values(steps).length}
        onClick={handleNavdotClick}
        activeIndex={navDotActiveIndex}
      />
    </PageWrapper>
  );
};

export default TutorialPage;