aboutsummaryrefslogtreecommitdiff
path: root/src/log.ts
blob: e99004eb18b7280203f7c5473e2cbbe42227ecb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
    This file is part of jshelper (https://codeberg.org/metamuffin/jshelper)
    which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
    Copyright (C) 2023 metamuffin <metamuffin.org>
*/
import { e } from "./element.ts"

export class Logger<T = HTMLElement> {
    public element: HTMLElement = e("div", { class: "jsh-log" })
    constructor(
        private map_fn: (value: T) => HTMLElement = e => {
            if (e instanceof HTMLElement) return e;
            else throw new Error("logger: map_fn required if T is not HTMLElement");
        },
        private reverse = false,
        private timeout = 3000,
        private animation_dduration = 1000,
    ) {

    }

    private add(v: T) {
        const el = this.map_fn(v)
        if (this.reverse) this.element.prepend(el)
        else this.element.append(el)
        return el
    }

    log(value: T) {
        const el = this.add(value)
        el.classList.add("jsh-log-line", "jsh-log-line-timeout")
        setTimeout(() => {
            el.classList.add("jsh-log-line-disappear")
            setTimeout(() => {
                this.element.removeChild(el)
            }, this.animation_dduration)
        }, this.timeout + this.animation_dduration)
    }
    log_persistent(value: T): () => void {
        const el = this.add(value)
        el.classList.add("jsh-log-line", "jsh-log-line-persistent")
        return () => {
            el.classList.add("jsh-log-line-disappear")
            setTimeout(() => {
                this.element.removeChild(el)
            }, this.animation_dduration)
        }
    }
}