Skip to content

Instantly share code, notes, and snippets.

View takumifukasawa's full-sized avatar

takumifukasawa takumifukasawa

View GitHub Profile
@takumifukasawa
takumifukasawa / getFileSizeWithUnit.ts
Created November 4, 2020 13:57
typescript: get file size with unit of [Byte ~ GB]
const units = ["Byte", "KB", "MB", "GB"];
/**
* ファイルサイズに応じて、ファイル容量の数値と単位を取得
* 多めに表示するためにceilしている
*
* @export
* @param {number} size
* @param {number} [floating=1]
* @returns
@takumifukasawa
takumifukasawa / getFileInputAccept.ts
Created November 4, 2020 13:57
typescritpt: get file input accept
import { filter, includes, map } from "lodash";
export const AcceptFileExtensions = <const>{
JPG: "jpg",
JPEG: "jpeg",
PNG: "png",
PDF: "pdf",
};
export type AcceptFileExtensions = typeof AcceptFileExtensions[keyof typeof AcceptFileExtensions];
@takumifukasawa
takumifukasawa / getExt.ts
Created November 4, 2020 13:56
typescript: get file extention
/**
* ファイルの拡張子を抜き出す
* ex) test.jpg -> jpg, test.png -> png
*
* @export
* @param {string} str
* @returns {(string | null)}
*/
export default function getExt(str: string): string | null {
// if match regex, it will return [".ext", "ext"].
@takumifukasawa
takumifukasawa / useKeepAliveTimer.ts
Last active November 5, 2020 00:33
React: custom hooks of keeping value for certain period of time with useTimer hooks ( https://gist.github.com/takumifukasawa/3785ae0f80845f76eb9664b45784e28b ).
import { forEach } from "lodash";
import { DependencyList, useEffect, useState } from "react";
import useTimeout from "./useTimeout";
/**
* 一定時間trueなflagを保持するhooks
*
* - activeを呼ぶとflagを立て直す
* - depsは何かしらの値が入っている場合はflagを立てる、とみなす
* - 例えばhoverのstateを入れた場合、hoverしたらflagは一定時間trueになる
@takumifukasawa
takumifukasawa / useFileInput.ts
Created November 4, 2020 13:51
React: custom hooks of managing file input with validation and generate thumbnails
import { includes } from "lodash";
import { ChangeEvent, useRef, useState, RefObject } from "react";
import getExt from "~/libs/file/getExt";
import getImageSize from "~/libs/image/getImageSize";
import resizeBase64Image from "~/libs/image/resizeBase64Image";
// NOTE: MB 以外の基準も対応できるようにする?
const calcFileMegaByteSize = (file: File): number => {
const megaByte = 1024 * 1024;
return Math.ceil(file.size / megaByte);
@takumifukasawa
takumifukasawa / usePrevious.ts
Created November 4, 2020 13:50
React: custom hooks of caching previous value
import { useEffect, useRef } from "react";
/**
* cache previous value
*
* ex)
* const [value, setValue] = useState<number>(0);
* const previewState = usePrevious(value);
*
* @export
@takumifukasawa
takumifukasawa / useHover.ts
Created November 4, 2020 13:49
React: mange dom hover custom hooks
import { useEffect, useRef, useState, RefObject } from "react";
import { useComponentWillUnmount } from "~/hooks/common/useLifecycle";
export default function useHover<T extends HTMLElement>(): [
RefObject<T>,
boolean
] {
let willunmount = false;
useComponentWillUnmount(() => {
willunmount = true;
@takumifukasawa
takumifukasawa / useDimensions.ts
Created November 4, 2020 13:48
React: get dom dimensions custom hooks
import { RefObject, useEffect, useRef, useState } from "react";
type Dimensions = {
bottom: number;
height: number;
left: number;
right: number;
top: number;
width: number;
x: number;
@takumifukasawa
takumifukasawa / useAsyncMemo.ts
Created November 4, 2020 13:45
React: memolize async value custom hooks
import { DependencyList, useEffect, useState } from "react";
/**
* memolize async value custom hooks
*
* base: https://github.com/awmleer/use-async-memo
*
* usage1: const value = useAsyncMemo(async () => {}, [deps1, dep2, ...]);
* usage2: const value = useAsyncMemo(async () => {}, [deps1, dep2, ...], initialValue);
*
@takumifukasawa
takumifukasawa / useTimeout.ts
Last active November 5, 2020 01:07
React: manage window timeout custom hooks
import { useEffect, useRef } from "react";
/**
* manage window timeout hooks
*
* ex)
*
* const [beginTimer, clearTimer] = useTimeout(() => { ... }, ms);
*
* useEffect(() => {