Skip to content

Instantly share code, notes, and snippets.

@everdimension
everdimension / collect-html-form-errors.js
Created July 31, 2019 16:49
Collect all errors of an html form. The "errors" object can be serialized.
/**
* Considering that each html input
* has a "name" attribute and proper
* validation attributes (type, pattern, required, etc)
* we collect "validity" states of invalid inputs
* and the "validationMessage" provided by the browsers
*/
const errors = Array.from(form.elements)
.filter((el) => el.hasAttribute('name'))
.reduce((acc, el) => {
@everdimension
everdimension / sequential-polling.ts
Last active April 19, 2019 13:39
Polling: "make request — wait for response, but no less than 1 second — make another request"
export function sequentialPolling({
taskFn,
interval = 1000,
}: {
taskFn: () => Promise<any>;
interval?: number;
}) {
let isActive = true;
let timeoutId: number | undefined;
let rejector: Function | undefined;
@everdimension
everdimension / git-cleanup-approaches.md
Created April 17, 2019 12:31
Different git branch cleanup approaches

Cleanup merged branches

Source: https://stackoverflow.com/a/6127884/3523645

git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d

Cleanup orphaned branches

Problem: If pull-request are merged into the main branch using a "squash" strategy and then the remote branches are removed,

@everdimension
everdimension / normalizedIncludes.ts
Created October 18, 2018 16:45
Detect occurrence of a string in another string by normalizing both strings and ignoring diacritical marks
function normalizedIncludes(str1: string, str2: string) {
/**
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
*
* https://stackoverflow.com/a/37511463/3523645
*/
const diacriticsRange = /[\u0300-\u036f]/g;
const str1Normalized = str1.normalize('NFD').replace(diacriticsRange, '');
const str2Normalized = str2.normalize('NFD').replace(diacriticsRange, '');
return str1Normalized.includes(str2Normalized);
@everdimension
everdimension / Toaster.js
Last active October 17, 2018 09:25
Sample code showing a "toaster" architecture
class Toaster {
constructor() {
this.listeners = [];
this.id = 0;
}
subscribe(listener) {
this.listeners.push(listener);
return () => {
this.listeners = this.listeners.filter(l => l !== listener);
@everdimension
everdimension / modal-dialog-a11y.html
Last active August 21, 2018 20:49
A proper way to create an accessible modal dialog element (a11y). This gist is only about the wrapper element, the links in the comment describe all necessary steps in detail.
<!--
A tabindex="-1" allows an element to receive programmatic focus.
This is useful a modal dialog window: when opened, focus should be set to the dialog so a screen reader
will begin reading and the keyboard will be able to navigate within the dialog.
Because the dialog (probably a <div> element) is not focusable by default, assigning it tabindex="-1"
allows scripting to set focus to it when it is presented
Resources:
https://www.w3.org/WAI/GL/wiki/Using_ARIA_role%3Ddialog_to_implement_a_modal_dialog_box#Note_on_focus_management
https://webaim.org/techniques/keyboard/tabindex
@everdimension
everdimension / isBrowserIE.js
Last active April 6, 2018 19:21
check for ie11
function isBrowserIE() {
const ie11Re = /Trident.*rv:11/;
const edgeRe = /Edge\//;
const ua = navigator.userAgent;
return ie11Re.test(ua) || edgeRe.test(ua);
}
@everdimension
everdimension / FSA-handle-error.js
Created February 12, 2018 23:34
A way to describe response error while conforming to Flux Standard Action and passing request info
/**
* see redux-actions lib to see how `createAction` works
* https://redux-actions.js.org/docs/api/createAction.html
*/
import { createAction } from 'redux-act(ions)';
class ResponseError extends Error { /* add a `this.request` prop */ }
/** add a `meta` field when payload in an Error */
const receiveEntity = createAction('SOME_TYPE', identity, payload => {
import * as React from 'react';
interface Props {
value: string | number;
name?: string;
onChange(name: string, value: number): void;
}
interface State {
value: string;
@everdimension
everdimension / sumOfCombinations.js
Created January 18, 2018 22:50
A function that finds all combinations of numbers in an array the sum of which equals a certain number
function arraySum(arr) {
return arr.reduce((sum, next) => sum + next, 0);
}
function padLeft(string, size) {
let res = string;
while (res.length < size) {
res = `0${res}`;
}
return res;