fix(push): preserve Android status after LiveView patches

This commit is contained in:
SimpleTest 2026-07-24 22:32:50 +03:00
parent cba544ffda
commit 8e4656a725

View File

@ -660,14 +660,18 @@ export const Hooks = {
this.buttonLabel = this.el.querySelector("[data-enable-push-label]") this.buttonLabel = this.el.querySelector("[data-enable-push-label]")
this.status = this.el.querySelector("[data-push-status]") this.status = this.el.querySelector("[data-push-status]")
this.native = typeof window.WhoNeedHelpAndroid?.postMessage === "function" this.native = typeof window.WhoNeedHelpAndroid?.postMessage === "function"
this.statusMessage = null
this.buttonEnabled = null
if (this.native && this.button) this.button.disabled = false if (this.native && this.button) this.button.disabled = false
this.setStatus = message => { this.setStatus = message => {
this.statusMessage = message
if (this.status) this.status.textContent = message if (this.status) this.status.textContent = message
} }
this.setButtonState = enabled => { this.setButtonState = enabled => {
this.buttonEnabled = enabled
if (!this.buttonLabel) return if (!this.buttonLabel) return
this.buttonLabel.textContent = enabled this.buttonLabel.textContent = enabled
? this.buttonLabel.dataset.enabledLabel ? this.buttonLabel.dataset.enabledLabel
@ -765,9 +769,11 @@ export const Hooks = {
device_label: String(detail.device_label || "Android · FCM").slice(0, 120), device_label: String(detail.device_label || "Android · FCM").slice(0, 120),
user_agent: navigator.userAgent.slice(0, 500) user_agent: navigator.userAgent.slice(0, 500)
}) })
this.setButtonState(true)
this.setStatus("Push notifications are enabled on this Android device.") this.setStatus("Push notifications are enabled on this Android device.")
} catch (error) { } catch (error) {
console.warn("Android push registration failed", error) console.warn("Android push registration failed", error)
this.setButtonState(false)
this.setStatus("The Android push token could not be saved. Please try again.") this.setStatus("The Android push token could not be saved. Please try again.")
} finally { } finally {
if (this.button) this.button.disabled = false if (this.button) this.button.disabled = false
@ -776,6 +782,7 @@ export const Hooks = {
this.nativeError = event => { this.nativeError = event => {
const reason = event.detail?.reason const reason = event.detail?.reason
this.setButtonState(false)
this.setStatus( this.setStatus(
reason === "permission_denied" reason === "permission_denied"
? "Notification permission was not granted." ? "Notification permission was not granted."
@ -794,6 +801,8 @@ export const Hooks = {
window.localStorage.removeItem("wnh.push.server-device-id") window.localStorage.removeItem("wnh.push.server-device-id")
if (this.native) { if (this.native) {
this.postNative({action: "disable_push"}) this.postNative({action: "disable_push"})
this.setButtonState(false)
this.setStatus("Push notifications are disabled on this device.")
return return
} }
@ -857,6 +866,23 @@ export const Hooks = {
} }
} }
this.activeServerDevice = () => {
const deviceId = window.localStorage.getItem("wnh.push.server-device-id")
return Boolean(
deviceId &&
[...this.el.querySelectorAll("[data-disable-device]")]
.some(element => element.dataset.disableDevice === deviceId)
)
}
this.restoreNativeState = () => {
if (!this.native || !this.activeServerDevice()) return
this.setButtonState(true)
this.setStatus("Push notifications are enabled on this Android device.")
}
this.restoreWebState = async () => { this.restoreWebState = async () => {
if (this.native) return if (this.native) return
@ -901,6 +927,7 @@ export const Hooks = {
this.el.addEventListener("click", this.disableCurrentDevice) this.el.addEventListener("click", this.disableCurrentDevice)
this.button?.addEventListener("click", this.enable) this.button?.addEventListener("click", this.enable)
if (this.native) { if (this.native) {
this.restoreNativeState()
this.postNative({action: "push_token_request"}) this.postNative({action: "push_token_request"})
} else { } else {
this.restoreWebState() this.restoreWebState()
@ -923,7 +950,11 @@ export const Hooks = {
this.button?.removeEventListener("click", this.enable) this.button?.removeEventListener("click", this.enable)
this.button?.addEventListener("click", this.enable) this.button?.addEventListener("click", this.enable)
if (this.buttonEnabled !== null) this.setButtonState(this.buttonEnabled)
if (this.statusMessage !== null) this.setStatus(this.statusMessage)
if (this.native) { if (this.native) {
this.restoreNativeState()
this.postNative({action: "push_token_request"}) this.postNative({action: "push_token_request"})
} else { } else {
this.restoreWebState() this.restoreWebState()