downthemall/lib/recentlist.ts
Nils Maier 29fd59c8fd Increase recent lists to 15
Because why not?!
Also closes #15
2019-08-26 19:51:30 +02:00

119 lines
2.4 KiB
TypeScript

"use strict";
// License: MIT
import { none } from "./util";
import { storage } from "./browser";
const LIST = Symbol("saved-list");
function unique(e: string) {
if (typeof e !== "string" || this.has(e)) {
return false;
}
this.add(e);
return true;
}
export class RecentList {
public readonly pref: string;
public readonly defaults: string[];
public readonly limit: number;
private _inited: any;
private [LIST]: string[];
constructor(pref: string, defaults: string[] = []) {
if (!pref) {
throw Error("Invalid pref");
}
defaults = defaults || [];
if (!Array.isArray(defaults)) {
throw new Error("Invalid defaults");
}
this.pref = `savedlist-${pref}`;
this.defaults = Array.from(defaults);
this[LIST] = [];
this.limit = 15;
}
get values() {
return Array.from(this[LIST]);
}
get current() {
return this[LIST][0] || "";
}
async _init() {
const {[this.pref]: saved = []} = await storage.local.get(this.pref) || [];
this[LIST] = [...saved, ...this.defaults].
filter(unique, new Set()).
slice(0, this.limit);
}
init() {
if (!this._inited) {
this._inited = this._init();
this._inited.then(() => {
this.init = none;
});
}
return this._inited;
}
async reset() {
this[LIST] = Array.from(this.defaults);
await this.save();
}
async push(value: string) {
if (value === null || typeof value === "undefined") {
throw new Error("Invalid value");
}
const list = this[LIST];
const idx = list.indexOf(value);
if (idx === 0) {
return;
}
if (idx > 0) {
list.splice(idx, 1);
}
list.unshift(value);
while (list.length > 10) {
list.pop();
}
await this.save();
return;
}
async save() {
await storage.local.set({[this.pref]: this[LIST]});
}
*[Symbol.iterator]() {
yield *this[LIST];
}
}
export const MASK = new RecentList("mask", [
"*name*.*ext*",
"*num*_*name*.*ext*",
"*url*-*name*.*ext*",
"downthemall/*y*-*m*/*name*.*ext*",
"*name* (*text*).*ext*"
]);
MASK.init().catch(console.error);
export const FASTFILTER = new RecentList("fastfilter", [
"",
"/\\.mp3$/",
"/\\.(html|htm|rtf|doc|pdf)$/",
"http://www.website.com/subdir/*.*",
"http://www.website.com/subdir/pre*.???",
"*.z??, *.css, *.html"
]);
FASTFILTER.init().catch(console.error);