Skip to content

Instantly share code, notes, and snippets.

View maradondt's full-sized avatar

VladimirZhigalev maradondt

View GitHub Profile
@maradondt
maradondt / validation.ts
Created October 10, 2024 12:14
yup custom validation hook
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-unused-vars */
import { set } from 'lodash';
import { useMemo } from 'react';
import { Schema, ValidationError } from 'yup';
/**
* Sets the `innerError.message` in an `errors` object at the key
* defined by `innerError.path`.
* @param {Object} errors The object to set the error in.
@maradondt
maradondt / ImageProcessor.ts
Last active September 26, 2024 14:51
Helper for work with images
import dayjs from 'dayjs';
import { instanceOf } from '../typeguard';
export type Coordinates = { x1: number; y1: number; x2: number; y2: number };
const ResultType = {
blob: 'blob',
file: 'file',
url: 'url',
image: 'image',
@maradondt
maradondt / typeguard.ts
Created April 27, 2024 14:13
Typeguard factory typescrypt
/* eslint-disable @typescript-eslint/no-explicit-any */
type Primitive = string | number | boolean | bigint | symbol | undefined | null;
interface Constructor<T = unknown, P extends unknown[] = never> {
new (...args: P): T;
}
type Guard<P = any, T extends P = P> = (x: P) => x is T;
type SomeOf<T extends Guard[]> = T[number] extends Guard<infer P, infer R>
? (x: P) => x is R
function measureExecutionTime(callback: () => void) {
return function () {
const startTime = performance.now();
callback();
const endTime = performance.now();
const executionTime = endTime - startTime;
console.log(`Execution time for '${callback.name}': ${executionTime} milliseconds`);
};
}
@maradondt
maradondt / withContextMenu.tsx
Last active November 28, 2024 08:01
react HOC withContextMenu returns the same component which accept onContextMenu prop that fixed bug with context menu on safari on Iphone
// reference and demo https://github.com/facebook/react/issues/17596#issuecomment-565524946
import React, { ComponentProps, PropsWithChildren } from 'react';
const longPressDuration = 610;
export default class ContextMenuHandler {
private callback: (e: any) => void;
private longPressCountdown: NodeJS.Timeout | null;
private shouldStopPropagation: boolean;
@maradondt
maradondt / listToTree.ts
Created May 3, 2023 12:44
create a tree from list
type BaseObj = {
id: string;
parentId: string | null;
};
type Result<T extends BaseObj> = T & {
children: Result<T>[];
};
export const listToTree = (
arr: BaseObj[],
@maradondt
maradondt / time-ago.ts
Last active December 8, 2022 10:37
luxon time ago string
import { DateTime } from 'luxon';
const units: Intl.RelativeTimeFormatUnit[] = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second'];
/**
* https://github.com/moment/luxon/issues/274#issuecomment-649347238
*
* @param dateTime DateTime.fromISO(isoString)
* @returns string
*
@maradondt
maradondt / colors.ts
Last active November 22, 2022 08:46
generate gray colors
export interface Color {
50: string;
100: string;
200: string;
300: string;
400: string;
500: string;
600: string;
700: string;
800: string;
@maradondt
maradondt / useDragScrolling.ts
Last active May 19, 2023 09:11
added drag scroll to an item
import { useEffect } from 'react';
import { addStylesToHtml } from 'shared/ui/addStyles';
const createGrabbingStyles = () => {
const style = document.createElement('style');
style.textContent = `
.useDragScrolling.grabbing {
scroll-behavior: auto;
cursor: grabbing;
}
@maradondt
maradondt / declOfNum.ts
Created June 16, 2022 10:40
склонение
/**
* @description
* https://realadmin.ru/coding/sklonenie-na-javascript.html
* @param n number
* @param text_forms string[]
* @returns string
*
* @example
* ```js
* declOfNum(1, ['минута', 'минуты', 'минут']); // вернёт — минута