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