import { Injectable, inject } from '@angular/core'; import { tap } from 'rxjs'; import { AdminStore, AdminSection } from './admin.store'; import { AdminService } from '../services/admin.service'; import { IAbout } from '../about/about.model'; import { IHobby } from '../models/hobby.model'; import { IContactModel } from '../contact/contact.model'; import { IProjects } from '../projects/projects.model'; import { IResume } from '../resume/resume.model'; @Injectable({ providedIn: 'root' }) export class AdminStateService { private store = inject(AdminStore); private api = inject(AdminService); // ── About ────────────────────────────────────────────── loadAbout() { this.store.setSectionLoading('about', true); return this.api.getHobbies().pipe( tap({ next: (about: IAbout) => { this.store.update({ about }); this.store.setSectionLoading('about', false); this.store.setSectionError('about', null); }, error: (err) => { this.store.setSectionLoading('about', false); this.store.setSectionError('about', err.message); } }) ); } updateAbout(about: IAbout) { this.store.update({ about }); } upsertHobbies(hobbies: IHobby[]) { this.store.setSectionLoading('about', true); return this.api.upsertHobbies(hobbies).pipe( tap({ next: (updatedHobbies: IHobby[]) => { this.store.update(state => ({ about: state.about ? { ...state.about, hobbies: updatedHobbies } : state.about })); this.store.setSectionLoading('about', false); this.store.setSectionError('about', null); }, error: (err) => { this.store.setSectionLoading('about', false); this.store.setSectionError('about', err.message); } }) ); } // ── Contact ──────────────────────────────────────────── loadContact() { this.store.setSectionLoading('contact', true); return this.api.getCandidateWithSocialLinks().pipe( tap({ next: (contact: IContactModel) => { this.store.update({ contact }); this.store.setSectionLoading('contact', false); this.store.setSectionError('contact', null); }, error: (err) => { this.store.setSectionLoading('contact', false); this.store.setSectionError('contact', err.message); } }) ); } updateContact(contact: IContactModel) { this.store.update({ contact }); } // ── Projects ─────────────────────────────────────────── loadProjects() { this.store.setSectionLoading('projects', true); return this.api.getProjects().pipe( tap({ next: (projects: IProjects) => { this.store.update({ projects }); this.store.setSectionLoading('projects', false); this.store.setSectionError('projects', null); }, error: (err) => { this.store.setSectionLoading('projects', false); this.store.setSectionError('projects', err.message); } }) ); } updateProjects(projects: IProjects) { this.store.update({ projects }); } // ── Resume ───────────────────────────────────────────── loadResume() { this.store.setSectionLoading('resume', true); return this.api.getResume().pipe( tap({ next: (resume: IResume) => { this.store.update({ resume }); this.store.setSectionLoading('resume', false); this.store.setSectionError('resume', null); }, error: (err) => { this.store.setSectionLoading('resume', false); this.store.setSectionError('resume', err.message); } }) ); } updateResume(resume: IResume) { this.store.update({ resume }); } // ── Reset helpers ────────────────────────────────────── resetSection(section: AdminSection) { this.store.update(state => ({ [section]: null, loading: { ...state.loading, [section]: false }, error: { ...state.error, [section]: null } })); } resetAll() { this.store.reset(); } }