utils/useUserService.jsx

import { useState, useEffect } from 'react'
import PropTypes from "prop-types"

import userService from '../services/userService'

const axios = require('axios').default;

useUserService.propTypes = {
    userId : PropTypes.number.isRequired,
    dataFrom : PropTypes.string.isRequired
}

/**
 * Retrieves user information
 * @param {integer} userId - user id 
 * @returns {object} {isLoading, data, error} contain data request 
 * @returns {boolean} objectReturn.isLoading - data is loading ?
 * @returns {object} objectReturn.data = { mainData: <object>, activity: <array>, sessions: <array>, keyData: <object>, performances: <object>, score: <number>}
 * @returns {boolean} objectReturn.error - An error has occurred ?
 */
function useUserService(userId, dataFrom) {
    const [data, setData] = useState({})
    const [isLoading, setLoading] = useState(true)
    const [error, setError] = useState(false)
    
    useEffect(() => {
        if (!userId){ 
            console.error("User ID is missing to perform the request !")
            return setError(true) 
        }
        switch(dataFrom){
            case "api" :
                let setDataFromAPi = (userInfos, userActivity, userSessions, userKeyData, userPerformance, userScore) => {
                    setData(userService.getDataObjectApi(userInfos, userActivity, userSessions, userKeyData, userPerformance, userScore))
                    setLoading(false)
                }
                Promise.all(userService.getByIdApiRequest(userId).map(request => axios.get(request)))
                    .then(axios.spread(setDataFromAPi))
                    .catch((error) => {
                        setError(true)
                        console.error(error);
                    });
                break
            case "mock" : 
                setData(userService.getByIdMocked(userId))
                setLoading(false)
                break
            default :
            console.error(
                "in the absence of the dataFrom parameter, it is impossible to know where to retrieve the user's data !"
            )
            setError(true) 
        }
    }, [userId, dataFrom])
    
    return { isLoading, data, error }
}

export default useUserService