@agility/management-sdk 0.1.35 → 0.1.37

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 (261) hide show
  1. package/README.md +371 -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 +119 -48
  8. package/dist/apiMethods/pageMethods.d.ts +12 -0
  9. package/dist/apiMethods/pageMethods.js +88 -34
  10. package/dist/enums/contentViewType.d.ts +6 -0
  11. package/dist/enums/contentViewType.js +10 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +2 -0
  14. package/dist/models/pagedResult.d.ts +4 -0
  15. package/dist/models/pagedResult.js +2 -0
  16. package/dist/util/queryString.d.ts +8 -0
  17. package/dist/util/queryString.js +27 -0
  18. package/docs/asset-methods.md +381 -381
  19. package/docs/auth-component.md +360 -360
  20. package/docs/auth.md +593 -593
  21. package/docs/batch-methods.md +243 -243
  22. package/docs/cicd.md +606 -606
  23. package/docs/container-methods.md +267 -267
  24. package/docs/content-methods.md +491 -422
  25. package/docs/instance-methods.md +104 -104
  26. package/docs/instance-user-methods.md +230 -230
  27. package/docs/model-methods.md +433 -433
  28. package/docs/multi-instance-operations.md +191 -191
  29. package/docs/page-methods.md +737 -670
  30. package/docs/server-user-methods.md +279 -279
  31. package/docs/webhook-methods.md +451 -451
  32. package/license.txt +20 -20
  33. package/package.json +40 -40
  34. package/tsconfig.json +14 -14
  35. package/.cursor/api-coverage.md +0 -217
  36. package/.cursor/api-documentation-manifest.md +0 -275
  37. package/.cursor/api-functions-analysis.md +0 -111
  38. package/.cursor/breakout-manifest.md +0 -278
  39. package/.cursor/docs-final-check.md +0 -269
  40. package/.cursor/github-actions-improvements.md +0 -76
  41. package/.cursor/hardening.md +0 -271
  42. package/.cursor/linting-fix.md +0 -160
  43. package/.cursor/manifest.md +0 -243
  44. package/.cursor/mocks.md +0 -100
  45. package/.cursor/test-coverage.md +0 -841
  46. package/.env +0 -92
  47. package/coverage/base.css +0 -224
  48. package/coverage/block-navigation.js +0 -87
  49. package/coverage/coverage-summary.json +0 -43
  50. package/coverage/favicon.png +0 -0
  51. package/coverage/index.html +0 -161
  52. package/coverage/lcov-report/base.css +0 -224
  53. package/coverage/lcov-report/block-navigation.js +0 -87
  54. package/coverage/lcov-report/favicon.png +0 -0
  55. package/coverage/lcov-report/index.html +0 -161
  56. package/coverage/lcov-report/prettify.css +0 -1
  57. package/coverage/lcov-report/prettify.js +0 -2
  58. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  59. package/coverage/lcov-report/sorter.js +0 -210
  60. package/coverage/lcov-report/src/apiClient.ts.html +0 -199
  61. package/coverage/lcov-report/src/apiMethods/assetMethods.ts.html +0 -682
  62. package/coverage/lcov-report/src/apiMethods/batchMethods.ts.html +0 -736
  63. package/coverage/lcov-report/src/apiMethods/clientInstance.ts.html +0 -403
  64. package/coverage/lcov-report/src/apiMethods/containerMethods.ts.html +0 -460
  65. package/coverage/lcov-report/src/apiMethods/contentMethods.ts.html +0 -1183
  66. package/coverage/lcov-report/src/apiMethods/index.html +0 -266
  67. package/coverage/lcov-report/src/apiMethods/instanceMethods.ts.html +0 -160
  68. package/coverage/lcov-report/src/apiMethods/instanceUserMethods.ts.html +0 -268
  69. package/coverage/lcov-report/src/apiMethods/modelMethods.ts.html +0 -352
  70. package/coverage/lcov-report/src/apiMethods/pageMethods.ts.html +0 -1276
  71. package/coverage/lcov-report/src/apiMethods/serverUserMethods.ts.html +0 -196
  72. package/coverage/lcov-report/src/apiMethods/webhookMethods.ts.html +0 -271
  73. package/coverage/lcov-report/src/enums/batchItemType.ts.html +0 -106
  74. package/coverage/lcov-report/src/enums/batchOperationType.ts.html +0 -142
  75. package/coverage/lcov-report/src/enums/batchState..ts.html +0 -106
  76. package/coverage/lcov-report/src/enums/index.html +0 -161
  77. package/coverage/lcov-report/src/enums/workflowOperationType.ts.html +0 -175
  78. package/coverage/lcov-report/src/index.html +0 -116
  79. package/coverage/lcov-report/src/models/assetContainer.ts.html +0 -106
  80. package/coverage/lcov-report/src/models/assetGalleries.ts.html +0 -103
  81. package/coverage/lcov-report/src/models/assetMediaGrouping.ts.html +0 -136
  82. package/coverage/lcov-report/src/models/assetMediaGroupingMetaData.ts.html +0 -97
  83. package/coverage/lcov-report/src/models/batch.ts.html +0 -178
  84. package/coverage/lcov-report/src/models/batchItem.ts.html +0 -127
  85. package/coverage/lcov-report/src/models/container.ts.html +0 -232
  86. package/coverage/lcov-report/src/models/contentDefinitionTypeID.ts.html +0 -142
  87. package/coverage/lcov-report/src/models/contentItem.ts.html +0 -202
  88. package/coverage/lcov-report/src/models/contentSectionDefaultModule.ts.html +0 -106
  89. package/coverage/lcov-report/src/models/contentSectionDefinition.ts.html +0 -196
  90. package/coverage/lcov-report/src/models/contentViewColumn.ts.html +0 -109
  91. package/coverage/lcov-report/src/models/exception.ts.html +0 -109
  92. package/coverage/lcov-report/src/models/index.html +0 -476
  93. package/coverage/lcov-report/src/models/instanceRole.ts.html +0 -106
  94. package/coverage/lcov-report/src/models/instanceUser.ts.html +0 -130
  95. package/coverage/lcov-report/src/models/locales.ts.html +0 -100
  96. package/coverage/lcov-report/src/models/media.ts.html +0 -178
  97. package/coverage/lcov-report/src/models/model.ts.html +0 -172
  98. package/coverage/lcov-report/src/models/notification.ts.html +0 -124
  99. package/coverage/lcov-report/src/models/options.ts.html +0 -109
  100. package/coverage/lcov-report/src/models/pageItem.ts.html +0 -268
  101. package/coverage/lcov-report/src/models/pageModel.ts.html +0 -130
  102. package/coverage/lcov-report/src/models/sharedModule.ts.html +0 -106
  103. package/coverage/lcov-report/src/models/sitemap.ts.html +0 -148
  104. package/coverage/lcov-report/src/models/websiteUser.ts.html +0 -157
  105. package/coverage/lcov.info +0 -1459
  106. package/coverage/prettify.css +0 -1
  107. package/coverage/prettify.js +0 -2
  108. package/coverage/sort-arrow-sprite.png +0 -0
  109. package/coverage/sorter.js +0 -210
  110. package/coverage/src/apiClient.ts.html +0 -199
  111. package/coverage/src/apiMethods/assetMethods.ts.html +0 -682
  112. package/coverage/src/apiMethods/batchMethods.ts.html +0 -736
  113. package/coverage/src/apiMethods/clientInstance.ts.html +0 -403
  114. package/coverage/src/apiMethods/containerMethods.ts.html +0 -460
  115. package/coverage/src/apiMethods/contentMethods.ts.html +0 -1183
  116. package/coverage/src/apiMethods/index.html +0 -266
  117. package/coverage/src/apiMethods/instanceMethods.ts.html +0 -160
  118. package/coverage/src/apiMethods/instanceUserMethods.ts.html +0 -268
  119. package/coverage/src/apiMethods/modelMethods.ts.html +0 -352
  120. package/coverage/src/apiMethods/pageMethods.ts.html +0 -1276
  121. package/coverage/src/apiMethods/serverUserMethods.ts.html +0 -196
  122. package/coverage/src/apiMethods/webhookMethods.ts.html +0 -271
  123. package/coverage/src/enums/batchItemType.ts.html +0 -106
  124. package/coverage/src/enums/batchOperationType.ts.html +0 -142
  125. package/coverage/src/enums/batchState..ts.html +0 -106
  126. package/coverage/src/enums/index.html +0 -161
  127. package/coverage/src/enums/workflowOperationType.ts.html +0 -175
  128. package/coverage/src/index.html +0 -116
  129. package/coverage/src/models/assetContainer.ts.html +0 -106
  130. package/coverage/src/models/assetGalleries.ts.html +0 -103
  131. package/coverage/src/models/assetMediaGrouping.ts.html +0 -136
  132. package/coverage/src/models/assetMediaGroupingMetaData.ts.html +0 -97
  133. package/coverage/src/models/batch.ts.html +0 -178
  134. package/coverage/src/models/batchItem.ts.html +0 -127
  135. package/coverage/src/models/container.ts.html +0 -232
  136. package/coverage/src/models/contentDefinitionTypeID.ts.html +0 -142
  137. package/coverage/src/models/contentItem.ts.html +0 -202
  138. package/coverage/src/models/contentSectionDefaultModule.ts.html +0 -106
  139. package/coverage/src/models/contentSectionDefinition.ts.html +0 -196
  140. package/coverage/src/models/contentViewColumn.ts.html +0 -109
  141. package/coverage/src/models/exception.ts.html +0 -109
  142. package/coverage/src/models/index.html +0 -476
  143. package/coverage/src/models/instanceRole.ts.html +0 -106
  144. package/coverage/src/models/instanceUser.ts.html +0 -130
  145. package/coverage/src/models/locales.ts.html +0 -100
  146. package/coverage/src/models/media.ts.html +0 -178
  147. package/coverage/src/models/model.ts.html +0 -172
  148. package/coverage/src/models/notification.ts.html +0 -124
  149. package/coverage/src/models/options.ts.html +0 -109
  150. package/coverage/src/models/pageItem.ts.html +0 -268
  151. package/coverage/src/models/pageModel.ts.html +0 -130
  152. package/coverage/src/models/sharedModule.ts.html +0 -106
  153. package/coverage/src/models/sitemap.ts.html +0 -148
  154. package/coverage/src/models/websiteUser.ts.html +0 -157
  155. package/dist/.tsbuildinfo +0 -1
  156. package/dist/apiClient.d.ts.map +0 -1
  157. package/dist/apiClient.js.map +0 -1
  158. package/dist/apiMethods/assetMethods.d.ts.map +0 -1
  159. package/dist/apiMethods/assetMethods.js.map +0 -1
  160. package/dist/apiMethods/batchMethods.d.ts.map +0 -1
  161. package/dist/apiMethods/batchMethods.js.map +0 -1
  162. package/dist/apiMethods/clientInstance.d.ts.map +0 -1
  163. package/dist/apiMethods/clientInstance.js.map +0 -1
  164. package/dist/apiMethods/containerMethods.d.ts.map +0 -1
  165. package/dist/apiMethods/containerMethods.js.map +0 -1
  166. package/dist/apiMethods/contentMethods.d.ts.map +0 -1
  167. package/dist/apiMethods/contentMethods.js.map +0 -1
  168. package/dist/apiMethods/instanceMethods.d.ts.map +0 -1
  169. package/dist/apiMethods/instanceMethods.js.map +0 -1
  170. package/dist/apiMethods/instanceUserMethods.d.ts.map +0 -1
  171. package/dist/apiMethods/instanceUserMethods.js.map +0 -1
  172. package/dist/apiMethods/modelMethods.d.ts.map +0 -1
  173. package/dist/apiMethods/modelMethods.js.map +0 -1
  174. package/dist/apiMethods/pageMethods.d.ts.map +0 -1
  175. package/dist/apiMethods/pageMethods.js.map +0 -1
  176. package/dist/apiMethods/serverUserMethods.d.ts.map +0 -1
  177. package/dist/apiMethods/serverUserMethods.js.map +0 -1
  178. package/dist/apiMethods/webhookMethods.d.ts.map +0 -1
  179. package/dist/apiMethods/webhookMethods.js.map +0 -1
  180. package/dist/enums/assetGroupingType.d.ts.map +0 -1
  181. package/dist/enums/assetGroupingType.js.map +0 -1
  182. package/dist/enums/batchItemType.d.ts.map +0 -1
  183. package/dist/enums/batchItemType.js.map +0 -1
  184. package/dist/enums/batchOperationType.d.ts.map +0 -1
  185. package/dist/enums/batchOperationType.js.map +0 -1
  186. package/dist/enums/batchState..d.ts.map +0 -1
  187. package/dist/enums/batchState..js.map +0 -1
  188. package/dist/enums/pageItemTemplateType.d.ts.map +0 -1
  189. package/dist/enums/pageItemTemplateType.js.map +0 -1
  190. package/dist/enums/workflowOperationType.d.ts.map +0 -1
  191. package/dist/enums/workflowOperationType.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/models/assetContainer.d.ts.map +0 -1
  195. package/dist/models/assetContainer.js.map +0 -1
  196. package/dist/models/assetGalleries.d.ts.map +0 -1
  197. package/dist/models/assetGalleries.js.map +0 -1
  198. package/dist/models/assetMediaGrouping.d.ts.map +0 -1
  199. package/dist/models/assetMediaGrouping.js.map +0 -1
  200. package/dist/models/assetMediaGroupingMetaData.d.ts.map +0 -1
  201. package/dist/models/assetMediaGroupingMetaData.js.map +0 -1
  202. package/dist/models/batch.d.ts.map +0 -1
  203. package/dist/models/batch.js.map +0 -1
  204. package/dist/models/batchItem.d.ts.map +0 -1
  205. package/dist/models/batchItem.js.map +0 -1
  206. package/dist/models/batchTypes.d.ts.map +0 -1
  207. package/dist/models/batchTypes.js.map +0 -1
  208. package/dist/models/container.d.ts.map +0 -1
  209. package/dist/models/container.js.map +0 -1
  210. package/dist/models/contentDefinitionTypeID.d.ts.map +0 -1
  211. package/dist/models/contentDefinitionTypeID.js.map +0 -1
  212. package/dist/models/contentItem.d.ts.map +0 -1
  213. package/dist/models/contentItem.js.map +0 -1
  214. package/dist/models/contentItemHistory.d.ts.map +0 -1
  215. package/dist/models/contentItemHistory.js.map +0 -1
  216. package/dist/models/contentListFilterModel.d.ts.map +0 -1
  217. package/dist/models/contentListFilterModel.js.map +0 -1
  218. package/dist/models/contentSectionDefaultModule.d.ts.map +0 -1
  219. package/dist/models/contentSectionDefaultModule.js.map +0 -1
  220. package/dist/models/contentSectionDefinition.d.ts.map +0 -1
  221. package/dist/models/contentSectionDefinition.js.map +0 -1
  222. package/dist/models/contentViewColumn.d.ts.map +0 -1
  223. package/dist/models/contentViewColumn.js.map +0 -1
  224. package/dist/models/exception.d.ts.map +0 -1
  225. package/dist/models/exception.js.map +0 -1
  226. package/dist/models/instanceRole.d.ts.map +0 -1
  227. package/dist/models/instanceRole.js.map +0 -1
  228. package/dist/models/instanceUser.d.ts.map +0 -1
  229. package/dist/models/instanceUser.js.map +0 -1
  230. package/dist/models/itemComments.d.ts.map +0 -1
  231. package/dist/models/itemComments.js.map +0 -1
  232. package/dist/models/listParams.d.ts.map +0 -1
  233. package/dist/models/listParams.js.map +0 -1
  234. package/dist/models/locales.d.ts.map +0 -1
  235. package/dist/models/locales.js.map +0 -1
  236. package/dist/models/media.d.ts.map +0 -1
  237. package/dist/models/media.js.map +0 -1
  238. package/dist/models/model.d.ts.map +0 -1
  239. package/dist/models/model.js.map +0 -1
  240. package/dist/models/notification.d.ts.map +0 -1
  241. package/dist/models/notification.js.map +0 -1
  242. package/dist/models/options.d.ts.map +0 -1
  243. package/dist/models/options.js.map +0 -1
  244. package/dist/models/pageHistory.d.ts.map +0 -1
  245. package/dist/models/pageHistory.js.map +0 -1
  246. package/dist/models/pageItem.d.ts.map +0 -1
  247. package/dist/models/pageItem.js.map +0 -1
  248. package/dist/models/pageModel.d.ts.map +0 -1
  249. package/dist/models/pageModel.js.map +0 -1
  250. package/dist/models/serverUser.d.ts.map +0 -1
  251. package/dist/models/serverUser.js.map +0 -1
  252. package/dist/models/sharedModule.d.ts.map +0 -1
  253. package/dist/models/sharedModule.js.map +0 -1
  254. package/dist/models/sitemap.d.ts.map +0 -1
  255. package/dist/models/sitemap.js.map +0 -1
  256. package/dist/models/webhook.d.ts.map +0 -1
  257. package/dist/models/webhook.js.map +0 -1
  258. package/dist/models/websiteListing.d.ts.map +0 -1
  259. package/dist/models/websiteListing.js.map +0 -1
  260. package/dist/models/websiteUser.d.ts.map +0 -1
  261. 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).