Skip to content
Snippets Groups Projects
ImagePicker.tsx 3.94 KiB
Newer Older
Bastien DUMONT's avatar
Bastien DUMONT committed
import Pagination from '@material-ui/lab/Pagination'
import React, { useContext, useEffect, useState } from 'react'
Bastien DUMONT's avatar
Bastien DUMONT committed
import { getAxiosXSRFHeader } from '../../../axios.config'
import { UserContext, UserContextProps } from '../../../hooks/userContext'
import { NewsletterService } from '../../../services/newsletter.service'
import { EditorType } from '../CustomEditor'
import Modal from '../Modal/Modal'
import SingleImage from './SingleImage'

interface ImagePickerProps {
  imageURL: string
  handleChange: (value: string, type: EditorType) => void
}

const ImagePicker: React.FC<ImagePickerProps> = ({
  imageURL,
  handleChange,
Bastien DUMONT's avatar
Bastien DUMONT committed
}) => {
  const [imageNames, setImageNames] = useState<string[][]>([])
  const [selectedImageURL, setSelectedImageURL] = useState<string>(
    imageURL && imageURL !== null ? imageURL : ''
  )
  const [openModal, setOpenModal] = useState<boolean>(false)
  const { user }: Partial<UserContextProps> = useContext(UserContext)
  const [currentPage, setCurrentPage] = useState(1)
Bastien DUMONT's avatar
Bastien DUMONT committed
  const [pageCount, setPageCount] = useState<number>(1)
  const [preSelectImage, setPreSelectImage] = useState<string>('')
Guilhem CARRON's avatar
Guilhem CARRON committed
  const imagePerPage = 10

  const toggleModal = () => {
Bastien DUMONT's avatar
Bastien DUMONT committed
    setOpenModal(prev => !prev)
  }
  const handleChangePage = (page: number) => {
    setCurrentPage(page)
  }
  const handleValidateImage = () => {
    setSelectedImageURL(preSelectImage)
    handleChange(preSelectImage, 'image')
    setOpenModal(false)
  }

  useEffect(() => {
    let subscribed = true
    async function getImageNames() {
      if (user) {
        const newsletterService = new NewsletterService()
        const images = await newsletterService.getEcogestureImages(
Bastien DUMONT's avatar
Bastien DUMONT committed
          getAxiosXSRFHeader(user.xsrftoken)
        )
        //Split array depending on page numbers
Bastien DUMONT's avatar
Bastien DUMONT committed
        setPageCount(Math.ceil(images.length / imagePerPage))
        const arraySplitted = []
        while (images.length) {
          arraySplitted.push(images.splice(0, imagePerPage))
        }
        setImageNames(arraySplitted)
      }
    }
    if (subscribed) {
      getImageNames()
    }
    return () => {
      subscribed = false
    }
  }, [user, imagePerPage])

  return (
    <>
      {selectedImageURL === '' || !selectedImageURL ? (
        <>
Guilhem CARRON's avatar
Guilhem CARRON committed
          <p>Pas d&apos;image sélectionnée</p>
          <button className="btnValid" onClick={toggleModal}>
            Choisir une image
          </button>
        </>
      ) : (
        <>
          <img
            src={selectedImageURL}
            width="120"
            height="120"
            className="ecogesture-image"
            alt="selected"
          />
          <button className="btnDelete" onClick={toggleModal}>
Guilhem CARRON's avatar
Guilhem CARRON committed
            Modifier l&apos;image
Bastien DUMONT's avatar
Bastien DUMONT committed
        <Modal classes={'modal-large'}>
          <>
            <div className="image-picker">
              {imageNames &&
                imageNames.length !== 0 &&
                imageNames[currentPage - 1].length !== 0 &&
Bastien DUMONT's avatar
Bastien DUMONT committed
                imageNames[currentPage - 1].map(imageName => (
Guilhem CARRON's avatar
Guilhem CARRON committed
                    imageURL={imageName}
                    key={imageName}
                    selectedImage={preSelectImage}
                    setSelectedImageURL={setPreSelectImage}
                  />
                ))}
            </div>
            <div className="footer">
              <Pagination
                count={pageCount}
                siblingCount={0}
Guilhem CARRON's avatar
Guilhem CARRON committed
                onChange={(_e, page) => handleChangePage(page)}
              />
              <div className="buttons">
                <button
                  className="btnCancel"
                  onClick={() => setOpenModal(false)}
                >
                  Annuler
                </button>
                <button className="btnValid" onClick={handleValidateImage}>
                  Valider
                </button>
              </div>
            </div>
          </>
        </Modal>
      )}
    </>
  )
}

export default ImagePicker