artalk 2.4.4 → 2.5.1

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 (156) hide show
  1. package/README.md +27 -0
  2. package/dist/Artalk.css +1 -1
  3. package/dist/Artalk.es.js +7066 -6256
  4. package/dist/Artalk.iife.js +1 -1
  5. package/dist/Artalk.js +1 -1
  6. package/dist/ArtalkLite.css +1 -1
  7. package/dist/ArtalkLite.es.js +5095 -4396
  8. package/dist/ArtalkLite.iife.js +1 -1
  9. package/dist/ArtalkLite.js +1 -1
  10. package/dist/i18n/jp.js +1 -1
  11. package/dist/i18n/zh-TW.js +1 -1
  12. package/dist/src/api/index.d.ts +2 -2
  13. package/dist/src/api/system.d.ts +5 -2
  14. package/dist/src/artalk.d.ts +42 -34
  15. package/dist/src/comment/comment.d.ts +2 -2
  16. package/dist/src/comment/height-limit.d.ts +30 -0
  17. package/dist/src/comment/render-ctx.d.ts +23 -0
  18. package/dist/src/comment/render.d.ts +2 -50
  19. package/dist/src/comment/renders/actions.d.ts +5 -0
  20. package/dist/src/comment/renders/avatar.d.ts +5 -0
  21. package/dist/src/comment/renders/content.d.ts +5 -0
  22. package/dist/src/comment/renders/header.d.ts +5 -0
  23. package/dist/src/comment/renders/index.d.ts +2 -0
  24. package/dist/src/comment/renders/pending.d.ts +5 -0
  25. package/dist/src/comment/renders/reply-at.d.ts +5 -0
  26. package/dist/src/comment/renders/reply-to.d.ts +5 -0
  27. package/dist/src/components/dialog.d.ts +1 -1
  28. package/dist/src/config.d.ts +8 -0
  29. package/dist/src/context.d.ts +16 -29
  30. package/dist/src/editor/edit-mode.d.ts +9 -0
  31. package/dist/src/editor/editor.d.ts +37 -45
  32. package/dist/src/editor/funcs.d.ts +2 -0
  33. package/dist/src/editor/mover.d.ts +8 -0
  34. package/dist/src/editor/plug-manager.d.ts +17 -0
  35. package/dist/src/editor/plugs/editor-plug.d.ts +13 -1
  36. package/dist/src/editor/reply.d.ts +9 -0
  37. package/dist/src/editor/submit.d.ts +16 -0
  38. package/dist/src/editor/ui.d.ts +25 -0
  39. package/dist/src/i18n/external.d.ts +70 -0
  40. package/dist/src/i18n/index.d.ts +11 -75
  41. package/dist/src/layer/index.d.ts +2 -2
  42. package/dist/src/layer/layer.d.ts +1 -1
  43. package/dist/src/lib/checker/captcha-renders.d.ts +5 -0
  44. package/dist/src/lib/checker/index.d.ts +16 -10
  45. package/dist/src/lib/dark-mode.d.ts +4 -0
  46. package/dist/src/lib/marked.d.ts +9 -0
  47. package/dist/src/lib/user.d.ts +6 -3
  48. package/dist/src/lib/utils.d.ts +1 -5
  49. package/dist/src/list/list-lite.d.ts +15 -11
  50. package/dist/src/list/list-nest.d.ts +2 -2
  51. package/dist/src/list/list-ui.d.ts +16 -0
  52. package/dist/src/list/list.d.ts +0 -1
  53. package/dist/src/list/paginator/adaptors/index.d.ts +12 -0
  54. package/dist/src/list/paginator/adaptors/pagination.d.ts +9 -0
  55. package/dist/src/list/paginator/adaptors/read-more.d.ts +10 -0
  56. package/dist/src/list/paginator/holder.d.ts +16 -0
  57. package/dist/src/list/paginator/index.d.ts +10 -0
  58. package/dist/src/service.d.ts +46 -0
  59. package/dist/types/artalk-config.d.ts +5 -2
  60. package/dist/types/artalk-data.d.ts +3 -3
  61. package/dist/types/context.d.ts +13 -20
  62. package/dist/types/global.d.ts +1 -0
  63. package/package.json +6 -7
  64. package/src/api/comment.ts +7 -7
  65. package/src/api/page.ts +0 -2
  66. package/src/api/request.ts +6 -4
  67. package/src/api/system.ts +3 -12
  68. package/src/api/upload.ts +3 -4
  69. package/src/api/user.ts +6 -8
  70. package/src/artalk.ts +103 -158
  71. package/src/comment/comment.ts +7 -6
  72. package/src/comment/height-limit.ts +100 -0
  73. package/src/comment/render-ctx.ts +30 -0
  74. package/src/comment/render.ts +31 -375
  75. package/src/comment/renders/actions.ts +114 -0
  76. package/src/comment/renders/avatar.ts +22 -0
  77. package/src/comment/renders/content.ts +39 -0
  78. package/src/comment/renders/header.ts +84 -0
  79. package/src/comment/renders/index.ts +19 -0
  80. package/src/comment/renders/pending.ts +12 -0
  81. package/src/comment/renders/reply-at.ts +16 -0
  82. package/src/comment/renders/reply-to.ts +24 -0
  83. package/src/config.ts +65 -0
  84. package/src/context.ts +33 -86
  85. package/src/defaults.ts +1 -0
  86. package/src/editor/edit-mode.ts +103 -0
  87. package/src/editor/editor.ts +101 -395
  88. package/src/editor/funcs.ts +97 -0
  89. package/src/editor/mover.ts +43 -0
  90. package/src/editor/plug-manager.ts +172 -0
  91. package/src/editor/plugs/editor-plug.ts +20 -2
  92. package/src/editor/plugs/{emoticons-plug.less → emoticons-plug.scss} +5 -4
  93. package/src/editor/plugs/emoticons-plug.ts +2 -1
  94. package/src/editor/plugs/header-input-plug.ts +11 -10
  95. package/src/editor/plugs/{preview-plug.less → preview-plug.scss} +1 -1
  96. package/src/editor/plugs/preview-plug.ts +8 -4
  97. package/src/editor/plugs/upload-plug.ts +12 -14
  98. package/src/editor/reply.ts +62 -0
  99. package/src/editor/submit.ts +99 -0
  100. package/src/editor/ui.ts +36 -0
  101. package/src/i18n/external.ts +10 -0
  102. package/src/i18n/index.ts +22 -19
  103. package/src/i18n/jp.ts +1 -1
  104. package/src/i18n/zh-TW.ts +1 -1
  105. package/src/layer/index.ts +2 -2
  106. package/src/layer/layer.ts +4 -4
  107. package/src/layer/sidebar-layer.ts +4 -2
  108. package/src/lib/checker/admin.ts +37 -0
  109. package/src/lib/checker/captcha-renders.ts +68 -0
  110. package/src/lib/checker/captcha.ts +26 -0
  111. package/src/lib/checker/index.ts +36 -20
  112. package/src/lib/dark-mode.ts +48 -0
  113. package/src/lib/marked.ts +133 -0
  114. package/src/lib/user.ts +13 -7
  115. package/src/lib/utils.ts +1 -123
  116. package/src/list/list-lite.ts +59 -162
  117. package/src/list/list-ui.ts +137 -0
  118. package/src/list/list.ts +33 -60
  119. package/src/list/paginator/adaptors/index.ts +21 -0
  120. package/src/list/paginator/adaptors/pagination.ts +42 -0
  121. package/src/list/paginator/adaptors/read-more.ts +56 -0
  122. package/src/list/paginator/holder.ts +56 -0
  123. package/src/list/paginator/index.ts +13 -0
  124. package/src/service.ts +118 -0
  125. package/src/style/{_color.less → _color.scss} +3 -3
  126. package/src/style/{_extend.less → _extend.scss} +1 -1
  127. package/src/style/_variables.scss +3 -0
  128. package/src/style/{comment.less → comment.scss} +36 -12
  129. package/src/style/{editor.less → editor.scss} +11 -11
  130. package/src/style/{list.less → list.scss} +12 -10
  131. package/src/style/{main.less → main.scss} +24 -23
  132. package/src/style/{sidebar-layer.less → sidebar-layer.scss} +8 -8
  133. package/types/artalk-config.d.ts +5 -2
  134. package/types/artalk-data.d.ts +3 -3
  135. package/types/context.d.ts +13 -20
  136. package/types/global.d.ts +1 -0
  137. package/CNAME +0 -1
  138. package/LICENSE +0 -165
  139. package/index.html +0 -157
  140. package/postcss.config.js +0 -5
  141. package/scripts/build-i18n.mjs +0 -46
  142. package/src/lib/checker/admin-checker.ts +0 -36
  143. package/src/lib/checker/captcha-checker.ts +0 -84
  144. package/src/style/_variables.less +0 -3
  145. package/test/ArtalkCount.html +0 -16
  146. package/test/ArtalkI18n.html +0 -16
  147. package/test/ArtalkLite.html +0 -15
  148. package/test/CSRF.html +0 -26
  149. package/tsconfig.json +0 -12
  150. package/vite-base.config.ts +0 -21
  151. package/vite-demo.config.ts +0 -12
  152. package/vite-lite.config.ts +0 -22
  153. package/vite.config.ts +0 -27
  154. /package/dist/src/lib/checker/{admin-checker.d.ts → admin.d.ts} +0 -0
  155. /package/dist/src/lib/checker/{captcha-checker.d.ts → captcha.d.ts} +0 -0
  156. /package/src/style/{pagination.less → pagination.scss} +0 -0
@@ -0,0 +1,25 @@
1
+ declare const Sel: {
2
+ $header: string;
3
+ $nick: string;
4
+ $email: string;
5
+ $link: string;
6
+ $textareaWrap: string;
7
+ $textarea: string;
8
+ $bottom: string;
9
+ $submitBtn: string;
10
+ $notifyWrap: string;
11
+ $plugBtnWrap: string;
12
+ $plugPanelWrap: string;
13
+ };
14
+ export interface EditorUI extends Record<keyof typeof Sel, HTMLElement> {
15
+ $el: HTMLElement;
16
+ $nick: HTMLInputElement;
17
+ $email: HTMLInputElement;
18
+ $link: HTMLInputElement;
19
+ $textarea: HTMLTextAreaElement;
20
+ $submitBtn: HTMLButtonElement;
21
+ $sendReply?: HTMLElement;
22
+ $editCancelBtn?: HTMLElement;
23
+ }
24
+ export declare function render(): EditorUI;
25
+ export {};
@@ -0,0 +1,70 @@
1
+ import type { I18n } from '.';
2
+ export declare const GLOBAL_LOCALES_KEY = "ArtalkI18n";
3
+ export declare function defineLocaleExternal(lang: string, locale: I18n, aliases?: string[]): {
4
+ placeholder: string;
5
+ noComment: string;
6
+ send: string;
7
+ save: string;
8
+ nick: string;
9
+ email: string;
10
+ link: string;
11
+ emoticon: string;
12
+ preview: string;
13
+ image: string;
14
+ uploadFail: string;
15
+ commentFail: string;
16
+ restoredMsg: string;
17
+ onlyAdminCanReply: string;
18
+ uploadLoginMsg: string;
19
+ counter: string;
20
+ sortLatest: string;
21
+ sortOldest: string;
22
+ sortBest: string;
23
+ sortAuthor: string;
24
+ openComment: string;
25
+ closeComment: string;
26
+ listLoadFailMsg: string;
27
+ listRetry: string;
28
+ loadMore: string;
29
+ admin: string;
30
+ reply: string;
31
+ voteUp: string;
32
+ voteDown: string;
33
+ voteFail: string;
34
+ readMore: string;
35
+ actionConfirm: string;
36
+ collapse: string;
37
+ collapsed: string;
38
+ collapsedMsg: string;
39
+ expand: string;
40
+ approved: string;
41
+ pending: string;
42
+ pendingMsg: string;
43
+ edit: string;
44
+ editCancel: string;
45
+ delete: string;
46
+ deleteConfirm: string;
47
+ pin: string;
48
+ unpin: string;
49
+ seconds: string;
50
+ minutes: string;
51
+ hours: string;
52
+ days: string;
53
+ now: string;
54
+ adminCheck: string;
55
+ captchaCheck: string;
56
+ confirm: string;
57
+ cancel: string;
58
+ msgCenter: string;
59
+ ctrlCenter: string;
60
+ frontend: string;
61
+ backend: string;
62
+ loading: string;
63
+ loadFail: string;
64
+ editing: string;
65
+ editFail: string;
66
+ deleting: string;
67
+ deleteFail: string;
68
+ reqGot: string;
69
+ reqAborted: string;
70
+ };
@@ -1,5 +1,6 @@
1
1
  import en from './en';
2
- export declare type I18n = typeof en;
2
+ export type I18n = typeof en;
3
+ export type I18nKeys = keyof I18n;
3
4
  export declare const internal: {
4
5
  en: {
5
6
  placeholder: string;
@@ -206,83 +207,18 @@ export declare const internal: {
206
207
  reqAborted: string;
207
208
  };
208
209
  };
209
- export declare function defineLocaleExternal(lang: string, locale: I18n, aliases?: string[]): {
210
- placeholder: string;
211
- noComment: string;
212
- send: string;
213
- save: string;
214
- nick: string;
215
- email: string;
216
- link: string;
217
- emoticon: string;
218
- preview: string;
219
- image: string;
220
- uploadFail: string;
221
- commentFail: string;
222
- restoredMsg: string;
223
- onlyAdminCanReply: string;
224
- uploadLoginMsg: string;
225
- counter: string;
226
- sortLatest: string;
227
- sortOldest: string;
228
- sortBest: string;
229
- sortAuthor: string;
230
- openComment: string;
231
- closeComment: string;
232
- listLoadFailMsg: string;
233
- listRetry: string;
234
- loadMore: string;
235
- admin: string;
236
- reply: string;
237
- voteUp: string;
238
- voteDown: string;
239
- voteFail: string;
240
- readMore: string;
241
- actionConfirm: string;
242
- collapse: string;
243
- collapsed: string;
244
- collapsedMsg: string;
245
- expand: string;
246
- approved: string;
247
- pending: string;
248
- pendingMsg: string;
249
- edit: string;
250
- editCancel: string;
251
- delete: string;
252
- deleteConfirm: string;
253
- pin: string;
254
- unpin: string;
255
- seconds: string;
256
- minutes: string;
257
- hours: string;
258
- days: string;
259
- now: string;
260
- adminCheck: string;
261
- captchaCheck: string;
262
- confirm: string;
263
- cancel: string;
264
- msgCenter: string;
265
- ctrlCenter: string;
266
- frontend: string;
267
- backend: string;
268
- loading: string;
269
- loadFail: string;
270
- editing: string;
271
- editFail: string;
272
- deleting: string;
273
- deleteFail: string;
274
- reqGot: string;
275
- reqAborted: string;
276
- };
277
210
  /**
278
- * get a locale object by language name
211
+ * find a locale object by language name
212
+ */
213
+ export declare function findLocaleSet(lang: string): I18n;
214
+ /**
215
+ * Set system locale
279
216
  */
280
- declare function getLocaleSet(lang: string): I18n;
217
+ export declare function setLocale(locale: I18n | string): void;
281
218
  /**
282
- * get a i18n message by key
219
+ * Get an i18n message by key
283
220
  */
284
- declare function getI18n(locale: I18n | string, key: keyof I18n, args?: {
221
+ export declare function t(key: I18nKeys, args?: {
285
222
  [key: string]: string;
286
223
  }): string;
287
- export { getLocaleSet };
288
- export default getI18n;
224
+ export default t;
@@ -1,3 +1,3 @@
1
- import Layer, { GetLayerWrap } from './layer';
1
+ import Layer, { getLayerWrap } from './layer';
2
2
  export default Layer;
3
- export { GetLayerWrap };
3
+ export { getLayerWrap };
@@ -26,7 +26,7 @@ export default class Layer extends Component {
26
26
  dispose(): void;
27
27
  checkCleanLayer(): void;
28
28
  }
29
- export declare function GetLayerWrap(ctx: Context): {
29
+ export declare function getLayerWrap(): {
30
30
  $wrap: HTMLElement;
31
31
  $mask: HTMLElement;
32
32
  };
@@ -0,0 +1,5 @@
1
+ import { CheckerCtx } from '.';
2
+ /** 图片验证码 */
3
+ export declare function imgBody(checker: CheckerCtx): HTMLElement;
4
+ /** iframe 形式的通用验证服务 */
5
+ export declare function iframeBody(checker: CheckerCtx): HTMLElement;
@@ -1,5 +1,6 @@
1
1
  import Context from '../../../types/context';
2
2
  import Layer from '../../layer';
3
+ import type Api from '../../api';
3
4
  export interface CheckerCaptchaPayload extends CheckerPayload {
4
5
  imgData?: string;
5
6
  iframe?: string;
@@ -15,28 +16,33 @@ export interface CheckerPayload {
15
16
  export default class CheckerLauncher {
16
17
  ctx: Context;
17
18
  launched: Checker[];
18
- captchaConf: {
19
- val?: string;
20
- imgData?: string;
21
- iframe?: string;
22
- };
23
19
  constructor(ctx: Context);
24
20
  checkCaptcha(payload: CheckerCaptchaPayload): void;
25
21
  checkAdmin(payload: CheckerPayload): void;
26
- fire(checker: Checker, payload: CheckerPayload): void;
22
+ fire(checker: Checker, payload: CheckerPayload, postFire?: (c: CheckerCtx) => void): void;
27
23
  private close;
28
24
  }
29
25
  export interface Checker {
30
26
  el?: HTMLElement;
31
27
  inputType?: 'password' | 'text';
32
- body: (launcher: CheckerLauncher, ctx: CheckerCtx) => HTMLElement;
33
- request: (launcher: CheckerLauncher, ctx: CheckerCtx, inputVal: string) => Promise<string>;
34
- onSuccess?: (launcher: CheckerLauncher, ctx: CheckerCtx, data: string, inputVal: string, formEl: HTMLElement) => void;
35
- onError?: (launcher: CheckerLauncher, ctx: CheckerCtx, err: any, inputVal: string, formEl: HTMLElement) => void;
28
+ body: (checker: CheckerCtx) => HTMLElement;
29
+ request: (checker: CheckerCtx, inputVal: string) => Promise<string>;
30
+ onSuccess?: (checker: CheckerCtx, respData: string, inputVal: string, formEl: HTMLElement) => void;
31
+ onError?: (checker: CheckerCtx, err: any, inputVal: string, formEl: HTMLElement) => void;
32
+ }
33
+ interface CheckerStore {
34
+ val?: string;
35
+ img_data?: string;
36
+ iframe?: string;
36
37
  }
37
38
  export interface CheckerCtx {
39
+ get<K extends keyof CheckerStore>(key: K): CheckerStore[K];
40
+ set<K extends keyof CheckerStore>(key: K, val: CheckerStore[K]): void;
41
+ getCtx(): Context;
42
+ getApi(): Api;
38
43
  getLayer(): Layer;
39
44
  hideInteractInput(): void;
40
45
  triggerSuccess(): void;
41
46
  cancel(): void;
42
47
  }
48
+ export {};
@@ -0,0 +1,4 @@
1
+ import type Context from '../../types/context';
2
+ export declare function syncDarkModeConf(ctx: Context): void;
3
+ export declare function setDarkMode(ctx: Context, darkMode: boolean | 'auto', alterConf?: boolean): void;
4
+ export declare function updateClassName(ctx: Context, darkMode: boolean): void;
@@ -0,0 +1,9 @@
1
+ import { marked as libMarked } from 'marked';
2
+ import Context from '../../types/context';
3
+ export type TMarked = typeof libMarked;
4
+ /** Get Marked instance */
5
+ export declare function getInstance(): typeof libMarked | undefined;
6
+ /** 初始化 marked */
7
+ export declare function initMarked(): void;
8
+ /** 解析 markdown */
9
+ export default function marked(ctx: Context, src: string): string;
@@ -1,9 +1,10 @@
1
1
  import { LocalUser } from '../../types/artalk-config';
2
2
  import Context from '../../types/context';
3
- export default class User {
4
- ctx: Context;
3
+ declare class User {
4
+ ctx?: Context;
5
5
  data: LocalUser;
6
- constructor(ctx: Context);
6
+ constructor();
7
+ setContext(ctx: Context): void;
7
8
  /** 保存用户到 localStorage 中 */
8
9
  update(obj?: Partial<LocalUser>): void;
9
10
  /** 注销,清除用户登录状态 */
@@ -11,3 +12,5 @@ export default class User {
11
12
  /** 是否已填写基本用户信息 */
12
13
  checkHasBasicUserInfo(): boolean;
13
14
  }
15
+ declare const UserInstance: User;
16
+ export default UserInstance;
@@ -16,11 +16,7 @@ export declare function onImagesLoaded($container: HTMLElement, event: Function)
16
16
  export declare function getGravatarURL(ctx: Context, emailMD5: string): string;
17
17
  export declare function sleep(ms: number): Promise<unknown>;
18
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;
19
+ export declare function versionCompare(a: string, b: string): 1 | 0 | -1;
24
20
  /** 获取修正后的 UserAgent */
25
21
  export declare function getCorrectUserAgent(): Promise<string>;
26
22
  /** 是否为完整的 URL */
@@ -2,13 +2,18 @@ import { ListData, CommentData, NotifyData } from '../../types/artalk-data';
2
2
  import Context from '../../types/context';
3
3
  import Component from '../lib/component';
4
4
  import Comment from '../comment';
5
- import Pagination from '../components/pagination';
6
- import ReadMoreBtn from '../components/read-more-btn';
5
+ import PgHolder, { TPgMode } from './paginator';
7
6
  import * as ListNest from './list-nest';
8
7
  export default class ListLite extends Component {
8
+ /** 列表评论集区域元素 */
9
9
  protected $commentsWrap: HTMLElement;
10
+ /** 最后一次请求得到的列表数据 */
10
11
  protected data?: ListData;
12
+ /** 是否处于加载中状态 */
11
13
  protected isLoading: boolean;
14
+ /** 配置是否已加载 */
15
+ private confLoaded;
16
+ /** 无评论显示文字 */
12
17
  noCommentText?: string;
13
18
  /** 嵌套模式下的排序方式 */
14
19
  private _nestSortBy?;
@@ -19,36 +24,37 @@ export default class ListLite extends Component {
19
24
  get flatMode(): boolean;
20
25
  set flatMode(val: boolean);
21
26
  /** 分页方式 */
22
- _pageMode?: 'pagination' | 'read-more';
27
+ _pageMode?: TPgMode;
23
28
  get pageMode(): 'pagination' | 'read-more';
24
29
  set pageMode(val: 'pagination' | 'read-more');
30
+ /** 分页方式持有者 */
31
+ pgHolder?: PgHolder;
25
32
  /** 每页数量 (每次请求获取量) */
26
33
  private _pageSize?;
27
34
  get pageSize(): number;
28
35
  set pageSize(val: number);
36
+ /** 监听指定元素上的滚动 */
29
37
  scrollListenerAt?: HTMLElement;
38
+ /** 翻页归位到指定元素 */
30
39
  repositionAt?: HTMLElement;
31
- protected pagination?: Pagination;
32
- protected readMoreBtn?: ReadMoreBtn;
33
- protected autoLoadScrollEvent?: any;
34
40
  renderComment?: (comment: Comment) => void;
35
41
  paramsEditor?: (params: any) => void;
36
42
  onAfterLoad?: (data: ListData) => void;
43
+ /** 未读标记 */
37
44
  protected unread: NotifyData[];
38
45
  unreadHighlight?: boolean;
39
46
  constructor(ctx: Context);
40
47
  getData(): ListData | undefined;
41
48
  clearData(): void;
49
+ getLoading(): boolean;
42
50
  getCommentsWrapEl(): HTMLElement;
43
- /** 加载动画 */
51
+ /** 设置加载状态 */
44
52
  setLoading(val: boolean, isFirstLoad?: boolean): void;
45
53
  /** 评论获取 */
46
54
  fetchComments(offset: number): Promise<void>;
47
- private confLoaded;
48
55
  protected onLoad(data: ListData, offset: number): void;
49
56
  /** 分页模式 */
50
57
  private refreshPagination;
51
- private initPagination;
52
58
  /** 错误处理 */
53
59
  protected onError(msg: any, offset: number, errData?: any): void;
54
60
  /** 刷新界面 */
@@ -68,6 +74,4 @@ export default class ListLite extends Component {
68
74
  updateComment(commentData: CommentData): void;
69
75
  /** 更新未读数据 */
70
76
  updateUnread(notifies: NotifyData[]): void;
71
- /** 版本检测 */
72
- versionCheck(name: 'frontend' | 'backend', needVersion: string, curtVersion: string): boolean;
73
77
  }
@@ -1,10 +1,10 @@
1
1
  import { CommentData } from '../../types/artalk-data';
2
- export declare type CommentNode = {
2
+ export type CommentNode = {
3
3
  id: number;
4
4
  comment: CommentData;
5
5
  children: CommentNode[];
6
6
  parent?: CommentNode;
7
7
  level: number;
8
8
  };
9
- export declare type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC';
9
+ export type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC';
10
10
  export declare function makeNestCommentNodeList(srcData: CommentData[], sortBy?: SortByType, nestMax?: number): CommentNode[];
@@ -0,0 +1,16 @@
1
+ import ListLite from './list-lite';
2
+ /** 界面刷新 */
3
+ export declare function refreshUI(list: ListLite): void;
4
+ /** 构建错误提示界面 */
5
+ export declare function renderErrorDialog(list: ListLite, errMsg: string, errData?: any): HTMLElement;
6
+ /** 版本检测弹窗 */
7
+ export declare function versionCheckDialog(list: ListLite, feVer: string, beVer: string): boolean;
8
+ /** 评论排序方式选择下拉菜单 */
9
+ export declare function renderDropdown(conf: {
10
+ $dropdownWrap: HTMLElement;
11
+ dropdownList: [string, () => void][];
12
+ }): void;
13
+ /** 删除评论排序方式选择下拉菜单 */
14
+ export declare function removeDropdown(conf: {
15
+ $dropdownWrap: HTMLElement;
16
+ }): void;
@@ -20,7 +20,6 @@ export default class List extends ListLite {
20
20
  /** 管理员设置页面信息 */
21
21
  adminPageEditSave(): void;
22
22
  showUnreadBadge(count: number): void;
23
- private dropdownLoaded;
24
23
  /** 初始化选择下拉层 */
25
24
  protected initDropdown(): void;
26
25
  updateUnread(notifies: NotifyData[]): void;
@@ -0,0 +1,12 @@
1
+ import { IPgHolderConf, TPgMode } from '../index';
2
+ declare const Adaptors: Record<TPgMode, IPgAdaptor<any>>;
3
+ export default Adaptors;
4
+ export interface IPgAdaptor<T> {
5
+ instance: T;
6
+ el: HTMLElement;
7
+ createInstance(conf: IPgHolderConf): [T, HTMLElement];
8
+ setLoading(val: boolean): void;
9
+ update(offset: number, total: number): void;
10
+ next(): void;
11
+ showErr?(msg: string): void;
12
+ }
@@ -0,0 +1,9 @@
1
+ import Pagination from '../../../components/pagination';
2
+ import { IPgAdaptor } from '.';
3
+ interface IPaginationAdaptor extends IPgAdaptor<Pagination> {
4
+ }
5
+ /**
6
+ * 翻页形式的分页
7
+ */
8
+ declare const _default: IPaginationAdaptor;
9
+ export default _default;
@@ -0,0 +1,10 @@
1
+ import ReadMoreBtn from '../../../components/read-more-btn';
2
+ import { IPgAdaptor } from '.';
3
+ interface IReadMoreAdaptor extends IPgAdaptor<ReadMoreBtn> {
4
+ autoLoadScrollEvent?: () => void;
5
+ }
6
+ /**
7
+ * 阅读更多形式的分页
8
+ */
9
+ declare const _default: IReadMoreAdaptor;
10
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { IPgHolderConf, TPgMode } from '.';
2
+ /**
3
+ * 分页方式持有者(调度器)
4
+ */
5
+ export default class PgHolder {
6
+ private conf;
7
+ constructor(conf: IPgHolderConf);
8
+ getAdaptor(): import("./adaptors").IPgAdaptor<any>;
9
+ init(): void;
10
+ setLoading(val: boolean): void;
11
+ update(offset: number, total: number): void;
12
+ getEl(): HTMLElement;
13
+ showErr(msg: string): void;
14
+ setMode(val: TPgMode): void;
15
+ next(): void;
16
+ }
@@ -0,0 +1,10 @@
1
+ import ListLite from '../list-lite';
2
+ import PgHolder from './holder';
3
+ export type TPgMode = 'pagination' | 'read-more';
4
+ export interface IPgHolderConf {
5
+ list: ListLite;
6
+ mode: TPgMode;
7
+ total: number;
8
+ pageSize: number;
9
+ }
10
+ export default PgHolder;
@@ -0,0 +1,46 @@
1
+ import Context from '../types/context';
2
+ import CheckerLauncher from './lib/checker';
3
+ import Api from './api';
4
+ import Editor from './editor';
5
+ import SidebarLayer from './layer/sidebar-layer';
6
+ import ListLite from './list/list-lite';
7
+ /**
8
+ * Services
9
+ *
10
+ * @description
11
+ * 当函数有返回值时,该值将自动添加到 Context 类作为一个 private 成员的值,
12
+ * 这个成员的名称与函数名对应。可在 Context 类中访问该对象(同事类)。
13
+ */
14
+ declare const services: {
15
+ i18n(ctx: Context): void;
16
+ markdown(): void;
17
+ user(ctx: Context): {
18
+ ctx?: Context | undefined;
19
+ data: import("../types/artalk-config").LocalUser;
20
+ setContext(ctx: Context): void;
21
+ update(obj?: Partial<import("../types/artalk-config").LocalUser>): void;
22
+ logout(): void;
23
+ checkHasBasicUserInfo(): boolean;
24
+ };
25
+ api(ctx: Context): Api;
26
+ checkerLauncher(ctx: Context): CheckerLauncher;
27
+ editor(ctx: Context): Editor;
28
+ list(ctx: Context): ListLite | undefined;
29
+ layer(ctx: Context): void;
30
+ sidebarLayer(ctx: Context): SidebarLayer;
31
+ eventsDefault(ctx: Context): void;
32
+ darkMode(ctx: Context): void;
33
+ };
34
+ export default services;
35
+ type TServiceImps = typeof services;
36
+ type TObjectWithFuncs = {
37
+ [k: string]: (...args: any) => any;
38
+ };
39
+ type TKeysOnlyReturn<T extends TObjectWithFuncs, V> = {
40
+ [K in keyof T]: ReturnType<T[K]> extends V ? K : never;
41
+ }[keyof T];
42
+ type TOmitConditions = TKeysOnlyReturn<TServiceImps, void>;
43
+ type TServiceInjectors = Omit<TServiceImps, TOmitConditions>;
44
+ export type TInjectedServices = {
45
+ [K in keyof TServiceInjectors]: ReturnType<TServiceInjectors[K]>;
46
+ };
@@ -26,7 +26,7 @@ export default interface ArtalkConfig {
26
26
  /** 发送按钮文字 */
27
27
  sendBtn: string
28
28
 
29
- /** 评论框旅行(显示在待回复评论后面) */
29
+ /** 评论框穿梭(显示在待回复评论后面) */
30
30
  editorTravel: boolean
31
31
 
32
32
  /** 表情包 */
@@ -60,6 +60,9 @@ export default interface ArtalkConfig {
60
60
 
61
61
  /** 子评论区域限高 */
62
62
  children: number
63
+
64
+ /** 滚动限高 */
65
+ scrollable: boolean
63
66
  }
64
67
 
65
68
  /** 评论投票按钮 */
@@ -77,7 +80,7 @@ export default interface ArtalkConfig {
77
80
  /** PV 数绑定元素 Selector */
78
81
  pvEl: string
79
82
 
80
- /** 暗黑模式 */
83
+ /** 夜间模式 */
81
84
  darkMode: boolean|'auto'
82
85
 
83
86
  /** 请求超时(单位:秒) */
@@ -44,6 +44,9 @@ export interface CommentData {
44
44
  /** 徽章颜色 */
45
45
  badge_color?: string
46
46
 
47
+ /** IP 归属地 */
48
+ ip_region?: string
49
+
47
50
  /** 是否允许回复 */
48
51
  is_allow_reply?: boolean
49
52
 
@@ -221,7 +224,4 @@ export interface ApiVersionData {
221
224
 
222
225
  /** API 程序 CommitHash */
223
226
  commit_hash: string
224
-
225
- /** API 程序要求前端最小版本 */
226
- fe_min_version: string
227
227
  }
@@ -1,15 +1,14 @@
1
- import { marked as libMarked } from 'marked'
2
1
  import ArtalkConfig from './artalk-config'
3
2
  import { CommentData, NotifyData } from './artalk-data'
4
3
  import { EventPayloadMap, Event, EventScopeType, Handler } from './event'
5
4
  import { internal as internalLocales, I18n } from '../src/i18n'
6
5
  import Api from '../src/api'
7
6
  import User from '../src/lib/user'
8
- import Editor from '../src/editor'
9
7
  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'
8
+ import { SidebarShowPayload } from '../src/layer/sidebar-layer'
9
+ import { CheckerCaptchaPayload, CheckerPayload } from '../src/lib/checker'
10
+ import type { TMarked } from '../src/lib/marked'
11
+ import type { TInjectedServices } from '../src/service'
13
12
 
14
13
  /**
15
14
  * Context 接口
@@ -17,31 +16,25 @@ import CheckerLauncher, { CheckerCaptchaPayload, CheckerPayload } from '../src/l
17
16
  * (面向接口的编程)
18
17
  */
19
18
  export default interface ContextApi {
20
- /** Context 唯一标识 */
21
- cid: number
22
-
23
19
  /** Artalk 根元素对象 */
24
20
  $root: HTMLElement
25
21
 
22
+ /** 依赖注入函数 */
23
+ inject<K extends keyof TInjectedServices>(depName: K, obj: TInjectedServices[K]): void
24
+
25
+ /** 获取依赖对象 */
26
+ get<K extends keyof TInjectedServices>(depName: K): TInjectedServices[K]
27
+
26
28
  /** 配置对象 */
29
+ // TODO 修改为 getConf() 和 setConf()
27
30
  conf: ArtalkConfig
28
31
 
29
- /** 用户对象 */
30
- user: User
31
-
32
32
  /** marked 依赖对象 */
33
- markedInstance?: typeof libMarked
33
+ getMarkedInstance(): TMarked | undefined
34
34
 
35
35
  /** marked 内容替换器 */
36
36
  markedReplacers: ((raw: string) => string)[]
37
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
38
  /** 获取 API 以供 HTTP 请求 */
46
39
  getApi(): Api
47
40
 
@@ -141,7 +134,7 @@ export default interface ContextApi {
141
134
  /** i18n 翻译 */
142
135
  $t(key: keyof I18n, args?: {[key: string]: string}): string
143
136
 
144
- /** 设置暗黑模式 */
137
+ /** 设置夜间模式 */
145
138
  setDarkMode(darkMode: boolean): void
146
139
 
147
140
  /** 更新配置 */
@@ -0,0 +1 @@
1
+ declare const ARTALK_LITE: boolean