@apvee/spfx-react-toolkit 1.2.0 → 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 (144) hide show
  1. package/README.md +52 -7217
  2. package/lib/core/context.internal.d.ts +6 -1
  3. package/lib/core/context.internal.d.ts.map +1 -1
  4. package/lib/core/context.internal.js +6 -1
  5. package/lib/core/context.internal.js.map +1 -1
  6. package/lib/core/index.d.ts +21 -0
  7. package/lib/core/index.d.ts.map +1 -1
  8. package/lib/core/index.js +21 -0
  9. package/lib/core/index.js.map +1 -1
  10. package/lib/core/provider-application-customizer.d.ts.map +1 -1
  11. package/lib/core/provider-application-customizer.js.map +1 -1
  12. package/lib/core/provider-field-customizer.d.ts.map +1 -1
  13. package/lib/core/provider-field-customizer.js.map +1 -1
  14. package/lib/core/provider-listview-commandset.d.ts.map +1 -1
  15. package/lib/core/provider-listview-commandset.js.map +1 -1
  16. package/lib/core/provider-webpart.d.ts.map +1 -1
  17. package/lib/core/provider-webpart.js.map +1 -1
  18. package/lib/core/types.d.ts +2 -0
  19. package/lib/core/types.d.ts.map +1 -1
  20. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts +14 -0
  21. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts.map +1 -0
  22. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js +41 -0
  23. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -0
  24. package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.manifest.json +17 -0
  25. package/lib/extensions/spFxReactToolkitTest/loc/en-us.js +5 -0
  26. package/lib/hooks/index.d.ts +31 -0
  27. package/lib/hooks/index.d.ts.map +1 -1
  28. package/lib/hooks/index.js +31 -0
  29. package/lib/hooks/index.js.map +1 -1
  30. package/lib/hooks/useAsyncInvoke.internal.d.ts +58 -0
  31. package/lib/hooks/useAsyncInvoke.internal.d.ts.map +1 -0
  32. package/lib/hooks/useAsyncInvoke.internal.js +118 -0
  33. package/lib/hooks/useAsyncInvoke.internal.js.map +1 -0
  34. package/lib/hooks/useSPFxAadHttpClient.d.ts +46 -0
  35. package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
  36. package/lib/hooks/useSPFxAadHttpClient.js +55 -80
  37. package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
  38. package/lib/hooks/useSPFxContainerInfo.d.ts +2 -0
  39. package/lib/hooks/useSPFxContainerInfo.d.ts.map +1 -1
  40. package/lib/hooks/useSPFxContainerInfo.js +2 -0
  41. package/lib/hooks/useSPFxContainerInfo.js.map +1 -1
  42. package/lib/hooks/useSPFxDisplayMode.d.ts +4 -0
  43. package/lib/hooks/useSPFxDisplayMode.d.ts.map +1 -1
  44. package/lib/hooks/useSPFxDisplayMode.js +4 -0
  45. package/lib/hooks/useSPFxDisplayMode.js.map +1 -1
  46. package/lib/hooks/useSPFxHttpClient.d.ts +22 -2
  47. package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -1
  48. package/lib/hooks/useSPFxHttpClient.js +19 -76
  49. package/lib/hooks/useSPFxHttpClient.js.map +1 -1
  50. package/lib/hooks/useSPFxMSGraphClient.d.ts +50 -3
  51. package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
  52. package/lib/hooks/useSPFxMSGraphClient.js +60 -77
  53. package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
  54. package/lib/hooks/useSPFxOneDriveAppData.d.ts +0 -1
  55. package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
  56. package/lib/hooks/useSPFxOneDriveAppData.js +352 -101
  57. package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
  58. package/lib/hooks/useSPFxPermissions.d.ts +15 -3
  59. package/lib/hooks/useSPFxPermissions.d.ts.map +1 -1
  60. package/lib/hooks/useSPFxPermissions.js.map +1 -1
  61. package/lib/hooks/useSPFxPnPContext.d.ts +4 -0
  62. package/lib/hooks/useSPFxPnPContext.d.ts.map +1 -1
  63. package/lib/hooks/useSPFxPnPContext.js +4 -0
  64. package/lib/hooks/useSPFxPnPContext.js.map +1 -1
  65. package/lib/hooks/useSPFxPnPSearch.d.ts.map +1 -1
  66. package/lib/hooks/useSPFxPnPSearch.js +61 -48
  67. package/lib/hooks/useSPFxPnPSearch.js.map +1 -1
  68. package/lib/hooks/useSPFxSPHttpClient.d.ts +18 -2
  69. package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
  70. package/lib/hooks/useSPFxSPHttpClient.js +15 -75
  71. package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
  72. package/lib/hooks/useSPFxThemeInfo.d.ts +2 -0
  73. package/lib/hooks/useSPFxThemeInfo.d.ts.map +1 -1
  74. package/lib/hooks/useSPFxThemeInfo.js +2 -0
  75. package/lib/hooks/useSPFxThemeInfo.js.map +1 -1
  76. package/lib/index.d.ts +27 -0
  77. package/lib/index.d.ts.map +1 -1
  78. package/lib/index.js +27 -0
  79. package/lib/index.js.map +1 -1
  80. package/lib/utils/resize-observer.internal.d.ts +12 -2
  81. package/lib/utils/resize-observer.internal.d.ts.map +1 -1
  82. package/lib/utils/resize-observer.internal.js +12 -2
  83. package/lib/utils/resize-observer.internal.js.map +1 -1
  84. package/lib/utils/theme-subscription.internal.d.ts +12 -3
  85. package/lib/utils/theme-subscription.internal.d.ts.map +1 -1
  86. package/lib/utils/theme-subscription.internal.js +19 -3
  87. package/lib/utils/theme-subscription.internal.js.map +1 -1
  88. package/lib/utils/type-guards.internal.d.ts +78 -5
  89. package/lib/utils/type-guards.internal.d.ts.map +1 -1
  90. package/lib/utils/type-guards.internal.js +78 -5
  91. package/lib/utils/type-guards.internal.js.map +1 -1
  92. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts +0 -4
  93. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
  94. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +30 -746
  95. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
  96. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts +7 -0
  97. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts.map +1 -0
  98. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js +131 -0
  99. package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js.map +1 -0
  100. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts +8 -0
  101. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts.map +1 -0
  102. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js +158 -0
  103. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js.map +1 -0
  104. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts +9 -0
  105. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts.map +1 -0
  106. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js +159 -0
  107. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js.map +1 -0
  108. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts +10 -0
  109. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts.map +1 -0
  110. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js +141 -0
  111. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js.map +1 -0
  112. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts +6 -0
  113. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts.map +1 -0
  114. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js +62 -0
  115. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js.map +1 -0
  116. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts +6 -0
  117. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts.map +1 -0
  118. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js +98 -0
  119. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js.map +1 -0
  120. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts +6 -0
  121. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts.map +1 -0
  122. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js +45 -0
  123. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js.map +1 -0
  124. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts +6 -0
  125. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts.map +1 -0
  126. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js +134 -0
  127. package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js.map +1 -0
  128. package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts +13 -0
  129. package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts.map +1 -0
  130. package/lib/webparts/spFxReactToolkitTest/components/demos/index.js +18 -0
  131. package/lib/webparts/spFxReactToolkitTest/components/demos/index.js.map +1 -0
  132. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts +18 -0
  133. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts.map +1 -0
  134. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js +17 -0
  135. package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js.map +1 -0
  136. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts +16 -0
  137. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts.map +1 -0
  138. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js +14 -0
  139. package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js.map +1 -0
  140. package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts +6 -0
  141. package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts.map +1 -0
  142. package/lib/webparts/spFxReactToolkitTest/components/shared/index.js +6 -0
  143. package/lib/webparts/spFxReactToolkitTest/components/shared/index.js.map +1 -0
  144. package/package.json +14 -12
@@ -1,44 +1,9 @@
1
1
  // useSPFxAadHttpClient.ts
2
2
  // Hook to access Azure AD-secured APIs with state management
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
- return new (P || (P = Promise))(function (resolve, reject) {
6
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
- step((generator = generator.apply(thisArg, _arguments || [])).next());
10
- });
11
- };
12
- var __generator = (this && this.__generator) || function (thisArg, body) {
13
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
14
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
15
- function verb(n) { return function (v) { return step([n, v]); }; }
16
- function step(op) {
17
- if (f) throw new TypeError("Generator is already executing.");
18
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
19
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
20
- if (y = 0, t) op = [op[0] & 2, t.value];
21
- switch (op[0]) {
22
- case 0: case 1: t = op; break;
23
- case 4: _.label++; return { value: op[1], done: false };
24
- case 5: _.label++; y = op[1]; op = [0]; continue;
25
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
26
- default:
27
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
28
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
29
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
30
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
31
- if (t[2]) _.ops.pop();
32
- _.trys.pop(); continue;
33
- }
34
- op = body.call(thisArg, _);
35
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
36
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
37
- }
38
- };
39
- import { useMemo, useState, useCallback, useEffect } from 'react';
3
+ import { useMemo, useState, useEffect, useRef } from 'react';
40
4
  import { useSPFxServiceScope } from './useSPFxServiceScope';
41
5
  import { AadHttpClientFactory } from '@microsoft/sp-http';
6
+ import { useAsyncInvoke } from './useAsyncInvoke.internal';
42
7
  /**
43
8
  * Hook to access Azure AD-secured APIs with built-in state management
44
9
  *
@@ -228,68 +193,75 @@ import { AadHttpClientFactory } from '@microsoft/sp-http';
228
193
  * ```
229
194
  */
230
195
  export function useSPFxAadHttpClient(initialResourceUrl) {
231
- var _this = this;
232
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
+ // ═══════════════════════════════════════════════════════════════════════════
233
218
  // Lazy consume AadHttpClientFactory from ServiceScope (cached by useMemo)
234
219
  var factory = useMemo(function () {
235
220
  return consume(AadHttpClientFactory.serviceKey);
236
221
  }, [consume]);
237
- // State management
238
- var _a = useState(initialResourceUrl), resourceUrl = _a[0], setResourceUrl = _a[1];
239
- var _b = useState(undefined), client = _b[0], setClient = _b[1];
240
- var _c = useState(false), isLoading = _c[0], setIsLoading = _c[1];
241
- var _d = useState(undefined), error = _d[0], setError = _d[1];
222
+ // ═══════════════════════════════════════════════════════════════════════════
223
+ // INITIALIZATION EFFECT
224
+ // ═══════════════════════════════════════════════════════════════════════════
242
225
  // Initialize client when resourceUrl changes
243
226
  useEffect(function () {
244
- // Reset client immediately when resourceUrl changes
227
+ // Reset client and error immediately when resourceUrl changes
245
228
  setClient(undefined);
229
+ setInitError(undefined);
246
230
  if (!resourceUrl) {
231
+ setIsInitializing(false);
247
232
  return;
248
233
  }
234
+ setIsInitializing(true);
249
235
  // Get AadHttpClient for the specified resource
250
236
  factory
251
237
  .getClient(resourceUrl)
252
238
  .then(function (aadClient) {
253
- setClient(aadClient);
239
+ // Only update state if still mounted
240
+ if (isMountedRef.current) {
241
+ setClient(aadClient);
242
+ setIsInitializing(false);
243
+ }
254
244
  })
255
245
  .catch(function (err) {
256
- console.error('Failed to initialize AadHttpClient:', err);
257
- });
258
- }, [resourceUrl, factory]);
259
- // Invoke with automatic state management
260
- var invoke = useCallback(function (fn) { return __awaiter(_this, void 0, void 0, function () {
261
- var result, err_1, error_1;
262
- return __generator(this, function (_a) {
263
- switch (_a.label) {
264
- case 0:
265
- if (!client) {
266
- throw new Error('AadHttpClient not initialized. Set resourceUrl and wait for client initialization.');
267
- }
268
- setIsLoading(true);
269
- setError(undefined);
270
- _a.label = 1;
271
- case 1:
272
- _a.trys.push([1, 3, 4, 5]);
273
- return [4 /*yield*/, fn(client)];
274
- case 2:
275
- result = _a.sent();
276
- return [2 /*return*/, result];
277
- case 3:
278
- err_1 = _a.sent();
279
- error_1 = err_1 instanceof Error ? err_1 : new Error(String(err_1));
280
- setError(error_1);
281
- throw error_1;
282
- case 4:
283
- setIsLoading(false);
284
- return [7 /*endfinally*/];
285
- case 5: return [2 /*return*/];
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);
286
252
  }
287
253
  });
288
- }); }, [client]);
289
- // Clear error helper
290
- var clearError = useCallback(function () {
291
- setError(undefined);
292
- }, []);
254
+ }, [resourceUrl, factory]);
255
+ // ═══════════════════════════════════════════════════════════════════════════
256
+ // ASYNC INVOKE PATTERN
257
+ // ═══════════════════════════════════════════════════════════════════════════
258
+ // Use shared async invocation pattern
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;
293
265
  return {
294
266
  client: client,
295
267
  invoke: invoke,
@@ -298,6 +270,9 @@ export function useSPFxAadHttpClient(initialResourceUrl) {
298
270
  clearError: clearError,
299
271
  setResourceUrl: setResourceUrl,
300
272
  resourceUrl: resourceUrl,
273
+ isInitializing: isInitializing,
274
+ initError: initError,
275
+ isReady: isReady,
301
276
  };
302
277
  }
303
278
  //# sourceMappingURL=useSPFxAadHttpClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,8 @@ export interface SPFxContainerInfo {
22
22
  *
23
23
  * @returns Container element and size
24
24
  *
25
+ * @see {@link useSPFxContainerSize} for responsive breakpoint categories (small/medium/large)
26
+ *
25
27
  * @example
26
28
  * ```tsx
27
29
  * function MyComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxContainerInfo.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxContainerInfo.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IAE1C,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAaxD"}
1
+ {"version":3,"file":"useSPFxContainerInfo.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxContainerInfo.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IAE1C,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAaxD"}
@@ -17,6 +17,8 @@ import { useResizeObserver } from '../utils/resize-observer.internal';
17
17
  *
18
18
  * @returns Container element and size
19
19
  *
20
+ * @see {@link useSPFxContainerSize} for responsive breakpoint categories (small/medium/large)
21
+ *
20
22
  * @example
21
23
  * ```tsx
22
24
  * function MyComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxContainerInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxContainerInfo.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,4CAA4C;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AActE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,oBAAoB;IAClC,sDAAsD;IACtD,IAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACpD,IAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAEnD,wCAAwC;IACxC,IAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACpD,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO;QACL,OAAO,SAAA;QACP,IAAI,MAAA;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useSPFxContainerInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxContainerInfo.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,4CAA4C;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AActE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,oBAAoB;IAClC,sDAAsD;IACtD,IAAM,OAAO,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACpD,IAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAEnD,wCAAwC;IACxC,IAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACpD,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEpC,OAAO;QACL,OAAO,SAAA;QACP,IAAI,MAAA;KACL,CAAC;AACJ,CAAC"}
@@ -27,6 +27,8 @@ export interface SPFxDisplayModeInfo {
27
27
  *
28
28
  * @returns Display mode information
29
29
  *
30
+ * @see {@link useSPFxIsEdit} for a simple boolean shortcut
31
+ *
30
32
  * @example
31
33
  * ```tsx
32
34
  * function MyComponent() {
@@ -48,6 +50,8 @@ export declare function useSPFxDisplayMode(): SPFxDisplayModeInfo;
48
50
  *
49
51
  * @returns true if in Edit mode, false otherwise
50
52
  *
53
+ * @see {@link useSPFxDisplayMode} for full display mode information
54
+ *
51
55
  * @example
52
56
  * ```tsx
53
57
  * function MyComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxDisplayMode.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxDisplayMode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAE3B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CAexD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAGvC"}
1
+ {"version":3,"file":"useSPFxDisplayMode.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxDisplayMode.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAE3B,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzB,qCAAqC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CAexD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAGvC"}
@@ -20,6 +20,8 @@ import { spfxAtoms } from './../core/atoms.internal';
20
20
  *
21
21
  * @returns Display mode information
22
22
  *
23
+ * @see {@link useSPFxIsEdit} for a simple boolean shortcut
24
+ *
23
25
  * @example
24
26
  * ```tsx
25
27
  * function MyComponent() {
@@ -53,6 +55,8 @@ export function useSPFxDisplayMode() {
53
55
  *
54
56
  * @returns true if in Edit mode, false otherwise
55
57
  *
58
+ * @see {@link useSPFxDisplayMode} for full display mode information
59
+ *
56
60
  * @example
57
61
  * ```tsx
58
62
  * function MyComponent() {
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxDisplayMode.js","sourceRoot":"","sources":["../../src/hooks/useSPFxDisplayMode.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,0CAA0C;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAgBrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,kBAAkB;IAChC,kDAAkD;IAClD,IAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEtD,kCAAkC;IAClC,IAAM,IAAI,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,WAAW,CAAC,IAAI,CAAC;IAE3C,IAAM,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IACzC,IAAM,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IAEzC,OAAO;QACL,IAAI,MAAA;QACJ,MAAM,QAAA;QACN,MAAM,QAAA;KACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,aAAa;IACnB,IAAA,MAAM,GAAK,kBAAkB,EAAE,OAAzB,CAA0B;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"useSPFxDisplayMode.js","sourceRoot":"","sources":["../../src/hooks/useSPFxDisplayMode.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,0CAA0C;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAgBrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,kBAAkB;IAChC,kDAAkD;IAClD,IAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEtD,kCAAkC;IAClC,IAAM,IAAI,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,WAAW,CAAC,IAAI,CAAC;IAE3C,IAAM,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IACzC,IAAM,MAAM,GAAG,IAAI,KAAK,WAAW,CAAC,IAAI,CAAC;IAEzC,OAAO;QACL,IAAI,MAAA;QACJ,MAAM,QAAA;QACN,MAAM,QAAA;KACP,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa;IACnB,IAAA,MAAM,GAAK,kBAAkB,EAAE,OAAzB,CAA0B;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -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
@@ -73,6 +89,10 @@ export interface SPFxHttpClientInfo {
73
89
  *
74
90
  * Use HttpClient for external APIs, SPHttpClient for SharePoint `/_api/` endpoints.
75
91
  *
92
+ * @see {@link useSPFxSPHttpClient} for SharePoint REST API calls
93
+ * @see {@link useSPFxAadHttpClient} for Azure AD secured API calls
94
+ * @see {@link useSPFxMSGraphClient} for Microsoft Graph API calls
95
+ *
76
96
  * @example Using invoke with public API
77
97
  * ```tsx
78
98
  * function WeatherWidget() {
@@ -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;AAEhD;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAgDtD"}
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"}
@@ -1,44 +1,9 @@
1
1
  // useSPFxHttpClient.ts
2
2
  // Hook to access generic HTTP client with state management
3
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
4
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5
- return new (P || (P = Promise))(function (resolve, reject) {
6
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
9
- step((generator = generator.apply(thisArg, _arguments || [])).next());
10
- });
11
- };
12
- var __generator = (this && this.__generator) || function (thisArg, body) {
13
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
14
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
15
- function verb(n) { return function (v) { return step([n, v]); }; }
16
- function step(op) {
17
- if (f) throw new TypeError("Generator is already executing.");
18
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
19
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
20
- if (y = 0, t) op = [op[0] & 2, t.value];
21
- switch (op[0]) {
22
- case 0: case 1: t = op; break;
23
- case 4: _.label++; return { value: op[1], done: false };
24
- case 5: _.label++; y = op[1]; op = [0]; continue;
25
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
26
- default:
27
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
28
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
29
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
30
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
31
- if (t[2]) _.ops.pop();
32
- _.trys.pop(); continue;
33
- }
34
- op = body.call(thisArg, _);
35
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
36
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
37
- }
38
- };
39
- import { useMemo, useState, useCallback } from 'react';
3
+ import { useMemo } from 'react';
40
4
  import { useSPFxServiceScope } from './useSPFxServiceScope';
41
5
  import { HttpClient } from '@microsoft/sp-http';
6
+ import { useAsyncInvoke } from './useAsyncInvoke.internal';
42
7
  /**
43
8
  * Hook to access generic HTTP client with built-in state management
44
9
  *
@@ -72,6 +37,10 @@ import { HttpClient } from '@microsoft/sp-http';
72
37
  *
73
38
  * Use HttpClient for external APIs, SPHttpClient for SharePoint `/_api/` endpoints.
74
39
  *
40
+ * @see {@link useSPFxSPHttpClient} for SharePoint REST API calls
41
+ * @see {@link useSPFxAadHttpClient} for Azure AD secured API calls
42
+ * @see {@link useSPFxMSGraphClient} for Microsoft Graph API calls
43
+ *
75
44
  * @example Using invoke with public API
76
45
  * ```tsx
77
46
  * function WeatherWidget() {
@@ -221,55 +190,29 @@ import { HttpClient } from '@microsoft/sp-http';
221
190
  * ```
222
191
  */
223
192
  export function useSPFxHttpClient() {
224
- var _this = this;
225
193
  var consume = useSPFxServiceScope().consume;
226
194
  // Lazy consume HttpClient from ServiceScope (cached by useMemo)
195
+ // Returns undefined if ServiceScope is not available
227
196
  var client = useMemo(function () {
228
- 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
+ }
229
204
  }, [consume]);
230
- // State management
231
- var _a = useState(false), isLoading = _a[0], setIsLoading = _a[1];
232
- var _b = useState(undefined), error = _b[0], setError = _b[1];
233
- // Invoke with automatic state management
234
- var invoke = useCallback(function (fn) { return __awaiter(_this, void 0, void 0, function () {
235
- var result, err_1, error_1;
236
- return __generator(this, function (_a) {
237
- switch (_a.label) {
238
- case 0:
239
- if (!client) {
240
- throw new Error('HttpClient not initialized. Check SPFx context.');
241
- }
242
- setIsLoading(true);
243
- setError(undefined);
244
- _a.label = 1;
245
- case 1:
246
- _a.trys.push([1, 3, 4, 5]);
247
- return [4 /*yield*/, fn(client)];
248
- case 2:
249
- result = _a.sent();
250
- return [2 /*return*/, result];
251
- case 3:
252
- err_1 = _a.sent();
253
- error_1 = err_1 instanceof Error ? err_1 : new Error(String(err_1));
254
- setError(error_1);
255
- throw error_1;
256
- case 4:
257
- setIsLoading(false);
258
- return [7 /*endfinally*/];
259
- case 5: return [2 /*return*/];
260
- }
261
- });
262
- }); }, [client]);
263
- // Clear error helper
264
- var clearError = useCallback(function () {
265
- setError(undefined);
266
- }, []);
205
+ // Use shared async invocation pattern
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;
267
209
  return {
268
210
  client: client,
269
211
  invoke: invoke,
270
212
  isLoading: isLoading,
271
213
  error: error,
272
214
  clearError: clearError,
215
+ isReady: isReady,
273
216
  };
274
217
  }
275
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,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAgDhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoLG;AACH,MAAM,UAAU,iBAAiB;IAAjC,iBAgDC;IA/CS,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,mBAAmB;IACb,IAAA,KAA4B,QAAQ,CAAC,KAAK,CAAC,EAA1C,SAAS,QAAA,EAAE,YAAY,QAAmB,CAAC;IAC5C,IAAA,KAAoB,QAAQ,CAAoB,SAAS,CAAC,EAAzD,KAAK,QAAA,EAAE,QAAQ,QAA0C,CAAC;IAEjE,yCAAyC;IACzC,IAAM,MAAM,GAAG,WAAW,CACxB,UAAU,EAAsC;;;;;oBAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;oBACrE,CAAC;oBAED,YAAY,CAAC,IAAI,CAAC,CAAC;oBACnB,QAAQ,CAAC,SAAS,CAAC,CAAC;;;;oBAGH,qBAAM,EAAE,CAAC,MAAM,CAAC,EAAA;;oBAAzB,MAAM,GAAG,SAAgB;oBAC/B,sBAAO,MAAM,EAAC;;;oBAER,UAAQ,KAAG,YAAY,KAAK,CAAC,CAAC,CAAC,KAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAG,CAAC,CAAC,CAAC;oBAClE,QAAQ,CAAC,OAAK,CAAC,CAAC;oBAChB,MAAM,OAAK,CAAC;;oBAEZ,YAAY,CAAC,KAAK,CAAC,CAAC;;;;;SAEvB,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,qBAAqB;IACrB,IAAM,UAAU,GAAG,WAAW,CAAC;QAC7B,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,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;AAE3E;;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,CA6D5D"}
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"}