@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.
- package/LICENSE +21 -0
- package/README.md +482 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/actions/bulkTranslate.d.ts +7 -0
- package/dist/actions/bulkTranslate.d.ts.map +1 -0
- package/dist/actions/bulkTranslate.js +543 -0
- package/dist/actions/bulkTranslate.js.map +1 -0
- package/dist/actions/manageDNTFields.d.ts +12 -0
- package/dist/actions/manageDNTFields.d.ts.map +1 -0
- package/dist/actions/manageDNTFields.js +100 -0
- package/dist/actions/manageDNTFields.js.map +1 -0
- package/dist/actions/translateDocument.d.ts +7 -0
- package/dist/actions/translateDocument.d.ts.map +1 -0
- package/dist/actions/translateDocument.js +256 -0
- package/dist/actions/translateDocument.js.map +1 -0
- package/dist/components/RadioWithDefault.d.ts +17 -0
- package/dist/components/RadioWithDefault.d.ts.map +1 -0
- package/dist/components/RadioWithDefault.js +29 -0
- package/dist/components/RadioWithDefault.js.map +1 -0
- package/dist/components/auth/AuthNavbar.d.ts +18 -0
- package/dist/components/auth/AuthNavbar.d.ts.map +1 -0
- package/dist/components/auth/AuthNavbar.js +15 -0
- package/dist/components/auth/AuthNavbar.js.map +1 -0
- package/dist/components/auth/AuthStatus.d.ts +27 -0
- package/dist/components/auth/AuthStatus.d.ts.map +1 -0
- package/dist/components/auth/AuthStatus.js +82 -0
- package/dist/components/auth/AuthStatus.js.map +1 -0
- package/dist/components/auth/AuthStatusWrapper.d.ts +15 -0
- package/dist/components/auth/AuthStatusWrapper.d.ts.map +1 -0
- package/dist/components/auth/AuthStatusWrapper.js +39 -0
- package/dist/components/auth/AuthStatusWrapper.js.map +1 -0
- package/dist/components/auth/MigrationPrompt.d.ts +20 -0
- package/dist/components/auth/MigrationPrompt.d.ts.map +1 -0
- package/dist/components/auth/MigrationPrompt.js +16 -0
- package/dist/components/auth/MigrationPrompt.js.map +1 -0
- package/dist/components/auth/MigrationPromptWrapper.d.ts +14 -0
- package/dist/components/auth/MigrationPromptWrapper.d.ts.map +1 -0
- package/dist/components/auth/MigrationPromptWrapper.js +16 -0
- package/dist/components/auth/MigrationPromptWrapper.js.map +1 -0
- package/dist/components/auth/OAuthCallback.d.ts +20 -0
- package/dist/components/auth/OAuthCallback.d.ts.map +1 -0
- package/dist/components/auth/OAuthCallback.js +12 -0
- package/dist/components/auth/OAuthCallback.js.map +1 -0
- package/dist/components/auth/index.d.ts +15 -0
- package/dist/components/auth/index.d.ts.map +1 -0
- package/dist/components/auth/index.js +12 -0
- package/dist/components/auth/index.js.map +1 -0
- package/dist/components/config/LocaleConfigTool.d.ts +17 -0
- package/dist/components/config/LocaleConfigTool.d.ts.map +1 -0
- package/dist/components/config/LocaleConfigTool.js +186 -0
- package/dist/components/config/LocaleConfigTool.js.map +1 -0
- package/dist/components/config/LocaleConfigToolWrapper.d.ts +13 -0
- package/dist/components/config/LocaleConfigToolWrapper.d.ts.map +1 -0
- package/dist/components/config/LocaleConfigToolWrapper.js +26 -0
- package/dist/components/config/LocaleConfigToolWrapper.js.map +1 -0
- package/dist/components/config/OAuthConfig.d.ts +26 -0
- package/dist/components/config/OAuthConfig.d.ts.map +1 -0
- package/dist/components/config/OAuthConfig.js +152 -0
- package/dist/components/config/OAuthConfig.js.map +1 -0
- package/dist/components/config/OAuthConfigWrapper.d.ts +13 -0
- package/dist/components/config/OAuthConfigWrapper.d.ts.map +1 -0
- package/dist/components/config/OAuthConfigWrapper.js +41 -0
- package/dist/components/config/OAuthConfigWrapper.js.map +1 -0
- package/dist/components/config/PasswordInput.d.ts +14 -0
- package/dist/components/config/PasswordInput.d.ts.map +1 -0
- package/dist/components/config/PasswordInput.js +23 -0
- package/dist/components/config/PasswordInput.js.map +1 -0
- package/dist/components/config/index.d.ts +9 -0
- package/dist/components/config/index.d.ts.map +1 -0
- package/dist/components/config/index.js +8 -0
- package/dist/components/config/index.js.map +1 -0
- package/dist/components/config/localeConfigToolDefinition.d.ts +13 -0
- package/dist/components/config/localeConfigToolDefinition.d.ts.map +1 -0
- package/dist/components/config/localeConfigToolDefinition.js +19 -0
- package/dist/components/config/localeConfigToolDefinition.js.map +1 -0
- package/dist/components/config/oauthConfigToolDefinition.d.ts +13 -0
- package/dist/components/config/oauthConfigToolDefinition.d.ts.map +1 -0
- package/dist/components/config/oauthConfigToolDefinition.js +19 -0
- package/dist/components/config/oauthConfigToolDefinition.js.map +1 -0
- package/dist/components/dialogs/ConfirmationDialog.d.ts +21 -0
- package/dist/components/dialogs/ConfirmationDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ConfirmationDialog.js +28 -0
- package/dist/components/dialogs/ConfirmationDialog.js.map +1 -0
- package/dist/components/dialogs/ErrorDialog.d.ts +21 -0
- package/dist/components/dialogs/ErrorDialog.d.ts.map +1 -0
- package/dist/components/dialogs/ErrorDialog.js +28 -0
- package/dist/components/dialogs/ErrorDialog.js.map +1 -0
- package/dist/components/dialogs/LocaleSelectionDialog.d.ts +41 -0
- package/dist/components/dialogs/LocaleSelectionDialog.d.ts.map +1 -0
- package/dist/components/dialogs/LocaleSelectionDialog.js +117 -0
- package/dist/components/dialogs/LocaleSelectionDialog.js.map +1 -0
- package/dist/components/dialogs/SuccessDialog.d.ts +19 -0
- package/dist/components/dialogs/SuccessDialog.d.ts.map +1 -0
- package/dist/components/dialogs/SuccessDialog.js +37 -0
- package/dist/components/dialogs/SuccessDialog.js.map +1 -0
- package/dist/components/dialogs/index.d.ts +12 -0
- package/dist/components/dialogs/index.d.ts.map +1 -0
- package/dist/components/dialogs/index.js +8 -0
- package/dist/components/dialogs/index.js.map +1 -0
- package/dist/components/dnt/DNTFieldBadge.d.ts +16 -0
- package/dist/components/dnt/DNTFieldBadge.d.ts.map +1 -0
- package/dist/components/dnt/DNTFieldBadge.js +56 -0
- package/dist/components/dnt/DNTFieldBadge.js.map +1 -0
- package/dist/components/dnt/DNTFieldComponent.d.ts +17 -0
- package/dist/components/dnt/DNTFieldComponent.d.ts.map +1 -0
- package/dist/components/dnt/DNTFieldComponent.js +21 -0
- package/dist/components/dnt/DNTFieldComponent.js.map +1 -0
- package/dist/components/dnt/DNTFieldInput.d.ts +14 -0
- package/dist/components/dnt/DNTFieldInput.d.ts.map +1 -0
- package/dist/components/dnt/DNTFieldInput.js +76 -0
- package/dist/components/dnt/DNTFieldInput.js.map +1 -0
- package/dist/components/dnt/index.d.ts +7 -0
- package/dist/components/dnt/index.d.ts.map +1 -0
- package/dist/components/dnt/index.js +7 -0
- package/dist/components/dnt/index.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/pluginConfig.d.ts +163 -0
- package/dist/config/pluginConfig.d.ts.map +1 -0
- package/dist/config/pluginConfig.js +548 -0
- package/dist/config/pluginConfig.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +137 -0
- package/dist/plugin.js.map +1 -0
- package/dist/services/authStateManager.d.ts +94 -0
- package/dist/services/authStateManager.d.ts.map +1 -0
- package/dist/services/authStateManager.js +208 -0
- package/dist/services/authStateManager.js.map +1 -0
- package/dist/services/contentExtractor.d.ts +95 -0
- package/dist/services/contentExtractor.d.ts.map +1 -0
- package/dist/services/contentExtractor.js +516 -0
- package/dist/services/contentExtractor.js.map +1 -0
- package/dist/services/dialogService.d.ts +96 -0
- package/dist/services/dialogService.d.ts.map +1 -0
- package/dist/services/dialogService.js +244 -0
- package/dist/services/dialogService.js.map +1 -0
- package/dist/services/dntServiceManager.d.ts +44 -0
- package/dist/services/dntServiceManager.d.ts.map +1 -0
- package/dist/services/dntServiceManager.js +74 -0
- package/dist/services/dntServiceManager.js.map +1 -0
- package/dist/services/dntStorageAdapter.d.ts +73 -0
- package/dist/services/dntStorageAdapter.d.ts.map +1 -0
- package/dist/services/dntStorageAdapter.js +192 -0
- package/dist/services/dntStorageAdapter.js.map +1 -0
- package/dist/services/documentCreationService.d.ts +139 -0
- package/dist/services/documentCreationService.d.ts.map +1 -0
- package/dist/services/documentCreationService.js +938 -0
- package/dist/services/documentCreationService.js.map +1 -0
- package/dist/services/localeService.d.ts +160 -0
- package/dist/services/localeService.d.ts.map +1 -0
- package/dist/services/localeService.js +300 -0
- package/dist/services/localeService.js.map +1 -0
- package/dist/services/localeStorageAdapter.d.ts +42 -0
- package/dist/services/localeStorageAdapter.d.ts.map +1 -0
- package/dist/services/localeStorageAdapter.js +107 -0
- package/dist/services/localeStorageAdapter.js.map +1 -0
- package/dist/services/oauthConfigStorage.d.ts +46 -0
- package/dist/services/oauthConfigStorage.d.ts.map +1 -0
- package/dist/services/oauthConfigStorage.js +122 -0
- package/dist/services/oauthConfigStorage.js.map +1 -0
- package/dist/services/oauthService.d.ts +48 -0
- package/dist/services/oauthService.d.ts.map +1 -0
- package/dist/services/oauthService.js +71 -0
- package/dist/services/oauthService.js.map +1 -0
- package/dist/services/oauthServiceManager.d.ts +189 -0
- package/dist/services/oauthServiceManager.d.ts.map +1 -0
- package/dist/services/oauthServiceManager.js +380 -0
- package/dist/services/oauthServiceManager.js.map +1 -0
- package/dist/services/tokenStorage.d.ts +54 -0
- package/dist/services/tokenStorage.d.ts.map +1 -0
- package/dist/services/tokenStorage.js +140 -0
- package/dist/services/tokenStorage.js.map +1 -0
- package/dist/services/translationService.d.ts +374 -0
- package/dist/services/translationService.d.ts.map +1 -0
- package/dist/services/translationService.js +687 -0
- package/dist/services/translationService.js.map +1 -0
- package/dist/services/unifiedConfigStorage.d.ts +124 -0
- package/dist/services/unifiedConfigStorage.d.ts.map +1 -0
- package/dist/services/unifiedConfigStorage.js +304 -0
- package/dist/services/unifiedConfigStorage.js.map +1 -0
- package/dist/test-utils.d.ts +9 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +13 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/types/dialog.d.ts +107 -0
- package/dist/types/dialog.d.ts.map +1 -0
- package/dist/types/dialog.js +6 -0
- package/dist/types/dialog.js.map +1 -0
- package/dist/types/dnt.d.ts +84 -0
- package/dist/types/dnt.d.ts.map +1 -0
- package/dist/types/dnt.js +5 -0
- package/dist/types/dnt.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/locale.d.ts +116 -0
- package/dist/types/locale.d.ts.map +1 -0
- package/dist/types/locale.js +189 -0
- package/dist/types/locale.js.map +1 -0
- package/dist/types/oauth.d.ts +90 -0
- package/dist/types/oauth.d.ts.map +1 -0
- package/dist/types/oauth.js +62 -0
- package/dist/types/oauth.js.map +1 -0
- package/dist/types/pluginConfig.d.ts +45 -0
- package/dist/types/pluginConfig.d.ts.map +1 -0
- package/dist/types/pluginConfig.js +6 -0
- package/dist/types/pluginConfig.js.map +1 -0
- package/dist/types/translation.d.ts +122 -0
- package/dist/types/translation.d.ts.map +1 -0
- package/dist/types/translation.js +6 -0
- package/dist/types/translation.js.map +1 -0
- package/dist/utils/htmlFormatter.d.ts +66 -0
- package/dist/utils/htmlFormatter.d.ts.map +1 -0
- package/dist/utils/htmlFormatter.js +191 -0
- package/dist/utils/htmlFormatter.js.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +16 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +105 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +229 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/oauthErrorFeedback.d.ts +76 -0
- package/dist/utils/oauthErrorFeedback.d.ts.map +1 -0
- package/dist/utils/oauthErrorFeedback.js +134 -0
- package/dist/utils/oauthErrorFeedback.js.map +1 -0
- package/dist/utils/oauthLogger.d.ts +176 -0
- package/dist/utils/oauthLogger.d.ts.map +1 -0
- package/dist/utils/oauthLogger.js +282 -0
- package/dist/utils/oauthLogger.js.map +1 -0
- package/dist/utils/validator.d.ts +67 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +390 -0
- package/dist/utils/validator.js.map +1 -0
- 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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"}
|