diff --git a/app/javascript/application.js b/app/javascript/application.js
index d0b69c0dc..967416ef9 100644
--- a/app/javascript/application.js
+++ b/app/javascript/application.js
@@ -11,6 +11,7 @@ import DisableHidden from './elements/disable_hidden'
import TurboModal from './elements/turbo_modal'
import NativeAction from './elements/native_action'
import NativeSearch from './elements/native_search'
+import NativeModal from './elements/native_modal'
import FileDropzone from './elements/file_dropzone'
import MenuActive from './elements/menu_active'
import ClipboardCopy from './elements/clipboard_copy'
@@ -110,6 +111,7 @@ safeRegisterElement('disable-hidden', DisableHidden)
safeRegisterElement('turbo-modal', TurboModal)
safeRegisterElement('native-action', NativeAction)
safeRegisterElement('native-search', NativeSearch)
+safeRegisterElement('native-modal', NativeModal)
safeRegisterElement('file-dropzone', FileDropzone)
safeRegisterElement('menu-active', MenuActive)
safeRegisterElement('clipboard-copy', ClipboardCopy)
diff --git a/app/javascript/elements/native_modal.js b/app/javascript/elements/native_modal.js
new file mode 100644
index 000000000..d6f84532b
--- /dev/null
+++ b/app/javascript/elements/native_modal.js
@@ -0,0 +1,17 @@
+export default class extends HTMLElement {
+ connectedCallback () {
+ document.addEventListener('turbo:submit-end', this.onSubmit)
+ }
+
+ disconnectedCallback () {
+ document.removeEventListener('turbo:submit-end', this.onSubmit)
+ }
+
+ onSubmit = (e) => {
+ if (!e.detail.success || e.detail.fetchResponse?.redirected) return
+ if (this.dataset.closeAfterSubmit === 'false') return
+ if (e.detail.formSubmission?.formElement?.dataset?.closeOnSubmit === 'false') return
+
+ window.webkit?.messageHandlers?.modal?.postMessage({ action: 'submitted' })
+ }
+}
diff --git a/app/views/shared/_turbo_drawer.html.erb b/app/views/shared/_turbo_drawer.html.erb
index 5462003f8..c8928aeee 100644
--- a/app/views/shared/_turbo_drawer.html.erb
+++ b/app/views/shared/_turbo_drawer.html.erb
@@ -1,9 +1,9 @@
<% if turbo_native_app? && !turbo_frame_request? %>
<% content_for(:html_title, local_assigns[:title]) if local_assigns[:title] %>