@apvee/spfx-react-toolkit 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +5973 -713
  2. package/lib/core/provider-base.internal.d.ts +7 -2
  3. package/lib/core/provider-base.internal.d.ts.map +1 -1
  4. package/lib/core/provider-base.internal.js +27 -0
  5. package/lib/core/provider-base.internal.js.map +1 -1
  6. package/lib/hooks/index.d.ts +2 -0
  7. package/lib/hooks/index.d.ts.map +1 -1
  8. package/lib/hooks/index.js +2 -0
  9. package/lib/hooks/index.js.map +1 -1
  10. package/lib/hooks/useSPFxAadHttpClient.d.ts +9 -4
  11. package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
  12. package/lib/hooks/useSPFxAadHttpClient.js +18 -14
  13. package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
  14. package/lib/hooks/useSPFxContext.d.ts +0 -1
  15. package/lib/hooks/useSPFxContext.d.ts.map +1 -1
  16. package/lib/hooks/useSPFxContext.js +0 -1
  17. package/lib/hooks/useSPFxContext.js.map +1 -1
  18. package/lib/hooks/useSPFxHttpClient.d.ts +225 -0
  19. package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -0
  20. package/lib/hooks/useSPFxHttpClient.js +275 -0
  21. package/lib/hooks/useSPFxHttpClient.js.map +1 -0
  22. package/lib/hooks/useSPFxMSGraphClient.d.ts +9 -4
  23. package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
  24. package/lib/hooks/useSPFxMSGraphClient.js +19 -14
  25. package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
  26. package/lib/hooks/useSPFxPageContext.d.ts +3 -3
  27. package/lib/hooks/useSPFxPageContext.d.ts.map +1 -1
  28. package/lib/hooks/useSPFxPageContext.js +11 -12
  29. package/lib/hooks/useSPFxPageContext.js.map +1 -1
  30. package/lib/hooks/useSPFxSPHttpClient.d.ts +12 -6
  31. package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
  32. package/lib/hooks/useSPFxSPHttpClient.js +23 -21
  33. package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
  34. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
  35. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +124 -22
  36. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
  37. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
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>): JSX.Element;
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":";AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAOnE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,SAAS,EAAE,GAAG,EAAE,EACrD,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAC/B,GAAG,CAAC,OAAO,CAgIb"}
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":"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"}
1
+ {"version":3,"file":"provider-base.internal.js","sourceRoot":"","sources":["../../src/core/provider-base.internal.tsx"],"names":[],"mappings":"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"}
@@ -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
@@ -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"}
@@ -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
@@ -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 type { AadHttpClient } from '@microsoft/sp-http';
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 type { AadHttpClient } from '@microsoft/sp-http';
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
- * - AadHttpClientFactory available in SPFx context
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 type { AadHttpClient } from '@microsoft/sp-http';
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,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsLG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAiFvF"}
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 { useSPFxContext } from './useSPFxContext';
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 type { AadHttpClient } from '@microsoft/sp-http';
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
- * - AadHttpClientFactory available in SPFx context
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 type { AadHttpClient } from '@microsoft/sp-http';
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 spfxContext = useSPFxContext().spfxContext;
227
- // Extract factory from context
228
- var ctx = spfxContext;
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
- ctx.aadHttpClientFactory
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, ctx.aadHttpClientFactory]);
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":"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"}
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;;;;;;;;;;GAUG;AACH,OAAO,EAAE,cAAc,EAAE,CAAC"}
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;;;;;;;;;;GAUG;AACH,OAAO,EAAE,cAAc,EAAE,CAAC"}
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"}