import { Marked } from 'marked'; import { MarkedOptions } from 'marked'; /** * 通用操作按钮 */ declare class ActionBtn { private opts; $el: HTMLElement; isLoading: boolean; msgRecTimer?: number; msgRecTimerFunc?: () => void; get isMessaging(): boolean; isConfirming: boolean; confirmRecTimer?: number; /** 构造函数 */ constructor(opts: ActionBtnOptions | string | (() => string)); /** 将按钮装载到指定元素 */ appendTo(dom: HTMLElement): this; /** 获取按钮文字(动态/静态) */ private getText; /** 设置点击事件 */ setClick(func: () => void): void; /** 文字刷新(动态/静态) */ updateText(text?: (() => string) | string): void; /** 设置加载状态 */ setLoading(value: boolean, loadingText?: string): void; /** 错误消息 */ setError(text: string): void; /** 警告消息 */ setWarn(text: string): void; /** 成功消息 */ setSuccess(text: string): void; /** 设置消息 */ setMsg(text: string, className?: string, duringTime?: number, after?: () => void): void; /** 设置消息复原操作定时器 */ private setMsgRecTimer; /** 立刻触发器复原定时器 */ private fireMsgRecTimer; /** 仅清除 timer */ private clearMsgRecTimer; } declare interface ActionBtnOptions { /** 按钮文字 (动态/静态) */ text: (() => string) | string; /** 仅管理员可用 */ adminOnly?: boolean; /** 确认操作 */ confirm?: boolean; /** 确认时提示文字 */ confirmText?: string; } declare class Api extends Api_2 { private _opts; constructor(opts: ApiOptions); /** * Get user info as params for request * * @returns Request params with user info */ getUserFields(): { name: string; email: string; } | undefined; } /** * @title Artalk API * @version 2.0 * @license MIT (https://github.com/ArtalkJS/Artalk/blob/master/LICENSE) * @baseUrl /api/v2 * @contact API Support (https://artalk.js.org) * * Artalk is a modern comment system based on Golang. */ declare class Api_2 extends HttpClient { auth: { /** * @description Login by email with verify code (Need send email verify code first) or password * * @tags Auth * @name LoginByEmail * @summary Login by email * @request POST:/auth/email/login * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ loginByEmail: (data: HandlerRequestAuthEmailLogin, params?: RequestParams) => Promise>; /** * @description Register by email and verify code (if user exists, will update user, like forget or change password. Need send email verify code first) * * @tags Auth * @name RegisterByEmail * @summary Register by email * @request POST:/auth/email/register * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ registerByEmail: (data: HandlerRequestAuthEmailRegister, params?: RequestParams) => Promise>; /** * @description Send email including verify code to user * * @tags Auth * @name SendVerifyEmail * @summary Send verify email * @request POST:/auth/email/send * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ sendVerifyEmail: (data: HandlerRequestAuthEmailSend, params?: RequestParams) => Promise>; /** * @description Get all users with same email, if there are more than one user with same email, need merge * * @tags Auth * @name CheckDataMerge * @summary Check data merge * @request GET:/auth/merge * @secure * @response `200` `HandlerResponseAuthDataMergeCheck` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ checkDataMerge: (params?: RequestParams) => Promise>; /** * @description This function is to solve the problem of multiple users with the same email address, should be called after user login and then check, and perform data merge. * * @tags Auth * @name ApplyDataMerge * @summary Apply data merge * @request POST:/auth/merge * @secure * @response `200` `HandlerResponseAuthDataMergeApply` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ applyDataMerge: (data: HandlerRequestAuthDataMergeApply, params?: RequestParams) => Promise>; }; cache: { /** * @description Flush all cache on the server * * @tags Cache * @name FlushCache * @summary Flush Cache * @request POST:/cache/flush * @secure * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ flushCache: (params?: RequestParams) => Promise>; /** * @description Cache warming helps you to pre-load the cache to improve the performance of the first request * * @tags Cache * @name WarmUpCache * @summary Warm-Up Cache * @request POST:/cache/warm_up * @secure * @response `200` `(HandlerMap & { msg?: string, })` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ warmUpCache: (params?: RequestParams) => Promise>; }; captcha: { /** * @description Get a base64 encoded captcha image or a HTML page to verify for user * * @tags Captcha * @name GetCaptcha * @summary Get Captcha * @request GET:/captcha * @response `200` `HandlerResponseCaptchaGet` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getCaptcha: (params?: RequestParams) => Promise>; /** * @description Get the status of the user's captcha verification * * @tags Captcha * @name GetCaptchaStatus * @summary Get Captcha Status * @request GET:/captcha/status * @response `200` `HandlerResponseCaptchaStatus` OK */ getCaptchaStatus: (params?: RequestParams) => Promise>; /** * @description Verify user enters correct captcha code * * @tags Captcha * @name VerifyCaptcha * @summary Verify Captcha * @request POST:/captcha/verify * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { img_data?: string, })` Forbidden */ verifyCaptcha: (data: HandlerParamsCaptchaVerify, params?: RequestParams) => Promise>; }; comments: { /** * @description Get a list of comments by some conditions * * @tags Comment * @name GetComments * @summary Get Comment List * @request GET:/comments * @secure * @response `200` `HandlerResponseCommentList` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getComments: (query: { /** The user email */ email?: string; /** Enable flat_mode */ flat_mode?: boolean; /** The limit for pagination */ limit?: number; /** The username */ name?: string; /** The offset for pagination */ offset?: number; /** The comment page_key */ page_key: string; /** The scope of comments */ scope?: "page" | "user" | "site"; /** Search keywords */ search?: string; /** The site name of your content scope */ site_name?: string; /** Sort by condition */ sort_by?: "date_asc" | "date_desc" | "vote"; /** Message center show type */ type?: "all" | "mentions" | "mine" | "pending"; /** Only show comments by admin */ view_only_admin?: boolean; }, params?: RequestParams) => Promise>; /** * @description Create a new comment * * @tags Comment * @name CreateComment * @summary Create Comment * @request POST:/comments * @secure * @response `200` `HandlerResponseCommentCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createComment: (comment: HandlerParamsCommentCreate, params?: RequestParams) => Promise>; /** * @description Get the detail of a comment by comment id * * @tags Comment * @name GetComment * @summary Get a comment * @request GET:/comments/{id} * @response `200` `HandlerResponseCommentGet` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getComment: (id: number, params?: RequestParams) => Promise>; /** * @description Update a specific comment * * @tags Comment * @name UpdateComment * @summary Update Comment * @request PUT:/comments/{id} * @secure * @response `200` `HandlerResponseCommentUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateComment: (id: number, comment: HandlerParamsCommentUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific comment * * @tags Comment * @name DeleteComment * @summary Delete Comment * @request DELETE:/comments/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteComment: (id: number, params?: RequestParams) => Promise>; }; conf: { /** * @description Get System Configs for UI * * @tags System * @name Conf * @summary Get System Configs * @request GET:/conf * @response `200` `CommonConfData` OK */ conf: (params?: RequestParams) => Promise>; /** * @description Get social login providers * * @tags System * @name GetSocialLoginProviders * @summary Get Social Login Providers * @request GET:/conf/auth/providers * @response `200` `HandlerResponseConfAuthProviders` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found */ getSocialLoginProviders: (params?: RequestParams) => Promise>; /** * @description Get Domain Info * * @tags System * @name GetDomain * @summary Get Domain Info * @request GET:/conf/domain * @response `200` `HandlerResponseConfDomain` OK */ getDomain: (query?: { /** Domain URL */ url?: string; }, params?: RequestParams) => Promise>; }; notifies: { /** * @description Get a list of notifies for user * * @tags Notify * @name GetNotifies * @summary Get Notifies * @request GET:/notifies * @response `200` `HandlerResponseNotifyList` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getNotifies: (query: { /** The user email */ email: string; /** The user name */ name: string; }, params?: RequestParams) => Promise>; /** * @description Mark all notifies as read for user * * @tags Notify * @name MarkAllNotifyRead * @summary Mark All Notifies as Read * @request POST:/notifies/read * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ markAllNotifyRead: (options: HandlerParamsNotifyReadAll, params?: RequestParams) => Promise>; /** * @description Mark specific notification as read for user * * @tags Notify * @name MarkNotifyRead * @summary Mark Notify as Read * @request POST:/notifies/{comment_id}/{notify_key} * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ markNotifyRead: (commentId: number, notifyKey: string, params?: RequestParams) => Promise>; }; pages: { /** * @description Get a list of pages by some conditions * * @tags Page * @name GetPages * @summary Get Page List * @request GET:/pages * @secure * @response `200` `HandlerResponsePageList` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ getPages: (query?: { /** The limit for pagination */ limit?: number; /** The offset for pagination */ offset?: number; /** Search keywords */ search?: string; /** The site name of your content scope */ site_name?: string; }, params?: RequestParams) => Promise>; /** * @description Fetch the data of all pages * * @tags Page * @name FetchAllPages * @summary Fetch All Pages Data * @request POST:/pages/fetch * @secure * @response `200` `HandlerMap` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ fetchAllPages: (options: HandlerParamsPageFetchAll, params?: RequestParams) => Promise>; /** * @description Get the status of the task of fetching all pages * * @tags Page * @name GetPageFetchStatus * @summary Get Pages Fetch Status * @request GET:/pages/fetch/status * @secure * @response `200` `HandlerResponsePageFetchStatus` OK */ getPageFetchStatus: (params?: RequestParams) => Promise>; /** * @description Increase and get the number of page views * * @tags Page * @name LogPv * @summary Increase Page Views (PV) * @request POST:/pages/pv * @response `200` `HandlerResponsePagePV` OK */ logPv: (page: HandlerParamsPagePV, params?: RequestParams) => Promise>; /** * @description Update a specific page * * @tags Page * @name UpdatePage * @summary Update Page * @request PUT:/pages/{id} * @secure * @response `200` `HandlerResponsePageUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updatePage: (id: number, page: HandlerParamsPageUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific page * * @tags Page * @name DeletePage * @summary Delete Page * @request DELETE:/pages/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deletePage: (id: number, params?: RequestParams) => Promise>; /** * @description Fetch the data of a specific page * * @tags Page * @name FetchPage * @summary Fetch Page Data * @request POST:/pages/{id}/fetch * @secure * @response `200` `HandlerResponsePageFetch` OK * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ fetchPage: (id: number, params?: RequestParams) => Promise>; }; sendEmail: { /** * @description Send an email to test the email sender * * @tags System * @name SendEmail * @summary Send Email * @request POST:/send_email * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `HandlerMap` Internal Server Error */ sendEmail: (email: HandlerParamsEmailSend, params?: RequestParams) => Promise>; }; settings: { /** * @description Get settings from app config file * * @tags System * @name GetSettings * @summary Get Settings * @request GET:/settings * @secure * @response `200` `HandlerResponseSettingGet` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getSettings: (params?: RequestParams) => Promise>; /** * @description Apply settings and restart the server * * @tags System * @name ApplySettings * @summary Save and apply Settings * @request PUT:/settings * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ applySettings: (settings: HandlerParamsSettingApply, params?: RequestParams) => Promise>; /** * @description Get config templates in different languages for rendering the settings page in the frontend * * @tags System * @name GetSettingsTemplate * @summary Get Settings Template * @request GET:/settings/template/{locale} * @secure * @response `200` `HandlerResponseSettingTemplate` OK */ getSettingsTemplate: (locale: string, params?: RequestParams) => Promise>; }; sites: { /** * @description Get a list of sites by some conditions * * @tags Site * @name GetSites * @summary Get Site List * @request GET:/sites * @secure * @response `200` `HandlerResponseSiteList` OK */ getSites: (params?: RequestParams) => Promise>; /** * @description Create a new site * * @tags Site * @name CreateSite * @summary Create Site * @request POST:/sites * @secure * @response `200` `HandlerResponseSiteCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createSite: (site: HandlerParamsSiteCreate, params?: RequestParams) => Promise>; /** * @description Update a specific site * * @tags Site * @name UpdateSite * @summary Update Site * @request PUT:/sites/{id} * @secure * @response `200` `HandlerResponseSiteUpdate` OK */ updateSite: (id: number, site: HandlerParamsSiteUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific site * * @tags Site * @name DeleteSite * @summary Site Delete * @request DELETE:/sites/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteSite: (id: number, params?: RequestParams) => Promise>; }; stats: { /** * @description Get the statistics of various data analysis * * @tags Statistic * @name GetStats * @summary Statistic * @request GET:/stats/{type} * @response `200` `CommonJSONResult` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ getStats: (type: "latest_comments" | "latest_pages" | "pv_most_pages" | "comment_most_pages" | "page_pv" | "site_pv" | "page_comment" | "site_comment" | "rand_comments" | "rand_pages", query?: { /** The limit for pagination */ limit?: number; /** multiple page keys separated by commas */ page_keys?: string; /** The site name of your content scope */ site_name?: string; }, params?: RequestParams) => Promise>; }; transfer: { /** * @description Export data from Artalk * * @tags Transfer * @name ExportArtrans * @summary Export Artrans * @request GET:/transfer/export * @secure * @response `200` `HandlerResponseTransferExport` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ exportArtrans: (params?: RequestParams) => Promise>; /** * @description Import data to Artalk * * @tags Transfer * @name ImportArtrans * @summary Import Artrans * @request POST:/transfer/import * @secure * @response `200` `string` OK */ importArtrans: (data: HandlerParamsTransferImport, params?: RequestParams) => Promise>; /** * @description Upload a file to prepare to import * * @tags Transfer * @name UploadArtrans * @summary Upload Artrans * @request POST:/transfer/upload * @secure * @response `200` `(HandlerResponseTransferUpload & { filename?: string, })` OK * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ uploadArtrans: (data: { /** * Upload file in preparation for import task * @format binary */ file: File; }, params?: RequestParams) => Promise>; }; upload: { /** * @description Upload file from this endpoint * * @tags Upload * @name Upload * @summary Upload * @request POST:/upload * @secure * @response `200` `HandlerResponseUpload` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ upload: (data: { /** * Upload file * @format binary */ file: File; }, params?: RequestParams) => Promise>; }; user: { /** * @description Get user info to prepare for login or check current user status * * @tags Auth * @name GetUser * @summary Get User Info * @request GET:/user * @secure * @response `200` `HandlerResponseUserInfo` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request */ getUser: (query?: { /** The user email */ email?: string; /** The username */ name?: string; }, params?: RequestParams) => Promise>; /** * @description Update user profile when user is logged in * * @tags Auth * @name UpdateProfile * @summary Update user profile * @request POST:/user * @secure * @response `200` `HandlerResponseUserInfoUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateProfile: (data: HandlerRequestUserInfoUpdate, params?: RequestParams) => Promise>; /** * @description Login user by name or email * * @tags Auth * @name Login * @summary Get Access Token * @request POST:/user/access_token * @response `200` `HandlerResponseUserLogin` OK * @response `400` `(HandlerMap & { data?: { need_name_select?: (string)[], }, msg?: string, })` Multiple users with the same email address are matched * @response `401` `(HandlerMap & { msg?: string, })` Unauthorized * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ login: (user: HandlerParamsUserLogin, params?: RequestParams) => Promise>; /** * @description Get user login status by header Authorization * * @tags Auth * @name GetUserStatus * @summary Get Login Status * @request GET:/user/status * @secure * @response `200` `HandlerResponseUserStatus` OK */ getUserStatus: (query?: { /** The user email */ email?: string; /** The username */ name?: string; }, params?: RequestParams) => Promise>; }; users: { /** * @description Create a new user * * @tags User * @name CreateUser * @summary Create User * @request POST:/users * @secure * @response `200` `HandlerResponseUserCreate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ createUser: (user: HandlerParamsUserCreate, params?: RequestParams) => Promise>; /** * @description Update a specific user * * @tags User * @name UpdateUser * @summary Update User * @request PUT:/users/{id} * @secure * @response `200` `HandlerResponseUserUpdate` OK * @response `400` `(HandlerMap & { msg?: string, })` Bad Request * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ updateUser: (id: number, user: HandlerParamsUserUpdate, params?: RequestParams) => Promise>; /** * @description Delete a specific user * * @tags User * @name DeleteUser * @summary Delete User * @request DELETE:/users/{id} * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ deleteUser: (id: number, params?: RequestParams) => Promise>; /** * @description Get a list of users by some conditions * * @tags User * @name GetUsers * @summary Get User List * @request GET:/users/{type} * @secure * @response `200` `HandlerResponseAdminUserList` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ getUsers: (type?: "all" | "admin" | "in_conf", query?: { /** The limit for pagination */ limit?: number; /** The offset for pagination */ offset?: number; /** Search keywords */ search?: string; }, params?: RequestParams) => Promise>; }; version: { /** * @description Get the version of Artalk * * @tags System * @name GetVersion * @summary Get Version Info * @request GET:/version * @response `200` `CommonApiVersionData` OK */ getVersion: (params?: RequestParams) => Promise>; }; votes: { /** * @description Sync the number of votes in the `comments` or `pages` data tables to keep them the same as the `votes` table * * @tags Vote * @name SyncVotes * @summary Sync Vote Data * @request POST:/votes/sync * @secure * @response `200` `HandlerMap` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden */ syncVotes: (params?: RequestParams) => Promise>; /** * @description Vote for a specific comment or page * * @tags Vote * @name Vote * @summary Vote * @request POST:/votes/{type}/{target_id} * @response `200` `HandlerResponseVote` OK * @response `403` `(HandlerMap & { msg?: string, })` Forbidden * @response `404` `(HandlerMap & { msg?: string, })` Not Found * @response `500` `(HandlerMap & { msg?: string, })` Internal Server Error */ vote: (type: "comment_up" | "comment_down" | "page_up" | "page_down", targetId: number, vote: HandlerParamsVote, params?: RequestParams) => Promise>; }; } declare interface ApiConfig { baseUrl?: string; baseApiParams?: Omit; securityWorker?: (securityData: SecurityDataType | null) => Promise | RequestParams | void; customFetch?: typeof fetch; } declare interface ApiHandler { action: T; handler: (data: ApiHandlerPayload[T]) => Promise; } declare interface ApiHandlerPayload { need_captcha: { img_data?: string; iframe?: string; }; need_login: object; need_auth_login: object; } declare interface ApiHandlers { add: (action: T, handler: (data: ApiHandlerPayload[T]) => Promise) => void; remove: (action: PayloadKey) => void; get: () => ApiHandler[]; } declare interface ApiOptions { baseURL: string; siteName: string; pageKey: string; pageTitle: string; timeout?: number; getApiToken?: () => string | undefined; userInfo?: { name: string; email: string; }; handlers?: ApiHandlers; } export declare interface ApiVersionData { /** API 程序名 */ app: string; /** API 程序版本号 */ version: string; /** API 程序 CommitHash */ commit_hash: string; } /** * Artalk * * @see https://artalk.js.org */ declare class Artalk { ctx: ContextApi; constructor(conf: Partial); /** Get the config of Artalk */ getConf(): ArtalkConfig; /** Get the root element of Artalk */ getEl(): HTMLElement; /** Update config of Artalk */ update(conf: Partial): this; /** Reload comment list of Artalk */ reload(): void; /** Destroy instance of Artalk */ destroy(): void; /** Add an event listener */ on(name: K, handler: EventHandler): void; /** Remove an event listener */ off(name: K, handler: EventHandler): void; /** Trigger an event */ trigger(name: K, payload?: EventPayloadMap[K]): void; /** Set dark mode */ setDarkMode(darkMode: boolean): void; /** Init Artalk */ static init(conf: Partial): Artalk; /** Use plugin, the plugin will be used when Artalk.init */ static use(plugin: ArtalkPlugin, options?: T): void; /** Load count widget */ static loadCountWidget(c: Partial): void; /** @deprecated Please use `getEl()` instead */ get $root(): HTMLElement; /** @description Please use `getConf()` instead */ get conf(): ArtalkConfig; } export default Artalk; export declare interface ArtalkConfig { /** 装载元素 */ el: string | HTMLElement; /** 页面唯一标识(完整 URL) */ pageKey: string; /** 页面标题 */ pageTitle: string; /** 服务器地址 */ server: string; /** 站点名 */ site: string; /** 评论框占位字符 */ placeholder: string; /** 评论为空时显示字符 */ noComment: string; /** 发送按钮文字 */ sendBtn: string; /** 评论框穿梭(显示在待回复评论后面) */ editorTravel: boolean; /** 表情包 */ emoticons: object | any[] | string | false; /** Gravatar 头像 */ gravatar: { /** API 地址 */ mirror: string; /** API 参数 */ params: string; }; /** 头像链接生成器 */ avatarURLBuilder?: (comment: CommentData) => string; /** 分页配置 */ pagination: { /** 每次请求获取数量 */ pageSize: number; /** 阅读更多模式 */ readMore: boolean; /** 滚动到底部自动加载 */ autoLoad: boolean; }; /** 内容限高 */ heightLimit: { /** 评论内容限高 */ content: number; /** 子评论区域限高 */ children: number; /** 滚动限高 */ scrollable: boolean; }; /** 评论投票按钮 */ vote: boolean; /** 评论投票反对按钮 */ voteDown: boolean; /** 评论预览功能 */ preview: boolean; /** 评论数绑定元素 Selector */ countEl: string; /** PV 数绑定元素 Selector */ pvEl: string; /** 统计组件 PageKey 属性名 */ statPageKeyAttr: string; /** 夜间模式 */ darkMode: boolean | 'auto'; /** 请求超时(单位:秒) */ reqTimeout: number; /** 平铺模式 */ flatMode: boolean | 'auto'; /** 嵌套模式 · 最大层数 */ nestMax: number; /** 嵌套模式 · 排序方式 */ nestSort: 'DATE_ASC' | 'DATE_DESC'; /** 显示 UA 徽标 */ uaBadge: boolean; /** 评论列表排序功能 (显示 Dropdown) */ listSort: boolean; /** 图片上传功能 */ imgUpload: boolean; /** 图片上传器 */ imgUploader?: (file: File) => Promise; /** Image lazy load */ imgLazyLoad?: 'native' | 'data-src'; /** 版本检测 */ versionCheck: boolean; /** 引用后端配置 */ useBackendConf: boolean; /** 语言本地化 */ locale: I18n | string; /** 后端版本 (系统数据,用户不允许更改) */ apiVersion?: string; /** Plugin script urls */ pluginURLs?: string[]; /** Replacer for marked */ markedReplacers?: ((raw: string) => string)[]; /** Marked options */ markedOptions?: MarkedOptions; /** 列表请求参数修改器 */ listFetchParamsModifier?: (params: any) => void; /** * Date formatter for custom date format * @param date - Date object * @returns Formatted date string */ dateFormatter?: (date: Date) => string; remoteConfModifier?: (conf: Partial) => void; listUnreadHighlight?: boolean; scrollRelativeTo?: () => HTMLElement; pvAdd?: boolean; beforeSubmit?: (editor: EditorApi, next: () => void) => void; } export declare type ArtalkPlugin = (ctx: ContextApi, options?: T) => void; declare namespace ArtalkType { export { I18n, I18nKeys, ArtalkConfig, LocalUser, CommentData, ListData, PageData, SiteData, UserData, UserDataForAdmin, NotifyData, EmoticonGrpData, EmoticonListData, ApiVersionData, ListFetchParams, ListLastFetchData, DataManagerApi, NotifyLevel, UserInfoApiResponseData, FetchError, ContextApi, EditorState, EditorApi, ListErrorData, ListFetchedArgs, EventPayloadMap, ArtalkPlugin, SidebarShowPayload, Layer } } export { ArtalkType } declare interface AuthAuthProviderInfo { icon: string; label: string; name: string; path?: string; } declare type CancelToken = Symbol | string | number; declare interface Checker { el?: HTMLElement; inputType?: 'password' | 'text'; body: (checker: CheckerCtx) => HTMLElement; request: (checker: CheckerCtx, inputVal: string) => Promise; onSuccess?: (checker: CheckerCtx, respData: T, inputVal: string, formEl: HTMLElement) => void; onError?: (checker: CheckerCtx, errData: any, inputVal: string, formEl: HTMLElement) => void; } declare interface CheckerCaptchaPayload extends CheckerPayload { img_data?: string; iframe?: string; } declare interface CheckerCtx { get(key: K): CheckerStore[K]; set(key: K, val: CheckerStore[K]): void; getOpts(): CheckerLauncherOptions; getApi(): Api; getUser(): User; hideInteractInput(): void; triggerSuccess(): void; cancel(): void; } /** * Checker 发射台 */ declare class CheckerLauncher { private opts; constructor(opts: CheckerLauncherOptions); checkCaptcha: (payload: CheckerCaptchaPayload) => Promise; checkAdmin: (payload: CheckerPayload) => Promise; fire(checker: Checker, payload: CheckerPayload, postFire?: (c: CheckerCtx) => void): void; } declare interface CheckerLauncherOptions { getCtx: () => ContextApi; getApi: () => Api; getCaptchaIframeURL: () => string; onReload: () => void; } declare interface CheckerPayload { onSuccess?: () => void; onMount?: (dialogEl: HTMLElement) => void; onCancel?: () => void; } declare interface CheckerStore { val?: string; img_data?: string; iframe?: string; } declare class CommentActions { private comment; private get data(); private get opts(); private getApi; constructor(comment: CommentNode); /** 投票操作 */ vote(type: 'up' | 'down'): void; /** 管理员 - 评论状态修改 */ adminEdit(type: 'collapsed' | 'pending' | 'pinned', btnElem: ActionBtn): void; /** 管理员 - 评论删除 */ adminDelete(btnElem: ActionBtn): void; /** 快速跳转到该评论 */ goToReplyComment(): void; } export declare interface CommentData { /** 评论 ID */ id: number; /** 评论正文 */ content: string; /** 用户昵称 */ nick: string; /** 用户邮箱 (该字段仅管理员可见) */ email?: string; /** 用户邮箱(已加密) */ email_encrypted: string; /** 用户链接 */ link: string; /** 回复目标评论 ID */ rid: number; /** User Agent */ ua: string; /** 评论日期 */ date: string; /** 是否折叠 */ is_collapsed: boolean; /** 是否待审 */ is_pending: boolean; /** 是否置顶 */ is_pinned: boolean; /** 是否已验证 */ is_verified: boolean; /** 徽章文字 */ badge_name?: string; /** 徽章颜色 */ badge_color?: string; /** IP 属地 */ ip_region?: string; /** 是否允许回复 */ is_allow_reply: boolean; /** 评论页面 key */ page_key: string; /** 评论页面 url */ page_url?: string; /** 是否可见 */ visible: boolean; /** 站点名(用于隔离) */ site_name: string; /** 赞同数 */ vote_up: number; /** 反对数 */ vote_down: number; } declare class CommentNode { $el?: HTMLElement; private renderInstance; private actionInstance; private data; private opts; private parent; private children; private nestCurt; constructor(data: CommentData, opts: CommentOptions); /** 渲染 UI */ render(): void; /** 获取评论操作实例对象 */ getActions(): CommentActions; /** 获取评论渲染器实例对象 */ getRender(): Render; /** 获取评论数据 */ getData(): CommentData; /** 设置数据 */ setData(data: CommentData): void; /** 获取父评论 */ getParent(): CommentNode | null; /** 获取所有子评论 */ getChildren(): CommentNode[]; /** 获取当前嵌套层数 */ getNestCurt(): number; /** 判断是否为根评论 */ getIsRoot(): boolean; /** 获取评论 ID */ getID(): number; /** 置入子评论 */ putChild(childNode: CommentNode, insertMode?: 'append' | 'prepend'): void; /** 获取存放子评论的元素对象 */ getChildrenWrapEl(): HTMLElement; /** 获取所有父评论 */ getParents(): CommentNode[]; /** * Get the element of the comment * * The `getEl()` will always return the latest $el after calling `render()`. * Please be aware of the memory leak if you use the $el reference directly. */ getEl(): HTMLElement; /** * Focus on the comment * * Scroll to the comment and perform flash animation */ focus(): void; scrollIntoView(): void; /** * Remove the comment node */ remove(): void; /** 获取 Gravatar 头像 URL */ getGravatarURL(): string; /** 获取评论 markdown 解析后的内容 */ getContentMarked(): string; /** 获取格式化后的日期 */ getDateFormatted(): any; /** 获取用户 UserAgent 信息 */ getUserUA(): { browser: string; os: string; }; /** 获取配置 */ getOpts(): CommentOptions; } declare type CommentNode_2 = { id: number; comment: CommentData; children: CommentNode_2[]; parent?: CommentNode_2; level: number; }; declare interface CommentOptions { onAfterRender?: () => void; onDelete?: (c: CommentNode) => void; /** The comment being replied to (linked comment) */ replyTo?: CommentData; flatMode: boolean; vote: boolean; voteDown: boolean; uaBadge: boolean; nestMax: number; gravatar: ArtalkConfig['gravatar']; heightLimit: ArtalkConfig['heightLimit']; avatarURLBuilder: ArtalkConfig['avatarURLBuilder']; scrollRelativeTo: ArtalkConfig['scrollRelativeTo']; dateFormatter: ArtalkConfig['dateFormatter']; getApi: () => Api; replyComment: ContextApi['replyComment']; editComment: ContextApi['editComment']; } declare interface CommonApiVersionData { app: string; commit_hash: string; version: string; } declare interface CommonConfData { frontend_conf: CommonMap; version: CommonApiVersionData; } declare interface CommonJSONResult { /** Data */ data: any; /** Message */ msg: string; } declare type CommonMap = Record; declare abstract class Component { ctx: ContextApi; $el: HTMLElement; get conf(): ArtalkConfig; constructor(ctx: ContextApi); getEl(): HTMLElement; } declare enum ContentType { Json = "application/json", FormData = "multipart/form-data", UrlEncoded = "application/x-www-form-urlencoded", Text = "text/plain" } /** * Artalk Context */ export declare interface ContextApi extends EventManagerFuncs { /** Artalk 根元素对象 */ $root: HTMLElement; /** 依赖注入函数 */ inject(depName: K, obj: TInjectedServices[K]): void; /** 获取依赖对象 */ get(depName: K): TInjectedServices[K]; /** 配置对象 */ conf: ArtalkConfig; /** marked 依赖对象 */ getMarked(): Marked | undefined; /** 获取 API 以供 HTTP 请求 */ getApi(): Api; /** Get API handlers */ getApiHandlers(): ApiHandlers; /** 获取数据管理器对象 */ getData(): DataManagerApi; /** 评论回复 */ replyComment(commentData: CommentData, $comment: HTMLElement): void; /** 编辑评论 */ editComment(commentData: CommentData, $comment: HTMLElement): void; /** 获取评论数据 */ fetch(params: Partial): void; /** 重载评论数据 */ reload(): void; /** 列表滚动到第一个评论的位置 */ listGotoFirst(): void; /** Get the comment data list */ getComments(): CommentData[]; /** Get the comment node list */ getCommentNodes(): CommentNode[]; /** * Get the comment data list * @deprecated Use `getComments()` instead */ getCommentDataList(): CommentData[]; /** * Get the comment node list * @deprecated Use `getCommentNodes()` instead */ getCommentList(): CommentNode[]; /** 显示侧边栏 */ showSidebar(payload?: SidebarShowPayload): void; /** 隐藏侧边栏 */ hideSidebar(): void; /** 编辑器 - 显示加载 */ editorShowLoading(): void; /** 编辑器 - 隐藏加载 */ editorHideLoading(): void; /** 编辑器 - 显示提示消息 */ editorShowNotify(msg: string, type: NotifyLevel): void; /** 评论框 - 复原状态 */ editorResetState(): void; /** 验证码检测 */ checkCaptcha(payload: CheckerCaptchaPayload): Promise; /** 管理员检测 */ checkAdmin(payload: CheckerPayload): Promise; /** i18n 翻译 */ $t(key: keyof I18n, args?: { [key: string]: string; }): string; /** 设置夜间模式 */ setDarkMode(darkMode: boolean | 'auto'): void; /** 获取配置 */ getConf(): ArtalkConfig; /** 获取挂载元素 */ getEl(): HTMLElement; /** 更新配置 */ updateConf(conf: Partial): void; /** 监听配置更新 */ watchConf(keys: T, effect: (val: Pick) => void): void; } export declare interface DataManagerApi { getLoading(): boolean; setLoading(val: boolean): void; getListLastFetch(): ListLastFetchData | undefined; setListLastFetch(val: ListLastFetchData): void; getComments(): CommentData[]; findComment(id: number): CommentData | undefined; fetchComments(params: Partial): void; loadComments(comments: CommentData[]): void; clearComments(): void; insertComment(comment: CommentData): void; updateComment(comment: CommentData): void; deleteComment(id: number): void; getNotifies(): NotifyData[]; updateNotifies(notifies: NotifyData[]): void; getPage(): PageData | undefined; updatePage(pageData: PageData): void; } declare class Editor extends Component implements EditorApi { private ui; private state; getUI(): EditorUI; getPlugs(): PlugManager | undefined; getState(): EditorState; constructor(ctx: ContextApi); getHeaderInputEls(): { name: HTMLInputElement; email: HTMLInputElement; link: HTMLInputElement; }; getContentFinal(): string; getContentRaw(): string; getContentMarked(): string; setContent(val: string): void; insertContent(val: string): void; focus(): void; reset(): void; resetState(): void; setReply(comment: CommentData, $comment: HTMLElement): void; setEditComment(comment: CommentData, $comment: HTMLElement): void; showNotify(msg: string, type: any): void; showLoading(): void; hideLoading(): void; submit(): void; } export declare interface EditorApi extends Component { getUI(): EditorUI; /** * Get the header input elements */ getHeaderInputEls(): Record; /** * Set content */ setContent(val: string): void; /** * Insert content */ insertContent(val: string): void; /** * Get the final content * * This function returns the raw content or the content transformed through a plugin hook. */ getContentFinal(): string; /** * Get the raw content which is inputed by user */ getContentRaw(): string; /** * Get the HTML format content which is rendered by marked (a markdown parser) */ getContentMarked(): string; /** * Get editor current state */ getState(): EditorState; /** * Focus editor */ focus(): void; /** * Reset editor */ reset(): void; /** * Reset editor UI * * call it will move editor to the initial position */ resetState(): void; /** * Submit comment */ submit(): void; /** * Show notification message */ showNotify(msg: string, type: NotifyLevel): void; /** * Show loading on editor */ showLoading(): void; /** * Hide loading on editor */ hideLoading(): void; /** * Start replying a comment */ setReply(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void; /** * Start editing a comment */ setEditComment(commentData: CommentData, $comment: HTMLElement): void; } declare interface EditorEventPayloadMap { mounted: undefined; unmounted: undefined; 'header-input': { field: string; $input: HTMLInputElement; }; 'header-change': { field: string; $input: HTMLInputElement; }; 'content-updated': string; 'panel-show': EditorPlug; 'panel-hide': EditorPlug; 'panel-close': undefined; 'editor-close': undefined; 'editor-open': undefined; } /** * Editor 插件 */ declare class EditorPlug { protected kit: PlugKit; $btn?: HTMLElement; $panel?: HTMLElement; contentTransformer?(rawContent: string): string; editorStateEffectWhen?: EditorState; editorStateEffect?(comment: CommentData): () => void; constructor(kit: PlugKit); /** Use plug btn will add a btn on the bottom of editor */ useBtn(html?: string): HTMLElement; /** Use plug panel will show the panel when btn is clicked */ usePanel(html?: string): HTMLElement; /** Use the content transformer to handle the content of the last submit by the editor */ useContentTransformer(func: (raw: string) => string): void; /** Listen the event of panel show */ usePanelShow(func: () => void): void; /** Listen the event of panel hide */ usePanelHide(func: () => void): void; /** Use editor state modifier */ useEditorStateEffect(stateName: EditorState, effectFn: (comment: CommentData) => () => void): void; } export declare type EditorState = 'reply' | 'edit' | 'normal'; declare interface EditorUI extends Record { $el: HTMLElement; $name: HTMLInputElement; $email: HTMLInputElement; $link: HTMLInputElement; $textarea: HTMLTextAreaElement; $submitBtn: HTMLButtonElement; $sendReplyBtn?: HTMLElement; $editCancelBtn?: HTMLElement; } export declare type EmoticonGrpData = { name: string; type: 'emoticon' | 'image' | 'emoji'; items: { key: string; val: string; }[]; }; export declare type EmoticonListData = EmoticonGrpData[]; declare const en: { placeholder: string; noComment: string; send: string; signIn: string; signUp: string; save: string; nick: string; email: string; link: string; emoticon: string; preview: string; uploadImage: string; uploadFail: string; commentFail: string; restoredMsg: string; onlyAdminCanReply: string; uploadLoginMsg: string; counter: string; sortLatest: string; sortOldest: string; sortBest: string; sortAuthor: string; openComment: string; closeComment: string; listLoadFailMsg: string; listRetry: string; loadMore: string; admin: string; reply: string; voteUp: string; voteDown: string; voteFail: string; readMore: string; actionConfirm: string; collapse: string; collapsed: string; collapsedMsg: string; expand: string; approved: string; pending: string; pendingMsg: string; edit: string; editCancel: string; delete: string; deleteConfirm: string; pin: string; unpin: string; seconds: string; minutes: string; hours: string; days: string; now: string; adminCheck: string; captchaCheck: string; confirm: string; cancel: string; msgCenter: string; ctrlCenter: string; userProfile: string; noAccountPrompt: string; haveAccountPrompt: string; forgetPassword: string; resetPassword: string; changePassword: string; confirmPassword: string; passwordMismatch: string; verificationCode: string; verifySend: string; verifyResend: string; waitSeconds: string; emailVerified: string; password: string; username: string; nextStep: string; skipVerify: string; logoutConfirm: string; accountMergeNotice: string; accountMergeSelectOne: string; accountMergeConfirm: string; dismiss: string; merge: string; frontend: string; backend: string; loading: string; loadFail: string; editing: string; editFail: string; deleting: string; deleteFail: string; reqGot: string; reqAborted: string; updateMsg: string; currentVersion: string; ignore: string; open: string; openName: string; }; declare interface EntityCookedComment { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface EntityCookedNotify { comment_id: number; id: number; is_emailed: boolean; is_read: boolean; read_link: string; user_id: number; } declare interface EntityCookedPage { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface EntityCookedSite { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface EntityCookedUser { badge_color: string; badge_name: string; email: string; id: number; is_admin: boolean; link: string; name: string; receive_email: boolean; } declare interface EntityCookedUserForAdmin { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare type EventHandler = (payload: T) => void; declare class EventManager implements EventManagerFuncs { private events; /** * Add an event listener for a specific event name */ on(name: K, handler: EventHandler, opts?: EventOptions): void; /** * Remove an event listener for a specific event name and handler */ off(name: K, handler: EventHandler): void; /** * Trigger an event with an optional payload */ trigger(name: K, payload?: PayloadMap[K]): void; } declare interface EventManagerFuncs { on(name: K, handler: EventHandler, opts?: EventOptions): void; off(name: K, handler: EventHandler): void; trigger(name: K, payload?: PayloadMap[K]): void; } declare interface EventOptions { once?: boolean; } /** EventName to EventPayload Type */ export declare interface EventPayloadMap { created: undefined; mounted: undefined; updated: ArtalkConfig; unmounted: undefined; 'list-fetch': Partial; 'list-fetched': ListFetchedArgs; 'list-load': CommentData[]; 'list-loaded': CommentData[]; 'list-failed': ListErrorData; 'list-goto-first': undefined; 'list-reach-bottom': undefined; 'comment-inserted': CommentData; 'comment-updated': CommentData; 'comment-deleted': CommentData; 'comment-rendered': CommentNode; 'notifies-updated': NotifyData[]; 'list-goto': number; 'page-loaded': PageData; 'editor-submit': undefined; 'editor-submitted': undefined; 'user-changed': LocalUser; 'sidebar-show': undefined; 'sidebar-hide': undefined; } export declare interface FetchError extends Error { code: number; message: string; data?: any; } declare interface FullRequestParams extends Omit { /** set parameter to `true` for call `securityWorker` for this request */ secure?: boolean; /** request path */ path: string; /** content type of request body */ type?: ContentType; /** query params */ query?: QueryParamsType; /** format of response (i.e. response.json() -> format: "json") */ format?: ResponseFormat; /** request body */ body?: unknown; /** base url */ baseUrl?: string; /** request cancellation token */ cancelToken?: CancelToken; } declare type HandlerMap = Record; declare interface HandlerParamsCaptchaVerify { /** The captcha value to check */ value: string; } declare interface HandlerParamsCommentCreate { /** The comment content */ content: string; /** The comment email */ email: string; /** The comment link */ link?: string; /** The comment name */ name: string; /** The comment page_key */ page_key: string; /** The comment page_title */ page_title?: string; /** The comment rid */ rid?: number; /** The site name of your content scope */ site_name: string; /** The comment ua */ ua?: string; } declare interface HandlerParamsCommentUpdate { /** The comment content */ content: string; /** The comment email */ email?: string; /** The comment ip */ ip?: string; /** The comment is_collapsed */ is_collapsed: boolean; /** The comment is_pending */ is_pending: boolean; /** The comment is_pinned */ is_pinned: boolean; /** The comment link */ link?: string; /** The comment nick */ nick?: string; /** The comment page_key */ page_key: string; /** The comment rid */ rid: number; /** The site name of your content scope */ site_name: string; /** The comment ua */ ua?: string; } declare interface HandlerParamsEmailSend { /** The body of email */ body: string; /** The subject of email */ subject: string; /** The email address of the receiver */ to_addr: string; } declare interface HandlerParamsNotifyReadAll { /** The user email */ email: string; /** The username */ name: string; } declare interface HandlerParamsPageFetchAll { /** If not empty, only fetch pages of this site */ site_name?: string; } declare interface HandlerParamsPagePV { /** The page key */ page_key: string; /** The page title */ page_title?: string; /** The site name of your content scope */ site_name?: string; } declare interface HandlerParamsPageUpdate { /** Updated page admin_only option */ admin_only: boolean; /** Updated page key */ key: string; /** The site name of your content scope */ site_name: string; /** Updated page title */ title: string; } declare interface HandlerParamsSettingApply { /** The content of the config file in YAML format */ yaml: string; } declare interface HandlerParamsSiteCreate { /** The site name */ name: string; /** The site urls */ urls: string[]; } declare interface HandlerParamsSiteUpdate { /** Updated site name */ name: string; /** Updated site urls */ urls: string[]; } declare interface HandlerParamsTransferImport { /** Automatically answer yes for all questions */ assumeyes?: boolean; /** The JSON data */ json_data?: string; /** The JSON file path */ json_file?: string; /** The target site name */ target_site_name?: string; /** The target site url */ target_site_url?: string; /** Keep domain */ url_keep_domain?: boolean; /** Enable URL resolver */ url_resolver?: boolean; } declare interface HandlerParamsUserCreate { /** The user badge color (hex format) */ badge_color?: string; /** The user badge name */ badge_name?: string; /** The user email */ email: string; /** The user is an admin */ is_admin: boolean; /** The user link */ link?: string; /** The user name */ name: string; /** The user password */ password?: string; /** The user receive email */ receive_email: boolean; } declare interface HandlerParamsUserLogin { /** The user email */ email: string; /** The username */ name?: string; /** The user password */ password: string; } declare interface HandlerParamsUserUpdate { /** The user badge color (hex format) */ badge_color?: string; /** The user badge name */ badge_name?: string; /** The user email */ email: string; /** The user is an admin */ is_admin: boolean; /** The user link */ link?: string; /** The user name */ name: string; /** The user password */ password?: string; /** The user receive email */ receive_email: boolean; } declare interface HandlerParamsVote { /** The user email */ email?: string; /** The username */ name?: string; } declare interface HandlerRequestAuthDataMergeApply { user_name: string; } declare interface HandlerRequestAuthEmailLogin { code?: string; email: string; password?: string; } declare interface HandlerRequestAuthEmailRegister { code: string; email: string; link?: string; name?: string; password: string; } declare interface HandlerRequestAuthEmailSend { email: string; } declare interface HandlerRequestUserInfoUpdate { code?: string; email: string; link?: string; name: string; } declare interface HandlerResponseAdminUserList { count: number; users: EntityCookedUserForAdmin[]; } declare interface HandlerResponseAuthDataMergeApply { deleted_user_count: number; update_comments_count: number; update_notifies_count: number; update_votes_count: number; /** Empty if login user is target user no need to re-login */ user_token: string; } declare interface HandlerResponseAuthDataMergeCheck { need_merge: boolean; user_names: string[]; } declare interface HandlerResponseCaptchaGet { img_data: string; } declare interface HandlerResponseCaptchaStatus { is_pass: boolean; } declare interface HandlerResponseCommentCreate { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface HandlerResponseCommentGet { /** The comment detail */ comment: EntityCookedComment; /** The reply comment if exists (like reply) */ reply_comment: EntityCookedComment; } declare interface HandlerResponseCommentList { comments: EntityCookedComment[]; count: number; page: EntityCookedPage; roots_count: number; } declare interface HandlerResponseCommentUpdate { badge_color: string; badge_name: string; content: string; content_marked: string; date: string; email_encrypted: string; id: number; ip_region: string; is_allow_reply: boolean; is_collapsed: boolean; is_pending: boolean; is_pinned: boolean; is_verified: boolean; link: string; nick: string; page_key: string; page_url: string; rid: number; site_name: string; ua: string; user_id: number; visible: boolean; vote_down: number; vote_up: number; } declare interface HandlerResponseConfAuthProviders { anonymous: boolean; providers: AuthAuthProviderInfo[]; } declare interface HandlerResponseConfDomain { /** Is the domain trusted */ is_trusted: boolean; /** The origin of the domain */ origin: string; } declare interface HandlerResponseNotifyList { count: number; notifies: EntityCookedNotify[]; } declare interface HandlerResponsePageFetch { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface HandlerResponsePageFetchStatus { /** The number of pages that have been fetched */ done: number; /** If the task is in progress */ is_progress: boolean; /** The message of the task status */ msg: string; /** The total number of pages */ total: number; } declare interface HandlerResponsePageList { count: number; pages: EntityCookedPage[]; } declare interface HandlerResponsePagePV { pv: number; } declare interface HandlerResponsePageUpdate { admin_only: boolean; date: string; id: number; key: string; pv: number; site_name: string; title: string; url: string; vote_down: number; vote_up: number; } declare interface HandlerResponseSettingGet { envs: string[]; yaml: string; } declare interface HandlerResponseSettingTemplate { yaml: string; } declare interface HandlerResponseSiteCreate { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface HandlerResponseSiteList { count: number; sites: EntityCookedSite[]; } declare interface HandlerResponseSiteUpdate { first_url: string; id: number; name: string; urls: string[]; urls_raw: string; } declare interface HandlerResponseTransferExport { /** The exported data which is a JSON string */ artrans: string; } declare interface HandlerResponseTransferUpload { /** The uploaded file name which can be used to import */ filename: string; } declare interface HandlerResponseUpload { file_name: string; file_type: string; public_url: string; } declare interface HandlerResponseUserCreate { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare interface HandlerResponseUserInfo { is_login: boolean; notifies: EntityCookedNotify[]; notifies_count: number; user: EntityCookedUser; } declare interface HandlerResponseUserInfoUpdate { user: EntityCookedUser; } declare interface HandlerResponseUserLogin { token: string; user: EntityCookedUser; } declare interface HandlerResponseUserStatus { is_admin: boolean; is_login: boolean; } declare interface HandlerResponseUserUpdate { badge_color: string; badge_name: string; comment_count: number; email: string; id: number; is_admin: boolean; is_in_conf: boolean; last_ip: string; last_ua: string; link: string; name: string; receive_email: boolean; } declare interface HandlerResponseVote { down: number; up: number; } declare class HttpClient { baseUrl: string; private securityData; private securityWorker?; private abortControllers; private customFetch; private baseApiParams; constructor(apiConfig?: ApiConfig); setSecurityData: (data: SecurityDataType | null) => void; protected encodeQueryParam(key: string, value: any): string; protected addQueryParam(query: QueryParamsType, key: string): string; protected addArrayQueryParam(query: QueryParamsType, key: string): any; protected toQueryString(rawQuery?: QueryParamsType): string; protected addQueryParams(rawQuery?: QueryParamsType): string; private contentFormatters; protected mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams; protected createAbortSignal: (cancelToken: CancelToken) => AbortSignal | undefined; abortRequest: (cancelToken: CancelToken) => void; request: ({ body, secure, path, type, query, format, baseUrl, cancelToken, ...params }: FullRequestParams) => Promise>; } declare interface HttpResponse extends Response { data: D; error: E; } export declare type I18n = typeof en; export declare type I18nKeys = keyof I18n; export declare const init: typeof Artalk.init; export declare interface Layer { show: () => void; hide: () => void; destroy: () => void; setOnAfterHide(func: () => void): void; setAllowMaskClose(allow: boolean): void; getAllowMaskClose(): boolean; getEl: () => HTMLElement; } declare class Layer_2 implements Layer { private $el; private opts; private allowMaskClose; private onAfterHide?; constructor($el: HTMLElement, opts: LayerOptions); setOnAfterHide(func: () => void): void; setAllowMaskClose(allow: boolean): void; getAllowMaskClose(): boolean; getEl(): HTMLElement; show(): void; hide(): void; destroy(): void; } declare class LayerManager { private wrap; constructor(ctx: ContextApi); getEl(): HTMLElement; create(name: string, el?: HTMLElement): Layer_2; } declare interface LayerOptions { onShow: () => void; onHide: () => void; } declare interface LayoutOptions { /** The comments wrap of list */ $commentsWrap: HTMLElement; nestSortBy: ListNest.SortByType; nestMax: number; flatMode: boolean; createCommentNode(comment: CommentData, replyComment?: CommentData): CommentNode; findCommentNode(id: number): CommentNode | undefined; } declare class List extends Component { /** 列表评论集区域元素 */ $commentsWrap: HTMLElement; getCommentsWrapEl(): HTMLElement; protected commentNodes: CommentNode[]; getCommentNodes(): CommentNode[]; constructor(ctx: ContextApi); getListLayout({ forceFlatMode }?: { forceFlatMode?: boolean; }): ListLayout; private initCrudEvents; } export declare interface ListData { /** 评论数据 */ comments: CommentData[]; /** 根评论总数 */ roots_count: number; /** 评论总数(包括所有子评论) */ count: number; /** 页面信息 */ page: PageData; } export declare interface ListErrorData { msg: string; data?: any; } export declare interface ListFetchedArgs { params: Partial; data?: ListData; error?: ListErrorData; } export declare interface ListFetchParams { offset: number; limit: number; flatMode: boolean; paramsModifier?: (p: any) => void; onSuccess?: (data: ListData) => void; onError?: (err: any) => void; } export declare interface ListLastFetchData { params: ListFetchParams; data?: ListData; } declare class ListLayout { private options; constructor(options: LayoutOptions); private getStrategy; import(comments: CommentData[]): void; insert(comment: CommentData, replyComment?: CommentData): void; } declare namespace ListNest { export { makeNestCommentNodeList, CommentNode_2 as CommentNode, SortByType } } export declare const loadCountWidget: typeof Artalk.loadCountWidget; /** * Local User Data (in localStorage) * * @note Keep flat for easy handling */ export declare interface LocalUser { /** Username (aka. Nickname) */ name: string; /** Email */ email: string; /** Link (aka. Website) */ link: string; /** Token (for authorization) */ token: string; /** Admin flag */ is_admin: boolean; } declare function makeNestCommentNodeList(srcData: CommentData[], sortBy?: SortByType, nestMax?: number): CommentNode_2[]; export declare interface NotifyData { /** 通知 ID */ id: number; /** 用户 ID */ user_id: number; /** 评论 ID */ comment_id: number; /** 是否已读 */ is_read: boolean; /** 是否已发送邮件通知 */ is_emailed: boolean; /** 标为已读地址 */ read_link: string; } export declare type NotifyLevel = 'i' | 's' | 'w' | 'e'; export declare interface PageData { /** 页面 ID */ id: number; /** 页面唯一标识符 */ key: string; /** 页面标题 */ title: string; /** 页面 url */ url: string; /** 仅管理员可评 */ admin_only: boolean; /** 站点名(用于隔离) */ site_name: string; /** 赞同数 */ vote_up: number; /** 反对数 */ vote_down: number; } declare type PayloadKey = keyof ApiHandlerPayload; /** * PlugKit provides a set of methods to help you develop editor plug */ declare class PlugKit { private plugs; constructor(plugs: PlugManager); /** Use the editor */ useEditor(): EditorApi; /** * Use the context of global * * @deprecated The calls to this function should be reduced as much as possible */ useGlobalCtx(): ContextApi; /** Use the config of Artalk */ useConf(): ArtalkConfig; /** Use the http api client */ useApi(): Api; /** Use the user manager */ useUser(): User; /** Use the ui of editor */ useUI(): EditorUI; /** Use the events in editor scope */ useEvents(): EventManager; /** Listen the event when plug is mounted */ useMounted(func: () => void): void; /** Listen the event when plug is unmounted */ useUnmounted(func: () => void): void; /** Use the deps of other plug */ useDeps(plug: T): InstanceType | undefined; } declare class PlugManager { editor: EditorApi; private plugs; private openedPlug; private events; getPlugs(): EditorPlug[]; getEvents(): EventManager; private clear; constructor(editor: EditorApi); private loadPluginUI; /** Load the plug btn and plug panel on editor ui */ private loadPluginItem; get(plug: T): InstanceType | undefined; /** Open the editor plug panel */ openPlugPanel(plug: EditorPlug): void; /** Close the editor plug panel */ closePlugPanel(): void; /** Get the content which is transformed by plugs */ getTransformedContent(rawContent: string): string; } declare type QueryParamsType = Record; declare class Render { comment: CommentNode; get data(): CommentData; get opts(): CommentOptions; $el: HTMLElement; $main: HTMLElement; $header: HTMLElement; $headerNick: HTMLElement; $headerBadgeWrap: HTMLElement; $body: HTMLElement; $content: HTMLElement; $childrenWrap: HTMLElement | null; $actions: HTMLElement; voteBtnUp?: ActionBtn; voteBtnDown?: ActionBtn; $replyTo?: HTMLElement; $replyAt?: HTMLElement; constructor(comment: CommentNode); /** * Render the comment ui * * If comment data is updated, call this method to re-render the comment ui. * The method will be called multiple times, so it should be idempotent. * * Renders may add event listeners to the comment ui, so it should be called only once or override the original. * Please be aware of the memory leak caused by the event listener. */ render(): HTMLElement; /** 内容限高检测 */ checkHeightLimit(): void; /** 子评论区域移除限高 */ heightLimitRemoveForChildren(): void; /** 渐出动画 */ playFadeAnim(): void; /** 渐出动画 · 评论内容区域 */ playFadeAnimForBody(): void; /** Perform the flash animation */ playFlashAnim(): void; /** 获取子评论 Wrap */ getChildrenWrap(): HTMLElement; /** 设置已读 */ setUnread(val: boolean): void; /** 设置为可点击的评论 */ setOpenable(val: boolean): void; /** 设置点击评论打开置顶 URL */ setOpenURL(url: string): void; /** 设置点击评论时的操作 */ setOpenAction(action: () => void): void; } declare type RequestParams = Omit; declare type ResponseFormat = keyof Omit; declare const Sel: { $header: string; $name: string; $email: string; $link: string; $textareaWrap: string; $textarea: string; $bottom: string; $submitBtn: string; $notifyWrap: string; $bottomLeft: string; $stateWrap: string; $plugBtnWrap: string; $plugPanelWrap: string; }; /** * Services * * @description Call these services by `ctx.get('serviceName')` or `ctx.serviceName` */ declare const services: { i18n(ctx: ContextApi): void; user(ctx: ContextApi): User; layerManager(ctx: ContextApi): LayerManager; checkerLauncher(ctx: ContextApi): CheckerLauncher; editor(ctx: ContextApi): Editor; list(ctx: ContextApi): List; sidebarLayer(ctx: ContextApi): SidebarLayer; editorPlugs(): PlugManager | undefined; }; declare class SidebarLayer extends Component { layer?: Layer_2; $header: HTMLElement; $closeBtn: HTMLElement; $iframeWrap: HTMLElement; $iframe?: HTMLIFrameElement; constructor(ctx: ContextApi); /** Refresh iFrame when show */ private refreshWhenShow; /** Animation timer */ private animTimer?; /** 显示 */ show(conf?: SidebarShowPayload): Promise; /** 隐藏 */ hide(): void; private authCheck; private initLayer; private createIframe; private getDarkMode; private iframeLoad; } export declare interface SidebarShowPayload { view?: 'comments' | 'sites' | 'pages' | 'transfer'; } export declare interface SiteData { /** 站点 ID */ id: number; /** 站点名 */ name: string; /** 站点 URLs */ urls: string[]; /** 站点 URLs(原始字符串) */ urls_raw: string; /** 站点主 URL */ first_url: string; } declare type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC'; declare type TInjectedServices = { [K in keyof TServiceInjectors]: ReturnType; }; declare type TKeysOnlyReturn = { [K in keyof T]: ReturnType extends V ? K : never; }[keyof T]; declare type TObjectWithFuncs = { [k: string]: (...args: any) => any; }; declare type TOmitConditions = TKeysOnlyReturn; declare type TServiceImps = typeof services; declare type TServiceInjectors = Omit; export declare const use: typeof Artalk.use; declare class User { private opts; private data; constructor(opts: UserOpts); getData(): LocalUser; /** Update user data and save to localStorage */ update(obj?: Partial): void; /** * Logout * * @description Logout will clear login status, but not clear user data (name, email, link) */ logout(): void; /** Check if user has filled basic data */ checkHasBasicUserInfo(): boolean; } export declare interface UserData { /** 用户 ID */ id: number; /** 用户名 */ name: string; /** 邮箱 */ email: string; /** 链接 */ link: string; /** 徽章名称 */ badge_name: string; /** 徽章颜色 */ badge_color: string; /** 是否属于管理员 */ is_admin: boolean; /** 是否允许接收邮件通知 */ receive_email: boolean; } export declare interface UserDataForAdmin extends UserData { /** 最后一次操作 IP */ last_ip: string; /** 最后一次操作 UA */ last_ua: string; /** 是否存在于配置文件中 */ is_in_conf: boolean; /** 评论数 */ comment_count: number; } export declare interface UserInfoApiResponseData { user?: UserData; is_login: boolean; notifies: NotifyData[]; notifies_count: number; } declare interface UserOpts { onUserChanged?: (user: LocalUser) => void; } export { }