Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

watch() function does not trigger in prod build #42

Closed
mStirner opened this issue Dec 26, 2022 · 8 comments
Closed

watch() function does not trigger in prod build #42

mStirner opened this issue Dec 26, 2022 · 8 comments
Labels
bug Something isn't working

Comments

@mStirner
Copy link
Member

Does not work after npm run build nor in npm run preview

E.g: "Enable background gardient" setting

@mStirner mStirner added the bug Something isn't working label Dec 26, 2022
@mStirner
Copy link
Member Author

Thats a bug in vue v3.2.31: vuejs/core#5707

@mStirner
Copy link
Member Author

In v3.2.45 watcher does not work any more.
Even in dev environment.

@mStirner
Copy link
Member Author

@mStirner mStirner added this to the v1.0.0 release milestone Dec 27, 2022
@mStirner
Copy link
Member Author

Use a workaround with a proxy handler?

  mounted() {
    console.log("Mounted, watch settings");

    this.settings = new Proxy(this.settings, {
      set(target, prop) {
        console.log("Settings proxy", prop);

        if (!target.groupItems) {
          target.groupRoomItems = false;
          target.groupEndpointItems = false;
          target.groupDeviceItems = false;
        }

        if (target.showGradientBackground) {
          document.getElementById("app").classList.remove("bg-dark");
          document.getElementById("app").classList.add("gardien-background");
        } else {
          document.getElementById("app").classList.add("bg-dark");
          document.getElementById("app").classList.remove("gardien-background");
        }

        routes.forEach((route) => {
          route.visible = target[`show${route.name}Button`];
        });
        return true;
      },
    });
}

The quick test above did not work.

@mStirner
Copy link
Member Author

Test with:

Reflect.set(target, propertyKey, value)
Reflect.set(target, propertyKey, value, receiver)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect/set

@mStirner
Copy link
Member Author

    this.settings = new Proxy(this.settings, {
      set(target, prop, value, receiver) {
        console.log("Settings proxy", prop);

        let result = Reflect.set(target, prop, value, receiver);

        if (!target.groupItems) {
          Reflect.set(target, "groupRoomItems", false, receiver);
          Reflect.set(target, "groupEndpointItems", false, receiver);
          Reflect.set(target, "groupDeviceItems", false, receiver);
        }

        if (target.showGradientBackground) {
          document.getElementById("app").classList.remove("bg-dark");
          document.getElementById("app").classList.add("gardien-background");
        } else {
          document.getElementById("app").classList.add("bg-dark");
          document.getElementById("app").classList.remove("gardien-background");
        }

        routes.forEach((route) => {
          route.visible = target[`show${route.name}Button`];
        });

        return result;
      },
    });

Works in dev the same as .watch(...) but not in production.

@mStirner
Copy link
Member Author

Todo: test the setting stuff in store.jsmain.js instead of the watch callback.

@mStirner
Copy link
Member Author

pinia.use(({ store }) => {
    if (store.$id === "settings") {

        // listen for changes
        // `.watch()` in Settings.vue does not work.
        // see #42
        store.$subscribe((mutation, state) => {

            if (!store.groupItems) {
                store.groupRoomItems = false;
                store.groupEndpointItems = false;
                store.groupDeviceItems = false;
            }

            if (store.showGradientBackground) {
                document.getElementById("app").classList.remove("bg-dark");
                document.getElementById("app").classList.add("gardien-background");
            } else {
                document.getElementById("app").classList.add("bg-dark");
                document.getElementById("app").classList.remove("gardien-background");
            }

        });

        // initial background settings
        if (store.showGradientBackground) {
            document.getElementById("app").classList.remove("bg-dark");
            document.getElementById("app").classList.add("gardien-background");
        } else {
            document.getElementById("app").classList.add("bg-dark");
            document.getElementById("app").classList.remove("gardien-background");
        }

    }
});

Does the trick.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant