Skip to content

Instantly share code, notes, and snippets.

import { useEffect, useMemo } from 'react';
import debounce from 'lodash/debounce';
export function useDebouncedCallback(
callback: (...args: any) => any,
delay: number,
) {
const debouncedCallback = useMemo(
() => debounce(callback, delay),
[callback, delay],
@everdimension
everdimension / useStaleQuery.ts
Created July 20, 2022 11:52
A helper on top of useQuery hook
import { useCallback, useState } from 'react';
import { useQuery } from 'react-query';
import type {
QueryKey,
QueryFunction,
UseQueryOptions,
UseQueryResult,
} from 'react-query';
/**

0x05baa67af0201cf90f07237b4fcd77ff375a391f705d31a007802a92c480a950

@everdimension
everdimension / git-rebase-onto.sh
Created May 20, 2020 17:23
"git rebase --onto" — used to rebase only latest (or several latest) commits onto a new branch
# This is just a note to self
git rebase --onto <base-branch> <current-branch>~ <current-branch>
# e.g. git rebase --onto master feature/something~ feature/something
# it's important here to use branch name and not other commit id.
# Can't use "HEAD" instead of "feature/something" ¯\_(ツ)_/¯
@everdimension
everdimension / gist:590395dd20831f9a787101c4c3084085
Created May 20, 2020 17:23
"git rebase --onto" — used to rebase only latest (or several latest) commits onto a new branch
# This is just a note to self
git rebase --onto <base-branch> <current-branch>~ <current-branch>
# e.g. git rebase --onto master feature/something~ feature/something
# it's important here to use branch name and not other commit id.
# Can't use "HEAD" instead of "feature/something" ¯\_(ツ)_/¯
@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);