fix(app.tsx): add safe check for readyPromise (#2489)

* fix(app.tsx): add safe check for readyPromise

* make type-safe

Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
Aakansha Doshi 2020-12-09 01:35:08 +05:30 committed by GitHub
parent fba37e422d
commit 8f8fd023f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 8 deletions

View File

@ -301,9 +301,9 @@ class App extends React.Component<ExcalidrawProps, AppState> {
};
if (excalidrawRef) {
const readyPromise =
typeof excalidrawRef === "function"
? resolvablePromise<ExcalidrawImperativeAPI>()
: excalidrawRef.current!.readyPromise;
("current" in excalidrawRef && excalidrawRef.current?.readyPromise) ||
resolvablePromise<ExcalidrawImperativeAPI>();
const api: ExcalidrawImperativeAPI = {
ready: true,
readyPromise,

View File

@ -24,7 +24,9 @@ import { ExcalidrawElement } from "../element/types";
import { SAVE_TO_LOCAL_STORAGE_TIMEOUT } from "./app_constants";
import { EVENT_LOAD, EVENT_SHARE, trackEvent } from "../analytics";
const excalidrawRef: React.MutableRefObject<ExcalidrawAPIRefValue> = {
const excalidrawRef: React.MutableRefObject<
MarkRequired<ExcalidrawAPIRefValue, "ready" | "readyPromise">
> = {
current: {
readyPromise: resolvablePromise(),
ready: false,

3
src/global.d.ts vendored
View File

@ -43,6 +43,9 @@ type ResolutionType<T extends (...args: any) => any> = T extends (
// https://github.com/krzkaczor/ts-essentials
type MarkOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
type MarkRequired<T, RK extends keyof T> = Exclude<T, RK> &
Required<Pick<T, RK>>;
// PNG encoding/decoding
// -----------------------------------------------------------------------------
type TEXtChunk = { name: "tEXt"; data: Uint8Array };

View File

@ -133,14 +133,16 @@ export declare class GestureEvent extends UIEvent {
export type LibraryItem = readonly NonDeleted<ExcalidrawElement>[];
export type LibraryItems = readonly LibraryItem[];
// NOTE ready/readyPromise props are optional for host apps' sake (our own
// implem guarantees existence)
export type ExcalidrawAPIRefValue =
| (ExcalidrawImperativeAPI & {
readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
ready: true;
readyPromise?: ResolvablePromise<ExcalidrawImperativeAPI>;
ready?: true;
})
| {
readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;
ready: false;
readyPromise?: ResolvablePromise<ExcalidrawImperativeAPI>;
ready?: false;
};
export interface ExcalidrawProps {