nico.fyi
    Published on

    Use single state instead of three

    Authors
    • avatar
      Name
      Nico Prananta
      Twitter
      @2co_p

    Today I received a pull request, like the following

    const SomeComponent = () => {
      const [isStatusPageModalOpen, setIsStatusPageModalOpen] = useState(false)
      const [isEditProbeModalOpen, setIsEditProbeModalOpen] = useState(false)
      const [isDeleteProbeModalOpen, setIsDeleteProbeModalOpen] = useState(false)
    
      return (
        <div>
          {isStatusPageModalOpen ? <StatusPageModal /> : null}
          {isEditProbeModalOpen ? <EditProbeModal /> : null}
          {isDeleteProbeModalOpen ? <DeleteProbeModal /> : null}
        </div>
      )
    }
    

    The problem with the code is that there can only be one modal appear at the same time. So using three states for this is a waste and could cause unintentional bug where two or three modals appear at the same time.

    Instead, it's better to use a single state like the following

    type ModalOpenType = 'edit' | 'delete' | 'status'
    const [openedModal, setOpenedModal] = useState<ModalOpenType | null>(null)
    
    return (
      <div>
        {openedModal === 'status' ? <StatusPageModal /> : null}
        {openedModal === 'edit' ? <EditProbeModal /> : null}
        {openedModal === 'delete' ? <DeleteProbeModal /> : null}
      </div>
    )