archive
/
zxcvbn-app
Archived
1
Fork 0
This repository has been archived on 2023-03-26. You can view files and clone it, but cannot push or open issues or pull requests.
zxcvbn-app/src/components/Results.tsx

113 lines
2.7 KiB
TypeScript
Raw Normal View History

2016-10-03 21:58:00 +01:00
import React from 'react';
2016-09-18 12:01:28 +01:00
import zxcvbn from 'zxcvbn';
import {
Text,
View,
2016-10-03 21:58:00 +01:00
StyleSheet,
ListView
2016-09-18 12:01:28 +01:00
} from 'react-native';
2016-10-03 21:58:00 +01:00
import _ from 'underscore';
import ResultItem from './ResultItem';
2016-09-18 12:01:28 +01:00
const styles = StyleSheet.create({
2016-10-03 21:58:00 +01:00
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center'
} as React.ViewStyle,
listView: {
flex: 1
} as React.ViewStyle,
listItem: {
2016-10-07 21:11:38 +01:00
flex: 1,
2016-10-03 21:58:00 +01:00
borderBottomWidth: 1,
borderBottomColor: '#333',
paddingTop: 5,
paddingBottom: 8,
} as React.ViewStyle
2016-09-18 12:01:28 +01:00
});
2016-10-04 14:01:59 +01:00
const ITEM_ORDER = [
'score',
'calc_time',
'guesses',
'crack_times_display',
'online_throttling_100_per_hour',
'online_no_throttling_10_per_second',
'offline_slow_hashing_1e4_per_second',
'offline_fast_hashing_1e10_per_second',
'feedback',
'sequence'
];
2016-09-18 12:01:28 +01:00
interface Props {
value: string;
}
2016-10-03 21:58:00 +01:00
interface State {}
2016-09-18 12:01:28 +01:00
2016-10-04 14:01:59 +01:00
export default class Results extends React.Component<Props, State> {
2016-10-03 21:58:00 +01:00
dataSource: any;
constructor() {
super();
this.dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
}
parseData(results: any) {
2016-10-04 14:01:59 +01:00
let newResults = _.clone(results);
2016-10-03 21:58:00 +01:00
const hashTimes = Object.keys(newResults.crack_times_display).map(function (key) {
const value = newResults.crack_times_display[key];
return {key, value};
});
2016-10-04 14:01:59 +01:00
const guesses = [{
key: 'guesses',
value: newResults.guesses * Math.pow(10, newResults.guesses_log10)
}];
2016-10-03 21:58:00 +01:00
delete newResults.crack_times_display;
delete newResults.crack_times_seconds;
2016-10-04 14:01:59 +01:00
delete newResults.guesses_log10;
delete newResults.password;
delete newResults.guesses;
2016-10-03 21:58:00 +01:00
const out = Object.keys(newResults).map(function (key) {
const value = newResults[key];
return {key, value};
});
2016-10-04 14:01:59 +01:00
const allResults = _.union(out, hashTimes, guesses);
let orderedResults : any[] = [];
allResults.forEach(function (result) {
orderedResults[ITEM_ORDER.indexOf(result.key)] = result;
});
return orderedResults;
2016-10-03 21:58:00 +01:00
}
renderRow(rowData: any, sectionId: string, rowId: string) {
let extraRowStyles = {};
if (rowId === '0') {
extraRowStyles = {
borderTopWidth: 1,
borderTopColor: '#333'
};
}
return (
<View style={[styles.listItem, extraRowStyles]}>
<ResultItem data={rowData} />
</View>
);
}
2016-09-18 12:01:28 +01:00
2016-10-03 21:58:00 +01:00
render() {
const results = this.parseData(zxcvbn(this.props.value));
return (
<View style={styles.container}>
<ListView
style={styles.listView}
dataSource={this.dataSource.cloneWithRows(results)}
renderRow={this.renderRow.bind(this)}
removeClippedSubviews />
</View>
);
}
2016-09-18 12:01:28 +01:00
}