48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
|
|
import { Injectable, inject } from '@angular/core';
|
||
|
|
import { AuthService } from '../../../services/auth.service';
|
||
|
|
import { SearchHistory } from '../models/search.model';
|
||
|
|
import { BackendSearchHistoryRepository, LocalSearchHistoryRepository, SearchHistoryRepository } from './search-history.repository';
|
||
|
|
|
||
|
|
@Injectable({ providedIn: 'root' })
|
||
|
|
export class SearchHistoryService {
|
||
|
|
private readonly authService = inject(AuthService);
|
||
|
|
private readonly localRepository = inject(LocalSearchHistoryRepository);
|
||
|
|
private readonly backendRepository = inject(BackendSearchHistoryRepository);
|
||
|
|
|
||
|
|
private readonly maxSize = 12;
|
||
|
|
|
||
|
|
private get repository(): SearchHistoryRepository {
|
||
|
|
return this.authService.session() ? this.backendRepository : this.localRepository;
|
||
|
|
}
|
||
|
|
|
||
|
|
getSnapshot(): SearchHistory {
|
||
|
|
const items = this.repository.load();
|
||
|
|
return {
|
||
|
|
items,
|
||
|
|
recent: items.slice(0, 8),
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
push(query: string, maxHistory = this.maxSize): SearchHistory {
|
||
|
|
const normalized = query.trim();
|
||
|
|
if (!normalized.length) {
|
||
|
|
return this.getSnapshot();
|
||
|
|
}
|
||
|
|
|
||
|
|
const existing = this.repository.load();
|
||
|
|
const next = [normalized, ...existing.filter(item => item.toLowerCase() !== normalized.toLowerCase())]
|
||
|
|
.slice(0, Math.max(1, maxHistory));
|
||
|
|
|
||
|
|
this.repository.save(next);
|
||
|
|
return {
|
||
|
|
items: next,
|
||
|
|
recent: next.slice(0, 8),
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
clear(): SearchHistory {
|
||
|
|
this.repository.clear();
|
||
|
|
return { items: [], recent: [] };
|
||
|
|
}
|
||
|
|
}
|