avada-components-seoon 1.0.0

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 (66) hide show
  1. package/README.md +71 -0
  2. package/dist/commands/autoTranslate.cjs +240 -0
  3. package/dist/commands/autoTranslate.cjs.map +1 -0
  4. package/dist/commands/autoTranslate.d.cts +2 -0
  5. package/dist/commands/autoTranslate.d.cts.map +1 -0
  6. package/dist/components/CrossAppBanner/index.d.ts +5 -0
  7. package/dist/components/CrossAppBanner/index.d.ts.map +1 -0
  8. package/dist/components/CrossAppBanner/index.js +192 -0
  9. package/dist/components/CrossAppBanner/index.js.map +1 -0
  10. package/dist/components/CrossAppBanner/index.scss +47 -0
  11. package/dist/components/CrossAppBanner/types.d.ts +81 -0
  12. package/dist/components/CrossAppBanner/types.d.ts.map +1 -0
  13. package/dist/components/CrossAppBanner/types.js +14 -0
  14. package/dist/components/CrossAppBanner/types.js.map +1 -0
  15. package/dist/components/PageSpeed/index.d.ts +81 -0
  16. package/dist/components/PageSpeed/index.d.ts.map +1 -0
  17. package/dist/components/PageSpeed/index.js +152 -0
  18. package/dist/components/PageSpeed/index.js.map +1 -0
  19. package/dist/components/PageSpeed/index.scss +233 -0
  20. package/dist/config/constants.d.ts +24 -0
  21. package/dist/config/constants.d.ts.map +1 -0
  22. package/dist/config/constants.js +50 -0
  23. package/dist/config/constants.js.map +1 -0
  24. package/dist/helpers/api.d.ts +6 -0
  25. package/dist/helpers/api.d.ts.map +1 -0
  26. package/dist/helpers/api.js +22 -0
  27. package/dist/helpers/api.js.map +1 -0
  28. package/dist/helpers/formatFullTime.d.ts +8 -0
  29. package/dist/helpers/formatFullTime.d.ts.map +1 -0
  30. package/dist/helpers/formatFullTime.js +45 -0
  31. package/dist/helpers/formatFullTime.js.map +1 -0
  32. package/dist/helpers/getProxyEndPoint.d.ts +7 -0
  33. package/dist/helpers/getProxyEndPoint.d.ts.map +1 -0
  34. package/dist/helpers/getProxyEndPoint.js +66 -0
  35. package/dist/helpers/getProxyEndPoint.js.map +1 -0
  36. package/dist/hooks/api/useFetchApi.d.ts +38 -0
  37. package/dist/hooks/api/useFetchApi.d.ts.map +1 -0
  38. package/dist/hooks/api/useFetchApi.js +74 -0
  39. package/dist/hooks/api/useFetchApi.js.map +1 -0
  40. package/dist/hooks/useI18n.d.ts +2 -0
  41. package/dist/hooks/useI18n.d.ts.map +1 -0
  42. package/dist/hooks/useI18n.js +35 -0
  43. package/dist/hooks/useI18n.js.map +1 -0
  44. package/dist/index.d.ts +9 -0
  45. package/dist/index.d.ts.map +1 -0
  46. package/dist/index.js +7 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/locales/da.json +38 -0
  49. package/dist/locales/de.json +38 -0
  50. package/dist/locales/en.json +38 -0
  51. package/dist/locales/es.json +38 -0
  52. package/dist/locales/fr.json +38 -0
  53. package/dist/locales/index.d.ts +383 -0
  54. package/dist/locales/index.d.ts.map +1 -0
  55. package/dist/locales/index.js +23 -0
  56. package/dist/locales/index.js.map +1 -0
  57. package/dist/locales/nl.json +38 -0
  58. package/dist/locales/pt.json +38 -0
  59. package/dist/locales/sv.json +38 -0
  60. package/dist/locales/vi.json +38 -0
  61. package/dist/locales/zh-CN.json +38 -0
  62. package/dist/types/shop.d.ts +188 -0
  63. package/dist/types/shop.d.ts.map +1 -0
  64. package/dist/types/shop.js +5 -0
  65. package/dist/types/shop.js.map +1 -0
  66. package/package.json +91 -0
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # Avada Components
2
+
3
+ A collection of React components built with Shopify Polaris for company-wide app usage.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # Using yarn
9
+ yarn add avada-components
10
+
11
+ # Using npm
12
+ npm install avada-components
13
+ ```
14
+
15
+ ## Components
16
+
17
+ ### SeoScore
18
+
19
+ A component for displaying SEO performance metrics and issues for a Shopify store.
20
+
21
+ ```tsx
22
+ import { SeoScore } from 'avada-components';
23
+
24
+ function App() {
25
+ return (
26
+ <SeoScore
27
+ type="widget" // or "banner"
28
+ shop={{
29
+ shopifyDomain: 'my-store.myshopify.com',
30
+ // other shop properties...
31
+ }}
32
+ />
33
+ );
34
+ }
35
+ ```
36
+
37
+ #### Props
38
+
39
+ | Prop | Type | Required | Default | Description |
40
+ | ---- | ---------------------- | -------- | ---------- | ------------------------------ |
41
+ | type | `'widget' \| 'banner'` | No | `'widget'` | Display style of the SEO score |
42
+ | shop | `Shop` | Yes | - | Shop information object |
43
+
44
+ ## TypeScript Support
45
+
46
+ This package is written in TypeScript and includes type definitions. You'll get full type support when using the components:
47
+
48
+ ```tsx
49
+ import { SeoScore, type SeoScoreProps } from 'avada-components';
50
+
51
+ // Props will be type-checked
52
+ const props: SeoScoreProps = {
53
+ type: 'widget',
54
+ };
55
+
56
+ function App() {
57
+ return <SeoScore {...props} />;
58
+ }
59
+ ```
60
+
61
+ ## Contributing
62
+
63
+ 1. Fork the repository
64
+ 2. Create your feature branch (`git checkout -b feature/amazing-feature`)
65
+ 3. Commit your changes (`git commit -m 'Add some amazing feature'`)
66
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
67
+ 5. Open a Pull Request
68
+
69
+ ## License
70
+
71
+ ISC
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const readline = require('readline');
5
+ const { v2 } = require('@google-cloud/translate');
6
+ const translate = new v2.Translate({ key: 'AIzaSyAwYJKHbjbj-eByPebF0RIfUi7YQjhxqyY' });
7
+ const rl = readline.createInterface({
8
+ input: process.stdin,
9
+ output: process.stdout,
10
+ });
11
+ const question = query => new Promise(resolve => rl.question(query, resolve));
12
+ const languages = [
13
+ { code: 'nl', name: 'Dutch' },
14
+ { code: 'vi', name: 'Vietnamese' },
15
+ { code: 'pt-BR', name: 'Portuguese (Brazil)' },
16
+ { code: 'fr', name: 'French' },
17
+ { code: 'de', name: 'German' },
18
+ { code: 'zh-CN', name: 'Chinese (Simplified)' },
19
+ { code: 'es', name: 'Spanish' },
20
+ { code: 'sv', name: 'Swedish' },
21
+ { code: 'da', name: 'Danish' },
22
+ ];
23
+ const protectPlaceholders = text => {
24
+ return text.replace(/\{([^}]+)\}/g, 'PLACEHOLDER_$1_PLACEHOLDER');
25
+ };
26
+ const restorePlaceholders = text => {
27
+ return text.replace(/PLACEHOLDER_([^_]+)_PLACEHOLDER/g, '{$1}');
28
+ };
29
+ const translateText = async (text, targetLang) => {
30
+ try {
31
+ const protectedText = protectPlaceholders(text);
32
+ const [translation] = await translate.translate(protectedText, { to: targetLang });
33
+ const result = restorePlaceholders(translation);
34
+ console.log(`Translated: "${text}" -> "${result}" (${targetLang})`);
35
+ return result;
36
+ }
37
+ catch (error) {
38
+ console.error(`Error translating text to ${targetLang}:`, error);
39
+ return text;
40
+ }
41
+ };
42
+ const translateBatch = async (texts, targetLang) => {
43
+ try {
44
+ const protectedTexts = texts.map(text => protectPlaceholders(text));
45
+ const [translations] = await translate.translate(protectedTexts, { to: targetLang });
46
+ return translations.map((translation, index) => {
47
+ const result = restorePlaceholders(translation);
48
+ console.log(`Translated: "${texts[index]}" -> "${result}" (${targetLang})`);
49
+ return result;
50
+ });
51
+ }
52
+ catch (error) {
53
+ console.error(`Error translating batch to ${targetLang}:`, error);
54
+ return texts;
55
+ }
56
+ };
57
+ const translateObject = async (obj, targetLang, existingTranslations = {}) => {
58
+ const result = {};
59
+ const textsToTranslate = [];
60
+ const keysToTranslate = [];
61
+ for (const [key, value] of Object.entries(obj)) {
62
+ if (typeof value === 'string') {
63
+ if (existingTranslations[key] && existingTranslations[key] === value) {
64
+ result[key] = value;
65
+ console.log(`Skipped (already translated): "${value}" (${targetLang})`);
66
+ }
67
+ else {
68
+ textsToTranslate.push(value);
69
+ keysToTranslate.push(key);
70
+ }
71
+ }
72
+ else if (typeof value === 'object' && value !== null) {
73
+ result[key] = await translateObject(value, targetLang, existingTranslations[key] || {});
74
+ }
75
+ else {
76
+ result[key] = value;
77
+ }
78
+ }
79
+ if (textsToTranslate.length > 0) {
80
+ const translations = await translateBatch(textsToTranslate, targetLang);
81
+ keysToTranslate.forEach((key, index) => {
82
+ result[key] = translations[index];
83
+ });
84
+ }
85
+ return result;
86
+ };
87
+ const findIndexJsonFiles = dir => {
88
+ const results = [];
89
+ const files = fs.readdirSync(dir);
90
+ for (const file of files) {
91
+ const fullPath = path.join(dir, file);
92
+ const stat = fs.statSync(fullPath);
93
+ if (stat.isDirectory()) {
94
+ results.push(...findIndexJsonFiles(fullPath));
95
+ }
96
+ else if (file === 'index.json') {
97
+ results.push({
98
+ path: fullPath,
99
+ folder: path.basename(path.dirname(fullPath)),
100
+ });
101
+ }
102
+ }
103
+ return results;
104
+ };
105
+ const findChanges = (newData, oldData) => {
106
+ const changes = {};
107
+ for (const [key, value] of Object.entries(newData)) {
108
+ if (typeof value === 'string') {
109
+ if (!oldData[key] || oldData[key] !== value) {
110
+ changes[key] = value;
111
+ }
112
+ }
113
+ else if (typeof value === 'object' && value !== null) {
114
+ const subChanges = findChanges(value, oldData[key] || {});
115
+ if (Object.keys(subChanges).length > 0) {
116
+ changes[key] = subChanges;
117
+ }
118
+ }
119
+ }
120
+ return changes;
121
+ };
122
+ const main = async () => {
123
+ try {
124
+ const srcDir = path.join(__dirname, '..');
125
+ const localesDir = path.join(srcDir, 'locales');
126
+ if (!fs.existsSync(localesDir)) {
127
+ fs.mkdirSync(localesDir, { recursive: true });
128
+ }
129
+ const indexFiles = findIndexJsonFiles(srcDir);
130
+ let totalWords = 0;
131
+ const translations = {};
132
+ const changes = {};
133
+ // Đọc dữ liệu cũ từ origin.json nếu có
134
+ let originData = {};
135
+ const originPath = path.join(localesDir, 'origin.json');
136
+ if (fs.existsSync(originPath)) {
137
+ try {
138
+ const originContent = JSON.parse(fs.readFileSync(originPath, 'utf8'));
139
+ originData = originContent.translation || {};
140
+ }
141
+ catch (error) {
142
+ console.error('Error reading origin.json:', error);
143
+ }
144
+ }
145
+ for (const { path: filePath, folder } of indexFiles) {
146
+ const content = JSON.parse(fs.readFileSync(filePath, 'utf8'));
147
+ translations[folder] = content;
148
+ const folderChanges = findChanges(content, originData[folder] || {});
149
+ if (Object.keys(folderChanges).length > 0) {
150
+ changes[folder] = folderChanges;
151
+ const wordCount = JSON.stringify(folderChanges).split(/\s+/).length;
152
+ totalWords += wordCount;
153
+ }
154
+ }
155
+ console.log(`Total words to translate: ${totalWords}`);
156
+ console.log(`Estimated cost: $${(totalWords * 0.00002).toFixed(2)}`);
157
+ if (totalWords === 0) {
158
+ console.log('No changes detected. No translation needed.');
159
+ rl.close();
160
+ return;
161
+ }
162
+ const proceed = await question('Do you want to proceed with translation? (y/n): ');
163
+ if (proceed.toLowerCase() !== 'y') {
164
+ console.log('Translation cancelled');
165
+ rl.close();
166
+ return;
167
+ }
168
+ const pathTranslate = path.join(localesDir, 'en.json');
169
+ const pathOrigin = path.join(localesDir, 'origin.json');
170
+ fs.writeFileSync(pathTranslate, JSON.stringify({ translation: translations }, null, 2));
171
+ fs.writeFileSync(pathOrigin, JSON.stringify({ translation: translations }, null, 2));
172
+ for (const lang of languages) {
173
+ const targetLang = lang.code === 'pt-BR' ? 'pt' : lang.code;
174
+ console.log(`\nProcessing ${lang.name} (${targetLang})...`);
175
+ const outputPath = path.join(localesDir, `${targetLang}.json`);
176
+ let existingTranslations = {};
177
+ if (fs.existsSync(outputPath)) {
178
+ try {
179
+ const existingContent = JSON.parse(fs.readFileSync(outputPath, 'utf8'));
180
+ existingTranslations = existingContent.translation || {};
181
+ }
182
+ catch (error) {
183
+ console.error(`Error reading existing translations for ${targetLang}:`, error);
184
+ }
185
+ }
186
+ const translatedData = {};
187
+ for (const [folder, content] of Object.entries(translations)) {
188
+ if (changes[folder]) {
189
+ const folderChanges = changes[folder];
190
+ const existingFolderData = existingTranslations[folder] || {};
191
+ const translatedChanges = await translateObject(folderChanges, targetLang, existingFolderData);
192
+ translatedData[folder] = {
193
+ ...existingFolderData,
194
+ ...translatedChanges,
195
+ };
196
+ }
197
+ else {
198
+ translatedData[folder] = existingTranslations[folder] || content;
199
+ }
200
+ }
201
+ fs.writeFileSync(outputPath, JSON.stringify({ translation: translatedData }, null, 2));
202
+ console.log(`\nCompleted ${lang.name} translation`);
203
+ }
204
+ // Create/update index.ts file
205
+ const indexTsContent = `import en from './en.json';
206
+ import nl from './nl.json';
207
+ import zhCN from './zh-CN.json';
208
+ import vi from './vi.json';
209
+ import pt from './pt.json';
210
+ import sv from './sv.json';
211
+ import fr from './fr.json';
212
+ import de from './de.json';
213
+ import es from './es.json';
214
+ import da from './da.json';
215
+
216
+ export const translations = {
217
+ en,
218
+ nl,
219
+ 'zh-CN': zhCN,
220
+ vi,
221
+ 'pt-BR': pt,
222
+ sv,
223
+ fr,
224
+ de,
225
+ es,
226
+ da,
227
+ };
228
+ `;
229
+ fs.writeFileSync(path.join(localesDir, 'index.ts'), indexTsContent);
230
+ console.log('\nUpdated index.ts file');
231
+ console.log('\nTranslation completed successfully!');
232
+ rl.close();
233
+ }
234
+ catch (error) {
235
+ console.error('Error:', error);
236
+ rl.close();
237
+ }
238
+ };
239
+ main();
240
+ //# sourceMappingURL=autoTranslate.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTranslate.cjs","sourceRoot":"","sources":["../../src/commands/autoTranslate.cjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=autoTranslate.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoTranslate.d.cts","sourceRoot":"","sources":["../../src/commands/autoTranslate.cjs"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import './index.scss';
2
+ import { CrossAppBannerComponent } from './types';
3
+ export declare const CrossAppBanner: CrossAppBannerComponent;
4
+ export default CrossAppBanner;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CrossAppBanner/index.tsx"],"names":[],"mappings":"AAIA,OAAO,cAAc,CAAC;AAWtB,OAAO,EAKL,uBAAuB,EAExB,MAAM,SAAS,CAAC;AA8CjB,eAAO,MAAM,cAAc,EAAE,uBA4M5B,CAAC;AACF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AppProvider, Button, LegacyCard, Text, Thumbnail } from '@shopify/polaris';
3
+ import { useEffect, useState } from 'react';
4
+ import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query';
5
+ import './index.scss';
6
+ import { listCrossApps } from '../../config/constants';
7
+ import { getAppIdByOrigin, getCheckInstalledProxyUrl, getProxyAccessToken, } from '../../helpers/getProxyEndPoint';
8
+ import { XIcon } from '@shopify/polaris-icons';
9
+ import { isEmpty } from 'lodash';
10
+ import { APP_IDS, } from './types';
11
+ /**
12
+ * CrossAppBanner Component
13
+ *
14
+ * A banner component that displays promotional content for other Avada apps.
15
+ * It checks the installation status of specified apps and shows the first non-installed app.
16
+ * Each app can be dismissed independently.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * // Basic usage
21
+ * <CrossAppBanner
22
+ * shopDomain="your-store.myshopify.com"
23
+ * />
24
+ *
25
+ * // With custom callbacks
26
+ * <CrossAppBanner
27
+ * shopDomain="your-store.myshopify.com"
28
+ * clickInstallCallback={() => console.log('Install clicked')}
29
+ * />
30
+ *
31
+ * // With specific apps to check
32
+ * <CrossAppBanner
33
+ * shopDomain="your-store.myshopify.com"
34
+ * appIds={['avada-seo-suite', 'ai-product-copy']}
35
+ * />
36
+ * ```
37
+ *
38
+ * @param props - Component props
39
+ * @param props.shopDomain - The shop domain to check app installation status
40
+ * @param props.clickInstallCallback - Callback function when user clicks install button
41
+ * @param props.appIds - List of app IDs to check in priority order, current support 'avada-seo-suite', 'seoon-blog', 'ai-product-copy', 'ap-speed-optimizer'
42
+ * @returns JSX.Element | null
43
+ */
44
+ const defaultQueryClient = new QueryClient({
45
+ defaultOptions: {
46
+ queries: {
47
+ staleTime: 25 * 60 * 1000,
48
+ gcTime: 30 * 60 * 1000,
49
+ retry: 2,
50
+ refetchOnWindowFocus: false,
51
+ },
52
+ },
53
+ });
54
+ export const CrossAppBanner = ({ shopDomain, clickInstallCallback, appIds = ['avada-seo-suite', 'seoon-blog', 'ai-product-copy', 'ap-speed-optimizer'], }) => {
55
+ const [isBannerDismissed, setIsBannerDismissed] = useState(false);
56
+ const [dismissedApps, setDismissedApps] = useState({
57
+ 'avada-seo-suite': false,
58
+ 'seoon-blog': false,
59
+ 'ai-product-copy': false,
60
+ 'ap-speed-optimizer': false,
61
+ });
62
+ const [currentPriorityIndex, setCurrentPriorityIndex] = useState(0);
63
+ const [installedApps, setInstalledApps] = useState({
64
+ seo: false,
65
+ blog: false,
66
+ aiCopy: false,
67
+ plaza: false,
68
+ });
69
+ const [foundNonInstalledApp, setFoundNonInstalledApp] = useState(false);
70
+ const getCurrentPagePath = () => {
71
+ const url = window.location.href;
72
+ const pathMatch = url.match(/https?:\/\/[^/]+(\/[^?]+)/);
73
+ return pathMatch ? pathMatch[1] : '';
74
+ };
75
+ const getStorageKey = (appId) => {
76
+ const pagePath = getCurrentPagePath();
77
+ const appOriginId = getAppIdByOrigin(window.location.origin);
78
+ return `cross-app-banner-dismissed-${appOriginId}-${pagePath}-${appId}`;
79
+ };
80
+ // Load dismissed apps from localStorage
81
+ useEffect(() => {
82
+ const loadDismissedApps = () => {
83
+ const dismissed = {
84
+ 'avada-seo-suite': false,
85
+ 'seoon-blog': false,
86
+ 'ai-product-copy': false,
87
+ 'ap-speed-optimizer': false,
88
+ };
89
+ appIds.forEach(appId => {
90
+ const storedDismissed = localStorage.getItem(getStorageKey(appId));
91
+ if (storedDismissed === 'true') {
92
+ dismissed[appId] = true;
93
+ }
94
+ });
95
+ setDismissedApps(dismissed);
96
+ };
97
+ loadDismissedApps();
98
+ }, [appIds]);
99
+ // Get current app to check based on priority
100
+ const currentAppId = appIds[currentPriorityIndex];
101
+ const shouldCheckCurrentApp = currentAppId && !foundNonInstalledApp;
102
+ // API call function
103
+ const fetchAppInstallationStatus = async (appId) => {
104
+ const response = await fetch(getCheckInstalledProxyUrl(appId), {
105
+ headers: {
106
+ 'X-SEO-Access-Token': getProxyAccessToken(appId),
107
+ 'X-SEO-Shop-Domain': shopDomain,
108
+ },
109
+ });
110
+ if (!response.ok)
111
+ throw new Error('Failed to fetch app installation status');
112
+ const data = await response.json();
113
+ return {
114
+ ...data,
115
+ appId,
116
+ };
117
+ };
118
+ const { data, isLoading: loading, refetch: fetchApi, } = useQuery({
119
+ queryKey: ['appInstallation', currentAppId, shopDomain],
120
+ queryFn: () => fetchAppInstallationStatus(currentAppId),
121
+ enabled: false,
122
+ staleTime: 25 * 60 * 1000,
123
+ gcTime: 30 * 60 * 1000,
124
+ retry: 2,
125
+ refetchOnWindowFocus: false,
126
+ });
127
+ // Effect to check app installation
128
+ useEffect(() => {
129
+ if (shouldCheckCurrentApp) {
130
+ const isDismissed = localStorage.getItem(getStorageKey(currentAppId)) === 'true';
131
+ if (!isDismissed) {
132
+ fetchApi();
133
+ }
134
+ else {
135
+ // If app is dismissed, move to next app
136
+ setCurrentPriorityIndex(prev => prev + 1);
137
+ }
138
+ }
139
+ }, [currentAppId, shouldCheckCurrentApp]);
140
+ // Effect to handle installation check result
141
+ useEffect(() => {
142
+ if (!isEmpty(data) && data.appId === currentAppId && shouldCheckCurrentApp) {
143
+ const newInstalledApps = { ...installedApps };
144
+ const isInstalled = currentAppId === 'avada-seo-suite' || currentAppId === 'seoon-blog'
145
+ ? data.userType === 'user'
146
+ : !!data.isInstalled;
147
+ newInstalledApps[APP_IDS[currentAppId]] = isInstalled;
148
+ setInstalledApps(newInstalledApps);
149
+ if (isInstalled) {
150
+ setCurrentPriorityIndex(prev => prev + 1);
151
+ }
152
+ else {
153
+ setFoundNonInstalledApp(true);
154
+ }
155
+ }
156
+ }, [data, currentAppId, shouldCheckCurrentApp]);
157
+ const handleDismiss = (appId) => {
158
+ localStorage.setItem(getStorageKey(appId), 'true');
159
+ setIsBannerDismissed(true);
160
+ };
161
+ const checking = loading;
162
+ // Find first non-installed app based on priority
163
+ const getFirstNonInstalledApp = () => {
164
+ if (isBannerDismissed)
165
+ return null;
166
+ if (appIds.length > 0) {
167
+ const priorityApp = appIds.find(appKey => {
168
+ const key = appKey;
169
+ return !installedApps[APP_IDS[key]] && !dismissedApps[key];
170
+ });
171
+ if (priorityApp) {
172
+ return listCrossApps.find(app => APP_IDS[priorityApp] === app.key);
173
+ }
174
+ }
175
+ // If no priority apps or all priority apps are installed, find first non-installed app from listCrossApps
176
+ return listCrossApps.find(app => {
177
+ const appId = Object.entries(APP_IDS).find(([_, value]) => value === app.key)?.[0];
178
+ return (!installedApps[app.key] && !dismissedApps[appId] && appIds.includes(appId));
179
+ });
180
+ };
181
+ const appToShow = getFirstNonInstalledApp();
182
+ if (checking || !appToShow || isBannerDismissed || isEmpty(data))
183
+ return null;
184
+ const currentAppIdToShow = Object.entries(APP_IDS).find(([_, value]) => value === appToShow.key)?.[0];
185
+ return (_jsx(AppProvider, { i18n: {}, children: _jsx(QueryClientProvider, { client: defaultQueryClient, children: _jsx(LegacyCard, { sectioned: true, children: _jsxs("div", { className: 'AC-CrossAppBanner', children: [_jsx("div", { className: 'AC-CrossAppBanner__Thumbnail', children: _jsx(Thumbnail, { size: "small", source: appToShow.image, alt: '' }) }), _jsxs("div", { className: 'AC-CrossAppBanner__Content', children: [_jsx(Text, { variant: "headingMd", as: "strong", children: appToShow.title }), _jsx("br", {}), appToShow.description] }), _jsx("div", { className: 'AC-CrossAppBanner__Install', children: _jsx(Button, { onClick: () => {
186
+ window.open(appToShow.url);
187
+ if (clickInstallCallback)
188
+ clickInstallCallback();
189
+ }, children: appToShow.actionLabel }) }), _jsx("div", { className: 'AC-CrossAppBanner__Close', children: _jsx(Button, { icon: XIcon, variant: "tertiary", onClick: () => handleDismiss(currentAppIdToShow) }) })] }) }) }) }));
190
+ };
191
+ export default CrossAppBanner;
192
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/CrossAppBanner/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ .AC-CrossAppBanner {
2
+ position: relative;
3
+ display: flex;
4
+ gap: 16px;
5
+ align-items: center;
6
+
7
+ &.audit {
8
+ .AC-CrossAppBanner__Thumbnail {
9
+ max-width: 50px;
10
+ }
11
+
12
+ .AC-CrossAppBanner__Close {
13
+ right: -2px;
14
+ top: -2px;
15
+ }
16
+
17
+ .AC-CrossAppBanner__Install {
18
+ min-width: 150px;
19
+ }
20
+ }
21
+
22
+ .AC-CrossAppBanner__Thumbnail {
23
+ max-width: 70px;
24
+ border-radius: 8px;
25
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.25);
26
+ overflow: hidden;
27
+ }
28
+
29
+ .AC-CrossAppBanner__Content {
30
+ flex: 1;
31
+ vertical-align: center;
32
+ }
33
+
34
+ .AC-CrossAppBanner__Install {
35
+ min-width: 120px;
36
+ }
37
+
38
+ .AC-CrossAppBanner__Close {
39
+ position: absolute;
40
+ right: -6px;
41
+ top: -6px;
42
+ }
43
+
44
+ @media screen and (max-width: 425px) {
45
+ flex-direction: column;
46
+ }
47
+ }