From 9f37034d0bb6fbea81eacc23e07dc3ae83d806ba Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Wed, 6 Sep 2023 00:00:27 +0200 Subject: [PATCH] Prevent multiple unsubscribe calls for ActionCable --- .../channels/synchronized_editor_channel.js | 10 ++++++++++ app/assets/javascripts/editor/editor.js.erb | 4 ++-- app/assets/javascripts/editor/submissions.js | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/channels/synchronized_editor_channel.js b/app/assets/javascripts/channels/synchronized_editor_channel.js index d61e8e24..affbd467 100644 --- a/app/assets/javascripts/channels/synchronized_editor_channel.js +++ b/app/assets/javascripts/channels/synchronized_editor_channel.js @@ -42,6 +42,16 @@ $(document).on('turbolinks:load', function () { send_changes(delta, active_file) { const delta_with_user_id = {command: 'editor_change', current_user_id: current_user_id, active_file: active_file, delta: delta} this.perform('send_changes', {delta_with_user_id: delta_with_user_id}); + }, + + is_connected() { + return App.cable.subscriptions.findAll(App.synchronized_editor.identifier).length > 0 + }, + + disconnect() { + if (this.is_connected()) { + this.unsubscribe(); + } } }); } diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index eeec6d51..5242da96 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -1089,8 +1089,8 @@ var CodeOceanEditor = { this.initializeDeadlines(); CodeOceanEditorTips.initializeEventHandlers(); - window.addEventListener("turbolinks:before-render", App.synchronized_editor?.unsubscribe.bind(App.synchronized_editor)); - window.addEventListener("beforeunload", App.synchronized_editor?.unsubscribe.bind(App.synchronized_editor)); + window.addEventListener("turbolinks:before-render", App.synchronized_editor?.disconnect.bind(App.synchronized_editor)); + window.addEventListener("beforeunload", App.synchronized_editor?.disconnect.bind(App.synchronized_editor)); window.addEventListener("turbolinks:before-render", this.autosaveIfChanged.bind(this)); window.addEventListener("beforeunload", this.autosaveIfChanged.bind(this)); diff --git a/app/assets/javascripts/editor/submissions.js b/app/assets/javascripts/editor/submissions.js index 3809a137..1859c0b7 100644 --- a/app/assets/javascripts/editor/submissions.js +++ b/app/assets/javascripts/editor/submissions.js @@ -204,7 +204,7 @@ CodeOceanEditorSubmissions = { this.teardownEventHandlers(); this.createSubmission(button, null, function (response) { if (response.redirect) { - App.synchronized_editor?.unsubscribe(); + App.synchronized_editor?.disconnect(); this.autosaveIfChanged(); this.stopCode(event); this.editors = [];