onairos 2.1.13 → 2.2.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.
- package/dist/onairos.bundle.js +1 -1
- package/dist/onairos.bundle.js.map +1 -1
- package/dist/onairos.esm.js +1 -1
- package/dist/onairos.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/components/DataRequest.js +250 -109
- package/src/onairosButton.jsx +1 -0
- package/test-enhanced-data-request.html +271 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onairos.bundle.js","mappings":"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","sources":["webpack://Onairos/webpack/universalModuleDefinition","webpack://Onairos/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"React\",\"root\":\"React\"}","webpack://Onairos/webpack/bootstrap","webpack://Onairos/webpack/runtime/compat get default export","webpack://Onairos/webpack/runtime/define property getters","webpack://Onairos/webpack/runtime/hasOwnProperty shorthand","webpack://Onairos/webpack/runtime/make namespace object","webpack://Onairos/./node_modules/lucide-react/dist/esm/shared/src/utils.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/defaultAttributes.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/Icon.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/createLucideIcon.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/mail.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/arrow-right.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/check.js","webpack://Onairos/./src/components/EmailAuth.js","webpack://Onairos/./src/components/UniversalOnboarding.jsx","webpack://Onairos/./src/components/PinSetup.js","webpack://Onairos/./src/components/DataRequest.js","webpack://Onairos/./src/components/TrainingComponent.jsx","webpack://Onairos/./src/onairosButton.jsx","webpack://Onairos/./src/onairos.jsx"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Onairos\", [\"React\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Onairos\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Onairos\"] = factory(root[\"React\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__639__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__639__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","import React, { useState } from 'react';\r\nimport { Mail, ArrowRight, Check } from 'lucide-react';\r\n\r\nexport default function EmailAuth({ onSuccess, testMode = true }) {\r\n const [email, setEmail] = useState('');\r\n const [code, setCode] = useState('');\r\n const [step, setStep] = useState('email'); // 'email' | 'code' | 'success'\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n\r\n const validateEmail = (email) => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(email);\r\n };\r\n\r\n const handleEmailSubmit = async (e) => {\r\n e.preventDefault();\r\n setError('');\r\n\r\n if (!validateEmail(email)) {\r\n setError('Please enter a valid email address');\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n if (testMode) {\r\n // In test mode, skip email sending and go directly to code step\r\n setTimeout(() => {\r\n setStep('code');\r\n setIsLoading(false);\r\n }, 1000);\r\n } else {\r\n // In production, send actual email\r\n const response = await fetch('https://api2.onairos.uk/email/verify', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Failed to send verification code');\r\n }\r\n\r\n setStep('code');\r\n setIsLoading(false);\r\n }\r\n } catch (error) {\r\n setError(error.message);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleCodeSubmit = async (e) => {\r\n e.preventDefault();\r\n setError('');\r\n\r\n if (testMode && code === '123456') {\r\n // Test mode - accept 123456 as valid code\r\n setStep('success');\r\n setTimeout(() => {\r\n onSuccess({ email, verified: true });\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (!testMode) {\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch('https://api2.onairos.uk/email/verify/confirm', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ email, code }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Invalid verification code');\r\n }\r\n\r\n const data = await response.json();\r\n setStep('success');\r\n setTimeout(() => {\r\n onSuccess({ email, verified: true, token: data.token });\r\n }, 1000);\r\n } catch (error) {\r\n setError(error.message);\r\n setIsLoading(false);\r\n }\r\n } else {\r\n setError('Invalid code. Use 123456 for testing.');\r\n }\r\n };\r\n\r\n const renderEmailStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-blue-100 rounded-full\">\r\n <Mail className=\"w-8 h-8 text-blue-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Sign in to Onairos</h2>\r\n <p className=\"text-gray-600\">Enter your email address to continue</p>\r\n {testMode && (\r\n <p className=\"text-sm text-blue-600 mt-2\">Test mode: Any valid email will work</p>\r\n )}\r\n </div>\r\n\r\n <form onSubmit={handleEmailSubmit} className=\"w-full max-w-md space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 mb-1\">\r\n Email address\r\n </label>\r\n <input\r\n type=\"email\"\r\n id=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n className=\"w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\r\n required\r\n />\r\n </div>\r\n\r\n {error && (\r\n <p className=\"text-sm text-red-600\">{error}</p>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full py-3 px-4 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center\"\r\n >\r\n {isLoading ? (\r\n <div className=\"animate-spin h-5 w-5 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n <>\r\n Continue\r\n <ArrowRight className=\"ml-2 w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n\r\n const renderCodeStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-green-100 rounded-full\">\r\n <Mail className=\"w-8 h-8 text-green-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Check your email</h2>\r\n <p className=\"text-gray-600\">We sent a verification code to</p>\r\n <p className=\"text-gray-900 font-medium\">{email}</p>\r\n {testMode && (\r\n <p className=\"text-sm text-blue-600 mt-2\">Test mode: Use code 123456</p>\r\n )}\r\n </div>\r\n\r\n <form onSubmit={handleCodeSubmit} className=\"w-full max-w-md space-y-4\">\r\n <div>\r\n <label htmlFor=\"code\" className=\"block text-sm font-medium text-gray-700 mb-1\">\r\n Verification code\r\n </label>\r\n <input\r\n type=\"text\"\r\n id=\"code\"\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n placeholder=\"Enter 6-digit code\"\r\n className=\"w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none text-center text-lg tracking-widest\"\r\n maxLength=\"6\"\r\n required\r\n />\r\n </div>\r\n\r\n {error && (\r\n <p className=\"text-sm text-red-600\">{error}</p>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full py-3 px-4 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center\"\r\n >\r\n {isLoading ? (\r\n <div className=\"animate-spin h-5 w-5 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n 'Verify Code'\r\n )}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setStep('email')}\r\n className=\"w-full py-2 px-4 text-gray-600 hover:text-gray-800\"\r\n >\r\n Use a different email\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n\r\n const renderSuccessStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-green-100 rounded-full\">\r\n <Check className=\"w-8 h-8 text-green-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Email verified!</h2>\r\n <p className=\"text-gray-600\">Setting up your account...</p>\r\n </div>\r\n\r\n <div className=\"w-8 h-8\">\r\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"flex flex-col items-center space-y-6 p-6 w-full\">\r\n {step === 'email' && renderEmailStep()}\r\n {step === 'code' && renderCodeStep()}\r\n {step === 'success' && renderSuccessStep()}\r\n </div>\r\n );\r\n} ","import React, { useState, useEffect } from 'react';\r\n\r\nconst platforms = [\r\n { name: 'YouTube', icon: '📺', color: 'bg-red-500', connector: 'youtube' },\r\n { name: 'LinkedIn', icon: '💼', color: 'bg-blue-700', connector: 'linkedin' },\r\n { name: 'Reddit', icon: '🔥', color: 'bg-orange-500', connector: 'reddit' },\r\n { name: 'Pinterest', icon: '📌', color: 'bg-red-600', connector: 'pinterest' },\r\n { name: 'Instagram', icon: '📷', color: 'bg-pink-500', connector: 'instagram' },\r\n { name: 'GitHub', icon: '⚡', color: 'bg-gray-800', connector: 'github' },\r\n { name: 'Facebook', icon: '👥', color: 'bg-blue-600', connector: 'facebook' },\r\n { name: 'Gmail', icon: '✉️', color: 'bg-red-400', connector: 'gmail' }\r\n];\r\n\r\n// Enhanced SDK configuration\r\nconst sdkConfig = {\r\n apiKey: process.env.REACT_APP_ONAIROS_API_KEY || 'onairos_web_sdk_live_key_2024',\r\n baseUrl: process.env.REACT_APP_ONAIROS_BASE_URL || 'https://api2.onairos.uk',\r\n sdkType: 'web', // web, mobile, desktop\r\n enableHealthMonitoring: true,\r\n enableAutoRefresh: true,\r\n enableConnectionValidation: true\r\n};\r\n\r\n/**\r\n * UniversalOnboarding Component - Compact & Enhanced\r\n * Displays a streamlined onboarding screen for data connections\r\n */\r\nexport default function UniversalOnboarding({ onComplete, appIcon, appName = 'App' }) {\r\n const [connectedAccounts, setConnectedAccounts] = useState({});\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n const [connectingPlatform, setConnectingPlatform] = useState(null);\r\n const [connectionErrors, setConnectionErrors] = useState({});\r\n const [connectionHealth, setConnectionHealth] = useState({});\r\n const [healthScore, setHealthScore] = useState(0);\r\n\r\n // Mobile device detection\r\n const isMobileDevice = () => {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||\r\n (window.innerWidth <= 768);\r\n };\r\n\r\n // Handle mobile OAuth return\r\n useEffect(() => {\r\n const handleOAuthReturn = () => {\r\n const platform = localStorage.getItem('onairos_oauth_platform');\r\n if (platform) {\r\n console.log(`📱 OAuth return detected for: ${platform}`);\r\n \r\n // Clear OAuth state\r\n localStorage.removeItem('onairos_oauth_platform');\r\n localStorage.removeItem('onairos_oauth_return');\r\n \r\n // Mark as connected\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platform]: true\r\n }));\r\n \r\n // Clear any errors\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platform]: null\r\n }));\r\n \r\n console.log(`✅ ${platform} marked as connected from OAuth return`);\r\n }\r\n };\r\n\r\n handleOAuthReturn();\r\n }, []);\r\n\r\n const connectToPlatform = async (platformName) => {\r\n console.log(`🚀 connectToPlatform called for: ${platformName}`);\r\n \r\n const platform = platforms.find(p => p.name === platformName);\r\n if (!platform?.connector) {\r\n console.error(`❌ No connector found for platform: ${platformName}`);\r\n return false;\r\n }\r\n\r\n try {\r\n setIsConnecting(true);\r\n setConnectingPlatform(platformName);\r\n \r\n // Clear any previous errors\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n console.log(`🔗 Starting OAuth connection for ${platformName}...`);\r\n \r\n const username = localStorage.getItem('username') || localStorage.getItem('onairosUser')?.email || 'user@example.com';\r\n \r\n // Enhanced authorize endpoint with SDK type\r\n const authorizeUrl = `${sdkConfig.baseUrl}/${platform.connector}/authorize`;\r\n \r\n const response = await fetch(authorizeUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': sdkConfig.apiKey,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n session: {\r\n username: username\r\n }\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const responseData = await response.json();\r\n console.log(`📋 ${platformName} OAuth response:`, responseData);\r\n \r\n // Check for platform-specific URL keys with multiple fallbacks\r\n const platformUrlKeys = {\r\n 'youtube': ['youtubeURL', 'youtubeUrl', 'youtube_url'],\r\n 'linkedin': ['linkedinURL', 'linkedinUrl', 'linkedin_url'], \r\n 'reddit': ['redditURL', 'redditUrl', 'reddit_url'],\r\n 'pinterest': ['pinterestURL', 'pinterestUrl', 'pinterest_url'],\r\n 'instagram': ['instagramURL', 'instagramUrl', 'instagram_url'],\r\n 'github': ['githubURL', 'githubUrl', 'github_url'],\r\n 'facebook': ['facebookURL', 'facebookUrl', 'facebook_url'],\r\n 'gmail': ['gmailURL', 'gmailUrl', 'gmail_url']\r\n };\r\n \r\n const possibleKeys = platformUrlKeys[platform.connector] || [\r\n `${platform.connector}URL`,\r\n `${platform.connector}Url`, \r\n `${platform.connector}_url`,\r\n 'platformURL',\r\n 'authUrl', \r\n 'url'\r\n ];\r\n \r\n let oauthUrl = null;\r\n let usedKey = null;\r\n \r\n // Try each possible key\r\n for (const key of possibleKeys) {\r\n if (responseData[key]) {\r\n oauthUrl = responseData[key];\r\n usedKey = key;\r\n break;\r\n }\r\n }\r\n \r\n if (!oauthUrl) {\r\n console.error(`❌ No OAuth URL found for ${platformName}:`);\r\n console.error(`Expected one of:`, possibleKeys);\r\n console.error(`Response keys:`, Object.keys(responseData));\r\n console.error(`Full response:`, responseData);\r\n throw new Error(`No OAuth URL found. Backend should return one of: ${possibleKeys.join(', ')}`);\r\n }\r\n \r\n console.log(`✅ Found OAuth URL for ${platformName} using key: ${usedKey}`);\r\n \r\n if (isMobileDevice()) {\r\n // Mobile: Use redirect flow\r\n localStorage.setItem('onairos_oauth_platform', platformName);\r\n localStorage.setItem('onairos_oauth_return', window.location.href);\r\n window.location.href = oauthUrl;\r\n return true;\r\n } else {\r\n // Desktop: Use popup flow with enhanced monitoring\r\n const popup = window.open(\r\n oauthUrl,\r\n `${platform.connector}_oauth`,\r\n 'width=500,height=600,scrollbars=yes,resizable=yes,status=no,location=no,toolbar=no,menubar=no'\r\n );\r\n \r\n if (!popup) {\r\n throw new Error('Popup blocked. Please allow popups and try again.');\r\n }\r\n\r\n // Enhanced popup monitoring with onairos.uk detection\r\n let hasNavigatedToOnairos = false;\r\n const checkInterval = setInterval(() => {\r\n try {\r\n // Try to detect if popup has navigated to onairos.uk (indicates success)\r\n if (popup.location && popup.location.hostname === 'onairos.uk') {\r\n hasNavigatedToOnairos = true;\r\n console.log(`🔄 ${platformName} popup navigated to onairos.uk - treating as success`);\r\n \r\n // Close the popup since it shows \"not found\"\r\n popup.close();\r\n return; // Let the popup.closed check handle the rest\r\n }\r\n } catch (e) {\r\n // Cross-origin error is expected when popup navigates to onairos.uk\r\n // This actually indicates the OAuth likely succeeded\r\n if (!hasNavigatedToOnairos) {\r\n hasNavigatedToOnairos = true;\r\n console.log(`🔄 ${platformName} popup navigated (cross-origin) - likely to onairos.uk`);\r\n }\r\n }\r\n \r\n try {\r\n // Check if popup is closed\r\n if (popup.closed) {\r\n clearInterval(checkInterval);\r\n \r\n // Check for success or error signals from callback page\r\n const successFlag = localStorage.getItem(`onairos_${platformName}_success`);\r\n const errorFlag = localStorage.getItem(`onairos_${platformName}_error`);\r\n const timestamp = localStorage.getItem(`onairos_${platformName}_timestamp`);\r\n \r\n // Only process recent signals (within 30 seconds)\r\n const isRecentSignal = timestamp && (Date.now() - parseInt(timestamp) < 30000);\r\n \r\n if (successFlag && isRecentSignal) {\r\n // Success flow from callback page\r\n console.log(`✅ ${platformName} OAuth completed successfully (callback page)`);\r\n localStorage.removeItem(`onairos_${platformName}_success`);\r\n localStorage.removeItem(`onairos_${platformName}_timestamp`);\r\n \r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: true\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n } else if (errorFlag && isRecentSignal) {\r\n // Error flow from callback page\r\n console.log(`❌ ${platformName} OAuth failed:`, errorFlag);\r\n localStorage.removeItem(`onairos_${platformName}_error`);\r\n localStorage.removeItem(`onairos_${platformName}_timestamp`);\r\n \r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: errorFlag\r\n }));\r\n \r\n } else if (hasNavigatedToOnairos) {\r\n // Popup navigated to onairos.uk - assume success\r\n console.log(`✅ ${platformName} OAuth likely successful (navigated to onairos.uk)`);\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: true\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n } else {\r\n // No signal and no onairos navigation - assume user cancelled\r\n console.log(`⚠️ ${platformName} OAuth cancelled or no response`);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: 'Connection was cancelled'\r\n }));\r\n }\r\n \r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n }\r\n } catch (error) {\r\n // Cross-origin error when popup navigates away - this is normal\r\n // console.log(`🔄 Popup navigated away for ${platformName}`);\r\n }\r\n }, 1000);\r\n\r\n // Auto-close popup if it shows onairos.uk \"not found\" page after 10 seconds\r\n setTimeout(() => {\r\n try {\r\n if (!popup.closed && popup.location && popup.location.hostname === 'onairos.uk') {\r\n console.log(`🚪 Auto-closing ${platformName} popup showing onairos.uk (not found)`);\r\n popup.close();\r\n }\r\n } catch (e) {\r\n // Cross-origin error is expected - try to close anyway if it's been 10 seconds\r\n if (!popup.closed && hasNavigatedToOnairos) {\r\n console.log(`🚪 Auto-closing ${platformName} popup (cross-origin, likely onairos.uk)`);\r\n popup.close();\r\n }\r\n }\r\n }, 10000);\r\n\r\n // Final timeout after 5 minutes\r\n setTimeout(() => {\r\n if (!popup.closed) {\r\n popup.close();\r\n clearInterval(checkInterval);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: 'Connection timeout'\r\n }));\r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n }\r\n }, 300000);\r\n\r\n return true;\r\n }\r\n } catch (error) {\r\n console.error(`❌ Error connecting to ${platformName}:`, error);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: error.message\r\n }));\r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n return false;\r\n }\r\n };\r\n\r\n const handleToggle = async (platformName) => {\r\n console.log(`🔥 TOGGLE CLICKED: ${platformName}`);\r\n \r\n if (isConnecting && connectingPlatform !== platformName) {\r\n console.log(`⚠️ Already connecting to ${connectingPlatform}, ignoring click on ${platformName}`);\r\n return;\r\n }\r\n \r\n const isConnected = connectedAccounts[platformName];\r\n \r\n if (isConnected) {\r\n // Disconnect\r\n console.log(`🔌 Disconnecting from ${platformName}...`);\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: false\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n } else {\r\n // Connect\r\n await connectToPlatform(platformName);\r\n }\r\n };\r\n\r\n const handleContinue = () => {\r\n const connected = Object.entries(connectedAccounts)\r\n .filter(([platform, isConnected]) => isConnected)\r\n .map(([platform]) => platform);\r\n \r\n onComplete({\r\n connectedAccounts: connected,\r\n totalConnections: connected.length,\r\n healthScore: healthScore,\r\n connectionHealth: connectionHealth,\r\n sdkVersion: '2.1.7',\r\n enhancedFeatures: {\r\n healthMonitoring: sdkConfig.enableHealthMonitoring,\r\n autoRefresh: sdkConfig.enableAutoRefresh,\r\n connectionValidation: sdkConfig.enableConnectionValidation\r\n }\r\n });\r\n };\r\n\r\n const connectedCount = Object.values(connectedAccounts).filter(Boolean).length;\r\n\r\n return (\r\n <div className=\"max-w-sm mx-auto bg-white p-4 rounded-lg shadow-lg\">\r\n {/* Compact Header */}\r\n <div className=\"flex items-center justify-center mb-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <img \r\n src={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"} \r\n alt={appName} \r\n className=\"w-8 h-8 rounded-lg\"\r\n />\r\n <div className=\"flex items-center text-gray-400\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 8l4 4m0 0l-4 4m4-4H3\" />\r\n </svg>\r\n </div>\r\n <img \r\n src=\"https://onairos.sirv.com/Images/OnairosBlack.png\" \r\n alt=\"Onairos\" \r\n className=\"w-8 h-8 rounded-lg\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Simple Clear Title */}\r\n <div className=\"text-center mb-4\">\r\n <h2 className=\"text-lg font-bold text-gray-900 mb-1\">Connect Data</h2>\r\n <p className=\"text-gray-600 text-sm\">\r\n Connect data here to enhance your {appName} experience\r\n </p>\r\n </div>\r\n\r\n {/* Compact Platform Grid */}\r\n <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n {platforms.map((platform) => {\r\n const isConnected = connectedAccounts[platform.name] || false;\r\n const isCurrentlyConnecting = connectingPlatform === platform.name;\r\n const hasError = connectionErrors[platform.name];\r\n const isDisabled = isConnecting && !isCurrentlyConnecting;\r\n \r\n return (\r\n <div \r\n key={platform.name}\r\n className={`relative p-3 border-2 rounded-lg transition-all duration-200 cursor-pointer ${\r\n isDisabled ? 'opacity-50 cursor-not-allowed' : 'hover:shadow-md'\r\n } ${\r\n isConnected ? 'border-green-400 bg-green-50' : \r\n hasError ? 'border-red-400 bg-red-50' :\r\n isCurrentlyConnecting ? 'border-blue-400 bg-blue-50' : \r\n 'border-gray-200 bg-white hover:border-gray-300'\r\n }`}\r\n onClick={() => !isDisabled && handleToggle(platform.name)}\r\n >\r\n {/* Platform Icon */}\r\n <div className={`w-8 h-8 rounded-lg ${platform.color} flex items-center justify-center text-white text-lg mb-2 mx-auto relative`}>\r\n {isCurrentlyConnecting ? (\r\n <div className=\"animate-spin h-4 w-4 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n platform.icon\r\n )}\r\n \r\n {/* Connection Status Indicator */}\r\n {isConnected && !isCurrentlyConnecting && (\r\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-2.5 h-2.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n )}\r\n \r\n {hasError && !isCurrentlyConnecting && (\r\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-2.5 h-2.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n \r\n {/* Platform Name */}\r\n <div className=\"text-center\">\r\n <h3 className=\"font-medium text-gray-900 text-xs\">{platform.name}</h3>\r\n <p className={`text-xs mt-1 ${\r\n isCurrentlyConnecting ? 'text-blue-600' : \r\n isConnected ? 'text-green-600' : \r\n hasError ? 'text-red-600' :\r\n 'text-gray-500'\r\n }`}>\r\n {isCurrentlyConnecting ? 'Connecting...' : \r\n isConnected ? 'Connected' : \r\n hasError ? 'Failed' :\r\n 'Tap to connect'}\r\n </p>\r\n \r\n {/* Error Message */}\r\n {hasError && (\r\n <p className=\"text-xs text-red-600 mt-1 break-words\">\r\n {hasError}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Connection Status Summary */}\r\n {connectedCount > 0 && (\r\n <div className=\"mb-4 p-2 bg-green-50 border border-green-200 rounded-lg\">\r\n <p className=\"text-green-800 text-sm text-center\">\r\n ✅ {connectedCount} connection{connectedCount > 1 ? 's' : ''} active\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Continue Button */}\r\n <button\r\n onClick={handleContinue}\r\n disabled={connectedCount === 0}\r\n className={`w-full py-3 px-4 rounded-lg font-semibold transition-colors ${\r\n connectedCount > 0\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n {connectedCount > 0 ? `Continue with ${connectedCount} connection${connectedCount > 1 ? 's' : ''}` : 'Connect at least one platform'}\r\n </button>\r\n\r\n {/* Skip Option */}\r\n <button\r\n onClick={() => onComplete({ connectedAccounts: [], totalConnections: 0 })}\r\n className=\"w-full mt-2 py-2 text-gray-500 hover:text-gray-700 text-sm\"\r\n >\r\n Skip for now\r\n </button>\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nexport default function PinSetup({ onComplete, userEmail }) {\r\n const [pin, setPin] = useState('');\r\n const [requirements, setRequirements] = useState({\r\n length: false,\r\n number: false,\r\n special: false\r\n });\r\n\r\n // Check PIN requirements (simplified)\r\n useEffect(() => {\r\n setRequirements({\r\n length: pin.length >= 8,\r\n number: /[0-9]/.test(pin),\r\n special: /[!@#$%^&*(),.?\":{}|<>]/.test(pin)\r\n });\r\n }, [pin]);\r\n\r\n const allRequirementsMet = Object.values(requirements).every(req => req);\r\n const canSubmit = allRequirementsMet && pin.length > 0;\r\n\r\n const handleSubmit = (e) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n // In a real app, you would hash the PIN before storing\r\n onComplete({\r\n pin: pin, // This should be hashed in production\r\n pinCreated: true,\r\n timestamp: new Date().toISOString()\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"max-w-md mx-auto bg-white p-6\">\r\n <div className=\"text-center mb-6\">\r\n <div className=\"w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <svg className=\"w-8 h-8 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-1a2 2 0 00-2-2H6a2 2 0 00-2 2v1a2 2 0 002 2zM12 7V3m0 4l3-3m-3 3L9 4\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 mb-2\">Create Your Secure PIN</h2>\r\n <p className=\"text-gray-600\">Your PIN will be used to securely access your data</p>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* PIN Input */}\r\n <div>\r\n <label htmlFor=\"pin\" className=\"block text-sm font-medium text-gray-700 mb-2\">\r\n Create PIN\r\n </label>\r\n <input\r\n type=\"password\"\r\n id=\"pin\"\r\n value={pin}\r\n onChange={(e) => setPin(e.target.value)}\r\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"Enter your secure PIN\"\r\n />\r\n </div>\r\n\r\n {/* Requirements */}\r\n <div className=\"bg-gray-50 p-4 rounded-lg\">\r\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">PIN Requirements:</h4>\r\n <div className=\"space-y-2\">\r\n {Object.entries({\r\n length: 'At least 8 characters',\r\n number: 'One number (0-9)',\r\n special: 'One special character (!@#$%^&*)'\r\n }).map(([key, label]) => (\r\n <div key={key} className=\"flex items-center\">\r\n <div className={`w-4 h-4 rounded-full mr-2 flex items-center justify-center ${\r\n requirements[key] ? 'bg-green-500' : 'bg-gray-300'\r\n }`}>\r\n {requirements[key] && (\r\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n )}\r\n </div>\r\n <span className={`text-sm ${requirements[key] ? 'text-green-600' : 'text-gray-600'}`}>\r\n {label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={!canSubmit}\r\n className={`w-full py-3 px-4 rounded-lg font-semibold transition-colors ${\r\n canSubmit\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n Create PIN\r\n </button>\r\n </form>\r\n\r\n {userEmail && (\r\n <p className=\"text-center text-sm text-gray-500 mt-4\">\r\n Securing account for: <span className=\"font-medium\">{userEmail}</span>\r\n </p>\r\n )}\r\n </div>\r\n );\r\n} ","import React, { useState } from 'react';\r\n\r\nconst dataTypes = [\r\n { \r\n id: 'basic', \r\n name: 'Basic Info', \r\n description: 'Essential profile information and account details', \r\n icon: '👤',\r\n required: false\r\n },\r\n { \r\n id: 'personality', \r\n name: 'Personality', \r\n description: 'Personality traits, behavioral patterns and insights', \r\n icon: '🧠',\r\n required: false\r\n },\r\n { \r\n id: 'preferences', \r\n name: 'Preferences', \r\n description: 'User preferences, settings and choices', \r\n icon: '⚙️',\r\n required: false\r\n }\r\n];\r\n\r\nexport default function DataRequest({ \r\n onComplete, \r\n userEmail, \r\n appName = 'App', \r\n autoFetch = false,\r\n testMode = false \r\n}) {\r\n const [selectedData, setSelectedData] = useState({\r\n basic: false, // User can choose\r\n personality: false,\r\n preferences: false\r\n });\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [isLoadingApi, setIsLoadingApi] = useState(false);\r\n const [apiResponse, setApiResponse] = useState(null);\r\n const [apiError, setApiError] = useState(null);\r\n\r\n const handleDataToggle = (dataId) => {\r\n setSelectedData(prev => ({\r\n ...prev,\r\n [dataId]: !prev[dataId]\r\n }));\r\n };\r\n\r\n const handleRowClick = (dataId) => {\r\n // Make the entire row clickable for better UX\r\n handleDataToggle(dataId);\r\n };\r\n\r\n const generateUserHash = (email) => {\r\n // Simple hash function for user identification\r\n let hash = 0;\r\n const str = email + Date.now().toString();\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash; // Convert to 32-bit integer\r\n }\r\n return `user_${Math.abs(hash).toString(36)}`;\r\n };\r\n\r\n const fetchUserData = async () => {\r\n setIsLoadingApi(true);\r\n setApiError(null);\r\n \r\n try {\r\n // Create a unique user hash for this request\r\n const userHash = generateUserHash(userEmail);\r\n \r\n // Get selected data types\r\n const approvedData = Object.entries(selectedData)\r\n .filter(([key, value]) => value)\r\n .map(([key]) => key);\r\n\r\n // Map frontend data types to backend confirmation types\r\n const mapDataTypesToConfirmations = (approvedData) => {\r\n const confirmations = [];\r\n const currentDate = new Date().toISOString();\r\n \r\n // Map frontend types to backend types according to API expectations\r\n const dataTypeMapping = {\r\n 'basic': 'Medium', // Basic info -> Medium data\r\n 'personality': 'Large', // Personality -> Large analysis\r\n 'preferences': 'Traits' // Preferences -> Traits data\r\n };\r\n \r\n approvedData.forEach(dataType => {\r\n if (dataTypeMapping[dataType]) {\r\n confirmations.push({\r\n data: dataTypeMapping[dataType],\r\n date: currentDate\r\n });\r\n }\r\n });\r\n \r\n return confirmations;\r\n };\r\n\r\n // Determine API endpoint based on test mode\r\n const apiEndpoint = testMode \r\n ? 'https://api2.onairos.uk/inferenceTest'\r\n : 'https://api2.onairos.uk/getAPIurlMobile';\r\n \r\n // Prepare the base result\r\n const baseResult = {\r\n userHash,\r\n appName,\r\n approvedData,\r\n apiUrl: apiEndpoint,\r\n testMode,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n if (autoFetch) {\r\n // Auto mode true: make API request and return results\r\n try {\r\n const confirmations = mapDataTypesToConfirmations(approvedData);\r\n \r\n // Format request according to backend expectations\r\n const requestBody = testMode ? {\r\n // Test mode: simple format for testing\r\n approvedData,\r\n userEmail,\r\n appName,\r\n testMode,\r\n timestamp: new Date().toISOString()\r\n } : {\r\n // Live mode: proper Info format for backend\r\n Info: {\r\n storage: \"local\",\r\n appId: appName,\r\n confirmations: confirmations,\r\n EncryptedUserPin: \"pending_pin_integration\", // TODO: Get from user PIN setup\r\n account: userEmail,\r\n proofMode: false,\r\n Domain: window.location.hostname,\r\n web3Type: \"standard\", // or \"Othent\" if using Othent\r\n OthentSub: null // Only if using Othent authentication\r\n }\r\n };\r\n\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(requestBody)\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`API call failed with status: ${response.status}`);\r\n }\r\n\r\n const apiData = await response.json();\r\n \r\n // Format response according to test mode requirements\r\n let formattedData = apiData;\r\n if (testMode && apiData) {\r\n formattedData = {\r\n InferenceResult: {\r\n output: apiData.croppedInference || apiData.output || apiData.inference,\r\n traits: apiData.traitResult || apiData.traits || apiData.personalityData\r\n }\r\n };\r\n }\r\n \r\n setApiResponse(formattedData);\r\n return {\r\n ...baseResult,\r\n apiResponse: formattedData,\r\n success: true\r\n };\r\n } catch (error) {\r\n setApiError(error.message);\r\n return {\r\n ...baseResult,\r\n apiError: error.message,\r\n success: false\r\n };\r\n }\r\n } else {\r\n // Auto mode false (default): return API endpoint URL for manual calling\r\n return {\r\n ...baseResult,\r\n success: true,\r\n message: 'Data request approved. Use the provided API URL to fetch user data.'\r\n };\r\n }\r\n } catch (error) {\r\n setApiError(`Failed to process request: ${error.message}`);\r\n return null;\r\n } finally {\r\n setIsLoadingApi(false);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault();\r\n setIsSubmitting(true);\r\n \r\n try {\r\n const result = await fetchUserData();\r\n \r\n if (result) {\r\n onComplete(result);\r\n }\r\n } catch (error) {\r\n setApiError(`Submission failed: ${error.message}`);\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n const selectedCount = Object.values(selectedData).filter(Boolean).length;\r\n\r\n return (\r\n <div className=\"w-full max-w-md mx-auto bg-white rounded-lg shadow-xl overflow-hidden\" style={{ maxHeight: '90vh', height: 'auto' }}>\r\n <div className=\"p-4 sm:p-6 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 4rem)' }}>\r\n <div className=\"text-center mb-4 sm:mb-6\">\r\n <h2 className=\"text-lg sm:text-xl font-bold text-gray-900 mb-2\">Data Request</h2>\r\n <p className=\"text-gray-600 text-xs sm:text-sm\">\r\n Select the data types you'd like to share with <span className=\"font-medium\">{appName}</span>\r\n </p>\r\n </div>\r\n\r\n {/* Privacy Notice */}\r\n <div className=\"mb-4 sm:mb-6 p-2 sm:p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <p className=\"text-blue-800 text-xs sm:text-sm\">\r\n 🔒 Your selected data will be securely processed and used only for the intended purpose.\r\n </p>\r\n </div>\r\n\r\n {/* Data Types Selection */}\r\n <div className=\"space-y-2 sm:space-y-3 mb-4 sm:mb-6\">\r\n {dataTypes.map((dataType) => {\r\n const isSelected = selectedData[dataType.id] || false;\r\n const isRequired = dataType.required;\r\n \r\n return (\r\n <div \r\n key={dataType.id}\r\n className={`flex items-center justify-between p-3 sm:p-4 border rounded-lg transition-colors ${\r\n isRequired \r\n ? 'bg-blue-50 border-blue-200' \r\n : 'hover:bg-gray-50 cursor-pointer'\r\n }`}\r\n onClick={() => handleRowClick(dataType.id)}\r\n >\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"text-xl sm:text-2xl\">\r\n {dataType.icon}\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium text-gray-900 text-sm sm:text-base\">\r\n {dataType.name}\r\n {isRequired && <span className=\"text-blue-600 ml-1\">*</span>}\r\n </h3>\r\n <p className=\"text-xs sm:text-sm text-gray-500\">{dataType.description}</p>\r\n </div>\r\n </div>\r\n \r\n {/* Toggle Switch or Required Badge */}\r\n {isRequired ? (\r\n <div className=\"px-2 py-1 bg-blue-600 text-white text-xs rounded-full\">\r\n Required\r\n </div>\r\n ) : (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDataToggle(dataType.id);\r\n }}\r\n className={`relative inline-flex h-5 sm:h-6 w-9 sm:w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${\r\n isSelected ? 'bg-blue-600' : 'bg-gray-200'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-3 sm:h-4 w-3 sm:w-4 transform rounded-full bg-white transition-transform ${\r\n isSelected ? 'translate-x-5 sm:translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Selection Summary */}\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-green-50 border border-green-200 rounded-lg\">\r\n <p className=\"text-green-800 text-xs sm:text-sm\">\r\n ✅ {selectedCount} data type{selectedCount > 1 ? 's' : ''} selected for sharing\r\n </p>\r\n </div>\r\n\r\n {/* API Status */}\r\n {isLoadingApi && (\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <p className=\"text-blue-800 text-xs sm:text-sm\">🔄 Processing your data request...</p>\r\n </div>\r\n )}\r\n\r\n {apiError && (\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-red-50 border border-red-200 rounded-lg\">\r\n <p className=\"text-red-800 text-xs sm:text-sm\">❌ {apiError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Action Buttons */}\r\n <form onSubmit={handleSubmit} className=\"space-y-3\">\r\n <button\r\n type=\"submit\"\r\n disabled={isSubmitting || selectedCount === 0}\r\n className={`w-full py-2 sm:py-3 px-4 rounded-lg font-semibold transition-colors text-sm sm:text-base ${\r\n selectedCount > 0 && !isSubmitting\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n {isSubmitting ? 'Processing...' : `Share ${selectedCount} data type${selectedCount > 1 ? 's' : ''}`}\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n onClick={() => onComplete({ selectedData: {}, cancelled: true })}\r\n className=\"w-full py-2 text-gray-500 hover:text-gray-700 text-xs sm:text-sm\"\r\n >\r\n Cancel\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n} ","import React, { useState, useEffect } from 'react';\r\n\r\nexport default function TrainingComponent({ onComplete, userEmail, appName = 'App' }) {\r\n const [currentStep, setCurrentStep] = useState(0);\r\n const [progress, setProgress] = useState(0);\r\n const [isComplete, setIsComplete] = useState(false);\r\n\r\n const steps = [\r\n {\r\n title: 'Setting up your personal AI',\r\n description: 'Initializing your secure data model',\r\n icon: '🤖',\r\n duration: 2000\r\n },\r\n {\r\n title: 'Processing your connections',\r\n description: 'Analyzing your social media patterns',\r\n icon: '🔗',\r\n duration: 2500\r\n },\r\n {\r\n title: 'Training your model',\r\n description: 'Building your personalized insights',\r\n icon: '🧠',\r\n duration: 3000\r\n },\r\n {\r\n title: 'Finalizing setup',\r\n description: 'Preparing your Onairos experience',\r\n icon: '✨',\r\n duration: 2000\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n let interval;\r\n let stepTimeout;\r\n\r\n if (currentStep < steps.length) {\r\n const stepDuration = steps[currentStep].duration;\r\n const stepProgress = 100 / steps.length;\r\n\r\n // Update progress gradually\r\n interval = setInterval(() => {\r\n setProgress(prev => {\r\n const newProgress = prev + (stepProgress / (stepDuration / 100));\r\n return Math.min(newProgress, (currentStep + 1) * stepProgress);\r\n });\r\n }, 100);\r\n\r\n // Move to next step after duration\r\n stepTimeout = setTimeout(() => {\r\n if (currentStep < steps.length - 1) {\r\n setCurrentStep(prev => prev + 1);\r\n } else {\r\n setIsComplete(true);\r\n setTimeout(() => {\r\n onComplete({\r\n trainingComplete: true,\r\n timestamp: new Date().toISOString(),\r\n userEmail: userEmail,\r\n appName: appName\r\n });\r\n }, 1000);\r\n }\r\n }, stepDuration);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n if (stepTimeout) clearTimeout(stepTimeout);\r\n };\r\n }, [currentStep, onComplete, userEmail, appName]);\r\n\r\n return (\r\n <div className=\"max-w-md mx-auto bg-white p-6 min-h-[400px] flex flex-col justify-center\">\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-20 h-20 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <div className=\"text-3xl\">\r\n {isComplete ? '🎉' : steps[currentStep]?.icon}\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 mb-2\">\r\n {isComplete ? 'All set!' : steps[currentStep]?.title}\r\n </h2>\r\n <p className=\"text-gray-600\">\r\n {isComplete \r\n ? 'Your personal AI is ready to use' \r\n : steps[currentStep]?.description\r\n }\r\n </p>\r\n </div>\r\n\r\n {/* Progress Bar */}\r\n <div className=\"mb-6\">\r\n <div className=\"flex justify-between text-sm text-gray-500 mb-2\">\r\n <span>Progress</span>\r\n <span>{Math.round(progress)}%</span>\r\n </div>\r\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\r\n <div \r\n className=\"bg-gradient-to-r from-blue-500 to-purple-600 h-2 rounded-full transition-all duration-300 ease-out\"\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Steps Indicator */}\r\n <div className=\"flex justify-center space-x-2 mb-6\">\r\n {steps.map((_, index) => (\r\n <div\r\n key={index}\r\n className={`w-3 h-3 rounded-full transition-all duration-300 ${\r\n index <= currentStep \r\n ? 'bg-blue-500' \r\n : 'bg-gray-300'\r\n }`}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Current Step Details */}\r\n <div className=\"bg-gray-50 p-4 rounded-lg\">\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center\">\r\n <div className=\"text-sm\">\r\n {isComplete ? '✅' : steps[currentStep]?.icon}\r\n </div>\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium text-gray-900\">\r\n {isComplete ? 'Training Complete' : `Step ${currentStep + 1} of ${steps.length}`}\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n {isComplete \r\n ? 'Your Onairos experience is ready' \r\n : steps[currentStep]?.description\r\n }\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* App Info */}\r\n <div className=\"mt-6 text-center\">\r\n <p className=\"text-sm text-gray-500\">\r\n Setting up for <span className=\"font-medium\">{appName}</span>\r\n </p>\r\n {userEmail && (\r\n <p className=\"text-xs text-gray-400 mt-1\">\r\n {userEmail}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n} ","import React, { useEffect, useState } from 'react';\nimport EmailAuth from './components/EmailAuth.js';\nimport UniversalOnboarding from './components/UniversalOnboarding.jsx';\nimport PinSetup from './components/PinSetup.js';\nimport DataRequest from './components/DataRequest.js';\nimport TrainingComponent from './components/TrainingComponent.jsx';\n\nexport function OnairosButton({\n requestData, \n webpageName, \n inferenceData = null, \n onComplete = null, \n autoFetch = false,\n testMode = false,\n proofMode = false, \n textLayout = 'below', \n textColor = 'white',\n login = false,\n buttonType = 'pill',\n loginReturn = null,\n loginType = 'signIn',\n visualType = 'full',\n appIcon = null,\n enableTraining = true\n}) {\n\n const [showOverlay, setShowOverlay] = useState(false);\n const [currentFlow, setCurrentFlow] = useState('email'); // 'email' | 'onboarding' | 'pin' | 'dataRequest' (training is within onboarding)\n const [userData, setUserData] = useState(null);\n const [error, setError] = useState(null);\n\n // Check for existing user session\n useEffect(() => {\n const checkExistingSession = () => {\n const savedUser = localStorage.getItem('onairosUser');\n if (savedUser) {\n try {\n const user = JSON.parse(savedUser);\n setUserData(user);\n // If user has completed onboarding and PIN setup, go directly to data request\n if (user.onboardingComplete && user.pinCreated) {\n setCurrentFlow('dataRequest');\n } else if (user.verified && !user.onboardingComplete) {\n setCurrentFlow('onboarding');\n } else if (user.onboardingComplete && !user.pinCreated) {\n setCurrentFlow('pin');\n }\n } catch (error) {\n console.error('Error parsing saved user data:', error);\n localStorage.removeItem('onairosUser');\n }\n }\n };\n\n checkExistingSession();\n }, []);\n\n const openTerminal = async () => {\n try {\n console.log('🔥 openTerminal called');\n setShowOverlay(true);\n } catch (error) {\n console.error('Error in openTerminal:', error);\n }\n };\n\n const handleCloseOverlay = () => {\n setShowOverlay(false);\n setError(null);\n };\n\n // Handle clicks on the backdrop to close modal\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n handleCloseOverlay();\n }\n };\n\n const handleEmailAuthSuccess = (authData) => {\n console.log('🔥 Email auth successful:', authData);\n console.log('🔧 User State:', {\n isNewUser: authData.isNewUser,\n userState: authData.userState,\n flowType: authData.flowType,\n existingUser: authData.existingUser\n });\n \n // Determine flow based on verification response\n const isNewUser = authData.isNewUser === true || authData.flowType === 'onboarding' || authData.userState === 'new';\n \n const newUserData = {\n ...authData,\n verified: true,\n onboardingComplete: !isNewUser, // New users need onboarding, returning users have completed it\n pinCreated: !isNewUser // Assume returning users have PIN, new users need to create it\n };\n \n setUserData(newUserData);\n localStorage.setItem('onairosUser', JSON.stringify(newUserData));\n \n // Flow decision logic\n if (isNewUser) {\n console.log('🚀 New user detected → Starting onboarding flow (includes training)');\n setCurrentFlow('onboarding');\n } else {\n console.log('👋 Existing user detected → Going directly to data request');\n setCurrentFlow('dataRequest');\n }\n };\n\n const handleOnboardingComplete = (onboardingData) => {\n console.log('Onboarding completed:', onboardingData);\n const updatedUserData = {\n ...userData,\n onboardingComplete: true,\n connectedAccounts: onboardingData.connectedAccounts || []\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n setCurrentFlow('pin');\n };\n\n const handlePinSetupComplete = (pinData) => {\n console.log('PIN setup completed:', pinData);\n const updatedUserData = {\n ...userData,\n ...pinData,\n pinCreated: true\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request flow within the same overlay\n setCurrentFlow('dataRequest');\n };\n\n const handleTrainingComplete = (trainingResult) => {\n console.log('🎓 Training completed:', trainingResult);\n const updatedUserData = {\n ...userData,\n trainingCompleted: true,\n ...trainingResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request after training\n setCurrentFlow('dataRequest');\n };\n\n const handleDataRequestComplete = (requestResult) => {\n console.log('🔥 OnairosButton: Data request completed:', requestResult);\n \n // Update user data with request result\n const updatedUserData = {\n ...userData,\n lastDataRequest: requestResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n\n // Close overlay\n setShowOverlay(false);\n\n // Call onComplete callback if provided\n console.log('🔥 Calling onComplete callback with:', requestResult);\n if (onComplete) {\n try {\n onComplete(requestResult);\n console.log('🔥 onComplete callback executed successfully');\n } catch (error) {\n console.error('🔥 Error in onComplete callback:', error);\n }\n } else {\n console.log('🔥 No onComplete callback provided');\n }\n };\n\n const renderCurrentFlow = () => {\n switch (currentFlow) {\n case 'email':\n return (\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode} // Use the testMode prop from initialization\n />\n );\n \n case 'onboarding':\n return (\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n />\n );\n \n case 'pin':\n return (\n <PinSetup \n onComplete={handlePinSetupComplete}\n userEmail={userData?.email}\n />\n );\n \n case 'training':\n return (\n <TrainingComponent \n onComplete={handleTrainingComplete}\n userEmail={userData?.email}\n appName={webpageName}\n connectedAccounts={userData?.connectedAccounts || []}\n />\n );\n \n case 'dataRequest':\n return (\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n />\n );\n \n default:\n return (\n <div className=\"flex flex-col items-center space-y-4 p-6\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n <p className=\"text-gray-600\">Loading...</p>\n </div>\n );\n }\n };\n\n // Styling and button class based on visual type\n const buttonClass = \n `flex items-center justify-center font-bold rounded cursor-pointer ${\n buttonType === 'pill' ? 'px-4 py-2' : 'w-12 h-12'\n } bg-transparent OnairosConnect`;\n\n const buttonStyle = {\n flexDirection: textLayout === 'below' ? 'column' : 'row',\n backgroundColor: 'transparent',\n color: textColor,\n border: '1px solid transparent',\n };\n\n // Icon and text style based on the visualType\n const logoStyle = {\n width: '20px',\n height: '20px',\n marginRight: visualType === 'full' ? '12px' : '0',\n };\n\n const getText = () => {\n switch (loginType) {\n case 'signUp':\n return 'Sign Up with Onairos';\n case 'signOut':\n return 'Sign Out of Onairos';\n default:\n return 'Sign In with Onairos';\n }\n };\n\n return (\n <>\n <button\n className={buttonClass}\n onClick={openTerminal}\n style={buttonStyle}\n >\n {(visualType === 'full' || visualType === 'icon') && (\n <img\n src={login ? \"https://onairos.sirv.com/Images/OnairosWhite.png\" : \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n alt=\"Onairos Logo\"\n style={logoStyle}\n />\n )}\n {visualType !== 'icon' && (\n <span className={`${textColor === 'black' ? 'text-black' : 'text-white'} ${visualType === 'icon' ? 'sr-only' : ''} ${textLayout === 'right' ? 'ml-2' : textLayout === 'left' ? 'mr-2' : ''}`}>\n {getText()}\n </span>\n )}\n </button>\n\n {/* Full-Screen Overlay (Plaid/SendPay Style) */}\n {showOverlay && (\n <div \n className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\"\n onClick={handleBackdropClick}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4 max-h-[90vh] overflow-hidden relative\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n onClick={handleCloseOverlay}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600 z-10\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Content */}\n <div className=\"overflow-y-auto max-h-[90vh]\">\n {renderCurrentFlow()}\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport default OnairosButton;","import React from 'react';\r\nimport OnairosButton from './onairosButton.jsx';\r\n\r\n// Main Onairos component\r\nexport function Onairos(props) {\r\n return (\r\n <>\r\n <OnairosButton {...props} />\r\n </>\r\n );\r\n}\r\n\r\n// Export both the main component and individual components\r\nexport { OnairosButton };\r\nexport default Onairos;\r\n\r\n// Initialize SDK functionality (if needed)\r\nexport const initializeApiKey = async (config) => {\r\n // SDK initialization logic would go here\r\n console.log('🔧 SDK initialized with config:', config);\r\n return Promise.resolve();\r\n};\r\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__639__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","toPascalCase","string","camelCase","replace","match","p1","p2","toUpperCase","toLowerCase","toCamelCase","charAt","slice","mergeClasses","classes","filter","className","index","array","Boolean","trim","indexOf","join","hasA11yProp","props","startsWith","defaultAttributes","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Icon","forwardRef","color","size","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","Number","map","tag","attrs","Array","isArray","createLucideIcon","iconName","Component","displayName","Mail","x","y","rx","ArrowRight","Check","EmailAuth","_ref","onSuccess","testMode","email","setEmail","useState","code","setCode","step","setStep","isLoading","setIsLoading","error","setError","handleEmailSubmit","async","e","preventDefault","test","validateEmail","setTimeout","fetch","method","headers","body","JSON","stringify","ok","Error","message","handleCodeSubmit","verified","response","data","json","token","React","onSubmit","htmlFor","type","id","onChange","target","placeholder","required","disabled","maxLength","onClick","platforms","name","icon","connector","sdkConfig","apiKey","process","env","REACT_APP_ONAIROS_API_KEY","baseUrl","REACT_APP_ONAIROS_BASE_URL","sdkType","enableHealthMonitoring","enableAutoRefresh","enableConnectionValidation","UniversalOnboarding","onComplete","appIcon","appName","connectedAccounts","setConnectedAccounts","isConnecting","setIsConnecting","connectingPlatform","setConnectingPlatform","connectionErrors","setConnectionErrors","connectionHealth","setConnectionHealth","healthScore","setHealthScore","useEffect","handleOAuthReturn","platform","localStorage","getItem","console","log","concat","removeItem","prev","_objectSpread","connectToPlatform","platformName","find","p","_localStorage$getItem","username","authorizeUrl","session","status","statusText","responseData","possibleKeys","oauthUrl","usedKey","keys","navigator","userAgent","window","innerWidth","setItem","location","href","popup","open","hasNavigatedToOnairos","checkInterval","setInterval","hostname","close","closed","clearInterval","successFlag","errorFlag","timestamp","isRecentSignal","Date","now","parseInt","connectedCount","values","length","src","alt","isConnected","isCurrentlyConnecting","hasError","isDisabled","handleToggle","fillRule","clipRule","handleContinue","connected","entries","_ref2","_ref3","totalConnections","sdkVersion","enhancedFeatures","healthMonitoring","autoRefresh","connectionValidation","PinSetup","userEmail","pin","setPin","requirements","setRequirements","number","special","canSubmit","every","req","pinCreated","toISOString","label","dataTypes","description","DataRequest","autoFetch","selectedData","setSelectedData","basic","personality","preferences","isSubmitting","setIsSubmitting","isLoadingApi","setIsLoadingApi","apiResponse","setApiResponse","apiError","setApiError","handleDataToggle","dataId","fetchUserData","userHash","hash","str","toString","i","charCodeAt","Math","abs","generateUserHash","approvedData","mapDataTypesToConfirmations","confirmations","currentDate","dataTypeMapping","forEach","dataType","push","date","apiEndpoint","baseResult","apiUrl","success","requestBody","Info","storage","appId","EncryptedUserPin","account","proofMode","Domain","web3Type","OthentSub","apiData","formattedData","InferenceResult","output","croppedInference","inference","traits","traitResult","personalityData","selectedCount","style","maxHeight","isSelected","isRequired","handleRowClick","stopPropagation","result","cancelled","TrainingComponent","_steps$currentStep","_steps$currentStep2","_steps$currentStep3","_steps$currentStep4","_steps$currentStep5","currentStep","setCurrentStep","progress","setProgress","isComplete","setIsComplete","steps","title","duration","interval","stepTimeout","stepDuration","stepProgress","newProgress","min","trainingComplete","clearTimeout","round","_","requestData","webpageName","inferenceData","textLayout","textColor","login","buttonType","loginReturn","loginType","visualType","enableTraining","showOverlay","setShowOverlay","currentFlow","setCurrentFlow","userData","setUserData","checkExistingSession","savedUser","user","parse","onboardingComplete","handleCloseOverlay","handleEmailAuthSuccess","authData","isNewUser","userState","flowType","existingUser","newUserData","handleOnboardingComplete","onboardingData","updatedUserData","handlePinSetupComplete","pinData","handleTrainingComplete","trainingResult","trainingCompleted","handleDataRequestComplete","requestResult","lastDataRequest","buttonClass","buttonStyle","flexDirection","backgroundColor","border","logoStyle","marginRight","getText","currentTarget","renderCurrentFlow","Onairos","OnairosButton","initializeApiKey","config","Promise","resolve"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"onairos.bundle.js","mappings":"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","sources":["webpack://Onairos/webpack/universalModuleDefinition","webpack://Onairos/external umd {\"commonjs\":\"react\",\"commonjs2\":\"react\",\"amd\":\"React\",\"root\":\"React\"}","webpack://Onairos/webpack/bootstrap","webpack://Onairos/webpack/runtime/compat get default export","webpack://Onairos/webpack/runtime/define property getters","webpack://Onairos/webpack/runtime/hasOwnProperty shorthand","webpack://Onairos/webpack/runtime/make namespace object","webpack://Onairos/./node_modules/lucide-react/dist/esm/shared/src/utils.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/defaultAttributes.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/Icon.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/createLucideIcon.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/mail.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/arrow-right.js","webpack://Onairos/./node_modules/lucide-react/dist/esm/icons/check.js","webpack://Onairos/./src/components/EmailAuth.js","webpack://Onairos/./src/components/UniversalOnboarding.jsx","webpack://Onairos/./src/components/PinSetup.js","webpack://Onairos/./src/components/DataRequest.js","webpack://Onairos/./src/components/TrainingComponent.jsx","webpack://Onairos/./src/onairosButton.jsx","webpack://Onairos/./src/onairos.jsx"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"react\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Onairos\", [\"React\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Onairos\"] = factory(require(\"react\"));\n\telse\n\t\troot[\"Onairos\"] = factory(root[\"React\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__639__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__639__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n};\n\nexport { hasA11yProp, mergeClasses, toCamelCase, toKebabCase, toPascalCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses, hasA11yProp } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase, toPascalCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"20\", height: \"16\", x: \"2\", y: \"4\", rx: \"2\", key: \"18n3k1\" }],\n [\"path\", { d: \"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\", key: \"1ocrg3\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"m12 5 7 7-7 7\", key: \"xquz4c\" }]\n];\nconst ArrowRight = createLucideIcon(\"arrow-right\", __iconNode);\n\nexport { __iconNode, ArrowRight as default };\n//# sourceMappingURL=arrow-right.js.map\n","/**\n * @license lucide-react v0.503.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","import React, { useState } from 'react';\r\nimport { Mail, ArrowRight, Check } from 'lucide-react';\r\n\r\nexport default function EmailAuth({ onSuccess, testMode = true }) {\r\n const [email, setEmail] = useState('');\r\n const [code, setCode] = useState('');\r\n const [step, setStep] = useState('email'); // 'email' | 'code' | 'success'\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState('');\r\n\r\n const validateEmail = (email) => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return emailRegex.test(email);\r\n };\r\n\r\n const handleEmailSubmit = async (e) => {\r\n e.preventDefault();\r\n setError('');\r\n\r\n if (!validateEmail(email)) {\r\n setError('Please enter a valid email address');\r\n return;\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n try {\r\n if (testMode) {\r\n // In test mode, skip email sending and go directly to code step\r\n setTimeout(() => {\r\n setStep('code');\r\n setIsLoading(false);\r\n }, 1000);\r\n } else {\r\n // In production, send actual email\r\n const response = await fetch('https://api2.onairos.uk/email/verify', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ email }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Failed to send verification code');\r\n }\r\n\r\n setStep('code');\r\n setIsLoading(false);\r\n }\r\n } catch (error) {\r\n setError(error.message);\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n const handleCodeSubmit = async (e) => {\r\n e.preventDefault();\r\n setError('');\r\n\r\n if (testMode && code === '123456') {\r\n // Test mode - accept 123456 as valid code\r\n setStep('success');\r\n setTimeout(() => {\r\n onSuccess({ email, verified: true });\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (!testMode) {\r\n setIsLoading(true);\r\n\r\n try {\r\n const response = await fetch('https://api2.onairos.uk/email/verify/confirm', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ email, code }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error('Invalid verification code');\r\n }\r\n\r\n const data = await response.json();\r\n setStep('success');\r\n setTimeout(() => {\r\n onSuccess({ email, verified: true, token: data.token });\r\n }, 1000);\r\n } catch (error) {\r\n setError(error.message);\r\n setIsLoading(false);\r\n }\r\n } else {\r\n setError('Invalid code. Use 123456 for testing.');\r\n }\r\n };\r\n\r\n const renderEmailStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-blue-100 rounded-full\">\r\n <Mail className=\"w-8 h-8 text-blue-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Sign in to Onairos</h2>\r\n <p className=\"text-gray-600\">Enter your email address to continue</p>\r\n {testMode && (\r\n <p className=\"text-sm text-blue-600 mt-2\">Test mode: Any valid email will work</p>\r\n )}\r\n </div>\r\n\r\n <form onSubmit={handleEmailSubmit} className=\"w-full max-w-md space-y-4\">\r\n <div>\r\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700 mb-1\">\r\n Email address\r\n </label>\r\n <input\r\n type=\"email\"\r\n id=\"email\"\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n placeholder=\"Enter your email\"\r\n className=\"w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none\"\r\n required\r\n />\r\n </div>\r\n\r\n {error && (\r\n <p className=\"text-sm text-red-600\">{error}</p>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full py-3 px-4 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center\"\r\n >\r\n {isLoading ? (\r\n <div className=\"animate-spin h-5 w-5 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n <>\r\n Continue\r\n <ArrowRight className=\"ml-2 w-4 h-4\" />\r\n </>\r\n )}\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n\r\n const renderCodeStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-green-100 rounded-full\">\r\n <Mail className=\"w-8 h-8 text-green-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Check your email</h2>\r\n <p className=\"text-gray-600\">We sent a verification code to</p>\r\n <p className=\"text-gray-900 font-medium\">{email}</p>\r\n {testMode && (\r\n <p className=\"text-sm text-blue-600 mt-2\">Test mode: Use code 123456</p>\r\n )}\r\n </div>\r\n\r\n <form onSubmit={handleCodeSubmit} className=\"w-full max-w-md space-y-4\">\r\n <div>\r\n <label htmlFor=\"code\" className=\"block text-sm font-medium text-gray-700 mb-1\">\r\n Verification code\r\n </label>\r\n <input\r\n type=\"text\"\r\n id=\"code\"\r\n value={code}\r\n onChange={(e) => setCode(e.target.value)}\r\n placeholder=\"Enter 6-digit code\"\r\n className=\"w-full p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none text-center text-lg tracking-widest\"\r\n maxLength=\"6\"\r\n required\r\n />\r\n </div>\r\n\r\n {error && (\r\n <p className=\"text-sm text-red-600\">{error}</p>\r\n )}\r\n\r\n <button\r\n type=\"submit\"\r\n disabled={isLoading}\r\n className=\"w-full py-3 px-4 bg-blue-600 text-white rounded-lg font-semibold hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center\"\r\n >\r\n {isLoading ? (\r\n <div className=\"animate-spin h-5 w-5 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n 'Verify Code'\r\n )}\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n onClick={() => setStep('email')}\r\n className=\"w-full py-2 px-4 text-gray-600 hover:text-gray-800\"\r\n >\r\n Use a different email\r\n </button>\r\n </form>\r\n </div>\r\n );\r\n\r\n const renderSuccessStep = () => (\r\n <div className=\"flex flex-col items-center space-y-6 w-full\">\r\n <div className=\"flex items-center justify-center w-16 h-16 bg-green-100 rounded-full\">\r\n <Check className=\"w-8 h-8 text-green-600\" />\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">Email verified!</h2>\r\n <p className=\"text-gray-600\">Setting up your account...</p>\r\n </div>\r\n\r\n <div className=\"w-8 h-8\">\r\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\r\n </div>\r\n </div>\r\n );\r\n\r\n return (\r\n <div className=\"flex flex-col items-center space-y-6 p-6 w-full\">\r\n {step === 'email' && renderEmailStep()}\r\n {step === 'code' && renderCodeStep()}\r\n {step === 'success' && renderSuccessStep()}\r\n </div>\r\n );\r\n} ","import React, { useState, useEffect } from 'react';\r\n\r\nconst platforms = [\r\n { name: 'YouTube', icon: '📺', color: 'bg-red-500', connector: 'youtube' },\r\n { name: 'LinkedIn', icon: '💼', color: 'bg-blue-700', connector: 'linkedin' },\r\n { name: 'Reddit', icon: '🔥', color: 'bg-orange-500', connector: 'reddit' },\r\n { name: 'Pinterest', icon: '📌', color: 'bg-red-600', connector: 'pinterest' },\r\n { name: 'Instagram', icon: '📷', color: 'bg-pink-500', connector: 'instagram' },\r\n { name: 'GitHub', icon: '⚡', color: 'bg-gray-800', connector: 'github' },\r\n { name: 'Facebook', icon: '👥', color: 'bg-blue-600', connector: 'facebook' },\r\n { name: 'Gmail', icon: '✉️', color: 'bg-red-400', connector: 'gmail' }\r\n];\r\n\r\n// Enhanced SDK configuration\r\nconst sdkConfig = {\r\n apiKey: process.env.REACT_APP_ONAIROS_API_KEY || 'onairos_web_sdk_live_key_2024',\r\n baseUrl: process.env.REACT_APP_ONAIROS_BASE_URL || 'https://api2.onairos.uk',\r\n sdkType: 'web', // web, mobile, desktop\r\n enableHealthMonitoring: true,\r\n enableAutoRefresh: true,\r\n enableConnectionValidation: true\r\n};\r\n\r\n/**\r\n * UniversalOnboarding Component - Compact & Enhanced\r\n * Displays a streamlined onboarding screen for data connections\r\n */\r\nexport default function UniversalOnboarding({ onComplete, appIcon, appName = 'App' }) {\r\n const [connectedAccounts, setConnectedAccounts] = useState({});\r\n const [isConnecting, setIsConnecting] = useState(false);\r\n const [connectingPlatform, setConnectingPlatform] = useState(null);\r\n const [connectionErrors, setConnectionErrors] = useState({});\r\n const [connectionHealth, setConnectionHealth] = useState({});\r\n const [healthScore, setHealthScore] = useState(0);\r\n\r\n // Mobile device detection\r\n const isMobileDevice = () => {\r\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ||\r\n (window.innerWidth <= 768);\r\n };\r\n\r\n // Handle mobile OAuth return\r\n useEffect(() => {\r\n const handleOAuthReturn = () => {\r\n const platform = localStorage.getItem('onairos_oauth_platform');\r\n if (platform) {\r\n console.log(`📱 OAuth return detected for: ${platform}`);\r\n \r\n // Clear OAuth state\r\n localStorage.removeItem('onairos_oauth_platform');\r\n localStorage.removeItem('onairos_oauth_return');\r\n \r\n // Mark as connected\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platform]: true\r\n }));\r\n \r\n // Clear any errors\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platform]: null\r\n }));\r\n \r\n console.log(`✅ ${platform} marked as connected from OAuth return`);\r\n }\r\n };\r\n\r\n handleOAuthReturn();\r\n }, []);\r\n\r\n const connectToPlatform = async (platformName) => {\r\n console.log(`🚀 connectToPlatform called for: ${platformName}`);\r\n \r\n const platform = platforms.find(p => p.name === platformName);\r\n if (!platform?.connector) {\r\n console.error(`❌ No connector found for platform: ${platformName}`);\r\n return false;\r\n }\r\n\r\n try {\r\n setIsConnecting(true);\r\n setConnectingPlatform(platformName);\r\n \r\n // Clear any previous errors\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n console.log(`🔗 Starting OAuth connection for ${platformName}...`);\r\n \r\n const username = localStorage.getItem('username') || localStorage.getItem('onairosUser')?.email || 'user@example.com';\r\n \r\n // Enhanced authorize endpoint with SDK type\r\n const authorizeUrl = `${sdkConfig.baseUrl}/${platform.connector}/authorize`;\r\n \r\n const response = await fetch(authorizeUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'x-api-key': sdkConfig.apiKey,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify({\r\n session: {\r\n username: username\r\n }\r\n })\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n }\r\n\r\n const responseData = await response.json();\r\n console.log(`📋 ${platformName} OAuth response:`, responseData);\r\n \r\n // Check for platform-specific URL keys with multiple fallbacks\r\n const platformUrlKeys = {\r\n 'youtube': ['youtubeURL', 'youtubeUrl', 'youtube_url'],\r\n 'linkedin': ['linkedinURL', 'linkedinUrl', 'linkedin_url'], \r\n 'reddit': ['redditURL', 'redditUrl', 'reddit_url'],\r\n 'pinterest': ['pinterestURL', 'pinterestUrl', 'pinterest_url'],\r\n 'instagram': ['instagramURL', 'instagramUrl', 'instagram_url'],\r\n 'github': ['githubURL', 'githubUrl', 'github_url'],\r\n 'facebook': ['facebookURL', 'facebookUrl', 'facebook_url'],\r\n 'gmail': ['gmailURL', 'gmailUrl', 'gmail_url']\r\n };\r\n \r\n const possibleKeys = platformUrlKeys[platform.connector] || [\r\n `${platform.connector}URL`,\r\n `${platform.connector}Url`, \r\n `${platform.connector}_url`,\r\n 'platformURL',\r\n 'authUrl', \r\n 'url'\r\n ];\r\n \r\n let oauthUrl = null;\r\n let usedKey = null;\r\n \r\n // Try each possible key\r\n for (const key of possibleKeys) {\r\n if (responseData[key]) {\r\n oauthUrl = responseData[key];\r\n usedKey = key;\r\n break;\r\n }\r\n }\r\n \r\n if (!oauthUrl) {\r\n console.error(`❌ No OAuth URL found for ${platformName}:`);\r\n console.error(`Expected one of:`, possibleKeys);\r\n console.error(`Response keys:`, Object.keys(responseData));\r\n console.error(`Full response:`, responseData);\r\n throw new Error(`No OAuth URL found. Backend should return one of: ${possibleKeys.join(', ')}`);\r\n }\r\n \r\n console.log(`✅ Found OAuth URL for ${platformName} using key: ${usedKey}`);\r\n \r\n if (isMobileDevice()) {\r\n // Mobile: Use redirect flow\r\n localStorage.setItem('onairos_oauth_platform', platformName);\r\n localStorage.setItem('onairos_oauth_return', window.location.href);\r\n window.location.href = oauthUrl;\r\n return true;\r\n } else {\r\n // Desktop: Use popup flow with enhanced monitoring\r\n const popup = window.open(\r\n oauthUrl,\r\n `${platform.connector}_oauth`,\r\n 'width=500,height=600,scrollbars=yes,resizable=yes,status=no,location=no,toolbar=no,menubar=no'\r\n );\r\n \r\n if (!popup) {\r\n throw new Error('Popup blocked. Please allow popups and try again.');\r\n }\r\n\r\n // Enhanced popup monitoring with onairos.uk detection\r\n let hasNavigatedToOnairos = false;\r\n const checkInterval = setInterval(() => {\r\n try {\r\n // Try to detect if popup has navigated to onairos.uk (indicates success)\r\n if (popup.location && popup.location.hostname === 'onairos.uk') {\r\n hasNavigatedToOnairos = true;\r\n console.log(`🔄 ${platformName} popup navigated to onairos.uk - treating as success`);\r\n \r\n // Close the popup since it shows \"not found\"\r\n popup.close();\r\n return; // Let the popup.closed check handle the rest\r\n }\r\n } catch (e) {\r\n // Cross-origin error is expected when popup navigates to onairos.uk\r\n // This actually indicates the OAuth likely succeeded\r\n if (!hasNavigatedToOnairos) {\r\n hasNavigatedToOnairos = true;\r\n console.log(`🔄 ${platformName} popup navigated (cross-origin) - likely to onairos.uk`);\r\n }\r\n }\r\n \r\n try {\r\n // Check if popup is closed\r\n if (popup.closed) {\r\n clearInterval(checkInterval);\r\n \r\n // Check for success or error signals from callback page\r\n const successFlag = localStorage.getItem(`onairos_${platformName}_success`);\r\n const errorFlag = localStorage.getItem(`onairos_${platformName}_error`);\r\n const timestamp = localStorage.getItem(`onairos_${platformName}_timestamp`);\r\n \r\n // Only process recent signals (within 30 seconds)\r\n const isRecentSignal = timestamp && (Date.now() - parseInt(timestamp) < 30000);\r\n \r\n if (successFlag && isRecentSignal) {\r\n // Success flow from callback page\r\n console.log(`✅ ${platformName} OAuth completed successfully (callback page)`);\r\n localStorage.removeItem(`onairos_${platformName}_success`);\r\n localStorage.removeItem(`onairos_${platformName}_timestamp`);\r\n \r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: true\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n } else if (errorFlag && isRecentSignal) {\r\n // Error flow from callback page\r\n console.log(`❌ ${platformName} OAuth failed:`, errorFlag);\r\n localStorage.removeItem(`onairos_${platformName}_error`);\r\n localStorage.removeItem(`onairos_${platformName}_timestamp`);\r\n \r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: errorFlag\r\n }));\r\n \r\n } else if (hasNavigatedToOnairos) {\r\n // Popup navigated to onairos.uk - assume success\r\n console.log(`✅ ${platformName} OAuth likely successful (navigated to onairos.uk)`);\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: true\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n \r\n } else {\r\n // No signal and no onairos navigation - assume user cancelled\r\n console.log(`⚠️ ${platformName} OAuth cancelled or no response`);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: 'Connection was cancelled'\r\n }));\r\n }\r\n \r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n }\r\n } catch (error) {\r\n // Cross-origin error when popup navigates away - this is normal\r\n // console.log(`🔄 Popup navigated away for ${platformName}`);\r\n }\r\n }, 1000);\r\n\r\n // Auto-close popup if it shows onairos.uk \"not found\" page after 10 seconds\r\n setTimeout(() => {\r\n try {\r\n if (!popup.closed && popup.location && popup.location.hostname === 'onairos.uk') {\r\n console.log(`🚪 Auto-closing ${platformName} popup showing onairos.uk (not found)`);\r\n popup.close();\r\n }\r\n } catch (e) {\r\n // Cross-origin error is expected - try to close anyway if it's been 10 seconds\r\n if (!popup.closed && hasNavigatedToOnairos) {\r\n console.log(`🚪 Auto-closing ${platformName} popup (cross-origin, likely onairos.uk)`);\r\n popup.close();\r\n }\r\n }\r\n }, 10000);\r\n\r\n // Final timeout after 5 minutes\r\n setTimeout(() => {\r\n if (!popup.closed) {\r\n popup.close();\r\n clearInterval(checkInterval);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: 'Connection timeout'\r\n }));\r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n }\r\n }, 300000);\r\n\r\n return true;\r\n }\r\n } catch (error) {\r\n console.error(`❌ Error connecting to ${platformName}:`, error);\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: error.message\r\n }));\r\n setIsConnecting(false);\r\n setConnectingPlatform(null);\r\n return false;\r\n }\r\n };\r\n\r\n const handleToggle = async (platformName) => {\r\n console.log(`🔥 TOGGLE CLICKED: ${platformName}`);\r\n \r\n if (isConnecting && connectingPlatform !== platformName) {\r\n console.log(`⚠️ Already connecting to ${connectingPlatform}, ignoring click on ${platformName}`);\r\n return;\r\n }\r\n \r\n const isConnected = connectedAccounts[platformName];\r\n \r\n if (isConnected) {\r\n // Disconnect\r\n console.log(`🔌 Disconnecting from ${platformName}...`);\r\n setConnectedAccounts(prev => ({\r\n ...prev,\r\n [platformName]: false\r\n }));\r\n setConnectionErrors(prev => ({\r\n ...prev,\r\n [platformName]: null\r\n }));\r\n } else {\r\n // Connect\r\n await connectToPlatform(platformName);\r\n }\r\n };\r\n\r\n const handleContinue = () => {\r\n const connected = Object.entries(connectedAccounts)\r\n .filter(([platform, isConnected]) => isConnected)\r\n .map(([platform]) => platform);\r\n \r\n onComplete({\r\n connectedAccounts: connected,\r\n totalConnections: connected.length,\r\n healthScore: healthScore,\r\n connectionHealth: connectionHealth,\r\n sdkVersion: '2.1.7',\r\n enhancedFeatures: {\r\n healthMonitoring: sdkConfig.enableHealthMonitoring,\r\n autoRefresh: sdkConfig.enableAutoRefresh,\r\n connectionValidation: sdkConfig.enableConnectionValidation\r\n }\r\n });\r\n };\r\n\r\n const connectedCount = Object.values(connectedAccounts).filter(Boolean).length;\r\n\r\n return (\r\n <div className=\"max-w-sm mx-auto bg-white p-4 rounded-lg shadow-lg\">\r\n {/* Compact Header */}\r\n <div className=\"flex items-center justify-center mb-4\">\r\n <div className=\"flex items-center space-x-2\">\r\n <img \r\n src={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"} \r\n alt={appName} \r\n className=\"w-8 h-8 rounded-lg\"\r\n />\r\n <div className=\"flex items-center text-gray-400\">\r\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M17 8l4 4m0 0l-4 4m4-4H3\" />\r\n </svg>\r\n </div>\r\n <img \r\n src=\"https://onairos.sirv.com/Images/OnairosBlack.png\" \r\n alt=\"Onairos\" \r\n className=\"w-8 h-8 rounded-lg\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Simple Clear Title */}\r\n <div className=\"text-center mb-4\">\r\n <h2 className=\"text-lg font-bold text-gray-900 mb-1\">Connect Data</h2>\r\n <p className=\"text-gray-600 text-sm\">\r\n Connect data here to enhance your {appName} experience\r\n </p>\r\n </div>\r\n\r\n {/* Compact Platform Grid */}\r\n <div className=\"grid grid-cols-2 gap-3 mb-4\">\r\n {platforms.map((platform) => {\r\n const isConnected = connectedAccounts[platform.name] || false;\r\n const isCurrentlyConnecting = connectingPlatform === platform.name;\r\n const hasError = connectionErrors[platform.name];\r\n const isDisabled = isConnecting && !isCurrentlyConnecting;\r\n \r\n return (\r\n <div \r\n key={platform.name}\r\n className={`relative p-3 border-2 rounded-lg transition-all duration-200 cursor-pointer ${\r\n isDisabled ? 'opacity-50 cursor-not-allowed' : 'hover:shadow-md'\r\n } ${\r\n isConnected ? 'border-green-400 bg-green-50' : \r\n hasError ? 'border-red-400 bg-red-50' :\r\n isCurrentlyConnecting ? 'border-blue-400 bg-blue-50' : \r\n 'border-gray-200 bg-white hover:border-gray-300'\r\n }`}\r\n onClick={() => !isDisabled && handleToggle(platform.name)}\r\n >\r\n {/* Platform Icon */}\r\n <div className={`w-8 h-8 rounded-lg ${platform.color} flex items-center justify-center text-white text-lg mb-2 mx-auto relative`}>\r\n {isCurrentlyConnecting ? (\r\n <div className=\"animate-spin h-4 w-4 border-2 border-white rounded-full border-t-transparent\"></div>\r\n ) : (\r\n platform.icon\r\n )}\r\n \r\n {/* Connection Status Indicator */}\r\n {isConnected && !isCurrentlyConnecting && (\r\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-green-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-2.5 h-2.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n )}\r\n \r\n {hasError && !isCurrentlyConnecting && (\r\n <div className=\"absolute -top-1 -right-1 w-4 h-4 bg-red-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-2.5 h-2.5 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n \r\n {/* Platform Name */}\r\n <div className=\"text-center\">\r\n <h3 className=\"font-medium text-gray-900 text-xs\">{platform.name}</h3>\r\n <p className={`text-xs mt-1 ${\r\n isCurrentlyConnecting ? 'text-blue-600' : \r\n isConnected ? 'text-green-600' : \r\n hasError ? 'text-red-600' :\r\n 'text-gray-500'\r\n }`}>\r\n {isCurrentlyConnecting ? 'Connecting...' : \r\n isConnected ? 'Connected' : \r\n hasError ? 'Failed' :\r\n 'Tap to connect'}\r\n </p>\r\n \r\n {/* Error Message */}\r\n {hasError && (\r\n <p className=\"text-xs text-red-600 mt-1 break-words\">\r\n {hasError}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n\r\n {/* Connection Status Summary */}\r\n {connectedCount > 0 && (\r\n <div className=\"mb-4 p-2 bg-green-50 border border-green-200 rounded-lg\">\r\n <p className=\"text-green-800 text-sm text-center\">\r\n ✅ {connectedCount} connection{connectedCount > 1 ? 's' : ''} active\r\n </p>\r\n </div>\r\n )}\r\n\r\n {/* Continue Button */}\r\n <button\r\n onClick={handleContinue}\r\n disabled={connectedCount === 0}\r\n className={`w-full py-3 px-4 rounded-lg font-semibold transition-colors ${\r\n connectedCount > 0\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n {connectedCount > 0 ? `Continue with ${connectedCount} connection${connectedCount > 1 ? 's' : ''}` : 'Connect at least one platform'}\r\n </button>\r\n\r\n {/* Skip Option */}\r\n <button\r\n onClick={() => onComplete({ connectedAccounts: [], totalConnections: 0 })}\r\n className=\"w-full mt-2 py-2 text-gray-500 hover:text-gray-700 text-sm\"\r\n >\r\n Skip for now\r\n </button>\r\n </div>\r\n );\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nexport default function PinSetup({ onComplete, userEmail }) {\r\n const [pin, setPin] = useState('');\r\n const [requirements, setRequirements] = useState({\r\n length: false,\r\n number: false,\r\n special: false\r\n });\r\n\r\n // Check PIN requirements (simplified)\r\n useEffect(() => {\r\n setRequirements({\r\n length: pin.length >= 8,\r\n number: /[0-9]/.test(pin),\r\n special: /[!@#$%^&*(),.?\":{}|<>]/.test(pin)\r\n });\r\n }, [pin]);\r\n\r\n const allRequirementsMet = Object.values(requirements).every(req => req);\r\n const canSubmit = allRequirementsMet && pin.length > 0;\r\n\r\n const handleSubmit = (e) => {\r\n e.preventDefault();\r\n if (canSubmit) {\r\n // In a real app, you would hash the PIN before storing\r\n onComplete({\r\n pin: pin, // This should be hashed in production\r\n pinCreated: true,\r\n timestamp: new Date().toISOString()\r\n });\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"max-w-md mx-auto bg-white p-6\">\r\n <div className=\"text-center mb-6\">\r\n <div className=\"w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <svg className=\"w-8 h-8 text-blue-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 15v2m-6 4h12a2 2 0 002-2v-1a2 2 0 00-2-2H6a2 2 0 00-2 2v1a2 2 0 002 2zM12 7V3m0 4l3-3m-3 3L9 4\" />\r\n </svg>\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 mb-2\">Create Your Secure PIN</h2>\r\n <p className=\"text-gray-600\">Your PIN will be used to securely access your data</p>\r\n </div>\r\n\r\n <form onSubmit={handleSubmit} className=\"space-y-4\">\r\n {/* PIN Input */}\r\n <div>\r\n <label htmlFor=\"pin\" className=\"block text-sm font-medium text-gray-700 mb-2\">\r\n Create PIN\r\n </label>\r\n <input\r\n type=\"password\"\r\n id=\"pin\"\r\n value={pin}\r\n onChange={(e) => setPin(e.target.value)}\r\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\r\n placeholder=\"Enter your secure PIN\"\r\n />\r\n </div>\r\n\r\n {/* Requirements */}\r\n <div className=\"bg-gray-50 p-4 rounded-lg\">\r\n <h4 className=\"text-sm font-medium text-gray-700 mb-3\">PIN Requirements:</h4>\r\n <div className=\"space-y-2\">\r\n {Object.entries({\r\n length: 'At least 8 characters',\r\n number: 'One number (0-9)',\r\n special: 'One special character (!@#$%^&*)'\r\n }).map(([key, label]) => (\r\n <div key={key} className=\"flex items-center\">\r\n <div className={`w-4 h-4 rounded-full mr-2 flex items-center justify-center ${\r\n requirements[key] ? 'bg-green-500' : 'bg-gray-300'\r\n }`}>\r\n {requirements[key] && (\r\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\r\n </svg>\r\n )}\r\n </div>\r\n <span className={`text-sm ${requirements[key] ? 'text-green-600' : 'text-gray-600'}`}>\r\n {label}\r\n </span>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n\r\n {/* Submit Button */}\r\n <button\r\n type=\"submit\"\r\n disabled={!canSubmit}\r\n className={`w-full py-3 px-4 rounded-lg font-semibold transition-colors ${\r\n canSubmit\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n Create PIN\r\n </button>\r\n </form>\r\n\r\n {userEmail && (\r\n <p className=\"text-center text-sm text-gray-500 mt-4\">\r\n Securing account for: <span className=\"font-medium\">{userEmail}</span>\r\n </p>\r\n )}\r\n </div>\r\n );\r\n} ","import React, { useState, useEffect } from 'react';\r\n\r\n// Platform connectors with correct icons\r\nconst platformConnectors = [\r\n { name: 'YouTube', icon: '📺', color: 'bg-red-500', connector: 'youtube' },\r\n { name: 'LinkedIn', icon: '💼', color: 'bg-blue-700', connector: 'linkedin' },\r\n { name: 'Reddit', icon: '🔥', color: 'bg-orange-500', connector: 'reddit' },\r\n { name: 'Pinterest', icon: '📌', color: 'bg-red-600', connector: 'pinterest' },\r\n { name: 'Instagram', icon: '📷', color: 'bg-pink-500', connector: 'instagram' },\r\n { name: 'GitHub', icon: '⚡', color: 'bg-gray-800', connector: 'github' },\r\n { name: 'Facebook', icon: '👥', color: 'bg-blue-600', connector: 'facebook' },\r\n { name: 'Gmail', icon: '✉️', color: 'bg-red-400', connector: 'gmail' }\r\n];\r\n\r\nconst dataTypes = [\r\n { \r\n id: 'basic', \r\n name: 'Basic Info', \r\n description: 'Essential profile information, account details, and basic demographics', \r\n icon: '👤',\r\n required: true, // Auto-selected and non-deselectable\r\n tooltip: 'Includes name, email, basic profile information. This data is essential for personalization and is always included.',\r\n privacyLink: 'https://onairos.uk/privacy#basic-info'\r\n },\r\n { \r\n id: 'personality', \r\n name: 'Personality', \r\n description: 'Personality traits, behavioral patterns and psychological insights', \r\n icon: '🧠',\r\n required: false,\r\n tooltip: 'AI-analyzed personality traits based on your social media activity and interactions. Used to improve content recommendations.',\r\n privacyLink: 'https://onairos.uk/privacy#personality-data'\r\n },\r\n { \r\n id: 'preferences', \r\n name: 'Preferences', \r\n description: 'User preferences, interests, settings and personal choices', \r\n icon: '⚙️',\r\n required: false,\r\n tooltip: 'Your likes, interests, content preferences, and behavioral patterns. Helps create a more personalized experience.',\r\n privacyLink: 'https://onairos.uk/privacy#preferences-data'\r\n }\r\n];\r\n\r\n// Tooltip component\r\nconst Tooltip = ({ children, content, privacyLink }) => {\r\n const [showTooltip, setShowTooltip] = useState(false);\r\n\r\n return (\r\n <div className=\"relative inline-block\">\r\n <span\r\n onMouseEnter={() => setShowTooltip(true)}\r\n onMouseLeave={() => setShowTooltip(false)}\r\n className=\"border-b border-dotted border-gray-400 cursor-help\"\r\n >\r\n {children}\r\n </span>\r\n {showTooltip && (\r\n <div className=\"absolute z-50 w-64 p-3 mt-2 text-sm bg-white border border-gray-200 rounded-lg shadow-lg left-0\">\r\n <p className=\"mb-2 text-gray-700\">{content}</p>\r\n <a \r\n href={privacyLink} \r\n target=\"_blank\" \r\n rel=\"noopener noreferrer\"\r\n className=\"text-blue-600 hover:text-blue-800 text-xs font-medium\"\r\n >\r\n Learn more about privacy →\r\n </a>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default function DataRequest({ \r\n onComplete, \r\n userEmail, \r\n appName = 'App', \r\n autoFetch = false,\r\n testMode = false,\r\n connectedAccounts = {} // Connected platforms from onboarding\r\n}) {\r\n const [selectedData, setSelectedData] = useState({\r\n basic: true, // Auto-selected and required\r\n personality: false,\r\n preferences: false\r\n });\r\n \r\n const [connectorStates, setConnectorStates] = useState({});\r\n const [isSubmitting, setIsSubmitting] = useState(false);\r\n const [isLoadingApi, setIsLoadingApi] = useState(false);\r\n const [apiResponse, setApiResponse] = useState(null);\r\n const [apiError, setApiError] = useState(null);\r\n\r\n // Initialize connector states based on connected accounts\r\n useEffect(() => {\r\n const initialStates = {};\r\n platformConnectors.forEach(platform => {\r\n initialStates[platform.name] = {\r\n connected: connectedAccounts[platform.name] || false,\r\n selected: false\r\n };\r\n });\r\n setConnectorStates(initialStates);\r\n }, [connectedAccounts]);\r\n\r\n const handleDataToggle = (dataId) => {\r\n // Don't allow toggling required items\r\n const dataType = dataTypes.find(dt => dt.id === dataId);\r\n if (dataType?.required) return;\r\n \r\n setSelectedData(prev => ({\r\n ...prev,\r\n [dataId]: !prev[dataId]\r\n }));\r\n };\r\n\r\n const handleConnectorToggle = (platformName) => {\r\n setConnectorStates(prev => ({\r\n ...prev,\r\n [platformName]: {\r\n ...prev[platformName],\r\n selected: !prev[platformName]?.selected\r\n }\r\n }));\r\n };\r\n\r\n const handleRowClick = (dataId) => {\r\n const dataType = dataTypes.find(dt => dt.id === dataId);\r\n if (dataType?.required) return; // Don't allow clicking required items\r\n handleDataToggle(dataId);\r\n };\r\n\r\n const generateUserHash = (email) => {\r\n let hash = 0;\r\n const str = email + Date.now().toString();\r\n for (let i = 0; i < str.length; i++) {\r\n const char = str.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + char;\r\n hash = hash & hash;\r\n }\r\n return `user_${Math.abs(hash).toString(36)}`;\r\n };\r\n\r\n const fetchUserData = async () => {\r\n setIsLoadingApi(true);\r\n setApiError(null);\r\n \r\n try {\r\n const userHash = generateUserHash(userEmail);\r\n \r\n // Get selected data types\r\n const approvedData = Object.entries(selectedData)\r\n .filter(([key, value]) => value)\r\n .map(([key]) => key);\r\n\r\n // Get selected connectors\r\n const selectedConnectors = Object.entries(connectorStates)\r\n .filter(([platform, state]) => state.selected && state.connected)\r\n .map(([platform]) => platform);\r\n\r\n const mapDataTypesToConfirmations = (approvedData) => {\r\n const confirmations = [];\r\n const currentDate = new Date().toISOString();\r\n \r\n const dataTypeMapping = {\r\n 'basic': 'Medium',\r\n 'personality': 'Large',\r\n 'preferences': 'Traits'\r\n };\r\n \r\n approvedData.forEach(dataType => {\r\n if (dataTypeMapping[dataType]) {\r\n confirmations.push({\r\n data: dataTypeMapping[dataType],\r\n date: currentDate\r\n });\r\n }\r\n });\r\n \r\n return confirmations;\r\n };\r\n\r\n const apiEndpoint = testMode \r\n ? 'https://api2.onairos.uk/inferenceTest'\r\n : 'https://api2.onairos.uk/getAPIurlMobile';\r\n \r\n const baseResult = {\r\n userHash,\r\n appName,\r\n approvedData,\r\n selectedConnectors,\r\n apiUrl: apiEndpoint,\r\n testMode,\r\n timestamp: new Date().toISOString()\r\n };\r\n\r\n if (autoFetch) {\r\n try {\r\n const confirmations = mapDataTypesToConfirmations(approvedData);\r\n \r\n const requestBody = testMode ? {\r\n approvedData,\r\n selectedConnectors,\r\n userEmail,\r\n appName,\r\n testMode,\r\n timestamp: new Date().toISOString()\r\n } : {\r\n Info: {\r\n storage: \"local\",\r\n appId: appName,\r\n confirmations: confirmations,\r\n connectors: selectedConnectors,\r\n EncryptedUserPin: \"pending_pin_integration\",\r\n account: userEmail,\r\n proofMode: false,\r\n Domain: window.location.hostname,\r\n web3Type: \"standard\",\r\n OthentSub: null\r\n }\r\n };\r\n\r\n const response = await fetch(apiEndpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': 'onairos_web_sdk_live_key_2024'\r\n },\r\n body: JSON.stringify(requestBody)\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`API request failed: ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n setApiResponse(data);\r\n\r\n const result = {\r\n ...baseResult,\r\n apiResponse: data,\r\n success: true\r\n };\r\n\r\n setTimeout(() => {\r\n onComplete(result);\r\n }, 1500);\r\n\r\n return result;\r\n\r\n } catch (error) {\r\n console.error('API request failed:', error);\r\n setApiError(`API request failed: ${error.message}`);\r\n \r\n const result = {\r\n ...baseResult,\r\n error: error.message,\r\n success: false\r\n };\r\n \r\n setTimeout(() => {\r\n onComplete(result);\r\n }, 2000);\r\n \r\n return result;\r\n }\r\n } else {\r\n onComplete(baseResult);\r\n return baseResult;\r\n }\r\n \r\n } catch (error) {\r\n console.error('Data processing failed:', error);\r\n setApiError(`Processing failed: ${error.message}`);\r\n throw error;\r\n } finally {\r\n setIsLoadingApi(false);\r\n }\r\n };\r\n\r\n const handleSubmit = async (e) => {\r\n e.preventDefault();\r\n setIsSubmitting(true);\r\n \r\n try {\r\n const result = await fetchUserData();\r\n \r\n if (result) {\r\n onComplete(result);\r\n }\r\n } catch (error) {\r\n setApiError(`Submission failed: ${error.message}`);\r\n } finally {\r\n setIsSubmitting(false);\r\n }\r\n };\r\n\r\n const selectedCount = Object.values(selectedData).filter(Boolean).length;\r\n const selectedConnectorCount = Object.values(connectorStates).filter(state => state.selected).length;\r\n const connectedCount = Object.values(connectorStates).filter(state => state.connected).length;\r\n\r\n return (\r\n <div className=\"w-full max-w-md mx-auto bg-white rounded-lg shadow-xl overflow-hidden\" style={{ maxHeight: '90vh', height: 'auto' }}>\r\n <div className=\"p-4 sm:p-6 overflow-y-auto\" style={{ maxHeight: 'calc(90vh - 4rem)' }}>\r\n <div className=\"text-center mb-4 sm:mb-6\">\r\n <h2 className=\"text-lg sm:text-xl font-bold text-gray-900 mb-2\">Data Request</h2>\r\n <p className=\"text-gray-600 text-xs sm:text-sm\">\r\n Select the data types and connections to share with <span className=\"font-medium\">{appName}</span>\r\n </p>\r\n </div>\r\n\r\n {/* Privacy Notice */}\r\n <div className=\"mb-4 sm:mb-6 p-2 sm:p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <p className=\"text-blue-800 text-xs sm:text-sm\">\r\n 🔒 Your selected data will be securely processed and used only for the intended purpose.\r\n </p>\r\n </div>\r\n\r\n {/* Data Types Selection */}\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-md font-semibold text-gray-900 mb-3\">Data Types</h3>\r\n <div className=\"space-y-2 sm:space-y-3\">\r\n {dataTypes.map((dataType) => {\r\n const isSelected = selectedData[dataType.id] || false;\r\n const isRequired = dataType.required;\r\n \r\n return (\r\n <div \r\n key={dataType.id}\r\n className={`flex items-center justify-between p-3 sm:p-4 border rounded-lg transition-colors ${\r\n isRequired \r\n ? 'bg-gray-100 border-gray-300 cursor-not-allowed' \r\n : 'hover:bg-gray-50 cursor-pointer border-gray-200'\r\n }`}\r\n onClick={() => handleRowClick(dataType.id)}\r\n >\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"text-xl sm:text-2xl\">\r\n {dataType.icon}\r\n </div>\r\n <div>\r\n <h4 className=\"font-medium text-gray-900 text-sm sm:text-base\">\r\n <Tooltip content={dataType.tooltip} privacyLink={dataType.privacyLink}>\r\n {dataType.name}\r\n </Tooltip>\r\n {isRequired && <span className=\"text-gray-500 ml-1 text-xs\">(Required)</span>}\r\n </h4>\r\n <p className=\"text-xs sm:text-sm text-gray-500\">{dataType.description}</p>\r\n </div>\r\n </div>\r\n \r\n {/* Toggle Switch or Required Badge */}\r\n {isRequired ? (\r\n <div className=\"px-2 py-1 bg-gray-400 text-white text-xs rounded-full\">\r\n Required\r\n </div>\r\n ) : (\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleDataToggle(dataType.id);\r\n }}\r\n className={`relative inline-flex h-5 sm:h-6 w-9 sm:w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 ${\r\n isSelected ? 'bg-blue-600' : 'bg-gray-200'\r\n }`}\r\n >\r\n <span\r\n className={`inline-block h-3 sm:h-4 w-3 sm:w-4 transform rounded-full bg-white transition-transform ${\r\n isSelected ? 'translate-x-5 sm:translate-x-6' : 'translate-x-1'\r\n }`}\r\n />\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n\r\n {/* Platform Connectors */}\r\n <div className=\"mb-6\">\r\n <h3 className=\"text-md font-semibold text-gray-900 mb-3\">Data Connectors</h3>\r\n <p className=\"text-xs text-gray-600 mb-3\">Select connected platforms to include their data</p>\r\n \r\n <div className=\"grid grid-cols-2 gap-2\">\r\n {platformConnectors.map((platform) => {\r\n const connectorState = connectorStates[platform.name];\r\n const isConnected = connectorState?.connected || false;\r\n const isSelected = connectorState?.selected || false;\r\n \r\n return (\r\n <div \r\n key={platform.name}\r\n className={`p-2 border rounded-lg transition-all duration-200 cursor-pointer ${\r\n !isConnected ? 'opacity-50 cursor-not-allowed border-gray-200 bg-gray-50' :\r\n isSelected ? 'border-green-400 bg-green-50' : \r\n 'border-gray-200 bg-white hover:border-gray-300'\r\n }`}\r\n onClick={() => isConnected && handleConnectorToggle(platform.name)}\r\n >\r\n <div className={`w-6 h-6 rounded ${platform.color} flex items-center justify-center text-white text-sm mb-2 mx-auto relative`}>\r\n {platform.icon}\r\n \r\n {/* Connection Status Indicator */}\r\n {isConnected && isSelected && (\r\n <div className=\"absolute -top-1 -right-1 w-3 h-3 bg-green-500 rounded-full flex items-center justify-center\">\r\n <svg className=\"w-2 h-2 text-white\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fillRule=\"evenodd\" d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\" clipRule=\"evenodd\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n \r\n <div className=\"text-center\">\r\n <h4 className=\"font-medium text-gray-900 text-xs\">{platform.name}</h4>\r\n <p className={`text-xs ${\r\n isConnected ? (isSelected ? 'text-green-600' : 'text-blue-600') : 'text-gray-400'\r\n }`}>\r\n {!isConnected ? 'Not connected' : \r\n isSelected ? 'Selected' : 'Tap to select'}\r\n </p>\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n \r\n {connectedCount === 0 && (\r\n <p className=\"text-xs text-yellow-600 mt-2 text-center\">\r\n ⚠️ No platforms connected. Connect platforms in onboarding to select data sources.\r\n </p>\r\n )}\r\n </div>\r\n\r\n {/* Selection Summary */}\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-green-50 border border-green-200 rounded-lg\">\r\n <p className=\"text-green-800 text-xs sm:text-sm\">\r\n ✅ {selectedCount} data type{selectedCount > 1 ? 's' : ''} and {selectedConnectorCount} connector{selectedConnectorCount > 1 ? 's' : ''} selected\r\n </p>\r\n </div>\r\n\r\n {/* API Status */}\r\n {isLoadingApi && (\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <p className=\"text-blue-800 text-xs sm:text-sm\">🔄 Processing your data request...</p>\r\n </div>\r\n )}\r\n\r\n {apiError && (\r\n <div className=\"mb-3 sm:mb-4 p-2 sm:p-3 bg-red-50 border border-red-200 rounded-lg\">\r\n <p className=\"text-red-800 text-xs sm:text-sm\">❌ {apiError}</p>\r\n </div>\r\n )}\r\n\r\n {/* Action Buttons */}\r\n <form onSubmit={handleSubmit} className=\"space-y-3\">\r\n <button\r\n type=\"submit\"\r\n disabled={isSubmitting || selectedCount === 0}\r\n className={`w-full py-2 sm:py-3 px-4 rounded-lg font-semibold transition-colors text-sm sm:text-base ${\r\n selectedCount > 0 && !isSubmitting\r\n ? 'bg-blue-600 text-white hover:bg-blue-700'\r\n : 'bg-gray-300 text-gray-500 cursor-not-allowed'\r\n }`}\r\n >\r\n {isSubmitting ? 'Processing...' : `Share Selected Data`}\r\n </button>\r\n \r\n <button\r\n type=\"button\"\r\n onClick={() => onComplete({ selectedData: {}, selectedConnectors: [], cancelled: true })}\r\n className=\"w-full py-2 text-gray-500 hover:text-gray-700 text-xs sm:text-sm\"\r\n >\r\n Cancel\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n );\r\n} ","import React, { useState, useEffect } from 'react';\r\n\r\nexport default function TrainingComponent({ onComplete, userEmail, appName = 'App' }) {\r\n const [currentStep, setCurrentStep] = useState(0);\r\n const [progress, setProgress] = useState(0);\r\n const [isComplete, setIsComplete] = useState(false);\r\n\r\n const steps = [\r\n {\r\n title: 'Setting up your personal AI',\r\n description: 'Initializing your secure data model',\r\n icon: '🤖',\r\n duration: 2000\r\n },\r\n {\r\n title: 'Processing your connections',\r\n description: 'Analyzing your social media patterns',\r\n icon: '🔗',\r\n duration: 2500\r\n },\r\n {\r\n title: 'Training your model',\r\n description: 'Building your personalized insights',\r\n icon: '🧠',\r\n duration: 3000\r\n },\r\n {\r\n title: 'Finalizing setup',\r\n description: 'Preparing your Onairos experience',\r\n icon: '✨',\r\n duration: 2000\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n let interval;\r\n let stepTimeout;\r\n\r\n if (currentStep < steps.length) {\r\n const stepDuration = steps[currentStep].duration;\r\n const stepProgress = 100 / steps.length;\r\n\r\n // Update progress gradually\r\n interval = setInterval(() => {\r\n setProgress(prev => {\r\n const newProgress = prev + (stepProgress / (stepDuration / 100));\r\n return Math.min(newProgress, (currentStep + 1) * stepProgress);\r\n });\r\n }, 100);\r\n\r\n // Move to next step after duration\r\n stepTimeout = setTimeout(() => {\r\n if (currentStep < steps.length - 1) {\r\n setCurrentStep(prev => prev + 1);\r\n } else {\r\n setIsComplete(true);\r\n setTimeout(() => {\r\n onComplete({\r\n trainingComplete: true,\r\n timestamp: new Date().toISOString(),\r\n userEmail: userEmail,\r\n appName: appName\r\n });\r\n }, 1000);\r\n }\r\n }, stepDuration);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n if (stepTimeout) clearTimeout(stepTimeout);\r\n };\r\n }, [currentStep, onComplete, userEmail, appName]);\r\n\r\n return (\r\n <div className=\"max-w-md mx-auto bg-white p-6 min-h-[400px] flex flex-col justify-center\">\r\n <div className=\"text-center mb-8\">\r\n <div className=\"w-20 h-20 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center mx-auto mb-4\">\r\n <div className=\"text-3xl\">\r\n {isComplete ? '🎉' : steps[currentStep]?.icon}\r\n </div>\r\n </div>\r\n <h2 className=\"text-2xl font-bold text-gray-900 mb-2\">\r\n {isComplete ? 'All set!' : steps[currentStep]?.title}\r\n </h2>\r\n <p className=\"text-gray-600\">\r\n {isComplete \r\n ? 'Your personal AI is ready to use' \r\n : steps[currentStep]?.description\r\n }\r\n </p>\r\n </div>\r\n\r\n {/* Progress Bar */}\r\n <div className=\"mb-6\">\r\n <div className=\"flex justify-between text-sm text-gray-500 mb-2\">\r\n <span>Progress</span>\r\n <span>{Math.round(progress)}%</span>\r\n </div>\r\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\r\n <div \r\n className=\"bg-gradient-to-r from-blue-500 to-purple-600 h-2 rounded-full transition-all duration-300 ease-out\"\r\n style={{ width: `${progress}%` }}\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Steps Indicator */}\r\n <div className=\"flex justify-center space-x-2 mb-6\">\r\n {steps.map((_, index) => (\r\n <div\r\n key={index}\r\n className={`w-3 h-3 rounded-full transition-all duration-300 ${\r\n index <= currentStep \r\n ? 'bg-blue-500' \r\n : 'bg-gray-300'\r\n }`}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Current Step Details */}\r\n <div className=\"bg-gray-50 p-4 rounded-lg\">\r\n <div className=\"flex items-center space-x-3\">\r\n <div className=\"w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center\">\r\n <div className=\"text-sm\">\r\n {isComplete ? '✅' : steps[currentStep]?.icon}\r\n </div>\r\n </div>\r\n <div>\r\n <h3 className=\"font-medium text-gray-900\">\r\n {isComplete ? 'Training Complete' : `Step ${currentStep + 1} of ${steps.length}`}\r\n </h3>\r\n <p className=\"text-sm text-gray-600\">\r\n {isComplete \r\n ? 'Your Onairos experience is ready' \r\n : steps[currentStep]?.description\r\n }\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* App Info */}\r\n <div className=\"mt-6 text-center\">\r\n <p className=\"text-sm text-gray-500\">\r\n Setting up for <span className=\"font-medium\">{appName}</span>\r\n </p>\r\n {userEmail && (\r\n <p className=\"text-xs text-gray-400 mt-1\">\r\n {userEmail}\r\n </p>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n} ","import React, { useEffect, useState } from 'react';\nimport EmailAuth from './components/EmailAuth.js';\nimport UniversalOnboarding from './components/UniversalOnboarding.jsx';\nimport PinSetup from './components/PinSetup.js';\nimport DataRequest from './components/DataRequest.js';\nimport TrainingComponent from './components/TrainingComponent.jsx';\n\nexport function OnairosButton({\n requestData, \n webpageName, \n inferenceData = null, \n onComplete = null, \n autoFetch = false,\n testMode = false,\n proofMode = false, \n textLayout = 'below', \n textColor = 'white',\n login = false,\n buttonType = 'pill',\n loginReturn = null,\n loginType = 'signIn',\n visualType = 'full',\n appIcon = null,\n enableTraining = true\n}) {\n\n const [showOverlay, setShowOverlay] = useState(false);\n const [currentFlow, setCurrentFlow] = useState('email'); // 'email' | 'onboarding' | 'pin' | 'dataRequest' (training is within onboarding)\n const [userData, setUserData] = useState(null);\n const [error, setError] = useState(null);\n\n // Check for existing user session\n useEffect(() => {\n const checkExistingSession = () => {\n const savedUser = localStorage.getItem('onairosUser');\n if (savedUser) {\n try {\n const user = JSON.parse(savedUser);\n setUserData(user);\n // If user has completed onboarding and PIN setup, go directly to data request\n if (user.onboardingComplete && user.pinCreated) {\n setCurrentFlow('dataRequest');\n } else if (user.verified && !user.onboardingComplete) {\n setCurrentFlow('onboarding');\n } else if (user.onboardingComplete && !user.pinCreated) {\n setCurrentFlow('pin');\n }\n } catch (error) {\n console.error('Error parsing saved user data:', error);\n localStorage.removeItem('onairosUser');\n }\n }\n };\n\n checkExistingSession();\n }, []);\n\n const openTerminal = async () => {\n try {\n console.log('🔥 openTerminal called');\n setShowOverlay(true);\n } catch (error) {\n console.error('Error in openTerminal:', error);\n }\n };\n\n const handleCloseOverlay = () => {\n setShowOverlay(false);\n setError(null);\n };\n\n // Handle clicks on the backdrop to close modal\n const handleBackdropClick = (e) => {\n if (e.target === e.currentTarget) {\n handleCloseOverlay();\n }\n };\n\n const handleEmailAuthSuccess = (authData) => {\n console.log('🔥 Email auth successful:', authData);\n console.log('🔧 User State:', {\n isNewUser: authData.isNewUser,\n userState: authData.userState,\n flowType: authData.flowType,\n existingUser: authData.existingUser\n });\n \n // Determine flow based on verification response\n const isNewUser = authData.isNewUser === true || authData.flowType === 'onboarding' || authData.userState === 'new';\n \n const newUserData = {\n ...authData,\n verified: true,\n onboardingComplete: !isNewUser, // New users need onboarding, returning users have completed it\n pinCreated: !isNewUser // Assume returning users have PIN, new users need to create it\n };\n \n setUserData(newUserData);\n localStorage.setItem('onairosUser', JSON.stringify(newUserData));\n \n // Flow decision logic\n if (isNewUser) {\n console.log('🚀 New user detected → Starting onboarding flow (includes training)');\n setCurrentFlow('onboarding');\n } else {\n console.log('👋 Existing user detected → Going directly to data request');\n setCurrentFlow('dataRequest');\n }\n };\n\n const handleOnboardingComplete = (onboardingData) => {\n console.log('Onboarding completed:', onboardingData);\n const updatedUserData = {\n ...userData,\n onboardingComplete: true,\n connectedAccounts: onboardingData.connectedAccounts || []\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n setCurrentFlow('pin');\n };\n\n const handlePinSetupComplete = (pinData) => {\n console.log('PIN setup completed:', pinData);\n const updatedUserData = {\n ...userData,\n ...pinData,\n pinCreated: true\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request flow within the same overlay\n setCurrentFlow('dataRequest');\n };\n\n const handleTrainingComplete = (trainingResult) => {\n console.log('🎓 Training completed:', trainingResult);\n const updatedUserData = {\n ...userData,\n trainingCompleted: true,\n ...trainingResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n \n // Move to data request after training\n setCurrentFlow('dataRequest');\n };\n\n const handleDataRequestComplete = (requestResult) => {\n console.log('🔥 OnairosButton: Data request completed:', requestResult);\n \n // Update user data with request result\n const updatedUserData = {\n ...userData,\n lastDataRequest: requestResult\n };\n setUserData(updatedUserData);\n localStorage.setItem('onairosUser', JSON.stringify(updatedUserData));\n\n // Close overlay\n setShowOverlay(false);\n\n // Call onComplete callback if provided\n console.log('🔥 Calling onComplete callback with:', requestResult);\n if (onComplete) {\n try {\n onComplete(requestResult);\n console.log('🔥 onComplete callback executed successfully');\n } catch (error) {\n console.error('🔥 Error in onComplete callback:', error);\n }\n } else {\n console.log('🔥 No onComplete callback provided');\n }\n };\n\n const renderCurrentFlow = () => {\n switch (currentFlow) {\n case 'email':\n return (\n <EmailAuth \n onSuccess={handleEmailAuthSuccess}\n testMode={testMode} // Use the testMode prop from initialization\n />\n );\n \n case 'onboarding':\n return (\n <UniversalOnboarding \n onComplete={handleOnboardingComplete}\n appIcon={appIcon || \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n appName={webpageName}\n username={userData?.email || userData?.username}\n />\n );\n \n case 'pin':\n return (\n <PinSetup \n onComplete={handlePinSetupComplete}\n userEmail={userData?.email}\n />\n );\n \n case 'training':\n return (\n <TrainingComponent \n onComplete={handleTrainingComplete}\n userEmail={userData?.email}\n appName={webpageName}\n connectedAccounts={userData?.connectedAccounts || []}\n />\n );\n \n case 'dataRequest':\n return (\n <DataRequest \n onComplete={handleDataRequestComplete}\n userEmail={userData?.email}\n requestData={requestData}\n appName={webpageName}\n autoFetch={autoFetch}\n testMode={testMode}\n appIcon={appIcon}\n connectedAccounts={userData?.connectedAccounts || {}}\n />\n );\n \n default:\n return (\n <div className=\"flex flex-col items-center space-y-4 p-6\">\n <div className=\"animate-spin h-8 w-8 border-2 border-blue-600 rounded-full border-t-transparent\"></div>\n <p className=\"text-gray-600\">Loading...</p>\n </div>\n );\n }\n };\n\n // Styling and button class based on visual type\n const buttonClass = \n `flex items-center justify-center font-bold rounded cursor-pointer ${\n buttonType === 'pill' ? 'px-4 py-2' : 'w-12 h-12'\n } bg-transparent OnairosConnect`;\n\n const buttonStyle = {\n flexDirection: textLayout === 'below' ? 'column' : 'row',\n backgroundColor: 'transparent',\n color: textColor,\n border: '1px solid transparent',\n };\n\n // Icon and text style based on the visualType\n const logoStyle = {\n width: '20px',\n height: '20px',\n marginRight: visualType === 'full' ? '12px' : '0',\n };\n\n const getText = () => {\n switch (loginType) {\n case 'signUp':\n return 'Sign Up with Onairos';\n case 'signOut':\n return 'Sign Out of Onairos';\n default:\n return 'Sign In with Onairos';\n }\n };\n\n return (\n <>\n <button\n className={buttonClass}\n onClick={openTerminal}\n style={buttonStyle}\n >\n {(visualType === 'full' || visualType === 'icon') && (\n <img\n src={login ? \"https://onairos.sirv.com/Images/OnairosWhite.png\" : \"https://onairos.sirv.com/Images/OnairosBlack.png\"}\n alt=\"Onairos Logo\"\n style={logoStyle}\n />\n )}\n {visualType !== 'icon' && (\n <span className={`${textColor === 'black' ? 'text-black' : 'text-white'} ${visualType === 'icon' ? 'sr-only' : ''} ${textLayout === 'right' ? 'ml-2' : textLayout === 'left' ? 'mr-2' : ''}`}>\n {getText()}\n </span>\n )}\n </button>\n\n {/* Full-Screen Overlay (Plaid/SendPay Style) */}\n {showOverlay && (\n <div \n className=\"fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50\"\n onClick={handleBackdropClick}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl max-w-md w-full mx-4 max-h-[90vh] overflow-hidden relative\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Close button */}\n <button\n onClick={handleCloseOverlay}\n className=\"absolute top-4 right-4 text-gray-400 hover:text-gray-600 z-10\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n\n {/* Content */}\n <div className=\"overflow-y-auto max-h-[90vh]\">\n {renderCurrentFlow()}\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport default OnairosButton;","import React from 'react';\r\nimport OnairosButton from './onairosButton.jsx';\r\n\r\n// Main Onairos component\r\nexport function Onairos(props) {\r\n return (\r\n <>\r\n <OnairosButton {...props} />\r\n </>\r\n );\r\n}\r\n\r\n// Export both the main component and individual components\r\nexport { OnairosButton };\r\nexport default Onairos;\r\n\r\n// Initialize SDK functionality (if needed)\r\nexport const initializeApiKey = async (config) => {\r\n // SDK initialization logic would go here\r\n console.log('🔧 SDK initialized with config:', config);\r\n return Promise.resolve();\r\n};\r\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__639__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","toPascalCase","string","camelCase","replace","match","p1","p2","toUpperCase","toLowerCase","toCamelCase","charAt","slice","mergeClasses","classes","filter","className","index","array","Boolean","trim","indexOf","join","hasA11yProp","props","startsWith","defaultAttributes","xmlns","width","height","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","Icon","forwardRef","color","size","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","Number","map","tag","attrs","Array","isArray","createLucideIcon","iconName","Component","displayName","Mail","x","y","rx","ArrowRight","Check","EmailAuth","_ref","onSuccess","testMode","email","setEmail","useState","code","setCode","step","setStep","isLoading","setIsLoading","error","setError","handleEmailSubmit","async","e","preventDefault","test","validateEmail","setTimeout","fetch","method","headers","body","JSON","stringify","ok","Error","message","handleCodeSubmit","verified","response","data","json","token","React","onSubmit","htmlFor","type","id","onChange","target","placeholder","required","disabled","maxLength","onClick","platforms","name","icon","connector","sdkConfig","apiKey","process","env","REACT_APP_ONAIROS_API_KEY","baseUrl","REACT_APP_ONAIROS_BASE_URL","sdkType","enableHealthMonitoring","enableAutoRefresh","enableConnectionValidation","UniversalOnboarding","onComplete","appIcon","appName","connectedAccounts","setConnectedAccounts","isConnecting","setIsConnecting","connectingPlatform","setConnectingPlatform","connectionErrors","setConnectionErrors","connectionHealth","setConnectionHealth","healthScore","setHealthScore","useEffect","handleOAuthReturn","platform","localStorage","getItem","console","log","concat","removeItem","prev","_objectSpread","connectToPlatform","platformName","find","p","_localStorage$getItem","username","authorizeUrl","session","status","statusText","responseData","possibleKeys","oauthUrl","usedKey","keys","navigator","userAgent","window","innerWidth","setItem","location","href","popup","open","hasNavigatedToOnairos","checkInterval","setInterval","hostname","close","closed","clearInterval","successFlag","errorFlag","timestamp","isRecentSignal","Date","now","parseInt","connectedCount","values","length","src","alt","isConnected","isCurrentlyConnecting","hasError","isDisabled","handleToggle","fillRule","clipRule","handleContinue","connected","entries","_ref2","_ref3","totalConnections","sdkVersion","enhancedFeatures","healthMonitoring","autoRefresh","connectionValidation","PinSetup","userEmail","pin","setPin","requirements","setRequirements","number","special","canSubmit","every","req","pinCreated","toISOString","label","platformConnectors","dataTypes","description","tooltip","privacyLink","Tooltip","content","showTooltip","setShowTooltip","onMouseEnter","onMouseLeave","rel","DataRequest","autoFetch","selectedData","setSelectedData","basic","personality","preferences","connectorStates","setConnectorStates","isSubmitting","setIsSubmitting","isLoadingApi","setIsLoadingApi","apiResponse","setApiResponse","apiError","setApiError","initialStates","forEach","selected","handleDataToggle","dataId","dataType","dt","fetchUserData","userHash","hash","str","toString","i","charCodeAt","Math","abs","generateUserHash","approvedData","_ref4","selectedConnectors","_ref5","state","_ref6","mapDataTypesToConfirmations","confirmations","currentDate","dataTypeMapping","push","date","apiEndpoint","baseResult","apiUrl","requestBody","Info","storage","appId","connectors","EncryptedUserPin","account","proofMode","Domain","web3Type","OthentSub","result","success","selectedCount","selectedConnectorCount","style","maxHeight","isSelected","isRequired","handleRowClick","stopPropagation","connectorState","_prev$platformName","cancelled","TrainingComponent","_steps$currentStep","_steps$currentStep2","_steps$currentStep3","_steps$currentStep4","_steps$currentStep5","currentStep","setCurrentStep","progress","setProgress","isComplete","setIsComplete","steps","title","duration","interval","stepTimeout","stepDuration","stepProgress","newProgress","min","trainingComplete","clearTimeout","round","_","requestData","webpageName","inferenceData","textLayout","textColor","login","buttonType","loginReturn","loginType","visualType","enableTraining","showOverlay","setShowOverlay","currentFlow","setCurrentFlow","userData","setUserData","checkExistingSession","savedUser","user","parse","onboardingComplete","handleCloseOverlay","handleEmailAuthSuccess","authData","isNewUser","userState","flowType","existingUser","newUserData","handleOnboardingComplete","onboardingData","updatedUserData","handlePinSetupComplete","pinData","handleTrainingComplete","trainingResult","trainingCompleted","handleDataRequestComplete","requestResult","lastDataRequest","buttonClass","buttonStyle","flexDirection","backgroundColor","border","logoStyle","marginRight","getText","currentTarget","renderCurrentFlow","Onairos","OnairosButton","initializeApiKey","config","Promise","resolve"],"sourceRoot":""}
|