Navigation Menu

Skip to content

Commit

Permalink
Added organization feeds
Browse files Browse the repository at this point in the history
  • Loading branch information
dbloete committed Mar 19, 2011
1 parent 69d52d1 commit d374028
Show file tree
Hide file tree
Showing 15 changed files with 808 additions and 1,234 deletions.
2 changes: 2 additions & 0 deletions Classes/FeedEntryController.h
Expand Up @@ -20,6 +20,7 @@
IBOutlet UIBarButtonItem *repositoryItem;
IBOutlet UIBarButtonItem *firstUserItem;
IBOutlet UIBarButtonItem *secondUserItem;
IBOutlet UIBarButtonItem *organizationItem;
IBOutlet UIBarButtonItem *issueItem;
IBOutlet UIBarButtonItem *commitItem;
}
Expand All @@ -33,6 +34,7 @@
- (IBAction)showRepository:(id)sender;
- (IBAction)showFirstUser:(id)sender;
- (IBAction)showSecondUser:(id)sender;
- (IBAction)showOrganization:(id)sender;
- (IBAction)showIssue:(id)sender;
- (IBAction)showCommit:(id)sender;

Expand Down
11 changes: 10 additions & 1 deletion Classes/FeedEntryController.m
@@ -1,10 +1,12 @@
#import "FeedEntryController.h"
#import "RepositoryController.h"
#import "UserController.h"
#import "OrganizationController.h"
#import "WebController.h"
#import "GHFeedEntry.h"
#import "GHUser.h"
#import "GHRepository.h"
#import "GHOrganization.h"
#import "GHCommit.h"
#import "GHIssue.h"
#import "GravatarLoader.h"
Expand Down Expand Up @@ -57,7 +59,7 @@ - (void)setEntry:(GHFeedEntry *)theEntry {
gravatarView.image = entry.user.gravatar;
if (!gravatarView.image && !entry.user.isLoaded) [entry.user loadData];
// Update Toolbar
NSMutableArray *tbItems = [NSMutableArray arrayWithObjects:webItem, firstUserItem, nil];
NSMutableArray *tbItems = [NSMutableArray arrayWithObjects:webItem, (entry.eventType == @"team_add" ? organizationItem : firstUserItem), nil];
if ([entry.eventItem isKindOfClass:[GHUser class]]) {
[tbItems addObject:secondUserItem];
} else if ([entry.eventItem isKindOfClass:[GHRepository class]]) {
Expand Down Expand Up @@ -87,6 +89,7 @@ - (void)dealloc {
[secondUserItem release], secondUserItem = nil;
[issueItem release], issueItem = nil;
[commitItem release], commitItem = nil;
[organizationItem release], organizationItem = nil;
[navigationControl release], navigationControl = nil;
[entry.user removeObserver:self forKeyPath:kUserGravatarKeyPath];
[entry release], entry = nil;
Expand Down Expand Up @@ -143,6 +146,12 @@ - (IBAction)showSecondUser:(id)sender {
[userController release];
}

- (IBAction)showOrganization:(id)sender {
OrganizationController *orgController = [[OrganizationController alloc] initWithOrganization:(GHOrganization *)entry.organization];
[self.navigationController pushViewController:orgController animated:YES];
[orgController release];
}

- (IBAction)showIssue:(id)sender {
GHIssue *issue = entry.eventItem;
IssueController *issueController = [[IssueController alloc] initWithIssue:issue andIssuesController:nil];
Expand Down
4 changes: 3 additions & 1 deletion Classes/GHFeedEntry.h
@@ -1,6 +1,7 @@
#import <Foundation/Foundation.h>

@class GHUser;

@class GHUser, GHOrganization;

@interface GHFeedEntry : NSObject {
NSString *entryID;
Expand All @@ -23,6 +24,7 @@
@property(nonatomic,retain)NSString *authorName;
@property(nonatomic,retain)id eventItem;
@property(nonatomic,readonly)GHUser *user;
@property(nonatomic,readonly)GHOrganization *organization;
@property(nonatomic,readwrite)BOOL read;

@end
19 changes: 18 additions & 1 deletion Classes/GHFeedEntry.m
Expand Up @@ -7,7 +7,15 @@

@implementation GHFeedEntry

@synthesize entryID, eventType, eventItem, date, linkURL, title, content, authorName, read;
@synthesize entryID;
@synthesize eventType;
@synthesize eventItem;
@synthesize date;
@synthesize linkURL;
@synthesize title;
@synthesize content;
@synthesize authorName;
@synthesize read;

- (id)init {
[super init];
Expand Down Expand Up @@ -35,6 +43,10 @@ - (GHUser *)user {
return [[iOctocat sharedInstance] userWithLogin:authorName];
}

- (GHOrganization *)organization {
return [[iOctocat sharedInstance] organizationWithLogin:authorName];
}

- (id)eventItem {
if (eventItem) return eventItem;
if ([eventType isEqualToString:@"fork"]) {
Expand Down Expand Up @@ -73,6 +85,11 @@ - (id)eventItem {
NSArray *comps1 = [title componentsSeparatedByString:@" following "];
NSString *username = [comps1 objectAtIndex:1];
self.eventItem = [[iOctocat sharedInstance] userWithLogin:username];
} else if ([eventType isEqualToString:@"team_add"]) {
NSArray *comps1 = [title componentsSeparatedByString:@" added "];
NSArray *comps2 = [[comps1 objectAtIndex:1] componentsSeparatedByString:@" to "];
NSString *username = [comps2 objectAtIndex:0];
self.eventItem = [[iOctocat sharedInstance] userWithLogin:username];
} else if ([eventType isEqualToString:@"watch"]) {
NSArray *comps1 = [title componentsSeparatedByString:@" started watching "];
NSArray *comps2 = [[comps1 objectAtIndex:1] componentsSeparatedByString:@"/"];
Expand Down
2 changes: 2 additions & 0 deletions Classes/GHFeedParserDelegate.m
Expand Up @@ -73,6 +73,8 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName names
currentEntry.eventType = @"delete";
} else if ([event hasPrefix:@"Create"]) {
currentEntry.eventType = @"create";
} else if ([event hasPrefix:@"TeamAdd"]) {
currentEntry.eventType = @"team_add";
} else if ([event hasPrefix:@"Member"]) {
currentEntry.eventType = @"member";
} else if ([event hasPrefix:@"Gist"]) {
Expand Down
2 changes: 2 additions & 0 deletions Classes/MyFeedsController.h
Expand Up @@ -8,6 +8,7 @@
@interface MyFeedsController : PullToRefreshTableViewController {
@private
IBOutlet UISegmentedControl *feedControl;
IBOutlet UIBarButtonItem *organizationItem;
IBOutlet UITableViewCell *noEntriesCell;
IBOutlet FeedEntryCell *feedEntryCell;
NSArray *feeds;
Expand All @@ -19,5 +20,6 @@
- (void)setupFeeds;
- (BOOL)refreshCurrentFeedIfRequired;
- (IBAction)switchChanged:(id)sender;
- (IBAction)selectOrganization:(id)sender;

@end
53 changes: 41 additions & 12 deletions Classes/MyFeedsController.m
@@ -1,6 +1,7 @@
#import "MyFeedsController.h"
#import "WebController.h"
#import "UserController.h"
#import "OrganizationsController.h"
#import "FeedEntryController.h"
#import "GHFeedEntry.h"
#import "FeedEntryCell.h"
Expand All @@ -9,11 +10,19 @@
#import "NSURL+Extensions.h"


@interface MyFeedsController ()
- (GHUser *)currentUser;
@end


@implementation MyFeedsController

- (void)viewDidLoad {
[super viewDidLoad];
loadCounter = 0;
[self.currentUser.organizations addObserver:self forKeyPath:kResourceLoadingStatusKeyPath options:NSKeyValueObservingOptionNew context:nil];
[organizationItem setEnabled:self.currentUser.organizations.isLoaded];
if (!self.currentUser.organizations.isLoaded) [self.currentUser.organizations loadData];
loadCounter = 0;
}

- (void)viewDidAppear:(BOOL)animated {
Expand All @@ -23,13 +32,18 @@ - (void)viewDidAppear:(BOOL)animated {

- (void)dealloc {
for (GHFeed *feed in feeds) [feed removeObserver:self forKeyPath:kResourceLoadingStatusKeyPath];
[self.currentUser.organizations removeObserver:self forKeyPath:kResourceLoadingStatusKeyPath];
[feeds release];
[noEntriesCell release];
[feedEntryCell release];
[feedControl release];
[super dealloc];
}

- (GHUser *)currentUser {
return [[iOctocat sharedInstance] currentUser];
}

- (void)setupFeeds {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *username = [defaults stringForKey:kLoginDefaultsKey];
Expand All @@ -48,12 +62,12 @@ - (void)setupFeeds {
}

- (GHFeed *)currentFeed {
return feedControl.selectedSegmentIndex == UISegmentedControlNoSegment ?
return (feedControl.selectedSegmentIndex == UISegmentedControlNoSegment) ?
nil : [feeds objectAtIndex:feedControl.selectedSegmentIndex];
}

- (void)reloadTableViewDataSource {
if (self.currentFeed.isLoading) return;
if (self.currentFeed && self.currentFeed.isLoading) return;
[self.currentFeed loadData];
}

Expand All @@ -69,17 +83,24 @@ - (BOOL)refreshCurrentFeedIfRequired {
#pragma mark Actions

- (IBAction)switchChanged:(id)sender {
refreshHeaderView.lastUpdatedDate = self.currentFeed.lastReadingDate;
[self.tableView reloadData];
if ([self refreshCurrentFeedIfRequired]) return;
if (self.currentFeed.isLoaded) return;
[self.currentFeed loadData];
if (self.currentFeed.isLoading) [self showReloadAnimationAnimated:NO];
[self.tableView reloadData];
refreshHeaderView.lastUpdatedDate = self.currentFeed.lastReadingDate;
[self.tableView reloadData];
if ([self refreshCurrentFeedIfRequired]) return;
if (self.currentFeed.isLoaded) return;
[self.currentFeed loadData];
if (self.currentFeed.isLoading) [self showReloadAnimationAnimated:NO];
[self.tableView reloadData];
}

- (IBAction)selectOrganization:(id)sender {
OrganizationsController *viewController = [[OrganizationsController alloc] initWithOrganizations:self.currentUser.organizations];
viewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:kResourceLoadingStatusKeyPath]) {
if ([object isKindOfClass:[GHFeed class]] && [keyPath isEqualToString:kResourceLoadingStatusKeyPath]) {
GHFeed *feed = (GHFeed *)object;
if (feed.isLoading) {
loadCounter += 1;
Expand All @@ -95,7 +116,15 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N
[alert show];
[alert release];
}
}
} else if (object == self.currentUser.organizations && [keyPath isEqualToString:kResourceLoadingStatusKeyPath]) {
if (!self.currentUser.organizations.isLoading && self.currentUser.organizations.error) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Loading error" message:@"Could not load the list of organizations" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
} else if (self.currentUser.organizations.isLoaded) {
[organizationItem setEnabled:(self.currentUser.organizations.organizations.count > 0)];
}
}
}

- (void)viewWillAppear:(BOOL)animated {
Expand Down
26 changes: 15 additions & 11 deletions Classes/OrganizationsController.m
@@ -1,5 +1,7 @@
#import "OrganizationsController.h"
#import "OrganizationController.h"
#import "FeedController.h"
#import "GHOrganization.h"


@implementation OrganizationsController
Expand All @@ -15,14 +17,15 @@ - (id)initWithOrganizations:(GHOrganizations *)theOrganizations {

- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = @"Organizations";
if (!organizations.isLoaded) [organizations loadData];
}

- (void)dealloc {
[organizations removeObserver:self forKeyPath:kResourceLoadingStatusKeyPath];
[noOrganizationsCell release];
[loadingCell release];
[organizationCell release];
[noOrganizationsCell release], noOrganizationsCell = nil;
[organizationCell release], organizationCell = nil;
[loadingCell release], loadingCell = nil;
[super dealloc];
}

Expand Down Expand Up @@ -57,14 +60,15 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
return cell;
}

//- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// if (!organizations.isLoaded) return;
// if (organizations.organizations.count == 0) return;
// GHOrganization *org = [users.users objectAtIndex:indexPath.row];
// OrganizationController *orgController = [(OrganizationController *)[OrganizationController alloc] initWithOrganization:(GHOrganization *)org];
// [self.navigationController pushViewController:orgController animated:YES];
// [orgController release];
//}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (!organizations.isLoaded) return;
if (organizations.organizations.count == 0) return;
GHOrganization *org = [organizations.organizations objectAtIndex:indexPath.row];
// OrganizationController *viewController = [(OrganizationController *)[OrganizationController alloc] initWithOrganization:(GHOrganization *)org];
FeedController *viewController = [[FeedController alloc] initWithFeed:org.recentActivity andTitle:org.login];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];
}

@end

2 changes: 1 addition & 1 deletion Classes/UserController.m
Expand Up @@ -44,7 +44,7 @@ - (void)viewDidLoad {
(user.isLoaded) ? [self displayUser] : [user loadData];
if (!user.repositories.isLoaded) [user.repositories loadData];
if (!user.organizations.isLoaded) [user.organizations loadData];
self.navigationItem.title = user.login;
self.navigationItem.title = (self.user == self.currentUser) ? @"Profile" : user.login;
self.tableView.tableHeaderView = tableHeaderView;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(showActions:)];
}
Expand Down

0 comments on commit d374028

Please sign in to comment.