@apvee/spfx-react-toolkit 1.2.1 → 2.0.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/core/atoms.internal.js +1 -1
- package/lib/core/atoms.internal.js.map +1 -1
- package/lib/core/context.internal.js +2 -2
- package/lib/core/context.internal.js.map +1 -1
- package/lib/core/provider-base.internal.js +29 -29
- package/lib/core/provider-base.internal.js.map +1 -1
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts +14 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.d.ts.map +1 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js +20 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -0
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.manifest.json +17 -0
- package/lib/extensions/spFxReactToolkitTest/loc/en-us.js +5 -0
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +1 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useAppCatalogUrl.internal.d.ts +26 -0
- package/lib/hooks/useAppCatalogUrl.internal.d.ts.map +1 -0
- package/lib/hooks/useAppCatalogUrl.internal.js +72 -0
- package/lib/hooks/useAppCatalogUrl.internal.js.map +1 -0
- package/lib/hooks/useAsyncInvoke.internal.js +27 -75
- package/lib/hooks/useAsyncInvoke.internal.js.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.d.ts +46 -0
- package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +65 -20
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxContainerInfo.js +5 -5
- package/lib/hooks/useSPFxContainerInfo.js.map +1 -1
- package/lib/hooks/useSPFxContainerSize.js +9 -10
- package/lib/hooks/useSPFxContainerSize.js.map +1 -1
- package/lib/hooks/useSPFxCorrelationInfo.js +6 -7
- package/lib/hooks/useSPFxCorrelationInfo.js.map +1 -1
- package/lib/hooks/useSPFxCrossSitePermissions.js +48 -58
- package/lib/hooks/useSPFxCrossSitePermissions.js.map +1 -1
- package/lib/hooks/useSPFxDisplayMode.js +8 -8
- package/lib/hooks/useSPFxDisplayMode.js.map +1 -1
- package/lib/hooks/useSPFxEnvironmentInfo.js +17 -18
- package/lib/hooks/useSPFxEnvironmentInfo.js.map +1 -1
- package/lib/hooks/useSPFxFluent9ThemeInfo.js +4 -4
- package/lib/hooks/useSPFxFluent9ThemeInfo.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 +19 -9
- package/lib/hooks/useSPFxHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxHubSiteInfo.js +21 -24
- package/lib/hooks/useSPFxHubSiteInfo.js.map +1 -1
- package/lib/hooks/useSPFxInstanceInfo.js +2 -2
- package/lib/hooks/useSPFxInstanceInfo.js.map +1 -1
- package/lib/hooks/useSPFxListInfo.js +8 -9
- package/lib/hooks/useSPFxListInfo.js.map +1 -1
- package/lib/hooks/useSPFxLocaleInfo.js +10 -10
- package/lib/hooks/useSPFxLocaleInfo.js.map +1 -1
- package/lib/hooks/useSPFxLogger.js +26 -26
- package/lib/hooks/useSPFxLogger.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 +68 -15
- 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 +420 -230
- package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
- package/lib/hooks/useSPFxPageContext.js +2 -2
- package/lib/hooks/useSPFxPageContext.js.map +1 -1
- package/lib/hooks/useSPFxPageType.js +19 -20
- package/lib/hooks/useSPFxPageType.js.map +1 -1
- package/lib/hooks/useSPFxPerformance.js +33 -87
- package/lib/hooks/useSPFxPerformance.js.map +1 -1
- package/lib/hooks/useSPFxPermissions.js +14 -15
- package/lib/hooks/useSPFxPermissions.js.map +1 -1
- package/lib/hooks/useSPFxPnP.js +62 -119
- package/lib/hooks/useSPFxPnP.js.map +1 -1
- package/lib/hooks/useSPFxPnPContext.js +22 -25
- package/lib/hooks/useSPFxPnPContext.js.map +1 -1
- package/lib/hooks/useSPFxPnPList.js +307 -451
- package/lib/hooks/useSPFxPnPList.js.map +1 -1
- package/lib/hooks/useSPFxPnPSearch.js +262 -353
- package/lib/hooks/useSPFxPnPSearch.js.map +1 -1
- package/lib/hooks/useSPFxProperties.js +12 -20
- package/lib/hooks/useSPFxProperties.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 +28 -18
- package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxServiceScope.js +6 -6
- package/lib/hooks/useSPFxServiceScope.js.map +1 -1
- package/lib/hooks/useSPFxSiteInfo.js +7 -8
- package/lib/hooks/useSPFxSiteInfo.js.map +1 -1
- package/lib/hooks/useSPFxStorage.js +22 -22
- package/lib/hooks/useSPFxStorage.js.map +1 -1
- package/lib/hooks/useSPFxTeams.js +37 -92
- package/lib/hooks/useSPFxTeams.js.map +1 -1
- package/lib/hooks/useSPFxTenantKeyValueStore.d.ts +252 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.d.ts.map +1 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.js +572 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.js.map +1 -0
- package/lib/hooks/useSPFxTenantProperty.d.ts +23 -244
- package/lib/hooks/useSPFxTenantProperty.d.ts.map +1 -1
- package/lib/hooks/useSPFxTenantProperty.js +85 -559
- package/lib/hooks/useSPFxTenantProperty.js.map +1 -1
- package/lib/hooks/useSPFxUserInfo.js +3 -4
- package/lib/hooks/useSPFxUserInfo.js.map +1 -1
- package/lib/hooks/useSPFxUserPhoto.js +76 -123
- package/lib/hooks/useSPFxUserPhoto.js.map +1 -1
- package/lib/utils/resize-observer.internal.js +6 -7
- package/lib/utils/resize-observer.internal.js.map +1 -1
- package/lib/utils/theme-subscription.internal.js +8 -8
- package/lib/utils/theme-subscription.internal.js.map +1 -1
- package/lib/utils/type-guards.internal.js +6 -6
- package/lib/utils/type-guards.internal.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/SpFxReactToolkitTestWebPart.js +12 -37
- package/lib/webparts/spFxReactToolkitTest/SpFxReactToolkitTestWebPart.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +279 -342
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.module.scss.js +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.module.scss.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js +26 -86
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js +53 -113
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js +49 -121
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js +44 -103
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js +15 -15
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js +18 -66
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js +9 -9
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js +37 -86
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js +6 -9
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js +3 -6
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js.map +1 -1
- package/package.json +8 -6
|
@@ -190,19 +190,29 @@ import { useAsyncInvoke } from './useAsyncInvoke.internal';
|
|
|
190
190
|
* ```
|
|
191
191
|
*/
|
|
192
192
|
export function useSPFxHttpClient() {
|
|
193
|
-
|
|
193
|
+
const { consume } = useSPFxServiceScope();
|
|
194
194
|
// Lazy consume HttpClient from ServiceScope (cached by useMemo)
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
// Returns undefined if ServiceScope is not available
|
|
196
|
+
const client = useMemo(() => {
|
|
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
|
-
|
|
206
|
+
const { invoke, isLoading, error, clearError } = useAsyncInvoke(client, 'HttpClient not available. Check SPFx context and ServiceScope.');
|
|
207
|
+
// Computed: ready when client is available
|
|
208
|
+
const isReady = client !== undefined;
|
|
200
209
|
return {
|
|
201
|
-
client
|
|
202
|
-
invoke
|
|
203
|
-
isLoading
|
|
204
|
-
error
|
|
205
|
-
clearError
|
|
210
|
+
client,
|
|
211
|
+
invoke,
|
|
212
|
+
isLoading,
|
|
213
|
+
error,
|
|
214
|
+
clearError,
|
|
215
|
+
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;IAC/B,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE1C,gEAAgE;IAChE,qDAAqD;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAA2B,EAAE;QAClD,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;IACtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,CAC7D,MAAM,EACN,gEAAgE,CACjE,CAAC;IAEF,2CAA2C;IAC3C,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IAErC,OAAO;QACL,MAAM;QACN,MAAM;QACN,SAAS;QACT,KAAK;QACL,UAAU;QACV,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -68,23 +68,22 @@ import { useSPFxSPHttpClient } from './useSPFxSPHttpClient';
|
|
|
68
68
|
* ```
|
|
69
69
|
*/
|
|
70
70
|
export function useSPFxHubSiteInfo() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
var _e = useState(undefined), error = _e[0], setError = _e[1];
|
|
71
|
+
const pageContext = useSPFxPageContext();
|
|
72
|
+
const { invoke, baseUrl } = useSPFxSPHttpClient();
|
|
73
|
+
const [hubSiteUrl, setHubSiteUrl] = useState(undefined);
|
|
74
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
75
|
+
const [error, setError] = useState(undefined);
|
|
77
76
|
// Get hub site info from legacyPageContext
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
const legacy = pageContext.legacyPageContext;
|
|
78
|
+
const hubSiteId = legacy?.hubSiteId;
|
|
79
|
+
const isCurrentSiteTheHub = legacy?.isHubSite ?? false;
|
|
80
|
+
const currentSiteUrl = pageContext.webAbsoluteUrl;
|
|
82
81
|
// Site is part of a hub if hubSiteId exists and is not empty GUID
|
|
83
|
-
|
|
82
|
+
const isHubSite = hubSiteId !== undefined &&
|
|
84
83
|
hubSiteId !== '' &&
|
|
85
84
|
hubSiteId !== '00000000-0000-0000-0000-000000000000';
|
|
86
85
|
// Fetch hub site URL when needed
|
|
87
|
-
useEffect(
|
|
86
|
+
useEffect(() => {
|
|
88
87
|
if (!isHubSite || !hubSiteId) {
|
|
89
88
|
return;
|
|
90
89
|
}
|
|
@@ -99,29 +98,27 @@ export function useSPFxHubSiteInfo() {
|
|
|
99
98
|
setError(undefined);
|
|
100
99
|
// Use the web's hub site data endpoint to get hub URL
|
|
101
100
|
// This endpoint returns { value: "JSON_STRING" }, so we need to parse twice
|
|
102
|
-
invoke(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
})
|
|
107
|
-
.then(function (data) {
|
|
101
|
+
invoke(client => client.get(`${baseUrl}/_api/web/hubsitedata(false)`, SPHttpClient.configurations.v1)
|
|
102
|
+
.then(res => res.json())
|
|
103
|
+
.then((response) => JSON.parse(response.value)))
|
|
104
|
+
.then((data) => {
|
|
108
105
|
if (data.url) {
|
|
109
106
|
setHubSiteUrl(data.url);
|
|
110
107
|
}
|
|
111
108
|
setIsLoading(false);
|
|
112
109
|
})
|
|
113
|
-
.catch(
|
|
114
|
-
|
|
110
|
+
.catch(err => {
|
|
111
|
+
const errorObj = err instanceof Error ? err : new Error(String(err));
|
|
115
112
|
setError(errorObj);
|
|
116
113
|
setIsLoading(false);
|
|
117
114
|
});
|
|
118
115
|
}, [isHubSite, hubSiteId, isCurrentSiteTheHub, currentSiteUrl, invoke, baseUrl]);
|
|
119
116
|
return {
|
|
120
|
-
isHubSite
|
|
117
|
+
isHubSite,
|
|
121
118
|
hubSiteId: isHubSite ? hubSiteId : undefined,
|
|
122
|
-
hubSiteUrl
|
|
123
|
-
isLoading
|
|
124
|
-
error
|
|
119
|
+
hubSiteUrl,
|
|
120
|
+
isLoading,
|
|
121
|
+
error,
|
|
125
122
|
};
|
|
126
123
|
}
|
|
127
124
|
//# sourceMappingURL=useSPFxHubSiteInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxHubSiteInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxHubSiteInfo.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,gCAAgC;AAEhC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAsB5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AACH,MAAM,UAAU,kBAAkB
|
|
1
|
+
{"version":3,"file":"useSPFxHubSiteInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxHubSiteInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,10 +31,10 @@ import { useSPFxContext } from './useSPFxContext';
|
|
|
31
31
|
* ```
|
|
32
32
|
*/
|
|
33
33
|
export function useSPFxInstanceInfo() {
|
|
34
|
-
|
|
34
|
+
const { instanceId, kind } = useSPFxContext();
|
|
35
35
|
return {
|
|
36
36
|
id: instanceId,
|
|
37
|
-
kind
|
|
37
|
+
kind,
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
40
|
//# sourceMappingURL=useSPFxInstanceInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxInstanceInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxInstanceInfo.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,wCAAwC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAclD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,mBAAmB;
|
|
1
|
+
{"version":3,"file":"useSPFxInstanceInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxInstanceInfo.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,wCAAwC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAclD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAE9C,OAAO;QACL,EAAE,EAAE,UAAU;QACd,IAAI;KACL,CAAC;AACJ,CAAC"}
|
|
@@ -49,22 +49,21 @@ import { useSPFxPageContext } from './useSPFxPageContext';
|
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
51
51
|
export function useSPFxListInfo() {
|
|
52
|
-
|
|
53
|
-
var pageContext = useSPFxPageContext();
|
|
52
|
+
const pageContext = useSPFxPageContext();
|
|
54
53
|
// Try to get list from page context
|
|
55
|
-
|
|
54
|
+
const list = pageContext.list;
|
|
56
55
|
if (!list || !list.id) {
|
|
57
56
|
return undefined;
|
|
58
57
|
}
|
|
59
58
|
// List template type 101 is Document Library
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
const baseTemplate = list.baseTemplate;
|
|
60
|
+
const isDocumentLibrary = baseTemplate === 101;
|
|
62
61
|
return {
|
|
63
62
|
id: list.id.toString(),
|
|
64
|
-
title:
|
|
65
|
-
serverRelativeUrl:
|
|
66
|
-
baseTemplate
|
|
67
|
-
isDocumentLibrary
|
|
63
|
+
title: list.title ?? 'Unknown List',
|
|
64
|
+
serverRelativeUrl: list.serverRelativeUrl ?? '',
|
|
65
|
+
baseTemplate,
|
|
66
|
+
isDocumentLibrary,
|
|
68
67
|
};
|
|
69
68
|
}
|
|
70
69
|
//# sourceMappingURL=useSPFxListInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxListInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxListInfo.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,yDAAyD;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAsB1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,UAAU,eAAe
|
|
1
|
+
{"version":3,"file":"useSPFxListInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxListInfo.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,yDAAyD;AAEzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAsB1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IAEzC,oCAAoC;IACpC,MAAM,IAAI,GAAI,WAOZ,CAAC,IAAI,CAAC;IAER,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,6CAA6C;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;IACvC,MAAM,iBAAiB,GAAG,YAAY,KAAK,GAAG,CAAC;IAE/C,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE;QACtB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,cAAc;QACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,IAAI,EAAE;QAC/C,YAAY;QACZ,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -90,20 +90,20 @@ import { useSPFxPageContext } from './useSPFxPageContext';
|
|
|
90
90
|
* ```
|
|
91
91
|
*/
|
|
92
92
|
export function useSPFxLocaleInfo() {
|
|
93
|
-
|
|
93
|
+
const pageContext = useSPFxPageContext();
|
|
94
94
|
// Extract culture info (native SPFx properties)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
const cultureInfo = pageContext.cultureInfo;
|
|
96
|
+
const locale = cultureInfo.currentCultureName;
|
|
97
|
+
const uiLocale = cultureInfo.currentUICultureName;
|
|
98
|
+
const isRtl = cultureInfo.isRightToLeft;
|
|
99
99
|
// Extract time zone from web (preview API)
|
|
100
100
|
// Cast needed because timeZoneInfo is not yet in public types
|
|
101
|
-
|
|
101
|
+
const timeZone = pageContext.web.timeZoneInfo;
|
|
102
102
|
return {
|
|
103
|
-
locale
|
|
104
|
-
uiLocale
|
|
105
|
-
timeZone
|
|
106
|
-
isRtl
|
|
103
|
+
locale,
|
|
104
|
+
uiLocale,
|
|
105
|
+
timeZone,
|
|
106
|
+
isRtl,
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
109
|
//# sourceMappingURL=useSPFxLocaleInfo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxLocaleInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxLocaleInfo.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,wCAAwC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA4C1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFG;AACH,MAAM,UAAU,iBAAiB;IAC/B,
|
|
1
|
+
{"version":3,"file":"useSPFxLocaleInfo.js","sourceRoot":"","sources":["../../src/hooks/useSPFxLocaleInfo.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,wCAAwC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA4C1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IAEzC,gDAAgD;IAChD,MAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;IAC5C,MAAM,MAAM,GAAG,WAAW,CAAC,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,oBAAoB,CAAC;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;IAExC,2CAA2C;IAC3C,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,WAAW,CAAC,GAAuC,CAAC,YAAY,CAAC;IAEnF,OAAO;QACL,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -68,50 +68,50 @@ import { useSPFxCorrelationInfo } from './useSPFxCorrelationInfo';
|
|
|
68
68
|
* ```
|
|
69
69
|
*/
|
|
70
70
|
export function useSPFxLogger(handler) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
71
|
+
const { id: instanceId, kind } = useSPFxInstanceInfo();
|
|
72
|
+
const { displayName, loginName } = useSPFxUserInfo();
|
|
73
|
+
const { siteUrl, webUrl } = useSPFxSiteInfo();
|
|
74
|
+
const { correlationId } = useSPFxCorrelationInfo();
|
|
75
|
+
const { spfxContext } = useSPFxContext();
|
|
76
|
+
const emit = (level, message, extra) => {
|
|
77
77
|
// Extract webPartTag only if in WebPart context
|
|
78
|
-
|
|
78
|
+
let webPartTag;
|
|
79
79
|
if (kind === 'WebPart') {
|
|
80
|
-
|
|
80
|
+
const wpContext = spfxContext;
|
|
81
81
|
webPartTag = wpContext.webPartTag;
|
|
82
82
|
}
|
|
83
|
-
|
|
84
|
-
level
|
|
85
|
-
message
|
|
83
|
+
const entry = {
|
|
84
|
+
level,
|
|
85
|
+
message,
|
|
86
86
|
ts: new Date().toISOString(),
|
|
87
|
-
instanceId
|
|
87
|
+
instanceId,
|
|
88
88
|
host: kind,
|
|
89
89
|
user: displayName + ' (' + loginName + ')',
|
|
90
|
-
siteUrl
|
|
91
|
-
webUrl
|
|
92
|
-
correlationId
|
|
93
|
-
webPartTag
|
|
94
|
-
extra
|
|
90
|
+
siteUrl,
|
|
91
|
+
webUrl,
|
|
92
|
+
correlationId,
|
|
93
|
+
webPartTag,
|
|
94
|
+
extra,
|
|
95
95
|
};
|
|
96
96
|
if (handler) {
|
|
97
97
|
handler(entry);
|
|
98
98
|
}
|
|
99
99
|
else {
|
|
100
100
|
// Default: log to console
|
|
101
|
-
|
|
101
|
+
const levelUpper = level.toUpperCase();
|
|
102
102
|
// For WebPart contexts, display webPartTag instead of instanceId for better readability
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
const displayId = kind === 'WebPart' && webPartTag ? webPartTag : instanceId;
|
|
104
|
+
const line = '[' + levelUpper + '] ' + entry.ts + ' ' + kind + '/' + displayId + ' – ' + message;
|
|
105
105
|
// Use appropriate console method
|
|
106
|
-
|
|
107
|
-
consoleFn(line, extra
|
|
106
|
+
const consoleFn = level === 'debug' ? console.log : console[level];
|
|
107
|
+
consoleFn(line, extra ?? {});
|
|
108
108
|
}
|
|
109
109
|
};
|
|
110
110
|
return {
|
|
111
|
-
debug:
|
|
112
|
-
info:
|
|
113
|
-
warn:
|
|
114
|
-
error:
|
|
111
|
+
debug: (m, e) => emit('debug', m, e),
|
|
112
|
+
info: (m, e) => emit('info', m, e),
|
|
113
|
+
warn: (m, e) => emit('warn', m, e),
|
|
114
|
+
error: (m, e) => emit('error', m, e),
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
117
|
//# sourceMappingURL=useSPFxLogger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxLogger.js","sourceRoot":"","sources":["../../src/hooks/useSPFxLogger.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,gDAAgD;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AA+DlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAmC;
|
|
1
|
+
{"version":3,"file":"useSPFxLogger.js","sourceRoot":"","sources":["../../src/hooks/useSPFxLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -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';
|
|
@@ -168,32 +168,85 @@ import { useAsyncInvoke } from './useAsyncInvoke.internal';
|
|
|
168
168
|
* ```
|
|
169
169
|
*/
|
|
170
170
|
export function useSPFxMSGraphClient() {
|
|
171
|
-
|
|
171
|
+
const { consume } = useSPFxServiceScope();
|
|
172
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
173
|
+
// STATE
|
|
174
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
175
|
+
const [client, setClient] = useState(undefined);
|
|
176
|
+
const [isInitializing, setIsInitializing] = useState(true);
|
|
177
|
+
const [initError, setInitError] = useState(undefined);
|
|
178
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
179
|
+
// REFS (for cleanup and preventing double initialization)
|
|
180
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
181
|
+
// Track component mounted state to prevent memory leaks
|
|
182
|
+
const isMountedRef = useRef(true);
|
|
183
|
+
// Track if initialization has been attempted (prevent double init)
|
|
184
|
+
const initAttemptedRef = useRef(false);
|
|
185
|
+
// Cleanup on unmount
|
|
186
|
+
useEffect(() => {
|
|
187
|
+
return () => {
|
|
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
|
+
const factory = useMemo(() => {
|
|
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
|
-
useEffect(
|
|
202
|
+
useEffect(() => {
|
|
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
|
-
.then(
|
|
183
|
-
|
|
214
|
+
.then((graphClient) => {
|
|
215
|
+
// Only update state if still mounted
|
|
216
|
+
if (isMountedRef.current) {
|
|
217
|
+
setClient(graphClient);
|
|
218
|
+
setIsInitializing(false);
|
|
219
|
+
}
|
|
184
220
|
})
|
|
185
|
-
.catch(
|
|
186
|
-
|
|
221
|
+
.catch((err) => {
|
|
222
|
+
// Only update state if still mounted
|
|
223
|
+
if (isMountedRef.current) {
|
|
224
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
225
|
+
setInitError(error);
|
|
226
|
+
setIsInitializing(false);
|
|
227
|
+
console.error('Failed to initialize MSGraphClient:', error);
|
|
228
|
+
}
|
|
187
229
|
});
|
|
188
230
|
}, [factory]);
|
|
231
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
232
|
+
// ASYNC INVOKE PATTERN
|
|
233
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
189
234
|
// Use shared async invocation pattern
|
|
190
|
-
|
|
235
|
+
const { invoke, isLoading, error, clearError } = useAsyncInvoke(client, 'Graph client not initialized. Wait for client to be available or check initError.');
|
|
236
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
237
|
+
// COMPUTED STATE & RETURN
|
|
238
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
239
|
+
// Computed: ready when client is available and no errors
|
|
240
|
+
const isReady = client !== undefined && !isInitializing && !initError;
|
|
191
241
|
return {
|
|
192
|
-
client
|
|
193
|
-
invoke
|
|
194
|
-
isLoading
|
|
195
|
-
error
|
|
196
|
-
clearError
|
|
242
|
+
client,
|
|
243
|
+
invoke,
|
|
244
|
+
isLoading,
|
|
245
|
+
error,
|
|
246
|
+
clearError,
|
|
247
|
+
isInitializing,
|
|
248
|
+
initError,
|
|
249
|
+
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"}
|