JToastQueue.m

//
//  JToastQueue.m
//  
//
//  Free. No warranty. Do whatever you want with it
//  Created by Jakar in 2014
//

#import "JToastQueue.h"
//NSTimer+Blocks comes from https://github.com/jivadevoe/NSTimer-Blocks
#import "NSTimer+Blocks.h"

@interface JToastQueue (){
    
}

//@property (nonatomic)BOOL allowDuplicates;

@end

@implementation JToastQueue

static JToastQueue *queue;
//static BOOL allowDuplicates;
//NSMutableArray *stack = _stack;

+(void)initialize{
    if (queue==nil){
        queue = [[self alloc] init];
        queue.stack = [[NSMutableArray alloc] init];
        queue.allowDuplicates =  NO;
    }
}

+(JToastQueue *)sharedToastQueue{
    return queue;
}

+(void)queueToastWithMessage:(NSString *)message{
    [JToastQueue queueToastWithMessage:message forToastDuration:ToastDurationCalculated atPosition:ToastPositionCenter];
}
+(void)queueToastWithMessage:(NSString *)message forToastDuration:(ToastDuration)duration atPosition:(ToastPosition)position{
    [queue queueToast:[[[JToast alloc] initWithTopWindow] toastWithMessage:message forToastDuration:duration atPosition:position]];
}
+(void)queueToastWithMessage:(NSString *)message forFloatDuration:(CGFloat)duration atPosition:(ToastPosition)position{
    [queue queueToast:[[[JToast alloc] initWithTopWindow] toastWithMessage:message forFloatDuration:duration atPosition:position]];
}
+(void)removeToast:(JToast *)toast ifDisplayed:(BOOL)ifDisplayed{ //if displayed means clear even if it's shown on the screen now.
    if (toast.timer==nil||ifDisplayed){
        if (![toast.timer isValid])return;
        [toast.timer invalidate];
        toast.timer = nil;
        [queue removeToast:toast];
        [toast hideSelf];
    }
}

- (void)queueToast:(JToast *)toast{
    if (toast==nil) return;
    BOOL doQueue = YES;
    if (!self.allowDuplicates){
        for (JToast *t in self.stack) {
            if ([t isEqual:toast]){
                doQueue = NO;
                break;
            }
        }
    }
    if (!doQueue)return;
    [self.stack addObject:toast];
    if (self.stack.count == 1){
        [self showToastImmediately:toast];
    }
}
-(void)removeToast:(JToast *)toast{
    for (int i = 0; i<self.stack.count;i++) {
        JToast *t = self.stack[i];
        if (t == toast){
            [self.stack removeObjectAtIndex:i];
            break;
        }
    }
    [toast hideSelf];
    if (self.stack.count>0){
        [NSTimer scheduledTimerWithTimeInterval:TOAST_TRANSITION_LENGTH block:^{
           [self showToastImmediately:self.stack[0]];
        }repeats:NO];
    }
}
- (void) showToastImmediately:(JToast *)toast{
    [toast showSelf];
    toast.timer = [NSTimer scheduledTimerWithTimeInterval:toast.animLength block:^{[self removeToast:toast];} repeats:NO];//remove the toast
}


@end