import React from 'react';
import Page from './Page';
import Router from '../Router';
import cn from 'classnames';
import { Ships } from 'coriolis-data/dist';
import Ship from '../shipyard/Ship';
import { fromComparison, toComparison } from '../shipyard/Serializer';
import Persist from '../stores/Persist';
import { SizeMap, ShipFacets } from '../shipyard/Constants';
import ComparisonTable from '../components/ComparisonTable';
import BarChart from '../components/BarChart';
import ModalCompare from '../components/ModalCompare';
import ModalExport from '../components/ModalExport';
import ModalPermalink from '../components/ModalPermalink';
import ModalImport from '../components/ModalImport';
import {
FloppyDisk,
Bin,
Download,
Embed,
Rocket,
LinkIcon
} from '../components/SvgIcons';
import ShortenUrl from '../utils/ShortenUrl';
import { comparisonBBCode } from '../utils/BBCode';
const browser = require('detect-browser');
/**
* Creates a comparator based on the specified predicate
* @param {string} predicate Predicate / propterty name
* @return {Function} Comparator
*/
function sortBy(predicate) {
return (a, b) => {
if (a[predicate] === b[predicate]) {
if (a.name == b.name) {
a.buildName.toLowerCase() > b.buildName.toLowerCase() ? 1 : -1;
}
return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
}
if (typeof a[predicate] == 'string') {
return a[predicate].toLowerCase() > b[predicate].toLowerCase() ? 1 : -1;
}
return a[predicate] > b[predicate] ? 1 : -1;
};
}
/**
* Comparison Page
*/
export default class ComparisonPage extends Page {
/**
* Constructor
* @param {Object} props React Component properties
* @param {Object} context React Component context
*/
constructor(props, context) {
super(props, context);
this._sortShips = this._sortShips.bind(this);
this._buildsSelected = this._buildsSelected.bind(this);
this._updateDiscounts = this._updateDiscounts.bind(this);
this.state = this._initState(context);
}
/**
* [Re]Create initial state from context
* @param {context} context React component context
* @return {Object} New state object
*/
_initState(context) {
let defaultFacets = [13, 12, 11, 9, 6, 4, 1, 3, 2]; // Reverse order of Armour, Shields, Speed, Jump Range, Cargo Capacity, Cost, DPS, EPS, HPS
let params = context.route.params;
let code = params.code;
let name = params.name ? decodeURIComponent(params.name) : null;
let newName = '';
let compareMode = !code;
let builds = [];
let saved = false;
let predicate = 'name';
let desc = false;
let importObj = {};
if (compareMode) {
if (name == 'all') {
let allBuilds = Persist.getBuilds();
newName = name;
for (let shipId in allBuilds) {
for (let buildName in allBuilds[shipId]) {
if (buildName && allBuilds[shipId][buildName]) {
builds.push(
this._createBuild(
shipId,
buildName,
allBuilds[shipId][buildName]
)
);
}
}
}
} else {
let comparisonData = Persist.getComparison(name);
if (comparisonData) {
defaultFacets = comparisonData.facets;
comparisonData.builds.forEach(b =>
builds.push(this._createBuild(b.shipId, b.buildName))
);
saved = true;
newName = name;
}
}
} else {
try {
let comparisonData = toComparison(code);
defaultFacets = comparisonData.f;
newName = name = comparisonData.n;
predicate = comparisonData.p;
desc = comparisonData.d;
comparisonData.b.forEach(build => {
builds.push(this._createBuild(build.s, build.n, build.c));
if (!importObj[build.s]) {
importObj[build.s] = {};
}
importObj[build.s][build.n] = build.c;
});
} catch (e) {
throw { type: 'bad-comparison', message: e.message, details: e };
}
}
let facets = [];
let selectedLength = defaultFacets.length;
let selectedFacets = new Array(selectedLength);
for (let i = 0; i < ShipFacets.length; i++) {
let facet = Object.assign({}, ShipFacets[i]);
let defaultIndex = defaultFacets.indexOf(facet.i);
if (defaultIndex == -1) {
facets.push(facet);
} else {
facet.active = true;
selectedFacets[selectedLength - defaultIndex - 1] = facet;
}
}
facets = selectedFacets.concat(facets);
builds.sort(sortBy(predicate));
return {
title: 'Coriolis EDCD Edition - Compare',
predicate,
desc,
facets,
builds,
compareMode,
code,
name,
newName,
saved,
importObj
};
}
/**
* Create a Ship instance / build
* @param {string} id Ship Id
* @param {name} name Build name
* @param {string} code Optional - Serialized ship code
* @return {Object} Ship instance with build name
*/
_createBuild(id, name, code) {
code = code ? code : Persist.getBuild(id, name); // Retrieve build code if not passed
if (!code) {
// No build found
return;
}
let data = Ships[id]; // Get ship properties
let b = new Ship(id, data.properties, data.slots); // Create a new Ship instance
b.buildFrom(code); // Populate components from code
b.buildName = name;
b.applyDiscounts(Persist.getShipDiscount(), Persist.getModuleDiscount());
return b;
}
/**
* Update state with the specified sort predicates
* @param {String} predicate Sort predicate - property name
*/
_sortShips(predicate) {
let { builds, desc } = this.state;
if (this.state.predicate == predicate) {
desc = !desc;
}
builds.sort(sortBy(predicate));
if (desc) {
builds.reverse();
}
this.setState({ predicate, desc });
}
/**
* Show selected builds modal
*/
_selectBuilds() {
this.context.showModal(
| {translate('compare')} |
|