Files
Genarrative/src/components/common/publishShareModalModel.ts
T
kdletters c5763fdf25 重构作品分享链路
统一发布分享弹窗为作品分享卡片

支持下载分享卡与小程序九宫切图保存

小程序复制链接改为可直达作品详情的 web-view 路径

修复本地 dev Rust 构建绕过损坏 sccache

补充分享链路与 dev 启动文档和测试
2026-06-11 21:32:29 +08:00

80 lines
2.4 KiB
TypeScript

import { buildPublicWorkStagePath } from '../../routing/appPageRoutes';
import type { SelectionStage } from '../platform-entry/platformEntryTypes';
const MINI_PROGRAM_WEB_VIEW_PAGE_PATH = '/pages/web-view/index';
const MINI_PROGRAM_PUBLIC_WORK_DETAIL_PATH = '/works/detail';
export type PublishShareModalPayload = {
title: string;
publicWorkCode: string;
stage: SelectionStage;
workTypeLabel?: string | null;
coverImageSrc?: string | null;
fallbackCoverImageSrc?: string | null;
};
export function buildPublishShareUrl(payload: PublishShareModalPayload) {
const sharePath = buildPublicWorkStagePath(
payload.stage,
payload.publicWorkCode,
);
return typeof window === 'undefined'
? sharePath
: new URL(sharePath, window.location.origin).href;
}
export function buildMiniProgramPublishSharePath(
payload: PublishShareModalPayload,
basePath = MINI_PROGRAM_WEB_VIEW_PAGE_PATH,
) {
const [path = MINI_PROGRAM_WEB_VIEW_PAGE_PATH, rawSearch = ''] =
basePath.split('?');
const params = new URLSearchParams(rawSearch);
const publicWorkCode = payload.publicWorkCode.trim();
if (!params.has('targetPath')) {
params.set('targetPath', MINI_PROGRAM_PUBLIC_WORK_DETAIL_PATH);
}
if (publicWorkCode && !params.has('work')) {
params.set('work', publicWorkCode);
}
const queryString = params.toString();
return queryString ? `${path}?${queryString}` : path;
}
export function buildPublishShareCopyUrl(
payload: PublishShareModalPayload,
options: { miniProgramRuntime?: boolean } = {},
) {
return options.miniProgramRuntime
? buildMiniProgramPublishSharePath(payload)
: buildPublishShareUrl(payload);
}
export function buildPublishShareText(payload: PublishShareModalPayload) {
const publicWorkCode = payload.publicWorkCode.trim();
const title = payload.title.trim() || '我的作品';
return `邀请你来玩《${title}\n作品号:${publicWorkCode}\n${buildPublishShareUrl({
...payload,
publicWorkCode,
title,
})}`;
}
export function buildPublishShareCardFileName(
payload: Pick<PublishShareModalPayload, 'title' | 'publicWorkCode'>,
) {
const title = payload.title.trim() || '我的作品';
const publicWorkCode = payload.publicWorkCode.trim() || 'share';
const safeTitle = Array.from(title)
.filter((char) => !/[\\/:*?"<>|]/u.test(char))
.join('')
.replace(/\s+/gu, '-')
.slice(0, 28)
.trim();
return `${safeTitle || '我的作品'}-${publicWorkCode}.png`;
}