// --------------------------------------------------------- // ONESIGNAL INITIALIZATION // --------------------------------------------------------- window.rideshareOneSignalReady = new Promise(function(resolve, reject) { window.OneSignalDeferred.push(async function(OneSignal) { try { await OneSignal.init({ appId: "6d571838-0d12-4245-8141-d9f1dd3fe089" }); window.rideshareOneSignal = OneSignal; console.log( 'RideShareSA OneSignal Web SDK initialized.' ); resolve(OneSignal); } catch (error) { console.error( 'RideShareSA OneSignal initialization failed:', error ); reject(error); } }); }); // --------------------------------------------------------- // REQUEST NOTIFICATION PERMISSION // --------------------------------------------------------- window.rideshareOneSignalRequestPermission = async function() { const OneSignal = await window.rideshareOneSignalReady; await OneSignal.Notifications.requestPermission(); if ( OneSignal.User && OneSignal.User.PushSubscription ) { try { await OneSignal.User.PushSubscription.optIn(); } catch (error) { console.error( 'RideShareSA OneSignal push subscription opt-in failed:', error ); } } }; // --------------------------------------------------------- // AUTHENTICATED USER SYNC // --------------------------------------------------------- // // Dart calls this function: // // rideshareOneSignalSync(uid, email, phone, name) // // Mapping: // // uid -> OneSignal External ID // email -> OneSignal Email // phone -> OneSignal Phone Number // // Supabase continues to use CellNumber separately. // // --------------------------------------------------------- window.rideshareOneSignalSync = async function( uid, email, phone, name ) { const OneSignal = await window.rideshareOneSignalReady; const normalizedUid = String(uid || '').trim(); const normalizedEmail = String(email || '').trim().toLowerCase(); let normalizedPhone = String(phone || '').trim(); const normalizedName = String(name || '').trim(); if (!normalizedUid) { throw new Error( 'OneSignal sync requires a Supabase UID.' ); } // ------------------------------------------------------- // LOGIN USING SUPABASE UID // ------------------------------------------------------- await OneSignal.login(normalizedUid); console.log( 'RideShareSA OneSignal External ID synchronized:', normalizedUid ); // ------------------------------------------------------- // EMAIL // ------------------------------------------------------- if (normalizedEmail) { try { await OneSignal.User.addEmail(normalizedEmail); console.log( 'RideShareSA OneSignal email synchronized:', normalizedEmail ); } catch (error) { console.error( 'RideShareSA OneSignal email sync failed:', error ); } } // ------------------------------------------------------- // PHONE NUMBER // ------------------------------------------------------- // // Supabase: // CellNumber // // Dart bridge: // phone // // OneSignal: // Phone Number // // Convert South African local numbers such as: // // 0821234567 // // to: // // +27821234567 // // If the number is already international, leave it alone. // ------------------------------------------------------- if (normalizedPhone) { if (/^0\d{9}$/.test(normalizedPhone)) { normalizedPhone = '+27' + normalizedPhone.substring(1); } if (/^\+\d{8,15}$/.test(normalizedPhone)) { try { await OneSignal.User.addSms(normalizedPhone); console.log( 'RideShareSA OneSignal phone synchronized:', normalizedPhone ); } catch (error) { console.error( 'RideShareSA OneSignal phone sync failed:', error ); } } else { console.warn( 'RideShareSA OneSignal phone number rejected because it is not in a valid international format:', normalizedPhone ); } } // ------------------------------------------------------- // OPTIONAL DISPLAY NAME // ------------------------------------------------------- if (normalizedName) { try { await OneSignal.User.addAlias( 'display_name', normalizedName ); } catch (error) { console.error( 'RideShareSA OneSignal display name sync failed:', error ); } } // ------------------------------------------------------- // USER TAGS // ------------------------------------------------------- try { await OneSignal.User.addTag( 'role', 'user' ); await OneSignal.User.addTag( 'verified', 'true' ); await OneSignal.User.addTag( 'status', 'active_member' ); } catch (error) { console.error( 'RideShareSA OneSignal user tag sync failed:', error ); } console.log( 'RideShareSA OneSignal authenticated user sync complete.' ); }; // --------------------------------------------------------- // LEGACY LOGIN FUNCTION // --------------------------------------------------------- // // Kept for compatibility with any existing code that may // still call rideshareOneSignalLogin. // // New authenticated-user synchronization should use // rideshareOneSignalSync. // --------------------------------------------------------- window.rideshareOneSignalLogin = async function( uid, email, phone, role ) { const OneSignal = await window.rideshareOneSignalReady; const normalizedUid = String(uid || '').trim(); const normalizedEmail = String(email || '').trim().toLowerCase(); let normalizedPhone = String(phone || '').trim(); if (!normalizedUid) { throw new Error( 'OneSignal login requires a Supabase UID.' ); } await OneSignal.login(normalizedUid); if (normalizedEmail) { await OneSignal.User.addEmail( normalizedEmail ); } if (normalizedPhone) { if (/^0\d{9}$/.test(normalizedPhone)) { normalizedPhone = '+27' + normalizedPhone.substring(1); } if (/^\+\d{8,15}$/.test(normalizedPhone)) { await OneSignal.User.addSms( normalizedPhone ); } } await OneSignal.User.addTag( 'role', role || 'user' ); await OneSignal.User.addTag( 'verified', 'true' ); await OneSignal.User.addTag( 'status', 'active_member' ); }; // --------------------------------------------------------- // LOGOUT // --------------------------------------------------------- window.rideshareOneSignalLogout = async function() { const OneSignal = await window.rideshareOneSignalReady; try { await OneSignal.logout(); console.log( 'RideShareSA OneSignal user logged out.' ); } catch (error) { console.error( 'RideShareSA OneSignal logout failed:', error ); } };