@agility/management-sdk 0.1.36 → 0.1.38

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 (263) hide show
  1. package/README.md +396 -317
  2. package/dist/apiMethods/clientInstance.d.ts +2 -0
  3. package/dist/apiMethods/clientInstance.js +11 -2
  4. package/dist/apiMethods/containerMethods.d.ts +3 -0
  5. package/dist/apiMethods/containerMethods.js +43 -9
  6. package/dist/apiMethods/contentMethods.d.ts +12 -0
  7. package/dist/apiMethods/contentMethods.js +100 -46
  8. package/dist/apiMethods/instanceMethods.d.ts +13 -0
  9. package/dist/apiMethods/instanceMethods.js +48 -0
  10. package/dist/apiMethods/pageMethods.d.ts +12 -0
  11. package/dist/apiMethods/pageMethods.js +88 -34
  12. package/dist/enums/contentViewType.d.ts +6 -0
  13. package/dist/enums/contentViewType.js +10 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.js +3 -0
  16. package/dist/models/fetchApiStatus.d.ts +38 -0
  17. package/dist/models/fetchApiStatus.js +2 -0
  18. package/dist/models/pagedResult.d.ts +4 -0
  19. package/dist/models/pagedResult.js +2 -0
  20. package/docs/asset-methods.md +381 -381
  21. package/docs/auth-component.md +360 -360
  22. package/docs/auth.md +593 -593
  23. package/docs/batch-methods.md +243 -243
  24. package/docs/cicd.md +606 -606
  25. package/docs/container-methods.md +267 -267
  26. package/docs/content-methods.md +491 -422
  27. package/docs/instance-methods.md +185 -105
  28. package/docs/instance-user-methods.md +230 -230
  29. package/docs/model-methods.md +433 -433
  30. package/docs/multi-instance-operations.md +191 -191
  31. package/docs/page-methods.md +737 -670
  32. package/docs/server-user-methods.md +279 -279
  33. package/docs/webhook-methods.md +451 -451
  34. package/license.txt +20 -20
  35. package/package.json +40 -40
  36. package/tsconfig.json +14 -14
  37. package/.cursor/api-coverage.md +0 -217
  38. package/.cursor/api-documentation-manifest.md +0 -275
  39. package/.cursor/api-functions-analysis.md +0 -111
  40. package/.cursor/breakout-manifest.md +0 -278
  41. package/.cursor/docs-final-check.md +0 -269
  42. package/.cursor/github-actions-improvements.md +0 -76
  43. package/.cursor/hardening.md +0 -271
  44. package/.cursor/linting-fix.md +0 -160
  45. package/.cursor/manifest.md +0 -243
  46. package/.cursor/mocks.md +0 -100
  47. package/.cursor/test-coverage.md +0 -841
  48. package/.env +0 -92
  49. package/coverage/base.css +0 -224
  50. package/coverage/block-navigation.js +0 -87
  51. package/coverage/coverage-summary.json +0 -43
  52. package/coverage/favicon.png +0 -0
  53. package/coverage/index.html +0 -161
  54. package/coverage/lcov-report/base.css +0 -224
  55. package/coverage/lcov-report/block-navigation.js +0 -87
  56. package/coverage/lcov-report/favicon.png +0 -0
  57. package/coverage/lcov-report/index.html +0 -161
  58. package/coverage/lcov-report/prettify.css +0 -1
  59. package/coverage/lcov-report/prettify.js +0 -2
  60. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  61. package/coverage/lcov-report/sorter.js +0 -210
  62. package/coverage/lcov-report/src/apiClient.ts.html +0 -199
  63. package/coverage/lcov-report/src/apiMethods/assetMethods.ts.html +0 -682
  64. package/coverage/lcov-report/src/apiMethods/batchMethods.ts.html +0 -736
  65. package/coverage/lcov-report/src/apiMethods/clientInstance.ts.html +0 -403
  66. package/coverage/lcov-report/src/apiMethods/containerMethods.ts.html +0 -460
  67. package/coverage/lcov-report/src/apiMethods/contentMethods.ts.html +0 -1183
  68. package/coverage/lcov-report/src/apiMethods/index.html +0 -266
  69. package/coverage/lcov-report/src/apiMethods/instanceMethods.ts.html +0 -160
  70. package/coverage/lcov-report/src/apiMethods/instanceUserMethods.ts.html +0 -268
  71. package/coverage/lcov-report/src/apiMethods/modelMethods.ts.html +0 -352
  72. package/coverage/lcov-report/src/apiMethods/pageMethods.ts.html +0 -1276
  73. package/coverage/lcov-report/src/apiMethods/serverUserMethods.ts.html +0 -196
  74. package/coverage/lcov-report/src/apiMethods/webhookMethods.ts.html +0 -271
  75. package/coverage/lcov-report/src/enums/batchItemType.ts.html +0 -106
  76. package/coverage/lcov-report/src/enums/batchOperationType.ts.html +0 -142
  77. package/coverage/lcov-report/src/enums/batchState..ts.html +0 -106
  78. package/coverage/lcov-report/src/enums/index.html +0 -161
  79. package/coverage/lcov-report/src/enums/workflowOperationType.ts.html +0 -175
  80. package/coverage/lcov-report/src/index.html +0 -116
  81. package/coverage/lcov-report/src/models/assetContainer.ts.html +0 -106
  82. package/coverage/lcov-report/src/models/assetGalleries.ts.html +0 -103
  83. package/coverage/lcov-report/src/models/assetMediaGrouping.ts.html +0 -136
  84. package/coverage/lcov-report/src/models/assetMediaGroupingMetaData.ts.html +0 -97
  85. package/coverage/lcov-report/src/models/batch.ts.html +0 -178
  86. package/coverage/lcov-report/src/models/batchItem.ts.html +0 -127
  87. package/coverage/lcov-report/src/models/container.ts.html +0 -232
  88. package/coverage/lcov-report/src/models/contentDefinitionTypeID.ts.html +0 -142
  89. package/coverage/lcov-report/src/models/contentItem.ts.html +0 -202
  90. package/coverage/lcov-report/src/models/contentSectionDefaultModule.ts.html +0 -106
  91. package/coverage/lcov-report/src/models/contentSectionDefinition.ts.html +0 -196
  92. package/coverage/lcov-report/src/models/contentViewColumn.ts.html +0 -109
  93. package/coverage/lcov-report/src/models/exception.ts.html +0 -109
  94. package/coverage/lcov-report/src/models/index.html +0 -476
  95. package/coverage/lcov-report/src/models/instanceRole.ts.html +0 -106
  96. package/coverage/lcov-report/src/models/instanceUser.ts.html +0 -130
  97. package/coverage/lcov-report/src/models/locales.ts.html +0 -100
  98. package/coverage/lcov-report/src/models/media.ts.html +0 -178
  99. package/coverage/lcov-report/src/models/model.ts.html +0 -172
  100. package/coverage/lcov-report/src/models/notification.ts.html +0 -124
  101. package/coverage/lcov-report/src/models/options.ts.html +0 -109
  102. package/coverage/lcov-report/src/models/pageItem.ts.html +0 -268
  103. package/coverage/lcov-report/src/models/pageModel.ts.html +0 -130
  104. package/coverage/lcov-report/src/models/sharedModule.ts.html +0 -106
  105. package/coverage/lcov-report/src/models/sitemap.ts.html +0 -148
  106. package/coverage/lcov-report/src/models/websiteUser.ts.html +0 -157
  107. package/coverage/lcov.info +0 -1459
  108. package/coverage/prettify.css +0 -1
  109. package/coverage/prettify.js +0 -2
  110. package/coverage/sort-arrow-sprite.png +0 -0
  111. package/coverage/sorter.js +0 -210
  112. package/coverage/src/apiClient.ts.html +0 -199
  113. package/coverage/src/apiMethods/assetMethods.ts.html +0 -682
  114. package/coverage/src/apiMethods/batchMethods.ts.html +0 -736
  115. package/coverage/src/apiMethods/clientInstance.ts.html +0 -403
  116. package/coverage/src/apiMethods/containerMethods.ts.html +0 -460
  117. package/coverage/src/apiMethods/contentMethods.ts.html +0 -1183
  118. package/coverage/src/apiMethods/index.html +0 -266
  119. package/coverage/src/apiMethods/instanceMethods.ts.html +0 -160
  120. package/coverage/src/apiMethods/instanceUserMethods.ts.html +0 -268
  121. package/coverage/src/apiMethods/modelMethods.ts.html +0 -352
  122. package/coverage/src/apiMethods/pageMethods.ts.html +0 -1276
  123. package/coverage/src/apiMethods/serverUserMethods.ts.html +0 -196
  124. package/coverage/src/apiMethods/webhookMethods.ts.html +0 -271
  125. package/coverage/src/enums/batchItemType.ts.html +0 -106
  126. package/coverage/src/enums/batchOperationType.ts.html +0 -142
  127. package/coverage/src/enums/batchState..ts.html +0 -106
  128. package/coverage/src/enums/index.html +0 -161
  129. package/coverage/src/enums/workflowOperationType.ts.html +0 -175
  130. package/coverage/src/index.html +0 -116
  131. package/coverage/src/models/assetContainer.ts.html +0 -106
  132. package/coverage/src/models/assetGalleries.ts.html +0 -103
  133. package/coverage/src/models/assetMediaGrouping.ts.html +0 -136
  134. package/coverage/src/models/assetMediaGroupingMetaData.ts.html +0 -97
  135. package/coverage/src/models/batch.ts.html +0 -178
  136. package/coverage/src/models/batchItem.ts.html +0 -127
  137. package/coverage/src/models/container.ts.html +0 -232
  138. package/coverage/src/models/contentDefinitionTypeID.ts.html +0 -142
  139. package/coverage/src/models/contentItem.ts.html +0 -202
  140. package/coverage/src/models/contentSectionDefaultModule.ts.html +0 -106
  141. package/coverage/src/models/contentSectionDefinition.ts.html +0 -196
  142. package/coverage/src/models/contentViewColumn.ts.html +0 -109
  143. package/coverage/src/models/exception.ts.html +0 -109
  144. package/coverage/src/models/index.html +0 -476
  145. package/coverage/src/models/instanceRole.ts.html +0 -106
  146. package/coverage/src/models/instanceUser.ts.html +0 -130
  147. package/coverage/src/models/locales.ts.html +0 -100
  148. package/coverage/src/models/media.ts.html +0 -178
  149. package/coverage/src/models/model.ts.html +0 -172
  150. package/coverage/src/models/notification.ts.html +0 -124
  151. package/coverage/src/models/options.ts.html +0 -109
  152. package/coverage/src/models/pageItem.ts.html +0 -268
  153. package/coverage/src/models/pageModel.ts.html +0 -130
  154. package/coverage/src/models/sharedModule.ts.html +0 -106
  155. package/coverage/src/models/sitemap.ts.html +0 -148
  156. package/coverage/src/models/websiteUser.ts.html +0 -157
  157. package/dist/.tsbuildinfo +0 -1
  158. package/dist/apiClient.d.ts.map +0 -1
  159. package/dist/apiClient.js.map +0 -1
  160. package/dist/apiMethods/assetMethods.d.ts.map +0 -1
  161. package/dist/apiMethods/assetMethods.js.map +0 -1
  162. package/dist/apiMethods/batchMethods.d.ts.map +0 -1
  163. package/dist/apiMethods/batchMethods.js.map +0 -1
  164. package/dist/apiMethods/clientInstance.d.ts.map +0 -1
  165. package/dist/apiMethods/clientInstance.js.map +0 -1
  166. package/dist/apiMethods/containerMethods.d.ts.map +0 -1
  167. package/dist/apiMethods/containerMethods.js.map +0 -1
  168. package/dist/apiMethods/contentMethods.d.ts.map +0 -1
  169. package/dist/apiMethods/contentMethods.js.map +0 -1
  170. package/dist/apiMethods/instanceMethods.d.ts.map +0 -1
  171. package/dist/apiMethods/instanceMethods.js.map +0 -1
  172. package/dist/apiMethods/instanceUserMethods.d.ts.map +0 -1
  173. package/dist/apiMethods/instanceUserMethods.js.map +0 -1
  174. package/dist/apiMethods/modelMethods.d.ts.map +0 -1
  175. package/dist/apiMethods/modelMethods.js.map +0 -1
  176. package/dist/apiMethods/pageMethods.d.ts.map +0 -1
  177. package/dist/apiMethods/pageMethods.js.map +0 -1
  178. package/dist/apiMethods/serverUserMethods.d.ts.map +0 -1
  179. package/dist/apiMethods/serverUserMethods.js.map +0 -1
  180. package/dist/apiMethods/webhookMethods.d.ts.map +0 -1
  181. package/dist/apiMethods/webhookMethods.js.map +0 -1
  182. package/dist/enums/assetGroupingType.d.ts.map +0 -1
  183. package/dist/enums/assetGroupingType.js.map +0 -1
  184. package/dist/enums/batchItemType.d.ts.map +0 -1
  185. package/dist/enums/batchItemType.js.map +0 -1
  186. package/dist/enums/batchOperationType.d.ts.map +0 -1
  187. package/dist/enums/batchOperationType.js.map +0 -1
  188. package/dist/enums/batchState..d.ts.map +0 -1
  189. package/dist/enums/batchState..js.map +0 -1
  190. package/dist/enums/pageItemTemplateType.d.ts.map +0 -1
  191. package/dist/enums/pageItemTemplateType.js.map +0 -1
  192. package/dist/enums/workflowOperationType.d.ts.map +0 -1
  193. package/dist/enums/workflowOperationType.js.map +0 -1
  194. package/dist/index.d.ts.map +0 -1
  195. package/dist/index.js.map +0 -1
  196. package/dist/models/assetContainer.d.ts.map +0 -1
  197. package/dist/models/assetContainer.js.map +0 -1
  198. package/dist/models/assetGalleries.d.ts.map +0 -1
  199. package/dist/models/assetGalleries.js.map +0 -1
  200. package/dist/models/assetMediaGrouping.d.ts.map +0 -1
  201. package/dist/models/assetMediaGrouping.js.map +0 -1
  202. package/dist/models/assetMediaGroupingMetaData.d.ts.map +0 -1
  203. package/dist/models/assetMediaGroupingMetaData.js.map +0 -1
  204. package/dist/models/batch.d.ts.map +0 -1
  205. package/dist/models/batch.js.map +0 -1
  206. package/dist/models/batchItem.d.ts.map +0 -1
  207. package/dist/models/batchItem.js.map +0 -1
  208. package/dist/models/batchTypes.d.ts.map +0 -1
  209. package/dist/models/batchTypes.js.map +0 -1
  210. package/dist/models/container.d.ts.map +0 -1
  211. package/dist/models/container.js.map +0 -1
  212. package/dist/models/contentDefinitionTypeID.d.ts.map +0 -1
  213. package/dist/models/contentDefinitionTypeID.js.map +0 -1
  214. package/dist/models/contentItem.d.ts.map +0 -1
  215. package/dist/models/contentItem.js.map +0 -1
  216. package/dist/models/contentItemHistory.d.ts.map +0 -1
  217. package/dist/models/contentItemHistory.js.map +0 -1
  218. package/dist/models/contentListFilterModel.d.ts.map +0 -1
  219. package/dist/models/contentListFilterModel.js.map +0 -1
  220. package/dist/models/contentSectionDefaultModule.d.ts.map +0 -1
  221. package/dist/models/contentSectionDefaultModule.js.map +0 -1
  222. package/dist/models/contentSectionDefinition.d.ts.map +0 -1
  223. package/dist/models/contentSectionDefinition.js.map +0 -1
  224. package/dist/models/contentViewColumn.d.ts.map +0 -1
  225. package/dist/models/contentViewColumn.js.map +0 -1
  226. package/dist/models/exception.d.ts.map +0 -1
  227. package/dist/models/exception.js.map +0 -1
  228. package/dist/models/instanceRole.d.ts.map +0 -1
  229. package/dist/models/instanceRole.js.map +0 -1
  230. package/dist/models/instanceUser.d.ts.map +0 -1
  231. package/dist/models/instanceUser.js.map +0 -1
  232. package/dist/models/itemComments.d.ts.map +0 -1
  233. package/dist/models/itemComments.js.map +0 -1
  234. package/dist/models/listParams.d.ts.map +0 -1
  235. package/dist/models/listParams.js.map +0 -1
  236. package/dist/models/locales.d.ts.map +0 -1
  237. package/dist/models/locales.js.map +0 -1
  238. package/dist/models/media.d.ts.map +0 -1
  239. package/dist/models/media.js.map +0 -1
  240. package/dist/models/model.d.ts.map +0 -1
  241. package/dist/models/model.js.map +0 -1
  242. package/dist/models/notification.d.ts.map +0 -1
  243. package/dist/models/notification.js.map +0 -1
  244. package/dist/models/options.d.ts.map +0 -1
  245. package/dist/models/options.js.map +0 -1
  246. package/dist/models/pageHistory.d.ts.map +0 -1
  247. package/dist/models/pageHistory.js.map +0 -1
  248. package/dist/models/pageItem.d.ts.map +0 -1
  249. package/dist/models/pageItem.js.map +0 -1
  250. package/dist/models/pageModel.d.ts.map +0 -1
  251. package/dist/models/pageModel.js.map +0 -1
  252. package/dist/models/serverUser.d.ts.map +0 -1
  253. package/dist/models/serverUser.js.map +0 -1
  254. package/dist/models/sharedModule.d.ts.map +0 -1
  255. package/dist/models/sharedModule.js.map +0 -1
  256. package/dist/models/sitemap.d.ts.map +0 -1
  257. package/dist/models/sitemap.js.map +0 -1
  258. package/dist/models/webhook.d.ts.map +0 -1
  259. package/dist/models/webhook.js.map +0 -1
  260. package/dist/models/websiteListing.d.ts.map +0 -1
  261. package/dist/models/websiteListing.js.map +0 -1
  262. package/dist/models/websiteUser.d.ts.map +0 -1
  263. package/dist/models/websiteUser.js.map +0 -1
@@ -1,361 +1,361 @@
1
- # Agility CMS Authentication Component
2
-
3
- ## Overview
4
-
5
- The Agility CMS Authentication Component provides a complete, reusable authentication system for React applications. It handles OAuth authentication, token management, and provides a rich set of hooks and components for building authentication UIs.
6
-
7
- ## Features
8
-
9
- - **OAuth Authentication**: Secure popup-based authentication flow
10
- - **Token Management**: Automatic token refresh and secure storage
11
- - **Type Safety**: Full TypeScript support with comprehensive interfaces
12
- - **Multiple Display Modes**: Fullscreen, footer bar, and button-only modes
13
- - **Extensive Customization**: Callbacks, styling, and slot-based customization
14
- - **Performance Optimized**: Uses React hooks and context for efficient state management
15
-
16
- ## Installation
17
-
18
- ```bash
19
- npm install @agility/management-sdk-typescript
20
- ```
21
-
22
- ## Basic Usage
23
-
24
- ### 1. Using the Authentication Hook
25
-
26
- The simplest way to add authentication to your app:
27
-
28
- ```typescript
29
- import { useAgilityAuth } from '@agility/management-sdk-typescript';
30
-
31
- function MyApp() {
32
- const {
33
- isAuthenticated,
34
- isLoading,
35
- user,
36
- websiteAccess,
37
- selectedWebsite,
38
- selectedLocale,
39
- locales,
40
- error,
41
- authenticate,
42
- signOut,
43
- selectWebsite,
44
- selectLocale,
45
- clearError,
46
- hasSelection,
47
- currentSelection
48
- } = useAgilityAuth({
49
- redirectUri: 'https://myapp.com/auth-callback.html',
50
- scope: 'openid profile email offline_access',
51
- autoCheckAuth: true // Automatically check auth on mount
52
- });
53
-
54
- if (isLoading) return <div>Loading...</div>;
55
- if (error) return <div>Error: {error}</div>;
56
-
57
- if (!isAuthenticated) {
58
- return (
59
- <button onClick={authenticate}>
60
- Sign in with Agility CMS
61
- </button>
62
- );
63
- }
64
-
65
- return (
66
- <div>
67
- <h1>Welcome, {user?.userName}!</h1>
68
-
69
- <select
70
- value={selectedWebsite}
71
- onChange={(e) => selectWebsite(e.target.value)}
72
- >
73
- <option value="">Choose a website...</option>
74
- {websiteAccess.map(site => (
75
- <option key={site.websiteGuid} value={site.websiteGuid}>
76
- {site.websiteName}
77
- </option>
78
- ))}
79
- </select>
80
-
81
- {selectedWebsite && (
82
- <select
83
- value={selectedLocale}
84
- onChange={(e) => selectLocale(e.target.value)}
85
- >
86
- <option value="">Choose a locale...</option>
87
- {locales.map(locale => (
88
- <option key={locale.localeCode} value={locale.localeCode}>
89
- {locale.localeName}
90
- </option>
91
- ))}
92
- </select>
93
- )}
94
-
95
- {hasSelection && (
96
- <div>
97
- <p>Current Selection: {currentSelection?.websiteName} - {currentSelection?.localeName}</p>
98
- </div>
99
- )}
100
-
101
- <button onClick={signOut}>Sign Out</button>
102
- </div>
103
- );
104
- }
105
- ```
106
-
107
- ### 2. Using the Context Provider
108
-
109
- For larger applications, use the context provider to share authentication state:
110
-
111
- ```typescript
112
- import { AuthProvider, useAuthContext } from '@agility/management-sdk-typescript';
113
-
114
- // App component
115
- function App() {
116
- return (
117
- <AuthProvider>
118
- <MyAuthenticatedApp />
119
- </AuthProvider>
120
- );
121
- }
122
-
123
- // Child component that uses auth context
124
- function MyAuthenticatedApp() {
125
- const { state, actions } = useAuthContext();
126
-
127
- return (
128
- <div>
129
- {state.isAuthenticated ? (
130
- <Dashboard user={state.user} />
131
- ) : (
132
- <LoginForm onLogin={actions.setAuthenticated} />
133
- )}
134
- </div>
135
- );
136
- }
137
- ```
138
-
139
- ### 3. Using Granular Context Hooks
140
-
141
- For more specific use cases, use the granular hooks:
142
-
143
- ```typescript
144
- import {
145
- useIsAuthenticated,
146
- useCurrentUser,
147
- useSelection,
148
- useLoadingStates,
149
- useAuthError
150
- } from '@agility/management-sdk-typescript';
151
-
152
- function UserProfile() {
153
- const isAuthenticated = useIsAuthenticated();
154
- const user = useCurrentUser();
155
- const { isLoading } = useLoadingStates();
156
-
157
- if (!isAuthenticated) return <div>Please log in</div>;
158
- if (isLoading) return <div>Loading...</div>;
159
-
160
- return (
161
- <div>
162
- <h2>{user?.userName}</h2>
163
- <p>{user?.emailAddress}</p>
164
- </div>
165
- );
166
- }
167
-
168
- function WebsiteSelector() {
169
- const { selectedWebsite, selectedLocale, hasSelection } = useSelection();
170
- const { error, clearError } = useAuthError();
171
-
172
- return (
173
- <div>
174
- {error && (
175
- <div className="error">
176
- {error}
177
- <button onClick={clearError}>Clear</button>
178
- </div>
179
- )}
180
-
181
- {hasSelection && (
182
- <div>Selected: {selectedWebsite} - {selectedLocale}</div>
183
- )}
184
- </div>
185
- );
186
- }
187
- ```
188
-
189
- ## Advanced Usage
190
-
191
- ### Custom OAuth Configuration
192
-
193
- ```typescript
194
- const auth = useAgilityAuth({
195
- redirectUri: 'https://myapp.com/auth-callback.html',
196
- scope: 'openid profile email offline_access',
197
- region: 'us-west-2',
198
- autoCheckAuth: true
199
- });
200
- ```
201
-
202
- ### Website Selection with Validation
203
-
204
- ```typescript
205
- import {
206
- useWebsiteSelection,
207
- validateSelection,
208
- sortWebsitesByName
209
- } from '@agility/management-sdk-typescript';
210
-
211
- function WebsiteManager() {
212
- const auth = useAgilityAuth();
213
-
214
- const selection = useWebsiteSelection(
215
- auth.websiteAccess,
216
- auth.selectedWebsite,
217
- auth.locales,
218
- auth.selectedLocale,
219
- auth.isLoadingLocales,
220
- auth.selectWebsite,
221
- auth.selectLocale
222
- );
223
-
224
- const sortedWebsites = sortWebsitesByName(selection.websites);
225
- const validation = validateSelection(
226
- selection.websites,
227
- selection.selectedWebsite,
228
- selection.locales,
229
- selection.selectedLocale
230
- );
231
-
232
- return (
233
- <div>
234
- <select onChange={(e) => selection.selectWebsite(e.target.value)}>
235
- {sortedWebsites.map(site => (
236
- <option key={site.websiteGuid} value={site.websiteGuid}>
237
- {site.websiteName}
238
- </option>
239
- ))}
240
- </select>
241
-
242
- {!validation.isValid && (
243
- <div className="validation-errors">
244
- {validation.errors.map(error => (
245
- <div key={error} className="error">{error}</div>
246
- ))}
247
- </div>
248
- )}
249
- </div>
250
- );
251
- }
252
- ```
253
-
254
- ## Type Definitions
255
-
256
- ### Core Types
257
-
258
- ```typescript
259
- interface AgilityAuthConfig {
260
- // Callbacks
261
- onSignIn?: (user: ServerUser) => void;
262
- onSignOut?: () => void;
263
- onWebsiteSelect?: (website: WebsiteAccess) => void;
264
- onLocaleSelect?: (locale: LocaleInfo) => void;
265
-
266
- // Display & Behavior
267
- mode?: 'fullscreen' | 'footer' | 'button-only';
268
- theme?: 'light' | 'dark' | 'auto';
269
- showCurrentSelection?: boolean;
270
-
271
- // OAuth Settings
272
- redirectUri?: string;
273
- scope?: string;
274
- region?: string;
275
- }
276
-
277
- interface WebsiteAccess {
278
- websiteGuid: string;
279
- websiteName: string;
280
- websiteDescription?: string;
281
- }
282
-
283
- interface LocaleInfo {
284
- localeCode: string;
285
- localeID: number;
286
- localeName: string;
287
- isDefault?: boolean;
288
- isEnabled?: boolean;
289
- }
290
- ```
291
-
292
- ## Coming Soon
293
-
294
- The following UI components are currently in development:
295
-
296
- - **AgilityAuth Component**: Full-featured authentication component
297
- - **AuthButton**: Standalone authentication button
298
- - **WebsiteSelector**: Website selection dropdown
299
- - **LocaleSelector**: Locale selection dropdown
300
- - **UserInfo**: User information display
301
- - **Footer Mode**: Collapsible footer bar implementation
302
-
303
- ## Migration from Direct SDK Usage
304
-
305
- If you're currently using the SDK directly, you can gradually migrate:
306
-
307
- ```typescript
308
- // Before: Direct SDK usage
309
- const client = new ApiClient();
310
- await client.auth();
311
- const user = await client.serverUserMethods.me();
312
-
313
- // After: Using the hook
314
- const { authenticate, user, isAuthenticated } = useAgilityAuth();
315
- if (!isAuthenticated) {
316
- await authenticate();
317
- }
318
- // user is now available directly from the hook
319
- ```
320
-
321
- ## Performance Considerations
322
-
323
- - State is managed using React's `useReducer` for optimal performance
324
- - Context values are memoized to prevent unnecessary re-renders
325
- - All callback functions are memoized with `useCallback`
326
- - Automatic cleanup of event listeners and timeouts
327
-
328
- ## Browser Support
329
-
330
- - Modern browsers with ES2017+ support
331
- - React 16.8+ (hooks support)
332
- - TypeScript 4.0+ (optional but recommended)
333
-
334
- ## Error Handling
335
-
336
- The authentication system provides comprehensive error handling:
337
-
338
- ```typescript
339
- const { error, clearError } = useAuthError();
340
-
341
- // Display errors to user
342
- if (error) {
343
- return (
344
- <div className="error">
345
- {error}
346
- <button onClick={clearError}>Dismiss</button>
347
- </div>
348
- );
349
- }
350
- ```
351
-
352
- ## Security
353
-
354
- - Tokens are stored securely using `keytar` (Node.js) or `localStorage` (browser)
355
- - Automatic token refresh prevents expired token issues
356
- - OAuth flow uses secure popup window with proper origin validation
357
- - All sensitive operations are handled server-side
358
-
359
- ## Support
360
-
1
+ # Agility CMS Authentication Component
2
+
3
+ ## Overview
4
+
5
+ The Agility CMS Authentication Component provides a complete, reusable authentication system for React applications. It handles OAuth authentication, token management, and provides a rich set of hooks and components for building authentication UIs.
6
+
7
+ ## Features
8
+
9
+ - **OAuth Authentication**: Secure popup-based authentication flow
10
+ - **Token Management**: Automatic token refresh and secure storage
11
+ - **Type Safety**: Full TypeScript support with comprehensive interfaces
12
+ - **Multiple Display Modes**: Fullscreen, footer bar, and button-only modes
13
+ - **Extensive Customization**: Callbacks, styling, and slot-based customization
14
+ - **Performance Optimized**: Uses React hooks and context for efficient state management
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install @agility/management-sdk-typescript
20
+ ```
21
+
22
+ ## Basic Usage
23
+
24
+ ### 1. Using the Authentication Hook
25
+
26
+ The simplest way to add authentication to your app:
27
+
28
+ ```typescript
29
+ import { useAgilityAuth } from '@agility/management-sdk-typescript';
30
+
31
+ function MyApp() {
32
+ const {
33
+ isAuthenticated,
34
+ isLoading,
35
+ user,
36
+ websiteAccess,
37
+ selectedWebsite,
38
+ selectedLocale,
39
+ locales,
40
+ error,
41
+ authenticate,
42
+ signOut,
43
+ selectWebsite,
44
+ selectLocale,
45
+ clearError,
46
+ hasSelection,
47
+ currentSelection
48
+ } = useAgilityAuth({
49
+ redirectUri: 'https://myapp.com/auth-callback.html',
50
+ scope: 'openid profile email offline_access',
51
+ autoCheckAuth: true // Automatically check auth on mount
52
+ });
53
+
54
+ if (isLoading) return <div>Loading...</div>;
55
+ if (error) return <div>Error: {error}</div>;
56
+
57
+ if (!isAuthenticated) {
58
+ return (
59
+ <button onClick={authenticate}>
60
+ Sign in with Agility CMS
61
+ </button>
62
+ );
63
+ }
64
+
65
+ return (
66
+ <div>
67
+ <h1>Welcome, {user?.userName}!</h1>
68
+
69
+ <select
70
+ value={selectedWebsite}
71
+ onChange={(e) => selectWebsite(e.target.value)}
72
+ >
73
+ <option value="">Choose a website...</option>
74
+ {websiteAccess.map(site => (
75
+ <option key={site.websiteGuid} value={site.websiteGuid}>
76
+ {site.websiteName}
77
+ </option>
78
+ ))}
79
+ </select>
80
+
81
+ {selectedWebsite && (
82
+ <select
83
+ value={selectedLocale}
84
+ onChange={(e) => selectLocale(e.target.value)}
85
+ >
86
+ <option value="">Choose a locale...</option>
87
+ {locales.map(locale => (
88
+ <option key={locale.localeCode} value={locale.localeCode}>
89
+ {locale.localeName}
90
+ </option>
91
+ ))}
92
+ </select>
93
+ )}
94
+
95
+ {hasSelection && (
96
+ <div>
97
+ <p>Current Selection: {currentSelection?.websiteName} - {currentSelection?.localeName}</p>
98
+ </div>
99
+ )}
100
+
101
+ <button onClick={signOut}>Sign Out</button>
102
+ </div>
103
+ );
104
+ }
105
+ ```
106
+
107
+ ### 2. Using the Context Provider
108
+
109
+ For larger applications, use the context provider to share authentication state:
110
+
111
+ ```typescript
112
+ import { AuthProvider, useAuthContext } from '@agility/management-sdk-typescript';
113
+
114
+ // App component
115
+ function App() {
116
+ return (
117
+ <AuthProvider>
118
+ <MyAuthenticatedApp />
119
+ </AuthProvider>
120
+ );
121
+ }
122
+
123
+ // Child component that uses auth context
124
+ function MyAuthenticatedApp() {
125
+ const { state, actions } = useAuthContext();
126
+
127
+ return (
128
+ <div>
129
+ {state.isAuthenticated ? (
130
+ <Dashboard user={state.user} />
131
+ ) : (
132
+ <LoginForm onLogin={actions.setAuthenticated} />
133
+ )}
134
+ </div>
135
+ );
136
+ }
137
+ ```
138
+
139
+ ### 3. Using Granular Context Hooks
140
+
141
+ For more specific use cases, use the granular hooks:
142
+
143
+ ```typescript
144
+ import {
145
+ useIsAuthenticated,
146
+ useCurrentUser,
147
+ useSelection,
148
+ useLoadingStates,
149
+ useAuthError
150
+ } from '@agility/management-sdk-typescript';
151
+
152
+ function UserProfile() {
153
+ const isAuthenticated = useIsAuthenticated();
154
+ const user = useCurrentUser();
155
+ const { isLoading } = useLoadingStates();
156
+
157
+ if (!isAuthenticated) return <div>Please log in</div>;
158
+ if (isLoading) return <div>Loading...</div>;
159
+
160
+ return (
161
+ <div>
162
+ <h2>{user?.userName}</h2>
163
+ <p>{user?.emailAddress}</p>
164
+ </div>
165
+ );
166
+ }
167
+
168
+ function WebsiteSelector() {
169
+ const { selectedWebsite, selectedLocale, hasSelection } = useSelection();
170
+ const { error, clearError } = useAuthError();
171
+
172
+ return (
173
+ <div>
174
+ {error && (
175
+ <div className="error">
176
+ {error}
177
+ <button onClick={clearError}>Clear</button>
178
+ </div>
179
+ )}
180
+
181
+ {hasSelection && (
182
+ <div>Selected: {selectedWebsite} - {selectedLocale}</div>
183
+ )}
184
+ </div>
185
+ );
186
+ }
187
+ ```
188
+
189
+ ## Advanced Usage
190
+
191
+ ### Custom OAuth Configuration
192
+
193
+ ```typescript
194
+ const auth = useAgilityAuth({
195
+ redirectUri: 'https://myapp.com/auth-callback.html',
196
+ scope: 'openid profile email offline_access',
197
+ region: 'us-west-2',
198
+ autoCheckAuth: true
199
+ });
200
+ ```
201
+
202
+ ### Website Selection with Validation
203
+
204
+ ```typescript
205
+ import {
206
+ useWebsiteSelection,
207
+ validateSelection,
208
+ sortWebsitesByName
209
+ } from '@agility/management-sdk-typescript';
210
+
211
+ function WebsiteManager() {
212
+ const auth = useAgilityAuth();
213
+
214
+ const selection = useWebsiteSelection(
215
+ auth.websiteAccess,
216
+ auth.selectedWebsite,
217
+ auth.locales,
218
+ auth.selectedLocale,
219
+ auth.isLoadingLocales,
220
+ auth.selectWebsite,
221
+ auth.selectLocale
222
+ );
223
+
224
+ const sortedWebsites = sortWebsitesByName(selection.websites);
225
+ const validation = validateSelection(
226
+ selection.websites,
227
+ selection.selectedWebsite,
228
+ selection.locales,
229
+ selection.selectedLocale
230
+ );
231
+
232
+ return (
233
+ <div>
234
+ <select onChange={(e) => selection.selectWebsite(e.target.value)}>
235
+ {sortedWebsites.map(site => (
236
+ <option key={site.websiteGuid} value={site.websiteGuid}>
237
+ {site.websiteName}
238
+ </option>
239
+ ))}
240
+ </select>
241
+
242
+ {!validation.isValid && (
243
+ <div className="validation-errors">
244
+ {validation.errors.map(error => (
245
+ <div key={error} className="error">{error}</div>
246
+ ))}
247
+ </div>
248
+ )}
249
+ </div>
250
+ );
251
+ }
252
+ ```
253
+
254
+ ## Type Definitions
255
+
256
+ ### Core Types
257
+
258
+ ```typescript
259
+ interface AgilityAuthConfig {
260
+ // Callbacks
261
+ onSignIn?: (user: ServerUser) => void;
262
+ onSignOut?: () => void;
263
+ onWebsiteSelect?: (website: WebsiteAccess) => void;
264
+ onLocaleSelect?: (locale: LocaleInfo) => void;
265
+
266
+ // Display & Behavior
267
+ mode?: 'fullscreen' | 'footer' | 'button-only';
268
+ theme?: 'light' | 'dark' | 'auto';
269
+ showCurrentSelection?: boolean;
270
+
271
+ // OAuth Settings
272
+ redirectUri?: string;
273
+ scope?: string;
274
+ region?: string;
275
+ }
276
+
277
+ interface WebsiteAccess {
278
+ websiteGuid: string;
279
+ websiteName: string;
280
+ websiteDescription?: string;
281
+ }
282
+
283
+ interface LocaleInfo {
284
+ localeCode: string;
285
+ localeID: number;
286
+ localeName: string;
287
+ isDefault?: boolean;
288
+ isEnabled?: boolean;
289
+ }
290
+ ```
291
+
292
+ ## Coming Soon
293
+
294
+ The following UI components are currently in development:
295
+
296
+ - **AgilityAuth Component**: Full-featured authentication component
297
+ - **AuthButton**: Standalone authentication button
298
+ - **WebsiteSelector**: Website selection dropdown
299
+ - **LocaleSelector**: Locale selection dropdown
300
+ - **UserInfo**: User information display
301
+ - **Footer Mode**: Collapsible footer bar implementation
302
+
303
+ ## Migration from Direct SDK Usage
304
+
305
+ If you're currently using the SDK directly, you can gradually migrate:
306
+
307
+ ```typescript
308
+ // Before: Direct SDK usage
309
+ const client = new ApiClient();
310
+ await client.auth();
311
+ const user = await client.serverUserMethods.me();
312
+
313
+ // After: Using the hook
314
+ const { authenticate, user, isAuthenticated } = useAgilityAuth();
315
+ if (!isAuthenticated) {
316
+ await authenticate();
317
+ }
318
+ // user is now available directly from the hook
319
+ ```
320
+
321
+ ## Performance Considerations
322
+
323
+ - State is managed using React's `useReducer` for optimal performance
324
+ - Context values are memoized to prevent unnecessary re-renders
325
+ - All callback functions are memoized with `useCallback`
326
+ - Automatic cleanup of event listeners and timeouts
327
+
328
+ ## Browser Support
329
+
330
+ - Modern browsers with ES2017+ support
331
+ - React 16.8+ (hooks support)
332
+ - TypeScript 4.0+ (optional but recommended)
333
+
334
+ ## Error Handling
335
+
336
+ The authentication system provides comprehensive error handling:
337
+
338
+ ```typescript
339
+ const { error, clearError } = useAuthError();
340
+
341
+ // Display errors to user
342
+ if (error) {
343
+ return (
344
+ <div className="error">
345
+ {error}
346
+ <button onClick={clearError}>Dismiss</button>
347
+ </div>
348
+ );
349
+ }
350
+ ```
351
+
352
+ ## Security
353
+
354
+ - Tokens are stored securely using `keytar` (Node.js) or `localStorage` (browser)
355
+ - Automatic token refresh prevents expired token issues
356
+ - OAuth flow uses secure popup window with proper origin validation
357
+ - All sensitive operations are handled server-side
358
+
359
+ ## Support
360
+
361
361
  For issues and feature requests, please visit the [GitHub repository](https://github.com/agility/agility-cms-management-sdk-typescript).