MobX State Tree generator does not allow modified state in a successful promise?












0















Via the code following I get this error:



error: Error: [mobx-state-tree] Cannot modify 
'AuthenticationStore@<root>', the object is protected and can only be
modified by using an action.


the code (generator) in question:



.model('AuthenticationStore', {
user: types.frozen(),
loading: types.optional(types.boolean, false),
error: types.frozen()
})
.actions(self => ({
submitLogin: flow(function * (email, password) {
self.error = undefined
self.loading = true
self.user = yield fetch('/api/sign_in', {
method: 'post',
mode: 'cors',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
'user' : {
'email': email,
'password': password
}
})
}).then(res => {
return res.json()
}).then(response => {
self.loading = false // the error happens here!
return response.data
}).catch(error => {
console.error('error:', error)
// self.error = error
})
}), ...


The question: is this not permitted in a generator, is there a better way to update this particular state or does it need to be wrapped by a try/catch?



As always thanks is advance for any and all feedback!










share|improve this question





























    0















    Via the code following I get this error:



    error: Error: [mobx-state-tree] Cannot modify 
    'AuthenticationStore@<root>', the object is protected and can only be
    modified by using an action.


    the code (generator) in question:



    .model('AuthenticationStore', {
    user: types.frozen(),
    loading: types.optional(types.boolean, false),
    error: types.frozen()
    })
    .actions(self => ({
    submitLogin: flow(function * (email, password) {
    self.error = undefined
    self.loading = true
    self.user = yield fetch('/api/sign_in', {
    method: 'post',
    mode: 'cors',
    headers: {
    'Content-Type': 'application/json',
    },
    body: JSON.stringify({
    'user' : {
    'email': email,
    'password': password
    }
    })
    }).then(res => {
    return res.json()
    }).then(response => {
    self.loading = false // the error happens here!
    return response.data
    }).catch(error => {
    console.error('error:', error)
    // self.error = error
    })
    }), ...


    The question: is this not permitted in a generator, is there a better way to update this particular state or does it need to be wrapped by a try/catch?



    As always thanks is advance for any and all feedback!










    share|improve this question



























      0












      0








      0








      Via the code following I get this error:



      error: Error: [mobx-state-tree] Cannot modify 
      'AuthenticationStore@<root>', the object is protected and can only be
      modified by using an action.


      the code (generator) in question:



      .model('AuthenticationStore', {
      user: types.frozen(),
      loading: types.optional(types.boolean, false),
      error: types.frozen()
      })
      .actions(self => ({
      submitLogin: flow(function * (email, password) {
      self.error = undefined
      self.loading = true
      self.user = yield fetch('/api/sign_in', {
      method: 'post',
      mode: 'cors',
      headers: {
      'Content-Type': 'application/json',
      },
      body: JSON.stringify({
      'user' : {
      'email': email,
      'password': password
      }
      })
      }).then(res => {
      return res.json()
      }).then(response => {
      self.loading = false // the error happens here!
      return response.data
      }).catch(error => {
      console.error('error:', error)
      // self.error = error
      })
      }), ...


      The question: is this not permitted in a generator, is there a better way to update this particular state or does it need to be wrapped by a try/catch?



      As always thanks is advance for any and all feedback!










      share|improve this question
















      Via the code following I get this error:



      error: Error: [mobx-state-tree] Cannot modify 
      'AuthenticationStore@<root>', the object is protected and can only be
      modified by using an action.


      the code (generator) in question:



      .model('AuthenticationStore', {
      user: types.frozen(),
      loading: types.optional(types.boolean, false),
      error: types.frozen()
      })
      .actions(self => ({
      submitLogin: flow(function * (email, password) {
      self.error = undefined
      self.loading = true
      self.user = yield fetch('/api/sign_in', {
      method: 'post',
      mode: 'cors',
      headers: {
      'Content-Type': 'application/json',
      },
      body: JSON.stringify({
      'user' : {
      'email': email,
      'password': password
      }
      })
      }).then(res => {
      return res.json()
      }).then(response => {
      self.loading = false // the error happens here!
      return response.data
      }).catch(error => {
      console.error('error:', error)
      // self.error = error
      })
      }), ...


      The question: is this not permitted in a generator, is there a better way to update this particular state or does it need to be wrapped by a try/catch?



      As always thanks is advance for any and all feedback!







      generator mobx mobx-react mobx-state-tree






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 14 '18 at 18:15







      studiobrain

















      asked Nov 14 '18 at 18:04









      studiobrainstudiobrain

      3331417




      3331417
























          1 Answer
          1






          active

          oldest

          votes


















          1














          The problem is you're calling then on the Promise returned by fetch(), and the function you pass to then is not an action. Note that functions that run within an action (or flow) do not count as the action itself.



          Since you're using yield, you don't need to call then or catch on the Promise returned by fetch(). Instead, wrap it in a try/catch:



          submitLogin: flow(function * (email, password) {
          self.error = undefined;
          self.loading = true;
          try {
          const res = yield fetch('/api/sign_in', {
          method: 'post',
          mode: 'cors',
          headers: {
          'Content-Type': 'application/json',
          },
          body: JSON.stringify({
          'user' : {
          'email': email,
          'password': password
          }
          })
          });
          const response = yield res.json();
          self.loading = false;
          self.user = response;
          } catch(error) {
          console.log('error: ', error);
          self.error = error;
          }
          }





          share|improve this answer
























          • Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

            – studiobrain
            Nov 16 '18 at 0:11











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53306305%2fmobx-state-tree-generator-does-not-allow-modified-state-in-a-successful-promise%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          The problem is you're calling then on the Promise returned by fetch(), and the function you pass to then is not an action. Note that functions that run within an action (or flow) do not count as the action itself.



          Since you're using yield, you don't need to call then or catch on the Promise returned by fetch(). Instead, wrap it in a try/catch:



          submitLogin: flow(function * (email, password) {
          self.error = undefined;
          self.loading = true;
          try {
          const res = yield fetch('/api/sign_in', {
          method: 'post',
          mode: 'cors',
          headers: {
          'Content-Type': 'application/json',
          },
          body: JSON.stringify({
          'user' : {
          'email': email,
          'password': password
          }
          })
          });
          const response = yield res.json();
          self.loading = false;
          self.user = response;
          } catch(error) {
          console.log('error: ', error);
          self.error = error;
          }
          }





          share|improve this answer
























          • Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

            – studiobrain
            Nov 16 '18 at 0:11
















          1














          The problem is you're calling then on the Promise returned by fetch(), and the function you pass to then is not an action. Note that functions that run within an action (or flow) do not count as the action itself.



          Since you're using yield, you don't need to call then or catch on the Promise returned by fetch(). Instead, wrap it in a try/catch:



          submitLogin: flow(function * (email, password) {
          self.error = undefined;
          self.loading = true;
          try {
          const res = yield fetch('/api/sign_in', {
          method: 'post',
          mode: 'cors',
          headers: {
          'Content-Type': 'application/json',
          },
          body: JSON.stringify({
          'user' : {
          'email': email,
          'password': password
          }
          })
          });
          const response = yield res.json();
          self.loading = false;
          self.user = response;
          } catch(error) {
          console.log('error: ', error);
          self.error = error;
          }
          }





          share|improve this answer
























          • Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

            – studiobrain
            Nov 16 '18 at 0:11














          1












          1








          1







          The problem is you're calling then on the Promise returned by fetch(), and the function you pass to then is not an action. Note that functions that run within an action (or flow) do not count as the action itself.



          Since you're using yield, you don't need to call then or catch on the Promise returned by fetch(). Instead, wrap it in a try/catch:



          submitLogin: flow(function * (email, password) {
          self.error = undefined;
          self.loading = true;
          try {
          const res = yield fetch('/api/sign_in', {
          method: 'post',
          mode: 'cors',
          headers: {
          'Content-Type': 'application/json',
          },
          body: JSON.stringify({
          'user' : {
          'email': email,
          'password': password
          }
          })
          });
          const response = yield res.json();
          self.loading = false;
          self.user = response;
          } catch(error) {
          console.log('error: ', error);
          self.error = error;
          }
          }





          share|improve this answer













          The problem is you're calling then on the Promise returned by fetch(), and the function you pass to then is not an action. Note that functions that run within an action (or flow) do not count as the action itself.



          Since you're using yield, you don't need to call then or catch on the Promise returned by fetch(). Instead, wrap it in a try/catch:



          submitLogin: flow(function * (email, password) {
          self.error = undefined;
          self.loading = true;
          try {
          const res = yield fetch('/api/sign_in', {
          method: 'post',
          mode: 'cors',
          headers: {
          'Content-Type': 'application/json',
          },
          body: JSON.stringify({
          'user' : {
          'email': email,
          'password': password
          }
          })
          });
          const response = yield res.json();
          self.loading = false;
          self.user = response;
          } catch(error) {
          console.log('error: ', error);
          self.error = error;
          }
          }






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 15 '18 at 22:22









          Nathan JonesNathan Jones

          1,91942952




          1,91942952













          • Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

            – studiobrain
            Nov 16 '18 at 0:11



















          • Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

            – studiobrain
            Nov 16 '18 at 0:11

















          Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

          – studiobrain
          Nov 16 '18 at 0:11





          Ahhh, that makes sense now that you point it out. Possibly the reason none of my components with the injected store are not seeing the updates. Thanks!

          – studiobrain
          Nov 16 '18 at 0:11




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53306305%2fmobx-state-tree-generator-does-not-allow-modified-state-in-a-successful-promise%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Florida Star v. B. J. F.

          Danny Elfman

          Lugert, Oklahoma