import {ImageSource, fromFile as imageSourceFromFile} from "image-source"; import {VirtualArray, ItemsLoading as virtualArrayItemsLoadingData} from "data/virtual-array"; import {Observable} from "data/observable"; import {Cache as ImageCache} from "ui/image-cache"; import {Data as RedditData} from "./reddit-model"; import {RedditViewModel} from "./reddit-item-view-model"; var aboutText = "Cuteness is a proof of concept app demonstrating the Telerik's NativeScript for writing native mobile applications using JavaScript."; export var defaultThumbnailImageSource = imageSourceFromFile("~/cuteness.io/res/reddit-logo.png"); export var defaultNoThumbnailImageSource = imageSourceFromFile("~/cuteness.io/res/no-image.png"); var redditUrl = "https://www.reddit.com/r/aww.json?limit="; var after: string; var ISSCROLLING = "isLoading"; // initialize the image cache for the main list export var cache = new ImageCache(); cache.placeholder = defaultThumbnailImageSource; cache.maxRequests = 5; export class AppViewModel extends Observable { private _redditItems: VirtualArray; get redditItems(): VirtualArray { if (!this._redditItems) { this._redditItems = new VirtualArray(1000); this._redditItems.loadSize = 50; this._redditItems.on(VirtualArray.itemsLoadingEvent, (args: virtualArrayItemsLoadingData) => { fetch(redditUrl + args.count + (after ? "&after=" + after : "")).then(response=> response.json()).then(result => { var itemsToLoad = result.data.children.map(i=> { return new RedditViewModel(i.data); }); this._redditItems.load(args.index, itemsToLoad); var lastItem = itemsToLoad[itemsToLoad.length - 1]; if (lastItem) { after = itemsToLoad[itemsToLoad.length - 1].source.name; } }); }); } return this._redditItems; } private _isScrolling = false; get isScrolling(): boolean { return this._isScrolling; } set isScrolling(value: boolean) { if (this._isScrolling !== value) { this._isScrolling = value; if (value) { cache.disableDownload(); } else { cache.enableDownload(); } this.notify({ object: this, eventName: Observable.propertyChangeEvent, propertyName: ISSCROLLING, value: value }); } } get aboutText(): string { return aboutText; } get defaultThumbnailImageSource(): ImageSource { return defaultThumbnailImageSource; } get defaultNoThumbnailImageSource(): ImageSource { return defaultNoThumbnailImageSource; } }