Skip to content
Snippets Groups Projects
ImagePicker.tsx 3.94 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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