You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Nothing/src/app/_services/plan.service.ts

93 lines
2.5 KiB

import { Injectable } from '@angular/core';
import { invoke } from '@tauri-apps/api';
import { Observable, ReplaySubject, Subject, from, map, switchMap, tap } from 'rxjs';
import { Plan, PlanInterface } from '../_models/plan';
import { MatDialog } from '@angular/material/dialog';
import { UrlDialog } from '../plan-display/url-dialog.component';
import { fetch } from '@tauri-apps/api/http';
@Injectable({
providedIn: 'root'
})
export class PlanService {
private _currentPlanSubject: Subject<Plan> = new ReplaySubject<Plan>(1);
private _basePlanSubject: Subject<Plan> = new ReplaySubject<Plan>(1);
constructor(private dialog: MatDialog) {
this.loadBasePlan();
}
public getBasePlan(): Observable<Plan> {
return this._basePlanSubject.asObservable();
}
public getCurrentPlan(): Observable<Plan> {
return this._currentPlanSubject.asObservable();
}
public setCurrentPlan(plan: Plan) {
this._currentPlanSubject.next(plan);
}
public enumerateStoredPlans(): Observable<string[]> {
return from(invoke<string[]>('enumerate_stored_plans'));
}
public getPathFromKnownName(name: string): Observable<string> {
return from(invoke<string>('path_from_name', { name }));
}
public loadPlanFromPath(path: string): Observable<Plan> {
return from(invoke<Plan>('load_plan', { path }));
}
public loadFromUrl(url?: string, name?: string): Observable<Plan> {
if (!url || !name) {
const dialogRef = this.dialog.open(UrlDialog, {
data: {
url: url,
name: name
}
});
return dialogRef.afterClosed().pipe(switchMap(data => {
if (data.url) {
return this._loadFromUrl(data.url, data.name);
}
return new Observable<Plan>((s) => s.complete());
}));
} else {
return this._loadFromUrl(url, name);
}
}
public savePlanAtPath(path: string, plan: Plan) {
invoke('save_plan_at_path', { path, plan: plan });
}
private _loadFromUrl(url: string, name: string): Observable<Plan> {
//Tauri fetch
return from(fetch(
url,
{
method: 'GET',
timeout: 30
})).pipe(map(response => {
return new Plan(response.data as PlanInterface);
})).pipe(tap(plan => {
plan.update_url = url;
plan.name = name;
}));
}
private loadBasePlan() {
from(invoke<PlanInterface>('base_plan')).subscribe(plan => {
plan.plan.forEach(elem => { elem.edited = false; });
this._basePlanSubject?.next(new Plan(plan));
});
}
}