Skip to content

Instantly share code, notes, and snippets.

View fostyfost's full-sized avatar
🤪
All you need is Half-Life 3

Fosty Fost fostyfost

🤪
All you need is Half-Life 3
View GitHub Profile
@fostyfost
fostyfost / index.ts
Created October 4, 2021 16:07
Isomorphic Base64
export const toBase64 = (str: string): string => {
return typeof window === 'undefined' ? Buffer.from(str).toString('base64') : btoa(str)
}
export const fromBase64 = (str: string): string => {
return typeof window === 'undefined' ? Buffer.from(str, 'base64').toString() : atob(str)
}
@fostyfost
fostyfost / get-chunks.ts
Created October 8, 2021 09:04
Split Array Into Chunks
export const getChunks = <T = unknown>(arr: T[], length: number = 1): T[][] => {
const chunks = []
for (let index = 0; index < arr.length; index += length) {
chunks.push(arr.slice(index, index + length))
}
return chunks
}
@fostyfost
fostyfost / is-absolute-url.ts
Created November 4, 2021 10:37
Absolute URL check
// Universal, non case-sensitive, protocol-agnostic approach:
const reg = new RegExp('^(?:[a-z]+:)?//', 'i')
export const isAbsoluteUrl = (value: string): boolean => reg.test(value)
@fostyfost
fostyfost / unique-in-order.test.ts
Created November 27, 2021 15:21
Items of array are unique in order
import { uniqueInOrder } from './unique-in-order'
const obj1 = { id: '1' }
const obj2 = { id: '2' }
const obj3 = { id: '3' }
const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]
const arr3 = [7, 8, 9]
@fostyfost
fostyfost / to-sequence.test.ts
Created November 27, 2021 15:45
Array to sequence
import { toSequence } from './to-sequence'
test('`toSequence` should work correctly', () => {
expect(toSequence([])).toEqual([])
expect(toSequence(['a'])).toEqual([['a', undefined]])
expect(toSequence(['a', 'b'])).toEqual([['a', 'b']])
expect(toSequence(['a', 'b', 'c'])).toEqual([['a', 'b'], ['b', 'c']])
@fostyfost
fostyfost / use-props-selector.ts
Created December 7, 2021 08:35
`usePropsSelector` from `redux-views`
import * as React from 'react'
import { useSelector } from 'react-redux'
import type { OutputSelector, OutputParametricSelector } from 'redux-views'
type SelectorWithIdAndUse = (OutputSelector<any, any, any> | OutputParametricSelector<any, any, any, any>) & {
use?: (...args: any[]) => any
idSelector?: (...args: any[]) => any
}
export const usePropsSelector = <T extends SelectorWithIdAndUse = SelectorWithIdAndUse>(
@fostyfost
fostyfost / approach-1.ts
Created April 19, 2022 19:46
React lazy ref
import type { MutableRefObject } from 'react'
import { useRef } from 'react'
const noop = {}
export function useLazyRef<T>(init: () => T) {
const ref = useRef<T | typeof noop>(noop)
if (ref.current === noop) {
ref.current = init()
@fostyfost
fostyfost / index.test.ts
Created April 20, 2022 19:10
Magic steps
import { FlightSearchStep, getNextStep, getPrevStep, SeatType } from './index'
const VALID_STEPS_MAP: {
[key: string]: {
[key: string]: {
prev: FlightSearchStep | undefined
next: FlightSearchStep | undefined
}
}
} = {
@fostyfost
fostyfost / index.ts
Last active May 1, 2022 18:37
From or to decimal notation
const ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
const MIN_RADIX = 2
const MAX_RADIX = ALPHABET.length
function chekRadix(radix: number): void {
if (radix < MIN_RADIX || radix > MAX_RADIX) {
throw new Error(`radix argument must be between ${MIN_RADIX} and ${MAX_RADIX}`)
}
}
export const useEffectOnce = (effect: EffectCallback) => {
const destroyFunc = useRef<ReturnType<EffectCallback>>()
const calledOnce = useRef(false)
const renderAfterCalled = useRef(false)
if (calledOnce.current) {
renderAfterCalled.current = true
}
useEffect(() => {