rofrischmann/react-look

View on GitHub
packages/react-look-core/modules/plugins/styleLogger.js

Summary

Maintainability
A
0 mins
Test Coverage
import getChildType from '../utils/getChildType'
import { toCSS } from 'inline-style-transformer'
import _ from 'lodash'
/**
 * Logs styles according to different settings
 */
export default ({ styles, Component, element, newProps, config: { styleLogger } }) => {
  if (styleLogger) {
    // Logger information
    const { ref, key } = element

    const childType = getChildType(element)

    const keyInfo = key !== null ? 'key=' + key : ''
    const refInfo = ref !== null ? 'ref=' + ref : ''

    const elementReference = keyInfo + (keyInfo !== '' && refInfo !== '' ? ';' : '') + refInfo
    const elementInfo = childType + (elementReference !== '' ? '[' + elementReference + ']' : '')

    const loggerPrefix = Component.constructor.displayName + ':' + elementInfo + ''
    const logStyles = styleLogger.toString === true ? toCSS(styles) : styles

    const log = () => {
      if (styleLogger.noEmpty && _.isEmpty(logStyles)) {
        return
      }
      console.log(loggerPrefix, logStyles) // eslint-disable-line
    }

    // logs styles if a given event got triggered
    if (styleLogger.onEvent && !newProps._styleLoggerActive) {
      // Allowing multiple events
      if (!Array.isArray(styleLogger.onEvent)) {
        styleLogger.onEvent = [ styleLogger.onEvent ]
      }
      // Iterate every event and add event listeners
      styleLogger.onEvent.forEach(event => {
        const existingEvent = newProps[event]
        newProps[event] = (e) => {
          if (existingEvent) {
            existingEvent()
          }
          newProps._styleLoggerEvent(e)
        }
      })

      newProps._styleLoggerActive = true
    }

    newProps._styleLoggerEvent = (e) => {
      log()
      if (styleLogger.onlyTopMost) {
        if (e) {
          e.stopPropagation()
        }
      }
    }

    newProps._lookShouldUpdate = true

    // logs styles everytime the element gets rendered
    if (styleLogger.onRender) {
      log()
    }
  }

  return styles
}