Skip to content

Commit

Permalink
Fix style update with emojis on iOS (#318)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomekzaw authored May 21, 2024
1 parent 4cbff0f commit 268c33f
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 16 deletions.
21 changes: 12 additions & 9 deletions ios/MarkdownTextInputDecoratorView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ @implementation MarkdownTextInputDecoratorView {
#else
__weak RCTBaseTextInputView *_textInput;
#endif /* RCT_NEW_ARCH_ENABLED */
__weak UIView<RCTBackedTextInputViewProtocol> *_backedTextInputView;
__weak RCTBackedTextFieldDelegateAdapter *_adapter;
__weak RCTUITextView *_textView;
}
Expand Down Expand Up @@ -51,24 +52,24 @@ - (void)didMoveToWindow {
#ifdef RCT_NEW_ARCH_ENABLED
react_native_assert([view isKindOfClass:[RCTTextInputComponentView class]] && "Previous sibling component is not an instance of RCTTextInputComponentView.");
_textInput = (RCTTextInputComponentView *)view;
UIView<RCTBackedTextInputViewProtocol> *backedTextInputView = [_textInput valueForKey:@"_backedTextInputView"];
_backedTextInputView = [_textInput valueForKey:@"_backedTextInputView"];
#else
react_native_assert([view isKindOfClass:[RCTBaseTextInputView class]] && "Previous sibling component is not an instance of RCTBaseTextInputView.");
_textInput = (RCTBaseTextInputView *)view;
UIView<RCTBackedTextInputViewProtocol> *backedTextInputView = _textInput.backedTextInputView;
_backedTextInputView = _textInput.backedTextInputView;
#endif /* RCT_NEW_ARCH_ENABLED */

_markdownUtils = [[RCTMarkdownUtils alloc] init];
react_native_assert(_markdownStyle != nil);
[_markdownUtils setMarkdownStyle:_markdownStyle];

[_textInput setMarkdownUtils:_markdownUtils];
if ([backedTextInputView isKindOfClass:[RCTUITextField class]]) {
RCTUITextField *textField = (RCTUITextField *)backedTextInputView;
if ([_backedTextInputView isKindOfClass:[RCTUITextField class]]) {
RCTUITextField *textField = (RCTUITextField *)_backedTextInputView;
_adapter = [textField valueForKey:@"textInputDelegateAdapter"];
[_adapter setMarkdownUtils:_markdownUtils];
} else if ([backedTextInputView isKindOfClass:[RCTUITextView class]]) {
_textView = (RCTUITextView *)backedTextInputView;
} else if ([_backedTextInputView isKindOfClass:[RCTUITextView class]]) {
_textView = (RCTUITextView *)_backedTextInputView;
[_textView setMarkdownUtils:_markdownUtils];
NSLayoutManager *layoutManager = _textView.layoutManager; // switching to TextKit 1 compatibility mode
layoutManager.allowsNonContiguousLayout = NO; // workaround for onScroll issue
Expand Down Expand Up @@ -100,11 +101,13 @@ - (void)setMarkdownStyle:(RCTMarkdownStyle *)markdownStyle
{
_markdownStyle = markdownStyle;
[_markdownUtils setMarkdownStyle:markdownStyle];

// apply new styles
#ifdef RCT_NEW_ARCH_ENABLED
[_textInput textInputDidChange]; // apply new styles
[_textInput _setAttributedString:_backedTextInputView.attributedText];
#else
[_textInput setAttributedText:_textInput.attributedText]; // apply new styles
#endif
[_textInput setAttributedText:_textInput.attributedText];
#endif /* RCT_NEW_ARCH_ENABLED */
}

@end
2 changes: 2 additions & 0 deletions ios/RCTBaseTextInputView+Markdown.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ NS_ASSUME_NONNULL_BEGIN

- (void)markdown_setAttributedText:(NSAttributedString *)attributedText;

- (BOOL)markdown_textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldText;

- (void)markdown_updateLocalData;

@end
Expand Down
19 changes: 19 additions & 0 deletions ios/RCTBaseTextInputView+Markdown.mm
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,16 @@ - (void)markdown_setAttributedText:(NSAttributedString *)attributedText
[self markdown_setAttributedText:attributedText];
}

- (BOOL)markdown_textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldText
{
RCTMarkdownUtils *markdownUtils = [self getMarkdownUtils];
if (markdownUtils != nil) {
return [newText isEqualToAttributedString:oldText];
}

return [self markdown_textOf:newText equals:oldText];
}

- (void)markdown_updateLocalData
{
RCTMarkdownUtils *markdownUtils = [self getMarkdownUtils];
Expand Down Expand Up @@ -69,6 +79,15 @@ + (void)load
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}

{
// swizzle textOf
SEL originalSelector = @selector(textOf:equals:);

Check warning on line 85 in ios/RCTBaseTextInputView+Markdown.mm

View workflow job for this annotation

GitHub Actions / build (Paper)

undeclared selector 'textOf:equals:' [-Wundeclared-selector]
SEL swizzledSelector = @selector(markdown_textOf:equals:);
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}

Expand Down
4 changes: 3 additions & 1 deletion ios/RCTTextInputComponentView+Markdown.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ NS_ASSUME_NONNULL_BEGIN

- (void)markdown__setAttributedString:(NSAttributedString *)attributedString;

- (void)textInputDidChange;
- (BOOL)markdown__textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldText;

- (void)_setAttributedString:(NSAttributedString *)attributedString;

@end

Expand Down
35 changes: 29 additions & 6 deletions ios/RCTTextInputComponentView+Markdown.mm
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,39 @@ - (void)markdown__setAttributedString:(NSAttributedString *)attributedString
[self markdown__setAttributedString:attributedString];
}

- (BOOL)markdown__textOf:(NSAttributedString *)newText equals:(NSAttributedString *)oldText
{
RCTMarkdownUtils *markdownUtils = [self getMarkdownUtils];
if (markdownUtils != nil) {
return [newText isEqualToAttributedString:oldText];
}

return [self markdown__textOf:newText equals:oldText];
}

+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class cls = [self class];
SEL originalSelector = @selector(_setAttributedString:);
SEL swizzledSelector = @selector(markdown__setAttributedString:);
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
{
// swizzle _setAttributedString
Class cls = [self class];
SEL originalSelector = @selector(_setAttributedString:);
SEL swizzledSelector = @selector(markdown__setAttributedString:);
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}

{
// swizzle _textOf
Class cls = [self class];
SEL originalSelector = @selector(_textOf:equals:);
SEL swizzledSelector = @selector(markdown__textOf:equals:);
Method originalMethod = class_getInstanceMethod(cls, originalSelector);
Method swizzledMethod = class_getInstanceMethod(cls, swizzledSelector);
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}

Expand Down

0 comments on commit 268c33f

Please sign in to comment.