1*fa88aeb8STomasz Sapeta // Copyright 2022-present 650 Industries. All rights reserved.
2*fa88aeb8STomasz Sapeta 
3*fa88aeb8STomasz Sapeta #include "JSIUtils.h"
4*fa88aeb8STomasz Sapeta #include "LazyObject.h"
5*fa88aeb8STomasz Sapeta 
6*fa88aeb8STomasz Sapeta namespace expo {
7*fa88aeb8STomasz Sapeta 
8*fa88aeb8STomasz Sapeta LazyObject::LazyObject(const LazyObjectInitializer initializer) : initializer(initializer) {}
9*fa88aeb8STomasz Sapeta 
10*fa88aeb8STomasz Sapeta LazyObject::~LazyObject() {
11*fa88aeb8STomasz Sapeta   backedObject = nullptr;
12*fa88aeb8STomasz Sapeta }
13*fa88aeb8STomasz Sapeta 
14*fa88aeb8STomasz Sapeta jsi::Value LazyObject::get(jsi::Runtime &runtime, const jsi::PropNameID &name) {
15*fa88aeb8STomasz Sapeta   if (!backedObject) {
16*fa88aeb8STomasz Sapeta     if (name.utf8(runtime) == "$$typeof") {
17*fa88aeb8STomasz Sapeta       // React Native asks for this property for some reason, we can just ignore it.
18*fa88aeb8STomasz Sapeta       return jsi::Value::undefined();
19*fa88aeb8STomasz Sapeta     }
20*fa88aeb8STomasz Sapeta     backedObject = initializer(runtime);
21*fa88aeb8STomasz Sapeta   }
22*fa88aeb8STomasz Sapeta   return backedObject ? backedObject->getProperty(runtime, name) : jsi::Value::undefined();
23*fa88aeb8STomasz Sapeta }
24*fa88aeb8STomasz Sapeta 
25*fa88aeb8STomasz Sapeta void LazyObject::set(jsi::Runtime &runtime, const jsi::PropNameID &name, const jsi::Value &value) {
26*fa88aeb8STomasz Sapeta   if (!backedObject) {
27*fa88aeb8STomasz Sapeta     backedObject = initializer(runtime);
28*fa88aeb8STomasz Sapeta   }
29*fa88aeb8STomasz Sapeta   if (backedObject) {
30*fa88aeb8STomasz Sapeta     backedObject->setProperty(runtime, name, value);
31*fa88aeb8STomasz Sapeta   }
32*fa88aeb8STomasz Sapeta }
33*fa88aeb8STomasz Sapeta 
34*fa88aeb8STomasz Sapeta std::vector<jsi::PropNameID> LazyObject::getPropertyNames(jsi::Runtime &runtime) {
35*fa88aeb8STomasz Sapeta   if (!backedObject) {
36*fa88aeb8STomasz Sapeta     backedObject = initializer(runtime);
37*fa88aeb8STomasz Sapeta   }
38*fa88aeb8STomasz Sapeta   if (backedObject) {
39*fa88aeb8STomasz Sapeta     jsi::Array propertyNames = backedObject->getPropertyNames(runtime);
40*fa88aeb8STomasz Sapeta     return jsiArrayToPropNameIdsVector(runtime, propertyNames);
41*fa88aeb8STomasz Sapeta   }
42*fa88aeb8STomasz Sapeta   return {};
43*fa88aeb8STomasz Sapeta }
44*fa88aeb8STomasz Sapeta 
45*fa88aeb8STomasz Sapeta } // namespace expo
46