/** * @fileoverview Wallet Transfer Tokens Exporter & Redeemer Controller * @module controllers/wallet-controller * @description وحدة التحكم في تصدير شحنات الرصيد المقيدة بكود الجهاز، فك تشفير الحزم، واسترداد الكبسولات. */ (global => { 'use strict'; /** * بناء واجهة تصدير الشحنات والتحويل */ const buildExporterLayout = () => { const pane = document.getElementById('j3cvbn5t2y'); if (!pane) return false; if (pane.querySelector('#nchqm6bweg')) return true; const card = document.createElement('div'); card.id = 'nchqm6bweg'; card.style.cssText = 'border: 1px solid var(--border); border-radius: var(--radius-xl); padding: clamp(14px, 1.8vw, 24px); text-align: right; direction: rtl; background: var(--bg-card); box-shadow: var(--shadow-xs); box-sizing: border-box;'; card.innerHTML = `

تحويل الرصيد وتصدير الكبسولات المشفرة

نظام حماية موحد: أصبح إدخال كود جهاز العميل المستلم (128 حرف) إجبارياً لمنع استغلال الشحنات أو تصديرها لنفس الحساب. يتم قفل وتشفير الحزمة خصيصاً لجهاز العميل المستهدف لضمان وصول الرصيد لمن يستحقه فقط.

0 / 128 حرف
إدخال كود الجهاز المستلم مطلوب إجبارياً لتأمين الشحنة.
آمن ومحمي

ملخص السحب ورسوم التحويل

إجمالي المبلغ المسحوب: $0.00 | 0 FB | 0 WA
رسوم التحويل المباشر: $0.00 (مجاني بالكامل)
`; pane.appendChild(card); bindLiveRecipientInputValidator(); return true; }; /** * بناء واجهة شحن واسترداد الرصيد والكبسولات */ const buildRedeemerLayout = () => { const pane = document.getElementById('sq5nufndhg'); if (!pane) return false; if (pane.querySelector('#vbyni617ug')) return true; const card = document.createElement('div'); card.id = 'vbyni617ug'; card.style.cssText = 'border: 1px solid var(--border); border-radius: var(--radius-xl); padding: clamp(14px, 1.8vw, 24px); direction: rtl; text-align: right; background: var(--bg-card); box-shadow: var(--shadow-xs); box-sizing: border-box;'; card.innerHTML = `

شحن الرصيد والكبسولات المستلمة

الصق كود حزمة الشحن المشفرة (.txt) التي استلمتها في الأسفل، واكتب كلمة المرور (اترك خانة الباسورد فارغة إذا كان الملف بدون حماية)، ثم اضغط زر التحقق لشحن محفظتك أو إضافة الكبسولة لخزنتك فوراً.

`; pane.appendChild(card); return true; }; /** * تحديث ملخص مبالغ السحب المباشر */ const updateLiveWithdrawalSummaryUI = () => { const usdVal = Math.max(0.00, parseFloat(document.getElementById('xnzi30x7ea')?.value) || 0.00); const fbVal = Math.max(0, parseInt(document.getElementById('qwu2e2v8s3')?.value, 10) || 0); const waVal = Math.max(0, parseInt(document.getElementById('yjazkr9opa')?.value, 10) || 0); const sumLabel = document.getElementById('q6hqazfib2'); if (sumLabel) { sumLabel.textContent = `$${usdVal.toFixed(2)} | ${fbVal.toLocaleString('en-US')} FB | ${waVal.toLocaleString('en-US')} WA`; } }; /** * التحقق اللحظي من كود جهاز المستلم (128 حرف) */ const bindLiveRecipientInputValidator = () => { const recipientInput = document.getElementById('u16nnmwl7p'); const counterBadge = document.getElementById('recipient-id-counter-badge'); const statusMsg = document.getElementById('recipient-id-status-msg'); if (!recipientInput) return; recipientInput.addEventListener('input', async () => { const val = recipientInput.value.trim(); const len = val.length; const currentAccountId = await global.FritreeCrypto.getOrGenerateAccountId(); if (counterBadge) counterBadge.textContent = `${len} / 128 حرف`; if (len === 0) { recipientInput.style.borderColor = 'var(--danger-border)'; recipientInput.style.background = 'var(--danger-light)'; if (statusMsg) { statusMsg.style.color = 'var(--danger)'; statusMsg.innerHTML = ` إدخال كود الجهاز المستلم مطلوب إجبارياً.`; } } else if (val === currentAccountId) { recipientInput.style.borderColor = 'var(--danger)'; recipientInput.style.background = 'var(--danger-light)'; if (statusMsg) { statusMsg.style.color = 'var(--danger)'; statusMsg.innerHTML = ` حظر أمني حرج: كود الجهاز المدخل هو كود جهازك الشخصي!`; } } else if (len === 128) { recipientInput.style.borderColor = 'var(--success-border)'; recipientInput.style.background = 'var(--success-light)'; if (statusMsg) { statusMsg.style.color = 'var(--success-hover)'; statusMsg.innerHTML = ` تم التحقق بنجاح! كود الجهاز مكتمل (128 حرف) وموثق لتأمين الشحنة.`; } } else { recipientInput.style.borderColor = 'var(--warning-border)'; recipientInput.style.background = 'var(--warning-light)'; if (statusMsg) { statusMsg.style.color = 'var(--warning-hover)'; statusMsg.innerHTML = ` باقي ${128 - len} حرف لاستكمال كود الجهاز الموثق (128 حرف)...`; } } }); }; /** * تصدير حزمة الشحن وتنزيل ملف التوكن المشفر (.txt) */ const compileAndExportTransferToken = async () => { const errorLabel = document.getElementById('zpu8uvme2z'); const tokenDisplay = document.getElementById('qek5c5rqh7'); if (errorLabel) errorLabel.textContent = ''; if (tokenDisplay) tokenDisplay.value = ''; const usdToSend = Math.max(0.00, parseFloat(document.getElementById('xnzi30x7ea')?.value) || 0.00); const fbToSend = Math.max(0, parseInt(document.getElementById('qwu2e2v8s3')?.value, 10) || 0); const waToSend = Math.max(0, parseInt(document.getElementById('yjazkr9opa')?.value, 10) || 0); const recipientId = (document.getElementById('u16nnmwl7p')?.value || '').trim(); const passphrase = document.getElementById('cycuafs1a7')?.value || ''; const transactionNote = (document.getElementById('nvzw8wdcm7')?.value || '').trim(); const isTimeCapsuleActive = document.getElementById('sifl5cxa6d')?.checked || false; const capsuleMode = document.querySelector('input[name="capsule_destination_type"]:checked')?.value || 'local'; const capsuleUnlockDateTime = document.getElementById('tht50iqk5w')?.value || ''; const capsuleTitle = (document.getElementById('yz65z6aitz')?.value || '').trim(); if (usdToSend === 0 && fbToSend === 0 && waToSend === 0) { alert("تنبيه: حدد مبلغاً أو كمية نقاط أكبر من الصفر أولاً!"); return; } const currentAccountId = await global.FritreeCrypto.getOrGenerateAccountId(); if (!(isTimeCapsuleActive && capsuleMode === 'local')) { if (!recipientId || recipientId.length !== 128) { alert("تنبيه أمني إجباري: كود جهاز العميل المستلم (128 حرف) مطلوب إجبارياً لتأمين الشحنة!"); return; } if (recipientId === currentAccountId) { alert("حظر أمني: لا يمكنك تصدير شحنة لكود جهازك الشخصي!"); return; } } if (isTimeCapsuleActive && (!capsuleUnlockDateTime || new Date(capsuleUnlockDateTime).getTime() <= Date.now())) { alert("اختر تاريخاً ووقتاً مستقبلياً صالحاً لفك الكبسولة!"); return; } const activeUsd = global.FritreeAppState ? global.FritreeAppState.getPoints() : 0.00; const activeFb = global.FritreeAppState ? global.FritreeAppState.getFbPoints() : 0; const activeWa = global.FritreeAppState ? global.FritreeAppState.getWaPoints() : 0; if (usdToSend > activeUsd || fbToSend > activeFb || waToSend > activeWa) { alert("رصيد محفظتك المتاح غير كافٍ لإتمام العملية!"); return; } try { const shortRecipientKey = recipientId ? (recipientId.substring(0, 16) + "...") : "عام مفتوح"; const memoText = transactionNote ? ` (${transactionNote})` : ""; if (usdToSend > 0) await global.FritreeAppState.deductPoints(usdToSend, `سحب رصيد وتوليد شحنة لـ: [${shortRecipientKey}]${memoText}`); if (fbToSend > 0) await global.FritreeAppState.deductFbCards(fbToSend, `سحب نقاط فيسبوك وتوليد شحنة لـ: [${shortRecipientKey}]${memoText}`); if (waToSend > 0) await global.FritreeAppState.deductWaCards(waToSend, `سحب نقاط واتساب وتوليد شحنة لـ: [${shortRecipientKey}]${memoText}`); if (isTimeCapsuleActive && capsuleMode === 'local') { const capsules = await global.FritreeStorage.get('local_time_capsules', []) || []; capsules.push({ id: 'cap_' + Date.now() + '_' + Math.random().toString(36).substr(2, 4), title: capsuleTitle || 'كبسولة شحن زمنية محلية', usd: usdToSend, fb: fbToSend, wa: waToSend, unlockDate: capsuleUnlockDateTime, createdAt: new Date().toISOString() }); await global.FritreeStorage.set('local_time_capsules', capsules); await global.FritreeAppState.saveAccountData(); if (global.FritreeShellLayout) global.FritreeShellLayout.updatePointsUI(); alert(`تم تجميد الرصيد بنجاح داخل خزنة الكبسولات حتى ${new Date(capsuleUnlockDateTime).toLocaleString('en-US')}`); if (global.FritreeWallet) { global.FritreeWallet.renderCapsules(); global.FritreeWallet.renderLedgerTable(); } return; } await global.FritreeAppState.saveAccountData(); if (global.FritreeShellLayout) global.FritreeShellLayout.updatePointsUI(); const pointsPayload = { usd: usdToSend, fb_cards: fbToSend, wa_cards: waToSend, note: transactionNote || "حزمة تحويل نقاط مشفرة", isCapsule: isTimeCapsuleActive, unlockDate: isTimeCapsuleActive ? capsuleUnlockDateTime : null }; const compiledToken = await global.FritreeCrypto.encryptTokenPayload(pointsPayload, recipientId, passphrase); if (compiledToken) { if (tokenDisplay) tokenDisplay.value = compiledToken; const blob = new Blob([compiledToken], { type: 'text/plain;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; const now = new Date(); const pad = num => String(num).padStart(2, '0'); const timestamp = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}_${pad(now.getHours())}-${pad(now.getMinutes())}-${pad(now.getSeconds())}`; a.download = `حزمة_شحن_مقيدة_${timestamp}.txt`; a.click(); URL.revokeObjectURL(url); alert("تم توليد وتنزيل ملف حزمة الشحن المشفرة بنجاح!"); if (global.FritreeWallet) global.FritreeWallet.renderLedgerTable(); } } catch (e) { console.error("[Fritree Exporter] Package export failed:", e); alert("خطأ: تعثرت عملية تشفير وتصدير الشحنة."); } }; /** * استرداد وفك تشفير حزمة الشحن المستلمة */ const claimCryptographicTransferToken = async () => { const errorLabel = document.getElementById('vqpcg6hua7'); const tokenInput = document.getElementById('sg65uyiz7p'); const passInput = document.getElementById('r93wdteoh3'); const receiptCard = document.getElementById('gme79arpf5'); if (errorLabel) errorLabel.textContent = ''; if (receiptCard) receiptCard.style.display = 'none'; const rawTokenText = (tokenInput ? tokenInput.value : '').trim(); const passphrase = (passInput ? passInput.value : ''); if (!rawTokenText) { alert("الصق كود حزمة الشحن أولاً!"); return; } try { const currentAccountId = await global.FritreeCrypto.getOrGenerateAccountId(); const decryptedPayload = await global.FritreeCrypto.decryptTokenPayload(rawTokenText, passphrase); if (!decryptedPayload) { alert("فشل فك التشفير: كلمة المرور غير صحيحة أو الملف معطوب."); return; } const pointsObj = decryptedPayload.points; const targetId = decryptedPayload.targetAccountId; const tokenId = decryptedPayload.tokenId; if (targetId && targetId !== currentAccountId) { alert("فشل الشحن: هذا الكود مقيد ومقفل برمجياً لجهاز آخر!"); return; } const usedTokens = await global.FritreeStorage.get('usedTokens', []); if (usedTokens.includes(tokenId)) { alert("كود مكرر: تم استرداد هذه الشحنة سابقاً!"); return; } const usdToClaim = parseFloat(pointsObj.usd) || 0.00; const fbToClaim = parseInt(pointsObj.fb_cards, 10) || 0; const waToClaim = parseInt(pointsObj.wa_cards, 10) || 0; if (usdToClaim > 0) await global.FritreeAppState.addPoints(usdToClaim, `شحن رصيد مستلم: [${tokenId.substring(0, 10)}...]`); if (fbToClaim > 0) await global.FritreeAppState.addFbCards(fbToClaim, `شحن نقاط فيسبوك مستلمة: [${tokenId.substring(0, 10)}...]`); if (waToClaim > 0) await global.FritreeAppState.addWaCards(waToClaim, `شحن نقاط واتساب مستلمة: [${tokenId.substring(0, 10)}...]`); usedTokens.push(tokenId); await global.FritreeStorage.set('usedTokens', usedTokens); await global.FritreeAppState.saveAccountData(); if (global.FritreeShellLayout) global.FritreeShellLayout.updatePointsUI(); if (receiptCard) receiptCard.style.display = 'block'; alert(`تم شحن رصيدك بنجاح!\n+$${usdToClaim.toFixed(2)} USD | +${fbToClaim} FB | +${waToClaim} WA`); if (global.FritreeWallet) global.FritreeWallet.renderLedgerTable(); } catch (e) { console.error("[Fritree Redeemer] Claim token error:", e); alert("حدث خطأ أثناء فك تشفير حزمة الشحن."); } }; /** * ربط أحداث التصدير والاسترداد */ const bindWalletControllerEvents = () => { const compileBtn = document.getElementById('eli70yj5bx'); const claimBtn = document.getElementById('fi4ictsrtl'); const copyBtn = document.getElementById('igxgybpsvi'); const tokenDisplay = document.getElementById('qek5c5rqh7'); const chkCapsule = document.getElementById('sifl5cxa6d'); const capsuleWrapper = document.getElementById('h3ggat29nr'); if (chkCapsule && capsuleWrapper) { chkCapsule.onchange = (e) => { capsuleWrapper.style.display = e.target.checked ? 'block' : 'none'; }; } if (compileBtn) compileBtn.onclick = compileAndExportTransferToken; if (claimBtn) claimBtn.onclick = claimCryptographicTransferToken; if (copyBtn && tokenDisplay) { copyBtn.onclick = () => { if (!tokenDisplay.value) return; navigator.clipboard.writeText(tokenDisplay.value).then(() => { const originalHtml = copyBtn.innerHTML; copyBtn.innerHTML = ' '; setTimeout(() => { copyBtn.innerHTML = originalHtml; }, 2000); }); }; } }; /** * تهيئة وحدة تحكم المحفظة */ const initWalletController = () => { buildExporterLayout(); buildRedeemerLayout(); bindWalletControllerEvents(); return true; }; /** * تصدير وحدة تحكم المحفظة */ global.FritreeWalletExporter = { init: initWalletController, exportToken: compileAndExportTransferToken, updateLiveSummary: updateLiveWithdrawalSummaryUI }; global.FritreeWalletRedeemer = { init: initWalletController, claimToken: claimCryptographicTransferToken }; if (typeof document !== 'undefined') { initWalletController(); } })(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);