@apvee/spfx-react-toolkit 1.3.0 → 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.js +8 -29
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -1
- 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.js +27 -27
- 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.js +10 -10
- 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.js +25 -25
- package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.js +148 -209
- 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.js +19 -19
- 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 +277 -336
- 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 +1 -1
|
@@ -1,41 +1,5 @@
|
|
|
1
1
|
// useSPFxOneDriveAppData.ts
|
|
2
2
|
// Hook to manage JSON files in OneDrive appRoot folder with state management
|
|
3
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
4
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
5
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
6
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
7
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
8
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
9
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
10
|
-
});
|
|
11
|
-
};
|
|
12
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
13
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
14
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
15
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
16
|
-
function step(op) {
|
|
17
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
18
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
19
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
20
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
21
|
-
switch (op[0]) {
|
|
22
|
-
case 0: case 1: t = op; break;
|
|
23
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
24
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
25
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
26
|
-
default:
|
|
27
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
28
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
29
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
30
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
31
|
-
if (t[2]) _.ops.pop();
|
|
32
|
-
_.trys.pop(); continue;
|
|
33
|
-
}
|
|
34
|
-
op = body.call(thisArg, _);
|
|
35
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
36
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
3
|
import { useState, useCallback, useEffect, useRef, useMemo } from 'react';
|
|
40
4
|
import { useSPFxMSGraphClient } from './useSPFxMSGraphClient';
|
|
41
5
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -50,14 +14,14 @@ import { useSPFxMSGraphClient } from './useSPFxMSGraphClient';
|
|
|
50
14
|
* @returns Full Graph API path for file content
|
|
51
15
|
*/
|
|
52
16
|
function buildApiPath(fileName, folderName) {
|
|
53
|
-
|
|
17
|
+
const basePath = '/me/drive/special/appRoot:';
|
|
54
18
|
if (folderName) {
|
|
55
19
|
// Sanitize folder name: only allow alphanumeric, hyphens, underscores
|
|
56
20
|
// This prevents path traversal (../) and other injection attacks
|
|
57
|
-
|
|
58
|
-
return
|
|
21
|
+
const safeFolderName = folderName.replace(/[^a-zA-Z0-9-_]/g, '-');
|
|
22
|
+
return `${basePath}/${safeFolderName}/${fileName}:/content`;
|
|
59
23
|
}
|
|
60
|
-
return
|
|
24
|
+
return `${basePath}/${fileName}:/content`;
|
|
61
25
|
}
|
|
62
26
|
/**
|
|
63
27
|
* Check if an error indicates a 404 / itemNotFound response from Graph API.
|
|
@@ -66,17 +30,16 @@ function buildApiPath(fileName, folderName) {
|
|
|
66
30
|
* @returns True if the error indicates file not found
|
|
67
31
|
*/
|
|
68
32
|
function isNotFoundError(err) {
|
|
69
|
-
|
|
70
|
-
var anyErr = err;
|
|
33
|
+
const anyErr = err;
|
|
71
34
|
// Check status codes
|
|
72
|
-
if (
|
|
35
|
+
if (anyErr?.statusCode === 404 || anyErr?.status === 404)
|
|
73
36
|
return true;
|
|
74
37
|
// Check error codes
|
|
75
|
-
|
|
38
|
+
const code = anyErr?.code ?? anyErr?.body?.error?.code;
|
|
76
39
|
if (code && /itemnotfound/i.test(code))
|
|
77
40
|
return true;
|
|
78
41
|
// Check error messages as fallback
|
|
79
|
-
|
|
42
|
+
const message = anyErr?.message ?? anyErr?.body?.error?.message;
|
|
80
43
|
if (message && /(\b404\b|not found|itemnotfound)/i.test(message))
|
|
81
44
|
return true;
|
|
82
45
|
return false;
|
|
@@ -270,39 +233,37 @@ function isNotFoundError(err) {
|
|
|
270
233
|
* ```
|
|
271
234
|
*/
|
|
272
235
|
export function useSPFxOneDriveAppData(fileName, options) {
|
|
273
|
-
|
|
274
|
-
var _a, _b;
|
|
275
|
-
var _c = useSPFxMSGraphClient(), client = _c.client, isClientReady = _c.isReady, isClientInitializing = _c.isInitializing, clientInitError = _c.initError;
|
|
236
|
+
const { client, isReady: isClientReady, isInitializing: isClientInitializing, initError: clientInitError } = useSPFxMSGraphClient();
|
|
276
237
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
277
238
|
// OPTIONS (stabilized with useMemo to prevent unnecessary re-renders)
|
|
278
239
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
279
|
-
|
|
240
|
+
const resolvedOptions = useMemo(() => options ?? {}, [options]);
|
|
280
241
|
// Extract stable primitive values for dependency arrays
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
242
|
+
const folder = resolvedOptions.folder;
|
|
243
|
+
const shouldAutoFetch = resolvedOptions.autoFetch ?? true;
|
|
244
|
+
const defaultValue = resolvedOptions.defaultValue;
|
|
245
|
+
const createIfMissing = resolvedOptions.createIfMissing ?? false;
|
|
285
246
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
286
247
|
// STATE MANAGEMENT
|
|
287
248
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
249
|
+
const [data, setData] = useState(defaultValue);
|
|
250
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
251
|
+
const [error, setError] = useState(undefined);
|
|
252
|
+
const [isWriting, setIsWriting] = useState(false);
|
|
253
|
+
const [writeError, setWriteError] = useState(undefined);
|
|
254
|
+
const [isNotFound, setIsNotFound] = useState(false);
|
|
294
255
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
295
256
|
// REFS (for cleanup and stable references)
|
|
296
257
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
297
258
|
// Track component mounted state to prevent memory leaks
|
|
298
|
-
|
|
299
|
-
useEffect(
|
|
300
|
-
return
|
|
259
|
+
const isMountedRef = useRef(true);
|
|
260
|
+
useEffect(() => {
|
|
261
|
+
return () => {
|
|
301
262
|
isMountedRef.current = false;
|
|
302
263
|
};
|
|
303
264
|
}, []);
|
|
304
265
|
// Track if createIfMissing write has been attempted (to prevent multiple writes)
|
|
305
|
-
|
|
266
|
+
const createAttemptedRef = useRef(false);
|
|
306
267
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
307
268
|
// WRITE CALLBACK (defined first, no dependency on load)
|
|
308
269
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -311,62 +272,52 @@ export function useSPFxOneDriveAppData(fileName, options) {
|
|
|
311
272
|
* Creates file if it doesn't exist, updates if it does (upsert)
|
|
312
273
|
* Updates isWriting and writeError states
|
|
313
274
|
*/
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
console.error('Failed to write file to OneDrive:', writeErr);
|
|
358
|
-
}
|
|
359
|
-
// Re-throw to allow caller to handle
|
|
360
|
-
throw err_1;
|
|
361
|
-
case 4:
|
|
362
|
-
if (isMountedRef.current) {
|
|
363
|
-
setIsWriting(false);
|
|
364
|
-
}
|
|
365
|
-
return [7 /*endfinally*/];
|
|
366
|
-
case 5: return [2 /*return*/];
|
|
275
|
+
const write = useCallback(async (content) => {
|
|
276
|
+
if (!client) {
|
|
277
|
+
if (isClientInitializing) {
|
|
278
|
+
throw new Error('Graph client is still initializing. Please wait and try again.');
|
|
279
|
+
}
|
|
280
|
+
if (clientInitError) {
|
|
281
|
+
throw new Error(`Graph client initialization failed: ${clientInitError.message}`);
|
|
282
|
+
}
|
|
283
|
+
throw new Error('Graph client not available. Cannot write file.');
|
|
284
|
+
}
|
|
285
|
+
if (!fileName) {
|
|
286
|
+
throw new Error('fileName is required. Cannot write file.');
|
|
287
|
+
}
|
|
288
|
+
setIsWriting(true);
|
|
289
|
+
setWriteError(undefined);
|
|
290
|
+
try {
|
|
291
|
+
const apiPath = buildApiPath(fileName, folder);
|
|
292
|
+
// Always stringify to ensure valid JSON
|
|
293
|
+
const jsonContent = JSON.stringify(content);
|
|
294
|
+
await client
|
|
295
|
+
.api(apiPath)
|
|
296
|
+
.header('Content-Type', 'application/json')
|
|
297
|
+
.put(jsonContent);
|
|
298
|
+
if (isMountedRef.current) {
|
|
299
|
+
// Update local data to reflect successful write
|
|
300
|
+
setData(content);
|
|
301
|
+
setIsNotFound(false);
|
|
302
|
+
// Clear read error if write succeeds (fresh state)
|
|
303
|
+
setError(undefined);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
if (isMountedRef.current) {
|
|
308
|
+
const writeErr = err instanceof Error ? err : new Error(String(err));
|
|
309
|
+
setWriteError(writeErr);
|
|
310
|
+
console.error('Failed to write file to OneDrive:', writeErr);
|
|
311
|
+
}
|
|
312
|
+
// Re-throw to allow caller to handle
|
|
313
|
+
throw err;
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
if (isMountedRef.current) {
|
|
317
|
+
setIsWriting(false);
|
|
367
318
|
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
319
|
+
}
|
|
320
|
+
}, [client, fileName, folder, isClientInitializing, clientInitError]);
|
|
370
321
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
371
322
|
// LOAD CALLBACK (NO dependency on write - uses effect for createIfMissing)
|
|
372
323
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -375,102 +326,90 @@ export function useSPFxOneDriveAppData(fileName, options) {
|
|
|
375
326
|
* Updates data, isLoading, and error states
|
|
376
327
|
* Does NOT call write directly - createIfMissing is handled by separate effect
|
|
377
328
|
*/
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
329
|
+
const load = useCallback(async () => {
|
|
330
|
+
if (!client) {
|
|
331
|
+
if (isClientInitializing) {
|
|
332
|
+
console.info('Graph client is still initializing. Skipping load - will auto-retry when ready.');
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (clientInitError) {
|
|
336
|
+
console.error('Graph client initialization failed:', clientInitError.message);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
console.warn('Graph client not available. Skipping load.');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (!fileName) {
|
|
343
|
+
console.warn('fileName is required. Skipping load.');
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
// Reset createAttempted flag when load is called (fresh attempt)
|
|
347
|
+
createAttemptedRef.current = false;
|
|
348
|
+
setIsLoading(true);
|
|
349
|
+
setError(undefined);
|
|
350
|
+
setIsNotFound(false);
|
|
351
|
+
try {
|
|
352
|
+
const apiPath = buildApiPath(fileName, folder);
|
|
353
|
+
const fileContent = await client.api(apiPath).get();
|
|
354
|
+
if (isMountedRef.current) {
|
|
355
|
+
// Parse JSON if response is string, otherwise use as-is
|
|
356
|
+
if (typeof fileContent === 'string') {
|
|
357
|
+
try {
|
|
358
|
+
setData(JSON.parse(fileContent));
|
|
398
359
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
setIsLoading(true);
|
|
402
|
-
setError(undefined);
|
|
403
|
-
setIsNotFound(false);
|
|
404
|
-
_a.label = 1;
|
|
405
|
-
case 1:
|
|
406
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
407
|
-
apiPath = buildApiPath(fileName, folder);
|
|
408
|
-
return [4 /*yield*/, client.api(apiPath).get()];
|
|
409
|
-
case 2:
|
|
410
|
-
fileContent = _a.sent();
|
|
411
|
-
if (isMountedRef.current) {
|
|
412
|
-
// Parse JSON if response is string, otherwise use as-is
|
|
413
|
-
if (typeof fileContent === 'string') {
|
|
414
|
-
try {
|
|
415
|
-
setData(JSON.parse(fileContent));
|
|
416
|
-
}
|
|
417
|
-
catch (parseError) {
|
|
418
|
-
throw new Error("Failed to parse JSON: ".concat(parseError instanceof Error ? parseError.message : 'Unknown error'));
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
setData(fileContent);
|
|
423
|
-
}
|
|
424
|
-
setIsNotFound(false);
|
|
360
|
+
catch (parseError) {
|
|
361
|
+
throw new Error(`Failed to parse JSON: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);
|
|
425
362
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
console.info('OneDrive file not found. isNotFound=true');
|
|
443
|
-
// NOTE: createIfMissing is handled by separate useEffect
|
|
444
|
-
return [2 /*return*/];
|
|
445
|
-
}
|
|
446
|
-
loadError = err_2 instanceof Error ? err_2 : new Error(String(err_2));
|
|
447
|
-
setError(loadError);
|
|
448
|
-
console.error('Failed to load file from OneDrive:', loadError);
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
setData(fileContent);
|
|
366
|
+
}
|
|
367
|
+
setIsNotFound(false);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
if (isMountedRef.current) {
|
|
372
|
+
const notFound = isNotFoundError(err);
|
|
373
|
+
setIsNotFound(notFound);
|
|
374
|
+
if (notFound) {
|
|
375
|
+
// Missing file is treated as a non-error.
|
|
376
|
+
// Set data to defaultValue if provided, otherwise undefined
|
|
377
|
+
if (defaultValue !== undefined) {
|
|
378
|
+
setData(defaultValue);
|
|
449
379
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
if (isMountedRef.current) {
|
|
453
|
-
setIsLoading(false);
|
|
380
|
+
else {
|
|
381
|
+
setData(undefined);
|
|
454
382
|
}
|
|
455
|
-
|
|
456
|
-
|
|
383
|
+
setError(undefined);
|
|
384
|
+
console.info('OneDrive file not found. isNotFound=true');
|
|
385
|
+
// NOTE: createIfMissing is handled by separate useEffect
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const loadError = err instanceof Error ? err : new Error(String(err));
|
|
389
|
+
setError(loadError);
|
|
390
|
+
console.error('Failed to load file from OneDrive:', loadError);
|
|
457
391
|
}
|
|
458
|
-
}
|
|
459
|
-
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
if (isMountedRef.current) {
|
|
395
|
+
setIsLoading(false);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}, [client, fileName, folder, defaultValue, isClientInitializing, clientInitError]); // ← NO write, NO createIfMissing
|
|
460
399
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
461
400
|
// EFFECTS
|
|
462
401
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
463
402
|
// Auto-fetch on mount if enabled (wait for client to be ready)
|
|
464
|
-
useEffect(
|
|
403
|
+
useEffect(() => {
|
|
465
404
|
if (shouldAutoFetch && isClientReady && fileName) {
|
|
466
|
-
load().catch(
|
|
405
|
+
load().catch(() => {
|
|
467
406
|
// Error already handled in load() function
|
|
468
407
|
});
|
|
469
408
|
}
|
|
470
409
|
}, [shouldAutoFetch, isClientReady, fileName, load]);
|
|
471
410
|
// Separate effect for createIfMissing - reacts to isNotFound state
|
|
472
411
|
// This breaks the circular dependency: load → write
|
|
473
|
-
useEffect(
|
|
412
|
+
useEffect(() => {
|
|
474
413
|
// Guard conditions:
|
|
475
414
|
// 1. File must be not found
|
|
476
415
|
// 2. createIfMissing must be enabled
|
|
@@ -485,7 +424,7 @@ export function useSPFxOneDriveAppData(fileName, options) {
|
|
|
485
424
|
!createAttemptedRef.current &&
|
|
486
425
|
!isLoading) {
|
|
487
426
|
createAttemptedRef.current = true;
|
|
488
|
-
write(defaultValue).catch(
|
|
427
|
+
write(defaultValue).catch((writeErr) => {
|
|
489
428
|
// write() already updates writeError state
|
|
490
429
|
console.error('Failed to create missing file in OneDrive:', writeErr);
|
|
491
430
|
});
|
|
@@ -495,17 +434,17 @@ export function useSPFxOneDriveAppData(fileName, options) {
|
|
|
495
434
|
// COMPUTED STATE & RETURN
|
|
496
435
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
497
436
|
// Computed state: ready when data loaded successfully
|
|
498
|
-
|
|
437
|
+
const isReady = !isLoading && !error && data !== undefined;
|
|
499
438
|
return {
|
|
500
|
-
data
|
|
501
|
-
isLoading
|
|
502
|
-
error
|
|
503
|
-
isWriting
|
|
504
|
-
writeError
|
|
505
|
-
isNotFound
|
|
506
|
-
load
|
|
507
|
-
write
|
|
508
|
-
isReady
|
|
439
|
+
data,
|
|
440
|
+
isLoading,
|
|
441
|
+
error,
|
|
442
|
+
isWriting,
|
|
443
|
+
writeError,
|
|
444
|
+
isNotFound,
|
|
445
|
+
load,
|
|
446
|
+
write,
|
|
447
|
+
isReady,
|
|
509
448
|
};
|
|
510
449
|
}
|
|
511
450
|
//# sourceMappingURL=useSPFxOneDriveAppData.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxOneDriveAppData.js","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,6EAA6E
|
|
1
|
+
{"version":3,"file":"useSPFxOneDriveAppData.js","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,10 +38,10 @@ import { useSPFxServiceScope } from './useSPFxServiceScope';
|
|
|
38
38
|
* @see {@link useSPFxContext} for accessing the full SPFx context
|
|
39
39
|
*/
|
|
40
40
|
export function useSPFxPageContext() {
|
|
41
|
-
|
|
41
|
+
const { consume } = useSPFxServiceScope();
|
|
42
42
|
// Lazy consume PageContext from ServiceScope (cached by useMemo)
|
|
43
43
|
// ServiceScope is guaranteed to be finished by SPFxProvider guard
|
|
44
|
-
return useMemo(
|
|
44
|
+
return useMemo(() => {
|
|
45
45
|
return consume(PageContext.serviceKey);
|
|
46
46
|
}, [consume]);
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxPageContext.js","sourceRoot":"","sources":["../../src/hooks/useSPFxPageContext.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,yCAAyC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,kBAAkB;
|
|
1
|
+
{"version":3,"file":"useSPFxPageContext.js","sourceRoot":"","sources":["../../src/hooks/useSPFxPageContext.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,yCAAyC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE1C,iEAAiE;IACjE,kEAAkE;IAClE,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,OAAO,OAAO,CAAc,WAAW,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC"}
|
|
@@ -61,16 +61,15 @@ import { useSPFxPageContext } from './useSPFxPageContext';
|
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
63
|
export function useSPFxPageType() {
|
|
64
|
-
|
|
65
|
-
var pageContext = useSPFxPageContext();
|
|
64
|
+
const pageContext = useSPFxPageContext();
|
|
66
65
|
// Try to get page type from modern pageContext
|
|
67
|
-
|
|
66
|
+
const modernPage = pageContext.page;
|
|
68
67
|
// Try to get page type from legacy context
|
|
69
|
-
|
|
68
|
+
const legacy = pageContext.legacyPageContext;
|
|
70
69
|
// Determine page type
|
|
71
|
-
|
|
70
|
+
let pageType = 'unknown';
|
|
72
71
|
// Check modern page type first
|
|
73
|
-
|
|
72
|
+
const modernPageType = modernPage?.type?.toLowerCase();
|
|
74
73
|
if (modernPageType) {
|
|
75
74
|
if (modernPageType.indexOf('sitepage') !== -1) {
|
|
76
75
|
pageType = 'sitePage';
|
|
@@ -81,7 +80,7 @@ export function useSPFxPageType() {
|
|
|
81
80
|
}
|
|
82
81
|
// Check legacy page type
|
|
83
82
|
if (pageType === 'unknown') {
|
|
84
|
-
|
|
83
|
+
const legacyPageType = legacy?.pageType?.toLowerCase();
|
|
85
84
|
if (legacyPageType) {
|
|
86
85
|
if (legacyPageType.indexOf('sitepage') !== -1) {
|
|
87
86
|
pageType = 'sitePage';
|
|
@@ -91,7 +90,7 @@ export function useSPFxPageType() {
|
|
|
91
90
|
}
|
|
92
91
|
else if (legacyPageType.indexOf('list') !== -1) {
|
|
93
92
|
// Check if it's a form or list view
|
|
94
|
-
if (
|
|
93
|
+
if (legacy?.formType !== undefined && legacy.formType !== null) {
|
|
95
94
|
pageType = 'listFormPage';
|
|
96
95
|
}
|
|
97
96
|
else {
|
|
@@ -109,7 +108,7 @@ export function useSPFxPageType() {
|
|
|
109
108
|
// If still unknown, try to infer from context
|
|
110
109
|
if (pageType === 'unknown') {
|
|
111
110
|
// If we have a list ID, likely a list page
|
|
112
|
-
if (legacy
|
|
111
|
+
if (legacy?.listId) {
|
|
113
112
|
if (legacy.formType !== undefined && legacy.formType !== null) {
|
|
114
113
|
pageType = 'listFormPage';
|
|
115
114
|
}
|
|
@@ -119,19 +118,19 @@ export function useSPFxPageType() {
|
|
|
119
118
|
}
|
|
120
119
|
}
|
|
121
120
|
// Calculate helper flags
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
121
|
+
const isSitePage = pageType === 'sitePage';
|
|
122
|
+
const isWebPartPage = pageType === 'webPartPage';
|
|
123
|
+
const isListPage = pageType === 'listPage';
|
|
124
|
+
const isListFormPage = pageType === 'listFormPage';
|
|
126
125
|
// Modern page = site page (not classic web part page)
|
|
127
|
-
|
|
126
|
+
const isModernPage = isSitePage;
|
|
128
127
|
return {
|
|
129
|
-
pageType
|
|
130
|
-
isModernPage
|
|
131
|
-
isSitePage
|
|
132
|
-
isListPage
|
|
133
|
-
isListFormPage
|
|
134
|
-
isWebPartPage
|
|
128
|
+
pageType,
|
|
129
|
+
isModernPage,
|
|
130
|
+
isSitePage,
|
|
131
|
+
isListPage,
|
|
132
|
+
isListFormPage,
|
|
133
|
+
isWebPartPage,
|
|
135
134
|
};
|
|
136
135
|
}
|
|
137
136
|
//# sourceMappingURL=useSPFxPageType.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSPFxPageType.js","sourceRoot":"","sources":["../../src/hooks/useSPFxPageType.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,0CAA0C;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqC1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,MAAM,UAAU,eAAe
|
|
1
|
+
{"version":3,"file":"useSPFxPageType.js","sourceRoot":"","sources":["../../src/hooks/useSPFxPageType.ts"],"names":[],"mappings":"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"}
|