@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.
- package/README.md +52 -7217
- package/lib/core/context.internal.d.ts +6 -1
- package/lib/core/context.internal.d.ts.map +1 -1
- package/lib/core/context.internal.js +6 -1
- package/lib/core/context.internal.js.map +1 -1
- package/lib/core/index.d.ts +21 -0
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +21 -0
- package/lib/core/index.js.map +1 -1
- package/lib/core/provider-application-customizer.d.ts.map +1 -1
- package/lib/core/provider-application-customizer.js.map +1 -1
- package/lib/core/provider-field-customizer.d.ts.map +1 -1
- package/lib/core/provider-field-customizer.js.map +1 -1
- package/lib/core/provider-listview-commandset.d.ts.map +1 -1
- package/lib/core/provider-listview-commandset.js.map +1 -1
- package/lib/core/provider-webpart.d.ts.map +1 -1
- package/lib/core/provider-webpart.js.map +1 -1
- package/lib/core/types.d.ts +2 -0
- package/lib/core/types.d.ts.map +1 -1
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts +14 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts.map +1 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js +41 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.manifest.json +17 -0
- package/lib/extensions/spFxReactToolkitTest/loc/en-us.js +5 -0
- package/lib/hooks/index.d.ts +31 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +31 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useAsyncInvoke.internal.d.ts +58 -0
- package/lib/hooks/useAsyncInvoke.internal.d.ts.map +1 -0
- package/lib/hooks/useAsyncInvoke.internal.js +118 -0
- package/lib/hooks/useAsyncInvoke.internal.js.map +1 -0
- package/lib/hooks/useSPFxAadHttpClient.d.ts +46 -0
- package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +55 -80
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxContainerInfo.d.ts +2 -0
- package/lib/hooks/useSPFxContainerInfo.d.ts.map +1 -1
- package/lib/hooks/useSPFxContainerInfo.js +2 -0
- package/lib/hooks/useSPFxContainerInfo.js.map +1 -1
- package/lib/hooks/useSPFxDisplayMode.d.ts +4 -0
- package/lib/hooks/useSPFxDisplayMode.d.ts.map +1 -1
- package/lib/hooks/useSPFxDisplayMode.js +4 -0
- package/lib/hooks/useSPFxDisplayMode.js.map +1 -1
- package/lib/hooks/useSPFxHttpClient.d.ts +22 -2
- package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxHttpClient.js +19 -76
- package/lib/hooks/useSPFxHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxMSGraphClient.d.ts +50 -3
- package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxMSGraphClient.js +60 -77
- package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.d.ts +0 -1
- package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.js +352 -101
- package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
- package/lib/hooks/useSPFxPermissions.d.ts +15 -3
- package/lib/hooks/useSPFxPermissions.d.ts.map +1 -1
- package/lib/hooks/useSPFxPermissions.js.map +1 -1
- package/lib/hooks/useSPFxPnPContext.d.ts +4 -0
- package/lib/hooks/useSPFxPnPContext.d.ts.map +1 -1
- package/lib/hooks/useSPFxPnPContext.js +4 -0
- package/lib/hooks/useSPFxPnPContext.js.map +1 -1
- package/lib/hooks/useSPFxPnPSearch.d.ts.map +1 -1
- package/lib/hooks/useSPFxPnPSearch.js +61 -48
- package/lib/hooks/useSPFxPnPSearch.js.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.d.ts +18 -2
- package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.js +15 -75
- package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxThemeInfo.d.ts +2 -0
- package/lib/hooks/useSPFxThemeInfo.d.ts.map +1 -1
- package/lib/hooks/useSPFxThemeInfo.js +2 -0
- package/lib/hooks/useSPFxThemeInfo.js.map +1 -1
- package/lib/index.d.ts +27 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +27 -0
- package/lib/index.js.map +1 -1
- package/lib/utils/resize-observer.internal.d.ts +12 -2
- package/lib/utils/resize-observer.internal.d.ts.map +1 -1
- package/lib/utils/resize-observer.internal.js +12 -2
- package/lib/utils/resize-observer.internal.js.map +1 -1
- package/lib/utils/theme-subscription.internal.d.ts +12 -3
- package/lib/utils/theme-subscription.internal.d.ts.map +1 -1
- package/lib/utils/theme-subscription.internal.js +19 -3
- package/lib/utils/theme-subscription.internal.js.map +1 -1
- package/lib/utils/type-guards.internal.d.ts +78 -5
- package/lib/utils/type-guards.internal.d.ts.map +1 -1
- package/lib/utils/type-guards.internal.js +78 -5
- package/lib/utils/type-guards.internal.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts +0 -4
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +30 -746
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts +7 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js +131 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts +8 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js +158 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts +9 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js +159 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts +10 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js +141 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js +62 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js +98 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js +45 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js +134 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts +13 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/index.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/index.js +18 -0
- package/lib/webparts/spFxReactToolkitTest/components/demos/index.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts +18 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js +17 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts +16 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js +14 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/index.d.ts.map +1 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/index.js +6 -0
- package/lib/webparts/spFxReactToolkitTest/components/shared/index.js.map +1 -0
- 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
|
-
|
|
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
|
-
//
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
-
}
|
|
289
|
-
//
|
|
290
|
-
|
|
291
|
-
|
|
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":"AAAA,0BAA0B;AAC1B,6DAA6D
|
|
1
|
+
{"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
231
|
-
var _a =
|
|
232
|
-
|
|
233
|
-
|
|
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
|
|
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;
|
|
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"}
|