fc / app-state.js
Althnayi's picture
Upload 56 files
cca0cf3 verified
Raw
History Blame Contribute Delete
22.3 kB
/**
* @fileoverview Central App State & Wallet Points Store
* @module state/app-state
* @description إدارة الحالة المركزية للمحفظة، معاملات النقاط، توقيع الأرصدة الرقمية، وبيانات الحساب الأساسية.
*/
(global => {
'use strict';
/**
* الحالة المركزية للتطبيق
*/
const DashboardState = {
usdPoints: 100.00,
usedSerials: [],
pointsTransactions: [],
balanceSignature: "",
fbPoints: 0,
fbPointsSignature: "",
waPoints: 0,
waPointsSignature: "",
currentAccountId: null,
userName: "",
userPhone: "",
waLink: "",
userXP: 0,
userLevel: 1,
lifetimeFb: 0,
lifetimeWa: 0,
lifetimeTasks: 0,
activeSubscription: 'Lifetime Unlimited',
subExpiryDate: null,
activeTasks: [],
isLoaded: false
};
/**
* حساب التوقيع الرقمي لرصيد الدولار
* @param {number} points
* @returns {Promise<string>}
*/
async function computeBalanceSignature(points) {
const salt = global.FritreeAppConstants?.SECURITY_SALTS?.BALANCE_SALT ||
"FritreeBalanceSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
const formattedUSD = parseFloat(points).toFixed(2);
const rawPayload = `usdPoints:${formattedUSD}:${salt}`;
if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
return await global.FritreeCrypto.sha256(rawPayload);
}
return "fallback_bal_sig_" + Math.random().toString(36).substring(2);
}
/**
* حساب التوقيع الرقمي لنقاط فيسبوك
* @param {number} shares
* @returns {Promise<string>}
*/
async function computeFbCardsSignature(shares) {
const salt = global.FritreeAppConstants?.SECURITY_SALTS?.FB_CARDS_SALT ||
"FritreeFbCardsSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
const rawPayload = `acc_fbPoints:${shares}:${salt}`;
if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
return await global.FritreeCrypto.sha256(rawPayload);
}
return "fallback_fb_sig_" + Math.random().toString(36).substring(2);
}
/**
* حساب التوقيع الرقمي لنقاط واتساب
* @param {number} shares
* @returns {Promise<string>}
*/
async function computeWaCardsSignature(shares) {
const salt = global.FritreeAppConstants?.SECURITY_SALTS?.WA_CARDS_SALT ||
"FritreeWaCardsSymmetricSignatureSalt_2026_EnterpriseStrict_V5";
const rawPayload = `acc_waPoints:${shares}:${salt}`;
if (global.FritreeCrypto && typeof global.FritreeCrypto.sha256 === 'function') {
return await global.FritreeCrypto.sha256(rawPayload);
}
return "fallback_wa_sig_" + Math.random().toString(36).substring(2);
}
/**
* تحديث جميع عناصر الأرصدة والنقاط في الـ DOM
*/
function updateAllPointsDOMElements() {
const state = DashboardState;
// الأرصدة في شريط الترويسة
const badgeBalance = document.getElementById('q20kc2pzo4');
const fbB = document.getElementById('n2jtnhukcl');
const waB = document.getElementById('b8bid195p8');
// الأرصدة في صفحة المتجر
const storeBalance = document.getElementById('u39mvrlgpk');
// الأرصدة في صفحة المحفظة والخزنة
const walletUsd = document.getElementById('urp3goak31');
const walletFb = document.getElementById('jsfgartkej');
const walletWa = document.getElementById('qul9lan6tq');
if (badgeBalance) badgeBalance.textContent = state.usdPoints.toFixed(2);
if (fbB) fbB.textContent = state.fbPoints.toLocaleString('en-US');
if (waB) waB.textContent = state.waPoints.toLocaleString('en-US');
if (storeBalance) storeBalance.textContent = state.usdPoints.toFixed(2);
if (walletUsd) walletUsd.textContent = state.usdPoints.toFixed(2);
if (walletFb) walletFb.textContent = state.fbPoints.toLocaleString('en-US');
if (walletWa) walletWa.textContent = state.waPoints.toLocaleString('en-US');
}
/**
* تحميل حالة الحساب والمحفظة ومطابقة الأختام الرقمية
*/
async function loadDashboardState() {
const storage = global.FritreeStorage;
if (!storage) return;
DashboardState.usdPoints = parseFloat(await storage.get('usdPoints', 100.00)) || 0.00;
DashboardState.usedSerials = await storage.get('usedSerials', []);
DashboardState.pointsTransactions = await storage.get('pointsTransactions', []);
DashboardState.balanceSignature = await storage.get('usdPointsSig', '');
if (global.FritreeCrypto && typeof global.FritreeCrypto.getOrGenerateAccountId === 'function') {
DashboardState.currentAccountId = await global.FritreeCrypto.getOrGenerateAccountId();
}
DashboardState.userName = await storage.get('acc_user_name', '');
DashboardState.userPhone = await storage.get('acc_user_phone', '');
DashboardState.waLink = await storage.get('acc_user_wa_link', '');
DashboardState.fbPoints = parseInt(await storage.get('acc_fbPoints', 0), 10) || 0;
DashboardState.fbPointsSignature = await storage.get('acc_fbPoints_sig', '');
DashboardState.waPoints = parseInt(await storage.get('acc_waPoints', 0), 10) || 0;
DashboardState.waPointsSignature = await storage.get('acc_waPoints_sig', '');
DashboardState.userXP = await storage.get('acc_userXP', 0);
DashboardState.userLevel = await storage.get('acc_userLevel', 1);
DashboardState.lifetimeFb = await storage.get('acc_lifetimeFb', 0);
DashboardState.lifetimeWa = await storage.get('acc_lifetimeWa', 0);
DashboardState.lifetimeTasks = await storage.get('acc_lifetimeTasks', 0);
DashboardState.activeTasks = await storage.get('acc_tasks', []);
// مطابقة وتحديث التوقيعات الرقمية للأرصدة
const expectedPointsSig = await computeBalanceSignature(DashboardState.usdPoints);
if (DashboardState.balanceSignature !== expectedPointsSig) {
DashboardState.balanceSignature = expectedPointsSig;
await storage.set('usdPointsSig', DashboardState.balanceSignature);
}
const expectedFbSig = await computeFbCardsSignature(DashboardState.fbPoints);
if (DashboardState.fbPointsSignature !== expectedFbSig) {
DashboardState.fbPointsSignature = expectedFbSig;
await storage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
}
const expectedWaSig = await computeWaCardsSignature(DashboardState.waPoints);
if (DashboardState.waPointsSignature !== expectedWaSig) {
DashboardState.waPointsSignature = expectedWaSig;
await storage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
}
if (typeof global.FritreeChallenges !== 'undefined' && typeof global.FritreeChallenges.initDailyTasks === 'function') {
await global.FritreeChallenges.initDailyTasks();
}
updateAllPointsDOMElements();
DashboardState.isLoaded = true;
}
/**
* حفظ كافة بيانات الحساب والمحفظة بالتخزين المشفر
*/
async function saveAccountData() {
const storage = global.FritreeStorage;
if (!storage) return;
await storage.set('usdPoints', DashboardState.usdPoints);
await storage.set('usdPointsSig', DashboardState.balanceSignature);
await storage.set('acc_user_name', DashboardState.userName);
await storage.set('acc_user_phone', DashboardState.userPhone);
await storage.set('acc_user_wa_link', DashboardState.waLink);
await storage.set('acc_fbPoints', DashboardState.fbPoints);
await storage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
await storage.set('acc_waPoints', DashboardState.waPoints);
await storage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
await storage.set('acc_userXP', DashboardState.userXP);
await storage.set('acc_userLevel', DashboardState.userLevel);
await storage.set('acc_lifetimeFb', DashboardState.lifetimeFb);
await storage.set('acc_lifetimeWa', DashboardState.lifetimeWa);
await storage.set('acc_lifetimeTasks', DashboardState.lifetimeTasks);
await storage.set('acc_activeSub', 'Lifetime Unlimited');
await storage.set('acc_subExpiry', null);
await storage.set('acc_tasks', DashboardState.activeTasks);
updateAllPointsDOMElements();
}
/**
* تسجيل عملية مالية جديدة في كشف حساب المحفظة
* @param {string} desc - وصف العملية
* @param {number} amount - القيمة أو الكمية
* @param {string} type - نوع الحركة (add | deduct | add_fb | deduct_fb | add_wa | deduct_wa | swap_in | swap_out)
*/
async function addPointsTransaction(desc, amount, type) {
const txId = 'tx_' + Date.now() + '_' + Math.random().toString(36).substr(2, 4);
const timestamp = new Date().toISOString();
let signature = "";
if (typeof global.FritreeWallet !== 'undefined' && typeof global.FritreeWallet.signReceipt === 'function') {
signature = await global.FritreeWallet.signReceipt(txId, amount, type, desc, timestamp);
}
DashboardState.pointsTransactions.push({
id: txId,
desc: desc,
amount: amount,
type: type,
date: timestamp,
signature: signature
});
if (DashboardState.pointsTransactions.length > 200) DashboardState.pointsTransactions.shift();
await global.FritreeStorage.set('pointsTransactions', DashboardState.pointsTransactions);
if (global.FritreeCalendar && typeof global.FritreeCalendar.logActivity === 'function') {
global.FritreeCalendar.logActivity({
title: `[معاملة محفظة] ${desc}`,
type: 'finance',
category: 'finance',
notes: `معاملة مالية جديدة بمبلغ/كمية: ${amount} | نوع العملية: ${type}`,
priority: 'medium'
});
}
}
/**
* خصم رصيد دولار من المحفظة
*/
async function deductPoints(amount, desc) {
const costUSD = parseFloat(amount);
const computedSig = await computeBalanceSignature(DashboardState.usdPoints);
if (DashboardState.balanceSignature !== computedSig) {
DashboardState.balanceSignature = computedSig;
await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
}
if (DashboardState.usdPoints < costUSD) return false;
DashboardState.usdPoints = parseFloat(Math.max(0.00, DashboardState.usdPoints - costUSD));
DashboardState.balanceSignature = await computeBalanceSignature(DashboardState.usdPoints);
await global.FritreeStorage.set('usdPoints', DashboardState.usdPoints);
await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
await addPointsTransaction(desc, costUSD, 'deduct');
updateAllPointsDOMElements();
return true;
}
/**
* إضافة رصيد دولار إلى المحفظة
*/
async function addPoints(amount, desc) {
const addUSD = parseFloat(amount);
DashboardState.usdPoints = parseFloat(DashboardState.usdPoints + addUSD);
DashboardState.balanceSignature = await computeBalanceSignature(DashboardState.usdPoints);
await global.FritreeStorage.set('usdPoints', DashboardState.usdPoints);
await global.FritreeStorage.set('usdPointsSig', DashboardState.balanceSignature);
await addPointsTransaction(desc, addUSD, 'add');
updateAllPointsDOMElements();
}
/**
* خصم نقاط فيسبوك
*/
async function deductFbCards(amount, desc) {
const computedSig = await computeFbCardsSignature(DashboardState.fbPoints);
if (DashboardState.fbPointsSignature !== computedSig) {
DashboardState.fbPointsSignature = computedSig;
await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
}
if (DashboardState.fbPoints < amount) return false;
DashboardState.fbPoints = Math.max(0, DashboardState.fbPoints - amount);
DashboardState.fbPointsSignature = await computeFbCardsSignature(DashboardState.fbPoints);
await global.FritreeStorage.set('acc_fbPoints', DashboardState.fbPoints);
await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
await addPointsTransaction(desc, amount, 'deduct_fb');
updateAllPointsDOMElements();
return true;
}
/**
* إضافة نقاط فيسبوك
*/
async function addFbCards(amount, desc) {
DashboardState.fbPoints = (parseInt(DashboardState.fbPoints, 10) || 0) + amount;
DashboardState.fbPointsSignature = await computeFbCardsSignature(DashboardState.fbPoints);
await global.FritreeStorage.set('acc_fbPoints', DashboardState.fbPoints);
await global.FritreeStorage.set('acc_fbPoints_sig', DashboardState.fbPointsSignature);
await addPointsTransaction(desc, amount, 'add_fb');
updateAllPointsDOMElements();
}
/**
* خصم نقاط واتساب
*/
async function deductWaCards(amount, desc) {
const computedSig = await computeWaCardsSignature(DashboardState.waPoints);
if (DashboardState.waPointsSignature !== computedSig) {
DashboardState.waPointsSignature = computedSig;
await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
}
if (DashboardState.waPoints < amount) return false;
DashboardState.waPoints = Math.max(0, DashboardState.waPoints - amount);
DashboardState.waPointsSignature = await computeWaCardsSignature(DashboardState.waPoints);
await global.FritreeStorage.set('acc_waPoints', DashboardState.waPoints);
await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
await addPointsTransaction(desc, amount, 'deduct_wa');
updateAllPointsDOMElements();
return true;
}
/**
* إضافة نقاط واتساب
*/
async function addWaCards(amount, desc) {
DashboardState.waPoints = (parseInt(DashboardState.waPoints, 10) || 0) + amount;
DashboardState.waPointsSignature = await computeWaCardsSignature(DashboardState.waPoints);
await global.FritreeStorage.set('acc_waPoints', DashboardState.waPoints);
await global.FritreeStorage.set('acc_waPoints_sig', DashboardState.waPointsSignature);
await addPointsTransaction(desc, amount, 'add_wa');
updateAllPointsDOMElements();
}
/**
* محرك تبادل النقاط الفوري (Swap Engine)
*/
async function convertPoints(sourceType, targetType, amount) {
if (!sourceType || !targetType || sourceType === targetType || amount <= 0) {
return { success: false, error: 'بيانات غير صالحة: يرجى اختيار نوعين مختلفين للتحويل وكمية أكبر من الصفر.' };
}
const srcAmount = parseInt(amount, 10) || 0;
await loadDashboardState();
if (sourceType === 'fb' && DashboardState.fbPoints < srcAmount) {
return { success: false, error: `رصيد نقاط فيسبوك المتاح (${DashboardState.fbPoints.toLocaleString('en-US')}) غير كافٍ لإتمام التحويل.` };
}
if (sourceType === 'wa' && DashboardState.waPoints < srcAmount) {
return { success: false, error: `رصيد نقاط واتساب المتاح (${DashboardState.waPoints.toLocaleString('en-US')}) غير كافٍ لإتمام التحويل.` };
}
let targetAmount = 0;
if (sourceType === 'fb' && targetType === 'wa') {
targetAmount = Math.floor(srcAmount * 0.5);
} else if (sourceType === 'wa' && targetType === 'fb') {
targetAmount = Math.floor(srcAmount * 2.0);
} else if (sourceType === 'fb' && targetType === 'usd') {
targetAmount = parseFloat((srcAmount / 2000.0).toFixed(2));
} else if (sourceType === 'wa' && targetType === 'usd') {
targetAmount = parseFloat((srcAmount / 1000.0).toFixed(2));
} else if (sourceType === 'usd' && targetType === 'fb') {
targetAmount = Math.floor(srcAmount * 2000.0);
} else if (sourceType === 'usd' && targetType === 'wa') {
targetAmount = Math.floor(srcAmount * 1000.0);
}
if (targetAmount <= 0) {
return { success: false, error: 'الكمية قليلة جداً للتحويل، يرجى زيادة الكمية (على الأقل 2 نقاط FB للحصول على 1 نقطة WA).' };
}
const srcName = sourceType.toUpperCase();
const tgtName = targetType.toUpperCase();
const descDeduct = `تحويل وتبادل أصل (Swap Out): -${srcAmount.toLocaleString('en-US')} ${srcName}`;
const descAdd = `استلام تبديل أصل (Swap In): +${tgtName === 'USD' ? '$' + targetAmount.toFixed(2) : targetAmount.toLocaleString('en-US') + ' ' + tgtName}`;
let deductSuccess = false;
if (sourceType === 'fb') deductSuccess = await deductFbCards(srcAmount, descDeduct);
else if (sourceType === 'wa') deductSuccess = await deductWaCards(srcAmount, descDeduct);
else if (sourceType === 'usd') deductSuccess = await deductPoints(srcAmount, descDeduct);
if (!deductSuccess) {
return { success: false, error: 'فشلت عملية خصم النقاط من المحفظة.' };
}
if (targetType === 'fb') await addFbCards(targetAmount, descAdd);
else if (targetType === 'wa') await addWaCards(targetAmount, descAdd);
else if (targetType === 'usd') await addPoints(targetAmount, descAdd);
await saveAccountData();
if (global.FritreeCalendar && typeof global.FritreeCalendar.logActivity === 'function') {
global.FritreeCalendar.logActivity({
title: `[تبديل نقاط] ${srcAmount} ${srcName}${targetAmount} ${tgtName}`,
type: 'finance',
category: 'finance',
notes: `تم تبديل النقاط بنجاح بمحفظتك بين نقاط فيسبوك وواتساب.`,
priority: 'medium'
});
}
return {
success: true,
sourceType,
targetType,
sourceAmount: srcAmount,
targetAmount
};
}
/**
* استعلام خصائص باقة الاشتراك
*/
function getSubscriptionFeatures() {
return {
tierName: 'Lifetime Unlimited',
maxFbGroupsPerCampaign: 99999999,
maxWaRecipientsPerCampaign: 99999999,
canUseRotation: true,
maxDailyCapLimit: 99999999,
unlockedStealthFeatures: [
'humanScrollActive', 'simulateMouseActive', 'antiHoneypotActive', 'humanTypingActive',
'randomMicroActive', 'autoPauseFailActive', 'canvasNoiseActive', 'audioContextNoiseActive',
'webRtcLeakProtectionActive', 'hardwareConcurrencyMockActive', 'deviceMemoryMockActive',
'batteryApiMockActive', 'languagesSpoofActive', 'screenOrientationSpoofActive', 'pluginsMockActive',
'idleWanderActive', 'safeHoursSchedulerActive', 'activeFreezeState', 'viewportJitterActive',
'waScrollActive', 'waMouseEmulationActive', 'waAntiHoneypotActive', 'waHumanTypingActive',
'waCanvasNoiseActive', 'waRandomTabActive', 'waTypingSimulationActive', 'waViewportJitterActive', 'showVirtualCursor',
'zwspObfuscationActive', 'unicodeHomoglyphActive', 'synonymParaphrasingActive', 'exifCleansingActive', 'pixelNoiseActive'
]
};
}
/**
* تصدير وحدة حالة التطبيق المركزية
*/
global.FritreeAppState = {
state: DashboardState,
getState: () => DashboardState,
loadDashboardState,
saveAccountData,
getPoints: () => DashboardState.usdPoints,
getFbPoints: () => DashboardState.fbPoints,
getWaPoints: () => DashboardState.waPoints,
addPoints,
deductPoints,
addFbCards,
deductFbCards,
addWaCards,
deductWaCards,
convertPoints,
addTransaction: addPointsTransaction,
getSubscriptionFeatures,
updatePointsUI: updateAllPointsDOMElements,
updateAccountUI: updateAllPointsDOMElements
};
// الحفاظ على التوافقية العكسية مع FritreeDashboard
global.FritreeDashboard = global.FritreeDashboard || {};
Object.assign(global.FritreeDashboard, global.FritreeAppState);
})(typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : this);