gabrielbull/react-desktop

View on GitHub
src/SegmentedControl/macOs/Tabs/index.js

Summary

Maintainability
C
1 day
Test Coverage
import React, { Component } from 'react';
import Tab from './Tab';
import styles from '../style/10.11';

class Tabs extends Component {
  select(item) {
    this.refs[item.props.tabId].setState({ selected: true });
  }

  unselect(item) {
    this.refs[item.props.tabId].setState({ selected: false });
  }

  render() {
    const { style } = this.props;

    let children;
    // todo: use Children.map
    if (!this.props.children) {
      return null;
    } else if (
      Object.prototype.toString.call(this.props.children) !== '[object Array]'
    ) {
      children = [this.props.children];
    } else {
      children = [...this.props.children];
    }

    let tabs = [];
    let hasSelected = false;
    for (let i = 0, len = children.length; i < len; ++i) {
      let props = children[i].props;
      if (props.selected) hasSelected = true;
      if (i === 0) props = { ...props, firstChild: true };
      if (i === len - 1) props = { ...props, lastChild: true };

      if (
        children[i + 1] &&
        children[i + 1].props &&
        children[i + 1].props.selected
      ) {
        props = { ...props, nextSelected: true };
      }

      tabs = [...tabs, props];
    }

    if (!hasSelected && tabs[0]) tabs[0].selected = true;
    let prevSelectedIndex = null;
    let afterSelected = false;
    for (let i = 0, len = tabs.length; i < len; ++i) {
      if (afterSelected) {
        tabs[i] = { ...tabs[i], afterSelected: true };
        afterSelected = false;
      }
      if (tabs[i].selected) {
        afterSelected = true;
        prevSelectedIndex = i - 1;
      }
    }
    if (prevSelectedIndex >= 0 && tabs[prevSelectedIndex])
      tabs[prevSelectedIndex] = {
        ...tabs[prevSelectedIndex],
        prevSelected: true
      };

    return (
      <div style={{ ...styles.tabs, ...style }}>{this.renderTabs(tabs)}</div>
    );
  }

  renderTabs(tabs) {
    const children = [];
    for (let i = 0, len = tabs.length; i < len; ++i) {
      children.push(
        <Tab key={i} {...tabs[i]}>
          {tabs[i].title}
        </Tab>
      );
    }
    return children;
  }
}

export default Tabs;