@thisisagile/easy-react
Version:
Straightforward library building micro applications in react
85 lines (74 loc) • 2.67 kB
text/typescript
import { isPageList, List, Optional, PageList, PageOptions, toList, toPageList, Validatable } from '@thisisagile/easy';
import { useState } from 'react';
export const useToggle = (initialState = false): [boolean, () => void] => {
const [state, setState] = useState<boolean>(initialState);
return [state, () => setState(s => !s)];
};
export const useA = <E extends Validatable>(item: Partial<E> = {} as Partial<E>): [E, (e: E) => E] => {
const [state, setState] = useState<E>({ isValid: false, ...item } as E);
return [
state,
(e: E): E => {
setState(e);
return e;
},
];
};
export const useAn = useA;
export const useOptional = <E>(item?: Partial<E>): [E, (e: Optional<E>) => Optional<E>, () => Optional<E>] => {
const [state, setState] = useState<E>(item as E);
const set = (e?: Optional<E>): Optional<E> => {
setState(e as E);
return e;
};
return [state, set, (): Optional<E> => set()];
};
export const useEntity = useA;
export const useList = <E>(...items: E[]): [List<E>, (e: List<E>) => List<E>] => {
const [state, setState] = useState<List<E>>(toList<E>(...items));
return [
state,
(e: List<E>): List<E> => {
setState(e);
return e;
},
];
};
export const usePageList = <E>(...items: E[]): [PageList<E>, (e: PageList<E>) => PageList<E>] => {
const [pages, setPages] = useState<PageList<E>>(toPageList<E>(items));
return [
pages,
(e: PageList<E>): PageList<E> => {
setPages(e);
return e;
},
];
};
export const usePaging = <E>(
f: (options?: PageOptions) => Promise<PageList<E>>,
options?: PageOptions
): [PageList<E>, (options?: PageOptions) => Promise<PageList<E>>, boolean, number, number] => {
const [list, setList] = usePageList<E>();
const [skip, setSkip] = useState(options?.skip ?? 0);
const [take] = useState(options?.take ?? 5);
const next = (options: PageOptions = { skip, take }) =>
f(options).then(items => {
setSkip(skip + take);
return setList(toPageList(list.add(items), items));
});
return [list, next, list.length < (list?.total ?? 0), skip, take];
};
export const useGet = <E>(f: () => Promise<E>, initial?: Partial<E>): [E, () => Promise<E>] => {
const [item, setItem] = useState((initial ?? {}) as E);
const getter = () =>
f().then(i => {
setItem(i);
return i;
});
return [item, getter];
};
export const useGetList = <E>(f: () => Promise<List<E>>): [List<E>, () => Promise<PageList<E>>] => {
const [list, setList] = usePageList<E>();
const getter = () => f().then(l => setList(isPageList<E>(l) ? l : toPageList(l, { total: l.length })));
return [list, getter];
};