Enforce naming convention
This commit is contained in:
parent
cbac37a95f
commit
22623815bb
|
@ -4315,7 +4315,7 @@ typedef enum : NSUInteger {
|
|||
- (void)acceptFriendRequest:(TSIncomingMessage *)friendRequest
|
||||
{
|
||||
// Update the thread's friend request status
|
||||
[self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil];
|
||||
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil];
|
||||
// Send a friend request accepted message
|
||||
[ThreadUtil enqueueAcceptFriendRequestMessageInThread:self.thread];
|
||||
}
|
||||
|
@ -4323,7 +4323,7 @@ typedef enum : NSUInteger {
|
|||
- (void)declineFriendRequest:(TSIncomingMessage *)friendRequest
|
||||
{
|
||||
// Reset the thread's friend request status
|
||||
[self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
|
||||
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusNone withTransaction:nil];
|
||||
// Delete prekeys
|
||||
NSString *contactID = friendRequest.authorId;
|
||||
OWSPrimaryStorage *primaryStorage = SSKEnvironment.shared.primaryStorage;
|
||||
|
|
|
@ -29,20 +29,19 @@ extern ConversationColorName const ConversationColorNameSteel;
|
|||
|
||||
extern ConversationColorName const kConversationColorName_Default;
|
||||
|
||||
// Loki: Friend request status
|
||||
typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
|
||||
typedef NS_ENUM(NSInteger, LKThreadFriendRequestStatus) {
|
||||
/// New conversation; no messages sent or received.
|
||||
TSThreadFriendRequestStatusNone,
|
||||
LKThreadFriendRequestStatusNone,
|
||||
/// This state is used to lock the input early while sending.
|
||||
TSThreadFriendRequestStatusRequestSending,
|
||||
LKThreadFriendRequestStatusRequestSending,
|
||||
/// Friend request sent; awaiting response.
|
||||
TSThreadFriendRequestStatusRequestSent,
|
||||
LKThreadFriendRequestStatusRequestSent,
|
||||
/// Friend request received; awaiting user input.
|
||||
TSThreadFriendRequestStatusRequestReceived,
|
||||
LKThreadFriendRequestStatusRequestReceived,
|
||||
/// We are friends with the other user in this thread.
|
||||
TSThreadFriendRequestStatusFriends,
|
||||
LKThreadFriendRequestStatusFriends,
|
||||
/// A friend request was sent, but it timed out (i.e. the other user didn't accept within the allocated time).
|
||||
TSThreadFriendRequestStatusRequestExpired
|
||||
LKThreadFriendRequestStatusRequestExpired
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -56,10 +55,10 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
|
|||
@property (nonatomic, readonly) TSInteraction *lastInteraction;
|
||||
// Loki friend request handling
|
||||
// ========
|
||||
@property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus;
|
||||
@property (nonatomic) LKThreadFriendRequestStatus friendRequestStatus;
|
||||
@property (nonatomic, readonly) NSString *friendRequestStatusDescription;
|
||||
/// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusRequestSending`, `TSThreadFriendRequestStatusRequestSent`
|
||||
/// or `TSThreadFriendRequestStatusRequestReceived`.
|
||||
/// Shorthand for checking that `friendRequestStatus` is `LKThreadFriendRequestStatusRequestSending`, `LKThreadFriendRequestStatusRequestSent`
|
||||
/// or `LKThreadFriendRequestStatusRequestReceived`.
|
||||
@property (nonatomic, readonly) BOOL hasPendingFriendRequest;
|
||||
@property (nonatomic, readonly) BOOL isContactFriend;
|
||||
@property (nonatomic, readonly) BOOL hasCurrentUserSentFriendRequest;
|
||||
|
@ -200,7 +199,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
|
|||
|
||||
#pragma mark - Loki Friend Request Handling
|
||||
|
||||
- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
|
||||
- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
|
||||
|
||||
/**
|
||||
Remove any outgoing friend request message which failed to send
|
||||
|
|
|
@ -93,7 +93,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
|
|||
_conversationColorName = [self.class stableColorNameForNewConversationWithString:self.uniqueId];
|
||||
}
|
||||
|
||||
_friendRequestStatus = TSThreadFriendRequestStatusNone;
|
||||
_friendRequestStatus = LKThreadFriendRequestStatusNone;
|
||||
}
|
||||
|
||||
return self;
|
||||
|
@ -721,7 +721,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
|
|||
- (void)removeOldFriendRequestMessagesIfNeeded:(OWSInteractionType)interactionType withTransaction:(YapDatabaseReadWriteTransaction *)transaction
|
||||
{
|
||||
// If we're friends with the person then we don't need to remove any friend request messages
|
||||
if (self.friendRequestStatus == TSThreadFriendRequestStatusFriends) { return; }
|
||||
if (self.friendRequestStatus == LKThreadFriendRequestStatusFriends) { return; }
|
||||
|
||||
NSMutableArray<NSString *> *idsToRemove = [NSMutableArray new];
|
||||
__block TSMessage *_Nullable messageToKeep = nil; // We want to keep this interaction and not remove it
|
||||
|
@ -739,11 +739,11 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
|
|||
|
||||
// We want to remove any old incoming friend request messages which are pending
|
||||
if (interactionType == OWSInteractionType_IncomingMessage) {
|
||||
removeMessage = message.friendRequestStatus == TSMessageFriendRequestStatusPending;
|
||||
removeMessage = message.friendRequestStatus == LKMessageFriendRequestStatusPending;
|
||||
} else {
|
||||
// Or if we're sending then remove any failed friend request messages
|
||||
TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)message;
|
||||
removeMessage = outgoingMessage.friendRequestStatus == TSMessageFriendRequestStatusSendingOrFailed;
|
||||
removeMessage = outgoingMessage.friendRequestStatus == LKMessageFriendRequestStatusSendingOrFailed;
|
||||
}
|
||||
|
||||
if (removeMessage) {
|
||||
|
@ -765,7 +765,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
|
|||
}
|
||||
}
|
||||
|
||||
- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
|
||||
- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
|
||||
{
|
||||
self.friendRequestStatus = friendRequestStatus;
|
||||
OWSLogInfo(@"[Loki] Setting thread friend request status to %@.", self.friendRequestStatusDescription);
|
||||
|
@ -784,34 +784,34 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
|
|||
- (NSString *)friendRequestStatusDescription
|
||||
{
|
||||
switch (self.friendRequestStatus) {
|
||||
case TSThreadFriendRequestStatusNone: return @"none";
|
||||
case TSThreadFriendRequestStatusRequestSending: return @"sending";
|
||||
case TSThreadFriendRequestStatusRequestSent: return @"sent";
|
||||
case TSThreadFriendRequestStatusRequestReceived: return @"received";
|
||||
case TSThreadFriendRequestStatusFriends: return @"friends";
|
||||
case TSThreadFriendRequestStatusRequestExpired: return @"expired";
|
||||
case LKThreadFriendRequestStatusNone: return @"none";
|
||||
case LKThreadFriendRequestStatusRequestSending: return @"sending";
|
||||
case LKThreadFriendRequestStatusRequestSent: return @"sent";
|
||||
case LKThreadFriendRequestStatusRequestReceived: return @"received";
|
||||
case LKThreadFriendRequestStatusFriends: return @"friends";
|
||||
case LKThreadFriendRequestStatusRequestExpired: return @"expired";
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)hasPendingFriendRequest
|
||||
{
|
||||
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSending || self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent
|
||||
|| self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
|
||||
return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSending || self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent
|
||||
|| self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived;
|
||||
}
|
||||
|
||||
- (BOOL)isContactFriend
|
||||
{
|
||||
return self.friendRequestStatus == TSThreadFriendRequestStatusFriends;
|
||||
return self.friendRequestStatus == LKThreadFriendRequestStatusFriends;
|
||||
}
|
||||
|
||||
- (BOOL)hasCurrentUserSentFriendRequest
|
||||
{
|
||||
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent;
|
||||
return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent;
|
||||
}
|
||||
|
||||
- (BOOL)hasCurrentUserReceivedFriendRequest
|
||||
{
|
||||
return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived;
|
||||
return self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -17,14 +17,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
@class TSQuotedMessage;
|
||||
@class YapDatabaseReadWriteTransaction;
|
||||
|
||||
typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) {
|
||||
TSMessageFriendRequestStatusNone,
|
||||
TSMessageFriendRequestStatusSendingOrFailed,
|
||||
typedef NS_ENUM(NSInteger, LKMessageFriendRequestStatus) {
|
||||
LKMessageFriendRequestStatusNone,
|
||||
LKMessageFriendRequestStatusSendingOrFailed,
|
||||
/// Either sent or received.
|
||||
TSMessageFriendRequestStatusPending,
|
||||
TSMessageFriendRequestStatusAccepted,
|
||||
TSMessageFriendRequestStatusDeclined,
|
||||
TSMessageFriendRequestStatusExpired
|
||||
LKMessageFriendRequestStatusPending,
|
||||
LKMessageFriendRequestStatusAccepted,
|
||||
LKMessageFriendRequestStatusDeclined,
|
||||
LKMessageFriendRequestStatusExpired
|
||||
};
|
||||
|
||||
@interface TSMessage : TSInteraction <OWSPreviewText>
|
||||
|
@ -40,7 +40,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) {
|
|||
@property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview;
|
||||
// Loki friend request handling
|
||||
// ========
|
||||
@property (nonatomic) TSMessageFriendRequestStatus friendRequestStatus;
|
||||
@property (nonatomic) LKMessageFriendRequestStatus friendRequestStatus;
|
||||
@property (nonatomic, readonly) NSString *friendRequestStatusDescription;
|
||||
@property (nonatomic) uint64_t friendRequestExpiresAt;
|
||||
@property (nonatomic, readonly) BOOL isFriendRequest;
|
||||
|
@ -88,7 +88,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) {
|
|||
|
||||
#pragma mark - Loki Friend Request Handling
|
||||
|
||||
- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
|
||||
- (void)saveFriendRequestStatus:(LKMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
|
||||
- (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction;
|
||||
|
||||
@end
|
||||
|
|
|
@ -82,7 +82,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
|
|||
_quotedMessage = quotedMessage;
|
||||
_contactShare = contactShare;
|
||||
_linkPreview = linkPreview;
|
||||
_friendRequestStatus = TSMessageFriendRequestStatusNone;
|
||||
_friendRequestStatus = LKMessageFriendRequestStatusNone;
|
||||
_friendRequestExpiresAt = 0;
|
||||
|
||||
return self;
|
||||
|
@ -442,7 +442,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
|
|||
|
||||
#pragma mark - Loki Friend Request Handling
|
||||
|
||||
- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
|
||||
- (void)saveFriendRequestStatus:(LKMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
|
||||
{
|
||||
self.friendRequestStatus = friendRequestStatus;
|
||||
OWSLogInfo(@"[Loki] Setting message friend request status to %@.", self.friendRequestStatusDescription);
|
||||
|
@ -461,12 +461,12 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
|
|||
- (NSString *)friendRequestStatusDescription
|
||||
{
|
||||
switch (self.friendRequestStatus) {
|
||||
case TSMessageFriendRequestStatusNone: return @"none";
|
||||
case TSMessageFriendRequestStatusSendingOrFailed: return @"sending or failed";
|
||||
case TSMessageFriendRequestStatusPending: return @"pending";
|
||||
case TSMessageFriendRequestStatusAccepted: return @"accepted";
|
||||
case TSMessageFriendRequestStatusDeclined: return @"declined";
|
||||
case TSMessageFriendRequestStatusExpired: return @"expired";
|
||||
case LKMessageFriendRequestStatusNone: return @"none";
|
||||
case LKMessageFriendRequestStatusSendingOrFailed: return @"sending or failed";
|
||||
case LKMessageFriendRequestStatusPending: return @"pending";
|
||||
case LKMessageFriendRequestStatusAccepted: return @"accepted";
|
||||
case LKMessageFriendRequestStatusDeclined: return @"declined";
|
||||
case LKMessageFriendRequestStatusExpired: return @"expired";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -482,12 +482,12 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
|
|||
|
||||
- (BOOL)isFriendRequest
|
||||
{
|
||||
return self.friendRequestStatus != TSMessageFriendRequestStatusNone;
|
||||
return self.friendRequestStatus != LKMessageFriendRequestStatusNone;
|
||||
}
|
||||
|
||||
- (BOOL)hasFriendRequestStatusMessage
|
||||
{
|
||||
return self.isFriendRequest && self.friendRequestStatus != TSMessageFriendRequestStatusSendingOrFailed;
|
||||
return self.isFriendRequest && self.friendRequestStatus != LKMessageFriendRequestStatusSendingOrFailed;
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -1469,16 +1469,16 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
// mind and sent a friend request to Alice. In this case we want Alice to auto-accept the request
|
||||
// and send a friend request accepted message back to Bob. We don't check that sending the
|
||||
// friend request accepted message succeeded. Even if it doesn't, the thread's current friend
|
||||
// request status will be set to TSThreadFriendRequestStatusFriends for Alice making it possible
|
||||
// request status will be set to LKThreadFriendRequestStatusFriends for Alice making it possible
|
||||
// for Alice to send messages to Bob. When Bob receives a message, his thread's friend request status
|
||||
// will then be set to TSThreadFriendRequestStatusFriends. If we do check for a successful send
|
||||
// before updating Alice's thread's friend request status to TSThreadFriendRequestStatusFriends,
|
||||
// will then be set to LKThreadFriendRequestStatusFriends. If we do check for a successful send
|
||||
// before updating Alice's thread's friend request status to LKThreadFriendRequestStatusFriends,
|
||||
// we can end up in a deadlock where both users' threads' friend request statuses are
|
||||
// TSThreadFriendRequestStatusRequestSent.
|
||||
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
|
||||
// LKThreadFriendRequestStatusRequestSent.
|
||||
[thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:transaction];
|
||||
TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class];
|
||||
if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) {
|
||||
[existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
|
||||
[existingFriendRequestMessage saveFriendRequestStatus:LKMessageFriendRequestStatusAccepted withTransaction:transaction];
|
||||
}
|
||||
// The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread]
|
||||
LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread];
|
||||
|
@ -1486,19 +1486,19 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
} else if (!thread.isContactFriend) {
|
||||
// Checking that the sender of the message isn't already a friend is necessary because otherwise
|
||||
// the following situation can occur: Alice and Bob are friends. Bob loses his database and his
|
||||
// friend request status is reset to TSThreadFriendRequestStatusNone. Bob now sends Alice a friend
|
||||
// friend request status is reset to LKThreadFriendRequestStatusNone. Bob now sends Alice a friend
|
||||
// request. Alice's thread's friend request status is reset to
|
||||
// TSThreadFriendRequestStatusRequestReceived.
|
||||
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction];
|
||||
message.friendRequestStatus = TSMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction.
|
||||
// LKThreadFriendRequestStatusRequestReceived.
|
||||
[thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestReceived withTransaction:transaction];
|
||||
message.friendRequestStatus = LKMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction.
|
||||
}
|
||||
} else if (!thread.isContactFriend) {
|
||||
// If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message,
|
||||
// If the thread's friend request status is not LKThreadFriendRequestStatusFriends, but we're receiving a message,
|
||||
// it must be a friend request accepted message. Declining a friend request doesn't send a message.
|
||||
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
|
||||
[thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:transaction];
|
||||
TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class];
|
||||
if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) {
|
||||
[existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
|
||||
[existingFriendRequestMessage saveFriendRequestStatus:LKMessageFriendRequestStatusAccepted withTransaction:transaction];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1111,8 +1111,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
[message saveIsCalculatingProofOfWork:YES withTransaction:transaction];
|
||||
// Update the message and thread if needed
|
||||
if (messageType == TSFriendRequestMessageType) {
|
||||
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:transaction];
|
||||
[message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
||||
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSending withTransaction:transaction];
|
||||
[message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
||||
}
|
||||
}];
|
||||
// Convenience
|
||||
|
@ -1120,8 +1120,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
// Update the thread if needed
|
||||
if (messageType == TSFriendRequestMessageType) {
|
||||
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:transaction];
|
||||
[message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
||||
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusNone withTransaction:transaction];
|
||||
[message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction];
|
||||
}
|
||||
// Update the PoW calculation status
|
||||
[message saveIsCalculatingProofOfWork:NO withTransaction:transaction];
|
||||
|
@ -1157,10 +1157,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
|
|||
if (messageType == TSFriendRequestMessageType) {
|
||||
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
|
||||
// Update the thread
|
||||
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
|
||||
[message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSent withTransaction:transaction];
|
||||
[message.thread removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:transaction];
|
||||
// Update the message
|
||||
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction];
|
||||
[message saveFriendRequestStatus:LKMessageFriendRequestStatusPending withTransaction:transaction];
|
||||
NSTimeInterval expirationInterval = 72 * kHourInterval;
|
||||
NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
|
||||
[message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction];
|
||||
|
|
Loading…
Reference in New Issue