Skip to content

Instantly share code, notes, and snippets.

@buhichan
buhichan / infinite-scroll-ag-grid.tsx
Created July 12, 2017 08:20
Create a redux-driven server side pagination, filtering and sorting data grid with the power of ag-grid and my component ag-grid-material-preset
/**
* Created by buhi on 2017/7/11.
*/
import * as React from "react"
import {Grid,GridFieldSchema,GridProps} from "ag-grid-material-preset";
import {IGetRowsParams} from "ag-grid/dist/lib/rowModels/iDatasource";
import {GridApi} from "ag-grid/dist/lib/gridApi";
import {List,Repeat} from "immutable";
type InfiniteScrollGridProps = {
@buhichan
buhichan / util.tsx
Created July 17, 2017 06:04
exportAsCSV,timeRange,etc.
export function $exportCSV(csv, filename) {
const blobObject = new Blob(["\ufeff", csv], {
type: "text/csv;charset=utf-8;"
});
// Internet Explorer
if (navigator.msSaveOrOpenBlob) {
navigator.msSaveOrOpenBlob(blobObject, filename);
} else {
// Chrome
@buhichan
buhichan / router.tsx
Last active May 27, 2019 09:12
Type-safe (typescript) react web router
import { createBrowserHistory } from "history";
import { BehaviorSubject } from 'rxjs';
import * as React from "react"
type RouteConfig<P=any> = {
key:string,
label?:string,
icon?:string,
component?:()=>Promise<{default:React.ComponentType<P>}>,
}
@buhichan
buhichan / hook-form.tsx
Last active July 13, 2020 06:18
react hook form
import * as React from "react";
const ERROR_DETAIL = Symbol("errors")
const HAS_ERROR = Symbol("has error")
const InternalSymbolKeys = [ERROR_DETAIL,HAS_ERROR]
enum FieldType {
arrayItem,
property,
@buhichan
buhichan / get_read_list.ts
Created July 6, 2020 11:37
获取最大依赖深度, 来创造一个读代码的顺序列表...?
import {
createProgram,
SourceFile,
isImportDeclaration,
createCompilerHost,
CompilerOptions,
ModuleKind,
ModuleResolutionKind,
ScriptTarget,
resolveModuleNameFromCache,
@buhichan
buhichan / get_free_vars.ts
Last active October 15, 2020 00:40
js get free variables hack
/**
* some insane hack, just want to avoid using expensive parser.
*/
export function getFreeVariables(expr:string, knownSymbols:Record<string,unknown>){
const freeVariables = new Set<string>();
//eslint-disable-next-line
const anyThingPrimitive = ()=>{};
@buhichan
buhichan / weakref-service-provider.js
Created September 24, 2020 03:33
weakref service provider
window.servicemap = new Map()
class A {
constructor(){
console.log("A created")
}
}
function useService(A){
let a = servicemap.get(A)
@buhichan
buhichan / collect-response.ts
Last active October 13, 2020 07:41
A rxjs operators that every web apps can use, but is not built-in
import { Observable, SubscribableOrPromise } from "rxjs"
import { switchMap, tap } from "rxjs/operators"
export type collectedResponse<T2> = { loading: boolean; error: null | Error; value: null | T2 }
export function collectResponse<T1, T2>(performRequest: (t1: T1) => SubscribableOrPromise<T2>) {
return (observer: Observable<T1>)=>{
let lastResponse = null as null | T2
return new Observable<collectedResponse<T2>>(subscriber=>{
return observer.pipe(
@buhichan
buhichan / use-observables.ts
Created October 13, 2020 07:40
use-observables.ts
import { BehaviorSubject, Observable, Subscription, SubscribableOrPromise, from } from "rxjs"
import { skip } from "rxjs/operators"
import * as React from "react"
import { useSubscription } from "use-subscription"
type ObservedValueOf<T> = T extends BehaviorSubject<infer U1> ? U1 : T extends Observable<infer U2> ? U2 | null : never
export function useObservables<T>(ob: T | undefined | null): [ObservedValueOf<T>]
export function useObservables<T1, T2>(ob1: T1 | undefined | null, ob2: T2 | undefined | null): [ObservedValueOf<T1>, ObservedValueOf<T2>]
export function useObservables<T1, T2, T3>(
@buhichan
buhichan / typescript-di.tsx
Last active October 19, 2020 11:11
A typescript DI solution with no need of reflect-metadata (and can also need no decorators, if you prefer it)
//Idea is borrowed from https://github.com/gnaeus/react-ioc
//Differences are:
//1. Does not require reflect-metadata
//2. Has an additional "useProvider" method
import * as React from "react"
export interface Disposable {
dispose?(): void
}