feat(creator-studio): 前台 Gutenberg 创作工作台与受保护付费附件
前台投稿页改为沉浸式创作工作台:Gutenberg 负责区块解析与序列化, React + TypeScript 负责工作台外壳与发布抽屉,Jio 服务端继续作为权限、 审核与付费的唯一权威。 - 新增 assets/creator-studio 独立构建(wp-scripts,锁定 WP 6.4 时代包), 仅在投稿模板加载,构建缺失或游客访问时回退原有 TinyMCE 表单 - 自动保存(4s 防抖 + rev 冲突 409)、本地快照恢复、发布配置抽屉、 移动端全屏单列与安全区适配 - 图片插入走现有 front-submit 上传管线,保留能力校验与待认领生命周期 - 已发布文章的改稿写入私有版本,审核通过前线上内容/链接/付费条款不变; 原生后台「改稿审核」一次性应用或退回,并校验源文章并发指纹 - 私有附件新表 jio_private_asset + jio_dl_token.asset_id,schema 升到 3.4.0; 文件存放 ABSPATH 之外,未配置私有存储时 fail closed - 下载令牌绑定文章/附件/用户/IP/UA/次数,每次交付复核 Visibility 的 订单、VIP 与配额判定;中断传输归还次数 - 付费字段改为写入前校验,非法价格不再留下半保存文章 - 新增 creator-studio 契约测试;更新受影响的 schema/下载/投稿契约 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
7a8279f8e7
commit
fac4a714e0
45 files changed
+28495
-56
No files matched your search
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* 顶栏保存状态。状态文案即用户对“内容有没有保存”的唯一反馈。
|
||||
*
|
||||
* @package Jio
|
||||
*/
|
||||
|
||||
import { __ } from '@wordpress/i18n';
|
||||
|
||||
export type SaveStatus = 'ready' | 'saving' | 'saved' | 'error' | 'conflict' | 'submitting' | 'submitted';
|
||||
|
||||
export type SaveStateValue = { state: SaveStatus; at: string };
|
||||
|
||||
const LABELS: Record<SaveStatus, string> = {
|
||||
ready: __('尚未保存', 'jio'),
|
||||
saving: __('保存中…', 'jio'),
|
||||
saved: __('已保存', 'jio'),
|
||||
error: __('保存失败', 'jio'),
|
||||
conflict: __('内容已在别处更新', 'jio'),
|
||||
submitting: __('提交中…', 'jio'),
|
||||
submitted: __('已提交', 'jio'),
|
||||
};
|
||||
|
||||
export function SaveState({ value }: { value: SaveStateValue }) {
|
||||
return (
|
||||
<span className={`jio-creator__save is-${value.state}`} role="status" aria-live="polite">
|
||||
<i className="fa fas fa-circle" aria-hidden="true" />
|
||||
<span>{LABELS[value.state] || LABELS.ready}</span>
|
||||
{value.state === 'saved' && value.at ? <time>{value.at}</time> : null}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user