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