@apvee/spfx-react-toolkit 1.2.1 → 1.3.0

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.
Files changed (30) hide show
  1. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts +14 -0
  2. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts.map +1 -0
  3. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js +41 -0
  4. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -0
  5. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.manifest.json +17 -0
  6. package/lib/extensions/spFxReactToolkitTest/loc/en-us.js +5 -0
  7. package/lib/hooks/useSPFxAadHttpClient.d.ts +46 -0
  8. package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
  9. package/lib/hooks/useSPFxAadHttpClient.js +53 -8
  10. package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
  11. package/lib/hooks/useSPFxHttpClient.d.ts +18 -2
  12. package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -1
  13. package/lib/hooks/useSPFxHttpClient.js +12 -2
  14. package/lib/hooks/useSPFxHttpClient.js.map +1 -1
  15. package/lib/hooks/useSPFxMSGraphClient.d.ts +50 -3
  16. package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
  17. package/lib/hooks/useSPFxMSGraphClient.js +58 -5
  18. package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
  19. package/lib/hooks/useSPFxOneDriveAppData.d.ts +0 -1
  20. package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
  21. package/lib/hooks/useSPFxOneDriveAppData.js +352 -101
  22. package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
  23. package/lib/hooks/useSPFxSPHttpClient.d.ts +18 -2
  24. package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
  25. package/lib/hooks/useSPFxSPHttpClient.js +12 -2
  26. package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
  27. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
  28. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +3 -7
  29. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
  30. package/package.json +8 -6
@@ -0,0 +1,14 @@
1
+ import { BaseApplicationCustomizer } from '@microsoft/sp-application-base';
2
+ /**
3
+ * If your command set uses the ClientSideComponentProperties JSON input,
4
+ * it will be deserialized into the BaseExtension.properties object.
5
+ * You can define an interface to describe it.
6
+ */
7
+ export interface ISpFxReactToolkitTestApplicationCustomizerProperties {
8
+ testMessage: string;
9
+ }
10
+ /** A Custom Action which can be run during execution of a Client Side Application */
11
+ export default class SpFxReactToolkitTestApplicationCustomizer extends BaseApplicationCustomizer<ISpFxReactToolkitTestApplicationCustomizerProperties> {
12
+ onInit(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=SpFxReactToolkitTestApplicationCustomizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpFxReactToolkitTestApplicationCustomizer.d.ts","sourceRoot":"","sources":["../../../src/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EAC1B,MAAM,gCAAgC,CAAC;AAOxC;;;;GAIG;AACH,MAAM,WAAW,oDAAoD;IAEnE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qFAAqF;AACrF,MAAM,CAAC,OAAO,OAAO,yCACnB,SAAQ,yBAAyB,CAAC,oDAAoD,CAAC;IAEhF,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAc/B"}
@@ -0,0 +1,41 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ if (typeof b !== "function" && b !== null)
10
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
11
+ extendStatics(d, b);
12
+ function __() { this.constructor = d; }
13
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
14
+ };
15
+ })();
16
+ import { Log } from '@microsoft/sp-core-library';
17
+ import { BaseApplicationCustomizer } from '@microsoft/sp-application-base';
18
+ import { Dialog } from '@microsoft/sp-dialog';
19
+ import * as strings from 'SpFxReactToolkitTestApplicationCustomizerStrings';
20
+ var LOG_SOURCE = 'SpFxReactToolkitTestApplicationCustomizer';
21
+ /** A Custom Action which can be run during execution of a Client Side Application */
22
+ var SpFxReactToolkitTestApplicationCustomizer = /** @class */ (function (_super) {
23
+ __extends(SpFxReactToolkitTestApplicationCustomizer, _super);
24
+ function SpFxReactToolkitTestApplicationCustomizer() {
25
+ return _super !== null && _super.apply(this, arguments) || this;
26
+ }
27
+ SpFxReactToolkitTestApplicationCustomizer.prototype.onInit = function () {
28
+ Log.info(LOG_SOURCE, "Initialized ".concat(strings.Title));
29
+ var message = this.properties.testMessage;
30
+ if (!message) {
31
+ message = '(No properties were provided.)';
32
+ }
33
+ Dialog.alert("Hello from ".concat(strings.Title, ":\n\n").concat(message)).catch(function () {
34
+ /* handle error */
35
+ });
36
+ return Promise.resolve();
37
+ };
38
+ return SpFxReactToolkitTestApplicationCustomizer;
39
+ }(BaseApplicationCustomizer));
40
+ export default SpFxReactToolkitTestApplicationCustomizer;
41
+ //# sourceMappingURL=SpFxReactToolkitTestApplicationCustomizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpFxReactToolkitTestApplicationCustomizer.js","sourceRoot":"","sources":["../../../src/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,EACL,yBAAyB,EAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,OAAO,MAAM,kDAAkD,CAAC;AAE5E,IAAM,UAAU,GAAW,2CAA2C,CAAC;AAYvE,qFAAqF;AACrF;IACU,6DAA+E;IADzF;;IAiBA,CAAC;IAdQ,0DAAM,GAAb;QACE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAe,OAAO,CAAC,KAAK,CAAE,CAAC,CAAC;QAErD,IAAI,OAAO,GAAW,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,gCAAgC,CAAC;QAC7C,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,qBAAc,OAAO,CAAC,KAAK,kBAAQ,OAAO,CAAE,CAAC,CAAC,KAAK,CAAC;YAC/D,kBAAkB;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACH,gDAAC;AAAD,CAAC,AAjBD,CACU,yBAAyB,GAgBlC"}
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://developer.microsoft.com/json-schemas/spfx/client-side-extension-manifest.schema.json",
3
+
4
+ "id": "4c2e58cc-1253-43e5-bfa3-b22a07ace279",
5
+ "alias": "SpFxReactToolkitTestApplicationCustomize",
6
+ "componentType": "Extension",
7
+ "extensionType": "ApplicationCustomizer",
8
+
9
+ // The "*" signifies that the version should be taken from the package.json
10
+ "version": "*",
11
+ "manifestVersion": 2,
12
+
13
+ // If true, the component can only be installed on sites where Custom Script is allowed.
14
+ // Components that allow authors to embed arbitrary script code should set this to true.
15
+ // https://support.office.com/en-us/article/Turn-scripting-capabilities-on-or-off-1f2c515f-5d7e-448a-9fd7-835da935584f
16
+ "requiresCustomScript": false
17
+ }
@@ -0,0 +1,5 @@
1
+ define([], function() {
2
+ return {
3
+ "Title": "SpFxReactToolkitTestApplicationCustomizer"
4
+ }
5
+ });
@@ -15,6 +15,7 @@ export interface SPFxAadHttpClientInfo {
15
15
  *
16
16
  * @param fn - Function that receives AadHttpClient and returns a promise
17
17
  * @returns Promise with the result
18
+ * @throws Error if client is not initialized yet
18
19
  *
19
20
  * @example
20
21
  * ```tsx
@@ -35,6 +36,7 @@ export interface SPFxAadHttpClientInfo {
35
36
  /**
36
37
  * Last error from invoke() calls.
37
38
  * Does not capture errors from direct client usage.
39
+ * @see initError for initialization errors
38
40
  */
39
41
  readonly error: Error | undefined;
40
42
  /** Clear the current error */
@@ -43,6 +45,50 @@ export interface SPFxAadHttpClientInfo {
43
45
  readonly setResourceUrl: (url: string) => void;
44
46
  /** Current Azure AD resource URL or App ID */
45
47
  readonly resourceUrl: string | undefined;
48
+ /**
49
+ * True while the AAD client is being initialized.
50
+ * Use this to show a loading indicator during startup.
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const { client, isInitializing } = useSPFxAadHttpClient('https://api.contoso.com');
55
+ *
56
+ * if (isInitializing) return <Spinner label="Initializing AAD client..." />;
57
+ * if (!client) return <Error message="AAD client unavailable" />;
58
+ * ```
59
+ */
60
+ readonly isInitializing: boolean;
61
+ /**
62
+ * Error that occurred during client initialization.
63
+ * If set, the client will remain undefined.
64
+ *
65
+ * @example
66
+ * ```tsx
67
+ * const { initError } = useSPFxAadHttpClient('https://api.contoso.com');
68
+ *
69
+ * if (initError) {
70
+ * return <MessageBar messageBarType={MessageBarType.error}>
71
+ * Failed to initialize AAD client: {initError.message}
72
+ * </MessageBar>;
73
+ * }
74
+ * ```
75
+ */
76
+ readonly initError: Error | undefined;
77
+ /**
78
+ * Computed state: true when client is ready for use.
79
+ * Equivalent to: client !== undefined && !isInitializing && !initError
80
+ *
81
+ * @example
82
+ * ```tsx
83
+ * const { isReady, invoke, resourceUrl } = useSPFxAadHttpClient('https://api.contoso.com');
84
+ *
85
+ * if (!isReady) return <Spinner />;
86
+ *
87
+ * // Safe to use client or invoke
88
+ * const data = await invoke(c => c.get(`${resourceUrl}/api/data`, ...).then(r => r.json()));
89
+ * ```
90
+ */
91
+ readonly isReady: boolean;
46
92
  }
47
93
  /**
48
94
  * Hook to access Azure AD-secured APIs with built-in state management
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxAadHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAGzE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAE3C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE9E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/C,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CA+CvF"}
1
+ {"version":3,"file":"useSPFxAadHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAGzE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAE3C;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE9E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/C,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAEzC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;IAEtC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAsGvF"}
@@ -1,6 +1,6 @@
1
1
  // useSPFxAadHttpClient.ts
2
2
  // Hook to access Azure AD-secured APIs with state management
3
- import { useMemo, useState, useEffect } from 'react';
3
+ import { useMemo, useState, useEffect, useRef } from 'react';
4
4
  import { useSPFxServiceScope } from './useSPFxServiceScope';
5
5
  import { AadHttpClientFactory } from '@microsoft/sp-http';
6
6
  import { useAsyncInvoke } from './useAsyncInvoke.internal';
@@ -194,32 +194,74 @@ import { useAsyncInvoke } from './useAsyncInvoke.internal';
194
194
  */
195
195
  export function useSPFxAadHttpClient(initialResourceUrl) {
196
196
  var consume = useSPFxServiceScope().consume;
197
+ // ═══════════════════════════════════════════════════════════════════════════
198
+ // STATE
199
+ // ═══════════════════════════════════════════════════════════════════════════
200
+ var _a = useState(initialResourceUrl), resourceUrl = _a[0], setResourceUrl = _a[1];
201
+ var _b = useState(undefined), client = _b[0], setClient = _b[1];
202
+ var _c = useState(!!initialResourceUrl), isInitializing = _c[0], setIsInitializing = _c[1];
203
+ var _d = useState(undefined), initError = _d[0], setInitError = _d[1];
204
+ // ═══════════════════════════════════════════════════════════════════════════
205
+ // REFS (for cleanup and preventing memory leaks)
206
+ // ═══════════════════════════════════════════════════════════════════════════
207
+ // Track component mounted state to prevent memory leaks
208
+ var isMountedRef = useRef(true);
209
+ // Cleanup on unmount
210
+ useEffect(function () {
211
+ return function () {
212
+ isMountedRef.current = false;
213
+ };
214
+ }, []);
215
+ // ═══════════════════════════════════════════════════════════════════════════
216
+ // FACTORY (lazy consume from ServiceScope)
217
+ // ═══════════════════════════════════════════════════════════════════════════
197
218
  // Lazy consume AadHttpClientFactory from ServiceScope (cached by useMemo)
198
219
  var factory = useMemo(function () {
199
220
  return consume(AadHttpClientFactory.serviceKey);
200
221
  }, [consume]);
201
- // State management for resourceUrl and client
202
- var _a = useState(initialResourceUrl), resourceUrl = _a[0], setResourceUrl = _a[1];
203
- var _b = useState(undefined), client = _b[0], setClient = _b[1];
222
+ // ═══════════════════════════════════════════════════════════════════════════
223
+ // INITIALIZATION EFFECT
224
+ // ═══════════════════════════════════════════════════════════════════════════
204
225
  // Initialize client when resourceUrl changes
205
226
  useEffect(function () {
206
- // Reset client immediately when resourceUrl changes
227
+ // Reset client and error immediately when resourceUrl changes
207
228
  setClient(undefined);
229
+ setInitError(undefined);
208
230
  if (!resourceUrl) {
231
+ setIsInitializing(false);
209
232
  return;
210
233
  }
234
+ setIsInitializing(true);
211
235
  // Get AadHttpClient for the specified resource
212
236
  factory
213
237
  .getClient(resourceUrl)
214
238
  .then(function (aadClient) {
215
- setClient(aadClient);
239
+ // Only update state if still mounted
240
+ if (isMountedRef.current) {
241
+ setClient(aadClient);
242
+ setIsInitializing(false);
243
+ }
216
244
  })
217
245
  .catch(function (err) {
218
- console.error('Failed to initialize AadHttpClient:', err);
246
+ // Only update state if still mounted
247
+ if (isMountedRef.current) {
248
+ var error_1 = err instanceof Error ? err : new Error(String(err));
249
+ setInitError(error_1);
250
+ setIsInitializing(false);
251
+ console.error('Failed to initialize AadHttpClient:', error_1);
252
+ }
219
253
  });
220
254
  }, [resourceUrl, factory]);
255
+ // ═══════════════════════════════════════════════════════════════════════════
256
+ // ASYNC INVOKE PATTERN
257
+ // ═══════════════════════════════════════════════════════════════════════════
221
258
  // Use shared async invocation pattern
222
- var _c = useAsyncInvoke(client, 'AadHttpClient not initialized. Set resourceUrl and wait for client initialization.'), invoke = _c.invoke, isLoading = _c.isLoading, error = _c.error, clearError = _c.clearError;
259
+ var _e = useAsyncInvoke(client, 'AadHttpClient not initialized. Set resourceUrl and wait for client initialization, or check initError.'), invoke = _e.invoke, isLoading = _e.isLoading, error = _e.error, clearError = _e.clearError;
260
+ // ═══════════════════════════════════════════════════════════════════════════
261
+ // COMPUTED STATE & RETURN
262
+ // ═══════════════════════════════════════════════════════════════════════════
263
+ // Computed: ready when client is available and no errors
264
+ var isReady = client !== undefined && !isInitializing && !initError;
223
265
  return {
224
266
  client: client,
225
267
  invoke: invoke,
@@ -228,6 +270,9 @@ export function useSPFxAadHttpClient(initialResourceUrl) {
228
270
  clearError: clearError,
229
271
  setResourceUrl: setResourceUrl,
230
272
  resourceUrl: resourceUrl,
273
+ isInitializing: isInitializing,
274
+ initError: initError,
275
+ isReady: isReady,
231
276
  };
232
277
  }
233
278
  //# sourceMappingURL=useSPFxAadHttpClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,6DAA6D;AAE7D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAiB,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAsD3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AACH,MAAM,UAAU,oBAAoB,CAAC,kBAA2B;IACtD,IAAA,OAAO,GAAK,mBAAmB,EAAE,QAA1B,CAA2B;IAE1C,0EAA0E;IAC1E,IAAM,OAAO,GAAG,OAAO,CAAC;QACtB,OAAO,OAAO,CAAuB,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,8CAA8C;IACxC,IAAA,KAAgC,QAAQ,CAAqB,kBAAkB,CAAC,EAA/E,WAAW,QAAA,EAAE,cAAc,QAAoD,CAAC;IACjF,IAAA,KAAsB,QAAQ,CAA4B,SAAS,CAAC,EAAnE,MAAM,QAAA,EAAE,SAAS,QAAkD,CAAC;IAE3E,6CAA6C;IAC7C,SAAS,CAAC;QACR,oDAAoD;QACpD,SAAS,CAAC,SAAS,CAAC,CAAC;QAErB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,OAAO;aACJ,SAAS,CAAC,WAAW,CAAC;aACtB,IAAI,CAAC,UAAC,SAAwB;YAC7B,SAAS,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC;aACD,KAAK,CAAC,UAAC,GAAU;YAChB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3B,sCAAsC;IAChC,IAAA,KAA2C,cAAc,CAC7D,MAAM,EACN,oFAAoF,CACrF,EAHO,MAAM,YAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAA,EAAE,UAAU,gBAG3C,CAAC;IAEF,OAAO;QACL,MAAM,QAAA;QACN,MAAM,QAAA;QACN,SAAS,WAAA;QACT,KAAK,OAAA;QACL,UAAU,YAAA;QACV,cAAc,gBAAA;QACd,WAAW,aAAA;KACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"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"}
@@ -6,15 +6,16 @@ export interface SPFxHttpClientInfo {
6
6
  /**
7
7
  * Native HttpClient from SPFx.
8
8
  * Provides access to generic HTTP endpoints (non-SharePoint).
9
- * Always available (non-undefined) after Provider initialization.
9
+ * Will be undefined if ServiceScope is not available.
10
10
  */
11
- readonly client: HttpClient;
11
+ readonly client: HttpClient | undefined;
12
12
  /**
13
13
  * Invoke HTTP API call with automatic state management.
14
14
  * Tracks loading state and captures errors automatically.
15
15
  *
16
16
  * @param fn - Function that receives HttpClient and returns a promise
17
17
  * @returns Promise with the result
18
+ * @throws Error if client is not available
18
19
  *
19
20
  * @example
20
21
  * ```tsx
@@ -39,6 +40,21 @@ export interface SPFxHttpClientInfo {
39
40
  readonly error: Error | undefined;
40
41
  /** Clear the current error */
41
42
  readonly clearError: () => void;
43
+ /**
44
+ * Computed state: true when client is ready for use.
45
+ * Equivalent to: client !== undefined
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const { isReady, invoke } = useSPFxHttpClient();
50
+ *
51
+ * if (!isReady) return <Spinner label="Waiting for HttpClient..." />;
52
+ *
53
+ * // Safe to use invoke
54
+ * const data = await invoke(c => c.get(...).then(r => r.json()));
55
+ * ```
56
+ */
57
+ readonly isReady: boolean;
42
58
  }
43
59
  /**
44
60
  * Hook to access generic HTTP client with built-in state management
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwLG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAqBtD"}
1
+ {"version":3,"file":"useSPFxHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAExC;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE3E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwLG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CA+BtD"}
@@ -192,17 +192,27 @@ import { useAsyncInvoke } from './useAsyncInvoke.internal';
192
192
  export function useSPFxHttpClient() {
193
193
  var consume = useSPFxServiceScope().consume;
194
194
  // Lazy consume HttpClient from ServiceScope (cached by useMemo)
195
+ // Returns undefined if ServiceScope is not available
195
196
  var client = useMemo(function () {
196
- return consume(HttpClient.serviceKey);
197
+ try {
198
+ return consume(HttpClient.serviceKey);
199
+ }
200
+ catch (err) {
201
+ console.error('Failed to consume HttpClient from ServiceScope:', err);
202
+ return undefined;
203
+ }
197
204
  }, [consume]);
198
205
  // Use shared async invocation pattern
199
- var _a = useAsyncInvoke(client, 'HttpClient not initialized. Check SPFx context.'), invoke = _a.invoke, isLoading = _a.isLoading, error = _a.error, clearError = _a.clearError;
206
+ var _a = useAsyncInvoke(client, 'HttpClient not available. Check SPFx context and ServiceScope.'), invoke = _a.invoke, isLoading = _a.isLoading, error = _a.error, clearError = _a.clearError;
207
+ // Computed: ready when client is available
208
+ var isReady = client !== undefined;
200
209
  return {
201
210
  client: client,
202
211
  invoke: invoke,
203
212
  isLoading: isLoading,
204
213
  error: error,
205
214
  clearError: clearError,
215
+ isReady: isReady,
206
216
  };
207
217
  }
208
218
  //# sourceMappingURL=useSPFxHttpClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxHttpClient.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,2DAA2D;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAgD3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwLG;AACH,MAAM,UAAU,iBAAiB;IACvB,IAAA,OAAO,GAAK,mBAAmB,EAAE,QAA1B,CAA2B;IAE1C,gEAAgE;IAChE,IAAM,MAAM,GAAG,OAAO,CAAC;QACrB,OAAO,OAAO,CAAa,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,sCAAsC;IAChC,IAAA,KAA2C,cAAc,CAC7D,MAAM,EACN,iDAAiD,CAClD,EAHO,MAAM,YAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAA,EAAE,UAAU,gBAG3C,CAAC;IAEF,OAAO;QACL,MAAM,QAAA;QACN,MAAM,QAAA;QACN,SAAS,WAAA;QACT,KAAK,OAAA;QACL,UAAU,YAAA;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useSPFxHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxHttpClient.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,2DAA2D;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAiE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwLG;AACH,MAAM,UAAU,iBAAiB;IACvB,IAAA,OAAO,GAAK,mBAAmB,EAAE,QAA1B,CAA2B;IAE1C,gEAAgE;IAChE,qDAAqD;IACrD,IAAM,MAAM,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,OAAO,CAAa,UAAU,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,GAAG,CAAC,CAAC;YACtE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,sCAAsC;IAChC,IAAA,KAA2C,cAAc,CAC7D,MAAM,EACN,gEAAgE,CACjE,EAHO,MAAM,YAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAA,EAAE,UAAU,gBAG3C,CAAC;IAEF,2CAA2C;IAC3C,IAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IAErC,OAAO;QACL,MAAM,QAAA;QACN,MAAM,QAAA;QACN,SAAS,WAAA;QACT,KAAK,OAAA;QACL,UAAU,YAAA;QACV,OAAO,SAAA;KACR,CAAC;AACJ,CAAC"}
@@ -6,6 +6,7 @@ export interface SPFxMSGraphClientInfo {
6
6
  /**
7
7
  * Native MSGraphClientV3 from SPFx.
8
8
  * Provides access to Microsoft Graph API with built-in authentication.
9
+ * Will be undefined until initialization completes.
9
10
  */
10
11
  readonly client: MSGraphClientV3 | undefined;
11
12
  /**
@@ -14,6 +15,7 @@ export interface SPFxMSGraphClientInfo {
14
15
  *
15
16
  * @param fn - Function that receives Graph client and returns a promise
16
17
  * @returns Promise with the result
18
+ * @throws Error if client is not initialized yet
17
19
  *
18
20
  * @example
19
21
  * ```tsx
@@ -27,16 +29,61 @@ export interface SPFxMSGraphClientInfo {
27
29
  readonly invoke: <T>(fn: (client: MSGraphClientV3) => Promise<T>) => Promise<T>;
28
30
  /**
29
31
  * Loading state - true during invoke() calls.
30
- * Does not track direct client usage.
32
+ * Does not track direct client usage or initialization.
31
33
  */
32
34
  readonly isLoading: boolean;
33
35
  /**
34
36
  * Last error from invoke() calls.
35
- * Does not capture errors from direct client usage.
37
+ * Does not capture errors from direct client usage or initialization.
38
+ * @see initError for initialization errors
36
39
  */
37
40
  readonly error: Error | undefined;
38
- /** Clear the current error */
41
+ /** Clear the current error from invoke() calls */
39
42
  readonly clearError: () => void;
43
+ /**
44
+ * True while the Graph client is being initialized.
45
+ * Use this to show a loading indicator during startup.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * const { client, isInitializing } = useSPFxMSGraphClient();
50
+ *
51
+ * if (isInitializing) return <Spinner label="Initializing Graph..." />;
52
+ * if (!client) return <Error message="Graph client unavailable" />;
53
+ * ```
54
+ */
55
+ readonly isInitializing: boolean;
56
+ /**
57
+ * Error that occurred during client initialization.
58
+ * If set, the client will remain undefined.
59
+ *
60
+ * @example
61
+ * ```tsx
62
+ * const { initError } = useSPFxMSGraphClient();
63
+ *
64
+ * if (initError) {
65
+ * return <MessageBar messageBarType={MessageBarType.error}>
66
+ * Failed to initialize Graph: {initError.message}
67
+ * </MessageBar>;
68
+ * }
69
+ * ```
70
+ */
71
+ readonly initError: Error | undefined;
72
+ /**
73
+ * Computed state: true when client is ready for use.
74
+ * Equivalent to: client !== undefined && !isInitializing && !initError
75
+ *
76
+ * @example
77
+ * ```tsx
78
+ * const { isReady, client, invoke } = useSPFxMSGraphClient();
79
+ *
80
+ * if (!isReady) return <Spinner />;
81
+ *
82
+ * // Safe to use client or invoke
83
+ * const data = await invoke(c => c.api('/me').get());
84
+ * ```
85
+ */
86
+ readonly isReady: boolean;
40
87
  }
41
88
  /**
42
89
  * Hook to access Microsoft Graph client with built-in state management
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxMSGraphClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxMSGraphClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAwB,MAAM,oBAAoB,CAAC;AAG3E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAE7C;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhF;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkKG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,CAoC5D"}
1
+ {"version":3,"file":"useSPFxMSGraphClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxMSGraphClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAwB,MAAM,oBAAoB,CAAC;AAG3E;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAE7C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAEhF;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IAEjC;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC;IAEtC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkKG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,CAqG5D"}
@@ -1,6 +1,6 @@
1
1
  // useSPFxMSGraphClient.ts
2
2
  // Hook to access Microsoft Graph client with state management
3
- import { useMemo, useState, useEffect } from 'react';
3
+ import { useMemo, useState, useEffect, useRef } from 'react';
4
4
  import { useSPFxServiceScope } from './useSPFxServiceScope';
5
5
  import { MSGraphClientFactory } from '@microsoft/sp-http';
6
6
  import { useAsyncInvoke } from './useAsyncInvoke.internal';
@@ -169,31 +169,84 @@ import { useAsyncInvoke } from './useAsyncInvoke.internal';
169
169
  */
170
170
  export function useSPFxMSGraphClient() {
171
171
  var consume = useSPFxServiceScope().consume;
172
+ // ═══════════════════════════════════════════════════════════════════════════
173
+ // STATE
174
+ // ═══════════════════════════════════════════════════════════════════════════
175
+ var _a = useState(undefined), client = _a[0], setClient = _a[1];
176
+ var _b = useState(true), isInitializing = _b[0], setIsInitializing = _b[1];
177
+ var _c = useState(undefined), initError = _c[0], setInitError = _c[1];
178
+ // ═══════════════════════════════════════════════════════════════════════════
179
+ // REFS (for cleanup and preventing double initialization)
180
+ // ═══════════════════════════════════════════════════════════════════════════
181
+ // Track component mounted state to prevent memory leaks
182
+ var isMountedRef = useRef(true);
183
+ // Track if initialization has been attempted (prevent double init)
184
+ var initAttemptedRef = useRef(false);
185
+ // Cleanup on unmount
186
+ useEffect(function () {
187
+ return function () {
188
+ isMountedRef.current = false;
189
+ };
190
+ }, []);
191
+ // ═══════════════════════════════════════════════════════════════════════════
192
+ // FACTORY (lazy consume from ServiceScope)
193
+ // ═══════════════════════════════════════════════════════════════════════════
172
194
  // Lazy consume MSGraphClientFactory from ServiceScope (cached by useMemo)
173
195
  var factory = useMemo(function () {
174
196
  return consume(MSGraphClientFactory.serviceKey);
175
197
  }, [consume]);
176
- var _a = useState(undefined), client = _a[0], setClient = _a[1];
198
+ // ═══════════════════════════════════════════════════════════════════════════
199
+ // INITIALIZATION EFFECT
200
+ // ═══════════════════════════════════════════════════════════════════════════
177
201
  // Initialize Graph client (factory.getClient is async)
178
202
  useEffect(function () {
203
+ // Prevent double initialization
204
+ if (initAttemptedRef.current) {
205
+ return;
206
+ }
207
+ initAttemptedRef.current = true;
208
+ // Reset state for new initialization
209
+ setIsInitializing(true);
210
+ setInitError(undefined);
179
211
  // Get MSGraphClientV3 (version 3 of Microsoft Graph JavaScript Client Library)
180
212
  factory
181
213
  .getClient('3')
182
214
  .then(function (graphClient) {
183
- setClient(graphClient);
215
+ // Only update state if still mounted
216
+ if (isMountedRef.current) {
217
+ setClient(graphClient);
218
+ setIsInitializing(false);
219
+ }
184
220
  })
185
221
  .catch(function (err) {
186
- console.error('Failed to initialize MSGraphClient:', err);
222
+ // Only update state if still mounted
223
+ if (isMountedRef.current) {
224
+ var error_1 = err instanceof Error ? err : new Error(String(err));
225
+ setInitError(error_1);
226
+ setIsInitializing(false);
227
+ console.error('Failed to initialize MSGraphClient:', error_1);
228
+ }
187
229
  });
188
230
  }, [factory]);
231
+ // ═══════════════════════════════════════════════════════════════════════════
232
+ // ASYNC INVOKE PATTERN
233
+ // ═══════════════════════════════════════════════════════════════════════════
189
234
  // Use shared async invocation pattern
190
- var _b = useAsyncInvoke(client, 'Graph client not initialized. Wait for client to be available.'), invoke = _b.invoke, isLoading = _b.isLoading, error = _b.error, clearError = _b.clearError;
235
+ var _d = useAsyncInvoke(client, 'Graph client not initialized. Wait for client to be available or check initError.'), invoke = _d.invoke, isLoading = _d.isLoading, error = _d.error, clearError = _d.clearError;
236
+ // ═══════════════════════════════════════════════════════════════════════════
237
+ // COMPUTED STATE & RETURN
238
+ // ═══════════════════════════════════════════════════════════════════════════
239
+ // Computed: ready when client is available and no errors
240
+ var isReady = client !== undefined && !isInitializing && !initError;
191
241
  return {
192
242
  client: client,
193
243
  invoke: invoke,
194
244
  isLoading: isLoading,
195
245
  error: error,
196
246
  clearError: clearError,
247
+ isInitializing: isInitializing,
248
+ initError: initError,
249
+ isReady: isReady,
197
250
  };
198
251
  }
199
252
  //# sourceMappingURL=useSPFxMSGraphClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxMSGraphClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxMSGraphClient.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,8DAA8D;AAE9D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAmB,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AA8C3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkKG;AACH,MAAM,UAAU,oBAAoB;IAC1B,IAAA,OAAO,GAAK,mBAAmB,EAAE,QAA1B,CAA2B;IAE1C,0EAA0E;IAC1E,IAAM,OAAO,GAAG,OAAO,CAAC;QACtB,OAAO,OAAO,CAAuB,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAER,IAAA,KAAsB,QAAQ,CAA8B,SAAS,CAAC,EAArE,MAAM,QAAA,EAAE,SAAS,QAAoD,CAAC;IAE7E,uDAAuD;IACvD,SAAS,CAAC;QACR,+EAA+E;QAC/E,OAAO;aACJ,SAAS,CAAC,GAAG,CAAC;aACd,IAAI,CAAC,UAAC,WAA4B;YACjC,SAAS,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC,CAAC;aACD,KAAK,CAAC,UAAC,GAAU;YAChB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,sCAAsC;IAChC,IAAA,KAA2C,cAAc,CAC7D,MAAM,EACN,gEAAgE,CACjE,EAHO,MAAM,YAAA,EAAE,SAAS,eAAA,EAAE,KAAK,WAAA,EAAE,UAAU,gBAG3C,CAAC;IAEF,OAAO;QACL,MAAM,QAAA;QACN,MAAM,QAAA;QACN,SAAS,WAAA;QACT,KAAK,OAAA;QACL,UAAU,YAAA;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useSPFxMSGraphClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxMSGraphClient.ts"],"names":[],"mappings":"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"}
@@ -284,6 +284,5 @@ export interface SPFxOneDriveAppDataOptions<T> {
284
284
  * }
285
285
  * ```
286
286
  */
287
- export declare function useSPFxOneDriveAppData<T = unknown>(fileName: string, folder?: string, autoFetch?: boolean): SPFxOneDriveAppDataResult<T>;
288
287
  export declare function useSPFxOneDriveAppData<T = unknown>(fileName: string, options?: SPFxOneDriveAppDataOptions<T>): SPFxOneDriveAppDataResult<T>;
289
288
  //# sourceMappingURL=useSPFxOneDriveAppData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxOneDriveAppData.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;IAEvC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;;;;;;;OASG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AAEH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAChD,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,OAAO,GAClB,yBAAyB,CAAC,CAAC,CAAC,CAAC;AAGhC,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACtC,yBAAyB,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"useSPFxOneDriveAppData.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"AA4DA;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;IAEvC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;;;;;;;OASG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B,CAAC,CAAC;IAC3C,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,CAAC;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,GAAG,OAAO,EAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC,GACtC,yBAAyB,CAAC,CAAC,CAAC,CAqP9B"}