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
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.ts
Last active November 13, 2025 14:54
One of the laziest EL implementations, but with cache
export function el<K extends keyof HTMLElementTagNameMap>(
nodeName: K,
props?: Record<string, unknown>,
children?: (string | number | boolean | Node)[],
): HTMLElementTagNameMap[K];
export function el<T extends HTMLElement>(
nodeName: string,
props?: Record<string, unknown>,
children?: (string | number | boolean | Node)[],
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);
};
import { useMemo, useRef } from 'react';
export type UseValuesChangeWatcherResult<T extends Record<string, unknown>> = {
[K in keyof T]?: {
oldValue: unknown;
newValue: unknown;
};
};
const compareFn = <T extends [string, unknown]>(a: T, b: T) => a[0].localeCompare(b[0]);
import { useMemo, useRef } from 'react';
import { useScope } from './useScope';
export type UseThrottlerCallback = (...args: any[]) => void;
export const useThrottler = <T extends UseThrottlerCallback>(callback: T, delay: number): T & { clear: () => void } => {
const scope = useScope({ callback, delay });
const timeout = useRef<number>(0);
return useMemo(() => {