87 lines
2.9 KiB
Objective-C

//
// Copyright (c) 2015 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#import "PostTableViewCell.h"
@import Firebase;
@interface PostTableViewCell ()
@property (strong, nonatomic) FIRDatabaseReference *postRef;
@end
@implementation PostTableViewCell
- (instancetype)initWithFrame:(CGRect)frame {
return [super initWithFrame:frame];
}
- (IBAction)didTapStarButton:(id)sender {
if (!_postKey) {
// We don't know the identifier of this post, so just return.
return;
}
self.postRef = [[[[FIRDatabase database] reference] child:@"posts"] child:_postKey];
[self incrementStarsForRef:_postRef];
[_postRef observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
NSString *uid = snapshot.value[@"uid"];
FIRDatabaseReference *ref = [[[[[FIRDatabase database] reference]
child:@"user-posts"]
child:uid] child:_postKey];
[self incrementStarsForRef:ref];
}];
}
- (void)incrementStarsForRef:(FIRDatabaseReference *)ref {
// [START post_stars_transaction]
[ref runTransactionBlock:^FIRTransactionResult * _Nonnull(FIRMutableData * _Nonnull currentData) {
NSMutableDictionary *post = currentData.value;
if (!post || [post isEqual:[NSNull null]]) {
return [FIRTransactionResult successWithValue:currentData];
}
NSMutableDictionary *stars = [post objectForKey:@"stars"];
if (!stars) {
stars = [[NSMutableDictionary alloc] initWithCapacity:1];
}
NSString *uid = [FIRAuth auth].currentUser.uid;
int starCount = [post[@"starCount"] intValue];
if ([stars objectForKey:uid]) {
// Unstar the post and remove self from stars
starCount--;
[stars removeObjectForKey:uid];
} else {
// Star the post and add self to stars
starCount++;
stars[uid] = @YES;
}
post[@"stars"] = stars;
post[@"starCount"] = [NSNumber numberWithInt:starCount];
// Set value and report transaction success
[currentData setValue:post];
return [FIRTransactionResult successWithValue:currentData];
} andCompletionBlock:^(NSError * _Nullable error,
BOOL committed,
FIRDataSnapshot * _Nullable snapshot) {
// Transaction completed
if (error) {
NSLog(@"%@", error.localizedDescription);
}
}];
// [END post_stars_transaction]
}
@end