artalk 2.3.3 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Artalk.css +1 -1
- package/dist/Artalk.es.js +3184 -2888
- package/dist/Artalk.iife.js +1 -1
- package/dist/Artalk.js +1 -1
- package/dist/ArtalkLite.css +1 -1
- package/dist/ArtalkLite.es.js +3157 -2887
- package/dist/ArtalkLite.iife.js +1 -1
- package/dist/ArtalkLite.js +1 -1
- package/dist/src/api/admin.d.ts +10 -0
- package/dist/src/api/api-base.d.ts +14 -0
- package/dist/src/api/captcha.d.ts +14 -0
- package/dist/src/api/comment.d.ts +29 -0
- package/dist/src/api/index.d.ts +31 -0
- package/dist/src/api/page.d.ts +22 -0
- package/dist/src/api/request.d.ts +12 -0
- package/dist/src/api/site.d.ts +17 -0
- package/dist/src/api/system.d.ts +13 -0
- package/dist/src/api/upload.d.ts +11 -0
- package/dist/src/api/user.d.ts +28 -0
- package/dist/src/artalk.d.ts +56 -0
- package/dist/src/comment/actions.d.ts +17 -0
- package/dist/src/comment/comment.d.ts +67 -0
- package/dist/src/comment/index.d.ts +2 -0
- package/dist/src/comment/render.d.ts +76 -0
- package/dist/src/components/action-btn.d.ts +52 -0
- package/dist/src/components/dialog.d.ts +18 -0
- package/dist/src/components/pagination.d.ts +30 -0
- package/dist/src/components/read-more-btn.d.ts +33 -0
- package/dist/src/context.d.ts +72 -0
- package/dist/src/defaults.d.ts +3 -0
- package/dist/src/editor/editor.d.ts +84 -0
- package/dist/src/editor/index.d.ts +2 -0
- package/dist/src/editor/plugs/editor-plug.d.ts +26 -0
- package/dist/src/editor/plugs/emoticons-plug.d.ts +36 -0
- package/dist/src/editor/plugs/header-input-plug.d.ts +13 -0
- package/dist/src/editor/plugs/preview-plug.d.ts +10 -0
- package/dist/src/editor/plugs/upload-plug.d.ts +10 -0
- package/dist/src/i18n/en.d.ts +69 -0
- package/dist/src/i18n/index.d.ts +294 -0
- package/dist/src/i18n/zh-CN.d.ts +3 -0
- package/dist/src/layer/index.d.ts +3 -0
- package/dist/src/layer/layer.d.ts +32 -0
- package/dist/src/layer/sidebar-layer.d.ts +20 -0
- package/dist/src/lib/checker/admin-checker.d.ts +3 -0
- package/dist/src/lib/checker/captcha-checker.d.ts +3 -0
- package/dist/src/lib/checker/index.d.ts +42 -0
- package/dist/src/lib/component.d.ts +12 -0
- package/dist/src/lib/detect.d.ts +10 -0
- package/dist/src/lib/stat.d.ts +15 -0
- package/dist/src/lib/ui.d.ts +23 -0
- package/dist/src/lib/user.d.ts +13 -0
- package/dist/src/lib/utils.d.ts +39 -0
- package/dist/src/list/index.d.ts +2 -0
- package/dist/src/list/list-lite.d.ts +63 -0
- package/dist/src/list/list-nest.d.ts +10 -0
- package/dist/src/list/list.d.ts +26 -0
- package/dist/src/main.d.ts +4 -0
- package/dist/types/artalk-config.d.ts +132 -0
- package/dist/types/artalk-data.d.ts +204 -0
- package/dist/types/context.d.ts +146 -0
- package/dist/types/event.d.ts +28 -0
- package/dist/types/global.d.ts +0 -0
- package/dist/types/plug.d.ts +4 -0
- package/index.html +3 -3
- package/package.json +5 -5
- package/src/api/admin.ts +18 -0
- package/src/api/api-base.ts +27 -0
- package/src/api/captcha.ts +24 -0
- package/src/api/comment.ts +84 -0
- package/src/api/index.ts +25 -361
- package/src/api/page.ts +85 -0
- package/src/api/request.ts +12 -8
- package/src/api/site.ts +51 -0
- package/src/api/system.ts +39 -0
- package/src/api/upload.ts +29 -0
- package/src/api/user.ts +75 -0
- package/src/artalk.ts +75 -76
- package/src/comment/actions.ts +3 -3
- package/src/comment/comment.ts +6 -9
- package/src/comment/render.ts +93 -47
- package/src/components/pagination.ts +0 -1
- package/src/context.ts +57 -18
- package/src/editor/editor.ts +111 -18
- package/src/editor/plugs/header-input-plug.ts +1 -1
- package/src/editor/plugs/upload-plug.ts +1 -1
- package/src/i18n/en.ts +3 -0
- package/src/i18n/index.ts +117 -2
- package/src/i18n/zh-CN.ts +4 -1
- package/src/layer/sidebar-layer.ts +1 -3
- package/src/lib/checker/admin-checker.ts +1 -1
- package/src/lib/checker/captcha-checker.ts +3 -3
- package/src/lib/stat.ts +2 -2
- package/src/lib/ui.ts +6 -0
- package/src/list/list-lite.ts +33 -25
- package/src/list/list.ts +3 -4
- package/src/main.ts +3 -0
- package/src/style/comment.less +2 -3
- package/src/style/main.less +6 -0
- package/test/CSRF.html +26 -0
- package/types/artalk-data.d.ts +3 -0
- package/types/context.d.ts +19 -1
- package/types/global.d.ts +0 -2
- package/vite-base.config.ts +9 -5
- package/vite.config.ts +5 -1
- package/types/index.d.ts +0 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ContextApi from '../../types/context';
|
|
2
|
+
import ArtalkPlug from '../../types/plug';
|
|
3
|
+
export interface CountConf {
|
|
4
|
+
ctx: ContextApi;
|
|
5
|
+
/** 是否增加当前页面 PV 数 */
|
|
6
|
+
pvAdd?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const PvCountWidget: ArtalkPlug;
|
|
9
|
+
/** 初始化评论数和 PV 数量展示元素 */
|
|
10
|
+
export declare function initCountWidget(p: CountConf): Promise<void>;
|
|
11
|
+
export declare function handleStatCount(p: CountConf, args: {
|
|
12
|
+
api: 'page_pv' | 'page_comment';
|
|
13
|
+
countEl: string;
|
|
14
|
+
curtPageCount?: number;
|
|
15
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** 显示加载 */
|
|
2
|
+
export declare function showLoading(parentElem: HTMLElement, conf?: {
|
|
3
|
+
transparentBg?: boolean;
|
|
4
|
+
}): void;
|
|
5
|
+
/** 隐藏加载 */
|
|
6
|
+
export declare function hideLoading(parentElem: HTMLElement): void;
|
|
7
|
+
/** 元素加载动画 */
|
|
8
|
+
export declare function setLoading(val: boolean, parentElem: HTMLElement): void;
|
|
9
|
+
/** 元素是否用户可见 */
|
|
10
|
+
export declare function isVisible(el: HTMLElement, viewport?: HTMLElement): boolean;
|
|
11
|
+
/** 滚动到元素中心 */
|
|
12
|
+
export declare function scrollIntoView(elem: HTMLElement, enableAnim?: boolean): void;
|
|
13
|
+
/** 显示消息 */
|
|
14
|
+
export declare function showNotify(wrapElem: HTMLElement, msg: string, type: 's' | 'e' | 'w' | 'i'): void;
|
|
15
|
+
/** fade 动画 */
|
|
16
|
+
export declare function playFadeAnim(elem: HTMLElement, after?: () => void, type?: 'in' | 'out'): void;
|
|
17
|
+
/** 渐入动画 */
|
|
18
|
+
export declare function playFadeInAnim(elem: HTMLElement, after?: () => void): void;
|
|
19
|
+
/** 渐出动画 */
|
|
20
|
+
export declare function playFadeOutAnim(elem: HTMLElement, after?: () => void): void;
|
|
21
|
+
/** 设置全局错误 */
|
|
22
|
+
export declare function setError(parentElem: HTMLElement, html: string | HTMLElement | null, title?: string): void;
|
|
23
|
+
export declare function getScrollBarWidth(): number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LocalUser } from '../../types/artalk-config';
|
|
2
|
+
import Context from '../../types/context';
|
|
3
|
+
export default class User {
|
|
4
|
+
ctx: Context;
|
|
5
|
+
data: LocalUser;
|
|
6
|
+
constructor(ctx: Context);
|
|
7
|
+
/** 保存用户到 localStorage 中 */
|
|
8
|
+
update(obj?: Partial<LocalUser>): void;
|
|
9
|
+
/** 注销,清除用户登录状态 */
|
|
10
|
+
logout(): void;
|
|
11
|
+
/** 是否已填写基本用户信息 */
|
|
12
|
+
checkHasBasicUserInfo(): boolean;
|
|
13
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import Context from '../../types/context';
|
|
2
|
+
export declare function createElement<E extends HTMLElement = HTMLElement>(htmlStr?: string): E;
|
|
3
|
+
export declare function getHeight(el: HTMLElement): number;
|
|
4
|
+
export declare function htmlEncode(str: string): string;
|
|
5
|
+
export declare function htmlDecode(str: string): string;
|
|
6
|
+
export declare function getQueryParam(name: string): string | null;
|
|
7
|
+
export declare function getOffset(el: HTMLElement): {
|
|
8
|
+
top: number;
|
|
9
|
+
left: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function padWithZeros(vNumber: number, width: number): string;
|
|
12
|
+
export declare function dateFormat(date: Date): string;
|
|
13
|
+
export declare function timeAgo(date: Date, ctx: Context): string;
|
|
14
|
+
/** 所有图片加载完毕后执行 */
|
|
15
|
+
export declare function onImagesLoaded($container: HTMLElement, event: Function): void;
|
|
16
|
+
export declare function getGravatarURL(ctx: Context, emailMD5: string): string;
|
|
17
|
+
export declare function sleep(ms: number): Promise<unknown>;
|
|
18
|
+
/** 版本号比较(a < b :-1 | 0 | b < a :1) */
|
|
19
|
+
export declare function versionCompare(a: string, b: string): 0 | 1 | -1;
|
|
20
|
+
/** 初始化 marked */
|
|
21
|
+
export declare function initMarked(ctx: Context): void;
|
|
22
|
+
/** 解析 markdown */
|
|
23
|
+
export declare function marked(ctx: Context, src: string): string;
|
|
24
|
+
/** 获取修正后的 UserAgent */
|
|
25
|
+
export declare function getCorrectUserAgent(): Promise<string>;
|
|
26
|
+
/** 是否为完整的 URL */
|
|
27
|
+
export declare function isValidURL(urlRaw: string): boolean;
|
|
28
|
+
/** 获取基于 conf.server 的 URL */
|
|
29
|
+
export declare function getURLBasedOnApi(ctx: Context, path: string): string;
|
|
30
|
+
/** 获取基于某个 baseURL 的 URL */
|
|
31
|
+
export declare function getURLBasedOn(baseURL: string, path: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Performs a deep merge of `source` into `target`.
|
|
34
|
+
* Mutates `target` only but not its objects and arrays.
|
|
35
|
+
*
|
|
36
|
+
* @author inspired by [jhildenbiddle](https://stackoverflow.com/a/48218209).
|
|
37
|
+
* @link https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6
|
|
38
|
+
*/
|
|
39
|
+
export declare function mergeDeep(target: any, source: any): any;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ListData, CommentData, NotifyData } from '../../types/artalk-data';
|
|
2
|
+
import Context from '../../types/context';
|
|
3
|
+
import Component from '../lib/component';
|
|
4
|
+
import Comment from '../comment';
|
|
5
|
+
import Pagination from '../components/pagination';
|
|
6
|
+
import ReadMoreBtn from '../components/read-more-btn';
|
|
7
|
+
import * as ListNest from './list-nest';
|
|
8
|
+
export default class ListLite extends Component {
|
|
9
|
+
protected $commentsWrap: HTMLElement;
|
|
10
|
+
protected data?: ListData;
|
|
11
|
+
protected isLoading: boolean;
|
|
12
|
+
noCommentText: string;
|
|
13
|
+
/** 平铺模式 */
|
|
14
|
+
flatMode: boolean;
|
|
15
|
+
/** 嵌套模式 */
|
|
16
|
+
nestSortBy: ListNest.SortByType;
|
|
17
|
+
/** 分页 */
|
|
18
|
+
pageMode: 'pagination' | 'read-more';
|
|
19
|
+
pageSize: number;
|
|
20
|
+
scrollListenerAt?: HTMLElement;
|
|
21
|
+
repositionAt?: HTMLElement;
|
|
22
|
+
protected pagination?: Pagination;
|
|
23
|
+
protected readMoreBtn?: ReadMoreBtn;
|
|
24
|
+
protected autoLoadScrollEvent?: any;
|
|
25
|
+
renderComment?: (comment: Comment) => void;
|
|
26
|
+
paramsEditor?: (params: any) => void;
|
|
27
|
+
onAfterLoad?: (data: ListData) => void;
|
|
28
|
+
protected unread: NotifyData[];
|
|
29
|
+
unreadHighlight?: boolean;
|
|
30
|
+
constructor(ctx: Context);
|
|
31
|
+
getData(): ListData | undefined;
|
|
32
|
+
clearData(): void;
|
|
33
|
+
getCommentsWrapEl(): HTMLElement;
|
|
34
|
+
/** 加载动画 */
|
|
35
|
+
setLoading(val: boolean, isFirstLoad?: boolean): void;
|
|
36
|
+
/** 评论获取 */
|
|
37
|
+
fetchComments(offset: number): Promise<void>;
|
|
38
|
+
protected onLoad(data: ListData, offset: number): void;
|
|
39
|
+
/** 分页模式 */
|
|
40
|
+
private refreshPagination;
|
|
41
|
+
private initPagination;
|
|
42
|
+
/** 错误处理 */
|
|
43
|
+
protected onError(msg: any, offset: number, errData?: any): void;
|
|
44
|
+
/** 刷新界面 */
|
|
45
|
+
refreshUI(): void;
|
|
46
|
+
/** 重新加载列表 */
|
|
47
|
+
reload(): void;
|
|
48
|
+
/** 创建新评论 */
|
|
49
|
+
protected createComment(cData: CommentData, ctxData?: CommentData[]): Comment;
|
|
50
|
+
/** 导入评论 · 通过请求数据 */
|
|
51
|
+
importComments(srcData: CommentData[]): void;
|
|
52
|
+
private importCommentsNest;
|
|
53
|
+
/** 导入评论 · 平铺模式 */
|
|
54
|
+
private putCommentFlatMode;
|
|
55
|
+
/** 新增评论 · 首部添加 */
|
|
56
|
+
insertComment(commentData: CommentData): void;
|
|
57
|
+
/** 更新评论 */
|
|
58
|
+
updateComment(commentData: CommentData): void;
|
|
59
|
+
/** 更新未读数据 */
|
|
60
|
+
updateUnread(notifies: NotifyData[]): void;
|
|
61
|
+
/** 版本检测 */
|
|
62
|
+
versionCheck(name: 'frontend' | 'backend', needVersion: string, curtVersion: string): boolean;
|
|
63
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CommentData } from '../../types/artalk-data';
|
|
2
|
+
export declare type CommentNode = {
|
|
3
|
+
id: number;
|
|
4
|
+
comment: CommentData;
|
|
5
|
+
children: CommentNode[];
|
|
6
|
+
parent?: CommentNode;
|
|
7
|
+
level: number;
|
|
8
|
+
};
|
|
9
|
+
export declare type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC';
|
|
10
|
+
export declare function makeNestCommentNodeList(srcData: CommentData[], sortBy?: SortByType, nestMax?: number): CommentNode[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ListData, NotifyData } from '../../types/artalk-data';
|
|
2
|
+
import Context from '../../types/context';
|
|
3
|
+
import ListLite from './list-lite';
|
|
4
|
+
export default class List extends ListLite {
|
|
5
|
+
private $closeCommentBtn;
|
|
6
|
+
private $openSidebarBtn;
|
|
7
|
+
private $unreadBadge;
|
|
8
|
+
private $commentCount;
|
|
9
|
+
private $commentCountNum;
|
|
10
|
+
private $dropdownWrap?;
|
|
11
|
+
constructor(ctx: Context);
|
|
12
|
+
private initListActionBtn;
|
|
13
|
+
/** 刷新界面 */
|
|
14
|
+
refreshUI(): void;
|
|
15
|
+
protected onLoad(data: ListData, offset: number): void;
|
|
16
|
+
private goToCommentFounded;
|
|
17
|
+
goToCommentDelay: boolean;
|
|
18
|
+
/** 跳到评论项位置 - 根据 `location.hash` */
|
|
19
|
+
checkGoToCommentByUrlHash(): void;
|
|
20
|
+
/** 管理员设置页面信息 */
|
|
21
|
+
adminPageEditSave(): void;
|
|
22
|
+
showUnreadBadge(count: number): void;
|
|
23
|
+
/** 初始化选择下拉层 */
|
|
24
|
+
protected initDropdown(): void;
|
|
25
|
+
updateUnread(notifies: NotifyData[]): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { I18n } from '../src/i18n'
|
|
2
|
+
|
|
3
|
+
export default interface ArtalkConfig {
|
|
4
|
+
/** 装载元素 */
|
|
5
|
+
el: string|HTMLElement
|
|
6
|
+
|
|
7
|
+
/** 页面唯一标识(完整 URL) */
|
|
8
|
+
pageKey: string
|
|
9
|
+
|
|
10
|
+
/** 页面标题 */
|
|
11
|
+
pageTitle: string
|
|
12
|
+
|
|
13
|
+
/** 服务器地址 */
|
|
14
|
+
server: string
|
|
15
|
+
|
|
16
|
+
/** 站点名 */
|
|
17
|
+
site: string
|
|
18
|
+
|
|
19
|
+
/** 评论框占位字符 */
|
|
20
|
+
placeholder: string
|
|
21
|
+
|
|
22
|
+
/** 评论为空时显示字符 */
|
|
23
|
+
noComment: string
|
|
24
|
+
|
|
25
|
+
/** 发送按钮文字 */
|
|
26
|
+
sendBtn: string
|
|
27
|
+
|
|
28
|
+
/** 评论框旅行(显示在待回复评论后面) */
|
|
29
|
+
editorTravel: boolean
|
|
30
|
+
|
|
31
|
+
/** 表情包 */
|
|
32
|
+
emoticons: object|any[]|string|false
|
|
33
|
+
|
|
34
|
+
/** Gravatar 头像 */
|
|
35
|
+
gravatar: {
|
|
36
|
+
/** 镜像 */
|
|
37
|
+
mirror: string
|
|
38
|
+
/** 默认头像(URL or Gravatar Type) */
|
|
39
|
+
default: string
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** 分页配置 */
|
|
43
|
+
pagination: {
|
|
44
|
+
/** 每次请求获取数量 */
|
|
45
|
+
pageSize: number
|
|
46
|
+
/** 阅读更多模式 */
|
|
47
|
+
readMore: boolean
|
|
48
|
+
/** 滚动到底部自动加载 */
|
|
49
|
+
autoLoad: boolean
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** 内容限高 */
|
|
53
|
+
heightLimit: {
|
|
54
|
+
/** 评论内容限高 */
|
|
55
|
+
content: number
|
|
56
|
+
|
|
57
|
+
/** 子评论区域限高 */
|
|
58
|
+
children: number
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** 评论投票按钮 */
|
|
62
|
+
vote: boolean
|
|
63
|
+
|
|
64
|
+
/** 评论投票反对按钮 */
|
|
65
|
+
voteDown: boolean
|
|
66
|
+
|
|
67
|
+
/** 评论预览功能 */
|
|
68
|
+
preview: boolean
|
|
69
|
+
|
|
70
|
+
/** 评论数绑定元素 Selector */
|
|
71
|
+
countEl: string
|
|
72
|
+
|
|
73
|
+
/** PV 数绑定元素 Selector */
|
|
74
|
+
pvEl: string
|
|
75
|
+
|
|
76
|
+
/** 暗黑模式 */
|
|
77
|
+
darkMode: boolean|'auto'
|
|
78
|
+
|
|
79
|
+
/** 请求超时(单位:秒) */
|
|
80
|
+
reqTimeout: number
|
|
81
|
+
|
|
82
|
+
/** 平铺模式 */
|
|
83
|
+
flatMode: boolean|'auto'
|
|
84
|
+
|
|
85
|
+
/** 嵌套模式 · 最大层数 */
|
|
86
|
+
nestMax: number
|
|
87
|
+
|
|
88
|
+
/** 嵌套模式 · 排序方式 */
|
|
89
|
+
nestSort: 'DATE_ASC'|'DATE_DESC'
|
|
90
|
+
|
|
91
|
+
/** 显示 UA 徽标 */
|
|
92
|
+
uaBadge: boolean
|
|
93
|
+
|
|
94
|
+
/** 评论列表排序功能 (显示 Dropdown) */
|
|
95
|
+
listSort: boolean
|
|
96
|
+
|
|
97
|
+
/** 图片上传功能 */
|
|
98
|
+
imgUpload: boolean
|
|
99
|
+
|
|
100
|
+
/** 图片上传器 */
|
|
101
|
+
imgUploader?: (file: File) => Promise<string>
|
|
102
|
+
|
|
103
|
+
/** 版本检测 */
|
|
104
|
+
versionCheck: boolean
|
|
105
|
+
|
|
106
|
+
/** 应用后端配置 */
|
|
107
|
+
useBackendConf: boolean
|
|
108
|
+
|
|
109
|
+
/** 语言本地化 */
|
|
110
|
+
locale: I18n|string
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* 本地持久化用户数据
|
|
115
|
+
* @note 始终保持一层结构,不支持多层结构
|
|
116
|
+
*/
|
|
117
|
+
export interface LocalUser {
|
|
118
|
+
/** 昵称 */
|
|
119
|
+
nick: string
|
|
120
|
+
|
|
121
|
+
/** 邮箱 */
|
|
122
|
+
email: string
|
|
123
|
+
|
|
124
|
+
/** 链接 */
|
|
125
|
+
link: string
|
|
126
|
+
|
|
127
|
+
/** TOKEN */
|
|
128
|
+
token: string
|
|
129
|
+
|
|
130
|
+
/** 是否为管理员 */
|
|
131
|
+
isAdmin: boolean
|
|
132
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
export interface CommentData {
|
|
2
|
+
/** 评论 ID */
|
|
3
|
+
id: number
|
|
4
|
+
|
|
5
|
+
/** 评论正文 */
|
|
6
|
+
content: string
|
|
7
|
+
|
|
8
|
+
/** 用户昵称 */
|
|
9
|
+
nick: string
|
|
10
|
+
|
|
11
|
+
/** 用户邮箱 (该字段仅管理员可见) */
|
|
12
|
+
email?: string
|
|
13
|
+
|
|
14
|
+
/** 用户邮箱(已加密) */
|
|
15
|
+
email_encrypted: string
|
|
16
|
+
|
|
17
|
+
/** 用户链接 */
|
|
18
|
+
link: string
|
|
19
|
+
|
|
20
|
+
/** 回复目标评论 ID */
|
|
21
|
+
rid: number
|
|
22
|
+
|
|
23
|
+
/** User Agent */
|
|
24
|
+
ua: string
|
|
25
|
+
|
|
26
|
+
/** 评论日期 */
|
|
27
|
+
date: string
|
|
28
|
+
|
|
29
|
+
/** 是否折叠 */
|
|
30
|
+
is_collapsed?: boolean
|
|
31
|
+
|
|
32
|
+
/** 是否待审 */
|
|
33
|
+
is_pending?: boolean
|
|
34
|
+
|
|
35
|
+
/** 是否置顶 */
|
|
36
|
+
is_pinned?: boolean
|
|
37
|
+
|
|
38
|
+
/** 是否为管理员 */
|
|
39
|
+
is_admin?: boolean
|
|
40
|
+
|
|
41
|
+
/** 徽章文字 */
|
|
42
|
+
badge_name?: string
|
|
43
|
+
|
|
44
|
+
/** 徽章颜色 */
|
|
45
|
+
badge_color?: string
|
|
46
|
+
|
|
47
|
+
/** 是否允许回复 */
|
|
48
|
+
is_allow_reply?: boolean
|
|
49
|
+
|
|
50
|
+
/** 评论页面 key */
|
|
51
|
+
page_key: string
|
|
52
|
+
|
|
53
|
+
/** 评论页面 url */
|
|
54
|
+
page_url?: string
|
|
55
|
+
|
|
56
|
+
/** 是否可见 */
|
|
57
|
+
visible: boolean
|
|
58
|
+
|
|
59
|
+
/** 站点名(用于隔离) */
|
|
60
|
+
site_name: string
|
|
61
|
+
|
|
62
|
+
/** 赞同数 */
|
|
63
|
+
vote_up: number
|
|
64
|
+
|
|
65
|
+
/** 反对数 */
|
|
66
|
+
vote_down: number
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ListData {
|
|
70
|
+
/** 评论数据 */
|
|
71
|
+
comments: CommentData[]
|
|
72
|
+
|
|
73
|
+
/** 根评论总数 */
|
|
74
|
+
total_roots: number
|
|
75
|
+
|
|
76
|
+
/** 评论总数(包括所有子评论) */
|
|
77
|
+
total: number
|
|
78
|
+
|
|
79
|
+
/** 页面信息 */
|
|
80
|
+
page: PageData
|
|
81
|
+
|
|
82
|
+
/** 站点信息 */
|
|
83
|
+
site: SiteData
|
|
84
|
+
|
|
85
|
+
/** 未读的 Notifies */
|
|
86
|
+
unread: NotifyData[]
|
|
87
|
+
|
|
88
|
+
/** 未读计数 */
|
|
89
|
+
unread_count: number
|
|
90
|
+
|
|
91
|
+
/** API 版本 */
|
|
92
|
+
api_version: ApiVersionData
|
|
93
|
+
|
|
94
|
+
/** 后端配置 */
|
|
95
|
+
conf: any // TODO
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface PageData {
|
|
99
|
+
/** 页面 ID */
|
|
100
|
+
id: number
|
|
101
|
+
|
|
102
|
+
/** 页面唯一标识符 */
|
|
103
|
+
key: string
|
|
104
|
+
|
|
105
|
+
/** 页面标题 */
|
|
106
|
+
title: string
|
|
107
|
+
|
|
108
|
+
/** 页面 url */
|
|
109
|
+
url: string
|
|
110
|
+
|
|
111
|
+
/** 仅管理员可评 */
|
|
112
|
+
admin_only: boolean
|
|
113
|
+
|
|
114
|
+
/** 站点名(用于隔离) */
|
|
115
|
+
site_name: string
|
|
116
|
+
|
|
117
|
+
/** 赞同数 */
|
|
118
|
+
vote_up: number
|
|
119
|
+
|
|
120
|
+
/** 反对数 */
|
|
121
|
+
vote_down: number
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface SiteData {
|
|
125
|
+
/** 站点 ID */
|
|
126
|
+
id: number
|
|
127
|
+
|
|
128
|
+
/** 站点名 */
|
|
129
|
+
name: string
|
|
130
|
+
|
|
131
|
+
/** 站点 URLs */
|
|
132
|
+
urls: string[]
|
|
133
|
+
|
|
134
|
+
/** 站点 URLs(原始字符串) */
|
|
135
|
+
urls_raw: string
|
|
136
|
+
|
|
137
|
+
/** 站点主 URL */
|
|
138
|
+
first_url: string
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface UserData {
|
|
142
|
+
/** 用户 ID */
|
|
143
|
+
id: number
|
|
144
|
+
|
|
145
|
+
/** 用户名 */
|
|
146
|
+
name: string
|
|
147
|
+
|
|
148
|
+
/** 邮箱 */
|
|
149
|
+
email: string
|
|
150
|
+
|
|
151
|
+
/** 链接 */
|
|
152
|
+
link: string
|
|
153
|
+
|
|
154
|
+
/** 徽章名称 */
|
|
155
|
+
badge_name: string
|
|
156
|
+
|
|
157
|
+
/** 徽章颜色 */
|
|
158
|
+
badge_color: string
|
|
159
|
+
|
|
160
|
+
/** 是否属于管理员 */
|
|
161
|
+
is_admin: boolean
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface NotifyData {
|
|
165
|
+
/** 通知 ID */
|
|
166
|
+
id: number
|
|
167
|
+
|
|
168
|
+
/** 用户 ID */
|
|
169
|
+
user_id: number
|
|
170
|
+
|
|
171
|
+
/** 评论 ID */
|
|
172
|
+
comment_id: number
|
|
173
|
+
|
|
174
|
+
/** 是否已读 */
|
|
175
|
+
is_read: boolean
|
|
176
|
+
|
|
177
|
+
/** 是否已发送邮件通知 */
|
|
178
|
+
is_emailed: boolean
|
|
179
|
+
|
|
180
|
+
/** 标为已读地址 */
|
|
181
|
+
read_link: string
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export type EmoticonGrpData = {
|
|
185
|
+
name: string,
|
|
186
|
+
type: 'emoticon'|'image'|'emoji'
|
|
187
|
+
items: {key: string, val: string}[]
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export type EmoticonListData = EmoticonGrpData[]
|
|
191
|
+
|
|
192
|
+
export interface ApiVersionData {
|
|
193
|
+
/** API 程序名 */
|
|
194
|
+
app: string
|
|
195
|
+
|
|
196
|
+
/** API 程序版本号 */
|
|
197
|
+
version: string
|
|
198
|
+
|
|
199
|
+
/** API 程序 CommitHash */
|
|
200
|
+
commit_hash: string
|
|
201
|
+
|
|
202
|
+
/** API 程序要求前端最小版本 */
|
|
203
|
+
fe_min_version: string
|
|
204
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { marked as libMarked } from 'marked'
|
|
2
|
+
import ArtalkConfig from './artalk-config'
|
|
3
|
+
import { CommentData, NotifyData } from './artalk-data'
|
|
4
|
+
import { EventPayloadMap, Event, EventScopeType, Handler } from './event'
|
|
5
|
+
import { internal as internalLocales, I18n } from '../src/i18n'
|
|
6
|
+
import Api from '../src/api'
|
|
7
|
+
import User from '../src/lib/user'
|
|
8
|
+
import Editor from '../src/editor'
|
|
9
|
+
import Comment from '../src/comment'
|
|
10
|
+
import ListLite from '../src/list/list-lite'
|
|
11
|
+
import SidebarLayer, { SidebarShowPayload } from '../src/layer/sidebar-layer'
|
|
12
|
+
import CheckerLauncher, { CheckerCaptchaPayload, CheckerPayload } from '../src/lib/checker'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Context 接口
|
|
16
|
+
*
|
|
17
|
+
* (面向接口的编程)
|
|
18
|
+
*/
|
|
19
|
+
export default interface ContextApi {
|
|
20
|
+
/** Context 唯一标识 */
|
|
21
|
+
cid: number
|
|
22
|
+
|
|
23
|
+
/** Artalk 根元素对象 */
|
|
24
|
+
$root: HTMLElement
|
|
25
|
+
|
|
26
|
+
/** 配置对象 */
|
|
27
|
+
conf: ArtalkConfig
|
|
28
|
+
|
|
29
|
+
/** 用户对象 */
|
|
30
|
+
user: User
|
|
31
|
+
|
|
32
|
+
/** marked 依赖对象 */
|
|
33
|
+
markedInstance?: typeof libMarked
|
|
34
|
+
|
|
35
|
+
/** marked 内容替换器 */
|
|
36
|
+
markedReplacers: ((raw: string) => string)[]
|
|
37
|
+
|
|
38
|
+
/* 设置持有的同事类 (中介者模式) */
|
|
39
|
+
setApi(api: Api): void
|
|
40
|
+
setEditor(editor: Editor): void
|
|
41
|
+
setList(list?: ListLite): void
|
|
42
|
+
setSidebarLayer(list: SidebarLayer): void
|
|
43
|
+
setCheckerLauncher(checkerLauncher: CheckerLauncher): void
|
|
44
|
+
|
|
45
|
+
/** 获取 API 以供 HTTP 请求 */
|
|
46
|
+
getApi(): Api
|
|
47
|
+
|
|
48
|
+
/** 获取评论实例对象列表 */
|
|
49
|
+
getCommentList(): Comment[]
|
|
50
|
+
|
|
51
|
+
/** 获取评论数据列表 */
|
|
52
|
+
getCommentDataList(): CommentData[]
|
|
53
|
+
|
|
54
|
+
/** 查找评论 */
|
|
55
|
+
findComment(id: number): Comment|undefined
|
|
56
|
+
|
|
57
|
+
/** 删除评论 */
|
|
58
|
+
deleteComment(comment: number|Comment): void
|
|
59
|
+
|
|
60
|
+
/** 清空评论 */
|
|
61
|
+
clearAllComments(): void
|
|
62
|
+
|
|
63
|
+
/** 插入评论 */
|
|
64
|
+
insertComment(commentData: CommentData): void
|
|
65
|
+
|
|
66
|
+
/** 更新评论 */
|
|
67
|
+
updateComment(commentData: CommentData): void
|
|
68
|
+
|
|
69
|
+
/** 评论回复 */
|
|
70
|
+
replyComment(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void
|
|
71
|
+
|
|
72
|
+
/** 取消回复评论 */
|
|
73
|
+
cancelReplyComment(): void
|
|
74
|
+
|
|
75
|
+
/** 编辑评论 */
|
|
76
|
+
editComment(commentData: CommentData, $comment: HTMLElement): void
|
|
77
|
+
|
|
78
|
+
/** 取消编辑评论 */
|
|
79
|
+
cancelEditComment(): void
|
|
80
|
+
|
|
81
|
+
/** 更新通知数据 */
|
|
82
|
+
updateNotifies(notifies: NotifyData[]): void
|
|
83
|
+
|
|
84
|
+
/** 列表 - 重新加载数据 */
|
|
85
|
+
listReload(): void
|
|
86
|
+
|
|
87
|
+
/** 列表 - 重新加载数据 (别名) */
|
|
88
|
+
reload(): void
|
|
89
|
+
|
|
90
|
+
/** 列表 - UI 更新 */
|
|
91
|
+
listRefreshUI(): void
|
|
92
|
+
|
|
93
|
+
/** 列表 - HashGoto 功能检测 */
|
|
94
|
+
listHashGotoCheck(): void
|
|
95
|
+
|
|
96
|
+
/** 显示侧边栏 */
|
|
97
|
+
showSidebar(payload?: SidebarShowPayload): void
|
|
98
|
+
|
|
99
|
+
/** 隐藏侧边栏 */
|
|
100
|
+
hideSidebar(): void
|
|
101
|
+
|
|
102
|
+
/** 编辑器 - 关闭评论 */
|
|
103
|
+
editorClose(): void
|
|
104
|
+
|
|
105
|
+
/** 编辑器 - 打开评论 */
|
|
106
|
+
editorOpen(): void
|
|
107
|
+
|
|
108
|
+
/** 编辑器 - 显示加载 */
|
|
109
|
+
editorShowLoading(): void
|
|
110
|
+
|
|
111
|
+
/** 编辑器 - 隐藏加载 */
|
|
112
|
+
editorHideLoading(): void
|
|
113
|
+
|
|
114
|
+
/** 编辑器 - 显示提示消息 */
|
|
115
|
+
editorShowNotify(msg: string, type: "i" | "s" | "w" | "e"): void
|
|
116
|
+
|
|
117
|
+
/** 评论框 - 位置移动 */
|
|
118
|
+
editorTravel($el: HTMLElement): void
|
|
119
|
+
|
|
120
|
+
/** 评论框 - 位置回归 */
|
|
121
|
+
editorTravelBack(): void
|
|
122
|
+
|
|
123
|
+
/** 验证码检测 */
|
|
124
|
+
checkCaptcha(payload: CheckerCaptchaPayload): void
|
|
125
|
+
|
|
126
|
+
/** 管理员检测 */
|
|
127
|
+
checkAdmin(payload: CheckerPayload): void
|
|
128
|
+
|
|
129
|
+
/** 管理员显示元素可见性更新 */
|
|
130
|
+
checkAdminShowEl(): void
|
|
131
|
+
|
|
132
|
+
/** 订阅注册 */
|
|
133
|
+
on<K extends keyof EventPayloadMap>(name: K, handler: Handler<EventPayloadMap[K]>, scope?: EventScopeType): void
|
|
134
|
+
|
|
135
|
+
/** 订阅取消 */
|
|
136
|
+
off<K extends keyof EventPayloadMap>(name: K, handler?: Handler<EventPayloadMap[K]>, scope?: EventScopeType): void
|
|
137
|
+
|
|
138
|
+
/** 订阅发布 */
|
|
139
|
+
trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K], scope?: EventScopeType): void
|
|
140
|
+
|
|
141
|
+
/** i18n 翻译 */
|
|
142
|
+
$t(key: keyof I18n, args?: {[key: string]: string}): string
|
|
143
|
+
|
|
144
|
+
/** 设置暗黑模式 */
|
|
145
|
+
setDarkMode(darkMode: boolean): void
|
|
146
|
+
}
|