// // KWMShoppingCart.m // iCemarose // // Created by lee on 2017/5/18. // Copyright © 2017年 kollway. All rights reserved. // #import "KWMShoppingCart.h" #import "KWMCartResult.h" #import "KWMShopCartData.h" @interface KWMShoppingCart () @property (nonatomic, strong) KWMCartResult *result; @end @implementation KWMShoppingCart - (NSMutableArray<KWMShopCartModel *> *)items { return (NSMutableArray *)_result.items; } - (NSNumber *)count { return _result.item_count; } - (void)setResult:(KWMCartResult *)result { _result = result; [[KWMShopCartData alloc] syncCartProducts:result.items]; } - (void)setResultNoSync:(KWMCartResult *)result { _result = result; } + (instancetype)sharedInstance { static KWMShoppingCart *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ instance = [[super allocWithZone:NULL] init]; }); if (!instance.result) { [instance setResultNoSync:[KWMCartResult new]]; instance.result.items = [[[KWMShopCartData alloc] getALLItems] mutableCopy]; NSInteger count = 0; for (KWMShopCartModel *item in instance.items) { count += item.quantity; } instance.result.item_count = @(count); } return instance; } - (void)allItemsWithCallback:(ShoppingCartCallBack)callback { [[KWMAPIManager sharedManager] getCartSuccess:^(NSURLSessionDataTask *task, KWMCartResult *result) { [[KWMShoppingCart sharedInstance] setResult:result]; callback(nil,result); } failure:^(NSURLSessionDataTask *task, NSError *error) { callback(error,nil); }]; } - (void)increaseProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity callback:(ShoppingCartCallBack)callback { callback(nil,[self changeLocalCartWithVariantId:variantId quantity:quantity flag:1]); [[KWMAPIManager sharedManager] addProductWithVariantId:variantId quantity:quantity success:^(NSURLSessionDataTask *task, KWMRequestResult *result) { [[KWMShoppingCart sharedInstance] allItemsWithCallback:^(NSError *error, KWMCartResult *cart) { // callback(error,cart); }]; } failure:^(NSURLSessionDataTask *task, NSError *error) { // callback(error,nil); }]; } - (void)updateProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity callback:(ShoppingCartCallBack)callback { callback(nil,[self changeLocalCartWithVariantId:variantId quantity:quantity flag:quantity ? 2 : 0]); [[KWMAPIManager sharedManager] updateProductWithVariantId:variantId quantity:quantity success:^(NSURLSessionDataTask *task, KWMCartResult *result) { [[KWMShoppingCart sharedInstance] setResult:result]; // callback(nil,result); } failure:^(NSURLSessionDataTask *task, NSError *error) { // callback(error,nil); }]; } - (void)deleteProductWithVariantId:(NSNumber *)variantId callback:(ShoppingCartCallBack)callback { [self updateProductWithVariantId:variantId quantity:0 callback:callback]; } - (KWMCartResult *) changeLocalCartWithVariantId:(NSNumber *) variantId quantity:(NSInteger) quantity flag:(NSInteger) flag { NSMutableArray<KWMShopCartModel *> *items= self.items; NSInteger count = self.result.item_count.integerValue; BOOL processed = NO; for (KWMShopCartModel *item in items) { if (item.identifier.integerValue == variantId.integerValue) { switch (flag) { case 0: count -= item.quantity; [items removeObject:item]; break; case 1: count += quantity; item.quantity += quantity; break; default: count -= item.quantity - quantity; item.quantity = quantity; } processed = YES; break; } } if (!processed) { KWMShopCartModel *model = [[KWMShopCartModel alloc] init]; model.identifier = variantId.stringValue; model.quantity = quantity; count += quantity; [items addObject:model]; } self.result.item_count = @(count); return self.result; } + (id)allocWithZone:(struct _NSZone *)zone { return [KWMShoppingCart sharedInstance]; } - (id)copy { return self; } - (id)mutableCopy { return self; } @end