@tagadapay/plugin-sdk 2.4.32 → 2.4.35

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.
@@ -1,5 +1,33 @@
1
1
  export declare const AVAILABLE_LANGUAGES: readonly ["en", "ru", "de", "fr", "es", "zh", "hi", "pt", "ja", "ar", "it", "he"];
2
2
  export type SupportedLanguage = typeof AVAILABLE_LANGUAGES[number];
3
+ /**
4
+ * Register a language database for use
5
+ * @param language - Language code
6
+ * @param database - The language database from iso3166-2-db
7
+ * @example
8
+ * import ruDatabase from 'iso3166-2-db/i18n/dispute/UN/ru';
9
+ * registerLanguage('ru', ruDatabase);
10
+ */
11
+ export declare function registerLanguage(language: SupportedLanguage, database: any): void;
12
+ /**
13
+ * Check if a language is registered
14
+ * @param language - Language code to check
15
+ * @returns true if the language is registered
16
+ */
17
+ export declare function isLanguageRegistered(language: SupportedLanguage): boolean;
18
+ /**
19
+ * Get list of registered languages
20
+ * @returns Array of registered language codes
21
+ */
22
+ export declare function getRegisteredLanguages(): SupportedLanguage[];
23
+ /**
24
+ * Dynamically import and register a language
25
+ * @param language - Language code to import
26
+ * @returns Promise that resolves when language is registered
27
+ * @example
28
+ * await importLanguage('ru');
29
+ */
30
+ export declare function importLanguage(language: SupportedLanguage): Promise<void>;
3
31
  export interface Country {
4
32
  code: string;
5
33
  name: string;
@@ -1,63 +1,128 @@
1
- // Import static language databases for better browser compatibility
2
- // All supported languages from iso3166-2-db package
1
+ // Modular language database system - import only what you need
2
+ // English is imported by default as fallback
3
3
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
4
4
  // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
5
5
  import enDatabase from 'iso3166-2-db/i18n/dispute/UN/en';
6
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
7
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
8
- import ruDatabase from 'iso3166-2-db/i18n/dispute/UN/ru';
9
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
11
- import deDatabase from 'iso3166-2-db/i18n/dispute/UN/de';
12
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
13
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
14
- import frDatabase from 'iso3166-2-db/i18n/dispute/UN/fr';
15
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
16
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
17
- import esDatabase from 'iso3166-2-db/i18n/dispute/UN/es';
18
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
19
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
20
- import zhDatabase from 'iso3166-2-db/i18n/dispute/UN/zh';
21
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
22
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
23
- import hiDatabase from 'iso3166-2-db/i18n/dispute/UN/hi';
24
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
26
- import ptDatabase from 'iso3166-2-db/i18n/dispute/UN/pt';
27
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
28
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
29
- import jaDatabase from 'iso3166-2-db/i18n/dispute/UN/ja';
30
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
31
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
32
- import arDatabase from 'iso3166-2-db/i18n/dispute/UN/ar';
33
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
34
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
35
- import itDatabase from 'iso3166-2-db/i18n/dispute/UN/it';
36
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
37
- // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
38
- import heDatabase from 'iso3166-2-db/i18n/dispute/UN/he';
39
6
  // All available languages from iso3166-2-db package
40
7
  export const AVAILABLE_LANGUAGES = ['en', 'ru', 'de', 'fr', 'es', 'zh', 'hi', 'pt', 'ja', 'ar', 'it', 'he'];
41
- // Static language database mapping for all supported languages
8
+ // Dynamic language database registry - starts with English only
42
9
  const languageDatabases = {
43
- en: enDatabase, // English
44
- ru: ruDatabase, // Russian
45
- de: deDatabase, // German
46
- fr: frDatabase, // French
47
- es: esDatabase, // Spanish
48
- zh: zhDatabase, // Chinese
49
- hi: hiDatabase, // Hindi
50
- pt: ptDatabase, // Portuguese
51
- ja: jaDatabase, // Japanese
52
- ar: arDatabase, // Arabic
53
- it: itDatabase, // Italian
54
- he: heDatabase, // Hebrew
10
+ en: enDatabase, // English (always available)
55
11
  };
12
+ /**
13
+ * Register a language database for use
14
+ * @param language - Language code
15
+ * @param database - The language database from iso3166-2-db
16
+ * @example
17
+ * import ruDatabase from 'iso3166-2-db/i18n/dispute/UN/ru';
18
+ * registerLanguage('ru', ruDatabase);
19
+ */
20
+ export function registerLanguage(language, database) {
21
+ if (!AVAILABLE_LANGUAGES.includes(language)) {
22
+ console.warn(`Language ${language} is not supported. Available languages: ${AVAILABLE_LANGUAGES.join(', ')}`);
23
+ return;
24
+ }
25
+ languageDatabases[language] = database;
26
+ }
27
+ /**
28
+ * Check if a language is registered
29
+ * @param language - Language code to check
30
+ * @returns true if the language is registered
31
+ */
32
+ export function isLanguageRegistered(language) {
33
+ return language in languageDatabases;
34
+ }
35
+ /**
36
+ * Get list of registered languages
37
+ * @returns Array of registered language codes
38
+ */
39
+ export function getRegisteredLanguages() {
40
+ return Object.keys(languageDatabases);
41
+ }
42
+ /**
43
+ * Dynamically import and register a language
44
+ * @param language - Language code to import
45
+ * @returns Promise that resolves when language is registered
46
+ * @example
47
+ * await importLanguage('ru');
48
+ */
49
+ export async function importLanguage(language) {
50
+ if (isLanguageRegistered(language)) {
51
+ return; // Already registered
52
+ }
53
+ try {
54
+ let database;
55
+ switch (language) {
56
+ case 'ru':
57
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
58
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
59
+ database = (await import('iso3166-2-db/i18n/dispute/UN/ru')).default;
60
+ break;
61
+ case 'de':
62
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
63
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
64
+ database = (await import('iso3166-2-db/i18n/dispute/UN/de')).default;
65
+ break;
66
+ case 'fr':
67
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
68
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
69
+ database = (await import('iso3166-2-db/i18n/dispute/UN/fr')).default;
70
+ break;
71
+ case 'es':
72
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
73
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
74
+ database = (await import('iso3166-2-db/i18n/dispute/UN/es')).default;
75
+ break;
76
+ case 'zh':
77
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
78
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
79
+ database = (await import('iso3166-2-db/i18n/dispute/UN/zh')).default;
80
+ break;
81
+ case 'hi':
82
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
83
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
84
+ database = (await import('iso3166-2-db/i18n/dispute/UN/hi')).default;
85
+ break;
86
+ case 'pt':
87
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
88
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
89
+ database = (await import('iso3166-2-db/i18n/dispute/UN/pt')).default;
90
+ break;
91
+ case 'ja':
92
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
93
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
94
+ database = (await import('iso3166-2-db/i18n/dispute/UN/ja')).default;
95
+ break;
96
+ case 'ar':
97
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
98
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
99
+ database = (await import('iso3166-2-db/i18n/dispute/UN/ar')).default;
100
+ break;
101
+ case 'it':
102
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
103
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
104
+ database = (await import('iso3166-2-db/i18n/dispute/UN/it')).default;
105
+ break;
106
+ case 'he':
107
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
108
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
109
+ database = (await import('iso3166-2-db/i18n/dispute/UN/he')).default;
110
+ break;
111
+ default:
112
+ throw new Error(`Language ${language} is not supported`);
113
+ }
114
+ registerLanguage(language, database);
115
+ }
116
+ catch (error) {
117
+ console.error(`Failed to import language ${language}:`, error);
118
+ throw new Error(`Failed to import language ${language}`);
119
+ }
120
+ }
56
121
  // Function to get language-specific database
57
122
  function getWorldDatabase(language = 'en') {
58
123
  const database = languageDatabases[language];
59
124
  if (!database) {
60
- console.warn(`Language ${language} not available, falling back to English`);
125
+ console.warn(`Language ${language} not available, falling back to English. Use importLanguage('${language}') to load it.`);
61
126
  return languageDatabases.en;
62
127
  }
63
128
  return database;
@@ -0,0 +1,79 @@
1
+ import type { SupportedLanguage } from './iso3166';
2
+ /**
3
+ * Import and register Russian language data
4
+ * @example
5
+ * import { importRussian } from '@tagadapay/plugin-sdk/data/languages';
6
+ * await importRussian();
7
+ */
8
+ export declare function importRussian(): Promise<void>;
9
+ /**
10
+ * Import and register German language data
11
+ */
12
+ export declare function importGerman(): Promise<void>;
13
+ /**
14
+ * Import and register French language data
15
+ */
16
+ export declare function importFrench(): Promise<void>;
17
+ /**
18
+ * Import and register Spanish language data
19
+ */
20
+ export declare function importSpanish(): Promise<void>;
21
+ /**
22
+ * Import and register Chinese language data
23
+ */
24
+ export declare function importChinese(): Promise<void>;
25
+ /**
26
+ * Import and register Hindi language data
27
+ */
28
+ export declare function importHindi(): Promise<void>;
29
+ /**
30
+ * Import and register Portuguese language data
31
+ */
32
+ export declare function importPortuguese(): Promise<void>;
33
+ /**
34
+ * Import and register Japanese language data
35
+ */
36
+ export declare function importJapanese(): Promise<void>;
37
+ /**
38
+ * Import and register Arabic language data
39
+ */
40
+ export declare function importArabic(): Promise<void>;
41
+ /**
42
+ * Import and register Italian language data
43
+ */
44
+ export declare function importItalian(): Promise<void>;
45
+ /**
46
+ * Import and register Hebrew language data
47
+ */
48
+ export declare function importHebrew(): Promise<void>;
49
+ /**
50
+ * Language import functions mapping
51
+ */
52
+ export declare const languageImports: {
53
+ readonly ru: typeof importRussian;
54
+ readonly de: typeof importGerman;
55
+ readonly fr: typeof importFrench;
56
+ readonly es: typeof importSpanish;
57
+ readonly zh: typeof importChinese;
58
+ readonly hi: typeof importHindi;
59
+ readonly pt: typeof importPortuguese;
60
+ readonly ja: typeof importJapanese;
61
+ readonly ar: typeof importArabic;
62
+ readonly it: typeof importItalian;
63
+ readonly he: typeof importHebrew;
64
+ };
65
+ /**
66
+ * Import multiple languages at once
67
+ * @param languages - Array of language codes to import
68
+ * @example
69
+ * import { importLanguages } from '@tagadapay/plugin-sdk/data/languages';
70
+ * await importLanguages(['ru', 'de', 'fr']);
71
+ */
72
+ export declare function importLanguages(languages: SupportedLanguage[]): Promise<void>;
73
+ /**
74
+ * Import all available languages (except English which is already imported)
75
+ * @example
76
+ * import { importAllLanguages } from '@tagadapay/plugin-sdk/data/languages';
77
+ * await importAllLanguages();
78
+ */
79
+ export declare function importAllLanguages(): Promise<void>;
@@ -0,0 +1,151 @@
1
+ // Language import utilities for modular ISO data loading
2
+ // This file provides convenient functions to import specific languages
3
+ import { registerLanguage } from './iso3166';
4
+ /**
5
+ * Import and register Russian language data
6
+ * @example
7
+ * import { importRussian } from '@tagadapay/plugin-sdk/data/languages';
8
+ * await importRussian();
9
+ */
10
+ export async function importRussian() {
11
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
12
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
13
+ const ruDatabase = (await import('iso3166-2-db/i18n/dispute/UN/ru')).default;
14
+ registerLanguage('ru', ruDatabase);
15
+ }
16
+ /**
17
+ * Import and register German language data
18
+ */
19
+ export async function importGerman() {
20
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
21
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
22
+ const deDatabase = (await import('iso3166-2-db/i18n/dispute/UN/de')).default;
23
+ registerLanguage('de', deDatabase);
24
+ }
25
+ /**
26
+ * Import and register French language data
27
+ */
28
+ export async function importFrench() {
29
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
30
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
31
+ const frDatabase = (await import('iso3166-2-db/i18n/dispute/UN/fr')).default;
32
+ registerLanguage('fr', frDatabase);
33
+ }
34
+ /**
35
+ * Import and register Spanish language data
36
+ */
37
+ export async function importSpanish() {
38
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
39
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
40
+ const esDatabase = (await import('iso3166-2-db/i18n/dispute/UN/es')).default;
41
+ registerLanguage('es', esDatabase);
42
+ }
43
+ /**
44
+ * Import and register Chinese language data
45
+ */
46
+ export async function importChinese() {
47
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
48
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
49
+ const zhDatabase = (await import('iso3166-2-db/i18n/dispute/UN/zh')).default;
50
+ registerLanguage('zh', zhDatabase);
51
+ }
52
+ /**
53
+ * Import and register Hindi language data
54
+ */
55
+ export async function importHindi() {
56
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
57
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
58
+ const hiDatabase = (await import('iso3166-2-db/i18n/dispute/UN/hi')).default;
59
+ registerLanguage('hi', hiDatabase);
60
+ }
61
+ /**
62
+ * Import and register Portuguese language data
63
+ */
64
+ export async function importPortuguese() {
65
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
66
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
67
+ const ptDatabase = (await import('iso3166-2-db/i18n/dispute/UN/pt')).default;
68
+ registerLanguage('pt', ptDatabase);
69
+ }
70
+ /**
71
+ * Import and register Japanese language data
72
+ */
73
+ export async function importJapanese() {
74
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
75
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
76
+ const jaDatabase = (await import('iso3166-2-db/i18n/dispute/UN/ja')).default;
77
+ registerLanguage('ja', jaDatabase);
78
+ }
79
+ /**
80
+ * Import and register Arabic language data
81
+ */
82
+ export async function importArabic() {
83
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
84
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
85
+ const arDatabase = (await import('iso3166-2-db/i18n/dispute/UN/ar')).default;
86
+ registerLanguage('ar', arDatabase);
87
+ }
88
+ /**
89
+ * Import and register Italian language data
90
+ */
91
+ export async function importItalian() {
92
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
93
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
94
+ const itDatabase = (await import('iso3166-2-db/i18n/dispute/UN/it')).default;
95
+ registerLanguage('it', itDatabase);
96
+ }
97
+ /**
98
+ * Import and register Hebrew language data
99
+ */
100
+ export async function importHebrew() {
101
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
102
+ // @ts-ignore - iso3166-2-db doesn't have TypeScript definitions
103
+ const heDatabase = (await import('iso3166-2-db/i18n/dispute/UN/he')).default;
104
+ registerLanguage('he', heDatabase);
105
+ }
106
+ /**
107
+ * Language import functions mapping
108
+ */
109
+ export const languageImports = {
110
+ ru: importRussian,
111
+ de: importGerman,
112
+ fr: importFrench,
113
+ es: importSpanish,
114
+ zh: importChinese,
115
+ hi: importHindi,
116
+ pt: importPortuguese,
117
+ ja: importJapanese,
118
+ ar: importArabic,
119
+ it: importItalian,
120
+ he: importHebrew,
121
+ };
122
+ /**
123
+ * Import multiple languages at once
124
+ * @param languages - Array of language codes to import
125
+ * @example
126
+ * import { importLanguages } from '@tagadapay/plugin-sdk/data/languages';
127
+ * await importLanguages(['ru', 'de', 'fr']);
128
+ */
129
+ export async function importLanguages(languages) {
130
+ const importPromises = languages
131
+ .filter(lang => lang !== 'en') // English is already imported
132
+ .map(lang => {
133
+ const importFn = languageImports[lang];
134
+ if (!importFn) {
135
+ console.warn(`No import function found for language: ${lang}`);
136
+ return Promise.resolve();
137
+ }
138
+ return importFn();
139
+ });
140
+ await Promise.all(importPromises);
141
+ }
142
+ /**
143
+ * Import all available languages (except English which is already imported)
144
+ * @example
145
+ * import { importAllLanguages } from '@tagadapay/plugin-sdk/data/languages';
146
+ * await importAllLanguages();
147
+ */
148
+ export async function importAllLanguages() {
149
+ const allLanguages = ['ru', 'de', 'fr', 'es', 'zh', 'hi', 'pt', 'ja', 'ar', 'it', 'he'];
150
+ await importLanguages(allLanguages);
151
+ }
package/dist/index.d.ts CHANGED
@@ -12,5 +12,5 @@
12
12
  */
13
13
  export type { Currency, Customer, Environment, EnvironmentConfig, Locale, Order, OrderAddress, OrderItem, OrderSummary, PickupPoint, Session, Store, } from './react/types';
14
14
  export { convertCurrency, formatMoney, formatMoneyWithoutSymbol, formatSimpleMoney, getCurrencyInfo, minorUnitsToMajorUnits, moneyStringOrNumberToMinorUnits, } from './react/utils/money';
15
- export * from './data/countries';
16
15
  export * from './data/iso3166';
16
+ export * from './data/languages';
package/dist/index.js CHANGED
@@ -13,5 +13,5 @@
13
13
  // Export utility functions that don't depend on React
14
14
  export { convertCurrency, formatMoney, formatMoneyWithoutSymbol, formatSimpleMoney, getCurrencyInfo, minorUnitsToMajorUnits, moneyStringOrNumberToMinorUnits, } from './react/utils/money';
15
15
  // Export data utilities
16
- export * from './data/countries';
17
16
  export * from './data/iso3166';
17
+ export * from './data/languages';
@@ -0,0 +1,70 @@
1
+ export interface FunnelEvent {
2
+ type: string;
3
+ data?: any;
4
+ timestamp?: Date;
5
+ }
6
+ export interface FunnelNavigationAction {
7
+ type: 'redirect' | 'replace' | 'push' | 'external' | 'none';
8
+ url?: string;
9
+ data?: any;
10
+ }
11
+ export interface FunnelNavigationResult {
12
+ stepId: string;
13
+ action: FunnelNavigationAction;
14
+ context: SimpleFunnelContext;
15
+ tracking?: {
16
+ from: string;
17
+ to: string;
18
+ event: string;
19
+ timestamp: string;
20
+ };
21
+ }
22
+ export interface SimpleFunnelContext {
23
+ customerId: string;
24
+ storeId: string;
25
+ sessionId: string;
26
+ funnelId: string;
27
+ currentStepId: string;
28
+ previousStepId?: string;
29
+ startedAt: number;
30
+ lastActivityAt: number;
31
+ metadata?: Record<string, any>;
32
+ }
33
+ export interface UseFunnelOptions {
34
+ funnelId?: string;
35
+ currentStepId?: string;
36
+ onNavigate?: (result: FunnelNavigationResult) => void | boolean;
37
+ onError?: (error: Error) => void;
38
+ autoInitialize?: boolean;
39
+ }
40
+ export interface UseFunnelResult {
41
+ next: (event: FunnelEvent) => Promise<any>;
42
+ goToStep: (stepId: string) => Promise<any>;
43
+ updateContext: (updates: Partial<SimpleFunnelContext>) => Promise<void>;
44
+ currentStep: {
45
+ id: string;
46
+ };
47
+ context: SimpleFunnelContext | null;
48
+ isLoading: boolean;
49
+ isInitialized: boolean;
50
+ initializeSession: (entryStepId?: string) => Promise<void>;
51
+ endSession: () => Promise<void>;
52
+ retryInitialization: () => Promise<void>;
53
+ initializationError: Error | null;
54
+ }
55
+ /**
56
+ * React Hook for Funnel Navigation (Plugin SDK Version)
57
+ *
58
+ * Simplified funnel navigation using KV storage for funnel sessions.
59
+ * Integrates with TagadaPay authentication and plugin routing.
60
+ */
61
+ export declare function useFunnel(options: UseFunnelOptions): UseFunnelResult;
62
+ /**
63
+ * Simplified funnel hook for basic step tracking
64
+ */
65
+ export declare function useSimpleFunnel(funnelId: string, initialStepId?: string): {
66
+ currentStepId: string;
67
+ next: (event: FunnelEvent) => Promise<any>;
68
+ goToStep: (stepId: string) => Promise<any>;
69
+ isLoading: boolean;
70
+ };