/* @flow */ 
 | 
  
 | 
import { extend, isObject } from 'shared/util' 
 | 
  
 | 
function updateClass (oldVnode: VNodeWithData, vnode: VNodeWithData) { 
 | 
  const el = vnode.elm 
 | 
  const ctx = vnode.context 
 | 
  
 | 
  const data: VNodeData = vnode.data 
 | 
  const oldData: VNodeData = oldVnode.data 
 | 
  if (!data.staticClass && 
 | 
    !data.class && 
 | 
    (!oldData || (!oldData.staticClass && !oldData.class)) 
 | 
  ) { 
 | 
    return 
 | 
  } 
 | 
  
 | 
  const oldClassList = makeClassList(oldData) 
 | 
  const classList = makeClassList(data) 
 | 
  
 | 
  if (typeof el.setClassList === 'function') { 
 | 
    el.setClassList(classList) 
 | 
  } else { 
 | 
    const style = getStyle(oldClassList, classList, ctx) 
 | 
    if (typeof el.setStyles === 'function') { 
 | 
      el.setStyles(style) 
 | 
    } else { 
 | 
      for (const key in style) { 
 | 
        el.setStyle(key, style[key]) 
 | 
      } 
 | 
    } 
 | 
  } 
 | 
} 
 | 
  
 | 
function makeClassList (data: VNodeData): Array<string> { 
 | 
  const classList = [] 
 | 
  // unlike web, weex vnode staticClass is an Array 
 | 
  const staticClass: any = data.staticClass 
 | 
  const dataClass = data.class 
 | 
  if (staticClass) { 
 | 
    classList.push.apply(classList, staticClass) 
 | 
  } 
 | 
  if (Array.isArray(dataClass)) { 
 | 
    classList.push.apply(classList, dataClass) 
 | 
  } else if (isObject(dataClass)) { 
 | 
    classList.push.apply(classList, Object.keys(dataClass).filter(className => dataClass[className])) 
 | 
  } else if (typeof dataClass === 'string') { 
 | 
    classList.push.apply(classList, dataClass.trim().split(/\s+/)) 
 | 
  } 
 | 
  return classList 
 | 
} 
 | 
  
 | 
function getStyle (oldClassList: Array<string>, classList: Array<string>, ctx: Component): Object { 
 | 
  // style is a weex-only injected object 
 | 
  // compiled from <style> tags in weex files 
 | 
  const stylesheet: any = ctx.$options.style || {} 
 | 
  const result = {} 
 | 
  classList.forEach(name => { 
 | 
    const style = stylesheet[name] 
 | 
    extend(result, style) 
 | 
  }) 
 | 
  oldClassList.forEach(name => { 
 | 
    const style = stylesheet[name] 
 | 
    for (const key in style) { 
 | 
      if (!result.hasOwnProperty(key)) { 
 | 
        result[key] = '' 
 | 
      } 
 | 
    } 
 | 
  }) 
 | 
  return result 
 | 
} 
 | 
  
 | 
export default { 
 | 
  create: updateClass, 
 | 
  update: updateClass 
 | 
} 
 |