electrode-electrify-react-component
Version:
electrode-electrify-react-component
64 lines (56 loc) • 1.91 kB
Flow
import React, {PropTypes} from "react";
import {List, ListItem} from "material-ui/List";
import formatSize from "prettysize";
/* eslint-disable max-statements, react/jsx-indent-props, no-magic-numbers */
const listPkg = (totalSize, pkg, key) => {
const nestModules = (modules) => Object.keys(modules).map((name, i) => {
const m = modules[name];
const pt = `${name} [${formatSize(m.size)}]`;
return <ListItem key={i} primaryText={pt}/>;
});
const parentsStr = (parents) => parents.substr(1).split(":").join("/");
const byParents = Object.keys(pkg).filter((k) => k.startsWith("$"));
const $ = pkg[byParents[0]];
let dups = "";
let nestedItems;
let size = 0;
if (byParents.length > 1) {
dups = <span> [{byParents.length} dups] </span>;
size = byParents.reduce((acc, k) => acc + pkg[k].size, 0);
nestedItems = byParents.sort().map((p, i) => {
const pt = p === "$" ? "at top level" : `under ${parentsStr(p)}`;
return (<ListItem
key={i}
primaryText={pt}
primaryTogglesNestedList={true}
nestedItems={nestModules(pkg[p].modules)}/>);
});
} else {
nestedItems = nestModules($.modules);
size = $.size;
}
const pct = (size / totalSize) * 100;
const name = $.name === "." ? "under app CWD" : $.name;
const primaryText = (<div>
<span>{name}</span>
{dups}
<span> [{formatSize(size)}]</span>
<span> [{pct.toFixed(2)}%]</span>
</div>);
return (<ListItem
key={key}
primaryText={primaryText}
primaryTogglesNestedList={true}
nestedItems={nestedItems}/>);
};
const ModulesByPkg = (props) => {
return (<List>
{Object.keys(props.modulesByPkg).sort().map((name, key) =>
listPkg(props.totalSize, props.modulesByPkg[name], key))}
</List>);
};
ModulesByPkg.propTypes = {
totalSize: PropTypes.number,
modulesByPkg: PropTypes.object
};
export default ModulesByPkg;