Global UI Culture Mapper & Code Generator

Crypto QR Code

`, "navigation": (langs) => ` `, "success-message": (langs) => `
`, "alert": (langs) => `
`, }; // Event Listeners elements.languageSwitcher.addEventListener('change', (e) => setLanguage(e.target.value)); elements.mapCultureButton.addEventListener('click', () => { if (!isUnlocked && actionCount >= MAX_FREE_USES) { showPaymentOverlay(); return; } const selectedRegions = Array.from(elements.regionSelect.selectedOptions).map(option => option.value); if (selectedRegions.length === 0) { elements.culturalInsightsContent.textContent = "Please select at least one region."; elements.culturalInsights.classList.remove('hidden'); return; } let insights = selectedRegions.map(region => { const data = culturalData[region]; return data ? `--- ${region.replace('-', ' ').toUpperCase()} ---\nUX Patterns: ${data.patterns}\nFormats: ${data.formats}\nColor Psychology: ${data.colors}` : ''; }).filter(Boolean).join('\n\n'); elements.culturalInsightsContent.textContent = insights || "No data available for selected regions."; elements.culturalInsights.classList.remove('hidden'); incrementActionCount(); }); elements.generateCodeButton.addEventListener('click', () => { if (!isUnlocked && actionCount >= MAX_FREE_USES) { showPaymentOverlay(); return; } const componentType = elements.componentTypeSelect.value; const languageCodes = elements.languageCodesInput.value.split(',').map(lang => lang.trim()).filter(Boolean); if (!languageCodes.length) { elements.generatedCodeContent.textContent = "Please enter at least one language code (e.g., en)."; elements.generatedCode.classList.remove('hidden'); return; } const generatorFn = codeSnippets[componentType]; if (generatorFn) { const code = generatorFn(languageCodes); elements.generatedCodeContent.textContent = code; elements.generatedCode.classList.remove('hidden'); elements.sendToWhatsappButton.classList.remove('hidden'); incrementActionCount(); } else { elements.generatedCodeContent.textContent = "Code generation not available for this component type."; elements.generatedCode.classList.remove('hidden'); elements.sendToWhatsappButton.classList.add('hidden'); } }); elements.sendToWhatsappButton.addEventListener('click', () => { const selectedRegions = Array.from(elements.regionSelect.selectedOptions).map(option => option.value).join(', ') || 'N/A'; const componentType = elements.componentTypeSelect.value; const languageCodes = elements.languageCodesInput.value.split(',').map(lang => lang.trim()).filter(Boolean).join(', ') || 'N/A'; const generatedCode = elements.generatedCodeContent.textContent; const whatsappMessage = `Hello Karel, I'd like to get the culturally-tailored UI code. Here are the details:\n\n` + `Widget ID: ${WIDGET_SLUG}\n` + `Target Regions: ${selectedRegions}\n` + `Component Type: ${componentType}\n` + `Target Languages: ${languageCodes}\n\n` + `Generated Code Preview (full code is attached):\n\n` + `\`\`\`html\n${generatedCode.substring(0, 500)}...\n\`\`\`\n\n` + `Please provide the complete code and further assistance.`; const whatsappUrl = `https://wa.me/${WHATSAPP_NUMBER}?text=${encodeURIComponent(whatsappMessage)}`; window.open(whatsappUrl, '_blank'); }); elements.hubUnlockButton.addEventListener('click', handleHubSubscription); elements.oneTimeUnlockButton.addEventListener('click', handleOneTimeUnlock); elements.cryptoUnlockButton.addEventListener('click', handleCryptoUnlock); elements.copyCryptoAddressBtn.addEventListener('click', () => copyToClipboard('crypto-wallet-address')); elements.closeLoginModal.addEventListener('click', hideLoginModal); elements.authSubmitButton.addEventListener('click', handleAuthSubmit); elements.googleSigninButton.addEventListener('click', handleGoogleSignIn); elements.toggleAuthMode.addEventListener('click', () => { isLoginMode = !isLoginMode; updateLoginModalTexts(); hideMessage(elements.authMessage); }); // Initial setup on DOMContentLoaded document.addEventListener('DOMContentLoaded', async () => { elements.languageSwitcher.value = currentLang; // Set default to EN setLanguage(currentLang); updateActionLimitMessage(); // Check if widget is already unlocked via localStorage if (isUnlocked) { hidePaymentOverlay(); hideMessage(elements.actionLimitMessage); console.log("Widget already unlocked via localStorage."); } else { // Attach auth state listener auth.onAuthStateChanged(async user => { currentUser = user; updateHubButtonState(); // Update text of Hub button if (user) { console.log("User logged in:", user.email); // Check subscription if user is logged in const hasSubscription = await checkSubscription(user.email); if (!hasSubscription) { console.log("User logged in but no active subscription for Hub. Applying client limit."); if (actionCount >= MAX_FREE_USES) showPaymentOverlay(); } } else { console.log("User not logged in. Applying client limit."); if (actionCount >= MAX_FREE_USES) showPaymentOverlay(); } // After auth state is known, handle potential Stripe redirects await handleStripeVerification(); }); } });