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