Skip to content

Instantly share code, notes, and snippets.

View MarekZeman91's full-sized avatar
😏

Marek Zeman MarekZeman91

😏
  • Marek Zeman
  • Czech Republic
View GitHub Profile
import { useState } from "react";
export function useUpdate(): [number, () => void] {
const [state, setState] = useState(0);
return [state, () => setState(Date.now())];
}
import { useMemo } from "react";
import { useArrayHash } from "./useArrayHash";
export function useMemoizedArray<T1, T2 = T1>(
array: T1[],
hashKey: keyof T1,
): [T2[], string];
export function useMemoizedArray<T1, T2 = T1>(
export function useArrayHash<T>(array: T[], key: keyof T): string {
return array.map((x) => x[key]).join("");
}
import type { Dispatch } from "react";
import { useState } from "react";
export function useAutoResetState<S>(
initialState: S | (() => S),
): [S, Dispatch<S>] {
const [state, setState] = useState(initialState);
return [
state,
(temporaryState: S) => {
@MarekZeman91
MarekZeman91 / el.js
Last active February 19, 2023 02:58
One of the laziest EL implementations, but with cache
export const el = (nodeName, props = {}, children = []) => {
const $el = (el.cache[nodeName] || (
el.cache[nodeName] = document.createElement(nodeName)
)).cloneNode(true);
Object.assign($el, props).append(...children);
return $el;
};
el.cache = {};
const triggerDownload = (blob: Blob, filename: string) => {
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.download = filename;
link.href = url;
document.body.appendChild(link);
link.dispatchEvent(new MouseEvent('click', {
bubbles: true,
@MarekZeman91
MarekZeman91 / Forwarded.tsx
Created May 27, 2022 21:25
How to forward custom ref
import { createRef, ForwardedRef, forwardRef, useImperativeHandle, useRef } from 'react';
interface ForwardedHandlers<T> {
getValue(): T;
}
interface ForwardedProps<T> {
value: T;
children?: never;
}
const setText = (input: HTMLInputElement, value: string): void => {
const prototype = Object.getPrototypeOf(input);
const valueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;
valueSetter.call(input, value);
const init = { bubbles: true, cancelable: true };
input.dispatchEvent(new Event('change', init));
};
class ExpandedPromise<T> extends Promise<T> {
resolve: (value: T | PromiseLike<T>) => void;
reject: (reason?: any) => void;
status: 'pending' | 'fulfilled' | 'rejected' = 'pending';
constructor() {
const callbacks: {
resolve?: ExpandedPromise<T>['resolve'],
reject?: ExpandedPromise<T>['reject'],
import { createElement, CSSProperties, FC } from 'react';
export type CSSBoxProps = CSSProperties & { className?: string };
export const CSSBox: FC<CSSBoxProps> = ({ children, className, ...style }) => {
return createElement('div', { className, style }, children);
};