Skip to content

Instantly share code, notes, and snippets.

View btoo's full-sized avatar
🅱️
2️⃣

btoo

🅱️
2️⃣
View GitHub Profile
@btoo
btoo / useScrollIntoView.ts
Created March 22, 2020 03:45
useScrollIntoView
export const useScrollIntoView = <T extends HTMLElement>(trigger: any) => {
const refOfElementToScrollIntoView = useRef<T>(null)
/**
* when the trigger transitions from "off" to "on" (e.g. the data was initialized)
* scroll the designated element (refOfElementToScrollIntoView) into view
*/
const previousTrigger = usePrevious(trigger)
useEffect(() => {
const intersectionNode = { value: 8 };
const headNodeOfListA = {
value: 4,
next: {
value: 1,
next: intersectionNode
}
};
@btoo
btoo / usePrevious.ts
Last active April 27, 2025 07:13
typescript type-safe version of usePrevious taken directly from the react docs https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state
import { useRef, useEffect } from 'react';
/**
* a type-safe version of the `usePrevious` hook described here:
* @see {@link https://reactjs.org/docs/hooks-faq.html#how-to-get-the-previous-props-or-state}
*/
export function usePrevious<T>(
value: T,
): ReturnType<typeof useRef<T>>['current'] {
const ref = useRef<T>();
@btoo
btoo / index.d.ts
Created July 31, 2019 15:36
deepFreeze
declare const deepFreeze: <T>(object: T) => T
export default deepFreeze
@btoo
btoo / util.ts
Last active December 19, 2024 02:33
typescript utility types
/* ******************************** utility types ******************************** */
declare export type Modify<T, R> = Pick<T, Exclude<keyof T, keyof R>> & R;
/** @deprecated @see `ElementType` */
declare export type ArrayElement<ArrayType> = ArrayType extends (infer ElementType)[]
? ElementType
: ArrayType extends ReadonlyArray<infer ElementType>
? ElementType
: never;
@btoo
btoo / url.js
Created March 15, 2019 04:08
add query parameters to a url
module.exports = (endpoint, query = {}) => {
const queryEntries = Object.entries(query || {}).filter(([key, value]) => value || typeof value === 'boolean');
return queryEntries.length
? `${endpoint}?${queryEntries
.map(pair => pair.map(encodeURIComponent).join('='))
.join('&')}`
: endpoint;
};
@btoo
btoo / vuex-module-cloner.js
Created January 18, 2019 01:46
if for some reason (like testing) you need to clone an entire vuex module
export const deepCloneVuexModule module => ({
...module,
state: JSON.parse(JSON.stringify(module.state)),
modules: Object.entries(module.modules || {})
.map(([moduleName, module]) => [moduleName, deepCloneVuexModule(module)])
.reduce((acc, [moduleName, module]) => ({ ...acc, [moduleName]: module }), {}),
});
@btoo
btoo / promise.vue
Created December 20, 2018 20:12
vue-promise
<template>
<div class="loader" :class="{ 'loader--done': succeeded || errored }">
<template v-if="succeeded">
<slot name="success" :response="response">
<template v-if="showSuccessMessage">
<slot name="successIcon" :response="response"><i
class="fa"
:class="{
[successIconClass]: successIconClass,
[`fa-${successIcon}`]: successIcon,
@btoo
btoo / array-element-type.ts
Last active August 14, 2019 19:32
infer the type of an element in an array from the array's type
type ArrayElement<ArrayType> =
ArrayType extends (infer ElementType)[] ? ElementType :
ArrayType extends ReadonlyArray<infer ElementType> ? ElementType :
never;
type Flatten<T> = T extends Array<infer U> ? U : T;
@btoo
btoo / noverlap.ts
Last active December 20, 2018 20:27
noverlap typed
interface NoverlapConfig {
hash?: (...args:any[]) => any
comparator?: (hash:any, existingKey:any) => boolean
wait?: number
start?: (...args:any[]) => any
queue?: (...args:any[]) => any
beforeFinish?: (...args:any[]) => any
success?: (result:any, ...args:any[]) => any
fail?: (result:Error, ...args:any[]) => any
finish?: (result:any, ...args:any[]) => any