From e012292e327a628842990533c7ae308c17654239 Mon Sep 17 00:00:00 2001
From: Patrizio Bekerle <patrizio@bekerle.com>
Date: Tue, 19 Jan 2021 08:34:57 +0100
Subject: [PATCH] Add workaround for observing the "lang" attribute in
 dbp-provider (dbp/apps/library#77)

---
 .../language-select/src/language-select.js    |  2 +-
 packages/provider/src/provider.js             | 39 +++++++++++++++----
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/packages/language-select/src/language-select.js b/packages/language-select/src/language-select.js
index 42b3ade6..772163c5 100644
--- a/packages/language-select/src/language-select.js
+++ b/packages/language-select/src/language-select.js
@@ -62,7 +62,7 @@ export class LanguageSelect extends AdapterLitElement {
             this.dispatchEvent(event);
 
             // tell a dbp-provider to update the "lang" property
-            this.sendSetPropertyEvent('language', value);
+            this.sendSetPropertyEvent('lang', value);
 
             // Unlike other cases we use the next language for the translations so that
             // users not knowing the current language can understand it.
diff --git a/packages/provider/src/provider.js b/packages/provider/src/provider.js
index 7cd95fc0..f897b6eb 100644
--- a/packages/provider/src/provider.js
+++ b/packages/provider/src/provider.js
@@ -7,6 +7,29 @@ export class Provider extends HTMLElement {
         console.log('Provider constructor()');
     }
 
+    /**
+     * The "lang" property seems to be updated before the event from the MutationObserver, so we cannot observe a value change directly
+     * Workaround: use another property (e.g. "langValue") instead of "lang"
+     *
+     * @param name
+     * @returns {string|*}
+     */
+    static getPropertyName(name) {
+        return name === 'lang' ? 'langValue' : name;
+    }
+
+    getValue(name) {
+        return this[Provider.getPropertyName(name)];
+    }
+
+    setValue(name, value) {
+        this[Provider.getPropertyName(name)] = value;
+    }
+
+    hasProperty(name) {
+        return Object.hasOwnProperty.call(this, Provider.getPropertyName(name));
+    }
+
     connectedCallback() {
         console.log('Provider(' + this.id + ') connectedCallback()');
 
@@ -14,11 +37,11 @@ export class Provider extends HTMLElement {
 
         this.addEventListener('subscribe', function (e) {
             const name = e.detail.name;
-            if (Object.hasOwnProperty.call(that, name) || that.root) {
+            if (that.hasProperty(name) || that.root) {
                 console.log('Provider(' + that.id + ') eventListener("subscribe",..) name "' + name + '" found.');
                 that.callbackStore.push({name: name, callback: e.detail.callback, sender: e.detail.sender});
 
-                e.detail.callback(that[name]);
+                e.detail.callback(that.getValue(name));
                 e.stopPropagation();
             }
         }, false);
@@ -26,7 +49,7 @@ export class Provider extends HTMLElement {
         this.addEventListener('unsubscribe', function (e) {
             const name = e.detail.name;
             const sender = e.detail.sender;
-            if (Object.hasOwnProperty.call(that, name) || that.root) {
+            if (that.hasProperty(name) || that.root) {
                 console.log('Provider(' + that.id + ') eventListener("unsubscribe",..) name "' + name + '" found.');
                 that.callbackStore.forEach(item => {
                     if (item.sender === sender && item.name === name) {
@@ -45,9 +68,9 @@ export class Provider extends HTMLElement {
             const name = e.detail.name;
             const value = e.detail.value;
 
-            if (Object.hasOwnProperty.call(that, name) || that.root) {
+            if (that.hasProperty(name) || that.root) {
                 console.log('Provider(' + that.id + ') eventListener("set-property",..) name "' + name + '" found.');
-                that[name] = value;
+                that.setValue(name, value);
 
                 that.callbackStore.forEach(item => {
                     if (item.name === name) {
@@ -69,9 +92,11 @@ export class Provider extends HTMLElement {
                 if (mutation.type === 'attributes') {
                     const name = mutation.attributeName;
                     const value = that.getAttribute(name);
-                    if (that[name] !== value) {
+
+                    if (that.getValue(name) !== value) {
                         console.log('Provider (' + that.id + ') observed attribute "' + name + '" changed');
-                        that[name] = value;
+                        that.setValue(name, value);
+
                         that.callbackStore.forEach(item => {
                             if (item.name === name) {
                                 item.callback(value);
-- 
GitLab