artalk 2.3.4 → 2.4.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 (98) hide show
  1. package/dist/Artalk.css +1 -1
  2. package/dist/Artalk.es.js +3171 -3008
  3. package/dist/Artalk.iife.js +1 -1
  4. package/dist/Artalk.js +1 -1
  5. package/dist/ArtalkLite.css +1 -1
  6. package/dist/ArtalkLite.es.js +3124 -2980
  7. package/dist/ArtalkLite.iife.js +1 -1
  8. package/dist/ArtalkLite.js +1 -1
  9. package/dist/src/api/admin.d.ts +10 -0
  10. package/dist/src/api/api-base.d.ts +14 -0
  11. package/dist/src/api/captcha.d.ts +14 -0
  12. package/dist/src/api/comment.d.ts +29 -0
  13. package/dist/src/api/index.d.ts +31 -0
  14. package/dist/src/api/page.d.ts +22 -0
  15. package/dist/src/api/request.d.ts +12 -0
  16. package/dist/src/api/site.d.ts +17 -0
  17. package/dist/src/api/system.d.ts +13 -0
  18. package/dist/src/api/upload.d.ts +11 -0
  19. package/dist/src/api/user.d.ts +28 -0
  20. package/dist/src/artalk.d.ts +58 -0
  21. package/dist/src/comment/actions.d.ts +17 -0
  22. package/dist/src/comment/comment.d.ts +67 -0
  23. package/dist/src/comment/index.d.ts +2 -0
  24. package/dist/src/comment/render.d.ts +76 -0
  25. package/dist/src/components/action-btn.d.ts +52 -0
  26. package/dist/src/components/dialog.d.ts +18 -0
  27. package/dist/src/components/pagination.d.ts +30 -0
  28. package/dist/src/components/read-more-btn.d.ts +33 -0
  29. package/dist/src/context.d.ts +72 -0
  30. package/dist/src/defaults.d.ts +3 -0
  31. package/dist/src/editor/editor.d.ts +84 -0
  32. package/dist/src/editor/index.d.ts +2 -0
  33. package/dist/src/editor/plugs/editor-plug.d.ts +26 -0
  34. package/dist/src/editor/plugs/emoticons-plug.d.ts +36 -0
  35. package/dist/src/editor/plugs/header-input-plug.d.ts +13 -0
  36. package/dist/src/editor/plugs/preview-plug.d.ts +10 -0
  37. package/dist/src/editor/plugs/upload-plug.d.ts +10 -0
  38. package/dist/src/i18n/en.d.ts +69 -0
  39. package/dist/src/i18n/index.d.ts +294 -0
  40. package/dist/src/i18n/zh-CN.d.ts +3 -0
  41. package/dist/src/layer/index.d.ts +3 -0
  42. package/dist/src/layer/layer.d.ts +32 -0
  43. package/dist/src/layer/sidebar-layer.d.ts +20 -0
  44. package/dist/src/lib/checker/admin-checker.d.ts +3 -0
  45. package/dist/src/lib/checker/captcha-checker.d.ts +3 -0
  46. package/dist/src/lib/checker/index.d.ts +42 -0
  47. package/dist/src/lib/component.d.ts +12 -0
  48. package/dist/src/lib/detect.d.ts +10 -0
  49. package/dist/src/lib/stat.d.ts +15 -0
  50. package/dist/src/lib/ui.d.ts +23 -0
  51. package/dist/src/lib/user.d.ts +13 -0
  52. package/dist/src/lib/utils.d.ts +39 -0
  53. package/dist/src/list/index.d.ts +2 -0
  54. package/dist/src/list/list-lite.d.ts +63 -0
  55. package/dist/src/list/list-nest.d.ts +10 -0
  56. package/dist/src/list/list.d.ts +26 -0
  57. package/dist/src/main.d.ts +2 -0
  58. package/dist/types/artalk-config.d.ts +132 -0
  59. package/dist/types/artalk-data.d.ts +204 -0
  60. package/dist/types/context.d.ts +146 -0
  61. package/dist/types/event.d.ts +28 -0
  62. package/dist/types/global.d.ts +0 -0
  63. package/dist/types/plug.d.ts +4 -0
  64. package/index.html +3 -3
  65. package/package.json +5 -5
  66. package/src/api/admin.ts +18 -0
  67. package/src/api/api-base.ts +27 -0
  68. package/src/api/captcha.ts +24 -0
  69. package/src/api/comment.ts +84 -0
  70. package/src/api/index.ts +25 -366
  71. package/src/api/page.ts +85 -0
  72. package/src/api/site.ts +51 -0
  73. package/src/api/system.ts +39 -0
  74. package/src/api/upload.ts +29 -0
  75. package/src/api/user.ts +75 -0
  76. package/src/artalk.ts +52 -46
  77. package/src/comment/actions.ts +3 -3
  78. package/src/comment/comment.ts +6 -9
  79. package/src/comment/render.ts +76 -40
  80. package/src/components/pagination.ts +0 -1
  81. package/src/context.ts +31 -31
  82. package/src/editor/editor.ts +2 -4
  83. package/src/editor/plugs/header-input-plug.ts +1 -1
  84. package/src/editor/plugs/upload-plug.ts +1 -1
  85. package/src/i18n/index.ts +117 -2
  86. package/src/layer/sidebar-layer.ts +1 -3
  87. package/src/lib/checker/admin-checker.ts +1 -1
  88. package/src/lib/checker/captcha-checker.ts +3 -3
  89. package/src/lib/stat.ts +2 -2
  90. package/src/lib/ui.ts +6 -0
  91. package/src/list/list-lite.ts +25 -25
  92. package/src/list/list.ts +3 -4
  93. package/src/style/main.less +6 -0
  94. package/types/context.d.ts +4 -1
  95. package/types/global.d.ts +0 -2
  96. package/vite-base.config.ts +9 -5
  97. package/vite.config.ts +1 -1
  98. package/types/index.d.ts +0 -3
@@ -0,0 +1,10 @@
1
+ import ApiBase from './api-base';
2
+ /**
3
+ * 管理员 API
4
+ */
5
+ export default class AdminApi extends ApiBase {
6
+ /** 缓存清除 */
7
+ cacheFlushAll(): Promise<unknown>;
8
+ /** 缓存预热 */
9
+ cacheWarmUp(): Promise<unknown>;
10
+ }
@@ -0,0 +1,14 @@
1
+ import Context from '../../types/context';
2
+ import Api from '.';
3
+ declare abstract class ApiBase {
4
+ protected api: Api;
5
+ protected ctx: Context;
6
+ constructor(api: Api, ctx: Context);
7
+ protected POST<T>(path: string, data?: {
8
+ [key: string]: any;
9
+ }): Promise<T>;
10
+ protected Fetch(path: string, init: RequestInit, timeout?: number): Promise<any>;
11
+ }
12
+ interface ApiBase {
13
+ }
14
+ export default ApiBase;
@@ -0,0 +1,14 @@
1
+ import ApiBase from './api-base';
2
+ /**
3
+ * 验证码 API
4
+ */
5
+ export default class CaptchaApi extends ApiBase {
6
+ /** 验证码 · 获取 */
7
+ captchaGet(): Promise<string>;
8
+ /** 验证码 · 检验 */
9
+ captchaCheck(value: string): Promise<string>;
10
+ /** 验证码 · 状态 */
11
+ captchaStatus(): Promise<{
12
+ is_pass: boolean;
13
+ }>;
14
+ }
@@ -0,0 +1,29 @@
1
+ import { CommentData, ListData } from '../../types/artalk-data';
2
+ import ApiBase from './api-base';
3
+ /**
4
+ * 评论 API
5
+ */
6
+ export default class CommentApi extends ApiBase {
7
+ /** 评论 · 获取 */
8
+ get(offset: number, pageSize: number, flatMode?: boolean, paramsEditor?: (params: any) => void): Promise<ListData>;
9
+ /** 评论 · 创建 */
10
+ add(comment: {
11
+ nick: string;
12
+ email: string;
13
+ link: string;
14
+ content: string;
15
+ rid: number;
16
+ page_key: string;
17
+ page_title?: string;
18
+ site_name?: string;
19
+ }): Promise<CommentData>;
20
+ /** 评论 · 修改 */
21
+ commentEdit(data: Partial<CommentData>): Promise<CommentData>;
22
+ /** 评论 · 删除 */
23
+ commentDel(commentID: number, siteName?: string): Promise<unknown>;
24
+ /** 投票 */
25
+ vote(targetID: number, type: string): Promise<{
26
+ up: number;
27
+ down: number;
28
+ }>;
29
+ }
@@ -0,0 +1,31 @@
1
+ import Context from '../../types/context';
2
+ import comment from './comment';
3
+ import page from './page';
4
+ import site from './site';
5
+ import user from './user';
6
+ import system from './system';
7
+ import captcha from './captcha';
8
+ import admin from './admin';
9
+ import upload from './upload';
10
+ declare const ApiComponents: {
11
+ comment: typeof comment;
12
+ page: typeof page;
13
+ site: typeof site;
14
+ user: typeof user;
15
+ system: typeof system;
16
+ captcha: typeof captcha;
17
+ admin: typeof admin;
18
+ upload: typeof upload;
19
+ };
20
+ declare class Api {
21
+ protected ctx: Context;
22
+ baseURL: string;
23
+ constructor(ctx: Context);
24
+ }
25
+ declare type TC = typeof ApiComponents;
26
+ declare type AC = {
27
+ [K in keyof TC]: InstanceType<TC[K]>;
28
+ };
29
+ interface Api extends AC {
30
+ }
31
+ export default Api;
@@ -0,0 +1,22 @@
1
+ import { PageData, CommentData } from '../../types/artalk-data';
2
+ import ApiBase from './api-base';
3
+ /**
4
+ * 页面 API
5
+ */
6
+ export default class PageApi extends ApiBase {
7
+ /** 页面 · 获取 */
8
+ pageGet(siteName?: string, offset?: number, limit?: number): Promise<{
9
+ pages: PageData[];
10
+ total: number;
11
+ }>;
12
+ /** 页面 · 修改 */
13
+ pageEdit(data: PageData): Promise<PageData>;
14
+ /** 页面 · 删除 */
15
+ pageDel(pageKey: string, siteName?: string): Promise<unknown>;
16
+ /** 页面 · 数据更新 */
17
+ pageFetch(id?: number, siteName?: string, getStatus?: boolean): Promise<any>;
18
+ /** PV */
19
+ pv(): Promise<number>;
20
+ /** 统计 */
21
+ 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[]>;
22
+ }
@@ -0,0 +1,12 @@
1
+ import Context from '../../types/context';
2
+ /** 公共请求函数 */
3
+ export declare function Fetch(ctx: Context, input: RequestInfo, init: RequestInit, timeout?: number): Promise<any>;
4
+ /** 公共 POST 请求 */
5
+ export declare function POST<T>(ctx: Context, url: string, data?: {
6
+ [key: string]: any;
7
+ }): Promise<T>;
8
+ /** 公共 GET 请求 (无 GET 方式 API) */
9
+ /** 对象转 FormData */
10
+ export declare function ToFormData(object: {
11
+ [key: string]: any;
12
+ }): FormData;
@@ -0,0 +1,17 @@
1
+ import { SiteData } from '../../types/artalk-data';
2
+ import ApiBase from './api-base';
3
+ /**
4
+ * 站点 API
5
+ */
6
+ export default class SiteApi extends ApiBase {
7
+ /** 站点 · 获取 */
8
+ siteGet(): Promise<SiteData[]>;
9
+ /** 站点 · 创建 */
10
+ siteAdd(name: string, urls: string): Promise<SiteData>;
11
+ /** 站点 · 修改 */
12
+ siteEdit(data: SiteData): Promise<SiteData>;
13
+ /** 站点 · 删除 */
14
+ siteDel(id: number, delContent?: boolean): Promise<unknown>;
15
+ /** 导出 */
16
+ export(): Promise<any>;
17
+ }
@@ -0,0 +1,13 @@
1
+ import ArtalkConfig from '../../types/artalk-config';
2
+ import ApiBase from './api-base';
3
+ /**
4
+ * 系统 API
5
+ */
6
+ export default class SystemApi extends ApiBase {
7
+ /** 获取配置 */
8
+ conf(): Promise<ArtalkConfig>;
9
+ /** 获取配置数据 */
10
+ getSettings(): Promise<string>;
11
+ /** 保存配置数据 */
12
+ saveSettings(yamlStr: string): Promise<boolean>;
13
+ }
@@ -0,0 +1,11 @@
1
+ import ApiBase from './api-base';
2
+ /**
3
+ * 上传 API
4
+ */
5
+ export default class UploadApi extends ApiBase {
6
+ /** 图片上传 */
7
+ imgUpload(file: File): Promise<{
8
+ img_file: string;
9
+ img_url: string;
10
+ }>;
11
+ }
@@ -0,0 +1,28 @@
1
+ import { UserData, NotifyData } from '../../types/artalk-data';
2
+ import ApiBase from './api-base';
3
+ /**
4
+ * 用户 API
5
+ */
6
+ export default class UserApi extends ApiBase {
7
+ /** 用户 · 登录 */
8
+ login(name: string, email: string, password: string): Promise<string>;
9
+ /** 用户 · 获取 */
10
+ userGet(name: string, email: string): {
11
+ req: Promise<{
12
+ user: UserData | null;
13
+ is_login: boolean;
14
+ unread: NotifyData[];
15
+ unread_count: any;
16
+ }>;
17
+ abort: () => void;
18
+ };
19
+ /** 用户 · 登录状态 */
20
+ loginStatus(): Promise<{
21
+ is_login: boolean;
22
+ is_admin: boolean;
23
+ }>;
24
+ /** 用户 · 注销 */
25
+ logout(): Promise<unknown>;
26
+ /** 已读标记 */
27
+ markRead(notifyKey: string, readAll?: boolean): Promise<unknown>;
28
+ }
@@ -0,0 +1,58 @@
1
+ import ArtalkConfig from '../types/artalk-config';
2
+ import { EventPayloadMap, Handler } from '../types/event';
3
+ import ArtalkPlug from '../types/plug';
4
+ import Context from '../types/context';
5
+ import ListLite from './list/list-lite';
6
+ /**
7
+ * Artalk
8
+ *
9
+ * @website https://artalk.js.org
10
+ */
11
+ export default class Artalk {
12
+ static ListLite: typeof ListLite;
13
+ static readonly defaults: ArtalkConfig;
14
+ conf: ArtalkConfig;
15
+ ctx: Context;
16
+ $root: HTMLElement;
17
+ /** Plugins (in global scope) */
18
+ protected static Plugins: ArtalkPlug[];
19
+ /** Plugins (in a instance scope) */
20
+ protected instancePlugins: ArtalkPlug[];
21
+ /** 禁用的组件 */
22
+ static DisabledComponents: string[];
23
+ constructor(customConf: Partial<ArtalkConfig>);
24
+ /** 组件初始化 */
25
+ private initComponents;
26
+ /** 基本配置初始化 */
27
+ static HandelBaseConf(customConf: Partial<ArtalkConfig>): ArtalkConfig;
28
+ /** 初始化组件根据远程加载的配置 */
29
+ private loadConfRemoteAndInitComponents;
30
+ /** 远程加载配置 */
31
+ private loadConfRemote;
32
+ /** 事件绑定初始化 */
33
+ private initEventBind;
34
+ /** 语言初始化 */
35
+ private initLocale;
36
+ /** Layer 初始化 */
37
+ private initLayer;
38
+ /** 暗黑模式初始化 */
39
+ private initDarkMode;
40
+ /** 监听事件 */
41
+ on<K extends keyof EventPayloadMap>(name: K, handler: Handler<EventPayloadMap[K]>): void;
42
+ /** 解除监听事件 */
43
+ off<K extends keyof EventPayloadMap>(name: K, handler: Handler<EventPayloadMap[K]>): void;
44
+ /** 触发事件 */
45
+ trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K]): void;
46
+ /** 重新加载 */
47
+ reload(): void;
48
+ /** 设置暗黑模式 */
49
+ setDarkMode(darkMode: boolean): void;
50
+ /** Use Plugin (specific instance) */
51
+ use(plugin: ArtalkPlug): void;
52
+ /** Use Plugin (static method for global scope) */
53
+ static use(plugin: ArtalkPlug): void;
54
+ /** @deprecated Please replace it with lowercase function name `use(...)`. */
55
+ static Use(plugin: ArtalkPlug): void;
56
+ /** 装载数量统计元素 */
57
+ static LoadCountWidget(customConf: Partial<ArtalkConfig>): void;
58
+ }
@@ -0,0 +1,17 @@
1
+ import Comment from './comment';
2
+ import ActionBtn from '../components/action-btn';
3
+ export default class CommentActions {
4
+ private comment;
5
+ private get ctx();
6
+ private get data();
7
+ private get cConf();
8
+ constructor(comment: Comment);
9
+ /** 投票操作 */
10
+ vote(type: 'up' | 'down'): void;
11
+ /** 管理员 - 评论状态修改 */
12
+ adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn): void;
13
+ /** 管理员 - 评论删除 */
14
+ adminDelete(btnElem: ActionBtn): void;
15
+ /** 快速跳转到该评论 */
16
+ goToReplyComment(): void;
17
+ }
@@ -0,0 +1,67 @@
1
+ import { CommentData } from '../../types/artalk-data';
2
+ import Context from '../../types/context';
3
+ import Component from '../lib/component';
4
+ import CommentRender from './render';
5
+ import CommentActions from './actions';
6
+ export interface CommentConf {
7
+ isUnread?: boolean;
8
+ openURL?: string;
9
+ isFlatMode: boolean;
10
+ replyTo?: CommentData;
11
+ afterRender?: () => void;
12
+ openEvt?: () => void;
13
+ onReplyBtnClick?: Function;
14
+ onDelete?: Function;
15
+ }
16
+ export default class Comment extends Component {
17
+ private renderInstance;
18
+ private actionInstance;
19
+ private data;
20
+ private cConf;
21
+ private parent;
22
+ private children;
23
+ private nestCurt;
24
+ private nestMax;
25
+ constructor(ctx: Context, data: CommentData, conf: CommentConf);
26
+ /** 渲染 UI */
27
+ render(): void;
28
+ /** 获取评论操作实例对象 */
29
+ getActions(): CommentActions;
30
+ /** 获取评论渲染器实例对象 */
31
+ getRender(): CommentRender;
32
+ /** 获取评论数据 */
33
+ getData(): CommentData;
34
+ /** 设置数据 */
35
+ setData(data: CommentData): void;
36
+ /** 获取父评论 */
37
+ getParent(): Comment | null;
38
+ /** 获取所有子评论 */
39
+ getChildren(): Comment[];
40
+ /** 获取当前嵌套层数 */
41
+ getNestCurt(): number;
42
+ /** 判断是否为根评论 */
43
+ getIsRoot(): boolean;
44
+ /** 获取评论 ID */
45
+ getID(): number;
46
+ /** 置入子评论 */
47
+ putChild(childC: Comment, insertMode?: 'append' | 'prepend'): void;
48
+ /** 获取存放子评论的元素对象 */
49
+ getChildrenEl(): HTMLElement;
50
+ /** 获取所有父评论 */
51
+ getParents(): Comment[];
52
+ /** 获取评论元素对象 */
53
+ getEl(): HTMLElement;
54
+ /** 获取 Gravatar 头像 URL */
55
+ getGravatarURL(): string;
56
+ /** 获取评论 markdown 解析后的内容 */
57
+ getContentMarked(): string;
58
+ /** 获取格式化后的日期 */
59
+ getDateFormatted(): string;
60
+ /** 获取用户 UserAgent 信息 */
61
+ getUserUA(): {
62
+ browser: string;
63
+ os: string;
64
+ };
65
+ /** 获取配置 */
66
+ getConf(): CommentConf;
67
+ }
@@ -0,0 +1,2 @@
1
+ import Comment from './comment';
2
+ export default Comment;
@@ -0,0 +1,76 @@
1
+ import ActionBtn from '../components/action-btn';
2
+ import Comment from './comment';
3
+ export default class CommentRender {
4
+ private comment;
5
+ private get ctx();
6
+ private get data();
7
+ private get cConf();
8
+ $el: HTMLElement;
9
+ $main: HTMLElement;
10
+ $header: HTMLElement;
11
+ $headerNick: HTMLElement;
12
+ $headerBadgeWrap: HTMLElement;
13
+ $body: HTMLElement;
14
+ $content: HTMLElement;
15
+ private $childrenWrap;
16
+ $actions: HTMLElement;
17
+ voteBtnUp?: ActionBtn;
18
+ voteBtnDown?: ActionBtn;
19
+ $replyTo?: HTMLElement;
20
+ $replyAt?: HTMLElement;
21
+ constructor(comment: Comment);
22
+ render(): HTMLElement;
23
+ /** 初始化 - 评论头像 */
24
+ private renderAvatar;
25
+ /** 初始化 - 评论信息 */
26
+ private renderHeader;
27
+ private renderHeader_Nick;
28
+ private renderHeader_VerifyBadge;
29
+ private renderHeader_Date;
30
+ private renderHeader_UABadge;
31
+ /** 初始化 - 评论内容 */
32
+ private renderContent;
33
+ /** 初始化 - 层级嵌套模式显示 At */
34
+ private renderReplyAt;
35
+ /** 初始化 - 回复的对象 */
36
+ private renderReplyTo;
37
+ /** 初始化 - 待审核状态 */
38
+ private renderPending;
39
+ /** 初始化 - 评论操作按钮 */
40
+ private renderActions;
41
+ private renderActions_Vote;
42
+ private renderActions_Reply;
43
+ private renderActions_Collapse;
44
+ private renderActions_Moderator;
45
+ private renderActions_Pin;
46
+ private renderActions_Edit;
47
+ private renderActions_Del;
48
+ /** 内容限高检测 */
49
+ checkHeightLimit(): void;
50
+ /** 目标内容限高检测 */
51
+ checkHeightLimitArea(area: 'children' | 'content'): void;
52
+ /** 移除限高 */
53
+ private heightLimitRemove;
54
+ /** 子评论区域移除限高 */
55
+ heightLimitRemoveForChildren(): void;
56
+ /** 内容限高区域新增 */
57
+ private heightLimitAdd;
58
+ /** 渐出动画 */
59
+ playFadeAnim(): void;
60
+ /** 渐出动画 · 评论内容区域 */
61
+ playFadeAnimForBody(): void;
62
+ /** 获取子评论 Wrap */
63
+ getChildrenWrap(): HTMLElement | null;
64
+ /** 初始化子评论区域 Wrap */
65
+ renderChildrenWrap(): HTMLElement;
66
+ /** 恢复原有的子评论区域 Wrap */
67
+ recoveryChildrenWrap(): void;
68
+ /** 设置已读 */
69
+ setUnread(val: boolean): void;
70
+ /** 设置为可点击的评论 */
71
+ setOpenable(val: boolean): void;
72
+ /** 设置点击评论打开置顶 URL */
73
+ setOpenURL(url: string): void;
74
+ /** 设置点击评论时的操作 */
75
+ setOpenAction(action: () => void): void;
76
+ }
@@ -0,0 +1,52 @@
1
+ import Context from '../../types/context';
2
+ interface ActionBtnConf {
3
+ /** 按钮文字 (动态/静态) */
4
+ text: (() => string) | string;
5
+ /** 仅管理员可用 */
6
+ adminOnly?: boolean;
7
+ /** 确认操作 */
8
+ confirm?: boolean;
9
+ /** 确认时提示文字 */
10
+ confirmText?: string;
11
+ }
12
+ /**
13
+ * 通用操作按钮
14
+ */
15
+ export default class ActionBtn {
16
+ private ctx;
17
+ private conf;
18
+ $el: HTMLElement;
19
+ isLoading: boolean;
20
+ msgRecTimer?: number;
21
+ msgRecTimerFunc?: Function;
22
+ get isMessaging(): boolean;
23
+ isConfirming: boolean;
24
+ confirmRecTimer?: number;
25
+ /** 构造函数 */
26
+ constructor(ctx: Context, conf: ActionBtnConf | string | (() => string));
27
+ /** 将按钮装载到指定元素 */
28
+ appendTo(dom: HTMLElement): this;
29
+ /** 获取按钮文字(动态/静态) */
30
+ private getText;
31
+ /** 设置点击事件 */
32
+ setClick(func: Function): void;
33
+ /** 文字刷新(动态/静态) */
34
+ updateText(text?: (() => string) | string): void;
35
+ /** 设置加载状态 */
36
+ setLoading(value: boolean, loadingText?: string): void;
37
+ /** 错误消息 */
38
+ setError(text: string): void;
39
+ /** 警告消息 */
40
+ setWarn(text: string): void;
41
+ /** 成功消息 */
42
+ setSuccess(text: string): void;
43
+ /** 设置消息 */
44
+ setMsg(text: string, className?: string, duringTime?: number, after?: Function): void;
45
+ /** 设置消息复原操作定时器 */
46
+ private setMsgRecTimer;
47
+ /** 立刻触发器复原定时器 */
48
+ private fireMsgRecTimer;
49
+ /** 仅清除 timer */
50
+ private clearMsgRecTimer;
51
+ }
52
+ export {};
@@ -0,0 +1,18 @@
1
+ import Context from '../../types/context';
2
+ declare type BtnClickHandler = (btnEl: HTMLElement, dialog: Dialog) => boolean | void;
3
+ /**
4
+ * 对话框
5
+ */
6
+ export default class Dialog {
7
+ ctx: Context;
8
+ $el: HTMLElement;
9
+ $content: HTMLElement;
10
+ $actions: HTMLElement;
11
+ constructor(ctx: Context, contentEl: HTMLElement);
12
+ /** 按钮 · 确定 */
13
+ setYes(handler: BtnClickHandler): this;
14
+ /** 按钮 · 取消 */
15
+ setNo(handler: BtnClickHandler): this;
16
+ private onBtnClick;
17
+ }
18
+ export {};
@@ -0,0 +1,30 @@
1
+ export interface PaginationConf {
2
+ /** 每页条数 */
3
+ pageSize: number;
4
+ /** 回调函数 */
5
+ onChange: (offset: number) => void;
6
+ }
7
+ export default class Pagination {
8
+ private conf;
9
+ total: number;
10
+ $el: HTMLElement;
11
+ $input: HTMLInputElement;
12
+ inputTimer?: number;
13
+ $prevBtn: HTMLElement;
14
+ $nextBtn: HTMLElement;
15
+ page: number;
16
+ get pageSize(): number;
17
+ get offset(): number;
18
+ get maxPage(): number;
19
+ constructor(total: number, conf: PaginationConf);
20
+ update(offset: number, total: number): void;
21
+ setInput(page: number): void;
22
+ input(now?: boolean): void;
23
+ prev(): void;
24
+ next(): void;
25
+ change(page: number): void;
26
+ checkDisabled(): void;
27
+ keydown(e: KeyboardEvent): void;
28
+ /** 加载 */
29
+ setLoading(isLoading: boolean): void;
30
+ }
@@ -0,0 +1,33 @@
1
+ export interface ReadMoreBtnConf {
2
+ /** 回调函数 */
3
+ onClick: (offset: number) => void;
4
+ pageSize: number;
5
+ text?: string;
6
+ }
7
+ /**
8
+ * 阅读更多按钮
9
+ */
10
+ export default class ReadMoreBtn {
11
+ conf: ReadMoreBtnConf;
12
+ $el: HTMLElement;
13
+ private $loading;
14
+ private $text;
15
+ private offset;
16
+ private total;
17
+ private origText;
18
+ /** 是否有更多内容 */
19
+ get hasMore(): boolean;
20
+ constructor(conf: ReadMoreBtnConf);
21
+ click(): void;
22
+ /** 显示 */
23
+ show(): void;
24
+ /** 隐藏 */
25
+ hide(): void;
26
+ /** 加载 */
27
+ setLoading(isLoading: boolean): void;
28
+ /** 错误提示 */
29
+ showErr(errMsg: string): void;
30
+ /** 更新数据 */
31
+ update(offset: number, total: number): void;
32
+ checkDisabled(): void;
33
+ }
@@ -0,0 +1,72 @@
1
+ import { marked as libMarked } from 'marked';
2
+ import ArtalkConfig from '../types/artalk-config';
3
+ import { CommentData, NotifyData } from '../types/artalk-data';
4
+ import { I18n } from './i18n';
5
+ import User from './lib/user';
6
+ import ContextApi from '../types/context';
7
+ import Editor from './editor';
8
+ import Comment from './comment';
9
+ import ListLite from './list/list-lite';
10
+ import SidebarLayer, { SidebarShowPayload } from './layer/sidebar-layer';
11
+ import CheckerLauncher, { CheckerCaptchaPayload, CheckerPayload } from './lib/checker';
12
+ import Api from './api';
13
+ /**
14
+ * Artalk Context
15
+ */
16
+ export default class Context implements ContextApi {
17
+ private api;
18
+ private editor;
19
+ private list?;
20
+ private sidebarLayer;
21
+ private checkerLauncher;
22
+ cid: number;
23
+ conf: ArtalkConfig;
24
+ user: User;
25
+ $root: HTMLElement;
26
+ markedInstance?: typeof libMarked;
27
+ markedReplacers: ((raw: string) => string)[];
28
+ private commentList;
29
+ private eventList;
30
+ constructor(conf: ArtalkConfig, $root?: HTMLElement);
31
+ setApi(api: Api): void;
32
+ setEditor(editor: Editor): void;
33
+ setList(list: ListLite): void;
34
+ setSidebarLayer(sidebarLayer: SidebarLayer): void;
35
+ setCheckerLauncher(checkerLauncher: CheckerLauncher): void;
36
+ getApi(): Api;
37
+ getCommentList(): Comment[];
38
+ getCommentDataList(): CommentData[];
39
+ findComment(id: number): Comment | undefined;
40
+ deleteComment(_comment: number | Comment): void;
41
+ clearAllComments(): void;
42
+ insertComment(commentData: CommentData): void;
43
+ updateComment(commentData: CommentData): void;
44
+ replyComment(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void;
45
+ cancelReplyComment(): void;
46
+ editComment(commentData: CommentData, $comment: HTMLElement): void;
47
+ cancelEditComment(): void;
48
+ updateNotifies(notifies: NotifyData[]): void;
49
+ listReload(): void;
50
+ reload(): void;
51
+ listRefreshUI(): void;
52
+ listHashGotoCheck(): void;
53
+ editorOpen(): void;
54
+ editorClose(): void;
55
+ editorShowLoading(): void;
56
+ editorHideLoading(): void;
57
+ editorShowNotify(msg: any, type: any): void;
58
+ editorTravel($el: HTMLElement): void;
59
+ editorTravelBack(): void;
60
+ showSidebar(payload?: SidebarShowPayload): void;
61
+ hideSidebar(): void;
62
+ checkAdmin(payload: CheckerPayload): void;
63
+ checkCaptcha(payload: CheckerCaptchaPayload): void;
64
+ checkAdminShowEl(): void;
65
+ on(name: any, handler: any, scope?: any): void;
66
+ off(name: any, handler: any, scope?: any): void;
67
+ trigger(name: any, payload?: any, scope?: any): void;
68
+ $t(key: keyof I18n, args?: {
69
+ [key: string]: string;
70
+ }): string;
71
+ setDarkMode(darkMode: boolean): void;
72
+ }
@@ -0,0 +1,3 @@
1
+ import ArtalkConfig from '../types/artalk-config';
2
+ declare const defaults: ArtalkConfig;
3
+ export default defaults;