c5763fdf25
统一发布分享弹窗为作品分享卡片 支持下载分享卡与小程序九宫切图保存 小程序复制链接改为可直达作品详情的 web-view 路径 修复本地 dev Rust 构建绕过损坏 sccache 补充分享链路与 dev 启动文档和测试
80 lines
2.4 KiB
TypeScript
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`;
|
|
}
|