Commit 7a10d517 by pidan

Merge branch 'feature/私享房老玩家分支' into feature/私享房需求

* feature/私享房老玩家分支:
  完成除了网页链接打开进入直播间之外的其他进入直播间上报
  完成老玩家回归直播间检测弹窗
  接入两个分享
  完成首冲和老玩家回归充值相关
  完成老玩家回归次级页面
  完成召回一级页面
  完成注扫码册绑定相关
  完成注册前绑定邀请人的准备

# Conflicts:
#	DevelopmentPods/FUSCommon/FUSCommon/Classes/Common/Models/FUSSettingConfigModel.h
#	Modules/FUSShowRoomModule/FUSShowRoomModule.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/xcschememanagement.plist
#	Modules/FUSUserCenterModule/FUSUserCenterModule.xcodeproj/xcuserdata/aaa.xcuserdatad/xcschemes/xcschememanagement.plist
#	Pods/Pods.xcodeproj/project.pbxproj
parents 48c8453d d7043f3a
Showing with 739 additions and 11 deletions
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_icon_chat_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_icon_chat_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_Instagram_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_Instagram_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_Messenger_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_Messenger_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_Wechat_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_Wechat_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_line_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_line_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_twitter_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_twitter_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_Live_whatsapp_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_Live_whatsapp_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Share_live_facebook_large@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Share_live_facebook_large@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "zone_account_large_diamond@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "zone_account_large_diamond@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
//
// FUSAccountAgentcodeVerifyModel.h
// FUSCommon
//
// Created by aaa on 2025/6/20.
//
#import <FUSFoundation/FUSFoundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface FUSAccountAgentcodeVerifyInfoModel : FUSBaseModel
/// 使者ID
@property (nonatomic, copy) NSString *uid;
/// 使者昵称
@property (nonatomic, copy) NSString *nickname;
/// 使者头像
@property (nonatomic, copy) NSString *face;
/// 使者富豪等级
@property (nonatomic, assign) NSInteger level;
/// 是否VIP(0:否/1:是)
@property (nonatomic, assign) BOOL vip;
@end
@interface FUSAccountAgentcodeVerifyModel : FUSBaseModel
/// 使者信息(code=1返回)
@property (nonatomic, strong) FUSAccountAgentcodeVerifyInfoModel *info;
/// 来源(未找到,不返回)
@property (nonatomic, copy) NSString *origin;
@end
@interface FUSLiveSyncRightResultRecallShowModel : FUSBaseModel
/// 是否可完成回归大礼包资格(-1:不可完成、1:允许完成)
@property (nonatomic, assign) NSInteger recallShow;
/// 在直播間觀看超過指定时长(秒)
@property (nonatomic, assign) NSInteger recallOnlineTime;
/// 在直播間發言数量超過指定条数
@property (nonatomic, assign) NSInteger recallSendSpeak;
/// 展示类型 -1:无 1:首充储值 2:用户回归
@property (nonatomic, assign) NSInteger showChargeType;
-(void)fus_updateShowTime;
-(BOOL)fus_checkCanShow;
@end
NS_ASSUME_NONNULL_END
//
// FUSAccountAgentcodeVerifyModel.m
// FUSCommon
//
// Created by aaa on 2025/6/20.
//
#import "FUSAccountAgentcodeVerifyModel.h"
#import <FUSFoundation/FUSFoundation-Swift.h>
#import <FUSCommon/FUSCommon-Swift.h>
@implementation FUSAccountAgentcodeVerifyInfoModel
@end
@implementation FUSAccountAgentcodeVerifyModel
@end
@implementation FUSLiveSyncRightResultRecallShowModel
- (void)fus_updateShowTime{
[[NSUserDefaults standardUserDefaults] setDouble:[[NSDate date] timeIntervalSince1970] forKey:FUSSwiftCacheDataStoreKey.liveSyncRightResultRecallShowTimeInterval];
}
- (BOOL)fus_checkCanShow{
if (self.recallShow != 1) {
return NO;
}
NSTimeInterval lastShowTime = [[NSUserDefaults standardUserDefaults] doubleForKey:FUSSwiftCacheDataStoreKey.liveSyncRightResultRecallShowTimeInterval];
if (lastShowTime > 1) {
NSDate *lasShowDate = [NSDate dateWithTimeIntervalSince1970:lastShowTime];
if ([lasShowDate fus_oc_isSameWithUnit:NSCalendarUnitDay otherDate:[NSDate date]]) {
return YES;
}
}
else {
// 没有记录过,那么就是没弹过
return YES;
}
return NO;
}
@end
......@@ -59,6 +59,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, assign) NSInteger guideTime;
/// 私享房私信默认选中礼物ID
@property (nonatomic, assign) NSInteger initRoomPrivateImGiftId;
/// 使者邀请占位:老用戶具體天數
@property (nonatomic, assign) NSInteger inviteDataRecallShowDay;
@end
......
......@@ -244,4 +244,22 @@ typedef enum : NSUInteger {
+ (void)fus_doEverydayStatLogWithSuccess:(void (^)(void))success
failure:(void (^)(NSString *msg, int code))failure;
/// App行为日志-加入直播间
/// @param reqType 加入直播间来源 1首页 2空间 3网页 4注册后自动加入 5外部调起
/// @param reqEventType 加入直播间来源子项,reqType=5的子项有3种:1系统推送进入 2直播间分享链接进入 3外部网页进入
/// @param extraInfo 有则传,额外信息,非json。存储需要可以直接展示查看的数据,比如 外部网页加入直播间 的网页URL
/// @param extraJson 有则传,json字符串。例如存储网页加入直播间的参数包、外部调起加入直播间参数包
/// @param roomId 房间id
+(void)fus_behaviorJoinRoomLogWithReqType:(NSInteger)reqType
reqEventType:(NSInteger)reqEventType
extraInfo:(NSString *)extraInfo
extraJson:(NSString *)extraJson
roomId:(NSString *)roomId;
/// App行为日志-外部调起
/// @param reqType 外部调起类型 1官网 2邀请链接 3直播间分享链接打开 4应用商店打开(appstore/googleplay) 5手机推送打开
/// @param reqEventType 外部调起来源子项,reqType=4的子项有2种:1appstore 2googleplay
/// @param reqJson json字符串,外部调起的参数包
+(void)fus_behaviorExternalCallLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType reqJson:(NSString *)reqJson;
@end
......@@ -520,4 +520,33 @@
}];
}
/// App行为日志-外部调起
+ (void)fus_behaviorExternalCallLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType reqJson:(NSString *)reqJson{
NSMutableDictionary *parm = [[NSMutableDictionary alloc] initWithDictionary:@{@"reqType": @(reqType),
@"reqJson": reqJson ?: @""}];
if (reqEventType > 0) {
parm[@"reqEventType"] = @(reqEventType);
}
[FUSHttpHelper postRequestBinaryWithUrl:FUSCommonURLs.fus_URL_behaviorExternalCallLog params:parm success:^(NSDictionary * _Nullable dataDict, int code) {
} failure:^(NSDictionary * _Nullable dataDict, int code) {
}];
}
/// App行为日志-加入直播间
+ (void)fus_behaviorJoinRoomLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType extraInfo:(NSString *)extraInfo extraJson:(NSString *)extraJson roomId:(NSString *)roomId{
NSMutableDictionary *parm = [[NSMutableDictionary alloc] initWithDictionary:@{@"reqType": @(reqType),
@"extraInfo": extraInfo ?: @"",
@"extraJson": extraJson ?: @"",
@"roomId": roomId}];
if (reqEventType > 0) {
parm[@"reqEventType"] = @(reqEventType);
}
[FUSHttpHelper postRequestBinaryWithUrl:FUSCommonURLs.fus_URL_behaviorJoinRoomLog params:parm success:^(NSDictionary * _Nullable dataDict, int code) {
} failure:^(NSDictionary * _Nullable dataDict, int code) {
}];
}
@end
......@@ -40,6 +40,24 @@ typedef enum : NSUInteger {
// 环信登录失败日志上报
+ (void)fus_easeMobLoginFailWithInfo:(NSString *)logInfo;
/// App行为日志-加入直播间
/// @param reqType 加入直播间来源 1首页 2空间 3网页 4注册后自动加入 5外部调起
/// @param reqEventType 加入直播间来源子项,reqType=5的子项有3种:1系统推送进入 2直播间分享链接进入 3外部网页进入
/// @param extraInfo 有则传,额外信息,非json。存储需要可以直接展示查看的数据,比如 外部网页加入直播间 的网页URL
/// @param extraJson 有则传,json字符串。例如存储网页加入直播间的参数包、外部调起加入直播间参数包
/// @param roomId 房间id
+(void)fus_behaviorJoinRoomLogWithReqType:(NSInteger)reqType
reqEventType:(NSInteger)reqEventType
extraInfo:(NSString *)extraInfo
extraJson:(NSString *)extraJson
roomId:(NSString *)roomId;
/// App行为日志-外部调起
/// @param reqType 外部调起类型 1官网 2邀请链接 3直播间分享链接打开 4应用商店打开(appstore/googleplay) 5手机推送打开
/// @param reqEventType 外部调起来源子项,reqType=4的子项有2种:1appstore 2googleplay
/// @param reqJson json字符串,外部调起的参数包
+(void)fus_behaviorExternalCallLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType reqJson:(NSString *)reqJson;
// 开始socket 连接
+ (void)fus_startSocketConnect;
......
......@@ -119,6 +119,15 @@
}
}
/// App行为日志-外部调起
+ (void)fus_behaviorExternalCallLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType reqJson:(NSString *)reqJson{
[FUSCommonHttpRequest fus_behaviorExternalCallLogWithReqType:reqType reqEventType:reqEventType reqJson:reqJson];
}
/// App行为日志-加入直播间
+ (void)fus_behaviorJoinRoomLogWithReqType:(NSInteger)reqType reqEventType:(NSInteger)reqEventType extraInfo:(NSString *)extraInfo extraJson:(NSString *)extraJson roomId:(NSString *)roomId{
[FUSCommonHttpRequest fus_behaviorJoinRoomLogWithReqType:reqType reqEventType:reqEventType extraInfo:extraInfo extraJson:extraJson roomId:roomId];
}
#pragma --mark 登录计时
// 点击登录
+ (void)fus_startLoginWithLoginType:(SignType)signType {
......
......@@ -407,6 +407,24 @@
}];
}
break;
case MessengerPlatform:
{
[shareManager fus_shareMessengerWithContentURL:urlString quote:content imageOrUrl:imageOrUrl from:from roomId:roomId viewController:viewController shareType:shareType success:^{
if(success)success();
} failure:^{
if(failure)failure();
}];
}
break;
case InstagramPlatform:
{
[shareManager fus_shareInstagramWithTitle:title content:content Image:image urlString:urlString from:from roomId:roomId shareType:shareType success:^{
if(success)success();
} failure:^{
if(failure)failure();
}];
}
break;
case WechatFriendPlatform:
{
//wechat分享结果都是成功回调
......
......@@ -15,6 +15,8 @@ typedef NS_ENUM(NSUInteger, SocialSharePlatform) {
WechatCirclePaltform,
LineSharePlatform,
WhatsAppPlatform,
InstagramPlatform,
MessengerPlatform,
CopyLink,
BarcodePhotoPlatform, //二维码图片
FriendChatShare, // 分享给好友
......@@ -97,6 +99,28 @@ typedef NS_ENUM(NSInteger, FUSFrom) {
success:(void(^_Nullable)(void))success
failure:(void(^_Nullable)(void))failure;
/// messenger 分享
- (void)fus_shareMessengerWithContentURL:(NSString *)contentURL
quote:(NSString *)quote
imageOrUrl:(id)imageOrUrl
from:(FUSFrom)from
roomId:(NSString *)roomId
viewController:(UIViewController *)viewController
shareType:(FUSShareType)shareType
success:(void (^)(void))success
failure:(void (^)(void))failure;
/// Instagram 分享
- (void)fus_shareInstagramWithTitle:(NSString *)title
content:(NSString *)content
Image:(UIImage *)image
urlString:(NSString *)urlString
from:(FUSFrom)from
roomId:(NSString *)roomId
shareType:(FUSShareType)shareType
success:(void (^)(void))success
failure:(void (^)(void))failure;
/**
Twitter 分享(原生)
......
......@@ -89,6 +89,118 @@
}];
}
- (void)fus_shareInstagramWithTitle:(NSString *)title
content:(NSString *)content
Image:(UIImage *)image
urlString:(NSString *)urlString
from:(FUSFrom)from
roomId:(NSString *)roomId
shareType:(FUSShareType)shareType
success:(void (^)(void))success
failure:(void (^)(void))failure{
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"instagram://app"]] == NO) {
[FUSDialogView fus_showDialog:[NSString stringWithFormat:[NSString fus_localString:@"请先安装%@"],@"Instagram"]];
failure();
return;
}
self.shareSuccess = success;
self.shareFailure = failure;
if (shareType == FUSShareTypeText) {
NSString *url = [NSString stringWithFormat:@"instagram://sharesheet?text=%@",content ?: @""];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
// success();
}
else if (shareType == FUSShareTypeImage || shareType == FUSShareTypeImageWithText) {
// 其实 Instagram 只给分享image
UIImageWriteToSavedPhotosAlbum(image, self, @selector(fus_instagramSaveImage: didFinishSavingWithError: contextInfo:), nil);
}
else if (shareType == FUSShareTypeWebUrl) {
NSString *url = [NSString stringWithFormat:@"instagram://sharesheet?text=%@%@",title,urlString];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
}
//上报分享请求数据
[self shareDataReportToSeverWithPlatform:InstagramPlatform from:from roomId:roomId];
}
-(void)fus_instagramSaveImage:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(id)contextInfo{
if (error != nil) {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享失败"]];
self.shareFailure();
}
else {
NSURL *shareURL = [NSURL URLWithString:@"instagram://library?LocalIdentifier=latest"];
[[UIApplication sharedApplication] openURL:shareURL];
}
}
/// messenger分享
- (void)fus_shareMessengerWithContentURL:(NSString *)contentURL
quote:(NSString *)quote
imageOrUrl:(id)imageOrUrl
from:(FUSFrom)from
roomId:(NSString *)roomId
viewController:(UIViewController *)viewController
shareType:(FUSShareType)shareType
success:(void (^)(void))success
failure:(void (^)(void))failure{
self.shareSuccess = success;
self.shareFailure = failure;
_from = from;
_roomId = roomId;
MJWeakSelf
//上报分享请求数据
[self shareDataReportToSeverWithPlatform:MessengerPlatform from:from roomId:roomId];
if (shareType == FUSShareTypeImageWithText && [imageOrUrl isKindOfClass:[NSString class]] && ![NSString isNull:imageOrUrl]) {
// web 链接分享
[[FUSFacebookHelper shared] fus_messengerShareWithType:FUSFacebookHelperShareTypeImageWithText controller:viewController contentURL:contentURL image:nil imageUrl:(NSString *)imageOrUrl success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:MessengerPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享取消"]];
}else {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享失败"]];
}
}];
}else if(shareType == FUSShareTypeImage && [imageOrUrl isKindOfClass:[UIImage class]]){
[[FUSFacebookHelper shared] fus_messengerShareWithType:FUSFacebookHelperShareTypeImage controller:viewController contentURL:nil image:(UIImage *)imageOrUrl imageUrl:nil success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:MessengerPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享取消"]];
}else {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享失败"]];
}
}];
}else{
// web 链接分享
[[FUSFacebookHelper shared] fus_messengerShareWithType:FUSFacebookHelperShareTypeWebUrl controller:viewController contentURL:contentURL image:nil imageUrl:nil success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:MessengerPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享取消"]];
}else {
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享失败"]];
}
}];
}
}
/**
facebook分享(原生)
......@@ -125,7 +237,7 @@
[[FUSFacebookHelper shared] fus_facebookShareWithType:FUSFacebookHelperShareTypeImageWithText controller:viewController contentURL:contentURL image:nil imageUrl:(NSString *)imageOrUrl success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:TwitterPlatform shareSuccess:nil shareFailed:nil];
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:FacebookPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
......@@ -161,7 +273,7 @@
[[FUSFacebookHelper shared] fus_facebookShareWithType:FUSFacebookHelperShareTypeImage controller:viewController contentURL:nil image:(UIImage *)imageOrUrl imageUrl:nil success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:TwitterPlatform shareSuccess:nil shareFailed:nil];
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:FacebookPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
......@@ -184,7 +296,7 @@
[[FUSFacebookHelper shared] fus_facebookShareWithType:FUSFacebookHelperShareTypeWebUrl controller:viewController contentURL:contentURL image:nil imageUrl:nil success:^{
//上报分享成功
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:TwitterPlatform shareSuccess:nil shareFailed:nil];
[weakSelf shareResultStateWithShareState:SSDKResponseStateSuccess andPlatform:FacebookPlatform shareSuccess:nil shareFailed:nil];
[FUSDialogView fus_showDialog:[NSString fus_localString:@"分享成功"]];
} failure:^(BOOL isCancel) {
if (isCancel) {
......
......@@ -30,6 +30,7 @@
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#import "FUSLivePublicDefine.h"
#import "FUSDataStatisticsManager.h"
static NSString *FUSWebRightBtnExtraInfoKey = @"FUSWebRightBtnExtraInfoKey"; //官方认证的key
......@@ -1138,6 +1139,15 @@ NSString * const kEVENT_RECHARGE_FIRST_RECHARGE_WINDOW_RECEIVE_OFFICIAL_RECAHARG
[FIRAnalytics logEventWithName:@"enterroom" parameters:@{@"source":@"other",
@"useruid":[FUSCacheDataShare shareStore].userDetailInfo.uid,
@"broadcasteruid":roomModel.roomId}];
// 2. 转换为 JSON Data
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataDict
options:NSJSONWritingPrettyPrinted
error:&error];
if (error == nil) {
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[FUSDataStatisticsManager fus_behaviorJoinRoomLogWithReqType:3 reqEventType:-1 extraInfo:@"" extraJson:jsonString roomId:roomModel.roomId];
}
}
}
break;
......
......@@ -125,6 +125,11 @@
@property (nonatomic,strong) NSString *agentCode;
@property (nonatomic,strong) NSString *bindType;
/// 自动绑定,来源
@property (nonatomic, copy) NSString *origin;
/// 来源类型 1:指纹 2:扫码
@property (nonatomic, copy) NSString *originType;
/// 获取用户数据交易提醒
@property (nonatomic, strong) FUSUserTradeRemindModel *userTradeRemindModel;
......
......@@ -15,6 +15,11 @@ import RxSwift
private let disposeBag = DisposeBag()
// - OC PART
/// 当前是否登录
@objc public var oc_isLogin: Bool {
get{ FUSSwiftCacheDataShare.share.isLogin.value }
set{ FUSSwiftCacheDataShare.share.isLogin.accept(newValue) }
}
/// 用户信息 OC,这个数据的索引是在FUSCacheDataShare中的,修改数据的时候修改FUSCacheDataShare中的就行了
@objc public var oc_userInfo: FUSUserInfosModel?{
get{ FUSSwiftCacheDataShare.share.userInfo.value }
......@@ -45,6 +50,11 @@ import RxSwift
get{ FUSSwiftCacheDataShare.share.userFirstChargeAlertInfo.value }
set{ FUSSwiftCacheDataShare.share.userFirstChargeAlertInfo.accept(newValue) }
}
/// 回归大礼包资格 实际上就是在userFirstChargeAlertInfo里面截取的,因为两次业务时间过于久远,就不动上面的了
@objc public var oc_liveSyncRightResultRecallShowModel: FUSLiveSyncRightResultRecallShowModel {
get{ FUSSwiftCacheDataShare.share.liveSyncRightResultRecallShowModel.value }
set{ FUSSwiftCacheDataShare.share.liveSyncRightResultRecallShowModel.accept(newValue) }
}
/// 等级数据 OC
@objc public var oc_levelModelList: [FUSLevelDataModel]?{
get{ FUSSwiftCacheDataShare.share.levelModelList.value }
......@@ -81,6 +91,8 @@ import RxSwift
public let rechargeDataModelDict: BehaviorRelay<[String: FUSRechargeDataModel]> = .init(value: [:])
/// 用户首充信息弹窗的资料
public let userFirstChargeAlertInfo = BehaviorRelay<[String: Any]>(value: [:])
/// 回归大礼包资格 实际上就是在userFirstChargeAlertInfo里面截取的,因为两次业务时间过于久远,就不动上面的了
public let liveSyncRightResultRecallShowModel: BehaviorRelay<FUSLiveSyncRightResultRecallShowModel> = .init(value: .init())
/// 等级数据
public let levelModelList: BehaviorRelay<[FUSLevelDataModel]?> = .init(value: nil)
/// 用户一些设置
......@@ -130,6 +142,8 @@ import RxSwift
/// 用户是否在注册之后绑定了使者码
public var bindAgentCodeSuccessData: [AnyHashable: Any]?
/// 注册的时候绑定成功的标志性:1=绑定成功,0=绑定失败
public var registeredBindsuccess: Int = 0
// - base
public override init() {
......@@ -234,6 +248,7 @@ import RxSwift
self.isLogin.accept(false)
self.settingConfigModel.accept(nil)
self.bindAgentCodeSuccessData = nil
self.registeredBindsuccess = 0
}
/// 请求背包头部
func fus_requestBackpackTypeList(from: ReadCacheFromType){
......@@ -338,11 +353,13 @@ import RxSwift
@objc public static let inviteUserInfo: Int = 11033
}
/// 本地存储的key
class FUSSwiftCacheDataStoreKey{
@objcMembers public class FUSSwiftCacheDataStoreKey: NSObject{
///用户背包未读道具的存储
static let backpackUnreadGetTimeKey = "CacheData_store_backpackUnreadGetTime"
///用户提示有新座驾的显示提示那个时间
static let showUseCarTipsDateKey = "CacheData_store_showUseCarTipsDateKey"
/// 记录回归大礼包弹出的时间
@objc static public let liveSyncRightResultRecallShowTimeInterval = "CacheData_store_liveSyncRightResultRecallShowTimeInterval"
}
......@@ -372,6 +389,29 @@ extension SocialSharePlatform {
}
}
public var shareLargeIcon: UIImage? {
switch self {
case .FacebookPlatform:
return UIImage.com_ImageNamed("Share_live_facebook_large")
case .TwitterPlatform:
return UIImage.com_ImageNamed("Share_Live_twitter_large")
case .WechatFriendPlatform:
return UIImage.com_ImageNamed("Share_Live_Wechat_large")
case .WechatCirclePaltform:
return UIImage.com_ImageNamed("Share_Live_Circle_large")
case .LineSharePlatform:
return .com_ImageNamed("Share_Live_line_large")
case .WhatsAppPlatform:
return .com_ImageNamed("Share_Live_whatsapp_large")
case .InstagramPlatform:
return .com_ImageNamed("Share_Live_Instagram_large")
case .MessengerPlatform:
return .com_ImageNamed("Share_Live_Messenger_large")
default:
return .init()
}
}
public var shareName: String {
switch self {
case .FacebookPlatform:
......@@ -390,6 +430,10 @@ extension SocialSharePlatform {
return .fus_localString("好友")
case .WhatsAppPlatform:
return "WhatsApp"
case .InstagramPlatform:
return "Instagram"
case .MessengerPlatform:
return "Messenger"
default:
return ""
}
......
......@@ -133,6 +133,12 @@ NS_ASSUME_NONNULL_BEGIN
// 设备日常统计日志 11001
+ (NSString *)fus_URL_STAT_LOG;
/// App行为日志-外部调起
+ (NSString *)fus_URL_behaviorExternalCallLog;
/// App行为日志-加入直播间
+ (NSString *)fus_URL_behaviorJoinRoomLog;
// 打开 App 发送 IDFA
+ (NSString *)fus_URL_IDFA;
......
......@@ -205,6 +205,15 @@
return [FUSConfig.sharedInstanced.pathConfigs apiUrl:@"/stat/log"];
}
/// App行为日志-外部调起
+ (NSString *)fus_URL_behaviorExternalCallLog{
return [FUSConfig.sharedInstanced.pathConfigs apiUrl:@"/stat/behavior/externalCall/log"];
}
/// App行为日志-加入直播间
+ (NSString *)fus_URL_behaviorJoinRoomLog{
return [FUSConfig.sharedInstanced.pathConfigs apiUrl:@"/stat/behavior/joinRoom/log"];
}
// 打开 App 发送 IDFA
+ (NSString *)fus_URL_IDFA {
return [FUSConfig.sharedInstanced.pathConfigs apiUrl:@"/open/open_automatic.html"];
......
......@@ -88,6 +88,8 @@
#define ROOM_CID_RoomPopularChanged 11019 // 人气值变化消息
#define ROOM_CID_receivePatAudience 11025 // 接收撩一撩信息的cid
#define ROOM_CID_receiveAnchorRewardChanged 11200 // fusi直播奖励数据变化
/// 用户回归礼包socket通知
#define ROOM_CID_recallRewardPacket 11034
// 更新直播间互动游戏开关状态socket
#define ROOM_CID_liveInteractionGameStateDidChanged 20204
......
......@@ -26,4 +26,6 @@ typedef NS_ENUM(NSInteger,FUSRechargePageFrom) {
+ (void)fus_showRechargeViewControllerForRootVC:(UIViewController *)rootVC from:(FUSFrom)from rechargePageFrom:(FUSRechargePageFrom)rechargePageFrom backHandler:(void(^)(void))backHandler;
+ (FUSRechargeViewController *)fus_getAndShowRechargeViewControllerForRootVC:(UIViewController *)rootVC from:(FUSFrom)from rechargePageFrom:(FUSRechargePageFrom)rechargePageFrom backHandler:(void(^)(void))backHandler;
-(void)fus_showRecallPacketIfIneed;
@end
......@@ -29,6 +29,8 @@
#import <Masonry/Masonry.h>
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#import "FUSLivePublicDefine.h"
#import <FUSCommon/FUSCommon-Swift.h>
#import <FUSFoundation/FUSFoundation-Swift.h>
NSString * const kFUSRechargeTableViewCellID = @"FUSRechargeTableViewCell";
// 官方储值页
......@@ -61,7 +63,12 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
@property (weak, nonatomic) IBOutlet UIView *topBgImageView;
/// 首冲的banner
@property (weak, nonatomic) IBOutlet UIButton *firstChargeBtn;
@property (nonatomic, assign) NSInteger checkingSelectedIndex;
/// tableview 距离宝石数量面板的距离
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *tableViewTopConstraint;
// 从哪个页面来
@property (nonatomic, assign) FUSFrom from;
......@@ -69,6 +76,9 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
// 通过什么途径过来的
@property (nonatomic, assign) FUSRechargePageFrom rechargePageFrom;
/// 加载完成的时候,显示打开回归大礼包H5配置
@property (nonatomic, assign) BOOL showRecallPacketIfIneed;
@end
@implementation FUSRechargeViewController
......@@ -172,6 +182,15 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
return [super initWithNibName:nibNameOrNil bundle:FUSCommonBundle.bundle];
}
- (instancetype)init
{
self = [super init];
if (self) {
self.showRecallPacketIfIneed = NO;
}
return self;
}
- (void)viewDidLoad
{
// [FIRAnalytics logEventWithName:@"view_item_list" parameters:@{@"recharge_type":@"apple_iap"}];
......@@ -278,12 +297,28 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
headerBgLayerView.layer.shadowOpacity = 0.3;
headerBgLayerView.layer.shadowOffset = CGSizeMake(0, 2);
// headerBgLayerView.layer.shadowRadius = 12;
self.diamondImageView.image = UIImage.fus_diamonIcon;
// self.diamondImageView.image = UIImage.fus_diamonIcon;
[self.topBgImageView insertSubview:headerBgLayerView atIndex:0];
[headerBgLayerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.inset(18);
make.top.bottom.inset(10);
}];
// 首冲相关
self.tableViewTopConstraint.constant = 10;
self.firstChargeBtn.hidden = YES;
NSDictionary *firstChargeDict = [FUSSwiftCacheDataShare share].oc_userFirstChargeAlertInfo[@"firstCharge"];
BOOL isQualifications = [firstChargeDict[@"isQualifications"] boolValue];
NSString *firstChargeIcon = [firstChargeDict[@"icon"] stringValue];
BOOL checkVersionStatus = [FUSConfig sharedInstanced].devConfigs.appStatus;
if (isQualifications == YES && checkVersionStatus == NO) {
// 有资格
self.firstChargeBtn.hidden = NO;
self.tableViewTopConstraint.constant = (UIView.fus_screenW - 18*2)/657.0*184.0 + 10;
[self.firstChargeBtn setWebBackgroundImageWithSubURLString:firstChargeIcon];
}
}
- (void)viewWillAppear:(BOOL)animated {
......@@ -293,6 +328,19 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
[self getUsersDataWithType:ReadServerBegin];
}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
if (self.showRecallPacketIfIneed == YES) {
self.showRecallPacketIfIneed = NO;
[self onClickFirstChargeAction:self.firstChargeBtn];
}
}
-(void)fus_showRecallPacketIfIneed{
self.showRecallPacketIfIneed = YES;
}
#pragma mark - 初始化View
- (void)initView
{
......@@ -353,6 +401,29 @@ NSString * const kEVENT_RECHARGE_OFFICIAL_PAGE_RETURN = @"officialrecharge_retur
}
#pragma mark 跳转到储值记录界面
/// 首冲
- (IBAction)onClickFirstChargeAction:(UIButton *)sender {
NSMutableDictionary *firstChargeDict = [[NSMutableDictionary alloc] initWithDictionary:[FUSSwiftCacheDataShare share].oc_userFirstChargeAlertInfo[@"firstCharge"]];
NSDictionary *popupStyle = firstChargeDict[@"popupStyle"];
NSString *receiveUrl = [firstChargeDict[@"receiveUrl"] stringValue];
NSInteger popupType = [popupStyle[@"popupType"] integerValue];
if (popupType == 1) {
FUSWKWebViewController *webVC = [[FUSWKWebViewController alloc] init];
webVC.shouldIncludeIdentifyInfo = YES;
webVC.webUrlString = receiveUrl;
[self.navigationController pushViewController:webVC animated:YES];
}
else {
if (firstChargeDict[@"width"] == nil) {
firstChargeDict[@"width"] = firstChargeDict[@"wide"];
firstChargeDict[@"height"] = firstChargeDict[@"high"];
}
[[FUSRouter userRouter] fus_showInviteRewardHalfWebAlertView:firstChargeDict rootView:[UIWindow fus_keyWindow]];
}
}
/**
记录按钮点击(储值记录/消费记录)
*/
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23727" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina5_9" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23721"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
......@@ -15,8 +15,10 @@
<outlet property="exchangeArrowImageView" destination="Ty8-Sa-7oO" id="USg-8o-KWL"/>
<outlet property="exchangeBackView" destination="duE-Jr-NIV" id="pVy-mN-mXD"/>
<outlet property="exchangeBtn" destination="Iv0-XU-obm" id="lUY-6K-pEX"/>
<outlet property="firstChargeBtn" destination="kEE-Ee-qGu" id="Hgb-zk-OmO"/>
<outlet property="normalView" destination="i5M-Pr-FkT" id="FqY-Xl-mlg"/>
<outlet property="tableView" destination="o3j-Et-9JY" id="dY5-9P-0P5"/>
<outlet property="tableViewTopConstraint" destination="2fe-qZ-Dzv" id="gpV-Le-O5o"/>
<outlet property="topBgImageView" destination="Tax-eY-knd" id="GZU-bQ-RW1"/>
<outlet property="view" destination="zXO-Sr-vIN" id="9Wb-3r-dQ5"/>
</connections>
......@@ -29,7 +31,7 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Tax-eY-knd">
<rect key="frame" x="0.0" y="50" width="375" height="140"/>
<rect key="frame" x="0.0" y="100" width="375" height="140"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="zone_account_large_diamond" translatesAutoresizingMaskIntoConstraints="NO" id="aaY-22-EGN">
<rect key="frame" x="167.66666666666666" y="34" width="40" height="40"/>
......@@ -51,11 +53,11 @@
</constraints>
</view>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" showsVerticalScrollIndicator="NO" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="o3j-Et-9JY">
<rect key="frame" x="0.0" y="190" width="375" height="508"/>
<rect key="frame" x="0.0" y="340" width="375" height="324"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
</tableView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="duE-Jr-NIV">
<rect key="frame" x="0.0" y="732" width="375" height="40"/>
<rect key="frame" x="0.0" y="698" width="375" height="40"/>
<subviews>
<button opaque="NO" userInteractionEnabled="NO" contentMode="scaleToFill" contentHorizontalAlignment="leading" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Iv0-XU-obm">
<rect key="frame" x="20" y="8" width="300" height="24"/>
......@@ -81,11 +83,22 @@
<constraint firstItem="Iv0-XU-obm" firstAttribute="leading" secondItem="duE-Jr-NIV" secondAttribute="leading" constant="20" id="eaI-I6-YY1"/>
</constraints>
</view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kEE-Ee-qGu">
<rect key="frame" x="18" y="240" width="339" height="95"/>
<constraints>
<constraint firstAttribute="width" secondItem="kEE-Ee-qGu" secondAttribute="height" multiplier="657:184" id="1Jj-TY-WKR"/>
</constraints>
<inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
<connections>
<action selector="onClickFirstChargeAction:" destination="-1" eventType="touchUpInside" id="FkZ-M1-4n6"/>
</connections>
</button>
</subviews>
<viewLayoutGuide key="safeArea" id="qZr-Ol-i12"/>
<color key="backgroundColor" red="0.039215686274509803" green="0.039215686274509803" blue="0.039215686274509803" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="o3j-Et-9JY" firstAttribute="top" secondItem="Tax-eY-knd" secondAttribute="bottom" id="2fe-qZ-Dzv"/>
<constraint firstItem="o3j-Et-9JY" firstAttribute="top" secondItem="Tax-eY-knd" secondAttribute="bottom" constant="100" id="2fe-qZ-Dzv"/>
<constraint firstItem="kEE-Ee-qGu" firstAttribute="leading" secondItem="qZr-Ol-i12" secondAttribute="leading" constant="18" id="4D9-rf-87b"/>
<constraint firstItem="o3j-Et-9JY" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="5aw-tZ-LTh"/>
<constraint firstItem="duE-Jr-NIV" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="6Ac-w6-j00"/>
<constraint firstAttribute="trailing" secondItem="o3j-Et-9JY" secondAttribute="trailing" id="6Xx-89-gkB"/>
......@@ -94,7 +107,9 @@
<constraint firstAttribute="trailing" secondItem="duE-Jr-NIV" secondAttribute="trailing" id="Kil-d7-etb"/>
<constraint firstItem="duE-Jr-NIV" firstAttribute="bottom" secondItem="qZr-Ol-i12" secondAttribute="bottom" constant="-6" id="SBt-Tl-ydZ"/>
<constraint firstItem="qZr-Ol-i12" firstAttribute="bottom" secondItem="o3j-Et-9JY" secondAttribute="bottom" constant="80" id="Z3v-8v-75t"/>
<constraint firstItem="qZr-Ol-i12" firstAttribute="trailing" secondItem="kEE-Ee-qGu" secondAttribute="trailing" constant="18" id="kjF-f4-9WX"/>
<constraint firstAttribute="trailing" secondItem="Tax-eY-knd" secondAttribute="trailing" id="my4-l1-P4V"/>
<constraint firstItem="kEE-Ee-qGu" firstAttribute="top" secondItem="Tax-eY-knd" secondAttribute="bottom" id="pbc-oU-CHb"/>
</constraints>
</view>
</subviews>
......
......@@ -83,6 +83,12 @@ NS_ASSUME_NONNULL_BEGIN
allowScroll:(BOOL)allowScroll
userInteractionEnabled:(BOOL)userInteractionEnabled;
-(void)fus_showConfigHalfWebView:(NSDictionary *)configDict
needMouted:(BOOL)needMouted
allowScroll:(BOOL)allowScroll
userInteractionEnabled:(BOOL)userInteractionEnabled
dismissHandle:(void(^)(void))dismissHandle;
- (void)fus_logSuccess;
- (void)fus_logOut;
......@@ -131,6 +137,9 @@ NS_ASSUME_NONNULL_BEGIN
/// - Parameter turnTo: 需要显示哪一天的日期的时间戳,负数则不跳
-(void)fus_showLiveRecordsControllerWithTurnToTimeInterval:(NSTimeInterval)turnTo;
/// 重新加载首冲信息
-(void)fus_reloadFirstChargeAlertInfo;
@end
/// 直播间礼物面板的分页类型,区分打开背包后默认跳转到哪一个分页
......
......@@ -126,6 +126,21 @@ NS_ASSUME_NONNULL_BEGIN
/// 直播奖励網頁地址
@property (nonatomic, copy) NSString *liveRewardTaskUrl;
/// 邀请注册控制开关(0:关、1:开)
@property (nonatomic, assign) NSInteger inviteRegisterSwitch;
/// 使者邀请榜单地址
@property (nonatomic, copy) NSString *agentInviteRankAddress;
/// 主頁是否展示掃碼入口(1:展示)
@property (nonatomic, assign) NSInteger showQrCodeEntrance;
/// 红包宝箱记录H5配置 height:高 width:宽 url:访问地址
@property (nonatomic, copy) NSDictionary *redPacketRecordConfig;
/// 回归大礼包H5配置 height:高 width:宽 url:访问地址
@property (nonatomic, copy) NSDictionary *recallPacketConfig;
@end
NS_ASSUME_NONNULL_END
......@@ -17,6 +17,8 @@
#import "FUSMainSearchModel.h"
#import "FUSUserRiskLevelModel.h"
#import "FUSAccountAgentcodeVerifyModel.h"
#define FUSUserModule BFModule(FUSUserRouterProtocol)
NS_ASSUME_NONNULL_BEGIN
......@@ -292,6 +294,13 @@ NS_ASSUME_NONNULL_BEGIN
-(void)fus_showBindAgentPageWithNeedShowSkipBtn:(BOOL)needShowSkipBtn
success:(void(^)(void))success;
/// 注册的时候,绑定使者页面
/// @param registerVerifyHandle 注册验证是否成功回调
/// @param skipHandle 跳过回调
-(void)fus_showRegisterBindAgentPageWithRegisterVerify:(void(^)(FUSAccountAgentcodeVerifyModel *verifyModel,void(^errorHandle)(NSString *msg, NSInteger code)))registerVerifyHandle
skip:(void(^)(void(^dismissHandle)(void)))skipHandle
back:(void(^)(void))backHandle;
/// 显示绑定成功页面
/// @param success 1
-(void)fus_showBindAgentSuccessPopViewWithSuccess:(void(^)(void))success;
......@@ -308,6 +317,12 @@ NS_ASSUME_NONNULL_BEGIN
/// @param segmentTypeStr 跳转默认显示的页面
-(void)fus_pushToInviteRewardWithSegmentTypeStr:(NSString *)segmentTypeStr;
/// 显示邀请有奖相关半屏网页,仅兼容了邀请有奖相关的,其他有需要去补充
/// @param configDict 要素
/// @param rootView 显示在哪
-(UIView *)fus_showInviteRewardHalfWebAlertView:(NSDictionary *)configDict
rootView:(UIView *)rootView;
@end
NS_ASSUME_NONNULL_END
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment