@apvee/spfx-react-toolkit 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) 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/useSPFxOneDriveAppData.d.ts +25 -0
  27. package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
  28. package/lib/hooks/useSPFxOneDriveAppData.js +121 -256
  29. package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
  30. package/lib/hooks/useSPFxPageContext.d.ts +3 -3
  31. package/lib/hooks/useSPFxPageContext.d.ts.map +1 -1
  32. package/lib/hooks/useSPFxPageContext.js +11 -12
  33. package/lib/hooks/useSPFxPageContext.js.map +1 -1
  34. package/lib/hooks/useSPFxSPHttpClient.d.ts +12 -6
  35. package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
  36. package/lib/hooks/useSPFxSPHttpClient.js +23 -21
  37. package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
  38. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
  39. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +148 -51
  40. package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
  41. package/package.json +2 -2
@@ -36,8 +36,10 @@ 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 } from 'react';
40
+ import { useSPFxServiceScope } from './useSPFxServiceScope';
41
+ import { useSPFxPageContext } from './useSPFxPageContext';
42
+ import { SPHttpClient } from '@microsoft/sp-http';
41
43
  /**
42
44
  * Hook to access SharePoint REST APIs with built-in state management
43
45
  *
@@ -49,13 +51,18 @@ import { useSPFxContext } from './useSPFxContext';
49
51
  *
50
52
  * For type safety, import SPFx types:
51
53
  * ```typescript
52
- * import type { SPHttpClient } from '@microsoft/sp-http';
54
+ * import { SPHttpClient } from '@microsoft/sp-http';
53
55
  * ```
54
56
  *
55
57
  * Requirements:
56
- * - SPHttpClient available in SPFx context
58
+ * - SPFx ServiceScope with SPHttpClient service
57
59
  * - Appropriate SharePoint permissions for target APIs
58
60
  *
61
+ * @remarks
62
+ * This hook consumes SPHttpClient from SPFx ServiceScope using dependency injection.
63
+ * The service is consumed lazily (only when this hook is used) and cached for optimal
64
+ * performance. The client is always available (non-undefined) after Provider initialization.
65
+ *
59
66
  * @param initialBaseUrl - Base URL for SharePoint site (optional, defaults to current site)
60
67
  *
61
68
  * @example Using invoke with state management
@@ -89,14 +96,14 @@ import { useSPFxContext } from './useSPFxContext';
89
96
  *
90
97
  * @example Using client directly for advanced control
91
98
  * ```tsx
92
- * import type { SPHttpClient } from '@microsoft/sp-http';
99
+ * import { SPHttpClient } from '@microsoft/sp-http';
93
100
  *
94
101
  * function ListItems() {
95
102
  * const { client, baseUrl } = useSPFxSPHttpClient();
96
103
  * const [items, setItems] = useState([]);
97
104
  * const [loading, setLoading] = useState(false);
98
105
  *
99
- * if (!client) return <Spinner label="Initializing HTTP client..." />;
106
+ * // client is always available after Provider initialization
100
107
  *
101
108
  * const loadItems = async () => {
102
109
  * setLoading(true);
@@ -211,27 +218,22 @@ import { useSPFxContext } from './useSPFxContext';
211
218
  */
212
219
  export function useSPFxSPHttpClient(initialBaseUrl) {
213
220
  var _this = this;
214
- var _a, _b;
215
- var spfxContext = useSPFxContext().spfxContext;
216
- // Extract context data
217
- var ctx = spfxContext;
221
+ var consume = useSPFxServiceScope().consume;
222
+ var pageContext = useSPFxPageContext();
223
+ // Lazy consume SPHttpClient from ServiceScope (cached by useMemo)
224
+ var client = useMemo(function () {
225
+ return consume(SPHttpClient.serviceKey);
226
+ }, [consume]);
218
227
  // Default to current site if no baseUrl provided
219
- var defaultBaseUrl = (initialBaseUrl === null || initialBaseUrl === void 0 ? void 0 : initialBaseUrl.trim()) || ((_b = (_a = ctx.pageContext) === null || _a === void 0 ? void 0 : _a.web) === null || _b === void 0 ? void 0 : _b.absoluteUrl) || '';
228
+ var defaultBaseUrl = (initialBaseUrl === null || initialBaseUrl === void 0 ? void 0 : initialBaseUrl.trim()) || pageContext.web.absoluteUrl || '';
220
229
  // Normalize: remove trailing slash for consistency (ES5-compatible)
221
230
  var normalizedBaseUrl = defaultBaseUrl.charAt(defaultBaseUrl.length - 1) === '/'
222
231
  ? defaultBaseUrl.slice(0, -1)
223
232
  : defaultBaseUrl;
224
233
  // State management
225
- var client = useState(ctx.spHttpClient)[0];
226
- var _c = useState(normalizedBaseUrl), baseUrl = _c[0], setBaseUrlState = _c[1];
227
- var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
228
- var _e = useState(undefined), error = _e[0], setError = _e[1];
229
- // Initialize client
230
- useEffect(function () {
231
- if (!ctx.spHttpClient) {
232
- console.warn('SPHttpClient not available in SPFx context');
233
- }
234
- }, [ctx.spHttpClient]);
234
+ var _a = useState(normalizedBaseUrl), baseUrl = _a[0], setBaseUrlState = _a[1];
235
+ var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
236
+ var _c = useState(undefined), error = _c[0], setError = _c[1];
235
237
  // Public setter for baseUrl with normalization
236
238
  var setBaseUrl = useCallback(function (url) {
237
239
  var trimmed = url.trim();
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxSPHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxSPHttpClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSPFxSPHttpClient.js","sourceRoot":"","sources":["../../src/hooks/useSPFxSPHttpClient.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SpFxReactToolkitTest.d.ts","sourceRoot":"","sources":["../../../../src/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsD/B,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AAm3B5B,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAy+BjC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"SpFxReactToolkitTest.d.ts","sourceRoot":"","sources":["../../../../src/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyD/B,OAAO,cAAc,CAAC;AACtB,OAAO,eAAe,CAAC;AACvB,OAAO,eAAe,CAAC;AACvB,OAAO,oBAAoB,CAAC;AA6+B5B,QAAA,MAAM,oBAAoB,EAAE,KAAK,CAAC,EA8/BjC,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -46,13 +46,15 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
46
46
  import * as React from 'react';
47
47
  import styles from './SpFxReactToolkitTest.module.scss';
48
48
  import { Stack, Pivot, PivotItem, TextField, PrimaryButton, DefaultButton, MessageBar, MessageBarType, Separator, Label, Icon, } from '@fluentui/react';
49
+ /* eslint-disable max-lines */
49
50
  // Import all hooks from SPFx React Toolkit
50
- import { useSPFxProperties, useSPFxThemeInfo, useSPFxUserInfo, useSPFxEnvironmentInfo, useSPFxSiteInfo, useSPFxDisplayMode, useSPFxInstanceInfo, useSPFxPageContext, useSPFxTeams, useSPFxListInfo, useSPFxLocaleInfo, useSPFxHubSiteInfo, useSPFxCorrelationInfo, useSPFxPermissions, useSPFxCrossSitePermissions, useSPFxContainerSize, useSPFxContainerInfo, useSPFxSessionStorage, useSPFxLocalStorage, useSPFxLogger, useSPFxPageType, useSPFxServiceScope, useSPFxSPHttpClient, useSPFxMSGraphClient, useSPFxAadHttpClient, useSPFxPerformance, useSPFxFluent9ThemeInfo, useSPFxOneDriveAppData, useSPFxTenantProperty, useSPFxUserPhoto, useSPFxPnPContext, useSPFxPnP, useSPFxPnPList, useSPFxPnPSearch, SearchVerticals, } from '../../../hooks';
51
+ import { useSPFxProperties, useSPFxThemeInfo, useSPFxUserInfo, useSPFxEnvironmentInfo, useSPFxSiteInfo, useSPFxDisplayMode, useSPFxInstanceInfo, useSPFxPageContext, useSPFxTeams, useSPFxListInfo, useSPFxLocaleInfo, useSPFxHubSiteInfo, useSPFxCorrelationInfo, useSPFxPermissions, useSPFxCrossSitePermissions, useSPFxContainerSize, useSPFxContainerInfo, useSPFxSessionStorage, useSPFxLocalStorage, useSPFxLogger, useSPFxPageType, useSPFxServiceScope, useSPFxSPHttpClient, useSPFxMSGraphClient, useSPFxAadHttpClient, useSPFxHttpClient, useSPFxPerformance, useSPFxFluent9ThemeInfo, useSPFxOneDriveAppData, useSPFxTenantProperty, useSPFxUserPhoto, useSPFxPnPContext, useSPFxPnP, useSPFxPnPList, useSPFxPnPSearch, SearchVerticals, } from '../../../hooks';
51
52
  import '@pnp/sp/webs';
52
53
  import '@pnp/sp/lists';
53
54
  import '@pnp/sp/items';
54
55
  import '@pnp/sp/site-users';
55
56
  import { SPPermission } from '@microsoft/sp-page-context';
57
+ import { HttpClient } from '@microsoft/sp-http';
56
58
  // =============================================
57
59
  // Helper Components (Must be defined first)
58
60
  // =============================================
@@ -74,6 +76,98 @@ var StatusBadge = function (_a) {
74
76
  label));
75
77
  };
76
78
  // =============================================
79
+ // HttpClient Example Component
80
+ // =============================================
81
+ /**
82
+ * Example: useSPFxHttpClient
83
+ * Demonstrates calling external public APIs using HttpClient
84
+ */
85
+ var HttpClientExample = function () {
86
+ var _a = useSPFxHttpClient(), invoke = _a.invoke, isLoading = _a.isLoading, error = _a.error, clearError = _a.clearError;
87
+ var _b = React.useState([]), todos = _b[0], setTodos = _b[1];
88
+ var _c = React.useState(null), selectedTodo = _c[0], setSelectedTodo = _c[1];
89
+ var loadTodos = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
90
+ var data, err_1;
91
+ return __generator(this, function (_a) {
92
+ switch (_a.label) {
93
+ case 0:
94
+ _a.trys.push([0, 2, , 3]);
95
+ return [4 /*yield*/, invoke(function (client) {
96
+ return client.get('https://jsonplaceholder.typicode.com/todos?_limit=5', HttpClient.configurations.v1).then(function (res) { return res.json(); });
97
+ })];
98
+ case 1:
99
+ data = _a.sent();
100
+ setTodos(data);
101
+ setSelectedTodo(null);
102
+ return [3 /*break*/, 3];
103
+ case 2:
104
+ err_1 = _a.sent();
105
+ console.error('Failed to load todos:', err_1);
106
+ return [3 /*break*/, 3];
107
+ case 3: return [2 /*return*/];
108
+ }
109
+ });
110
+ }); }, [invoke]);
111
+ var loadTodoDetails = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
112
+ var data, err_2;
113
+ return __generator(this, function (_a) {
114
+ switch (_a.label) {
115
+ case 0:
116
+ _a.trys.push([0, 2, , 3]);
117
+ return [4 /*yield*/, invoke(function (client) {
118
+ return client.get("https://jsonplaceholder.typicode.com/todos/".concat(id), HttpClient.configurations.v1).then(function (res) { return res.json(); });
119
+ })];
120
+ case 1:
121
+ data = _a.sent();
122
+ setSelectedTodo(data);
123
+ return [3 /*break*/, 3];
124
+ case 2:
125
+ err_2 = _a.sent();
126
+ console.error('Failed to load todo details:', err_2);
127
+ return [3 /*break*/, 3];
128
+ case 3: return [2 /*return*/];
129
+ }
130
+ });
131
+ }); }, [invoke]);
132
+ return (React.createElement(Stack, { tokens: { childrenGap: 15 }, styles: { root: { padding: '16px', border: '1px solid #ddd', borderRadius: '4px' } } },
133
+ React.createElement("h3", null,
134
+ React.createElement(Icon, { iconName: "CloudDownload", style: { marginRight: '8px' } }),
135
+ "HttpClient Example - Public API Call"),
136
+ React.createElement(MessageBar, { messageBarType: MessageBarType.info },
137
+ "This example demonstrates calling a public REST API (JSONPlaceholder) using ",
138
+ React.createElement("strong", null, "useSPFxHttpClient"),
139
+ ". The hook provides automatic state management (loading/error) for external HTTP calls."),
140
+ React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 10 } },
141
+ React.createElement(PrimaryButton, { text: "Load Todos", onClick: loadTodos, disabled: isLoading, iconProps: { iconName: 'Download' } }),
142
+ error && (React.createElement(DefaultButton, { text: "Clear Error", onClick: clearError, iconProps: { iconName: 'Clear' } }))),
143
+ isLoading && (React.createElement(MessageBar, { messageBarType: MessageBarType.info },
144
+ React.createElement(Icon, { iconName: "Sync", style: { marginRight: '8px' } }),
145
+ "Loading data from external API...")),
146
+ error && (React.createElement(MessageBar, { messageBarType: MessageBarType.error },
147
+ React.createElement("strong", null, "Error:"),
148
+ " ",
149
+ error.message)),
150
+ todos.length > 0 && (React.createElement(Stack, { tokens: { childrenGap: 10 } },
151
+ React.createElement(Label, null, "Todos from JSONPlaceholder API:"),
152
+ todos.map(function (todo) { return (React.createElement(Stack, { key: todo.id, horizontal: true, tokens: { childrenGap: 10 }, styles: {
153
+ root: {
154
+ padding: '8px',
155
+ border: '1px solid #eee',
156
+ borderRadius: '4px',
157
+ cursor: 'pointer',
158
+ ':hover': { backgroundColor: '#f5f5f5' }
159
+ }
160
+ }, onClick: function () { return loadTodoDetails(todo.id); } },
161
+ React.createElement(Icon, { iconName: todo.completed ? 'CompletedSolid' : 'CircleRing' }),
162
+ React.createElement("span", null, todo.title))); }))),
163
+ selectedTodo && (React.createElement(Stack, { tokens: { childrenGap: 8 }, styles: { root: { padding: '12px', backgroundColor: '#f0f0f0', borderRadius: '4px' } } },
164
+ React.createElement(Label, null, "Selected Todo Details:"),
165
+ React.createElement(InfoRow, { label: "ID", value: String(selectedTodo.id), icon: "NumberField" }),
166
+ React.createElement(InfoRow, { label: "User ID", value: String(selectedTodo.userId), icon: "Contact" }),
167
+ React.createElement(InfoRow, { label: "Title", value: selectedTodo.title, icon: "TextDocument" }),
168
+ React.createElement(InfoRow, { label: "Completed", value: selectedTodo.completed ? 'Yes' : 'No', icon: selectedTodo.completed ? 'CompletedSolid' : 'CircleRing' })))));
169
+ };
170
+ // =============================================
77
171
  // PnPjs Example Components
78
172
  // =============================================
79
173
  /**
@@ -201,7 +295,7 @@ var PnPOperationsExample = function () {
201
295
  var _b = React.useState([]), lists = _b[0], setLists = _b[1];
202
296
  var _c = React.useState(null), batchData = _c[0], setBatchData = _c[1];
203
297
  var handleInvokeLists = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
204
- var result, err_1;
298
+ var result, err_3;
205
299
  return __generator(this, function (_a) {
206
300
  switch (_a.label) {
207
301
  case 0:
@@ -218,15 +312,15 @@ var PnPOperationsExample = function () {
218
312
  setLists(result);
219
313
  return [3 /*break*/, 3];
220
314
  case 2:
221
- err_1 = _a.sent();
222
- console.error('Invoke error:', err_1);
315
+ err_3 = _a.sent();
316
+ console.error('Invoke error:', err_3);
223
317
  return [3 /*break*/, 3];
224
318
  case 3: return [2 /*return*/];
225
319
  }
226
320
  });
227
321
  }); }, [invoke, clearError]);
228
322
  var handleBatchOperations = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
229
- var results, listsResult, userResult, webResult, err_2;
323
+ var results, listsResult, userResult, webResult, err_4;
230
324
  return __generator(this, function (_a) {
231
325
  switch (_a.label) {
232
326
  case 0:
@@ -252,8 +346,8 @@ var PnPOperationsExample = function () {
252
346
  });
253
347
  return [3 /*break*/, 3];
254
348
  case 2:
255
- err_2 = _a.sent();
256
- console.error('Batch error:', err_2);
349
+ err_4 = _a.sent();
350
+ console.error('Batch error:', err_4);
257
351
  return [3 /*break*/, 3];
258
352
  case 3: return [2 /*return*/];
259
353
  }
@@ -298,7 +392,7 @@ var PnPSearchBasicExample = function () {
298
392
  pageSize: 10
299
393
  }), search = _b.search, results = _b.results, totalResults = _b.totalResults, loading = _b.loading, error = _b.error, clearError = _b.clearError;
300
394
  var handleSearch = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
301
- var searchResults, err_3;
395
+ var searchResults, err_5;
302
396
  return __generator(this, function (_a) {
303
397
  switch (_a.label) {
304
398
  case 0:
@@ -317,8 +411,8 @@ var PnPSearchBasicExample = function () {
317
411
  });
318
412
  return [3 /*break*/, 4];
319
413
  case 3:
320
- err_3 = _a.sent();
321
- console.error('Search error:', err_3);
414
+ err_5 = _a.sent();
415
+ console.error('Search error:', err_5);
322
416
  return [3 /*break*/, 4];
323
417
  case 4: return [2 /*return*/];
324
418
  }
@@ -476,7 +570,7 @@ var PnPSearchSuggestionsExample = function () {
476
570
  };
477
571
  }, []);
478
572
  var handleSuggest = React.useCallback(function (value) { return __awaiter(void 0, void 0, void 0, function () {
479
- var results, err_4;
573
+ var results, err_6;
480
574
  return __generator(this, function (_a) {
481
575
  switch (_a.label) {
482
576
  case 0:
@@ -497,8 +591,8 @@ var PnPSearchSuggestionsExample = function () {
497
591
  }
498
592
  return [3 /*break*/, 4];
499
593
  case 3:
500
- err_4 = _a.sent();
501
- console.error('[PnPSearchSuggestions] Error:', err_4);
594
+ err_6 = _a.sent();
595
+ console.error('[PnPSearchSuggestions] Error:', err_6);
502
596
  if (mountedRef.current) {
503
597
  setSuggestions([]);
504
598
  }
@@ -566,7 +660,7 @@ var PnPListExample = function () {
566
660
  query(function (q) { return q.select('Id', 'Title').orderBy('Id', false); }).catch(function (err) { return console.error('Load error:', err); });
567
661
  }, [query]);
568
662
  var handleCreate = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
569
- var err_5;
663
+ var err_7;
570
664
  return __generator(this, function (_a) {
571
665
  switch (_a.label) {
572
666
  case 0:
@@ -581,15 +675,15 @@ var PnPListExample = function () {
581
675
  setNewTitle('');
582
676
  return [3 /*break*/, 4];
583
677
  case 3:
584
- err_5 = _a.sent();
585
- console.error('Create error:', err_5);
678
+ err_7 = _a.sent();
679
+ console.error('Create error:', err_7);
586
680
  return [3 /*break*/, 4];
587
681
  case 4: return [2 /*return*/];
588
682
  }
589
683
  });
590
684
  }); }, [create, newTitle, listTitle]);
591
685
  var handleUpdate = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
592
- var err_6;
686
+ var err_8;
593
687
  return __generator(this, function (_a) {
594
688
  switch (_a.label) {
595
689
  case 0:
@@ -605,15 +699,15 @@ var PnPListExample = function () {
605
699
  setEditTitle('');
606
700
  return [3 /*break*/, 4];
607
701
  case 3:
608
- err_6 = _a.sent();
609
- console.error('Update error:', err_6);
702
+ err_8 = _a.sent();
703
+ console.error('Update error:', err_8);
610
704
  return [3 /*break*/, 4];
611
705
  case 4: return [2 /*return*/];
612
706
  }
613
707
  });
614
708
  }); }, [update, editTitle]);
615
709
  var handleDelete = React.useCallback(function (id) { return __awaiter(void 0, void 0, void 0, function () {
616
- var err_7;
710
+ var err_9;
617
711
  return __generator(this, function (_a) {
618
712
  switch (_a.label) {
619
713
  case 0:
@@ -627,8 +721,8 @@ var PnPListExample = function () {
627
721
  _a.sent();
628
722
  return [3 /*break*/, 4];
629
723
  case 3:
630
- err_7 = _a.sent();
631
- console.error('Delete error:', err_7);
724
+ err_9 = _a.sent();
725
+ console.error('Delete error:', err_9);
632
726
  return [3 /*break*/, 4];
633
727
  case 4: return [2 /*return*/];
634
728
  }
@@ -811,30 +905,20 @@ var SpFxReactToolkitTest = function () {
811
905
  setLogMessages(function (prev) { return __spreadArray(__spreadArray([], prev.slice(-4), true), [{ level: level, message: message }], false); });
812
906
  }, [logger]);
813
907
  var handleLoadOneDrive = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
814
- var error_3;
815
908
  return __generator(this, function (_a) {
816
909
  switch (_a.label) {
817
- case 0:
818
- _a.trys.push([0, 2, , 3]);
819
- return [4 /*yield*/, oneDriveData.load()];
910
+ case 0: return [4 /*yield*/, oneDriveData.load()];
820
911
  case 1:
821
912
  _a.sent();
822
- setMessageText('Data loaded from OneDrive successfully!');
913
+ setMessageText('OneDrive load completed. Check status below (missing file sets isNotFound=true).');
823
914
  setShowMessage(true);
824
915
  setTimeout(function () { return setShowMessage(false); }, 3000);
825
- return [3 /*break*/, 3];
826
- case 2:
827
- error_3 = _a.sent();
828
- setMessageText("Load failed: ".concat(error_3 instanceof Error ? error_3.message : 'Unknown error'));
829
- setShowMessage(true);
830
- setTimeout(function () { return setShowMessage(false); }, 5000);
831
- return [3 /*break*/, 3];
832
- case 3: return [2 /*return*/];
916
+ return [2 /*return*/];
833
917
  }
834
918
  });
835
919
  }); }, [oneDriveData]);
836
920
  var handleSaveOneDrive = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
837
- var newData, error_4;
921
+ var newData, error_3;
838
922
  var _a, _b;
839
923
  return __generator(this, function (_c) {
840
924
  switch (_c.label) {
@@ -854,8 +938,8 @@ var SpFxReactToolkitTest = function () {
854
938
  setTimeout(function () { return setShowMessage(false); }, 3000);
855
939
  return [3 /*break*/, 3];
856
940
  case 2:
857
- error_4 = _c.sent();
858
- setMessageText("Save failed: ".concat(error_4 instanceof Error ? error_4.message : 'Unknown error'));
941
+ error_3 = _c.sent();
942
+ setMessageText("Save failed: ".concat(error_3 instanceof Error ? error_3.message : 'Unknown error'));
859
943
  setShowMessage(true);
860
944
  setTimeout(function () { return setShowMessage(false); }, 5000);
861
945
  return [3 /*break*/, 3];
@@ -864,7 +948,7 @@ var SpFxReactToolkitTest = function () {
864
948
  });
865
949
  }); }, [oneDriveMessage, oneDriveData]);
866
950
  var handleLoadTenantProperty = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
867
- var error_5;
951
+ var error_4;
868
952
  return __generator(this, function (_a) {
869
953
  switch (_a.label) {
870
954
  case 0:
@@ -880,8 +964,8 @@ var SpFxReactToolkitTest = function () {
880
964
  setTimeout(function () { return setShowMessage(false); }, 3000);
881
965
  return [3 /*break*/, 3];
882
966
  case 2:
883
- error_5 = _a.sent();
884
- setMessageText("Load failed: ".concat(error_5 instanceof Error ? error_5.message : 'Unknown error'));
967
+ error_4 = _a.sent();
968
+ setMessageText("Load failed: ".concat(error_4 instanceof Error ? error_4.message : 'Unknown error'));
885
969
  setShowMessage(true);
886
970
  setTimeout(function () { return setShowMessage(false); }, 5000);
887
971
  return [3 /*break*/, 3];
@@ -890,7 +974,7 @@ var SpFxReactToolkitTest = function () {
890
974
  });
891
975
  }); }, [tenantVersion, tenantCounter]);
892
976
  var handleSaveTenantVersion = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
893
- var error_6;
977
+ var error_5;
894
978
  return __generator(this, function (_a) {
895
979
  switch (_a.label) {
896
980
  case 0:
@@ -912,8 +996,8 @@ var SpFxReactToolkitTest = function () {
912
996
  setTimeout(function () { return setShowMessage(false); }, 3000);
913
997
  return [3 /*break*/, 4];
914
998
  case 3:
915
- error_6 = _a.sent();
916
- setMessageText("Save failed: ".concat(error_6 instanceof Error ? error_6.message : 'Unknown error'));
999
+ error_5 = _a.sent();
1000
+ setMessageText("Save failed: ".concat(error_5 instanceof Error ? error_5.message : 'Unknown error'));
917
1001
  setShowMessage(true);
918
1002
  setTimeout(function () { return setShowMessage(false); }, 5000);
919
1003
  return [3 /*break*/, 4];
@@ -922,7 +1006,7 @@ var SpFxReactToolkitTest = function () {
922
1006
  });
923
1007
  }); }, [tenantVersionInput, tenantVersion]);
924
1008
  var handleIncrementTenantCounter = React.useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
925
- var newValue, error_7;
1009
+ var newValue, error_6;
926
1010
  var _a;
927
1011
  return __generator(this, function (_b) {
928
1012
  switch (_b.label) {
@@ -945,8 +1029,8 @@ var SpFxReactToolkitTest = function () {
945
1029
  setTimeout(function () { return setShowMessage(false); }, 3000);
946
1030
  return [3 /*break*/, 4];
947
1031
  case 3:
948
- error_7 = _b.sent();
949
- setMessageText("Increment failed: ".concat(error_7 instanceof Error ? error_7.message : 'Unknown error'));
1032
+ error_6 = _b.sent();
1033
+ setMessageText("Increment failed: ".concat(error_6 instanceof Error ? error_6.message : 'Unknown error'));
950
1034
  setShowMessage(true);
951
1035
  setTimeout(function () { return setShowMessage(false); }, 5000);
952
1036
  return [3 /*break*/, 4];
@@ -955,7 +1039,7 @@ var SpFxReactToolkitTest = function () {
955
1039
  });
956
1040
  }); }, [tenantCounter]);
957
1041
  var handleRemoveTenantProperty = React.useCallback(function (propertyName) { return __awaiter(void 0, void 0, void 0, function () {
958
- var hook, error_8;
1042
+ var hook, error_7;
959
1043
  return __generator(this, function (_a) {
960
1044
  switch (_a.label) {
961
1045
  case 0:
@@ -980,8 +1064,8 @@ var SpFxReactToolkitTest = function () {
980
1064
  setTimeout(function () { return setShowMessage(false); }, 3000);
981
1065
  return [3 /*break*/, 4];
982
1066
  case 3:
983
- error_8 = _a.sent();
984
- setMessageText("Remove failed: ".concat(error_8 instanceof Error ? error_8.message : 'Unknown error'));
1067
+ error_7 = _a.sent();
1068
+ setMessageText("Remove failed: ".concat(error_7 instanceof Error ? error_7.message : 'Unknown error'));
985
1069
  setShowMessage(true);
986
1070
  setTimeout(function () { return setShowMessage(false); }, 5000);
987
1071
  return [3 /*break*/, 4];
@@ -1175,11 +1259,15 @@ var SpFxReactToolkitTest = function () {
1175
1259
  oneDriveData.writeError && (React.createElement(MessageBar, { messageBarType: MessageBarType.warning },
1176
1260
  "Write Error: ",
1177
1261
  oneDriveData.writeError.message)),
1262
+ !oneDriveData.isLoading && oneDriveData.isNotFound && !oneDriveData.data && !oneDriveData.error && (React.createElement(MessageBar, { messageBarType: MessageBarType.info }, "File not found in OneDrive yet (isNotFound=true). Click \"Save to OneDrive\" to create it.")),
1178
1263
  oneDriveData.isLoading ? (React.createElement(MessageBar, { messageBarType: MessageBarType.info }, "Loading from OneDrive...")) : oneDriveData.data ? (React.createElement(Stack, { tokens: { childrenGap: 1 } },
1179
1264
  React.createElement(InfoRow, { label: "Message", value: oneDriveData.data.message, icon: "Message" }),
1180
1265
  React.createElement(InfoRow, { label: "Counter", value: String(oneDriveData.data.counter), icon: "NumberField" }),
1181
1266
  React.createElement(InfoRow, { label: "Last Updated", value: new Date(oneDriveData.data.timestamp).toLocaleString(), icon: "DateTime" }),
1182
- React.createElement(InfoRow, { label: "Is Ready", value: oneDriveData.isReady ? 'Yes' : 'No', icon: "CheckMark" }))) : (React.createElement(Label, null, "No data loaded yet. Click \"Load\" to fetch from OneDrive.")),
1267
+ React.createElement(InfoRow, { label: "Is Ready", value: oneDriveData.isReady ? 'Yes' : 'No', icon: "CheckMark" }),
1268
+ React.createElement(InfoRow, { label: "Is Not Found", value: oneDriveData.isNotFound ? 'Yes' : 'No', icon: "BlockedSiteSolid12" }))) : (React.createElement(Label, null, oneDriveData.isNotFound
1269
+ ? 'No file found yet. Click "Save to OneDrive" to create it.'
1270
+ : 'No data loaded yet. Click "Load" to fetch from OneDrive.')),
1183
1271
  React.createElement(TextField, { label: "New Message", value: oneDriveMessage, onChange: function (_, newValue) { return setOneDriveMessage(newValue !== null && newValue !== void 0 ? newValue : ''); }, placeholder: "Enter a message to save...", disabled: oneDriveData.isWriting || oneDriveData.isLoading }),
1184
1272
  React.createElement(Stack, { horizontal: true, tokens: { childrenGap: 2 } },
1185
1273
  React.createElement(PrimaryButton, { text: "Load from OneDrive", onClick: handleLoadOneDrive, disabled: oneDriveData.isLoading || oneDriveData.isWriting, iconProps: { iconName: 'CloudDownload' } }),
@@ -1331,6 +1419,15 @@ var SpFxReactToolkitTest = function () {
1331
1419
  React.createElement("details", { className: styles.detailsSection },
1332
1420
  React.createElement("summary", null, "Click to expand/collapse"),
1333
1421
  React.createElement("pre", null, safeStringify(pageContext, 2)))))),
1422
+ React.createElement(PivotItem, { headerText: "HttpClient", itemIcon: "Cloud" },
1423
+ React.createElement(Stack, { tokens: { childrenGap: 20 }, styles: { root: { marginTop: '16px' } } },
1424
+ React.createElement(MessageBar, { messageBarType: MessageBarType.info },
1425
+ React.createElement("strong", null, "useSPFxHttpClient Hook Example"),
1426
+ React.createElement("br", null),
1427
+ "This hook provides access to the generic HttpClient for calling external APIs (non-SharePoint). For SharePoint REST API calls, use ",
1428
+ React.createElement("strong", null, "useSPFxSPHttpClient"),
1429
+ " instead."),
1430
+ React.createElement(HttpClientExample, null))),
1334
1431
  React.createElement(PivotItem, { headerText: "PnPjs", itemIcon: "CloudDownload" },
1335
1432
  React.createElement(Stack, { tokens: { childrenGap: 20 }, styles: { root: { marginTop: '16px' } } },
1336
1433
  React.createElement(PnPContextExample, null),