@easyling/sanity-connector 0.0.1

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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +482 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/actions/bulkTranslate.d.ts +7 -0
  5. package/dist/actions/bulkTranslate.d.ts.map +1 -0
  6. package/dist/actions/bulkTranslate.js +543 -0
  7. package/dist/actions/bulkTranslate.js.map +1 -0
  8. package/dist/actions/manageDNTFields.d.ts +12 -0
  9. package/dist/actions/manageDNTFields.d.ts.map +1 -0
  10. package/dist/actions/manageDNTFields.js +100 -0
  11. package/dist/actions/manageDNTFields.js.map +1 -0
  12. package/dist/actions/translateDocument.d.ts +7 -0
  13. package/dist/actions/translateDocument.d.ts.map +1 -0
  14. package/dist/actions/translateDocument.js +256 -0
  15. package/dist/actions/translateDocument.js.map +1 -0
  16. package/dist/components/RadioWithDefault.d.ts +17 -0
  17. package/dist/components/RadioWithDefault.d.ts.map +1 -0
  18. package/dist/components/RadioWithDefault.js +29 -0
  19. package/dist/components/RadioWithDefault.js.map +1 -0
  20. package/dist/components/auth/AuthNavbar.d.ts +18 -0
  21. package/dist/components/auth/AuthNavbar.d.ts.map +1 -0
  22. package/dist/components/auth/AuthNavbar.js +15 -0
  23. package/dist/components/auth/AuthNavbar.js.map +1 -0
  24. package/dist/components/auth/AuthStatus.d.ts +27 -0
  25. package/dist/components/auth/AuthStatus.d.ts.map +1 -0
  26. package/dist/components/auth/AuthStatus.js +82 -0
  27. package/dist/components/auth/AuthStatus.js.map +1 -0
  28. package/dist/components/auth/AuthStatusWrapper.d.ts +15 -0
  29. package/dist/components/auth/AuthStatusWrapper.d.ts.map +1 -0
  30. package/dist/components/auth/AuthStatusWrapper.js +39 -0
  31. package/dist/components/auth/AuthStatusWrapper.js.map +1 -0
  32. package/dist/components/auth/MigrationPrompt.d.ts +20 -0
  33. package/dist/components/auth/MigrationPrompt.d.ts.map +1 -0
  34. package/dist/components/auth/MigrationPrompt.js +16 -0
  35. package/dist/components/auth/MigrationPrompt.js.map +1 -0
  36. package/dist/components/auth/MigrationPromptWrapper.d.ts +14 -0
  37. package/dist/components/auth/MigrationPromptWrapper.d.ts.map +1 -0
  38. package/dist/components/auth/MigrationPromptWrapper.js +16 -0
  39. package/dist/components/auth/MigrationPromptWrapper.js.map +1 -0
  40. package/dist/components/auth/OAuthCallback.d.ts +20 -0
  41. package/dist/components/auth/OAuthCallback.d.ts.map +1 -0
  42. package/dist/components/auth/OAuthCallback.js +12 -0
  43. package/dist/components/auth/OAuthCallback.js.map +1 -0
  44. package/dist/components/auth/index.d.ts +15 -0
  45. package/dist/components/auth/index.d.ts.map +1 -0
  46. package/dist/components/auth/index.js +12 -0
  47. package/dist/components/auth/index.js.map +1 -0
  48. package/dist/components/config/LocaleConfigTool.d.ts +17 -0
  49. package/dist/components/config/LocaleConfigTool.d.ts.map +1 -0
  50. package/dist/components/config/LocaleConfigTool.js +186 -0
  51. package/dist/components/config/LocaleConfigTool.js.map +1 -0
  52. package/dist/components/config/LocaleConfigToolWrapper.d.ts +13 -0
  53. package/dist/components/config/LocaleConfigToolWrapper.d.ts.map +1 -0
  54. package/dist/components/config/LocaleConfigToolWrapper.js +26 -0
  55. package/dist/components/config/LocaleConfigToolWrapper.js.map +1 -0
  56. package/dist/components/config/OAuthConfig.d.ts +26 -0
  57. package/dist/components/config/OAuthConfig.d.ts.map +1 -0
  58. package/dist/components/config/OAuthConfig.js +152 -0
  59. package/dist/components/config/OAuthConfig.js.map +1 -0
  60. package/dist/components/config/OAuthConfigWrapper.d.ts +13 -0
  61. package/dist/components/config/OAuthConfigWrapper.d.ts.map +1 -0
  62. package/dist/components/config/OAuthConfigWrapper.js +41 -0
  63. package/dist/components/config/OAuthConfigWrapper.js.map +1 -0
  64. package/dist/components/config/PasswordInput.d.ts +14 -0
  65. package/dist/components/config/PasswordInput.d.ts.map +1 -0
  66. package/dist/components/config/PasswordInput.js +23 -0
  67. package/dist/components/config/PasswordInput.js.map +1 -0
  68. package/dist/components/config/index.d.ts +9 -0
  69. package/dist/components/config/index.d.ts.map +1 -0
  70. package/dist/components/config/index.js +8 -0
  71. package/dist/components/config/index.js.map +1 -0
  72. package/dist/components/config/localeConfigToolDefinition.d.ts +13 -0
  73. package/dist/components/config/localeConfigToolDefinition.d.ts.map +1 -0
  74. package/dist/components/config/localeConfigToolDefinition.js +19 -0
  75. package/dist/components/config/localeConfigToolDefinition.js.map +1 -0
  76. package/dist/components/config/oauthConfigToolDefinition.d.ts +13 -0
  77. package/dist/components/config/oauthConfigToolDefinition.d.ts.map +1 -0
  78. package/dist/components/config/oauthConfigToolDefinition.js +19 -0
  79. package/dist/components/config/oauthConfigToolDefinition.js.map +1 -0
  80. package/dist/components/dialogs/ConfirmationDialog.d.ts +21 -0
  81. package/dist/components/dialogs/ConfirmationDialog.d.ts.map +1 -0
  82. package/dist/components/dialogs/ConfirmationDialog.js +28 -0
  83. package/dist/components/dialogs/ConfirmationDialog.js.map +1 -0
  84. package/dist/components/dialogs/ErrorDialog.d.ts +21 -0
  85. package/dist/components/dialogs/ErrorDialog.d.ts.map +1 -0
  86. package/dist/components/dialogs/ErrorDialog.js +28 -0
  87. package/dist/components/dialogs/ErrorDialog.js.map +1 -0
  88. package/dist/components/dialogs/LocaleSelectionDialog.d.ts +41 -0
  89. package/dist/components/dialogs/LocaleSelectionDialog.d.ts.map +1 -0
  90. package/dist/components/dialogs/LocaleSelectionDialog.js +117 -0
  91. package/dist/components/dialogs/LocaleSelectionDialog.js.map +1 -0
  92. package/dist/components/dialogs/SuccessDialog.d.ts +19 -0
  93. package/dist/components/dialogs/SuccessDialog.d.ts.map +1 -0
  94. package/dist/components/dialogs/SuccessDialog.js +37 -0
  95. package/dist/components/dialogs/SuccessDialog.js.map +1 -0
  96. package/dist/components/dialogs/index.d.ts +12 -0
  97. package/dist/components/dialogs/index.d.ts.map +1 -0
  98. package/dist/components/dialogs/index.js +8 -0
  99. package/dist/components/dialogs/index.js.map +1 -0
  100. package/dist/components/dnt/DNTFieldBadge.d.ts +16 -0
  101. package/dist/components/dnt/DNTFieldBadge.d.ts.map +1 -0
  102. package/dist/components/dnt/DNTFieldBadge.js +56 -0
  103. package/dist/components/dnt/DNTFieldBadge.js.map +1 -0
  104. package/dist/components/dnt/DNTFieldComponent.d.ts +17 -0
  105. package/dist/components/dnt/DNTFieldComponent.d.ts.map +1 -0
  106. package/dist/components/dnt/DNTFieldComponent.js +21 -0
  107. package/dist/components/dnt/DNTFieldComponent.js.map +1 -0
  108. package/dist/components/dnt/DNTFieldInput.d.ts +14 -0
  109. package/dist/components/dnt/DNTFieldInput.d.ts.map +1 -0
  110. package/dist/components/dnt/DNTFieldInput.js +76 -0
  111. package/dist/components/dnt/DNTFieldInput.js.map +1 -0
  112. package/dist/components/dnt/index.d.ts +7 -0
  113. package/dist/components/dnt/index.d.ts.map +1 -0
  114. package/dist/components/dnt/index.js +7 -0
  115. package/dist/components/dnt/index.js.map +1 -0
  116. package/dist/config/index.d.ts +6 -0
  117. package/dist/config/index.d.ts.map +1 -0
  118. package/dist/config/index.js +6 -0
  119. package/dist/config/index.js.map +1 -0
  120. package/dist/config/pluginConfig.d.ts +163 -0
  121. package/dist/config/pluginConfig.d.ts.map +1 -0
  122. package/dist/config/pluginConfig.js +548 -0
  123. package/dist/config/pluginConfig.js.map +1 -0
  124. package/dist/index.d.ts +12 -0
  125. package/dist/index.d.ts.map +1 -0
  126. package/dist/index.js +12 -0
  127. package/dist/index.js.map +1 -0
  128. package/dist/plugin.d.ts +3 -0
  129. package/dist/plugin.d.ts.map +1 -0
  130. package/dist/plugin.js +137 -0
  131. package/dist/plugin.js.map +1 -0
  132. package/dist/services/authStateManager.d.ts +94 -0
  133. package/dist/services/authStateManager.d.ts.map +1 -0
  134. package/dist/services/authStateManager.js +208 -0
  135. package/dist/services/authStateManager.js.map +1 -0
  136. package/dist/services/contentExtractor.d.ts +95 -0
  137. package/dist/services/contentExtractor.d.ts.map +1 -0
  138. package/dist/services/contentExtractor.js +516 -0
  139. package/dist/services/contentExtractor.js.map +1 -0
  140. package/dist/services/dialogService.d.ts +96 -0
  141. package/dist/services/dialogService.d.ts.map +1 -0
  142. package/dist/services/dialogService.js +244 -0
  143. package/dist/services/dialogService.js.map +1 -0
  144. package/dist/services/dntServiceManager.d.ts +44 -0
  145. package/dist/services/dntServiceManager.d.ts.map +1 -0
  146. package/dist/services/dntServiceManager.js +74 -0
  147. package/dist/services/dntServiceManager.js.map +1 -0
  148. package/dist/services/dntStorageAdapter.d.ts +73 -0
  149. package/dist/services/dntStorageAdapter.d.ts.map +1 -0
  150. package/dist/services/dntStorageAdapter.js +192 -0
  151. package/dist/services/dntStorageAdapter.js.map +1 -0
  152. package/dist/services/documentCreationService.d.ts +139 -0
  153. package/dist/services/documentCreationService.d.ts.map +1 -0
  154. package/dist/services/documentCreationService.js +938 -0
  155. package/dist/services/documentCreationService.js.map +1 -0
  156. package/dist/services/localeService.d.ts +160 -0
  157. package/dist/services/localeService.d.ts.map +1 -0
  158. package/dist/services/localeService.js +300 -0
  159. package/dist/services/localeService.js.map +1 -0
  160. package/dist/services/localeStorageAdapter.d.ts +42 -0
  161. package/dist/services/localeStorageAdapter.d.ts.map +1 -0
  162. package/dist/services/localeStorageAdapter.js +107 -0
  163. package/dist/services/localeStorageAdapter.js.map +1 -0
  164. package/dist/services/oauthConfigStorage.d.ts +46 -0
  165. package/dist/services/oauthConfigStorage.d.ts.map +1 -0
  166. package/dist/services/oauthConfigStorage.js +122 -0
  167. package/dist/services/oauthConfigStorage.js.map +1 -0
  168. package/dist/services/oauthService.d.ts +48 -0
  169. package/dist/services/oauthService.d.ts.map +1 -0
  170. package/dist/services/oauthService.js +71 -0
  171. package/dist/services/oauthService.js.map +1 -0
  172. package/dist/services/oauthServiceManager.d.ts +189 -0
  173. package/dist/services/oauthServiceManager.d.ts.map +1 -0
  174. package/dist/services/oauthServiceManager.js +380 -0
  175. package/dist/services/oauthServiceManager.js.map +1 -0
  176. package/dist/services/tokenStorage.d.ts +54 -0
  177. package/dist/services/tokenStorage.d.ts.map +1 -0
  178. package/dist/services/tokenStorage.js +140 -0
  179. package/dist/services/tokenStorage.js.map +1 -0
  180. package/dist/services/translationService.d.ts +374 -0
  181. package/dist/services/translationService.d.ts.map +1 -0
  182. package/dist/services/translationService.js +687 -0
  183. package/dist/services/translationService.js.map +1 -0
  184. package/dist/services/unifiedConfigStorage.d.ts +124 -0
  185. package/dist/services/unifiedConfigStorage.d.ts.map +1 -0
  186. package/dist/services/unifiedConfigStorage.js +304 -0
  187. package/dist/services/unifiedConfigStorage.js.map +1 -0
  188. package/dist/test-utils.d.ts +9 -0
  189. package/dist/test-utils.d.ts.map +1 -0
  190. package/dist/test-utils.js +13 -0
  191. package/dist/test-utils.js.map +1 -0
  192. package/dist/types/dialog.d.ts +107 -0
  193. package/dist/types/dialog.d.ts.map +1 -0
  194. package/dist/types/dialog.js +6 -0
  195. package/dist/types/dialog.js.map +1 -0
  196. package/dist/types/dnt.d.ts +84 -0
  197. package/dist/types/dnt.d.ts.map +1 -0
  198. package/dist/types/dnt.js +5 -0
  199. package/dist/types/dnt.js.map +1 -0
  200. package/dist/types/index.d.ts +12 -0
  201. package/dist/types/index.d.ts.map +1 -0
  202. package/dist/types/index.js +6 -0
  203. package/dist/types/index.js.map +1 -0
  204. package/dist/types/locale.d.ts +116 -0
  205. package/dist/types/locale.d.ts.map +1 -0
  206. package/dist/types/locale.js +189 -0
  207. package/dist/types/locale.js.map +1 -0
  208. package/dist/types/oauth.d.ts +90 -0
  209. package/dist/types/oauth.d.ts.map +1 -0
  210. package/dist/types/oauth.js +62 -0
  211. package/dist/types/oauth.js.map +1 -0
  212. package/dist/types/pluginConfig.d.ts +45 -0
  213. package/dist/types/pluginConfig.d.ts.map +1 -0
  214. package/dist/types/pluginConfig.js +6 -0
  215. package/dist/types/pluginConfig.js.map +1 -0
  216. package/dist/types/translation.d.ts +122 -0
  217. package/dist/types/translation.d.ts.map +1 -0
  218. package/dist/types/translation.js +6 -0
  219. package/dist/types/translation.js.map +1 -0
  220. package/dist/utils/htmlFormatter.d.ts +66 -0
  221. package/dist/utils/htmlFormatter.d.ts.map +1 -0
  222. package/dist/utils/htmlFormatter.js +191 -0
  223. package/dist/utils/htmlFormatter.js.map +1 -0
  224. package/dist/utils/index.d.ts +15 -0
  225. package/dist/utils/index.d.ts.map +1 -0
  226. package/dist/utils/index.js +16 -0
  227. package/dist/utils/index.js.map +1 -0
  228. package/dist/utils/logger.d.ts +105 -0
  229. package/dist/utils/logger.d.ts.map +1 -0
  230. package/dist/utils/logger.js +229 -0
  231. package/dist/utils/logger.js.map +1 -0
  232. package/dist/utils/oauthErrorFeedback.d.ts +76 -0
  233. package/dist/utils/oauthErrorFeedback.d.ts.map +1 -0
  234. package/dist/utils/oauthErrorFeedback.js +134 -0
  235. package/dist/utils/oauthErrorFeedback.js.map +1 -0
  236. package/dist/utils/oauthLogger.d.ts +176 -0
  237. package/dist/utils/oauthLogger.d.ts.map +1 -0
  238. package/dist/utils/oauthLogger.js +282 -0
  239. package/dist/utils/oauthLogger.js.map +1 -0
  240. package/dist/utils/validator.d.ts +67 -0
  241. package/dist/utils/validator.d.ts.map +1 -0
  242. package/dist/utils/validator.js +390 -0
  243. package/dist/utils/validator.js.map +1 -0
  244. package/package.json +80 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Document action for managing DNT (Do Not Translate) field preferences
3
+ *
4
+ * Now uses document-type-based configuration: DNT settings apply to ALL documents
5
+ * of the same type, not just individual document instances.
6
+ */
7
+ import { DocumentActionComponent } from 'sanity';
8
+ /**
9
+ * Document action for managing DNT fields
10
+ */
11
+ export declare const manageDNTFieldsAction: DocumentActionComponent;
12
+ //# sourceMappingURL=manageDNTFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manageDNTFields.d.ts","sourceRoot":"","sources":["../../src/actions/manageDNTFields.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,uBAAuB,EAAkC,MAAM,QAAQ,CAAC;AAMjF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,uBAkGnC,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Document action for managing DNT (Do Not Translate) field preferences
3
+ *
4
+ * Now uses document-type-based configuration: DNT settings apply to ALL documents
5
+ * of the same type, not just individual document instances.
6
+ */
7
+ import { BlockElementIcon } from '@sanity/icons';
8
+ import { useCallback, useState } from 'react';
9
+ import { useDialogService } from '../services/dialogService';
10
+ import { getDNTStorage } from '../services/dntServiceManager';
11
+ /**
12
+ * Document action for managing DNT fields
13
+ */
14
+ export const manageDNTFieldsAction = (props) => {
15
+ const { id, type, draft, published } = props;
16
+ const dialogService = useDialogService();
17
+ const [isOpen, setIsOpen] = useState(false);
18
+ const document = draft || published;
19
+ const documentId = id;
20
+ // Don't show DNT action for plugin configuration documents
21
+ const pluginConfigTypes = ['EL_PluginConfiguration', 'EL_oauth-config', 'EL_translation-plugin-config'];
22
+ if (pluginConfigTypes.includes(type)) {
23
+ return {
24
+ label: 'Manage Translation Fields',
25
+ icon: BlockElementIcon,
26
+ disabled: true,
27
+ hidden: true
28
+ };
29
+ }
30
+ const handleManageDNT = useCallback(async () => {
31
+ if (!document) {
32
+ await dialogService.showError({
33
+ title: 'No Document',
34
+ message: 'Cannot manage DNT fields: No document available'
35
+ });
36
+ return;
37
+ }
38
+ // Get all translatable fields from the document
39
+ const fields = [];
40
+ const extractFields = (obj, parentPath = '') => {
41
+ if (!obj || typeof obj !== 'object')
42
+ return;
43
+ for (const [key, value] of Object.entries(obj)) {
44
+ // Skip system fields
45
+ if (key.startsWith('_'))
46
+ continue;
47
+ const fieldPath = parentPath ? `${parentPath}.${key}` : key;
48
+ // Check if it's a translatable field type
49
+ if (typeof value === 'string' ||
50
+ typeof value === 'number' ||
51
+ Array.isArray(value)) {
52
+ fields.push({
53
+ path: fieldPath,
54
+ value,
55
+ type: typeof value
56
+ });
57
+ }
58
+ else if (value && typeof value === 'object') {
59
+ // Recursively extract nested fields
60
+ extractFields(value, fieldPath);
61
+ }
62
+ }
63
+ };
64
+ extractFields(document);
65
+ // Load current DNT preferences for this document type
66
+ const dntStorage = getDNTStorage();
67
+ const dntFields = await dntStorage.getFieldsForType(type);
68
+ // Create field list with DNT status
69
+ const fieldList = fields.map(field => ({
70
+ ...field,
71
+ isDNT: dntFields[field.path] || false
72
+ }));
73
+ // Show dialog with field list
74
+ const message = fieldList.length > 0
75
+ ? `Found ${fieldList.length} translatable fields in this ${type} document. Use the field badges to toggle DNT status. Settings apply to ALL ${type} documents.`
76
+ : 'No translatable fields found in this document.';
77
+ const confirmed = await dialogService.showConfirmation({
78
+ title: 'Manage Translation Fields',
79
+ message,
80
+ confirmText: fieldList.length > 0 ? `Clear All DNT Settings for ${type}` : 'OK',
81
+ cancelText: 'Close',
82
+ tone: 'primary'
83
+ });
84
+ if (confirmed && fieldList.length > 0) {
85
+ // Clear all DNT preferences for this document type
86
+ await dntStorage.clearFieldsForType(type);
87
+ await dialogService.showSuccess({
88
+ title: 'DNT Settings Cleared',
89
+ message: `All fields in ${type} documents are now marked as translatable.`
90
+ });
91
+ }
92
+ }, [document, documentId, dialogService]);
93
+ return {
94
+ label: 'Manage Translation Fields',
95
+ icon: BlockElementIcon,
96
+ onHandle: handleManageDNT,
97
+ disabled: !document
98
+ };
99
+ };
100
+ //# sourceMappingURL=manageDNTFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manageDNTFields.js","sourceRoot":"","sources":["../../src/actions/manageDNTFields.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { DocumentActionComponent } from 'sanity';
2
+ /**
3
+ * Document action for translating a single document
4
+ * Requirements: 2.1, 2.3, 3.1, 3.3, 4.1, 4.2
5
+ */
6
+ export declare const translateDocumentAction: DocumentActionComponent;
7
+ //# sourceMappingURL=translateDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translateDocument.d.ts","sourceRoot":"","sources":["../../src/actions/translateDocument.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA6D,MAAM,QAAQ,CAAC;AAY5G;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,uBAgSrC,CAAC"}
@@ -0,0 +1,256 @@
1
+ import { useClient } from 'sanity';
2
+ import { TranslateIcon } from '@sanity/icons';
3
+ import { ContentExtractor } from '../services/contentExtractor';
4
+ import { DocumentCreationService } from '../services/documentCreationService';
5
+ import { LocaleService } from '../services/localeService';
6
+ import { SanityLocaleStorageAdapter } from '../services/localeStorageAdapter';
7
+ import { useDialogService } from '../services/dialogService';
8
+ import { OAuthServiceManager } from '../services/oauthServiceManager';
9
+ // Simple state management for loading state
10
+ let isTranslating = false;
11
+ /**
12
+ * Document action for translating a single document
13
+ * Requirements: 2.1, 2.3, 3.1, 3.3, 4.1, 4.2
14
+ */
15
+ export const translateDocumentAction = (props) => {
16
+ console.log('translateDocumentAction called with props:', { id: props.id, type: props.type, hasDraft: !!props.draft, hasPublished: !!props.published });
17
+ const { draft, published, id, type, onComplete } = props;
18
+ const client = useClient({ apiVersion: '2023-01-01' });
19
+ const dialogService = useDialogService();
20
+ // Use draft if available, otherwise use published version
21
+ const document = draft || published;
22
+ // Don't show action if no document is available
23
+ if (!document) {
24
+ console.log("no document found");
25
+ return null;
26
+ }
27
+ // Don't show translate action for plugin configuration documents
28
+ const pluginConfigTypes = ['EL_PluginConfiguration', 'EL_oauth-config', 'EL_translation-plugin-config'];
29
+ if (pluginConfigTypes.includes(type)) {
30
+ console.log('Excluding translate action for plugin configuration type:', type);
31
+ return null;
32
+ }
33
+ console.log('translateDocumentAction returning action for document:', id);
34
+ const handleTranslate = async () => {
35
+ // Prevent multiple simultaneous translations
36
+ if (isTranslating) {
37
+ return;
38
+ }
39
+ isTranslating = true;
40
+ try {
41
+ // Initialize services
42
+ const contentExtractor = new ContentExtractor();
43
+ const documentCreationService = new DocumentCreationService(client);
44
+ const storageAdapter = new SanityLocaleStorageAdapter(client);
45
+ const localeService = new LocaleService(storageAdapter);
46
+ // Get OAuth service manager and translation service
47
+ // Requirements: 4.1, 4.2, 4.3, 10.5
48
+ const serviceManager = OAuthServiceManager.getInstance(client);
49
+ // Refresh configuration to ensure we have the latest endpoint and settings
50
+ await serviceManager.refreshConfiguration();
51
+ const translationService = serviceManager.getTranslationService();
52
+ const authStateManager = serviceManager.getAuthStateManager();
53
+ // Check authentication state
54
+ const authState = authStateManager.getState();
55
+ // If OAuth is configured but not authenticated, prompt user to authenticate
56
+ if (serviceManager.isOAuthConfigured() && authState.state !== 'authenticated') {
57
+ await dialogService.showError({
58
+ title: 'Authentication Required',
59
+ message: 'You need to configure your Easyling credentials to use translation services.',
60
+ error: new Error('Please go to the Easyling Configuration tool to enter your access token and project ID.')
61
+ });
62
+ return;
63
+ }
64
+ // Load locale configuration
65
+ await localeService.loadConfig();
66
+ const enabledLocales = localeService.getEnabledLocales();
67
+ // Check if locales are configured
68
+ if (enabledLocales.length === 0) {
69
+ // No locales configured - show error dialog with guidance
70
+ await dialogService.showError({
71
+ title: 'No Locales Configured',
72
+ message: 'Please configure target locales before translating documents.',
73
+ error: new Error('No translation locales have been configured. Please use the Locale Configuration tool to add target languages.')
74
+ });
75
+ return;
76
+ }
77
+ // Extract structured document content
78
+ const documentContent = await contentExtractor.extractStructuredContent(document);
79
+ // Validate that we have content to translate
80
+ if (!documentContent.htmlContent || documentContent.htmlContent.trim().length === 0) {
81
+ await dialogService.showError({
82
+ title: 'Translation Failed',
83
+ message: 'No translatable content found in this document.',
84
+ error: new Error('The document does not contain any translatable content.')
85
+ });
86
+ return;
87
+ }
88
+ // Show locale selection dialog
89
+ const selectedLocalesResult = await dialogService.showLocaleSelection({
90
+ title: 'Select Target Locales',
91
+ message: `Choose the languages to translate "${documentContent.title}" into:`,
92
+ availableLocales: enabledLocales,
93
+ selectedLocales: [],
94
+ selectedDocuments: [document],
95
+ mode: 'single',
96
+ allowMultiple: true,
97
+ required: true,
98
+ showCreationModeOption: true,
99
+ defaultCreationMode: 'draft'
100
+ });
101
+ // User cancelled locale selection
102
+ if (!selectedLocalesResult || !selectedLocalesResult.locales || selectedLocalesResult.locales.length === 0) {
103
+ return;
104
+ }
105
+ const selectedLocales = selectedLocalesResult.locales;
106
+ const creationMode = selectedLocalesResult.creationMode || 'draft';
107
+ // Ask user for confirmation before creating new document
108
+ const shouldCreateDocument = await dialogService.showConfirmation({
109
+ title: 'Confirm Translation',
110
+ message: `Translate "${documentContent.title}" to ${selectedLocales.length} locale(s)?`,
111
+ details: `This will:\n• Send the translation request for ${selectedLocales.length} locale(s)\n• Create new documents with translated content\n• Preserve the original document structure`,
112
+ confirmText: 'Translate & Create Documents',
113
+ cancelText: 'Cancel',
114
+ tone: 'primary'
115
+ });
116
+ // User cancelled confirmation
117
+ if (!shouldCreateDocument) {
118
+ return;
119
+ }
120
+ // Send translation request
121
+ console.log(`Sending translation request for "${documentContent.title}" to ${selectedLocales.length} locale(s)...`);
122
+ console.log('Selected locales:', selectedLocales);
123
+ const translationResponse = await translationService.translateDocument(documentContent, type, undefined, // sourceLanguage - use default
124
+ undefined, // targetLanguage - not used for multi-locale
125
+ selectedLocales // targetLocales array
126
+ );
127
+ // Handle the response
128
+ if (translationResponse.success) {
129
+ console.log(`Translation completed successfully for "${documentContent.title}"`);
130
+ console.log('Translated documents:', translationResponse.translatedDocuments);
131
+ if (translationResponse.requestId) {
132
+ console.log('Request ID:', translationResponse.requestId);
133
+ }
134
+ // Get all translated documents (support both new array format and legacy single document format)
135
+ const translatedDocuments = translationResponse.translatedDocuments ||
136
+ (translationResponse.translatedContent ? [translationResponse.translatedContent] : []);
137
+ if (translatedDocuments.length > 0) {
138
+ console.log(`Creating ${translatedDocuments.length} new translated document(s)...`);
139
+ const creationResults = [];
140
+ let successCount = 0;
141
+ let failCount = 0;
142
+ // Create a document for each translated document in the response
143
+ for (let i = 0; i < translatedDocuments.length; i++) {
144
+ const translatedContent = translatedDocuments[i];
145
+ // Extract locale from the translated content or use the selected locale
146
+ const localeField = translatedContent.fields?.locale;
147
+ const localeValue = localeField && typeof localeField === 'object' && 'value' in localeField
148
+ ? localeField.value
149
+ : localeField;
150
+ const targetLocale = (localeValue ||
151
+ translatedContent.locale ||
152
+ selectedLocales[i] ||
153
+ selectedLocales[0]);
154
+ console.log(`Creating document ${i + 1}/${translatedDocuments.length} for locale: ${targetLocale}`);
155
+ // Create a single-document translation response for this document
156
+ const singleDocumentResponse = {
157
+ ...translationResponse,
158
+ translatedDocuments: [translatedContent],
159
+ translatedContent: translatedContent
160
+ };
161
+ const creationResult = await documentCreationService.createDocumentFromTranslation(document, singleDocumentResponse, {
162
+ targetLanguage: targetLocale,
163
+ createAsVariant: true,
164
+ parentDocumentId: document._id,
165
+ creationMode: creationMode
166
+ });
167
+ creationResults.push(creationResult);
168
+ if (creationResult.success) {
169
+ successCount++;
170
+ console.log(`Document ${i + 1} created successfully with ID: ${creationResult.documentId}`);
171
+ console.log('New document structure:', creationResult.document);
172
+ }
173
+ else {
174
+ failCount++;
175
+ console.error(`Failed to create document ${i + 1}:`, creationResult.error);
176
+ }
177
+ }
178
+ // Show appropriate success/error dialog based on results
179
+ if (successCount === translatedDocuments.length) {
180
+ // All documents created successfully
181
+ const documentIds = creationResults
182
+ .filter(r => r.success)
183
+ .map(r => r.documentId)
184
+ .join('\n');
185
+ dialogService.showSuccess({
186
+ title: 'Translation Completed',
187
+ message: `Successfully translated "${documentContent.title}" to ${successCount} locale(s)`,
188
+ details: `Created ${successCount} new document(s):\n${documentIds}\n\nTarget locale(s): ${selectedLocales.join(', ')}`
189
+ });
190
+ }
191
+ else if (successCount > 0) {
192
+ // Partial success
193
+ const successIds = creationResults
194
+ .filter(r => r.success)
195
+ .map(r => r.documentId)
196
+ .join('\n');
197
+ const errors = creationResults
198
+ .filter(r => !r.success)
199
+ .map(r => r.error)
200
+ .join('\n');
201
+ await dialogService.showError({
202
+ title: 'Partial Translation Success',
203
+ message: `Created ${successCount} of ${translatedDocuments.length} documents. ${failCount} failed.`,
204
+ error: new Error(`Successfully created:\n${successIds}\n\nErrors:\n${errors}`)
205
+ });
206
+ }
207
+ else {
208
+ // All failed
209
+ const errors = creationResults
210
+ .map(r => r.error)
211
+ .join('\n');
212
+ await dialogService.showError({
213
+ title: 'Document Creation Failed',
214
+ message: 'Translation completed, but failed to create any documents.',
215
+ error: new Error(errors || 'Unknown error during document creation')
216
+ });
217
+ }
218
+ }
219
+ }
220
+ else {
221
+ console.error(`Translation failed for "${documentContent.title}":`, translationResponse.error);
222
+ throw new Error(translationResponse.error || 'Translation request failed');
223
+ }
224
+ // Call onComplete if provided to signal success
225
+ if (onComplete) {
226
+ onComplete();
227
+ }
228
+ }
229
+ catch (error) {
230
+ console.error('Translation failed:', error);
231
+ // Log user-friendly error message
232
+ const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
233
+ console.error(`Failed to translate document: ${errorMessage}`);
234
+ // Show error dialog to user
235
+ await dialogService.showError({
236
+ title: 'Translation Failed',
237
+ message: 'An error occurred during translation.',
238
+ error: error instanceof Error ? error : new Error(errorMessage),
239
+ showRetry: true
240
+ });
241
+ }
242
+ finally {
243
+ isTranslating = false;
244
+ }
245
+ };
246
+ const action = {
247
+ label: isTranslating ? 'Translating...' : 'Translate',
248
+ icon: TranslateIcon,
249
+ onHandle: handleTranslate,
250
+ tone: 'primary',
251
+ disabled: isTranslating
252
+ };
253
+ console.log('translateDocumentAction returning action:', action);
254
+ return action;
255
+ };
256
+ //# sourceMappingURL=translateDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translateDocument.js","sourceRoot":"","sources":["../../src/actions/translateDocument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Custom Radio Input Component with Auto-Default
3
+ *
4
+ * This component wraps Sanity's default radio input and automatically sets
5
+ * the default value when the field is undefined. This ensures that:
6
+ * 1. New users see defaults immediately
7
+ * 2. Existing users with legacy configs see defaults without manual intervention
8
+ * 3. The UX is seamless and doesn't require any user action
9
+ */
10
+ import React from 'react';
11
+ import { StringInputProps } from 'sanity';
12
+ interface RadioWithDefaultProps extends StringInputProps {
13
+ defaultValue: string;
14
+ }
15
+ export declare const RadioWithDefault: React.FC<RadioWithDefaultProps>;
16
+ export {};
17
+ //# sourceMappingURL=RadioWithDefault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioWithDefault.d.ts","sourceRoot":"","sources":["../../src/components/RadioWithDefault.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAO,MAAM,QAAQ,CAAC;AAE/C,UAAU,qBAAsB,SAAQ,gBAAgB;IACtD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAiB5D,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Custom Radio Input Component with Auto-Default
3
+ *
4
+ * This component wraps Sanity's default radio input and automatically sets
5
+ * the default value when the field is undefined. This ensures that:
6
+ * 1. New users see defaults immediately
7
+ * 2. Existing users with legacy configs see defaults without manual intervention
8
+ * 3. The UX is seamless and doesn't require any user action
9
+ */
10
+ import { useEffect } from 'react';
11
+ import { set } from 'sanity';
12
+ export const RadioWithDefault = (props) => {
13
+ const { value, onChange, defaultValue, renderDefault } = props;
14
+ // Auto-set default value when field is undefined or empty
15
+ useEffect(() => {
16
+ if (value === undefined || value === null || value === '') {
17
+ // Automatically set the default value without user intervention
18
+ onChange(set(defaultValue));
19
+ }
20
+ }, [value, defaultValue, onChange]);
21
+ // Render the default radio input with the current or default value
22
+ return renderDefault({
23
+ ...props,
24
+ // Use the actual value if set, otherwise show default while patch is applying
25
+ value: value !== undefined && value !== null && value !== '' ? value : defaultValue
26
+ });
27
+ };
28
+ RadioWithDefault.displayName = 'RadioWithDefault';
29
+ //# sourceMappingURL=RadioWithDefault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioWithDefault.js","sourceRoot":"","sources":["../../src/components/RadioWithDefault.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAoB,GAAG,EAAE,MAAM,QAAQ,CAAC;AAM/C,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,KAAK,EAAE,EAAE;IACzE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAE/D,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,gEAAgE;YAChE,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEpC,mEAAmE;IACnE,OAAO,aAAa,CAAC;QACnB,GAAG,KAAK;QACR,8EAA8E;QAC9E,KAAK,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY;KACpF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Authentication Navbar Component
3
+ * Requirements: 6.2, 6.3
4
+ *
5
+ * Navbar component that displays authentication status in the Sanity Studio.
6
+ * Positioned for easy access across all plugin pages.
7
+ */
8
+ import React from 'react';
9
+ /**
10
+ * Authentication Navbar
11
+ *
12
+ * Displays the authentication status in a navbar-style component.
13
+ * Designed to be visible across all plugin pages.
14
+ *
15
+ * Requirements: 6.2, 6.3
16
+ */
17
+ export declare const AuthNavbar: React.FC;
18
+ //# sourceMappingURL=AuthNavbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthNavbar.d.ts","sourceRoot":"","sources":["../../../src/components/auth/AuthNavbar.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAQ9B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Card } from '@sanity/ui';
3
+ import { AuthStatusWrapper } from './AuthStatusWrapper';
4
+ /**
5
+ * Authentication Navbar
6
+ *
7
+ * Displays the authentication status in a navbar-style component.
8
+ * Designed to be visible across all plugin pages.
9
+ *
10
+ * Requirements: 6.2, 6.3
11
+ */
12
+ export const AuthNavbar = () => {
13
+ return (_jsx(Box, { padding: 3, children: _jsx(Card, { children: _jsx(AuthStatusWrapper, {}) }) }));
14
+ };
15
+ //# sourceMappingURL=AuthNavbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthNavbar.js","sourceRoot":"","sources":["../../../src/components/auth/AuthNavbar.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAa,GAAG,EAAE;IACvC,OAAO,CACL,KAAC,GAAG,IAAC,OAAO,EAAE,CAAC,YACb,KAAC,IAAI,cACH,KAAC,iBAAiB,KAAG,GAChB,GACH,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Authentication Status Component
3
+ * Requirements: 6.2, 6.3, 1.1, 7.1, 7.2, 7.3
4
+ *
5
+ * Displays the current authentication status and provides controls
6
+ * for connecting to and disconnecting from Easyling.
7
+ */
8
+ import React from 'react';
9
+ import { AuthStateManager } from '../../services/authStateManager';
10
+ export interface AuthStatusProps {
11
+ /** Authentication state manager instance */
12
+ authStateManager: AuthStateManager;
13
+ /** Callback when user clicks connect button */
14
+ onConnect: () => void;
15
+ /** Callback when user clicks disconnect button */
16
+ onDisconnect: () => void;
17
+ }
18
+ /**
19
+ * Authentication Status Component
20
+ *
21
+ * Subscribes to AuthStateManager for reactive updates and displays
22
+ * different UI based on the current authentication state.
23
+ *
24
+ * Requirements: 6.2, 6.3, 1.1, 7.1, 7.2, 7.3
25
+ */
26
+ export declare const AuthStatus: React.FC<AuthStatusProps>;
27
+ //# sourceMappingURL=AuthStatus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthStatus.d.ts","sourceRoot":"","sources":["../../../src/components/auth/AuthStatus.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAiBnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,MAAM,WAAW,eAAe;IAC9B,4CAA4C;IAC5C,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,IAAI,CAAC;IAEtB,kDAAkD;IAClD,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAmMhD,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Authentication Status Component
4
+ * Requirements: 6.2, 6.3, 1.1, 7.1, 7.2, 7.3
5
+ *
6
+ * Displays the current authentication status and provides controls
7
+ * for connecting to and disconnecting from Easyling.
8
+ */
9
+ import { useState, useEffect } from 'react';
10
+ import { Card, Stack, Text, Button, Flex, Badge } from '@sanity/ui';
11
+ import { CheckmarkCircleIcon, CloseCircleIcon, LinkIcon, LinkRemovedIcon } from '@sanity/icons';
12
+ /**
13
+ * Authentication Status Component
14
+ *
15
+ * Subscribes to AuthStateManager for reactive updates and displays
16
+ * different UI based on the current authentication state.
17
+ *
18
+ * Requirements: 6.2, 6.3, 1.1, 7.1, 7.2, 7.3
19
+ */
20
+ export const AuthStatus = ({ authStateManager, onConnect, onDisconnect }) => {
21
+ const [authState, setAuthState] = useState({
22
+ state: 'unauthenticated'
23
+ });
24
+ const [isProcessing, setIsProcessing] = useState(false);
25
+ // Subscribe to auth state changes
26
+ useEffect(() => {
27
+ const unsubscribe = authStateManager.subscribe((newState) => {
28
+ setAuthState(newState);
29
+ setIsProcessing(false);
30
+ });
31
+ return unsubscribe;
32
+ }, [authStateManager]);
33
+ /**
34
+ * Handle connect button click
35
+ * Requirements: 1.1, 6.2
36
+ */
37
+ const handleConnect = () => {
38
+ setIsProcessing(true);
39
+ onConnect();
40
+ };
41
+ /**
42
+ * Handle disconnect button click
43
+ * Requirements: 6.3, 6.4
44
+ */
45
+ const handleDisconnect = async () => {
46
+ setIsProcessing(true);
47
+ try {
48
+ await onDisconnect();
49
+ }
50
+ finally {
51
+ setIsProcessing(false);
52
+ }
53
+ };
54
+ /**
55
+ * Render unauthenticated state UI
56
+ * Requirements: 1.1, 6.2
57
+ */
58
+ const renderUnauthenticated = () => (_jsx(Card, { padding: 4, radius: 2, shadow: 1, children: _jsxs(Stack, { space: 3, children: [_jsxs(Flex, { align: "center", gap: 2, children: [_jsx(Text, { size: 2, children: _jsx(LinkRemovedIcon, {}) }), _jsx(Text, { size: 2, weight: "semibold", children: "Not Connected" })] }), _jsx(Text, { size: 1, muted: true, children: "Connect to Easyling to enable translation services. You'll be able to translate documents and access your translation projects." }), _jsx(Button, { text: "Connect to Easyling", tone: "primary", icon: LinkIcon, onClick: handleConnect, disabled: isProcessing, loading: isProcessing })] }) }));
59
+ /**
60
+ * Render authenticated state UI
61
+ * Requirements: 6.2, 6.3, 6.4
62
+ */
63
+ const renderAuthenticated = () => (_jsx(Card, { padding: 4, radius: 2, shadow: 1, tone: "positive", children: _jsxs(Stack, { space: 3, children: [_jsx(Flex, { align: "center", justify: "space-between", children: _jsxs(Flex, { align: "center", gap: 2, children: [_jsx(Text, { size: 2, children: _jsx(CheckmarkCircleIcon, {}) }), _jsx(Text, { size: 2, weight: "semibold", children: "Connected" }), _jsx(Badge, { tone: "positive", mode: "outline", children: "Active" })] }) }), _jsxs(Stack, { space: 2, children: [authState.projectName && (_jsxs(Flex, { align: "center", gap: 2, children: [_jsx(Text, { size: 1, muted: true, children: "Project:" }), _jsx(Text, { size: 1, weight: "medium", children: authState.projectName })] })), authState.projectId && !authState.projectName && (_jsxs(Flex, { align: "center", gap: 2, children: [_jsx(Text, { size: 1, muted: true, children: "Project ID:" }), _jsx(Text, { size: 1, weight: "medium", children: authState.projectId })] }))] }), _jsx(Button, { text: "Disconnect", mode: "ghost", tone: "critical", icon: LinkRemovedIcon, onClick: handleDisconnect, disabled: isProcessing, loading: isProcessing })] }) }));
64
+ /**
65
+ * Render error state UI
66
+ * Requirements: 7.1, 7.2, 7.3
67
+ */
68
+ const renderError = () => (_jsx(Card, { padding: 4, radius: 2, shadow: 1, tone: "critical", children: _jsxs(Stack, { space: 3, children: [_jsxs(Flex, { align: "center", gap: 2, children: [_jsx(Text, { size: 2, children: _jsx(CloseCircleIcon, {}) }), _jsx(Text, { size: 2, weight: "semibold", children: "Authentication Error" })] }), _jsx(Text, { size: 1, children: authState.error || 'An error occurred during authentication.' }), _jsx(Text, { size: 1, muted: true, children: "Please try connecting again. If the problem persists, check your OAuth configuration or contact support." }), _jsxs(Flex, { gap: 2, children: [_jsx(Button, { text: "Retry", tone: "primary", icon: LinkIcon, onClick: handleConnect, disabled: isProcessing, loading: isProcessing }), _jsx(Button, { text: "Clear Error", mode: "ghost", onClick: handleDisconnect, disabled: isProcessing })] })] }) }));
69
+ // Render appropriate UI based on auth state
70
+ switch (authState.state) {
71
+ case 'unauthenticated':
72
+ return renderUnauthenticated();
73
+ case 'authenticated':
74
+ return renderAuthenticated();
75
+ case 'error':
76
+ return renderError();
77
+ default:
78
+ // Fallback for unknown states
79
+ return renderUnauthenticated();
80
+ }
81
+ };
82
+ //# sourceMappingURL=AuthStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthStatus.js","sourceRoot":"","sources":["../../../src/components/auth/AuthStatus.tsx"],"names":[],"mappings":"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"}