blob: df205d72f446c286ecff9baee98d426568136c2c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import "WXComponent+Navigation.h"
#import "WXComponent_internal.h"
#import "WXSDKInstance_private.h"
#import "WXBaseViewController.h"
#import "WXHandlerFactory.h"
#import "WXConvert.h"
#import "WXUtility.h"
#define kBarTintColor @"barTintColor"
#define kBarItemText @"title"
#define kBarItemTextColor @"titleColor"
#define kBarItemIcon @"icon"
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
@implementation WXComponent (Navigation)
- (id<WXNavigationProtocol>)navigator
{
id<WXNavigationProtocol> navigator = [WXHandlerFactory handlerForProtocol:@protocol(WXNavigationProtocol)];
return navigator;
}
// navigtion configuration
- (void)_setupNavBarWithStyles:(NSMutableDictionary *)styles attributes:(NSMutableDictionary *)attributes
{
NSString *dataRole = attributes[@"dataRole"];
if (dataRole && [dataRole isEqualToString:@"navbar"]) {
styles[@"visibility"] = @"hidden";
styles[@"position"] = @"fixed";
self.weexInstance.naviBarStyles = [NSMutableDictionary new];
[self setNavigationBarHidden:NO];
NSString *backgroundColor = styles[@"backgroundColor"];
[self setNavigationBackgroundColor:[WXConvert UIColor:backgroundColor]];
}
NSString *position = attributes[@"naviItemPosition"];
if (position) {
NSMutableDictionary *data = [NSMutableDictionary new];
[data setObject:_type forKey:@"type"];
[data setObject:styles forKey:@"style"];
[data setObject:attributes forKey:@"attr"];
if ([position isEqualToString:@"left"]) {
[self setNavigationItemWithParam:data position:WXNavigationItemPositionLeft];
}
else if ([position isEqualToString:@"right"]) {
[self setNavigationItemWithParam:data position:WXNavigationItemPositionRight];
}
else if ([position isEqualToString:@"center"]) {
[self setNavigationItemWithParam:data position:WXNavigationItemPositionCenter];
}
}
}
- (void)_updateNavBarAttributes:(NSDictionary *)attributes
{
if (attributes[@"data-role"]) {
NSString *dataRole = attributes[@"data-role"];
if ([dataRole isEqualToString:@"navbar"]) {
[self setNavigationBarHidden:NO];
NSDictionary *style = self.styles[@"style"];
NSString *backgroundColor = style[@"backgroundColor"];
[self setNavigationBackgroundColor:[WXConvert UIColor:backgroundColor]];
}
}
}
- (void)setNavigationBarHidden:(BOOL)hidden
{
UIViewController *container = self.weexInstance.viewController;
id<WXNavigationProtocol> navigator = [self navigator];
WXPerformBlockOnMainThread(^{
[navigator setNavigationBarHidden:hidden animated:NO withContainer:container];
});
}
- (void)setNavigationBackgroundColor:(UIColor *)backgroundColor
{
if (!backgroundColor) return;
NSMutableDictionary *styles = self.weexInstance.naviBarStyles;
[styles setObject:backgroundColor forKey:kBarTintColor];
UIViewController *container = self.weexInstance.viewController;
id<WXNavigationProtocol> navigator = [self navigator];
WXPerformBlockOnMainThread(^{
[navigator setNavigationBackgroundColor:backgroundColor withContainer:container];
});
}
- (void)setNavigationItemWithParam:(NSDictionary *)param position:(WXNavigationItemPosition)position
{
if (!param) return;
__weak __block typeof(WXComponent) *weakSelf = self;
NSArray *array = @[@"center",@"right",@"left",@"more"];
[self _parse:param resultBlock:^(NSDictionary *dict) {
NSMutableDictionary *styles = weakSelf.weexInstance.naviBarStyles;
[styles setObject:dict forKey: array[position]];
UIViewController *container = weakSelf.weexInstance.viewController;
id<WXNavigationProtocol> navigator = [weakSelf navigator];
WXPerformBlockOnMainThread(^{
[navigator setNavigationItemWithParam:dict position:position completion:nil withContainer:container];
});
}];
}
- (void)setNavigationWithStyles:(NSDictionary *)styles
{
UIViewController *container = self.weexInstance.viewController;
id<WXNavigationProtocol> navigator = [self navigator];
if (styles) {
[navigator setNavigationBarHidden:NO animated:NO withContainer:container];
[navigator setNavigationBackgroundColor:styles[kBarTintColor] withContainer:container];
NSArray *array = @[@"center",@"right",@"left",@"more"];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[navigator setNavigationItemWithParam:styles[obj] position:idx completion:nil withContainer:container];
}];
}
else {
[navigator setNavigationBarHidden:YES animated:NO withContainer:container];
}
}
- (void)_parse:(NSDictionary *)param resultBlock:(void(^)(NSDictionary *))result
{
NSMutableDictionary *dict = [NSMutableDictionary new];
NSString *type = param[@"type"];
[dict setObject:self.weexInstance.instanceId forKey:@"instanceId"];
[dict setObject:self.ref forKey:@"nodeRef"];
if ([type isEqualToString:@"text"]) {
NSDictionary *attr = param[@"attr"];
NSString *title = attr[@"value"];
if (title) {
[dict setObject:title forKey:kBarItemText];
}
NSDictionary *style = param[@"style"];
NSString *color = style[@"color"];
if (color) {
[dict setObject:color forKey:kBarItemTextColor];
}
}
else if ([type isEqualToString:@"image"]) {
NSDictionary *attr = param[@"attr"];
NSString *src = attr[@"src"];
if (src) {
[dict setObject:src forKey:kBarItemIcon];
}
}
result(dict);
}
@end