Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/replay/frontend/src/pages/history/index.vue
1030 views
<template lang="pug">
.HistoryPage
  ul.items-by-day(v-for="category of categories")
    li.category
      .category-title {{category.title}}
      .history-item(v-for="item of category.items")
        .item(@click="navigateToHistory($event, item)" :selected="item.selected")
          .title {{item.scriptEntrypoint}}
          .time {{formatTime(item.lastAccessedAt)}}
          Icon.remove(:src="ICON_CLOSE" @click="onRemoveClick($event, category, item)")
</template>

<script lang="ts">
import { ipcRenderer } from "electron";
import moment from "moment";
import Vue from "vue";
import Component from "vue-class-component";
import Icon from "~frontend/components/Icon.vue";
import { ICON_CLOSE } from "~frontend/constants";

interface IItem {
    id: string;
    sessionName: string,
    dataLocation: string,
    scriptInstanceId: string,
    scriptEntrypoint: string,
    lastAccessedAt: string;
  }

  interface ICategory {
    title: string;
    items: IItem[];
  }

  @Component({ components: { Icon } })
  export default class HistoryPage extends Vue {
    private ICON_CLOSE = ICON_CLOSE;
    private categories: ICategory[] = [];

    private navigateToHistory(e: any, item: IItem) {
      ipcRenderer.send(`navigate-to-history`, item);
    }

    private onRemoveClick(e: any, category: ICategory, item: IItem) {
      e.stopPropagation();
      // this.items = this.items.filter(x => x._id !== item._id);
      // ipcRenderer.send(`history-remove`, [item.id]);
    };

    private formatTime(str: string) {
      return moment(str).format('H:mma')
    }

    private async loadItems() {
      const items = await ipcRenderer.invoke(`fetch-history`);
      const itemsByTitle: { [key: string]: IItem[] } = {};
      for (let item of items) {
        item = { ...item };
        const title = this.createTitle(item);
        itemsByTitle[title] = itemsByTitle[title] || [];
        itemsByTitle[title].push(item);
      }
      for (const title of Object.keys(itemsByTitle)) {
        this.categories.push({ title, items: itemsByTitle[title] });
      }
    }

    private createTitle(item: IItem) {
      const lastAccessedAt = moment(item.lastAccessedAt)
      const formattedDate = lastAccessedAt.format('dddd, MMMM D, YYYY');
      const daysFrom = moment().diff(lastAccessedAt, 'days');
      if (daysFrom === 0) {
        return `Today - ${formattedDate}`;
      } else if (daysFrom === 1) {
        return `Yesterday - ${formattedDate}`;
      } else {
        return formattedDate;
      }

    }

    async mounted() {
      await this.loadItems();
    }
  }
</script>