| ... | ... | @@ -159,7 +159,7 @@ index 8a41697223f6c4b5cb2dd6d450fc58cbb3b27536..309ba2f762068dcf452c172f7c7cbf2a |
| 159 | 159 | |
| 160 | 160 | NS_ASSUME_NONNULL_END |
| 161 | 161 | diff --git a/ios/RNSScreenStackHeaderConfig.mm b/ios/RNSScreenStackHeaderConfig.mm |
| 162 | | index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338eff90c694 100644 |
| 162 | index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..a60b96b44e85d3f4b29dc0d190b95ab60e185033 100644 |
| 163 | 163 | --- a/ios/RNSScreenStackHeaderConfig.mm |
| 164 | 164 | +++ b/ios/RNSScreenStackHeaderConfig.mm |
| 165 | 165 | @@ -24,11 +24,46 @@ |
| ... | ... | @@ -294,7 +294,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 294 | 294 | break; |
| 295 | 295 | } |
| 296 | 296 | case RNSScreenStackHeaderSubviewTypeCenter: |
| 297 | | @@ -648,10 +693,453 @@ + (void)updateViewController:(UIViewController *)vc |
| 297 | @@ -648,10 +693,470 @@ + (void)updateViewController:(UIViewController *)vc |
| 298 | 298 | // This assignment should be done after `navitem.titleView = ...` assignment (iOS 16.0 bug). |
| 299 | 299 | // See: https://github.com/software-mansion/react-native-screens/issues/1570 (comments) |
| 300 | 300 | navitem.title = config.title; |
| ... | ... | @@ -323,21 +323,24 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 323 | 323 | + navitem, &RNSAppliedLeadingHeaderItemsKey, @[ config, headerLeftConfigs, subviewLeftItems ])) { |
| 324 | 324 | + NSArray *items = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems |
| 325 | 325 | + withCurrentItems:subviewLeftItems |
| 326 | | + navigationItem:navitem]; |
| 326 | + navigationItem:navitem |
| 327 | + allowsSearchBarPlacement:NO]; |
| 327 | 328 | + navitem.leadingItemGroups = [config barButtonItemGroupsFromItems:items]; |
| 328 | 329 | + } |
| 329 | 330 | + if (RNSUpdateHeaderItemsCache( |
| 330 | 331 | + navitem, &RNSAppliedTrailingHeaderItemsKey, @[ config, headerRightConfigs, subviewRightItems ])) { |
| 331 | 332 | + NSArray *items = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems |
| 332 | 333 | + withCurrentItems:subviewRightItems |
| 333 | | + navigationItem:navitem]; |
| 334 | + navigationItem:navitem |
| 335 | + allowsSearchBarPlacement:NO]; |
| 334 | 336 | + navitem.trailingItemGroups = [config barButtonItemGroupsFromItems:items]; |
| 335 | 337 | + } |
| 336 | 338 | + if (@available(iOS 26.0, *)) { |
| 337 | 339 | + if (RNSUpdateHeaderItemsCache(navitem, &RNSAppliedCenterHeaderItemsKey, @[ config, headerCenterConfigs ])) { |
| 338 | 340 | + NSArray *items = [config barButtonItemsFromConfigs:config.headerCenterBarButtonItems |
| 339 | 341 | + withCurrentItems:@[] |
| 340 | | + navigationItem:navitem]; |
| 342 | + navigationItem:navitem |
| 343 | + allowsSearchBarPlacement:NO]; |
| 341 | 344 | + navitem.centerItemGroups = [config barButtonItemGroupsFromItems:items]; |
| 342 | 345 | + } |
| 343 | 346 | + } |
| ... | ... | @@ -346,20 +349,27 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 346 | 349 | + { |
| 347 | 350 | + NSArray<UIBarButtonItem *> *leftBarButtonItems = [config barButtonItemsFromConfigs:config.headerLeftBarButtonItems |
| 348 | 351 | + withCurrentItems:subviewLeftItems |
| 349 | | + navigationItem:navitem]; |
| 352 | + navigationItem:navitem |
| 353 | + allowsSearchBarPlacement:NO]; |
| 350 | 354 | + NSArray<UIBarButtonItem *> *rightBarButtonItems = [config barButtonItemsFromConfigs:config.headerRightBarButtonItems |
| 351 | 355 | + withCurrentItems:subviewRightItems |
| 352 | | + navigationItem:navitem]; |
| 356 | + navigationItem:navitem |
| 357 | + allowsSearchBarPlacement:NO]; |
| 353 | 358 | + navitem.leftBarButtonItems = leftBarButtonItems; |
| 354 | 359 | + navitem.rightBarButtonItems = rightBarButtonItems; |
| 355 | 360 | + } |
| 356 | 361 | + NSDictionary<NSString *, id> *mailSearchToolbarConfig = nil; |
| 362 | + NSMutableArray<NSDictionary<NSString *, id> *> *nonMailSearchToolbarConfigs = [NSMutableArray array]; |
| 357 | 363 | + for (NSDictionary<NSString *, id> *toolbarConfig in config.headerToolbarItems) { |
| 358 | 364 | + if (toolbarConfig[@"mailSearchToolbar"]) { |
| 359 | | + mailSearchToolbarConfig = toolbarConfig; |
| 360 | | + break; |
| 365 | + if (mailSearchToolbarConfig == nil) { |
| 366 | + mailSearchToolbarConfig = toolbarConfig; |
| 367 | + } |
| 368 | + } else { |
| 369 | + [nonMailSearchToolbarConfigs addObject:toolbarConfig]; |
| 361 | 370 | + } |
| 362 | 371 | + } |
| 372 | + NSArray<NSDictionary<NSString *, id> *> *navigationToolbarConfigs = [nonMailSearchToolbarConfigs copy]; |
| 363 | 373 | + if (mailSearchToolbarConfig == nil) { |
| 364 | 374 | + for (NSDictionary<NSString *, id> *rightConfig in config.headerRightBarButtonItems) { |
| 365 | 375 | + if ([rightConfig[@"bottomMailSearchToolbar"] boolValue]) { |
| ... | ... | @@ -560,14 +570,6 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 560 | 570 | + searchField.attributedPlaceholder = |
| 561 | 571 | + [[NSAttributedString alloc] initWithString:placeholder attributes:placeholderAttributes]; |
| 562 | 572 | + } |
| 563 | | + NSString *searchTextChangeId = mailSearchToolbarConfig[@"searchTextChangeId"]; |
| 564 | | + if (searchTextChangeId != nil) { |
| 565 | | + [searchField addAction:[UIAction actionWithHandler:^(__kindof UIAction *_Nonnull action) { |
| 566 | | + UISearchTextField *field = (UISearchTextField *)action.sender; |
| 567 | | + emitButtonPress([NSString stringWithFormat:@"%@:%@", searchTextChangeId, field.text ?: @""]); |
| 568 | | + }] |
| 569 | | + forControlEvents:UIControlEventEditingChanged]; |
| 570 | | + } |
| 571 | 573 | + searchField.borderStyle = UITextBorderStyleNone; |
| 572 | 574 | + searchField.font = searchFont; |
| 573 | 575 | + searchField.adjustsFontForContentSizeCategory = YES; |
| ... | ... | @@ -584,6 +586,25 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 584 | 586 | + ]]; |
| 585 | 587 | + } |
| 586 | 588 | + |
| 589 | + NSString *searchTextChangeId = mailSearchToolbarConfig[@"searchTextChangeId"]; |
| 590 | + NSString *searchTextChangeActionIdentifier = @"org.react-native-screens.mail-search-toolbar.text-change"; |
| 591 | + if (resolvedSearchTextField != nil) { |
| 592 | + [resolvedSearchTextField removeActionForIdentifier:searchTextChangeActionIdentifier |
| 593 | + forControlEvents:UIControlEventEditingChanged]; |
| 594 | + } |
| 595 | + if (searchTextChangeId != nil && resolvedSearchTextField != nil) { |
| 596 | + [resolvedSearchTextField |
| 597 | + addAction:[UIAction actionWithTitle:@"" |
| 598 | + image:nil |
| 599 | + identifier:searchTextChangeActionIdentifier |
| 600 | + handler:^(__kindof UIAction *_Nonnull action) { |
| 601 | + UITextField *field = (UITextField *)action.sender; |
| 602 | + emitButtonPress( |
| 603 | + [NSString stringWithFormat:@"%@:%@", searchTextChangeId, field.text ?: @""]); |
| 604 | + }] |
| 605 | + forControlEvents:UIControlEventEditingChanged]; |
| 606 | + } |
| 607 | + |
| 587 | 608 | + UIButton *filterButton = nil; |
| 588 | 609 | + if (hasFilterButton) { |
| 589 | 610 | + filterButton = makeGlassButton( |
| ... | ... | @@ -720,11 +741,6 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 720 | 741 | +#endif |
| 721 | 742 | + } |
| 722 | 743 | + |
| 723 | | + NSArray<NSDictionary<NSString *, id> *> *navigationToolbarConfigs = config.headerToolbarItems; |
| 724 | | + if (mailSearchToolbarConfig != nil) { |
| 725 | | + navigationToolbarConfigs = @[]; |
| 726 | | + } |
| 727 | | + |
| 728 | 744 | + NSArray *toolbarConfigsKey = navigationToolbarConfigs ?: @[]; |
| 729 | 745 | + // Same reuse rule as the header item groups above (including the config |
| 730 | 746 | + // identity — cached toolbar items capture this config's event emitter). |
| ... | ... | @@ -738,7 +754,8 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 738 | 754 | + if (!reuseToolbarItems) { |
| 739 | 755 | + NSArray<UIBarButtonItem *> *toolbarItems = [config barButtonItemsFromConfigs:navigationToolbarConfigs |
| 740 | 756 | + withCurrentItems:@[] |
| 741 | | + navigationItem:navitem]; |
| 757 | + navigationItem:navitem |
| 758 | + allowsSearchBarPlacement:YES]; |
| 742 | 759 | + if (toolbarItems.count > 0) { |
| 743 | 760 | + vc.toolbarItems = toolbarItems; |
| 744 | 761 | + [navctr setToolbarHidden:NO animated:animated]; |
| ... | ... | @@ -752,15 +769,16 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 752 | 769 | |
| 753 | 770 | // Setting navigation bar visibility is split to mitigate iOS 26 bug with bar button items |
| 754 | 771 | // (setting nav bar visibility should be done after `navitem.*BarButtonItems`). |
| 755 | | @@ -784,6 +1272,7 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 772 | @@ -784,6 +1289,8 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 756 | 773 | |
| 757 | 774 | - (NSArray<UIBarButtonItem *> *)barButtonItemsFromConfigs:(NSArray<NSDictionary<NSString *, id> *> *)dicts |
| 758 | 775 | withCurrentItems:(NSArray<UIBarButtonItem *> *)currentItems |
| 759 | 776 | + navigationItem:(UINavigationItem *)navitem |
| 777 | + allowsSearchBarPlacement:(BOOL)allowsSearchBarPlacement |
| 760 | 778 | { |
| 761 | 779 | if (dicts.count == 0) { |
| 762 | 780 | return currentItems; |
| 763 | | @@ -792,7 +1281,197 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 781 | @@ -792,7 +1299,200 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 764 | 782 | [items addObjectsFromArray:currentItems]; |
| 765 | 783 | for (NSUInteger i = 0; i < dicts.count; i++) { |
| 766 | 784 | NSDictionary *dict = dicts[i]; |
| ... | ... | @@ -896,6 +914,9 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 896 | 914 | + } |
| 897 | 915 | +#endif |
| 898 | 916 | + } else if (dict[@"searchBarPlacement"]) { |
| 917 | + if (!allowsSearchBarPlacement) { |
| 918 | + continue; |
| 919 | + } |
| 899 | 920 | +#if RNS_IPHONE_OS_VERSION_AVAILABLE(26_0) |
| 900 | 921 | + if (@available(iOS 26.0, *)) { |
| 901 | 922 | + NSNumber *width = dict[@"width"]; |
| ... | ... | @@ -959,7 +980,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 959 | 980 | RNSBarButtonItem *item = [[RNSBarButtonItem alloc] initWithConfig:dict |
| 960 | 981 | action:^(NSString *buttonId) { |
| 961 | 982 | auto eventEmitter = std::static_pointer_cast<const facebook::react::RNSScreenStackHeaderConfigEventEmitter>( |
| 962 | | @@ -814,19 +1493,23 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 983 | @@ -814,19 +1514,23 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 963 | 984 | } |
| 964 | 985 | imageLoader:_imageLoader]; |
| 965 | 986 | NSNumber *index = dict[@"index"]; |
| ... | ... | @@ -989,7 +1010,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 989 | 1010 | [items insertObject:item atIndex:index.integerValue]; |
| 990 | 1011 | } else { |
| 991 | 1012 | [items addObject:item]; |
| 992 | | @@ -836,6 +1519,47 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 1013 | @@ -836,6 +1540,47 @@ - (void)applySemanticContentAttributeIfNeededToNavCtrl:(UINavigationController * |
| 993 | 1014 | return items; |
| 994 | 1015 | } |
| 995 | 1016 | |
| ... | ... | @@ -1037,7 +1058,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 1037 | 1058 | RNS_IGNORE_SUPER_CALL_BEGIN |
| 1038 | 1059 | - (void)insertReactSubview:(RNSScreenStackHeaderSubview *)subview atIndex:(NSInteger)atIndex |
| 1039 | 1060 | { |
| 1040 | | @@ -1023,6 +1747,8 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1061 | @@ -1023,6 +1768,8 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1041 | 1062 | } |
| 1042 | 1063 | |
| 1043 | 1064 | _title = RCTNSStringFromStringNilIfEmpty(newScreenProps.title); |
| ... | ... | @@ -1046,7 +1067,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 1046 | 1067 | if (newScreenProps.titleFontFamily != oldScreenProps.titleFontFamily) { |
| 1047 | 1068 | _titleFontFamily = RCTNSStringFromStringNilIfEmpty(newScreenProps.titleFontFamily); |
| 1048 | 1069 | } |
| 1049 | | @@ -1048,6 +1774,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1070 | @@ -1048,6 +1795,7 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1050 | 1071 | _disableBackButtonMenu = newScreenProps.disableBackButtonMenu; |
| 1051 | 1072 | _backButtonDisplayMode = |
| 1052 | 1073 | [RNSConvert UINavigationItemBackButtonDisplayModeFromCppEquivalent:newScreenProps.backButtonDisplayMode]; |
| ... | ... | @@ -1054,7 +1075,7 @@ index 1c844846a5c66e31cfa530ca462774d2fb6bbea1..d36bda28552e5ac75088e18d0fde338e |
| 1054 | 1075 | |
| 1055 | 1076 | if (newScreenProps.userInterfaceStyle != oldScreenProps.userInterfaceStyle) { |
| 1056 | 1077 | _userInterfaceStyle = [RNSConvert UIUserInterfaceStyleFromCppEquivalent:newScreenProps.userInterfaceStyle]; |
| 1057 | | @@ -1094,6 +1821,30 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1078 | @@ -1094,6 +1842,30 @@ - (void)updateProps:(react::Props::Shared const &)props oldProps:(react::Props:: |
| 1058 | 1079 | _headerRightBarButtonItems = array; |
| 1059 | 1080 | } |
| 1060 | 1081 | |
| ... | ... | @@ -1145,10 +1166,10 @@ index add33c4807e038dcd846f6c72b2fc472ded02809..9a7c7a8a775579c85de39f921e7a3622 |
| 1145 | 1166 | |
| 1146 | 1167 | // Needed because of this: https://github.com/facebook/react-native/pull/37274 |
| 1147 | 1168 | diff --git a/lib/commonjs/components/ScreenStackHeaderConfig.js b/lib/commonjs/components/ScreenStackHeaderConfig.js |
| 1148 | | index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32ba1aca64 100644 |
| 1169 | index 8c509f2657105cfd86448347c1a01fb73651ff9e..5e3b5185c0ea33c6b98f5daed69239d2c0d0ce90 100644 |
| 1149 | 1170 | --- a/lib/commonjs/components/ScreenStackHeaderConfig.js |
| 1150 | 1171 | +++ b/lib/commonjs/components/ScreenStackHeaderConfig.js |
| 1151 | | @@ -26,18 +26,42 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1172 | @@ -26,17 +26,42 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1152 | 1173 | } = (0, _EdgeInsetApplicationContext.useEdgeInsetApplication)(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false); |
| 1153 | 1174 | const { |
| 1154 | 1175 | headerLeftBarButtonItems, |
| ... | ... | @@ -1160,8 +1181,8 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1160 | 1181 | const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerLeftBarButtonItems, 'left') : undefined; |
| 1161 | 1182 | const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerRightBarButtonItems, 'right') : undefined; |
| 1162 | 1183 | - const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length); |
| 1163 | | + const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerCenterBarButtonItems, 'right') : undefined; |
| 1164 | | + const preparedHeaderToolbarItems = headerToolbarItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerToolbarItems, 'right') : undefined; |
| 1184 | + const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerCenterBarButtonItems, 'center') : undefined; |
| 1185 | + const preparedHeaderToolbarItems = headerToolbarItems && _utils.isHeaderBarButtonsAvailableForCurrentPlatform ? (0, _prepareHeaderBarButtonItems.prepareHeaderBarButtonItems)(headerToolbarItems, 'toolbar') : undefined; |
| 1165 | 1186 | + const hasHeaderBarButtonItems = _utils.isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length); |
| 1166 | 1187 | |
| 1167 | 1188 | // Handle bar button item presses |
| ... | ... | @@ -1172,7 +1193,8 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1172 | 1193 | + const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId); |
| 1173 | 1194 | if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) { |
| 1174 | 1195 | pressedItem.onPress(); |
| 1175 | | } |
| 1196 | + return; |
| 1197 | + } |
| 1176 | 1198 | + for (const item of allItems) { |
| 1177 | 1199 | + if (!item || item.type !== 'mailSearchToolbar') { |
| 1178 | 1200 | + continue; |
| ... | ... | @@ -1190,11 +1212,10 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1190 | 1212 | + item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length)); |
| 1191 | 1213 | + return; |
| 1192 | 1214 | + } |
| 1193 | | + } |
| 1215 | } |
| 1194 | 1216 | } : undefined; |
| 1195 | 1217 | |
| 1196 | | // Handle bar button menu item presses by deep-searching nested menus |
| 1197 | | @@ -59,7 +83,7 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1218 | @@ -59,7 +84,7 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1198 | 1219 | }; |
| 1199 | 1220 | |
| 1200 | 1221 | // Check each bar-button item with a menu |
| ... | ... | @@ -1203,7 +1224,7 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1203 | 1224 | for (const item of allItems) { |
| 1204 | 1225 | if (item && item.type === 'menu' && item.menu) { |
| 1205 | 1226 | const action = findInMenu(item.menu, event.nativeEvent.menuId); |
| 1206 | | @@ -67,6 +91,15 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1227 | @@ -67,6 +92,15 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1207 | 1228 | action.onPress(); |
| 1208 | 1229 | return; |
| 1209 | 1230 | } |
| ... | ... | @@ -1219,7 +1240,7 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1219 | 1240 | } |
| 1220 | 1241 | } |
| 1221 | 1242 | } : undefined; |
| 1222 | | @@ -74,6 +107,8 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1243 | @@ -74,6 +108,8 @@ const ScreenStackHeaderConfig = exports.ScreenStackHeaderConfig = /*#__PURE__*/_ |
| 1223 | 1244 | userInterfaceStyle: props.experimental_userInterfaceStyle, |
| 1224 | 1245 | headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems, |
| 1225 | 1246 | headerRightBarButtonItems: preparedHeaderRightBarButtonItems, |
| ... | ... | @@ -1229,20 +1250,49 @@ index 8c509f2657105cfd86448347c1a01fb73651ff9e..d1f53322a7d2401852732ce46bfc6f32 |
| 1229 | 1250 | onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem, |
| 1230 | 1251 | ref: ref, |
| 1231 | 1252 | diff --git a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js |
| 1232 | | index ab93f62e4a7049d63c6681cecbd6cf8b1d07ce10..b5ea122473b023f84eabdb1914aef09a28c6d525 100644 |
| 1253 | index ab93f62e4a7049d63c6681cecbd6cf8b1d07ce10..9dca2ab640e92161eb647b819a989acd0d41d9fe 100644 |
| 1233 | 1254 | --- a/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js |
| 1234 | 1255 | +++ b/lib/commonjs/components/helpers/prepareHeaderBarButtonItems.js |
| 1235 | | @@ -41,10 +41,31 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1256 | @@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", { |
| 1257 | }); |
| 1258 | exports.prepareHeaderBarButtonItems = void 0; |
| 1259 | var _reactNative = require("react-native"); |
| 1260 | -const prepareMenu = (menu, index, side, path = '') => { |
| 1261 | +const prepareMenu = (menu, index, placement, path = '') => { |
| 1262 | return { |
| 1263 | ...menu, |
| 1264 | items: menu.items.map((menuItem, menuIndex) => { |
| 1265 | @@ -26,7 +26,7 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1266 | xcassetName, |
| 1267 | imageSource, |
| 1268 | templateSource, |
| 1269 | - ...prepareMenu(menuItem, index, side, currentPath) |
| 1270 | + ...prepareMenu(menuItem, index, placement, currentPath) |
| 1271 | }; |
| 1272 | } |
| 1273 | return { |
| 1274 | @@ -35,16 +35,40 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1275 | xcassetName, |
| 1276 | imageSource, |
| 1277 | templateSource, |
| 1278 | - menuId: `${currentPath}-${index}-${side}` |
| 1279 | + menuId: `${currentPath}-${index}-${placement}` |
| 1280 | }; |
| 1281 | }) |
| 1236 | 1282 | }; |
| 1237 | 1283 | }; |
| 1238 | | const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1284 | -const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1239 | 1285 | - return barButtonItems?.map((item, index) => { |
| 1286 | +const prepareHeaderBarButtonItems = (barButtonItems, placement) => { |
| 1240 | 1287 | + const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined; |
| 1241 | 1288 | + return items?.map((item, index) => { |
| 1242 | 1289 | if (item.type === 'spacing') { |
| 1243 | 1290 | return item; |
| 1244 | 1291 | } |
| 1245 | 1292 | + if (item.type === 'searchBarPlacement') { |
| 1293 | + if (placement !== 'toolbar') { |
| 1294 | + return null; |
| 1295 | + } |
| 1246 | 1296 | + return { |
| 1247 | 1297 | + ...item, |
| 1248 | 1298 | + searchBarPlacement: true |
| ... | ... | @@ -1258,18 +1308,40 @@ index ab93f62e4a7049d63c6681cecbd6cf8b1d07ce10..b5ea122473b023f84eabdb1914aef09a |
| 1258 | 1308 | + return { |
| 1259 | 1309 | + ...item, |
| 1260 | 1310 | + mailSearchToolbar: true, |
| 1261 | | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, side, 'filter') : undefined, |
| 1262 | | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, side, 'compose') : undefined |
| 1311 | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined, |
| 1312 | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined |
| 1263 | 1313 | + }; |
| 1264 | 1314 | + } |
| 1265 | 1315 | let imageSource, templateSource; |
| 1266 | 1316 | if (item.icon?.type === 'imageSource') { |
| 1267 | 1317 | imageSource = _reactNative.Image.resolveAssetSource(item.icon.imageSource); |
| 1318 | @@ -77,17 +101,17 @@ const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1319 | if (item.type === 'button') { |
| 1320 | return { |
| 1321 | ...processedItem, |
| 1322 | - buttonId: `${index}-${side}` |
| 1323 | + buttonId: `${index}-${placement}` |
| 1324 | }; |
| 1325 | } |
| 1326 | if (item.type === 'menu') { |
| 1327 | return { |
| 1328 | ...processedItem, |
| 1329 | - menu: prepareMenu(item.menu, index, side) |
| 1330 | + menu: prepareMenu(item.menu, index, placement) |
| 1331 | }; |
| 1332 | } |
| 1333 | return null; |
| 1334 | - }); |
| 1335 | + }).filter(item => item !== null); |
| 1336 | }; |
| 1337 | exports.prepareHeaderBarButtonItems = prepareHeaderBarButtonItems; |
| 1338 | //# sourceMappingURL=prepareHeaderBarButtonItems.js.map |
| 1339 | \ No newline at end of file |
| 1268 | 1340 | diff --git a/lib/module/components/ScreenStackHeaderConfig.js b/lib/module/components/ScreenStackHeaderConfig.js |
| 1269 | | index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f2f4bca00 100644 |
| 1341 | index 68e3ba6a78314aba908d07098bb6982d11e6ee80..b787b3cf0284ffb81c80360a06c4059277bf4c1e 100644 |
| 1270 | 1342 | --- a/lib/module/components/ScreenStackHeaderConfig.js |
| 1271 | 1343 | +++ b/lib/module/components/ScreenStackHeaderConfig.js |
| 1272 | | @@ -22,18 +22,42 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1344 | @@ -22,17 +22,42 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1273 | 1345 | } = useEdgeInsetApplication(!props.hidden, props.disableTopInsetApplication ?? false, props.disableLeftInsetApplication ?? false, props.disableRightInsetApplication ?? false, props.disableBottomInsetApplication ?? false); |
| 1274 | 1346 | const { |
| 1275 | 1347 | headerLeftBarButtonItems, |
| ... | ... | @@ -1281,8 +1353,8 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1281 | 1353 | const preparedHeaderLeftBarButtonItems = headerLeftBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerLeftBarButtonItems, 'left') : undefined; |
| 1282 | 1354 | const preparedHeaderRightBarButtonItems = headerRightBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerRightBarButtonItems, 'right') : undefined; |
| 1283 | 1355 | - const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length); |
| 1284 | | + const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'right') : undefined; |
| 1285 | | + const preparedHeaderToolbarItems = headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerToolbarItems, 'right') : undefined; |
| 1356 | + const preparedHeaderCenterBarButtonItems = headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center') : undefined; |
| 1357 | + const preparedHeaderToolbarItems = headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar') : undefined; |
| 1286 | 1358 | + const hasHeaderBarButtonItems = isHeaderBarButtonsAvailableForCurrentPlatform && (preparedHeaderLeftBarButtonItems?.length || preparedHeaderRightBarButtonItems?.length || preparedHeaderCenterBarButtonItems?.length || preparedHeaderToolbarItems?.length); |
| 1287 | 1359 | |
| 1288 | 1360 | // Handle bar button item presses |
| ... | ... | @@ -1293,7 +1365,8 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1293 | 1365 | + const pressedItem = allItems.find(item => item && 'buttonId' in item && item.buttonId === buttonId); |
| 1294 | 1366 | if (pressedItem && pressedItem.type === 'button' && pressedItem.onPress) { |
| 1295 | 1367 | pressedItem.onPress(); |
| 1296 | | } |
| 1368 | + return; |
| 1369 | + } |
| 1297 | 1370 | + for (const item of allItems) { |
| 1298 | 1371 | + if (!item || item.type !== 'mailSearchToolbar') { |
| 1299 | 1372 | + continue; |
| ... | ... | @@ -1311,11 +1384,10 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1311 | 1384 | + item.onSearchTextChange?.(buttonId.slice(searchTextChangePrefix.length)); |
| 1312 | 1385 | + return; |
| 1313 | 1386 | + } |
| 1314 | | + } |
| 1387 | } |
| 1315 | 1388 | } : undefined; |
| 1316 | 1389 | |
| 1317 | | // Handle bar button menu item presses by deep-searching nested menus |
| 1318 | | @@ -55,7 +79,7 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1390 | @@ -55,7 +80,7 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1319 | 1391 | }; |
| 1320 | 1392 | |
| 1321 | 1393 | // Check each bar-button item with a menu |
| ... | ... | @@ -1324,7 +1396,7 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1324 | 1396 | for (const item of allItems) { |
| 1325 | 1397 | if (item && item.type === 'menu' && item.menu) { |
| 1326 | 1398 | const action = findInMenu(item.menu, event.nativeEvent.menuId); |
| 1327 | | @@ -63,6 +87,15 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1399 | @@ -63,6 +88,15 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1328 | 1400 | action.onPress(); |
| 1329 | 1401 | return; |
| 1330 | 1402 | } |
| ... | ... | @@ -1340,7 +1412,7 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1340 | 1412 | } |
| 1341 | 1413 | } |
| 1342 | 1414 | } : undefined; |
| 1343 | | @@ -70,6 +103,8 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1415 | @@ -70,6 +104,8 @@ export const ScreenStackHeaderConfig = /*#__PURE__*/React.forwardRef((props, ref |
| 1344 | 1416 | userInterfaceStyle: props.experimental_userInterfaceStyle, |
| 1345 | 1417 | headerLeftBarButtonItems: preparedHeaderLeftBarButtonItems, |
| 1346 | 1418 | headerRightBarButtonItems: preparedHeaderRightBarButtonItems, |
| ... | ... | @@ -1350,20 +1422,47 @@ index 68e3ba6a78314aba908d07098bb6982d11e6ee80..05cb8563d3a7d3811860058df23bbd1f |
| 1350 | 1422 | onPressHeaderBarButtonMenuItem: onPressHeaderBarButtonMenuItem, |
| 1351 | 1423 | ref: ref, |
| 1352 | 1424 | diff --git a/lib/module/components/helpers/prepareHeaderBarButtonItems.js b/lib/module/components/helpers/prepareHeaderBarButtonItems.js |
| 1353 | | index 8a70ffd78617147418d628c03c580bb7ff9a8a72..8dbd0ba2ee61ee54d44cdf286a720ce26af01f26 100644 |
| 1425 | index 8a70ffd78617147418d628c03c580bb7ff9a8a72..bca930372d2a7c3f8e0a35c3dcf28474f899f21c 100644 |
| 1354 | 1426 | --- a/lib/module/components/helpers/prepareHeaderBarButtonItems.js |
| 1355 | 1427 | +++ b/lib/module/components/helpers/prepareHeaderBarButtonItems.js |
| 1356 | | @@ -35,10 +35,31 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1428 | @@ -1,5 +1,5 @@ |
| 1429 | import { Image, processColor } from 'react-native'; |
| 1430 | -const prepareMenu = (menu, index, side, path = '') => { |
| 1431 | +const prepareMenu = (menu, index, placement, path = '') => { |
| 1432 | return { |
| 1433 | ...menu, |
| 1434 | items: menu.items.map((menuItem, menuIndex) => { |
| 1435 | @@ -20,7 +20,7 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1436 | xcassetName, |
| 1437 | imageSource, |
| 1438 | templateSource, |
| 1439 | - ...prepareMenu(menuItem, index, side, currentPath) |
| 1440 | + ...prepareMenu(menuItem, index, placement, currentPath) |
| 1441 | }; |
| 1442 | } |
| 1443 | return { |
| 1444 | @@ -29,16 +29,40 @@ const prepareMenu = (menu, index, side, path = '') => { |
| 1445 | xcassetName, |
| 1446 | imageSource, |
| 1447 | templateSource, |
| 1448 | - menuId: `${currentPath}-${index}-${side}` |
| 1449 | + menuId: `${currentPath}-${index}-${placement}` |
| 1450 | }; |
| 1451 | }) |
| 1357 | 1452 | }; |
| 1358 | 1453 | }; |
| 1359 | | export const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1454 | -export const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1360 | 1455 | - return barButtonItems?.map((item, index) => { |
| 1456 | +export const prepareHeaderBarButtonItems = (barButtonItems, placement) => { |
| 1361 | 1457 | + const items = Array.isArray(barButtonItems) ? barButtonItems : barButtonItems && typeof barButtonItems === 'object' && 'type' in barButtonItems ? [barButtonItems] : undefined; |
| 1362 | 1458 | + return items?.map((item, index) => { |
| 1363 | 1459 | if (item.type === 'spacing') { |
| 1364 | 1460 | return item; |
| 1365 | 1461 | } |
| 1366 | 1462 | + if (item.type === 'searchBarPlacement') { |
| 1463 | + if (placement !== 'toolbar') { |
| 1464 | + return null; |
| 1465 | + } |
| 1367 | 1466 | + return { |
| 1368 | 1467 | + ...item, |
| 1369 | 1468 | + searchBarPlacement: true |
| ... | ... | @@ -1379,13 +1478,53 @@ index 8a70ffd78617147418d628c03c580bb7ff9a8a72..8dbd0ba2ee61ee54d44cdf286a720ce2 |
| 1379 | 1478 | + return { |
| 1380 | 1479 | + ...item, |
| 1381 | 1480 | + mailSearchToolbar: true, |
| 1382 | | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, side, 'filter') : undefined, |
| 1383 | | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, side, 'compose') : undefined |
| 1481 | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined, |
| 1482 | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined |
| 1384 | 1483 | + }; |
| 1385 | 1484 | + } |
| 1386 | 1485 | let imageSource, templateSource; |
| 1387 | 1486 | if (item.icon?.type === 'imageSource') { |
| 1388 | 1487 | imageSource = Image.resolveAssetSource(item.icon.imageSource); |
| 1488 | @@ -71,16 +95,16 @@ export const prepareHeaderBarButtonItems = (barButtonItems, side) => { |
| 1489 | if (item.type === 'button') { |
| 1490 | return { |
| 1491 | ...processedItem, |
| 1492 | - buttonId: `${index}-${side}` |
| 1493 | + buttonId: `${index}-${placement}` |
| 1494 | }; |
| 1495 | } |
| 1496 | if (item.type === 'menu') { |
| 1497 | return { |
| 1498 | ...processedItem, |
| 1499 | - menu: prepareMenu(item.menu, index, side) |
| 1500 | + menu: prepareMenu(item.menu, index, placement) |
| 1501 | }; |
| 1502 | } |
| 1503 | return null; |
| 1504 | - }); |
| 1505 | + }).filter(item => item !== null); |
| 1506 | }; |
| 1507 | //# sourceMappingURL=prepareHeaderBarButtonItems.js.map |
| 1508 | \ No newline at end of file |
| 1509 | diff --git a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts |
| 1510 | index c41ef943e554754f599f2fcd157dd0dc61d78b7e..ed02d44f78ee3f1387ba93bf292be2b99bb0e3b3 100644 |
| 1511 | --- a/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts |
| 1512 | +++ b/lib/typescript/components/helpers/prepareHeaderBarButtonItems.d.ts |
| 1513 | @@ -1,5 +1,5 @@ |
| 1514 | import { HeaderBarButtonItem } from 'react-native-screens/types'; |
| 1515 | -export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right") => (import("react-native-screens/types").HeaderBarButtonItemSpacing | { |
| 1516 | +export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButtonItem[], side: "left" | "right" | "center" | "toolbar") => (import("react-native-screens/types").HeaderBarButtonItemSpacing | { |
| 1517 | buttonId: string; |
| 1518 | imageSource: import("react-native").ImageResolvedAssetSource | undefined; |
| 1519 | templateSource: import("react-native").ImageResolvedAssetSource | undefined; |
| 1520 | @@ -161,5 +161,5 @@ export declare const prepareHeaderBarButtonItems: (barButtonItems: HeaderBarButt |
| 1521 | identifier?: string | undefined; |
| 1522 | accessibilityLabel?: string | undefined; |
| 1523 | accessibilityHint?: string | undefined; |
| 1524 | -} | null)[]; |
| 1525 | +})[]; |
| 1526 | //# sourceMappingURL=prepareHeaderBarButtonItems.d.ts.map |
| 1527 | \ No newline at end of file |
| 1389 | 1528 | diff --git a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts |
| 1390 | 1529 | index a51d8648567cff29cd2be0d5262bd15c6fc69c61..8b7439aff4d7e6fe8a72bf0bac93c3c19568b1a6 100644 |
| 1391 | 1530 | --- a/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts |
| ... | ... | @@ -1423,7 +1562,7 @@ index a51d8648567cff29cd2be0d5262bd15c6fc69c61..8b7439aff4d7e6fe8a72bf0bac93c3c1 |
| 1423 | 1562 | onPressHeaderBarButtonMenuItem?: CT.DirectEventHandler<OnPressHeaderBarButtonMenuItemEvent> | undefined; |
| 1424 | 1563 | synchronousShadowStateUpdatesEnabled?: CT.WithDefault<boolean, true>; |
| 1425 | 1564 | diff --git a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts |
| 1426 | | index 1ca926e6753294861f5f79ab6267dc7999f70639..15929959d1e274cc6abd55f2eb8db50ba102169a 100644 |
| 1565 | index 1ca926e6753294861f5f79ab6267dc7999f70639..94e676fdb08ff9d1cf81a1cf06a45e931b5461f1 100644 |
| 1427 | 1566 | --- a/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts |
| 1428 | 1567 | +++ b/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts |
| 1429 | 1568 | @@ -3,6 +3,7 @@ export type HeaderSubviewTypes = 'back' | 'right' | 'left' | 'title' | 'center' |
| ... | ... | @@ -1576,7 +1715,7 @@ index 10a31341f4eff258a7f8ea6abae3eddf0dd21218..bab5031f5f9b246f15e5396f3f2fee90 |
| 1576 | 1715 | * Custom Screen Transition |
| 1577 | 1716 | */ |
| 1578 | 1717 | diff --git a/src/components/ScreenStackHeaderConfig.tsx b/src/components/ScreenStackHeaderConfig.tsx |
| 1579 | | index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc0004ef29 100644 |
| 1718 | index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9e8173da567933fd3f6819fb26bf4a0e87640767 100644 |
| 1580 | 1719 | --- a/src/components/ScreenStackHeaderConfig.tsx |
| 1581 | 1720 | +++ b/src/components/ScreenStackHeaderConfig.tsx |
| 1582 | 1721 | @@ -48,7 +48,12 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| ... | ... | @@ -1599,11 +1738,11 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1599 | 1738 | : undefined; |
| 1600 | 1739 | + const preparedHeaderCenterBarButtonItems = |
| 1601 | 1740 | + headerCenterBarButtonItems && isHeaderBarButtonsAvailableForCurrentPlatform |
| 1602 | | + ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'right') |
| 1741 | + ? prepareHeaderBarButtonItems(headerCenterBarButtonItems, 'center') |
| 1603 | 1742 | + : undefined; |
| 1604 | 1743 | + const preparedHeaderToolbarItems = |
| 1605 | 1744 | + headerToolbarItems && isHeaderBarButtonsAvailableForCurrentPlatform |
| 1606 | | + ? prepareHeaderBarButtonItems(headerToolbarItems, 'right') |
| 1745 | + ? prepareHeaderBarButtonItems(headerToolbarItems, 'toolbar') |
| 1607 | 1746 | + : undefined; |
| 1608 | 1747 | const hasHeaderBarButtonItems = |
| 1609 | 1748 | isHeaderBarButtonsAvailableForCurrentPlatform && |
| ... | ... | @@ -1634,10 +1773,12 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1634 | 1773 | ); |
| 1635 | 1774 | if ( |
| 1636 | 1775 | pressedItem && |
| 1637 | | @@ -82,6 +101,31 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1776 | @@ -81,6 +100,32 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1777 | pressedItem.onPress |
| 1638 | 1778 | ) { |
| 1639 | 1779 | pressedItem.onPress(); |
| 1640 | | } |
| 1780 | + return; |
| 1781 | + } |
| 1641 | 1782 | + for (const item of allItems) { |
| 1642 | 1783 | + if (!item || item.type !== 'mailSearchToolbar') { |
| 1643 | 1784 | + continue; |
| ... | ... | @@ -1662,11 +1803,10 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1662 | 1803 | + ); |
| 1663 | 1804 | + return; |
| 1664 | 1805 | + } |
| 1665 | | + } |
| 1806 | } |
| 1666 | 1807 | } |
| 1667 | 1808 | : undefined; |
| 1668 | | |
| 1669 | | @@ -111,6 +155,8 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1809 | @@ -111,6 +156,8 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1670 | 1810 | const allItems = [ |
| 1671 | 1811 | ...(preparedHeaderLeftBarButtonItems ?? []), |
| 1672 | 1812 | ...(preparedHeaderRightBarButtonItems ?? []), |
| ... | ... | @@ -1675,7 +1815,7 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1675 | 1815 | ]; |
| 1676 | 1816 | for (const item of allItems) { |
| 1677 | 1817 | if (item && item.type === 'menu' && item.menu) { |
| 1678 | | @@ -119,6 +165,17 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1818 | @@ -119,6 +166,17 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1679 | 1819 | action.onPress(); |
| 1680 | 1820 | return; |
| 1681 | 1821 | } |
| ... | ... | @@ -1693,7 +1833,7 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1693 | 1833 | } |
| 1694 | 1834 | } |
| 1695 | 1835 | } |
| 1696 | | @@ -130,6 +187,8 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1836 | @@ -130,6 +188,8 @@ export const ScreenStackHeaderConfig = React.forwardRef< |
| 1697 | 1837 | userInterfaceStyle={props.experimental_userInterfaceStyle} |
| 1698 | 1838 | headerLeftBarButtonItems={preparedHeaderLeftBarButtonItems} |
| 1699 | 1839 | headerRightBarButtonItems={preparedHeaderRightBarButtonItems} |
| ... | ... | @@ -1703,20 +1843,47 @@ index c3a88b6f6c8362cf717372a35cdc35a6b397bdd0..9da8553b2c2e81fa13ef4f5b3e805efc |
| 1703 | 1843 | onPressHeaderBarButtonMenuItem={onPressHeaderBarButtonMenuItem} |
| 1704 | 1844 | ref={ref} |
| 1705 | 1845 | diff --git a/src/components/helpers/prepareHeaderBarButtonItems.ts b/src/components/helpers/prepareHeaderBarButtonItems.ts |
| 1706 | | index be2c24dfee77f5883b5ab1d7473be80933b5dc6f..0b038d2005b2d51bbb2ab1d7dba7eaccda83d42f 100644 |
| 1846 | index be2c24dfee77f5883b5ab1d7473be80933b5dc6f..2008a342f13806641909c19a9f4ab6829f239016 100644 |
| 1707 | 1847 | --- a/src/components/helpers/prepareHeaderBarButtonItems.ts |
| 1708 | 1848 | +++ b/src/components/helpers/prepareHeaderBarButtonItems.ts |
| 1709 | | @@ -50,13 +50,43 @@ const prepareMenu = ( |
| 1849 | @@ -7,7 +7,7 @@ import { |
| 1850 | const prepareMenu = ( |
| 1851 | menu: HeaderBarButtonItemWithMenu['menu'], |
| 1852 | index: number, |
| 1853 | - side: 'left' | 'right', |
| 1854 | + placement: 'left' | 'right' | 'center' | 'toolbar', |
| 1855 | path: string = '', |
| 1856 | ): HeaderBarButtonItemWithMenu['menu'] => { |
| 1857 | return { |
| 1858 | @@ -34,7 +34,7 @@ const prepareMenu = ( |
| 1859 | xcassetName, |
| 1860 | imageSource, |
| 1861 | templateSource, |
| 1862 | - ...prepareMenu(menuItem, index, side, currentPath), |
| 1863 | + ...prepareMenu(menuItem, index, placement, currentPath), |
| 1864 | }; |
| 1865 | } |
| 1866 | return { |
| 1867 | @@ -43,20 +43,53 @@ const prepareMenu = ( |
| 1868 | xcassetName, |
| 1869 | imageSource, |
| 1870 | templateSource, |
| 1871 | - menuId: `${currentPath}-${index}-${side}`, |
| 1872 | + menuId: `${currentPath}-${index}-${placement}`, |
| 1873 | }; |
| 1874 | }), |
| 1875 | }; |
| 1710 | 1876 | }; |
| 1711 | 1877 | |
| 1712 | 1878 | export const prepareHeaderBarButtonItems = ( |
| 1713 | 1879 | - barButtonItems: HeaderBarButtonItem[], |
| 1880 | - side: 'left' | 'right', |
| 1714 | 1881 | + barButtonItems: |
| 1715 | 1882 | + | HeaderBarButtonItem[] |
| 1716 | 1883 | + | HeaderBarButtonItem |
| 1717 | 1884 | + | null |
| 1718 | 1885 | + | undefined, |
| 1719 | | side: 'left' | 'right', |
| 1886 | + placement: 'left' | 'right' | 'center' | 'toolbar', |
| 1720 | 1887 | ) => { |
| 1721 | 1888 | - return barButtonItems?.map((item, index) => { |
| 1722 | 1889 | + const items = Array.isArray(barButtonItems) |
| ... | ... | @@ -1730,6 +1897,9 @@ index be2c24dfee77f5883b5ab1d7473be80933b5dc6f..0b038d2005b2d51bbb2ab1d7dba7eacc |
| 1730 | 1897 | return item; |
| 1731 | 1898 | } |
| 1732 | 1899 | + if (item.type === 'searchBarPlacement') { |
| 1900 | + if (placement !== 'toolbar') { |
| 1901 | + return null; |
| 1902 | + } |
| 1733 | 1903 | + return { |
| 1734 | 1904 | + ...item, |
| 1735 | 1905 | + searchBarPlacement: true, |
| ... | ... | @@ -1745,13 +1915,32 @@ index be2c24dfee77f5883b5ab1d7473be80933b5dc6f..0b038d2005b2d51bbb2ab1d7dba7eacc |
| 1745 | 1915 | + return { |
| 1746 | 1916 | + ...item, |
| 1747 | 1917 | + mailSearchToolbar: true, |
| 1748 | | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, side, 'filter') : undefined, |
| 1749 | | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, side, 'compose') : undefined, |
| 1918 | + filterMenu: item.filterMenu ? prepareMenu(item.filterMenu, index, placement, 'filter') : undefined, |
| 1919 | + composeMenu: item.composeMenu ? prepareMenu(item.composeMenu, index, placement, 'compose') : undefined, |
| 1750 | 1920 | + }; |
| 1751 | 1921 | + } |
| 1752 | 1922 | let imageSource, templateSource; |
| 1753 | 1923 | if (item.icon?.type === 'imageSource') { |
| 1754 | 1924 | imageSource = Image.resolveAssetSource(item.icon.imageSource); |
| 1925 | @@ -91,15 +124,15 @@ export const prepareHeaderBarButtonItems = ( |
| 1926 | if (item.type === 'button') { |
| 1927 | return { |
| 1928 | ...processedItem, |
| 1929 | - buttonId: `${index}-${side}`, |
| 1930 | + buttonId: `${index}-${placement}`, |
| 1931 | }; |
| 1932 | } |
| 1933 | if (item.type === 'menu') { |
| 1934 | return { |
| 1935 | ...processedItem, |
| 1936 | - menu: prepareMenu(item.menu, index, side), |
| 1937 | + menu: prepareMenu(item.menu, index, placement), |
| 1938 | }; |
| 1939 | } |
| 1940 | return null; |
| 1941 | - }); |
| 1942 | + }).filter(item => item !== null); |
| 1943 | }; |
| 1755 | 1944 | diff --git a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts b/src/fabric/ScreenStackHeaderConfigNativeComponent.ts |
| 1756 | 1945 | index a80d9fef0c0ab5ce8221c5e0c7fae65162bc6164..fc16f51425702a418c09de553a54753331f19d15 100644 |
| 1757 | 1946 | --- a/src/fabric/ScreenStackHeaderConfigNativeComponent.ts |