artalk 2.6.4 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Artalk.css +1 -1
- package/dist/Artalk.es.js +7794 -7483
- package/dist/Artalk.iife.js +1 -1
- package/dist/Artalk.js +1 -1
- package/dist/ArtalkLite.css +1 -1
- package/dist/ArtalkLite.es.js +5587 -5276
- package/dist/ArtalkLite.iife.js +1 -1
- package/dist/ArtalkLite.js +1 -1
- package/dist/src/api/{api-base.d.ts → _base.d.ts} +3 -7
- package/dist/src/api/_options.d.ts +19 -0
- package/dist/src/api/{request.d.ts → _request.d.ts} +3 -3
- package/dist/src/api/admin.d.ts +1 -1
- package/dist/src/api/captcha.d.ts +1 -1
- package/dist/src/api/comment.d.ts +2 -2
- package/dist/src/api/index.d.ts +2 -4
- package/dist/src/api/page.d.ts +3 -3
- package/dist/src/api/site.d.ts +2 -2
- package/dist/src/api/system.d.ts +13 -3
- package/dist/src/api/upload.d.ts +1 -1
- package/dist/src/api/user.d.ts +2 -2
- package/dist/src/artalk.d.ts +14 -37
- package/dist/src/comment/actions.d.ts +1 -1
- package/dist/src/comment/comment.d.ts +3 -4
- package/dist/src/comment/render.d.ts +21 -3
- package/dist/src/comment/renders/actions.d.ts +2 -2
- package/dist/src/comment/renders/avatar.d.ts +2 -2
- package/dist/src/comment/renders/content.d.ts +2 -2
- package/dist/src/comment/renders/header.d.ts +2 -2
- package/dist/src/comment/renders/index.d.ts +2 -2
- package/dist/src/comment/renders/pending.d.ts +2 -2
- package/dist/src/comment/renders/reply-at.d.ts +2 -2
- package/dist/src/comment/renders/reply-to.d.ts +2 -2
- package/dist/src/components/action-btn.d.ts +3 -5
- package/dist/src/{lib → components}/checker/admin.d.ts +1 -1
- package/dist/src/{lib → components}/checker/captcha-renders.d.ts +1 -1
- package/dist/src/{lib → components}/checker/captcha.d.ts +1 -1
- package/dist/src/{lib → components}/checker/index.d.ts +10 -7
- package/dist/src/components/dark-mode.d.ts +2 -0
- package/dist/src/components/dialog.d.ts +1 -3
- package/dist/src/components/error-dialog.d.ts +8 -0
- package/dist/src/components/pagination.d.ts +4 -3
- package/dist/src/components/read-more-btn.d.ts +3 -3
- package/dist/src/config.d.ts +24 -8
- package/dist/src/context.d.ts +16 -35
- package/dist/src/data.d.ts +27 -0
- package/dist/src/defaults.d.ts +1 -1
- package/dist/src/editor/editor.d.ts +14 -61
- package/dist/src/editor/state.d.ts +20 -0
- package/dist/src/i18n/zh-CN.d.ts +1 -1
- package/dist/src/layer/index.d.ts +4 -3
- package/dist/src/layer/layer-manager.d.ts +9 -0
- package/dist/src/layer/layer.d.ts +8 -28
- package/dist/src/layer/scrollbar-helper.d.ts +5 -0
- package/dist/src/layer/sidebar-layer.d.ts +6 -6
- package/dist/src/layer/wrap.d.ts +13 -0
- package/dist/src/lib/component.d.ts +3 -8
- package/dist/src/lib/event-manager.d.ts +28 -0
- package/dist/src/lib/highlight.d.ts +1 -0
- package/dist/src/lib/marked-renderer.d.ts +4 -0
- package/dist/src/lib/marked.d.ts +4 -2
- package/dist/src/lib/sanitizer.d.ts +1 -0
- package/dist/src/lib/ui.d.ts +3 -2
- package/dist/src/lib/user.d.ts +8 -5
- package/dist/src/lib/utils.d.ts +11 -5
- package/dist/src/list/comment.d.ts +3 -0
- package/dist/src/list/layout.d.ts +23 -0
- package/dist/src/list/list.d.ts +13 -25
- package/dist/src/list/{list-nest.d.ts → nest.d.ts} +1 -1
- package/dist/src/list/page.d.ts +2 -0
- package/dist/src/list/paginator/index.d.ts +22 -7
- package/dist/src/list/paginator/read-more.d.ts +18 -0
- package/dist/src/list/paginator/up-down.d.ts +14 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/plugins/admin-only-elem.d.ts +2 -0
- package/dist/src/plugins/conf-remoter.d.ts +2 -0
- package/dist/src/plugins/dark-mode.d.ts +2 -0
- package/dist/src/plugins/editor/_kit.d.ts +27 -0
- package/dist/src/plugins/editor/_plug.d.ts +29 -0
- package/dist/src/plugins/editor/_sample.d.ts +5 -0
- package/dist/src/plugins/editor/closable.d.ts +7 -0
- package/dist/src/{editor/plugs/emoticons-plug.d.ts → plugins/editor/emoticons.d.ts} +10 -16
- package/dist/src/plugins/editor/header-event.d.ts +6 -0
- package/dist/src/plugins/editor/header-link.d.ts +6 -0
- package/dist/src/plugins/editor/header-user.d.ts +16 -0
- package/dist/src/plugins/editor/index.d.ts +6 -0
- package/dist/src/plugins/editor/local-storage.d.ts +6 -0
- package/dist/src/plugins/editor/mover.d.ts +6 -0
- package/dist/src/plugins/editor/preview.d.ts +7 -0
- package/dist/src/plugins/editor/state-edit.d.ts +11 -0
- package/dist/src/plugins/editor/state-reply.d.ts +8 -0
- package/dist/src/plugins/editor/submit-add.d.ts +18 -0
- package/dist/src/plugins/editor/submit-btn.d.ts +5 -0
- package/dist/src/plugins/editor/submit.d.ts +17 -0
- package/dist/src/plugins/editor/textarea.d.ts +8 -0
- package/dist/src/plugins/editor/upload.d.ts +9 -0
- package/dist/src/plugins/editor-kit.d.ts +42 -0
- package/dist/src/plugins/index.d.ts +2 -0
- package/dist/src/plugins/list/copyright.d.ts +2 -0
- package/dist/src/plugins/list/count.d.ts +2 -0
- package/dist/src/plugins/list/dropdown.d.ts +2 -0
- package/dist/src/plugins/list/error-dialog.d.ts +2 -0
- package/dist/src/plugins/list/fetch.d.ts +2 -0
- package/dist/src/plugins/list/goto-first.d.ts +3 -0
- package/dist/src/plugins/list/goto.d.ts +2 -0
- package/dist/src/plugins/list/index.d.ts +3 -0
- package/dist/src/plugins/list/loading.d.ts +2 -0
- package/dist/src/plugins/list/no-comment.d.ts +2 -0
- package/dist/src/plugins/list/reach-bottom.d.ts +2 -0
- package/dist/src/plugins/list/sidebar-btn.d.ts +2 -0
- package/dist/src/plugins/list/time-ticking.d.ts +3 -0
- package/dist/src/plugins/list/unread-badge.d.ts +2 -0
- package/dist/src/plugins/list/unread.d.ts +2 -0
- package/dist/src/plugins/list/with-editor.d.ts +2 -0
- package/dist/src/plugins/markdown.d.ts +2 -0
- package/dist/src/plugins/stat.d.ts +13 -0
- package/dist/src/plugins/version-check.d.ts +2 -0
- package/dist/src/service.d.ts +19 -23
- package/dist/tests/e2e/comment-add.spec.d.ts +1 -0
- package/dist/types/config.d.ts +110 -0
- package/dist/types/context.d.ts +56 -136
- package/dist/types/data.d.ts +194 -0
- package/dist/types/editor.d.ts +76 -0
- package/dist/types/event.d.ts +36 -25
- package/dist/types/index.d.ts +7 -0
- package/dist/types/plugin.d.ts +2 -0
- package/dist/types/sidebar.d.ts +3 -0
- package/package.json +5 -2
- package/src/api/_base.ts +18 -0
- package/src/api/_options.ts +25 -0
- package/src/api/{request.ts → _request.ts} +19 -18
- package/src/api/admin.ts +1 -1
- package/src/api/captcha.ts +1 -1
- package/src/api/comment.ts +4 -4
- package/src/api/index.ts +3 -12
- package/src/api/page.ts +5 -5
- package/src/api/site.ts +2 -2
- package/src/api/system.ts +19 -7
- package/src/api/upload.ts +3 -3
- package/src/api/user.ts +3 -3
- package/src/artalk.ts +49 -97
- package/src/comment/actions.ts +1 -4
- package/src/comment/comment.ts +9 -6
- package/src/comment/render.ts +27 -5
- package/src/comment/renders/actions.ts +45 -45
- package/src/comment/renders/avatar.ts +7 -7
- package/src/comment/renders/content.ts +18 -18
- package/src/comment/renders/header.ts +13 -13
- package/src/comment/renders/index.ts +3 -3
- package/src/comment/renders/pending.ts +5 -5
- package/src/comment/renders/reply-at.ts +8 -8
- package/src/comment/renders/reply-to.ts +13 -13
- package/src/components/action-btn.ts +11 -13
- package/src/{lib → components}/checker/admin.ts +6 -6
- package/src/{lib → components}/checker/captcha-renders.ts +7 -6
- package/src/{lib → components}/checker/captcha.ts +1 -1
- package/src/{lib → components}/checker/index.ts +21 -26
- package/src/components/dark-mode.ts +30 -0
- package/src/components/dialog.ts +4 -9
- package/src/components/error-dialog.ts +35 -0
- package/src/components/pagination.ts +10 -6
- package/src/components/read-more-btn.ts +7 -7
- package/src/config.ts +60 -6
- package/src/context.ts +39 -144
- package/src/data.ts +110 -0
- package/src/defaults.ts +1 -1
- package/src/editor/editor.ts +39 -152
- package/src/editor/state.ts +52 -0
- package/src/i18n/zh-CN.ts +1 -1
- package/src/layer/index.ts +4 -4
- package/src/layer/layer-manager.ts +32 -0
- package/src/layer/layer.ts +20 -144
- package/src/layer/scrollbar-helper.ts +24 -0
- package/src/layer/sidebar-layer.ts +74 -64
- package/src/layer/wrap.ts +77 -0
- package/src/lib/component.ts +4 -11
- package/src/lib/detect.ts +1 -1
- package/src/lib/event-manager.ts +47 -0
- package/src/lib/highlight.ts +5 -0
- package/src/lib/marked-renderer.ts +32 -0
- package/src/lib/marked.ts +43 -104
- package/src/lib/sanitizer.ts +57 -0
- package/src/lib/ui.ts +22 -15
- package/src/lib/user.ts +21 -16
- package/src/lib/utils.ts +29 -18
- package/src/list/comment.ts +20 -0
- package/src/list/layout.ts +120 -0
- package/src/list/list.html +3 -1
- package/src/list/list.ts +56 -200
- package/src/list/{list-nest.ts → nest.ts} +1 -1
- package/src/list/page.ts +97 -0
- package/src/list/paginator/index.ts +20 -8
- package/src/list/paginator/read-more.ts +67 -0
- package/src/list/paginator/up-down.ts +51 -0
- package/src/main.ts +2 -0
- package/src/plugins/admin-only-elem.ts +40 -0
- package/src/plugins/conf-remoter.ts +54 -0
- package/src/plugins/dark-mode.ts +12 -0
- package/src/plugins/editor/_kit.ts +57 -0
- package/src/plugins/editor/_plug.ts +60 -0
- package/src/plugins/editor/_sample.ts +8 -0
- package/src/plugins/editor/closable.ts +44 -0
- package/src/{editor/plugs/emoticons-plug.ts → plugins/editor/emoticons.ts} +51 -52
- package/src/plugins/editor/header-event.ts +35 -0
- package/src/plugins/editor/header-link.ts +31 -0
- package/src/plugins/editor/header-user.ts +98 -0
- package/src/plugins/editor/index.ts +40 -0
- package/src/plugins/editor/local-storage.ts +36 -0
- package/src/plugins/editor/mover.ts +29 -0
- package/src/plugins/editor/preview.ts +41 -0
- package/src/plugins/editor/state-edit.ts +116 -0
- package/src/plugins/editor/state-reply.ts +91 -0
- package/src/plugins/editor/submit-add.ts +33 -0
- package/src/plugins/editor/submit-btn.ts +25 -0
- package/src/plugins/editor/submit.ts +73 -0
- package/src/plugins/editor/textarea.ts +55 -0
- package/src/plugins/editor/upload.ts +145 -0
- package/src/plugins/editor-kit.ts +161 -0
- package/src/plugins/index.ts +16 -0
- package/src/plugins/list/copyright.ts +16 -0
- package/src/plugins/list/count.ts +31 -0
- package/src/plugins/list/dropdown.ts +95 -0
- package/src/plugins/list/error-dialog.ts +22 -0
- package/src/plugins/list/fetch.ts +64 -0
- package/src/plugins/list/goto-first.ts +23 -0
- package/src/plugins/list/goto.ts +72 -0
- package/src/plugins/list/index.ts +25 -0
- package/src/plugins/list/loading.ts +17 -0
- package/src/plugins/list/no-comment.ts +25 -0
- package/src/plugins/list/reach-bottom.ts +46 -0
- package/src/plugins/list/sidebar-btn.ts +39 -0
- package/src/plugins/list/time-ticking.ts +22 -0
- package/src/plugins/list/unread-badge.ts +26 -0
- package/src/plugins/list/unread.ts +38 -0
- package/src/plugins/list/with-editor.ts +59 -0
- package/src/plugins/markdown.ts +10 -0
- package/src/plugins/stat.ts +79 -0
- package/src/plugins/version-check.ts +37 -0
- package/src/service.ts +34 -61
- package/src/style/comment.scss +5 -7
- package/src/style/editor.scss +5 -0
- package/src/style/list.scss +1 -1
- package/types/{artalk-config.d.ts → config.ts} +16 -2
- package/types/context.ts +84 -0
- package/types/{artalk-data.d.ts → data.ts} +41 -0
- package/types/editor.ts +95 -0
- package/types/event.ts +40 -0
- package/types/index.ts +7 -0
- package/types/plugin.ts +3 -0
- package/types/sidebar.ts +3 -0
- package/dist/src/comment/render-ctx.d.ts +0 -23
- package/dist/src/editor/edit-mode.d.ts +0 -9
- package/dist/src/editor/funcs.d.ts +0 -2
- package/dist/src/editor/index.d.ts +0 -2
- package/dist/src/editor/mover.d.ts +0 -8
- package/dist/src/editor/plug-manager.d.ts +0 -17
- package/dist/src/editor/plugs/editor-plug.d.ts +0 -38
- package/dist/src/editor/plugs/header-input-plug.d.ts +0 -13
- package/dist/src/editor/plugs/preview-plug.d.ts +0 -10
- package/dist/src/editor/plugs/upload-plug.d.ts +0 -10
- package/dist/src/editor/reply.d.ts +0 -9
- package/dist/src/editor/submit.d.ts +0 -16
- package/dist/src/lib/dark-mode.d.ts +0 -4
- package/dist/src/lib/stat.d.ts +0 -15
- package/dist/src/list/index.d.ts +0 -2
- package/dist/src/list/list-lite.d.ts +0 -77
- package/dist/src/list/list-ui.d.ts +0 -16
- package/dist/src/list/paginator/adaptors/index.d.ts +0 -12
- package/dist/src/list/paginator/adaptors/pagination.d.ts +0 -9
- package/dist/src/list/paginator/adaptors/read-more.d.ts +0 -10
- package/dist/src/list/paginator/holder.d.ts +0 -16
- package/dist/types/artalk-config.d.ts +0 -139
- package/dist/types/artalk-data.d.ts +0 -230
- package/dist/types/plug.d.ts +0 -4
- package/src/api/api-base.ts +0 -27
- package/src/comment/render-ctx.ts +0 -30
- package/src/editor/edit-mode.ts +0 -105
- package/src/editor/funcs.ts +0 -150
- package/src/editor/index.ts +0 -3
- package/src/editor/mover.ts +0 -43
- package/src/editor/plug-manager.ts +0 -172
- package/src/editor/plugs/editor-plug.ts +0 -69
- package/src/editor/plugs/header-input-plug.ts +0 -79
- package/src/editor/plugs/preview-plug.ts +0 -44
- package/src/editor/plugs/upload-plug.ts +0 -122
- package/src/editor/reply.ts +0 -62
- package/src/editor/submit.ts +0 -99
- package/src/lib/dark-mode.ts +0 -48
- package/src/lib/stat.ts +0 -71
- package/src/list/index.ts +0 -3
- package/src/list/list-lite.ts +0 -424
- package/src/list/list-ui.ts +0 -137
- package/src/list/paginator/adaptors/index.ts +0 -21
- package/src/list/paginator/adaptors/pagination.ts +0 -42
- package/src/list/paginator/adaptors/read-more.ts +0 -56
- package/src/list/paginator/holder.ts +0 -56
- package/types/context.d.ts +0 -142
- package/types/event.d.ts +0 -28
- package/types/plug.d.ts +0 -4
- /package/src/{editor/plugs/emoticons-plug.scss → plugins/editor/emoticons.scss} +0 -0
- /package/src/{editor/plugs/preview-plug.scss → plugins/editor/preview.scss} +0 -0
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import * as Utils from '@/lib/utils'
|
|
2
|
-
import Editor from '../editor'
|
|
3
|
-
import User from '../../lib/user'
|
|
4
|
-
import EditorPlug from './editor-plug'
|
|
5
|
-
|
|
6
|
-
export default class UploadPlug extends EditorPlug {
|
|
7
|
-
public static Name = 'upload'
|
|
8
|
-
|
|
9
|
-
public $imgUploadInput?: HTMLInputElement
|
|
10
|
-
|
|
11
|
-
/** 允许的图片格式 */
|
|
12
|
-
allowImgExts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'svg', 'webp']
|
|
13
|
-
|
|
14
|
-
public constructor(editor: Editor) {
|
|
15
|
-
super(editor)
|
|
16
|
-
|
|
17
|
-
this.$imgUploadInput = document.createElement('input')
|
|
18
|
-
this.$imgUploadInput.type = 'file'
|
|
19
|
-
this.$imgUploadInput.style.display = 'none'
|
|
20
|
-
this.$imgUploadInput.accept = this.allowImgExts.map(o => `.${o}`).join(',')
|
|
21
|
-
|
|
22
|
-
const $btn = this.registerBtn(`${this.ctx.$t('image')}`)
|
|
23
|
-
$btn.after(this.$imgUploadInput)
|
|
24
|
-
$btn.onclick = () => {
|
|
25
|
-
// 选择图片
|
|
26
|
-
const $input = this.$imgUploadInput!
|
|
27
|
-
$input.onchange = () => {
|
|
28
|
-
(async () => { // 解决阻塞 UI 问题
|
|
29
|
-
if (!$input.files || $input.files.length === 0) return
|
|
30
|
-
const file = $input.files[0]
|
|
31
|
-
this.uploadImg(file)
|
|
32
|
-
})()
|
|
33
|
-
}
|
|
34
|
-
$input.click() // 显示选择图片对话框
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (!this.ctx.conf.imgUpload) {
|
|
38
|
-
this.getBtn()!.setAttribute('atk-only-admin-show', '')
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// 统一从 FileList 获取文件并上传图片方法
|
|
42
|
-
const uploadFromFileList = (files?: FileList) => {
|
|
43
|
-
if (!files) return
|
|
44
|
-
|
|
45
|
-
for (let i = 0; i < files.length; i++) {
|
|
46
|
-
const file = files[i]
|
|
47
|
-
this.uploadImg(file)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// 拖拽图片
|
|
52
|
-
// @link https://developer.mozilla.org/zh-CN/docs/Web/API/HTML_Drag_and_Drop_API/File_drag_and_drop
|
|
53
|
-
// 阻止浏览器的默认释放行为
|
|
54
|
-
this.editor.getUI().$textarea.addEventListener('dragover', (evt) => {
|
|
55
|
-
evt.stopPropagation()
|
|
56
|
-
evt.preventDefault()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
this.editor.getUI().$textarea.addEventListener('drop', (evt) => {
|
|
60
|
-
const files = evt.dataTransfer?.files
|
|
61
|
-
if (files?.length) {
|
|
62
|
-
evt.preventDefault()
|
|
63
|
-
uploadFromFileList(files)
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
// 粘贴图片
|
|
68
|
-
this.editor.getUI().$textarea.addEventListener('paste', (evt) => {
|
|
69
|
-
const files = evt.clipboardData?.files
|
|
70
|
-
if (files?.length) {
|
|
71
|
-
evt.preventDefault()
|
|
72
|
-
uploadFromFileList(files)
|
|
73
|
-
}
|
|
74
|
-
})
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
public async uploadImg(file: File) {
|
|
78
|
-
const fileExt = /[^.]+$/.exec(file.name)
|
|
79
|
-
if (!fileExt || !this.allowImgExts.includes(fileExt[0])) return
|
|
80
|
-
|
|
81
|
-
// 未登录提示
|
|
82
|
-
if (!User.checkHasBasicUserInfo()) {
|
|
83
|
-
this.editor.showNotify(this.ctx.$t('uploadLoginMsg'), 'w')
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// 插入图片前换一行
|
|
88
|
-
let insertPrefix = '\n'
|
|
89
|
-
if (this.editor.getUI().$textarea.value.trim() === '') insertPrefix = ''
|
|
90
|
-
|
|
91
|
-
// 插入占位加载文字
|
|
92
|
-
const uploadPlaceholderTxt = `${insertPrefix}`
|
|
93
|
-
this.editor.insertContent(uploadPlaceholderTxt)
|
|
94
|
-
|
|
95
|
-
// 上传图片
|
|
96
|
-
let resp: any
|
|
97
|
-
try {
|
|
98
|
-
if (!this.ctx.conf.imgUploader) {
|
|
99
|
-
// 使用 Artalk 进行图片上传
|
|
100
|
-
resp = await this.ctx.getApi().upload.imgUpload(file)
|
|
101
|
-
} else {
|
|
102
|
-
// 使用自定义的图片上传器
|
|
103
|
-
resp = {img_url: await this.ctx.conf.imgUploader(file)}
|
|
104
|
-
}
|
|
105
|
-
} catch (err: any) {
|
|
106
|
-
console.error(err)
|
|
107
|
-
this.editor.showNotify(`${this.ctx.$t('uploadFail')},${err.msg}`, 'e')
|
|
108
|
-
}
|
|
109
|
-
if (!!resp && resp.img_url) {
|
|
110
|
-
let imgURL = resp.img_url as string
|
|
111
|
-
|
|
112
|
-
// 若为相对路径,加上 artalk server
|
|
113
|
-
if (!Utils.isValidURL(imgURL)) imgURL = Utils.getURLBasedOnApi(this.ctx, imgURL)
|
|
114
|
-
|
|
115
|
-
// 上传成功插入图片
|
|
116
|
-
this.editor.setContent(this.editor.getUI().$textarea.value.replace(uploadPlaceholderTxt, `${insertPrefix}`))
|
|
117
|
-
} else {
|
|
118
|
-
// 上传失败删除加载文字
|
|
119
|
-
this.editor.setContent(this.editor.getUI().$textarea.value.replace(uploadPlaceholderTxt, ''))
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
package/src/editor/reply.ts
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { CommentData } from '~/types/artalk-data'
|
|
2
|
-
import Editor from './editor'
|
|
3
|
-
import * as Utils from '../lib/utils'
|
|
4
|
-
import * as Ui from '../lib/ui'
|
|
5
|
-
|
|
6
|
-
export interface ReplyManager {
|
|
7
|
-
editor: Editor
|
|
8
|
-
comment?: CommentData
|
|
9
|
-
setReply(comment: CommentData, $comment: HTMLElement, scroll?: boolean): void
|
|
10
|
-
cancelReply(): void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function createReplyManager(editor: Editor): ReplyManager {
|
|
14
|
-
const m: ReplyManager = {
|
|
15
|
-
editor,
|
|
16
|
-
comment: undefined,
|
|
17
|
-
setReply: (c, $, s) => setReply(m, c, $, s),
|
|
18
|
-
cancelReply: () => cancelReply(m)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return m
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function setReply(m: ReplyManager, commentData: CommentData, $comment: HTMLElement, scroll = true) {
|
|
25
|
-
m.editor.cancelEditComment()
|
|
26
|
-
cancelReply(m)
|
|
27
|
-
|
|
28
|
-
const ui = m.editor.getUI()
|
|
29
|
-
if (!ui.$sendReply) {
|
|
30
|
-
ui.$sendReply = Utils.createElement(
|
|
31
|
-
`<div class="atk-send-reply">` +
|
|
32
|
-
`${m.editor.$t('reply')} ` +
|
|
33
|
-
`<span class="atk-text"></span><span class="atk-cancel">×</span>` +
|
|
34
|
-
`</div>`
|
|
35
|
-
)
|
|
36
|
-
ui.$sendReply.querySelector<HTMLElement>('.atk-text')!.innerText = `@${commentData.nick}`
|
|
37
|
-
ui.$sendReply.addEventListener('click', () => {
|
|
38
|
-
m.editor.cancelReply()
|
|
39
|
-
})
|
|
40
|
-
ui.$textareaWrap.append(ui.$sendReply)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
m.comment = commentData
|
|
44
|
-
m.editor.travel($comment)
|
|
45
|
-
|
|
46
|
-
if (scroll) Ui.scrollIntoView(ui.$el)
|
|
47
|
-
|
|
48
|
-
ui.$textarea.focus()
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function cancelReply(m: ReplyManager) {
|
|
52
|
-
if (!m.comment) return
|
|
53
|
-
|
|
54
|
-
const ui = m.editor.getUI()
|
|
55
|
-
if (ui.$sendReply) {
|
|
56
|
-
ui.$sendReply.remove()
|
|
57
|
-
ui.$sendReply = undefined
|
|
58
|
-
}
|
|
59
|
-
m.comment = undefined
|
|
60
|
-
|
|
61
|
-
m.editor.travelBack()
|
|
62
|
-
}
|
package/src/editor/submit.ts
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import type { CommentData } from '~/types/artalk-data'
|
|
2
|
-
import Editor from './editor'
|
|
3
|
-
import User from '../lib/user'
|
|
4
|
-
|
|
5
|
-
export interface SubmitManager {
|
|
6
|
-
editor: Editor
|
|
7
|
-
do: () => Promise<void>
|
|
8
|
-
customs: CustomSubmit[]
|
|
9
|
-
registerCustom(c: CustomSubmit): void
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function createSubmitManager(editor: Editor) {
|
|
13
|
-
const m: SubmitManager = {
|
|
14
|
-
editor,
|
|
15
|
-
do: () => Do(m),
|
|
16
|
-
customs: [],
|
|
17
|
-
registerCustom: (c) => { m.customs.push(c) }
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return m
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async function Do(m: SubmitManager) {
|
|
24
|
-
if (m.editor.getFinalContent().trim() === '') {
|
|
25
|
-
m.editor.focus()
|
|
26
|
-
return
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const custom = m.customs.find(o => o.activeCond())
|
|
30
|
-
|
|
31
|
-
m.editor.ctx.trigger('editor-submit')
|
|
32
|
-
m.editor.showLoading()
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
// pre submit
|
|
36
|
-
if (custom?.pre) custom.pre()
|
|
37
|
-
|
|
38
|
-
let nComment: CommentData
|
|
39
|
-
|
|
40
|
-
// submit request
|
|
41
|
-
if (custom?.req) nComment = await custom.req()
|
|
42
|
-
else nComment = await reqAdd(m)
|
|
43
|
-
|
|
44
|
-
// post submit
|
|
45
|
-
if (custom?.post) custom.post(nComment)
|
|
46
|
-
else postSubmitAdd(m, nComment)
|
|
47
|
-
} catch (err: any) {
|
|
48
|
-
// submit error
|
|
49
|
-
console.error(err)
|
|
50
|
-
m.editor.showNotify(`${m.editor.$t('commentFail')},${err.msg || String(err)}`, 'e')
|
|
51
|
-
return
|
|
52
|
-
} finally {
|
|
53
|
-
m.editor.hideLoading()
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
m.editor.reset() // 复原编辑器
|
|
57
|
-
m.editor.ctx.trigger('editor-submitted')
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
interface CustomSubmit {
|
|
61
|
-
activeCond: () => void
|
|
62
|
-
pre?: () => void
|
|
63
|
-
req?: () => Promise<CommentData>
|
|
64
|
-
post?: (nComment: CommentData) => void
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// ================== Submit Add =======================
|
|
68
|
-
function getSubmitAddParams(m: SubmitManager) {
|
|
69
|
-
const { nick, email, link } = User.data
|
|
70
|
-
const conf = m.editor.ctx.conf
|
|
71
|
-
const reply = m.editor.getReplyManager()?.comment
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
content: m.editor.getFinalContent(),
|
|
75
|
-
nick, email, link,
|
|
76
|
-
rid: (!reply) ? 0 : reply.id,
|
|
77
|
-
page_key: (!reply) ? conf.pageKey : reply.page_key,
|
|
78
|
-
page_title: (!reply) ? conf.pageTitle : undefined,
|
|
79
|
-
site_name: (!reply) ? conf.site : reply.site_name
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async function reqAdd(m: SubmitManager) {
|
|
84
|
-
const nComment = await m.editor.ctx.getApi().comment.add({
|
|
85
|
-
...getSubmitAddParams(m)
|
|
86
|
-
})
|
|
87
|
-
return nComment
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function postSubmitAdd(m: SubmitManager, commentNew: CommentData) {
|
|
91
|
-
// 回复不同页面的评论,跳转到新页面
|
|
92
|
-
const reply = m.editor.getReplyManager()
|
|
93
|
-
const conf = m.editor.ctx.conf
|
|
94
|
-
if (!!reply?.comment && reply.comment.page_key !== conf.pageKey) {
|
|
95
|
-
window.open(`${reply.comment.page_url}#atk-comment-${commentNew.id}`)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
m.editor.ctx.insertComment(commentNew)
|
|
99
|
-
}
|
package/src/lib/dark-mode.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type Context from '~/types/context'
|
|
2
|
-
import { getLayerWrap } from '../layer'
|
|
3
|
-
|
|
4
|
-
const darkModeMedia = window.matchMedia('(prefers-color-scheme: dark)')
|
|
5
|
-
let darkModeAutoFunc: (evt: MediaQueryListEvent) => void
|
|
6
|
-
|
|
7
|
-
export function syncDarkModeConf(ctx: Context) {
|
|
8
|
-
setDarkMode(ctx, ctx.conf.darkMode, false) // ref `conf.darkMode` data, so no need to `alterConf`
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function setDarkMode(ctx: Context, darkMode: boolean|'auto', alterConf = true) {
|
|
12
|
-
const apply = (d: boolean) => {
|
|
13
|
-
updateClassName(ctx, d)
|
|
14
|
-
if (alterConf) alterCtxConf(ctx, d)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (darkMode === 'auto') {
|
|
18
|
-
if (!darkModeAutoFunc) { // 自动切换夜间模式,事件监听
|
|
19
|
-
darkModeAutoFunc = (evt) => apply(evt.matches)
|
|
20
|
-
darkModeMedia.addEventListener('change', darkModeAutoFunc)
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
apply(darkModeMedia.matches)
|
|
24
|
-
} else {
|
|
25
|
-
// if the type of darkMode is boolean
|
|
26
|
-
if (darkModeAutoFunc) // 解除事件监听绑定
|
|
27
|
-
darkModeMedia.removeEventListener('change', darkModeAutoFunc)
|
|
28
|
-
|
|
29
|
-
apply(darkMode)
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function alterCtxConf(ctx: Context, darkMode: boolean) {
|
|
34
|
-
ctx.conf.darkMode = darkMode
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const DarkModeClassName = 'atk-dark-mode'
|
|
38
|
-
export function updateClassName(ctx: Context, darkMode: boolean) {
|
|
39
|
-
if (darkMode) ctx.$root.classList.add(DarkModeClassName)
|
|
40
|
-
else ctx.$root.classList.remove(DarkModeClassName)
|
|
41
|
-
|
|
42
|
-
// for Layer
|
|
43
|
-
const { $wrap: $layerWrap } = getLayerWrap()
|
|
44
|
-
if ($layerWrap) {
|
|
45
|
-
if (darkMode) $layerWrap.classList.add(DarkModeClassName)
|
|
46
|
-
else $layerWrap.classList.remove(DarkModeClassName)
|
|
47
|
-
}
|
|
48
|
-
}
|
package/src/lib/stat.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import ContextApi from '~/types/context'
|
|
2
|
-
import ArtalkPlug from '~/types/plug'
|
|
3
|
-
|
|
4
|
-
export interface CountConf {
|
|
5
|
-
ctx: ContextApi
|
|
6
|
-
|
|
7
|
-
/** 是否增加当前页面 PV 数 */
|
|
8
|
-
pvAdd?: boolean
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export const PvCountWidget: ArtalkPlug = (ctx: ContextApi) => {
|
|
12
|
-
if (!ctx.conf.useBackendConf) {
|
|
13
|
-
// 不使用后端配置,在 Artalk 实例被创建后,立刻初始化
|
|
14
|
-
initCountWidget({ ctx, pvAdd: true })
|
|
15
|
-
} else {
|
|
16
|
-
// 若使用后端配置,需待配置成功获取后 (来自后端设定的 pvEl 等),再初始化
|
|
17
|
-
ctx.on('list-loaded', () => {
|
|
18
|
-
initCountWidget({ ctx, pvAdd: true })
|
|
19
|
-
})
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** 初始化评论数和 PV 数量展示元素 */
|
|
24
|
-
export async function initCountWidget(p: CountConf) {
|
|
25
|
-
// 评论数
|
|
26
|
-
const countEl = p.ctx.conf.countEl
|
|
27
|
-
if (countEl && document.querySelector(countEl)) {
|
|
28
|
-
handleStatCount(p, { api: 'page_comment', countEl })
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// PV
|
|
32
|
-
const curtPagePvNum = p.pvAdd ? await p.ctx.getApi().page.pv() : undefined
|
|
33
|
-
const pvEl = p.ctx.conf.pvEl
|
|
34
|
-
if (pvEl && document.querySelector(pvEl)) {
|
|
35
|
-
handleStatCount(p, {
|
|
36
|
-
api: 'page_pv',
|
|
37
|
-
countEl: pvEl,
|
|
38
|
-
curtPageCount: curtPagePvNum,
|
|
39
|
-
})
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export async function handleStatCount(
|
|
44
|
-
p: CountConf,
|
|
45
|
-
args: {
|
|
46
|
-
api: 'page_pv' | 'page_comment'
|
|
47
|
-
countEl: string
|
|
48
|
-
curtPageCount?: number
|
|
49
|
-
}
|
|
50
|
-
) {
|
|
51
|
-
let pageCounts: { [key: string]: number } = {}
|
|
52
|
-
|
|
53
|
-
// 当前页面的统计数
|
|
54
|
-
const curtPageKey = p.ctx.conf.pageKey
|
|
55
|
-
if (args.curtPageCount) pageCounts[curtPageKey] = args.curtPageCount
|
|
56
|
-
|
|
57
|
-
// 查询其他页面的统计数
|
|
58
|
-
let queryPageKeys = Array.from(document.querySelectorAll(args.countEl))
|
|
59
|
-
.map((e) => e.getAttribute('data-page-key') || curtPageKey)
|
|
60
|
-
.filter((pageKey) => pageCounts[pageKey] === undefined)
|
|
61
|
-
queryPageKeys = [...new Set(queryPageKeys)] // 去重
|
|
62
|
-
if (queryPageKeys.length > 0) {
|
|
63
|
-
const counts: any = await p.ctx.getApi().page.stat(args.api, queryPageKeys)
|
|
64
|
-
pageCounts = { ...pageCounts, ...counts }
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
document.querySelectorAll(args.countEl).forEach((el) => {
|
|
68
|
-
const pageKey = el.getAttribute('data-page-key') || curtPageKey
|
|
69
|
-
el.innerHTML = `${Number(pageCounts[pageKey] || 0)}`
|
|
70
|
-
})
|
|
71
|
-
}
|
package/src/list/index.ts
DELETED