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.
93 lines
2.5 KiB
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));
|
|
});
|
|
}
|
|
}
|