ild-games/Skein

View on GitHub
src/app/project-selection/project-selection.component.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { tap } from 'rxjs/operators';
import 'rxjs/add/operator/map';

import { NewProjectResponse, RecentProjectsResponse, ProjectSelection, OpenProjectResponse } from '../../server/server-response-types';
import { ProjectService } from '../project/project.service';
import { ServerCommunicationService } from '../server-communication/server-communication.service';
import { VERSION } from '../util/version';
import { OpenRecentProjectRequest } from '../../server/server-requests-types';


@Component({
    selector: 'spl-project-selection',
    styleUrls: [
        './project-selection.component.scss'
    ],
    template: `
        <div class="container">
            <div class="left-section">
                <div class="skein-title-section">
                    <div class="skein-name">
                        Skein
                    </div>
                    <div class="skein-version">
                        {{VERSION}}
                    </div>
                </div>
            </div>

            <div class="right-section">
                <div class="actions">
                    <a (click)="onOpenClicked()">
                        <spl-icon iconClass="folder-open-o">
                        </spl-icon>
                        Open
                    </a>
                    <a (click)="onNewClicked()">
                        <spl-icon iconClass="file-o">
                        </spl-icon>
                        New
                    </a>
                </div>

                <mat-nav-list>
                    <mat-list-item
                        mat-list-item
                        *ngFor="let recentProject of recentProjects"
                        (click)="onRecentProjectClicked(recentProject)">

                        <p matLine class="project-name"> {{recentProject.name}} </p>
                        <p matLine class="project-root"> {{recentProject.root}} </p>
                    </mat-list-item>
                </mat-nav-list>
            </div>
        </div>
    `
})
export class ProjectSelectionComponent implements OnInit {
    /* hoisted variables for angular template */
    VERSION = VERSION;

    public recentProjects: ProjectSelection[] = [];

    constructor(
        private _project: ProjectService,
        private _serverComm: ServerCommunicationService) {
    }

    ngOnInit() {
        this._serverComm.get('centerAndResetToInitial');
        this._serverComm.get<RecentProjectsResponse>('recentProjects').then((response) => {
            this.recentProjects = response.recentProjects.slice(0, 7);
        });
    }

    public async onNewClicked() {
        let response = await this._serverComm.get<NewProjectResponse>('newProject');
        if (!response.newProject || !response.newProject.root) {
            return;
        }

        this._project.open(response.newProject);
    }

    public async onOpenClicked() {
        let response = await this._serverComm.get<OpenProjectResponse>('openProject');
        if (!response.openedProject || !response.openedProject.root) {
            return;
        }

        this._project.open(response.openedProject);
    }

    public async onRecentProjectClicked(project: ProjectSelection) {
        let request: OpenRecentProjectRequest = { recentProjectToOpen: project };
        await this._serverComm.post<OpenRecentProjectRequest>('openRecentProject', request);
        this._project.open(project);
    }
}