@apvee/spfx-react-toolkit 1.0.0 → 1.2.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 +5973 -713
- package/lib/core/provider-base.internal.d.ts +7 -2
- package/lib/core/provider-base.internal.d.ts.map +1 -1
- package/lib/core/provider-base.internal.js +27 -0
- package/lib/core/provider-base.internal.js.map +1 -1
- package/lib/hooks/index.d.ts +2 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +2 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.d.ts +9 -4
- package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +18 -14
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxContext.d.ts +0 -1
- package/lib/hooks/useSPFxContext.d.ts.map +1 -1
- package/lib/hooks/useSPFxContext.js +0 -1
- package/lib/hooks/useSPFxContext.js.map +1 -1
- package/lib/hooks/useSPFxHttpClient.d.ts +225 -0
- package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -0
- package/lib/hooks/useSPFxHttpClient.js +275 -0
- package/lib/hooks/useSPFxHttpClient.js.map +1 -0
- package/lib/hooks/useSPFxMSGraphClient.d.ts +9 -4
- package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxMSGraphClient.js +19 -14
- package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.d.ts +25 -0
- package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.js +121 -256
- package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
- package/lib/hooks/useSPFxPageContext.d.ts +3 -3
- package/lib/hooks/useSPFxPageContext.d.ts.map +1 -1
- package/lib/hooks/useSPFxPageContext.js +11 -12
- package/lib/hooks/useSPFxPageContext.js.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.d.ts +12 -6
- package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.js +23 -21
- 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 +148 -51
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import type { SPFxProviderProps } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* SPFxProviderBase - Internal base provider with shared logic
|
|
@@ -6,6 +6,11 @@ import type { SPFxProviderProps } from './types';
|
|
|
6
6
|
* Creates an isolated Jotai store for each instance, ensuring complete
|
|
7
7
|
* state isolation between multiple SPFx components on the same page.
|
|
8
8
|
*
|
|
9
|
+
* The provider ensures SPFx ServiceScope is finished before rendering children,
|
|
10
|
+
* guaranteeing that all services are available for consumption via dependency
|
|
11
|
+
* injection in hooks. This prevents race conditions and ensures type-safe access
|
|
12
|
+
* to SPFx services.
|
|
13
|
+
*
|
|
9
14
|
* DO NOT use directly - use type-specific providers instead:
|
|
10
15
|
* - SPFxWebPartProvider
|
|
11
16
|
* - SPFxApplicationCustomizerProvider
|
|
@@ -16,5 +21,5 @@ import type { SPFxProviderProps } from './types';
|
|
|
16
21
|
*
|
|
17
22
|
* @internal
|
|
18
23
|
*/
|
|
19
|
-
export declare function SPFxProviderBase<TProps extends {} = {}>(props: SPFxProviderProps<TProps>):
|
|
24
|
+
export declare function SPFxProviderBase<TProps extends {} = {}>(props: SPFxProviderProps<TProps>): React.ReactElement;
|
|
20
25
|
//# sourceMappingURL=provider-base.internal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-base.internal.d.ts","sourceRoot":"","sources":["../../src/core/provider-base.internal.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"provider-base.internal.d.ts","sourceRoot":"","sources":["../../src/core/provider-base.internal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAOnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,EAAE,GAAG,EAAE,EACrD,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAC/B,KAAK,CAAC,YAAY,CA0JpB"}
|
|
@@ -12,6 +12,11 @@ import { useThemeSubscription } from '../utils/theme-subscription.internal';
|
|
|
12
12
|
* Creates an isolated Jotai store for each instance, ensuring complete
|
|
13
13
|
* state isolation between multiple SPFx components on the same page.
|
|
14
14
|
*
|
|
15
|
+
* The provider ensures SPFx ServiceScope is finished before rendering children,
|
|
16
|
+
* guaranteeing that all services are available for consumption via dependency
|
|
17
|
+
* injection in hooks. This prevents race conditions and ensures type-safe access
|
|
18
|
+
* to SPFx services.
|
|
19
|
+
*
|
|
15
20
|
* DO NOT use directly - use type-specific providers instead:
|
|
16
21
|
* - SPFxWebPartProvider
|
|
17
22
|
* - SPFxApplicationCustomizerProvider
|
|
@@ -35,6 +40,22 @@ export function SPFxProviderBase(props) {
|
|
|
35
40
|
var context = instanceAny.context;
|
|
36
41
|
// Extract instanceId type-safe (all SPFx contexts extend BaseComponentContext)
|
|
37
42
|
var instanceId = React.useMemo(function () { return context.instanceId; }, [context]);
|
|
43
|
+
// Extract serviceScope and ensure it's finished before rendering
|
|
44
|
+
var serviceScope = React.useMemo(function () { return context.serviceScope; }, [context]);
|
|
45
|
+
var _a = React.useState(false), isScopeReady = _a[0], setIsScopeReady = _a[1];
|
|
46
|
+
// Wait for serviceScope to be finished before rendering children
|
|
47
|
+
React.useEffect(function () {
|
|
48
|
+
if (!serviceScope) {
|
|
49
|
+
// Fallback: if no serviceScope, proceed (shouldn't happen in valid SPFx)
|
|
50
|
+
setIsScopeReady(true);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// whenFinished callback fires immediately if already finished (synchronous)
|
|
54
|
+
// or later when finished (asynchronous) - handles both scenarios
|
|
55
|
+
serviceScope.whenFinished(function () {
|
|
56
|
+
setIsScopeReady(true);
|
|
57
|
+
});
|
|
58
|
+
}, [serviceScope]);
|
|
38
59
|
// Create isolated Jotai store for this Provider instance
|
|
39
60
|
// Each store is independent, ensuring complete state isolation
|
|
40
61
|
var store = React.useMemo(function () { return createStore(); }, []);
|
|
@@ -120,6 +141,12 @@ export function SPFxProviderBase(props) {
|
|
|
120
141
|
spfxContext: context,
|
|
121
142
|
kind: kind,
|
|
122
143
|
}); }, [instanceId, context, kind]);
|
|
144
|
+
// Guard: Wait for serviceScope to be finished before rendering children
|
|
145
|
+
// This ensures all hooks can safely consume services via serviceScope.consume()
|
|
146
|
+
// If serviceScope is already finished, this guard passes immediately (no flash)
|
|
147
|
+
if (!isScopeReady) {
|
|
148
|
+
return React.createElement(React.Fragment, undefined);
|
|
149
|
+
}
|
|
123
150
|
return (React.createElement(Provider, { store: store },
|
|
124
151
|
React.createElement(SPFxContext.Provider, { value: contextValue }, children)));
|
|
125
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-base.internal.js","sourceRoot":"","sources":["../../src/core/provider-base.internal.tsx"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,oEAAoE;AAEpE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACL,mBAAmB,EACnB,SAAS,GACV,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E
|
|
1
|
+
{"version":3,"file":"provider-base.internal.js","sourceRoot":"","sources":["../../src/core/provider-base.internal.tsx"],"names":[],"mappings":"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"}
|
package/lib/hooks/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from './useSPFxContainerInfo';
|
|
|
3
3
|
export * from './useSPFxContainerSize';
|
|
4
4
|
export * from './useSPFxCorrelationInfo';
|
|
5
5
|
export * from './useSPFxCrossSitePermissions';
|
|
6
|
+
export * from './useSPFxHttpClient';
|
|
6
7
|
export * from './useSPFxDisplayMode';
|
|
7
8
|
export * from './useSPFxEnvironmentInfo';
|
|
8
9
|
export * from './useSPFxFluent9ThemeInfo';
|
|
@@ -31,4 +32,5 @@ export * from './useSPFxTenantProperty';
|
|
|
31
32
|
export * from './useSPFxThemeInfo';
|
|
32
33
|
export * from './useSPFxUserInfo';
|
|
33
34
|
export * from './useSPFxUserPhoto';
|
|
35
|
+
export * from './useSPFxContext';
|
|
34
36
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/hooks/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
package/lib/hooks/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from './useSPFxContainerInfo';
|
|
|
3
3
|
export * from './useSPFxContainerSize';
|
|
4
4
|
export * from './useSPFxCorrelationInfo';
|
|
5
5
|
export * from './useSPFxCrossSitePermissions';
|
|
6
|
+
export * from './useSPFxHttpClient';
|
|
6
7
|
export * from './useSPFxDisplayMode';
|
|
7
8
|
export * from './useSPFxEnvironmentInfo';
|
|
8
9
|
export * from './useSPFxFluent9ThemeInfo';
|
|
@@ -31,4 +32,5 @@ export * from './useSPFxTenantProperty';
|
|
|
31
32
|
export * from './useSPFxThemeInfo';
|
|
32
33
|
export * from './useSPFxUserInfo';
|
|
33
34
|
export * from './useSPFxUserPhoto';
|
|
35
|
+
export * from './useSPFxContext';
|
|
34
36
|
//# sourceMappingURL=index.js.map
|
package/lib/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AadHttpClient } from '@microsoft/sp-http';
|
|
2
2
|
/**
|
|
3
3
|
* Return type for useSPFxAadHttpClient hook
|
|
4
4
|
*/
|
|
@@ -55,13 +55,18 @@ export interface SPFxAadHttpClientInfo {
|
|
|
55
55
|
*
|
|
56
56
|
* For type safety, import SPFx types:
|
|
57
57
|
* ```typescript
|
|
58
|
-
* import
|
|
58
|
+
* import { AadHttpClient } from '@microsoft/sp-http';
|
|
59
59
|
* ```
|
|
60
60
|
*
|
|
61
61
|
* Requirements:
|
|
62
62
|
* - Add permissions to package-solution.json webApiPermissionRequests
|
|
63
63
|
* - Admin must grant permissions in SharePoint Admin Center
|
|
64
|
-
* -
|
|
64
|
+
* - SPFx ServiceScope with AadHttpClientFactory service
|
|
65
|
+
*
|
|
66
|
+
* @remarks
|
|
67
|
+
* This hook consumes AadHttpClientFactory from SPFx ServiceScope using dependency injection.
|
|
68
|
+
* The factory is consumed lazily and cached. The factory.getClient() method is then called
|
|
69
|
+
* asynchronously for each resourceUrl to obtain the AadHttpClient instance.
|
|
65
70
|
*
|
|
66
71
|
* @param initialResourceUrl - Azure AD resource URL or App ID (optional, can be set later)
|
|
67
72
|
*
|
|
@@ -98,7 +103,7 @@ export interface SPFxAadHttpClientInfo {
|
|
|
98
103
|
*
|
|
99
104
|
* @example Using client directly for advanced control
|
|
100
105
|
* ```tsx
|
|
101
|
-
* import
|
|
106
|
+
* import { AadHttpClient } from '@microsoft/sp-http';
|
|
102
107
|
*
|
|
103
108
|
* function ProductsManager() {
|
|
104
109
|
* const { client, resourceUrl } = useSPFxAadHttpClient('https://api.contoso.com');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxAadHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,
|
|
1
|
+
{"version":3,"file":"useSPFxAadHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAE3C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE9E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/C,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2LG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CA0EvF"}
|
|
@@ -36,8 +36,9 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
36
36
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
|
-
import { useState, useCallback, useEffect } from 'react';
|
|
40
|
-
import {
|
|
39
|
+
import { useMemo, useState, useCallback, useEffect } from 'react';
|
|
40
|
+
import { useSPFxServiceScope } from './useSPFxServiceScope';
|
|
41
|
+
import { AadHttpClientFactory } from '@microsoft/sp-http';
|
|
41
42
|
/**
|
|
42
43
|
* Hook to access Azure AD-secured APIs with built-in state management
|
|
43
44
|
*
|
|
@@ -49,13 +50,18 @@ import { useSPFxContext } from './useSPFxContext';
|
|
|
49
50
|
*
|
|
50
51
|
* For type safety, import SPFx types:
|
|
51
52
|
* ```typescript
|
|
52
|
-
* import
|
|
53
|
+
* import { AadHttpClient } from '@microsoft/sp-http';
|
|
53
54
|
* ```
|
|
54
55
|
*
|
|
55
56
|
* Requirements:
|
|
56
57
|
* - Add permissions to package-solution.json webApiPermissionRequests
|
|
57
58
|
* - Admin must grant permissions in SharePoint Admin Center
|
|
58
|
-
* -
|
|
59
|
+
* - SPFx ServiceScope with AadHttpClientFactory service
|
|
60
|
+
*
|
|
61
|
+
* @remarks
|
|
62
|
+
* This hook consumes AadHttpClientFactory from SPFx ServiceScope using dependency injection.
|
|
63
|
+
* The factory is consumed lazily and cached. The factory.getClient() method is then called
|
|
64
|
+
* asynchronously for each resourceUrl to obtain the AadHttpClient instance.
|
|
59
65
|
*
|
|
60
66
|
* @param initialResourceUrl - Azure AD resource URL or App ID (optional, can be set later)
|
|
61
67
|
*
|
|
@@ -92,7 +98,7 @@ import { useSPFxContext } from './useSPFxContext';
|
|
|
92
98
|
*
|
|
93
99
|
* @example Using client directly for advanced control
|
|
94
100
|
* ```tsx
|
|
95
|
-
* import
|
|
101
|
+
* import { AadHttpClient } from '@microsoft/sp-http';
|
|
96
102
|
*
|
|
97
103
|
* function ProductsManager() {
|
|
98
104
|
* const { client, resourceUrl } = useSPFxAadHttpClient('https://api.contoso.com');
|
|
@@ -223,9 +229,11 @@ import { useSPFxContext } from './useSPFxContext';
|
|
|
223
229
|
*/
|
|
224
230
|
export function useSPFxAadHttpClient(initialResourceUrl) {
|
|
225
231
|
var _this = this;
|
|
226
|
-
var
|
|
227
|
-
//
|
|
228
|
-
var
|
|
232
|
+
var consume = useSPFxServiceScope().consume;
|
|
233
|
+
// Lazy consume AadHttpClientFactory from ServiceScope (cached by useMemo)
|
|
234
|
+
var factory = useMemo(function () {
|
|
235
|
+
return consume(AadHttpClientFactory.serviceKey);
|
|
236
|
+
}, [consume]);
|
|
229
237
|
// State management
|
|
230
238
|
var _a = useState(initialResourceUrl), resourceUrl = _a[0], setResourceUrl = _a[1];
|
|
231
239
|
var _b = useState(undefined), client = _b[0], setClient = _b[1];
|
|
@@ -238,12 +246,8 @@ export function useSPFxAadHttpClient(initialResourceUrl) {
|
|
|
238
246
|
if (!resourceUrl) {
|
|
239
247
|
return;
|
|
240
248
|
}
|
|
241
|
-
if (!ctx.aadHttpClientFactory) {
|
|
242
|
-
console.warn('AadHttpClientFactory not available in SPFx context');
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
249
|
// Get AadHttpClient for the specified resource
|
|
246
|
-
|
|
250
|
+
factory
|
|
247
251
|
.getClient(resourceUrl)
|
|
248
252
|
.then(function (aadClient) {
|
|
249
253
|
setClient(aadClient);
|
|
@@ -251,7 +255,7 @@ export function useSPFxAadHttpClient(initialResourceUrl) {
|
|
|
251
255
|
.catch(function (err) {
|
|
252
256
|
console.error('Failed to initialize AadHttpClient:', err);
|
|
253
257
|
});
|
|
254
|
-
}, [resourceUrl,
|
|
258
|
+
}, [resourceUrl, factory]);
|
|
255
259
|
// Invoke with automatic state management
|
|
256
260
|
var invoke = useCallback(function (fn) { return __awaiter(_this, void 0, void 0, function () {
|
|
257
261
|
var result, err_1, error_1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,6DAA6D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useSPFxAadHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxAadHttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,6 @@ import { useSPFxContext } from '../core/context.internal';
|
|
|
8
8
|
* - kind: Type of host component ('WebPart', 'AppCustomizer', etc.)
|
|
9
9
|
*
|
|
10
10
|
* @throws Error if used outside SPFxProvider
|
|
11
|
-
* @internal - Not exported in public API
|
|
12
11
|
*/
|
|
13
12
|
export { useSPFxContext };
|
|
14
13
|
//# sourceMappingURL=useSPFxContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxContext.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"useSPFxContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxContext.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;;;;;;;;GASG;AACH,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -10,7 +10,6 @@ import { useSPFxContext } from '../core/context.internal';
|
|
|
10
10
|
* - kind: Type of host component ('WebPart', 'AppCustomizer', etc.)
|
|
11
11
|
*
|
|
12
12
|
* @throws Error if used outside SPFxProvider
|
|
13
|
-
* @internal - Not exported in public API
|
|
14
13
|
*/
|
|
15
14
|
export { useSPFxContext };
|
|
16
15
|
//# sourceMappingURL=useSPFxContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxContext.js","sourceRoot":"","sources":["../../src/hooks/useSPFxContext.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,gDAAgD;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"useSPFxContext.js","sourceRoot":"","sources":["../../src/hooks/useSPFxContext.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,gDAAgD;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D;;;;;;;;;GASG;AACH,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { HttpClient } from '@microsoft/sp-http';
|
|
2
|
+
/**
|
|
3
|
+
* Return type for useSPFxHttpClient hook
|
|
4
|
+
*/
|
|
5
|
+
export interface SPFxHttpClientInfo {
|
|
6
|
+
/**
|
|
7
|
+
* Native HttpClient from SPFx.
|
|
8
|
+
* Provides access to generic HTTP endpoints (non-SharePoint).
|
|
9
|
+
* Always available (non-undefined) after Provider initialization.
|
|
10
|
+
*/
|
|
11
|
+
readonly client: HttpClient;
|
|
12
|
+
/**
|
|
13
|
+
* Invoke HTTP API call with automatic state management.
|
|
14
|
+
* Tracks loading state and captures errors automatically.
|
|
15
|
+
*
|
|
16
|
+
* @param fn - Function that receives HttpClient and returns a promise
|
|
17
|
+
* @returns Promise with the result
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```tsx
|
|
21
|
+
* const { invoke } = useSPFxHttpClient();
|
|
22
|
+
*
|
|
23
|
+
* const data = await invoke(client =>
|
|
24
|
+
* client.get('https://api.example.com/data', HttpClient.configurations.v1)
|
|
25
|
+
* .then(res => res.json())
|
|
26
|
+
* );
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
readonly invoke: <T>(fn: (client: HttpClient) => Promise<T>) => Promise<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Loading state - true during invoke() calls.
|
|
32
|
+
* Does not track direct client usage.
|
|
33
|
+
*/
|
|
34
|
+
readonly isLoading: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Last error from invoke() calls.
|
|
37
|
+
* Does not capture errors from direct client usage.
|
|
38
|
+
*/
|
|
39
|
+
readonly error: Error | undefined;
|
|
40
|
+
/** Clear the current error */
|
|
41
|
+
readonly clearError: () => void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Hook to access generic HTTP client with built-in state management
|
|
45
|
+
*
|
|
46
|
+
* Provides native HttpClient for generic HTTP requests to external APIs,
|
|
47
|
+
* webhooks, or any non-SharePoint endpoints. For SharePoint REST API calls,
|
|
48
|
+
* use useSPFxSPHttpClient instead.
|
|
49
|
+
*
|
|
50
|
+
* Offers two usage patterns:
|
|
51
|
+
*
|
|
52
|
+
* 1. **invoke()** - Automatic state management (loading + error tracking)
|
|
53
|
+
* 2. **client** - Direct access for full control
|
|
54
|
+
*
|
|
55
|
+
* For type safety, import SPFx types:
|
|
56
|
+
* ```typescript
|
|
57
|
+
* import { HttpClient } from '@microsoft/sp-http';
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* Requirements:
|
|
61
|
+
* - SPFx ServiceScope with HttpClient service
|
|
62
|
+
* - Network access to target endpoints
|
|
63
|
+
* - CORS configured on external APIs (if applicable)
|
|
64
|
+
*
|
|
65
|
+
* @remarks
|
|
66
|
+
* This hook consumes HttpClient from SPFx ServiceScope using dependency injection.
|
|
67
|
+
* The service is consumed lazily (only when this hook is used) and cached for optimal
|
|
68
|
+
* performance. The client is always available (non-undefined) after Provider initialization.
|
|
69
|
+
*
|
|
70
|
+
* **Key Differences from SPHttpClient:**
|
|
71
|
+
* - HttpClient: Generic HTTP calls to any URL (public APIs, webhooks)
|
|
72
|
+
* - SPHttpClient: SharePoint-specific REST API calls with integrated authentication
|
|
73
|
+
*
|
|
74
|
+
* Use HttpClient for external APIs, SPHttpClient for SharePoint `/_api/` endpoints.
|
|
75
|
+
*
|
|
76
|
+
* @example Using invoke with public API
|
|
77
|
+
* ```tsx
|
|
78
|
+
* function WeatherWidget() {
|
|
79
|
+
* const { invoke, isLoading, error, clearError } = useSPFxHttpClient();
|
|
80
|
+
* const [weather, setWeather] = useState<any>(null);
|
|
81
|
+
*
|
|
82
|
+
* const loadWeather = () => {
|
|
83
|
+
* invoke(client =>
|
|
84
|
+
* client.get(
|
|
85
|
+
* 'https://api.openweathermap.org/data/2.5/weather?q=London&appid=YOUR_KEY',
|
|
86
|
+
* HttpClient.configurations.v1
|
|
87
|
+
* ).then(res => res.json())
|
|
88
|
+
* ).then(data => setWeather(data));
|
|
89
|
+
* };
|
|
90
|
+
*
|
|
91
|
+
* useEffect(() => { loadWeather(); }, []);
|
|
92
|
+
*
|
|
93
|
+
* if (isLoading) return <Spinner />;
|
|
94
|
+
* if (error) return (
|
|
95
|
+
* <MessageBar messageBarType={MessageBarType.error}>
|
|
96
|
+
* {error.message}
|
|
97
|
+
* <Link onClick={() => { clearError(); loadWeather(); }}>Retry</Link>
|
|
98
|
+
* </MessageBar>
|
|
99
|
+
* );
|
|
100
|
+
*
|
|
101
|
+
* return <div>Temperature: {weather?.main?.temp}</div>;
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*
|
|
105
|
+
* @example Using client directly for advanced control
|
|
106
|
+
* ```tsx
|
|
107
|
+
* import { HttpClient } from '@microsoft/sp-http';
|
|
108
|
+
*
|
|
109
|
+
* function NewsReader() {
|
|
110
|
+
* const { client } = useSPFxHttpClient();
|
|
111
|
+
* const [articles, setArticles] = useState([]);
|
|
112
|
+
* const [loading, setLoading] = useState(false);
|
|
113
|
+
*
|
|
114
|
+
* // client is always available after Provider initialization
|
|
115
|
+
*
|
|
116
|
+
* const loadNews = async () => {
|
|
117
|
+
* setLoading(true);
|
|
118
|
+
* try {
|
|
119
|
+
* const response = await client.get(
|
|
120
|
+
* 'https://newsapi.org/v2/top-headlines?country=us&apiKey=YOUR_KEY',
|
|
121
|
+
* HttpClient.configurations.v1
|
|
122
|
+
* );
|
|
123
|
+
* const data = await response.json();
|
|
124
|
+
* setArticles(data.articles);
|
|
125
|
+
* } catch (err) {
|
|
126
|
+
* console.error(err);
|
|
127
|
+
* } finally {
|
|
128
|
+
* setLoading(false);
|
|
129
|
+
* }
|
|
130
|
+
* };
|
|
131
|
+
*
|
|
132
|
+
* return (
|
|
133
|
+
* <>
|
|
134
|
+
* <button onClick={loadNews} disabled={loading}>Load News</button>
|
|
135
|
+
* {loading && <Spinner />}
|
|
136
|
+
* <ul>{articles.map(a => <li key={a.url}>{a.title}</li>)}</ul>
|
|
137
|
+
* </>
|
|
138
|
+
* );
|
|
139
|
+
* }
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* @example POST to external webhook
|
|
143
|
+
* ```tsx
|
|
144
|
+
* function NotificationSender() {
|
|
145
|
+
* const { invoke, isLoading } = useSPFxHttpClient();
|
|
146
|
+
*
|
|
147
|
+
* const sendNotification = (message: string) => {
|
|
148
|
+
* invoke(client =>
|
|
149
|
+
* client.post(
|
|
150
|
+
* 'https://hooks.slack.com/services/YOUR/WEBHOOK/URL',
|
|
151
|
+
* HttpClient.configurations.v1,
|
|
152
|
+
* {
|
|
153
|
+
* headers: { 'Content-Type': 'application/json' },
|
|
154
|
+
* body: JSON.stringify({ text: message })
|
|
155
|
+
* }
|
|
156
|
+
* )
|
|
157
|
+
* ).then(() => console.log('Notification sent'));
|
|
158
|
+
* };
|
|
159
|
+
*
|
|
160
|
+
* return (
|
|
161
|
+
* <button onClick={() => sendNotification('Hello from SPFx!')} disabled={isLoading}>
|
|
162
|
+
* Send to Slack
|
|
163
|
+
* </button>
|
|
164
|
+
* );
|
|
165
|
+
* }
|
|
166
|
+
* ```
|
|
167
|
+
*
|
|
168
|
+
* @example Polling external API
|
|
169
|
+
* ```tsx
|
|
170
|
+
* function StatusMonitor() {
|
|
171
|
+
* const { invoke } = useSPFxHttpClient();
|
|
172
|
+
* const [status, setStatus] = useState<string>('unknown');
|
|
173
|
+
*
|
|
174
|
+
* useEffect(() => {
|
|
175
|
+
* const interval = setInterval(() => {
|
|
176
|
+
* invoke(client =>
|
|
177
|
+
* client.get(
|
|
178
|
+
* 'https://status.example.com/api/health',
|
|
179
|
+
* HttpClient.configurations.v1
|
|
180
|
+
* ).then(res => res.json())
|
|
181
|
+
* ).then(data => setStatus(data.status));
|
|
182
|
+
* }, 30000); // Poll every 30 seconds
|
|
183
|
+
*
|
|
184
|
+
* return () => clearInterval(interval);
|
|
185
|
+
* }, [invoke]);
|
|
186
|
+
*
|
|
187
|
+
* return <div>Service Status: {status}</div>;
|
|
188
|
+
* }
|
|
189
|
+
* ```
|
|
190
|
+
*
|
|
191
|
+
* @example CORS-enabled REST API
|
|
192
|
+
* ```tsx
|
|
193
|
+
* function ExternalDataGrid() {
|
|
194
|
+
* const { invoke, isLoading, error } = useSPFxHttpClient();
|
|
195
|
+
* const [data, setData] = useState([]);
|
|
196
|
+
*
|
|
197
|
+
* const fetchData = () => {
|
|
198
|
+
* invoke(client =>
|
|
199
|
+
* client.get(
|
|
200
|
+
* 'https://api.contoso.com/v1/records',
|
|
201
|
+
* HttpClient.configurations.v1,
|
|
202
|
+
* {
|
|
203
|
+
* headers: {
|
|
204
|
+
* 'Accept': 'application/json',
|
|
205
|
+
* 'X-API-Key': 'your-api-key'
|
|
206
|
+
* }
|
|
207
|
+
* }
|
|
208
|
+
* ).then(res => res.json())
|
|
209
|
+
* ).then(records => setData(records));
|
|
210
|
+
* };
|
|
211
|
+
*
|
|
212
|
+
* useEffect(() => { fetchData(); }, []);
|
|
213
|
+
*
|
|
214
|
+
* return (
|
|
215
|
+
* <DetailsList
|
|
216
|
+
* items={data}
|
|
217
|
+
* isLoading={isLoading}
|
|
218
|
+
* error={error}
|
|
219
|
+
* />
|
|
220
|
+
* );
|
|
221
|
+
* }
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
export declare function useSPFxHttpClient(): SPFxHttpClientInfo;
|
|
225
|
+
//# sourceMappingURL=useSPFxHttpClient.d.ts.map
|
|
@@ -0,0 +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"}
|