@apvee/spfx-react-toolkit 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5973 -713
- package/lib/core/provider-base.internal.d.ts +7 -2
- package/lib/core/provider-base.internal.d.ts.map +1 -1
- package/lib/core/provider-base.internal.js +27 -0
- package/lib/core/provider-base.internal.js.map +1 -1
- package/lib/hooks/index.d.ts +2 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +2 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.d.ts +9 -4
- package/lib/hooks/useSPFxAadHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +18 -14
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxContext.d.ts +0 -1
- package/lib/hooks/useSPFxContext.d.ts.map +1 -1
- package/lib/hooks/useSPFxContext.js +0 -1
- package/lib/hooks/useSPFxContext.js.map +1 -1
- package/lib/hooks/useSPFxHttpClient.d.ts +225 -0
- package/lib/hooks/useSPFxHttpClient.d.ts.map +1 -0
- package/lib/hooks/useSPFxHttpClient.js +275 -0
- package/lib/hooks/useSPFxHttpClient.js.map +1 -0
- package/lib/hooks/useSPFxMSGraphClient.d.ts +9 -4
- package/lib/hooks/useSPFxMSGraphClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxMSGraphClient.js +19 -14
- package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.d.ts +25 -0
- package/lib/hooks/useSPFxOneDriveAppData.d.ts.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.js +121 -256
- package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
- package/lib/hooks/useSPFxPageContext.d.ts +3 -3
- package/lib/hooks/useSPFxPageContext.d.ts.map +1 -1
- package/lib/hooks/useSPFxPageContext.js +11 -12
- package/lib/hooks/useSPFxPageContext.js.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.d.ts +12 -6
- package/lib/hooks/useSPFxSPHttpClient.d.ts.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.js +23 -21
- package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +148 -51
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
|
|
40
|
-
import {
|
|
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
|
|
54
|
+
* import { SPHttpClient } from '@microsoft/sp-http';
|
|
53
55
|
* ```
|
|
54
56
|
*
|
|
55
57
|
* Requirements:
|
|
56
|
-
* -
|
|
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
|
|
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
|
-
*
|
|
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
|
|
215
|
-
var
|
|
216
|
-
//
|
|
217
|
-
var
|
|
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()) ||
|
|
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
|
|
226
|
-
var
|
|
227
|
-
var
|
|
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":"AAAA,yBAAyB;AACzB,4DAA4D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,
|
|
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;
|
|
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,
|
|
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
|
-
|
|
222
|
-
console.error('Invoke error:',
|
|
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,
|
|
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
|
-
|
|
256
|
-
console.error('Batch error:',
|
|
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,
|
|
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
|
-
|
|
321
|
-
console.error('Search error:',
|
|
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,
|
|
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
|
-
|
|
501
|
-
console.error('[PnPSearchSuggestions] Error:',
|
|
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
|
|
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
|
-
|
|
585
|
-
console.error('Create error:',
|
|
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
|
|
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
|
-
|
|
609
|
-
console.error('Update error:',
|
|
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
|
|
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
|
-
|
|
631
|
-
console.error('Delete error:',
|
|
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('
|
|
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 [
|
|
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,
|
|
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
|
-
|
|
858
|
-
setMessageText("Save failed: ".concat(
|
|
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
|
|
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
|
-
|
|
884
|
-
setMessageText("Load failed: ".concat(
|
|
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
|
|
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
|
-
|
|
916
|
-
setMessageText("Save failed: ".concat(
|
|
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,
|
|
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
|
-
|
|
949
|
-
setMessageText("Increment failed: ".concat(
|
|
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,
|
|
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
|
-
|
|
984
|
-
setMessageText("Remove failed: ".concat(
|
|
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" })
|
|
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),
|