Skip to content

Instantly share code, notes, and snippets.

View jasonleehodges's full-sized avatar

jasonleehodges

View GitHub Profile
import React from 'react';
export const Grid = (props) => {
const renderRow = (rowData) => (
<div className="row">
<div className="col">
{rowData.title}
</div>
<div className="col">
{rowData.description}
@jasonleehodges
jasonleehodges / createUser.tsx
Last active July 30, 2021 03:15
Entanglement Example
import React, { FC } from 'react';
import styles from './createUser.module.css';
export interface Contact {
name: string,
email: string,
phoneNumber: string,
}
@jasonleehodges
jasonleehodges / createUser.tsx
Last active July 30, 2021 03:44
Entanglement Example with Context Flag :(
import React, { FC } from 'react';
import styles from './createUser.module.css';
import { useParams } from 'react-router-dom'
export interface Contact {
name: string,
email: string,
phoneNumber: string,
referredBy?: string,
@jasonleehodges
jasonleehodges / userForm.tsx
Created August 4, 2021 03:40
Composable User Form
import React, { FC } from 'react';
export interface Contact {
name: string,
email: string,
phoneNumber: string,
referredBy?: string,
role?: string,
}
@jasonleehodges
jasonleehodges / createProspect.tsx
Last active August 4, 2021 04:00
CreateProspect composed from UserForm
import { Contact, UserForm } from '../user-form/userForm';
import React, {FC, useState} from 'react';
export const CreateProspect: FC = () => {
const [user, setUser] = useState<Contact>({
name: '',
email: '',
phoneNumber: '',
referredBy: ''
});
@jasonleehodges
jasonleehodges / testableReducer.ts
Last active December 11, 2021 18:55
Testable Redux Reducer
import {
PayloadAction,
createReducer,
} from "@reduxjs/toolkit";
import { increment, decrement, incrementByAmount, incrementAsync } from "./actions";
export interface CounterState {
value: number;
status: "idle" | "loading" | "failed";
}
@jasonleehodges
jasonleehodges / testableCounter.spec.ts
Last active December 11, 2021 18:31
Unit Tests for Reducer
import {
CounterState,
decrement,
increment,
incrementByAmount,
testableCounterReducer,
} from "./testableCounterReducer";
describe("testable counter reducer", () => {
const initialState: CounterState = {
@jasonleehodges
jasonleehodges / inlineSelectorDefined.tsx
Last active December 11, 2021 20:22
Anti-pattern of an Inline Selector
export const Counter = () => {
const count = useSelector((state: RootState) => state.counter.value)
return (
<div>
...
@jasonleehodges
jasonleehodges / counterSelector.ts
Last active December 11, 2021 19:34
Counter Selector File
export const selectCount = (state: RootState) => state.counter.value;
export const selectCountFormatted =
(formatter: "$" | "%") => (state: RootState) =>
`${formatter === "$" ? "$" : ""}${selectCount(state)}${
formatter === "%" ? "%" : ""
}`;
export const selectCountAndStatus = (state: RootState) =>
`The current count is ${selectCount(state)} and the status is ${
state.counter.status
}`;
@jasonleehodges
jasonleehodges / counterWithSelector.tsx
Last active December 11, 2021 19:40
Selector Example with Currying and Selector Unit Tests
import React from "react";
import { useSelector } from "react-redux";
import {selectCountFormatted} from './selectors'
export const Counter = () => {
const countFormattedAsDollars = useSelector(selectCountFormatted('$'));
...