OurBigBook logoOurBigBook Docs OurBigBook logoOurBigBook.comSite Source code
web/front/ToggleButton.tsx
import React from 'react'

const ToggleButton = ({
  callbackOff,
  callbackOn,
  contentOff,
  contentOn,
  disabled=false,
  disabledWhenOn=false,
  on: onInit,
} : {
  callbackOff: () => Promise<void>;
  callbackOn?: () => Promise<void>;
  contentOff: React.ReactNode;
  contentOn: React.ReactNode;
  disabled?: boolean,
  disabledWhenOn?: boolean,
  on: boolean;
}) => {
  const [on, setOn] = React.useState(onInit)
  if (disabledWhenOn && on) {
    disabled = true
  }
  const buttonClassNames = ['modal']
  if (disabled) {
    buttonClassNames.push('disabled')
  }
  return (
    <button
      className={buttonClassNames.join(' ')}
      onClick={(e) => {
        e.preventDefault()
        if (!disabled) {
          let ret
          if (on) {
            if (callbackOn) {
              ret = callbackOn()
            }
          } else {
            ret = callbackOff()
          }
          if (ret) {
            ret.then(ret => {
              const { data, status } = ret
              if (status !== 200) {
                alert(`error operation failed with status=${status} data=${JSON.stringify(data)}`)
              }
            })
          }
          setOn((on) => !on)
        }
      }}
    >
      {on ? contentOn : contentOff}
    </button>
  )
}

export default ToggleButton