1*023bc8eaSKudo Chien #include "MutableValueSetterProxy.h"
2*023bc8eaSKudo Chien #include <jsi/jsi.h>
3*023bc8eaSKudo Chien #include "MutableValue.h"
4*023bc8eaSKudo Chien #include "SharedParent.h"
5*023bc8eaSKudo Chien 
6*023bc8eaSKudo Chien using namespace facebook;
7*023bc8eaSKudo Chien 
8*023bc8eaSKudo Chien namespace reanimated {
9*023bc8eaSKudo Chien 
set(jsi::Runtime & rt,const jsi::PropNameID & name,const jsi::Value & newValue)10*023bc8eaSKudo Chien void MutableValueSetterProxy::set(
11*023bc8eaSKudo Chien     jsi::Runtime &rt,
12*023bc8eaSKudo Chien     const jsi::PropNameID &name,
13*023bc8eaSKudo Chien     const jsi::Value &newValue) {
14*023bc8eaSKudo Chien   auto propName = name.utf8(rt);
15*023bc8eaSKudo Chien   if (propName == "_value") {
16*023bc8eaSKudo Chien     mutableValue->setValue(rt, newValue);
17*023bc8eaSKudo Chien   } else if (propName == "_animation") {
18*023bc8eaSKudo Chien     // TODO: assert to allow animation to be set from UI only
19*023bc8eaSKudo Chien     if (mutableValue->animation.expired()) {
20*023bc8eaSKudo Chien       mutableValue->animation = mutableValue->getWeakRef(rt);
21*023bc8eaSKudo Chien     }
22*023bc8eaSKudo Chien     *mutableValue->animation.lock() = jsi::Value(rt, newValue);
23*023bc8eaSKudo Chien   } else if (propName == "value") {
24*023bc8eaSKudo Chien     // you call `this.value` inside of value setter, we should throw
25*023bc8eaSKudo Chien   }
26*023bc8eaSKudo Chien }
27*023bc8eaSKudo Chien 
get(jsi::Runtime & rt,const jsi::PropNameID & name)28*023bc8eaSKudo Chien jsi::Value MutableValueSetterProxy::get(
29*023bc8eaSKudo Chien     jsi::Runtime &rt,
30*023bc8eaSKudo Chien     const jsi::PropNameID &name) {
31*023bc8eaSKudo Chien   auto propName = name.utf8(rt);
32*023bc8eaSKudo Chien 
33*023bc8eaSKudo Chien   if (propName == "value") {
34*023bc8eaSKudo Chien     return mutableValue->getValue(rt);
35*023bc8eaSKudo Chien   } else if (propName == "_value") {
36*023bc8eaSKudo Chien     return mutableValue->getValue(rt);
37*023bc8eaSKudo Chien   } else if (propName == "_animation") {
38*023bc8eaSKudo Chien     if (mutableValue->animation.expired()) {
39*023bc8eaSKudo Chien       mutableValue->animation = mutableValue->getWeakRef(rt);
40*023bc8eaSKudo Chien     }
41*023bc8eaSKudo Chien     return jsi::Value(rt, *mutableValue->animation.lock());
42*023bc8eaSKudo Chien   }
43*023bc8eaSKudo Chien 
44*023bc8eaSKudo Chien   return jsi::Value::undefined();
45*023bc8eaSKudo Chien }
46*023bc8eaSKudo Chien 
47*023bc8eaSKudo Chien } // namespace reanimated
48