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