import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/vi/functional-basic/Classes/ErrorCenter - Quản lý lỗi'/>

# Lớp ErrorCenter

`ErrorCenter` là công cụ trung tâm để quản lý tất cả các lỗi trong ứng dụng. Nó cho phép bạn đăng ký các nguyên nhân lỗi có thể xảy ra ở một nơi, cấu hình phản ứng với chúng (ví dụ: hiển thị thông báo) và kích hoạt chúng từ bất kỳ phần nào của mã.

Lớp này hoạt động như một vỏ bọc tĩnh (Static Bridge), chuyển tất cả các yêu cầu đến một `ErrorCenterInstance` duy nhất.

## Các phương thức

### Hành động
- `on(cause: ErrorCenterCauseItem): void` — Bắt đầu quá trình xử lý. Tìm kiếm dữ liệu trong sổ đăng ký, hợp nhất chúng và gọi các callback thích hợp.

### Xác minh
- `has(code: string, group?: string): boolean` — Kiểm tra xem lỗi đã được đăng ký chưa.
- `get(code: string, group?: string): ErrorCenterCauseItem | undefined` — Trả về dữ liệu lỗi từ sổ đăng ký.

### Cấu hình
- `add(cause: ErrorCenterCauseItem): void` — Thêm một nguyên nhân lỗi.
- `addList(causes: ErrorCenterCauseList): void` — Thêm một danh sách lỗi (đăng ký hàng loạt).
- `addHandler(group: ErrorCenterGroup, handler: ErrorCenterHandlerCallback): void` — Đăng ký phản ứng cho một nhóm lỗi.
- `addHandlerList(handlers: ErrorCenterHandlerList): void` — Đăng ký hàng loạt nhiều trình xử lý.

### Bổ trợ
- `getItem(): ErrorCenterInstance` — Trả về thực thể nội bộ của lớp.

## Các kiểu dữ liệu

#### `ErrorCenterGroup`
Tên nhóm (ví dụ: 'api', 'auth') hoặc `undefined` cho trình xử lý chung.

#### `ErrorCenterCauseItem`
Đối tượng mô tả lỗi: `group`, `code` (bắt buộc), `priority`, `label`, `message`, `details`.

## Hướng dẫn sử dụng

### Bước 1: Đăng ký (Registry)
Lập một từ điển lỗi để lưu trữ văn bản tách biệt với mã.
```typescript
ErrorCenter.add({
  group: 'auth',
  code: 'LOGIN_FAILED',
  label: 'Đăng nhập thất bại',
  message: 'Mật khẩu không hợp lệ.'
})
```

### Bước 2: Đăng ký nhận lỗi (Handlers)
Chỉ định cách ứng dụng sẽ phản ứng với một nhóm lỗi.
```typescript
ErrorCenter.addHandler('auth', (cause) => {
  alert(cause.message);
});
```

### Bước 3: Kích hoạt (Execution)
Kích hoạt lỗi bằng mã và nhóm của nó.
```typescript
ErrorCenter.on({ group: 'auth', code: 'LOGIN_FAILED' });
```

## Nguyên nhân lỗi tiêu chuẩn

Lớp đã chứa các mô tả sẵn có cho các tình huống phổ biến.

#### Nhóm API (`api`)
Được sử dụng cho các lỗi yêu cầu mạng.
- **forbidden** — Truy cập bị cấm (403).
- **notFound** — Không tìm thấy tài nguyên (404).
- **offline** — Không có kết nối internet.
- **server** — Lỗi máy chủ nội bộ (500).
- **timeout** — Hết thời gian yêu cầu.
- **unauthorized** — Lỗi xác thực (401).
- **unknown** — Lỗi không xác định.
- **cacheClear**, **cacheGet**, **cacheRemove**, **cacheSet** — Lỗi khi làm việc với bộ nhớ đệm.

#### Nhóm Intl (`intl`)
Lỗi trong quá trình định dạng dữ liệu (ngày tháng, số, v.v.).
- **datetime**, **display**, **number**, **plural**, **relative**.
- **invalid** — Ngày không hợp lệ hoặc định dạng sai.

#### Nhóm Storage (`storage`)
Lỗi khi tương tác với bộ lưu trữ cục bộ hoặc máy chủ.
- **context** — Thiếu ngữ cảnh.
- **error** — Lỗi đọc/ghi chung.

#### Các nhóm khác
Các nhóm này sử dụng mã lỗi chung `error`. Việc kích hoạt được thực hiện thông qua `ErrorCenter.on({ group: 'tên_nhóm', code: 'error' })`.
- **broadcast** — Lỗi trong việc trao đổi dữ liệu giữa các tab trình duyệt.
- **hydration** — Lỗi trong quá trình đồng bộ hóa dữ liệu giữa máy chủ và máy khách.
- **share** — Lỗi khi cố gắng chia sẻ nội dung (Sharing API).
- **transformation** — Lỗi trong quá trình chuyển đổi hoặc phân tích cú pháp dữ liệu.

## Ví dụ

### Tích hợp với hệ thống thông báo
```typescript
import { ErrorCenter } from '@dxtmisha/functional-basic'

// Thiết lập một lần khi khởi động ứng dụng
ErrorCenter.addHandler('api', (cause) => {
  Toast.show(cause.label || 'Lỗi', cause.message);
});

// Sử dụng trong bất kỳ dịch vụ nào
async function loadData() {
  try {
    const data = await fetch('/api');
  } catch (e) {
    ErrorCenter.on({ group: 'api', code: 'server', details: e });
  }
}
```

### Làm việc với các nhóm tùy chỉnh
```typescript
// Đăng ký tức thì
ErrorCenter.on({
  group: 'upload',
  code: 'SIZE_LIMIT',
  label: 'Tệp quá lớn',
  message: 'Tối đa 5MB'
});
```
