diff --git a/packages/comment-widget/src/avatar/providers/custom.ts b/packages/comment-widget/src/avatar/providers/custom.ts new file mode 100644 index 0000000..611ff8e --- /dev/null +++ b/packages/comment-widget/src/avatar/providers/custom.ts @@ -0,0 +1,22 @@ +import AvatarProvider from './avatar-provider'; + +const seedPlaceholderPattern = /\{(?:hash|seed)\}/; + +class CustomAvatar extends AvatarProvider { + override getAvatarSrc(emailHash: string | undefined): string { + const source = this.url.trim(); + const seed = encodeURIComponent(emailHash || 'anonymous'); + + if (!source) { + return ''; + } + + if (seedPlaceholderPattern.test(source)) { + return source.replace(/\{hash\}/g, seed).replace(/\{seed\}/g, seed); + } + + return `${source}${source.includes('?') ? '&' : '?'}_avatar=${seed}`; + } +} + +export default new CustomAvatar('Custom', ''); diff --git a/packages/comment-widget/src/avatar/providers/index.ts b/packages/comment-widget/src/avatar/providers/index.ts index c2151de..851e6ae 100644 --- a/packages/comment-widget/src/avatar/providers/index.ts +++ b/packages/comment-widget/src/avatar/providers/index.ts @@ -1,14 +1,20 @@ import type AvatarProvider from './avatar-provider'; +import Custom from './custom'; import Gravatar from './gravatar'; let avatarProvider: AvatarProvider | undefined; enum AvatarProviderEnum { + CUSTOM = 'custom', GRAVATAR = 'gravatar', } export function setAvatarProvider(provider: string, mirrorUrl?: string) { switch (provider) { + case AvatarProviderEnum.CUSTOM: + Custom.url = mirrorUrl || ''; + avatarProvider = Custom; + break; case AvatarProviderEnum.GRAVATAR: if (mirrorUrl) { Gravatar.url = mirrorUrl; diff --git a/packages/comment-widget/src/types/index.ts b/packages/comment-widget/src/types/index.ts index 6854bef..aebd8f1 100644 --- a/packages/comment-widget/src/types/index.ts +++ b/packages/comment-widget/src/types/index.ts @@ -25,7 +25,7 @@ interface SecurityConfig { } interface AvatarConfig { - provider: 'gravatar'; + provider: 'custom' | 'gravatar'; enable: boolean; providerMirror: string; policy: 'anonymousUser' | 'allUser' | 'noAvatarUser'; diff --git a/src/main/resources/extensions/settings.yaml b/src/main/resources/extensions/settings.yaml index 9fbfe42..b2f0a10 100644 --- a/src/main/resources/extensions/settings.yaml +++ b/src/main/resources/extensions/settings.yaml @@ -120,6 +120,8 @@ spec: if: "$get(enable).value === true" name: provider options: + - label: "自定义头像服务" + value: "custom" - label: "Gravatar" value: "gravatar" value: "gravatar" @@ -128,7 +130,7 @@ spec: if: "$get(enable).value === true" name: providerMirror value: "" - help: 使用官方源则留空, 示例:https://gravatar.com + help: 自定义头像服务支持 {hash} 或 {seed} 占位符;不填写占位符时会自动追加 _avatar 参数。Gravatar 示例:https://gravatar.com - $formkit: select label: 头像策略 if: "$get(enable).value === true"