# 通用页面基类 (pageMixin)

## 概述

`pageMixin.ts` 提供了一个通用的页面基类，可以被不同模块（数学学习、专注力等）共用。它抽象了 Canvas 绘制页面的通用功能。

## 核心功能

- Canvas 初始化和配置
- 分享功能（小程序分享、朋友圈分享）
- 图片导出和打印
- 页面信息初始化

## 使用方法

### 1. 基础用法（不依赖特定的页面信息查找）

```typescript
import { createPage } from '../../base/pageMixin';

createPage({
    canvas: null as Canvas | null,
    ctx: null as RenderingContext | null,
    // ... 其他属性

    data: {
        pageTitle: '页面标题',
        functionId: 'my-function-id',
        // ... 其他数据
    },

    onLoad(options: { id?: string }) {
        const functionId = options.id || 'my-function-id';

        // 方式1：直接提供页面信息
        this.initPageInfo({
            functionId,
            title: '页面标题',
            desc: '页面描述',
        });

        // 或者方式2：使用默认标题（需要传入 defaultTitle）
        this.initPageInfo(functionId, '默认标题');
    },
});
```

### 2. 自定义页面信息查找函数

如果你有多个页面需要共享同一个查找逻辑，可以创建自己的 mixin：

```typescript
import { createPage, PageCommonMethodsConfig } from '../../base/pageMixin';

// 定义自己的页面信息查找函数
function myPageInfoLookup(functionId: string) {
    // 从你的常量或配置中查找
    const pageInfo = MY_FUNCTION_TYPES.find((item) => item.id === functionId);
    if (pageInfo) {
        return {
            title: pageInfo.title,
            desc: pageInfo.desc,
        };
    }
    return undefined;
}

// 使用配置创建页面
const config: PageCommonMethodsConfig = {
    shareConfig: {
        title: '我的模块',
        imageUrl: 'https://example.com/share.png',
    },
    pageInfoLookup: myPageInfoLookup,
};

createPage(
    {
        // ... 页面配置
        onLoad(options: { id?: string }) {
            const functionId = options.id || 'default-id';
            // 现在可以使用简化的调用方式
            this.initPageInfo(functionId, '默认标题');
            // 如果有 pageInfoLookup，会自动查找并设置 title 和 desc
        },
    },
    config,
);
```

### 3. 数学模块的用法（向后兼容）

数学模块已经封装好了专用的 `mathPageMixin.ts`，可以直接使用：

```typescript
import { createMathPage, CanvasDataState } from '../common/mathPageMixin';

createMathPage({
    // ... 页面配置
    onLoad(options: { id?: string }) {
        const functionId = options.id || 'addition-5';
        // 自动从 MATH_FUNCTION_TYPES 中查找
        this.initPageInfo(functionId, '默认标题');
    },
});
```

## API 说明

### createPage(pageOptions, config?)

创建并注册一个页面。

**参数：**

- `pageOptions`: 页面配置对象
- `config`: 可选，公共方法配置（见 `PageCommonMethodsConfig`）

### initPageInfo(functionIdOrOptions, defaultTitle?)

初始化页面信息，支持两种调用方式：

**方式1：**

```typescript
this.initPageInfo(functionId: string, defaultTitle?: string)
```

- 如果有配置 `pageInfoLookup`，会尝试查找
- 否则使用 `defaultTitle`

**方式2：**

```typescript
this.initPageInfo({ title: string, desc?: string, functionId: string })
```

- 直接提供页面信息，忽略 `pageInfoLookup`

### initCanvas(options)

初始化 Canvas。

**参数：**

- `options.createDrawService`: 创建绘制服务的工厂函数
- `options.drawServiceOptions`: 绘制服务的选项
- `options.onCanvasReady`: Canvas 初始化完成后的回调

### exportToPrint()

导出并保存图片（用于打印）。

### getShareOptions()

获取分享配置。

### onShareAppMessage()

微信小程序分享处理函数。

### onShareTimeline()

微信朋友圈分享处理函数。

## 专注力模块使用示例

```typescript
import { createPage, PageCommonMethodsConfig } from '../../base/pageMixin';

// 专注力模块的函数类型定义
interface FocusFunctionType {
    id: string;
    title: string;
    desc: string;
}

// 专注力模块的函数列表
const FOCUS_FUNCTION_TYPES: FocusFunctionType[] = [
    {
        id: 'grid-drawing',
        title: '格子仿画',
        desc: '在格子中绘制颜色',
    },
    // ... 更多
];

// 专注力模块的页面信息查找函数
function focusPageInfoLookup(functionId: string) {
    const functionItem = FOCUS_FUNCTION_TYPES.find(
        (item) => item.id === functionId,
    );
    if (functionItem) {
        return {
            title: functionItem.title,
            desc: functionItem.desc,
        };
    }
    return undefined;
}

// 专注力模块的配置
const focusConfig: PageCommonMethodsConfig = {
    shareConfig: {
        title: '涂鸦丫-专注力训练',
        imageUrl: 'https://cdn.joeyone.cn/doodle/share-img/focus-share.png',
    },
    pageInfoLookup: focusPageInfoLookup,
};

// 创建专注力页面
createPage(
    {
        canvas: null as Canvas | null,
        // ... 其他配置

        onLoad(options: { id?: string }) {
            const functionId = options.id || 'grid-drawing';
            // 自动从 FOCUS_FUNCTION_TYPES 中查找
            this.initPageInfo(functionId, '格子仿画');
        },
    },
    focusConfig,
);
```

## 向后兼容性

所有现有的数学页面无需修改，因为 `mathPageMixin.ts` 保持了相同的接口。
