@peerbit/program-react 0.3.0-e38a67b → 0.4.0-91f84d0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@ export type ProgramClientLike = {
7
7
  identity: Identity<PublicSignKey>;
8
8
  open: <P extends Program<any, ProgramEvents>>(addressOrOpen: P | string, options?: OpenOptions<P>) => Promise<P>;
9
9
  };
10
+ export type UseProgramStatus = "idle" | "loading" | "ready" | "error";
10
11
  export declare function useProgram<P extends Program<ExtractArgs<P>, ExtractEvents<P>> & Program<any, ProgramEvents>>(peer: ProgramClientLike | undefined, addressOrOpen?: P | string, options?: OpenOptions<P> & {
11
12
  id?: string;
12
13
  keepOpenOnUnmount?: boolean;
@@ -14,7 +15,9 @@ export declare function useProgram<P extends Program<ExtractArgs<P>, ExtractEven
14
15
  program: P | undefined;
15
16
  session: any;
16
17
  loading: boolean;
17
- promise: Promise<P> | undefined;
18
+ status: UseProgramStatus;
19
+ error: Error | undefined;
20
+ promise: Promise<P | undefined> | undefined;
18
21
  peers: PublicSignKey[];
19
22
  id: string | undefined;
20
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useProgram.d.ts","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAY5E,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AACnE,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9E,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAC3C,aAAa,EAAE,CAAC,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,CAAC,CAAC,CAAC;CAChB,CAAC;AAEF,wBAAgB,UAAU,CACzB,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAE5B,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,aAAa,CAAC,EAAE,CAAC,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;;;;;;;EAmID"}
1
+ {"version":3,"file":"useProgram.d.ts","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAY5E,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AACnE,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9E,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAC3C,aAAa,EAAE,CAAC,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,KACpB,OAAO,CAAC,CAAC,CAAC,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEtE,wBAAgB,UAAU,CACzB,CAAC,SAAS,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,EAE5B,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,aAAa,CAAC,EAAE,CAAC,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC5B;;;;;;;;;EA8JD"}
@@ -9,20 +9,27 @@ const addressOrDefined = (p) => {
9
9
  }
10
10
  };
11
11
  export function useProgram(peer, addressOrOpen, options) {
12
- let [program, setProgram] = useState();
12
+ const [program, setProgram] = useState();
13
13
  const [id, setId] = useState(options?.id);
14
- let [loading, setLoading] = useState(true);
14
+ const [loading, setLoading] = useState(false);
15
+ const [error, setError] = useState(undefined);
15
16
  const [session, forceUpdate] = useReducer((x) => x + 1, 0);
16
- let programLoadingRef = useRef(undefined);
17
+ const programLoadingRef = useRef(undefined);
17
18
  const [peers, setPeers] = useState([]);
18
- let closingRef = useRef(Promise.resolve());
19
+ const closingRef = useRef(Promise.resolve());
19
20
  /* if (options?.debug) {
20
21
  console.log("useProgram", addressOrOpen, options);
21
22
  } */
22
23
  useEffect(() => {
23
24
  if (!peer || !addressOrOpen) {
25
+ setLoading(false);
26
+ setError(undefined);
27
+ setPeers([]);
28
+ setProgram(undefined);
29
+ programLoadingRef.current = undefined;
24
30
  return;
25
31
  }
32
+ setError(undefined);
26
33
  setLoading(true);
27
34
  let changeListener = undefined;
28
35
  closingRef.current.then(() => {
@@ -78,8 +85,13 @@ export function useProgram(peer, addressOrOpen, options) {
78
85
  return p;
79
86
  })
80
87
  .catch((e) => {
81
- console.error("failed to open", e);
82
- throw e;
88
+ const err = e instanceof Error ? e : new Error(String(e));
89
+ console.error("failed to open", err);
90
+ setProgram(undefined);
91
+ setPeers([]);
92
+ setError(err);
93
+ forceUpdate();
94
+ return undefined;
83
95
  })
84
96
  .finally(() => {
85
97
  setLoading(false);
@@ -92,6 +104,8 @@ export function useProgram(peer, addressOrOpen, options) {
92
104
  if (programLoadingRef.current) {
93
105
  closingRef.current =
94
106
  programLoadingRef.current.then((p) => {
107
+ if (!p)
108
+ return;
95
109
  const unsubscribe = () => {
96
110
  changeListener &&
97
111
  p.events.removeEventListener("join", changeListener);
@@ -117,10 +131,21 @@ export function useProgram(peer, addressOrOpen, options) {
117
131
  ? addressOrOpen
118
132
  : addressOrDefined(addressOrOpen),
119
133
  ]);
134
+ const status = !peer || !addressOrOpen
135
+ ? "idle"
136
+ : loading
137
+ ? "loading"
138
+ : error
139
+ ? "error"
140
+ : program
141
+ ? "ready"
142
+ : "idle";
120
143
  return {
121
144
  program,
122
145
  session,
123
146
  loading,
147
+ status,
148
+ error,
124
149
  promise: programLoadingRef.current,
125
150
  peers,
126
151
  id,
@@ -1 +1 @@
1
- {"version":3,"file":"useProgram.js","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useProgram.js","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEhE,MAAM,gBAAgB,GAAG,CACxB,CAAK,EACJ,EAAE;IACH,IAAI,CAAC;QACJ,OAAO,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,CAAC,CAAC,CAAC;IACZ,CAAC;AACF,CAAC,CAAC;AAcF,MAAM,UAAU,UAAU,CAIzB,IAAmC,EACnC,aAA0B,EAC1B,OAGC;IAED,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAiB,CAAC;IACxD,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAqB,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAoB,SAAS,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,iBAAiB,GAAG,MAAM,CAC/B,SAAS,CACT,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,MAAM,CAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D;;UAES;IACT,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpB,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,iBAAiB,CAAC,OAAO,GAAG,SAAS,CAAC;YACtC,OAAO;QACR,CAAC;QACD,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,cAAc,GAA6B,SAAS,CAAC;QAEzD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,iBAAiB,CAAC,OAAO,GAAG,IAAI;gBAC/B,EAAE,IAAI,CAAC,aAA2B,EAAE;gBACnC,GAAG,OAAO;gBACV,QAAQ,EAAE,OAAO;aACjB,CAAC;iBACD,IAAI,CAAC,CAAC,CAAI,EAAE,EAAE;gBACd,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;oBACzB,IAAI,CAAC;wBACJ,MAAM,SAAS,GAAI,CAAS,EAAE,WAAW,CAAC;wBAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;4BAAE,OAAO,SAAS,CAAC;wBAC/C,IACC,SAAS;4BACT,OAAO,SAAS,KAAK,QAAQ;4BAC7B,OAAQ,SAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,UAAU,EACxD,CAAC;4BACF,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;wBACvB,CAAC;oBACF,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBACV,OAAO,EAAE,CAAC;gBACX,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,SAAS,GACd,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,MAAM,CACzB,CAAC,CAAM,EAAE,EAAE,CACV,CAAC,EAAE,MAAM,KAAK,KAAK;oBACnB,OAAO,CAAC,EAAE,SAAS,KAAK,UAAU;oBAClC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAC3B,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEd,sEAAsE;gBACtE,+DAA+D;gBAC/D,IAAI,CAAC,SAAS,IAAI,OAAQ,CAAS,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC;oBAC9D,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACP,cAAc,GAAG,GAAG,EAAE;wBACrB,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,KAAiC,EAAE,EAAE;4BACvD,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBAC/B,CAAC,CAAC,CAAC;oBACJ,CAAC,CAAC;oBACF,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;oBAClD,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;oBACnD,CAAC,CAAC,QAAQ,EAAE;yBACV,IAAI,CAAC,CAAC,KAAiC,EAAE,EAAE;wBAC3C,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC/B,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;wBACjB,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;oBACpC,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,UAAU,CAAC,CAAC,CAAC,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC;oBACjB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;gBACD,OAAO,CAAC,CAAC;YACV,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACrB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBACrC,UAAU,CAAC,SAAS,CAAC,CAAC;gBACtB,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACb,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACd,WAAW,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YAClB,CAAC,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE;gBACb,UAAU,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,OAAO,GAAG,EAAE;YACX,IAAI,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;YAEzC,0CAA0C;YAC1C,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC/B,UAAU,CAAC,OAAO;oBACjB,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;wBACpC,IAAI,CAAC,CAAC;4BAAE,OAAO;wBACf,MAAM,WAAW,GAAG,GAAG,EAAE;4BACxB,cAAc;gCACb,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;4BACtD,cAAc;gCACb,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;wBACxD,CAAC,CAAC;wBAEF,IAAI,iBAAiB,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAC5C,UAAU,CAAC,SAAS,CAAC,CAAC;4BACtB,iBAAiB,CAAC,OAAO,GAAG,SAAgB,CAAC;wBAC9C,CAAC;wBAED,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC;4BAChC,WAAW,EAAE,CAAC;4BACd,OAAO,CAAC,mBAAmB;wBAC5B,CAAC;wBAED,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACpC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,CAAC;QACF,CAAC,CAAC;IACH,CAAC,EAAE;QACF,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE;QACnC,OAAO,EAAE,EAAE;QACX,OAAO,aAAa,KAAK,QAAQ;YAChC,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,gBAAgB,CAAC,aAAkB,CAAC;KACvC,CAAC,CAAC;IACH,MAAM,MAAM,GACX,CAAC,IAAI,IAAI,CAAC,aAAa;QACtB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO;YACR,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK;gBACN,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,OAAO;oBACR,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,MAAM,CAAC;IACd,OAAO;QACN,OAAO;QACP,OAAO;QACP,OAAO;QACP,MAAM;QACN,KAAK;QACL,OAAO,EAAE,iBAAiB,CAAC,OAAO;QAClC,KAAK;QACL,EAAE;KACF,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/program-react",
3
- "version": "0.3.0-e38a67b",
3
+ "version": "0.4.0-91f84d0",
4
4
  "description": "React hooks for Peerbit programs",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -42,8 +42,8 @@
42
42
  "react": "^18.0.0 || ^19.0.0"
43
43
  },
44
44
  "dependencies": {
45
- "@peerbit/crypto": "2.4.1-e38a67b",
46
- "@peerbit/program": "5.6.0-e38a67b"
45
+ "@peerbit/crypto": "2.4.1-91f84d0",
46
+ "@peerbit/program": "5.6.1-91f84d0"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/react": "^18.3.11",
@@ -23,6 +23,8 @@ export type ProgramClientLike = {
23
23
  ) => Promise<P>;
24
24
  };
25
25
 
26
+ export type UseProgramStatus = "idle" | "loading" | "ready" | "error";
27
+
26
28
  export function useProgram<
27
29
  P extends Program<ExtractArgs<P>, ExtractEvents<P>> &
28
30
  Program<any, ProgramEvents>,
@@ -34,21 +36,30 @@ export function useProgram<
34
36
  keepOpenOnUnmount?: boolean;
35
37
  },
36
38
  ) {
37
- let [program, setProgram] = useState<P | undefined>();
39
+ const [program, setProgram] = useState<P | undefined>();
38
40
  const [id, setId] = useState<string | undefined>(options?.id);
39
- let [loading, setLoading] = useState(true);
41
+ const [loading, setLoading] = useState(false);
42
+ const [error, setError] = useState<Error | undefined>(undefined);
40
43
  const [session, forceUpdate] = useReducer((x) => x + 1, 0);
41
- let programLoadingRef = useRef<Promise<P>>(undefined);
44
+ const programLoadingRef = useRef<Promise<P | undefined> | undefined>(
45
+ undefined,
46
+ );
42
47
  const [peers, setPeers] = useState<PublicSignKey[]>([]);
43
48
 
44
- let closingRef = useRef<Promise<any>>(Promise.resolve());
49
+ const closingRef = useRef<Promise<any>>(Promise.resolve());
45
50
  /* if (options?.debug) {
46
51
  console.log("useProgram", addressOrOpen, options);
47
52
  } */
48
53
  useEffect(() => {
49
54
  if (!peer || !addressOrOpen) {
55
+ setLoading(false);
56
+ setError(undefined);
57
+ setPeers([]);
58
+ setProgram(undefined);
59
+ programLoadingRef.current = undefined;
50
60
  return;
51
61
  }
62
+ setError(undefined);
52
63
  setLoading(true);
53
64
  let changeListener: (() => void) | undefined = undefined;
54
65
 
@@ -111,8 +122,13 @@ export function useProgram<
111
122
  return p;
112
123
  })
113
124
  .catch((e: unknown) => {
114
- console.error("failed to open", e);
115
- throw e;
125
+ const err = e instanceof Error ? e : new Error(String(e));
126
+ console.error("failed to open", err);
127
+ setProgram(undefined);
128
+ setPeers([]);
129
+ setError(err);
130
+ forceUpdate();
131
+ return undefined;
116
132
  })
117
133
  .finally(() => {
118
134
  setLoading(false);
@@ -127,6 +143,7 @@ export function useProgram<
127
143
  if (programLoadingRef.current) {
128
144
  closingRef.current =
129
145
  programLoadingRef.current.then((p) => {
146
+ if (!p) return;
130
147
  const unsubscribe = () => {
131
148
  changeListener &&
132
149
  p.events.removeEventListener("join", changeListener);
@@ -155,10 +172,22 @@ export function useProgram<
155
172
  ? addressOrOpen
156
173
  : addressOrDefined(addressOrOpen as P),
157
174
  ]);
175
+ const status: UseProgramStatus =
176
+ !peer || !addressOrOpen
177
+ ? "idle"
178
+ : loading
179
+ ? "loading"
180
+ : error
181
+ ? "error"
182
+ : program
183
+ ? "ready"
184
+ : "idle";
158
185
  return {
159
186
  program,
160
187
  session,
161
188
  loading,
189
+ status,
190
+ error,
162
191
  promise: programLoadingRef.current,
163
192
  peers,
164
193
  id,