mirror of
https://dev.azure.com/hugendubel/ISA/_git/ISA-Frontend
synced 2025-12-28 22:42:11 +01:00
95 lines
2.9 KiB
TypeScript
95 lines
2.9 KiB
TypeScript
import { Injectable, inject, resource, signal, computed } from '@angular/core';
|
|
import { logger } from '@isa/core/logging';
|
|
import { CrmSearchService } from '../services/crm-search.service';
|
|
import { BonusCardInfo } from '../models';
|
|
|
|
/**
|
|
* Resource for loading customer bonus cards (Kundenkarten).
|
|
*
|
|
* Provides reactive loading of all bonus cards for a given customer ID.
|
|
* Customer ID can be changed dynamically via `params()` method.
|
|
*
|
|
* **Note:** This resource should be provided at the component level,
|
|
* not in root. Provide it in the `providers` array of the component
|
|
* that needs scoped access to customer bonus cards.
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* @Component({
|
|
* providers: [CustomerBonusCardsResource],
|
|
* })
|
|
* export class MyFeatureComponent {
|
|
* #bonusCardsResource = inject(CustomerBonusCardsResource);
|
|
*
|
|
* cards = this.#bonusCardsResource.resource.value;
|
|
* isLoading = this.#bonusCardsResource.resource.isLoading;
|
|
*
|
|
* loadCards(customerId: number) {
|
|
* this.#bonusCardsResource.params({ customerId });
|
|
* }
|
|
* }
|
|
* ```
|
|
*/
|
|
@Injectable()
|
|
export class CustomerBonusCardsResource {
|
|
readonly #crmSearchService = inject(CrmSearchService);
|
|
readonly #logger = logger(() => ({ context: 'CustomerBonusCardsResource' }));
|
|
|
|
readonly #customerId = signal<number | undefined>(undefined);
|
|
|
|
/**
|
|
* Current customer ID being loaded.
|
|
*/
|
|
readonly customerId = computed(() => this.#customerId());
|
|
|
|
/**
|
|
* Resource that loads bonus cards based on current parameters.
|
|
*
|
|
* Exposes:
|
|
* - `value()` - Array of bonus cards or undefined
|
|
* - `isLoading()` - Loading state
|
|
* - `error()` - Error state
|
|
* - `status()` - Current status ('idle' | 'loading' | 'resolved' | 'error')
|
|
*/
|
|
readonly resource = resource({
|
|
params: computed(() => ({ customerId: this.#customerId() })),
|
|
loader: async ({
|
|
params,
|
|
abortSignal,
|
|
}): Promise<BonusCardInfo[] | undefined> => {
|
|
const { customerId } = params;
|
|
|
|
if (!customerId) {
|
|
this.#logger.debug('No customerId provided, skipping load');
|
|
return undefined;
|
|
}
|
|
|
|
this.#logger.debug('Loading bonus cards', () => ({ customerId }));
|
|
|
|
const response = await this.#crmSearchService.fetchCustomerCards(
|
|
{ customerId },
|
|
abortSignal,
|
|
);
|
|
|
|
this.#logger.debug('Bonus cards loaded', () => ({
|
|
customerId,
|
|
count: response?.result?.length ?? 0,
|
|
}));
|
|
|
|
return response?.result;
|
|
},
|
|
defaultValue: undefined,
|
|
});
|
|
|
|
/**
|
|
* Update resource parameters to trigger a reload.
|
|
*
|
|
* @param params - Parameters for loading bonus cards
|
|
* @param params.customerId - Customer ID to load cards for (undefined clears data)
|
|
*/
|
|
params(params: { customerId?: number }): void {
|
|
this.#logger.debug('Updating params', () => params);
|
|
this.#customerId.set(params.customerId);
|
|
}
|
|
}
|