ApplicationInsights-JS icon indicating copy to clipboard operation
ApplicationInsights-JS copied to clipboard

[BUG] Remove Unload event listeners are deprecated and will be removed.

Open ganesh12301 opened this issue 1 year ago • 2 comments

import { LightningElement, track, api } from 'lwc'; import createCase from '@salesforce/apex/CaseCreationController.createCase'; import uploadFile from '@salesforce/apex/CaseCreationController.uploadFile'; import { ShowToastEvent } from 'lightning/platformShowToastEvent';

export default class ParkEntryApplication extends LightningElement { // Fields companyToVisit = ''; contactPerson = ''; Email = ''; purposeOfEntry = ''; requestorFullName = ''; requestorCompanyName = ''; requestorEmail = ''; parkEntryDate; duration = ''; peopleEntering = ''; vehiclePlateNumber = ''; uploadedFileUrl; recordId; fileData; file; base64; filename;

// Duration options for combobox
get durationOptions() {
    return [
        { label: '1', value: '1' },
        { label: '3', value: '3' },
        { label: '5', value: '5' }
    ];
}

// Handle field changes
handleInputChange(event) {
    const field = event.target.dataset.id;
    this[field] = event.target.value;
}

// Handle form submission
async handleSubmit() {
    let isValid = this.validateForm();

    if (!isValid) {
        console.error('Form is invalid, cannot submit');
        return;
    }

    try {
        // Prepare case data
        const caseObj = {
            "companyToVisit": this.companyToVisit,
            "contactPerson": this.contactPerson,
            "Email": this.Email,
            "purposeOfEntry": this.purposeOfEntry,
            "requestorFullName": this.requestorFullName,
            "requestorCompanyName": this.requestorCompanyName,
            "requestorEmail": this.requestorEmail,
            "parkEntryDate": this.parkEntryDate,
            "duration": this.duration,
            "peopleEntering": this.peopleEntering,
            "vehiclePlateNumber": this.vehiclePlateNumber,
            "uploadedFileUrl": this.uploadedFileUrl
        };

        // Create case
        this.recordId = await createCase({ caseData: caseObj });
        this.showToast('Success', 'Case Created Successfully', 'success');

        // If there's a file, upload it
        if (this.filename) {
            await this.handleFileUpload();
        }

        // Clear form data after submission
        this.clearFormData();

    } catch (error) {
        console.error('Error creating case or uploading file:', error);
        this.showToast('Error', 'Failed to create case or upload file', 'error');
    }
}

// Validate the form
validateForm() {
    let isValid = true;
    const requiredFields = [
        'companyToVisit', 'contactPerson', 'Email', 'purposeOfEntry',
        'requestorFullName', 'requestorCompanyName', 'requestorEmail',
        'parkEntryDate', 'duration', 'vehiclePlateNumber'
    ];

    requiredFields.forEach(field => {
        const inputField = this.template.querySelector(`[data-id="${field}"]`);
        if (!this[field] || !inputField.value) {
            inputField.setCustomValidity('This field is required');
            isValid = false;
        } else {
            inputField.setCustomValidity('');
        }
        inputField.reportValidity();
    });

    return isValid;
}

// Handle file selection
openfileUpload(event) {
    this.file = event.target.files[0];
    this.filename = this.file.name;
    const reader = new FileReader();
    reader.onload = () => {
        this.base64 = reader.result.split(',')[1];
    };
    reader.readAsDataURL(this.file);
}

// Upload the file to the server
async handleFileUpload() {
    this.fileData = {
        'filename': this.filename,
        'base64': this.base64,
        'recordId': this.recordId
    };
    const { base64, filename, recordId } = this.fileData;

    try {
        await uploadFile({ base64, filename, recordId });
        this.showToast('Success', 'File Uploaded Successfully', 'success');
        this.template.querySelector('input[type="file"]').value = ''; // Clear file input
    } catch (error) {
        console.error('Error uploading file:', error);
        this.showToast('Error', 'File upload failed', 'error');
    }
}

// Show toast messages
showToast(title, message, variant) {
    const toastEvent = new ShowToastEvent({
        title,
        message,
        variant
    });
    this.dispatchEvent(toastEvent);
}

// Clear form data after submission
clearFormData() {
    this.companyToVisit = '';
    this.contactPerson = '';
    this.Email = '';
    this.purposeOfEntry = '';
    this.requestorFullName = '';
    this.requestorCompanyName = '';
    this.requestorEmail = '';
    this.parkEntryDate = null;
    this.duration = '';
    this.peopleEntering = '';
    this.vehiclePlateNumber = '';
    this.uploadedFileUrl = '';
    this.filename = '';
}

}

ganesh12301 avatar Oct 03 '24 01:10 ganesh12301

I'm not quite sure what your asking with the detail provided, but to "glean" your request from the title, I think you asking about how to "stop" us from registering the unload event...

  • The SDK itself already handles (and has for years) for when an "unload" event (unload, beforeunload, visibilitychange and pagehide) is not supported by the active runtime
  • So when chrome just "stops" providing the "unload" event we will continue to work

If however, you want us to "stop" hooking one or more of the unload events we have a configuration where you can provide the "event" names that you don't want use to register

However, there is 1 catch. We NEED to hook at least 1 of these events to ensure that we can correctly handle the page unload scenario, so if you tell us to ignore several events and the active runtime doesn't support any of the remaining ones we will STILL turn around and hook all of the default one (effectively ignoring your requested config).

MSNev avatar Oct 03 '24 19:10 MSNev

This Issue will be closed in 30 days. Please remove the "Stale" label or comment to avoid closure with no action.

github-actions[bot] avatar Jun 01 '25 07:06 github-actions[bot]