BlockEnable.jsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React from 'react'
  2. import cls from 'classnames'
  3. import newEventActions from 'actions/newEvent'
  4. import newEventStores from 'stores/newEvent'
  5. import { getParentBlock, getEventNodeById } from 'stores/funcs/newEvent'
  6. import { shallowEqualImmutable } from 'utils/utils'
  7. export default class BlockEnable extends React.Component {
  8. constructor(props) {
  9. super(props)
  10. this.onToggleBlockEnable = this.onToggleBlockEnable.bind(this)
  11. this.hasAncestorBlockDisabled = this.hasAncestorBlockDisabled.bind(this)
  12. }
  13. shouldComponentUpdate(nextProps, nextState) {
  14. return (
  15. !shallowEqualImmutable(this.props, nextProps) ||
  16. !shallowEqualImmutable(this.state, nextState)
  17. )
  18. }
  19. onToggleBlockEnable() {
  20. if (!this.hasAncestorBlockDisabled()) {
  21. newEventActions.toggleBlockProp({
  22. nodeId: this.props.eventNodeId,
  23. blockId: this.props.bid,
  24. prop: 'skip'
  25. })
  26. }
  27. }
  28. hasAncestorBlockDisabled() {
  29. let eventNode = getEventNodeById(newEventStores.curEventNodeId)
  30. let hasDisabled = false
  31. if (eventNode && eventNode.events) {
  32. let result = eventNode.events.enable !== false
  33. hasDisabled = hasDisabled || !result
  34. }
  35. if (!hasDisabled) {
  36. let block = getParentBlock(this.props.bid, eventNode)
  37. while (!hasDisabled && block) {
  38. hasDisabled = hasDisabled || block.skip
  39. block = getParentBlock(block.ln, eventNode)
  40. }
  41. }
  42. return hasDisabled
  43. }
  44. render() {
  45. return (
  46. <button
  47. className={cls(
  48. 'btn-clear btn-toggle-enable',
  49. this.props.isEnable ? 'btn-enable' : 'btn-disable',
  50. this.props.className ? this.props.className : ''
  51. )}
  52. style={this.props.style}
  53. onClick={this.onToggleBlockEnable}
  54. />
  55. )
  56. }
  57. }