@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.
- 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/useSPFxAadHttpClient.d.ts +46 -0
- package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +53 -8
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxHttpClient.d.ts +18 -2
- package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxHttpClient.js +12 -2
- 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 +58 -5
- 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/useSPFxSPHttpClient.d.ts +18 -2
- package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.js +12 -2
- package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +3 -7
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- 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
|
package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts.map
ADDED
|
@@ -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"}
|
package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.manifest.json
ADDED
|
@@ -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
|
+
}
|
|
@@ -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
|
|
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
|
-
//
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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;
|
|
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
|
-
*
|
|
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;
|
|
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
|
-
|
|
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
|
|
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;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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;
|
|
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":"
|
|
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"}
|