2010-06-25 18:36:01 -04:00
|
|
|
//
|
|
|
|
// StoryDetailViewController.m
|
|
|
|
// NewsBlur
|
|
|
|
//
|
|
|
|
// Created by Samuel Clay on 6/24/10.
|
|
|
|
// Copyright 2010 __MyCompanyName__. All rights reserved.
|
|
|
|
//
|
|
|
|
|
2013-10-02 19:01:15 -07:00
|
|
|
#import <AVFoundation/AVFoundation.h>
|
2010-06-25 18:36:01 -04:00
|
|
|
#import "StoryDetailViewController.h"
|
|
|
|
#import "NewsBlurAppDelegate.h"
|
2012-07-15 15:06:06 -07:00
|
|
|
#import "NewsBlurViewController.h"
|
2011-09-05 22:06:31 -07:00
|
|
|
#import "FeedDetailViewController.h"
|
2012-06-18 14:31:42 -07:00
|
|
|
#import "FontSettingsViewController.h"
|
2012-07-03 17:54:36 -07:00
|
|
|
#import "UserProfileViewController.h"
|
2012-07-12 13:34:41 -07:00
|
|
|
#import "ShareViewController.h"
|
2012-11-07 17:54:16 -08:00
|
|
|
#import "StoryPageControl.h"
|
2010-11-22 10:44:52 -05:00
|
|
|
#import "ASIHTTPRequest.h"
|
|
|
|
#import "ASIFormDataRequest.h"
|
2014-09-18 15:15:41 -07:00
|
|
|
#import "AFImageRequestOperation.h"
|
2011-09-05 22:06:31 -07:00
|
|
|
#import "Base64.h"
|
2011-10-17 09:37:16 -07:00
|
|
|
#import "Utilities.h"
|
2012-07-20 19:55:38 -07:00
|
|
|
#import "NSString+HTML.h"
|
2012-07-24 15:29:01 -07:00
|
|
|
#import "NBContainerViewController.h"
|
2012-07-26 13:54:45 -07:00
|
|
|
#import "DataUtilities.h"
|
2012-07-27 16:48:30 -07:00
|
|
|
#import "JSON.h"
|
2012-12-07 16:17:48 -08:00
|
|
|
#import "StringHelper.h"
|
2014-02-12 20:09:37 -08:00
|
|
|
#import "StoriesCollection.h"
|
2014-09-17 19:02:12 -07:00
|
|
|
#import "UIWebView+Offsets.h"
|
|
|
|
#import "UIViewController+OSKUtilities.h"
|
|
|
|
#import "UIView+ViewController.h"
|
2010-06-25 18:36:01 -04:00
|
|
|
|
|
|
|
@implementation StoryDetailViewController
|
|
|
|
|
|
|
|
@synthesize appDelegate;
|
2012-06-20 07:39:49 -07:00
|
|
|
@synthesize activeStoryId;
|
2012-11-05 17:16:10 -08:00
|
|
|
@synthesize activeStory;
|
2012-07-12 13:34:41 -07:00
|
|
|
@synthesize innerView;
|
2010-06-27 19:35:17 -04:00
|
|
|
@synthesize webView;
|
2011-10-30 20:24:12 -07:00
|
|
|
@synthesize feedTitleGradient;
|
2013-09-26 19:26:10 -07:00
|
|
|
@synthesize noStoryMessage;
|
2012-10-04 10:59:44 -07:00
|
|
|
@synthesize pullingScrollview;
|
2012-11-05 15:12:42 -08:00
|
|
|
@synthesize pageIndex;
|
2012-07-27 12:27:13 -07:00
|
|
|
@synthesize storyHUD;
|
2013-05-29 13:36:39 -07:00
|
|
|
@synthesize inTextView;
|
2013-10-07 10:02:44 -07:00
|
|
|
@synthesize isRecentlyUnread;
|
2012-07-26 18:07:29 -07:00
|
|
|
|
2012-07-24 23:21:28 -07:00
|
|
|
|
2011-12-01 09:01:18 -08:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark View boilerplate
|
|
|
|
|
2010-06-25 18:36:01 -04:00
|
|
|
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
|
|
|
|
2011-03-09 18:23:55 -05:00
|
|
|
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
|
2010-06-25 18:36:01 -04:00
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2011-08-14 00:16:25 -07:00
|
|
|
|
2015-04-26 21:22:25 -07:00
|
|
|
- (NSString *)description {
|
|
|
|
NSString *page = appDelegate.storyPageControl.currentPage == self ? @"currentPage" : appDelegate.storyPageControl.previousPage == self ? @"previousPage" : appDelegate.storyPageControl.nextPage == self ? @"nextPage" : @"unattached page";
|
|
|
|
return [NSString stringWithFormat:@"%@", page];
|
|
|
|
}
|
|
|
|
|
2011-08-24 10:24:02 -07:00
|
|
|
- (void)viewDidLoad {
|
2012-07-16 10:10:52 -07:00
|
|
|
[super viewDidLoad];
|
|
|
|
|
2012-07-23 15:27:20 -07:00
|
|
|
self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
|
|
|
2013-10-02 19:01:15 -07:00
|
|
|
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
|
|
|
|
[audioSession setCategory:AVAudioSessionCategoryPlayback
|
|
|
|
error:nil];
|
|
|
|
|
2012-11-06 12:45:19 -08:00
|
|
|
self.webView.scalesPageToFit = YES;
|
2014-02-03 18:54:50 -08:00
|
|
|
// self.webView.multipleTouchEnabled = NO;
|
2012-12-27 18:37:05 -08:00
|
|
|
|
|
|
|
[self.webView.scrollView setDelaysContentTouches:NO];
|
|
|
|
[self.webView.scrollView setDecelerationRate:UIScrollViewDecelerationRateNormal];
|
|
|
|
|
2013-03-22 19:25:41 -07:00
|
|
|
[self.webView.scrollView addObserver:self forKeyPath:@"contentOffset"
|
|
|
|
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
|
|
|
|
context:nil];
|
2014-02-03 18:54:50 -08:00
|
|
|
|
2014-02-04 12:40:46 -08:00
|
|
|
// UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc]
|
|
|
|
// initWithTarget:self action:@selector(showOriginalStory:)];
|
|
|
|
// [self.webView addGestureRecognizer:pinchGesture];
|
2013-10-11 17:46:09 -07:00
|
|
|
|
2014-02-03 19:20:26 -08:00
|
|
|
UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc]
|
2014-09-18 18:25:38 -07:00
|
|
|
initWithTarget:self action:@selector(doubleTap:)];
|
2014-02-03 19:20:26 -08:00
|
|
|
doubleTapGesture.numberOfTapsRequired = 2;
|
|
|
|
doubleTapGesture.delegate = self;
|
2014-09-18 18:25:38 -07:00
|
|
|
[self.webView addGestureRecognizer:doubleTapGesture];
|
|
|
|
|
2014-09-19 14:48:54 -07:00
|
|
|
// UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]
|
|
|
|
// initWithTarget:self action:@selector(tap:)];
|
|
|
|
// tapGesture.numberOfTapsRequired = 1;
|
|
|
|
// tapGesture.delegate = self;
|
|
|
|
// [tapGesture requireGestureRecognizerToFail:doubleTapGesture];
|
|
|
|
// [self.webView addGestureRecognizer:tapGesture];
|
2014-02-03 19:20:26 -08:00
|
|
|
|
2014-02-05 17:14:23 -08:00
|
|
|
UITapGestureRecognizer *doubleDoubleTapGesture = [[UITapGestureRecognizer alloc]
|
|
|
|
initWithTarget:self
|
2014-09-18 18:25:38 -07:00
|
|
|
action:@selector(doubleTap:)];
|
2014-02-05 17:14:23 -08:00
|
|
|
doubleDoubleTapGesture.numberOfTouchesRequired = 2;
|
|
|
|
doubleDoubleTapGesture.numberOfTapsRequired = 2;
|
|
|
|
doubleDoubleTapGesture.delegate = self;
|
2014-09-18 18:25:38 -07:00
|
|
|
[self.webView addGestureRecognizer:doubleDoubleTapGesture];
|
2014-02-05 17:14:23 -08:00
|
|
|
|
2012-11-14 17:31:52 -08:00
|
|
|
self.pageIndex = -2;
|
2013-05-29 13:36:39 -07:00
|
|
|
self.inTextView = NO;
|
2014-09-17 19:02:12 -07:00
|
|
|
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
|
|
selector:@selector(tapAndHold:)
|
|
|
|
name:@"TapAndHoldNotification"
|
|
|
|
object:nil];
|
2011-08-24 10:24:02 -07:00
|
|
|
}
|
|
|
|
|
2014-02-03 19:20:26 -08:00
|
|
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
|
2014-09-19 16:58:56 -07:00
|
|
|
// NSLog(@"Gesture: %d - %d", (unsigned long)touch.tapCount, gestureRecognizer.state);
|
2014-02-04 12:40:46 -08:00
|
|
|
inDoubleTap = (touch.tapCount == 2);
|
2014-09-19 14:48:54 -07:00
|
|
|
|
|
|
|
CGPoint pt = [self pointForGesture:gestureRecognizer];
|
|
|
|
if (pt.x == CGPointZero.x && pt.y == CGPointZero.y) return YES;
|
2014-09-22 12:35:38 -07:00
|
|
|
// NSLog(@"Tapped point: %@", NSStringFromCGPoint(pt));
|
2014-09-19 14:48:54 -07:00
|
|
|
NSString *tagName = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'tagName');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
|
2014-09-19 16:58:56 -07:00
|
|
|
if ([tagName isEqualToString:@"IMG"] && !inDoubleTap) {
|
2014-09-19 14:48:54 -07:00
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
2014-02-03 19:20:26 -08:00
|
|
|
return YES;
|
|
|
|
}
|
2014-02-05 17:14:23 -08:00
|
|
|
|
2014-02-03 19:20:26 -08:00
|
|
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
2014-09-19 16:58:56 -07:00
|
|
|
// NSLog(@"Should conflict? \n\tgesture:%@ \n\t other:%@",
|
|
|
|
// gestureRecognizer, otherGestureRecognizer);
|
2014-09-18 18:25:38 -07:00
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)tap:(UITapGestureRecognizer *)gestureRecognizer {
|
2014-09-19 16:58:56 -07:00
|
|
|
// NSLog(@"Gesture tap: %d (%d) - %d", gestureRecognizer.state, UIGestureRecognizerStateEnded, inDoubleTap);
|
2014-09-18 18:25:38 -07:00
|
|
|
|
|
|
|
if (gestureRecognizer.state == UIGestureRecognizerStateEnded && gestureRecognizer.numberOfTouches == 1) {
|
|
|
|
[self tapImage:gestureRecognizer];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)doubleTap:(UITapGestureRecognizer *)gestureRecognizer {
|
2014-09-19 16:58:56 -07:00
|
|
|
// NSLog(@"Gesture double tap: %d (%d) - %d", gestureRecognizer.state, UIGestureRecognizerStateEnded, inDoubleTap);
|
2014-02-04 12:40:46 -08:00
|
|
|
if (gestureRecognizer.state == UIGestureRecognizerStateEnded && inDoubleTap) {
|
2014-03-03 15:47:24 -08:00
|
|
|
NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];
|
|
|
|
BOOL openOriginal = NO;
|
|
|
|
BOOL showText = NO;
|
2014-03-03 16:21:26 -08:00
|
|
|
BOOL markUnread = NO;
|
|
|
|
BOOL saveStory = NO;
|
2014-02-05 17:14:23 -08:00
|
|
|
if (gestureRecognizer.numberOfTouches == 2) {
|
2014-03-03 15:47:24 -08:00
|
|
|
NSString *twoFingerTap = [preferences stringForKey:@"two_finger_double_tap"];
|
|
|
|
if ([twoFingerTap isEqualToString:@"open_original_story"]) {
|
|
|
|
openOriginal = YES;
|
|
|
|
} else if ([twoFingerTap isEqualToString:@"show_original_text"]) {
|
|
|
|
showText = YES;
|
2014-03-03 16:21:26 -08:00
|
|
|
} else if ([twoFingerTap isEqualToString:@"mark_unread"]) {
|
|
|
|
markUnread = YES;
|
|
|
|
} else if ([twoFingerTap isEqualToString:@"save_story"]) {
|
|
|
|
saveStory = YES;
|
2014-03-03 15:47:24 -08:00
|
|
|
}
|
2014-02-05 17:14:23 -08:00
|
|
|
} else {
|
2014-03-03 15:47:24 -08:00
|
|
|
NSString *doubleTap = [preferences stringForKey:@"double_tap_story"];
|
|
|
|
if ([doubleTap isEqualToString:@"open_original_story"]) {
|
|
|
|
openOriginal = YES;
|
|
|
|
} else if ([doubleTap isEqualToString:@"show_original_text"]) {
|
|
|
|
showText = YES;
|
2014-03-03 16:21:26 -08:00
|
|
|
} else if ([doubleTap isEqualToString:@"mark_unread"]) {
|
|
|
|
markUnread = YES;
|
|
|
|
} else if ([doubleTap isEqualToString:@"save_story"]) {
|
|
|
|
saveStory = YES;
|
2014-03-03 15:47:24 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (openOriginal) {
|
2014-02-05 17:14:23 -08:00
|
|
|
[self showOriginalStory:gestureRecognizer];
|
2014-03-03 15:47:24 -08:00
|
|
|
} else if (showText) {
|
|
|
|
[self fetchTextView];
|
2014-03-03 16:21:26 -08:00
|
|
|
} else if (markUnread) {
|
2014-03-05 14:13:49 -08:00
|
|
|
[appDelegate.storiesCollection toggleStoryUnread];
|
2014-03-05 15:20:31 -08:00
|
|
|
[appDelegate.feedDetailViewController reloadData];
|
2014-03-03 16:21:26 -08:00
|
|
|
} else if (saveStory) {
|
2014-03-05 14:13:49 -08:00
|
|
|
[appDelegate.storiesCollection toggleStorySaved];
|
2014-03-05 15:20:31 -08:00
|
|
|
[appDelegate.feedDetailViewController reloadData];
|
2014-02-05 17:14:23 -08:00
|
|
|
}
|
2014-02-04 12:40:46 -08:00
|
|
|
inDoubleTap = NO;
|
|
|
|
}
|
2014-02-03 19:20:26 -08:00
|
|
|
}
|
|
|
|
|
2012-06-08 10:37:51 -07:00
|
|
|
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
|
2012-06-08 19:21:10 -07:00
|
|
|
return YES;
|
2012-06-08 10:37:51 -07:00
|
|
|
}
|
|
|
|
|
2012-07-20 19:55:38 -07:00
|
|
|
- (void)viewDidUnload {
|
|
|
|
[self setInnerView:nil];
|
2013-09-12 21:26:38 -07:00
|
|
|
|
2012-07-20 19:55:38 -07:00
|
|
|
[super viewDidUnload];
|
|
|
|
}
|
|
|
|
|
2011-08-14 10:22:26 -07:00
|
|
|
- (void)viewDidDisappear:(BOOL)animated {
|
2014-09-18 11:25:51 -07:00
|
|
|
[super viewDidDisappear:animated];
|
2011-08-14 10:22:26 -07:00
|
|
|
}
|
|
|
|
|
2014-12-02 18:36:38 -08:00
|
|
|
- (void)viewWillDisappear:(BOOL)animated {
|
|
|
|
[super viewWillDisappear:animated];
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
[appDelegate.feedDetailViewController.view endEditing:YES];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)viewWillAppear:(BOOL)animated {
|
|
|
|
[super viewWillAppear:animated];
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
[appDelegate.feedDetailViewController.view endEditing:YES];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-12 13:34:41 -07:00
|
|
|
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
|
2014-12-03 15:35:37 -08:00
|
|
|
preRotateSize = webView.scrollView.contentSize;
|
|
|
|
NSLog(@"Height is %@ (Offset is %@)", @(preRotateSize.height), @(webView.scrollView.contentOffset.y));
|
2012-07-12 13:34:41 -07:00
|
|
|
}
|
|
|
|
|
2014-11-30 21:24:42 -05:00
|
|
|
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
|
2014-12-01 17:22:40 -08:00
|
|
|
[self drawFeedGradient];
|
2014-12-03 15:35:37 -08:00
|
|
|
|
|
|
|
CGSize newSize = webView.scrollView.contentSize;
|
|
|
|
CGPoint newOffset = webView.scrollView.contentOffset;
|
|
|
|
CGFloat preOffset = newOffset.y;
|
|
|
|
newOffset.y *= newSize.height / preRotateSize.height;
|
|
|
|
NSLog(@"Height was %@, now %@ (Offset was %@, now %@)", @(preRotateSize.height), @(newSize.height), @(preOffset), @(newOffset.y));
|
|
|
|
// webView.scrollView.contentOffset = newOffset;
|
2014-11-30 21:24:42 -05:00
|
|
|
}
|
|
|
|
|
2011-12-01 09:01:18 -08:00
|
|
|
#pragma mark -
|
2012-11-08 17:39:32 -08:00
|
|
|
#pragma mark Story setup
|
2012-11-06 12:45:19 -08:00
|
|
|
|
|
|
|
- (void)initStory {
|
|
|
|
appDelegate.inStoryDetail = YES;
|
2013-09-26 19:26:10 -07:00
|
|
|
self.noStoryMessage.hidden = YES;
|
2012-11-08 17:39:32 -08:00
|
|
|
self.webView.hidden = NO;
|
2015-03-10 18:58:23 -07:00
|
|
|
self.inTextView = appDelegate.inTextView;
|
2012-11-08 17:39:32 -08:00
|
|
|
|
2013-09-23 15:07:25 -07:00
|
|
|
[appDelegate hideShareView:NO];
|
2012-11-08 17:39:32 -08:00
|
|
|
}
|
|
|
|
|
2013-09-12 21:26:38 -07:00
|
|
|
- (void)hideNoStoryMessage {
|
2013-09-26 19:26:10 -07:00
|
|
|
self.noStoryMessage.hidden = YES;
|
2013-09-12 21:26:38 -07:00
|
|
|
}
|
|
|
|
|
2012-11-08 17:39:32 -08:00
|
|
|
- (void)drawStory {
|
2013-03-04 17:15:50 -08:00
|
|
|
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
|
|
|
|
[self drawStory:NO withOrientation:orientation];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)drawStory:(BOOL)force withOrientation:(UIInterfaceOrientation)orientation {
|
2014-02-12 20:41:29 -08:00
|
|
|
if (!force && self.activeStoryId == [self.activeStory objectForKey:@"story_hash"]) {
|
2013-05-29 13:36:39 -07:00
|
|
|
NSLog(@"Already drawn story.");
|
2012-11-14 17:31:52 -08:00
|
|
|
// return;
|
|
|
|
}
|
2015-03-10 18:58:23 -07:00
|
|
|
|
2014-12-01 17:22:40 -08:00
|
|
|
[self drawFeedGradient];
|
|
|
|
|
2012-11-06 12:45:19 -08:00
|
|
|
NSString *shareBarString = [self getShareBar];
|
|
|
|
NSString *commentString = [self getComments];
|
|
|
|
NSString *headerString;
|
|
|
|
NSString *sharingHtmlString;
|
|
|
|
NSString *footerString;
|
|
|
|
NSString *fontStyleClass = @"";
|
2013-11-23 13:03:14 -08:00
|
|
|
NSString *fontSizeClass = @"NB-";
|
2014-05-15 18:06:56 -07:00
|
|
|
NSString *lineSpacingClass = @"NB-line-spacing-";
|
2013-06-23 22:19:08 -07:00
|
|
|
NSString *storyContent = [self.activeStory objectForKey:@"story_content"];
|
2015-03-10 18:58:23 -07:00
|
|
|
if (self.inTextView && [self.activeStory objectForKey:@"original_text"]) {
|
|
|
|
storyContent = [self.activeStory objectForKey:@"original_text"];
|
|
|
|
}
|
2012-11-06 12:45:19 -08:00
|
|
|
|
|
|
|
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
|
|
|
|
if ([userPreferences stringForKey:@"fontStyle"]){
|
|
|
|
fontStyleClass = [fontStyleClass stringByAppendingString:[userPreferences stringForKey:@"fontStyle"]];
|
|
|
|
} else {
|
2014-05-15 17:03:25 -07:00
|
|
|
fontStyleClass = [fontStyleClass stringByAppendingString:@"NB-helvetica"];
|
2012-11-06 12:45:19 -08:00
|
|
|
}
|
2013-11-23 13:03:14 -08:00
|
|
|
fontSizeClass = [fontSizeClass stringByAppendingString:[userPreferences stringForKey:@"story_font_size"]];
|
2012-11-06 12:45:19 -08:00
|
|
|
|
2014-05-15 18:06:56 -07:00
|
|
|
if ([userPreferences stringForKey:@"story_line_spacing"]){
|
|
|
|
lineSpacingClass = [lineSpacingClass stringByAppendingString:[userPreferences stringForKey:@"story_line_spacing"]];
|
|
|
|
} else {
|
|
|
|
lineSpacingClass = [lineSpacingClass stringByAppendingString:@"medium"];
|
|
|
|
}
|
|
|
|
|
2012-11-07 17:54:16 -08:00
|
|
|
int contentWidth = self.appDelegate.storyPageControl.view.frame.size.width;
|
2012-11-06 12:45:19 -08:00
|
|
|
NSString *contentWidthClass;
|
|
|
|
|
2013-03-04 17:15:50 -08:00
|
|
|
if (UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
2012-11-06 12:45:19 -08:00
|
|
|
contentWidthClass = @"NB-ipad-wide";
|
2014-09-19 18:22:47 -07:00
|
|
|
} else if (!UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
2012-11-06 12:45:19 -08:00
|
|
|
contentWidthClass = @"NB-ipad-narrow";
|
2014-09-19 17:25:57 -07:00
|
|
|
} else if (UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
|
|
|
|
contentWidthClass = @"NB-iphone-wide";
|
2012-11-06 12:45:19 -08:00
|
|
|
} else {
|
|
|
|
contentWidthClass = @"NB-iphone";
|
|
|
|
}
|
|
|
|
|
2014-09-24 12:00:47 -07:00
|
|
|
contentWidthClass = [NSString stringWithFormat:@"%@ NB-width-%d",
|
|
|
|
contentWidthClass, (int)floorf(CGRectGetWidth(self.view.frame))];
|
|
|
|
|
2013-06-26 16:22:44 -07:00
|
|
|
// Replace image urls that are locally cached, even when online
|
2014-09-26 17:38:35 -07:00
|
|
|
// NSString *storyHash = [self.activeStory objectForKey:@"story_hash"];
|
|
|
|
// NSArray *imageUrls = [appDelegate.activeCachedImages objectForKey:storyHash];
|
|
|
|
// if (imageUrls) {
|
|
|
|
// NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
|
|
|
|
// NSString *storyImagesDirectory = [[paths objectAtIndex:0]
|
|
|
|
// stringByAppendingPathComponent:@"story_images"];
|
|
|
|
// for (NSString *imageUrl in imageUrls) {
|
|
|
|
// NSString *cachedImage = [storyImagesDirectory
|
|
|
|
// stringByAppendingPathComponent:[Utilities md5:imageUrl]];
|
|
|
|
// storyContent = [storyContent
|
|
|
|
// stringByReplacingOccurrencesOfString:imageUrl
|
|
|
|
// withString:cachedImage];
|
|
|
|
// }
|
|
|
|
// }
|
2013-06-23 22:19:08 -07:00
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
NSString *riverClass = (appDelegate.storiesCollection.isRiverView ||
|
2014-05-20 15:29:16 -07:00
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
2014-10-22 17:03:48 -07:00
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) ?
|
2013-03-06 14:29:40 -08:00
|
|
|
@"NB-river" : @"NB-non-river";
|
|
|
|
|
2012-11-06 12:45:19 -08:00
|
|
|
// set up layout values based on iPad/iPhone
|
|
|
|
headerString = [NSString stringWithFormat:@
|
|
|
|
"<link rel=\"stylesheet\" type=\"text/css\" href=\"storyDetailView.css\" >"
|
|
|
|
"<meta name=\"viewport\" id=\"viewport\" content=\"width=%i, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\"/>",
|
|
|
|
contentWidth];
|
|
|
|
footerString = [NSString stringWithFormat:@
|
|
|
|
"<script src=\"zepto.js\"></script>"
|
2014-01-06 15:02:12 -08:00
|
|
|
"<script src=\"fitvid.js\"></script>"
|
2012-12-25 19:03:50 -08:00
|
|
|
"<script src=\"storyDetailView.js\"></script>"
|
|
|
|
"<script src=\"fastTouch.js\"></script>"];
|
2012-11-06 12:45:19 -08:00
|
|
|
|
2014-05-21 12:24:22 -07:00
|
|
|
sharingHtmlString = [self getSideoptions];
|
2012-12-07 17:18:31 -08:00
|
|
|
|
|
|
|
NSString *storyHeader = [self getHeader];
|
2012-11-06 12:45:19 -08:00
|
|
|
NSString *htmlString = [NSString stringWithFormat:@
|
|
|
|
"<html>"
|
|
|
|
"<head>%@</head>" // header string
|
2013-03-06 14:29:40 -08:00
|
|
|
"<body id=\"story_pane\" class=\"%@ %@\">"
|
2012-11-06 12:45:19 -08:00
|
|
|
" <div class=\"%@\" id=\"NB-font-style\">"
|
2014-05-15 18:06:56 -07:00
|
|
|
" <div class=\"%@\" id=\"NB-font-size\">"
|
|
|
|
" <div class=\"%@\" id=\"NB-line-spacing\">"
|
|
|
|
" <div id=\"NB-header-container\">%@</div>" // storyHeader
|
2014-05-21 12:24:22 -07:00
|
|
|
" %@" // shareBar
|
|
|
|
" <div id=\"NB-story\" class=\"NB-story\">%@</div>"
|
|
|
|
" <div id=\"NB-sideoptions-container\">%@</div>"
|
|
|
|
" <div id=\"NB-comments-wrapper\">"
|
|
|
|
" %@" // friends comments
|
|
|
|
" </div>"
|
|
|
|
" %@"
|
2014-05-15 18:06:56 -07:00
|
|
|
" </div>" // line-spacing
|
|
|
|
" </div>" // font-size
|
2012-11-06 12:45:19 -08:00
|
|
|
" </div>" // font-style
|
|
|
|
"</body>"
|
|
|
|
"</html>",
|
|
|
|
headerString,
|
|
|
|
contentWidthClass,
|
2013-03-06 14:29:40 -08:00
|
|
|
riverClass,
|
2012-11-06 12:45:19 -08:00
|
|
|
fontStyleClass,
|
|
|
|
fontSizeClass,
|
2014-05-15 18:06:56 -07:00
|
|
|
lineSpacingClass,
|
2012-12-11 17:53:17 -08:00
|
|
|
storyHeader,
|
|
|
|
shareBarString,
|
2013-06-23 22:19:08 -07:00
|
|
|
storyContent,
|
2012-11-06 12:45:19 -08:00
|
|
|
sharingHtmlString,
|
|
|
|
commentString,
|
|
|
|
footerString
|
|
|
|
];
|
|
|
|
|
2013-03-05 17:00:03 -08:00
|
|
|
// NSLog(@"\n\n\n\nhtmlString:\n\n\n%@\n\n\n", htmlString);
|
2012-11-06 12:45:19 -08:00
|
|
|
NSString *path = [[NSBundle mainBundle] bundlePath];
|
|
|
|
NSURL *baseURL = [NSURL fileURLWithPath:path];
|
|
|
|
|
2014-09-17 19:02:12 -07:00
|
|
|
[self.webView setMediaPlaybackRequiresUserAction:NO];
|
|
|
|
[self.webView loadHTMLString:htmlString baseURL:baseURL];
|
2015-03-10 18:58:23 -07:00
|
|
|
[appDelegate.storyPageControl setTextButton:self];
|
|
|
|
|
2015-03-12 19:43:39 -07:00
|
|
|
// NSLog(@"Drawing Story: %@", [self.activeStory objectForKey:@"story_title"]);
|
2015-03-10 18:58:23 -07:00
|
|
|
|
2014-12-01 17:22:40 -08:00
|
|
|
self.activeStoryId = [self.activeStory objectForKey:@"story_hash"];
|
|
|
|
}
|
2012-12-07 17:18:31 -08:00
|
|
|
|
2014-12-01 17:22:40 -08:00
|
|
|
- (void)drawFeedGradient {
|
2012-11-06 12:45:19 -08:00
|
|
|
NSString *feedIdStr = [NSString stringWithFormat:@"%@",
|
|
|
|
[self.activeStory
|
|
|
|
objectForKey:@"story_feed_id"]];
|
2012-12-28 11:34:06 -08:00
|
|
|
NSDictionary *feed = [appDelegate getFeed:feedIdStr];
|
2012-11-06 12:45:19 -08:00
|
|
|
|
2012-12-07 17:18:31 -08:00
|
|
|
self.feedTitleGradient = [appDelegate
|
|
|
|
makeFeedTitleGradient:feed
|
|
|
|
withRect:CGRectMake(0, -1, self.view.frame.size.width, 21)]; // 1024 hack for self.webView.frame.size.width
|
2012-11-06 12:45:19 -08:00
|
|
|
|
|
|
|
self.feedTitleGradient.tag = FEED_TITLE_GRADIENT_TAG; // Not attached yet. Remove old gradients, first.
|
|
|
|
[self.feedTitleGradient.layer setShadowColor:[[UIColor blackColor] CGColor]];
|
|
|
|
[self.feedTitleGradient.layer setShadowOffset:CGSizeMake(0, 0)];
|
|
|
|
[self.feedTitleGradient.layer setShadowOpacity:0];
|
|
|
|
[self.feedTitleGradient.layer setShadowRadius:12.0];
|
|
|
|
|
|
|
|
for (UIView *subview in self.webView.subviews) {
|
|
|
|
if (subview.tag == FEED_TITLE_GRADIENT_TAG) {
|
|
|
|
[subview removeFromSuperview];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
if (appDelegate.storiesCollection.isRiverView ||
|
2014-05-20 15:29:16 -07:00
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
2014-10-22 17:03:48 -07:00
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) {
|
2012-11-06 12:45:19 -08:00
|
|
|
self.webView.scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(20, 0, 0, 0);
|
|
|
|
} else {
|
|
|
|
self.webView.scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(9, 0, 0, 0);
|
|
|
|
}
|
|
|
|
[self.webView insertSubview:feedTitleGradient aboveSubview:self.webView.scrollView];
|
|
|
|
}
|
|
|
|
|
2012-11-08 17:39:32 -08:00
|
|
|
- (void)showStory {
|
2014-02-12 20:41:29 -08:00
|
|
|
id storyId = [self.activeStory objectForKey:@"story_hash"];
|
2014-02-12 20:09:37 -08:00
|
|
|
[appDelegate.storiesCollection pushReadStory:storyId];
|
2013-09-23 15:07:25 -07:00
|
|
|
[appDelegate resetShareComments];
|
2012-11-08 17:39:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)clearStory {
|
2012-11-14 17:31:52 -08:00
|
|
|
self.activeStoryId = nil;
|
2014-10-30 16:53:35 -07:00
|
|
|
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
|
2013-10-17 11:21:37 -07:00
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:NO];
|
2012-11-08 17:39:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)hideStory {
|
2012-11-14 17:31:52 -08:00
|
|
|
self.activeStoryId = nil;
|
2012-11-08 17:39:32 -08:00
|
|
|
self.webView.hidden = YES;
|
2013-09-26 19:26:10 -07:00
|
|
|
self.noStoryMessage.hidden = NO;
|
2012-11-08 17:39:32 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Story layout
|
|
|
|
|
2012-12-07 17:18:31 -08:00
|
|
|
- (NSString *)getHeader {
|
2012-12-19 15:37:36 -08:00
|
|
|
NSString *feedId = [NSString stringWithFormat:@"%@", [self.activeStory
|
2012-12-11 11:50:06 -08:00
|
|
|
objectForKey:@"story_feed_id"]];
|
|
|
|
NSString *storyAuthor = @"";
|
|
|
|
if ([[self.activeStory objectForKey:@"story_authors"] class] != [NSNull class] &&
|
|
|
|
[[self.activeStory objectForKey:@"story_authors"] length]) {
|
2012-12-07 17:18:31 -08:00
|
|
|
NSString *author = [NSString stringWithFormat:@"%@",
|
|
|
|
[self.activeStory objectForKey:@"story_authors"]];
|
2012-12-11 11:50:06 -08:00
|
|
|
if (author && [author class] != [NSNull class]) {
|
2014-02-12 20:09:37 -08:00
|
|
|
int authorScore = [[[[appDelegate.storiesCollection.activeClassifiers objectForKey:feedId]
|
2012-12-11 11:50:06 -08:00
|
|
|
objectForKey:@"authors"]
|
|
|
|
objectForKey:author] intValue];
|
2013-03-05 10:39:15 -08:00
|
|
|
storyAuthor = [NSString stringWithFormat:@"<span class=\"NB-middot\">·</span><a href=\"http://ios.newsblur.com/classify-author/%@\" "
|
2012-12-11 11:50:06 -08:00
|
|
|
"class=\"NB-story-author %@\" id=\"NB-story-author\"><div class=\"NB-highlight\"></div>%@</a>",
|
|
|
|
author,
|
|
|
|
authorScore > 0 ? @"NB-story-author-positive" : authorScore < 0 ? @"NB-story-author-negative" : @"",
|
|
|
|
author];
|
2012-12-07 17:18:31 -08:00
|
|
|
}
|
|
|
|
}
|
2012-12-11 11:50:06 -08:00
|
|
|
NSString *storyTags = @"";
|
2012-12-07 17:18:31 -08:00
|
|
|
if ([self.activeStory objectForKey:@"story_tags"]) {
|
2012-12-11 11:50:06 -08:00
|
|
|
NSArray *tagArray = [self.activeStory objectForKey:@"story_tags"];
|
|
|
|
if ([tagArray count] > 0) {
|
|
|
|
NSMutableArray *tagStrings = [NSMutableArray array];
|
|
|
|
for (NSString *tag in tagArray) {
|
2014-02-12 20:09:37 -08:00
|
|
|
int tagScore = [[[[appDelegate.storiesCollection.activeClassifiers objectForKey:feedId]
|
2012-12-11 11:50:06 -08:00
|
|
|
objectForKey:@"tags"]
|
|
|
|
objectForKey:tag] intValue];
|
|
|
|
NSString *tagHtml = [NSString stringWithFormat:@"<a href=\"http://ios.newsblur.com/classify-tag/%@\" "
|
2013-08-05 17:29:42 -07:00
|
|
|
"class=\"NB-story-tag %@\"><div class=\"NB-highlight\"></div>%@</a>",
|
|
|
|
tag,
|
|
|
|
tagScore > 0 ? @"NB-story-tag-positive" : tagScore < 0 ? @"NB-story-tag-negative" : @"",
|
|
|
|
tag];
|
2012-12-11 11:50:06 -08:00
|
|
|
[tagStrings addObject:tagHtml];
|
2012-12-07 17:18:31 -08:00
|
|
|
}
|
2012-12-11 11:50:06 -08:00
|
|
|
storyTags = [NSString
|
|
|
|
stringWithFormat:@"<div id=\"NB-story-tags\" class=\"NB-story-tags\">"
|
|
|
|
"%@"
|
|
|
|
"</div>",
|
|
|
|
[tagStrings componentsJoinedByString:@""]];
|
2012-12-07 17:18:31 -08:00
|
|
|
}
|
|
|
|
}
|
2013-08-05 17:29:42 -07:00
|
|
|
NSString *storyStarred = @"";
|
2014-11-04 17:13:53 -08:00
|
|
|
NSString *storyUserTags = @"";
|
2014-11-10 18:25:31 -08:00
|
|
|
NSMutableArray *tagStrings = [NSMutableArray array];
|
2013-08-05 17:29:42 -07:00
|
|
|
if ([self.activeStory objectForKey:@"starred"] && [self.activeStory objectForKey:@"starred_date"]) {
|
2014-11-04 17:13:53 -08:00
|
|
|
storyStarred = [NSString stringWithFormat:@"<div class=\"NB-story-starred-date\">Saved on %@</div>",
|
2013-08-05 17:29:42 -07:00
|
|
|
[self.activeStory objectForKey:@"starred_date"]];
|
2014-11-04 17:13:53 -08:00
|
|
|
|
|
|
|
if ([self.activeStory objectForKey:@"user_tags"]) {
|
|
|
|
NSArray *tagArray = [self.activeStory objectForKey:@"user_tags"];
|
|
|
|
if ([tagArray count] > 0) {
|
|
|
|
for (NSString *tag in tagArray) {
|
|
|
|
NSString *tagHtml = [NSString stringWithFormat:@"<a href=\"http://ios.newsblur.com/remove-user-tag/%@\" "
|
|
|
|
"class=\"NB-user-tag\"><div class=\"NB-highlight\"></div>%@</a>",
|
|
|
|
tag,
|
|
|
|
tag];
|
|
|
|
[tagStrings addObject:tagHtml];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-10 18:25:31 -08:00
|
|
|
storyUserTags = [NSString
|
|
|
|
stringWithFormat:@"<div id=\"NB-user-tags\" class=\"NB-user-tags\">"
|
|
|
|
"%@"
|
|
|
|
"<a class=\"NB-user-tag NB-add-user-tag\" href=\"http://ios.newsblur.com/add-user-tag/add-user-tag/\"><div class=\"NB-highlight\"></div>Add Tag</a>"
|
|
|
|
"</div>",
|
|
|
|
[tagStrings componentsJoinedByString:@""]];
|
|
|
|
|
2013-08-05 17:29:42 -07:00
|
|
|
}
|
2012-12-07 17:18:31 -08:00
|
|
|
|
2013-10-04 12:37:51 -07:00
|
|
|
NSString *storyUnread = @"";
|
2014-02-12 20:09:37 -08:00
|
|
|
if (self.isRecentlyUnread && [appDelegate.storiesCollection isStoryUnread:self.activeStory]) {
|
2013-10-04 12:37:51 -07:00
|
|
|
NSInteger score = [NewsBlurAppDelegate computeStoryScore:[self.activeStory objectForKey:@"intelligence"]];
|
|
|
|
storyUnread = [NSString stringWithFormat:@"<div class=\"NB-story-unread NB-%@\"></div>",
|
|
|
|
score > 0 ? @"positive" : score < 0 ? @"negative" : @"neutral"];
|
|
|
|
}
|
|
|
|
|
2012-12-11 11:50:06 -08:00
|
|
|
NSString *storyTitle = [self.activeStory objectForKey:@"story_title"];
|
2013-11-23 13:25:26 -08:00
|
|
|
NSString *storyPermalink = [self.activeStory objectForKey:@"story_permalink"];
|
2014-02-12 20:09:37 -08:00
|
|
|
NSMutableDictionary *titleClassifiers = [[appDelegate.storiesCollection.activeClassifiers
|
|
|
|
objectForKey:feedId]
|
|
|
|
objectForKey:@"titles"];
|
2012-12-11 11:50:06 -08:00
|
|
|
for (NSString *titleClassifier in titleClassifiers) {
|
|
|
|
if ([storyTitle containsString:titleClassifier]) {
|
|
|
|
int titleScore = [[titleClassifiers objectForKey:titleClassifier] intValue];
|
|
|
|
storyTitle = [storyTitle
|
|
|
|
stringByReplacingOccurrencesOfString:titleClassifier
|
|
|
|
withString:[NSString stringWithFormat:@"<span class=\"NB-story-title-%@\">%@</span>",
|
|
|
|
titleScore > 0 ? @"positive" : titleScore < 0 ? @"negative" : @"",
|
|
|
|
titleClassifier]];
|
2012-12-07 17:18:31 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-10 12:58:40 -07:00
|
|
|
NSString *storyDate = [Utilities formatLongDateFromTimestamp:[[self.activeStory
|
|
|
|
objectForKey:@"story_timestamp"]
|
|
|
|
integerValue]];
|
2012-12-07 17:18:31 -08:00
|
|
|
NSString *storyHeader = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-header\"><div class=\"NB-header-inner\">"
|
2013-10-04 12:37:51 -07:00
|
|
|
"<div class=\"NB-story-title\">"
|
|
|
|
" %@"
|
2013-11-23 13:25:26 -08:00
|
|
|
" <a href=\"%@\" class=\"NB-story-permalink\">%@</a>"
|
2013-10-04 12:37:51 -07:00
|
|
|
"</div>"
|
2013-03-05 10:39:15 -08:00
|
|
|
"<div class=\"NB-story-date\">%@</div>"
|
2012-12-07 17:18:31 -08:00
|
|
|
"%@"
|
|
|
|
"%@"
|
2013-08-05 17:29:42 -07:00
|
|
|
"%@"
|
2014-11-04 17:13:53 -08:00
|
|
|
"%@"
|
2012-12-07 17:18:31 -08:00
|
|
|
"</div></div>",
|
2013-10-04 12:37:51 -07:00
|
|
|
storyUnread,
|
2013-11-23 13:25:26 -08:00
|
|
|
storyPermalink,
|
2012-12-11 11:50:06 -08:00
|
|
|
storyTitle,
|
2013-10-10 12:58:40 -07:00
|
|
|
storyDate,
|
2012-12-11 11:50:06 -08:00
|
|
|
storyAuthor,
|
2013-08-05 17:29:42 -07:00
|
|
|
storyTags,
|
2014-11-04 17:13:53 -08:00
|
|
|
storyStarred,
|
|
|
|
storyUserTags];
|
2012-12-07 17:18:31 -08:00
|
|
|
return storyHeader;
|
|
|
|
}
|
|
|
|
|
2014-05-21 12:24:22 -07:00
|
|
|
- (NSString *)getSideoptions {
|
|
|
|
BOOL isSaved = [[self.activeStory objectForKey:@"starred"] boolValue];
|
|
|
|
BOOL isShared = [[self.activeStory objectForKey:@"shared"] boolValue];
|
|
|
|
|
|
|
|
NSString *sideoptions = [NSString stringWithFormat:@
|
|
|
|
"<div class='NB-sideoptions'>"
|
|
|
|
"<div class='NB-share-header'></div>"
|
|
|
|
"<div class='NB-share-wrapper'><div class='NB-share-inner-wrapper'>"
|
|
|
|
" <div id=\"NB-share-button-id\" class='NB-share-button NB-train-button NB-button'>"
|
|
|
|
" <a href=\"http://ios.newsblur.com/train\"><div>"
|
|
|
|
" <span class=\"NB-icon\"></span> Train"
|
|
|
|
" </div></a>"
|
|
|
|
" </div>"
|
|
|
|
" <div id=\"NB-share-button-id\" class='NB-share-button NB-button %@'>"
|
|
|
|
" <a href=\"http://ios.newsblur.com/share\"><div>"
|
|
|
|
" <span class=\"NB-icon\"></span> %@"
|
|
|
|
" </div></a>"
|
|
|
|
" </div>"
|
|
|
|
" <div id=\"NB-share-button-id\" class='NB-share-button NB-save-button NB-button %@'>"
|
2014-12-16 15:36:58 -08:00
|
|
|
" <a href=\"http://ios.newsblur.com/save/save/\"><div>"
|
2014-05-21 12:24:22 -07:00
|
|
|
" <span class=\"NB-icon\"></span> %@"
|
|
|
|
" </div></a>"
|
|
|
|
" </div>"
|
|
|
|
"</div></div></div>",
|
|
|
|
isShared ? @"NB-button-active" : @"",
|
|
|
|
isShared ? @"Shared" : @"Share",
|
|
|
|
isSaved ? @"NB-button-active" : @"",
|
|
|
|
isSaved ? @"Saved" : @"Save"
|
|
|
|
];
|
|
|
|
|
|
|
|
return sideoptions;
|
|
|
|
}
|
|
|
|
|
2012-08-10 09:45:44 -07:00
|
|
|
- (NSString *)getAvatars:(NSString *)key {
|
2012-06-24 18:17:22 -07:00
|
|
|
NSString *avatarString = @"";
|
2012-12-11 11:50:06 -08:00
|
|
|
NSArray *shareUserIds = [self.activeStory objectForKey:key];
|
2012-06-24 18:17:22 -07:00
|
|
|
|
2012-12-11 11:50:06 -08:00
|
|
|
for (int i = 0; i < shareUserIds.count; i++) {
|
2013-09-05 16:34:39 -07:00
|
|
|
NSDictionary *user = [appDelegate getUser:[[shareUserIds objectAtIndex:i] intValue]];
|
2012-08-13 15:34:53 -07:00
|
|
|
NSString *avatarClass = @"NB-user-avatar";
|
|
|
|
if ([key isEqualToString:@"commented_by_public"] ||
|
|
|
|
[key isEqualToString:@"shared_by_public"]) {
|
|
|
|
avatarClass = @"NB-public-user NB-user-avatar";
|
|
|
|
}
|
2012-06-24 18:17:22 -07:00
|
|
|
NSString *avatar = [NSString stringWithFormat:@
|
2012-08-13 15:34:53 -07:00
|
|
|
"<div class=\"NB-story-share-profile\"><div class=\"%@\">"
|
2012-12-07 17:18:31 -08:00
|
|
|
"<a id=\"NB-user-share-bar-%@\" class=\"NB-show-profile\" "
|
2012-12-11 11:50:06 -08:00
|
|
|
" href=\"http://ios.newsblur.com/show-profile/%@\">"
|
|
|
|
"<div class=\"NB-highlight\"></div>"
|
|
|
|
"<img src=\"%@\" />"
|
|
|
|
"</a>"
|
2012-06-24 18:17:22 -07:00
|
|
|
"</div></div>",
|
2012-08-13 15:34:53 -07:00
|
|
|
avatarClass,
|
2012-07-01 21:58:55 -07:00
|
|
|
[user objectForKey:@"user_id"],
|
2012-08-01 12:41:02 -07:00
|
|
|
[user objectForKey:@"user_id"],
|
2012-07-11 10:33:39 -07:00
|
|
|
[user objectForKey:@"photo_url"]];
|
2012-06-24 18:17:22 -07:00
|
|
|
avatarString = [avatarString stringByAppendingString:avatar];
|
|
|
|
}
|
2012-08-10 09:45:44 -07:00
|
|
|
|
2012-06-24 18:17:22 -07:00
|
|
|
return avatarString;
|
|
|
|
}
|
|
|
|
|
2012-08-07 11:27:00 -07:00
|
|
|
- (NSString *)getComments {
|
|
|
|
NSString *comments = @"<div class=\"NB-feed-story-comments\">";
|
2012-07-27 12:27:13 -07:00
|
|
|
|
2013-03-05 17:00:03 -08:00
|
|
|
if ([self.activeStory objectForKey:@"comment_count"] != [NSNull null] &&
|
|
|
|
[[self.activeStory objectForKey:@"comment_count"] intValue] > 0) {
|
2012-07-03 17:54:36 -07:00
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
NSDictionary *story = self.activeStory;
|
2012-07-20 00:21:24 -07:00
|
|
|
NSArray *friendsCommentsArray = [story objectForKey:@"friend_comments"];
|
2015-09-07 21:39:51 -07:00
|
|
|
NSArray *friendsShareArray = [story objectForKey:@"friend_shares"];
|
|
|
|
NSArray *publicCommentsArray = [story objectForKey:@"public_comments"];
|
2013-03-05 12:26:37 -08:00
|
|
|
|
2013-03-05 17:00:03 -08:00
|
|
|
if ([[story objectForKey:@"comment_count_friends"] intValue] > 0 ) {
|
|
|
|
NSString *commentHeader = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comments-friends-header-wrapper\">"
|
|
|
|
" <div class=\"NB-story-comments-friends-header\">%i comment%@</div>"
|
|
|
|
"</div>",
|
|
|
|
[[story objectForKey:@"comment_count_friends"] intValue],
|
|
|
|
[[story objectForKey:@"comment_count_friends"] intValue] == 1 ? @"" : @"s"];
|
|
|
|
comments = [comments stringByAppendingString:commentHeader];
|
|
|
|
|
|
|
|
// add friends comments
|
|
|
|
for (int i = 0; i < friendsCommentsArray.count; i++) {
|
|
|
|
NSString *comment = [self getComment:[friendsCommentsArray objectAtIndex:i]];
|
|
|
|
comments = [comments stringByAppendingString:comment];
|
|
|
|
}
|
2015-09-07 19:56:44 -07:00
|
|
|
}
|
|
|
|
|
2015-09-07 21:39:51 -07:00
|
|
|
NSInteger sharedByFriendsCount = [[story objectForKey:@"shared_by_friends"] count];
|
|
|
|
if (sharedByFriendsCount > 0 ) {
|
2015-09-07 19:56:44 -07:00
|
|
|
NSString *commentHeader = [NSString stringWithFormat:@
|
2015-09-07 21:39:51 -07:00
|
|
|
"<div class=\"NB-story-comments-friend-shares-header-wrapper\">"
|
|
|
|
" <div class=\"NB-story-comments-friends-header\">%ld share%@</div>"
|
2015-09-07 19:56:44 -07:00
|
|
|
"</div>",
|
2015-09-07 21:39:51 -07:00
|
|
|
(long)sharedByFriendsCount,
|
|
|
|
sharedByFriendsCount == 1 ? @"" : @"s"];
|
2015-09-07 19:56:44 -07:00
|
|
|
comments = [comments stringByAppendingString:commentHeader];
|
|
|
|
|
|
|
|
// add friends comments
|
2015-09-07 21:39:51 -07:00
|
|
|
for (int i = 0; i < friendsShareArray.count; i++) {
|
|
|
|
NSString *comment = [self getComment:[friendsShareArray objectAtIndex:i]];
|
2015-09-07 19:56:44 -07:00
|
|
|
comments = [comments stringByAppendingString:comment];
|
|
|
|
}
|
|
|
|
}
|
2012-08-07 11:27:00 -07:00
|
|
|
|
2013-07-19 17:53:52 -07:00
|
|
|
if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"show_public_comments"] boolValue] &&
|
|
|
|
[[story objectForKey:@"comment_count_public"] intValue] > 0 ) {
|
2012-08-07 11:27:00 -07:00
|
|
|
NSString *publicCommentHeader = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comments-public-header-wrapper\">"
|
2013-03-05 12:26:37 -08:00
|
|
|
" <div class=\"NB-story-comments-public-header\">%i public comment%@</div>"
|
2012-08-07 11:27:00 -07:00
|
|
|
"</div>",
|
|
|
|
[[story objectForKey:@"comment_count_public"] intValue],
|
|
|
|
[[story objectForKey:@"comment_count_public"] intValue] == 1 ? @"" : @"s"];
|
|
|
|
|
2013-03-05 12:26:37 -08:00
|
|
|
comments = [comments stringByAppendingString:@"</div>"];
|
2012-08-07 11:27:00 -07:00
|
|
|
comments = [comments stringByAppendingString:publicCommentHeader];
|
2013-03-05 12:26:37 -08:00
|
|
|
comments = [comments stringByAppendingFormat:@"<div class=\"NB-feed-story-comments\">"];
|
2013-03-05 17:00:03 -08:00
|
|
|
|
2013-03-05 12:26:37 -08:00
|
|
|
// add public comments
|
2012-08-07 11:27:00 -07:00
|
|
|
for (int i = 0; i < publicCommentsArray.count; i++) {
|
|
|
|
NSString *comment = [self getComment:[publicCommentsArray objectAtIndex:i]];
|
|
|
|
comments = [comments stringByAppendingString:comment];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-05 12:26:37 -08:00
|
|
|
comments = [comments stringByAppendingString:@"</div>"];
|
2012-08-07 11:27:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return comments;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString *)getShareBar {
|
2012-08-13 15:34:53 -07:00
|
|
|
NSString *comments = @"<div id=\"NB-share-bar-wrapper\">";
|
2012-08-10 09:45:44 -07:00
|
|
|
NSString *commentLabel = @"";
|
|
|
|
NSString *shareLabel = @"";
|
2012-08-13 15:34:53 -07:00
|
|
|
// NSString *replyStr = @"";
|
2012-08-10 09:45:44 -07:00
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
// if ([[self.activeStory objectForKey:@"reply_count"] intValue] == 1) {
|
2012-08-13 15:34:53 -07:00
|
|
|
// replyStr = [NSString stringWithFormat:@" and <b>1 reply</b>"];
|
2012-11-05 17:16:10 -08:00
|
|
|
// } else if ([[self.activeStory objectForKey:@"reply_count"] intValue] == 1) {
|
|
|
|
// replyStr = [NSString stringWithFormat:@" and <b>%@ replies</b>", [self.activeStory objectForKey:@"reply_count"]];
|
2012-08-13 15:34:53 -07:00
|
|
|
// }
|
2012-11-05 17:16:10 -08:00
|
|
|
if (![[self.activeStory objectForKey:@"comment_count"] isKindOfClass:[NSNull class]] &&
|
|
|
|
[[self.activeStory objectForKey:@"comment_count"] intValue]) {
|
2012-08-10 09:45:44 -07:00
|
|
|
commentLabel = [commentLabel stringByAppendingString:[NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comments-label\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
"%@" // comment count
|
|
|
|
//"%@" // reply count
|
2012-08-10 09:45:44 -07:00
|
|
|
"</div>"
|
|
|
|
"<div class=\"NB-story-share-profiles NB-story-share-profiles-comments\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
"%@" // friend avatars
|
|
|
|
"%@" // public avatars
|
2012-08-10 09:45:44 -07:00
|
|
|
"</div>",
|
2012-11-05 17:16:10 -08:00
|
|
|
[[self.activeStory objectForKey:@"comment_count"] intValue] == 1
|
2014-09-17 16:41:48 -07:00
|
|
|
? [NSString stringWithFormat:@"<b>1 comment</b>"] :
|
2012-11-05 17:16:10 -08:00
|
|
|
[NSString stringWithFormat:@"<b>%@ comments</b>", [self.activeStory objectForKey:@"comment_count"]],
|
2012-08-10 09:45:44 -07:00
|
|
|
|
2012-08-13 15:34:53 -07:00
|
|
|
//replyStr,
|
2012-08-10 09:45:44 -07:00
|
|
|
[self getAvatars:@"commented_by_friends"],
|
|
|
|
[self getAvatars:@"commented_by_public"]]];
|
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
if (![[self.activeStory objectForKey:@"share_count"] isKindOfClass:[NSNull class]] &&
|
|
|
|
[[self.activeStory objectForKey:@"share_count"] intValue]) {
|
2012-08-10 09:45:44 -07:00
|
|
|
shareLabel = [shareLabel stringByAppendingString:[NSString stringWithFormat:@
|
2012-08-13 15:34:53 -07:00
|
|
|
|
|
|
|
"<div class=\"NB-right\">"
|
|
|
|
"<div class=\"NB-story-share-profiles NB-story-share-profiles-shares\">"
|
2012-08-10 09:45:44 -07:00
|
|
|
"%@" // friend avatars
|
|
|
|
"%@" // public avatars
|
2012-08-13 15:34:53 -07:00
|
|
|
"</div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
"<div class=\"NB-story-share-label\">"
|
|
|
|
"%@" // comment count
|
|
|
|
"</div>"
|
2012-08-13 15:34:53 -07:00
|
|
|
"</div>",
|
|
|
|
[self getAvatars:@"shared_by_public"],
|
|
|
|
[self getAvatars:@"shared_by_friends"],
|
2012-11-05 17:16:10 -08:00
|
|
|
[[self.activeStory objectForKey:@"share_count"] intValue] == 1
|
2012-08-10 09:45:44 -07:00
|
|
|
? [NSString stringWithFormat:@"<b>1 share</b>"] :
|
2012-11-05 17:16:10 -08:00
|
|
|
[NSString stringWithFormat:@"<b>%@ shares</b>", [self.activeStory objectForKey:@"share_count"]]]];
|
2012-08-10 09:45:44 -07:00
|
|
|
}
|
2012-08-07 11:27:00 -07:00
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
if ([self.activeStory objectForKey:@"share_count"] != [NSNull null] &&
|
|
|
|
[[self.activeStory objectForKey:@"share_count"] intValue] > 0) {
|
2012-08-02 18:33:55 -07:00
|
|
|
|
2012-08-09 17:01:37 -07:00
|
|
|
comments = [comments stringByAppendingString:[NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-shares\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
"<div class=\"NB-story-comments-shares-teaser-wrapper\">"
|
|
|
|
"<div class=\"NB-story-comments-shares-teaser\">"
|
|
|
|
"%@"
|
|
|
|
"%@"
|
|
|
|
"</div>"
|
|
|
|
"</div>"
|
|
|
|
"</div>",
|
2012-08-10 09:45:44 -07:00
|
|
|
commentLabel,
|
|
|
|
shareLabel
|
2012-08-09 17:01:37 -07:00
|
|
|
]];
|
2012-06-22 15:53:51 -07:00
|
|
|
}
|
2012-08-13 15:34:53 -07:00
|
|
|
comments = [comments stringByAppendingString:[NSString stringWithFormat:@"</div>"]];
|
2012-06-22 15:53:51 -07:00
|
|
|
return comments;
|
|
|
|
}
|
2012-06-22 18:01:08 -07:00
|
|
|
|
2012-06-25 20:28:07 -07:00
|
|
|
- (NSString *)getComment:(NSDictionary *)commentDict {
|
2012-07-03 17:54:36 -07:00
|
|
|
|
2013-09-05 16:34:39 -07:00
|
|
|
NSDictionary *user = [appDelegate getUser:[[commentDict objectForKey:@"user_id"] intValue]];
|
2012-07-03 17:54:36 -07:00
|
|
|
NSString *userAvatarClass = @"NB-user-avatar";
|
|
|
|
NSString *userReshareString = @"";
|
2012-07-20 00:21:24 -07:00
|
|
|
NSString *userEditButton = @"";
|
2012-07-23 10:57:11 -07:00
|
|
|
NSString *userLikeButton = @"";
|
2012-07-20 00:21:24 -07:00
|
|
|
NSString *commentUserId = [NSString stringWithFormat:@"%@", [commentDict objectForKey:@"user_id"]];
|
2013-03-04 20:21:29 -08:00
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-12-13 14:24:47 -08:00
|
|
|
NSArray *likingUsersArray = [commentDict objectForKey:@"liking_users"];
|
|
|
|
NSString *likingUsers = @"";
|
2012-07-26 13:54:45 -07:00
|
|
|
|
2012-12-13 14:24:47 -08:00
|
|
|
if ([likingUsersArray count]) {
|
|
|
|
likingUsers = @"<div class=\"NB-story-comment-likes-icon\"></div>";
|
|
|
|
for (NSNumber *likingUser in likingUsersArray) {
|
2013-09-05 16:34:39 -07:00
|
|
|
NSDictionary *sourceUser = [appDelegate getUser:[likingUser intValue]];
|
2012-12-13 14:24:47 -08:00
|
|
|
NSString *likingUserString = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment-likes-user\">"
|
|
|
|
" <div class=\"NB-user-avatar\"><img src=\"%@\"></div>"
|
|
|
|
"</div>",
|
|
|
|
[sourceUser objectForKey:@"photo_url"]];
|
|
|
|
likingUsers = [likingUsers stringByAppendingString:likingUserString];
|
|
|
|
}
|
|
|
|
}
|
2012-07-20 00:21:24 -07:00
|
|
|
|
|
|
|
if ([commentUserId isEqualToString:currentUserId]) {
|
|
|
|
userEditButton = [NSString stringWithFormat:@
|
2012-07-23 10:57:11 -07:00
|
|
|
"<div class=\"NB-story-comment-edit-button NB-story-comment-share-edit-button NB-button\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
"<a href=\"http://ios.newsblur.com/edit-share/%@\"><div class=\"NB-story-comment-edit-button-wrapper\">"
|
|
|
|
"Edit"
|
|
|
|
"</div></a>"
|
2012-07-20 18:04:54 -07:00
|
|
|
"</div>",
|
|
|
|
commentUserId];
|
2012-07-23 10:57:11 -07:00
|
|
|
} else {
|
2012-07-26 13:54:45 -07:00
|
|
|
BOOL isInLikingUsers = NO;
|
2012-12-13 14:24:47 -08:00
|
|
|
for (int i = 0; i < likingUsersArray.count; i++) {
|
|
|
|
if ([[[likingUsersArray objectAtIndex:i] stringValue] isEqualToString:currentUserId]) {
|
2012-07-26 13:54:45 -07:00
|
|
|
isInLikingUsers = YES;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isInLikingUsers) {
|
|
|
|
userLikeButton = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment-like-button NB-button selected\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
"<a href=\"http://ios.newsblur.com/unlike-comment/%@\"><div class=\"NB-story-comment-like-button-wrapper\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
"<span class=\"NB-favorite-icon\"></span>"
|
2012-08-08 12:02:54 -07:00
|
|
|
"</div></a>"
|
2012-07-26 13:54:45 -07:00
|
|
|
"</div>",
|
|
|
|
commentUserId];
|
|
|
|
} else {
|
|
|
|
userLikeButton = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment-like-button NB-button\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
"<a href=\"http://ios.newsblur.com/like-comment/%@\"><div class=\"NB-story-comment-like-button-wrapper\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
"<span class=\"NB-favorite-icon\"></span>"
|
2012-08-08 12:02:54 -07:00
|
|
|
"</div></a>"
|
2012-07-26 13:54:45 -07:00
|
|
|
"</div>",
|
|
|
|
commentUserId];
|
|
|
|
}
|
|
|
|
|
2012-07-20 00:21:24 -07:00
|
|
|
}
|
2012-07-03 17:54:36 -07:00
|
|
|
|
|
|
|
if ([commentDict objectForKey:@"source_user_id"] != [NSNull null]) {
|
|
|
|
userAvatarClass = @"NB-user-avatar NB-story-comment-reshare";
|
|
|
|
|
2013-09-05 16:34:39 -07:00
|
|
|
NSDictionary *sourceUser = [appDelegate getUser:[[commentDict objectForKey:@"source_user_id"] intValue]];
|
2012-07-03 17:54:36 -07:00
|
|
|
userReshareString = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment-reshares\">"
|
|
|
|
" <div class=\"NB-story-share-profile\">"
|
|
|
|
" <div class=\"NB-user-avatar\"><img src=\"%@\"></div>"
|
|
|
|
" </div>"
|
|
|
|
"</div>",
|
2012-07-11 10:33:39 -07:00
|
|
|
[sourceUser objectForKey:@"photo_url"]];
|
2012-07-03 17:54:36 -07:00
|
|
|
}
|
2012-07-23 16:17:49 -07:00
|
|
|
|
|
|
|
NSString *commentContent = [self textToHtml:[commentDict objectForKey:@"comments"]];
|
2012-07-29 13:24:03 -07:00
|
|
|
|
|
|
|
NSString *comment;
|
2012-08-09 16:34:59 -07:00
|
|
|
NSString *locationHtml = @"";
|
|
|
|
NSString *location = [NSString stringWithFormat:@"%@", [user objectForKey:@"location"]];
|
|
|
|
|
2013-09-05 16:34:39 -07:00
|
|
|
if (location.length && ![[user objectForKey:@"location"] isKindOfClass:[NSNull class]]) {
|
2012-08-09 16:34:59 -07:00
|
|
|
locationHtml = [NSString stringWithFormat:@"<div class=\"NB-story-comment-location\">%@</div>", location];
|
|
|
|
}
|
2012-07-29 13:24:03 -07:00
|
|
|
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
comment = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment\" id=\"NB-user-comment-%@\">"
|
2012-12-11 11:50:06 -08:00
|
|
|
"<div class=\"%@\">"
|
|
|
|
"<a class=\"NB-show-profile\" href=\"http://ios.newsblur.com/show-profile/%@\">"
|
|
|
|
"<div class=\"NB-highlight\"></div>"
|
|
|
|
"<img src=\"%@\" />"
|
|
|
|
"</a>"
|
|
|
|
"</div>"
|
2012-07-29 13:24:03 -07:00
|
|
|
"<div class=\"NB-story-comment-author-container\">"
|
|
|
|
" %@"
|
|
|
|
" <div class=\"NB-story-comment-username\">%@</div>"
|
|
|
|
" <div class=\"NB-story-comment-date\">%@ ago</div>"
|
2012-12-13 14:24:47 -08:00
|
|
|
" <div class=\"NB-story-comment-likes\">%@</div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
"</div>"
|
|
|
|
"<div class=\"NB-story-comment-content\">%@</div>"
|
|
|
|
"%@" // location
|
|
|
|
"<div class=\"NB-button-wrapper\">"
|
2012-07-29 13:24:03 -07:00
|
|
|
" <div class=\"NB-story-comment-reply-button NB-button\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
" <a href=\"http://ios.newsblur.com/reply/%@/%@\"><div class=\"NB-story-comment-reply-button-wrapper\">"
|
|
|
|
" Reply"
|
|
|
|
" </div></a>"
|
2012-07-29 13:24:03 -07:00
|
|
|
" </div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
" %@" //User Like Button
|
|
|
|
" %@" //User Edit Button
|
2012-07-29 13:24:03 -07:00
|
|
|
"</div>"
|
|
|
|
"%@"
|
|
|
|
"</div>",
|
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
userAvatarClass,
|
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"photo_url"],
|
|
|
|
userReshareString,
|
|
|
|
[user objectForKey:@"username"],
|
|
|
|
[commentDict objectForKey:@"shared_date"],
|
2012-12-13 14:24:47 -08:00
|
|
|
likingUsers,
|
2012-12-11 17:53:17 -08:00
|
|
|
commentContent,
|
|
|
|
locationHtml,
|
2012-08-13 15:34:53 -07:00
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"username"],
|
2012-12-11 17:53:17 -08:00
|
|
|
userEditButton,
|
|
|
|
userLikeButton,
|
|
|
|
[self getReplies:[commentDict objectForKey:@"replies"] forUserId:[commentDict objectForKey:@"user_id"]]];
|
2012-07-29 13:24:03 -07:00
|
|
|
} else {
|
|
|
|
comment = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment\" id=\"NB-user-comment-%@\">"
|
2012-12-11 11:50:06 -08:00
|
|
|
"<div class=\"%@\">"
|
|
|
|
"<a class=\"NB-show-profile\" href=\"http://ios.newsblur.com/show-profile/%@\">"
|
|
|
|
"<div class=\"NB-highlight\"></div>"
|
|
|
|
"<img src=\"%@\" />"
|
|
|
|
"</a>"
|
|
|
|
"</div>"
|
2012-07-29 13:24:03 -07:00
|
|
|
"<div class=\"NB-story-comment-author-container\">"
|
2012-12-11 17:53:17 -08:00
|
|
|
" %@"
|
2012-07-29 13:24:03 -07:00
|
|
|
" <div class=\"NB-story-comment-username\">%@</div>"
|
|
|
|
" <div class=\"NB-story-comment-date\">%@ ago</div>"
|
2012-12-13 16:41:52 -08:00
|
|
|
" <div class=\"NB-story-comment-likes\">%@</div>"
|
2012-07-29 13:24:03 -07:00
|
|
|
"</div>"
|
2012-08-13 16:20:23 -07:00
|
|
|
"<div class=\"NB-story-comment-content\">%@</div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
"%@" // location
|
|
|
|
"<div class=\"NB-button-wrapper\">"
|
2012-07-29 13:24:03 -07:00
|
|
|
" <div class=\"NB-story-comment-reply-button NB-button\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
" <a href=\"http://ios.newsblur.com/reply/%@/%@\"><div class=\"NB-story-comment-reply-button-wrapper\">"
|
|
|
|
" Reply"
|
|
|
|
" </div></a>"
|
2012-07-29 13:24:03 -07:00
|
|
|
" </div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
" %@" // User Like Button
|
|
|
|
" %@" // User Edit Button
|
2012-07-29 13:24:03 -07:00
|
|
|
"</div>"
|
|
|
|
"%@"
|
|
|
|
"</div>",
|
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
userAvatarClass,
|
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"photo_url"],
|
|
|
|
userReshareString,
|
|
|
|
[user objectForKey:@"username"],
|
|
|
|
[commentDict objectForKey:@"shared_date"],
|
2012-12-13 16:41:52 -08:00
|
|
|
likingUsers,
|
2012-08-02 00:57:01 -07:00
|
|
|
commentContent,
|
2012-12-11 17:53:17 -08:00
|
|
|
locationHtml,
|
2012-08-13 16:20:23 -07:00
|
|
|
[commentDict objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"username"],
|
2012-12-11 17:53:17 -08:00
|
|
|
userEditButton,
|
|
|
|
userLikeButton,
|
2012-07-29 13:24:03 -07:00
|
|
|
[self getReplies:[commentDict objectForKey:@"replies"] forUserId:[commentDict objectForKey:@"user_id"]]];
|
2012-07-03 17:54:36 -07:00
|
|
|
|
2012-07-29 13:24:03 -07:00
|
|
|
}
|
|
|
|
|
2012-06-25 20:28:07 -07:00
|
|
|
return comment;
|
|
|
|
}
|
|
|
|
|
2012-07-20 15:54:10 -07:00
|
|
|
- (NSString *)getReplies:(NSArray *)replies forUserId:(NSString *)commentUserId {
|
2012-06-22 18:01:08 -07:00
|
|
|
NSString *repliesString = @"";
|
|
|
|
if (replies.count > 0) {
|
|
|
|
repliesString = [repliesString stringByAppendingString:@"<div class=\"NB-story-comment-replies\">"];
|
|
|
|
for (int i = 0; i < replies.count; i++) {
|
2012-07-20 15:54:10 -07:00
|
|
|
NSDictionary *replyDict = [replies objectAtIndex:i];
|
2013-09-05 16:34:39 -07:00
|
|
|
NSDictionary *user = [appDelegate getUser:[[replyDict objectForKey:@"user_id"] intValue]];
|
2012-07-20 15:54:10 -07:00
|
|
|
|
|
|
|
NSString *userEditButton = @"";
|
|
|
|
NSString *replyUserId = [NSString stringWithFormat:@"%@", [replyDict objectForKey:@"user_id"]];
|
2012-07-30 14:58:57 -07:00
|
|
|
NSString *replyId = [replyDict objectForKey:@"reply_id"];
|
2013-03-04 20:21:29 -08:00
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-07-20 15:54:10 -07:00
|
|
|
|
|
|
|
if ([replyUserId isEqualToString:currentUserId]) {
|
|
|
|
userEditButton = [NSString stringWithFormat:@
|
2012-07-23 10:57:11 -07:00
|
|
|
"<div class=\"NB-story-comment-edit-button NB-story-comment-share-edit-button NB-button\">"
|
2012-08-08 12:02:54 -07:00
|
|
|
"<a href=\"http://ios.newsblur.com/edit-reply/%@/%@/%@\">"
|
2012-07-20 15:54:10 -07:00
|
|
|
"<div class=\"NB-story-comment-edit-button-wrapper\">"
|
2012-08-13 16:20:23 -07:00
|
|
|
"Edit"
|
2012-07-20 15:54:10 -07:00
|
|
|
"</div>"
|
2012-08-08 12:02:54 -07:00
|
|
|
"</a>"
|
2012-07-20 15:54:10 -07:00
|
|
|
"</div>",
|
|
|
|
commentUserId,
|
|
|
|
replyUserId,
|
2012-07-30 14:58:57 -07:00
|
|
|
replyId
|
2012-07-20 15:54:10 -07:00
|
|
|
];
|
|
|
|
}
|
2012-07-23 16:17:49 -07:00
|
|
|
|
|
|
|
NSString *replyContent = [self textToHtml:[replyDict objectForKey:@"comments"]];
|
2012-08-09 16:45:52 -07:00
|
|
|
|
|
|
|
NSString *locationHtml = @"";
|
|
|
|
NSString *location = [NSString stringWithFormat:@"%@", [user objectForKey:@"location"]];
|
|
|
|
|
|
|
|
if (location.length) {
|
|
|
|
locationHtml = [NSString stringWithFormat:@"<div class=\"NB-story-comment-location\">%@</div>", location];
|
|
|
|
}
|
2012-07-21 18:25:56 -07:00
|
|
|
|
2012-08-13 15:34:53 -07:00
|
|
|
NSString *reply;
|
|
|
|
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
reply = [NSString stringWithFormat:@
|
2012-12-11 17:53:17 -08:00
|
|
|
"<div class=\"NB-story-comment-reply\" id=\"NB-user-comment-%@\">"
|
|
|
|
" <a class=\"NB-show-profile\" href=\"http://ios.newsblur.com/show-profile/%@\">"
|
|
|
|
" <div class=\"NB-highlight\"></div>"
|
|
|
|
" <img class=\"NB-story-comment-reply-photo\" src=\"%@\" />"
|
|
|
|
" </a>"
|
|
|
|
" <div class=\"NB-story-comment-username NB-story-comment-reply-username\">%@</div>"
|
|
|
|
" <div class=\"NB-story-comment-date NB-story-comment-reply-date\">%@ ago</div>"
|
|
|
|
" <div class=\"NB-story-comment-reply-content\">%@</div>"
|
|
|
|
" %@" // location
|
|
|
|
" <div class=\"NB-button-wrapper\">"
|
|
|
|
" %@" // edit
|
|
|
|
" </div>"
|
|
|
|
"</div>",
|
|
|
|
[replyDict objectForKey:@"reply_id"],
|
|
|
|
[user objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"photo_url"],
|
|
|
|
[user objectForKey:@"username"],
|
|
|
|
[replyDict objectForKey:@"publish_date"],
|
|
|
|
replyContent,
|
|
|
|
locationHtml,
|
|
|
|
userEditButton];
|
2012-08-13 15:34:53 -07:00
|
|
|
} else {
|
2012-08-13 16:20:23 -07:00
|
|
|
reply = [NSString stringWithFormat:@
|
|
|
|
"<div class=\"NB-story-comment-reply\" id=\"NB-user-comment-%@\">"
|
|
|
|
" <a class=\"NB-show-profile\" href=\"http://ios.newsblur.com/show-profile/%@\">"
|
2012-12-11 11:50:06 -08:00
|
|
|
" <div class=\"NB-highlight\"></div>"
|
2012-08-13 16:20:23 -07:00
|
|
|
" <img class=\"NB-story-comment-reply-photo\" src=\"%@\" />"
|
|
|
|
" </a>"
|
|
|
|
" <div class=\"NB-story-comment-username NB-story-comment-reply-username\">%@</div>"
|
|
|
|
" <div class=\"NB-story-comment-date NB-story-comment-reply-date\">%@ ago</div>"
|
|
|
|
" <div class=\"NB-story-comment-reply-content\">%@</div>"
|
2012-12-11 17:53:17 -08:00
|
|
|
" %@"
|
|
|
|
" <div class=\"NB-button-wrapper\">"
|
|
|
|
" %@" // edit
|
|
|
|
" </div>"
|
2012-08-13 16:20:23 -07:00
|
|
|
"</div>",
|
|
|
|
[replyDict objectForKey:@"reply_id"],
|
|
|
|
[user objectForKey:@"user_id"],
|
|
|
|
[user objectForKey:@"photo_url"],
|
|
|
|
[user objectForKey:@"username"],
|
|
|
|
[replyDict objectForKey:@"publish_date"],
|
|
|
|
replyContent,
|
2012-12-11 17:53:17 -08:00
|
|
|
locationHtml,
|
2012-08-13 16:20:23 -07:00
|
|
|
userEditButton];
|
2012-08-13 15:34:53 -07:00
|
|
|
}
|
2012-06-22 18:01:08 -07:00
|
|
|
repliesString = [repliesString stringByAppendingString:reply];
|
|
|
|
}
|
|
|
|
repliesString = [repliesString stringByAppendingString:@"</div>"];
|
|
|
|
}
|
|
|
|
return repliesString;
|
|
|
|
}
|
|
|
|
|
2012-10-04 10:59:44 -07:00
|
|
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
|
|
|
|
2013-02-06 15:15:43 -08:00
|
|
|
if ([keyPath isEqual:@"contentOffset"]) {
|
2013-03-06 14:29:40 -08:00
|
|
|
if (self.webView.scrollView.contentOffset.y < (-1 * self.feedTitleGradient.frame.size.height + 1 + self.webView.scrollView.scrollIndicatorInsets.top)) {
|
2012-10-04 10:59:44 -07:00
|
|
|
// Pulling
|
|
|
|
if (!pullingScrollview) {
|
|
|
|
pullingScrollview = YES;
|
|
|
|
|
|
|
|
for (id subview in self.webView.scrollView.subviews) {
|
|
|
|
UIImageView *imgView = [subview isKindOfClass:[UIImageView class]] ?
|
|
|
|
(UIImageView*)subview : nil;
|
|
|
|
// image views whose image is 1px wide are shadow images, hide them
|
2013-03-06 14:29:40 -08:00
|
|
|
if (imgView && imgView.image.size.width > 1) {
|
|
|
|
[self.webView.scrollView insertSubview:self.feedTitleGradient
|
|
|
|
belowSubview:subview];
|
|
|
|
[self.webView.scrollView bringSubviewToFront:subview];
|
2012-10-04 10:59:44 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Normal reading
|
|
|
|
if (pullingScrollview) {
|
|
|
|
pullingScrollview = NO;
|
|
|
|
[self.feedTitleGradient.layer setShadowOpacity:0];
|
|
|
|
[self.webView insertSubview:self.feedTitleGradient aboveSubview:self.webView.scrollView];
|
|
|
|
|
|
|
|
self.feedTitleGradient.frame = CGRectMake(0, -1,
|
|
|
|
self.feedTitleGradient.frame.size.width,
|
|
|
|
self.feedTitleGradient.frame.size.height);
|
|
|
|
|
|
|
|
for (id subview in self.webView.scrollView.subviews) {
|
|
|
|
UIImageView *imgView = [subview isKindOfClass:[UIImageView class]] ?
|
|
|
|
(UIImageView*)subview : nil;
|
|
|
|
// image views whose image is 1px wide are shadow images, hide them
|
|
|
|
if (imgView && imgView.image.size.width == 1) {
|
|
|
|
imgView.hidden = NO;
|
|
|
|
}
|
|
|
|
}
|
2011-10-28 10:51:03 -07:00
|
|
|
}
|
2011-10-27 19:05:38 -07:00
|
|
|
}
|
2013-03-06 14:29:40 -08:00
|
|
|
|
2013-03-07 10:55:23 -05:00
|
|
|
if (appDelegate.storyPageControl.currentPage != self) return;
|
|
|
|
|
|
|
|
int webpageHeight = self.webView.scrollView.contentSize.height;
|
|
|
|
int viewportHeight = self.webView.scrollView.frame.size.height;
|
|
|
|
int topPosition = self.webView.scrollView.contentOffset.y;
|
|
|
|
int bottomPosition = webpageHeight - topPosition - viewportHeight;
|
2014-05-21 13:21:40 -07:00
|
|
|
BOOL singlePage = webpageHeight - 200 <= viewportHeight;
|
|
|
|
BOOL atBottom = bottomPosition < 150;
|
2013-03-07 10:55:23 -05:00
|
|
|
BOOL atTop = topPosition < 10;
|
2014-05-21 13:21:40 -07:00
|
|
|
if (!atTop && !atBottom && !singlePage) {
|
2013-03-06 14:29:40 -08:00
|
|
|
// Hide
|
|
|
|
[UIView animateWithDuration:.3 delay:0
|
|
|
|
options:UIViewAnimationOptionCurveEaseInOut
|
|
|
|
animations:^{
|
|
|
|
appDelegate.storyPageControl.traverseView.alpha = 0;
|
|
|
|
} completion:^(BOOL finished) {
|
|
|
|
|
|
|
|
}];
|
2013-03-13 14:05:58 -07:00
|
|
|
} else if (singlePage) {
|
|
|
|
CGRect tvf = appDelegate.storyPageControl.traverseView.frame;
|
|
|
|
if (bottomPosition > 0) {
|
|
|
|
appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
|
|
|
|
self.webView.scrollView.frame.size.height - tvf.size.height,
|
|
|
|
tvf.size.width, tvf.size.height);
|
|
|
|
} else {
|
|
|
|
appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
|
|
|
|
(self.webView.scrollView.contentSize.height - self.webView.scrollView.contentOffset.y) - tvf.size.height,
|
|
|
|
tvf.size.width, tvf.size.height);
|
|
|
|
}
|
2013-03-07 10:55:23 -05:00
|
|
|
} else if (!singlePage && (atTop && !atBottom)) {
|
2013-03-13 14:05:58 -07:00
|
|
|
// Pin to bottom of viewport, regardless of scrollview
|
2013-03-07 10:55:23 -05:00
|
|
|
appDelegate.storyPageControl.traversePinned = YES;
|
|
|
|
appDelegate.storyPageControl.traverseFloating = NO;
|
2013-03-06 14:29:40 -08:00
|
|
|
CGRect tvf = appDelegate.storyPageControl.traverseView.frame;
|
|
|
|
appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
|
|
|
|
self.webView.scrollView.frame.size.height - tvf.size.height,
|
|
|
|
tvf.size.width, tvf.size.height);
|
|
|
|
[UIView animateWithDuration:.3 delay:0
|
|
|
|
options:UIViewAnimationOptionCurveEaseInOut
|
|
|
|
animations:^{
|
|
|
|
appDelegate.storyPageControl.traverseView.alpha = 1;
|
2013-07-17 18:14:04 -07:00
|
|
|
} completion:nil];
|
2013-03-07 10:55:23 -05:00
|
|
|
} else if (appDelegate.storyPageControl.traverseView.alpha == 1 &&
|
2013-03-13 14:05:58 -07:00
|
|
|
appDelegate.storyPageControl.traversePinned) {
|
2013-03-07 10:55:23 -05:00
|
|
|
// Scroll with bottom of scrollview, but smoothly
|
|
|
|
appDelegate.storyPageControl.traverseFloating = YES;
|
|
|
|
CGRect tvf = appDelegate.storyPageControl.traverseView.frame;
|
|
|
|
[UIView animateWithDuration:.3 delay:0
|
|
|
|
options:UIViewAnimationOptionCurveEaseInOut
|
|
|
|
animations:^{
|
|
|
|
appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
|
|
|
|
(self.webView.scrollView.contentSize.height - self.webView.scrollView.contentOffset.y) - tvf.size.height,
|
|
|
|
tvf.size.width, tvf.size.height);
|
|
|
|
} completion:^(BOOL finished) {
|
2013-03-13 14:05:58 -07:00
|
|
|
appDelegate.storyPageControl.traversePinned = NO;
|
2013-03-07 10:55:23 -05:00
|
|
|
}];
|
2013-03-06 14:29:40 -08:00
|
|
|
} else {
|
|
|
|
// Scroll with bottom of scrollview
|
2013-03-07 10:55:23 -05:00
|
|
|
appDelegate.storyPageControl.traversePinned = NO;
|
|
|
|
appDelegate.storyPageControl.traverseFloating = YES;
|
2013-03-06 14:29:40 -08:00
|
|
|
appDelegate.storyPageControl.traverseView.alpha = 1;
|
|
|
|
CGRect tvf = appDelegate.storyPageControl.traverseView.frame;
|
|
|
|
appDelegate.storyPageControl.traverseView.frame = CGRectMake(tvf.origin.x,
|
|
|
|
(self.webView.scrollView.contentSize.height - self.webView.scrollView.contentOffset.y) - tvf.size.height,
|
|
|
|
tvf.size.width, tvf.size.height);
|
|
|
|
}
|
2011-10-27 19:05:38 -07:00
|
|
|
}
|
2011-10-30 22:17:35 -07:00
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
- (void)setActiveStoryAtIndex:(NSInteger)activeStoryIndex {
|
|
|
|
if (activeStoryIndex >= 0) {
|
2014-02-12 20:09:37 -08:00
|
|
|
self.activeStory = [[appDelegate.storiesCollection.activeFeedStories
|
|
|
|
objectAtIndex:activeStoryIndex] mutableCopy];
|
2012-11-05 17:16:10 -08:00
|
|
|
} else {
|
2013-10-07 10:02:44 -07:00
|
|
|
self.activeStory = [appDelegate.activeStory mutableCopy];
|
2012-11-05 17:16:10 -08:00
|
|
|
}
|
2011-12-01 09:01:18 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL)webView:(UIWebView *)webView
|
2012-12-13 12:40:05 -08:00
|
|
|
shouldStartLoadWithRequest:(NSURLRequest *)request
|
2011-12-01 09:01:18 -08:00
|
|
|
navigationType:(UIWebViewNavigationType)navigationType {
|
2012-06-25 23:06:16 -07:00
|
|
|
NSURL *url = [request URL];
|
|
|
|
NSArray *urlComponents = [url pathComponents];
|
2012-07-23 16:17:49 -07:00
|
|
|
NSString *action = @"";
|
2012-12-27 18:37:05 -08:00
|
|
|
NSString *feedId = [NSString stringWithFormat:@"%@", [self.activeStory
|
|
|
|
objectForKey:@"story_feed_id"]];
|
2012-07-23 16:17:49 -07:00
|
|
|
if ([urlComponents count] > 1) {
|
|
|
|
action = [NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:1]];
|
|
|
|
}
|
2012-12-13 12:40:05 -08:00
|
|
|
|
2013-03-04 17:15:50 -08:00
|
|
|
// NSLog(@"Tapped url: %@", url);
|
2012-06-25 23:06:16 -07:00
|
|
|
// HACK: Using ios.newsblur.com to intercept the javascript share, reply, and edit events.
|
|
|
|
// the pathComponents do not work correctly unless it is a correctly formed url
|
|
|
|
// Is there a better way? Someone show me the light
|
|
|
|
if ([[url host] isEqualToString: @"ios.newsblur.com"]){
|
2012-07-27 12:27:13 -07:00
|
|
|
// reset the active comment
|
|
|
|
appDelegate.activeComment = nil;
|
|
|
|
appDelegate.activeShareType = action;
|
|
|
|
|
2012-07-20 15:54:10 -07:00
|
|
|
if ([action isEqualToString:@"reply"] ||
|
|
|
|
[action isEqualToString:@"edit-reply"] ||
|
2012-07-26 13:54:45 -07:00
|
|
|
[action isEqualToString:@"edit-share"] ||
|
|
|
|
[action isEqualToString:@"like-comment"] ||
|
|
|
|
[action isEqualToString:@"unlike-comment"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
|
2012-07-20 00:21:24 -07:00
|
|
|
// search for the comment from friends comments
|
2012-11-05 17:16:10 -08:00
|
|
|
NSArray *friendComments = [self.activeStory objectForKey:@"friend_comments"];
|
2012-07-20 00:21:24 -07:00
|
|
|
for (int i = 0; i < friendComments.count; i++) {
|
2012-06-25 23:06:16 -07:00
|
|
|
NSString *userId = [NSString stringWithFormat:@"%@",
|
2012-07-20 00:21:24 -07:00
|
|
|
[[friendComments objectAtIndex:i] objectForKey:@"user_id"]];
|
2012-06-25 23:06:16 -07:00
|
|
|
if([userId isEqualToString:[NSString stringWithFormat:@"%@",
|
|
|
|
[urlComponents objectAtIndex:2]]]){
|
2012-07-20 00:21:24 -07:00
|
|
|
appDelegate.activeComment = [friendComments objectAtIndex:i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (appDelegate.activeComment == nil) {
|
2012-11-05 17:16:10 -08:00
|
|
|
NSArray *publicComments = [self.activeStory objectForKey:@"public_comments"];
|
2012-07-20 00:21:24 -07:00
|
|
|
for (int i = 0; i < publicComments.count; i++) {
|
|
|
|
NSString *userId = [NSString stringWithFormat:@"%@",
|
|
|
|
[[publicComments objectAtIndex:i] objectForKey:@"user_id"]];
|
|
|
|
if([userId isEqualToString:[NSString stringWithFormat:@"%@",
|
|
|
|
[urlComponents objectAtIndex:2]]]){
|
|
|
|
appDelegate.activeComment = [publicComments objectAtIndex:i];
|
|
|
|
}
|
2012-06-25 18:05:25 -07:00
|
|
|
}
|
|
|
|
}
|
2012-07-20 15:54:10 -07:00
|
|
|
|
2012-07-27 12:27:13 -07:00
|
|
|
if (appDelegate.activeComment == nil) {
|
|
|
|
NSLog(@"PROBLEM! the active comment was not found in friend or public comments");
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
2012-07-20 15:54:10 -07:00
|
|
|
if ([action isEqualToString:@"reply"]) {
|
|
|
|
[appDelegate showShareView:@"reply"
|
|
|
|
setUserId:[NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:2]]
|
|
|
|
setUsername:[NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:3]]
|
2012-07-30 14:58:57 -07:00
|
|
|
setReplyId:nil];
|
2012-07-20 15:54:10 -07:00
|
|
|
} else if ([action isEqualToString:@"edit-reply"]) {
|
|
|
|
[appDelegate showShareView:@"edit-reply"
|
|
|
|
setUserId:[NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:2]]
|
|
|
|
setUsername:nil
|
2012-07-30 14:58:57 -07:00
|
|
|
setReplyId:[NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:4]]];
|
2012-07-20 15:54:10 -07:00
|
|
|
} else if ([action isEqualToString:@"edit-share"]) {
|
|
|
|
[appDelegate showShareView:@"edit-share"
|
|
|
|
setUserId:nil
|
|
|
|
setUsername:nil
|
2012-07-30 14:58:57 -07:00
|
|
|
setReplyId:nil];
|
2012-07-26 13:54:45 -07:00
|
|
|
} else if ([action isEqualToString:@"like-comment"]) {
|
|
|
|
[self toggleLikeComment:YES];
|
|
|
|
} else if ([action isEqualToString:@"unlike-comment"]) {
|
|
|
|
[self toggleLikeComment:NO];
|
2012-07-20 15:54:10 -07:00
|
|
|
}
|
|
|
|
return NO;
|
2012-06-25 23:06:16 -07:00
|
|
|
} else if ([action isEqualToString:@"share"]) {
|
2012-10-15 09:16:01 -07:00
|
|
|
[self openShareDialog];
|
2012-12-07 17:18:31 -08:00
|
|
|
return NO;
|
2013-09-26 19:26:10 -07:00
|
|
|
} else if ([action isEqualToString:@"train"] && [urlComponents count] > 5) {
|
2012-12-27 23:04:25 -08:00
|
|
|
[self openTrainingDialog:[[urlComponents objectAtIndex:2] intValue]
|
|
|
|
yCoordinate:[[urlComponents objectAtIndex:3] intValue]
|
|
|
|
width:[[urlComponents objectAtIndex:4] intValue]
|
|
|
|
height:[[urlComponents objectAtIndex:5] intValue]];
|
|
|
|
return NO;
|
2014-05-21 12:24:22 -07:00
|
|
|
} else if ([action isEqualToString:@"save"]) {
|
2014-12-16 15:36:58 -08:00
|
|
|
BOOL isSaved = [appDelegate.storiesCollection toggleStorySaved:self.activeStory];
|
|
|
|
if (isSaved) {
|
|
|
|
[self openUserTagsDialog:[[urlComponents objectAtIndex:3] intValue]
|
|
|
|
yCoordinate:[[urlComponents objectAtIndex:4] intValue]
|
|
|
|
width:[[urlComponents objectAtIndex:5] intValue]
|
|
|
|
height:[[urlComponents objectAtIndex:6] intValue]];
|
|
|
|
}
|
2014-05-20 18:43:37 -07:00
|
|
|
return NO;
|
2014-11-10 16:00:59 -08:00
|
|
|
} else if ([action isEqualToString:@"remove-user-tag"] || [action isEqualToString:@"add-user-tag"]) {
|
|
|
|
[self openUserTagsDialog:[[urlComponents objectAtIndex:3] intValue]
|
|
|
|
yCoordinate:[[urlComponents objectAtIndex:4] intValue]
|
|
|
|
width:[[urlComponents objectAtIndex:5] intValue]
|
|
|
|
height:[[urlComponents objectAtIndex:6] intValue]];
|
|
|
|
return NO;
|
2012-12-07 17:18:31 -08:00
|
|
|
} else if ([action isEqualToString:@"classify-author"]) {
|
|
|
|
NSString *author = [NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:2]];
|
2012-12-27 18:37:05 -08:00
|
|
|
[self.appDelegate toggleAuthorClassifier:author feedId:feedId];
|
2012-12-07 17:18:31 -08:00
|
|
|
return NO;
|
|
|
|
} else if ([action isEqualToString:@"classify-tag"]) {
|
|
|
|
NSString *tag = [NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:2]];
|
2012-12-27 18:37:05 -08:00
|
|
|
[self.appDelegate toggleTagClassifier:tag feedId:feedId];
|
2012-12-07 17:18:31 -08:00
|
|
|
return NO;
|
2013-09-26 19:26:10 -07:00
|
|
|
} else if ([action isEqualToString:@"show-profile"] && [urlComponents count] > 6) {
|
2012-07-03 17:54:36 -07:00
|
|
|
appDelegate.activeUserProfileId = [NSString stringWithFormat:@"%@", [urlComponents objectAtIndex:2]];
|
2012-07-28 14:15:20 -07:00
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
for (int i = 0; i < appDelegate.storiesCollection.activeFeedUserProfiles.count; i++) {
|
|
|
|
NSString *userId = [NSString stringWithFormat:@"%@", [[appDelegate.storiesCollection.activeFeedUserProfiles objectAtIndex:i] objectForKey:@"user_id"]];
|
2012-07-28 14:15:20 -07:00
|
|
|
if ([userId isEqualToString:appDelegate.activeUserProfileId]){
|
2014-02-12 20:09:37 -08:00
|
|
|
appDelegate.activeUserProfileName = [NSString stringWithFormat:@"%@", [[appDelegate.storiesCollection.activeFeedUserProfiles objectAtIndex:i] objectForKey:@"username"]];
|
2012-07-28 14:15:20 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-03 17:54:36 -07:00
|
|
|
[self showUserProfile:[urlComponents objectAtIndex:2]
|
|
|
|
xCoordinate:[[urlComponents objectAtIndex:3] intValue]
|
|
|
|
yCoordinate:[[urlComponents objectAtIndex:4] intValue]
|
|
|
|
width:[[urlComponents objectAtIndex:5] intValue]
|
|
|
|
height:[[urlComponents objectAtIndex:6] intValue]];
|
2012-07-01 21:58:55 -07:00
|
|
|
return NO;
|
2012-06-22 13:15:31 -07:00
|
|
|
}
|
2012-12-13 16:41:52 -08:00
|
|
|
} else if ([url.host hasSuffix:@"itunes.apple.com"]) {
|
|
|
|
[[UIApplication sharedApplication] openURL:url];
|
|
|
|
return NO;
|
2011-12-01 09:01:18 -08:00
|
|
|
}
|
2012-12-13 16:41:52 -08:00
|
|
|
|
2012-06-25 23:06:16 -07:00
|
|
|
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
|
2014-10-30 17:26:34 -07:00
|
|
|
// NSLog(@"Link clicked, views: %@ = %@", appDelegate.navigationController.topViewController, appDelegate.masterContainerViewController.childViewControllers);
|
|
|
|
if (appDelegate.isPresentingActivities) return NO;
|
2014-09-26 14:38:28 -07:00
|
|
|
NSArray *subviews;
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
subviews = [UIViewController
|
|
|
|
osk_parentMostViewControllerForPresentingViewController:
|
|
|
|
appDelegate.storyPageControl].view.subviews;
|
|
|
|
} else {
|
|
|
|
subviews = [UIViewController
|
|
|
|
osk_parentMostViewControllerForPresentingViewController:
|
|
|
|
appDelegate.storyPageControl].view.subviews;
|
|
|
|
}
|
|
|
|
for (UIView *view in subviews) {
|
2014-10-30 17:26:34 -07:00
|
|
|
// NSLog(@" View? %@ - %d - %@", view, [view isFirstResponder], [view firstAvailableUIViewController]);
|
2014-09-26 14:38:28 -07:00
|
|
|
if ([[view firstAvailableUIViewController]
|
|
|
|
isKindOfClass:[OSKActivitySheetViewController class]]) {
|
2014-09-17 19:02:12 -07:00
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-25 23:06:16 -07:00
|
|
|
[appDelegate showOriginalStory:url];
|
|
|
|
return NO;
|
|
|
|
}
|
2014-09-17 19:02:12 -07:00
|
|
|
|
2011-12-01 09:01:18 -08:00
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
2014-02-03 18:54:50 -08:00
|
|
|
- (void)showOriginalStory:(UIGestureRecognizer *)gesture {
|
|
|
|
NSURL *url = [NSURL URLWithString:[appDelegate.activeStory
|
|
|
|
objectForKey:@"story_permalink"]];
|
|
|
|
[appDelegate.masterContainerViewController hidePopover];
|
|
|
|
|
2014-02-04 12:40:46 -08:00
|
|
|
if (!gesture || [gesture isKindOfClass:[UITapGestureRecognizer class]]) {
|
2014-02-03 18:54:50 -08:00
|
|
|
[appDelegate showOriginalStory:url];
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ([gesture isKindOfClass:[UIPinchGestureRecognizer class]] &&
|
|
|
|
gesture.state == UIGestureRecognizerStateChanged &&
|
|
|
|
[gesture numberOfTouches] >= 2) {
|
|
|
|
CGPoint touch1 = [gesture locationOfTouch:0 inView:self.view];
|
|
|
|
CGPoint touch2 = [gesture locationOfTouch:1 inView:self.view];
|
|
|
|
CGPoint slope = CGPointMake(touch2.x-touch1.x, touch2.y-touch1.y);
|
|
|
|
CGFloat distance = sqrtf(slope.x*slope.x + slope.y*slope.y);
|
|
|
|
CGFloat scale = [(UIPinchGestureRecognizer *)gesture scale];
|
|
|
|
|
2014-02-04 12:40:46 -08:00
|
|
|
// NSLog(@"Gesture: %f - %f", [(UIPinchGestureRecognizer *)gesture scale], distance);
|
2014-02-03 18:54:50 -08:00
|
|
|
|
|
|
|
if ((distance < 150 && scale <= 1.5) ||
|
|
|
|
(distance < 500 && scale <= 1.2)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
[appDelegate showOriginalStory:url];
|
|
|
|
gesture.enabled = NO;
|
|
|
|
gesture.enabled = YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-03 17:54:36 -07:00
|
|
|
- (void)showUserProfile:(NSString *)userId xCoordinate:(int)x yCoordinate:(int)y width:(int)width height:(int)height {
|
2012-07-28 14:15:20 -07:00
|
|
|
CGRect frame = CGRectZero;
|
2012-07-12 22:05:23 -07:00
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
2012-07-25 17:34:45 -07:00
|
|
|
// only adjust for the bar if user is scrolling
|
2014-02-12 20:09:37 -08:00
|
|
|
if (appDelegate.storiesCollection.isRiverView ||
|
2014-05-20 15:29:16 -07:00
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
2014-10-22 17:03:48 -07:00
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) {
|
2012-10-04 10:59:44 -07:00
|
|
|
if (self.webView.scrollView.contentOffset.y == -20) {
|
|
|
|
y = y + 20;
|
2012-07-25 17:34:45 -07:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (self.webView.scrollView.contentOffset.y == -9) {
|
|
|
|
y = y + 9;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-28 12:56:51 -07:00
|
|
|
frame = CGRectMake(x, y, width, height);
|
|
|
|
}
|
|
|
|
[appDelegate showUserProfileModal:[NSValue valueWithCGRect:frame]];
|
2012-07-03 17:54:36 -07:00
|
|
|
}
|
|
|
|
|
2011-12-01 09:01:18 -08:00
|
|
|
- (void)webViewDidStartLoad:(UIWebView *)webView {
|
2014-05-15 18:06:56 -07:00
|
|
|
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
|
2013-11-23 13:03:14 -08:00
|
|
|
[self changeFontSize:[userPreferences stringForKey:@"story_font_size"]];
|
2014-05-15 18:06:56 -07:00
|
|
|
[self changeLineSpacing:[userPreferences stringForKey:@"story_line_spacing"]];
|
2012-06-24 23:02:37 -07:00
|
|
|
|
2011-12-01 09:01:18 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)webViewDidFinishLoad:(UIWebView *)webView {
|
2012-07-31 23:49:51 -07:00
|
|
|
[MBProgressHUD hideHUDForView:self.view animated:YES];
|
2012-11-09 14:13:44 -08:00
|
|
|
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
|
2013-11-23 13:03:14 -08:00
|
|
|
[self changeFontSize:[userPreferences stringForKey:@"story_font_size"]];
|
2014-05-15 18:06:56 -07:00
|
|
|
[self changeLineSpacing:[userPreferences stringForKey:@"story_line_spacing"]];
|
2014-09-17 19:02:12 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"];
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
if ([appDelegate.storiesCollection.activeFeedStories count] &&
|
2012-11-28 16:24:15 -08:00
|
|
|
self.activeStoryId &&
|
|
|
|
![self.webView.request.URL.absoluteString isEqualToString:@"about:blank"]) {
|
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .15 * NSEC_PER_SEC),
|
2013-06-17 11:50:13 -07:00
|
|
|
dispatch_get_main_queue(), ^{
|
2012-11-28 16:24:15 -08:00
|
|
|
[self checkTryFeedStory];
|
|
|
|
});
|
|
|
|
}
|
2012-11-13 12:28:16 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)checkTryFeedStory {
|
2012-07-31 23:49:51 -07:00
|
|
|
// see if it's a tryfeed for animation
|
2012-11-09 14:13:44 -08:00
|
|
|
if (!self.webView.hidden &&
|
|
|
|
appDelegate.tryFeedCategory &&
|
2014-02-12 20:41:29 -08:00
|
|
|
([[self.activeStory objectForKey:@"id"] isEqualToString:appDelegate.tryFeedStoryId] ||
|
|
|
|
[[self.activeStory objectForKey:@"story_hash"] isEqualToString:appDelegate.tryFeedStoryId])) {
|
2012-11-09 14:13:44 -08:00
|
|
|
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:YES];
|
2012-11-13 12:28:16 -08:00
|
|
|
|
2012-07-31 23:49:51 -07:00
|
|
|
if ([appDelegate.tryFeedCategory isEqualToString:@"comment_like"] ||
|
|
|
|
[appDelegate.tryFeedCategory isEqualToString:@"comment_reply"]) {
|
2013-03-04 20:21:29 -08:00
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-08-01 12:41:02 -07:00
|
|
|
NSString *jsFlashString = [[NSString alloc] initWithFormat:@"slideToComment('%@', true, true);", currentUserId];
|
2012-07-31 23:49:51 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsFlashString];
|
2012-11-28 16:24:15 -08:00
|
|
|
} else if ([appDelegate.tryFeedCategory isEqualToString:@"story_reshare"] ||
|
|
|
|
[appDelegate.tryFeedCategory isEqualToString:@"reply_reply"]) {
|
2012-11-05 17:16:10 -08:00
|
|
|
NSString *blurblogUserId = [NSString stringWithFormat:@"%@", [self.activeStory objectForKey:@"social_user_id"]];
|
2012-11-28 16:24:15 -08:00
|
|
|
NSString *jsFlashString = [[NSString alloc] initWithFormat:@"slideToComment('%@', true, true);", blurblogUserId];
|
2012-08-01 12:41:02 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsFlashString];
|
2012-07-31 23:49:51 -07:00
|
|
|
}
|
|
|
|
appDelegate.tryFeedCategory = nil;
|
|
|
|
}
|
2011-12-01 09:01:18 -08:00
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
- (void)setFontStyle:(NSString *)fontStyle {
|
|
|
|
NSString *jsString;
|
|
|
|
NSString *fontStyleStr;
|
|
|
|
NSUserDefaults *userPreferences = [NSUserDefaults standardUserDefaults];
|
|
|
|
|
|
|
|
if ([fontStyle isEqualToString:@"Helvetica"]) {
|
2014-05-15 17:03:25 -07:00
|
|
|
fontStyleStr = @"NB-helvetica";
|
|
|
|
} else if ([fontStyle isEqualToString:@"Palatino"]) {
|
|
|
|
fontStyleStr = @"NB-palatino";
|
|
|
|
} else if ([fontStyle isEqualToString:@"Georgia"]) {
|
|
|
|
fontStyleStr = @"NB-georgia";
|
|
|
|
} else if ([fontStyle isEqualToString:@"Avenir"]) {
|
|
|
|
fontStyleStr = @"NB-avenir";
|
|
|
|
} else if ([fontStyle isEqualToString:@"AvenirNext"]) {
|
|
|
|
fontStyleStr = @"NB-avenirnext";
|
2012-07-25 10:50:52 -07:00
|
|
|
}
|
2014-05-15 17:03:25 -07:00
|
|
|
[userPreferences setObject:fontStyleStr forKey:@"fontStyle"];
|
2012-11-05 17:16:10 -08:00
|
|
|
[userPreferences synchronize];
|
|
|
|
|
|
|
|
jsString = [NSString stringWithFormat:@
|
|
|
|
"document.getElementById('NB-font-style').setAttribute('class', '%@')",
|
|
|
|
fontStyleStr];
|
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
2012-07-25 10:50:52 -07:00
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
- (void)changeFontSize:(NSString *)fontSize {
|
2013-11-23 13:03:14 -08:00
|
|
|
NSString *jsString = [[NSString alloc] initWithFormat:@"document.getElementById('NB-font-size').setAttribute('class', 'NB-%@')",
|
2012-11-05 17:16:10 -08:00
|
|
|
fontSize];
|
2012-07-28 11:49:31 -07:00
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
2011-12-01 09:01:18 -08:00
|
|
|
}
|
|
|
|
|
2014-05-15 18:06:56 -07:00
|
|
|
- (void)changeLineSpacing:(NSString *)lineSpacing {
|
|
|
|
NSString *jsString = [[NSString alloc] initWithFormat:@"document.getElementById('NB-line-spacing').setAttribute('class', 'NB-line-spacing-%@')",
|
|
|
|
lineSpacing];
|
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Actions
|
2011-12-01 09:01:18 -08:00
|
|
|
|
2012-07-26 13:54:45 -07:00
|
|
|
- (void)toggleLikeComment:(BOOL)likeComment {
|
2012-11-09 14:13:44 -08:00
|
|
|
[appDelegate.storyPageControl showShareHUD:@"Favoriting"];
|
2012-07-26 13:54:45 -07:00
|
|
|
NSString *urlString;
|
|
|
|
if (likeComment) {
|
2013-06-18 21:23:20 -04:00
|
|
|
urlString = [NSString stringWithFormat:@"%@/social/like_comment",
|
2012-07-26 13:54:45 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
} else {
|
2013-06-18 21:23:20 -04:00
|
|
|
urlString = [NSString stringWithFormat:@"%@/social/remove_like_comment",
|
2012-07-26 13:54:45 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
}
|
|
|
|
|
|
|
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
|
|
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
|
|
|
|
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
[request setPostValue:[self.activeStory
|
2012-07-26 13:54:45 -07:00
|
|
|
objectForKey:@"id"]
|
|
|
|
forKey:@"story_id"];
|
2012-11-05 17:16:10 -08:00
|
|
|
[request setPostValue:[self.activeStory
|
2012-07-26 13:54:45 -07:00
|
|
|
objectForKey:@"story_feed_id"]
|
|
|
|
forKey:@"story_feed_id"];
|
|
|
|
|
|
|
|
|
|
|
|
[request setPostValue:[appDelegate.activeComment objectForKey:@"user_id"] forKey:@"comment_user_id"];
|
|
|
|
|
|
|
|
[request setDidFinishSelector:@selector(finishLikeComment:)];
|
2012-10-17 15:07:53 -07:00
|
|
|
[request setDidFailSelector:@selector(requestFailed:)];
|
2012-07-26 13:54:45 -07:00
|
|
|
[request setDelegate:self];
|
|
|
|
[request startAsynchronous];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)finishLikeComment:(ASIHTTPRequest *)request {
|
|
|
|
NSString *responseString = [request responseString];
|
2012-07-27 16:21:44 -07:00
|
|
|
NSData *responseData=[responseString dataUsingEncoding:NSUTF8StringEncoding];
|
|
|
|
NSError *error;
|
|
|
|
NSDictionary *results = [NSJSONSerialization
|
|
|
|
JSONObjectWithData:responseData
|
|
|
|
options:kNilOptions
|
|
|
|
error:&error];
|
|
|
|
|
2013-09-05 16:34:39 -07:00
|
|
|
if (request.responseStatusCode != 200) {
|
|
|
|
return [self requestFailed:request];
|
|
|
|
}
|
|
|
|
|
2012-07-26 13:54:45 -07:00
|
|
|
// add the comment into the activeStory dictionary
|
|
|
|
NSDictionary *newStory = [DataUtilities updateComment:results for:appDelegate];
|
|
|
|
|
|
|
|
// update the current story and the activeFeedStories
|
|
|
|
appDelegate.activeStory = newStory;
|
2012-11-05 17:16:10 -08:00
|
|
|
[self setActiveStoryAtIndex:-1];
|
2012-07-26 13:54:45 -07:00
|
|
|
|
|
|
|
NSMutableArray *newActiveFeedStories = [[NSMutableArray alloc] init];
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
for (int i = 0; i < appDelegate.storiesCollection.activeFeedStories.count; i++) {
|
|
|
|
NSDictionary *feedStory = [appDelegate.storiesCollection.activeFeedStories objectAtIndex:i];
|
2014-02-12 20:41:29 -08:00
|
|
|
NSString *storyId = [NSString stringWithFormat:@"%@", [feedStory objectForKey:@"story_hash"]];
|
|
|
|
NSString *currentStoryId = [NSString stringWithFormat:@"%@", [self.activeStory objectForKey:@"story_hash"]];
|
2012-07-26 13:54:45 -07:00
|
|
|
if ([storyId isEqualToString: currentStoryId]){
|
|
|
|
[newActiveFeedStories addObject:newStory];
|
|
|
|
} else {
|
2014-02-12 20:09:37 -08:00
|
|
|
[newActiveFeedStories addObject:[appDelegate.storiesCollection.activeFeedStories objectAtIndex:i]];
|
2012-07-26 13:54:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
appDelegate.storiesCollection.activeFeedStories = [NSArray arrayWithArray:newActiveFeedStories];
|
2012-07-26 13:54:45 -07:00
|
|
|
|
2012-11-27 17:50:33 -08:00
|
|
|
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
2012-07-30 14:58:57 -07:00
|
|
|
[self refreshComments:@"like"];
|
2012-07-26 13:54:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-06-29 12:54:52 -07:00
|
|
|
- (void)requestFailed:(ASIHTTPRequest *)request {
|
2012-10-17 15:07:53 -07:00
|
|
|
NSLog(@"Error in story detail: %@", [request error]);
|
|
|
|
NSString *error;
|
2013-09-05 16:34:39 -07:00
|
|
|
|
|
|
|
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
|
|
|
|
2012-10-17 15:07:53 -07:00
|
|
|
if ([request error]) {
|
|
|
|
error = [NSString stringWithFormat:@"%@", [request error]];
|
|
|
|
} else {
|
|
|
|
error = @"The server barfed!";
|
|
|
|
}
|
|
|
|
[self informError:error];
|
2012-06-29 12:54:52 -07:00
|
|
|
}
|
|
|
|
|
2012-10-15 09:16:01 -07:00
|
|
|
- (void)openShareDialog {
|
|
|
|
// test to see if the user has commented
|
|
|
|
// search for the comment from friends comments
|
2012-11-05 17:16:10 -08:00
|
|
|
NSArray *friendComments = [self.activeStory objectForKey:@"friend_comments"];
|
2013-03-04 20:21:29 -08:00
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-10-15 09:16:01 -07:00
|
|
|
for (int i = 0; i < friendComments.count; i++) {
|
|
|
|
NSString *userId = [NSString stringWithFormat:@"%@",
|
|
|
|
[[friendComments objectAtIndex:i] objectForKey:@"user_id"]];
|
|
|
|
if([userId isEqualToString:currentUserId]){
|
|
|
|
appDelegate.activeComment = [friendComments objectAtIndex:i];
|
2013-09-23 15:07:25 -07:00
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
appDelegate.activeComment = nil;
|
2012-10-15 09:16:01 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (appDelegate.activeComment == nil) {
|
|
|
|
[appDelegate showShareView:@"share"
|
|
|
|
setUserId:nil
|
|
|
|
setUsername:nil
|
|
|
|
setReplyId:nil];
|
|
|
|
} else {
|
|
|
|
[appDelegate showShareView:@"edit-share"
|
|
|
|
setUserId:nil
|
|
|
|
setUsername:nil
|
|
|
|
setReplyId:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-27 23:04:25 -08:00
|
|
|
- (void)openTrainingDialog:(int)x yCoordinate:(int)y width:(int)width height:(int)height {
|
|
|
|
CGRect frame = CGRectZero;
|
|
|
|
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
|
|
|
// only adjust for the bar if user is scrolling
|
2014-02-12 20:09:37 -08:00
|
|
|
if (appDelegate.storiesCollection.isRiverView ||
|
2014-05-20 15:29:16 -07:00
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
2014-10-22 17:03:48 -07:00
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) {
|
2012-12-27 23:04:25 -08:00
|
|
|
if (self.webView.scrollView.contentOffset.y == -20) {
|
|
|
|
y = y + 20;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (self.webView.scrollView.contentOffset.y == -9) {
|
|
|
|
y = y + 9;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
frame = CGRectMake(x, y, width, height);
|
|
|
|
}
|
2014-11-10 16:00:59 -08:00
|
|
|
// NSLog(@"Open trainer: %@ (%d/%d/%d/%d)", NSStringFromCGRect(frame), x, y, width, height);
|
2012-12-27 23:04:25 -08:00
|
|
|
[appDelegate openTrainStory:[NSValue valueWithCGRect:frame]];
|
|
|
|
}
|
|
|
|
|
2014-11-10 16:00:59 -08:00
|
|
|
- (void)openUserTagsDialog:(int)x yCoordinate:(int)y width:(int)width height:(int)height {
|
|
|
|
CGRect frame = CGRectZero;
|
|
|
|
// only adjust for the bar if user is scrolling
|
|
|
|
if (appDelegate.storiesCollection.isRiverView ||
|
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) {
|
|
|
|
if (self.webView.scrollView.contentOffset.y == -20) {
|
|
|
|
y = y + 20;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (self.webView.scrollView.contentOffset.y == -9) {
|
|
|
|
y = y + 9;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
frame = CGRectMake(x, y, width, height);
|
|
|
|
|
|
|
|
[appDelegate openUserTagsStory:[NSValue valueWithCGRect:frame]];
|
|
|
|
}
|
|
|
|
|
2014-09-18 18:25:38 -07:00
|
|
|
- (void)tapImage:(UIGestureRecognizer *)gestureRecognizer {
|
|
|
|
CGPoint pt = [self pointForGesture:gestureRecognizer];
|
2014-09-18 16:55:37 -07:00
|
|
|
if (pt.x == CGPointZero.x && pt.y == CGPointZero.y) return;
|
2014-09-19 16:58:56 -07:00
|
|
|
// NSLog(@"Tapped point: %@", NSStringFromCGPoint(pt));
|
2014-09-18 16:55:37 -07:00
|
|
|
NSString *tagName = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'tagName');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
|
|
|
|
if ([tagName isEqualToString:@"IMG"]) {
|
|
|
|
[self showImageMenu:pt];
|
2014-09-19 14:48:54 -07:00
|
|
|
[gestureRecognizer setEnabled:NO];
|
|
|
|
[gestureRecognizer setEnabled:YES];
|
2014-09-18 16:55:37 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-17 19:02:12 -07:00
|
|
|
- (void)tapAndHold:(NSNotification*)notification {
|
2014-09-18 16:55:37 -07:00
|
|
|
CGPoint pt = [self pointForEvent:notification];
|
|
|
|
if (pt.x == CGPointZero.x && pt.y == CGPointZero.y) return;
|
|
|
|
|
|
|
|
NSString *tagName = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'tagName');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
|
|
|
|
if ([tagName isEqualToString:@"IMG"]) {
|
|
|
|
[self showImageMenu:pt];
|
|
|
|
}
|
|
|
|
|
|
|
|
if ([tagName isEqualToString:@"A"]) {
|
|
|
|
[self showLinkContextMenu:pt];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)showImageMenu:(CGPoint)pt {
|
|
|
|
NSString *title = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'title');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
NSString *alt = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'alt');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
NSString *src = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'src');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
title = title.length ? title : alt;
|
|
|
|
activeLongPressUrl = [NSURL URLWithString:src];
|
|
|
|
|
|
|
|
UIActionSheet *actions = [[UIActionSheet alloc] initWithTitle:title.length ? title : nil
|
|
|
|
delegate:self
|
|
|
|
cancelButtonTitle:@"Done"
|
|
|
|
destructiveButtonTitle:nil
|
|
|
|
otherButtonTitles:nil];
|
|
|
|
actionSheetViewImageIndex = [actions addButtonWithTitle:@"View and zoom"];
|
|
|
|
actionSheetCopyImageIndex = [actions addButtonWithTitle:@"Copy image"];
|
|
|
|
actionSheetSaveImageIndex = [actions addButtonWithTitle:@"Save to camera roll"];
|
2014-09-26 17:38:35 -07:00
|
|
|
[actions showFromRect:CGRectMake(pt.x, pt.y, 1, 1)
|
|
|
|
inView:appDelegate.storyPageControl.view animated:YES];
|
2014-09-26 14:38:28 -07:00
|
|
|
// [actions showInView:appDelegate.storyPageControl.view];
|
2014-09-18 16:55:37 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)showLinkContextMenu:(CGPoint)pt {
|
|
|
|
NSString *href = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'href');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
NSString *title = [webView stringByEvaluatingJavaScriptFromString:
|
|
|
|
[NSString stringWithFormat:@"linkAt(%li, %li, 'innerText');",
|
|
|
|
(long)pt.x,(long)pt.y]];
|
|
|
|
NSURL *url = [NSURL URLWithString:href];
|
|
|
|
|
|
|
|
if (!href || ![href length]) return;
|
|
|
|
|
2014-09-26 14:38:28 -07:00
|
|
|
NSValue *ptValue = [NSValue valueWithCGPoint:pt];
|
2014-09-18 16:55:37 -07:00
|
|
|
[appDelegate showSendTo:appDelegate.storyPageControl
|
2014-09-26 14:38:28 -07:00
|
|
|
sender:ptValue
|
2014-09-18 16:55:37 -07:00
|
|
|
withUrl:url
|
|
|
|
authorName:nil
|
|
|
|
text:nil
|
|
|
|
title:title
|
|
|
|
feedTitle:nil
|
|
|
|
images:nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (CGPoint)pointForEvent:(NSNotification*)notification {
|
|
|
|
if (self != appDelegate.storyPageControl.currentPage) return CGPointZero;
|
|
|
|
if (!self.view.window) return CGPointZero;
|
2014-09-17 19:02:12 -07:00
|
|
|
|
|
|
|
CGPoint pt;
|
|
|
|
NSDictionary *coord = [notification object];
|
|
|
|
pt.x = [[coord objectForKey:@"x"] floatValue];
|
|
|
|
pt.y = [[coord objectForKey:@"y"] floatValue];
|
|
|
|
|
|
|
|
// convert point from window to view coordinate system
|
|
|
|
pt = [webView convertPoint:pt fromView:nil];
|
|
|
|
|
2014-09-18 18:25:38 -07:00
|
|
|
// convert point from view to HTML coordinate system
|
|
|
|
// CGPoint offset = [self.webView scrollOffset];
|
|
|
|
CGSize viewSize = [self.webView frame].size;
|
|
|
|
CGSize windowSize = [self.webView windowSize];
|
|
|
|
|
|
|
|
CGFloat f = windowSize.width / viewSize.width;
|
|
|
|
pt.x = pt.x * f;// + offset.x;
|
|
|
|
pt.y = pt.y * f;// + offset.y;
|
|
|
|
|
|
|
|
return pt;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (CGPoint)pointForGesture:(UIGestureRecognizer *)gestureRecognizer {
|
|
|
|
if (self != appDelegate.storyPageControl.currentPage) return CGPointZero;
|
|
|
|
if (!self.view.window) return CGPointZero;
|
|
|
|
|
|
|
|
CGPoint pt = [gestureRecognizer locationInView:appDelegate.storyPageControl.currentPage.webView];
|
|
|
|
|
2014-09-17 19:02:12 -07:00
|
|
|
// convert point from view to HTML coordinate system
|
|
|
|
// CGPoint offset = [self.webView scrollOffset];
|
|
|
|
CGSize viewSize = [self.webView frame].size;
|
|
|
|
CGSize windowSize = [self.webView windowSize];
|
|
|
|
|
|
|
|
CGFloat f = windowSize.width / viewSize.width;
|
|
|
|
pt.x = pt.x * f;// + offset.x;
|
|
|
|
pt.y = pt.y * f;// + offset.y;
|
|
|
|
|
2014-09-18 16:55:37 -07:00
|
|
|
return pt;
|
2014-09-17 19:02:12 -07:00
|
|
|
}
|
|
|
|
|
2014-09-18 15:15:41 -07:00
|
|
|
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
|
|
|
|
if (buttonIndex == actionSheetViewImageIndex) {
|
|
|
|
[appDelegate showOriginalStory:activeLongPressUrl];
|
|
|
|
} else if (buttonIndex == actionSheetCopyImageIndex ||
|
|
|
|
buttonIndex == actionSheetSaveImageIndex) {
|
|
|
|
[self fetchImage:activeLongPressUrl buttonIndex:buttonIndex];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)fetchImage:(NSURL *)url buttonIndex:(NSInteger)buttonIndex {
|
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
[appDelegate.storyPageControl showShareHUD:buttonIndex == actionSheetCopyImageIndex ?
|
|
|
|
@"Copying..." : @"Saving..."];
|
|
|
|
|
|
|
|
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
|
|
|
|
AFImageRequestOperation *requestOperation = [[AFImageRequestOperation alloc] initWithRequest:urlRequest];
|
|
|
|
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
|
|
|
|
UIImage *image = responseObject;
|
|
|
|
if (buttonIndex == actionSheetCopyImageIndex) {
|
|
|
|
[UIPasteboard generalPasteboard].image = image;
|
|
|
|
[self flashCheckmarkHud:@"copied"];
|
|
|
|
} else if (buttonIndex == actionSheetSaveImageIndex) {
|
|
|
|
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
|
|
|
|
[self flashCheckmarkHud:@"saved"];
|
|
|
|
}
|
|
|
|
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
|
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
[self informError:@"Could not fetch image"];
|
|
|
|
}];
|
|
|
|
[requestOperation start];
|
|
|
|
}
|
|
|
|
|
2012-08-06 19:21:39 -07:00
|
|
|
# pragma mark
|
|
|
|
# pragma mark Subscribing to blurblog
|
|
|
|
|
|
|
|
- (void)subscribeToBlurblog {
|
2012-11-09 14:13:44 -08:00
|
|
|
[appDelegate.storyPageControl showShareHUD:@"Following"];
|
2013-06-18 21:23:20 -04:00
|
|
|
NSString *urlString = [NSString stringWithFormat:@"%@/social/follow",
|
2012-08-06 19:21:39 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
|
|
|
|
NSURL *url = [NSURL URLWithString:urlString];
|
|
|
|
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
[request setPostValue:[appDelegate.storiesCollection.activeFeed
|
2012-08-06 19:21:39 -07:00
|
|
|
objectForKey:@"user_id"]
|
|
|
|
forKey:@"user_id"];
|
|
|
|
|
|
|
|
[request setDidFinishSelector:@selector(finishSubscribeToBlurblog:)];
|
|
|
|
[request setDidFailSelector:@selector(requestFailed:)];
|
|
|
|
[request setDelegate:self];
|
|
|
|
[request startAsynchronous];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)finishSubscribeToBlurblog:(ASIHTTPRequest *)request {
|
2012-11-28 16:24:15 -08:00
|
|
|
[MBProgressHUD hideHUDForView:appDelegate.storyPageControl.view animated:NO];
|
2014-09-18 15:15:41 -07:00
|
|
|
self.storyHUD = [MBProgressHUD showHUDAddedTo:self.webView animated:YES];
|
2012-08-06 19:21:39 -07:00
|
|
|
self.storyHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
|
|
|
|
self.storyHUD.mode = MBProgressHUDModeCustomView;
|
|
|
|
self.storyHUD.removeFromSuperViewOnHide = YES;
|
|
|
|
self.storyHUD.labelText = @"Followed";
|
|
|
|
[self.storyHUD hide:YES afterDelay:1];
|
2012-11-13 12:28:16 -08:00
|
|
|
appDelegate.storyPageControl.navigationItem.leftBarButtonItem = nil;
|
2012-08-06 19:21:39 -07:00
|
|
|
[appDelegate reloadFeedsView:NO];
|
2012-08-07 09:57:21 -07:00
|
|
|
}
|
2012-08-06 19:21:39 -07:00
|
|
|
|
2012-07-30 14:58:57 -07:00
|
|
|
- (void)refreshComments:(NSString *)replyId {
|
2012-08-13 15:34:53 -07:00
|
|
|
NSString *shareBarString = [self getShareBar];
|
|
|
|
|
2012-08-07 11:27:00 -07:00
|
|
|
NSString *commentString = [self getComments];
|
2012-06-25 20:28:07 -07:00
|
|
|
NSString *jsString = [[NSString alloc] initWithFormat:@
|
2012-08-13 15:34:53 -07:00
|
|
|
"document.getElementById('NB-comments-wrapper').innerHTML = '%@';"
|
2012-11-28 16:33:21 -08:00
|
|
|
"document.getElementById('NB-share-bar-wrapper').innerHTML = '%@';",
|
2012-08-13 15:34:53 -07:00
|
|
|
commentString,
|
|
|
|
shareBarString];
|
2012-07-27 12:27:13 -07:00
|
|
|
NSString *shareType = appDelegate.activeShareType;
|
2012-06-25 20:28:07 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
2012-12-11 11:50:06 -08:00
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:@"attachFastClick();"];
|
2012-11-13 12:28:16 -08:00
|
|
|
|
|
|
|
// HACK to make the scroll event happen after the replace innerHTML event above happens.
|
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .15 * NSEC_PER_SEC),
|
2013-06-17 11:50:13 -07:00
|
|
|
dispatch_get_main_queue(), ^{
|
2012-11-13 12:28:16 -08:00
|
|
|
if (!replyId) {
|
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@",
|
2013-03-04 20:21:29 -08:00
|
|
|
[appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-11-13 12:28:16 -08:00
|
|
|
NSString *jsFlashString = [[NSString alloc]
|
|
|
|
initWithFormat:@"slideToComment('%@', true);", currentUserId];
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsFlashString];
|
|
|
|
} else if ([replyId isEqualToString:@"like"]) {
|
|
|
|
|
|
|
|
} else {
|
|
|
|
NSString *jsFlashString = [[NSString alloc]
|
|
|
|
initWithFormat:@"slideToComment('%@', true);", replyId];
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsFlashString];
|
|
|
|
}
|
|
|
|
});
|
2012-07-30 14:58:57 -07:00
|
|
|
|
2012-07-27 12:27:13 -07:00
|
|
|
|
|
|
|
// // adding in a simulated delay
|
2012-11-13 12:28:16 -08:00
|
|
|
// sleep(1);
|
2012-07-27 12:27:13 -07:00
|
|
|
|
2012-12-18 17:29:23 -08:00
|
|
|
[self flashCheckmarkHud:shareType];
|
2014-05-21 12:24:22 -07:00
|
|
|
[self refreshSideoptions];
|
2012-12-18 17:29:23 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
- (void)flashCheckmarkHud:(NSString *)messageType {
|
2014-09-18 15:15:41 -07:00
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:NO];
|
|
|
|
self.storyHUD = [MBProgressHUD showHUDAddedTo:self.webView animated:YES];
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
|
|
|
|
self.storyHUD.mode = MBProgressHUDModeCustomView;
|
2012-12-18 17:29:23 -08:00
|
|
|
self.storyHUD.removeFromSuperViewOnHide = YES;
|
|
|
|
|
|
|
|
if ([messageType isEqualToString:@"reply"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Replied";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"edit-reply"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Edited Reply";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"edit-share"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Edited Comment";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"share"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Shared";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"like-comment"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Favorited";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"unlike-comment"]) {
|
2012-07-27 12:27:13 -07:00
|
|
|
self.storyHUD.labelText = @"Unfavorited";
|
2012-12-18 17:29:23 -08:00
|
|
|
} else if ([messageType isEqualToString:@"saved"]) {
|
|
|
|
self.storyHUD.labelText = @"Saved";
|
|
|
|
} else if ([messageType isEqualToString:@"unsaved"]) {
|
|
|
|
self.storyHUD.labelText = @"No longer saved";
|
2012-12-19 15:37:36 -08:00
|
|
|
} else if ([messageType isEqualToString:@"unread"]) {
|
|
|
|
self.storyHUD.labelText = @"Unread";
|
2013-07-13 16:56:33 +02:00
|
|
|
} else if ([messageType isEqualToString:@"added"]) {
|
|
|
|
self.storyHUD.labelText = @"Added";
|
2014-09-18 15:15:41 -07:00
|
|
|
} else if ([messageType isEqualToString:@"copied"]) {
|
|
|
|
self.storyHUD.labelText = @"Copied";
|
|
|
|
} else if ([messageType isEqualToString:@"saved"]) {
|
|
|
|
self.storyHUD.labelText = @"Saved";
|
2012-07-27 12:27:13 -07:00
|
|
|
}
|
|
|
|
[self.storyHUD hide:YES afterDelay:1];
|
2012-07-12 13:34:41 -07:00
|
|
|
}
|
|
|
|
|
2012-07-30 14:58:57 -07:00
|
|
|
- (void)scrolltoComment {
|
2013-03-04 20:21:29 -08:00
|
|
|
NSString *currentUserId = [NSString stringWithFormat:@"%@", [appDelegate.dictSocialProfile objectForKey:@"user_id"]];
|
2012-07-30 15:50:52 -07:00
|
|
|
NSString *jsFlashString = [[NSString alloc] initWithFormat:@"slideToComment('%@', true);", currentUserId];
|
2012-07-30 14:58:57 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsFlashString];
|
2012-06-25 20:28:07 -07:00
|
|
|
}
|
|
|
|
|
2012-11-05 17:16:10 -08:00
|
|
|
- (NSString *)textToHtml:(NSString*)htmlString {
|
|
|
|
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"'" withString:@"'"];
|
|
|
|
htmlString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br/>"];
|
|
|
|
return htmlString;
|
2011-06-14 10:35:33 -04:00
|
|
|
}
|
|
|
|
|
2012-11-07 17:54:16 -08:00
|
|
|
- (void)changeWebViewWidth {
|
2014-12-03 15:35:37 -08:00
|
|
|
// NSLog(@"changeWebViewWidth: %@", NSStringFromCGRect(self.view.frame));
|
2012-11-07 17:54:16 -08:00
|
|
|
int contentWidth = self.appDelegate.storyPageControl.view.frame.size.width;
|
2014-09-19 17:25:57 -07:00
|
|
|
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
|
2012-06-28 11:12:38 -07:00
|
|
|
NSString *contentWidthClass;
|
2014-09-19 17:25:57 -07:00
|
|
|
|
|
|
|
if (UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
2012-06-28 11:12:38 -07:00
|
|
|
contentWidthClass = @"NB-ipad-wide";
|
2014-12-01 17:22:40 -08:00
|
|
|
} else if (!UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
|
2012-06-28 11:12:38 -07:00
|
|
|
contentWidthClass = @"NB-ipad-narrow";
|
2014-09-19 17:25:57 -07:00
|
|
|
} else if (UIInterfaceOrientationIsLandscape(orientation) && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
|
|
|
|
contentWidthClass = @"NB-iphone-wide";
|
2012-06-28 11:12:38 -07:00
|
|
|
} else {
|
|
|
|
contentWidthClass = @"NB-iphone";
|
|
|
|
}
|
2014-09-19 17:25:57 -07:00
|
|
|
|
2014-09-24 12:00:47 -07:00
|
|
|
contentWidthClass = [NSString stringWithFormat:@"%@ NB-width-%d",
|
|
|
|
contentWidthClass, (int)floorf(CGRectGetWidth(self.view.frame))];
|
|
|
|
|
2014-02-12 20:09:37 -08:00
|
|
|
NSString *riverClass = (appDelegate.storiesCollection.isRiverView ||
|
2014-05-20 15:29:16 -07:00
|
|
|
appDelegate.storiesCollection.isSocialView ||
|
2014-10-22 17:03:48 -07:00
|
|
|
appDelegate.storiesCollection.isSavedView ||
|
|
|
|
appDelegate.storiesCollection.isReadView) ?
|
2013-03-13 14:05:58 -07:00
|
|
|
@"NB-river" : @"NB-non-river";
|
2012-06-28 11:12:38 -07:00
|
|
|
|
2012-07-12 13:34:41 -07:00
|
|
|
NSString *jsString = [[NSString alloc] initWithFormat:
|
2013-03-13 14:05:58 -07:00
|
|
|
@"$('body').attr('class', '%@ %@');"
|
2012-07-19 15:48:35 -07:00
|
|
|
"document.getElementById(\"viewport\").setAttribute(\"content\", \"width=%i;initial-scale=1; maximum-scale=1.0; user-scalable=0;\");",
|
2012-07-16 10:10:52 -07:00
|
|
|
contentWidthClass,
|
2013-03-13 14:05:58 -07:00
|
|
|
riverClass,
|
2012-07-16 10:10:52 -07:00
|
|
|
contentWidth];
|
2012-06-27 21:28:04 -07:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
2012-11-08 17:39:32 -08:00
|
|
|
|
2012-11-09 14:57:33 -08:00
|
|
|
// self.webView.hidden = NO;
|
2012-06-27 21:28:04 -07:00
|
|
|
}
|
|
|
|
|
2012-12-07 17:18:31 -08:00
|
|
|
- (void)refreshHeader {
|
2012-12-13 12:40:05 -08:00
|
|
|
NSString *headerString = [[[self getHeader] stringByReplacingOccurrencesOfString:@"\'" withString:@"\\'"]
|
2014-05-21 12:24:22 -07:00
|
|
|
stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
|
2012-12-07 17:18:31 -08:00
|
|
|
NSString *jsString = [NSString stringWithFormat:@"document.getElementById('NB-header-container').innerHTML = '%@';",
|
|
|
|
headerString];
|
2014-05-21 12:24:22 -07:00
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:@"attachFastClick();"];
|
|
|
|
}
|
2012-12-13 12:40:05 -08:00
|
|
|
|
2014-05-21 12:24:22 -07:00
|
|
|
- (void)refreshSideoptions {
|
|
|
|
NSString *sideoptionsString = [[[self getSideoptions] stringByReplacingOccurrencesOfString:@"\'" withString:@"\\'"]
|
|
|
|
stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
|
|
|
|
NSString *jsString = [NSString stringWithFormat:@"document.getElementById('NB-sideoptions-container').innerHTML = '%@';",
|
|
|
|
sideoptionsString];
|
|
|
|
|
2012-12-07 17:18:31 -08:00
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:jsString];
|
2012-12-10 20:22:21 -08:00
|
|
|
|
|
|
|
[self.webView stringByEvaluatingJavaScriptFromString:@"attachFastClick();"];
|
2012-12-07 17:18:31 -08:00
|
|
|
}
|
|
|
|
|
2013-05-28 18:07:19 -07:00
|
|
|
#pragma mark -
|
|
|
|
#pragma mark Text view
|
|
|
|
|
2015-03-10 18:58:23 -07:00
|
|
|
- (void)showStoryView {
|
|
|
|
self.inTextView = NO;
|
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
[appDelegate.storyPageControl setTextButton:self];
|
|
|
|
[self drawStory];
|
|
|
|
}
|
|
|
|
|
2013-05-28 18:07:19 -07:00
|
|
|
- (void)fetchTextView {
|
2015-03-09 14:20:45 -07:00
|
|
|
if (!self.activeStoryId || !self.activeStory) return;
|
2015-03-10 18:58:23 -07:00
|
|
|
self.inTextView = YES;
|
2015-03-12 19:43:39 -07:00
|
|
|
// NSLog(@"Fetching Text: %@", [self.activeStory objectForKey:@"story_title"]);
|
2013-05-28 18:07:19 -07:00
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.webView animated:YES];
|
|
|
|
HUD.labelText = @"Fetching text...";
|
|
|
|
|
2013-06-18 21:23:20 -04:00
|
|
|
NSString *urlString = [NSString stringWithFormat:@"%@/rss_feeds/original_text",
|
2013-05-28 18:07:19 -07:00
|
|
|
NEWSBLUR_URL];
|
|
|
|
ASIFormDataRequest *request = [self formRequestWithURL:urlString];
|
2015-03-09 14:20:45 -07:00
|
|
|
[request addPostValue:[self.activeStory objectForKey:@"id"] forKey:@"story_id"];
|
|
|
|
[request addPostValue:[self.activeStory objectForKey:@"story_feed_id"] forKey:@"feed_id"];
|
|
|
|
[request setUserInfo:@{@"storyId": [self.activeStory objectForKey:@"id"]}];
|
2013-05-28 18:07:19 -07:00
|
|
|
[request setDidFinishSelector:@selector(finishFetchTextView:)];
|
2015-03-10 18:58:23 -07:00
|
|
|
[request setDidFailSelector:@selector(failedFetchText::)];
|
2013-05-28 18:07:19 -07:00
|
|
|
[request setDelegate:self];
|
|
|
|
[request startAsynchronous];
|
|
|
|
}
|
|
|
|
|
2015-03-10 18:58:23 -07:00
|
|
|
- (void)failedFetchText:(ASIHTTPRequest *)request {
|
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
[self informError:@"Could not fetch text"];
|
|
|
|
self.inTextView = NO;
|
|
|
|
[appDelegate.storyPageControl setTextButton:self];
|
|
|
|
}
|
2013-05-28 18:07:19 -07:00
|
|
|
|
|
|
|
- (void)finishFetchTextView:(ASIHTTPRequest *)request {
|
|
|
|
NSString *responseString = [request responseString];
|
|
|
|
NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
|
|
|
|
NSError *error;
|
|
|
|
NSDictionary *results = [NSJSONSerialization
|
|
|
|
JSONObjectWithData:responseData
|
|
|
|
options:kNilOptions
|
|
|
|
error:&error];
|
|
|
|
|
|
|
|
if ([[results objectForKey:@"failed"] boolValue]) {
|
2015-03-10 18:58:23 -07:00
|
|
|
[self failedFetchText:request];
|
2013-05-28 18:07:19 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-10-17 11:21:37 -07:00
|
|
|
if (![[request.userInfo objectForKey:@"storyId"]
|
2015-03-09 14:20:45 -07:00
|
|
|
isEqualToString:[self.activeStory objectForKey:@"id"]]) {
|
2013-10-17 11:21:37 -07:00
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
|
|
|
self.inTextView = NO;
|
2015-03-10 18:58:23 -07:00
|
|
|
[appDelegate.storyPageControl setTextButton:self];
|
2013-10-17 11:21:37 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-03-10 18:58:23 -07:00
|
|
|
NSMutableDictionary *newActiveStory = [self.activeStory mutableCopy];
|
2014-05-29 12:48:25 -07:00
|
|
|
[newActiveStory setObject:[results objectForKey:@"original_text"] forKey:@"original_text"];
|
2015-03-10 18:58:23 -07:00
|
|
|
self.activeStory = newActiveStory;
|
2013-05-28 18:07:19 -07:00
|
|
|
|
|
|
|
[MBProgressHUD hideHUDForView:self.webView animated:YES];
|
2013-05-29 13:36:39 -07:00
|
|
|
|
|
|
|
self.inTextView = YES;
|
2015-03-10 18:58:23 -07:00
|
|
|
|
|
|
|
[self drawStory];
|
|
|
|
|
2015-03-12 19:43:39 -07:00
|
|
|
// NSLog(@"Fetched Text: %@", [self.activeStory objectForKey:@"story_title"]);
|
2013-05-28 18:07:19 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-06-25 18:36:01 -04:00
|
|
|
@end
|