artalk 2.7.2 → 2.7.3

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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Artalk.cjs +2 -0
  3. package/dist/Artalk.cjs.map +1 -0
  4. package/dist/Artalk.iife.js +1 -1
  5. package/dist/Artalk.iife.js.map +1 -1
  6. package/dist/Artalk.js +1 -1
  7. package/dist/Artalk.js.map +1 -1
  8. package/dist/{Artalk.es.js → Artalk.mjs} +96 -76
  9. package/dist/Artalk.mjs.map +1 -0
  10. package/dist/ArtalkLite.cjs +2 -0
  11. package/dist/ArtalkLite.cjs.map +1 -0
  12. package/dist/ArtalkLite.iife.js +1 -1
  13. package/dist/ArtalkLite.iife.js.map +1 -1
  14. package/dist/ArtalkLite.js +1 -1
  15. package/dist/ArtalkLite.js.map +1 -1
  16. package/dist/{ArtalkLite.es.js → ArtalkLite.mjs} +96 -81
  17. package/dist/ArtalkLite.mjs.map +1 -0
  18. package/dist/i18n/jp.cjs +1 -0
  19. package/dist/i18n/jp.d.cts +3 -0
  20. package/dist/i18n/jp.d.ts +3 -0
  21. package/dist/i18n/jp.mjs +93 -0
  22. package/dist/i18n/zh-TW.cjs +1 -0
  23. package/dist/i18n/zh-TW.d.cts +3 -0
  24. package/dist/i18n/zh-TW.d.ts +3 -0
  25. package/dist/i18n/zh-TW.mjs +93 -0
  26. package/dist/main.d.cts +1476 -0
  27. package/dist/main.d.ts +1476 -0
  28. package/package.json +60 -28
  29. package/dist/Artalk.es.js.map +0 -1
  30. package/dist/ArtalkLite.es.js.map +0 -1
  31. package/dist/src/api/_base.d.ts +0 -17
  32. package/dist/src/api/_options.d.ts +0 -24
  33. package/dist/src/api/_request.d.ts +0 -12
  34. package/dist/src/api/admin.d.ts +0 -10
  35. package/dist/src/api/captcha.d.ts +0 -14
  36. package/dist/src/api/comment.d.ts +0 -29
  37. package/dist/src/api/index.d.ts +0 -29
  38. package/dist/src/api/page.d.ts +0 -22
  39. package/dist/src/api/site.d.ts +0 -17
  40. package/dist/src/api/system.d.ts +0 -33
  41. package/dist/src/api/upload.d.ts +0 -11
  42. package/dist/src/api/user.d.ts +0 -42
  43. package/dist/src/artalk.d.ts +0 -35
  44. package/dist/src/comment/actions.d.ts +0 -17
  45. package/dist/src/comment/comment.d.ts +0 -66
  46. package/dist/src/comment/height-limit.d.ts +0 -30
  47. package/dist/src/comment/index.d.ts +0 -2
  48. package/dist/src/comment/render.d.ts +0 -46
  49. package/dist/src/comment/renders/actions.d.ts +0 -5
  50. package/dist/src/comment/renders/avatar.d.ts +0 -5
  51. package/dist/src/comment/renders/content.d.ts +0 -5
  52. package/dist/src/comment/renders/header.d.ts +0 -5
  53. package/dist/src/comment/renders/index.d.ts +0 -2
  54. package/dist/src/comment/renders/pending.d.ts +0 -5
  55. package/dist/src/comment/renders/reply-at.d.ts +0 -5
  56. package/dist/src/comment/renders/reply-to.d.ts +0 -5
  57. package/dist/src/components/action-btn.d.ts +0 -50
  58. package/dist/src/components/checker/admin.d.ts +0 -3
  59. package/dist/src/components/checker/captcha-renders.d.ts +0 -5
  60. package/dist/src/components/checker/captcha.d.ts +0 -3
  61. package/dist/src/components/checker/index.d.ts +0 -53
  62. package/dist/src/components/dialog.d.ts +0 -16
  63. package/dist/src/components/error-dialog.d.ts +0 -8
  64. package/dist/src/components/pagination.d.ts +0 -31
  65. package/dist/src/components/read-more-btn.d.ts +0 -33
  66. package/dist/src/config.d.ts +0 -24
  67. package/dist/src/context.d.ts +0 -45
  68. package/dist/src/data.d.ts +0 -27
  69. package/dist/src/defaults.d.ts +0 -3
  70. package/dist/src/editor/editor.d.ts +0 -31
  71. package/dist/src/editor/state.d.ts +0 -20
  72. package/dist/src/editor/ui.d.ts +0 -25
  73. package/dist/src/i18n/en.d.ts +0 -73
  74. package/dist/src/i18n/external.d.ts +0 -74
  75. package/dist/src/i18n/index.d.ts +0 -236
  76. package/dist/src/i18n/jp.d.ts +0 -73
  77. package/dist/src/i18n/zh-CN.d.ts +0 -3
  78. package/dist/src/i18n/zh-TW.d.ts +0 -73
  79. package/dist/src/layer/index.d.ts +0 -4
  80. package/dist/src/layer/layer-manager.d.ts +0 -9
  81. package/dist/src/layer/layer.d.ts +0 -12
  82. package/dist/src/layer/scrollbar-helper.d.ts +0 -5
  83. package/dist/src/layer/sidebar-layer.d.ts +0 -20
  84. package/dist/src/layer/wrap.d.ts +0 -13
  85. package/dist/src/lib/component.d.ts +0 -7
  86. package/dist/src/lib/detect.d.ts +0 -10
  87. package/dist/src/lib/event-manager.d.ts +0 -28
  88. package/dist/src/lib/highlight.d.ts +0 -1
  89. package/dist/src/lib/marked-renderer.d.ts +0 -4
  90. package/dist/src/lib/marked.d.ts +0 -11
  91. package/dist/src/lib/sanitizer.d.ts +0 -1
  92. package/dist/src/lib/ui.d.ts +0 -24
  93. package/dist/src/lib/user.d.ts +0 -21
  94. package/dist/src/lib/utils.d.ts +0 -41
  95. package/dist/src/list/comment.d.ts +0 -3
  96. package/dist/src/list/layout.d.ts +0 -23
  97. package/dist/src/list/list.d.ts +0 -14
  98. package/dist/src/list/nest.d.ts +0 -10
  99. package/dist/src/list/page.d.ts +0 -2
  100. package/dist/src/list/paginator/index.d.ts +0 -25
  101. package/dist/src/list/paginator/read-more.d.ts +0 -18
  102. package/dist/src/list/paginator/up-down.d.ts +0 -14
  103. package/dist/src/main.d.ts +0 -7
  104. package/dist/src/plugins/admin-only-elem.d.ts +0 -2
  105. package/dist/src/plugins/conf-remoter.d.ts +0 -2
  106. package/dist/src/plugins/dark-mode.d.ts +0 -2
  107. package/dist/src/plugins/editor/_kit.d.ts +0 -33
  108. package/dist/src/plugins/editor/_plug.d.ts +0 -29
  109. package/dist/src/plugins/editor/_sample.d.ts +0 -5
  110. package/dist/src/plugins/editor/closable.d.ts +0 -7
  111. package/dist/src/plugins/editor/emoticons.d.ts +0 -30
  112. package/dist/src/plugins/editor/header-event.d.ts +0 -6
  113. package/dist/src/plugins/editor/header-link.d.ts +0 -6
  114. package/dist/src/plugins/editor/header-user.d.ts +0 -16
  115. package/dist/src/plugins/editor/index.d.ts +0 -6
  116. package/dist/src/plugins/editor/local-storage.d.ts +0 -6
  117. package/dist/src/plugins/editor/mover.d.ts +0 -6
  118. package/dist/src/plugins/editor/preview.d.ts +0 -7
  119. package/dist/src/plugins/editor/state-edit.d.ts +0 -11
  120. package/dist/src/plugins/editor/state-reply.d.ts +0 -8
  121. package/dist/src/plugins/editor/submit-add.d.ts +0 -18
  122. package/dist/src/plugins/editor/submit-btn.d.ts +0 -5
  123. package/dist/src/plugins/editor/submit.d.ts +0 -17
  124. package/dist/src/plugins/editor/textarea.d.ts +0 -8
  125. package/dist/src/plugins/editor/upload.d.ts +0 -9
  126. package/dist/src/plugins/editor-kit.d.ts +0 -42
  127. package/dist/src/plugins/index.d.ts +0 -2
  128. package/dist/src/plugins/list/copyright.d.ts +0 -2
  129. package/dist/src/plugins/list/count.d.ts +0 -2
  130. package/dist/src/plugins/list/dropdown.d.ts +0 -2
  131. package/dist/src/plugins/list/error-dialog.d.ts +0 -2
  132. package/dist/src/plugins/list/fetch.d.ts +0 -2
  133. package/dist/src/plugins/list/goto-first.d.ts +0 -3
  134. package/dist/src/plugins/list/goto.d.ts +0 -2
  135. package/dist/src/plugins/list/index.d.ts +0 -3
  136. package/dist/src/plugins/list/loading.d.ts +0 -2
  137. package/dist/src/plugins/list/no-comment.d.ts +0 -2
  138. package/dist/src/plugins/list/reach-bottom.d.ts +0 -2
  139. package/dist/src/plugins/list/sidebar-btn.d.ts +0 -2
  140. package/dist/src/plugins/list/time-ticking.d.ts +0 -3
  141. package/dist/src/plugins/list/unread-badge.d.ts +0 -2
  142. package/dist/src/plugins/list/unread.d.ts +0 -2
  143. package/dist/src/plugins/list/with-editor.d.ts +0 -2
  144. package/dist/src/plugins/markdown.d.ts +0 -2
  145. package/dist/src/plugins/stat.d.ts +0 -13
  146. package/dist/src/plugins/version-check.d.ts +0 -2
  147. package/dist/src/service.d.ts +0 -36
  148. package/dist/tests/e2e/comment-add.spec.d.ts +0 -1
  149. package/dist/types/config.d.ts +0 -110
  150. package/dist/types/context.d.ts +0 -62
  151. package/dist/types/data.d.ts +0 -194
  152. package/dist/types/editor.d.ts +0 -76
  153. package/dist/types/event.d.ts +0 -39
  154. package/dist/types/global.d.ts +0 -1
  155. package/dist/types/index.d.ts +0 -7
  156. package/dist/types/plugin.d.ts +0 -2
  157. package/dist/types/sidebar.d.ts +0 -3
@@ -0,0 +1,1476 @@
1
+ import { marked } from 'marked';
2
+
3
+ declare type AC = {
4
+ [K in keyof TC]: InstanceType<TC[K]>;
5
+ };
6
+
7
+ /**
8
+ * 通用操作按钮
9
+ */
10
+ declare class ActionBtn {
11
+ private opts;
12
+ $el: HTMLElement;
13
+ isLoading: boolean;
14
+ msgRecTimer?: number;
15
+ msgRecTimerFunc?: Function;
16
+ get isMessaging(): boolean;
17
+ isConfirming: boolean;
18
+ confirmRecTimer?: number;
19
+ /** 构造函数 */
20
+ constructor(opts: ActionBtnOptions | string | (() => string));
21
+ /** 将按钮装载到指定元素 */
22
+ appendTo(dom: HTMLElement): this;
23
+ /** 获取按钮文字(动态/静态) */
24
+ private getText;
25
+ /** 设置点击事件 */
26
+ setClick(func: Function): void;
27
+ /** 文字刷新(动态/静态) */
28
+ updateText(text?: (() => string) | string): void;
29
+ /** 设置加载状态 */
30
+ setLoading(value: boolean, loadingText?: string): void;
31
+ /** 错误消息 */
32
+ setError(text: string): void;
33
+ /** 警告消息 */
34
+ setWarn(text: string): void;
35
+ /** 成功消息 */
36
+ setSuccess(text: string): void;
37
+ /** 设置消息 */
38
+ setMsg(text: string, className?: string, duringTime?: number, after?: Function): void;
39
+ /** 设置消息复原操作定时器 */
40
+ private setMsgRecTimer;
41
+ /** 立刻触发器复原定时器 */
42
+ private fireMsgRecTimer;
43
+ /** 仅清除 timer */
44
+ private clearMsgRecTimer;
45
+ }
46
+
47
+ declare interface ActionBtnOptions {
48
+ /** 按钮文字 (动态/静态) */
49
+ text: (() => string) | string;
50
+ /** 仅管理员可用 */
51
+ adminOnly?: boolean;
52
+ /** 确认操作 */
53
+ confirm?: boolean;
54
+ /** 确认时提示文字 */
55
+ confirmText?: string;
56
+ }
57
+
58
+ /**
59
+ * 管理员 API
60
+ */
61
+ declare class AdminApi extends ApiBase {
62
+ /** 缓存清除 */
63
+ cacheFlushAll(): Promise<unknown>;
64
+ /** 缓存预热 */
65
+ cacheWarmUp(): Promise<unknown>;
66
+ }
67
+
68
+ declare class Api {
69
+ constructor(opts: ApiOptions);
70
+ }
71
+
72
+ declare interface Api extends AC {
73
+ }
74
+
75
+ declare abstract class ApiBase {
76
+ protected options: ApiOptions;
77
+ constructor(options: ApiOptions);
78
+ protected POST<T>(path: string, data?: {
79
+ [key: string]: any;
80
+ }): Promise<T>;
81
+ protected Fetch(path: string, init: RequestInit, timeout?: number): Promise<any>;
82
+ /**
83
+ * Carry user info to request params
84
+ *
85
+ * @param params Request params
86
+ * @returns Request params with user info
87
+ */
88
+ protected withUserInfo(params: any): any;
89
+ }
90
+
91
+ declare const ApiComponents: {
92
+ comment: typeof CommentApi;
93
+ page: typeof PageApi;
94
+ site: typeof SiteApi;
95
+ user: typeof UserApi;
96
+ system: typeof SystemApi;
97
+ captcha: typeof CaptchaApi;
98
+ admin: typeof AdminApi;
99
+ upload: typeof UploadApi;
100
+ };
101
+
102
+ declare interface ApiOptions {
103
+ baseURL: string;
104
+ siteName: string;
105
+ pageKey: string;
106
+ pageTitle: string;
107
+ timeout?: number;
108
+ apiToken?: string;
109
+ userInfo?: {
110
+ name: string;
111
+ email: string;
112
+ };
113
+ onNeedCheckCaptcha?: (payload: {
114
+ recall: () => void;
115
+ reject: () => void;
116
+ data: {
117
+ imgData: string;
118
+ iframe: string;
119
+ };
120
+ }) => void;
121
+ onNeedCheckAdmin?: (payload: {
122
+ recall: () => void;
123
+ reject: () => void;
124
+ }) => void;
125
+ }
126
+
127
+ export declare interface ApiVersionData {
128
+ /** API 程序名 */
129
+ app: string;
130
+ /** API 程序版本号 */
131
+ version: string;
132
+ /** API 程序 CommitHash */
133
+ commit_hash: string;
134
+ }
135
+
136
+ declare interface ApiVersionInfo {
137
+ app: string;
138
+ version: string;
139
+ commit_hash: string;
140
+ }
141
+
142
+ /**
143
+ * Artalk
144
+ *
145
+ * @see https://artalk.js.org
146
+ */
147
+ declare class Artalk {
148
+ ctx: ContextApi;
149
+ /** Plugins */
150
+ protected plugins: ArtalkPlugin[];
151
+ constructor(conf: Partial<ArtalkConfig>);
152
+ /** Get the config of Artalk */
153
+ getConf(): ArtalkConfig;
154
+ /** Get the root element of Artalk */
155
+ getEl(): HTMLElement;
156
+ /** Update config of Artalk */
157
+ update(conf: Partial<ArtalkConfig>): this;
158
+ /** Reload comment list of Artalk */
159
+ reload(): void;
160
+ /** Destroy instance of Artalk */
161
+ destroy(): void;
162
+ /** Add an event listener */
163
+ on<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>): void;
164
+ /** Remove an event listener */
165
+ off<K extends keyof EventPayloadMap>(name: K, handler: EventHandler<EventPayloadMap[K]>): void;
166
+ /** Trigger an event */
167
+ trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K]): void;
168
+ /** Set dark mode */
169
+ setDarkMode(darkMode: boolean): void;
170
+ /** Init Artalk */
171
+ static init(conf: Partial<ArtalkConfig>): Artalk;
172
+ /** Use plugin, the plugin will be used when Artalk.init */
173
+ static use(plugin: ArtalkPlugin): void;
174
+ /** Load count widget */
175
+ static loadCountWidget(c: Partial<ArtalkConfig>): void;
176
+ /** @deprecated Please use `getEl()` instead */
177
+ get $root(): HTMLElement;
178
+ /** @description Please use `getConf()` instead */
179
+ get conf(): ArtalkConfig;
180
+ }
181
+ export default Artalk;
182
+
183
+ export declare interface ArtalkConfig {
184
+ /** 装载元素 */
185
+ el: string | HTMLElement;
186
+ /** 页面唯一标识(完整 URL) */
187
+ pageKey: string;
188
+ /** 页面标题 */
189
+ pageTitle: string;
190
+ /** 服务器地址 */
191
+ server: string;
192
+ /** 站点名 */
193
+ site: string;
194
+ /** 评论框占位字符 */
195
+ placeholder: string;
196
+ /** 评论为空时显示字符 */
197
+ noComment: string;
198
+ /** 发送按钮文字 */
199
+ sendBtn: string;
200
+ /** 评论框穿梭(显示在待回复评论后面) */
201
+ editorTravel: boolean;
202
+ /** 表情包 */
203
+ emoticons: object | any[] | string | false;
204
+ /** Gravatar 头像 */
205
+ gravatar: {
206
+ /** API 地址 */
207
+ mirror: string;
208
+ /** API 参数 */
209
+ params: string;
210
+ };
211
+ /** 头像链接生成器 */
212
+ avatarURLBuilder?: (comment: CommentData) => string;
213
+ /** 分页配置 */
214
+ pagination: {
215
+ /** 每次请求获取数量 */
216
+ pageSize: number;
217
+ /** 阅读更多模式 */
218
+ readMore: boolean;
219
+ /** 滚动到底部自动加载 */
220
+ autoLoad: boolean;
221
+ };
222
+ /** 内容限高 */
223
+ heightLimit: {
224
+ /** 评论内容限高 */
225
+ content: number;
226
+ /** 子评论区域限高 */
227
+ children: number;
228
+ /** 滚动限高 */
229
+ scrollable: boolean;
230
+ };
231
+ /** 评论投票按钮 */
232
+ vote: boolean;
233
+ /** 评论投票反对按钮 */
234
+ voteDown: boolean;
235
+ /** 评论预览功能 */
236
+ preview: boolean;
237
+ /** 评论数绑定元素 Selector */
238
+ countEl: string;
239
+ /** PV 数绑定元素 Selector */
240
+ pvEl: string;
241
+ /** 夜间模式 */
242
+ darkMode: boolean | 'auto';
243
+ /** 请求超时(单位:秒) */
244
+ reqTimeout: number;
245
+ /** 平铺模式 */
246
+ flatMode: boolean | 'auto';
247
+ /** 嵌套模式 · 最大层数 */
248
+ nestMax: number;
249
+ /** 嵌套模式 · 排序方式 */
250
+ nestSort: 'DATE_ASC' | 'DATE_DESC';
251
+ /** 显示 UA 徽标 */
252
+ uaBadge: boolean;
253
+ /** 评论列表排序功能 (显示 Dropdown) */
254
+ listSort: boolean;
255
+ /** 图片上传功能 */
256
+ imgUpload: boolean;
257
+ /** 图片上传器 */
258
+ imgUploader?: (file: File) => Promise<string>;
259
+ /** 版本检测 */
260
+ versionCheck: boolean;
261
+ /** 引用后端配置 */
262
+ useBackendConf: boolean;
263
+ /** 语言本地化 */
264
+ locale: I18n | string;
265
+ /** 后端版本 (系统数据,用户不允许更改) */
266
+ apiVersion?: string;
267
+ /** Replacer for marked */
268
+ markedReplacers?: ((raw: string) => string)[];
269
+ /** 列表请求参数修改器 */
270
+ listFetchParamsModifier?: (params: any) => void;
271
+ remoteConfModifier?: (conf: Partial<ArtalkConfig>) => void;
272
+ listUnreadHighlight?: boolean;
273
+ scrollRelativeTo?: () => HTMLElement;
274
+ immediateFetch?: boolean;
275
+ }
276
+
277
+ export declare type ArtalkPlugin = (ctx: ContextApi) => void;
278
+
279
+ declare namespace ArtalkType {
280
+ export {
281
+ I18n,
282
+ I18nKeys,
283
+ ArtalkConfig,
284
+ LocalUser,
285
+ CommentData,
286
+ ListData,
287
+ PageData,
288
+ SiteData,
289
+ UserData,
290
+ UserDataForAdmin,
291
+ NotifyData,
292
+ EmoticonGrpData,
293
+ EmoticonListData,
294
+ ApiVersionData,
295
+ ListFetchParams,
296
+ ListLastFetchData,
297
+ DataManagerApi,
298
+ NotifyLevel,
299
+ ContextApi,
300
+ EditorState,
301
+ EditorApi,
302
+ EventPayloadMap,
303
+ ArtalkPlugin,
304
+ SidebarShowPayload
305
+ }
306
+ }
307
+ export { ArtalkType }
308
+
309
+ /**
310
+ * 验证码 API
311
+ */
312
+ declare class CaptchaApi extends ApiBase {
313
+ /** 验证码 · 获取 */
314
+ captchaGet(): Promise<string>;
315
+ /** 验证码 · 检验 */
316
+ captchaCheck(value: string): Promise<string>;
317
+ /** 验证码 · 状态 */
318
+ captchaStatus(): Promise<{
319
+ is_pass: boolean;
320
+ }>;
321
+ }
322
+
323
+ declare interface Checker {
324
+ el?: HTMLElement;
325
+ inputType?: 'password' | 'text';
326
+ body: (checker: CheckerCtx) => HTMLElement;
327
+ request: (checker: CheckerCtx, inputVal: string) => Promise<string>;
328
+ onSuccess?: (checker: CheckerCtx, respData: string, inputVal: string, formEl: HTMLElement) => void;
329
+ onError?: (checker: CheckerCtx, err: any, inputVal: string, formEl: HTMLElement) => void;
330
+ }
331
+
332
+ declare interface CheckerCaptchaPayload extends CheckerPayload {
333
+ imgData?: string;
334
+ iframe?: string;
335
+ }
336
+
337
+ declare interface CheckerCtx {
338
+ get<K extends keyof CheckerStore>(key: K): CheckerStore[K];
339
+ set<K extends keyof CheckerStore>(key: K, val: CheckerStore[K]): void;
340
+ getOpts(): CheckerLauncherOptions;
341
+ getApi(): Api;
342
+ getUser(): User;
343
+ hideInteractInput(): void;
344
+ triggerSuccess(): void;
345
+ cancel(): void;
346
+ }
347
+
348
+ /**
349
+ * Checker 发射台
350
+ */
351
+ declare class CheckerLauncher {
352
+ private opts;
353
+ constructor(opts: CheckerLauncherOptions);
354
+ checkCaptcha(payload: CheckerCaptchaPayload): void;
355
+ checkAdmin(payload: CheckerPayload): void;
356
+ fire(checker: Checker, payload: CheckerPayload, postFire?: (c: CheckerCtx) => void): void;
357
+ private close;
358
+ }
359
+
360
+ declare interface CheckerLauncherOptions {
361
+ getCtx: () => ContextApi;
362
+ getApi: () => Api;
363
+ getIframeURLBase: () => string;
364
+ onReload: () => void;
365
+ }
366
+
367
+ declare interface CheckerPayload {
368
+ onSuccess?: (inputVal: string, dialogEl?: HTMLElement) => void;
369
+ onMount?: (dialogEl: HTMLElement) => void;
370
+ onCancel?: () => void;
371
+ }
372
+
373
+ declare interface CheckerStore {
374
+ val?: string;
375
+ img_data?: string;
376
+ iframe?: string;
377
+ }
378
+
379
+ declare class Comment_2 extends Component {
380
+ private renderInstance;
381
+ private actionInstance;
382
+ private data;
383
+ private cConf;
384
+ private parent;
385
+ private children;
386
+ private nestCurt;
387
+ private nestMax;
388
+ constructor(ctx: ContextApi, data: CommentData, conf: CommentConf);
389
+ /** 渲染 UI */
390
+ render(): void;
391
+ /** 获取评论操作实例对象 */
392
+ getActions(): CommentActions;
393
+ /** 获取评论渲染器实例对象 */
394
+ getRender(): Render;
395
+ /** 获取评论数据 */
396
+ getData(): CommentData;
397
+ /** 设置数据 */
398
+ setData(data: CommentData): void;
399
+ /** 获取父评论 */
400
+ getParent(): Comment_2 | null;
401
+ /** 获取所有子评论 */
402
+ getChildren(): Comment_2[];
403
+ /** 获取当前嵌套层数 */
404
+ getNestCurt(): number;
405
+ /** 判断是否为根评论 */
406
+ getIsRoot(): boolean;
407
+ /** 获取评论 ID */
408
+ getID(): number;
409
+ /** 置入子评论 */
410
+ putChild(childC: Comment_2, insertMode?: 'append' | 'prepend'): void;
411
+ /** 获取存放子评论的元素对象 */
412
+ getChildrenEl(): HTMLElement;
413
+ /** 获取所有父评论 */
414
+ getParents(): Comment_2[];
415
+ /** 获取评论元素对象 */
416
+ getEl(): HTMLElement;
417
+ /** 获取 Gravatar 头像 URL */
418
+ getGravatarURL(): string;
419
+ /** 获取评论 markdown 解析后的内容 */
420
+ getContentMarked(): string;
421
+ /** 获取格式化后的日期 */
422
+ getDateFormatted(): any;
423
+ /** 获取用户 UserAgent 信息 */
424
+ getUserUA(): {
425
+ browser: string;
426
+ os: string;
427
+ };
428
+ /** 获取配置 */
429
+ getConf(): CommentConf;
430
+ }
431
+
432
+ declare class CommentActions {
433
+ private comment;
434
+ private get ctx();
435
+ private get data();
436
+ private get cConf();
437
+ constructor(comment: Comment_2);
438
+ /** 投票操作 */
439
+ vote(type: 'up' | 'down'): void;
440
+ /** 管理员 - 评论状态修改 */
441
+ adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn): void;
442
+ /** 管理员 - 评论删除 */
443
+ adminDelete(btnElem: ActionBtn): void;
444
+ /** 快速跳转到该评论 */
445
+ goToReplyComment(): void;
446
+ }
447
+
448
+ /**
449
+ * 评论 API
450
+ */
451
+ declare class CommentApi extends ApiBase {
452
+ /** 评论 · 获取 */
453
+ get(offset: number, pageSize: number, flatMode?: boolean, paramsEditor?: (params: any) => void): Promise<ListData>;
454
+ /** 评论 · 创建 */
455
+ add(comment: {
456
+ nick: string;
457
+ email: string;
458
+ link: string;
459
+ content: string;
460
+ rid: number;
461
+ page_key: string;
462
+ page_title?: string;
463
+ site_name?: string;
464
+ }): Promise<CommentData>;
465
+ /** 评论 · 修改 */
466
+ commentEdit(data: Partial<CommentData>): Promise<CommentData>;
467
+ /** 评论 · 删除 */
468
+ commentDel(commentID: number, siteName?: string): Promise<unknown>;
469
+ /** 投票 */
470
+ vote(targetID: number, type: string): Promise<{
471
+ up: number;
472
+ down: number;
473
+ }>;
474
+ }
475
+
476
+ declare interface CommentConf {
477
+ isUnread?: boolean;
478
+ openURL?: string;
479
+ isFlatMode: boolean;
480
+ replyTo?: CommentData;
481
+ afterRender?: () => void;
482
+ openEvt?: () => void;
483
+ onReplyBtnClick?: Function;
484
+ onDelete?: Function;
485
+ }
486
+
487
+ export declare interface CommentData {
488
+ /** 评论 ID */
489
+ id: number;
490
+ /** 评论正文 */
491
+ content: string;
492
+ /** 用户昵称 */
493
+ nick: string;
494
+ /** 用户邮箱 (该字段仅管理员可见) */
495
+ email?: string;
496
+ /** 用户邮箱(已加密) */
497
+ email_encrypted: string;
498
+ /** 用户链接 */
499
+ link: string;
500
+ /** 回复目标评论 ID */
501
+ rid: number;
502
+ /** User Agent */
503
+ ua: string;
504
+ /** 评论日期 */
505
+ date: string;
506
+ /** 是否折叠 */
507
+ is_collapsed?: boolean;
508
+ /** 是否待审 */
509
+ is_pending?: boolean;
510
+ /** 是否置顶 */
511
+ is_pinned?: boolean;
512
+ /** 是否为管理员 */
513
+ is_admin?: boolean;
514
+ /** 徽章文字 */
515
+ badge_name?: string;
516
+ /** 徽章颜色 */
517
+ badge_color?: string;
518
+ /** IP 归属地 */
519
+ ip_region?: string;
520
+ /** 是否允许回复 */
521
+ is_allow_reply?: boolean;
522
+ /** 评论页面 key */
523
+ page_key: string;
524
+ /** 评论页面 url */
525
+ page_url?: string;
526
+ /** 是否可见 */
527
+ visible: boolean;
528
+ /** 站点名(用于隔离) */
529
+ site_name: string;
530
+ /** 赞同数 */
531
+ vote_up: number;
532
+ /** 反对数 */
533
+ vote_down: number;
534
+ }
535
+
536
+ declare type CommentNode = {
537
+ id: number;
538
+ comment: CommentData;
539
+ children: CommentNode[];
540
+ parent?: CommentNode;
541
+ level: number;
542
+ };
543
+
544
+ declare abstract class Component {
545
+ ctx: ContextApi;
546
+ $el: HTMLElement;
547
+ readonly conf: ArtalkConfig;
548
+ constructor(ctx: ContextApi);
549
+ }
550
+
551
+ /**
552
+ * Context 接口
553
+ *
554
+ * (面向接口的编程)
555
+ */
556
+ export declare interface ContextApi extends EventManagerFuncs<EventPayloadMap> {
557
+ /** Artalk 根元素对象 */
558
+ $root: HTMLElement;
559
+ /** 依赖注入函数 */
560
+ inject<K extends keyof TInjectedServices>(depName: K, obj: TInjectedServices[K]): void;
561
+ /** 获取依赖对象 */
562
+ get<K extends keyof TInjectedServices>(depName: K): TInjectedServices[K];
563
+ /** 配置对象 */
564
+ conf: ArtalkConfig;
565
+ /** marked 依赖对象 */
566
+ getMarked(): TMarked | undefined;
567
+ /** 获取 API 以供 HTTP 请求 */
568
+ getApi(): Api;
569
+ /** 获取数据管理器对象 */
570
+ getData(): DataManagerApi;
571
+ /** 评论回复 */
572
+ replyComment(commentData: CommentData, $comment: HTMLElement): void;
573
+ /** 编辑评论 */
574
+ editComment(commentData: CommentData, $comment: HTMLElement): void;
575
+ /** 获取评论数据 */
576
+ fetch(params: Partial<ListFetchParams>): void;
577
+ /** 重载评论数据 */
578
+ reload(): void;
579
+ /** 列表滚动到第一个评论的位置 */
580
+ listGotoFirst(): void;
581
+ /** 显示侧边栏 */
582
+ showSidebar(payload?: SidebarShowPayload): void;
583
+ /** 隐藏侧边栏 */
584
+ hideSidebar(): void;
585
+ /** 编辑器 - 显示加载 */
586
+ editorShowLoading(): void;
587
+ /** 编辑器 - 隐藏加载 */
588
+ editorHideLoading(): void;
589
+ /** 编辑器 - 显示提示消息 */
590
+ editorShowNotify(msg: string, type: NotifyLevel): void;
591
+ /** 评论框 - 复原状态 */
592
+ editorResetState(): void;
593
+ /** 验证码检测 */
594
+ checkCaptcha(payload: CheckerCaptchaPayload): void;
595
+ /** 管理员检测 */
596
+ checkAdmin(payload: CheckerPayload): void;
597
+ /** i18n 翻译 */
598
+ $t(key: keyof I18n, args?: {
599
+ [key: string]: string;
600
+ }): string;
601
+ /** 设置夜间模式 */
602
+ setDarkMode(darkMode: boolean | 'auto'): void;
603
+ /** 获取配置 */
604
+ getConf(): ArtalkConfig;
605
+ /** 获取挂载元素 */
606
+ getEl(): HTMLElement;
607
+ /** 更新配置 */
608
+ updateConf(conf: Partial<ArtalkConfig>): void;
609
+ }
610
+
611
+ export declare interface DataManagerApi {
612
+ getLoading(): boolean;
613
+ setLoading(val: boolean): void;
614
+ getListLastFetch(): ListLastFetchData | undefined;
615
+ setListLastFetch(val: ListLastFetchData): void;
616
+ getComments(): CommentData[];
617
+ findComment(id: number): CommentData | undefined;
618
+ fetchComments(params: Partial<ListFetchParams>): void;
619
+ loadComments(comments: CommentData[]): void;
620
+ clearComments(): void;
621
+ insertComment(comment: CommentData): void;
622
+ updateComment(comment: CommentData): void;
623
+ deleteComment(id: number): void;
624
+ getUnreads(): NotifyData[];
625
+ updateUnreads(unreads: NotifyData[]): void;
626
+ getPage(): PageData | undefined;
627
+ updatePage(pageData: PageData): void;
628
+ }
629
+
630
+ declare class Editor extends Component implements EditorApi {
631
+ private ui;
632
+ private state;
633
+ getUI(): EditorUI;
634
+ getPlugs(): PlugManager | undefined;
635
+ getState(): EditorState;
636
+ constructor(ctx: ContextApi);
637
+ getHeaderInputEls(): {
638
+ nick: HTMLInputElement;
639
+ email: HTMLInputElement;
640
+ link: HTMLInputElement;
641
+ };
642
+ getContentFinal(): string;
643
+ getContentRaw(): string;
644
+ getContentMarked(): string;
645
+ setContent(val: string): void;
646
+ insertContent(val: string): void;
647
+ focus(): void;
648
+ reset(): void;
649
+ resetState(): void;
650
+ setReply(comment: CommentData, $comment: HTMLElement): void;
651
+ setEditComment(comment: CommentData, $comment: HTMLElement): void;
652
+ showNotify(msg: string, type: any): void;
653
+ showLoading(): void;
654
+ hideLoading(): void;
655
+ submit(): void;
656
+ }
657
+
658
+ export declare interface EditorApi extends Component {
659
+ getUI(): EditorUI;
660
+ /**
661
+ * Get the header input elements
662
+ */
663
+ getHeaderInputEls(): Record<string, HTMLInputElement>;
664
+ /**
665
+ * Set content
666
+ */
667
+ setContent(val: string): void;
668
+ /**
669
+ * Insert content
670
+ */
671
+ insertContent(val: string): void;
672
+ /**
673
+ * Get the final content
674
+ *
675
+ * This function returns the raw content or the content transformed through a plugin hook.
676
+ */
677
+ getContentFinal(): string;
678
+ /**
679
+ * Get the raw content which is inputed by user
680
+ */
681
+ getContentRaw(): string;
682
+ /**
683
+ * Get the HTML format content which is rendered by marked (a markdown parser)
684
+ */
685
+ getContentMarked(): string;
686
+ /**
687
+ * Get editor current state
688
+ */
689
+ getState(): EditorState;
690
+ /**
691
+ * Focus editor
692
+ */
693
+ focus(): void;
694
+ /**
695
+ * Reset editor
696
+ */
697
+ reset(): void;
698
+ /**
699
+ * Reset editor UI
700
+ *
701
+ * call it will move editor to the initial position
702
+ */
703
+ resetState(): void;
704
+ /**
705
+ * Submit comment
706
+ */
707
+ submit(): void;
708
+ /**
709
+ * Show notification message
710
+ */
711
+ showNotify(msg: string, type: NotifyLevel): void;
712
+ /**
713
+ * Show loading on editor
714
+ */
715
+ showLoading(): void;
716
+ /**
717
+ * Hide loading on editor
718
+ */
719
+ hideLoading(): void;
720
+ /**
721
+ * Start replaying a comment
722
+ */
723
+ setReply(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void;
724
+ /**
725
+ * Start editing a comment
726
+ */
727
+ setEditComment(commentData: CommentData, $comment: HTMLElement): void;
728
+ }
729
+
730
+ declare interface EditorEventPayloadMap {
731
+ 'mounted': undefined;
732
+ 'unmounted': undefined;
733
+ 'header-input': {
734
+ field: string;
735
+ $input: HTMLInputElement;
736
+ };
737
+ 'header-change': {
738
+ field: string;
739
+ $input: HTMLInputElement;
740
+ };
741
+ 'content-updated': string;
742
+ 'panel-show': EditorPlug;
743
+ 'panel-hide': EditorPlug;
744
+ 'panel-close': undefined;
745
+ 'editor-close': undefined;
746
+ 'editor-open': undefined;
747
+ }
748
+
749
+ /**
750
+ * Editor 插件
751
+ */
752
+ declare interface EditorPlug {
753
+ $btn?: HTMLElement;
754
+ $panel?: HTMLElement;
755
+ contentTransformer?(rawContent: string): string;
756
+ editorStateEffectWhen?: EditorState;
757
+ editorStateEffect?(comment: CommentData): () => void;
758
+ }
759
+
760
+ declare class EditorPlug {
761
+ protected kit: PlugKit;
762
+ constructor(kit: PlugKit);
763
+ /** Use plug btn will add a btn on the bottom of editor */
764
+ useBtn(html?: string): HTMLElement;
765
+ /** Use plug panel will show the panel when btn is clicked */
766
+ usePanel(html?: string): HTMLElement;
767
+ /** Use the content transformer to handle the content of the last submit by the editor */
768
+ useContentTransformer(func: (raw: string) => string): void;
769
+ /** Listen the event of panel show */
770
+ usePanelShow(func: () => void): void;
771
+ /** Listen the event of panel hide */
772
+ usePanelHide(func: () => void): void;
773
+ /** Use editor state modifier */
774
+ useEditorStateEffect(stateName: EditorState, effectFn: (comment: CommentData) => () => void): void;
775
+ }
776
+
777
+ export declare type EditorState = 'reply' | 'edit' | 'normal';
778
+
779
+ declare interface EditorUI extends Record<keyof typeof Sel, HTMLElement> {
780
+ $el: HTMLElement;
781
+ $nick: HTMLInputElement;
782
+ $email: HTMLInputElement;
783
+ $link: HTMLInputElement;
784
+ $textarea: HTMLTextAreaElement;
785
+ $submitBtn: HTMLButtonElement;
786
+ $sendReply?: HTMLElement;
787
+ $editCancelBtn?: HTMLElement;
788
+ }
789
+
790
+ export declare type EmoticonGrpData = {
791
+ name: string;
792
+ type: 'emoticon' | 'image' | 'emoji';
793
+ items: {
794
+ key: string;
795
+ val: string;
796
+ }[];
797
+ };
798
+
799
+ export declare type EmoticonListData = EmoticonGrpData[];
800
+
801
+ declare const en: {
802
+ placeholder: string;
803
+ noComment: string;
804
+ send: string;
805
+ save: string;
806
+ nick: string;
807
+ email: string;
808
+ link: string;
809
+ emoticon: string;
810
+ preview: string;
811
+ image: string;
812
+ uploadFail: string;
813
+ commentFail: string;
814
+ restoredMsg: string;
815
+ onlyAdminCanReply: string;
816
+ uploadLoginMsg: string;
817
+ counter: string;
818
+ sortLatest: string;
819
+ sortOldest: string;
820
+ sortBest: string;
821
+ sortAuthor: string;
822
+ openComment: string;
823
+ closeComment: string;
824
+ listLoadFailMsg: string;
825
+ listRetry: string;
826
+ loadMore: string;
827
+ admin: string;
828
+ reply: string;
829
+ voteUp: string;
830
+ voteDown: string;
831
+ voteFail: string;
832
+ readMore: string;
833
+ actionConfirm: string;
834
+ collapse: string;
835
+ collapsed: string;
836
+ collapsedMsg: string;
837
+ expand: string;
838
+ approved: string;
839
+ pending: string;
840
+ pendingMsg: string;
841
+ edit: string;
842
+ editCancel: string;
843
+ delete: string;
844
+ deleteConfirm: string;
845
+ pin: string;
846
+ unpin: string;
847
+ seconds: string;
848
+ minutes: string;
849
+ hours: string;
850
+ days: string;
851
+ now: string;
852
+ adminCheck: string;
853
+ captchaCheck: string;
854
+ confirm: string;
855
+ cancel: string;
856
+ msgCenter: string;
857
+ ctrlCenter: string;
858
+ frontend: string;
859
+ backend: string;
860
+ loading: string;
861
+ loadFail: string;
862
+ editing: string;
863
+ editFail: string;
864
+ deleting: string;
865
+ deleteFail: string;
866
+ reqGot: string;
867
+ reqAborted: string;
868
+ updateMsg: string;
869
+ currentVersion: string;
870
+ ignore: string;
871
+ open: string;
872
+ };
873
+
874
+ declare interface ErrorData {
875
+ msg: string;
876
+ data?: any;
877
+ }
878
+
879
+ declare type EventHandler<T> = (payload: T) => void;
880
+
881
+ declare class EventManager<PayloadMap> implements EventManagerFuncs<PayloadMap> {
882
+ private events;
883
+ /**
884
+ * Add an event listener for a specific event name
885
+ */
886
+ on<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>, opts?: EventOptions): void;
887
+ /**
888
+ * Remove an event listener for a specific event name and handler
889
+ */
890
+ off<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>): void;
891
+ /**
892
+ * Trigger an event with an optional payload
893
+ */
894
+ trigger<K extends keyof PayloadMap>(name: K, payload?: PayloadMap[K]): void;
895
+ }
896
+
897
+ declare interface EventManagerFuncs<PayloadMap> {
898
+ on<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>, opts?: EventOptions): void;
899
+ off<K extends keyof PayloadMap>(name: K, handler: EventHandler<PayloadMap[K]>): void;
900
+ trigger<K extends keyof PayloadMap>(name: K, payload?: PayloadMap[K]): void;
901
+ }
902
+
903
+ declare interface EventOptions {
904
+ once?: boolean;
905
+ }
906
+
907
+ /** EventName to EventPayload Type */
908
+ export declare interface EventPayloadMap {
909
+ 'inited': undefined;
910
+ 'destroy': undefined;
911
+ 'conf-fetch': undefined;
912
+ 'list-fetch': Partial<ListFetchParams>;
913
+ 'list-fetched': ListFetchedArgs;
914
+ 'list-load': CommentData[];
915
+ 'list-loaded': CommentData[];
916
+ 'list-error': ErrorData;
917
+ 'list-goto-first': undefined;
918
+ 'list-reach-bottom': undefined;
919
+ 'comment-inserted': CommentData;
920
+ 'comment-updated': CommentData;
921
+ 'comment-deleted': CommentData;
922
+ 'comment-rendered': Comment_2;
923
+ 'unreads-updated': NotifyData[];
924
+ 'list-goto': number;
925
+ 'page-loaded': PageData;
926
+ 'editor-submit': undefined;
927
+ 'editor-submitted': undefined;
928
+ 'user-changed': LocalUser;
929
+ 'conf-loaded': ArtalkConfig;
930
+ 'dark-mode-changed': boolean | 'auto';
931
+ 'sidebar-show': undefined;
932
+ 'sidebar-hide': undefined;
933
+ }
934
+
935
+ export declare type I18n = typeof en;
936
+
937
+ export declare type I18nKeys = keyof I18n;
938
+
939
+ export declare const init: typeof Artalk.init;
940
+
941
+ declare class Layer {
942
+ private $el;
943
+ private wrap;
944
+ private onAfterHide?;
945
+ constructor(wrap: LayerWrap, name: string, el?: HTMLElement);
946
+ setOnAfterHide(func: () => void): void;
947
+ getEl(): HTMLElement;
948
+ show(): void;
949
+ hide(): void;
950
+ destroy(): void;
951
+ }
952
+
953
+ declare class LayerManager {
954
+ private wrap;
955
+ private ctx;
956
+ constructor(ctx: ContextApi);
957
+ getEl(): HTMLElement;
958
+ create(name: string, el?: HTMLElement | undefined): Layer;
959
+ }
960
+
961
+ declare class LayerWrap {
962
+ private $wrap;
963
+ private $mask;
964
+ private allowMaskClose;
965
+ private items;
966
+ constructor();
967
+ createItem(name: string, el?: HTMLElement): HTMLElement;
968
+ getWrap(): HTMLElement;
969
+ getMask(): HTMLElement;
970
+ setMaskClose(enabled: boolean): void;
971
+ show(): void;
972
+ hide(callback?: () => void): void;
973
+ }
974
+
975
+ declare interface LayoutOptions {
976
+ $commentsWrap: HTMLElement;
977
+ nestSortBy: ListNest.SortByType;
978
+ nestMax: number;
979
+ flatMode: boolean;
980
+ createCommentNode(comment: CommentData, ctxComments: CommentData[]): Comment_2;
981
+ findCommentNode(id: number): Comment_2 | undefined;
982
+ getCommentDataList(): CommentData[];
983
+ }
984
+
985
+ declare class List extends Component {
986
+ /** 列表评论集区域元素 */
987
+ $commentsWrap: HTMLElement;
988
+ getCommentsWrapEl(): HTMLElement;
989
+ protected commentNodes: Comment_2[];
990
+ getCommentNodes(): Comment_2[];
991
+ constructor(ctx: ContextApi);
992
+ getListLayout(): ListLayout;
993
+ private initCrudEvents;
994
+ }
995
+
996
+ export declare interface ListData {
997
+ /** 评论数据 */
998
+ comments: CommentData[];
999
+ /** 根评论总数 */
1000
+ total_roots: number;
1001
+ /** 评论总数(包括所有子评论) */
1002
+ total: number;
1003
+ /** 页面信息 */
1004
+ page: PageData;
1005
+ /** 站点信息 */
1006
+ site: SiteData;
1007
+ /** 未读的 Notifies */
1008
+ unread: NotifyData[];
1009
+ /** 未读计数 */
1010
+ unread_count: number;
1011
+ /** API 版本 */
1012
+ api_version: ApiVersionData;
1013
+ /** 后端配置 */
1014
+ conf: any;
1015
+ }
1016
+
1017
+ declare interface ListFetchedArgs {
1018
+ params: Partial<ListFetchParams>;
1019
+ data?: ListData;
1020
+ error?: ErrorData;
1021
+ }
1022
+
1023
+ export declare interface ListFetchParams {
1024
+ offset: number;
1025
+ limit: number;
1026
+ flatMode: boolean;
1027
+ paramsModifier?: (p: any) => void;
1028
+ onSuccess?: (data: ListData) => void;
1029
+ onError?: (err: any) => void;
1030
+ }
1031
+
1032
+ export declare interface ListLastFetchData {
1033
+ params: ListFetchParams;
1034
+ data?: ListData;
1035
+ }
1036
+
1037
+ declare class ListLayout {
1038
+ private options;
1039
+ constructor(options: LayoutOptions);
1040
+ import(comments: CommentData[]): void;
1041
+ insert(comment: CommentData): void;
1042
+ private importCommentsNestMode;
1043
+ /** 导入评论 · 平铺模式 */
1044
+ private putCommentFlatMode;
1045
+ private insertCommentNest;
1046
+ private insertCommentFlatMode;
1047
+ }
1048
+
1049
+ declare namespace ListNest {
1050
+ export {
1051
+ makeNestCommentNodeList,
1052
+ CommentNode,
1053
+ SortByType
1054
+ }
1055
+ }
1056
+
1057
+ export declare const loadCountWidget: typeof Artalk.loadCountWidget;
1058
+
1059
+ /**
1060
+ * 本地持久化用户数据
1061
+ * @note 始终保持一层结构,不支持多层结构
1062
+ */
1063
+ export declare interface LocalUser {
1064
+ /** 昵称 */
1065
+ nick: string;
1066
+ /** 邮箱 */
1067
+ email: string;
1068
+ /** 链接 */
1069
+ link: string;
1070
+ /** TOKEN */
1071
+ token: string;
1072
+ /** 是否为管理员 */
1073
+ isAdmin: boolean;
1074
+ }
1075
+
1076
+ declare function makeNestCommentNodeList(srcData: CommentData[], sortBy?: SortByType, nestMax?: number): CommentNode[];
1077
+
1078
+ export declare interface NotifyData {
1079
+ /** 通知 ID */
1080
+ id: number;
1081
+ /** 用户 ID */
1082
+ user_id: number;
1083
+ /** 评论 ID */
1084
+ comment_id: number;
1085
+ /** 是否已读 */
1086
+ is_read: boolean;
1087
+ /** 是否已发送邮件通知 */
1088
+ is_emailed: boolean;
1089
+ /** 标为已读地址 */
1090
+ read_link: string;
1091
+ }
1092
+
1093
+ export declare type NotifyLevel = "i" | "s" | "w" | "e";
1094
+
1095
+ /**
1096
+ * 页面 API
1097
+ */
1098
+ declare class PageApi extends ApiBase {
1099
+ /** 页面 · 获取 */
1100
+ pageGet(siteName?: string, offset?: number, limit?: number): Promise<{
1101
+ pages: PageData[];
1102
+ total: number;
1103
+ }>;
1104
+ /** 页面 · 修改 */
1105
+ pageEdit(data: PageData): Promise<PageData>;
1106
+ /** 页面 · 删除 */
1107
+ pageDel(pageKey: string, siteName?: string): Promise<unknown>;
1108
+ /** 页面 · 数据更新 */
1109
+ pageFetch(id?: number, siteName?: string, getStatus?: boolean): Promise<any>;
1110
+ /** PV */
1111
+ pv(): Promise<number>;
1112
+ /** 统计 */
1113
+ stat(type: 'latest_comments' | 'latest_pages' | 'pv_most_pages' | 'comment_most_pages' | 'page_pv' | 'site_pv' | 'page_comment' | 'site_comment', pageKeys?: string | string[], limit?: number): Promise<number | object | CommentData[] | PageData[]>;
1114
+ }
1115
+
1116
+ export declare interface PageData {
1117
+ /** 页面 ID */
1118
+ id: number;
1119
+ /** 页面唯一标识符 */
1120
+ key: string;
1121
+ /** 页面标题 */
1122
+ title: string;
1123
+ /** 页面 url */
1124
+ url: string;
1125
+ /** 仅管理员可评 */
1126
+ admin_only: boolean;
1127
+ /** 站点名(用于隔离) */
1128
+ site_name: string;
1129
+ /** 赞同数 */
1130
+ vote_up: number;
1131
+ /** 反对数 */
1132
+ vote_down: number;
1133
+ }
1134
+
1135
+ /**
1136
+ * PlugKit provides a set of methods to help you develop editor plug
1137
+ */
1138
+ declare class PlugKit {
1139
+ private plugs;
1140
+ constructor(plugs: PlugManager);
1141
+ /** Use the editor */
1142
+ useEditor(): EditorApi;
1143
+ /**
1144
+ * Use the context of global
1145
+ *
1146
+ * @deprecated The calls to this function should be reduced as much as possible
1147
+ */
1148
+ useGlobalCtx(): ContextApi;
1149
+ /** Use the config of Artalk */
1150
+ useConf(): ArtalkConfig;
1151
+ /** Use the http api client */
1152
+ useApi(): Api;
1153
+ /** Use the user manager */
1154
+ useUser(): User;
1155
+ /** Use the ui of editor */
1156
+ useUI(): EditorUI;
1157
+ /** Use the events in editor scope */
1158
+ useEvents(): EventManager<EditorEventPayloadMap>;
1159
+ /** Listen the event when plug is mounted */
1160
+ useMounted(func: () => void): void;
1161
+ /** Listen the event when plug is unmounted */
1162
+ useUnmounted(func: () => void): void;
1163
+ /** Use the deps of other plug */
1164
+ useDeps<T extends typeof EditorPlug>(plug: T): InstanceType<T> | undefined;
1165
+ }
1166
+
1167
+ declare class PlugManager {
1168
+ editor: EditorApi;
1169
+ private plugs;
1170
+ private openedPlug;
1171
+ private events;
1172
+ getPlugs(): EditorPlug[];
1173
+ getEvents(): EventManager<EditorEventPayloadMap>;
1174
+ private clear;
1175
+ constructor(editor: EditorApi);
1176
+ private loadPluginUI;
1177
+ /** Load the plug btn and plug panel on editor ui */
1178
+ private loadPluginItem;
1179
+ get<T extends typeof EditorPlug>(plug: T): InstanceType<T> | undefined;
1180
+ /** Open the editor plug panel */
1181
+ openPlugPanel(plug: EditorPlug): void;
1182
+ /** Close the editor plug panel */
1183
+ closePlugPanel(): void;
1184
+ /** Get the content which is transformed by plugs */
1185
+ getTransformedContent(rawContent: string): string;
1186
+ }
1187
+
1188
+ declare class Render {
1189
+ comment: Comment_2;
1190
+ get ctx(): ContextApi;
1191
+ get data(): CommentData;
1192
+ get conf(): ArtalkConfig;
1193
+ get cConf(): CommentConf;
1194
+ $el: HTMLElement;
1195
+ $main: HTMLElement;
1196
+ $header: HTMLElement;
1197
+ $headerNick: HTMLElement;
1198
+ $headerBadgeWrap: HTMLElement;
1199
+ $body: HTMLElement;
1200
+ $content: HTMLElement;
1201
+ $childrenWrap: HTMLElement | null;
1202
+ $actions: HTMLElement;
1203
+ voteBtnUp?: ActionBtn;
1204
+ voteBtnDown?: ActionBtn;
1205
+ $replyTo?: HTMLElement;
1206
+ $replyAt?: HTMLElement;
1207
+ constructor(comment: Comment_2);
1208
+ render(): HTMLElement;
1209
+ /** 内容限高检测 */
1210
+ checkHeightLimit(): void;
1211
+ /** 子评论区域移除限高 */
1212
+ heightLimitRemoveForChildren(): void;
1213
+ /** 渐出动画 */
1214
+ playFadeAnim(): void;
1215
+ /** 渐出动画 · 评论内容区域 */
1216
+ playFadeAnimForBody(): void;
1217
+ /** 获取子评论 Wrap */
1218
+ getChildrenWrap(): HTMLElement | null;
1219
+ /** 初始化子评论区域 Wrap */
1220
+ renderChildrenWrap(): HTMLElement;
1221
+ /** 恢复原有的子评论区域 Wrap */
1222
+ recoveryChildrenWrap(): void;
1223
+ /** 设置已读 */
1224
+ setUnread(val: boolean): void;
1225
+ /** 设置为可点击的评论 */
1226
+ setOpenable(val: boolean): void;
1227
+ /** 设置点击评论打开置顶 URL */
1228
+ setOpenURL(url: string): void;
1229
+ /** 设置点击评论时的操作 */
1230
+ setOpenAction(action: () => void): void;
1231
+ }
1232
+
1233
+ declare const Sel: {
1234
+ $header: string;
1235
+ $nick: string;
1236
+ $email: string;
1237
+ $link: string;
1238
+ $textareaWrap: string;
1239
+ $textarea: string;
1240
+ $bottom: string;
1241
+ $submitBtn: string;
1242
+ $notifyWrap: string;
1243
+ $plugBtnWrap: string;
1244
+ $plugPanelWrap: string;
1245
+ };
1246
+
1247
+ /**
1248
+ * Services
1249
+ *
1250
+ * @description Call these services by `ctx.get('serviceName')` or `ctx.serviceName`
1251
+ */
1252
+ declare const services: {
1253
+ i18n(ctx: ContextApi): void;
1254
+ user(ctx: ContextApi): User;
1255
+ layerManager(ctx: ContextApi): LayerManager;
1256
+ checkerLauncher(ctx: ContextApi): CheckerLauncher;
1257
+ editor(ctx: ContextApi): Editor;
1258
+ list(ctx: ContextApi): List;
1259
+ sidebarLayer(ctx: ContextApi): SidebarLayer;
1260
+ editorPlugs(): PlugManager | undefined;
1261
+ };
1262
+
1263
+ declare class SidebarLayer extends Component {
1264
+ layer?: Layer;
1265
+ $header: HTMLElement;
1266
+ $closeBtn: HTMLElement;
1267
+ $iframeWrap: HTMLElement;
1268
+ $iframe?: HTMLIFrameElement;
1269
+ constructor(ctx: ContextApi);
1270
+ private firstShow;
1271
+ /** 显示 */
1272
+ show(conf?: SidebarShowPayload): Promise<void>;
1273
+ /** 隐藏 */
1274
+ hide(): void;
1275
+ private authCheck;
1276
+ private initLayer;
1277
+ private createIframe;
1278
+ private iframeLoad;
1279
+ }
1280
+
1281
+ export declare interface SidebarShowPayload {
1282
+ view?: 'comments' | 'sites' | 'pages' | 'transfer';
1283
+ }
1284
+
1285
+ /**
1286
+ * 站点 API
1287
+ */
1288
+ declare class SiteApi extends ApiBase {
1289
+ /** 站点 · 获取 */
1290
+ siteGet(): Promise<SiteData[]>;
1291
+ /** 站点 · 创建 */
1292
+ siteAdd(name: string, urls: string): Promise<SiteData>;
1293
+ /** 站点 · 修改 */
1294
+ siteEdit(data: SiteData): Promise<SiteData>;
1295
+ /** 站点 · 删除 */
1296
+ siteDel(id: number, delContent?: boolean): Promise<unknown>;
1297
+ /** 导出 */
1298
+ export(): Promise<any>;
1299
+ }
1300
+
1301
+ export declare interface SiteData {
1302
+ /** 站点 ID */
1303
+ id: number;
1304
+ /** 站点名 */
1305
+ name: string;
1306
+ /** 站点 URLs */
1307
+ urls: string[];
1308
+ /** 站点 URLs(原始字符串) */
1309
+ urls_raw: string;
1310
+ /** 站点主 URL */
1311
+ first_url: string;
1312
+ }
1313
+
1314
+ declare type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC';
1315
+
1316
+ /**
1317
+ * 系统 API
1318
+ */
1319
+ declare class SystemApi extends ApiBase {
1320
+ /** 获取配置 */
1321
+ conf(): Promise<SystemConfResp>;
1322
+ /** 获取配置数据 */
1323
+ getSettings(): Promise<{
1324
+ custom: string;
1325
+ template: string;
1326
+ }>;
1327
+ /** 保存配置数据 */
1328
+ saveSettings(yamlStr: string): Promise<boolean>;
1329
+ /** 获取 API 版本信息 */
1330
+ version(): Promise<{
1331
+ app: string;
1332
+ version: string;
1333
+ commit_hash: string;
1334
+ fe_min_version: string;
1335
+ }>;
1336
+ }
1337
+
1338
+ declare interface SystemConfResp {
1339
+ frontend_conf: Partial<ArtalkConfig>;
1340
+ version: ApiVersionInfo;
1341
+ }
1342
+
1343
+ declare type TC = typeof ApiComponents;
1344
+
1345
+ declare type TInjectedServices = {
1346
+ [K in keyof TServiceInjectors]: ReturnType<TServiceInjectors[K]>;
1347
+ };
1348
+
1349
+ declare type TKeysOnlyReturn<T extends TObjectWithFuncs, V> = {
1350
+ [K in keyof T]: ReturnType<T[K]> extends V ? K : never;
1351
+ }[keyof T];
1352
+
1353
+ declare type TMarked = typeof marked;
1354
+
1355
+ declare type TObjectWithFuncs = {
1356
+ [k: string]: (...args: any) => any;
1357
+ };
1358
+
1359
+ declare type TOmitConditions = TKeysOnlyReturn<TServiceImps, void>;
1360
+
1361
+ declare type TServiceImps = typeof services;
1362
+
1363
+ declare type TServiceInjectors = Omit<TServiceImps, TOmitConditions>;
1364
+
1365
+ /**
1366
+ * 上传 API
1367
+ */
1368
+ declare class UploadApi extends ApiBase {
1369
+ /** 图片上传 */
1370
+ imgUpload(file: File): Promise<{
1371
+ img_file: string;
1372
+ img_url: string;
1373
+ }>;
1374
+ }
1375
+
1376
+ export declare const use: typeof Artalk.use;
1377
+
1378
+ declare class User {
1379
+ private opts;
1380
+ private data;
1381
+ constructor(opts: UserOpts);
1382
+ getData(): LocalUser;
1383
+ /** 保存用户到 localStorage 中 */
1384
+ update(obj?: Partial<LocalUser>): void;
1385
+ /**
1386
+ * Logout
1387
+ *
1388
+ * @description Logout will clear login status, but not clear user data (nick, email, link)
1389
+ */
1390
+ logout(): void;
1391
+ /** 是否已填写基本用户信息 */
1392
+ checkHasBasicUserInfo(): boolean;
1393
+ }
1394
+
1395
+ /**
1396
+ * 用户 API
1397
+ */
1398
+ declare class UserApi extends ApiBase {
1399
+ /** 用户 · 登录 */
1400
+ login(name: string, email: string, password: string): Promise<{
1401
+ token: string;
1402
+ user: UserData;
1403
+ }>;
1404
+ /** 用户 · 获取 */
1405
+ userGet(name: string, email: string): {
1406
+ req: Promise<{
1407
+ user: UserData | null;
1408
+ is_login: boolean;
1409
+ unread: NotifyData[];
1410
+ unread_count: any;
1411
+ }>;
1412
+ abort: () => void;
1413
+ };
1414
+ /** 用户 · 登录状态 */
1415
+ loginStatus(): Promise<{
1416
+ is_login: boolean;
1417
+ is_admin: boolean;
1418
+ }>;
1419
+ /** 用户 · 注销 */
1420
+ logout(): Promise<unknown>;
1421
+ /** 已读标记 */
1422
+ markRead(commentID: number, notifyKey: string, readAll?: boolean): Promise<unknown>;
1423
+ /** 用户 · 列表 */
1424
+ userList(offset?: number, limit?: number, type?: 'all' | 'admin' | 'in_conf'): Promise<{
1425
+ users: UserDataForAdmin[];
1426
+ total: number;
1427
+ }>;
1428
+ /** 用户 · 新增 */
1429
+ userAdd(user: Partial<UserDataForAdmin>, password?: string): Promise<UserDataForAdmin>;
1430
+ /** 用户 · 修改 */
1431
+ userEdit(user: Partial<UserDataForAdmin>, password?: string): Promise<UserDataForAdmin>;
1432
+ /** 用户 · 删除 */
1433
+ userDel(userID: number): Promise<unknown>;
1434
+ }
1435
+
1436
+ export declare interface UserData {
1437
+ /** 用户 ID */
1438
+ id: number;
1439
+ /** 用户名 */
1440
+ name: string;
1441
+ /** 邮箱 */
1442
+ email: string;
1443
+ /** 链接 */
1444
+ link: string;
1445
+ /** 徽章名称 */
1446
+ badge_name: string;
1447
+ /** 徽章颜色 */
1448
+ badge_color: string;
1449
+ /** 是否属于管理员 */
1450
+ is_admin: boolean;
1451
+ /** 所属站点名 */
1452
+ site_names: string[];
1453
+ /** 所属站点名 (字符串) */
1454
+ site_names_raw: string;
1455
+ /** 是否允许接收邮件通知 */
1456
+ receive_email: boolean;
1457
+ }
1458
+
1459
+ export declare interface UserDataForAdmin extends UserData {
1460
+ /** 最后一次操作 IP */
1461
+ last_ip: string;
1462
+ /** 最后一次操作 UA */
1463
+ last_ua: string;
1464
+ /** 是否存在于配置文件中 */
1465
+ is_in_conf: boolean;
1466
+ /** 评论数 */
1467
+ comment_count: number;
1468
+ /** 密码 */
1469
+ password: string;
1470
+ }
1471
+
1472
+ declare interface UserOpts {
1473
+ onUserChanged?: (user: LocalUser) => void;
1474
+ }
1475
+
1476
+ export { }