Skip to content

Instantly share code, notes, and snippets.

View karol-majewski's full-sized avatar

Karol Majewski karol-majewski

View GitHub Profile
@karol-majewski
karol-majewski / withValidationState.ts
Created December 20, 2022 16:08
Higher-order adapter for react-aria components used inside Ant Design forms
import React from 'react';
import { Form } from 'antd';
import { ValidationState } from '@react-types/shared';
type PropsAreEqual<P> = (prevProps: Readonly<P>, nextProps: Readonly<P>) => boolean;
/**
* When the wrapped component is placed inside an Ant Design form, this higher-order component
* will grab the validation status from the nearest form field and translate it to `ValidationState`.
*
@karol-majewski
karol-majewski / GenericClassComponent.tsx
Last active December 2, 2022 14:13
The easiest way to use generic Props<T>
import * as React from 'react';
enum Tao { Yin, Yang }
interface Props<T> {
value: T;
onClick(value: T): void;
}
class GenericClassComponent<T> extends React.Component<Props<T>> {
@karol-majewski
karol-majewski / usePrefetch.ts
Last active May 6, 2022 01:23
Easy prefetching with react-query
import { FetchQueryOptions, PayloadType, PrefetchableHook, useQueryClient } from 'react-query';
import { useDeepCompareEffect } from 'react-use';
/**
* Prefetches a query. Cancels any outgoing queries on unmount.
*
* @param hook Hook that returns a `UseQueryResult`.
* @param dependencies List of parameters required to build the key for the hook.
* @param options
*
@karol-majewski
karol-majewski / withProps.ts
Created November 12, 2021 14:47
withProps with support for forwardRef
import * as React from 'react';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function withProps<C extends React.ComponentType<any>, D extends Partial<React.ComponentPropsWithoutRef<C>> & JSX.IntrinsicAttributes>(
Component: C,
defaults: D
): React.ForwardRefExoticComponent<React.PropsWithoutRef<Omit<React.ComponentProps<C>, keyof D>> & React.RefAttributes<React.ElementRef<C>>> {
const renderFunction: React.ForwardRefRenderFunction<React.ElementRef<C>, Omit<React.ComponentProps<C>, keyof D>> = (props, ref) => {
return React.createElement(Component, { ...props, defaults, ref });
};
type NonEmptyArray<T> = [T, ...T[]];
const names: NonEmptyArray<string> = ['Sheldon', 'Leonard', 'Penny', 'Rajesh', 'Howard'];
function main(names: NonEmptyArray<string>, n: number){
let index = n - 1;
while (index >= names.length) {
index = Math.floor((index - names.length) / 2);
}
import React from 'react';
import { autobind } from '@typed-decorators/autobind';
class Rolodex<T> {
index: number;
length: number;
constructor(private sequence: NonEmptyArray<T>) {
this.sequence = sequence;
this.index = 0;
@karol-majewski
karol-majewski / methods-of.ts
Created August 6, 2021 11:54
Extract methods/function properties from a type in TypeScript
type AnyFunction = (...args: any[]) => any;
type FunctionPropertyOf<T> = {
[P in keyof T]: T[P] extends AnyFunction ? P : never;
}[keyof T];
type MethodOf<T> = {
[P in keyof T]: T[P] extends (this: ThisType<T[P]>, ...args: any[]) => any ? P : never;
}[keyof T];
@karol-majewski
karol-majewski / useFunction.ts
Last active July 28, 2021 16:53
Forget about stale closures once for all. Inspired by https://stackoverflow.com/a/67270735/10325032.
/**
* When two functions have the same signature, but are not equal.
*
* Fixes the "'T' could be instantiated with a different subtype of constraint" ts(2322) type error.
*
*/
type WrapperFunction<T extends AnyFunction> = (...parameters: Parameters<T>) => ReturnType<T>;
/**
* Prevents stale closures.
/**
* Returns a `string` if all parts of the created template string are guaranteed to be defined.
* If at least one partial string is nullable, the return value will be null.
*
* @example
*
* ```ts
* safestring`/api/v1/users/${user?.id}`; // string | null
* safestring`/api/v1/users/${"15"}`; // string
* ```
interface Options {
/**
* @default Infinity
*/
maximumAttempts?: number;
/**
* @default 0
*/
timeoutMs?: number
}