1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "bridge/declarative_frontend/jsview/js_navdestination_context.h"
17 
18 #include "base/log/ace_scoring_log.h"
19 #include "base/memory/ace_type.h"
20 #include "base/utils/utils.h"
21 #include "bridge/declarative_frontend/engine/functions/js_function.h"
22 #include "bridge/declarative_frontend/engine/js_converter.h"
23 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
24 #include "bridge/declarative_frontend/engine/js_types.h"
25 #include "bridge/declarative_frontend/jsview/js_navigation_stack.h"
26 #include "bridge/declarative_frontend/jsview/js_utils.h"
27 #include "frameworks/core/components_ng/pattern/navigation/navigation_route.h"
28 
29 namespace OHOS::Ace::Framework {
GetParamObj() const30 napi_value JSNavPathInfo::GetParamObj() const
31 {
32     return JsConverter::ConvertJsValToNapiValue(param_);
33 }
34 
GetPathInfo(const JSCallbackInfo & info)35 void JSNavDestinationContext::GetPathInfo(const JSCallbackInfo& info)
36 {
37     JSRef<JSObject> obj = JSRef<JSObject>::New();
38     auto pathInfo = context_->GetNavPathInfo();
39     if (!pathInfo) {
40         info.SetReturnValue(obj);
41         return;
42     }
43     obj->SetProperty<std::string>("name", pathInfo->GetName());
44     obj->SetProperty<bool>("isEntry", pathInfo->GetIsEntry());
45     auto jsInfo = AceType::DynamicCast<JSNavPathInfo>(pathInfo);
46     JSRef<JSVal> param;
47     JSRef<JSVal> onPop;
48     if (jsInfo) {
49         param = jsInfo->GetParam();
50         onPop = jsInfo->GetOnPop();
51     }
52     if (!param->IsEmpty()) {
53         obj->SetPropertyObject("param", param);
54     }
55     if (!onPop->IsEmpty()) {
56         obj->SetPropertyObject("onPop", onPop);
57     }
58     info.SetReturnValue(obj);
59 }
60 
SetPathInfo(const JSCallbackInfo & info)61 void JSNavDestinationContext::SetPathInfo(const JSCallbackInfo& info)
62 {
63     TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context don't support set path stack");
64 }
65 
GetPathStack(const JSCallbackInfo & info)66 void JSNavDestinationContext::GetPathStack(const JSCallbackInfo& info)
67 {
68     JSRef<JSObject> obj = JSRef<JSObject>::New();
69     auto stack = context_->GetNavigationStack().Upgrade();
70     if (!stack) {
71         info.SetReturnValue(obj);
72         return;
73     }
74     auto jsStack = AceType::DynamicCast<JSNavigationStack>(stack);
75     if (!jsStack) {
76         info.SetReturnValue(obj);
77         return;
78     }
79     auto navPathStackObj = jsStack->GetDataSourceObj();
80     if (navPathStackObj->IsEmpty()) {
81         info.SetReturnValue(obj);
82         return;
83     }
84     info.SetReturnValue(navPathStackObj);
85 }
86 
SetPathStack(const JSCallbackInfo & info)87 void JSNavDestinationContext::SetPathStack(const JSCallbackInfo& info)
88 {
89     TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context not support set path stack");
90 }
91 
GetRouteInfo(const JSCallbackInfo & info)92 void JSNavDestinationContext::GetRouteInfo(const JSCallbackInfo& info)
93 {
94     auto container = Container::Current();
95     auto navigationRoute = container->GetNavigationRoute();
96     if (!navigationRoute) {
97         return;
98     }
99     auto param = context_->GetNavPathInfo();
100     CHECK_NULL_VOID(param);
101     NG::RouteItem routeInfo;
102     if (!navigationRoute->GetRouteItem(param->GetName(), routeInfo)) {
103         return;
104     }
105     JSRef<JSObject> routeData = JSRef<JSObject>::New();
106     routeData->SetProperty<std::string>("name", param->GetName().c_str());
107     routeData->SetProperty<std::string>("pageSourceFile", routeInfo.pageSourceFile->c_str());
108     JSRef<JSObject> data = JSRef<JSObject>::New();
109     for (auto iter = routeInfo.data.begin(); iter != routeInfo.data.end(); iter++) {
110         data->SetProperty<std::string>(iter->first.c_str(), iter->second.c_str());
111     }
112     routeData->SetPropertyObject("data", data);
113     info.SetReturnValue(routeData);
114 }
115 
SetNavDestinationId(const JSCallbackInfo & info)116 void JSNavDestinationContext::SetNavDestinationId(const JSCallbackInfo& info)
117 {
118     TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navdestination context not support set navdestinationId");
119 }
120 
GetNavDestinationId(const JSCallbackInfo & info)121 void JSNavDestinationContext::GetNavDestinationId(const JSCallbackInfo& info)
122 {
123     JSRef<JSString> idStr = JSRef<JSString>::New(std::to_string(context_->GetNavDestinationId()));
124     info.SetReturnValue(idStr);
125 }
126 
JSBind(BindingTarget target)127 void JSNavDestinationContext::JSBind(BindingTarget target)
128 {
129     JSClass<JSNavDestinationContext>::Declare("NavDestinationContext");
130     JSClass<JSNavDestinationContext>::CustomProperty("pathInfo", &JSNavDestinationContext::GetPathInfo,
131         &JSNavDestinationContext::SetPathInfo);
132     JSClass<JSNavDestinationContext>::CustomProperty("pathStack", &JSNavDestinationContext::GetPathStack,
133         &JSNavDestinationContext::SetPathStack);
134     JSClass<JSNavDestinationContext>::CustomProperty("navDestinationId", &JSNavDestinationContext::GetNavDestinationId,
135         &JSNavDestinationContext::SetNavDestinationId);
136     JSClass<JSNavDestinationContext>::CustomMethod("getConfigInRouteMap", &JSNavDestinationContext::GetRouteInfo);
137     JSClass<JSNavDestinationContext>::Bind(
138         target, &JSNavDestinationContext::Constructor, &JSNavDestinationContext::Destructor);
139 }
140 
Constructor(const JSCallbackInfo & info)141 void JSNavDestinationContext::Constructor(const JSCallbackInfo& info)
142 {
143     auto proxy = Referenced::MakeRefPtr<JSNavDestinationContext>();
144     proxy->IncRefCount();
145     info.SetReturnValue(Referenced::RawPtr(proxy));
146 }
147 
Destructor(JSNavDestinationContext * context)148 void JSNavDestinationContext::Destructor(JSNavDestinationContext* context)
149 {
150     if (context != nullptr) {
151         context->DecRefCount();
152     }
153 }
154 } // namespace OHOS::Ace::Framework
155