This commit is contained in:
Tommy Parnell
2019-04-05 22:20:53 -04:00
parent d5173dc34f
commit 7da6c1339d
9 changed files with 119 additions and 36 deletions

View File

@@ -1,28 +1,100 @@
.App { html {
text-align: center; font-family: Arial, Helvetica, sans-serif;
} }
.App-logo { h1, h2, h3, h4, h5, h6 {
animation: App-logo-spin infinite 20s linear; color: #4A4A4A;
height: 80px; line-height: 1.45;
letter-spacing: -.01em;
line-height: 1.25em
} }
.App-header { h1 {
background-color: #222; font-size: 3.3rem;
height: 150px;
padding: 20px;
color: white;
} }
.App-title { h2 {
font-size: 1.5em; font-size: 2.6rem;
} }
.App-intro { h3 {
font-size: large; font-size: 2.4rem;
} }
@keyframes App-logo-spin { h4 {
from { transform: rotate(0deg); } font-size: 2.2rem;
to { transform: rotate(360deg); }
} }
h5 {
font-size: 2rem;
}
article {
margin-top: .5em;
}
body {
text-rendering: optimizeLegibility;
letter-spacing: -.01em;
line-height: 1.9rem;
color: #5d686f;
font-size: 1.125rem;
margin: 0;
}
.main-content-wrap {
display: block;
max-width: 750px;
margin: 0 auto;
padding-right: 1.2em;
padding-left: 1.2em;
padding-bottom: 1.2em;
}
.headerBump {
padding-top: 3.5rem;
}
.main-content-wrap img {
display: block;
width: auto;
max-width: 100%;
margin-bottom: 1.2rem
}
.bodyWithNav {
width: calc(100% - 250px);
float: right;
}
.headline {
margin-bottom: 0;
margin-top: 0;
}
.headlineSubtext {
font-size: .8em;
}
blockquote {
border-left: 2px solid #d1dced;
padding: .4em 1.2em;
}
code, pre {
font-size: 1rem;
font-family: "Courier New", Courier, monospace;
font-weight: 600;
border-radius: 3px;
background: #f5f5f5;
padding: 0 .4em;
overflow-x: auto;
}
a {
color: #00558d;
font-weight: 400;
}
a:visited {
color: #6c6c6c;
}

View File

@@ -1,4 +1,5 @@
import { TOGGLE_ITEM, CHANGE_SORT } from './constants'; import { TOGGLE_ITEM, CHANGE_SORT, SHOW_CHANGE } from './constants';
export const toggleItem = (id) => ({type: TOGGLE_ITEM, payload: {id} }); export const toggleItem = (id) => ({type: TOGGLE_ITEM, payload: {id} });
export const changeSort = (newSort) => ({type: CHANGE_SORT, payload: { newSort }}); export const changeSort = (newSort) => ({type: CHANGE_SORT, payload: { newSort }});
export const showX = (num) =>({ type: SHOW_CHANGE, payload: { num } })

View File

@@ -1,3 +1,3 @@
export const TOGGLE_ITEM = "TOGGLE_ITEM"; export const TOGGLE_ITEM = "TOGGLE_ITEM";
export const CHANGE_SORT = "TOGGLE_SORT"; export const CHANGE_SORT = "TOGGLE_SORT";
export const SHOW_CHANGE = "SHOW_CHANGE";

View File

@@ -3,16 +3,20 @@ import Checkbox from './Checkbox';
export default class HelloWorld extends PureComponent { export default class HelloWorld extends PureComponent {
render(){ render(){
let boxes = this.props.todoItems && this.props.todoItems.map(i => { let boxes = this.props.todoItems && this.props.todoItems.slice(0, this.props.showX).map(i => {
return <Checkbox key={`${i.get('id')}-${i.get('name')}`} onFireEvnt={this.props.onCheckboxClick} checked={i.get('checked')} name={i.get('name')} itemId={i.get('id')} /> ; return <Checkbox key={`${i.get('id')}-${i.get('name')}`} onFireEvnt={this.props.onCheckboxClick} checked={i.get('checked')} name={i.get('name')} itemId={i.get('id')} /> ;
}) })
return ( return (
<div> <div class="main-content-wrap">
<select value={this.props.order} onChange={this.props.sortChanged}> <select value={this.props.order} onChange={this.props.sortChanged}>
<option value="1">Asc</option> <option value="1">Asc</option>
<option value="0">Dec</option> <option value="0">Dec</option>
</select> </select>
<h2>Hello React</h2> <h2>Hello React</h2>
<div>
<label>Show Last <input type="number" value={this.props.showX} onChange={(evnt) => {this.props.onShowChange(evnt.target.value)}} /></label>
</div>
{boxes} {boxes}
</div> </div>

View File

@@ -1,22 +1,22 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import HelloWorld from '../components/HelloWorld' import HelloWorld from '../components/HelloWorld'
import { toggleItem, changeSort} from '../actions/check.js'; import { toggleItem, changeSort, showX} from '../actions/check.js';
import { computeDropoffs, stateItemsWithChecked, stateOrder} from '../selectors/todoSelector'; import { computeDropoffs, stateItemsWithChecked, stateOrder} from '../selectors/todoSelector';
export const mapStateToProps = (state) => { export const mapStateToProps = (state) => {
let before = performance.now(); let before = performance.now();
// let todoItems = state.get('todoItems').sort(
// (a, b) =>
// state.get('order') > 0 ? a.get('name').localeCompare(b.get('name'))
// : b.get('name').localeCompare(a.get('name'))
// )
// .map(i => i.set("checked", state.get('checked').get(i.get("id").toString())));
let todoItems = stateItemsWithChecked(state); const items = state.get("todoItems");
const order = state.get("order");
const stateChecked = state.get("checked")
let itemsOrdered = items.sort((a, b) => order > 0 ? a.get('name').localeCompare(b.get('name')): b.get('name').localeCompare(a.get('name')));
let todoItems = itemsOrdered.map(i => i.set("checked", stateChecked.get(i.get("id").toString())))
// let todoItems = stateItemsWithChecked(state);
let res = let res =
{ {
todoItems, todoItems,
order: stateOrder(state),
order: stateOrder(state) showX: state.get('showX')
} }
let after = performance.now(); let after = performance.now();
console.log(`took ${after - before}ms`) console.log(`took ${after - before}ms`)
@@ -29,7 +29,8 @@ export const mapDispatchToProps = dispatch => ({
}, },
sortChanged: (event) => { sortChanged: (event) => {
dispatch(changeSort(event.target.value)); dispatch(changeSort(event.target.value));
} },
onShowChange: (num) => dispatch(showX(num))
}) })
export default connect( export default connect(

View File

@@ -1,4 +1,4 @@
import { TOGGLE_ITEM, CHANGE_SORT } from "../actions/constants"; import { TOGGLE_ITEM, CHANGE_SORT, SHOW_CHANGE } from "../actions/constants";
import { Map } from 'immutable'; import { Map } from 'immutable';
export default function rootReducer(state, action){ export default function rootReducer(state, action){
switch(action.type) { switch(action.type) {
@@ -9,6 +9,9 @@ export default function rootReducer(state, action){
case CHANGE_SORT: { case CHANGE_SORT: {
return state.set('order', action.payload.newSort ); return state.set('order', action.payload.newSort );
} }
case SHOW_CHANGE: {
return state.set('showX', action.payload.num);
}
default: default:
return state; return state;
} }

View File

@@ -5,6 +5,7 @@ export const stateChecked = state => state.get("checked");
export const stateItems = state => state.get("todoItems"); export const stateItems = state => state.get("todoItems");
export const stateOrder = state => state.get("order"); export const stateOrder = state => state.get("order");
export const stateItemsAsList = createSelector([stateItems], x => x.toList()); export const stateItemsAsList = createSelector([stateItems], x => x.toList());
export const stateItemsOrdered = createSelector([stateItems, stateOrder], (items, order) =>{ export const stateItemsOrdered = createSelector([stateItems, stateOrder], (items, order) =>{
return items.sort((a, b) => return items.sort((a, b) =>
order > 0 ? a.get('name').localeCompare(b.get('name')) order > 0 ? a.get('name').localeCompare(b.get('name'))

View File

@@ -30,7 +30,8 @@ const store = createStore(
accum[item.id] = item.checked; accum[item.id] = item.checked;
return accum; return accum;
}, {}), }, {}),
order: 0 order: 0,
showX: 20
}), }),
composedEnhancers composedEnhancers
); );

View File

@@ -194,7 +194,7 @@ let nouns = [
"bow", "bow",
"keys"]; "keys"];
for (let i = 0; i <= 3000; i++) { for (let i = 0; i <= 30000; i++) {
let randomVerb = _.sample(verbs); let randomVerb = _.sample(verbs);
let randomNoun = _.sample(nouns); let randomNoun = _.sample(nouns);
results.push(`${randomVerb} ${randomNoun}`); results.push(`${randomVerb} ${randomNoun}`);