- Implemented wallet app functionality including account management, transaction handling, and user notifications. - Updated HomeScreen to include Wallet app icon. - Enhanced StateManager to maintain mobile bank state. - Created wallet-specific styles for UI consistency. - Updated CSS and JS concatenation scripts to include wallet resources.
402 lines
16 KiB
Plaintext
402 lines
16 KiB
Plaintext
#include "..\script_component.hpp"
|
|
|
|
/*
|
|
* Author: IDSolutions
|
|
* Handles UI events.
|
|
*
|
|
* Arguments:
|
|
* None
|
|
*
|
|
* Return Value:
|
|
* None
|
|
*
|
|
* Example:
|
|
* [] call forge_client_phone_fnc_handleUIEvents;
|
|
*
|
|
* Public: No
|
|
*/
|
|
|
|
params ["_control", "_isConfirmDialog", "_message"];
|
|
|
|
private _alert = fromJSON _message;
|
|
private _event = _alert get "event";
|
|
private _data = _alert get "data";
|
|
|
|
// diag_log format ["[FORGE:Client:Phone] Handling UI event: %1 with data: %2", _event, _data];
|
|
|
|
switch (_event) do {
|
|
case "phone::get::player": {
|
|
private _uid = getPlayerUID player;
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["setPlayerUid(%1)", (toJSON _uid)]];
|
|
};
|
|
case "phone::get::theme": {
|
|
private _isDark = profileNamespace getVariable ["FORGE_Phone_isDark", true];
|
|
private _theme = ["light", "dark"] select (_isDark);
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["setTheme(%1)", (toJSON _theme)]];
|
|
};
|
|
case "phone::get::contacts": {
|
|
private _contacts = player getVariable ["FORGE_Contacts", []];
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["loadContacts(%1)", (toJSON _contacts)]];
|
|
["forge_server_phone_requestRefreshContacts", [getPlayerUID player, player]] call CFUNC(serverEvent);
|
|
};
|
|
case "phone::set::theme": {
|
|
private _isDark = _data get "isDark";
|
|
|
|
profileNamespace setVariable ["FORGE_Phone_isDark", _isDark];
|
|
};
|
|
case "phone::add::contact": {
|
|
private _contactPhone = _data get "phone";
|
|
|
|
if (_contactPhone isNotEqualTo "") then {
|
|
["forge_server_phone_requestAddContactByPhone", [getPlayerUID player, _contactPhone, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No phone number provided for contact addition";
|
|
};
|
|
};
|
|
case "phone::add::contact::by::phone": {
|
|
private _phoneNumber = _data get "phone";
|
|
|
|
if (_phoneNumber isNotEqualTo "") then {
|
|
["forge_server_phone_requestAddContactByPhone", [getPlayerUID player, _phoneNumber, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No phone number provided";
|
|
};
|
|
};
|
|
case "phone::add::contact::by::email": {
|
|
private _email = _data get "email";
|
|
|
|
if (_email isNotEqualTo "") then {
|
|
["forge_server_phone_requestAddContactByEmail", [getPlayerUID player, _email, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No email provided";
|
|
};
|
|
};
|
|
case "phone::remove::contact": {
|
|
private _contactUid = _data get "uid";
|
|
|
|
if (_contactUid isNotEqualTo "") then {
|
|
["forge_server_phone_requestRemoveContact", [getPlayerUID player, _contactUid, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No contact UID provided for removal";
|
|
};
|
|
};
|
|
case "phone::refresh::contacts": {
|
|
["forge_server_phone_requestRefreshContacts", [getPlayerUID player, player]] call CFUNC(serverEvent);
|
|
};
|
|
case "phone::send::message": {
|
|
private _contactName = _data get "contactName";
|
|
private _messageData = _data get "message";
|
|
private _messageText = _messageData get "text";
|
|
private _toUid = _data get "toUid";
|
|
|
|
if (_toUid isNotEqualTo "") then {
|
|
["forge_server_phone_requestSendMessage", [getPlayerUID player, _toUid, _messageText, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log format ["[FORGE:Client:Phone] No recipient UID provided for message to %1", _contactName];
|
|
};
|
|
};
|
|
case "phone::get::messages": {
|
|
["forge_server_phone_requestGetMessages", [getPlayerUID player, player]] call CFUNC(serverEvent);
|
|
};
|
|
case "phone::get::message::thread": {
|
|
private _otherUid = _data get "otherUid";
|
|
|
|
if (_otherUid isNotEqualTo "") then {
|
|
["forge_server_phone_requestGetMessageThread", [getPlayerUID player, _otherUid, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No other UID provided for message thread";
|
|
};
|
|
};
|
|
case "phone::mark::message::read": {
|
|
private _messageId = _data get "messageId";
|
|
|
|
if (_messageId isNotEqualTo "") then {
|
|
["forge_server_phone_requestMarkMessageRead", [getPlayerUID player, _messageId, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No message ID provided for mark read";
|
|
};
|
|
};
|
|
case "phone::delete::message": {
|
|
private _messageId = _data get "messageId";
|
|
|
|
if (_messageId isNotEqualTo "") then {
|
|
["forge_server_phone_requestDeleteMessage", [getPlayerUID player, _messageId, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No message ID provided for delete";
|
|
};
|
|
};
|
|
case "phone::send::email": {
|
|
private _toUid = _data get "toUid";
|
|
private _subject = _data get "subject";
|
|
private _body = _data get "body";
|
|
if (_subject isEqualTo "") then { _subject = "No subject"; };
|
|
|
|
if (_toUid isNotEqualTo "" && _body isNotEqualTo "") then {
|
|
diag_log format ["[FORGE:Client:Phone] Sending email to %1 subject length %2 body length %3", _toUid, count _subject, count _body];
|
|
["forge_server_phone_requestSendEmail", [getPlayerUID player, _toUid, _subject, _body, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] Missing required email parameters";
|
|
};
|
|
};
|
|
case "phone::get::emails": {
|
|
["forge_server_phone_requestGetEmails", [getPlayerUID player, player]] call CFUNC(serverEvent);
|
|
};
|
|
case "phone::mark::email::read": {
|
|
private _emailId = _data get "emailId";
|
|
|
|
if (_emailId isNotEqualTo "") then {
|
|
["forge_server_phone_requestMarkEmailRead", [getPlayerUID player, _emailId, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No email ID provided for mark read";
|
|
};
|
|
};
|
|
case "phone::delete::email": {
|
|
private _emailId = _data get "emailId";
|
|
|
|
if (_emailId isNotEqualTo "") then {
|
|
["forge_server_phone_requestDeleteEmail", [getPlayerUID player, _emailId, player]] call CFUNC(serverEvent);
|
|
} else {
|
|
diag_log "[FORGE:Client:Phone] No email ID provided for delete";
|
|
};
|
|
};
|
|
case "phone::get::notes": {
|
|
private _notes = GVAR(PhoneRepository) call ["getAllNotes", []];
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["loadNotes(%1)", (toJSON _notes)]];
|
|
};
|
|
case "phone::save::note": {
|
|
private _success = GVAR(PhoneRepository) call ["addNote", [_data]];
|
|
_success
|
|
};
|
|
case "phone::delete::note": {
|
|
private _noteId = _data get "id";
|
|
|
|
private _success = GVAR(PhoneRepository) call ["deleteNote", [_noteId]];
|
|
_success
|
|
};
|
|
case "phone::get::events": {
|
|
private _events = profileNamespace getVariable ["FORGE_Phone_Events", []];
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["loadCalendarEvents(%1)", (toJSON _events)]];
|
|
};
|
|
case "phone::save::event": {
|
|
private _eventId = _data get "id";
|
|
private _eventTitle = _data get "title";
|
|
|
|
private _events = profileNamespace getVariable ["FORGE_Phone_Events", []];
|
|
private _existingIndex = -1;
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _eventId) then {
|
|
_existingIndex = _forEachIndex;
|
|
};
|
|
} forEach _events;
|
|
|
|
if (_existingIndex >= 0) then {
|
|
_events set [_existingIndex, _data];
|
|
diag_log format ["[PHONE] Updated event: %1 [ID: %2]", _eventTitle, _eventId];
|
|
} else {
|
|
_events pushBack _data;
|
|
diag_log format ["[PHONE] Added new event: %1 [ID: %2]", _eventTitle, _eventId];
|
|
};
|
|
|
|
profileNamespace setVariable ["FORGE_Phone_Events", _events];
|
|
diag_log format ["[PHONE] Saved events to profile. Total events: %1", count _events];
|
|
};
|
|
case "phone::delete::event": {
|
|
private _eventId = _data get "id";
|
|
private _events = profileNamespace getVariable ["FORGE_Phone_Events", []];
|
|
|
|
private _newEvents = [];
|
|
private _deleted = false;
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _eventId) then {
|
|
_deleted = true;
|
|
} else {
|
|
_newEvents pushBack _x;
|
|
};
|
|
} forEach _events;
|
|
|
|
if (_deleted) then {
|
|
profileNamespace setVariable ["FORGE_Phone_Events", _newEvents];
|
|
diag_log format ["[PHONE] Deleted calendar event [ID: %1]. Remaining events: %2", _eventId, count _newEvents];
|
|
} else {
|
|
diag_log format ["[PHONE] Calendar event not found for deletion [ID: %1]", _eventId];
|
|
};
|
|
};
|
|
case "phone::get::clocks": {
|
|
private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []];
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["loadWorldClocks(%1)", (toJSON _worldClocks)]];
|
|
};
|
|
case "phone::save::clock": {
|
|
private _clockId = _data get "id";
|
|
private _timezone = _data get "timezone";
|
|
private _city = _data get "city";
|
|
|
|
private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []];
|
|
private _clockExists = false;
|
|
{
|
|
private _existingId = _x get "id";
|
|
private _existingTimezone = _x get "timezone";
|
|
if (_existingId isEqualTo _clockId || _existingTimezone isEqualTo _timezone) then {
|
|
_clockExists = true;
|
|
};
|
|
} forEach _worldClocks;
|
|
|
|
if (!_clockExists) then {
|
|
_worldClocks pushBack _data;
|
|
profileNamespace setVariable ["FORGE_Phone_WorldClocks", _worldClocks];
|
|
|
|
diag_log format ["[PHONE] Added world clock: %1 (%2) [ID: %3]. Total clocks: %4", _city, _timezone, _clockId, count _worldClocks];
|
|
} else {
|
|
diag_log format ["[PHONE] World clock already exists: %1 (%2) [ID: %3]. Skipping duplicate.", _city, _timezone, _clockId];
|
|
};
|
|
};
|
|
case "phone::delete::clock": {
|
|
private _clockId = _data get "id";
|
|
|
|
private _worldClocks = profileNamespace getVariable ["FORGE_Phone_WorldClocks", []];
|
|
private _newClocks = [];
|
|
private _deleted = false;
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _clockId) then {
|
|
_deleted = true;
|
|
} else {
|
|
_newClocks pushBack _x;
|
|
};
|
|
} forEach _worldClocks;
|
|
|
|
if (_deleted) then {
|
|
profileNamespace setVariable ["FORGE_Phone_WorldClocks", _newClocks];
|
|
diag_log format ["[PHONE] Deleted world clock [ID: %1]. Remaining clocks: %2", _clockId, count _newClocks];
|
|
} else {
|
|
diag_log format ["[PHONE] World clock not found for deletion [ID: %1]", _clockId];
|
|
};
|
|
};
|
|
case "phone::get::alarms": {
|
|
private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []];
|
|
|
|
_control ctrlWebBrowserAction ["ExecJS", format ["loadAlarms(%1)", (toJSON _alarms)]];
|
|
};
|
|
case "phone::save::alarm": {
|
|
private _alarmId = _data get "id";
|
|
private _alarmTime = _data get "time";
|
|
private _alarmLabel = _data get "label";
|
|
|
|
private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []];
|
|
private _existingIndex = -1;
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _alarmId) then {
|
|
_existingIndex = _forEachIndex;
|
|
};
|
|
} forEach _alarms;
|
|
|
|
if (_existingIndex >= 0) then {
|
|
_alarms set [_existingIndex, _data];
|
|
diag_log format ["[PHONE] Updated alarm: %1 at %2 [ID: %3]", _alarmLabel, _alarmTime, _alarmId];
|
|
} else {
|
|
_alarms pushBack _data;
|
|
diag_log format ["[PHONE] Added new alarm: %1 at %2 [ID: %3]", _alarmLabel, _alarmTime, _alarmId];
|
|
};
|
|
|
|
profileNamespace setVariable ["FORGE_Phone_Alarms", _alarms];
|
|
diag_log format ["[PHONE] Saved alarms to profile. Total alarms: %1", count _alarms];
|
|
};
|
|
case "phone::delete::alarm": {
|
|
private _alarmId = _data get "id";
|
|
|
|
private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []];
|
|
private _newAlarms = [];
|
|
private _deleted = false;
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _alarmId) then {
|
|
_deleted = true;
|
|
} else {
|
|
_newAlarms pushBack _x;
|
|
};
|
|
} forEach _alarms;
|
|
|
|
if (_deleted) then {
|
|
profileNamespace setVariable ["FORGE_Phone_Alarms", _newAlarms];
|
|
diag_log format ["[PHONE] Deleted alarm [ID: %1]. Remaining alarms: %2", _alarmId, count _newAlarms];
|
|
} else {
|
|
diag_log format ["[PHONE] Alarm not found for deletion [ID: %1]", _alarmId];
|
|
};
|
|
};
|
|
case "phone::toggle::alarm": {
|
|
private _alarmId = _data get "id";
|
|
|
|
private _alarms = profileNamespace getVariable ["FORGE_Phone_Alarms", []];
|
|
{
|
|
private _existingId = _x get "id";
|
|
if (_existingId isEqualTo _alarmId) then {
|
|
private _currentEnabled = _x get "enabled";
|
|
_x set ["enabled", !_currentEnabled];
|
|
diag_log format ["[PHONE] Toggled alarm [ID: %1] to %2", _alarmId, !_currentEnabled];
|
|
};
|
|
} forEach _alarms;
|
|
|
|
profileNamespace setVariable ["FORGE_Phone_Alarms", _alarms];
|
|
};
|
|
case "phone::bank::refresh": {
|
|
["forge_server_bank_requestHydrateBank", [getPlayerUID player, "bank", false]] call CFUNC(serverEvent);
|
|
};
|
|
case "phone::bank::transfer::request": {
|
|
private _amount = floor (_data getOrDefault ["amount", 0]);
|
|
private _target = _data getOrDefault ["target", ""];
|
|
private _from = toLowerANSI (_data getOrDefault ["from", "bank"]);
|
|
|
|
if (_target isNotEqualTo "" && { _amount > 0 }) then {
|
|
["forge_server_bank_requestTransfer", [getPlayerUID player, _target, _from, _amount]] call CFUNC(serverEvent);
|
|
} else {
|
|
private _display = uiNamespace getVariable ["RscPhone", displayNull];
|
|
if !(isNull _display) then {
|
|
private _control = _display displayCtrl 1001;
|
|
if !(isNull _control) then {
|
|
_control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Choose a recipient and valid amount.')"];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
case "phone::bank::depositEarnings::request": {
|
|
private _amount = floor (_data getOrDefault ["amount", 0]);
|
|
|
|
if (_amount > 0) then {
|
|
["forge_server_bank_requestDepositEarnings", [getPlayerUID player, _amount]] call CFUNC(serverEvent);
|
|
} else {
|
|
private _display = uiNamespace getVariable ["RscPhone", displayNull];
|
|
if !(isNull _display) then {
|
|
private _control = _display displayCtrl 1001;
|
|
if !(isNull _control) then {
|
|
_control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Enter a valid earnings amount.')"];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
case "phone::bank::repayCreditLine::request": {
|
|
private _amount = floor (_data getOrDefault ["amount", 0]);
|
|
|
|
if (_amount > 0) then {
|
|
["forge_server_bank_requestRepayCreditLine", [getPlayerUID player, _amount]] call CFUNC(serverEvent);
|
|
} else {
|
|
private _display = uiNamespace getVariable ["RscPhone", displayNull];
|
|
if !(isNull _display) then {
|
|
private _control = _display displayCtrl 1001;
|
|
if !(isNull _control) then {
|
|
_control ctrlWebBrowserAction ["ExecJS", "window.showMobileBankNotice && window.showMobileBankNotice('error', 'Enter a valid payment amount.')"];
|
|
};
|
|
};
|
|
};
|
|
};
|
|
default { hint format ["Unhandled phone event: %1", _event]; };
|
|
};
|
|
|
|
true;
|