import { Button, Dialog, Pagination } from '@mui/material' import React, { useState } from 'react' import { useQuery } from 'react-query' import { fetchEcogestureImages, useWhoAmI } from '../../API' import { getAxiosXSRFHeader } from '../../axios.config' import SingleImage from './SingleImage' const IMAGES_PER_PAGE = 15 interface ImagePickerProps { imageURL: string handleChange: (value: string, type: 'image') => void defaultIcon?: string } const ImagePicker: React.FC<ImagePickerProps> = ({ imageURL, handleChange, defaultIcon, }) => { const { data: user } = useWhoAmI() const { data: imagesNames } = useQuery({ queryKey: ['imageNames'], queryFn: () => fetchEcogestureImages(getAxiosXSRFHeader(user?.xsrftoken ?? '')), }) // Default icon must be the first of the list if it exists if (defaultIcon && imagesNames) { const indexOfDefault = imagesNames.indexOf(defaultIcon) if (indexOfDefault > 0) { imagesNames.splice(indexOfDefault, 1) imagesNames.unshift(defaultIcon) } } const pageCount = Math.ceil((imagesNames?.length ?? 1) / IMAGES_PER_PAGE) const imageIndex = imagesNames?.indexOf(imageURL ?? '') ?? 1 const [selectedImageURL, setSelectedImageURL] = useState(imageURL ?? '') const [openModal, setOpenModal] = useState(false) const [currentPage, setCurrentPage] = useState( Math.floor((imageIndex > 0 ? imageIndex : 1) / IMAGES_PER_PAGE + 1) ) const [preSelectImage, setPreSelectImage] = useState(imageURL ?? '') const toggleModal = () => { setOpenModal(prev => !prev) } const handleValidateImage = () => { const newImage = defaultIcon && preSelectImage === '' ? defaultIcon : preSelectImage setPreSelectImage(newImage) setSelectedImageURL(newImage) handleChange(newImage, 'image') setOpenModal(false) } const startIndex = (currentPage - 1) * IMAGES_PER_PAGE const stopIndex = startIndex + IMAGES_PER_PAGE return ( <> {selectedImageURL === '' || !selectedImageURL ? ( <> <p>Pas d'image sélectionnée</p> <br /> <Button onClick={toggleModal}>Choisir une image</Button> </> ) : ( <> <img src={selectedImageURL} width="120" height="120" className="ecogesture-image" alt="selected" /> <Button onClick={toggleModal}>Modifier l'image</Button> </> )} <Dialog open={openModal} className="modal-large"> <div className="image-picker"> {imagesNames ?.slice(startIndex, stopIndex) ?.map(image => ( <SingleImage imageURL={image} key={image} selectedImage={preSelectImage} setSelectedImageURL={setPreSelectImage} /> ))} </div> <Pagination count={pageCount} page={currentPage} onChange={(_e, page) => setCurrentPage(page)} style={{ display: 'flex', justifyContent: 'center', marginTop: '1rem', }} /> <div className="buttons"> <Button variant="outlined" onClick={() => setOpenModal(false)}> Annuler </Button> <Button onClick={handleValidateImage}>Valider</Button> </div> </Dialog> </> ) } export default ImagePicker