include $(THEOS_MAKE_PATH)/tweak.mk | include $(THEOS_MAKE_PATH)/tweak.mk | ||||
SUBPROJECTS += prefs | |||||
include $(THEOS_MAKE_PATH)/aggregate.mk | |||||
after-install:: | after-install:: | ||||
install.exec "killall -9 Reddit" | install.exec "killall -9 Reddit" | ||||
install.exec "killall -9 Apollo" | install.exec "killall -9 Apollo" | ||||
install.exec "killall -9 narwhal" | |||||
install.exec "killall -9 narwhal" |
Package: com.lint.undelete | Package: com.lint.undelete | ||||
Name: TFDidThatSay? | Name: TFDidThatSay? | ||||
Depends: mobilesubstrate | Depends: mobilesubstrate | ||||
Version: 1.2.2 | |||||
Version: 1.2.3 | |||||
Architecture: iphoneos-arm | Architecture: iphoneos-arm | ||||
Description: See "[deleted]" comments and posts without leaving Reddit! | Description: See "[deleted]" comments and posts without leaving Reddit! | ||||
Maintainer: lint <apieceoflint@protonmail.com> | Maintainer: lint <apieceoflint@protonmail.com> |
include $(THEOS)/makefiles/common.mk | |||||
ARCHS = arm64 arm64e | |||||
BUNDLE_NAME = TFDidThatSayPrefs | |||||
TFDidThatSayPrefs_FILES = TFDTSRootListController.m | |||||
TFDidThatSayPrefs_INSTALL_PATH = /Library/PreferenceBundles | |||||
TFDidThatSayPrefs_FRAMEWORKS = UIKit | |||||
TFDidThatSayPrefs_PRIVATE_FRAMEWORKS = Preferences | |||||
TFDidThatSayPrefs_CFLAGS = -fobjc-arc | |||||
include $(THEOS_MAKE_PATH)/bundle.mk | |||||
internal-stage:: | |||||
$(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences$(ECHO_END) | |||||
$(ECHO_NOTHING)cp entry.plist $(THEOS_STAGING_DIR)/Library/PreferenceLoader/Preferences/TFDidThatSayPrefs.plist$(ECHO_END) |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>CFBundleDevelopmentRegion</key> | |||||
<string>English</string> | |||||
<key>CFBundleExecutable</key> | |||||
<string>TFDidThatSayPrefs</string> | |||||
<key>CFBundleIdentifier</key> | |||||
<string>com.lint.undelete.prefs</string> | |||||
<key>CFBundleInfoDictionaryVersion</key> | |||||
<string>6.0</string> | |||||
<key>CFBundlePackageType</key> | |||||
<string>BNDL</string> | |||||
<key>CFBundleShortVersionString</key> | |||||
<string>1.0.0</string> | |||||
<key>CFBundleSignature</key> | |||||
<string>????</string> | |||||
<key>CFBundleVersion</key> | |||||
<string>1.0</string> | |||||
<key>NSPrincipalClass</key> | |||||
<string>TFDTSRootListController</string> | |||||
</dict> | |||||
</plist> |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>items</key> | |||||
<array> | |||||
<dict> | |||||
<key>cell</key> | |||||
<string>PSGroupCell</string> | |||||
<key>label</key> | |||||
<string>Apollo </string> | |||||
</dict> | |||||
<dict> | |||||
<key>cell</key> | |||||
<string>PSSwitchCell</string> | |||||
<key>default</key> | |||||
<true/> | |||||
<key>defaults</key> | |||||
<string>com.lint.undelete.prefs</string> | |||||
<key>key</key> | |||||
<string>isApolloDeletedCommentsOnly</string> | |||||
<key>label</key> | |||||
<string>Only display eye on deleted comments</string> | |||||
</dict> | |||||
</array> | |||||
<key>title</key> | |||||
<string>TFDidThatSay?</string> | |||||
</dict> | |||||
</plist> |
#import <Preferences/PSListController.h> | |||||
@interface TFDTSRootListController : PSListController | |||||
@end |
#include "TFDTSRootListController.h" | |||||
@implementation TFDTSRootListController | |||||
- (NSArray *)specifiers { | |||||
if (!_specifiers) { | |||||
_specifiers = [self loadSpecifiersFromPlistName:@"Root" target:self]; | |||||
} | |||||
return _specifiers; | |||||
} | |||||
@end |
<?xml version="1.0" encoding="UTF-8"?> | |||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
<plist version="1.0"> | |||||
<dict> | |||||
<key>entry</key> | |||||
<dict> | |||||
<key>bundle</key> | |||||
<string>TFDidThatSayPrefs</string> | |||||
<key>cell</key> | |||||
<string>PSLinkCell</string> | |||||
<key>detail</key> | |||||
<string>TFDTSRootListController</string> | |||||
<key>icon</key> | |||||
<string>icon.png</string> | |||||
<key>isController</key> | |||||
<true/> | |||||
<key>label</key> | |||||
<string>TFDidThatSay?</string> | |||||
</dict> | |||||
</dict> | |||||
</plist> |
-(void) calculatedLayoutDidChange; | -(void) calculatedLayoutDidChange; | ||||
//custom element | //custom element | ||||
@property(assign,nonatomic) id undeleteButton; | |||||
@property(strong,nonatomic) id undeleteButton; | |||||
@end | @end | ||||
/* -- Post Interfaces -- */ | /* -- Post Interfaces -- */ | ||||
@end | @end | ||||
@interface ApolloCommentsHeaderCellNode | @interface ApolloCommentsHeaderCellNode | ||||
@property(assign, nonatomic) id undeleteButton; | |||||
@property(strong, nonatomic) id undeleteButton; | |||||
@end | @end | ||||
/* -- Other Interfaces -- */ | /* -- Other Interfaces -- */ |
%group Apollo | %group Apollo | ||||
%hook ApolloApolloButtonNode | |||||
%end | |||||
const NSDictionary* settings = [[NSDictionary alloc] initWithContentsOfFile:@"/var/mobile/Library/Preferences/com.lint.undelete.prefs.plist"]; | |||||
NSDictionary* apolloBodyAttributes = nil; | NSDictionary* apolloBodyAttributes = nil; | ||||
%hook ApolloApolloButtonNode | |||||
%end | |||||
%hook RKComment | %hook RKComment | ||||
-(BOOL) isDeleted{ | -(BOOL) isDeleted{ | ||||
return NO; | return NO; | ||||
} | } | ||||
-(BOOL) isModeratorRemoved{ | |||||
return NO; | |||||
} | |||||
%end | %end | ||||
%hook ApolloCommentCellNode | %hook ApolloCommentCellNode | ||||
%property(assign,nonatomic) id undeleteButton; | |||||
%property(strong,nonatomic) id undeleteButton; | |||||
%new | %new | ||||
-(void) didTapUndeleteButton{ | |||||
-(void) didTapUndeleteButton:(id) sender{ | |||||
[sender setEnabled:NO]; | |||||
id bodyNode = MSHookIvar<id>(self, "bodyNode"); | id bodyNode = MSHookIvar<id>(self, "bodyNode"); | ||||
id authorNode = MSHookIvar<id>(self, "authorNode"); | id authorNode = MSHookIvar<id>(self, "authorNode"); | ||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; | [bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; | ||||
[sender setEnabled:YES]; | |||||
}]; | }]; | ||||
} | } | ||||
-(void) didLoad { | -(void) didLoad { | ||||
%orig; | %orig; | ||||
CGFloat imageSize = 20.0f; | |||||
UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | |||||
[undeleteButton addTarget:self action:@selector(didTapUndeleteButton) forControlEvents:UIControlEventTouchUpInside]; | |||||
undeleteButton.frame = CGRectMake(0, 0, imageSize, imageSize); | |||||
id commentBody = [MSHookIvar<id>(self, "comment") body]; | |||||
id isDeletedOnly = [settings valueForKey:@"isApolloDeletedCommentsOnly"]; | |||||
if (([isDeletedOnly isEqual:@1] && ([commentBody isEqualToString:@"[deleted]"] || [commentBody isEqualToString:@"[removed]"])) || [isDeletedOnly isEqual:@0] ) { | |||||
UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | |||||
[undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | |||||
CGFloat imageSize = 20.0f; | |||||
[[self view] addSubview:undeleteButton]; | |||||
[self setUndeleteButton:undeleteButton]; | |||||
UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | |||||
[undeleteButton addTarget:self action:@selector(didTapUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; | |||||
undeleteButton.frame = CGRectMake(0, 0, imageSize, imageSize); | |||||
UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | |||||
[undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | |||||
[[self view] addSubview:undeleteButton]; | |||||
[self setUndeleteButton:undeleteButton]; | |||||
} | |||||
} | } | ||||
-(void) _layoutSublayouts{ | -(void) _layoutSublayouts{ | ||||
%orig; | %orig; | ||||
CGFloat imageSize = 20.0f; | |||||
if ([self undeleteButton]){ | |||||
CGFloat imageSize = 20.0f; | |||||
id moreNode = MSHookIvar<id>(self, "moreOptionsNode"); | |||||
id ageNode = MSHookIvar<id>(self, "ageNode"); | |||||
id moreNode = MSHookIvar<id>(self, "moreOptionsNode"); | |||||
id ageNode = MSHookIvar<id>(self, "ageNode"); | |||||
CGRect nodeFrame = [moreNode frame]; | |||||
CGFloat centerHeight = (nodeFrame.size.height + nodeFrame.origin.y * 2) / 2.0f; | |||||
CGFloat nodeSpacing =[ageNode frame].origin.x - nodeFrame.origin.x - nodeFrame.size.width; | |||||
CGRect nodeFrame = [moreNode frame]; | |||||
CGFloat centerHeight = (nodeFrame.size.height + nodeFrame.origin.y * 2) / 2.0f; | |||||
CGFloat nodeSpacing =[ageNode frame].origin.x - nodeFrame.origin.x - nodeFrame.size.width; | |||||
[[self undeleteButton] setFrame:CGRectMake(nodeFrame.origin.x - imageSize - nodeSpacing, centerHeight - (imageSize / 2), imageSize, imageSize)]; | |||||
[[self undeleteButton] setFrame:CGRectMake(nodeFrame.origin.x - imageSize - nodeSpacing, centerHeight - (imageSize / 2), imageSize, imageSize)]; | |||||
} | |||||
} | } | ||||
%end | %end | ||||
%hook ApolloCommentsHeaderCellNode | %hook ApolloCommentsHeaderCellNode | ||||
%property(assign, nonatomic) id undeleteButton; | |||||
%property(strong, nonatomic) id undeleteButton; | |||||
%new | %new | ||||
-(void) didTapUndeleteButton{ | |||||
-(void) didTapUndeleteButton:(id) sender{ | |||||
[sender setEnabled:NO]; | |||||
id bodyNode = MSHookIvar<id>(self, "bodyNode"); | id bodyNode = MSHookIvar<id>(self, "bodyNode"); | ||||
id postInfoNode = MSHookIvar<id>(self, "postInfoNode"); | id postInfoNode = MSHookIvar<id>(self, "postInfoNode"); | ||||
[bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; | [bodyNode setAttributedString:[%c(MarkdownRenderer) attributedStringFromMarkdown:body withAttributes:apolloBodyAttributes]]; | ||||
[sender setEnabled:YES]; | |||||
}]; | }]; | ||||
} | } | ||||
CGFloat imageSize = 20.0f; | CGFloat imageSize = 20.0f; | ||||
UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | UIButton *undeleteButton = [UIButton buttonWithType:UIButtonTypeCustom]; | ||||
[undeleteButton addTarget:self action:@selector(didTapUndeleteButton) forControlEvents:UIControlEventTouchUpInside]; | |||||
[undeleteButton addTarget:self action:@selector(didTapUndeleteButton:) forControlEvents:UIControlEventTouchUpInside]; | |||||
UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | UIImage* undeleteImage = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/TFDidThatSay/eye160dark.png"]; | ||||
[undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | [undeleteButton setImage:undeleteImage forState:UIControlStateNormal]; | ||||
CGFloat centerHeight = [postInfoNode frame].origin.y + ([ageNode frame].size.height + [ageNode frame].origin.y * 2) / 2.0f; | CGFloat centerHeight = [postInfoNode frame].origin.y + ([ageNode frame].size.height + [ageNode frame].origin.y * 2) / 2.0f; | ||||
CGFloat buttonXPos = [postInfoNode frame].origin.x + [postInfoNode frame].size.width - imageSize; | CGFloat buttonXPos = [postInfoNode frame].origin.x + [postInfoNode frame].size.width - imageSize; | ||||
//Compiling with DEBUG=0 causes this to break the app, I have no idea why. | |||||
[[self undeleteButton] setFrame:CGRectMake(buttonXPos, centerHeight - (imageSize / 2), imageSize, imageSize)]; | [[self undeleteButton] setFrame:CGRectMake(buttonXPos, centerHeight - (imageSize / 2), imageSize, imageSize)]; | ||||
} | } | ||||
} | } | ||||
%ctor { | %ctor { | ||||
NSString* processName = [[NSProcessInfo processInfo] processName]; | NSString* processName = [[NSProcessInfo processInfo] processName]; | ||||
if ([processName isEqualToString:@"Apollo"]){ | if ([processName isEqualToString:@"Apollo"]){ | ||||
%init(Apollo, ApolloCommentsHeaderCellNode = objc_getClass("Apollo.CommentsHeaderCellNode"), ApolloCommentCellNode = objc_getClass("Apollo.CommentCellNode"), ApolloApolloButtonNode = objc_getClass("Apollo.ApolloButtonNode")); | %init(Apollo, ApolloCommentsHeaderCellNode = objc_getClass("Apollo.CommentsHeaderCellNode"), ApolloCommentCellNode = objc_getClass("Apollo.CommentCellNode"), ApolloApolloButtonNode = objc_getClass("Apollo.ApolloButtonNode")); | ||||
} | } | ||||
} | } | ||||
%group Narwhal | %group Narwhal | ||||
UIAlertController* recreateActionSheet(id controller, id comment, NSInteger commentIndex){ | |||||
UIAlertController* alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:nil]; | |||||
UIAlertAction* pmAction = [UIAlertAction actionWithTitle:[NSString stringWithFormat:@"private message %@", [comment author]] style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetPrivateMessage:comment];}]; | |||||
UIAlertAction* viewProfileAction = [UIAlertAction actionWithTitle:@"view profile" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetViewProfile:comment];}]; | |||||
UIAlertAction* shareAction = [UIAlertAction actionWithTitle:@"share comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetShareComment:comment];}]; | |||||
UIAlertAction* copyAction = [UIAlertAction actionWithTitle:@"copy text" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetCopyCommentText:comment];}]; | |||||
UIAlertAction* reportAction = [UIAlertAction actionWithTitle:@"report comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetReportComment:comment];}]; | |||||
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleCancel handler:nil]; | |||||
[alert addAction:pmAction]; | |||||
[alert addAction:viewProfileAction]; | |||||
[alert addAction:shareAction]; | |||||
[alert addAction:copyAction]; | |||||
if ([comment isSaved]){ | |||||
UIAlertAction* unsaveAction = [UIAlertAction actionWithTitle:@"unsave comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetUnsaveComment:comment index:commentIndex];}]; | |||||
[alert addAction:unsaveAction]; | |||||
} else { | |||||
UIAlertAction* saveAction = [UIAlertAction actionWithTitle:@"save comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetSaveComment:comment index:commentIndex];}]; | |||||
[alert addAction:saveAction]; | |||||
} | |||||
if ([[[comment parentID] componentsSeparatedByString:@"_"][0] isEqualToString:@"t1"]){ | |||||
UIAlertAction* viewParentAction = [UIAlertAction actionWithTitle:@"view parent" style: nil handler:^(UIAlertAction* action){[controller _handleActionSheetViewParent:comment];}]; | |||||
[alert addAction:viewParentAction]; | |||||
} | |||||
if ([[comment author] isEqualToString:[[%c(NRTAuthManager) sharedManager] currentUsername]]) { | |||||
UIAlertAction* editAction = [UIAlertAction actionWithTitle:@"edit comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetEditComment:comment];}]; | |||||
UIAlertAction* deleteAction = [UIAlertAction actionWithTitle:@"delete comment" style:nil handler:^(UIAlertAction* action){[controller _handleActionSheetDeleteComment:comment];}]; | |||||
[alert addAction:editAction]; | |||||
[alert addAction:deleteAction]; | |||||
} | |||||
[alert addAction:reportAction]; | |||||
[alert addAction:cancelAction]; | |||||
UIAlertAction* undeleteAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:nil handler:^(UIAlertAction* action){[controller handleUndeleteCommentAction:comment];}]; | |||||
[alert addAction:undeleteAction]; | |||||
return alert; | |||||
} | |||||
BOOL shouldHaveUndeleteAction = NO; | |||||
id tfComment; | |||||
id tfController; | |||||
void getUndeleteCommentData(id controller, id comment){ | void getUndeleteCommentData(id controller, id comment){ | ||||
if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){ | if ([body isEqualToString:@"[deleted]"] || [body isEqualToString:@"[removed]"]){ | ||||
body = @"[pushshift was unable to archive this]"; | body = @"[pushshift was unable to archive this]"; | ||||
} | } | ||||
if (!body){ | |||||
body = @"[wtf]"; | |||||
} | |||||
if (!author){ | |||||
author = @"[wtf]"; | |||||
} | |||||
} else { | } else { | ||||
body = @"[pushshift has not archived this yet]"; | body = @"[pushshift has not archived this yet]"; | ||||
} | } | ||||
[controller performSelectorOnMainThread:@selector(completeUndeleteComment:) withObject:@{@"body":body, @"author":author, @"comment":comment} waitUntilDone:NO]; | [controller performSelectorOnMainThread:@selector(completeUndeleteComment:) withObject:@{@"body":body, @"author":author, @"comment":comment} waitUntilDone:NO]; | ||||
}]; | }]; | ||||
} | |||||
} | |||||
%hook UIViewController | |||||
-(void) presentViewController:(id) arg1 animated:(BOOL) arg2 completion:(id) arg3{ | |||||
if ([arg1 isKindOfClass:[UIAlertController class]] && shouldHaveUndeleteAction){ | |||||
UIAlertAction* undeleteAction; | |||||
if (tfComment){ | |||||
undeleteAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:nil handler:^(UIAlertAction* action){getUndeleteCommentData(tfController, tfComment);}]; | |||||
} else { | |||||
undeleteAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:nil handler:^(UIAlertAction* action){[tfController handleUndeletePostAction];}]; | |||||
} | |||||
[arg1 addAction:undeleteAction]; | |||||
} | |||||
%orig; | |||||
} | |||||
%end | |||||
%hook NRTLinkViewController | %hook NRTLinkViewController | ||||
[[self tableView] reloadData]; | [[self tableView] reloadData]; | ||||
} | } | ||||
%new | |||||
-(void) handleUndeleteCommentAction:(id) comment{ | |||||
getUndeleteCommentData(self, comment); | |||||
} | |||||
%new | %new | ||||
-(void) handleUndeletePostAction{ | -(void) handleUndeletePostAction{ | ||||
[self performSelectorOnMainThread:@selector(completeUndeletePost:) withObject:@{@"body":body, @"author":author, @"post":post} waitUntilDone:NO]; | [self performSelectorOnMainThread:@selector(completeUndeletePost:) withObject:@{@"body":body, @"author":author, @"post":post} waitUntilDone:NO]; | ||||
}]; | }]; | ||||
} | } | ||||
-(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ | -(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ | ||||
if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { | if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { | ||||
id comment = [arg1 comment]; | |||||
NSInteger commentIndex = [[[self commentsManager] comments] indexOfObject:comment]; | |||||
tfComment = [arg1 comment]; | |||||
tfController = self; | |||||
shouldHaveUndeleteAction = YES; | |||||
UIAlertController* alert = recreateActionSheet(self, comment, commentIndex); | |||||
[self presentViewController:alert animated:YES completion:nil]; | |||||
} else { | |||||
%orig; | |||||
} | |||||
} else { | |||||
%orig; | |||||
} | |||||
} | |||||
} | |||||
%orig; | |||||
shouldHaveUndeleteAction = NO; | |||||
} | } | ||||
-(void) _dotsButtonTouched:(id) arg1{ | -(void) _dotsButtonTouched:(id) arg1{ | ||||
id post = [self link]; | |||||
BOOL shouldHaveUndeleteAction = NO; | |||||
UIAlertController* alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:nil]; | |||||
UIAlertAction* undeletePostAction; | |||||
UIAlertAction* sharePostAction = [UIAlertAction actionWithTitle:@"share reddit post" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetSharePost];}]; | |||||
UIAlertAction* sortCommentsAction = [UIAlertAction actionWithTitle:@"sort comments" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetSortComments];}]; | |||||
UIAlertAction* refreshCommentsAction = [UIAlertAction actionWithTitle:@"refresh comments" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetRefreshComments];}]; | |||||
UIAlertAction* reportPostAction = [UIAlertAction actionWithTitle:@"report post" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetReportPost];}]; | |||||
UIAlertAction* cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleCancel handler:nil]; | |||||
[alert addAction:sharePostAction]; | |||||
[alert addAction:sortCommentsAction]; | |||||
[alert addAction:refreshCommentsAction]; | |||||
if ([self linkTextOffscreenCell]){ | if ([self linkTextOffscreenCell]){ | ||||
UIAlertAction* refreshPostAction = [UIAlertAction actionWithTitle:@"refresh post" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetRefreshPost];}]; | |||||
[alert addAction:refreshPostAction]; | |||||
undeletePostAction = [UIAlertAction actionWithTitle:@"tf did that say?" style:nil handler:^(UIAlertAction* action){[self handleUndeletePostAction];}]; | |||||
tfController = self; | |||||
tfComment = nil; | |||||
shouldHaveUndeleteAction = YES; | shouldHaveUndeleteAction = YES; | ||||
} | |||||
if ([[post author] isEqualToString:[[%c(NRTAuthManager) sharedManager] currentUsername]]){ | |||||
UIAlertAction* editPostAction = [UIAlertAction actionWithTitle:@"edit post" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetEditPost];}]; | |||||
UIAlertAction* deletePostAction = [UIAlertAction actionWithTitle:@"delete post" style:nil handler:^(UIAlertAction* action){[self _handleActionSheetDeletePost];}]; | |||||
[alert addAction:editPostAction]; | |||||
[alert addAction:deletePostAction]; | |||||
} | } | ||||
[alert addAction:reportPostAction]; | |||||
[alert addAction:cancelAction]; | |||||
if (shouldHaveUndeleteAction){ | |||||
[alert addAction:undeletePostAction]; | |||||
} | |||||
[self presentViewController:alert animated:YES completion:nil]; | |||||
%orig; | |||||
shouldHaveUndeleteAction = NO; | |||||
} | } | ||||
%end | %end | ||||
} | } | ||||
} | } | ||||
%new | |||||
-(void) handleUndeleteCommentAction:(id) comment{ | |||||
getUndeleteCommentData(self, comment); | |||||
} | |||||
-(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ | -(void) swipeCell:(id) arg1 didEndDragWithState:(NSUInteger) arg2{ | ||||
if (arg2 == 2){ | if (arg2 == 2){ | ||||
if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { | if ([arg1 isKindOfClass:[%c(NRTCommentTableViewCell) class]]) { | ||||
id comment = [arg1 comment]; | |||||
NSInteger commentIndex = [[[self commentsManager] comments] indexOfObject:comment]; | |||||
UIAlertController* alert = recreateActionSheet(self, comment, commentIndex); | |||||
[[self parentController] presentViewController:alert animated:YES completion:nil]; | |||||
tfComment = [arg1 comment]; | |||||
tfController = self; | |||||
shouldHaveUndeleteAction = YES; | |||||
} else { | |||||
%orig; | |||||
} | |||||
} else { | |||||
%orig; | |||||
} | |||||
} | |||||
} | |||||
%orig; | |||||
shouldHaveUndeleteAction = NO; | |||||
} | } | ||||
%end | %end |