Proyectos de Subversion LeadersLinked - SPA

Rev

Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import { useEffect, useState } from 'react'
import { useDispatch } from 'react-redux'

import {
  addExperience,
  deleteExperience,
  editExperience
} from '@services/profile/profiles'
import { addNotification } from '@store/notification/notification.actions'

export function useExperiences({ defaultExperiences = [] }) {
  const [experiences, setExperiences] = useState(defaultExperiences)
  const [modalState, setModalState] = useState(null)
  const [currentExperience, setCurrentExperience] = useState(null)
  const dispatch = useDispatch()

  const showModal = (type, experience = null) => {
    setCurrentExperience(experience)
    setModalState(modalState === type ? null : type)
  }

  const onAdd = async (uuid, experience) => {
    try {
      const newExperiences = await addExperience(uuid, experience)
      setExperiences(newExperiences)
      showModal(null)
    } catch (error) {
      dispatch(
        addNotification({
          style: 'danger',
          msg: `Error al agregar la experiencia: ${error.message}`
        })
      )
    }
  }

  const onEdit = async (experience) => {
    try {
      if (!currentExperience?.link_edit) {
        throw new Error('Enlace de edición no disponible')
      }
      const newExperiences = await editExperience(
        currentExperience.link_edit,
        experience
      )
      setExperiences(newExperiences)
      showModal(null)
    } catch (error) {
      dispatch(addNotification({ style: 'danger', msg: error.message }))
    }
  }

  const onDelete = async () => {
    try {
      if (!currentExperience?.link_delete) {
        throw new Error('Enlace de eliminación no disponible')
      }
      const newExperiences = await deleteExperience(
        currentExperience.link_delete
      )
      setExperiences(newExperiences)
      showModal(null)
    } catch (error) {
      dispatch(
        addNotification({
          style: 'danger',
          msg: `Error al eliminar la experiencia: ${error.message}`
        })
      )
    }
  }

  useEffect(() => {
    setExperiences(defaultExperiences)
  }, [defaultExperiences])

  return {
    showModal,
    modalState,
    onAdd,
    onEdit,
    onDelete,
    experiences,
    currentExperience
  }
}