Skip to content

Instantly share code, notes, and snippets.

@KrofDrakula
Created December 22, 2021 13:48
Show Gist options
  • Save KrofDrakula/ddcccfea8fdd0cdebc72525d8d45e4d5 to your computer and use it in GitHub Desktop.
Save KrofDrakula/ddcccfea8fdd0cdebc72525d8d45e4d5 to your computer and use it in GitHub Desktop.
An await component example
import { JSX } from 'preact';
import { useEffect, useState } from 'preact/hooks';
export const useAwait = <T,>(value: Promise<T>) => {
const [isFulfilled, setFulfilled] = useState<boolean>(false);
const [resolved, setResolved] = useState<T>(undefined);
const [rejected, setRejected] = useState<any>(undefined);
useEffect(() => {
// tslint:disable-next-line: no-floating-promises
value
.then(v => setResolved(v))
.catch(err => setRejected(err))
.finally(() => setFulfilled(true));
}, []);
return [isFulfilled, resolved, rejected];
};
interface Props<T> {
value: Promise<T>;
children: (resolved: T, rejected: any) => JSX.Element;
fallback?: JSX.Element;
}
const Await = <T,>({ value, children, fallback }: Props<T>) => {
const [isFulfilled, resolved, rejected] = useAwait(value);
return isFulfilled ? children(resolved, rejected) : fallback ?? null;
};
export default Await;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment