f08d68bebf
Co-Authored-By: Claude Code <noreply@anthropic.com>
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
/**
|
||
* 分享链接与二维码纯逻辑(P4a Task 9,依赖注入 qrcode 实现供 vitest 覆盖)
|
||
*
|
||
* - viewer URL:VITE_VIEWER_BASE + /a/{publicToken}(viewer 路由
|
||
* /a/:token;base 缺省兜底本机 dev 5175,尾斜杠容忍)
|
||
* - 二维码:node-qrcode canvas 渲染;实现经参数注入(单测不拉真库),
|
||
* 组件侧默认传 QRCode.toCanvas
|
||
*/
|
||
|
||
/** viewer 部署基址(缺省兜底本机 dev) */
|
||
export const VIEWER_BASE_FALLBACK = 'http://127.0.0.1:5175'
|
||
|
||
/** 部署基址 + 公开令牌 → viewer 相册页 URL(尾斜杠容忍) */
|
||
export function buildViewerAlbumUrl(base: string, publicToken: string): string {
|
||
return `${base.replace(/\/+$/, '')}/a/${publicToken}`
|
||
}
|
||
|
||
/** 环境基址(VITE_VIEWER_BASE 缺省兜底;Vite 注入 import.meta.env) */
|
||
export function viewerBaseFromEnv(env: { VITE_VIEWER_BASE?: string }): string {
|
||
const base = env.VITE_VIEWER_BASE?.trim()
|
||
return base && base !== '' ? base : VIEWER_BASE_FALLBACK
|
||
}
|
||
|
||
/** 二维码单点绘制函数(注入边界:组件包 QRCode.toCanvas,单测传假实现——
|
||
@types/qrcode 的 callback 重载使整模块注入不可赋值,收窄到本签名) */
|
||
export type QrDraw = (
|
||
canvas: HTMLCanvasElement,
|
||
text: string,
|
||
options: { width: number; margin: number }
|
||
) => Promise<unknown> | void
|
||
|
||
/** URL → 二维码 canvas(组件 watch 相册变化时调用) */
|
||
export async function renderShareQr(
|
||
canvas: HTMLCanvasElement,
|
||
url: string,
|
||
draw: QrDraw
|
||
): Promise<void> {
|
||
await draw(canvas, url, { width: 200, margin: 2 })
|
||
}
|