@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
@@ -38,204 +38,25 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
38
38
  };
39
39
  import { useState, useCallback, useEffect, useRef } from 'react';
40
40
  import { useSPFxMSGraphClient } from './useSPFxMSGraphClient';
41
- /**
42
- * Hook to manage JSON files in user's OneDrive appRoot folder
43
- *
44
- * Provides unified read/write operations for JSON data stored in OneDrive's special
45
- * appRoot folder (accessible per-app, user-scoped storage).
46
- *
47
- * Features:
48
- * - Automatic JSON serialization/deserialization
49
- * - Separate loading states for read/write operations
50
- * - Optional auto-fetch on mount
51
- * - Folder/namespace support for file organization
52
- * - Type-safe with TypeScript generics
53
- * - Memory leak safe with mounted state tracking
54
- * - Error handling for both read and write operations
55
- *
56
- * Requirements:
57
- * - Microsoft Graph permissions: Files.ReadWrite or Files.ReadWrite.AppFolder
58
- * - User must be authenticated
59
- *
60
- * @param fileName - Name of the JSON file (e.g., 'config.json', 'settings.json')
61
- * @param folder - Optional folder/namespace identifier for file organization.
62
- * Will be sanitized to prevent path traversal.
63
- * Examples: 'my-app', instanceId (GUID), 'config-v2'
64
- * @param autoFetch - Whether to automatically load file on mount. Default: true
65
- *
66
- * @returns Object with data, loading states, error states, and read/write functions
67
- *
68
- * @example Basic usage - auto-fetch from root
69
- * ```tsx
70
- * import type { MyConfig } from './types';
71
- *
72
- * function ConfigPanel() {
73
- * const { data, isLoading, error, write, isWriting } =
74
- * useSPFxOneDriveAppData<MyConfig>('config.json');
75
- *
76
- * if (isLoading) return <Spinner label="Loading configuration..." />;
77
- * if (error) return <MessageBar messageBarType={MessageBarType.error}>
78
- * Failed to load: {error.message}
79
- * </MessageBar>;
80
- *
81
- * const handleSave = async (newConfig: MyConfig) => {
82
- * try {
83
- * await write(newConfig);
84
- * console.log('Saved successfully!');
85
- * } catch (err) {
86
- * console.error('Save failed:', err);
87
- * }
88
- * };
89
- *
90
- * return (
91
- * <div>
92
- * <TextField
93
- * value={data?.title}
94
- * onChange={(_, val) => handleSave({ ...data, title: val })}
95
- * disabled={isWriting}
96
- * />
97
- * {isWriting && <Spinner label="Saving..." />}
98
- * </div>
99
- * );
100
- * }
101
- * ```
102
- *
103
- * @example With folder namespace
104
- * ```tsx
105
- * // Store files in a dedicated folder
106
- * const { data, write } = useSPFxOneDriveAppData<State>(
107
- * 'state.json',
108
- * 'my-app-v2' // Files stored in appRoot:/my-app-v2/state.json
109
- * );
110
- * ```
111
- *
112
- * @example Per-instance storage (multi-instance support)
113
- * ```tsx
114
- * // Each WebPart instance has its own data
115
- * const { id } = useSPFxInstanceInfo();
116
- * const { data, write } = useSPFxOneDriveAppData<Settings>(
117
- * 'settings.json',
118
- * id // Files stored in appRoot:/abc-123-guid/settings.json
119
- * );
120
- * ```
121
- *
122
- * @example Lazy loading (manual load)
123
- * ```tsx
124
- * const { data, load, isLoading, write } = useSPFxOneDriveAppData<Cache>(
125
- * 'cache.json',
126
- * 'my-app',
127
- * false // Don't auto-fetch
128
- * );
129
- *
130
- * return (
131
- * <div>
132
- * <button onClick={load} disabled={isLoading}>
133
- * {isLoading ? 'Loading...' : 'Load Cache'}
134
- * </button>
135
- * {data && <pre>{JSON.stringify(data, null, 2)}</pre>}
136
- * </div>
137
- * );
138
- * ```
139
- *
140
- * @example Multiple files in same namespace
141
- * ```tsx
142
- * function MyApp() {
143
- * const config = useSPFxOneDriveAppData<Config>('config.json', 'myapp');
144
- * const state = useSPFxOneDriveAppData<State>('state.json', 'myapp');
145
- * const cache = useSPFxOneDriveAppData<Cache>('cache.json', 'myapp');
146
- *
147
- * // All files stored in appRoot:/myapp/
148
- * // Easy to manage and clean up as a group
149
- * }
150
- * ```
151
- *
152
- * @example Error handling and retry
153
- * ```tsx
154
- * function DataManager() {
155
- * const { data, error, load, writeError, write, isReady } =
156
- * useSPFxOneDriveAppData<MyData>('data.json');
157
- *
158
- * if (error) {
159
- * return (
160
- * <MessageBar
161
- * messageBarType={MessageBarType.error}
162
- * actions={<button onClick={load}>Retry</button>}
163
- * >
164
- * Load failed: {error.message}
165
- * </MessageBar>
166
- * );
167
- * }
168
- *
169
- * if (writeError) {
170
- * return (
171
- * <MessageBar messageBarType={MessageBarType.warning}>
172
- * Save failed: {writeError.message}
173
- * </MessageBar>
174
- * );
175
- * }
176
- *
177
- * if (!isReady) return <Spinner />;
178
- *
179
- * return <DataDisplay data={data} onSave={write} />;
180
- * }
181
- * ```
182
- *
183
- * @example CRUD-like operations
184
- * ```tsx
185
- * interface TodoList {
186
- * items: Array<{ id: string; text: string; done: boolean }>;
187
- * }
188
- *
189
- * function TodoApp() {
190
- * const { data, write, isLoading, isWriting } =
191
- * useSPFxOneDriveAppData<TodoList>('todos.json', 'todo-app');
192
- *
193
- * const addTodo = async (text: string) => {
194
- * const newItem = { id: crypto.randomUUID(), text, done: false };
195
- * await write({
196
- * items: [...(data?.items ?? []), newItem]
197
- * });
198
- * };
199
- *
200
- * const toggleTodo = async (id: string) => {
201
- * await write({
202
- * items: data?.items.map(item =>
203
- * item.id === id ? { ...item, done: !item.done } : item
204
- * ) ?? []
205
- * });
206
- * };
207
- *
208
- * const deleteTodo = async (id: string) => {
209
- * await write({
210
- * items: data?.items.filter(item => item.id !== id) ?? []
211
- * });
212
- * };
213
- *
214
- * if (isLoading) return <Spinner />;
215
- *
216
- * return (
217
- * <div>
218
- * <TodoList
219
- * items={data?.items ?? []}
220
- * onToggle={toggleTodo}
221
- * onDelete={deleteTodo}
222
- * />
223
- * <AddTodoForm onAdd={addTodo} disabled={isWriting} />
224
- * </div>
225
- * );
226
- * }
227
- * ```
228
- */
229
- export function useSPFxOneDriveAppData(fileName, folder, autoFetch) {
41
+ export function useSPFxOneDriveAppData(fileName, folderOrOptions, autoFetch) {
230
42
  var _this = this;
43
+ var _a, _b;
231
44
  if (autoFetch === void 0) { autoFetch = true; }
232
45
  var client = useSPFxMSGraphClient().client;
46
+ var options = typeof folderOrOptions === 'object' && folderOrOptions !== null
47
+ ? folderOrOptions
48
+ : { folder: folderOrOptions, autoFetch: autoFetch };
49
+ var folder = options.folder;
50
+ var shouldAutoFetch = (_a = options.autoFetch) !== null && _a !== void 0 ? _a : true;
51
+ var defaultValue = options.defaultValue;
52
+ var createIfMissing = (_b = options.createIfMissing) !== null && _b !== void 0 ? _b : false;
233
53
  // State management
234
- var _a = useState(undefined), data = _a[0], setData = _a[1];
235
- var _b = useState(false), isLoading = _b[0], setIsLoading = _b[1];
236
- var _c = useState(undefined), error = _c[0], setError = _c[1];
237
- var _d = useState(false), isWriting = _d[0], setIsWriting = _d[1];
238
- var _e = useState(undefined), writeError = _e[0], setWriteError = _e[1];
54
+ var _c = useState(defaultValue), data = _c[0], setData = _c[1];
55
+ var _d = useState(false), isLoading = _d[0], setIsLoading = _d[1];
56
+ var _e = useState(undefined), error = _e[0], setError = _e[1];
57
+ var _f = useState(false), isWriting = _f[0], setIsWriting = _f[1];
58
+ var _g = useState(undefined), writeError = _g[0], setWriteError = _g[1];
59
+ var _h = useState(false), isNotFound = _h[0], setIsNotFound = _h[1];
239
60
  // Track component mounted state to prevent memory leaks
240
61
  var isMounted = useRef(true);
241
62
  useEffect(function () {
@@ -258,59 +79,68 @@ export function useSPFxOneDriveAppData(fileName, folder, autoFetch) {
258
79
  }
259
80
  return "".concat(basePath, "/").concat(file, ":/content");
260
81
  }, []);
82
+ var isNotFoundError = useCallback(function (err) {
83
+ var _a, _b, _c, _d, _e, _f;
84
+ var anyErr = err;
85
+ if ((anyErr === null || anyErr === void 0 ? void 0 : anyErr.statusCode) === 404 || (anyErr === null || anyErr === void 0 ? void 0 : anyErr.status) === 404)
86
+ return true;
87
+ var code = (_a = anyErr === null || anyErr === void 0 ? void 0 : anyErr.code) !== null && _a !== void 0 ? _a : (_c = (_b = anyErr === null || anyErr === void 0 ? void 0 : anyErr.body) === null || _b === void 0 ? void 0 : _b.error) === null || _c === void 0 ? void 0 : _c.code;
88
+ if (code && /itemnotfound/i.test(code))
89
+ return true;
90
+ var message = (_d = anyErr === null || anyErr === void 0 ? void 0 : anyErr.message) !== null && _d !== void 0 ? _d : (_f = (_e = anyErr === null || anyErr === void 0 ? void 0 : anyErr.body) === null || _e === void 0 ? void 0 : _e.error) === null || _f === void 0 ? void 0 : _f.message;
91
+ if (message && /(\b404\b|not found|itemnotfound)/i.test(message))
92
+ return true;
93
+ return false;
94
+ }, []);
261
95
  /**
262
- * Load file from OneDrive
263
- * Updates data, isLoading, and error states
96
+ * Write data to OneDrive file
97
+ * Creates file if it doesn't exist, updates if it does (upsert)
98
+ * Updates isWriting and writeError states
264
99
  */
265
- var load = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
266
- var apiPath, fileContent, err_1, error_1;
100
+ var write = useCallback(function (content) { return __awaiter(_this, void 0, void 0, function () {
101
+ var apiPath, jsonContent, err_1, error_1;
267
102
  return __generator(this, function (_a) {
268
103
  switch (_a.label) {
269
104
  case 0:
270
105
  if (!client) {
271
- console.warn('Graph client not available yet. Skipping load.');
272
- return [2 /*return*/];
106
+ throw new Error('Graph client not available. Cannot write file.');
273
107
  }
274
108
  if (!fileName) {
275
- console.warn('fileName is required. Skipping load.');
276
- return [2 /*return*/];
109
+ throw new Error('fileName is required. Cannot write file.');
277
110
  }
278
- setIsLoading(true);
279
- setError(undefined);
111
+ setIsWriting(true);
112
+ setWriteError(undefined);
280
113
  _a.label = 1;
281
114
  case 1:
282
115
  _a.trys.push([1, 3, 4, 5]);
283
116
  apiPath = buildApiPath(fileName, folder);
284
- return [4 /*yield*/, client.api(apiPath).get()];
117
+ jsonContent = JSON.stringify(content);
118
+ return [4 /*yield*/, client
119
+ .api(apiPath)
120
+ .header('Content-Type', 'application/json')
121
+ .put(jsonContent)];
285
122
  case 2:
286
- fileContent = _a.sent();
123
+ _a.sent();
287
124
  if (isMounted.current) {
288
- // Parse JSON if response is string, otherwise use as-is
289
- if (typeof fileContent === 'string') {
290
- try {
291
- setData(JSON.parse(fileContent));
292
- }
293
- catch (parseError) {
294
- throw new Error("Failed to parse JSON: ".concat(parseError instanceof Error ? parseError.message : 'Unknown error'));
295
- }
296
- }
297
- else {
298
- setData(fileContent);
299
- }
125
+ // Update local data to reflect successful write
126
+ setData(content);
127
+ setIsNotFound(false);
128
+ // Clear read error if write succeeds (fresh state)
129
+ setError(undefined);
300
130
  }
301
131
  return [3 /*break*/, 5];
302
132
  case 3:
303
133
  err_1 = _a.sent();
304
134
  if (isMounted.current) {
305
135
  error_1 = err_1 instanceof Error ? err_1 : new Error(String(err_1));
306
- setError(error_1);
307
- // Don't throw - allow component to handle error via state
308
- console.error('Failed to load file from OneDrive:', error_1);
136
+ setWriteError(error_1);
137
+ console.error('Failed to write file to OneDrive:', error_1);
309
138
  }
310
- return [3 /*break*/, 5];
139
+ // Re-throw to allow caller to handle
140
+ throw err_1;
311
141
  case 4:
312
142
  if (isMounted.current) {
313
- setIsLoading(false);
143
+ setIsWriting(false);
314
144
  }
315
145
  return [7 /*endfinally*/];
316
146
  case 5: return [2 /*return*/];
@@ -318,67 +148,101 @@ export function useSPFxOneDriveAppData(fileName, folder, autoFetch) {
318
148
  });
319
149
  }); }, [client, fileName, folder, buildApiPath]);
320
150
  /**
321
- * Write data to OneDrive file
322
- * Creates file if it doesn't exist, updates if it does (upsert)
323
- * Updates isWriting and writeError states
151
+ * Load file from OneDrive
152
+ * Updates data, isLoading, and error states
324
153
  */
325
- var write = useCallback(function (content) { return __awaiter(_this, void 0, void 0, function () {
326
- var apiPath, jsonContent, err_2, error_2;
154
+ var load = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
155
+ var apiPath, fileContent, err_2, notFound, writeErr_1, error_2;
327
156
  return __generator(this, function (_a) {
328
157
  switch (_a.label) {
329
158
  case 0:
330
159
  if (!client) {
331
- throw new Error('Graph client not available. Cannot write file.');
160
+ console.warn('Graph client not available yet. Skipping load.');
161
+ return [2 /*return*/];
332
162
  }
333
163
  if (!fileName) {
334
- throw new Error('fileName is required. Cannot write file.');
164
+ console.warn('fileName is required. Skipping load.');
165
+ return [2 /*return*/];
335
166
  }
336
- setIsWriting(true);
337
- setWriteError(undefined);
167
+ setIsLoading(true);
168
+ setError(undefined);
169
+ setIsNotFound(false);
338
170
  _a.label = 1;
339
171
  case 1:
340
- _a.trys.push([1, 3, 4, 5]);
172
+ _a.trys.push([1, 3, 12, 13]);
341
173
  apiPath = buildApiPath(fileName, folder);
342
- jsonContent = JSON.stringify(content);
343
- return [4 /*yield*/, client
344
- .api(apiPath)
345
- .header('Content-Type', 'application/json')
346
- .put(jsonContent)];
174
+ return [4 /*yield*/, client.api(apiPath).get()];
347
175
  case 2:
348
- _a.sent();
176
+ fileContent = _a.sent();
349
177
  if (isMounted.current) {
350
- // Update local data to reflect successful write
351
- setData(content);
352
- // Clear read error if write succeeds (fresh state)
353
- setError(undefined);
178
+ // Parse JSON if response is string, otherwise use as-is
179
+ if (typeof fileContent === 'string') {
180
+ try {
181
+ setData(JSON.parse(fileContent));
182
+ }
183
+ catch (parseError) {
184
+ throw new Error("Failed to parse JSON: ".concat(parseError instanceof Error ? parseError.message : 'Unknown error'));
185
+ }
186
+ }
187
+ else {
188
+ setData(fileContent);
189
+ }
190
+ setIsNotFound(false);
354
191
  }
355
- return [3 /*break*/, 5];
192
+ return [3 /*break*/, 13];
356
193
  case 3:
357
194
  err_2 = _a.sent();
358
- if (isMounted.current) {
359
- error_2 = err_2 instanceof Error ? err_2 : new Error(String(err_2));
360
- setWriteError(error_2);
361
- console.error('Failed to write file to OneDrive:', error_2);
362
- }
363
- // Re-throw to allow caller to handle
364
- throw err_2;
195
+ if (!isMounted.current) return [3 /*break*/, 11];
196
+ notFound = isNotFoundError(err_2);
197
+ setIsNotFound(notFound);
198
+ if (!notFound) return [3 /*break*/, 10];
199
+ if (!(defaultValue !== undefined)) return [3 /*break*/, 8];
200
+ setData(defaultValue);
201
+ if (!createIfMissing) return [3 /*break*/, 7];
202
+ _a.label = 4;
365
203
  case 4:
204
+ _a.trys.push([4, 6, , 7]);
205
+ return [4 /*yield*/, write(defaultValue)];
206
+ case 5:
207
+ _a.sent();
208
+ return [3 /*break*/, 7];
209
+ case 6:
210
+ writeErr_1 = _a.sent();
211
+ // write() already updates writeError state
212
+ console.error('Failed to create missing file in OneDrive:', writeErr_1);
213
+ return [3 /*break*/, 7];
214
+ case 7: return [3 /*break*/, 9];
215
+ case 8:
216
+ setData(undefined);
217
+ _a.label = 9;
218
+ case 9:
219
+ setError(undefined);
220
+ console.info('OneDrive file not found. isNotFound=true');
221
+ return [2 /*return*/];
222
+ case 10:
223
+ error_2 = err_2 instanceof Error ? err_2 : new Error(String(err_2));
224
+ setError(error_2);
225
+ // Don't throw - allow component to handle error via state
226
+ console.error('Failed to load file from OneDrive:', error_2);
227
+ _a.label = 11;
228
+ case 11: return [3 /*break*/, 13];
229
+ case 12:
366
230
  if (isMounted.current) {
367
- setIsWriting(false);
231
+ setIsLoading(false);
368
232
  }
369
233
  return [7 /*endfinally*/];
370
- case 5: return [2 /*return*/];
234
+ case 13: return [2 /*return*/];
371
235
  }
372
236
  });
373
- }); }, [client, fileName, folder, buildApiPath]);
237
+ }); }, [client, fileName, folder, buildApiPath, defaultValue, createIfMissing, isNotFoundError, write]);
374
238
  // Auto-fetch on mount if enabled
375
239
  useEffect(function () {
376
- if (autoFetch && client && fileName) {
240
+ if (shouldAutoFetch && client && fileName) {
377
241
  load().catch(function () {
378
242
  // Error already handled in load() function
379
243
  });
380
244
  }
381
- }, [autoFetch, client, fileName, load]);
245
+ }, [shouldAutoFetch, client, fileName, load]);
382
246
  // Computed state: ready when data loaded successfully
383
247
  var isReady = !isLoading && !error && data !== undefined;
384
248
  return {
@@ -387,6 +251,7 @@ export function useSPFxOneDriveAppData(fileName, folder, autoFetch) {
387
251
  error: error,
388
252
  isWriting: isWriting,
389
253
  writeError: writeError,
254
+ isNotFound: isNotFound,
390
255
  load: load,
391
256
  write: write,
392
257
  isReady: isReady,
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxOneDriveAppData.js","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSPFxOneDriveAppData.js","sourceRoot":"","sources":["../../src/hooks/useSPFxOneDriveAppData.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { PageContext } from '@microsoft/sp-page-context';
1
+ import { PageContext } from '@microsoft/sp-page-context';
2
2
  /**
3
3
  * Hook to access SharePoint page context
4
4
  *
@@ -13,8 +13,8 @@ import type { PageContext } from '@microsoft/sp-page-context';
13
13
  * @returns SharePoint page context object
14
14
  *
15
15
  * @remarks
16
- * This hook extracts and returns the `pageContext` property from the SPFx context.
17
- * If you need access to the full SPFx context object, use `useSPFxContext` instead.
16
+ * This hook consumes PageContext from SPFx ServiceScope using dependency injection.
17
+ * The service is consumed lazily (only when this hook is used) and cached for performance.
18
18
  *
19
19
  * @example
20
20
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxPageContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxPageContext.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAehD"}
1
+ {"version":3,"file":"useSPFxPageContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxPageContext.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,CAQhD"}
@@ -1,6 +1,8 @@
1
1
  // useSPFxPageContext.ts
2
2
  // Hook to access SharePoint page context
3
- import { useSPFxContext } from './useSPFxContext';
3
+ import { useMemo } from 'react';
4
+ import { PageContext } from '@microsoft/sp-page-context';
5
+ import { useSPFxServiceScope } from './useSPFxServiceScope';
4
6
  /**
5
7
  * Hook to access SharePoint page context
6
8
  *
@@ -15,8 +17,8 @@ import { useSPFxContext } from './useSPFxContext';
15
17
  * @returns SharePoint page context object
16
18
  *
17
19
  * @remarks
18
- * This hook extracts and returns the `pageContext` property from the SPFx context.
19
- * If you need access to the full SPFx context object, use `useSPFxContext` instead.
20
+ * This hook consumes PageContext from SPFx ServiceScope using dependency injection.
21
+ * The service is consumed lazily (only when this hook is used) and cached for performance.
20
22
  *
21
23
  * @example
22
24
  * ```tsx
@@ -36,14 +38,11 @@ import { useSPFxContext } from './useSPFxContext';
36
38
  * @see {@link useSPFxContext} for accessing the full SPFx context
37
39
  */
38
40
  export function useSPFxPageContext() {
39
- var spfxContext = useSPFxContext().spfxContext;
40
- // Extract pageContext from SPFx context
41
- // All SPFx contexts have pageContext property
42
- var ctx = spfxContext;
43
- if (!ctx.pageContext) {
44
- throw new Error('SPFx context does not contain pageContext. ' +
45
- 'This should never happen with valid SPFx contexts.');
46
- }
47
- return ctx.pageContext;
41
+ var consume = useSPFxServiceScope().consume;
42
+ // Lazy consume PageContext from ServiceScope (cached by useMemo)
43
+ // ServiceScope is guaranteed to be finished by SPFxProvider guard
44
+ return useMemo(function () {
45
+ return consume(PageContext.serviceKey);
46
+ }, [consume]);
48
47
  }
49
48
  //# sourceMappingURL=useSPFxPageContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxPageContext.js","sourceRoot":"","sources":["../../src/hooks/useSPFxPageContext.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,yCAAyC;AAGzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,kBAAkB;IACxB,IAAA,WAAW,GAAK,cAAc,EAAE,YAArB,CAAsB;IAEzC,wCAAwC;IACxC,8CAA8C;IAC9C,IAAM,GAAG,GAAG,WAA4C,CAAC;IAEzD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,6CAA6C;YAC7C,oDAAoD,CACrD,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,WAAW,CAAC;AACzB,CAAC"}
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;IACxB,IAAA,OAAO,GAAK,mBAAmB,EAAE,QAA1B,CAA2B;IAE1C,iEAAiE;IACjE,kEAAkE;IAClE,OAAO,OAAO,CAAC;QACb,OAAO,OAAO,CAAc,WAAW,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAChB,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { SPHttpClient } from '@microsoft/sp-http';
1
+ import { SPHttpClient } from '@microsoft/sp-http';
2
2
  /**
3
3
  * Return type for useSPFxSPHttpClient hook
4
4
  */
@@ -6,8 +6,9 @@ export interface SPFxSPHttpClientInfo {
6
6
  /**
7
7
  * Native SPHttpClient from SPFx.
8
8
  * Provides access to SharePoint REST APIs with built-in authentication.
9
+ * Always available (non-undefined) after Provider initialization.
9
10
  */
10
- readonly client: SPHttpClient | undefined;
11
+ readonly client: SPHttpClient;
11
12
  /**
12
13
  * Invoke SharePoint REST API call with automatic state management.
13
14
  * Tracks loading state and captures errors automatically.
@@ -54,13 +55,18 @@ export interface SPFxSPHttpClientInfo {
54
55
  *
55
56
  * For type safety, import SPFx types:
56
57
  * ```typescript
57
- * import type { SPHttpClient } from '@microsoft/sp-http';
58
+ * import { SPHttpClient } from '@microsoft/sp-http';
58
59
  * ```
59
60
  *
60
61
  * Requirements:
61
- * - SPHttpClient available in SPFx context
62
+ * - SPFx ServiceScope with SPHttpClient service
62
63
  * - Appropriate SharePoint permissions for target APIs
63
64
  *
65
+ * @remarks
66
+ * This hook consumes SPHttpClient from SPFx ServiceScope using dependency injection.
67
+ * The service is consumed lazily (only when this hook is used) and cached for optimal
68
+ * performance. The client is always available (non-undefined) after Provider initialization.
69
+ *
64
70
  * @param initialBaseUrl - Base URL for SharePoint site (optional, defaults to current site)
65
71
  *
66
72
  * @example Using invoke with state management
@@ -94,14 +100,14 @@ export interface SPFxSPHttpClientInfo {
94
100
  *
95
101
  * @example Using client directly for advanced control
96
102
  * ```tsx
97
- * import type { SPHttpClient } from '@microsoft/sp-http';
103
+ * import { SPHttpClient } from '@microsoft/sp-http';
98
104
  *
99
105
  * function ListItems() {
100
106
  * const { client, baseUrl } = useSPFxSPHttpClient();
101
107
  * const [items, setItems] = useState([]);
102
108
  * const [loading, setLoading] = useState(false);
103
109
  *
104
- * if (!client) return <Spinner label="Initializing HTTP client..." />;
110
+ * // client is always available after Provider initialization
105
111
  *
106
112
  * const loadItems = async () => {
107
113
  * setLoading(true);
@@ -1 +1 @@
1
- {"version":3,"file":"useSPFxSPHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxSPHttpClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC;IAE1C;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE3C,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0KG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAiFjF"}
1
+ {"version":3,"file":"useSPFxSPHttpClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxSPHttpClient.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAE9B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7E;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAEhC,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAE3C,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+KG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAqEjF"}